DIR : /home/kozerus/public_html/script_kogrids_script_kogrids_tail.htm

/home/kozerus/public_html



		<script id="script_random_imglnk">
		<script id="script_random_imglnk">
			function random_imglink(){
			function random_imglink(){
				alert( "BGUS_RANDOM_IMGLINK if_src="+if_src )
				alert( "BGUS_RANDOM_IMGLINK if_src="+if_src )
				var myimgs=new Array()
				var myimgs=new Array()
//specify random imgs below. You can have as many as you wish
//specify random imgs below. You can have as many as you wish
				myimgs[1]="/imgs/bg/bg_frax_ribbon.jpg"
				myimgs[1]="/imgs/bg/bg_frax_ribbon.jpg"
				myimgs[2]="/imgs/bg/bg_frax_thorn.jpg"
				myimgs[2]="/imgs/bg/bg_frax_thorn.jpg"
				myimgs[3]="/imgs/bg/bg_newton05b.jpg"
				myimgs[3]="/imgs/bg/bg_newton05b.jpg"
				myimgs[4]="/imgs/bg/bg_frax_thorn.jpg"
				myimgs[4]="/imgs/bg/bg_frax_thorn.jpg"
				myimgs[5]="/imgs/bg/bg_frax_thorn.jpg"
				myimgs[5]="/imgs/bg/bg_frax_thorn.jpg"
				myimgs[6]="/imgs/bg/bg_newton04bw.gif"
				myimgs[6]="/imgs/bg/bg_newton04bw.gif"
				myimgs[7]="/imgs/bg/bg_newton05b.png"
				myimgs[7]="/imgs/bg/bg_newton05b.png"
				myimgs[8]="/imgs/bg/bg_newton05b.png"
				myimgs[8]="/imgs/bg/bg_newton05b.png"
				myimgs[9]="/imgs/bg/bg_newton05b.png"
				myimgs[9]="/imgs/bg/bg_newton05b.png"


				var ry=Math.floor(Math.random()*myimgs.length)
				var ry=Math.floor(Math.random()*myimgs.length)
				if (ry==0) ry=1
				if (ry==0) ry=1
				document.write('<img src="'+myimgs[ry]+'" border=0 height=200>')
				document.write('<img src="'+myimgs[ry]+'" border=0 height=200>')
				}
				}
//			random_imglink()
//			random_imglink()
//			random_imglink()
//			random_imglink()
//			random_imglink()
//			random_imglink()
			</script id="script_random_imglnk">
			</script id="script_random_imglnk">


		<script id="script_iframe">
		<script id="script_iframe">
			function iframe_new(ifid) {
			function iframe_new(ifid) {
				alert( "BUGS_500 iframe_new " );
				alert( "BUGS_500 iframe_new " );
				alert( "BUGS_501 iframe_new ifid="+ifid );
				alert( "BUGS_501 iframe_new ifid="+ifid );
				z=0;
				z=0;
				j=0;
				j=0;
				iflinks = new Array();
				iflinks = new Array();
				iflinks_av = new Array();
				iflinks_av = new Array();
				iflinks_svc = new Array();
				iflinks_svc = new Array();
				iflinks_sl = new Array();
				iflinks_sl = new Array();
				iflinks_vu = new Array();
				iflinks_vu = new Array();
				iflinks_pdf = new Array();
				iflinks_pdf = new Array();
				iflinks_pn = new Array();
				iflinks_pn = new Array();
				iflinks_zm = new Array();
				iflinks_zm = new Array();
				return( "bugs_600 IFRAME"
				return( "bugs_600 IFRAME"
				}
				}


			function iframe(ifid)
			function iframe(ifid)
/*
/*
// iflinks_bw
// iflinks_bw
			iflinks[j++]="/jkwii/whiteboard.html";
			iflinks[j++]="/jkwii/whiteboard.html";
			iflinks[j++]="/jkwii/whiteboard.html";
			iflinks[j++]="/jkwii/whiteboard.html";
			iflinks[j++]="/jkwii/whiteboard.html";
			iflinks[j++]="/jkwii/whiteboard.html";
			iflinks_svc[j++]="/jkwii/koh5_globe/koh5_globe.html";
			iflinks_svc[j++]="/jkwii/koh5_globe/koh5_globe.html";
			iflinks[j++]="/jkwii/blackboard.html";
			iflinks[j++]="/jkwii/blackboard.html";
			iflinks[j++]="/jkwii/blackboard.html";
			iflinks[j++]="/jkwii/blackboard.html";
			iflinks[j++]="/jkwii/blackboard.html";
			iflinks[j++]="/jkwii/blackboard.html";




// iflinks_svc
// iflinks_svc
			iflinks_svc[j++]="/jkwii/js/threejs/examples/index.html";
			iflinks_svc[j++]="/jkwii/js/threejs/examples/index.html";
			iflinks_svc[j++]="/ko/svc/js/stemkoskijs/Three.js/index.html";
			iflinks_svc[j++]="/ko/svc/js/stemkoskijs/Three.js/index.html";
			iflinks_svc[j++]="/jkwii/js/gojs/index.html";
			iflinks_svc[j++]="/jkwii/js/gojs/index.html";
			iflinks_svc[j++]="/index_jsdk.html";
			iflinks_svc[j++]="/index_jsdk.html";
			iflinks_svc[j++]="/jkwii/koh5_globe/koh5_globe.html";
			iflinks_svc[j++]="/jkwii/koh5_globe/koh5_globe.html";
			iflinks_svc[j++]="/jkwii/aud/keybd/index.html";
			iflinks_svc[j++]="/jkwii/aud/keybd/index.html";
			iflinks_svc[j++]="/svc/kokbdm/index.html";
			iflinks_svc[j++]="/svc/kokbdm/index.html";
			iflinks_svc[j++]="/svc/kokbdms/index.html";
			iflinks_svc[j++]="/svc/kokbdms/index.html";
			iflinks_svc[j++]="/piano.html";
			iflinks_svc[j++]="/piano.html";
			iflinks_svc[j++]="/jkwii/aud/piano_uri/koh5_piano_uri.html";
			iflinks_svc[j++]="/jkwii/aud/piano_uri/koh5_piano_uri.html";
			iflinks_svc[j++]="/ko/svc/js/stemkoskijs/index.html";
			iflinks_svc[j++]="/ko/svc/js/stemkoskijs/index.html";
			iflinks_svc[j++]="/ko/svc/aud/mrcoles/koh5_mrcoles.html";
			iflinks_svc[j++]="/ko/svc/aud/mrcoles/koh5_mrcoles.html";
			iflinks_svc[j++]="http://effectgames.com/demos/canvascycle/";
			iflinks_svc[j++]="http://effectgames.com/demos/canvascycle/";
			iflinks_svc[j++]="https://www.leshylabs.com/apps/sfMaker/";
			iflinks_svc[j++]="https://www.leshylabs.com/apps/sfMaker/";
			iflinks_svc[j++]="https://dragongoserver.net/";
			iflinks_svc[j++]="https://dragongoserver.net/";
			iflinks_svc[j++]="/ko_center/ko_center.php";
			iflinks_svc[j++]="/ko_center/ko_center.php";
			iflinks_svc[j++]="/ko_saic/ko_saic.php";
			iflinks_svc[j++]="/ko_saic/ko_saic.php";
			iflinks_svc[j++]="/index_kt.html";
			iflinks_svc[j++]="/index_kt.html";
			iflinks_svc[j++]="/index_jtf.html";
			iflinks_svc[j++]="/index_jtf.html";


// iflinks_pdf
// iflinks_pdf


			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_CV-QIWEI_GAN13.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_CV-QIWEI_GAN13.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_Quantum4Computing_Objectives.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_Quantum4Computing_Objectives.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_Understand TensorFlow by mimicking its API from scratch.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_Understand TensorFlow by mimicking its API from scratch.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_Dreaming_materials_quantum_computers?XanaduAI.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_Dreaming_materials_quantum_computers?XanaduAI.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_XanaduAI?Medium.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_XanaduAI?Medium.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_QiweisWebHome.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_QiweisWebHome.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_eaav2761.full.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_eaav2761.full.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_12-Yu-L-14344.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_12-Yu-L-14344.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_1808.02893.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_1808.02893.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_Qgan-com.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/kou_20190125_2400_Qgan-com.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/dmo_20190125_2400_Couple_reveal_how_van_life_isnt_always_glamorous.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/dmo_20190125_2400_Couple_reveal_how_van_life_isnt_always_glamorous.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/dmo_20190125_2400_Hubble_lostlight_ image-deepest_ever_view_universe.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/dmo_20190125_2400_Hubble_lostlight_ image-deepest_ever_view_universe.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/dmo_20190125_2400_Google_AI_beats_professional_players_at_deepmind_ StarCraftII.pdf';
			iflinks_pdf[j++]="/kb/pdf/pdf_20190126/dmo_20190125_2400_Google_AI_beats_professional_players_at_deepmind_ StarCraftII.pdf';
			iflinks_pdf[j++]="//kb/pdf/pdf_20190126/dmo_20190125_2400_Cuban_ghosttown_chocolate_baron_Milton_Hershey .pdf';
			iflinks_pdf[j++]="//kb/pdf/pdf_20190126/dmo_20190125_2400_Cuban_ghosttown_chocolate_baron_Milton_Hershey .pdf';


// iflinks_sl
// iflinks_sl
			iflinks_sl[j++] = "/index_sl_kb-books-go-200807.html";
			iflinks_sl[j++] = "/index_sl_kb-books-go-200807.html";
			iflinks_sl[j++] = "/index_sl_kb-books-go-200808.html";
			iflinks_sl[j++] = "/index_sl_kb-books-go-200808.html";
			iflinks_sl[j++] = "/index_sl_kb-books-go-20130726.html";
			iflinks_sl[j++] = "/index_sl_kb-books-go-20130726.html";
			iflinks_sl[j++] = "/index_sl_kb-books-jmh-cleveland.html";
			iflinks_sl[j++] = "/index_sl_kb-books-jmh-cleveland.html";
			iflinks_sl[j++] = "/index_sl_kb-books-jmh-jmh2015.html";
			iflinks_sl[j++] = "/index_sl_kb-books-jmh-jmh2015.html";
			iflinks_sl[j++] = "/index_sl_kb-books-jmh-jmh71-jmh71a.html";
			iflinks_sl[j++] = "/index_sl_kb-books-jmh-jmh71-jmh71a.html";
			iflinks_sl[j++] = "/index_sl_kb-books-jmh-jmh71-jmh71b.html";
			iflinks_sl[j++] = "/index_sl_kb-books-jmh-jmh71-jmh71b.html";
			iflinks_sl[j++] = "/index_sl_kb-books-jmh-userguide_80_bw.html";
			iflinks_sl[j++] = "/index_sl_kb-books-jmh-userguide_80_bw.html";
			iflinks_sl[j++] = "/index_sl_kb-jmh71.html";
			iflinks_sl[j++] = "/index_sl_kb-jmh71.html";
			iflinks_sl[j++] = "/index_sl_kb-books-kids-rumplestiltskin.html";
			iflinks_sl[j++] = "/index_sl_kb-books-kids-rumplestiltskin.html";
			iflinks_sl[j++] = "/index_sl_kb-books-kids-schruvelpeter.html";
			iflinks_sl[j++] = "/index_sl_kb-books-kids-schruvelpeter.html";
			iflinks_sl[j++] = "/index_sl_kb-books-mil-korea74.html";
			iflinks_sl[j++] = "/index_sl_kb-books-mil-korea74.html";
			iflinks_sl[j++] = "/index_sl_kb-books-mil-leonardwood90.html";
			iflinks_sl[j++] = "/index_sl_kb-books-mil-leonardwood90.html";
			iflinks_sl[j++] = "/index_sl_kb-books-mil-iperms.html";
			iflinks_sl[j++] = "/index_sl_kb-books-mil-iperms.html";
			iflinks_sl[j++] = "/index_sl_kb-books-tech-time.html";
			iflinks_sl[j++] = "/index_sl_kb-books-tech-time.html";
			iflinks_sl[j++] = "/index_sl_kb-books-tech-digitalmag.html";
			iflinks_sl[j++] = "/index_sl_kb-books-tech-digitalmag.html";
			iflinks_sl[j++] = "/index_sl_kb-books-tech-astronomy_lacross_menschic.html";
			iflinks_sl[j++] = "/index_sl_kb-books-tech-astronomy_lacross_menschic.html";
			iflinks_sl[j++] = "/index_sl_kb-books-tech-calculus.html";
			iflinks_sl[j++] = "/index_sl_kb-books-tech-calculus.html";
			iflinks_sl[j++] = "/index_sl_kb-books-tech-physics.html";
			iflinks_sl[j++] = "/index_sl_kb-books-tech-physics.html";
			iflinks_sl[j++] = "/index_sl_kb-books-tech-duden.html";
			iflinks_sl[j++] = "/index_sl_kb-books-tech-duden.html";
			iflinks_sl[j++] = "/index_sl_kb-intl-ein_hundes_leben.html";
			iflinks_sl[j++] = "/index_sl_kb-intl-ein_hundes_leben.html";
			iflinks_sl[j++] = "/index_sl_kb-intl-deutsche_memories.html";
			iflinks_sl[j++] = "/index_sl_kb-intl-deutsche_memories.html";
			iflinks_sl[j++] = "/index_sl_kb-intl-romanian_bocc.html";
			iflinks_sl[j++] = "/index_sl_kb-intl-romanian_bocc.html";
			iflinks_sl[j++] = "/index_sl_kb-kt-muschi_five_rings.html";
			iflinks_sl[j++] = "/index_sl_kb-kt-muschi_five_rings.html";
			iflinks_sl[j++] = "/index_sl_kb-kt-asian_fighting_arats_dragger.html";
			iflinks_sl[j++] = "/index_sl_kb-kt-asian_fighting_arats_dragger.html";
			iflinks_sl[j++] = "/index_sl_kb-kt-aikido_dynamic_sphere.html";
			iflinks_sl[j++] = "/index_sl_kb-kt-aikido_dynamic_sphere.html";
			iflinks_sl[j++] = "/index_sl_kb-kt-masters.html";
			iflinks_sl[j++] = "/index_sl_kb-kt-masters.html";


// iflinks_av
// iflinks_av
			iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20190122_2200_stalkaround_jtf28in_drivewaytraffic.mp4";
			iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20190122_2200_stalkaround_jtf28in_drivewaytraffic.mp4";
			iflinks_av[j++] = "/av.mp4";
			iflinks_av[j++] = "/av.mp4";
			iflinks_av[j++] = "/index.mp4";
			iflinks_av[j++] = "/index.mp4";
			iflinks_av[j++] = "/index1.mp4";
			iflinks_av[j++] = "/index1.mp4";
			iflinks_av[j++] = "/index2.mp4";
			iflinks_av[j++] = "/index2.mp4";
			iflinks_av[j++] = "/index3.mp4";
			iflinks_av[j++] = "/index3.mp4";
			iflinks_av[j++] = "/index4.mp4";
			iflinks_av[j++] = "/index4.mp4";
			iflinks_av[j++] = '/kb/jtfdc/vid/jtfdc_20190124_1350_stalkaround_lwhitesuv_jtf3     0in_jkwii.mp4';
			iflinks_av[j++] = '/kb/jtfdc/vid/jtfdc_20190124_1350_stalkaround_lwhitesuv_jtf3     0in_jkwii.mp4';
			iflinks_av[j++] = '/kb/jtfdc/vid/jtfdc_20190122_2200_stalkaround_jtf28in_drivew     aytraffic.mp4';
			iflinks_av[j++] = '/kb/jtfdc/vid/jtfdc_20190122_2200_stalkaround_jtf28in_drivew     aytraffic.mp4';
			iflinks_av[j++] = '/kb/vid/youb/01_sixto_rodriguej_sandrevan_lullabylifestyles_[coming_from_.mp4';
			iflinks_av[j++] = '/kb/vid/youb/01_sixto_rodriguej_sandrevan_lullabylifestyles_[coming_from_.mp4';
			iflinks_av[j++] = '/kb/vid/youb/02_sixto_rodriguej_i_think_of_you.mp4';
			iflinks_av[j++] = '/kb/vid/youb/02_sixto_rodriguej_i_think_of_you.mp4';
			iflinks_av[j++] = '/kb/vid/youb/48_roses_mariachi_el_bronx_jay_leno_2011.mp4';
			iflinks_av[j++] = '/kb/vid/youb/48_roses_mariachi_el_bronx_jay_leno_2011.mp4';
			iflinks_av[j++] = '/kb/vid/youb/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-0.mp4';
			iflinks_av[j++] = '/kb/vid/youb/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-0.mp4';
			iflinks_av[j++] = '/kb/vid/youb/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-1.mp4';
			iflinks_av[j++] = '/kb/vid/youb/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-1.mp4';
			iflinks_av[j++] = '/kb/vid/youb/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-2.mp4.filepart';
			iflinks_av[j++] = '/kb/vid/youb/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-2.mp4.filepart';
			iflinks_av[j++] = '/kb/vid/youb/bonnie_raitt_aaron_neville_gregg_allman_tell_it_like_it.mp4';
			iflinks_av[j++] = '/kb/vid/youb/bonnie_raitt_aaron_neville_gregg_allman_tell_it_like_it.mp4';
			iflinks_av[j++] = '/kb/vid/youb/eva_cassidyaint_no_sunshine.mp4';
			iflinks_av[j++] = '/kb/vid/youb/eva_cassidyaint_no_sunshine.mp4';
			iflinks_av[j++] = '/kb/vid/youb/eva_cassidyfields_of_gold.mp4';
			iflinks_av[j++] = '/kb/vid/youb/eva_cassidyfields_of_gold.mp4';
			iflinks_av[j++] = '/kb/vid/youb/faithfullworking_class_hero-live.mp4';
			iflinks_av[j++] = '/kb/vid/youb/faithfullworking_class_hero-live.mp4';
			iflinks_av[j++] = '/kb/vid/youb/official_chrysler_and_bob_dylan_super_bowl_commercial_2017.mp4';
			iflinks_av[j++] = '/kb/vid/youb/official_chrysler_and_bob_dylan_super_bowl_commercial_2017.mp4';
			iflinks_av[j++] = '/kb/vid/youb/richie_havens_i_was_educated_by_myself_with_lyrics.mp4';
			iflinks_av[j++] = '/kb/vid/youb/richie_havens_i_was_educated_by_myself_with_lyrics.mp4';
			iflinks_av[j++] = '/kb/vid/youb/river_run_file24160428.mp4';
			iflinks_av[j++] = '/kb/vid/youb/river_run_file24160428.mp4';
			iflinks_av[j++] = '/kb/vid/youb/steal_away_by_the_fureys.mp4';
			iflinks_av[j++] = '/kb/vid/youb/steal_away_by_the_fureys.mp4';
			iflinks_av[j++] = '/kb/vid/youb/the_last_farewell_lyrics_roger_whittaker.mp4';
			iflinks_av[j++] = '/kb/vid/youb/the_last_farewell_lyrics_roger_whittaker.mp4';
			iflinks_av[j++] = '/kb/vid/youb/we_believe_in_happy_ending_emmylou_harris_earl_thomas_co.mp4';
			iflinks_av[j++] = '/kb/vid/youb/we_believe_in_happy_ending_emmylou_harris_earl_thomas_co.mp4';
			iflinks_av[j++] = '/kb/vid/youb/yogis_Tibetan_Buddhism__Secrets_of_the_Yogis_of_Tibet_-_Part_5.mp4';
			iflinks_av[j++] = '/kb/vid/youb/yogis_Tibetan_Buddhism__Secrets_of_the_Yogis_of_Tibet_-_Part_5.mp4';


			iflinks_av[j++] = "/ko/svc/jsdoit/preload/_assets/static/video.mp4";
			iflinks_av[j++] = "/ko/svc/jsdoit/preload/_assets/static/video.mp4";
			iflinks_av[j++] = "/ko/svc/js/threejs/examples/textures/sintel.mp4";
			iflinks_av[j++] = "/ko/svc/js/threejs/examples/textures/sintel.mp4";
			iflinks_av[j++] = "/3.mp4";
			iflinks_av[j++] = "/3.mp4";
			iflinks_av[j++] = "/konet/index6.mp4";
			iflinks_av[j++] = "/konet/index6.mp4";
			iflinks_av[j++] = "/konet/index2.mp4";
			iflinks_av[j++] = "/konet/index2.mp4";
			iflinks_av[j++] = "/konet/index.mp4";
			iflinks_av[j++] = "/konet/index.mp4";
			iflinks_av[j++] = "/konet/index1.mp4";
			iflinks_av[j++] = "/konet/index1.mp4";
			iflinks_av[j++] = "/konet/index3.mp4";
			iflinks_av[j++] = "/konet/index3.mp4";
			iflinks_av[j++] = "/jkwii/jkwii.mp4";
			iflinks_av[j++] = "/jkwii/jkwii.mp4";
			iflinks_av[j++] = "/jkwii/js/threejs/examples/textures/sintel.mp4";
			iflinks_av[j++] = "/jkwii/js/threejs/examples/textures/sintel.mp4";
			iflinks_av[j++] = "/index4.mp4";
			iflinks_av[j++] = "/index4.mp4";
			iflinks_av[j++] = "/ka1.mp4";
			iflinks_av[j++] = "/ka1.mp4";
			iflinks_av[j++] = "/index8.mp4";
			iflinks_av[j++] = "/index8.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20171214_1215_jtf32out_jtf32_lyinglawerin.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20171214_1215_jtf32out_jtf32_lyinglawerin.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/huckleberry_hound_17_barbeque_hound.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/huckleberry_hound_17_barbeque_hound.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_201802261524_fiona_freeroam.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_201802261524_fiona_freeroam.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180605_0500_jtf31_fiona_roam_go_home_doberwoofs_jkwiiabout.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180605_0500_jtf31_fiona_roam_go_home_doberwoofs_jkwiiabout.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/roy_rogers_dont_fence_me_in.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/roy_rogers_dont_fence_me_in.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtf31.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtf31.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180604_1015_jtf31_fiona_qualitytime_unexpected_jkwii.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180604_1015_jtf31_fiona_qualitytime_unexpected_jkwii.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180605_1956_bigtruck_n_cabletrailer_stalkback.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180605_1956_bigtruck_n_cabletrailer_stalkback.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/doghead_video.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/doghead_video.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180607_1813_jtf31_fiona_freeroom_inyourface.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180607_1813_jtf31_fiona_freeroom_inyourface.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180530_2034_jkwii_meet_househunters_nice.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180530_2034_jkwii_meet_househunters_nice.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180505_1944_jkwiinkids_center_court.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180505_1944_jkwiinkids_center_court.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180605_1130_jkwii_lost_cable_truck.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180605_1130_jkwii_lost_cable_truck.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtf30.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtf30.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180226_1524_jtf31_fiona_freeroam.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180226_1524_jtf31_fiona_freeroam.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180605_1130_jkwii_lost_cabletrailer.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180605_1130_jkwii_lost_cabletrailer.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20171216_0610_woof.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20171216_0610_woof.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180606_1145_jtf40_driveway_byrdpucker_theft_threadt.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180606_1145_jtf40_driveway_byrdpucker_theft_threadt.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180604_0630_jtf31_fiona_courttime_jkwii.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180604_0630_jtf31_fiona_courttime_jkwii.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/roy_rogers_dale_evans_sons_of_pioneers_medley.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/roy_rogers_dale_evans_sons_of_pioneers_medley.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180605_1956_cabletrailer_backnice.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/jtfdc_20180605_1956_cabletrailer_backnice.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/index1.mp4";
			iflinks_av[j++] = "/kb/byrdpuckers/vid/index1.mp4";
			iflinks_av[j++] = "/kb/vid/dutch/dutch_jacksonnocout_get_my_weight_up.mp4";
			iflinks_av[j++] = "/kb/vid/dutch/dutch_jacksonnocout_get_my_weight_up.mp4";
			iflinks_av[j++] = "/kb/vid/dutch/dutch_jackson_feat_jibbscity_on_fire_off_then.mp4";
			iflinks_av[j++] = "/kb/vid/dutch/dutch_jackson_feat_jibbscity_on_fire_off_then.mp4";
			iflinks_av[j++] = "/kb/vid/dutch/dutch_jackson_39_new_single.mp4";
			iflinks_av[j++] = "/kb/vid/dutch/dutch_jackson_39_new_single.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Luciano Pavarotti & James Brown - It_s a man_s world (1080pHD).mp4";
			iflinks_av[j++] = "/kb/vid/youb/Luciano Pavarotti & James Brown - It_s a man_s world (1080pHD).mp4";
			iflinks_av[j++] = "/kb/vid/youb/REAL_Men_Who_Stare_At_Goats.mp4";
			iflinks_av[j++] = "/kb/vid/youb/REAL_Men_Who_Stare_At_Goats.mp4";
			iflinks_av[j++] = "/kb/vid/youb/REAL_MEN_WHO_STARE_AT_GOATS_part_2.mp4";
			iflinks_av[j++] = "/kb/vid/youb/REAL_MEN_WHO_STARE_AT_GOATS_part_2.mp4";
			iflinks_av[j++] = "/kb/vid/youb/The_Magus_of_Denver.mp4";
			iflinks_av[j++] = "/kb/vid/youb/The_Magus_of_Denver.mp4";
			iflinks_av[j++] = "/kb/vid/youb/PAPA-OOM-MOW-MOW!.mp4";
			iflinks_av[j++] = "/kb/vid/youb/PAPA-OOM-MOW-MOW!.mp4";
			iflinks_av[j++] = "/kb/vid/youb/romania_lalala.mp4";
			iflinks_av[j++] = "/kb/vid/youb/romania_lalala.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-0.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-0.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Zappa_Plays_Zappa_-_Joe_s_Garage.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Zappa_Plays_Zappa_-_Joe_s_Garage.mp4";
			iflinks_av[j++] = "/kb/vid/youb/dietric_coffee_ifile-164376962.mp4";
			iflinks_av[j++] = "/kb/vid/youb/dietric_coffee_ifile-164376962.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Perhaps_Love_-_John_Denver_Placido_Domingo_legendado.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Perhaps_Love_-_John_Denver_Placido_Domingo_legendado.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Big_Data_-_Tim_Smith.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Big_Data_-_Tim_Smith.mp4";
			iflinks_av[j++] = "/kb/vid/youb/OFFICIAL_Chrysler_and_Bob_Dylan_Super_Bowl_Commercial_2014.mp4";
			iflinks_av[j++] = "/kb/vid/youb/OFFICIAL_Chrysler_and_Bob_Dylan_Super_Bowl_Commercial_2014.mp4";
			iflinks_av[j++] = "/kb/vid/youb/02_Sixto_Rodriguez_-_I_Think_Of_You_.wmv.mp4";
			iflinks_av[j++] = "/kb/vid/youb/02_Sixto_Rodriguez_-_I_Think_Of_You_.wmv.mp4";
			iflinks_av[j++] = "/kb/vid/youb/waits-lullaby-1.mp4";
			iflinks_av[j++] = "/kb/vid/youb/waits-lullaby-1.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Maria_Muldaur_-_Don_t_You_Feel_My_Leg.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Maria_Muldaur_-_Don_t_You_Feel_My_Leg.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Wenn die Soldaten - Marlene Dietrich.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Wenn die Soldaten - Marlene Dietrich.mp4";
			iflinks_av[j++] = "/kb/vid/youb/REAL_MEN_WHO_STARE_AT_GOATS_part_3.mp4";
			iflinks_av[j++] = "/kb/vid/youb/REAL_MEN_WHO_STARE_AT_GOATS_part_3.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Time ( Tom Waits Cover ).mp4";
			iflinks_av[j++] = "/kb/vid/youb/Time ( Tom Waits Cover ).mp4";
			iflinks_av[j++] = "/kb/vid/youb/sharon_jones_100_days.mp4";
			iflinks_av[j++] = "/kb/vid/youb/sharon_jones_100_days.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-1.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-1.mp4";


			iflinks_av[j++] = "/kb/vid/youb/dori_caymmi-o_bem_do_mar.mp4";
			iflinks_av[j++] = "/kb/vid/youb/dori_caymmi-o_bem_do_mar.mp4";
			iflinks_av[j++] = "/kb/vid/youb/01_Sixto_Rodriguez_-_Sandrevan_Lullaby-Lifestyles_[Coming_From_.mp4";
			iflinks_av[j++] = "/kb/vid/youb/01_Sixto_Rodriguez_-_Sandrevan_Lullaby-Lifestyles_[Coming_From_.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Eleni_Mandell_-__quot_my_twin_quot__-_Live_at_The_EARL.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Eleni_Mandell_-__quot_my_twin_quot__-_Live_at_The_EARL.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Nat_King_Cole_All_Over_The_World.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Nat_King_Cole_All_Over_The_World.mp4";
			iflinks_av[j++] = "/kb/vid/youb/shania_tTwain_forever_and_for_always-world.mp4";
			iflinks_av[j++] = "/kb/vid/youb/shania_tTwain_forever_and_for_always-world.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Donovan _ Crystal Gayle - Catch The Wind.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Donovan _ Crystal Gayle - Catch The Wind.mp4";
			iflinks_av[j++] = "/kb/vid/youb/harris_together_again_file-249732345.mp4";
			iflinks_av[j++] = "/kb/vid/youb/harris_together_again_file-249732345.mp4";
			iflinks_av[j++] = "/kb/vid/youb/doghead_video.mp4";
			iflinks_av[j++] = "/kb/vid/youb/doghead_video.mp4";
			iflinks_av[j++] = "/kb/vid/youb/03_Rodriguez_-_I_ll_Slip_Away.mp4";
			iflinks_av[j++] = "/kb/vid/youb/03_Rodriguez_-_I_ll_Slip_Away.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Maria_Muldaur_-_My_Tennessee_Mountain_Home__Live_Recording_.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Maria_Muldaur_-_My_Tennessee_Mountain_Home__Live_Recording_.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Leonard Cohen -  Slow.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Leonard Cohen -  Slow.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Trio_-_Sabine.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Trio_-_Sabine.mp4";
			iflinks_av[j++] = "/kb/vid/youb/WHENEVER GOD SHINES HIS LIGHT - VAN MORRISON.mp4";
			iflinks_av[j++] = "/kb/vid/youb/WHENEVER GOD SHINES HIS LIGHT - VAN MORRISON.mp4";
			iflinks_av[j++] = "/kb/vid/youb/eva_cassidy-aint_no_sunshine.mp4";
			iflinks_av[j++] = "/kb/vid/youb/eva_cassidy-aint_no_sunshine.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Van Morrison - Moondance.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Van Morrison - Moondance.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Maria_Muldaur_-_A_Good_Man_is_Hard_To_Find.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Maria_Muldaur_-_A_Good_Man_is_Hard_To_Find.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Eleni_Mandell_-__quot_makeout_king_quot_.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Eleni_Mandell_-__quot_makeout_king_quot_.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Perhaps Love - John Denver & Placido Domingo.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Perhaps Love - John Denver & Placido Domingo.mp4";
			iflinks_av[j++] = "/kb/vid/youb/put_the_lime_in_the_coconut.mp4";
			iflinks_av[j++] = "/kb/vid/youb/put_the_lime_in_the_coconut.mp4";
			iflinks_av[j++] = "/kb/vid/youb/amywinehouse_love_losing_game_file-235773700.mp4";
			iflinks_av[j++] = "/kb/vid/youb/amywinehouse_love_losing_game_file-235773700.mp4";
			iflinks_av[j++] = "/kb/vid/youb/romania_hat.mp4";
			iflinks_av[j++] = "/kb/vid/youb/romania_hat.mp4";
			iflinks_av[j++] = "/kb/vid/youb/freddy_dreamers_telling_you_now_file-570139451.mp4";
			iflinks_av[j++] = "/kb/vid/youb/freddy_dreamers_telling_you_now_file-570139451.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Leonard Cohen - Lullaby (Old Ideas,2012).mp4";
			iflinks_av[j++] = "/kb/vid/youb/Leonard Cohen - Lullaby (Old Ideas,2012).mp4";
			iflinks_av[j++] = "/kb/vid/youb/Family Tree - Kings of Leon.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Family Tree - Kings of Leon.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Rodriguez_-_I_Wonder.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Rodriguez_-_I_Wonder.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Dreaming As One - Richie Havens.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Dreaming As One - Richie Havens.mp4";
			iflinks_av[j++] = "/kb/vid/youb/trio_Vogel_der_Nacht.mp4";
			iflinks_av[j++] = "/kb/vid/youb/trio_Vogel_der_Nacht.mp4";
			iflinks_av[j++] = "/kb/vid/youb/zara_leander_psycadeylic_file-252228034.mp4";
			iflinks_av[j++] = "/kb/vid/youb/zara_leander_psycadeylic_file-252228034.mp4";
			iflinks_av[j++] = "/kb/vid/youb/waits-time3.mp4";
			iflinks_av[j++] = "/kb/vid/youb/waits-time3.mp4";
			iflinks_av[j++] = "/kb/vid/youb/My Prayer  (Ink Spots, 1939).mp4";
			iflinks_av[j++] = "/kb/vid/youb/My Prayer  (Ink Spots, 1939).mp4";
			iflinks_av[j++] = "/kb/vid/youb/lovers_concerto_file-380426037.mp4";
			iflinks_av[j++] = "/kb/vid/youb/lovers_concerto_file-380426037.mp4";
			iflinks_av[j++] = "/kb/vid/youb/mclean_starry_nights_file-805110482.mp4";
			iflinks_av[j++] = "/kb/vid/youb/mclean_starry_nights_file-805110482.mp4";
			iflinks_av[j++] = "/kb/vid/youb/harris_wheels_of_love_file-54997698.mp4";
			iflinks_av[j++] = "/kb/vid/youb/harris_wheels_of_love_file-54997698.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Nat_King_Cole_-_Je_Vous_Aime_Beaucoup.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Nat_King_Cole_-_Je_Vous_Aime_Beaucoup.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Master_Guy_Savelli_s_Kun_Tao__U.S._Special_Forces_SERE_Train.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Master_Guy_Savelli_s_Kun_Tao__U.S._Special_Forces_SERE_Train.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Rodriguez_cf11_Rich_Folks_Hoax.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Rodriguez_cf11_Rich_Folks_Hoax.mp4";
			iflinks_av[j++] = "/kb/vid/youb/48_Roses_-_Mariachi_El_Bronx_(Jay_Leno,_2011).mp4";
			iflinks_av[j++] = "/kb/vid/youb/48_Roses_-_Mariachi_El_Bronx_(Jay_Leno,_2011).mp4";
			iflinks_av[j++] = "/kb/vid/youb/TRIO_-_Du_ich_w_r_so_gern_bei_dir.mp4";
			iflinks_av[j++] = "/kb/vid/youb/TRIO_-_Du_ich_w_r_so_gern_bei_dir.mp4";
			iflinks_av[j++] = "/kb/vid/youb/YouTube_-_Amy_Winehouse_-_You_Know_I_m_No_Good.mp4";
			iflinks_av[j++] = "/kb/vid/youb/YouTube_-_Amy_Winehouse_-_You_Know_I_m_No_Good.mp4";
			iflinks_av[j++] = "/kb/vid/youb/waits-come_on_up_to_the_house.mp4";
			iflinks_av[j++] = "/kb/vid/youb/waits-come_on_up_to_the_house.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Maria_Muldaur_-_Handy_Man.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Maria_Muldaur_-_Handy_Man.mp4";
			iflinks_av[j++] = "/kb/vid/youb/nina_simone-dont_let_me_be_misunderstood.mp4";
			iflinks_av[j++] = "/kb/vid/youb/nina_simone-dont_let_me_be_misunderstood.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Iris Dement - These Hills.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Iris Dement - These Hills.mp4";
			iflinks_av[j++] = "/kb/vid/youb/pendekar paul silat master.mp4";
			iflinks_av[j++] = "/kb/vid/youb/pendekar paul silat master.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Petula Clark - Look to the rainbow (Live Olympia).mp4";
			iflinks_av[j++] = "/kb/vid/youb/Petula Clark - Look to the rainbow (Live Olympia).mp4";
			iflinks_av[j++] = "/kb/vid/youb/_Firedoglake_sen_byrd_fiddle.mp4";
			iflinks_av[j++] = "/kb/vid/youb/_Firedoglake_sen_byrd_fiddle.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Eleni_Mandell_-__quot_girls_quot_.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Eleni_Mandell_-__quot_girls_quot_.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Trio_-_Turaluraluralu.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Trio_-_Turaluraluralu.mp4";
			iflinks_av[j++] = "/kb/vid/youb/yogis_Tibetan_Buddhism__Secrets_of_the_Yogis_of_Tibet_-_Part_5.mp4";
			iflinks_av[j++] = "/kb/vid/youb/yogis_Tibetan_Buddhism__Secrets_of_the_Yogis_of_Tibet_-_Part_5.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Mayssa Karaa - White Rabbit (American Hustle OST).mp4";
			iflinks_av[j++] = "/kb/vid/youb/Mayssa Karaa - White Rabbit (American Hustle OST).mp4";
			iflinks_av[j++] = "/kb/vid/youb/eva_cassidy-fields_of_gold.mp4";
			iflinks_av[j++] = "/kb/vid/youb/eva_cassidy-fields_of_gold.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Van Morrison - The Way Young Lovers Do.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Van Morrison - The Way Young Lovers Do.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Paul_Simon_-_You_Can_Call_Me_Al.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Paul_Simon_-_You_Can_Call_Me_Al.mp4";
			iflinks_av[j++] = "/kb/vid/youb/river_run_file-24160428.mp4";
			iflinks_av[j++] = "/kb/vid/youb/river_run_file-24160428.mp4";
			iflinks_av[j++] = "/kb/vid/youb/The_Large_Hadron_Rap.mp4";
			iflinks_av[j++] = "/kb/vid/youb/The_Large_Hadron_Rap.mp4";
			iflinks_av[j++] = "/kb/vid/youb/Petula Clark-Windmills Of Your Mind (lyrics).mp4";
			iflinks_av[j++] = "/kb/vid/youb/Petula Clark-Windmills Of Your Mind (lyrics).mp4";
			iflinks_av[j++] = "/kb/vid/youb/waits-time_full.mp4";
			iflinks_av[j++] = "/kb/vid/youb/waits-time_full.mp4";


		iflinks_av[j++] = "/kb/vid/youb/joe_south_want_to_go_home.mp4";
		iflinks_av[j++] = "/kb/vid/youb/joe_south_want_to_go_home.mp4";
		iflinks_av[j++] = "/kb/vid/youb/you_dont_own_me.mp4";
		iflinks_av[j++] = "/kb/vid/youb/you_dont_own_me.mp4";
		iflinks_av[j++] = "/kb/vid/youb/iris_sweet_is_thr_melody.mp4";
		iflinks_av[j++] = "/kb/vid/youb/iris_sweet_is_thr_melody.mp4";
		iflinks_av[j++] = "/kb/vid/youb/thai_bowie.mp4";
		iflinks_av[j++] = "/kb/vid/youb/thai_bowie.mp4";
		iflinks_av[j++] = "/kb/vid/youb/femme_pencak silat.mp4";
		iflinks_av[j++] = "/kb/vid/youb/femme_pencak silat.mp4";
		iflinks_av[j++] = "/kb/vid/youb/Huckleberry_Hound_17_Barbeque_Hound_-_YouTube.mp4";
		iflinks_av[j++] = "/kb/vid/youb/Huckleberry_Hound_17_Barbeque_Hound_-_YouTube.mp4";
		iflinks_av[j++] = "/kb/vid/youb/Leonard Cohen - The Land of Plenty Lyrics.mp4";
		iflinks_av[j++] = "/kb/vid/youb/Leonard Cohen - The Land of Plenty Lyrics.mp4";
		iflinks_av[j++] = "/kb/vid/youb/harris_nobodys_darlin_file-996617010.mp4";
		iflinks_av[j++] = "/kb/vid/youb/harris_nobodys_darlin_file-996617010.mp4";
		iflinks_av[j++] = "/kb/vid/youb/buckingham_nicks-say_goodbye-live.mp4";
		iflinks_av[j++] = "/kb/vid/youb/buckingham_nicks-say_goodbye-live.mp4";
		iflinks_av[j++] = "/kb/vid/youb/Paul_Simon_~__Diamonds_on_the_Soles_of_Her_Shoes_.mp4";
		iflinks_av[j++] = "/kb/vid/youb/Paul_Simon_~__Diamonds_on_the_Soles_of_Her_Shoes_.mp4";
		iflinks_av[j++] = "/kb/vid/Mary Tyler Moore/PAPA-OOM-MOW-MOW!.mp4";
		iflinks_av[j++] = "/kb/vid/Mary Tyler Moore/PAPA-OOM-MOW-MOW!.mp4";
		iflinks_av[j++] = "/kb/vid/Mary Tyler Moore/The Mary Tyler Moore Show S06E13 The Happy Homemaker Takes Lou Home.mp4";
		iflinks_av[j++] = "/kb/vid/Mary Tyler Moore/The Mary Tyler Moore Show S06E13 The Happy Homemaker Takes Lou Home.mp4";
		iflinks_av[j++] = "/kb/vid/Mary Tyler Moore/The Mary Tyler Moore Show S05E01 Will Mary Richards Go to Jail.mp4";
		iflinks_av[j++] = "/kb/vid/Mary Tyler Moore/The Mary Tyler Moore Show S05E01 Will Mary Richards Go to Jail.mp4";
		iflinks_av[j++] = "/kb/vid/Mary Tyler Moore/The Mary Tyler Moore Show S06E07 Chuckles Bites the Dust.mp4";
		iflinks_av[j++] = "/kb/vid/Mary Tyler Moore/The Mary Tyler Moore Show S06E07 Chuckles Bites the Dust.mp4";
		iflinks_av[j++] = "/kb/vid/Mary Tyler Moore/Mary Tyler Moore ugly green dress.mp4";
		iflinks_av[j++] = "/kb/vid/Mary Tyler Moore/Mary Tyler Moore ugly green dress.mp4";
		iflinks_av[j++] = "/kb/vid/Mary Tyler Moore/Big Chuck & Lil John - A Half A Head Of Lettuce.mp4";
		iflinks_av[j++] = "/kb/vid/Mary Tyler Moore/Big Chuck & Lil John - A Half A Head Of Lettuce.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/breilmeyer_mower_jtfdc_lawncare.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/breilmeyer_mower_jtfdc_lawncare.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/How To Get Started With Machine Learning    Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/How To Get Started With Machine Learning    Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Neural Network Learns The Physics of Fluids and Smoke   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Neural Network Learns The Physics of Fluids and Smoke   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/WaveNet by Google DeepMind   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/WaveNet by Google DeepMind   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Guinness World Record  Most Whip cracks with Two Whips in One Minute.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Guinness World Record  Most Whip cracks with Two Whips in One Minute.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Adaptive Fluid Simulations   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Adaptive Fluid Simulations   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Image Synthesis From Text With Deep Learning   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Image Synthesis From Text With Deep Learning   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Game AI Development With OpenAI Universe   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Game AI Development With OpenAI Universe   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/ka1.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/ka1.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Synchronizing Animations To Sound   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Synchronizing Animations To Sound   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/eva_cassidy-aint_no_sunshine.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/eva_cassidy-aint_no_sunshine.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Automatic Creation of Sketch Tutorials   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Automatic Creation of Sketch Tutorials   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Interactive Hair-Solid Simulations   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Interactive Hair-Solid Simulations   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/7 Days of Artificial Intelligence.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/7 Days of Artificial Intelligence.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Structural Image Editing With PatchMatch   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Structural Image Editing With PatchMatch   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Stunning Video Game Graphics With Voxel Cone Tracing (VXGI)   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Stunning Video Game Graphics With Voxel Cone Tracing (VXGI)   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/AI Makes Stunning Photos From Your Drawings (Pix2pix)   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/AI Makes Stunning Photos From Your Drawings (Pix2pix)   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Breaking DeepMind's Game AI System   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Breaking DeepMind's Game AI System   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Narrow Band Liquid Simulations   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Narrow Band Liquid Simulations   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Amazing Slow Motion Videos With Optical Flow   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Amazing Slow Motion Videos With Optical Flow   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Instant 3D Floorplans From Your Photos   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Instant 3D Floorplans From Your Photos   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/AI Makes 3D Models From Photos   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/AI Makes 3D Models From Photos   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Procedural Yarn Models for Cloth Rendering   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/vid/deepmind/Procedural Yarn Models for Cloth Rendering   Two Minute Papers.mp4";
		iflinks_av[j++] = "/kb/kt/Muhammad_ali_freddy_starr.mp4";
		iflinks_av[j++] = "/kb/kt/Muhammad_ali_freddy_starr.mp4";
		iflinks_av[j++] = "/kb/kt/000_Pakua_master_of_94_year_s_old.mp4";
		iflinks_av[j++] = "/kb/kt/000_Pakua_master_of_94_year_s_old.mp4";
		iflinks_av[j++] = "/kb/kt/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-0.mp4";
		iflinks_av[j++] = "/kb/kt/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-0.mp4";
		iflinks_av[j++] = "/kb/kt/willem_de_thouars_kuntao_silat_1996_gulfport_School_of_ta.mp4";
		iflinks_av[j++] = "/kb/kt/willem_de_thouars_kuntao_silat_1996_gulfport_School_of_ta.mp4";
		iflinks_av[j++] = "/kb/kt/Grand_Master_TRAN_TIEN_-_Vietnam_Kung_Fu.mp4";
		iflinks_av[j++] = "/kb/kt/Grand_Master_TRAN_TIEN_-_Vietnam_Kung_Fu.mp4";
		iflinks_av[j++] = "/kb/kt/yogis_Of_Tibet_-_Rare_Documentary.mp4";
		iflinks_av[j++] = "/kb/kt/yogis_Of_Tibet_-_Rare_Documentary.mp4";
		iflinks_av[j++] = "/kb/kt/6_Magic_Moves_-_To_Win_a_STREET_FIGHT.mp4";
		iflinks_av[j++] = "/kb/kt/6_Magic_Moves_-_To_Win_a_STREET_FIGHT.mp4";
		iflinks_av[j++] = "/kb/kt/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-1.mp4";
		iflinks_av[j++] = "/kb/kt/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-1.mp4";
		iflinks_av[j++] = "/kb/kt/kt_000229_037.mp4";
		iflinks_av[j++] = "/kb/kt/kt_000229_037.mp4";
		iflinks_av[j++] = "/kb/kt/Push_Hands_-_Tui_Shou.mp4";
		iflinks_av[j++] = "/kb/kt/Push_Hands_-_Tui_Shou.mp4";
		iflinks_av[j++] = "/kb/kt/muhammad_ali funny moments.mp4";
		iflinks_av[j++] = "/kb/kt/muhammad_ali funny moments.mp4";
		iflinks_av[j++] = "/kb/kt/GOATS_DECLASSIFIED__The_True_Story_Behind_The_Men_Who_Stare_.mp4";
		iflinks_av[j++] = "/kb/kt/GOATS_DECLASSIFIED__The_True_Story_Behind_The_Men_Who_Stare_.mp4";
		iflinks_av[j++] = "/kb/kt/master_ken_Seminar_uk_2013.mp4";
		iflinks_av[j++] = "/kb/kt/master_ken_Seminar_uk_2013.mp4";
		iflinks_av[j++] = "/kb/kt/funny_monkeys_vs_dogs_cats_compilation_2017.mp4";
		iflinks_av[j++] = "/kb/kt/funny_monkeys_vs_dogs_cats_compilation_2017.mp4";
		iflinks_av[j++] = "/kb/kt/kt_000229_033.mp4";
		iflinks_av[j++] = "/kb/kt/kt_000229_033.mp4";
		iflinks_av[j++] = "/kb/kt/THE_DAY_THE_EARTH_STOOD_STILL_-_1951_KLAATU_S_FINAL_SPEECH.mp4";
		iflinks_av[j++] = "/kb/kt/THE_DAY_THE_EARTH_STOOD_STILL_-_1951_KLAATU_S_FINAL_SPEECH.mp4";
		iflinks_av[j++] = "/kb/kt/kt_000229_013.mp4";
		iflinks_av[j++] = "/kb/kt/kt_000229_013.mp4";
		iflinks_av[j++] = "/kb/kt/muhammad_ali_beutiful_interview_rip.mp4";
		iflinks_av[j++] = "/kb/kt/muhammad_ali_beutiful_interview_rip.mp4";
		iflinks_av[j++] = "/kb/kt/femme_pencak_silat.mp4";
		iflinks_av[j++] = "/kb/kt/femme_pencak_silat.mp4";
		iflinks_av[j++] = "/kb/kt/kt_000229_019.mp4";
		iflinks_av[j++] = "/kb/kt/kt_000229_019.mp4";
		iflinks_av[j++] = "/kb/kt/wudang_vibrating_palm.mp4";
		iflinks_av[j++] = "/kb/kt/wudang_vibrating_palm.mp4";
		iflinks_av[j++] = "/kb/kt/kt_000229_014.mp4";
		iflinks_av[j++] = "/kb/kt/kt_000229_014.mp4";
		iflinks_av[j++] = "/kb/kt/baguazhang_turning_the_circle_tree.mp4";
		iflinks_av[j++] = "/kb/kt/baguazhang_turning_the_circle_tree.mp4";
		iflinks_av[j++] = "/kb/kt/S01E23_the_testament_of_arkadia.mp4";
		iflinks_av[j++] = "/kb/kt/S01E23_the_testament_of_arkadia.mp4";
		iflinks_av[j++] = "/kb/kt/dethouars_willem_de_thouars_uncle_bill_in_Verona_NJ_1-11-18.mp4";
		iflinks_av[j++] = "/kb/kt/dethouars_willem_de_thouars_uncle_bill_in_Verona_NJ_1-11-18.mp4";
		iflinks_av[j++] = "/kb/kt/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-2.mp4";
		iflinks_av[j++] = "/kb/kt/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-2.mp4";
		iflinks_av[j++] = "/kb/kt/Aikido_-_Demo_by_founder_-_Moriteru_Uesiba.mp4";
		iflinks_av[j++] = "/kb/kt/Aikido_-_Demo_by_founder_-_Moriteru_Uesiba.mp4";
		iflinks_av[j++] = "/kb/kt/kt_000229_007.mp4";
		iflinks_av[j++] = "/kb/kt/kt_000229_007.mp4";
		iflinks_av[j++] = "/kb/kt/Shaolin_Monk_Master_Super_Speed.mp4";
		iflinks_av[j++] = "/kb/kt/Shaolin_Monk_Master_Super_Speed.mp4";
		iflinks_av[j++] = "/kb/kt/Jim Channon Natural Security Future First Earth Battalion.mp4";
		iflinks_av[j++] = "/kb/kt/Jim Channon Natural Security Future First Earth Battalion.mp4";
		iflinks_av[j++] = "/kb/kt/cgi_quantum_jump_hayk_sahakyants.mp4";
		iflinks_av[j++] = "/kb/kt/cgi_quantum_jump_hayk_sahakyants.mp4";
		iflinks_av[j++] = "/kb/kt/kt_000229_022.mp4";
		iflinks_av[j++] = "/kb/kt/kt_000229_022.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181226_1215_jtf31_teachyourdogsnothere_jkwii.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181226_1215_jtf31_teachyourdogsnothere_jkwii.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20180104_1113_fedexexpress_blackchallenger_meetgreet.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20180104_1113_fedexexpress_blackchallenger_meetgreet.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181222_0945_jtf31_fiona_plumber_threats_n_stones.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181222_0945_jtf31_fiona_plumber_threats_n_stones.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20170609_1810_burgess_assessmen.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20170609_1810_burgess_assessmen.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtdfinc_2013mmdd_jtf39_trustee_byrd_threats.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtdfinc_2013mmdd_jtf39_trustee_byrd_threats.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1639_jtf31_darkpickup_backupout.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1639_jtf31_darkpickup_backupout.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1641_police2_pierce_pickup_jak3in.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1641_police2_pierce_pickup_jak3in.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1551_jtf31_tresspas.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1551_jtf31_tresspas.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1634_jtf31_plannin.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1634_jtf31_plannin.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1637_jtf31_meeting_hahah.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1637_jtf31_meeting_hahah.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1540_jtf31_jkwii_threat.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1540_jtf31_jkwii_threat.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1638_jtf26_upmail.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1638_jtf26_upmail.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1542_wofffren.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1542_wofffren.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181224_2307_jkwii_whyuhere_your_scaringus.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181224_2307_jkwii_whyuhere_your_scaringus.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181120_1519_jtf30_doogy_jkwii_romppatro.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181120_1519_jtf30_doogy_jkwii_romppatro.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181225_1352_jkwii_kids_jtf31_andy_dog.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181225_1352_jkwii_kids_jtf31_andy_dog.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20180411_1436_segrist_dog_fedex_stalk.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20180411_1436_segrist_dog_fedex_stalk.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181225_1951_jsk2in_maverics_santaride.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181225_1951_jsk2in_maverics_santaride.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181225_1936_jtf31_thanks4sign_meryxmas_woofs.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181225_1936_jtf31_thanks4sign_meryxmas_woofs.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181225_2250_200yr_stillenact_merryxmas.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181225_2250_200yr_stillenact_merryxmas.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181224_2349_jkwii_jtf31in_fiona_unleashe_street_charge.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181224_2349_jkwii_jtf31in_fiona_unleashe_street_charge.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181223_1821_jtf30_woofs_allnightling.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181223_1821_jtf30_woofs_allnightling.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181121_1123_jtf31_fiona_hadly_jkwii_romppatrol.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181121_1123_jtf31_fiona_hadly_jkwii_romppatrol.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20171216_1520_skkids_jtf31rake_jtf27fedex.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20171216_1520_skkids_jtf31rake_jtf27fedex.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1530_fiiretruck_xmaslight/jtfdc_20181210_1533_jtf31in_newblu.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1530_fiiretruck_xmaslight/jtfdc_20181210_1533_jtf31in_newblu.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1530_fiiretruck_xmaslight/jtfdc_20181210_1525_jtf30in.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1530_fiiretruck_xmaslight/jtfdc_20181210_1525_jtf30in.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1530_fiiretruck_xmaslight/jtfdc_20181210_1530_ffiretruck_xmaslight.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1530_fiiretruck_xmaslight/jtfdc_20181210_1530_ffiretruck_xmaslight.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1530_fiiretruck_xmaslight/jtfdc_20181210_1533_fireatruck_suvdonw.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1530_fiiretruck_xmaslight/jtfdc_20181210_1533_fireatruck_suvdonw.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181226_1200_jtf31_2xfiona_streetchargn_dogwalkeers.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181226_1200_jtf31_2xfiona_streetchargn_dogwalkeers.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20180308_2034_fedexs_flatbed_courtstalking.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20180308_2034_fedexs_flatbed_courtstalking.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181226_1236_byrds_up_quiet .mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181226_1236_byrds_up_quiet .mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181222_1357_jtf31_trespass_jkwii_liveyouronwlives.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181222_1357_jtf31_trespass_jkwii_liveyouronwlives.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181226_1205_jtf31_oureasment_dogtraing.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181226_1205_jtf31_oureasment_dogtraing.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20160702_1641_jtf31_josh_4asshole_gobackinside.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20160702_1641_jtf31_josh_4asshole_gobackinside.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181225_1345_kids_jtf31_freeroam_dogs.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181225_1345_kids_jtf31_freeroam_dogs.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1540_jtf31_jkwii_threats_n_stones.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181210_1540_jtf31_jkwii_threats_n_stones.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181226_1235_bigtruck_byrds_damage_assessmen.mp4";
		iflinks_av[j++] = "/kb/jtfdc/vid/jtfdc_20181226_1235_bigtruck_byrds_damage_assessmen.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04051_20150716_0643.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04051_20150716_0643.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04044_20150716_0634.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04044_20150716_0634.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04057_20150716_0701.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04057_20150716_0701.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04059_20150716_0709.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04059_20150716_0709.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04045_20150716_0635.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04045_20150716_0635.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04064_20150716_0813.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04064_20150716_0813.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04052_20150716_0644.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04052_20150716_0644.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04046_20150716_0640_jackie_yelling_at_josh.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04046_20150716_0640_jackie_yelling_at_josh.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04053_20150716_0644.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04053_20150716_0644.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04043_20150716_0616.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04043_20150716_0616.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04066_20150716_0816.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04066_20150716_0816.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04056_20150716_0646_josh_jackie_yelling.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04056_20150716_0646_josh_jackie_yelling.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04048_20150716_0641.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04048_20150716_0641.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04063_20150716_0812.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04063_20150716_0812.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04054_20150716_0644.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04054_20150716_0644.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04055_20150716_0644.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04055_20150716_0644.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04049_20150716_0642.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04049_20150716_0642.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04050_20150716_0642.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04050_20150716_0642.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04062_20150716_0738.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04062_20150716_0738.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04065_20150716_0815.mp4";
		iflinks_av[j++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04065_20150716_0815.mp4";
		iflinks_av[j++] = "/kb/music/ink spots/The Ink spots -  I don't want to set the world on fire.mp4";
		iflinks_av[j++] = "/kb/music/ink spots/The Ink spots -  I don't want to set the world on fire.mp4";
		iflinks_av[j++] = "/kb/music/ink spots/The Ink Spots - We'll Meet Again.mp4";
		iflinks_av[j++] = "/kb/music/ink spots/The Ink Spots - We'll Meet Again.mp4";
		iflinks_av[j++] = "/kb/music/ink spots/The Ink Spots - Address Unknown.mp4";
		iflinks_av[j++] = "/kb/music/ink spots/The Ink Spots - Address Unknown.mp4";
		iflinks_av[j++] = "/kb/music/Caro Emerald Live - A Night Like This @ Sziget 2012.mp4";
		iflinks_av[j++] = "/kb/music/Caro Emerald Live - A Night Like This @ Sziget 2012.mp4";
		iflinks_av[j++] = "/kb/music/Caro Emerald - Mistaken identity.mp4";
		iflinks_av[j++] = "/kb/music/Caro Emerald - Mistaken identity.mp4";
		iflinks_av[j++] = "/kb/music/fureys/The Fureys- The First Leaves Of Autumn.mp4";
		iflinks_av[j++] = "/kb/music/fureys/The Fureys- The First Leaves Of Autumn.mp4";
		iflinks_av[j++] = "/kb/music/fureys/The Fureys- I Will Love You Ev'ry Time.mp4";
		iflinks_av[j++] = "/kb/music/fureys/The Fureys- I Will Love You Ev'ry Time.mp4";
		iflinks_av[j++] = "/kb/music/fureys/The last Great love Song Performed by Finbar furey.mp4";
		iflinks_av[j++] = "/kb/music/fureys/The last Great love Song Performed by Finbar furey.mp4";
		iflinks_av[j++] = "/kb/music/fureys/The Fureys-Red Rose Cafe.mp4";
		iflinks_av[j++] = "/kb/music/fureys/The Fureys-Red Rose Cafe.mp4";
		iflinks_av[j++] = "/kb/music/fureys/The Fureys - The Old Man.mp4";
		iflinks_av[j++] = "/kb/music/fureys/The Fureys - The Old Man.mp4";
		iflinks_av[j++] = "/kb/music/fureys/I Will Love You Ev'ry Time - The Fureys & Davey Arthur.mp4";
		iflinks_av[j++] = "/kb/music/fureys/I Will Love You Ev'ry Time - The Fureys & Davey Arthur.mp4";
		iflinks_av[j++] = "/1.mp4";
		iflinks_av[j++] = "/1.mp4";
		iflinks_av[j++] = "/index7.mp4";
		iflinks_av[j++] = "/index7.mp4";
		iflinks_av[j++] = "/4.mp4";
		iflinks_av[j++] = "/4.mp4";
		iflinks_av[j++] = "/2.mp4";
		iflinks_av[j++] = "/2.mp4";
		iflinks_av[j++] = "/index6.mp4";
		iflinks_av[j++] = "/index6.mp4";
		iflinks_av[j++] = "/index2.mp4";
		iflinks_av[j++] = "/index2.mp4";
		iflinks_av[j++] = "/index.mp4";
		iflinks_av[j++] = "/index.mp4";
		iflinks_av[j++] = "/koh5.mp4";
		iflinks_av[j++] = "/koh5.mp4";
		iflinks_av[j++] = "/index1.mp4";
		iflinks_av[j++] = "/index1.mp4";
		iflinks_av[j++] = "/ko_jtf/jtf30/mov/Clip14.mp4";
		iflinks_av[j++] = "/ko_jtf/jtf30/mov/Clip14.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/mp4_email_sent2/04055_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/mp4_email_sent2/04055_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/04051_20150716_0643.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/04051_20150716_0643.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/04046_20150716_0640_Jackie_yelling_at_Josh.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/04046_20150716_0640_Jackie_yelling_at_Josh.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/04044_20150716_0634.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/04044_20150716_0634.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/mp4_email_sent1/04052_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/mp4_email_sent1/04052_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/mp4_email_sent1/04054_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/mp4_email_sent1/04054_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/mp4_email_sent1/04050_20150716_0642.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/mp4_email_sent1/04050_20150716_0642.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/04053_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/04053_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/04048_20150716_0641.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/04048_20150716_0641.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/mp4_email_sent1 2/04052_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/mp4_email_sent1 2/04052_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/mp4_email_sent1 2/04054_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/mp4_email_sent1 2/04054_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/mp4_email_sent1 2/04050_20150716_0642.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/mp4_email_sent1 2/04050_20150716_0642.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/04049_20150716_0642.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/04049_20150716_0642.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/04056_20150716_0646_Josh_Jackie_yelling.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/mp4_20150716/04056_20150716_0646_Josh_Jackie_yelling.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/videos_to_lighten_the_mood/Huckleberry_Hound_17_Barbeque_Hound.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/videos_to_lighten_the_mood/Huckleberry_Hound_17_Barbeque_Hound.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/videos_to_lighten_the_mood/executive_summary_doghead_video 3-23-167?38 PM1.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/videos_to_lighten_the_mood/executive_summary_doghead_video 3-23-167?38 PM1.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150806/mt4_20150806/3637_car_drivein_lights_off_20150807.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150806/mt4_20150806/3637_car_drivein_lights_off_20150807.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150806/mt4_20150806/3638_josh_walkin_house_20150807.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150806/mt4_20150806/3638_josh_walkin_house_20150807.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150928/mp4_20150928/0475_20150928_0747.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150928/mp4_20150928/0475_20150928_0747.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150928/mp4_20150928/0471_20150928_0737.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150928/mp4_20150928/0471_20150928_0737.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150928/mp4_20150928/0472_20150928_0737.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150928/mp4_20150928/0472_20150928_0737.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04051_20150716_0643.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04051_20150716_0643.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04046_20150716_0640_Jackie_yelling_at_Josh.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04046_20150716_0640_Jackie_yelling_at_Josh.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04044_20150716_0634.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04044_20150716_0634.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04057_20150716_0701.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04057_20150716_0701.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04059_20150716_0709.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04059_20150716_0709.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04045_20150716_0635.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04045_20150716_0635.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04064_20150716_0813.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04064_20150716_0813.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04052_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04052_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04053_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04053_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04043_20150716_0616.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04043_20150716_0616.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04066_20150716_0816.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04066_20150716_0816.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04048_20150716_0641.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04048_20150716_0641.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04063_20150716_0812.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04063_20150716_0812.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04054_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04054_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04055_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04055_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04049_20150716_0642.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04049_20150716_0642.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04050_20150716_0642.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04050_20150716_0642.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04062_20150716_0738.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04062_20150716_0738.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04056_20150716_0646_Josh_Jackie_yelling.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04056_20150716_0646_Josh_Jackie_yelling.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04065_20150716_0815.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04065_20150716_0815.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00027_20150919_2205_josh_walking.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00027_20150919_2205_josh_walking.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00026_20150919_2102.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00026_20150919_2102.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00025_20150919_1947.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00025_20150919_1947.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00028_20150919_2230.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00028_20150919_2230.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00023_20150919_1910.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00023_20150919_1910.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00045_20150919_1601.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00045_20150919_1601.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00041_20150919_1311.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00041_20150919_1311.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00043_20150919_1530.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00043_20150919_1530.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00037_20150919_1235.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00037_20150919_1235.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00036_20150919_1235.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00036_20150919_1235.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00042_20150919_1520.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00042_20150919_1520.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/videos_to_lighten_the_mood/Huckleberry_Hound_17_Barbeque_Hound.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/videos_to_lighten_the_mood/Huckleberry_Hound_17_Barbeque_Hound.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/videos_to_lighten_the_mood/executive_summary_doghead_video 3-23-167?38 PM1.mp4";
		iflinks_av[j++] = "/ko_jtf/wg/pictures_for_court_20160602/videos_to_lighten_the_mood/executive_summary_doghead_video 3-23-167?38 PM1.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04051_20150716_0643.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04051_20150716_0643.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04046_20150716_0640_Jackie_yelling_at_Josh.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04046_20150716_0640_Jackie_yelling_at_Josh.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04044_20150716_0634.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04044_20150716_0634.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04057_20150716_0701.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04057_20150716_0701.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04059_20150716_0709.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04059_20150716_0709.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04045_20150716_0635.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04045_20150716_0635.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04064_20150716_0813.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04064_20150716_0813.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04052_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04052_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04053_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04053_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04043_20150716_0616.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04043_20150716_0616.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04066_20150716_0816.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04066_20150716_0816.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04048_20150716_0641.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04048_20150716_0641.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04063_20150716_0812.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04063_20150716_0812.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04054_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04054_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04055_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04055_20150716_0644.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04049_20150716_0642.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04049_20150716_0642.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04050_20150716_0642.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04050_20150716_0642.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04062_20150716_0738.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04062_20150716_0738.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04056_20150716_0646_Josh_Jackie_yelling.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04056_20150716_0646_Josh_Jackie_yelling.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04065_20150716_0815.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04065_20150716_0815.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/jtfinc_9558_byrd_trustee_threat_201505.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/jtfinc_9558_byrd_trustee_threat_201505.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/9557_fiona_runs_201506.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/9557_fiona_runs_201506.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/index5.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/index5.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/index4.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/index4.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/ka1.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/ka1.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/doghead_video.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/doghead_video.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/Huckleberry_Hound_17_Barbeque_Hound.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/Huckleberry_Hound_17_Barbeque_Hound.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/9559_byrd_trustee_threat_201505.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/9559_byrd_trustee_threat_201505.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/jtdfinc_byrd2013.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/jtdfinc_byrd2013.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/index6.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/index6.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/index2.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/index2.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/jtf31_fiona_runs_201506.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/jtf31_fiona_runs_201506.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/9558_byrd_trustee_threat_201505.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/9558_byrd_trustee_threat_201505.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/index.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/index.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/jtfinc_9559_byrd_trustee_threat_201505.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/jtfinc_9559_byrd_trustee_threat_201505.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/index1.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/index1.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/ko_jtf.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/ko_jtf.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/index3.mp4";
		iflinks_av[j++] = "/ko_jtf/kb/v/index3.mp4";








			iflinks_vu[j++]="/index_av.html";
			iflinks_vu[j++]="/index_av.html";
			iflinks_vu[j++]="/index_bb.html";
			iflinks_vu[j++]="/index_bb.html";
			iflinks_vu[j++]="/index_bp.html";
			iflinks_vu[j++]="/index_bp.html";
			iflinks_vu[j++]="/index_dd.html";
			iflinks_vu[j++]="/index_dd.html";
			iflinks_vu[j++]="/index_dl.html";
			iflinks_vu[j++]="/index_dl.html";
			iflinks_vu[j++]="/index_dp.html";
			iflinks_vu[j++]="/index_dp.html";
			iflinks_vu[j++]="/index_fl.html";
			iflinks_vu[j++]="/index_fl.html";
			iflinks_vu[j++]="/index_jg.html";
			iflinks_vu[j++]="/index_jg.html";
			iflinks_vu[j++]="/index_pn.html";
			iflinks_vu[j++]="/index_pn.html";
			iflinks_vu[j++]="/index_sc.html";
			iflinks_vu[j++]="/index_sc.html";
			iflinks_vu[j++]="/index_sl.html";
			iflinks_vu[j++]="/index_sl.html";
			iflinks_vu[j++]="/index_tl.html";
			iflinks_vu[j++]="/index_tl.html";
			iflinks_vu[j++]="/index_tm.html";
			iflinks_vu[j++]="/index_tm.html";
			iflinks_vu[j++]="/index_us.html";
			iflinks_vu[j++]="/index_us.html";
			iflinks_vu[j++]="/index_wc.html";
			iflinks_vu[j++]="/index_wc.html";
			iflinks_vu[j++]="/index_av.html";
			iflinks_vu[j++]="/index_av.html";
			iflinks_vu[j++]="/index_zm.html";
			iflinks_vu[j++]="/index_zm.html";


			iflinks[j++]="/jkwii/whiteboard.html";
			iflinks[j++]="/jkwii/whiteboard.html";
			iflinks[j++]="/jkwii/whiteboard.html";
			iflinks[j++]="/jkwii/whiteboard.html";
			iflinks[j++]="/jkwii/whiteboard.html";
			iflinks[j++]="/jkwii/whiteboard.html";


			iflinks[j++]="/jkwii/blackboard.html";
			iflinks[j++]="/jkwii/blackboard.html";
			iflinks[j++]="/jkwii/blackboard.html";
			iflinks[j++]="/jkwii/blackboard.html";
			iflinks[j++]="/jkwii/blackboard.html";
			iflinks[j++]="/jkwii/blackboard.html";




	alert( "BGUS_IFRAM_100 if_src="+if_src )
	alert( "BGUS_IFRAM_100 if_src="+if_src )
//				iflist[z++] = "ko/svc/js/threejs/examples/index.html"
//				iflist[z++] = "ko/svc/js/threejs/examples/index.html"
//				iflist[z++] = "ko/svc/js//stemkoskijs/index.html"
//				iflist[z++] = "ko/svc/js//stemkoskijs/index.html"
//				iflist[z++] = "/ko/svc/js/stemkoskijs/Three.js/Voxel-Painter.html";
//				iflist[z++] = "/ko/svc/js/stemkoskijs/Three.js/Voxel-Painter.html";
//				iflist[z++] = "ko/svc/js/stemkoskijs/Three.js/index.html";
//				iflist[z++] = "ko/svc/js/stemkoskijs/Three.js/index.html";
//				iflist[z++] = "ko/svc/js/kojs/kojs_gojs/index.html";
//				iflist[z++] = "ko/svc/js/kojs/kojs_gojs/index.html";
//				iflist[z++] = "ko/svc/js/kojs/kojs_3js_stemkoski/index.html";
//				iflist[z++] = "ko/svc/js/kojs/kojs_3js_stemkoski/index.html";
//				iflist[z++] = "ko/svc/js/kojs/kojs_3js_stemkoski/Three.js/index.html";
//				iflist[z++] = "ko/svc/js/kojs/kojs_3js_stemkoski/Three.js/index.html";
//				iflist[z++] = "ko/svc/js/kojs/kojs_gojs/samples/index.html";
//				iflist[z++] = "ko/svc/js/kojs/kojs_gojs/samples/index.html";
//				iflist[z++] = "ko/svc/js/deckjs/index.html";
//				iflist[z++] = "ko/svc/js/deckjs/index.html";






	*/
	*/






				iflen=iflinks.length;
				iflen=iflinks.length;
				iflen_svc=iflinks_svc.length;
				iflen_svc=iflinks_svc.length;
				iflen_av=iflinks_av.length;
				iflen_av=iflinks_av.length;
				iflen_sl=iflinks_sl.length;
				iflen_sl=iflinks_sl.length;
				iflen_pn=iflinks_vc.length;
				iflen_pn=iflinks_vc.length;
				iflen_vu=iflinks_vu.length;
				iflen_vu=iflinks_vu.length;
				iflen_pdf=iflinks_pdf.length;
				iflen_pdf=iflinks_pdf.length;
				iflen_zm=iflinks_zm.length;
				iflen_zm=iflinks_zm.length;






				if( ifid == "" ) { ifid=0; }
				if( ifid == "" ) { ifid=0; }
				if( ifid > iflen ) { ifid=iflen; }
				if( ifid > iflen ) { ifid=iflen; }
//				if_src = iflist[0];
//				if_src = iflist[0];
				if_src = iflist[ifid];
				if_src = iflist[ifid];
				if( if_src == "" ) { 
				if( if_src == "" ) { 
					alert( "BUGS_600 iframe if_src="+if_src+" ifid="+ifid );
					alert( "BUGS_600 iframe if_src="+if_src+" ifid="+ifid );
					if_src=iflist[0]; 
					if_src=iflist[0]; 
					}
					}
				if_h=200;
				if_h=200;
				if_w=800;
				if_w=800;
				htmout = "";
				htmout = "";
				htmout += '<a href="'+if_src+'" onclick="return false;" target=_blank>\n';
				htmout += '<a href="'+if_src+'" onclick="return false;" target=_blank>\n';
				htmout += '<iframe id="iframe" frameborder="0" \n';
				htmout += '<iframe id="iframe" frameborder="0" \n';
				htmout += '	height="'+if_h+'" marginheight="0" marginwidth="0" scrolling="no"\n'; 
				htmout += '	height="'+if_h+'" marginheight="0" marginwidth="0" scrolling="no"\n'; 
				htmout += '	src="'+if_src+'"\n';
				htmout += '	src="'+if_src+'"\n';
				htmout += '	style="margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)" width="'+if_w+'">\n';
				htmout += '	style="margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)" width="'+if_w+'">\n';
				htmout += '	</iframe>\n';
				htmout += '	</iframe>\n';
				htmout += '	</a>\n';
				htmout += '	</a>\n';
				htmout += '<a href="'+if_src+'" class=thumbnail target=_blank class=thumbnail >\n';
				htmout += '<a href="'+if_src+'" class=thumbnail target=_blank class=thumbnail >\n';
				htmout += '	<img  height=100 src="/imgs/gif/knotb.gif" >'
				htmout += '	<img  height=100 src="/imgs/gif/knotb.gif" >'
				htmout += '	</span><img height=300 src="/imgs/gif/knotp.gif" ></span>\n'
				htmout += '	</span><img height=300 src="/imgs/gif/knotp.gif" ></span>\n'
				htmout += '	</a>\n';
				htmout += '	</a>\n';
				alert( "BUGS_4860 iflen="+iflen+" ifid="+ifid+" if_src="+if_src+" htmout="+htmout );
				alert( "BUGS_4860 iflen="+iflen+" ifid="+ifid+" if_src="+if_src+" htmout="+htmout );
				var div_iframe = document.getElementById("div_iframe");
				var div_iframe = document.getElementById("div_iframe");
				div_iframe.innerHTML = htmout;
				div_iframe.innerHTML = htmout;
				alert( "BUGS_1200 IRAMES htmout="+htmout )
				alert( "BUGS_1200 IRAMES htmout="+htmout )
				return( htmout );
				return( htmout );
				}
				}


			</script id="script_iframe">
			</script id="script_iframe">


















	<script id="script_startup">
	<script id="script_startup">
		function startup() {
		function startup() {
//			clear_div_kov();
//			clear_div_kov();
			kogrids('');
			kogrids('');
			kov_links_main();
			kov_links_main();
//			init_pano('canvas'); 
//			init_pano('canvas'); 
//			alert( "BUGS_455 startup done" );
//			alert( "BUGS_455 startup done" );
			}
			}
		</script id="script_startup">
		</script id="script_startup">




	<script id="script_kovbugs" >
	<script id="script_kovbugs" >
		function kov_links_main() {
		function kov_links_main() {
//			alert( "BUGS_510 kov_links_main() beg" );
//			alert( "BUGS_510 kov_links_main() beg" );
//			clear_div_kov();
//			clear_div_kov();
			show_kov_links( kov_links );
			show_kov_links( kov_links );
//			alert( "BUGS_520 kov_links_main() beg" );
//			alert( "BUGS_520 kov_links_main() beg" );
			}
			}
		</script id="script_kovbugs" >
		</script id="script_kovbugs" >


	<script id="script_load_kov_links" >
	<script id="script_load_kov_links" >
		function load_kov_links() {
		function load_kov_links() {
//			alert( "BUGS_520 load_kov_links beg" );
//			alert( "BUGS_520 load_kov_links beg" );
			var j=0;
			var j=0;
//			kov_links[j++]="kov_ko";
//			kov_links[j++]="kov_ko";
			kov_links[j++]="kov_new";
			kov_links[j++]="kov_new";
			kov_links[j++]="kov_focus";
			kov_links[j++]="kov_focus";
			kov_links[j++]="kov_work";
			kov_links[j++]="kov_work";
			kov_links[j++]="kov_food";
			kov_links[j++]="kov_food";
			kov_links[j++]="kov_courtreport";
			kov_links[j++]="kov_courtreport";
			kov_links[j++]="kov_where";
			kov_links[j++]="kov_where";
			kov_links[j++]="kov_memes";
			kov_links[j++]="kov_memes";
			kov_links[j++]="kov_kids";
			kov_links[j++]="kov_kids";
			kov_links[j++]="kov_dogs";
			kov_links[j++]="kov_dogs";
			kov_links[j++]="kov_preserve";
			kov_links[j++]="kov_preserve";
			kov_links[j++]="kov_protect";
			kov_links[j++]="kov_protect";
			kov_links[j++]="kov_jtfdc";
			kov_links[j++]="kov_jtfdc";
			kov_links[j++]="kov_jtfinc";
			kov_links[j++]="kov_jtfinc";
			kov_links[j++]="kov_byrdpucker";
			kov_links[j++]="kov_byrdpucker";
			kov_links[j++]="kov_jkwii";
			kov_links[j++]="kov_jkwii";
			kov_links[j++]="kov_kou";
			kov_links[j++]="kov_kou";
			kov_links[j++]="kov_kassil";
			kov_links[j++]="kov_kassil";
			kov_links[j++]="kov_konet";
			kov_links[j++]="kov_konet";
			kov_links[j++]="kov_iperms";
			kov_links[j++]="kov_iperms";
			kov_links[j++]="kov_konabus";
			kov_links[j++]="kov_konabus";
			kov_links[j++]="kov_kt";
			kov_links[j++]="kov_kt";
//			kov_links[j++]="kov_go";
//			kov_links[j++]="kov_go";
//			kov_links[j++]="kov_old";
//			kov_links[j++]="kov_old";
//			alert( "BUGS_560 load_kov_links end len="+kov_links.length );
//			alert( "BUGS_560 load_kov_links end len="+kov_links.length );
			return( kov_links );
			return( kov_links );
			}
			}
		</script id="script_load_kov_links" >
		</script id="script_load_kov_links" >


	<script id="script_show_kov_links" >
	<script id="script_show_kov_links" >
		function show_kov_links() {
		function show_kov_links() {
			kov_links = load_kov_links();
			kov_links = load_kov_links();
			htmout_kov_links = "";
			htmout_kov_links = "";
//			alert( "BUGS_550 show_kov_links len"+kov_links.length );
//			alert( "BUGS_550 show_kov_links len"+kov_links.length );
			for (i = 0; i < kov_links.length; i++) {
			for (i = 0; i < kov_links.length; i++) {
				kovid=kov_links[i];
				kovid=kov_links[i];
				htmout_kov_links += "<a href="+kovid+".html class=thumbnail target=_blank>";
				htmout_kov_links += "<a href="+kovid+".html class=thumbnail target=_blank>";
				htmout_kov_links += "	<img height=50 src=/imgs/btn/kob.png alt="+kovid+" border=0>";
				htmout_kov_links += "	<img height=50 src=/imgs/btn/kob.png alt="+kovid+" border=0>";
				htmout_kov_links += "	<span><img height=300 src=/imgs/kov/"+kovid+".png border=0></span>\n";
				htmout_kov_links += "	<span><img height=300 src=/imgs/kov/"+kovid+".png border=0></span>\n";
				htmout_kov_links += "	</a>";
				htmout_kov_links += "	</a>";
				}
				}
			htmout_kov_links += "<br><br><br>";
			htmout_kov_links += "<br><br><br>";
			var div_kov_links = document.getElementById('div_kov_links');
			var div_kov_links = document.getElementById('div_kov_links');
			div_kov_links.insertAdjacentHTML('beforeend', htmout_kov_links);
			div_kov_links.insertAdjacentHTML('beforeend', htmout_kov_links);
//			alert( "BUGS_560 show_kov_links end htmout_kov_links="+htmout_kov_links );
//			alert( "BUGS_560 show_kov_links end htmout_kov_links="+htmout_kov_links );
			}
			}
		</script id="script_show_kov_links" >
		</script id="script_show_kov_links" >


	<script id="script_clear_div_kov" >
	<script id="script_clear_div_kov" >
		function clear_div_kov() {
		function clear_div_kov() {
//			var kov_ko = document.getElementById('kov_ko'); kov_ko.innerHTML = "";
//			var kov_ko = document.getElementById('kov_ko'); kov_ko.innerHTML = "";
			var kov_new = document.getElementById('kov_new'); kov_new.innerHTML = "";
			var kov_new = document.getElementById('kov_new'); kov_new.innerHTML = "";
			var kov_focus = document.getElementById('kov_focus'); kov_focus.innerHTML = "";
			var kov_focus = document.getElementById('kov_focus'); kov_focus.innerHTML = "";
			var kov_food = document.getElementById('kov_food'); kov_food.innerHTML = "";
			var kov_food = document.getElementById('kov_food'); kov_food.innerHTML = "";
			var kov_courtreport = document.getElementById('kov_courtreport'); kov_courtreport.innerHTML = "";
			var kov_courtreport = document.getElementById('kov_courtreport'); kov_courtreport.innerHTML = "";
			var kov_where = document.getElementById('kov_where'); kov_where.innerHTML = "";
			var kov_where = document.getElementById('kov_where'); kov_where.innerHTML = "";
			var kov_work = document.getElementById('kov_work'); kov_work.innerHTML = "";
			var kov_work = document.getElementById('kov_work'); kov_work.innerHTML = "";
			var kov_memes = document.getElementById('kov_memes'); kov_memes.innerHTML = "";
			var kov_memes = document.getElementById('kov_memes'); kov_memes.innerHTML = "";
			var kov_kids = document.getElementById('kov_kids'); kov_kids.innerHTML = "";
			var kov_kids = document.getElementById('kov_kids'); kov_kids.innerHTML = "";
			var kov_dogs = document.getElementById('kov_dogs'); kov_dogs.innerHTML = "";
			var kov_dogs = document.getElementById('kov_dogs'); kov_dogs.innerHTML = "";
			var kov_preserve = document.getElementById('kov_preserve'); kov_preserve.innerHTML = "";
			var kov_preserve = document.getElementById('kov_preserve'); kov_preserve.innerHTML = "";
			var kov_protect = document.getElementById('kov_protect'); kov_protect.innerHTML = "";
			var kov_protect = document.getElementById('kov_protect'); kov_protect.innerHTML = "";
			var kov_jtfdc = document.getElementById('kov_jtfdc'); kov_jtfdc.innerHTML = "";
			var kov_jtfdc = document.getElementById('kov_jtfdc'); kov_jtfdc.innerHTML = "";
			var kov_jtfinc = document.getElementById('kov_jtfinc'); kov_jtfinc.innerHTML = "";
			var kov_jtfinc = document.getElementById('kov_jtfinc'); kov_jtfinc.innerHTML = "";
			var kov_byrdpucker = document.getElementById('kov_byrdpucker'); kov_byrdpucker.innerHTML = "";
			var kov_byrdpucker = document.getElementById('kov_byrdpucker'); kov_byrdpucker.innerHTML = "";
			var kov_jkwii = document.getElementById('kov_jkwii'); kov_jkwii.innerHTML = "";
			var kov_jkwii = document.getElementById('kov_jkwii'); kov_jkwii.innerHTML = "";
			var kov_kou = document.getElementById('kov_kou'); kov_kou.innerHTML = "";
			var kov_kou = document.getElementById('kov_kou'); kov_kou.innerHTML = "";
			var kov_konet = document.getElementById('kov_konet'); kov_konet.innerHTML = "";
			var kov_konet = document.getElementById('kov_konet'); kov_konet.innerHTML = "";
			var kov_kassil = document.getElementById('kov_kassil'); kov_kassil.innerHTML = "";
			var kov_kassil = document.getElementById('kov_kassil'); kov_kassil.innerHTML = "";
			var kov_konabus = document.getElementById('kov_konabus'); kov_konabus.innerHTML = "";
			var kov_konabus = document.getElementById('kov_konabus'); kov_konabus.innerHTML = "";
			var kov_iperms = document.getElementById('kov_iperms'); kov_iperms.innerHTML = "";
			var kov_iperms = document.getElementById('kov_iperms'); kov_iperms.innerHTML = "";
			var kov_kt = document.getElementById('kov_kt'); kov_kt.innerHTML = "";
			var kov_kt = document.getElementById('kov_kt'); kov_kt.innerHTML = "";
			var kov_go = document.getElementById('kov_go'); kov_go.innerHTML = "";
			var kov_go = document.getElementById('kov_go'); kov_go.innerHTML = "";
			var kov_old = document.getElementById('kov_old'); kov_old.innerHTML = "";
			var kov_old = document.getElementById('kov_old'); kov_old.innerHTML = "";
//			alert( "BUGS_4420 clear_kov end" );
//			alert( "BUGS_4420 clear_kov end" );
			}
			}
		</script id="script_clear_div_kov" >
		</script id="script_clear_div_kov" >


	<style id="style_input">
	<style id="style_input">
		.fileContainer {
		.fileContainer {
		    overflow: hidden;
		    overflow: hidden;
		    position: relative;
		    position: relative;
			}
			}
		
		
		.fileContainer [type=file] {
		.fileContainer [type=file] {
		    cursor: inherit;
		    cursor: inherit;
		    display: block;
		    display: block;
		    font-size: 999px;
		    font-size: 999px;
		    filter: alpha(opacity=0);
		    filter: alpha(opacity=0);
		    min-height: 100%;
		    min-height: 100%;
		    min-width: 100%;
		    min-width: 100%;
		    opacity: 0;
		    opacity: 0;
		    position: absolute;
		    position: absolute;
		    right: 0;
		    right: 0;
		    text-align: right;`
		    text-align: right;`
		    top: 0;
		    top: 0;
			}
			}
		</style id="style_input">
		</style id="style_input">


<!--
<!--
	<style id="style_input2">
	<style id="style_input2">
		input[type=text] {
		input[type=text] {
//			background-color: #BFBDBD;
//			background-color: #BFBDBD;
			background-color: darkSlategrey;
			background-color: darkSlategrey;
//			color: #979797;
//			color: #979797;
			border:solid 1px darkSlategrey;
			border:solid 1px darkSlategrey;
			color: ivory;
			color: ivory;
			height: 28px;
			height: 28px;
			padding-left:10px;
			padding-left:10px;
			width: 191px;
			width: 191px;
			box-shadow: 2px 2px 0 #828181 inset;
			box-shadow: 2px 2px 0 #828181 inset;
			}
			}
		input[type=button] {
		input[type=button] {
//			background-color: #1E1E1E;
//			background-color: #1E1E1E;
//			color: #979797;
//			color: #979797;
			background-color: darkSlategrey;
			background-color: darkSlategrey;
			color: ivory;
			color: ivory;
			height: 24px;
			height: 24px;
			width: 103px;
			width: 103px;
			text-transform:uppercase;
			text-transform:uppercase;
			box-shadow:-1px 2px #6E6B6A inset;
			box-shadow:-1px 2px #6E6B6A inset;
			}
			}
		input[type=button], input[type=text]
		input[type=button], input[type=text]
			{border-radius: 5px; font-family: Sansation;}
			{border-radius: 5px; font-family: Sansation;}
			{border-radius: 5px; font-family: yokkmokkOT;}
			{border-radius: 5px; font-family: yokkmokkOT;}
		</style>
		</style>
<!--	-->
<!--	-->










	<style id="style_popover" >
	<style id="style_popover" >
		.popover  {
		.popover  {
			position: relative;
			position: relative;
			float: left;
			float: left;
			padding: 5px;
			padding: 5px;
//			/*z-ka1: 0;*/
//			/*z-ka1: 0;*/
//			width: 200px;'
//			width: 200px;'
//			height: 300px;
//			height: 300px;
			}
			}
		.popover:hover {
		.popover:hover {
			background-color: darkSlategrey;
			background-color: darkSlategrey;
// bigboxbug		background-color: yellow;
// bigboxbug		background-color: yellow;
//			background-color: #e9e9e2;
//			background-color: #e9e9e2;
//			width: 200px;
//			width: 200px;
//			height: 300px;
//			height: 300px;
			/*z-ka1: 50;*/
			/*z-ka1: 50;*/
//			color: white;
//			color: white;
			color: ivory;
			color: ivory;
//			color: #335500;
//			color: #335500;
			text-decoration: none;
			text-decoration: none;
			}
			}
/*CSS for enlarged image*/
/*CSS for enlarged image*/
		.popover span { 
		.popover span { 
			position: absolute; 		// important
			position: absolute; 		// important
//			width: 200px;
//			width: 200px;
//			height: 300px;
//			height: 300px;
//			background-color: #e5e5e5;
//			background-color: #e5e5e5;
//			left: -1000px;
//			left: -1000px;
//			border: 1px solid #666;
//			border: 1px solid #666;


//			position: relative; 
//			position: relative; 
			background-color: darkSlategrey;
			background-color: darkSlategrey;
			padding: 5px;
			padding: 5px;
			border: 0px solid #666;
			border: 0px solid #666;
			visibility: hidden;
			visibility: hidden;
			color: ivory;
			color: ivory;
			text-decoration: none;
			text-decoration: none;
			}
			}
/*CSS for enlarged image*/
/*CSS for enlarged image*/
		.popover span img { 
		.popover span img { 
//			border-width: 0px; 
//			border-width: 0px; 
			border-width: 0px; 
			border-width: 0px; 
			/*padding: 2px;*/
			/*padding: 2px;*/
			}
			}
		
		
/*CSS for enlarged image on hover*/
/*CSS for enlarged image on hover*/
		.popover:hover span { 
		.popover:hover span { 
			visibility: visible; 
			visibility: visible; 
//			width: 200px;
//			width: 200px;
			top: 0px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
			top: 0px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
			left: 0px;/*position where enlarged image should offset horizontally */
			left: 0px;/*position where enlarged image should offset horizontally */
			}
			}
		<s/tyle id="style_popover" >
		<s/tyle id="style_popover" >




	<style id="style_thumbnail" >
	<style id="style_thumbnail" >
		.thumbnail  {
		.thumbnail  {
			position: relative;
			position: relative;
			float: left;
			float: left;
			padding: 5px;
			padding: 5px;
			/*z-ka1: 0;*/
			/*z-ka1: 0;*/
			}
			}
		.thumbnail:hover {
		.thumbnail:hover {
//			background-color: #e9e9e2;
//			background-color: #e9e9e2;
//			color: #335500;
//			color: #335500;
//			z-ka1: 50;
//			z-ka1: 50;
			background-color: darkslategrey;
			background-color: darkslategrey;
			color: ivory;
			color: ivory;
			text-decoration: none;
			text-decoration: none;
			}
			}
/*CSS for enlarged image*/
/*CSS for enlarged image*/
		.thumbnail span { 
		.thumbnail span { 
//			background-color: #e5e5e5;
//			background-color: #e5e5e5;
//			left: -1000px;
//			left: -1000px;
//			color: black;
//			color: black;
//			position: relative; 
//			position: relative; 
			position: absolute; 
			position: absolute; 
			background-color: darkSlategrey;
			background-color: darkSlategrey;
			padding: 5px;
			padding: 5px;
			border: 1px solid #666;
			border: 1px solid #666;
			visibility: hidden;
			visibility: hidden;
			color: ivory;
			color: ivory;
			text-decoration: none;
			text-decoration: none;
			}
			}
/*CSS for enlarged image*/
/*CSS for enlarged image*/
		.thumbnail span img { 
		.thumbnail span img { 
			border-width: 0px; 
			border-width: 0px; 
			/*padding: 2px;*/
			/*padding: 2px;*/
			}
			}
		
		
/*CSS for enlarged image on hover*/
/*CSS for enlarged image on hover*/
		.thumbnail:hover span { 
		.thumbnail:hover span { 
//			width: 100px;
//			width: 100px;
//			top: 5px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
//			top: 5px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
			visibility: visible; 
			visibility: visible; 
			width: 50px;
			width: 50px;
			top: 100px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
			top: 100px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
			left: 100px;/*position where enlarged image should offset horizontally */
			left: 100px;/*position where enlarged image should offset horizontally */
			}
			}
		
		
		/*THUMBNAIL2 - thumbnail2 has border and border on hover*/
		/*THUMBNAIL2 - thumbnail2 has border and border on hover*/
		.thumbnail2 {
		.thumbnail2 {
			position: relative;
			position: relative;
			float: left;
			float: left;
			padding: 5px;
			padding: 5px;
			/*z-ka1: 0;*/
			/*z-ka1: 0;*/
			}
			}
		.thumbnail2:hover { 
		.thumbnail2:hover { 
//			background-color: #e9e9e2;
//			background-color: #e9e9e2;
//			color: #335500;
//			color: #335500;
//			/*z-ka1: 50;*/
//			/*z-ka1: 50;*/
			background-color: darkSlategrey;
			background-color: darkSlategrey;
			color: ivory;
			color: ivory;
			text-decoration: none;
			text-decoration: none;
			}
			}
		.thumbnail2 span { /*CSS for enlarged image*/
		.thumbnail2 span { /*CSS for enlarged image*/
//			background-color: #e5e5e5;
//			background-color: #e5e5e5;
			position: absolute;
			position: absolute;
//			/*left: -1000px;*/
//			/*left: -1000px;*/
//			color: black;
//			color: black;
//			relative: absolute;
//			relative: absolute;
			background-color: darkSlategrey;
			background-color: darkSlategrey;
			padding: 5px;
			padding: 5px;
			border: 1px solid #666;
			border: 1px solid #666;
			visibility: hidden;
			visibility: hidden;
			color: ivory;
			color: ivory;
			text-decoration: none;
			text-decoration: none;
			}
			}
		
		
/*CSS for enlarged image*/
/*CSS for enlarged image*/
		.thumbnail2 span img { border-width: 0px;}
		.thumbnail2 span img { border-width: 0px;}
/*CSS for enlarged image on hover*/
/*CSS for enlarged image on hover*/
		.thumbnail2:hover span { 
		.thumbnail2:hover span { 
			visibility: visible; width: 208px;
			visibility: visible; width: 208px;
			top: 5px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
			top: 5px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
			left: 300px;/*position where enlarged image should offset horizontally */
			left: 300px;/*position where enlarged image should offset horizontally */
			}
			}
		a.thumbnail2 img { text-decoration:none; z-ka1: 50; }
		a.thumbnail2 img { text-decoration:none; z-ka1: 50; }
		
		
/*if same attribute for all 4 states, then declare here in a.thumbnail2*/ 
/*if same attribute for all 4 states, then declare here in a.thumbnail2*/ 
		a.thumbnail2 img:link { border: 2px solid #e9e9e2; background: transparent; }
		a.thumbnail2 img:link { border: 2px solid #e9e9e2; background: transparent; }
		a.thumbnail2 img:visited { border: 2px solid #e9e9e2; background : transparent; }
		a.thumbnail2 img:visited { border: 2px solid #e9e9e2; background : transparent; }
		a.thumbnail2 img:hover { border: 2px solid #f00; background : transparent; }
		a.thumbnail2 img:hover { border: 2px solid #f00; background : transparent; }
		a.thumbnail2 img:active { border: 2px solid #e9e9e2; background : transparent; }
		a.thumbnail2 img:active { border: 2px solid #e9e9e2; background : transparent; }
		a.thumbnail2 img { border: 2px solid #e9e9e2; }
		a.thumbnail2 img { border: 2px solid #e9e9e2; }
		</style id="style_thumbnail" >
		</style id="style_thumbnail" >


	<style id="style_buttons" >
	<style id="style_buttons" >
//                body { text-align: center; background-color: "darkSlategrey"; color:"ivory"; }
//                body { text-align: center; background-color: "darkSlategrey"; color:"ivory"; }
                button {
                button {
//			visibility: hidden;
//			visibility: hidden;
//			background: rgba(7, 99, 53, .1);
//			background: rgba(7, 99, 53, .1);
			background: transparent;
			background: transparent;
//	                border: 3px solid rgba(7, 99, 53, 1);
//	                border: 3px solid rgba(7, 99, 53, 1);
	                border: 3px solid darkSlategrey;
	                border: 3px solid darkSlategrey;
			border-radius: 5px;
			border-radius: 5px;
//			color: rgba(7, 99, 53, 1);
//			color: rgba(7, 99, 53, 1);
//			color: ivory;
//			color: ivory;
			color: darkSlategrey;
			color: darkSlategrey;
			cursor: pointer;
			cursor: pointer;
			line-height: 40px;
			line-height: 40px;
			font-size: 20px;
			font-size: 20px;
			outline: none;
			outline: none;
			padding: 0 20px;
			padding: 0 20px;
			transition: all .3s;
			transition: all .3s;
                	}
                	}
	        button:hover {
	        button:hover {
//	              background: rgba(7, 99, 53, 1);
//	              background: rgba(7, 99, 53, 1);
  	              background: darkSlategrey;
  	              background: darkSlategrey;
//  	              background: yellow;
//  	              background: yellow;
//  	              background: white;
//  	              background: white;
//  	              color: rgba(255,255,255,1);
//  	              color: rgba(255,255,255,1);
  	              color: ivory;
  	              color: ivory;
  	              }
  	              }
		p {font-size: 20px; font-weight: bold;
		p {font-size: 20px; font-weight: bold;
		</style id="style_buttons" >
		</style id="style_buttons" >


	<style id="style_input" >
	<style id="style_input" >
//               body { text-align: center; background-color: "darkSlategrey"; color:"ivory"; }
//               body { text-align: center; background-color: "darkSlategrey"; color:"ivory"; }
                input {
                input {
//			visibility: hidden;
//			visibility: hidden;
//			background: rgba(7, 99, 53, .1);
//			background: rgba(7, 99, 53, .1);
			background: transparent;
			background: transparent;
//	                border: 3px solid rgba(7, 99, 53, 1);
//	                border: 3px solid rgba(7, 99, 53, 1);
	                border: 3px solid darkSlategrey;
	                border: 3px solid darkSlategrey;
			border-radius: 5px;
			border-radius: 5px;
//			color: rgba(7, 99, 53, 1);
//			color: rgba(7, 99, 53, 1);
//			color: ivory;
//			color: ivory;
			color: darkSlategrey;
			color: darkSlategrey;
			cursor: pointer;
			cursor: pointer;
			line-height: 40px;
			line-height: 40px;
			font-size: 10px;
			font-size: 10px;
			outline: none;
			outline: none;
			padding: 0 20px;
			padding: 0 20px;
			transition: all .3s;
			transition: all .3s;
                	}
                	}
	        button:hover {
	        button:hover {
//	              background: rgba(7, 99, 53, 1);
//	              background: rgba(7, 99, 53, 1);
  	              background: darkgreyslate;
  	              background: darkgreyslate;
//  	              background: yellow;
//  	              background: yellow;
//  	              background: white;
//  	              background: white;
//  	              color: rgba(255,255,255,1);
//  	              color: rgba(255,255,255,1);
//  	              color: white;
//  	              color: white;
  	              color: ivory;
  	              color: ivory;
  	              }
  	              }
		p {font-size: 10px; font-weight: bold;
		p {font-size: 10px; font-weight: bold;
		<style id="style_input" >
		<style id="style_input" >




	<style id="style_drop" type="text/css">
	<style id="style_drop" type="text/css">
		#drop {
		#drop {
			width:800px;
			width:800px;
			height:250px;
			height:250px;
			margin:3px auto;
			margin:3px auto;
//			background:#eddaa8;
//			background:#eddaa8;
			background:ivory;
			background:ivory;
			font-size:16px;
			font-size:16px;
			}
			}
		#drop #sw { text-decoration:underline; cursor:pointer; }
		#drop #sw { text-decoration:underline; cursor:pointer; }
		#drag {
		#drag {
//			width:450px;
//			width:450px;
// 			height:180px;
// 			height:180px;
			width:800;
			width:800;
			height:480px;
			height:480px;
			margin:12px auto;
			margin:12px auto;
			border:1px solid silver;
			border:1px solid silver;
			font-size:16px;
			font-size:16px;
			}
			}
		#drag .drg { margin:10px 12px; }
		#drag .drg { margin:10px 12px; }
		#drag div.drg {
		#drag div.drg {
			width:150px;
			width:150px;
			height:50px;
			height:50px;
			background:#07da08;
			background:#07da08;
			border:2px solid blue;
			border:2px solid blue;
			}
			}
		</style id="style_drop" type="text/css">
		</style id="style_drop" type="text/css">


	<style id="style_div_csv type="text/css">
	<style id="style_div_csv type="text/css">
		body {
		body {
//			font-family: Arial;
//			font-family: Arial;
			font-family: yokkmokkOT;
			font-family: yokkmokkOT;
			font-family: arial;
			font-family: arial;
			font-size: 8pt;
			font-size: 8pt;
			}
			}
		table {
		table {
			border: 1px solid #ccc;
			border: 1px solid #ccc;
			}
			}
		table th {
		table th {
//			background-color: #F7F7F7;
//			background-color: #F7F7F7;
			background-color: darkSlategrey;
			background-color: darkSlategrey;
//			color: #333;
//			color: #333;
			color: ivory;
			color: ivory;
			font-weight: bold;
			font-weight: bold;
			}
			}
		table th, table td {
		table th, table td {
			padding: 5px;
			padding: 5px;
			border-color: #ccc;
			border-color: #ccc;
			}
			}
		</style id="style_div_csv type="text/css">
		</style id="style_div_csv type="text/css">
		
		
	<style id="style_thumb_3800">
	<style id="style_thumb_3800">
		.thumb {
		.thumb {
		height: 75px;
		height: 75px;
		border: 1px solid #000;
		border: 1px solid #000;
		margin: 10px 5px 0 0;
		margin: 10px 5px 0 0;
		}
		}
		</style>
		</style>


	<style id="style_byte_content" >
	<style id="style_byte_content" >
		#byte_content {
		#byte_content {
		margin: 5px 0;
		margin: 5px 0;
		max-height: 100px;
		max-height: 100px;
		overflow-y: auto;
		overflow-y: auto;
		overflow-x: hidden;
		overflow-x: hidden;
		}
		}
		#byte_range { margin-top: 5px; }
		#byte_range { margin-top: 5px; }
		</style>
		</style>


	<script id="load_vues" >
	<script id="load_vues" >
		function load_vues(args) {
		function load_vues(args) {
//			alert( "BUG_1000 load_vues"+args );
//			alert( "BUG_1000 load_vues"+args );
			vues = "";
			vues = "";
			vues += "old|\n";
			vues += "old|\n";
			vues += "ko|\n";
			vues += "ko|\n";
			vues += "new|\n";
			vues += "new|\n";
			vues += "work|\n";
			vues += "work|\n";
			vues += "focus|\n";
			vues += "focus|\n";
			vues += "where|";
			vues += "where|";
			vues += "courtreport|\n";
			vues += "courtreport|\n";
			vues += "jtfdc|\n";
			vues += "jtfdc|\n";
			vues += "jtrdcr|\n";
			vues += "jtrdcr|\n";
			vues += "jtfinc|\n";
			vues += "jtfinc|\n";
			vues += "byrdpuckers|\n";
			vues += "byrdpuckers|\n";


			vues += "kassil|\n";
			vues += "kassil|\n";
			vues += "konet|\n";
			vues += "konet|\n";
			vues += "iperms|\n";
			vues += "iperms|\n";


			vues += "memes|\n";
			vues += "memes|\n";
			vues += "food|\n";
			vues += "food|\n";
			vues += "kids|\n";
			vues += "kids|\n";
			vues += "dogs|\n";
			vues += "dogs|\n";


			vues += "jkwii|\n";
			vues += "jkwii|\n";
			vues += "kou|\n";
			vues += "kou|\n";
			vues += "konabus|\n";
			vues += "konabus|\n";
			vues += "go|\n";
			vues += "go|\n";
			vues += "kt|\n";
			vues += "kt|\n";
			vues += "ka|\n";
			vues += "ka|\n";
			vues += "ko|\n";
			vues += "ko|\n";


			vues += "ko0|\n";
			vues += "ko0|\n";
			vues += "ko1|\n";
			vues += "ko1|\n";
			vues += "ko2|\n";
			vues += "ko2|\n";
			vues += "ka1|\n";
			vues += "ka1|\n";
			vues += "ka2|\n";
			vues += "ka2|\n";


			vues += "ka11|\n";
			vues += "ka11|\n";
			vues += "ka12|\n";
			vues += "ka12|\n";
			vues += "ka21|\n";
			vues += "ka21|\n";
			vues += "ka22|\n";
			vues += "ka22|\n";


			vues += "av|\n";
			vues += "av|\n";
			vues += "bb|\n";
			vues += "bb|\n";
			vues += "dd|\n";
			vues += "dd|\n";
			vues += "pn|\n";
			vues += "pn|\n";
			vues += "sl|\n";
			vues += "sl|\n";
			vues += "tm|\n";
			vues += "tm|\n";
			vues += "tl|\n";
			vues += "tl|\n";
			vues += "vu|\n";
			vues += "vu|\n";
			vues += "yt|\n";
			vues += "yt|\n";
			vues += "zm|\n";
			vues += "zm|\n";


			vues += "old|\n";
			vues += "old|\n";


//			alert( "BUG_1100 end load_vues vues="+vues );
//			alert( "BUG_1100 end load_vues vues="+vues );
			return( vues );
			return( vues );
			}
			}
		</script>
		</script>


	<script id="script_show_vues">
	<script id="script_show_vues">
		function show_vues(args) {
		function show_vues(args) {
			alert( "BUGS_1060 BEG show_vues args="+args );
			alert( "BUGS_1060 BEG show_vues args="+args );


			vues = load_vues('').split("|");
			vues = load_vues('').split("|");
			vuelen = vues.length;
			vuelen = vues.length;
			alert( "BUGS_1070 show_vues AAA htmout="+vuelen );
			alert( "BUGS_1070 show_vues AAA htmout="+vuelen );


			htmout="";
			htmout="";
			htmout_script_vues="";
			htmout_script_vues="";
			htmout_button_vues="";
			htmout_button_vues="";
			htmout_div_vues="";
			htmout_div_vues="";
			htmout="";
			htmout="";
			htmout="";
			htmout="";


			z=0;
			z=0;
			
			
			for( z=0; z<vuelen; z++ ) {
			for( z=0; z<vuelen; z++ ) {
				vue = vues[z];
				vue = vues[z];
				url = '/?vuid="'+vue+'"';
				url = '/?vuid="'+vue+'"';
				tn = "/imgs/gif/ringd.gif"; img = "/imgs/gif/ringb.gif";
				tn = "/imgs/gif/ringd.gif"; img = "/imgs/gif/ringb.gif";
				tn = "/imgs/gif/ringsd.gif"; img = "/imgs/gif/ringsb.png";
				tn = "/imgs/gif/ringsd.gif"; img = "/imgs/gif/ringsb.png";


				background="yellow";
				background="yellow";
				color="black";
				color="black";
				font="yokkmokkOT";
				font="yokkmokkOT";
				fontsize="12pt";
				fontsize="12pt";
				width="35%";
				width="35%";


				alert( "BUGS_1090 show_vues z="+z+" vue="+vue );
				alert( "BUGS_1090 show_vues z="+z+" vue="+vue );


				htmout += "<hr color=yellow";
				htmout += "<hr color=yellow";
				htmout += "<hr color=red";
				htmout += "<hr color=red";
				htmout += '<img src="/imgs/gif/rings.gif" >\n';
				htmout += '<img src="/imgs/gif/rings.gif" >\n';
				htmout += '<a href="'+url+'" alt="'+vue+'" class="popover" id="drg" target=_blank>';
				htmout += '<a href="'+url+'" alt="'+vue+'" class="popover" id="drg" target=_blank>';
				htmout += '     <img class="drg" src="'+tn+'" border=0>';
				htmout += '     <img class="drg" src="'+tn+'" border=0>';
				htmout += '     <span><img class="drg" src="'+img+'" border=0></span>';
				htmout += '     <span><img class="drg" src="'+img+'" border=0></span>';
				htmout += '     </a>';
				htmout += '     </a>';
				htmout += "<hr color=yellow";
				htmout += "<hr color=yellow";
				htmout += "<hr color=red";
				htmout += "<hr color=red";


//				htmout_script_vues += '<script id="'+z+'" >';
//				htmout_script_vues += '<script id="'+z+'" >';
				htmout_script_vues += '<script id="vue_kov_'+vue+'" >';
				htmout_script_vues += '<script id="vue_kov_'+vue+'" >';
				htmout_script_vues += '	var kov = new Vue({ el: "#kov'+kovid+'",';
				htmout_script_vues += '	var kov = new Vue({ el: "#kov'+kovid+'",';
				htmout_script_vues += 'data: {collapsed: false},';
				htmout_script_vues += 'data: {collapsed: false},';


				htmout_script_vues += 'methods: {\n';
				htmout_script_vues += 'methods: {\n';
				htmout_script_vues += '	showhide_kov: function() {\n';
				htmout_script_vues += '	showhide_kov: function() {\n';
				htmout_script_vues += '		if (!this.collapsed) this.collapsed = true;\n';
				htmout_script_vues += '		if (!this.collapsed) this.collapsed = true;\n';
				htmout_script_vues += '		else this.collapsed = false;\n';
				htmout_script_vues += '		else this.collapsed = false;\n';
				htmout_script_vues += '		},\n';
				htmout_script_vues += '		},\n';
				htmout_script_vues += 'document.body.style.background = "'+background+'"';
				htmout_script_vues += 'document.body.style.background = "'+background+'"';


				htmout_script_vues += 'document.body.style.color = "'+color+'"';
				htmout_script_vues += 'document.body.style.color = "'+color+'"';
				htmout_script_vues += 'document.body.style.fontfamily = "'+font+'"';
				htmout_script_vues += 'document.body.style.fontfamily = "'+font+'"';
				htmout_script_vues += 'document.body.style.fontsize = "'+fontsize+'"';
				htmout_script_vues += 'document.body.style.fontsize = "'+fontsize+'"';
				htmout_script_vues += '	},\n';
				htmout_script_vues += '	},\n';
				htmout_script_vues += '	</script" >';
				htmout_script_vues += '	</script" >';


				htmout_style_vues = '<style id="style_kov_'+vue+'\n';
				htmout_style_vues = '<style id="style_kov_'+vue+'\n';
				htmout_style_vues += '	.detail_'+vue+' {          \n';
				htmout_style_vues += '	.detail_'+vue+' {          \n';
				htmout_style_vues += '	background: '+background+';\n';
				htmout_style_vues += '	background: '+background+';\n';
				htmout_style_vues += '	width: '+width+';\n';
				htmout_style_vues += '	width: '+width+';\n';
				htmout_style_vues += '	padding: 20px;\n';
				htmout_style_vues += '	padding: 20px;\n';
				htmout_style_vues += '	border: 1px solid black;\n';
				htmout_style_vues += '	border: 1px solid black;\n';
				htmout_style_vues += '	font-family: '+font+';\n';
				htmout_style_vues += '	font-family: '+font+';\n';
				htmout_style_vues += '	color: '+color+';\n';
				htmout_style_vues += '	color: '+color+';\n';
				htmout_style_vues += '	}\n';
				htmout_style_vues += '	}\n';
				htmout_style_vues += '	</style>\n';
				htmout_style_vues += '	</style>\n';


//				alert( "BUGS_1092 show_vues VUEHTM vuelen="+vuelen+" htmout_style_vues=\n"+htmout_style_vues );
//				alert( "BUGS_1092 show_vues VUEHTM vuelen="+vuelen+" htmout_style_vues=\n"+htmout_style_vues );
				alert( "BUGS_1733 show_vues VUEHTM vuelen="+vuelen+" htmout_script_vues=\n"+htmout_script_vues );
				alert( "BUGS_1733 show_vues VUEHTM vuelen="+vuelen+" htmout_script_vues=\n"+htmout_script_vues );
			}
			}




//			alert( "BUGS_1091 show_vues VUEHTM vuelen="+vuelen+" htmout="+htmout );
//			alert( "BUGS_1091 show_vues VUEHTM vuelen="+vuelen+" htmout="+htmout );
//			alert( "BUGS_1091 show_vues VUEHTM vuelen="+vuelen+" htmout_script_vues="+htmout_script_vues );
//			alert( "BUGS_1091 show_vues VUEHTM vuelen="+vuelen+" htmout_script_vues="+htmout_script_vues );


			div_style_vues = document.getElementById('div_style_vues');
			div_style_vues = document.getElementById('div_style_vues');
			div_style_vues.insertAdjacentHTML('afterbegin', htmout_style_vues );
			div_style_vues.insertAdjacentHTML('afterbegin', htmout_style_vues );


			div_script_vues = document.getElementById('div_script_vues');
			div_script_vues = document.getElementById('div_script_vues');
			div_script_vues.insertAdjacentHTML('afterbegin', htmout_script_vues );
			div_script_vues.insertAdjacentHTML('afterbegin', htmout_script_vues );




			div_show_vues = document.getElementById('div_show_vues');
			div_show_vues = document.getElementById('div_show_vues');
			div_show_vues.insertAdjacentHTML('afterbegin', htmout);
			div_show_vues.insertAdjacentHTML('afterbegin', htmout);




//			div_show_vues.insertAdjacentHTML('beforebegin', htmout);
//			div_show_vues.insertAdjacentHTML('beforebegin', htmout);


//			div_show_vues = getelementbyID('div_show_vues");
//			div_show_vues = getelementbyID('div_show_vues");
//			div_show_vues.innerHTML = htmout;
//			div_show_vues.innerHTML = htmout;


//			alert("BUGS_2892 vuelen=" + vues.length + "\nStatus: " + status);
//			alert("BUGS_2892 vuelen=" + vues.length + "\nStatus: " + status);
//			document.write( htmout );
//			document.write( htmout );


//			alert( "BUGS_1100 END show_vues htmout="+htmout );
//			alert( "BUGS_1100 END show_vues htmout="+htmout );
			return(htmout);
			return(htmout);
			}
			}
		</script id="script_show_vues">
		</script id="script_show_vues">




	<div id="div_style_vues"></div>
	<div id="div_style_vues"></div>


	<div id="div_script_vues"></div>
	<div id="div_script_vues"></div>


	<script id="script_kovs_hideshow">
	<script id="script_kovs_hideshow">


		function kovs_hideshow( todo, kovs ) {
		function kovs_hideshow( todo, kovs ) {
			kovlist = "";
			kovlist = "";
			kovlist += "ko|go|kt|old|new|";
			kovlist += "ko|go|kt|old|new|";
			kovlist += "kassil|konet|iperms|konabus|courtreport|";
			kovlist += "kassil|konet|iperms|konabus|courtreport|";
			kovlist += "jkwii|byrdpucker|kou|jtfdc|jtfinc|";
			kovlist += "jkwii|byrdpucker|kou|jtfdc|jtfinc|";
			kovlist += "where|work|memes|focus|food|";
			kovlist += "where|work|memes|focus|food|";
			kovlist += "dogs|kids|preserve|protect";
			kovlist += "dogs|kids|preserve|protect";
			kovs = kovlist.split('|');
			kovs = kovlist.split('|');
			kovs_len = kovs.length;
			kovs_len = kovs.length;
//			alert( "BUS_1340 kovs_hideshow todo="+todo+" kovlist="+kovlist+" kovs_len="+kovs_len );
//			alert( "BUS_1340 kovs_hideshow todo="+todo+" kovlist="+kovlist+" kovs_len="+kovs_len );
			htmout = "";
			htmout = "";
			z=0;
			z=0;
			for( z=0; z<kovs_len; z++ ) {
			for( z=0; z<kovs_len; z++ ) {
				kov=kovs[z];
				kov=kovs[z];
				kovid="kov_"+kov;
				kovid="kov_"+kov;
				if( todo == "hide" ) {
				if( todo == "hide" ) {
					document.getElementById(kovid).style.visibility = "hidden";
					document.getElementById(kovid).style.visibility = "hidden";
					}
					}
				if( todo == "show" ) {
				if( todo == "show" ) {
					document.getElementById(kovid).style.visibility = "visible";
					document.getElementById(kovid).style.visibility = "visible";
					}
					}
				htmout += "z="+z+" todo="+todo+ " kovid="+kovid+"<br>\n";
				htmout += "z="+z+" todo="+todo+ " kovid="+kovid+"<br>\n";
//				alert( "BUS_1350 kovs_hideshow todo="+todo+" z="+z+" kovid="+kovid );
//				alert( "BUS_1350 kovs_hideshow todo="+todo+" z="+z+" kovid="+kovid );
				}
				}
			alert( "BUGS_1371 htmout="+htmout );			
			alert( "BUGS_1371 htmout="+htmout );			
//			alert( "BUS_1370 kovs_hideshow todo="+todo+" kovs="+kovs );
//			alert( "BUS_1370 kovs_hideshow todo="+todo+" kovs="+kovs );
			}
			}
		</script>
		</script>


	<script id="script_vues_hideshow">
	<script id="script_vues_hideshow">
		function vues_hideshow(hideshow,kovs) {
		function vues_hideshow(hideshow,kovs) {
			alert( "BUGS_1220 vues_hideshow kovs="+kovs );
			alert( "BUGS_1220 vues_hideshow kovs="+kovs );
			kovs  = "";
			kovs  = "";
			kovs += "ko new focus work where memes ";
			kovs += "ko new focus work where memes ";
			kovs += "jtfdc jtfdcr jtfinc byrdpucker courtreport ";
			kovs += "jtfdc jtfdcr jtfinc byrdpucker courtreport ";
			kovs += "jkwii kou kids dogs ";
			kovs += "jkwii kou kids dogs ";
			kovs += "kassil konet iperms konabus  ko go kt old";	
			kovs += "kassil konet iperms konabus  ko go kt old";	
			alert( "BUGS_1221 vues_hideshow kovs="+kovs );
			alert( "BUGS_1221 vues_hideshow kovs="+kovs );
			z=0;
			z=0;
			for( kov in kovs.split(" ") ) {
			for( kov in kovs.split(" ") ) {
				z=z+1;
				z=z+1;
				alert( "BUGS vues_hideshow z="+z+" kov="+kov );
				alert( "BUGS vues_hideshow z="+z+" kov="+kov );
				}
				}
			}
			}
		function vues_hideshow1(hideshow,divid) {
		function vues_hideshow1(hideshow,divid) {
			alert( "BUGS_1230 vues_hideshow args="+args );
			alert( "BUGS_1230 vues_hideshow args="+args );
			htmout_vues_all="";
			htmout_vues_all="";
			if( hideshow == 'hide' ) {	
			if( hideshow == 'hide' ) {	
				if( divid == "" ) or ( divid == "all" ) {
				if( divid == "" ) or ( divid == "all" ) {
					alert( "MGS_1261 vues_showhide HIDE" );
					alert( "MGS_1261 vues_showhide HIDE" );
					document.getElementById("btn_vues_hide").style.visibility = "hidden";
					document.getElementById("btn_vues_hide").style.visibility = "hidden";
					document.getElementById("btn_vues_show").style.visibility = "visible";
					document.getElementById("btn_vues_show").style.visibility = "visible";


					document.getElementById("kov_ko").style.visibility = "hidden";
					document.getElementById("kov_ko").style.visibility = "hidden";
					document.getElementById("kov_new").style.visibility = "hidden";
					document.getElementById("kov_new").style.visibility = "hidden";
					document.getElementById("kov_focus").style.visibility = "hidden";
					document.getElementById("kov_focus").style.visibility = "hidden";
					document.getElementById("kov_food").style.visibility = "hidden";
					document.getElementById("kov_food").style.visibility = "hidden";
					document.getElementById("kov_courtreport").style.visibility = "hidden";
					document.getElementById("kov_courtreport").style.visibility = "hidden";
					document.getElementById("kov_where").style.visibility = "hidden";
					document.getElementById("kov_where").style.visibility = "hidden";
					document.getElementById("kov_work").style.visibility = "hidden";
					document.getElementById("kov_work").style.visibility = "hidden";
					document.getElementById("kov_memes").style.visibility = "hidden";
					document.getElementById("kov_memes").style.visibility = "hidden";
					document.getElementById("kov_kids").style.visibility = "hidden";
					document.getElementById("kov_kids").style.visibility = "hidden";
					document.getElementById("kov_dogs").style.visibility = "hidden";
					document.getElementById("kov_dogs").style.visibility = "hidden";
					document.getElementById("kov_preserve").style.visibility = "hidden";
					document.getElementById("kov_preserve").style.visibility = "hidden";
					document.getElementById("kov_protect").style.visibility = "hidden";
					document.getElementById("kov_protect").style.visibility = "hidden";
					document.getElementById("kov_jtfdc").style.visibility = "hidden";
					document.getElementById("kov_jtfdc").style.visibility = "hidden";
					document.getElementById("kov_jtfinc").style.visibility = "hidden";
					document.getElementById("kov_jtfinc").style.visibility = "hidden";
					document.getElementById("kov_byrdpucker").style.visibility = "hidden";
					document.getElementById("kov_byrdpucker").style.visibility = "hidden";
					document.getElementById("kov_jkwii").style.visibility = "hidden";
					document.getElementById("kov_jkwii").style.visibility = "hidden";
					document.getElementById("kov_kou").style.visibility = "hidden";
					document.getElementById("kov_kou").style.visibility = "hidden";
					document.getElementById("kov_kassil").style.visibility = "hidden";
					document.getElementById("kov_kassil").style.visibility = "hidden";
					document.getElementById("kov_konet").style.visibility = "hidden";
					document.getElementById("kov_konet").style.visibility = "hidden";
					document.getElementById("kov_iperms").style.visibility = "hidden";
					document.getElementById("kov_iperms").style.visibility = "hidden";
					document.getElementById("kov_konabus").style.visibility = "hidden";
					document.getElementById("kov_konabus").style.visibility = "hidden";
					document.getElementById("kov_kt").style.visibility = "hidden";
					document.getElementById("kov_kt").style.visibility = "hidden";
					document.getElementById("kov_go").style.visibility = "hidden";
					document.getElementById("kov_go").style.visibility = "hidden";
					document.getElementById("kov_old").style.visibility = "hidden";
					document.getElementById("kov_old").style.visibility = "hidden";
					}
					}
				else {
				else {
					document.getElementById(divid).style.visibility = "hiddtn";
					document.getElementById(divid).style.visibility = "hiddtn";
					}
					}


//				var div_vues_all = document.getElementById('div_vues_all');
//				var div_vues_all = document.getElementById('div_vues_all');
//				htmout_vues= div_vues_all.innerHTML;
//				htmout_vues= div_vues_all.innerHTML;
//				div_vues_all.innerHTML = '<div id="div_vues_all" hidden><h1>div_vues_all_hidden</h1>\n';
//				div_vues_all.innerHTML = '<div id="div_vues_all" hidden><h1>div_vues_all_hidden</h1>\n';
//				htmout_vues = document.getElementById('div_vues_all').innerHTML;
//				htmout_vues = document.getElementById('div_vues_all').innerHTML;
				alert( "BUGS_1291 vues_hideshow HIDE=");
				alert( "BUGS_1291 vues_hideshow HIDE=");
//				div_vues.innerHTML = '<h1>div_vues</h1><div id="div_vues" hidden>\n";
//				div_vues.innerHTML = '<h1>div_vues</h1><div id="div_vues" hidden>\n";
				}
				}
			if( args == 'show' ) {	
			if( args == 'show' ) {	
				if( divid == "" ) or ( divid == "all" ) {
				if( divid == "" ) or ( divid == "all" ) {
					alert( "MGS_1262 vues_showhide HIDE" );
					alert( "MGS_1262 vues_showhide HIDE" );
					document.getElementById("btn_vues_hide").style.visibility = "visible";
					document.getElementById("btn_vues_hide").style.visibility = "visible";
					document.getElementById("btn_vues_show").style.visibility = "hidden";
					document.getElementById("btn_vues_show").style.visibility = "hidden";






					document.getElementById("kov_ko").style.visibility = "visible";
					document.getElementById("kov_ko").style.visibility = "visible";
					document.getElementById("kov_new").style.visibility = "visible";
					document.getElementById("kov_new").style.visibility = "visible";
					document.getElementById("kov_focus").style.visibility = "visible";
					document.getElementById("kov_focus").style.visibility = "visible";
					document.getElementById("kov_food").style.visibility = "visible";
					document.getElementById("kov_food").style.visibility = "visible";
					document.getElementById("kov_courtreport").style.visibility = "visible";
					document.getElementById("kov_courtreport").style.visibility = "visible";
					document.getElementById("kov_where").style.visibility = "visible";
					document.getElementById("kov_where").style.visibility = "visible";
					document.getElementById("kov_work").style.visibility = "visible";
					document.getElementById("kov_work").style.visibility = "visible";
					document.getElementById("kov_memes").style.visibility = "visible";
					document.getElementById("kov_memes").style.visibility = "visible";
					document.getElementById("kov_kids").style.visibility = "visible";
					document.getElementById("kov_kids").style.visibility = "visible";
					document.getElementById("kov_dogs").style.visibility = "visible";
					document.getElementById("kov_dogs").style.visibility = "visible";
					document.getElementById("kov_preserve").style.visibility = "visible";
					document.getElementById("kov_preserve").style.visibility = "visible";
					document.getElementById("kov_protect").style.visibility = "visible";
					document.getElementById("kov_protect").style.visibility = "visible";
					document.getElementById("kov_jtfdc").style.visibility = "visible";
					document.getElementById("kov_jtfdc").style.visibility = "visible";
					document.getElementById("kov_jtfinc").style.visibility = "visible";
					document.getElementById("kov_jtfinc").style.visibility = "visible";
					document.getElementById("kov_byrdpucker").style.visibility = "visible";
					document.getElementById("kov_byrdpucker").style.visibility = "visible";
					document.getElementById("kov_jkwii").style.visibility = "visible";
					document.getElementById("kov_jkwii").style.visibility = "visible";
					document.getElementById("kov_kou").style.visibility = "visible";
					document.getElementById("kov_kou").style.visibility = "visible";
					document.getElementById("kov_kassil").style.visibility = "visible";
					document.getElementById("kov_kassil").style.visibility = "visible";
					document.getElementById("kov_konet").style.visibility = "visible";
					document.getElementById("kov_konet").style.visibility = "visible";
					document.getElementById("kov_iperms").style.visibility = "visible";
					document.getElementById("kov_iperms").style.visibility = "visible";
					document.getElementById("kov_konabus").style.visibility = "visible";
					document.getElementById("kov_konabus").style.visibility = "visible";
					document.getElementById("kov_kt").style.visibility = "visible";
					document.getElementById("kov_kt").style.visibility = "visible";
					document.getElementById("kov_go").style.visibility = "visible";
					document.getElementById("kov_go").style.visibility = "visible";
					document.getElementById("kov_old").style.visibility = "visible";
					document.getElementById("kov_old").style.visibility = "visible";
					}
					}
				else {
				else {
					document.getElementById(divid).style.visibility = "visible";
					document.getElementById(divid).style.visibility = "visible";
					}
					}
				alert( "BUGS_1292 vues_hideshow SHOW htmout_vues=");
				alert( "BUGS_1292 vues_hideshow SHOW htmout_vues=");
				}
				}
			}
			}
		</script id="script_vues_hideshow">
		</script id="script_vues_hideshow">


	<script id="script_kb" >function script_kb(args) { 
	<script id="script_kb" >function script_kb(args) { 
		alert( "script_kb args="+args );
		alert( "script_kb args="+args );
		}
		}
	<script id="script_kw" >function script_kw(args) { 
	<script id="script_kw" >function script_kw(args) { 
		alert( "script_kw args="+args );
		alert( "script_kw args="+args );
		}
		}
	<script id="script_koeyeb_w" >function script_koeyeb_w(args) { 
	<script id="script_koeyeb_w" >function script_koeyeb_w(args) { 
		alert( "script_koeyeb_w args="+args );
		alert( "script_koeyeb_w args="+args );
		}
		}
	<script id="script_koeyew_b" >function script_koeyew_b(args) { 
	<script id="script_koeyew_b" >function script_koeyew_b(args) { 
		alert( "script_koeyew_b args="+args );
		alert( "script_koeyew_b args="+args );
		}
		}
	<script id="script_koeye_b" >function script_koeye_b(args) { 
	<script id="script_koeye_b" >function script_koeye_b(args) { 
		alert( "script_koeye_b args="+args );
		alert( "script_koeye_b args="+args );
		}
		}
	<script id="script_koeye_w" >function script_koeye_w(args) { 
	<script id="script_koeye_w" >function script_koeye_w(args) { 
		alert( "script_koeye_w args="+args );
		alert( "script_koeye_w args="+args );
		}
		}
	<script id="script_bubble" >function script_bubble(args) { 
	<script id="script_bubble" >function script_bubble(args) { 
		alert( "script_bubble args="+args );
		alert( "script_bubble args="+args );
		}
		}


	<script id="script_shutdown" >
	<script id="script_shutdown" >
		function script_shutdown( msg ) {
		function script_shutdown( msg ) {
			alert( "BUGS_6100 script_shutdown msg="+msg );
			alert( "BUGS_6100 script_shutdown msg="+msg );
			}
			}
		</script id="script_shutdown" >
		</script id="script_shutdown" >






	</head>
	</head>






<!-- <body onload="init_pano('canvas');  kogrids();"> -->
<!-- <body onload="init_pano('canvas');  kogrids();"> -->




<body onload="startup();">
<body onload="startup();">


<br><br><br><br>
<br><br><br><br>
<br><br><br><br>
<br><br><br><br>


	<div id="div_kogrids_w"></div>
	<div id="div_kogrids_w"></div>




<br><br><br><br><br>
<br><br><br><br><br>
<hr color=yellow>
<hr color=yellow>
	<button type="btn_kovs_hideshow" id="kovs_hideshow" onclick="kovs_hideshow()">kovs_hideshow</button>
	<button type="btn_kovs_hideshow" id="kovs_hideshow" onclick="kovs_hideshow()">kovs_hideshow</button>
	<a href=# onclick="kovs_hideshow("hide","all"); return false;" class="popover">
	<a href=# onclick="kovs_hideshow("hide","all"); return false;" class="popover">
		<img height=200 src=/imgs/gif/ringb.gif onclick="kovs_hideshow('hide','all')">
		<img height=200 src=/imgs/gif/ringb.gif onclick="kovs_hideshow('hide','all')">
		<span><img  height=200 src=/imgs/gif/ringp.gif onclick="kovs_hideshow('hide','all')"></span>
		<span><img  height=200 src=/imgs/gif/ringp.gif onclick="kovs_hideshow('hide','all')"></span>
		<a>
		<a>


<!--	<img src=/imgs/gif/rings.gif onclick="kovs_hideshow('show','all')"> -->
<!--	<img src=/imgs/gif/rings.gif onclick="kovs_hideshow('show','all')"> -->


	<a href=# onclick="kovs_hideshow("show","all"); return false;" class="popover">
	<a href=# onclick="kovs_hideshow("show","all"); return false;" class="popover">
		<img height=200 src=/imgs/gif/ringd.gif onclick="kovs_hideshow('show','all')">
		<img height=200 src=/imgs/gif/ringd.gif onclick="kovs_hideshow('show','all')">
		<span><img  height=200 src=/imgs/gif/ringq.gif onclick="kovs_hideshow('show','all')"></span>
		<span><img  height=200 src=/imgs/gif/ringq.gif onclick="kovs_hideshow('show','all')"></span>
		<a>
		<a>


	<script id="script_bugs" >
	<script id="script_bugs" >
		function bugs(h,d) {
		function bugs(h,d) {
			alert( "BUGS " );
			alert( "BUGS " );
			}
			}
		</script>
		</script>


	<button type="btn_kovs_hide" id="btn_kovs_hide" onclick="kovs_hideshow('hide','all')>
	<button type="btn_kovs_hide" id="btn_kovs_hide" onclick="kovs_hideshow('hide','all')>
		-= kovs_hide_all =-
		-= kovs_hide_all =-
		</button>
		</button>
	<button type="btn_kovs_show" id="btn_kovs_show" onclick="kovs_hideshow('show','all')>
	<button type="btn_kovs_show" id="btn_kovs_show" onclick="kovs_hideshow('show','all')>
		-= kovs_show_all =-
		-= kovs_show_all =-
		</button>
		</button>


<hr color=yellow>
<hr color=yellow>
<br><br><br><br><br>
<br><br><br><br><br>
<br><br><br><br><br>
<br><br><br><br><br>
<br><br><br><br><br>
<br><br><br><br><br>
<br><br><br><br><br>
<br><br><br><br><br>


	<button type="show_vues" id="show_vues" onclick="show_vues('')">show_vues</button>
	<button type="show_vues" id="show_vues" onclick="show_vues('')">show_vues</button>
<!--
<!--
	<a href=# class=popover id="drag" >
	<a href=# class=popover id="drag" >
		<img height=400 width=600 src="/imgs/gif/ringsb.gif" onclick="show_vues('')" >
		<img height=400 width=600 src="/imgs/gif/ringsb.gif" onclick="show_vues('')" >
		<span><img height=400 width=600 src="/imgs/gif/ringsq.gif" onclick="show_vues('')" ></span>
		<span><img height=400 width=600 src="/imgs/gif/ringsq.gif" onclick="show_vues('')" ></span>
		</a>
		</a>
	-->
	-->


<button type="show_vues" id="show_vues" onclick="show_vues('')">show_vuew</button>
<button type="show_vues" id="show_vues" onclick="show_vues('')">show_vuew</button>
	<div id="div_show_vues" ><h1>div_show_vues_w</h1></div>
	<div id="div_show_vues" ><h1>div_show_vues_w</h1></div>




<button type="kov_links_main" id="kov_links_main" onclick="kov_links()">kov_links_main</button>
<button type="kov_links_main" id="kov_links_main" onclick="kov_links()">kov_links_main</button>
<!-- <button type="clear_div_kov" id="clear_div_kov" onclick="clear_div_kov()">clear_div_kov</button> -->
<!-- <button type="clear_div_kov" id="clear_div_kov" onclick="clear_div_kov()">clear_div_kov</button> -->
<!-- <button type="load_kov_links" id="load_kov_links" onclick="load_kov_links()">load_kov_links</button> -->
<!-- <button type="load_kov_links" id="load_kov_links" onclick="load_kov_links()">load_kov_links</button> -->
<!-- <button type="show_kov_links" id="show_kov_links" onclick="show_kov_links()">show_kov_links</button> -->
<!-- <button type="show_kov_links" id="show_kov_links" onclick="show_kov_links()">show_kov_links</button> -->




	<div id="div_kov_links"></div>
	<div id="div_kov_links"></div>


	<div id="v_hoverdate">
	<div id="v_hoverdate">
		<span v-bind:title="message"><font style="font-family: times, serif; font-size:24pt; font-style:italic" >hoverdttm</font></span>
		<span v-bind:title="message"><font style="font-family: times, serif; font-size:24pt; font-style:italic" >hoverdttm</font></span>
		<span v-bind:title="message"><font style="font-family: yokkmokkOT, serif; font-size:24pt; font-style:italic" >hoverdttm</font></span>
		<span v-bind:title="message"><font style="font-family: yokkmokkOT, serif; font-size:24pt; font-style:italic" >hoverdttm</font></span>
		</div>
		</div>
	<script id="script_hoverdate" >
	<script id="script_hoverdate" >
		kotxt = "";
		kotxt = "";
		kotxt += "-== kako =- preview embed vu emchat -= 20190218_0800 =-";
		kotxt += "-== kako =- preview embed vu emchat -= 20190218_0800 =-";
//		kotxt += new Date().toLocaleString();
//		kotxt += new Date().toLocaleString();
//				message: 'hoverdate ' + kotxt;
//				message: 'hoverdate ' + kotxt;
		var app2 = new Vue({el: '#v_hoverdate',
		var app2 = new Vue({el: '#v_hoverdate',
			data: {
			data: {
				message: 'hover_dttm ' + new Date().toLocaleString() + kotxt
				message: 'hover_dttm ' + new Date().toLocaleString() + kotxt
				}
				}
			})
			})
		</script id="script_hoverdate" >
		</script id="script_hoverdate" >




	<dic id="div_vues" ><h1>div_vues</h1></div>
	<dic id="div_vues" ><h1>div_vues</h1></div>
<!--	<button type="button" onclick="script_ajax()">loadlist</button> -->
<!--	<button type="button" onclick="script_ajax()">loadlist</button> -->




	<hr color=yellow>
	<hr color=yellow>
	<div id="dynDataField"></div>
	<div id="dynDataField"></div>
	<hr color=yellow>
	<hr color=yellow>


	<h1 id="ajaxdb3">ajaxdb3.</h1>
	<h1 id="ajaxdb3">ajaxdb3.</h1>
	<button type="button" onclick="script_ajaxdb3()">ajaxdb3</button>
	<button type="button" onclick="script_ajaxdb3()">ajaxdb3</button>


	<script id="script_ajaxdb3">
	<script id="script_ajaxdb3">
		db3=indexx.db3;
		db3=indexx.db3;
		sql="select * from list limit 5";
		sql="select * from list limit 5";
		function script_ajaxdb3(db3,sql) {
		function script_ajaxdb3(db3,sql) {
			$("button").click(function(){
			$("button").click(function(){
				$.post("indexx.php", {
				$.post("indexx.php", {
					db3: db3,
					db3: db3,
					sql: "select * from list limit 10"
					sql: "select * from list limit 10"
					},
					},
				function(data, status){
				function(data, status){
					lines = data.split("\n");
					lines = data.split("\n");
					linelen=lines.length;
					linelen=lines.length;
					htmout="";
					htmout="";
					alert( "BUGS1240 linelen="+linelen );
					alert( "BUGS1240 linelen="+linelen );
					for( z=0; z<lines.length; z++ ) {
					for( z=0; z<lines.length; z++ ) {
						line=lines[z];
						line=lines[z];
						if( line.length < 3 ) continue;
						if( line.length < 3 ) continue;
						z=z+1;	
						z=z+1;	
						flds = line.split(" ");
						flds = line.split(" ");
						img = flds[8];
						img = flds[8];
						dd = flds[7];
						dd = flds[7];
						mth = flds[5];
						mth = flds[5];
						yyyy = flds[6];
						yyyy = flds[6];
						size = flds[4];
						size = flds[4];
//						htmout += line+"\n";
//						htmout += line+"\n";
						htmout += "img="+img+" dd="+dd+" "+yyyy+" "+mth+"\n";
						htmout += "img="+img+" dd="+dd+" "+yyyy+" "+mth+"\n";
//						alert( "BUGS_1250 ajaxdb3 z="+z+" line="+line );
//						alert( "BUGS_1250 ajaxdb3 z="+z+" line="+line );
						}
						}
					alert( "BUGS_1400 ajaxdb3 z="+z+" htmout="+htmout );
					alert( "BUGS_1400 ajaxdb3 z="+z+" htmout="+htmout );
					for( z=0; z<lines.length; z++ ) {
					for( z=0; z<lines.length; z++ ) {
						line=lines[z];
						line=lines[z];
						alert( "BUGS_1250 ajaxdb3 z="+z+" line="+line );
						alert( "BUGS_1250 ajaxdb3 z="+z+" line="+line );
						flds = lines.split(" ");
						flds = lines.split(" ");
						fldlen = flds.length;
						fldlen = flds.length;
						alert( "BUGS_1260 ajaxdb3 z="+z+" fldlen="+fldlen );
						alert( "BUGS_1260 ajaxdb3 z="+z+" fldlen="+fldlen );
						psv=parseline(line);
						psv=parseline(line);
						alert( "BUGS_1251 ajaxdb3 psv="+psv );
						alert( "BUGS_1251 ajaxdb3 psv="+psv );
//						(url,img,id,tn,grp,desc) = parseline(line);
//						(url,img,id,tn,grp,desc) = parseline(line);
//						url = line.split(" ")[0];
//						url = line.split(" ")[0];
//						img = line.split(" ")[1];
//						img = line.split(" ")[1];
//						alert( "BUGS_1251 ajaxdb3 url="+url+" img="+img );
//						alert( "BUGS_1251 ajaxdb3 url="+url+" img="+img );
//						id = line.split("|")[2];
//						id = line.split("|")[2];
//						tn = line.split("|")[3];
//						tn = line.split("|")[3];
//						grp = line.split("|")[4];
//						grp = line.split("|")[4];
//						desc = line.split("|")[5];
//						desc = line.split("|")[5];


						htmout += '<div id="drag">\n';
						htmout += '<div id="drag">\n';
						htmout += '<div class="drg" >\n';
						htmout += '<div class="drg" >\n';
						htmout += '<a href="+url+" class="thumbnail" target=_blank>\n';
						htmout += '<a href="+url+" class="thumbnail" target=_blank>\n';
						htmout += '	<img class="drg" src="+img+" border=0>\n';
						htmout += '	<img class="drg" src="+img+" border=0>\n';
						htmout += '	<span><img class="drg" src="+img+" border=0></span>\n';
						htmout += '	<span><img class="drg" src="+img+" border=0></span>\n';
						htmout += '	</a>\n';
						htmout += '	</a>\n';
						htmout += '	</div>\n';
						htmout += '	</div>\n';
						htmout += '	</div>\n';
						htmout += '	</div>\n';
//						alert( "BUGS_1248 ajaxdb3 htmout="+htmout );
//						alert( "BUGS_1248 ajaxdb3 htmout="+htmout );
						}
						}


//					getelementbyID('div_ajaxdb3");
//					getelementbyID('div_ajaxdb3");
//					alert("BUGS_290 linelen=" + line.length + "\nStatus: " + status);
//					alert("BUGS_290 linelen=" + line.length + "\nStatus: " + status);


					div_ajaxdb3 = document.getElementById('div_ajaxdb3');
					div_ajaxdb3 = document.getElementById('div_ajaxdb3');
					div_ajaxdb3.insertAdjacentHTML('afterbegin', htmout);
					div_ajaxdb3.insertAdjacentHTML('afterbegin', htmout);
//					document.write( htmout );
//					document.write( htmout );
					});
					});
				}); 
				}); 
			}
			}
		</script id="script_ajaxdb3">
		</script id="script_ajaxdb3">




	<script id="script_parseline">
	<script id="script_parseline">
		function parseline(line) {
		function parseline(line) {
			alert( "BUGS_1280 line="+line );
			alert( "BUGS_1280 line="+line );
			flds=line.split(" ");
			flds=line.split(" ");


			url="index.html";
			url="index.html";
			img="/imgs/gif/ringsb.gif";
			img="/imgs/gif/ringsb.gif";
			id="jkwii";
			id="jkwii";
			tn="/imgs/btn/ringsd.gif";
			tn="/imgs/btn/ringsd.gif";
			grp="group";
			grp="group";
			desc="timejak jkwii";
			desc="timejak jkwii";
			psv=url+"|"+img+"|"+id+"|"+tn+"|"+grp+"|"+desc
			psv=url+"|"+img+"|"+id+"|"+tn+"|"+grp+"|"+desc


//			return(url,img,id,tn,grp,desc);
//			return(url,img,id,tn,grp,desc);
			return(psv);
			return(psv);
			}
			}
		</script id="script_parseline">
		</script id="script_parseline">


	<hr color=yellow>
	<hr color=yellow>
	<div id="div_ajaxdb3"></div>
	<div id="div_ajaxdb3"></div>
	<hr color=yellow>
	<hr color=yellow>




<!--	<div id="ajax_loadlist">xxx ajax_loadlist xxx</div> -->
<!--	<div id="ajax_loadlist">xxx ajax_loadlist xxx</div> -->
	<hr color=yellow>
	<hr color=yellow>






	<div id="div_vues" >
	<div id="div_vues" >


		<div id="app_jkwii">
		<div id="app_jkwii">
			<div>
			<div>


				<h1 v-on:click="showhide" >= = : : jkwii is me : : = =</h1>
				<h1 v-on:click="showhide" >= = : : jkwii is me : : = =</h1>
				<h2 v-on:click="showhide" >:: -=ko0us=- preview 20190218_0800 us_med_rectin</h2>
				<h2 v-on:click="showhide" >:: -=ko0us=- preview 20190218_0800 us_med_rectin</h2>
				<h2>private tours available on request</h2>
				<h2>private tours available on request</h2>


<a id="drag" class="popover" href="/ani.html" target=_blank>
<a id="drag" class="popover" href="/ani.html" target=_blank>
	<img class="drg" height=450 width=800 src="/imgs/gif/firebubblesb.gif" alt="firebubbles" border=0>
	<img class="drg" height=450 width=800 src="/imgs/gif/firebubblesb.gif" alt="firebubbles" border=0>
	<span><img height=450 width=800 class="drg" src="/imgs/gif/firebubblesq.gif" border=0></span>
	<span><img height=450 width=800 class="drg" src="/imgs/gif/firebubblesq.gif" border=0></span>
	</a>
	</a>


				<iframe frameborder='0' height='200' width=800 marginheight='0' marginwidth='0' scrolling='no' 
				<iframe frameborder='0' height='200' width=800 marginheight='0' marginwidth='0' scrolling='no' 
					src='/ani.html'
					src='/ani.html'
					style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
					style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
					</iframe>
					</iframe>


                                <hr color=blue>
                                <hr color=blue>
                                <hr color=white>
                                <hr color=white>
                                <hr color=red>
                                <hr color=red>


<!--
<!--
		<iframe id="myframe" src="/svc/emchat/index.html" width="600" height="500"
		<iframe id="myframe" src="/svc/emchat/index.html" width="600" height="500"
        		frameborder="0" scrolling="yes"></iframe>
        		frameborder="0" scrolling="yes"></iframe>
	-->
	-->


<!--
<!--
				<img height=50 src="/imgs/btn/kob.png">
				<img height=50 src="/imgs/btn/kob.png">
				<img height=50 src="/imgs/btn/koeyeb.png">
				<img height=50 src="/imgs/btn/koeyeb.png">
				<img height=50 src="/imgs/btn/koeye.png">
				<img height=50 src="/imgs/btn/koeye.png">
				<img height=50 src="/imgs/btn/koeyew.png">
				<img height=50 src="/imgs/btn/koeyew.png">
				<img height=50 src="/imgs/btn/kow.png">
				<img height=50 src="/imgs/btn/kow.png">
	-->
	-->


				<a href=/svc/emchat/index.html class="thumbnail" target=_blank>
				<a href=/svc/emchat/index.html class="thumbnail" target=_blank>
					<img class="drg" height=200 src=/imgs/links/tn/tn_chat.png border=0>
					<img class="drg" height=200 src=/imgs/links/tn/tn_chat.png border=0>
					<span><img  class="drg" height=400 src=/imgs/links/tn/tn_chat.png border=0></span>
					<span><img  class="drg" height=400 src=/imgs/links/tn/tn_chat.png border=0></span>
					</a>
					</a>


				<a href=https://meet.jit.si/ko class="thumbnail" target=_blank>
				<a href=https://meet.jit.si/ko class="thumbnail" target=_blank>
					<img  class="drg" height=200 src=/imgs/links/tn/tn_meet.png border=0>
					<img  class="drg" height=200 src=/imgs/links/tn/tn_meet.png border=0>
					<span><img class="drg"  height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
					<span><img class="drg"  height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
					</a>
					</a>


				<a class="thumbnail" href=/tl/imgs/jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin target=_blank>
				<a class="thumbnail" href=/tl/imgs/jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin target=_blank>
					<img class="drg" height=200 src=/tl/imgs/tn/tn_jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin border=0>
					<img class="drg" height=200 src=/tl/imgs/tn/tn_jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin border=0>
					<span><img class="drg" height=800 src=/tl/imgs/jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin border=0></span>
					<span><img class="drg" height=800 src=/tl/imgs/jtfdc_private_court_since_1979_viewin.png alt=jtfdc_private_court_since_1979_viewin border=0></span>
					</a>
					</a>


				<a href=# v-on:click="showhide" class=thumbnail >
				<a href=# v-on:click="showhide" class=thumbnail >
					<img class="drg" v-on:click="showhide" height=200 src=/tl/imgs/construction_sawhorse.gif border=0>
					<img class="drg" v-on:click="showhide" height=200 src=/tl/imgs/construction_sawhorse.gif border=0>
					<span><img class="drg" v-on:click="showhide" height=400  src=/tl/imgs/construction_sawhorse.gif border=0></span>
					<span><img class="drg" v-on:click="showhide" height=400  src=/tl/imgs/construction_sawhorse.gif border=0></span>
					</a>
					</a>


				<a class="thumbnail" href=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.jpg alt=jtf31_streetswing_sawhorse_n_speedbump=_blank>
				<a class="thumbnail" href=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.jpg alt=jtf31_streetswing_sawhorse_n_speedbump=_blank>
					<img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.png alt=jtf31_streetswing_sawhorse_n_speedbump border=0>
					<img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.png alt=jtf31_streetswing_sawhorse_n_speedbump border=0>
					<span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.png alt=jtf31_streetswing_sawhorse_n_speedbump border=0></span>
					<span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5596_jtf31_streetswing_sawhorse_n_speedbump.png alt=jtf31_streetswing_sawhorse_n_speedbump border=0></span>
					</a>
					</a>


				<a class="thumbnail"  v-on:click="showhide" href=/imgs/jkwii4trustee/jkwii4trustee_jkwii4trustee.png border=0>
				<a class="thumbnail"  v-on:click="showhide" href=/imgs/jkwii4trustee/jkwii4trustee_jkwii4trustee.png border=0>
					<img class="drg"  v-on:click="showhide" height=200 src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0>
					<img class="drg"  v-on:click="showhide" height=200 src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0>
					<span><img  class="drg" v-on:click="showhide" height=400 src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0></span>
					<span><img  class="drg" v-on:click="showhide" height=400 src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0></span>
					</a>
					</a>






			<br><br>
			<br><br>
				<hr color=red>
				<hr color=red>
				<hr color=white>
				<hr color=white>
				<hr color=blue>
				<hr color=blue>
				<h2 v-on:click="showhide" >== jtfdc OPEN BORDER problem ==</h2>
				<h2 v-on:click="showhide" >== jtfdc OPEN BORDER problem ==</h2>
				!! NO wall !! NO sawhorse !! NO tape !! NO chalk !!
				!! NO wall !! NO sawhorse !! NO tape !! NO chalk !!
				<br>
				<br>
				!! NO EAGLES - OUR NO EAGLES !!
				!! NO EAGLES - OUR NO EAGLES !!


				<h1> 
				<h1> 
				<a href=/imgs/links_201901/great_wall_of_china_1870.jpg class="thumbnail_not" target=_blank>
				<a href=/imgs/links_201901/great_wall_of_china_1870.jpg class="thumbnail_not" target=_blank>
					<img src=/imgs/links_201901/tn/tn_great_wall_of_china_1870.png  border=0>
					<img src=/imgs/links_201901/tn/tn_great_wall_of_china_1870.png  border=0>
					</a>
					</a>
				<a href=https://www.youtube.com/watch?v=OfCS1yXg8gk class="thumbnail_not" target=_blank>
				<a href=https://www.youtube.com/watch?v=OfCS1yXg8gk class="thumbnail_not" target=_blank>
					<img src=/imgs/links_201901/tn/tn_youb_across_the_border.png  border=0>
					<img src=/imgs/links_201901/tn/tn_youb_across_the_border.png  border=0>
					</a>
					</a>


				<a href=/imgs/links/Image332.png class="thumbnail_not" target=_blank>
				<a href=/imgs/links/Image332.png class="thumbnail_not" target=_blank>
					<img src=/imgs/links/tn/tn_Image332.png  border=0>
					<img src=/imgs/links/tn/tn_Image332.png  border=0>
<!--					<span><img src=/imgs/links/Image332.png  border=0></span> -- >
<!--					<span><img src=/imgs/links/Image332.png  border=0></span> -- >
					</a>
					</a>






<!--
<!--
				<a href=https://https://www.youtube.com/watch?v=Gj3UdRmhgvM&start_radio=1&list=RDGj3UdRmhgvM class="thumbnail_not" target=_blank>
				<a href=https://https://www.youtube.com/watch?v=Gj3UdRmhgvM&start_radio=1&list=RDGj3UdRmhgvM class="thumbnail_not" target=_blank>
					<img src=/imgs/links_201901/tn/tn_youb_dark_end_ofthe_street.png  border=0>
					<img src=/imgs/links_201901/tn/tn_youb_dark_end_ofthe_street.png  border=0>
					</a>
					</a>
	-->
	-->
<!-- -->
<!-- -->
				<br>
				<br>




				<a href=https://en.wikipedia.org/wiki/Moat class="thumbnail_not" target=_blank>
				<a href=https://en.wikipedia.org/wiki/Moat class="thumbnail_not" target=_blank>
					<img src=/imgs/links_201901/tn/tn_Vellorefort.png border=0>
					<img src=/imgs/links_201901/tn/tn_Vellorefort.png border=0>
					</a>
					</a>


				- ?? moat ?? -
				- ?? moat ?? -
				<a href=https://upload.wikimedia.org/wikipedia/commons/0/00/Qufu_City_Wall_-_south_of_the_west_gate_-_looking_S_-_P1050985.JPG class="thumbnail_not" target=_blank>
				<a href=https://upload.wikimedia.org/wikipedia/commons/0/00/Qufu_City_Wall_-_south_of_the_west_gate_-_looking_S_-_P1050985.JPG class="thumbnail_not" target=_blank>
					<img src=/imgs/links_201901/tn/tn_Qufu_City_Wall_-_south_of_the_west_gate_-_looking_S_-_P1050985.png border=0></span>
					<img src=/imgs/links_201901/tn/tn_Qufu_City_Wall_-_south_of_the_west_gate_-_looking_S_-_P1050985.png border=0></span>
					</a>
					</a>
					</h1>
					</h1>
				<br>
				<br>
				<a href=https://en.wikipedia.org/wiki/American_Gothic class="thumbnail_not" target=_blank>
				<a href=https://en.wikipedia.org/wiki/American_Gothic class="thumbnail_not" target=_blank>
					<img src=/imgs/links_201901/tn/tn_Grant_Wood_-_American_Gothic_-_Google_Art_Project.png border=0>
					<img src=/imgs/links_201901/tn/tn_Grant_Wood_-_American_Gothic_-_Google_Art_Project.png border=0>
					</a>
					</a>


				<hr color=blue>
				<hr color=blue>
				<hr color=white>
				<hr color=white>
				<hr color=red>
				<hr color=red>














				<a class="thumbnail" href=/tl/imgs/jkwii4trustee/IMG_5320_jtfdc_eagle_n.JPG alt=jtfdc_eagle_n target=_blank>
				<a class="thumbnail" href=/tl/imgs/jkwii4trustee/IMG_5320_jtfdc_eagle_n.JPG alt=jtfdc_eagle_n target=_blank>
					<img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5320.png alt=jtfdc_eagle_n border=0>
					<img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5320.png alt=jtfdc_eagle_n border=0>
					<span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5320.png alt=jtfdc_eagle_n border=0></span>
					<span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5320.png alt=jtfdc_eagle_n border=0></span>
					</a>
					</a>


				<a  class="thumbnail" href=/tl/imgs/jkwii4trustee/IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.jpg alt=jtfdc_original_notresspassing_willprosecuted target=_blank>
				<a  class="thumbnail" href=/tl/imgs/jkwii4trustee/IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.jpg alt=jtfdc_original_notresspassing_willprosecuted target=_blank>
					<img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.png alt=jtfdc_original_notresspassing_willprosecuted border=0>
					<img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.png alt=jtfdc_original_notresspassing_willprosecuted border=0>
					<span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.png alt=jtfdc_original_notresspassing_willprosecuted border=0></span>
					<span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.png alt=jtfdc_original_notresspassing_willprosecuted border=0></span>
					</a>
					</a>


				<a class="thumbnail" href=/tl/imgs/jkwii4trustee/IMG_5704_jtfdc_eagle_s.JPG alt=jtfdc_eagle_s target=_blank>
				<a class="thumbnail" href=/tl/imgs/jkwii4trustee/IMG_5704_jtfdc_eagle_s.JPG alt=jtfdc_eagle_s target=_blank>
					<img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5704_jtfdc_eagle_s.png alt=jtf29-30_shared_barn_area border=0>
					<img class="drg" height=200 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5704_jtfdc_eagle_s.png alt=jtf29-30_shared_barn_area border=0>
					<span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5704_jtfdc_eagle_s.png alt=jtf29-30_shared_barn_area border=0></span>
					<span><img class="drg" height=400 src=/tl/imgs/jkwii4trustee/tn/tn_IMG_5704_jtfdc_eagle_s.png alt=jtf29-30_shared_barn_area border=0></span>
					</a>
					</a>


				<a href=# class=thumbnail>
				<a href=# class=thumbnail>
					<img class="drg" v-on:click="showhide" height=200 src="/imgs/unclesam/unclesam_rtaw_adminhewii_ko2us.png" alt="unclesam_rtaw_adminhehe_ko2us" > </span>
					<img class="drg" v-on:click="showhide" height=200 src="/imgs/unclesam/unclesam_rtaw_adminhewii_ko2us.png" alt="unclesam_rtaw_adminhehe_ko2us" > </span>
					<span><img class="drg" v-on:click="showhide" height=400 src="/imgs/unclesam/unclesam_rtaw_adminhewii_ko2us.png" alt="unclesam_rtaw_adminhehe_ko2us" > </span>
					<span><img class="drg" v-on:click="showhide" height=400 src="/imgs/unclesam/unclesam_rtaw_adminhewii_ko2us.png" alt="unclesam_rtaw_adminhehe_ko2us" > </span>
					</a>
					</a>


				<a class="thumbnail" href="mailto:adminihe@ko0.us?subject=adminihe_what?">
				<a class="thumbnail" href="mailto:adminihe@ko0.us?subject=adminihe_what?">
					<img height=50 class="drg" src="/imgs/links/email.gif" alt="adminihe_what" border=0>
					<img height=50 class="drg" src="/imgs/links/email.gif" alt="adminihe_what" border=0>
					<span><img height=100 class="drg" src="/imgs/links/email.gif" alt="adminihe_what" border=0></span>
					<span><img height=100 class="drg" src="/imgs/links/email.gif" alt="adminihe_what" border=0></span>
					</a>
					</a>
				
				
				<a href=# class=thumbnail>
				<a href=# class=thumbnail>
					<img class="drg" v-on:click="showhide" height=200  src="/imgs/unclesam/columbia_pw_adminiwii_ko2us.png" alt="columbia_adminiwii_ko2us" > 
					<img class="drg" v-on:click="showhide" height=200  src="/imgs/unclesam/columbia_pw_adminiwii_ko2us.png" alt="columbia_adminiwii_ko2us" > 
					<span><img class="drg" v-on:click="showhide" height=400  src="/imgs/unclesam/columbia_pw_adminiwii_ko2us.png" alt="columbia_adminiwii_ko2us" > </span>
					<span><img class="drg" v-on:click="showhide" height=400  src="/imgs/unclesam/columbia_pw_adminiwii_ko2us.png" alt="columbia_adminiwii_ko2us" > </span>
					</a>
					</a>
				<a class="thumbnail" href="mailto:adminishe@ko0.us?subject=adminishe_what?">
				<a class="thumbnail" href="mailto:adminishe@ko0.us?subject=adminishe_what?">
					<img class="drg" height=50 src="/imgs/links/email.gif" alt="adminiwii_what" border=0>
					<img class="drg" height=50 src="/imgs/links/email.gif" alt="adminiwii_what" border=0>
					<span><img height=100 class="drg" src="/imgs/links/email.gif" alt="adminiwii_what" border=0></span>
					<span><img height=100 class="drg" src="/imgs/links/email.gif" alt="adminiwii_what" border=0></span>
					</a>
					</a>


<br><br><br>
<br><br><br>
			<div id="drag">
			<div id="drag">
				<div class="drg">
				<div class="drg">
					<h3>us_med_rechtin</h3>
					<h3>us_med_rechtin</h3>
					<a class="thumbnail" href=/us/med/rechtin target=_blank>
					<a class="thumbnail" href=/us/med/rechtin target=_blank>
						<img height=200 src=/imgs/us/tn/tn_med_rechtin.png border=0>
						<img height=200 src=/imgs/us/tn/tn_med_rechtin.png border=0>
						<span><img height=400 src=/imgs/us/med_rechtin.png border=0></span>
						<span><img height=400 src=/imgs/us/med_rechtin.png border=0></span>
						</a>
						</a>
					</div>
					</div>
				</div>
				</div>
<br><br><br>
<br><br><br>
<br><br><br>
<br><br><br>
			<div id="drag" >
			<div id="drag" >
				<div class="drg" >
				<div class="drg" >
					<h3>jtfdc_defford_courtreport</h3>
					<h3>jtfdc_defford_courtreport</h3>
					<a class="thumbnail" href=/imgs/links/jtfdc_defford_courtreport.jpg target=_blank>
					<a class="thumbnail" href=/imgs/links/jtfdc_defford_courtreport.jpg target=_blank>
						<img height=200 src=/imgs/links/tn/tn_jtfdc_defford_courtreport.png border=0>
						<img height=200 src=/imgs/links/tn/tn_jtfdc_defford_courtreport.png border=0>
						<span><img height=400 src=/imgs/links/tn/tn_jtfdc_defford_courtreport.png border=0></span>
						<span><img height=400 src=/imgs/links/tn/tn_jtfdc_defford_courtreport.png border=0></span>
						</a>
						</a>
					</div>
					</div>
				</div>
				</div>


















<hr color=yellow>
<hr color=yellow>


		<a href="index_tl.html"  class="thumbnail" target=_blank> 
		<a href="index_tl.html"  class="thumbnail" target=_blank> 
			<img src="/imgs/btn/koeyew.png" alt="tl" width="200px" height="100px" border="0"> 
			<img src="/imgs/btn/koeyew.png" alt="tl" width="200px" height="100px" border="0"> 
			<span><img src="/imgs/links/index_tl.png" alt="tl" width="300px" height="200px" border="0"></span> 
			<span><img src="/imgs/links/index_tl.png" alt="tl" width="300px" height="200px" border="0"></span> 
<!--			<span><img src="/imgs/btn/koeye_handhither.gif" alt="tl" width="200px" height="150px" border="0"></span> -->
<!--			<span><img src="/imgs/btn/koeye_handhither.gif" alt="tl" width="200px" height="150px" border="0"></span> -->
			</a>
			</a>


		<a class="thumbnail" href="index_sl.html" target=_blank> 
		<a class="thumbnail" href="index_sl.html" target=_blank> 
			<img src="/imgs/btn/koeyeb.png" alt="sl" width="200px" height="100px" border="0"> 
			<img src="/imgs/btn/koeyeb.png" alt="sl" width="200px" height="100px" border="0"> 
			<span><img src="/imgs/links/index_sl.png" alt="sl" width="400px" height="300px" border="0"></span> 
			<span><img src="/imgs/links/index_sl.png" alt="sl" width="400px" height="300px" border="0"></span> 
<!--			<span><img src="/imgs/btn/koeye_handhither.gif" alt="sl" width="200px" height="150px" border="0"></span>  -->
<!--			<span><img src="/imgs/btn/koeye_handhither.gif" alt="sl" width="200px" height="150px" border="0"></span>  -->
			</a>
			</a>


		<a class="thumbnail" href="sl/index_slv.html" target=_blank> 
		<a class="thumbnail" href="sl/index_slv.html" target=_blank> 
			<img src="/imgs/btn/koeyew.png" alt="tl" width="200px" height="100px" border="0"> 
			<img src="/imgs/btn/koeyew.png" alt="tl" width="200px" height="100px" border="0"> 
			<span><img src="/imgs/links/index_slv.jpg" alt="slv" width="400px" height=300px" border="0"></span> 
			<span><img src="/imgs/links/index_slv.jpg" alt="slv" width="400px" height=300px" border="0"></span> 
<!--			<span><img src="/imgs/btn/koeye_handhither.gif" alt="slv" width="200px" height=150px" border="0"></span>  -->
<!--			<span><img src="/imgs/btn/koeye_handhither.gif" alt="slv" width="200px" height=150px" border="0"></span>  -->
			</a>
			</a>


		<a class="thumbnail" href="index_pn.html" target=_blank> 
		<a class="thumbnail" href="index_pn.html" target=_blank> 
			<img src="/imgs/btn/koeyeb.png" alt="pn" width="200px" height="100px" border="0"> 
			<img src="/imgs/btn/koeyeb.png" alt="pn" width="200px" height="100px" border="0"> 
			<span><img src="/imgs/links/index_pn.jpg" alt="pn" width="400px" height="300px" border="0"></span> 
			<span><img src="/imgs/links/index_pn.jpg" alt="pn" width="400px" height="300px" border="0"></span> 
<!--			<span><img src="/imgs/btn/koeye_handhither.gif" alt="pn" width="200px" height="150px" border="0"></span>  -->
<!--			<span><img src="/imgs/btn/koeye_handhither.gif" alt="pn" width="200px" height="150px" border="0"></span>  -->
			</a>
			</a>


		<a class="thumbnail" href="index_zm.html" target=_blank> 
		<a class="thumbnail" href="index_zm.html" target=_blank> 
			<img src="/imgs/btn/koeyew.png" alt="zm" width="200px" height="100px" border="0"> 
			<img src="/imgs/btn/koeyew.png" alt="zm" width="200px" height="100px" border="0"> 
			<span><img src="/imgs/links/index_zm.png" alt="zm" width="400px" height="300px" border="0"></span> 
			<span><img src="/imgs/links/index_zm.png" alt="zm" width="400px" height="300px" border="0"></span> 
<!--			<span><img src="/imgs/btn/koeye_handhither.gif" alt="zm" width="200px" height="150px" border="0"></span>  -->
<!--			<span><img src="/imgs/btn/koeye_handhither.gif" alt="zm" width="200px" height="150px" border="0"></span>  -->
			</a>
			</a>


		<a class="thumbnail" href="index_dd.html" target=_blank> 
		<a class="thumbnail" href="index_dd.html" target=_blank> 
			<img src="/imgs/btn/koeyeb.png" alt="dd" width="200px" height="100px" border="0"> 
			<img src="/imgs/btn/koeyeb.png" alt="dd" width="200px" height="100px" border="0"> 
			<span><img src="/imgs/links/index_dd.jpg" alt="dd" width="400px" height="300px" border="0"></span> 
			<span><img src="/imgs/links/index_dd.jpg" alt="dd" width="400px" height="300px" border="0"></span> 
<!--			<span><img src="/imgs/btn/koeye_handhither.gif" alt="dd" width="200px" height="150px" border="0"></span> -->
<!--			<span><img src="/imgs/btn/koeye_handhither.gif" alt="dd" width="200px" height="150px" border="0"></span> -->
			</a>
			</a>


		<a class="thumbnail" href="index_av.html" target=_blank> 
		<a class="thumbnail" href="index_av.html" target=_blank> 
			<img src="/imgs/btn/koeyew.png" alt="tl" width="200px" height="100px" border="0"> 
			<img src="/imgs/btn/koeyew.png" alt="tl" width="200px" height="100px" border="0"> 
			<span><img src="/imgs/links/index_av.jpg" alt="av" width="400px" height="300px" border="0"></span> 
			<span><img src="/imgs/links/index_av.jpg" alt="av" width="400px" height="300px" border="0"></span> 
<!--			<span><img src="/imgs/btn/koeye_handhither.gif" alt="av" width="200px" height="150px" border="0"></span>  -->
<!--			<span><img src="/imgs/btn/koeye_handhither.gif" alt="av" width="200px" height="150px" border="0"></span>  -->
			</a>
			</a>




		<a class="thumbnail" href="index_vu.html" target=_blank> 
		<a class="thumbnail" href="index_vu.html" target=_blank> 
			<img src="/imgs/btn/koeyeb.png" alt="vu" width="200px" height="100px" border="0"> 
			<img src="/imgs/btn/koeyeb.png" alt="vu" width="200px" height="100px" border="0"> 
			<span><img src="/imgs/links/index_vu.jpg" alt="vu" width="400px" height="300px" border="0"></span> 
			<span><img src="/imgs/links/index_vu.jpg" alt="vu" width="400px" height="300px" border="0"></span> 
<!--			<span><img src="/imgs/btn/koeye_handhither.gif" alt="vu" width="200px" height="150px" border="0"></span>  -->
<!--			<span><img src="/imgs/btn/koeye_handhither.gif" alt="vu" width="200px" height="150px" border="0"></span>  -->
			</a>
			</a>














				<hr color=red>
				<hr color=red>
				<hr color=white>
				<hr color=white>














<!--
<!--


				<img v-on:click="showhidr" src="/tl/imgs/jtfdc_private_court_since_1979_viewin.png">
				<img v-on:click="showhidr" src="/tl/imgs/jtfdc_private_court_since_1979_viewin.png">
				<img v-on:click="showhide" src="/heart/heart.gif" alt="koeye.png" border=0>
				<img v-on:click="showhide" src="/heart/heart.gif" alt="koeye.png" border=0>
				<span><img v-on:click="showhide" src="/imgs/btn/koeye_handhither.gif" alt="koeye_handhither.png" border=0></span>
				<span><img v-on:click="showhide" src="/imgs/btn/koeye_handhither.gif" alt="koeye_handhither.png" border=0></span>
				<img v-on:click="showhide" src="/imgs/btn/koeye.png" alt="koeye.png" border=0>
				<img v-on:click="showhide" src="/imgs/btn/koeye.png" alt="koeye.png" border=0>
				<button v-on:click="showhide">showhide</button>
				<button v-on:click="showhide">showhide</button>
				<button v-on:click="showhide">yokkmokk</button>
				<button v-on:click="showhide">yokkmokk</button>
	-->
	-->




				<hr>
				<hr>
				</div>
				</div>


			<div v-show="collapsed" class="detail">	
			<div v-show="collapsed" class="detail">	
				jaokim kopernicus wundersteine ii
				jaokim kopernicus wundersteine ii


				<hr>
				<hr>
				<a class="thumbnail" href=https://meet.jit.si/ko target=_blank>
				<a class="thumbnail" href=https://meet.jit.si/ko target=_blank>
					<img src=/imgs/links/tn/tn_meet_jkwii.png border=0>
					<img src=/imgs/links/tn/tn_meet_jkwii.png border=0>
					<span><img src=/imgs/links/meet_jkwii.png border=0></span>
					<span><img src=/imgs/links/meet_jkwii.png border=0></span>
					</a>
					</a>
				<a class="thumbnail" href=./?q=jkwii4trustee target=_blank>
				<a class="thumbnail" href=./?q=jkwii4trustee target=_blank>
					<img src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0>
					<img src=/imgs/jkwii4trustee/tn/tn_jkwii4trustee_jkwii4trustee.png border=0>
					<span><img src=/imgs/jkwii4trustee/jkwii4trustee_jkwii4trustee.png border=0></span>
					<span><img src=/imgs/jkwii4trustee/jkwii4trustee_jkwii4trustee.png border=0></span>
					</a>
					</a>


				<a class="thumbnail" href="/?q=unclesam">
				<a class="thumbnail" href="/?q=unclesam">
					<img src="/imgs/btn/koeyeb.png" alt="koeyeb.png" width="200px" height="80" border="0" >
					<img src="/imgs/btn/koeyeb.png" alt="koeyeb.png" width="200px" height="80" border="0" >
					<span> <img height=400 width=220 src="/imgs/unclesam/unclesam_rtaw_adminhewii_ko2us.png" alt="unclesam_rtaw_adminhewii_ko2us" > </span>
					<span> <img height=400 width=220 src="/imgs/unclesam/unclesam_rtaw_adminhewii_ko2us.png" alt="unclesam_rtaw_adminhewii_ko2us" > </span>
					</a>
					</a>




				<a class="thumbnail" href=/ko_jtf/zm/jtf_parcels/jtfdc_012.html target=_blank>
				<a class="thumbnail" href=/ko_jtf/zm/jtf_parcels/jtfdc_012.html target=_blank>
					<img src="/imgs/btn/koeyeb.png" alt="koeyeb.png" width="200px" height="80" border="0" >
					<img src="/imgs/btn/koeyeb.png" alt="koeyeb.png" width="200px" height="80" border="0" >
					<span> <img height=400 width=220 src="/tn_snap_20170123_110294.png" alt="unclesam_rtaw_adminhewii_ko2us" > </span>
					<span> <img height=400 width=220 src="/tn_snap_20170123_110294.png" alt="unclesam_rtaw_adminhewii_ko2us" > </span>
					</a>
					</a>
<!-- -->
<!-- -->
				<a class="thumbnail" href="/?q=columgia">
				<a class="thumbnail" href="/?q=columgia">
					<img src="/imgs/btn/koeyew.png" alt="koeyew.png" width="200px" height="80" border="0" >
					<img src="/imgs/btn/koeyew.png" alt="koeyew.png" width="200px" height="80" border="0" >
					<span> <img height=400 width=220 src="/imgs/unclesam/columbia_pw_adminiwii_ko2us.png" alt="columbia_adminiwii_ko2us" > </span>
					<span> <img height=400 width=220 src="/imgs/unclesam/columbia_pw_adminiwii_ko2us.png" alt="columbia_adminiwii_ko2us" > </span>
					</a>
					</a>
				<a class="popover" href=./?q=handhither target=_blank>
				<a class="popover" href=./?q=handhither target=_blank>
					<img src="/imgs/btn/koeye.png" alt="koeye.png" border=0>
					<img src="/imgs/btn/koeye.png" alt="koeye.png" border=0>
					<span><img src="/imgs/btn/koeye_handhither.gif" alt="koeye_handhither.png" border=0></span>
					<span><img src="/imgs/btn/koeye_handhither.gif" alt="koeye_handhither.png" border=0></span>
					</a>
					</a>


<!--
<!--
			<h1>link_kludge</h1>
			<h1>link_kludge</h1>
			<div id="link_kludge" >
			<div id="link_kludge" >
				<a class="thumbnail" href="/?q=tn1">
				<a class="thumbnail" href="/?q=tn1">
					<img src="/imgs/btn/koeye.png" alt="ko" width="50px" height="25px" border="0">
					<img src="/imgs/btn/koeye.png" alt="ko" width="50px" height="25px" border="0">
						<span><img src="/imgs/globes/globehead.png" alt="globehead"></span></a>
						<span><img src="/imgs/globes/globehead.png" alt="globehead"></span></a>
		
		
				<a class="thumbnail" href="/?q=tn2">
				<a class="thumbnail" href="/?q=tn2">
					<img src="/imgs/btn/koeyew.png" alt="ok" width="50px" height="25px" border="0">
					<img src="/imgs/btn/koeyew.png" alt="ok" width="50px" height="25px" border="0">
						<span><img src="/imgs/globes/globedragon.png" alt="globedragon"></span></a>
						<span><img src="/imgs/globes/globedragon.png" alt="globedragon"></span></a>
		
		
				<a class="thumbnail" href="/?q=tn2">
				<a class="thumbnail" href="/?q=tn2">
					<img src="/imgs/btn/koeyeb.png" alt="ok" width="50px" height="25px" border="0">
					<img src="/imgs/btn/koeyeb.png" alt="ok" width="50px" height="25px" border="0">
						<span><img src="/imgs/globes/globewrap.png" alt="globewrap"></span></a>
						<span><img src="/imgs/globes/globewrap.png" alt="globewrap"></span></a>


		<h1>overview</h1>
		<h1>overview</h1>
		<a class="thumbnail" href="/?q=overview"> <img src="/tl/imgs/tn/tn_construction_lights.gif" alt="construction_lights" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/construction_lights.gif" alt="construction_lights"></span></a>
		<a class="thumbnail" href="/?q=overview"> <img src="/tl/imgs/tn/tn_construction_lights.gif" alt="construction_lights" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/construction_lights.gif" alt="construction_lights"></span></a>
		<a class="thumbnail" href="/?q=ein_hundes_leben"> <img src="/tl/imgs/tn/tn_index_book-ein_hundes_leben.png" alt="construction_lights" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/index_book-ein_hundes_leben.gif" alt="construction_lights"></span></a>
		<a class="thumbnail" href="/?q=ein_hundes_leben"> <img src="/tl/imgs/tn/tn_index_book-ein_hundes_leben.png" alt="construction_lights" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/index_book-ein_hundes_leben.gif" alt="construction_lights"></span></a>
		<a class="thumbnail" href="/?q=deffords_charm"> <img src="/tl/imgs/tn/tn_tl_jtf28_jd.jpg" alt="deffords_charm" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_jtf28_jd.png" alt="deffords_charm"></span></a>
		<a class="thumbnail" href="/?q=deffords_charm"> <img src="/tl/imgs/tn/tn_tl_jtf28_jd.jpg" alt="deffords_charm" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_jtf28_jd.png" alt="deffords_charm"></span></a>
		<a class="thumbnail" href="/?q=jtf29_jak3busstop"> <img src="/tl/imgs/jtf29_jak3busstop.png" alt="jak3busstop" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtf29_jak3busstop.png" alt="jak3busstop"></span></a>
		<a class="thumbnail" href="/?q=jtf29_jak3busstop"> <img src="/tl/imgs/jtf29_jak3busstop.png" alt="jak3busstop" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtf29_jak3busstop.png" alt="jak3busstop"></span></a>
		<a class="thumbnail" href="/?q=jtf29_pre_jtf31"> <img src="/tl/imgs/jtf29_pre_jtf31.png" alt="jtf29_pre_jtf31" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtf29_pre_jtf31.png" alt="jtf29_pre_jtf31"></span></a>
		<a class="thumbnail" href="/?q=jtf29_pre_jtf31"> <img src="/tl/imgs/jtf29_pre_jtf31.png" alt="jtf29_pre_jtf31" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtf29_pre_jtf31.png" alt="jtf29_pre_jtf31"></span></a>
		<a class="thumbnail" href="/?q=jtf29_private_court_since_1979_viewin"> <img src="/tl/imgs/jtf29_private_court_since_1979_viewin.png" alt="private_court_since_1979_viewin" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtf29_private_court_since_1979_viewin.png" alt="private_court_since_1979_viewin"></span></a>
		<a class="thumbnail" href="/?q=jtf29_private_court_since_1979_viewin"> <img src="/tl/imgs/jtf29_private_court_since_1979_viewin.png" alt="private_court_since_1979_viewin" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtf29_private_court_since_1979_viewin.png" alt="private_court_since_1979_viewin"></span></a>
		<a class="thumbnail" href="/?q=jtfinc"> <img src="/tl/imgs/jtfinc.png" alt="jtfinc" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtfinc.png" alt="jtfinc"></span></a>
		<a class="thumbnail" href="/?q=jtfinc"> <img src="/tl/imgs/jtfinc.png" alt="jtfinc" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/jtfinc.png" alt="jtfinc"></span></a>
		<a class="thumbnail" href="/?q=tl_kassil"> <img src="/tl/imgs/tl_kassil.png" alt="tl_kassil" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil.png" alt="tl_kassil"></span></a>
		<a class="thumbnail" href="/?q=tl_kassil"> <img src="/tl/imgs/tl_kassil.png" alt="tl_kassil" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil.png" alt="tl_kassil"></span></a>
		<a class="thumbnail" href="/?q=tl_kassil_walter_mil"> <img src="/tl/imgs/tl_kassil_walter_mil.png" alt="tl_kassil_walter_mil" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil_walter_mil.png" alt="tl_kassil_walter"></span></a>
		<a class="thumbnail" href="/?q=tl_kassil_walter_mil"> <img src="/tl/imgs/tl_kassil_walter_mil.png" alt="tl_kassil_walter_mil" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil_walter_mil.png" alt="tl_kassil_walter"></span></a>
		<a class="thumbnail" href="/?q=tl_kassil_walter"> <img src="/tl/imgs/tl_kassil_mil.png" alt="tl_kassil_walter" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil_walter.png" alt="tl_kassil_walter"></span></a>
		<a class="thumbnail" href="/?q=tl_kassil_walter"> <img src="/tl/imgs/tl_kassil_mil.png" alt="tl_kassil_walter" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil_walter.png" alt="tl_kassil_walter"></span></a>
		<a class="thumbnail" href="/?q=tl_kassil"> <img src="/tl/imgs/tl_kassil.png" alt="tl_kassil" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil.png" alt="tl_kassil"></span></a>
		<a class="thumbnail" href="/?q=tl_kassil"> <img src="/tl/imgs/tl_kassil.png" alt="tl_kassil" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_kassil.png" alt="tl_kassil"></span></a>
		<a class="thumbnail" href="/?q=tl_konet_text"> <img src="/tl/imgs/tl_konet_text.png" alt="tl_konet_text" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_konet_text.png" alt="tl_konet_text"></span></a>
		<a class="thumbnail" href="/?q=tl_konet_text"> <img src="/tl/imgs/tl_konet_text.png" alt="tl_konet_text" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/tl_konet_text.png" alt="tl_konet_text"></span></a>
		<a class="thumbnail" href="/?q=iperms"> <img src="/tl/imgs/iperms.png" alt="iperms" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/iperms.png" alt="iperms"></span></a>
		<a class="thumbnail" href="/?q=iperms"> <img src="/tl/imgs/iperms.png" alt="iperms" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/iperms.png" alt="iperms"></span></a>
		<a class="thumbnail" href="/?q=iperms_hub"> <img src="/tl/imgs/img575.png" alt="iperms_hub" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/iperms_hub.png" alt="iperms_hub"></span></a>
		<a class="thumbnail" href="/?q=iperms_hub"> <img src="/tl/imgs/img575.png" alt="iperms_hub" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/iperms_hub.png" alt="iperms_hub"></span></a>
		<a class="thumbnail" href="/?q=iperms"> <img src="/tl/imgs/iperms.png" alt="iperms" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/iperms.png" alt="iperms"></span></a>
		<a class="thumbnail" href="/?q=iperms"> <img src="/tl/imgs/iperms.png" alt="iperms" width="50px" height="25px" border="0"> <span><img src="/tl/imgs/iperms.png" alt="iperms"></span></a>
		<a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_5959.JPG" alt="jtf29-30_plot" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_5959.JPG" alt="jtf29-30_plot"></span></a>
		<a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_5959.JPG" alt="jtf29-30_plot" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_5959.JPG" alt="jtf29-30_plot"></span></a>
		<a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6033.JPG" alt="facts_dogs_n_drones" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6033.JPG" alt="facts_dogs_n_drones"></span></a>
		<a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6033.JPG" alt="facts_dogs_n_drones" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6033.JPG" alt="facts_dogs_n_drones"></span></a>
		<a class="thumbnail" href="/?q=jtfdc_birdseye"> <img src="/imgs/jkwii4trustee/snap_20170123_110261.png" alt="jtfdc_birdseye" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/snap_20170123_110261.png" alt="jtfdc_birdseye"></span></a>
		<a class="thumbnail" href="/?q=jtfdc_birdseye"> <img src="/imgs/jkwii4trustee/snap_20170123_110261.png" alt="jtfdc_birdseye" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/snap_20170123_110261.png" alt="jtfdc_birdseye"></span></a>
		<a class="thumbnail" href="/?q=jtfdc_birdseye"> <img src="/imgs/jkwii4trustee/snap_20170123_110269.png" alt="jtfdc_maint_llc" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/snap_20170123_110269.png" alt="jtfdc_maint_llc"></span></a>
		<a class="thumbnail" href="/?q=jtfdc_birdseye"> <img src="/imgs/jkwii4trustee/snap_20170123_110269.png" alt="jtfdc_maint_llc" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/snap_20170123_110269.png" alt="jtfdc_maint_llc"></span></a>
		<a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6048.JPG" alt="jtf30-31-32_mischief" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6048.JPG" alt="jtf30-31-32_mischief"></span></a>
		<a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6048.JPG" alt="jtf30-31-32_mischief" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6048.JPG" alt="jtf30-31-32_mischief"></span></a>
		<a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
		<a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
		<a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
		<a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
		<a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
		<a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
		<a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
		<a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
		<a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
		<a class="thumbnail" href="/?q=tn1"> <img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting" width="50px" height="25px" border="0"> <span><img src="/imgs/jkwii4trustee/IMG_6047.JPG" alt="jtfinc_swatting"></span></a>
		<a class="thumbnail" href="/?q=tn1"> <img src="/imgs/btn/koeye.png" alt="ko" width="50px" height="25px" border="0"> <span><img src="/imgs/globes/globehead.png" alt="globehead"></span></a>
		<a class="thumbnail" href="/?q=tn1"> <img src="/imgs/btn/koeye.png" alt="ko" width="50px" height="25px" border="0"> <span><img src="/imgs/globes/globehead.png" alt="globehead"></span></a>
				</div>
				</div>
	-->
	-->


			</div>
			</div>
		</div>
		</div>


		<script id="script_new_vue">
		<script id="script_new_vue">
			var app = new Vue({ el: "#app_jkwii",
			var app = new Vue({ el: "#app_jkwii",
			data: {
			data: {
				collapsed: false
				collapsed: false
				},
				},
			methods: {
			methods: {
				showhide: function() {
				showhide: function() {
					if (!this.collapsed)
					if (!this.collapsed)
						this.collapsed = true;
						this.collapsed = true;
					else
					else
						this.collapsed = false;
						this.collapsed = false;
						}
						}
					}
					}
				}); 
				}); 
			</script id="script_new_vue">
			</script id="script_new_vue">


<!-- jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj -->
<!-- jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj -->


	<script id="script_resize" >
	<script id="script_resize" >
		document.body.style.fontfamily = "arial";
		document.body.style.fontfamily = "arial";
		function resizeText(multiplier) {
		function resizeText(multiplier) {
			if (document.body.style.fontSize == "") {
			if (document.body.style.fontSize == "") {
				document.body.style.fontSize = "1.0em";
				document.body.style.fontSize = "1.0em";
				}
				}
			document.body.style.fontSize = parseFloat(document.body.style.fontSize) + (multiplier * 0.2) + "em";
			document.body.style.fontSize = parseFloat(document.body.style.fontSize) + (multiplier * 0.2) + "em";
			}
			}
		function refontText(multiplier) {
		function refontText(multiplier) {
			if (document.body.style.fontSize == "") {
			if (document.body.style.fontSize == "") {
				document.body.style.fontSize = "2.0em";
				document.body.style.fontSize = "2.0em";
				}
				}
			document.body.style.font = "yokkmokkOT";
			document.body.style.font = "yokkmokkOT";
			}
			}
		</script id="script_resize">
		</script id="script_resize">
<!--
<!--
	<img id="plustext" alt="Increase text size" height=50 src="/imgs/btn/kob.png" onclick="resizeText(1)" />
	<img id="plustext" alt="Increase text size" height=50 src="/imgs/btn/kob.png" onclick="resizeText(1)" />
	< >
	< >
	<img id="minustext" alt="Decrease text size" height=50 src="/imgs/btn/kow.png" onclick="resizeText(-1)" />
	<img id="minustext" alt="Decrease text size" height=50 src="/imgs/btn/kow.png" onclick="resizeText(-1)" />
	<img id="plusfont" alt="fontup" height=50 src="/imgs/btn/kob.png" onclick="refontText(1)" />
	<img id="plusfont" alt="fontup" height=50 src="/imgs/btn/kob.png" onclick="refontText(1)" />
	< >
	< >
	<img id="minusfont" alt="fontdown" height=50 src="/imgs/btn/kow.png" onclick="refontText(-1)" />
	<img id="minusfont" alt="fontdown" height=50 src="/imgs/btn/kow.png" onclick="refontText(-1)" />
	-->
	-->
	<hr>
	<hr>
		<span v-bind:title="message"><font style="font-family: yokkmokkOT, serif; font-size:48pt; font-style:italic" >
		<span v-bind:title="message"><font style="font-family: yokkmokkOT, serif; font-size:48pt; font-style:italic" >
			abcdefghijklmnopqrstuvwxyz <br>
			abcdefghijklmnopqrstuvwxyz <br>
			ABCDEFGHIJKLMNOPQRSTUVWXYZ <br>
			ABCDEFGHIJKLMNOPQRSTUVWXYZ <br>
			01234567890
			01234567890
			</font></span>
			</font></span>
	<hr>
	<hr>


<!--	<button type="kogrids" id="kogrids" onclick="kogrids('')">-= kogrids =-</button> -->
<!--	<button type="kogrids" id="kogrids" onclick="kogrids('')">-= kogrids =-</button> -->
	<div id="div_kogrids"></div>
	<div id="div_kogrids"></div>




<!--
<!--
	<div id="kov">
	<div id="kov">
		<div>
		<div>
			kov is it:  kov
			kov is it:  kov
			</div>
			</div>
		<button v-on:click="showhide_kov">showhide_kov</button>
		<button v-on:click="showhide_kov">showhide_kov</button>
		<img v-on:click="showhide_kov1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail">	
		<div v-show="collapsed" class="detail">	
			kov detail
			kov detail
			<hr>
			<hr>
			<a href=https://meet.jit.si/ko class="thumbnail" target=_blank>
			<a href=https://meet.jit.si/ko class="thumbnail" target=_blank>
				<img src=/imgs/links/tn/tn_meet.png border=0>
				<img src=/imgs/links/tn/tn_meet.png border=0>
				<span><img src=/imgs/links/meet.png border=0></span>
				<span><img src=/imgs/links/meet.png border=0></span>
				</a>
				</a>
			<hr>
			<hr>
			</div>
			</div>
		</div>
		</div>
	<script id="script_new_vue_kov">
	<script id="script_new_vue_kov">
		var kov = new Vue({ el: "#kov",
		var kov = new Vue({ el: "#kov",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov: function() {
			showhide_kov: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
//				document.body.style.background = "darkslategrey";
//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
//				document.body.style.fontsize = "24pt";
				},
				},
			showhide_kov1: function() {
			showhide_kov1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov2: function() {
			showhide_kov2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script id="script_new_vue_kov">
		</script id="script_new_vue_kov">


	<hr>
	<hr>
abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 01234567890
abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 01234567890
	<hr>
	<hr>
	-->
	-->




	<div id="kov_ko">
	<div id="kov_ko">
		<div>
		<div>
			ko:  kov_ko
			ko:  kov_ko
			</div>
			</div>
		<button v-on:click="showhide_kov_ko">showhide_kov_ko</button>
		<button v-on:click="showhide_kov_ko">showhide_kov_ko</button>
		<img v-on:click="showhide_kov_ko1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_ko1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_ko" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_ko" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_ko2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_ko2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_ko">	
		<div v-show="collapsed" class="detail_ko">	
			ko
			ko
			<hr>
			<hr>
			<a href=kov_ko.html class="thumbnail" target=_blank>
			<a href=kov_ko.html class="thumbnail" target=_blank>
				<img src=/imgs/kov/tn/tn_kov_ko.png border=0>
				<img src=/imgs/kov/tn/tn_kov_ko.png border=0>
				<span><img src=/imgs/kov/tn/tn_kov_ko.png border=0></span>
				<span><img src=/imgs/kov/tn/tn_kov_ko.png border=0></span>
				</a>
				</a>
			<hr>
			<hr>






		<div id="drag" >
		<div id="drag" >
			<a class="popover" href="/?q=bigtn_drag1">
			<a class="popover" href="/?q=bigtn_drag1">
				<img src="/imgs/btn/koeye.png" alt="ko.png" width="50px" height="25px" border="0" id="drag" class="drg">
				<img src="/imgs/btn/koeye.png" alt="ko.png" width="50px" height="25px" border="0" id="drag" class="drg">
				<span> <img src="/imgs/btn/koeye_handhi.gif" alt="index_drag" class="drg" id="drag"> </span>
				<span> <img src="/imgs/btn/koeye_handhi.gif" alt="index_drag" class="drg" id="drag"> </span>
				</a>
				</a>
			</div>
			</div>






<!--
<!--
	<div id="drop">
	<div id="drop">
		<span id="sw"><h1>droptop</h2></span>
		<span id="sw"><h1>droptop</h2></span>
		<a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
		<a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
			<img height=200 width=300
			<img height=200 width=300
				src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
				src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
				</a>
				</a>
		</div>
		</div>
	-->
	-->






			</div>
			</div>
		</div>
		</div>






	<div id="div_showhide"  hidden>
	<div id="div_showhide"  hidden>
		<button type="button" id="show">Show Content</button>
		<button type="button" id="show">Show Content</button>
		<button type="button" id="hide">Hide Content</button>
		<button type="button" id="hide">Hide Content</button>
		<button type="show_dd" id="show_dd">Show_dd</button>
		<button type="show_dd" id="show_dd">Show_dd</button>
		<button type="hide_dd" id="hide_dd">Hide_dd</button>
		<button type="hide_dd" id="hide_dd">Hide_dd</button>
		<button type="show_bb" id="show_bb">Show_bb</button>
		<button type="show_bb" id="show_bb">Show_bb</button>
		<button type="hide_bb" id="hide_bb">Hide_bb</button>
		<button type="hide_bb" id="hide_bb">Hide_bb</button>
		<button type="show_tl" id="show_tl">Show_tl</button>
		<button type="show_tl" id="show_tl">Show_tl</button>
		<button type="hide_tl" id="hide_tl">Hide_tl</button>
		<button type="hide_tl" id="hide_tl">Hide_tl</button>
		<button type="show_colors" id="show_colors">Show_colors</button>
		<button type="show_colors" id="show_colors">Show_colors</button>
		<button type="hide_colors" id="hide_colors">Hide_colors</button>
		<button type="hide_colors" id="hide_colors">Hide_colors</button>
		<button type="show_fonts" id="show_fonts">Show_fonts</button>
		<button type="show_fonts" id="show_fonts">Show_fonts</button>
		<button type="hide_fonts" id="hide_fonts">Hide_fonts</button>
		<button type="hide_fonts" id="hide_fonts">Hide_fonts</button>
		<button type="show_alldivs" id="show_alldivs">Show_alldivs</button>
		<button type="show_alldivs" id="show_alldivs">Show_alldivs</button>
		<button type="hide_alldivs" id="hide_alldivs">Hide_alldivs</button>
		<button type="hide_alldivs" id="hide_alldivs">Hide_alldivs</button>
		</div>
		</div>


	<div id="item" hidden>
	<div id="item" hidden>
		<hr><h1>div_showhide</h1><hr>
		<hr><h1>div_showhide</h1><hr>
		</div>
		</div>


	<script id="script_showhide">
	<script id="script_showhide">
		$( "#show" ).click(function() {$('#item').show(); });
		$( "#show" ).click(function() {$('#item').show(); });
		$( "#hide" ).click(function() {$('#item').hide();});
		$( "#hide" ).click(function() {$('#item').hide();});
		$( "#show_dd" ).click(function() {$('#div_dd').show(); });
		$( "#show_dd" ).click(function() {$('#div_dd').show(); });
		$( "#hide_dd" ).click(function() {$('#div_dd').hide();});
		$( "#hide_dd" ).click(function() {$('#div_dd').hide();});
		$( "#show_bb" ).click(function() {$('#div_bb').show(); });
		$( "#show_bb" ).click(function() {$('#div_bb').show(); });
		$( "#hide_bb" ).click(function() {$('#div_bb').hide();});
		$( "#hide_bb" ).click(function() {$('#div_bb').hide();});
		$( "#show_tl" ).click(function() {$('#div_tl').show(); });
		$( "#show_tl" ).click(function() {$('#div_tl').show(); });
		$( "#hide_tl" ).click(function() {$('#div_tl').hide();});
		$( "#hide_tl" ).click(function() {$('#div_tl').hide();});
		$( "#show_jkwii" ).click(function() {$('#div_jkwii').show(); });
		$( "#show_jkwii" ).click(function() {$('#div_jkwii').show(); });
		$( "#hide_jkwii" ).click(function() {$('#div_jkwii').hide();});
		$( "#hide_jkwii" ).click(function() {$('#div_jkwii').hide();});
		$( "#show_colors" ).click(function() {$('#div_colors').show(); });
		$( "#show_colors" ).click(function() {$('#div_colors').show(); });
		$( "#hide_colors" ).click(function() {$('#div_colors').hide();});
		$( "#hide_colors" ).click(function() {$('#div_colors').hide();});
		$( "#show_fonts" ).click(function() {$('#div_fonts').show(); });
		$( "#show_fonts" ).click(function() {$('#div_fonts').show(); });
		$( "#hide_fonts" ).click(function() {$('#div_fonts').hide();});
		$( "#hide_fonts" ).click(function() {$('#div_fonts').hide();});
		$( "#show_alldivs" ).click(function() {$('#div_alldivs').show(); });
		$( "#show_alldivs" ).click(function() {$('#div_alldivs').show(); });
		$( "#hide_alldivs" ).click(function() {$('#div_alldivs').hide();});
		$( "#hide_alldivs" ).click(function() {$('#div_alldivs').hide();});
		</script id="script_showhide">
		</script id="script_showhide">




				</div>
				</div>
			</div>
			</div>
		</div>
		</div>


	<script id="script_kov_ko" >
	<script id="script_kov_ko" >
		var kov_ko = new Vue({ el: "#kov_ko",
		var kov_ko = new Vue({ el: "#kov_ko",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_ko: function() {
			showhide_kov_ko: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; 
				document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; 
//				font-style font-variant font-weight font-size line-height font-family
//				font-style font-variant font-weight font-size line-height font-family


				},
				},
			showhide_kov_ko1: function() {
			showhide_kov_ko1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_ko2: function() {
			showhide_kov_ko2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script id="script_kov_ko" >
		</script id="script_kov_ko" >












	<div id="kov_new">
	<div id="kov_new">
		<div>
		<div>
			new:  kov_new
			new:  kov_new
			</div>
			</div>
		<button v-on:click="showhide_kov_new">showhide_kov_new</button>
		<button v-on:click="showhide_kov_new">showhide_kov_new</button>
		<img v-on:click="showhide_kov_new" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_new" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_new1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_new1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_new2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_new2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_new">	
		<div v-show="collapsed" class="detail_new">	
			new
			new
			<hr>
			<hr>
			<a href=https://meet.jit.si/new class="thumbnail" target=_blank>
			<a href=https://meet.jit.si/new class="thumbnail" target=_blank>
				<img src=/imgs/links/tn/tn_meet_new.png border=0>
				<img src=/imgs/links/tn/tn_meet_new.png border=0>
				<span><img src=/imgs/links/tn/tn_meet_new.png border=0></span>
				<span><img src=/imgs/links/tn/tn_meet_new.png border=0></span>
				</a>
				</a>




		<hr color=yellow>
		<hr color=yellow>
		<h1>atwist_page</h1>
		<h1>atwist_page</h1>
		<div id="container" class="">
		<div id="container" class="">
			<div class="box"></div>
			<div class="box"></div>
			<div class="box-back"></div>
			<div class="box-back"></div>
			</div>
			</div>




		<button id="animate" class="kogo">kogo</button>
		<button id="animate" class="kogo">kogo</button>
		<script id="script_atwist_page">
		<script id="script_atwist_page">
			var goButton = document.getElementById("animate");
			var goButton = document.getElementById("animate");
			var container = document.getElementById("container");
			var container = document.getElementById("container");
			goButton.addEventListener('click', function() {
			goButton.addEventListener('click', function() {
			container.classList.toggle('active');
			container.classList.toggle('active');
			});
			});
			</script id="script_atwist_page">
			</script id="script_atwist_page">


		<hr color=yellow>
		<hr color=yellow>










<a id="drag" class="thumbnail" href="/index_zm.html?zmid=zm/jtfdc_plans/jtfdc_donovanlaw_containment_facility" target=_blank>
<a id="drag" class="thumbnail" href="/index_zm.html?zmid=zm/jtfdc_plans/jtfdc_donovanlaw_containment_facility" target=_blank>
	<img class="drg" src="/zm/jtfdc_plans/jtfdc_donovanlaw_containment_facility/TileGroup0/0-0-0.jpg" border=0>
	<img class="drg" src="/zm/jtfdc_plans/jtfdc_donovanlaw_containment_facility/TileGroup0/0-0-0.jpg" border=0>
	<span><img height=400 class="drg" src="/imgs/links/tn/tn_jtfdc_donovanlaw_containment_facility.png" border=0></span>
	<span><img height=400 class="drg" src="/imgs/links/tn/tn_jtfdc_donovanlaw_containment_facility.png" border=0></span>
	</a>
	</a>


<a id="drag"  class="thumbnail" href="/index_zm.html?zmid=/zm/jtfdc_plans/jtfdc_byrdpuckers_dogpony_campus" target=_blank>
<a id="drag"  class="thumbnail" href="/index_zm.html?zmid=/zm/jtfdc_plans/jtfdc_byrdpuckers_dogpony_campus" target=_blank>
	<img class="drg" src="/zm/jtfdc_plans/jtfdc_byrdpuckers_dogpony_campus/TileGroup0/0-0-0.jpg" border=0>
	<img class="drg" src="/zm/jtfdc_plans/jtfdc_byrdpuckers_dogpony_campus/TileGroup0/0-0-0.jpg" border=0>
	<span><img height=400 class="drg" src="/imgs/links/tn/tn_jtfdc_byrdpuckers_dogpony_campus.png" border=0></span>
	<span><img height=400 class="drg" src="/imgs/links/tn/tn_jtfdc_byrdpuckers_dogpony_campus.png" border=0></span>
	</a>
	</a>


<a id="drag" class="popover" href=/index_zm.html?zmid=/zm/jtfdc_plans/jtfdc_kou_campus target=_blank>
<a id="drag" class="popover" href=/index_zm.html?zmid=/zm/jtfdc_plans/jtfdc_kou_campus target=_blank>
	<img class="drg" src="/zm/jtfdc_plans/jtfdc_kou_campus/TileGroup0/0-0-0.jpg" border=0>
	<img class="drg" src="/zm/jtfdc_plans/jtfdc_kou_campus/TileGroup0/0-0-0.jpg" border=0>
	<span><img height=400 class="drg" src="/imgs/links/tn/tn_jtfdc_kou_campus.png" border=0></span>
	<span><img height=400 class="drg" src="/imgs/links/tn/tn_jtfdc_kou_campus.png" border=0></span>
	</a>
	</a>


<img src="/imgs/links/eyes_023.gif">
<img src="/imgs/links/eyes_023.gif">










			</div>
			</div>
		</div>
		</div>


	<script id="script_kov_new">
	<script id="script_kov_new">
		var kov_new = new Vue({ el: "#kov_new",
		var kov_new = new Vue({ el: "#kov_new",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_new: function() {
			showhide_kov_new: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; 
				document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; 
//				font-style font-variant font-weight font-size line-height font-family
//				font-style font-variant font-weight font-size line-height font-family


//				document.body.style.background = "darkslategrey";
//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
//				document.body.style.fontsize = "24pt";
				},
				},
			showhide_kov_new1: function() {
			showhide_kov_new1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_new2: function() {
			showhide_kov_new2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script id="script_kov_new">
		</script id="script_kov_new">




	<div id="div_kov_focus">
	<div id="div_kov_focus">
		<div>
		<div>
			focus:  kov_focus
			focus:  kov_focus
			</div>
			</div>
		<button v-on:click="showhide_kov_focus">showhide_kov_focus</button>
		<button v-on:click="showhide_kov_focus">showhide_kov_focus</button>
		<img v-on:click="showhide_kov_focus" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_focus" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_focus1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_focus1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_focus2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_focus2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_focus">	
		<div v-show="collapsed" class="detail_focus">	
			focus2
			focus2
			<hr>
			<hr>
			<a href=https://meet.jit.si/focus class="thumbnail" target=_blank>
			<a href=https://meet.jit.si/focus class="thumbnail" target=_blank>
				<img height=200 src=/imgs/links/tn/tn_meet.png border=0>
				<img height=200 src=/imgs/links/tn/tn_meet.png border=0>
				<span><img height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
				<span><img height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
				</a>
				</a>
			<hr>
			<hr>


			<a href=/imgs/links/warning_light.gif id="drag"  target=_blank>
			<a href=/imgs/links/warning_light.gif id="drag"  target=_blank>
				<img class="drg" height=200 src=/imgs/links/warning_light.gif border=0>
				<img class="drg" height=200 src=/imgs/links/warning_light.gif border=0>
				</a>
				</a>


			<div id="drag">
			<div id="drag">
				<div class="drg">
				<div class="drg">
					<h3>preview_deck_rocksoup</h3>
					<h3>preview_deck_rocksoup</h3>
					<div  id="div_deck_rocksoup">
					<div  id="div_deck_rocksoup">
						<a class="popover" href=http://ka12/index_dk.html#rocksoup alt=index_dk_rocksoup target=_blank>
						<a class="popover" href=http://ka12/index_dk.html#rocksoup alt=index_dk_rocksoup target=_blank>
							<img width=200 height=200 src=imgs/links/rocksoup_rock.png alt=rocksoup_rock border=0>
							<img width=200 height=200 src=imgs/links/rocksoup_rock.png alt=rocksoup_rock border=0>
							<span><img width=200 height=200 src=/imgs/links/rocksoup_pot.png alt=rocksoup_pot border=0></span>
							<span><img width=200 height=200 src=/imgs/links/rocksoup_pot.png alt=rocksoup_pot border=0></span>
							</a>
							</a>
						</div>
						</div>
					</div>
					</div>
				</div>
				</div>






			<a id="drag" class="thumbnail" href="svc/emchat/index.html" target=_blank>
			<a id="drag" class="thumbnail" href="svc/emchat/index.html" target=_blank>
				<img class="drg" src="/imgs/links/links_emchat.png"  border=0>
				<img class="drg" src="/imgs/links/links_emchat.png"  border=0>
				<span><img height=400 class="drg" src="/imgs/links/tn/tn_emchat.png" border=0></span>
				<span><img height=400 class="drg" src="/imgs/links/tn/tn_emchat.png" border=0></span>
				</a>
				</a>


			<a id="drag" class="thumbnail" href="svc/ol/ht/index.html" target=_blank>
			<a id="drag" class="thumbnail" href="svc/ol/ht/index.html" target=_blank>
				<img class="drg" src="/imgs/links/links_ol.png"  border=0>
				<img class="drg" src="/imgs/links/links_ol.png"  border=0>
				<span><img height=400 class="drg" src="/imgs/links/tn/tn_ol.png" border=0></span>
				<span><img height=400 class="drg" src="/imgs/links/tn/tn_ol.png" border=0></span>
				</a>
				</a>


<!--
<!--
			<button type="button" onclick="script_ajax()">ajax</button>
			<button type="button" onclick="script_ajax()">ajax</button>
			<img src="/imgs/btn/koeye_handhi.gif" onclick="script_ajax()">
			<img src="/imgs/btn/koeye_handhi.gif" onclick="script_ajax()">
			<div id="div_ajaxdb"><h2>div_ajaxdb</h2></div>
			<div id="div_ajaxdb"><h2>div_ajaxdb</h2></div>
	-->
	-->


			</div>
			</div>
		</div id="div_kov_focus">
		</div id="div_kov_focus">


	<script id="script_kov_focus" >
	<script id="script_kov_focus" >
		var kov_focus = new Vue({ el: "#kov_focus",
		var kov_focus = new Vue({ el: "#kov_focus",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_focus: function() {
			showhide_kov_focus: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				document.getElementById("kov_focus").style.font = "italic bold 20px arial,serif"; 
				document.getElementById("kov_focus").style.font = "italic bold 20px arial,serif"; 
//				font-style font-variant font-weight font-size line-height font-family
//				font-style font-variant font-weight font-size line-height font-family


//				document.body.style.background = "darkslategrey";
//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
//				document.body.style.fontsize = "24pt";
				},
				},
			showhide_kov_focus1: function() {
			showhide_kov_focus1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_focus2: function() {
			showhide_kov_focus2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script id="script_kov_focus" >
		</script id="script_kov_focus" >










	<div id="kov_food">
	<div id="kov_food">
		<div>
		<div>
			kov_food:
			kov_food:
			</div>
			</div>
		<button v-on:click="showhide_kov_food">showhide_kov_food</button>
		<button v-on:click="showhide_kov_food">showhide_kov_food</button>
		<img v-on:click="showhide_kov_food" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_food" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_food1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_food1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_food2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_food2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_food">	
		<div v-show="collapsed" class="detail_food">	
			kov_food
			kov_food
			<div id="drag"> kov_food:<br />
			<div id="drag"> kov_food:<br />
				<a href=kov_food.html class="thumbnail" target=_blank>
				<a href=kov_food.html class="thumbnail" target=_blank>
					<img class="drg" src="/imgs/kov/tn/tn_kov_food.png" alt="kov_food" width="50" class="drg"/>
					<img class="drg" src="/imgs/kov/tn/tn_kov_food.png" alt="kov_food" width="50" class="drg"/>
					<span><img class="drg" src="/imgs/kov/kov_food.png" alt="kov_food" width="50" class="drg"/></span>
					<span><img class="drg" src="/imgs/kov/kov_food.png" alt="kov_food" width="50" class="drg"/></span>
					</a>
					</a>
				</div>	
				</div>	




			</div>
			</div>
		</div>
		</div>


	<script>var kov_food = new Vue({ el: "#kov_food",
	<script>var kov_food = new Vue({ el: "#kov_food",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_food: function() {
			showhide_kov_food: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				document.getElementById("kov_food").style.font = "italic bold 20px arial,serif"; 
				document.getElementById("kov_food").style.font = "italic bold 20px arial,serif"; 
//				font-style font-variant font-weight font-size line-height font-family
//				font-style font-variant font-weight font-size line-height font-family


//				document.body.style.background = "darkslategrey";
//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
//				document.body.style.fontsize = "24pt";
				},
				},
			showhide_kov_food1: function() {
			showhide_kov_food1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_food2: function() {
			showhide_kov_food2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script>
		</script>








	<div id="kov_courtreport">
	<div id="kov_courtreport">
		<div>
		<div>
			kov_courtreport:
			kov_courtreport:
			</div>
			</div>
		<button v-on:click="showhide_kov_courtreport">showhide_kov_courtreport</button>
		<button v-on:click="showhide_kov_courtreport">showhide_kov_courtreport</button>
		<img v-on:click="showhide_kov_courtreport" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_courtreport" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_courtreport1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_courtreport1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_courtreport2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_courtreport2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_courtreport">	
		<div v-show="collapsed" class="detail_courtreport">	
			kov_courtreport
			kov_courtreport
			<div id="drag"> kov_courtreport:<br />
			<div id="drag"> kov_courtreport:<br />
				<a href=kov_food.html class="thumbnail" target=_blank>
				<a href=kov_food.html class="thumbnail" target=_blank>
					<img class="drg" src="/imgs/kov/tn/tn_kov_courtreport.png" alt="kov_food" width="50" class="drg"/>
					<img class="drg" src="/imgs/kov/tn/tn_kov_courtreport.png" alt="kov_food" width="50" class="drg"/>
					<span><img class="drg" src="/imgs/kov/kov_courtreport.png" alt="kov_food" width="50" class="drg"/></span>
					<span><img class="drg" src="/imgs/kov/kov_courtreport.png" alt="kov_food" width="50" class="drg"/></span>
					</a>
					</a>
				</div>	
				</div>	


			</div>
			</div>
		</div>
		</div>


	<script>var kov_courtreport = new Vue({ el: "#kov_courtreport",
	<script>var kov_courtreport = new Vue({ el: "#kov_courtreport",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_courtreport: function() {
			showhide_kov_courtreport: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				document.getElementById("kov_courtreport").style.font = "italic bold 20px arial,serif"; 
				document.getElementById("kov_courtreport").style.font = "italic bold 20px arial,serif"; 
//				font-style font-variant font-weight font-size line-height font-family
//				font-style font-variant font-weight font-size line-height font-family


//				document.body.style.background = "darkslategrey";
//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
//				document.body.style.fontsize = "24pt";
				},
				},
			showhide_kov_courtreport1: function() {
			showhide_kov_courtreport1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_courtreport2: function() {
			showhide_kov_courtreport2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script>
		</script>








	<div id="kov_where">
	<div id="kov_where">
		<div>
		<div>
			kov_where:
			kov_where:
			</div>
			</div>
		<button v-on:click="showhide_kov_where">showhide_kov_where</button>
		<button v-on:click="showhide_kov_where">showhide_kov_where</button>
		<img v-on:click="showhide_kov_where" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_where" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_where1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_where1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_where2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_where2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_where">	
		<div v-show="collapsed" class="detail_where">	


			where
			where
			<hr color=yellow>
			<hr color=yellow>


			<a id="drag" class="thumbnail" href="/svc/ol/ht/index.html" target=_blank>
			<a id="drag" class="thumbnail" href="/svc/ol/ht/index.html" target=_blank>
				<img class="drg" src="/imgs/links/tn/tn_links_ol.png" border=0>
				<img class="drg" src="/imgs/links/tn/tn_links_ol.png" border=0>
				<span><img height=400 class="drg" src="/imgs/links/tn/tn_links_ol.png" border=0></span>
				<span><img height=400 class="drg" src="/imgs/links/tn/tn_links_ol.png" border=0></span>
				</a>
				</a>




			<div id="div_gigapan" id="drag" >
			<div id="div_gigapan" id="drag" >
				<a id="drag" class="thumbnail" href="http://www.gigapan.com/gigapans?query=mars" target=_blank>
				<a id="drag" class="thumbnail" href="http://www.gigapan.com/gigapans?query=mars" target=_blank>
					<img  class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0>
					<img  class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0>
					<span><img height=400 class="drg"  src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0></span>
					<span><img height=400 class="drg"  src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0></span>
					</a>
					</a>




				<a id="drag" class="thumbnail" href="http://www.gigapan.com" target=_blank>
				<a id="drag" class="thumbnail" href="http://www.gigapan.com" target=_blank>
					<img height=200  class="drg" src="/imgs/links/tn/tn_links_gigapan.png" border=0>
					<img height=200  class="drg" src="/imgs/links/tn/tn_links_gigapan.png" border=0>
					<span><img height=400 class="drg"  src="/imgs/links/tn/tn_links_gigapan.png" border=0></span>
					<span><img height=400 class="drg"  src="/imgs/links/tn/tn_links_gigapan.png" border=0></span>
					</a>
					</a>
				</div>
				</div>






			<div id="drag"> where:<br />
			<div id="drag"> where:<br />


<!--
<!--
				<a href=https://meet.jit.si/where class="thumbnail" target=_blank>
				<a href=https://meet.jit.si/where class="thumbnail" target=_blank>
					<img height=100 src="/imgs/links/tn/tn_meet.png" alt="jtf29_eagle_north" width="50" class="drg"/>
					<img height=100 src="/imgs/links/tn/tn_meet.png" alt="jtf29_eagle_north" width="50" class="drg"/>
					<span><img height=200 src="/imgs/links/tn/tn_meet.png" alt="jtf29_eagle_north" width="50" class="drg"/></span>
					<span><img height=200 src="/imgs/links/tn/tn_meet.png" alt="jtf29_eagle_north" width="50" class="drg"/></span>
					</a>
					</a>
	-->
	-->


<!--
<!--
				<div class="drg"><h1>konet llc </h1>
				<div class="drg"><h1>konet llc </h1>
					<pre>timejask jkwii</pre>
					<pre>timejask jkwii</pre>
					<img class="drg" src="/imgs/btn/ko.png" alt="ko.png" width="50" >
					<img class="drg" src="/imgs/btn/ko.png" alt="ko.png" width="50" >
					<img class="drg" src="/imgs/btn/ok.png" alt="ok.png" width="50" >
					<img class="drg" src="/imgs/btn/ok.png" alt="ok.png" width="50" >
					<pre>timesak where</pre>
					<pre>timesak where</pre>
					</div>
					</div>
	-->
	-->


				<div class="drg"><h1>jitsimeet/where </h1>
				<div class="drg"><h1>jitsimeet/where </h1>
					<a href="https://jit.si.meee/where" id="drag"  targer=_blank class="thumbnail">	
					<a href="https://jit.si.meee/where" id="drag"  targer=_blank class="thumbnail">	
						<img height=200 src=/imgs/links/tn/tn_meet.png border=0>
						<img height=200 src=/imgs/links/tn/tn_meet.png border=0>
						<span><img height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
						<span><img height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
						</a>
						</a>
					</div>
					</div>


				<div id="drag"> where:<br />
				<div id="drag"> where:<br />
					<a class="drg" href=/imgs/links/warning_light.gif class="thumbnail" target=_blank>
					<a class="drg" href=/imgs/links/warning_light.gif class="thumbnail" target=_blank>
						<img height=200 src=/imgs/links/warning_light.gif border=0>
						<img height=200 src=/imgs/links/warning_light.gif border=0>
						<span><img src=/links/warning_light.gif border=0></span>
						<span><img src=/links/warning_light.gif border=0></span>
						</a>
						</a>
					</div>
					</div>
					</div>
					</div>
				</div>	
				</div>	
			<hr>
			<hr>










			</div>
			</div>
		</div>
		</div>


	<script>var kov_where = new Vue({ el: "#kov_where",
	<script>var kov_where = new Vue({ el: "#kov_where",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_where: function() {
			showhide_kov_where: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				document.getElementById("kov_where").style.font = "italic bold 20px arial,serif"; 
				document.getElementById("kov_where").style.font = "italic bold 20px arial,serif"; 
//				font-style font-variant font-weight font-size line-height font-family
//				font-style font-variant font-weight font-size line-height font-family


//				document.body.style.background = "darkslategrey";
//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
//				document.body.style.fontsize = "24pt";
				},
				},
			showhide_kov_where1: function() {
			showhide_kov_where1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_where2: function() {
			showhide_kov_where2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script>
		</script>


































	<div id="kov_work">
	<div id="kov_work">
		<div>
		<div>
			kov_work:  
			kov_work:  
			</div>
			</div>
		<button v-on:click="showhide_kov_work">showhide_kov_work</button>
		<button v-on:click="showhide_kov_work">showhide_kov_work</button>
		<img v-on:click="showhide_kov_work" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_work" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_work1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_work1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_work2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_work2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_work">	
		<div v-show="collapsed" class="detail_work">	
			kov_work
			kov_work
			<div id="drag"> kov_work:<br />
			<div id="drag"> kov_work:<br />
				<a href=kov_work.html class="thumbnail" target=_blank>
				<a href=kov_work.html class="thumbnail" target=_blank>
					<img class="drg" src="/imgs/kov/tn/tn_kov_work.png" alt="kov_food" width="50" class="drg"/>
					<img class="drg" src="/imgs/kov/tn/tn_kov_work.png" alt="kov_food" width="50" class="drg"/>
					<span><img class="drg" src="/imgs/kov/kov_work.png" alt="kov_food" width="50" class="drg"/></span>
					<span><img class="drg" src="/imgs/kov/kov_work.png" alt="kov_food" width="50" class="drg"/></span>
					</a>
					</a>
				</div>	
				</div>	




			</div>
			</div>
		</div>
		</div>


	<script>var kov = new Vue({ el: "#kov_work",
	<script>var kov = new Vue({ el: "#kov_work",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_work: function() {
			showhide_kov_work: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
//				document.body.style.background = "darkslategrey";
//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
//				document.body.style.fontsize = "24pt";
				},
				},
			showhide_kov_work1: function() {
			showhide_kov_work1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_work2: function() {
			showhide_kov_work2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script>
		</script>






	<div id="kov_memes">
	<div id="kov_memes">
		<div>
		<div>
			memes:  kov_memes
			memes:  kov_memes
			</div>
			</div>
		<button v-on:click="showhide_kov_memes">showhide_kov_memes</button>
		<button v-on:click="showhide_kov_memes">showhide_kov_memes</button>
		<img v-on:click="showhide_kov_memes" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_memes" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_memes1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_memes1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_memes2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_memes2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_memes">	
		<div v-show="collapsed" class="detail_memes">	
			kov_memes
			kov_memes
			<div id="drag"> kov_memes:<br />
			<div id="drag"> kov_memes:<br />
				<a href=kov_memes.html class="thumbnail" target=_blank>
				<a href=kov_memes.html class="thumbnail" target=_blank>
					<img class="drg" src="/imgs/kov/tn/tn_kov_memes.png" alt="kov_food" width="50" class="drg"/>
					<img class="drg" src="/imgs/kov/tn/tn_kov_memes.png" alt="kov_food" width="50" class="drg"/>
					<span><img class="drg" src="/imgs/kov/kov_memes.png" alt="kov_food" width="50" class="drg"/></span>
					<span><img class="drg" src="/imgs/kov/kov_memes.png" alt="kov_food" width="50" class="drg"/></span>
					</a>
					</a>
				</div>	
				</div>	


			</div>
			</div>
		</div>
		</div>


	<script>var kov_memes = new Vue({ el: "#kov_memes",
	<script>var kov_memes = new Vue({ el: "#kov_memes",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_memes: function() {
			showhide_kov_memes: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; 
				document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; 
//				font-style font-variant font-weight font-size line-height font-family
//				font-style font-variant font-weight font-size line-height font-family


//				document.body.style.background = "darkslategrey";
//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
//				document.body.style.fontsize = "24pt";
				},
				},
			showhide_kov_memes1: function() {
			showhide_kov_memes1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_memes2: function() {
			showhide_kov_memes2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script>
		</script>




	<div id="kov_kids">
	<div id="kov_kids">
		<div>
		<div>
			kids:  kov_kids
			kids:  kov_kids
			</div>
			</div>
		<button v-on:click="showhide_kov_kids">showhide_kov_kids</button>
		<button v-on:click="showhide_kov_kids">showhide_kov_kids</button>
		<img v-on:click="showhide_kov_kids" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_kids" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_kids1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_kids1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_kids2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_kids2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_kids">	
		<div v-show="collapsed" class="detail_kids">	
			kov_kids
			kov_kids
			<div id="drag"> kov_kids:<br />
			<div id="drag"> kov_kids:<br />
				<a href=kov_kids.html class="thumbnail" target=_blank>
				<a href=kov_kids.html class="thumbnail" target=_blank>
					<img class="drg" src="/imgs/kov/tn/tn_kov_kids.png" alt="kov_food" width="200" class="drg"/>
					<img class="drg" src="/imgs/kov/tn/tn_kov_kids.png" alt="kov_food" width="200" class="drg"/>
					<span><img class="drg" src="/imgs/kov/kov_kids.png" alt="kov_food" width="400" class="drg"/></span>
					<span><img class="drg" src="/imgs/kov/kov_kids.png" alt="kov_food" width="400" class="drg"/></span>
					</a>
					</a>




				<a id="drag" class="thumbnail" href="http://www.gigapan.com/gigapans?query=mars" target=_blank>
				<a id="drag" class="thumbnail" href="http://www.gigapan.com/gigapans?query=mars" target=_blank>
					<img  class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0>
					<img  class="drg" src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0>
					<span><img height=400 class="drg"  src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0></span>
					<span><img height=400 class="drg"  src="/imgs/links/tn/tn_links_gigapan_mars.png" border=0></span>
					</a>
					</a>




				<a href=/ko/svc/js/stemkoskijs/Three.js/Voxel-Painter.html class="thumbnail" target=_blank>
				<a href=/ko/svc/js/stemkoskijs/Three.js/Voxel-Painter.html class="thumbnail" target=_blank>
					<img height =200 src="/imgs/links/tn/tn_voxelpainter.png">
					<img height =200 src="/imgs/links/tn/tn_voxelpainter.png">
					<span><img height=400 src="/imgs/links/tn/tn_voxelpainter.png"></span>
					<span><img height=400 src="/imgs/links/tn/tn_voxelpainter.png"></span>
					</a>
					</a>


				<a href=/ko/svc/js/stemkoskijs/Three.js/ class="thumbnail" target=_blank>
				<a href=/ko/svc/js/stemkoskijs/Three.js/ class="thumbnail" target=_blank>
					<img height =200 src="/imgs/links/tn/tn_stemkoskijs.png">
					<img height =200 src="/imgs/links/tn/tn_stemkoskijs.png">
					<span><img height=400 src="/imgs/links/tn/tn_stemkoskijs.png"></span>
					<span><img height=400 src="/imgs/links/tn/tn_stemkoskijs.png"></span>
					</a>
					</a>


				<a href=ko/svc/js/stemkoskijs/Three.js/ target=_blank>
				<a href=ko/svc/js/stemkoskijs/Three.js/ target=_blank>


					</a>	
					</a>	




				</div>	
				</div>	
			</div>
			</div>


<!--
<!--
harris|ballad_runaway_horse|https://www.youtube.com/watch?v=PLnncuskFhc
harris|ballad_runaway_horse|https://www.youtube.com/watch?v=PLnncuskFhc
morisson|4season_vanlos_stairway|https://www.youtube.com/watch?v=gCE0MapWKJ8
morisson|4season_vanlos_stairway|https://www.youtube.com/watch?v=gCE0MapWKJ8
morisson|wavelength_1980|https://www.youtube.com/watch?v=l6oZK004AWM
morisson|wavelength_1980|https://www.youtube.com/watch?v=l6oZK004AWM
harvard|computation_thinking|https://www.youtube.com/watch?v=F0WoVEr0-44
harvard|computation_thinking|https://www.youtube.com/watch?v=F0WoVEr0-44
georgemicheals|you_have_been_loved| https://www.youtube.com/watch?v=eqjWfU2NWTc
georgemicheals|you_have_been_loved| https://www.youtube.com/watch?v=eqjWfU2NWTc
	-->
	-->






			</div>
			</div>


					</a>	
					</a>	




				</div>	
				</div>	
			</div>
			</div>


<!--
<!--
harris|ballad_runaway_horse|https://www.youtube.com/watch?v=PLnncuskFhc
harris|ballad_runaway_horse|https://www.youtube.com/watch?v=PLnncuskFhc
morisson|4season_vanlos_stairway|https://www.youtube.com/watch?v=gCE0MapWKJ8
morisson|4season_vanlos_stairway|https://www.youtube.com/watch?v=gCE0MapWKJ8
morisson|wavelength_1980|https://www.youtube.com/watch?v=l6oZK004AWM
morisson|wavelength_1980|https://www.youtube.com/watch?v=l6oZK004AWM
harvard|computation_thinking|https://www.youtube.com/watch?v=F0WoVEr0-44
harvard|computation_thinking|https://www.youtube.com/watch?v=F0WoVEr0-44
georgemicheals|you_have_been_loved| https://www.youtube.com/watch?v=eqjWfU2NWTc
georgemicheals|you_have_been_loved| https://www.youtube.com/watch?v=eqjWfU2NWTc
	-->
	-->






			</div>
			</div>
		</div>
		</div>


	<script>var kov_kids = new Vue({ el: "#kov_kids",
	<script>var kov_kids = new Vue({ el: "#kov_kids",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_kids: function() {
			showhide_kov_kids: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; 
				document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; 
//				font-style font-variant font-weight font-size line-height font-family
//				font-style font-variant font-weight font-size line-height font-family


//				document.body.style.background = "darkslategrey";
//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
//				document.body.style.fontsize = "24pt";
				},
				},
			showhide_kov_kids1: function() {
			showhide_kov_kids1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_kids2: function() {
			showhide_kov_kids2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script>
		</script>












	<div id="kov_dogs">
	<div id="kov_dogs">
		<div>
		<div>
			dogs:  kov_dogs
			dogs:  kov_dogs
			</div>
			</div>
		<button v-on:click="showhide_kov_dogs">showhide_kov_dogs</button>
		<button v-on:click="showhide_kov_dogs">showhide_kov_dogs</button>
		<img v-on:click="showhide_kov_dogs" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_dogs" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_dogs1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_dogs1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_dogs2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_dogs2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_dogs">	
		<div v-show="collapsed" class="detail_dogs">	
			kov_dogs
			kov_dogs
			<div id="drag"> kov_dogs:<br />
			<div id="drag"> kov_dogs:<br />
				<a href=kov_dogs.html class="thumbnail" target=_blank>
				<a href=kov_dogs.html class="thumbnail" target=_blank>
					<img class="drg" src="/imgs/kov/tn/tn_kov_dogs.png" alt="kov_food" width="200" class="drg"/>
					<img class="drg" src="/imgs/kov/tn/tn_kov_dogs.png" alt="kov_food" width="200" class="drg"/>
					<span><img class="drg" src="/imgs/kov/kov_dogs.png" alt="kov_food" width="400" class="drg"/></span>
					<span><img class="drg" src="/imgs/kov/kov_dogs.png" alt="kov_food" width="400" class="drg"/></span>
					</a>
					</a>
				</div>	
				</div>	


			<a href=/imgs/links/warning_light.gif class="thumbnail" target=_blank>
			<a href=/imgs/links/warning_light.gif class="thumbnail" target=_blank>
				<img height=200 src=/imgs/links/warning_light.gif border=0>
				<img height=200 src=/imgs/links/warning_light.gif border=0>
				<span><img src=/links/warning_light.gif border=0></span>
				<span><img src=/links/warning_light.gif border=0></span>
				</a>
				</a>


<!-- kov_dogs_end -->
<!-- kov_dogs_end -->
			</div>
			</div>
		</div>
		</div>


	<script>var kov_dogs = new Vue({ el: "#kov_dogs",
	<script>var kov_dogs = new Vue({ el: "#kov_dogs",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_dogs: function() {
			showhide_kov_dogs: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				document.getElementById("kov_dogs").style.font = "italic bold 20px arial,serif"; 
				document.getElementById("kov_dogs").style.font = "italic bold 20px arial,serif"; 
//				font-style font-variant font-weight font-size line-height font-family
//				font-style font-variant font-weight font-size line-height font-family


//				document.body.style.background = "darkslategrey";
//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
//				document.body.style.fontsize = "24pt";
				},
				},
			showhide_kov_dogs1: function() {
			showhide_kov_dogs1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_dogs2: function() {
			showhide_kov_dogs2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script>
		</script>




	<div id="kov_preserve">
	<div id="kov_preserve">
		<div>
		<div>
			preserve:  kov_preserve
			preserve:  kov_preserve
			</div>
			</div>
		<button v-on:click="showhide_kov_preserve">showhide_kov_preserve</button>
		<button v-on:click="showhide_kov_preserve">showhide_kov_preserve</button>
		<img v-on:click="showhide_kov_preserve" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_preserve" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_preserve1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_preserve1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_preserve2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_preserve2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_preserve">	
		<div v-show="collapsed" class="detail_preserve">	
			<div id="drag"> kov_preserve:<br />
			<div id="drag"> kov_preserve:<br />
				<a href=kov_preserve.html class="thumbnail" target=_blank>
				<a href=kov_preserve.html class="thumbnail" target=_blank>
					<img class="drg" src="/imgs/kov/tn/tn_kov_preserve.png" alt="kov_food" width="200" class="drg"/>
					<img class="drg" src="/imgs/kov/tn/tn_kov_preserve.png" alt="kov_food" width="200" class="drg"/>
					<span><img class="drg" src="/imgs/kov/kov_preserve.png" alt="kov_food" width="400" class="drg"/></span>
					<span><img class="drg" src="/imgs/kov/kov_preserve.png" alt="kov_food" width="400" class="drg"/></span>
					</a>
					</a>
				</div>	
				</div>	




			</div>
			</div>
		</div>
		</div>


	<script>var kov_preserve = new Vue({ el: "#kov_preserve",
	<script>var kov_preserve = new Vue({ el: "#kov_preserve",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_preserve: function() {
			showhide_kov_preserve: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				document.getElementById("kov_preserve").style.font = "italic bold 20px arial,serif"; 
				document.getElementById("kov_preserve").style.font = "italic bold 20px arial,serif"; 
//				font-style font-variant font-weight font-size line-height font-family
//				font-style font-variant font-weight font-size line-height font-family


//				document.body.style.background = "darkslategrey";
//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
//				document.body.style.fontsize = "24pt";
				},
				},
			showhide_kov_preserve1: function() {
			showhide_kov_preserve1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_preserve2: function() {
			showhide_kov_preserve2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script>
		</script>






	<div id="kov_protect">
	<div id="kov_protect">
		<div>
		<div>
			protect:  kov_protect
			protect:  kov_protect
			</div>
			</div>
		<button v-on:click="showhide_kov_protect">showhide_kov_protect</button>
		<button v-on:click="showhide_kov_protect">showhide_kov_protect</button>
		<img v-on:click="showhide_kov_protect" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_protect" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_protect1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_protect1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_protect2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_protect2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_protect">	
		<div v-show="collapsed" class="detail_protect">	
			<div id="drag"> kov_protect:<br />
			<div id="drag"> kov_protect:<br />
				<a href=kov_protect.html class="thumbnail" target=_blank>
				<a href=kov_protect.html class="thumbnail" target=_blank>
					<img class="drg" src="/imgs/kov/tn/tn_kov_protect.png" alt="kov_food" width="200" class="drg"/>
					<img class="drg" src="/imgs/kov/tn/tn_kov_protect.png" alt="kov_food" width="200" class="drg"/>
					<span><img class="drg" src="/imgs/kov/kov_protect.png" alt="kov_food" width="400" class="drg"/></span>
					<span><img class="drg" src="/imgs/kov/kov_protect.png" alt="kov_food" width="400" class="drg"/></span>
					</a>
					</a>
				</div>	
				</div>	




			</div>
			</div>
		</div>
		</div>




	<script>var kov_protect = new Vue({ el: "#kov_protect",
	<script>var kov_protect = new Vue({ el: "#kov_protect",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_protect: function() {
			showhide_kov_protect: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				document.getElementById("kov_protect").style.font = "italic bold 20px arial,serif"; 
				document.getElementById("kov_protect").style.font = "italic bold 20px arial,serif"; 
				},
				},
			showhide_kov_protect1: function() {
			showhide_kov_protect1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_protect2: function() {
			showhide_kov_protect2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script>
		</script>






	<div id="kov_jtfdc">
	<div id="kov_jtfdc">
		<div>
		<div>
			jtfdc:  kov_jtfdc
			jtfdc:  kov_jtfdc
			</div>
			</div>
		<button v-on:click="showhide_kov_jtfdc">showhide_kov_jtfdc</button>
		<button v-on:click="showhide_kov_jtfdc">showhide_kov_jtfdc</button>
		<img v-on:click="showhide_kov_jtfdc" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_jtfdc" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_jtfdc1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_jtfdc1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_jtfdc2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_jtfdc2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_jtfdc">	
		<div v-show="collapsed" class="detail_jtfdc">	
			<div id="drag"> kov_jtfdc:<br />
			<div id="drag"> kov_jtfdc:<br />
				<a href=kov_jtfdc.html class="thumbnail" target=_blank>
				<a href=kov_jtfdc.html class="thumbnail" target=_blank>
					<img class="drg" src="/imgs/kov/tn/tn_kov_jtfdc.png" alt="kov_food" width="200" class="drg"/>
					<img class="drg" src="/imgs/kov/tn/tn_kov_jtfdc.png" alt="kov_food" width="200" class="drg"/>
					<span><img class="drg" src="/imgs/kov/kov_jtfdc.png" alt="kov_food" width="400" class="drg"/></span>
					<span><img class="drg" src="/imgs/kov/kov_jtfdc.png" alt="kov_food" width="400" class="drg"/></span>
					</a>
					</a>
				</div>	
				</div>	




			</div>
			</div>
		</div>
		</div>




	<script>var kov_jtfdc = new Vue({ el: "#kov_jtfdc",
	<script>var kov_jtfdc = new Vue({ el: "#kov_jtfdc",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_jtfdc: function() {
			showhide_kov_jtfdc: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_jtfdc1: function() {
			showhide_kov_jtfdc1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_jtfdc2: function() {
			showhide_kov_jtfdc2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script>
		</script>


	<div id="kov_jtfinc">
	<div id="kov_jtfinc">
		<div>
		<div>
			jtfinc:  kov_jtfinc
			jtfinc:  kov_jtfinc
			</div>
			</div>
		<button v-on:click="showhide_kov_jtfinc">showhide_kov_jtfinc</button>
		<button v-on:click="showhide_kov_jtfinc">showhide_kov_jtfinc</button>
		<img v-on:click="showhide_kov_jtfinc" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_jtfinc" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_jtfinc1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_jtfinc1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_jtfinc2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_jtfinc2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_jtfinc">	
		<div v-show="collapsed" class="detail_jtfinc">	
			<div id="drag"> kov_jtfinc:<br />
			<div id="drag"> kov_jtfinc:<br />
				<a href=kov_jtfinc.html class="thumbnail" target=_blank>
				<a href=kov_jtfinc.html class="thumbnail" target=_blank>
					<img class="drg" src="/imgs/kov/tn/tn_kov_jtfinc.png" alt="kov_food" width="200" class="drg"/>
					<img class="drg" src="/imgs/kov/tn/tn_kov_jtfinc.png" alt="kov_food" width="200" class="drg"/>
					<span><img class="drg" src="/imgs/kov/kov_jtfinc.png" alt="kov_food" width="400" class="drg"/></span>
					<span><img class="drg" src="/imgs/kov/kov_jtfinc.png" alt="kov_food" width="400" class="drg"/></span>
					</a>
					</a>
				</div>	
				</div>	




			</div>
			</div>
		</div>
		</div>




	<script>var kov_jtfinc = new Vue({ el: "#kov_jtfinc",
	<script>var kov_jtfinc = new Vue({ el: "#kov_jtfinc",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_jtfinc: function() {
			showhide_kov_jtfinc: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_jtfinc1: function() {
			showhide_kov_jtfinc1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_jtfinc2: function() {
			showhide_kov_jtfinc2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script>
		</script>








	<div id="kov_byrdpucker">
	<div id="kov_byrdpucker">
		<div>
		<div>
			byrdpucker is dogs-n-ponies:  
			byrdpucker is dogs-n-ponies:  
			</div>
			</div>
		<button v-on:click="showhide_kov_byrdpucker">showhide_kov_byrdpucker</button>
		<button v-on:click="showhide_kov_byrdpucker">showhide_kov_byrdpucker</button>
		<img v-on:click="showhide_kov_byrdpucker" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_byrdpucker" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_byrdpucker1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_byrdpucker1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_byrdpucker2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_byrdpucker2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_byrdpucker">	
		<div v-show="collapsed" class="detail_byrdpucker">	
			byrdpucker dog and pony club  cyclers and donuts too
			byrdpucker dog and pony club  cyclers and donuts too
			<hr>
			<hr>
			<div id="drag"> kov_byrpucker:<br />
			<div id="drag"> kov_byrpucker:<br />
				<a href=kov_byrpucker.html class="thumbnail" target=_blank>
				<a href=kov_byrpucker.html class="thumbnail" target=_blank>
					<img class="drg" src="/imgs/kov/tn/tn_kov_byrpucker.png" alt="kov_food" width="200" class="drg"/>
					<img class="drg" src="/imgs/kov/tn/tn_kov_byrpucker.png" alt="kov_food" width="200" class="drg"/>
					<span><img class="drg" src="/imgs/kov/kov_byrpucker.png" alt="kov_food" width="400" class="drg"/></span>
					<span><img class="drg" src="/imgs/kov/kov_byrpucker.png" alt="kov_food" width="400" class="drg"/></span>
					</a>
					</a>
				</div>	
				</div>	




			</div>
			</div>
		</div>
		</div>


	<script>var kov_byrdpucker = new Vue({ el: "#kov_byrdpucker",
	<script>var kov_byrdpucker = new Vue({ el: "#kov_byrdpucker",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_byrdpucker: function() {
			showhide_kov_byrdpucker: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
//				document.body.style.background = "darkslategrey";
//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
//				document.body.style.fontsize = "24pt";
				},
				},
			showhide_kov_byrdpucker1: function() {
			showhide_kov_byrdpucker1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_byrdpucker2: function() {
			showhide_kov_byrdpucker2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script>
		</script>






	<div id="kov_jkwii">
	<div id="kov_jkwii">
		<div>
		<div>
			jkwii is me:  kov_jkwii
			jkwii is me:  kov_jkwii
			</div>
			</div>
		<button v-on:click="showhide_kov_jkwii">showhide_kov_jkwii</button>
		<button v-on:click="showhide_kov_jkwii">showhide_kov_jkwii</button>
		<img v-on:click="showhide_kov_jkwii" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_jkwii" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_jkwii1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_jkwii1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_jkwii2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_jkwii2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_jkwii">	
		<div v-show="collapsed" class="detail_jkwii">	
			jookiim kopernicus wundersteine ii
			jookiim kopernicus wundersteine ii
			<hr>
			<hr>
			<div id="drag"> kov_jkwii:<br />
			<div id="drag"> kov_jkwii:<br />
				<a href=kov_jkwii.html class="thumbnail" target=_blank>
				<a href=kov_jkwii.html class="thumbnail" target=_blank>
					<img class="drg" src="/imgs/kov/tn/tn_kov_jkwii.png" alt="kov_food" width="200" class="drg"/>
					<img class="drg" src="/imgs/kov/tn/tn_kov_jkwii.png" alt="kov_food" width="200" class="drg"/>
					<span><img class="drg" src="/imgs/kov/kov_jkwii.png" alt="kov_food" width="400" class="drg"/></span>
					<span><img class="drg" src="/imgs/kov/kov_jkwii.png" alt="kov_food" width="400" class="drg"/></span>
					</a>
					</a>
				</div>	
				</div>	


			<a href="mailto:jkwii@ko0.us?subject=jkwii?"><img src="/imgs/links/email.gif" alt="jkwii_what" border=0></a>
			<a href="mailto:jkwii@ko0.us?subject=jkwii?"><img src="/imgs/links/email.gif" alt="jkwii_what" border=0></a>


			<a href="mailto:skwii@ko0.us?subject=skwii?"><img src="/imgs/links/email.gif" alt="skwii_what" border=0></a>
			<a href="mailto:skwii@ko0.us?subject=skwii?"><img src="/imgs/links/email.gif" alt="skwii_what" border=0></a>
			<hr>
			<hr>


			<a href=/imgs/links/eurodoor_Image429.png class="thumbnail" target=_blank>
			<a href=/imgs/links/eurodoor_Image429.png class="thumbnail" target=_blank>
				<img height=200 src=/imgs/links/tn/tn_eurodoor_Image429.png alt="eurodoor" border=0>
				<img height=200 src=/imgs/links/tn/tn_eurodoor_Image429.png alt="eurodoor" border=0>
				<span><img src=/imgs/links/eurodoor_Image429.png alt="eurodoor" border=0></span>
				<span><img src=/imgs/links/eurodoor_Image429.png alt="eurodoor" border=0></span>
				</a>
				</a>




			</div>
			</div>
		</div>
		</div>


	<script>var kov_jkwii = new Vue({ el: "#kov_jkwii",
	<script>var kov_jkwii = new Vue({ el: "#kov_jkwii",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_jkwii: function() {
			showhide_kov_jkwii: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
//				document.body.style.background = "darkslategrey";
//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
//				document.body.style.fontsize = "24pt";
				},
				},
			showhide_kov_jkwii1: function() {
			showhide_kov_jkwii1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_jkwii2: function() {
			showhide_kov_jkwii2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script>
		</script>






	<div id="kov_kou">
	<div id="kov_kou">
		<div>
		<div>
			ko university digital ars technica: 
			ko university digital ars technica: 
			</div>
			</div>
		<button v-on:click="showhide_kov_kou">showhide_kov_kou</button>
		<button v-on:click="showhide_kov_kou">showhide_kov_kou</button>
		<img v-on:click="showhide_kov_kou" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_kou" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_kou1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_kou1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_kou2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_kou2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_kou">	
		<div v-show="collapsed" class="detail_kou">	
			kou digital ars technica
			kou digital ars technica
			<hr>
			<hr>
			<div id="drag"> kov_kou:<br />
			<div id="drag"> kov_kou:<br />
				<a href=kov_kou.html class="thumbnail" target=_blank>
				<a href=kov_kou.html class="thumbnail" target=_blank>
					<img class="drg" src="/imgs/kov/tn/tn_kov_kou.png" alt="kov_food" width="200" class="drg"/>
					<img class="drg" src="/imgs/kov/tn/tn_kov_kou.png" alt="kov_food" width="200" class="drg"/>
					<span><img class="drg" src="/imgs/kov/kov_kou.png" alt="kov_food" width="400" class="drg"/></span>
					<span><img class="drg" src="/imgs/kov/kov_kou.png" alt="kov_food" width="400" class="drg"/></span>
					</a>
					</a>
				</div>	
				</div>	


			</div>
			</div>
		</div>
		</div>






	<script>var kov_kou = new Vue({ el: "#kov_kou",
	<script>var kov_kou = new Vue({ el: "#kov_kou",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_kou: function() {
			showhide_kov_kou: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
//				document.body.style.background = "darkslategrey";
//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
//				document.body.style.fontsize = "24pt";
				},
				},
			showhide_kov_kou1: function() {
			showhide_kov_kou1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_kou2: function() {
			showhide_kov_kou2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script>
		</script>








	<div id="kov_kassil">
	<div id="kov_kassil">
		<div>
		<div>
			kassil and others are us:  kov_kassil
			kassil and others are us:  kov_kassil
			</div>
			</div>
		<button v-on:click="showhide_kov_kassil">showhide_kov_kassil</button>
		<button v-on:click="showhide_kov_kassil">showhide_kov_kassil</button>
		<img v-on:click="showhide_kov_kassil" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_kassil" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_kassil1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_kassil1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_kassil2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_kassil2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_kassil">	
		<div v-show="collapsed" class="detail_kassil">	
			kassil & others
			kassil & others
			<div id="drag"> kov_kassil:<br />
			<div id="drag"> kov_kassil:<br />
				<a href=kov_kassil.html class="thumbnail" target=_blank>
				<a href=kov_kassil.html class="thumbnail" target=_blank>
					<img class="drg" src="/imgs/kov/tn/tn_kov_kassil.png" alt="kov_food" width="200" class="drg"/>
					<img class="drg" src="/imgs/kov/tn/tn_kov_kassil.png" alt="kov_food" width="200" class="drg"/>
					<span><img class="drg" src="/imgs/kov/kov_kassil.png" alt="kov_food" width="400" class="drg"/></span>
					<span><img class="drg" src="/imgs/kov/kov_kassil.png" alt="kov_food" width="400" class="drg"/></span>
					</a>
					</a>
				</div>	
				</div>	
			<hr>
			<hr>




			</div>
			</div>
		</div>
		</div>


	<script>var kov_kassil = new Vue({ el: "#kov_kassil",
	<script>var kov_kassil = new Vue({ el: "#kov_kassil",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_kassil: function() {
			showhide_kov_kassil: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
//				document.body.style.background = "darkslategrey";
//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
//				document.body.style.fontsize = "24pt";
				},
				},
			showhide_kov_kassil1: function() {
			showhide_kov_kassil1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_kassil2: function() {
			showhide_kov_kassil2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script>
		</script>








	<div id="kov_konet">
	<div id="kov_konet">
		<div>
		<div>
			konet is biz:  kov_konet
			konet is biz:  kov_konet
			</div>
			</div>
		<button v-on:click="showhide_kov_konet">showhide_kov_konet</button>
		<button v-on:click="showhide_kov_konet">showhide_kov_konet</button>
		<img v-on:click="showhide_kov_konet" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_konet" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_konet1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_konet1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_konet2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_konet2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_konet">	
		<div v-show="collapsed" class="detail_konet">	
			konet is biz
			konet is biz
			<hr>
			<hr>
			<div id="drag"> kov_konet:<br />
			<div id="drag"> kov_konet:<br />
				<a href=kov_konet.html class="thumbnail" target=_blank>
				<a href=kov_konet.html class="thumbnail" target=_blank>
					<img class="drg" src="/imgs/kov/tn/tn_kov_konet.png" alt="kov_food" width="200" class="drg"/>
					<img class="drg" src="/imgs/kov/tn/tn_kov_konet.png" alt="kov_food" width="200" class="drg"/>
					<span><img class="drg" src="/imgs/kov/kov_konet.png" alt="kov_food" width="400" class="drg"/></span>
					<span><img class="drg" src="/imgs/kov/kov_konet.png" alt="kov_food" width="400" class="drg"/></span>
					</a>
					</a>
				</div>	
				</div>	




			</div>
			</div>
		</div>
		</div>


	<script>var kov_konet = new Vue({ el: "#kov_konet",
	<script>var kov_konet = new Vue({ el: "#kov_konet",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_konet: function() {
			showhide_kov_konet: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; 
				document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; 
//				font-style font-variant font-weight font-size line-height font-family
//				font-style font-variant font-weight font-size line-height font-family


//				document.body.style.background = "darkslategrey";
//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
//				document.body.style.fontsize = "24pt";
				},
				},
			showhide_kov_konet1: function() {
			showhide_kov_konet1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_konet2: function() {
			showhide_kov_konet2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script>
		</script>








	<div id="kov_iperms">
	<div id="kov_iperms">
		<div>
		<div>
			iperms
			iperms
<!--			<h1 v-on:click="showhide_kov_iperms" >= = : : iperms : : = =</h1> -->
<!--			<h1 v-on:click="showhide_kov_iperms" >= = : : iperms : : = =</h1> -->
			</div>
			</div>
		<button v-on:click="showhide_kov_iperms">showhide_kov_iperms</button>
		<button v-on:click="showhide_kov_iperms">showhide_kov_iperms</button>
		<img v-on:click="showhide_kov_iperms" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_iperms" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_iperms1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_iperms1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_iperms2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_iperms2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_iperms">	
		<div v-show="collapsed" class="detail_iperms">	
			iperms
			iperms
			<hr>
			<hr>
			<div id="drag"> kov_iperms:<br />
			<div id="drag"> kov_iperms:<br />
				<a href=kov_iperms.html class="thumbnail" target=_blank>
				<a href=kov_iperms.html class="thumbnail" target=_blank>
					<img class="drg" src="/imgs/kov/tn/tn_kov_iperms.png" alt="kov_food" width="200" class="drg"/>
					<img class="drg" src="/imgs/kov/tn/tn_kov_iperms.png" alt="kov_food" width="200" class="drg"/>
					<span><img class="drg" src="/imgs/kov/kov_iperms.png" alt="kov_food" width="400" class="drg"/></span>
					<span><img class="drg" src="/imgs/kov/kov_iperms.png" alt="kov_food" width="400" class="drg"/></span>
					</a>
					</a>
				</div>	
				</div>	




			</div>
			</div>
		</div>
		</div>


	<script>var kov_iperms = new Vue({ el: "#kov_iperms",
	<script>var kov_iperms = new Vue({ el: "#kov_iperms",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_iperms: function() {
			showhide_kov_iperms: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; 
				document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; 
//				font-style font-variant font-weight font-size line-height font-family
//				font-style font-variant font-weight font-size line-height font-family


//				document.body.style.background = "darkslategrey";
//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
//				document.body.style.fontsize = "24pt";
				},
				},
			showhide_kov_iperms1: function() {
			showhide_kov_iperms1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_iperms2: function() {
			showhide_kov_iperms2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script>
		</script>








	<div id="kov_konabus">
	<div id="kov_konabus">
		<div>
		<div>
			konabus:  kov_konabus
			konabus:  kov_konabus
			</div>
			</div>
		<button v-on:click="showhide_kov_konabus">showhide_kov_konabus</button>
		<button v-on:click="showhide_kov_konabus">showhide_kov_konabus</button>
		<img v-on:click="showhide_kov_konabus" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_konabus" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_konabus1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_konabus1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_konabus2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_konabus2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_konabus">	
		<div v-show="collapsed" class="detail_konabus">	
			konabus
			konabus
			<hr>
			<hr>
			<div id="drag"> kov_konabus:<br />
			<div id="drag"> kov_konabus:<br />
				<a href=kov_konabus.html class="thumbnail" target=_blank>
				<a href=kov_konabus.html class="thumbnail" target=_blank>
					<img class="drg" src="/imgs/kov/tn/tn_kov_konabus.png" alt="kov_food" width="200" class="drg"/>
					<img class="drg" src="/imgs/kov/tn/tn_kov_konabus.png" alt="kov_food" width="200" class="drg"/>
					<span><img class="drg" src="/imgs/kov/kov_konabus.png" alt="kov_food" width="400" class="drg"/></span>
					<span><img class="drg" src="/imgs/kov/kov_konabus.png" alt="kov_food" width="400" class="drg"/></span>
					</a>
					</a>
				</div>	
				</div>	


			</div>
			</div>
		</div>
		</div>


	<script>var kov_konabus = new Vue({ el: "#kov_konabus",
	<script>var kov_konabus = new Vue({ el: "#kov_konabus",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_konabus: function() {
			showhide_kov_konabus: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; 
				document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; 
//				font-style font-variant font-weight font-size line-height font-family
//				font-style font-variant font-weight font-size line-height font-family


//				document.body.style.background = "darkslategrey";
//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
//				document.body.style.fontsize = "24pt";
				},
				},
			showhide_kov_konabus1: function() {
			showhide_kov_konabus1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_konabus2: function() {
			showhide_kov_konabus2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script>
		</script>








	<div id="kov_kt">
	<div id="kov_kt">
		<div>
		<div>
			kt:  kov_kt
			kt:  kov_kt
			</div>
			</div>
		<button v-on:click="showhide_kov_kt">showhide_kov_kt</button>
		<button v-on:click="showhide_kov_kt">showhide_kov_kt</button>
		<img v-on:click="showhide_kov_kt" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_kt" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_kt1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_kt1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_kt2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_kt2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_kt">	
		<div v-show="collapsed" class="detail_kt">	
			kt
			kt
			<hr>
			<hr>
			<div id="drag"> kov_kt:<br />
			<div id="drag"> kov_kt:<br />
				<a href=kov_kt.html class="thumbnail" target=_blank>
				<a href=kov_kt.html class="thumbnail" target=_blank>
					<img class="drg" src="/imgs/kov/tn/tn_kov_kt.png" alt="kov_food" width="200" class="drg"/>
					<img class="drg" src="/imgs/kov/tn/tn_kov_kt.png" alt="kov_food" width="200" class="drg"/>
					<span><img class="drg" src="/imgs/kov/kov_kt.png" alt="kov_food" width="400" class="drg"/></span>
					<span><img class="drg" src="/imgs/kov/kov_kt.png" alt="kov_food" width="400" class="drg"/></span>
					</a>
					</a>
				</div>	
				</div>	




			</div>
			</div>
		</div>
		</div>


	<script>var kov_kt = new Vue({ el: "#kov_kt",
	<script>var kov_kt = new Vue({ el: "#kov_kt",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_kt: function() {
			showhide_kov_kt: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; 
				document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; 
//				font-style font-variant font-weight font-size line-height font-family
//				font-style font-variant font-weight font-size line-height font-family


//				document.body.style.background = "darkslategrey";
//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
//				document.body.style.fontsize = "24pt";
				},
				},
			showhide_kov_kt1: function() {
			showhide_kov_kt1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_kt2: function() {
			showhide_kov_kt2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script>
		</script>






	<div id="kov_go">
	<div id="kov_go">
		<div>
		<div>
			go:  kov_go
			go:  kov_go
			</div>
			</div>
		<button v-on:click="showhide_kov_go">showhide_kov_go</button>
		<button v-on:click="showhide_kov_go">showhide_kov_go</button>
		<img v-on:click="showhide_kov_go" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_go" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_go1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_go1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_go2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_go2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_go">	
		<div v-show="collapsed" class="detail_go">	
			go
			go
			<hr>
			<hr>
			<div id="drag"> kov_go:<br />
			<div id="drag"> kov_go:<br />
				<a href=kov_go.html class="thumbnail" target=_blank>
				<a href=kov_go.html class="thumbnail" target=_blank>
					<img class="drg" src="/imgs/kov/tn/tn_kov_go.png" alt="kov_food" width="200" class="drg"/>
					<img class="drg" src="/imgs/kov/tn/tn_kov_go.png" alt="kov_food" width="200" class="drg"/>
					<span><img class="drg" src="/imgs/kov/kov_go.png" alt="kov_food" width="400" class="drg"/></span>
					<span><img class="drg" src="/imgs/kov/kov_go.png" alt="kov_food" width="400" class="drg"/></span>
					</a>
					</a>
				</div>	
				</div>	




			</div>
			</div>
		</div>
		</div>


	<script>var kov_go = new Vue({ el: "#kov_go",
	<script>var kov_go = new Vue({ el: "#kov_go",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_go: function() {
			showhide_kov_go: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; 
				document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; 
//				font-style font-variant font-weight font-size line-height font-family
//				font-style font-variant font-weight font-size line-height font-family


//				document.body.style.background = "darkslategrey";
//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
//				document.body.style.fontsize = "24pt";
				},
				},
			showhide_kov_go1: function() {
			showhide_kov_go1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_go2: function() {
			showhide_kov_go2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script>
		</script>






	<div id="div_kov_old">
	<div id="div_kov_old">
		<div>
		<div>
			old:  kov_old
			old:  kov_old
			</div>
			</div>
		<button v-on:click="showhide_kov_old">showhide_kov_old</button>
		<button v-on:click="showhide_kov_old">showhide_kov_old</button>
		<img v-on:click="showhide_kov_old" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_old" src="/imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_old1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_old1" src="/imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_old2" src="/imgs/btn/kow.png" >
		<img v-on:click="showhide_kov_old2" src="/imgs/btn/kow.png" >


		<div v-show="collapsed" class="detail_old">	
		<div v-show="collapsed" class="detail_old">	


			old
			old
			<hr>
			<hr>
			<div id="drag"> kov_old:<br />
			<div id="drag"> kov_old:<br />
				<a href=kov_old.html class="thumbnail" target=_blank>
				<a href=kov_old.html class="thumbnail" target=_blank>
					<img class="drg" src="/imgs/kov/tn/tn_kov_old.png" alt="kov_food" width="200" class="drg"/>
					<img class="drg" src="/imgs/kov/tn/tn_kov_old.png" alt="kov_food" width="200" class="drg"/>
					<span><img class="drg" src="/imgs/kov/kov_old.png" alt="kov_food" width="400" class="drg"/></span>
					<span><img class="drg" src="/imgs/kov/kov_old.png" alt="kov_food" width="400" class="drg"/></span>
					</a>
					</a>
				</div>	
				</div>	




			</div>
			</div>
		</div id="div_kov_old">
		</div id="div_kov_old">


	<script id="script_kov_old">
	<script id="script_kov_old">
		var kov_old = new Vue({ el: "#kov_old",
		var kov_old = new Vue({ el: "#kov_old",
		data: {collapsed: false},
		data: {collapsed: false},
		methods: {
		methods: {
			showhide_kov_old: function() {
			showhide_kov_old: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; 
				document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; 
//				font-style font-variant font-weight font-size line-height font-family
//				font-style font-variant font-weight font-size line-height font-family


//				document.body.style.background = "darkslategrey";
//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
//				document.body.style.fontsize = "24pt";
				},
				},
			showhide_kov_old1: function() {
			showhide_kov_old1: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				},
				},
			showhide_kov_old2: function() {
			showhide_kov_old2: function() {
				if (!this.collapsed) this.collapsed = true;
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				else this.collapsed = false;
				}
				}
			}
			}
		}); 
		}); 
		</script id="script_kov_old">
		</script id="script_kov_old">


		</div id="div_vues_end" >
		</div id="div_vues_end" >


<!-- kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk -->
<!-- kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk -->






















	<ul id="kov_list">
	<ul id="kov_list">
		<li v-for="(item, index) in items">
		<li v-for="(item, index) in items">
			{{ parentMessage }} - {{ index }} - {{ item.message }} 
			{{ parentMessage }} - {{ index }} - {{ item.message }} 
			</li>
			</li>
		</ul>
		</ul>
	<script id="script_kov_list" >
	<script id="script_kov_list" >
		var kov_list = new Vue({el: '#kov_list',
		var kov_list = new Vue({el: '#kov_list',
		data: {
		data: {
			parentMessage: 'Parent',
			parentMessage: 'Parent',
			items: [
			items: [
				{ message: 'new' },
				{ message: 'new' },
				{ message: 'focus' },
				{ message: 'focus' },
				{ message: 'work' },
				{ message: 'work' },
				{ message: 'memes' },
				{ message: 'memes' },
				{ message: 'jtfdc' },
				{ message: 'jtfdc' },
				{ message: 'jtfinc' },
				{ message: 'jtfinc' },
				{ message: 'byrdpucker', 
				{ message: 'byrdpucker', 
				{ message: 'jkwii' },
				{ message: 'jkwii' },
				{ message: 'kou' },
				{ message: 'kou' },
				{ message: 'kassil' },
				{ message: 'kassil' },
				{ message: 'konet' },
				{ message: 'konet' },
				{ message: 'iperms' },
				{ message: 'iperms' },
				{ message: 'konabus' },
				{ message: 'konabus' },
				{ message: 'kt' },
				{ message: 'kt' },
				{ message: 'go' },
				{ message: 'go' },
				{ message: 'old' }
				{ message: 'old' }
				]
				]
			}
			}
			})
			})
			</script id="script_kov_list" >
			</script id="script_kov_list" >




	<div id="div_url">
	<div id="div_url">
		<script id="script_url">
		<script id="script_url">
			var url = document.createElement("a");
			var url = document.createElement("a");
			url.href=location.href;
			url.href=location.href;
			var output = "output";
			var output = "output";
			url.pathname = url.pathname.replace(/(^\/?)/,"/");
			url.pathname = url.pathname.replace(/(^\/?)/,"/");


//			if( url.search != "" ) {
//			if( url.search != "" ) {
//				script_zm_view( url.search );
//				script_zm_view( url.search );
//				}
//				}


//			alert(location.href)
//			alert(location.href)
//			alert(url.protocol)
//			alert(url.protocol)
//			alert(url.hostname)
//			alert(url.hostname)
//			alert(url.pathname)
//			alert(url.pathname)
//			alert(url.search)
//			alert(url.search)
//			alert(url.hash)
//			alert(url.hash)




//			document.write( "hostname=" + url.hostname + " loc.href=" + location.href );
//			document.write( "hostname=" + url.hostname + " loc.href=" + location.href );
//			document.write( "pathname=" + url.pathname + " search=" + url.search );
//			document.write( "pathname=" + url.pathname + " search=" + url.search );
			</script>
			</script>
			</script id="script_url">
			</script id="script_url">
			</div id="div_url">
			</div id="div_url">






	<script id="script_document_ready" type="text/javascript">
	<script id="script_document_ready" type="text/javascript">
		$(document).ready(function() {
		$(document).ready(function() {
// 			sets the draggable
// 			sets the draggable
			$('#drag .drg').draggable({
			$('#drag .drg').draggable({
				cursor: 'move',          // sets the cursor apperance
				cursor: 'move',          // sets the cursor apperance
				revert: 'valid'
				revert: 'valid'
				});
				});


// sets droppable
// sets droppable
// after the draggable is droped, hides it with a hide() effect
// after the draggable is droped, hides it with a hide() effect
			$('#drop').droppable({
			$('#drop').droppable({
				drop: function(event, ui) {
				drop: function(event, ui) {
					ui.draggable.hide(1000);
					ui.draggable.hide(1000);
					}
					}
				});
				});


// after the draggable is droped, hides it with a hide() effect
// after the draggable is droped, hides it with a hide() effect
			$('#drop1').droppable({
			$('#drop1').droppable({
				drop: function(event, ui) {
				drop: function(event, ui) {
					ui.draggable.hide(1000);
					ui.draggable.hide(1000);
					}
					}
				});
				});


// after the draggable is droped, hides it with a hide() effect
// after the draggable is droped, hides it with a hide() effect
			$('#drop2').droppable({
			$('#drop2').droppable({
				drop: function(event, ui) {
				drop: function(event, ui) {
					ui.draggable.hide(1000);
					ui.draggable.hide(1000);
					}
					}
				});
				});


// when the "#sw" element (inside the "#drop") is clicked
// when the "#sw" element (inside the "#drop") is clicked
// show the items with class "drg", contained in "#drag"
// show the items with class "drg", contained in "#drag"
//			$('#drag .drg').slideDown(1000);
//			$('#drag .drg').slideDown(1000);
			$('#drop #sw').click(function(){
			$('#drop #sw').click(function(){
				var url = "/ko_center/ko_center.php?q=jqui/dragdrop1/"
				var url = "/ko_center/ko_center.php?q=jqui/dragdrop1/"
				$(location).attr('href',url);
				$(location).attr('href',url);
				});
				});
			});
			});
		</script id="script_document_ready" >
		</script id="script_document_ready" >






	<script id="script_load_liks" >
	<script id="script_load_liks" >
		var svc_links = new Array();
		var svc_links = new Array();
		var ko_links = new Array();
		var ko_links = new Array();
		var us_links = new Array();
		var us_links = new Array();
		var u_links = new Array();
		var u_links = new Array();
		var now_links = new Array();
		var now_links = new Array();
		var srv_links = new Array();
		var srv_links = new Array();
		var kov_links = new Array();
		var kov_links = new Array();
		function load_svc_links() {
		function load_svc_links() {
			var j=0;
			var j=0;
			svc_links[j++]="/index_av.html|/imgs/links/index_av.png|index_av|/imgs/btn/kob.png";
			svc_links[j++]="/index_av.html|/imgs/links/index_av.png|index_av|/imgs/btn/kob.png";
			svc_links[j++]="/index_bb.html|/imgs/links/index_bb.png|index_bb|/imgs/btn/kob.png";
			svc_links[j++]="/index_bb.html|/imgs/links/index_bb.png|index_bb|/imgs/btn/kob.png";
			svc_links[j++]="/index_bp.html|/imgs/links/index_bp.png|index_bb|/imgs/btn/kob.png";
			svc_links[j++]="/index_bp.html|/imgs/links/index_bp.png|index_bb|/imgs/btn/kob.png";
			svc_links[j++]="/index_dd.html|/imgs/links/index_dd.png|index_dd|/imgs/btn/kob.png";
			svc_links[j++]="/index_dd.html|/imgs/links/index_dd.png|index_dd|/imgs/btn/kob.png";
			svc_links[j++]="/index_dl.html|/imgs/links/index_dl.png|index_dl|/imgs/btn/kob.png";
			svc_links[j++]="/index_dl.html|/imgs/links/index_dl.png|index_dl|/imgs/btn/kob.png";
			svc_links[j++]="/index_dp.html|/imgs/links/index_dp.png|index_dp|/imgs/btn/kob.png";
			svc_links[j++]="/index_dp.html|/imgs/links/index_dp.png|index_dp|/imgs/btn/kob.png";
			svc_links[j++]="/index_fl.html|/imgs/links/index_fl.png|index_fl|/imgs/btn/kob.png";
			svc_links[j++]="/index_fl.html|/imgs/links/index_fl.png|index_fl|/imgs/btn/kob.png";
			svc_links[j++]="/index_jg.html|/imgs/links/index_jg.png|index_jg|/imgs/btn/kob.png";
			svc_links[j++]="/index_jg.html|/imgs/links/index_jg.png|index_jg|/imgs/btn/kob.png";
			svc_links[j++]="/index_pn.html|/imgs/links/index_pn.png|index_pn|/imgs/btn/kob.png";
			svc_links[j++]="/index_pn.html|/imgs/links/index_pn.png|index_pn|/imgs/btn/kob.png";
			svc_links[j++]="/index_sc.html|/imgs/links/index_sc.png|index_sc|/imgs/btn/kob.png";
			svc_links[j++]="/index_sc.html|/imgs/links/index_sc.png|index_sc|/imgs/btn/kob.png";
			svc_links[j++]="/index_sl.html|/imgs/links/index_sl.png|index_sl|/imgs/btn/kob.png";
			svc_links[j++]="/index_sl.html|/imgs/links/index_sl.png|index_sl|/imgs/btn/kob.png";
			svc_links[j++]="/index_tl.html|/imgs/links/index_tl.png|index_tl|/imgs/btn/kob.png";
			svc_links[j++]="/index_tl.html|/imgs/links/index_tl.png|index_tl|/imgs/btn/kob.png";
			svc_links[j++]="/index_tm.html|/imgs/links/index_tm.png|index_tm|/imgs/btn/kob.png";
			svc_links[j++]="/index_tm.html|/imgs/links/index_tm.png|index_tm|/imgs/btn/kob.png";
			svc_links[j++]="/index_us.html|/imgs/links/index_us.png|index_us|/imgs/btn/kob.png";
			svc_links[j++]="/index_us.html|/imgs/links/index_us.png|index_us|/imgs/btn/kob.png";
			svc_links[j++]="/index_wc.html|/imgs/links/index_wc.png|index_wc|/imgs/btn/kob.png";
			svc_links[j++]="/index_wc.html|/imgs/links/index_wc.png|index_wc|/imgs/btn/kob.png";
			svc_links[j++]="/index_av.html|/imgs/links/index_av.png|index_av|/imgs/btn/kob.png";
			svc_links[j++]="/index_av.html|/imgs/links/index_av.png|index_av|/imgs/btn/kob.png";
			svc_links[j++]="/index_zm.html|/imgs/links/index_zm.png|index_zm|/imgs/btn/kob.png";
			svc_links[j++]="/index_zm.html|/imgs/links/index_zm.png|index_zm|/imgs/btn/kob.png";
			return( svc_links );
			return( svc_links );
			}
			}


		function load_srv_links() {
		function load_srv_links() {
			srv_links[0]="ko0.us/index.html|/imgs/btn/koeyeb.png|ko0us|/imgs/btn/kob.png";
			srv_links[0]="ko0.us/index.html|/imgs/btn/koeyeb.png|ko0us|/imgs/btn/kob.png";
			srv_links[1]="ko1.us/index.html|/imgs/btn/koeye.png|ko1us|/imgs/btn/kop1234.png";
			srv_links[1]="ko1.us/index.html|/imgs/btn/koeye.png|ko1us|/imgs/btn/kop1234.png";
			srv_links[2]="ko2.us/index.html|/imgs/btn/koeyew.png|ko2us|/imgs/btn/kow.png";
			srv_links[2]="ko2.us/index.html|/imgs/btn/koeyew.png|ko2us|/imgs/btn/kow.png";
			srv_links[3]="konet.org/index.html|/imgs/btn/ko.png|konet-org|/imgs/btn/kib.png";
			srv_links[3]="konet.org/index.html|/imgs/btn/ko.png|konet-org|/imgs/btn/kib.png";
			srv_links[4]="iperms.com/index.html|/imgs/links/iperms.png|iperms-com|/imgs/btn/kop34.png";
			srv_links[4]="iperms.com/index.html|/imgs/links/iperms.png|iperms-com|/imgs/btn/kop34.png";
			srv_links[5]="kassil.com/index.html|/imgs/links/kassil.png|kassil-com|/imgs/btn/kop12.png";
			srv_links[5]="kassil.com/index.html|/imgs/links/kassil.png|kassil-com|/imgs/btn/kop12.png";
			return( srv_links );
			return( srv_links );
			}
			}


		function load_ko_links() {
		function load_ko_links() {
			var j=0;
			var j=0;
			ko_links[j++]="/jkwii/blackboard.html|/imgs/links/blackboard.png|blackboard|/imgs/btn/koeye.png";
			ko_links[j++]="/jkwii/blackboard.html|/imgs/links/blackboard.png|blackboard|/imgs/btn/koeye.png";
			ko_links[j++]="/jkwii/js/threejs/examples/index.html|/imgs/links/index_js3d.png|index_js3d|/imgs/btn/koeye.png";
			ko_links[j++]="/jkwii/js/threejs/examples/index.html|/imgs/links/index_js3d.png|index_js3d|/imgs/btn/koeye.png";
			ko_links[j++]="/ko/svc/js/stemkoskijs/Three.js/index.html|/imgs/links/index_js3d-stemkoski.png|index_js3d-stemkoski|/imgs/btn/koeye.png";
			ko_links[j++]="/ko/svc/js/stemkoskijs/Three.js/index.html|/imgs/links/index_js3d-stemkoski.png|index_js3d-stemkoski|/imgs/btn/koeye.png";
			ko_links[j++]="/jkwii/js/gojs/index.html|/imgs/links/index_jsgo.png|index_jsgo|/imgs/btn/koeye.png";
			ko_links[j++]="/jkwii/js/gojs/index.html|/imgs/links/index_jsgo.png|index_jsgo|/imgs/btn/koeye.png";
			ko_links[j++]="/index_jsdk.html|/imgs/links/index_jsdk.png|index_jsdk|/imgs/btn/koeye.png";
			ko_links[j++]="/index_jsdk.html|/imgs/links/index_jsdk.png|index_jsdk|/imgs/btn/koeye.png";
			ko_links[j++]="/jkwii/koh5_globe/koh5_globe.html|/imgs/links/koh5_globe.png|koh5_globe|/imgs/btn/koeye.png";
			ko_links[j++]="/jkwii/koh5_globe/koh5_globe.html|/imgs/links/koh5_globe.png|koh5_globe|/imgs/btn/koeye.png";
			ko_links[j++]="/jkwii/aud/keybd/index.html|/imgs/links/index_jskb.png|index_jskb|/imgs/btn/koeye.png";
			ko_links[j++]="/jkwii/aud/keybd/index.html|/imgs/links/index_jskb.png|index_jskb|/imgs/btn/koeye.png";
			ko_links[j++]="/svc/kokbdm/index.html|/imgs/links/index_jskb-dm.png|index_jskb-dm|/imgs/btn/koeye.png";
			ko_links[j++]="/svc/kokbdm/index.html|/imgs/links/index_jskb-dm.png|index_jskb-dm|/imgs/btn/koeye.png";
			ko_links[j++]="/svc/kokbdms/index.html|/imgs/links/index_jskb-dms.png|index_jskb-dms|/imgs/btn/koeye.png";
			ko_links[j++]="/svc/kokbdms/index.html|/imgs/links/index_jskb-dms.png|index_jskb-dms|/imgs/btn/koeye.png";
			ko_links[j++]="/piano.html|/imgs/links/index_piano.png|index_piano|/imgs/btn/koeye.png";
			ko_links[j++]="/piano.html|/imgs/links/index_piano.png|index_piano|/imgs/btn/koeye.png";
			ko_links[j++]="/jkwii/aud/piano_uri/koh5_piano_uri.html|/imgs/links/index_jskb-uri.png|index_jskb_uri|/imgs/btn/koeye.png";
			ko_links[j++]="/jkwii/aud/piano_uri/koh5_piano_uri.html|/imgs/links/index_jskb-uri.png|index_jskb_uri|/imgs/btn/koeye.png";
			ko_links[j++]="/ko/svc/js/stemkoskijs/index.html|/imgs/links/index_js3d-stemkoski.png|index_js3d-stemkoski|/imgs/btn/koeye.png";
			ko_links[j++]="/ko/svc/js/stemkoskijs/index.html|/imgs/links/index_js3d-stemkoski.png|index_js3d-stemkoski|/imgs/btn/koeye.png";
			ko_links[j++]="/ko/svc/aud/mrcoles/koh5_mrcoles.html|/imgs/links/mrcoles.png|mrcoles|/imgs/btn/koeye.png";
			ko_links[j++]="/ko/svc/aud/mrcoles/koh5_mrcoles.html|/imgs/links/mrcoles.png|mrcoles|/imgs/btn/koeye.png";
			ko_links[j++]="http://effectgames.com/demos/canvascycle/|/imgs/links/index_effectgames.png|index_effectgames|/imgs/btn/koeye.png";
			ko_links[j++]="http://effectgames.com/demos/canvascycle/|/imgs/links/index_effectgames.png|index_effectgames|/imgs/btn/koeye.png";
			ko_links[j++]="https://www.leshylabs.com/apps/sfMaker/|/imgs/links/index_sfmaker.png|index_sfmaker|/imgs/btn/koeye.png";
			ko_links[j++]="https://www.leshylabs.com/apps/sfMaker/|/imgs/links/index_sfmaker.png|index_sfmaker|/imgs/btn/koeye.png";
			ko_links[j++]="https://dragongoserver.net/|/imgs/links/index_dgs.png|index_dgs|/imgs/btn/koeye.png";
			ko_links[j++]="https://dragongoserver.net/|/imgs/links/index_dgs.png|index_dgs|/imgs/btn/koeye.png";
			ko_links[j++]="/ko_center/ko_center.php|/imgs/links/ko_center.png|ko_center|/imgs/btn/kob.png";
			ko_links[j++]="/ko_center/ko_center.php|/imgs/links/ko_center.png|ko_center|/imgs/btn/kob.png";
			ko_links[j++]="/ko_saic/ko_saic.php|/imgs/links/ko_saic.png|ko_saic|/imgs/btn/kob.png";
			ko_links[j++]="/ko_saic/ko_saic.php|/imgs/links/ko_saic.png|ko_saic|/imgs/btn/kob.png";
			ko_links[j++]="/index_kt.html|/imgs/links/index_kt.png|index_kt|/imgs/btn/kob.png";
			ko_links[j++]="/index_kt.html|/imgs/links/index_kt.png|index_kt|/imgs/btn/kob.png";
			ko_links[j++]="/index_jtf.html|/imgs/links/index_jtf.png|index_jtf|/imgs/btn/kob.png";
			ko_links[j++]="/index_jtf.html|/imgs/links/index_jtf.png|index_jtf|/imgs/btn/kob.png";
			ko_links[j++]="/index2big.html|/imgs/links/index2big.png|index2big|/imgs/btn/kob.png";
			ko_links[j++]="/index2big.html|/imgs/links/index2big.png|index2big|/imgs/btn/kob.png";
			ko_links[j++]="/index2big.htm|/imgs/links/index2big_noel.png|index2big_noel|/imgs/btn/kob.png";
			ko_links[j++]="/index2big.htm|/imgs/links/index2big_noel.png|index2big_noel|/imgs/btn/kob.png";
			ko_links[j++]="/jkwii/whiteboard.html|/imgs/links/whiteboard.png|whiteboard|/imgs/btn/koeye.png";
			ko_links[j++]="/jkwii/whiteboard.html|/imgs/links/whiteboard.png|whiteboard|/imgs/btn/koeye.png";
			return( ko_links );
			return( ko_links );
			}
			}






		function load_us_links() {
		function load_us_links() {
			var j=0;
			var j=0;
//			https://www.yelp.com/biz_photos/rechtin-family-and-cosmetic-dental-care-st-louis-2?adjust_creative=dWJMtmYxpd5N5yoyzSuhtA&utm_campaign=yelp_api&utm_medium=api_v2_business&utm_source=dWJMtmYxpd5N5yoyzSuhtA|
//			https://www.yelp.com/biz_photos/rechtin-family-and-cosmetic-dental-care-st-louis-2?adjust_creative=dWJMtmYxpd5N5yoyzSuhtA&utm_campaign=yelp_api&utm_medium=api_v2_business&utm_source=dWJMtmYxpd5N5yoyzSuhtA|
			us_links[j++]="/us/med/kov_rechtin.html|/imgs/us/med_rechtin.png|med_rechtin|/imgs/btn/koeye.png|med";
			us_links[j++]="/us/med/kov_rechtin.html|/imgs/us/med_rechtin.png|med_rechtin|/imgs/btn/koeye.png|med";
			us_links[j++]="http://lawdonovan.com|/imgs/us/lawdonovan.png|law_donovan|/imgs/btn/koeye.png|law";
			us_links[j++]="http://lawdonovan.com|/imgs/us/lawdonovan.png|law_donovan|/imgs/btn/koeye.png|law";
			us_links[j++]="http://nathanscohen.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
			us_links[j++]="http://nathanscohen.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";


			us_links[j++]="https://www.linkedin.com/in/alan-cohen-2314473b/|/imgs/us/law_cohen_alan_w.png|law__cohen_alan_w|/imgs/btn/koeye.png|law";
			us_links[j++]="https://www.linkedin.com/in/alan-cohen-2314473b/|/imgs/us/law_cohen_alan_w.png|law__cohen_alan_w|/imgs/btn/koeye.png|law";
			us_links[j++]="https://twitter.com/AlanWCohenEsq|/imgs/us/cohen_alan_w_twitter.png|cohen_alan_w_twitter|/imgs/btn/koeye.png|law";
			us_links[j++]="https://twitter.com/AlanWCohenEsq|/imgs/us/cohen_alan_w_twitter.png|cohen_alan_w_twitter|/imgs/btn/koeye.png|law";
			us_links[j++]="http://www.primerus.com/attorneys/alexander-h-kuehling-esq-rosenblum-goldenhersh-st-louis-missouri-mo.htm|/imgs/us/law_kuehling_alexander.png|law_law_kuehling_alexander|/imgs/btn/koeye.png|law";
			us_links[j++]="http://www.primerus.com/attorneys/alexander-h-kuehling-esq-rosenblum-goldenhersh-st-louis-missouri-mo.htm|/imgs/us/law_kuehling_alexander.png|law_law_kuehling_alexander|/imgs/btn/koeye.png|law";
			us_links[j++]="http://elsterlaw.com/henry-elster-attorney-missouri-best/|/imgs/us/law_elster_henry.png|law_elster_henry|/imgs/btn/koeye.png|law";
			us_links[j++]="http://elsterlaw.com/henry-elster-attorney-missouri-best/|/imgs/us/law_elster_henry.png|law_elster_henry|/imgs/btn/koeye.png|law";
			us_links[j++]="https://pview.findlaw.com/view/2830721_1|/imgs/us/law_walters_alan.png|law_walters_alan|/imgs/btn/koeye.png|law";
			us_links[j++]="https://pview.findlaw.com/view/2830721_1|/imgs/us/law_walters_alan.png|law_walters_alan|/imgs/btn/koeye.png|law";
			us_links[j++]="https://www.thompsoncoburn.com/|/imgs/us/law_thompson_coburn.png|law__thompson_coburn|/imgs/btn/koeye.png|law";
			us_links[j++]="https://www.thompsoncoburn.com/|/imgs/us/law_thompson_coburn.png|law__thompson_coburn|/imgs/btn/koeye.png|law";
			us_links[j++]="http://koreintillery.com/|/imgs/us/law_korein_tillery.png|law_korein_tillery|/imgs/btn/koeye.png|law";
			us_links[j++]="http://koreintillery.com/|/imgs/us/law_korein_tillery.png|law_korein_tillery|/imgs/btn/koeye.png|law";
			us_links[j++]="http://www.smithbrownllc.com/|/imgs/us/law_smith_brown.png|law_smith_brown|/imgs/btn/koeye.png|law";
			us_links[j++]="http://www.smithbrownllc.com/|/imgs/us/law_smith_brown.png|law_smith_brown|/imgs/btn/koeye.png|law";
			us_links[j++]="http://www.fdazol.com/|/imgs/us/law_azol.png|law_azol_f|/imgs/btn/koeye.png|law";
			us_links[j++]="http://www.fdazol.com/|/imgs/us/law_azol.png|law_azol_f|/imgs/btn/koeye.png|law";


			us_links[j++]="https://jmhalumni.com|/imgs/us/jmhalumni.png|ed_jmhalumni|/imgs/btn/koeye.png|edu";
			us_links[j++]="https://jmhalumni.com|/imgs/us/jmhalumni.png|ed_jmhalumni|/imgs/btn/koeye.png|edu";
			us_links[j++]="https://johnmarshallhighschool.com|/imgs/us/johnmarshallhighschool.png|ed_johnmarshallhighschool|/imgs/btn/koeye.png|edu";
			us_links[j++]="https://johnmarshallhighschool.com|/imgs/us/johnmarshallhighschool.png|ed_johnmarshallhighschool|/imgs/btn/koeye.png|edu";
			us_links[j++]="https://www.greatschools.org/kentucky/brandenburg/1993-Brandenburg-High-School/|/imgs/us/brandenburg_highschool.png|ed_brandenburg-highschool|/imgs/btn/koeye.png|edu";
			us_links[j++]="https://www.greatschools.org/kentucky/brandenburg/1993-Brandenburg-High-School/|/imgs/us/brandenburg_highschool.png|ed_brandenburg-highschool|/imgs/btn/koeye.png|edu";
			us_links[j++]="https://www.hazelwoodschools.org/Page/3143|/imgs/us/hazelwood_schools.png|ed_hazelwood_schools|/imgs/btn/koeye.png|edu";
			us_links[j++]="https://www.hazelwoodschools.org/Page/3143|/imgs/us/hazelwood_schools.png|ed_hazelwood_schools|/imgs/btn/koeye.png|edu";
			us_links[j++]="https://bw.edu|/imgs/us/bw.png|ed_bw|/imgs/btn/koeye.png|edu";
			us_links[j++]="https://bw.edu|/imgs/us/bw.png|ed_bw|/imgs/btn/koeye.png|edu";


			us_links[j++]="http://oldtowndonuts.com|/imgs/us/oldtowndonuts.png|food_oldtowndonuts|/imgs/btn/koeye.png|food";
			us_links[j++]="http://oldtowndonuts.com|/imgs/us/oldtowndonuts.png|food_oldtowndonuts|/imgs/btn/koeye.png|food";
			us_links[j++]="http://farkaspastries.com|/imgs/us/farkaspastries.png|food_farkaspastries|/imgs/btn/koeye.png|food";
			us_links[j++]="http://farkaspastries.com|/imgs/us/farkaspastries.png|food_farkaspastries|/imgs/btn/koeye.png|food";
			us_links[j++]="https://www.facebook.com/HansaImportHouse|/imgs/us/hansaimporthouse.png|food_hansaimporthouse|/imgs/btn/koeye.png|food";
			us_links[j++]="https://www.facebook.com/HansaImportHouse|/imgs/us/hansaimporthouse.png|food_hansaimporthouse|/imgs/btn/koeye.png|food";
			us_links[j++]="http://havanagrillco.com|/imgs/us/havanagrillco.png|food_havanagrillco|/imgs/btn/koeye.png|food";
			us_links[j++]="http://havanagrillco.com|/imgs/us/havanagrillco.png|food_havanagrillco|/imgs/btn/koeye.png|food";
			us_links[j++]="http://spiros-restaurant.com|/imgs/us/spiros_restaurant.png|food_spiros_restaurant|/imgs/btn/koeye.png|food";
			us_links[j++]="http://spiros-restaurant.com|/imgs/us/spiros_restaurant.png|food_spiros_restaurant|/imgs/btn/koeye.png|food";
			us_links[j++]="https://www.opentable.com/jake-and-tellys-greek-taverna?page=1|/imgs/us/food_jake_tellys.png|food_jake_tellys|/imgs/btn/koeye.png|food";
			us_links[j++]="https://www.opentable.com/jake-and-tellys-greek-taverna?page=1|/imgs/us/food_jake_tellys.png|food_jake_tellys|/imgs/btn/koeye.png|food";
			us_links[j++]="http://edelweissrest.com|/imgs/us/edelweissrest.png|food_edelweissrest|/imgs/btn/koeye.png|food";
			us_links[j++]="http://edelweissrest.com|/imgs/us/edelweissrest.png|food_edelweissrest|/imgs/btn/koeye.png|food";
			us_links[j++]="http://bierwerks.com|/imgs/us/food_bierwerks.png|food_bierwerks|/imgs/btn/koeye.png|food";
			us_links[j++]="http://bierwerks.com|/imgs/us/food_bierwerks.png|food_bierwerks|/imgs/btn/koeye.png|food";
			us_links[j++]="http://www.savellispizzapastasubs.com/|/imgs/us/food_savellispizza.png|food_savellispizza|/imgs/bmtn/koeye.png|food";
			us_links[j++]="http://www.savellispizzapastasubs.com/|/imgs/us/food_savellispizza.png|food_savellispizza|/imgs/bmtn/koeye.png|food";
			us_links[j++]="https://www.facebook.com/woohoogreekfood2/|/imgs/us/woohoogreekfood2.png|food_woohoogreekfood2|/imgs/btn/koeye.png|food";
			us_links[j++]="https://www.facebook.com/woohoogreekfood2/|/imgs/us/woohoogreekfood2.png|food_woohoogreekfood2|/imgs/btn/koeye.png|food";


			us_links[j++]="https://bdo.com/about/us-locations/bdo-st-louis|/imgs/us/bdo-stl.png|acct_bdo-stl|/imgs/btn/koeye.png|acct";
			us_links[j++]="https://bdo.com/about/us-locations/bdo-st-louis|/imgs/us/bdo-stl.png|acct_bdo-stl|/imgs/btn/koeye.png|acct";
			us_links[j++]="https://bdo.com/about/us-locations/bdo-cleveland-office|/imgs/us/bdo-cle.png|acct_bdo-cle|/imgs/btn/koeye.png|acct";
			us_links[j++]="https://bdo.com/about/us-locations/bdo-cleveland-office|/imgs/us/bdo-cle.png|acct_bdo-cle|/imgs/btn/koeye.png|acct";
			us_links[j++]="http://www.gatewayloan.com/|/imgs/us/gateway_mortgage.png|gateway_mortgage|/imgs/btn/koeye.png|acct";
			us_links[j++]="http://www.gatewayloan.com/|/imgs/us/gateway_mortgage.png|gateway_mortgage|/imgs/btn/koeye.png|acct";
			us_links[j++]="https://chesonsulting.com|/imgs/us/checonsulting.png|biz_checonsulting|/imgs/btn/koeye.png|biz";
			us_links[j++]="https://chesonsulting.com|/imgs/us/checonsulting.png|biz_checonsulting|/imgs/btn/koeye.png|biz";
			us_links[j++]="http://saic.com|/imgs/us/saic.png|saic|/imgs/btn/koeye.png|biz";
			us_links[j++]="http://saic.com|/imgs/us/saic.png|saic|/imgs/btn/koeye.png|biz";
			us_links[j++]="http://leidos.com|/imgs/us/leidos.png|leidos|/imgs/btn/koeye.png|biz";
			us_links[j++]="http://leidos.com|/imgs/us/leidos.png|leidos|/imgs/btn/koeye.png|biz";




			us_links[j++]="http://ko2.us/index_focus.com|/imgs/us/focus_solutions.png|focus_solutions|/imgs/btn/koeye.png|biz";
			us_links[j++]="http://ko2.us/index_focus.com|/imgs/us/focus_solutions.png|focus_solutions|/imgs/btn/koeye.png|biz";
			us_links[j++]="http://www.finduslocal.com/hardware-stores/kentucky/brandenburg/allens-s-t-hardware-inc|/imgs/us/biz_allens_hardware.png|biz_allens_hardware|/imgs/btn/koeye.png|biz";
			us_links[j++]="http://www.finduslocal.com/hardware-stores/kentucky/brandenburg/allens-s-t-hardware-inc|/imgs/us/biz_allens_hardware.png|biz_allens_hardware|/imgs/btn/koeye.png|biz";
			us_links[j++]="http://growwarehouse.com|/imgs/us/grow_warehouse.png|grow_warehouse|/imgs/btn/koeye.png|biz";
			us_links[j++]="http://growwarehouse.com|/imgs/us/grow_warehouse.png|grow_warehouse|/imgs/btn/koeye.png|biz";
			us_links[j++]="https://www.facebook.com/avondanceandmartialarts|/imgs/us/avondanceandmartialarts.png|avondanceandmartialarts|/imgs/btn/koeye.png|phy";
			us_links[j++]="https://www.facebook.com/avondanceandmartialarts|/imgs/us/avondanceandmartialarts.png|avondanceandmartialarts|/imgs/btn/koeye.png|phy";
			us_links[j++]="https://www.facebook.com/avondanceandmartialarts|/imgs/us/avondanceandmartialarts.png|avondanceandmartialarts|/imgs/btn/koeye.png|phy";
			us_links[j++]="https://www.facebook.com/avondanceandmartialarts|/imgs/us/avondanceandmartialarts.png|avondanceandmartialarts|/imgs/btn/koeye.png|phy";
			us_links[j++]="http://www.savellidanceandmartialarts.com/?load=html|/imgs/us/savelli_dance_martialarts.png|savelli_dance_martialarts|/imgs/btn/koeye.png|phy";
			us_links[j++]="http://www.savellidanceandmartialarts.com/?load=html|/imgs/us/savelli_dance_martialarts.png|savelli_dance_martialarts|/imgs/btn/koeye.png|phy";
			us_links[j++]="http://myfusiondance.com/?load=html|/imgs/us/fusion_dance.png|fusion_dance|/imgs/btn/koeye.png|phy";
			us_links[j++]="http://myfusiondance.com/?load=html|/imgs/us/fusion_dance.png|fusion_dance|/imgs/btn/koeye.png|phy";
			us_links[j++]="http://www.superseriesbaseball.com/|/imgs/us/super_series_baseball.png|super_series_baseball|/imgs/btn/koeye.png|phy";
			us_links[j++]="http://www.superseriesbaseball.com/|/imgs/us/super_series_baseball.png|super_series_baseball|/imgs/btn/koeye.png|phy";


			us_links[j++]="https://ftknox.afceachapters.org/|/imgs/us/afcea_knox.png|afcea_knox|/imgs/btn/koeye.png|org";
			us_links[j++]="https://ftknox.afceachapters.org/|/imgs/us/afcea_knox.png|afcea_knox|/imgs/btn/koeye.png|org";
			us_links[j++]="https://scott.afceachapters.org/|/imgs/us/afcea_scott.png|afcea_scott|/imgs/btn/koeye.png|org";
			us_links[j++]="https://scott.afceachapters.org/|/imgs/us/afcea_scott.png|afcea_scott|/imgs/btn/koeye.png|org";
			us_links[j++]="https://www.ble-t.org/|/imgs/us/ble.png|ble|/imgs/btn/koeye.png|org";
			us_links[j++]="https://www.ble-t.org/|/imgs/us/ble.png|ble|/imgs/btn/koeye.png|org";
			us_links[j++]="http://www.doevalley.org/|/imgs/us/doe_valley.png|doe_valley|/imgs/btn/koeye.png|org";
			us_links[j++]="http://www.doevalley.org/|/imgs/us/doe_valley.png|doe_valley|/imgs/btn/koeye.png|org";


			us_links[j++]="http://www.chapelofthecross.org/|/imgs/us/chapel_of_the_cross.png|chapel_of_the_cross|/imgs/btn/koeye.png|rel";
			us_links[j++]="http://www.chapelofthecross.org/|/imgs/us/chapel_of_the_cross.png|chapel_of_the_cross|/imgs/btn/koeye.png|rel";
			us_links[j++]="https://www.lds.org/temples/details/st.-louis-missouri-temple|/imgs/us/lds_stl.png|lds_stl|/imgs/btn/koeye.png|rel";
			us_links[j++]="https://www.lds.org/temples/details/st.-louis-missouri-temple|/imgs/us/lds_stl.png|lds_stl|/imgs/btn/koeye.png|rel";
			us_links[j++]="https://www.bethanyenglish.org/|/imgs/us/bethany_english_lutheran.png|bethany_english_lutheran|/imgs/btn/koeye.png|rel";
			us_links[j++]="https://www.bethanyenglish.org/|/imgs/us/bethany_english_lutheran.png|bethany_english_lutheran|/imgs/btn/koeye.png|rel";
			us_links[j++]="https://www.meadecountymessenger.com/|/imgs/us/meade_county_messenger.png|meade_county_messenger|/imgs/btn/koeye.png|media";
			us_links[j++]="https://www.meadecountymessenger.com/|/imgs/us/meade_county_messenger.png|meade_county_messenger|/imgs/btn/koeye.png|media";
			us_links[j++]="/index_jtfdcr.html|/imgs/us/jtfdcr.png|jtfdcr|/imgs/btn/koeye.png|media";
			us_links[j++]="/index_jtfdcr.html|/imgs/us/jtfdcr.png|jtfdcr|/imgs/btn/koeye.png|media";
			us_links[j++]="https://mars.jpl.nasa.gov/msl/multimedia/raw/?s=#/?slide=2088|/imgs/us/mars_jpl_nasa.png|mars_jpl_nasa|/imgs/btn/koeye.png|sci";
			us_links[j++]="https://mars.jpl.nasa.gov/msl/multimedia/raw/?s=#/?slide=2088|/imgs/us/mars_jpl_nasa.png|mars_jpl_nasa|/imgs/btn/koeye.png|sci";
			us_links[j++]="https://mars.nasa.gov/mer/gallery/all/opportunity.html|/imgs/us/mars_nasa_gov.png|mars_nasa_gov|/imgs/btn/koeye.png|sci";
			us_links[j++]="https://mars.nasa.gov/mer/gallery/all/opportunity.html|/imgs/us/mars_nasa_gov.png|mars_nasa_gov|/imgs/btn/koeye.png|sci";
			us_links[j++]="/index_jtfdcr.html|/imgs/us/jtfdcr.png|jtfdcr|/imgs/btn/koeye.png|media";
			us_links[j++]="/index_jtfdcr.html|/imgs/us/jtfdcr.png|jtfdcr|/imgs/btn/koeye.png|media";
			return( us_links );
			return( us_links );
			}
			}






		function load_u_links() {
		function load_u_links() {
			var j=0;
			var j=0;
			u_links[j++]="http://lawdonovan.com|/imgs/us/lawdonovan.png|law_donovan|/imgs/btn/koeye.png|law";
			u_links[j++]="http://lawdonovan.com|/imgs/us/lawdonovan.png|law_donovan|/imgs/btn/koeye.png|law";
			u_links[j++]="http://nathanscohen.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
			u_links[j++]="http://nathanscohen.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";


			u_links[j++]="https://www.linkedin.com/in/alan-cohen-2314473b/|/imgs/us/law_cohen_alan_w.png|law__cohen_alan_w|/imgs/btn/koeye.png|law";
			u_links[j++]="https://www.linkedin.com/in/alan-cohen-2314473b/|/imgs/us/law_cohen_alan_w.png|law__cohen_alan_w|/imgs/btn/koeye.png|law";
			u_links[j++]="https://twitter.com/AlanWCohenEsq|/imgs/us/cohen_alan_w_twitter.png|cohen_alan_w_twitter|/imgs/btn/koeye.png|law";
			u_links[j++]="https://twitter.com/AlanWCohenEsq|/imgs/us/cohen_alan_w_twitter.png|cohen_alan_w_twitter|/imgs/btn/koeye.png|law";
			u_links[j++]="http://www.primerus.com/attorneys/alexander-h-kuehling-esq-rosenblum-goldenhersh-st-louis-missouri-mo.htm|/imgs/us/law_kuehling_alexander.png|law_law_kuehling_alexander|/imgs/btn/koeye.png|law";
			u_links[j++]="http://www.primerus.com/attorneys/alexander-h-kuehling-esq-rosenblum-goldenhersh-st-louis-missouri-mo.htm|/imgs/us/law_kuehling_alexander.png|law_law_kuehling_alexander|/imgs/btn/koeye.png|law";
			u_links[j++]="http://elsterlaw.com/henry-elster-attorney-missouri-best/|/imgs/us/law_elster_henry.png|law_elster_henry|/imgs/btn/koeye.png|law";
			u_links[j++]="http://elsterlaw.com/henry-elster-attorney-missouri-best/|/imgs/us/law_elster_henry.png|law_elster_henry|/imgs/btn/koeye.png|law";
			u_links[j++]="https://pview.findlaw.com/view/2830721_1|/imgs/us/law_walters_alan.png|law_walters_alan|/imgs/btn/koeye.png|law";
			u_links[j++]="https://pview.findlaw.com/view/2830721_1|/imgs/us/law_walters_alan.png|law_walters_alan|/imgs/btn/koeye.png|law";
			u_links[j++]="https://www.thompsoncoburn.com/|/imgs/us/law_thompson_coburn.png|law__thompson_coburn|/imgs/btn/koeye.png|law";
			u_links[j++]="https://www.thompsoncoburn.com/|/imgs/us/law_thompson_coburn.png|law__thompson_coburn|/imgs/btn/koeye.png|law";
			u_links[j++]="http://koreintillery.com/|/imgs/us/law_korein_tillery.png|law_korein_tillery|/imgs/btn/koeye.png|law";
			u_links[j++]="http://koreintillery.com/|/imgs/us/law_korein_tillery.png|law_korein_tillery|/imgs/btn/koeye.png|law";
			u_links[j++]="http://www.smithbrownllc.com/|/imgs/us/law_smith_brown.png|law_smith_brown|/imgs/btn/koeye.png|law";
			u_links[j++]="http://www.smithbrownllc.com/|/imgs/us/law_smith_brown.png|law_smith_brown|/imgs/btn/koeye.png|law";
			return( u_links );
			return( u_links );
			}
			}






		function load_now_links() {
		function load_now_links() {
			var j=0;
			var j=0;
			now_links[j++]="http://index_party.html|/imgs/us/lawdonovan.png|law_donovan|/imgs/btn/koeye.png|law";
			now_links[j++]="http://index_party.html|/imgs/us/lawdonovan.png|law_donovan|/imgs/btn/koeye.png|law";
			now_links[j++]="http://index_jtfdc.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
			now_links[j++]="http://index_jtfdc.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
			now_links[j++]="http://index_jtfinc.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
			now_links[j++]="http://index_jtfinc.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
			now_links[j++]="http://index_stlc.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
			now_links[j++]="http://index_stlc.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
			now_links[j++]="http://index_jtfdcr.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
			now_links[j++]="http://index_jtfdcr.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
			now_links[j++]="http://index_byrdpucker.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
			now_links[j++]="http://index_byrdpucker.com/|/imgs/us/law_cohen_nathan_s.png|law__cohen_nathan_s|/imgs/btn/koeye.png|law";
			return( now_links );
			return( now_links );
			}
			}




		function show_svc_links(mode) {
		function show_svc_links(mode) {
			svc_links = load_svc_links();
			svc_links = load_svc_links();
			htmout_svc_links = "";
			htmout_svc_links = "";
			htmout_svc_linkz = "";
			htmout_svc_linkz = "";
			for (i = 0; i < svc_links.length; i++) {
			for (i = 0; i < svc_links.length; i++) {
				my_btnimg = "/imgs/btn/kib.png";
				my_btnimg = "/imgs/btn/kib.png";
				my_href = svc_links[i].split("|")[0];
				my_href = svc_links[i].split("|")[0];
				my_popimg = svc_links[i].split("|")[1];
				my_popimg = svc_links[i].split("|")[1];
				my_alt = svc_links[i].split("|")[2];
				my_alt = svc_links[i].split("|")[2];


//				htmout_svc_linkz += '<div  class="drag" name="'+my_alt+'" >\n';
//				htmout_svc_linkz += '<div  class="drag" name="'+my_alt+'" >\n';
				htmout_svc_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
				htmout_svc_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
				htmout_svc_linkz += '<img id="drg" src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
				htmout_svc_linkz += '<img id="drg" src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
//				htmout_svc_linkz += '</div >';
//				htmout_svc_linkz += '</div >';


//				htmout_svc_links += '<div  class="drag" name="'+my_alt+'" >\n';
//				htmout_svc_links += '<div  class="drag" name="'+my_alt+'" >\n';
				htmout_svc_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
				htmout_svc_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
				htmout_svc_links += '<img class="drag" id="drg" src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
				htmout_svc_links += '<img class="drag" id="drg" src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
				htmout_svc_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
				htmout_svc_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
//				htmout_svc_links += '</div >';
//				htmout_svc_links += '</div >';
				}
				}
			if( mode === 'pop' ) {
			if( mode === 'pop' ) {
				htmout_svc_links += "<br><br>\n";
				htmout_svc_links += "<br><br>\n";
				var div_svc_links = document.getElementById('div_svc_links');
				var div_svc_links = document.getElementById('div_svc_links');
				div_svc_links.insertAdjacentHTML('beforeend', htmout_svc_links);
				div_svc_links.insertAdjacentHTML('beforeend', htmout_svc_links);
				return( htmout_svc_links );
				return( htmout_svc_links );
				}
				}


			htmout_svc_linkz += "<br><br>\n";
			htmout_svc_linkz += "<br><br>\n";
			var div_svc_linkz = document.getElementById('div_svc_linkz');
			var div_svc_linkz = document.getElementById('div_svc_linkz');
			div_svc_linkz.insertAdjacentHTML('beforeend', htmout_svc_linkz);
			div_svc_linkz.insertAdjacentHTML('beforeend', htmout_svc_linkz);
			return( htmout_svc_linkz );
			return( htmout_svc_linkz );
			}
			}


		function show_ko_links(mode) {
		function show_ko_links(mode) {
			ko_links = load_ko_links();
			ko_links = load_ko_links();
			htmout_ko_links = "";
			htmout_ko_links = "";
			htmout_ko_linkz = "";
			htmout_ko_linkz = "";
			for (i = 0; i < ko_links.length; i++) {
			for (i = 0; i < ko_links.length; i++) {
				my_btnimg = "/imgs/btn/koeye.png";
				my_btnimg = "/imgs/btn/koeye.png";
				my_href = ko_links[i].split("|")[0];
				my_href = ko_links[i].split("|")[0];
				my_popimg = ko_links[i].split("|")[1];
				my_popimg = ko_links[i].split("|")[1];
				my_alt = ko_links[i].split("|")[2];
				my_alt = ko_links[i].split("|")[2];


				htmout_ko_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
				htmout_ko_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
				htmout_ko_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
				htmout_ko_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';


				htmout_ko_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
				htmout_ko_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
				htmout_ko_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
				htmout_ko_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
				htmout_ko_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
				htmout_ko_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
				}
				}


			if( mode === 'pop' ) {
			if( mode === 'pop' ) {
				htmout_ko_links += "<br><br>";
				htmout_ko_links += "<br><br>";
				var div_ko_links = document.getElementById('div_ko_links');
				var div_ko_links = document.getElementById('div_ko_links');
				div_ko_links.insertAdjacentHTML('beforeend', htmout_ko_links);
				div_ko_links.insertAdjacentHTML('beforeend', htmout_ko_links);
				return( htmout_ko_links );
				return( htmout_ko_links );
				}
				}


			htmout_ko_linkz += "<br><br>";
			htmout_ko_linkz += "<br><br>";
			var div_ko_linkz = document.getElementById('div_ko_linkz');
			var div_ko_linkz = document.getElementById('div_ko_linkz');
			div_ko_linkz.insertAdjacentHTML('beforeend', htmout_ko_linkz);
			div_ko_linkz.insertAdjacentHTML('beforeend', htmout_ko_linkz);
			return( htmout_ko_linkz );
			return( htmout_ko_linkz );
			}
			}




		function show_us_links(mode) {
		function show_us_links(mode) {
			us_links = load_us_links();
			us_links = load_us_links();
			htmout_us_links = "";
			htmout_us_links = "";
			htmout_us_linkz = "";
			htmout_us_linkz = "";
			for (i = 0; i < us_links.length; i++) {
			for (i = 0; i < us_links.length; i++) {
				my_btnimg = "/imgs/btn/koeye.png";
				my_btnimg = "/imgs/btn/koeye.png";
				my_href = us_links[i].split("|")[0];
				my_href = us_links[i].split("|")[0];
				my_popimg = us_links[i].split("|")[1];
				my_popimg = us_links[i].split("|")[1];
				my_alt = us_links[i].split("|")[2];
				my_alt = us_links[i].split("|")[2];


				htmout_us_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
				htmout_us_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
				htmout_us_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
				htmout_us_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';


				htmout_us_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
				htmout_us_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
				htmout_us_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
				htmout_us_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
				htmout_us_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
				htmout_us_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
				}
				}


			if( mode === 'pop' ) {
			if( mode === 'pop' ) {
				htmout_us_links += "<br><br>";
				htmout_us_links += "<br><br>";
				var div_us_links = document.getElementById('div_us_links');
				var div_us_links = document.getElementById('div_us_links');
				div_us_links.insertAdjacentHTML('beforeend', htmout_us_links);
				div_us_links.insertAdjacentHTML('beforeend', htmout_us_links);
				return( htmout_us_links );
				return( htmout_us_links );
				}
				}


			htmout_us_linkz += "<br><br>";
			htmout_us_linkz += "<br><br>";
			var div_us_linkz = document.getElementById('div_us_linkz');
			var div_us_linkz = document.getElementById('div_us_linkz');
			div_us_linkz.insertAdjacentHTML('beforeend', htmout_us_linkz);
			div_us_linkz.insertAdjacentHTML('beforeend', htmout_us_linkz);
			return( htmout_us_linkz );
			return( htmout_us_linkz );
			}
			}














		function show_u_links(mode) {
		function show_u_links(mode) {
			u_links = load_u_links();
			u_links = load_u_links();
			htmout_u_links = "";
			htmout_u_links = "";
			htmout_u_linkz = "";
			htmout_u_linkz = "";
			for (i = 0; i < u_links.length; i++) {
			for (i = 0; i < u_links.length; i++) {
				my_btnimg = "/imgs/btn/koeye.png";
				my_btnimg = "/imgs/btn/koeye.png";
				my_href = u_links[i].split("|")[0];
				my_href = u_links[i].split("|")[0];
				my_popimg = u_links[i].split("|")[1];
				my_popimg = u_links[i].split("|")[1];
				my_alt = u_links[i].split("|")[2];
				my_alt = u_links[i].split("|")[2];


				htmout_u_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
				htmout_u_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
				htmout_u_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
				htmout_u_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';


				htmout_u_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
				htmout_u_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
				htmout_u_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
				htmout_u_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
				htmout_u_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
				htmout_u_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
				}
				}


			if( mode === 'pop' ) {
			if( mode === 'pop' ) {
				htmout_u_links += "<br><br>";
				htmout_u_links += "<br><br>";
				var div_u_links = document.getElementById('div_u_links');
				var div_u_links = document.getElementById('div_u_links');
				div_u_links.insertAdjacentHTML('beforeend', htmout_u_links);
				div_u_links.insertAdjacentHTML('beforeend', htmout_u_links);
				return( htmout_u_links );
				return( htmout_u_links );
				}
				}


			htmout_u_linkz += "<br><br>";
			htmout_u_linkz += "<br><br>";
			var div_u_linkz = document.getElementById('div_u_linkz');
			var div_u_linkz = document.getElementById('div_u_linkz');
			div_u_linkz.insertAdjacentHTML('beforeend', htmout_u_linkz);
			div_u_linkz.insertAdjacentHTML('beforeend', htmout_u_linkz);
			return( htmout_u_linkz );
			return( htmout_u_linkz );
			}
			}






		function show_now_links(mode) {
		function show_now_links(mode) {
			now_links = load_now_links();
			now_links = load_now_links();
			htmout_now_links = "";
			htmout_now_links = "";
			htmout_now_linkz = "";
			htmout_now_linkz = "";
			for (i = 0; i < now_links.length; i++) {
			for (i = 0; i < now_links.length; i++) {
				my_btnimg = "/imgs/btn/koeye.png";
				my_btnimg = "/imgs/btn/koeye.png";
				my_href = now_links[i].split("|")[0];
				my_href = now_links[i].split("|")[0];
				my_popimg = now_links[i].split("|")[1];
				my_popimg = now_links[i].split("|")[1];
				my_alt = now_links[i].split("|")[2];
				my_alt = now_links[i].split("|")[2];


				htmout_now_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
				htmout_now_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
				htmout_now_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
				htmout_now_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';


				htmout_now_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
				htmout_now_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
				htmout_now_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
				htmout_now_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
				htmout_now_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
				htmout_now_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
				}
				}


			if( mode === 'pop' ) {
			if( mode === 'pop' ) {
				htmout_now_links += "<br><br>";
				htmout_now_links += "<br><br>";
				var div_now_links = document.getElementById('div_now_links');
				var div_now_links = document.getElementById('div_now_links');
				div_now_links.insertAdjacentHTML('beforeend', htmout_now_links);
				div_now_links.insertAdjacentHTML('beforeend', htmout_now_links);
				return( htmout_now_links );
				return( htmout_now_links );
				}
				}


			htmout_now_linkz += "<br><br>";
			htmout_now_linkz += "<br><br>";
			var div_now_linkz = document.getElementById('div_now_linkz');
			var div_now_linkz = document.getElementById('div_now_linkz');
			div_now_linkz.insertAdjacentHTML('beforeend', htmout_now_linkz);
			div_now_linkz.insertAdjacentHTML('beforeend', htmout_now_linkz);
			return( htmout_now_linkz );
			return( htmout_now_linkz );
			}
			}


		function show_srv_links(mode) {
		function show_srv_links(mode) {
			srv_links = load_srv_links();
			srv_links = load_srv_links();
			htmout_srv_links = "";
			htmout_srv_links = "";
			htmout_srv_linkz = "";
			htmout_srv_linkz = "";
			for (i = 0; i < srv_links.length; i++) {
			for (i = 0; i < srv_links.length; i++) {
				my_btnimg = "/imgs/btn/kiw.png";
				my_btnimg = "/imgs/btn/kiw.png";
				my_href = srv_links[i].split("|")[0];
				my_href = srv_links[i].split("|")[0];
				my_popimg = srv_links[i].split("|")[1];
				my_popimg = srv_links[i].split("|")[1];
				my_alt = srv_links[i].split("|")[2];
				my_alt = srv_links[i].split("|")[2];


				htmout_srv_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
				htmout_srv_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
				htmout_srv_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
				htmout_srv_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';


				htmout_srv_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
				htmout_srv_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
				htmout_srv_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
				htmout_srv_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
				htmout_srv_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
				htmout_srv_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
				}
				}
			if( mode === 'pop' ) {
			if( mode === 'pop' ) {
				htmout_srv_links += "<br><br>\n"
				htmout_srv_links += "<br><br>\n"
				var div_srv_links = document.getElementById('div_srv_links');
				var div_srv_links = document.getElementById('div_srv_links');
				div_srv_links.insertAdjacentHTML('beforeend', htmout_srv_links);
				div_srv_links.insertAdjacentHTML('beforeend', htmout_srv_links);
				return( htmout_srv_links );
				return( htmout_srv_links );
				}
				}


			htmout_srv_linkz += "<br><br>\n"
			htmout_srv_linkz += "<br><br>\n"
			var div_srv_linkz = document.getElementById('div_srv_linkz');
			var div_srv_linkz = document.getElementById('div_srv_linkz');
			div_srv_linkz.insertAdjacentHTML('beforeend', htmout_srv_linkz);
			div_srv_linkz.insertAdjacentHTML('beforeend', htmout_srv_linkz);
			return( htmout_srv_linkz );
			return( htmout_srv_linkz );
			}
			}


//			document.write( htmout_svc_links );
//			document.write( htmout_svc_links );
//			document.write( htmout_ko_links );
//			document.write( htmout_ko_links );
//			document.write( htmout_srv_links );
//			document.write( htmout_srv_links );


//			var div_ko_links = document.getElementById("div_ko_links");
//			var div_ko_links = document.getElementById("div_ko_links");
//			var div_ko_links_orig = div_ko_links.innerHTML;
//			var div_ko_links_orig = div_ko_links.innerHTML;
//			alert( "BUGS_500 div_ko_links_orig="+div_ko_links_orig );
//			alert( "BUGS_500 div_ko_links_orig="+div_ko_links_orig );


//			div_ko_links.innerHTML = "";
//			div_ko_links.innerHTML = "";
//			div_ko_links.appendChild( htmout_ko_links);
//			div_ko_links.appendChild( htmout_ko_links);




// pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq
// pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq
//
//
// getElementById("foo").insertAdjacentHTML
// getElementById("foo").insertAdjacentHTML
// <!-- beforebegin / before -->
// <!-- beforebegin / before -->
// <p>
// <p>
//   <!-- afterbegin / prepend -->
//   <!-- afterbegin / prepend -->
//   foo
//   foo
//   <!-- beforeend / append -->
//   <!-- beforeend / append -->
// </p>
// </p>
// <!-- afterend / after-->
// <!-- afterend / after-->
//
//
//		document.getElementById('foo').insertAdjacentHTML("beforebegin", "<hr>")
//		document.getElementById('foo').insertAdjacentHTML("beforebegin", "<hr>")
//		$('#foo').before("<hr>")
//		$('#foo').before("<hr>")
//		document.getElementById('foo').insertAdjacentHTML("afterend", "<hr>")
//		document.getElementById('foo').insertAdjacentHTML("afterend", "<hr>")
//		$('#foo').append("<hr>")
//		$('#foo').append("<hr>")
//		document.getElementById('foo').insertAdjacentHTML("beforeend", "<hr>")
//		document.getElementById('foo').insertAdjacentHTML("beforeend", "<hr>")
//		$('#foo').append("<hr>")
//		$('#foo').append("<hr>")
//		document.getElementById('foo').insertAdjacentHTML("afterbegin", "<hr>")
//		document.getElementById('foo').insertAdjacentHTML("afterbegin", "<hr>")
//		$('#foo').prepend("<hr>")
//		$('#foo').prepend("<hr>")
//
//
//	var btn = document.getElementById('btn'); // The button itself with an ID of 'btn'
//	var btn = document.getElementById('btn'); // The button itself with an ID of 'btn'
//	var newButton = '<button>New button</button>'; // New button to be inserted
//	var newButton = '<button>New button</button>'; // New button to be inserted
//	btn.insertAdjacentHTML('afterend', newButton);
//	btn.insertAdjacentHTML('afterend', newButton);
//
//
// bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdb
// bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdb
		function show_all_links(mode) {
		function show_all_links(mode) {
			show_svc_links(mode);
			show_svc_links(mode);
			show_ko_links(mode);
			show_ko_links(mode);
			show_us_links(mode);
			show_us_links(mode);
			show_u_links(mode);
			show_u_links(mode);
			show_now_links(mode);
			show_now_links(mode);
			show_srv_links(mode);
			show_srv_links(mode);
			}
			}


		</script id="script_load_liks" >
		</script id="script_load_liks" >


	<div id="div_links" >
	<div id="div_links" >
		<hr color=red>
		<hr color=red>
		<div id="div_svc_links" > </div>
		<div id="div_svc_links" > </div>
		<hr color=red>
		<hr color=red>
	
	
		<hr color=white>
		<hr color=white>
		<div id="div_ko_links" > </div>
		<div id="div_ko_links" > </div>
		<hr color=white>
		<hr color=white>


		<hr color=white>
		<hr color=white>
		<div id="div_us_links" > </div>
		<div id="div_us_links" > </div>
		<hr color=white>
		<hr color=white>


		<hr color=white>
		<hr color=white>
		<div id="div_u_links" > </div>
		<div id="div_u_links" > </div>
		<hr color=white>
		<hr color=white>


		<hr color=white>
		<hr color=white>
		<div id="div_now_links" > </div>
		<div id="div_now_links" > </div>
		<hr color=white>
		<hr color=white>


		<hr color=blue>
		<hr color=blue>
		<div id="div_srv_links" > </div>
		<div id="div_srv_links" > </div>
		<hr color=blue>
		<hr color=blue>
		</div id="div_links" >
		</div id="div_links" >


	<div id="div_linkz" >
	<div id="div_linkz" >
		<hr color=red>
		<hr color=red>
		<div id="div_svc_linkz" > </div>
		<div id="div_svc_linkz" > </div>
		<hr color=red>
		<hr color=red>


		<hr color=black>
		<hr color=black>
		<div id="div_ko_linkz" > </div>
		<div id="div_ko_linkz" > </div>
		<hr color=black>
		<hr color=black>


		<hr color=black>
		<hr color=black>
		<div id="div_us_linkz" > </div>
		<div id="div_us_linkz" > </div>
		<hr color=black>
		<hr color=black>


		<hr color=black>
		<hr color=black>
		<div id="div_u_linkz" > </div>
		<div id="div_u_linkz" > </div>
		<hr color=black>
		<hr color=black>


		<hr color=black>
		<hr color=black>
		<div id="div_now_linkz" > </div>
		<div id="div_now_linkz" > </div>
		<hr color=black>
		<hr color=black>


		<hr color=blue>
		<hr color=blue>
		<div id="div_srv_linkz" > </div>
		<div id="div_srv_linkz" > </div>
		<hr color=blue>
		<hr color=blue>
		</div id="div_linkz" >
		</div id="div_linkz" >


	<div id="div_cfaa" class=ko>
	<div id="div_cfaa" class=ko>
<!-- -->
<!-- -->


	<script id="script_cfaa">
	<script id="script_cfaa">
		var text_cfaa = 
		var text_cfaa = 
`
`
pqpqpqpqpqpqpqpqpqpq Warning pqpqpqpqpqpqpqpqpqpq<br>
pqpqpqpqpqpqpqpqpqpq Warning pqpqpqpqpqpqpqpqpqpq<br>
<br>
<br>
This site may be protected under the 
This site may be protected under the 
<br>
<br>
<br>
<br>
<b>CFAA</b> 
<b>CFAA</b> 
<br>
<br>
Computer Fraud and Abuse Act 
Computer Fraud and Abuse Act 
<br>
<br>
<br>
<br>
your attemped access has been logged 
your attemped access has been logged 
<br>
<br>
repeated attemps by unauthorized guests will be reported 
repeated attemps by unauthorized guests will be reported 
<br>
<br>
<br>
<br>
By continuing You are acknowledging 
By continuing You are acknowledging 
<br>
<br>
you are fully authorized and 
you are fully authorized and 
<br>
<br>
understand the responsibilites to access the content on the site 
understand the responsibilites to access the content on the site 
<br>
<br>
<br>
<br>
This page must not be removed 
This page must not be removed 
<br>
<br>
bdbdbdbdbdbdbdbdbdbd Warning bdbdbdbdbdbdbdbdbdbd
bdbdbdbdbdbdbdbdbdbd Warning bdbdbdbdbdbdbdbdbdbd
<br>
<br>
<br>
<br>
unauthoriced users should
unauthoriced users should
<br>
<br>
consider browsing elsewhere: 
consider browsing elsewhere: 




<hr color=black>
<hr color=black>
<hr color=ivory>
<hr color=ivory>
<hr color=red>
<hr color=red>
<hr color=blue>
<hr color=blue>
<hr color=ebony>
<hr color=ebony>
<hr color=white>
<hr color=white>


<a href=duckduckgo.com > <img src="ok.png" alt="duckduckgo" height=10 border=0></a>
<a href=duckduckgo.com > <img src="ok.png" alt="duckduckgo" height=10 border=0></a>
&nbsp &nbsp &nbsp
&nbsp &nbsp &nbsp
<a href=bing.com > <img src="ok.png" alt="bing" height=10 border=0></a>
<a href=bing.com > <img src="ok.png" alt="bing" height=10 border=0></a>
&nbsp &nbsp &nbsp
&nbsp &nbsp &nbsp
<a href=google.com > <img src="ok.png" alt="google" height=10 border=0></a>
<a href=google.com > <img src="ok.png" alt="google" height=10 border=0></a>
&nbsp &nbsp &nbsp
&nbsp &nbsp &nbsp
<a href=yahoo.com > <img src="ok.png" alt="yahoo" height=10 border=0></a>
<a href=yahoo.com > <img src="ok.png" alt="yahoo" height=10 border=0></a>
&nbsp &nbsp &nbsp
&nbsp &nbsp &nbsp
	<a href=https://mars.jpl.nasa.gov/msl/multimedia/raw target=_blank>
	<a href=https://mars.jpl.nasa.gov/msl/multimedia/raw target=_blank>
		<img src="ok.png" border=0 height=10>
		<img src="ok.png" border=0 height=10>
		</a>
		</a>
&nbsp &nbsp &nbsp
&nbsp &nbsp &nbsp
	<a href=http://youtube.com target=_blank>
	<a href=http://youtube.com target=_blank>
		<img src="ok.png" border=0 height=10>
		<img src="ok.png" border=0 height=10>
		</a>
		</a>
		</div id="div_cfaa" class=ko>
		</div id="div_cfaa" class=ko>


<hr color=white>
<hr color=white>
<hr color=ebony>
<hr color=ebony>
<hr color=blue>
<hr color=blue>
<hr color=red>
<hr color=red>
<hr color=ivory>
<hr color=ivory>
<hr color=black>
<hr color=black>


	<div id="div_warn2" class=ko> 
	<div id="div_warn2" class=ko> 
		<p id=p_warn2 class=ko>
		<p id=p_warn2 class=ko>
			<hr color=black>
			<hr color=black>
			<hr color=white>
			<hr color=white>
			<hr color=red>
			<hr color=red>
				If you are seeing this page
				If you are seeing this page
				<br>
				<br>
				you are probably unauthorized 
				you are probably unauthorized 
				<br>
				<br>
				you should <b>NOT</b> continue 
				you should <b>NOT</b> continue 
				<br>
				<br>
				accessing site content here may be 
				accessing site content here may be 
				<br>
				<br>
				protected under <b>CFAA</b>
				protected under <b>CFAA</b>
			<hr color=red>
			<hr color=red>
			<hr color=white>
			<hr color=white>
			<hr color=black>
			<hr color=black>
			</p>
			</p>


		authorized sites are available from bluehost 
		authorized sites are available from bluehost 


		<a href="https://www.bluehost.com/?utm_source=%28direct%29&utm_medium=affiliate&utm_campaign=affiliate-link_konet_notype" target=_blank>
		<a href="https://www.bluehost.com/?utm_source=%28direct%29&utm_medium=affiliate&utm_campaign=affiliate-link_konet_notype" target=_blank>
		<img src=/imgs/bh/bh_anim.gif height=30 border=0 alt=bluehost.com affiliate></a>
		<img src=/imgs/bh/bh_anim.gif height=30 border=0 alt=bluehost.com affiliate></a>
		<div id=kobh_offer class=ko>
		<div id=kobh_offer class=ko>
			bluehost offers 
			bluehost offers 
			50 gb space 
			50 gb space 
			999 gb bandwidth 
			999 gb bandwidth 


			6 domains on 1 account 
			6 domains on 1 account 
			and more for only $6.95/month 
			and more for only $6.95/month 
			</div>
			</div>
		</div id="div_warn2" class=ko> 
		</div id="div_warn2" class=ko> 




	<script id="script_url">
	<script id="script_url">
		var url = document.createElement("a");
		var url = document.createElement("a");
		url.href=location.href
		url.href=location.href
		var output = "output"
		var output = "output"
		url.pathname = url.pathname.replace(/(^\/?)/,"/");
		url.pathname = url.pathname.replace(/(^\/?)/,"/");
//		alert(location.href)
//		alert(location.href)
//		alert(url.protocol)
//		alert(url.protocol)
//		alert(url.hostname)
//		alert(url.hostname)
//		alert(url.pathname)
//		alert(url.pathname)
//		alert(url.search)
//		alert(url.search)
//		alert(url.hash)
//		alert(url.hash)


		if( url.search == "" ) {document.write( text_cfaa );}
		if( url.search == "" ) {document.write( text_cfaa );}
		if( url.search == "?q=cfaa" ) {document.write( text_cfaa ); }
		if( url.search == "?q=cfaa" ) {document.write( text_cfaa ); }
		</script id="script_url">
		</script id="script_url">
		</div>
		</div>






<!--
<!--
		<iframe id="myframe" src="/svc/kokbdm/index.html" width="1000" height="500"
		<iframe id="myframe" src="/svc/kokbdm/index.html" width="1000" height="500"
        		frameborder="0" scrolling="yes"></iframe>
        		frameborder="0" scrolling="yes"></iframe>
	-->
	-->


	<hr color=red><hr color=black><hr color=white>
	<hr color=red><hr color=black><hr color=white>
	        <button type="button" onclick="show_all_links('pop')">show_all_links</button>
	        <button type="button" onclick="show_all_links('pop')">show_all_links</button>
<!--		<button type="button" id="upload" value="Upload" onclick="Upload()">upload</button> -->
<!--		<button type="button" id="upload" value="Upload" onclick="Upload()">upload</button> -->
	<hr color=red><hr color=white><hr color=blue>
	<hr color=red><hr color=white><hr color=blue>
	        <button type="button" onclick="show_svc_links('pop')">show_svc_links</button>
	        <button type="button" onclick="show_svc_links('pop')">show_svc_links</button>
	        <button type="button" onclick="show_ko_links('pop')">show_ko_links</button>
	        <button type="button" onclick="show_ko_links('pop')">show_ko_links</button>
	        <button type="button" onclick="show_us_links('pop')">show_us_links</button>
	        <button type="button" onclick="show_us_links('pop')">show_us_links</button>
	        <button type="button" onclick="show_u_links('pop')">show_u_links</button>
	        <button type="button" onclick="show_u_links('pop')">show_u_links</button>
	        <button type="button" onclick="show_now_links('pop')">show_now_links</button>
	        <button type="button" onclick="show_now_links('pop')">show_now_links</button>
	        <button type="button" onclick="show_srv_links('pop')">show_srv_links</button>
	        <button type="button" onclick="show_srv_links('pop')">show_srv_links</button>
	<hr color=blue><hr color=white><hr color=black>
	<hr color=blue><hr color=white><hr color=black>


<!--
<!--
	<img src="/imgs/btn/kib.png" height="50" size="150" alt="koeye" onclick="show_svc_links()"> 
	<img src="/imgs/btn/kib.png" height="50" size="150" alt="koeye" onclick="show_svc_links()"> 
        <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_ko_links()"> 
        <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_ko_links()"> 
        <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_us_links()"> 
        <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_us_links()"> 
        <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_u_links()"> 
        <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_u_links()"> 
        <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_now_links()"> 
        <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_now_links()"> 
        <img src="/imgs/btn/kiw.png" height="50" size="150" alt="koeyew" onclick="show_srv_links()">
        <img src="/imgs/btn/kiw.png" height="50" size="150" alt="koeyew" onclick="show_srv_links()">
	-->
	-->


	<div id="div_kobuttons">
	<div id="div_kobuttons">
	<a href=# class="popover" onclick="show_svc_links();">
	<a href=# class="popover" onclick="show_svc_links();">
	        <img src="/imgs/btn/kib.png" height="100" width="200" alt="koeyew" >
	        <img src="/imgs/btn/kib.png" height="100" width="200" alt="koeyew" >
	        <span><img src="/imgs/btn/kiw.png" height="100" width="200" alt="koeyew" ></span>
	        <span><img src="/imgs/btn/kiw.png" height="100" width="200" alt="koeyew" ></span>
		</a>
		</a>


	<a href=# class="popover" onclick="show_ko_links();">
	<a href=# class="popover" onclick="show_ko_links();">
        	<img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" > 
        	<img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" > 
        	<span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
        	<span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
		</a>
		</a>


	<a href=# class="popover" onclick="show_us_links();">
	<a href=# class="popover" onclick="show_us_links();">
        	<img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" > 
        	<img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" > 
        	<span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
        	<span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
		</a>
		</a>


	<a href=# class="popover" onclick="show_u_links();">
	<a href=# class="popover" onclick="show_u_links();">
        	<img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" > 
        	<img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" > 
        	<span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
        	<span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
		</a>
		</a>


	<a href=# class="popover" onclick="show_now_links();">
	<a href=# class="popover" onclick="show_now_links();">
        	<img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" > 
        	<img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" > 
        	<span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
        	<span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
		</a>
		</a>


	<a href=# class="popover" onclick="show_srv_links();">
	<a href=# class="popover" onclick="show_srv_links();">
	        <img src="/imgs/btn/kiw.png" height="100" width="200" alt="koeyew" >
	        <img src="/imgs/btn/kiw.png" height="100" width="200" alt="koeyew" >
	        <span><img src="/imgs/btn/kib.png" height="100" width="200" alt="koeyew" ></span>
	        <span><img src="/imgs/btn/kib.png" height="100" width="200" alt="koeyew" ></span>
		</a>
		</a>
		</div id="div_kobuttons">
		</div id="div_kobuttons">


	<hr color=blue><hr color=white><hr color=red>
	<hr color=blue><hr color=white><hr color=red>


<!--
<!--
		<div id="div_drop">
		<div id="div_drop">
			<span id="sw"><h1>drop jtfinc</h2></span>
			<span id="sw"><h1>drop jtfinc</h2></span>
			<a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
			<a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
				<img height=200 width=300
				<img height=200 width=300
				src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
				src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
				</a>
				</a>
			<div id="div_drop">
			<div id="div_drop">
	-->
	-->
	<hr color=red>
	<hr color=red>
	<hr color=white>
	<hr color=white>
	<hr color=blue>
	<hr color=blue>


		<div id="div_drag" >
		<div id="div_drag" >
			<a class="popover" href="/?q=bigtn_drag1">
			<a class="popover" href="/?q=bigtn_drag1">
				<img src="/imgs/btn/koeye.png" alt="ko.png" width="50px" height="25px" border="0" id="drag" class="drg">
				<img src="/imgs/btn/koeye.png" alt="ko.png" width="50px" height="25px" border="0" id="drag" class="drg">
				<span> <img src="/imgs/btn/koeye_handhi.gif" alt="index_drag" class="drg" id="drag"> </span>
				<span> <img src="/imgs/btn/koeye_handhi.gif" alt="index_drag" class="drg" id="drag"> </span>
				</a>
				</a>
			</div id="div_drag" >
			</div id="div_drag" >






	<div id="div_drop_zm">
	<div id="div_drop_zm">
		<span id="sw"><h3>droptop</h3></span>
		<span id="sw"><h3>droptop</h3></span>
		<a class="thumbnail" href=/index_vu.html?zmid=/zm/komap target=_blank>
		<a class="thumbnail" href=/index_vu.html?zmid=/zm/komap target=_blank>
			<img height=200 src="/zm/komap/TileGroup0/0-0-0.jpg" border=0 >
			<img height=200 src="/zm/komap/TileGroup0/0-0-0.jpg" border=0 >
			<span><img height=400 src="/zm/komap/TileGroup0/0-0-0.jpg" border=0 ></span>
			<span><img height=400 src="/zm/komap/TileGroup0/0-0-0.jpg" border=0 ></span>
				</a>
				</a>
		</div id="div_drop_zm">
		</div id="div_drop_zm">




	<div id="div_drag_main"> drag:<br />
	<div id="div_drag_main"> drag:<br />
			<img class="drg" src="/images/jtf/jtf_takes/jtf29_eagle_north.png" alt="jtf29_eagle_north" width="50" class="drg"/>
			<img class="drg" src="/images/jtf/jtf_takes/jtf29_eagle_north.png" alt="jtf29_eagle_north" width="50" class="drg"/>


		<div class="drg"><h1>konet llc </h1>
		<div class="drg"><h1>konet llc </h1>
			<pre>timesak skwii</pre>
			<pre>timesak skwii</pre>
			<img class="drg" src="/imgs/links/keyeb.png" alt="keyeb.png" width="50" >
			<img class="drg" src="/imgs/links/keyeb.png" alt="keyeb.png" width="50" >
			<img class="drg" src="/imgs/links/keyw.png" alt="keyew.png" width="50" >
			<img class="drg" src="/imgs/links/keyw.png" alt="keyew.png" width="50" >
			<pre>timesak skwii</pre>
			<pre>timesak skwii</pre>
			</div>
			</div>


		<div class="drg"><h3>jtf29 </h3>
		<div class="drg"><h3>jtf29 </h3>
			<a href=/ko_jtf/zm/jtf_parcels/jtf29.html target=_blank>
			<a href=/ko_jtf/zm/jtf_parcels/jtf29.html target=_blank>
				<img height=200 width=100 src="/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.png" border=0 >
				<img height=200 width=100 src="/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.png" border=0 >
				</a>
				</a>
			</div>
			</div>




		<div class="drg"><h3>dogheads</h3>
		<div class="drg"><h3>dogheads</h3>
			<div id="div_jtf_vid5">
			<div id="div_jtf_vid5">
				<video controls="controls_jtf5" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index4_mp4.png">
				<video controls="controls_jtf5" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index4_mp4.png">
				<source src="/ko_jtf/kb/v/doghead_video.mp4" type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">
				<source src="/ko_jtf/kb/v/doghead_video.mp4" type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">
				</video>
				</video>
				</div>
				</div>
			</div>
			</div>


		<div class="drg"><h3>jtfdc night court lights action 3720</h3>
		<div class="drg"><h3>jtfdc night court lights action 3720</h3>
			<div id="div_vid">
			<div id="div_vid">
				<video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index_mp4.png">
				<video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index_mp4.png">
					<source src="index.mp4" type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">
					<source src="index.mp4" type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">
					<source src="index.webm" type="video/webm;codecs=&quot;vp8, vorbis&quot;">
					<source src="index.webm" type="video/webm;codecs=&quot;vp8, vorbis&quot;">
					</video>
					</video>
				</div>
				</div>
			</div>
			</div>


		<div class="drg"><h3>vid1: </h3>
		<div class="drg"><h3>vid1: </h3>
			<div id="div_vid1">
			<div id="div_vid1">
				<video controls="controls" defaultmuted="" muted="true" style="width:320;height:180;" poster="index1_mp4.png">
				<video controls="controls" defaultmuted="" muted="true" style="width:320;height:180;" poster="index1_mp4.png">
					<source src="index1.mp4" type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">
					<source src="index1.mp4" type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">
					<source src="index1.webm" type="video/webm;codecs=&quot;vp8, vorbis&quot;">
					<source src="index1.webm" type="video/webm;codecs=&quot;vp8, vorbis&quot;">
					</video>
					</video>
				</div>
				</div>
			</div>
			</div>


		<div class="drg"><h3>vid2_avril</h3>
		<div class="drg"><h3>vid2_avril</h3>
			<div id="div_vid2_avril">
			<div id="div_vid2_avril">
				<video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index2_mp4.png">
				<video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index2_mp4.png">
					<source src="index2.mp4" type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">
					<source src="index2.mp4" type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">
					<source src="index2.webm" type="video/webm;codecs=&quot;vp8, vorbis&quot;">
					<source src="index2.webm" type="video/webm;codecs=&quot;vp8, vorbis&quot;">
					</video>
					</video>
				</div>
				</div>
			</div>
			</div>


		<div class="drg"><h3>vid3_jtfinc_dogpatrol_tresspass</h3>
		<div class="drg"><h3>vid3_jtfinc_dogpatrol_tresspass</h3>
			<div id="div_vid3">
			<div id="div_vid3">
				<video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index3_mp4.png">
				<video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index3_mp4.png">
					<source src="index3.mp4" type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">
					<source src="index3.mp4" type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">
					<source src="index3.webm" type="video/webm;codecs=&quot;vp8, vorbis&quot;">
					<source src="index3.webm" type="video/webm;codecs=&quot;vp8, vorbis&quot;">
					</video>
					</video>
				</div>
				</div>
			</div>
			</div>




		 <div class="drg">konet llc 
		 <div class="drg">konet llc 
 			<img src="/imgs/btn/kob.png" alt="ko.png" width="50" class="drg" />
 			<img src="/imgs/btn/kob.png" alt="ko.png" width="50" class="drg" />


			</div>
			</div>
		</div id="div_drag_main"> 
		</div id="div_drag_main"> 




	<hr color=yellow>
	<hr color=yellow>
	<hr color=white>
	<hr color=white>
	<hr color=yellow>
	<hr color=yellow>


	<div id="div_neave_im" >
	<div id="div_neave_im" >
		<iframe frameborder='0' height='250'  marginheight='0' marginwidth='0' scrolling='no' 
		<iframe frameborder='0' height='250'  marginheight='0' marginwidth='0' scrolling='no' 
			src='/index_neave_im.html'
			src='/index_neave_im.html'
			style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
			style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
			</iframe>
			</iframe>
		<a class="popover" href="/index_neave_im.html"  target=_blank>
		<a class="popover" href="/index_neave_im.html"  target=_blank>
			<img height=50 width=1600 src="/imgs/links/index_neave_im.png" alt="index_neave_im"  border=0>
			<img height=50 width=1600 src="/imgs/links/index_neave_im.png" alt="index_neave_im"  border=0>
			<span><img height=50 width=1600 src="/imgs/links/index_neave_im_pop.png" border=0></span>
			<span><img height=50 width=1600 src="/imgs/links/index_neave_im_pop.png" border=0></span>
			</a>
			</a>
		</div id="div_neave_im" >
		</div id="div_neave_im" >


	<div id="div_iframe" height-"150" >
	<div id="div_iframe" height-"150" >
		</div id="div_ifram" >
		</div id="div_ifram" >


	<div id="div_neave_wobble" >
	<div id="div_neave_wobble" >
			
			
		<a class="popover" href="/index_neave_wobble.html" target=_blank>
		<a class="popover" href="/index_neave_wobble.html" target=_blank>
			<img height=50 width=1600 src="/imgs/links/index_neave_wobble.png" alt="index_neave_wobble"  border=0>
			<img height=50 width=1600 src="/imgs/links/index_neave_wobble.png" alt="index_neave_wobble"  border=0>
			<span><img  height=50 width=1600 src="/imgs/links/index_neave_wobble_pop.png" border=0></span>
			<span><img  height=50 width=1600 src="/imgs/links/index_neave_wobble_pop.png" border=0></span>
			</a>
			</a>
		<iframe frameborder='0' height='150' marginheight='0' marginwidth='0' scrolling='no' 
		<iframe frameborder='0' height='150' marginheight='0' marginwidth='0' scrolling='no' 
			src='/index_neave_wobble.html' 
			src='/index_neave_wobble.html' 
			style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
			style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
			</iframe>
			</iframe>
		</div id="div_neave_wobble" >
		</div id="div_neave_wobble" >








	<div id="div_files" >
	<div id="div_files" >
		<output id="zonelist"></output>
		<output id="zonelist"></output>
		<div id="dropzone">
		<div id="dropzone">
			dropzone
			dropzone
			<div id="div_canvas" style="position:relative; width:400px; height:200px background:white">
			<div id="div_canvas" style="position:relative; width:400px; height:200px background:white">
				<canvas id="canvas_dropzone" style="z-index: 1;
				<canvas id="canvas_dropzone" style="z-index: 1;
					position:absolute;
					position:absolute;
					left:0px;
					left:0px;
					top:0px;
					top:0px;
					" height="100px" width="200" background-color="darkSlategrey" color="ivory">
					" height="100px" width="200" background-color="darkSlategrey" color="ivory">
					WARN_1387 unauthorized access has been logged
					WARN_1387 unauthorized access has been logged
					</canvas>
					</canvas>
		</div id="div_files" >
		</div id="div_files" >


		<script id="scrip_fileselect"  name="script_fileselect">
		<script id="scrip_fileselect"  name="script_fileselect">
			function handleFileSelect(evt) {
			function handleFileSelect(evt) {
				evt.stopPropagation();
				evt.stopPropagation();
				evt.preventDefault();
				evt.preventDefault();


				var files = evt.dataTransfer.files; // FileList object.
				var files = evt.dataTransfer.files; // FileList object.


// files is a FileList of File objects. List some properties.
// files is a FileList of File objects. List some properties.
    var output = [];
    var output = [];
    for (var i = 0, f; f = files[i]; i++) {
    for (var i = 0, f; f = files[i]; i++) {
      output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
      output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
                  f.size, ' bytes, last modified: ',
                  f.size, ' bytes, last modified: ',
                  f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                  f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                  '</li>');
                  '</li>');
    }
    }
    document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
    document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
  }
  }


  function handleDragOver(evt) {
  function handleDragOver(evt) {
    evt.stopPropagation();
    evt.stopPropagation();
    evt.preventDefault();
    evt.preventDefault();
    evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
    evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
  }
  }


  // Setup the dnd listeners.
  // Setup the dnd listeners.
  var dropZone = document.getElementById('dropzone');
  var dropZone = document.getElementById('dropzone');
  dropZone.addEventListener('dragover', handleDragOver, false);
  dropZone.addEventListener('dragover', handleDragOver, false);
  dropZone.addEventListener('drop', handleFileSelect, false);
  dropZone.addEventListener('drop', handleFileSelect, false);
		</script id="scrip_fileselect"  name="script_fileselect">
		</script id="scrip_fileselect"  name="script_fileselect">


<hr><hr><hr>
<hr><hr><hr>
	<div id="div_zonelist">
	<div id="div_zonelist">
		<label class="fileContainer">
		<label class="fileContainer">
			files
			files
			<input id="files" name="files[]" multiple="" type="file">
			<input id="files" name="files[]" multiple="" type="file">
			</label>
			</label>
		<output id="zonelist"></output>
		<output id="zonelist"></output>
		<div id="div_zonelist">
		<div id="div_zonelist">


	<script id="script_hfileselect" >
	<script id="script_hfileselect" >
  function handleFileSelect(evt) {
  function handleFileSelect(evt) {
    var files = evt.target.files; // FileList object
    var files = evt.target.files; // FileList object


    // files is a FileList of File objects. List some properties.
    // files is a FileList of File objects. List some properties.
    var output = [];
    var output = [];
    for (var i = 0, f; f = files[i]; i++) {
    for (var i = 0, f; f = files[i]; i++) {
      output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
      output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
                  f.size, ' bytes, last modified: ',
                  f.size, ' bytes, last modified: ',
                  f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                  f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                  '</li>');
                  '</li>');
    }
    }
    document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
    document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
  }
  }


	  document.getElementById('files').addEventListener('change', handleFileSelect, false);
	  document.getElementById('files').addEventListener('change', handleFileSelect, false);
	</script id="script_hfileselect" >
	</script id="script_hfileselect" >


	<div id="div_files2" hidden >
	<div id="div_files2" hidden >
		<label class="fileContainer">
		<label class="fileContainer">
			files2
			files2
			<input id="files" name="files[]" multiple="" type="file">
			<input id="files" name="files[]" multiple="" type="file">
			</label>
			</label>
		<output id="zonelist"></output>
		<output id="zonelist"></output>
		</div id="div_files2" hidden >
		</div id="div_files2" hidden >


	<script id="script_hfileselect2" >
	<script id="script_hfileselect2" >
  function handleFileSelect(evt) {
  function handleFileSelect(evt) {
    var files = evt.target.files; // FileList object
    var files = evt.target.files; // FileList object


    // Loop through the FileList and render image files as thumbnails.
    // Loop through the FileList and render image files as thumbnails.
    for (var i = 0, f; f = files[i]; i++) {
    for (var i = 0, f; f = files[i]; i++) {


// Only process image files.
// Only process image files.
	if (!f.type.match('image.*')) { continue; }
	if (!f.type.match('image.*')) { continue; }


      var reader = new FileReader();
      var reader = new FileReader();


      // Closure to capture the file information.
      // Closure to capture the file information.
      reader.onload = (function(theFile) {
      reader.onload = (function(theFile) {
        return function(e) {
        return function(e) {
          // Render thumbnail.
          // Render thumbnail.
          var span = document.createElement('span');
          var span = document.createElement('span');
          span.innerHTML = ['<img class="thumb" src="', e.target.result,
          span.innerHTML = ['<img class="thumb" src="', e.target.result,
                            '" title="', escape(theFile.name), '"/>'].join('');
                            '" title="', escape(theFile.name), '"/>'].join('');
          document.getElementById('zonelist').insertBefore(span, null);
          document.getElementById('zonelist').insertBefore(span, null);
        };
        };
      })(f);
      })(f);


      // Read in the image file as a data URL.
      // Read in the image file as a data URL.
      reader.readAsDataURL(f);
      reader.readAsDataURL(f);
    }
    }
  }
  }


  document.getElementById('files').addEventListener('change', handleFileSelect, false);
  document.getElementById('files').addEventListener('change', handleFileSelect, false);
		</script id="script_hfileselect2" >
		</script id="script_hfileselect2" >


	<script id="script_previewfile">
	<script id="script_previewfile">
			function previewfile(file) {
			function previewfile(file) {
				if (tests.filereader === true && acceptedTypes[file.type] === true) {
				if (tests.filereader === true && acceptedTypes[file.type] === true) {
					var reader = new FileReader();
					var reader = new FileReader();
					reader.onload = function (event) {
					reader.onload = function (event) {
						var image = new Image();
						var image = new Image();
						image.src = event.target.result;
						image.src = event.target.result;
						image.width = 250; // a fake resize
						image.width = 250; // a fake resize
						holder.appendChild(image);
						holder.appendChild(image);
						};
						};


					reader.readAsDataURL(file);
					reader.readAsDataURL(file);
					}  
					}  
				else {
				else {
					holder.innerHTML += 
					holder.innerHTML += 
						'<p>done:  koupload' 
						'<p>done:  koupload' 
							+ file.name 
							+ file.name 
							+ ' ' 
							+ ' ' 
							+ (file.size ? (file.size/1024|0) + 'K' : ''); 
							+ (file.size ? (file.size/1024|0) + 'K' : ''); 
						console.log(file);
						console.log(file);
					}
					}
				}
				}


			function readfiles(files) {
			function readfiles(files) {
				debugger;
				debugger;
				var formData = tests.formdata ? new FormData() : null;
				var formData = tests.formdata ? new FormData() : null;
				for (var i = 0; i < files.length; i++) {
				for (var i = 0; i < files.length; i++) {
					if (tests.formdata) formData.append('file', files[i]);
					if (tests.formdata) formData.append('file', files[i]);
					previewfile(files[i]);
					previewfile(files[i]);
					}
					}


// now post a new XHR request
// now post a new XHR request
				if (tests.formdata) {
				if (tests.formdata) {
					var xhr = new XMLHttpRequest();
					var xhr = new XMLHttpRequest();
					xhr.open('POST', 'http://ka6/ko/bin/php/ko.php?ko=ajax,upload,filenames,phpi,ok');
					xhr.open('POST', 'http://ka6/ko/bin/php/ko.php?ko=ajax,upload,filenames,phpi,ok');
//					xhr.open('POST', 'ka6/ko/bin/php/index.php?q=upload,filenames');
//					xhr.open('POST', 'ka6/ko/bin/php/index.php?q=upload,filenames');
					xhr.onload = function() {
					xhr.onload = function() {
						progress.value = progress.innerHTML = 100;
						progress.value = progress.innerHTML = 100;
						};
						};


				if (tests.progress) {
				if (tests.progress) {
					xhr.upload.onprogress = function (event) {
					xhr.upload.onprogress = function (event) {
						if (event.lengthComputable) {
						if (event.lengthComputable) {
							var complete = (event.loaded / event.total * 100 | 0);
							var complete = (event.loaded / event.total * 100 | 0);
							progress.value = progress.innerHTML = complete;
							progress.value = progress.innerHTML = complete;
							}
							}
						}
						}
					}
					}


				xhr.send(formData);
				xhr.send(formData);
				}
				}
			}
			}


			if (tests.dnd) { 
			if (tests.dnd) { 
				holder.ondragover = function () { this.className = 'hover'; return false; };
				holder.ondragover = function () { this.className = 'hover'; return false; };
				holder.ondragend = function () { this.className = ''; return false; };
				holder.ondragend = function () { this.className = ''; return false; };
				holder.ondrop = function (e) {
				holder.ondrop = function (e) {
					this.className = '';
					this.className = '';
					e.preventDefault();
					e.preventDefault();
					readfiles(e.dataTransfer.files);
					readfiles(e.dataTransfer.files);
					}
					}
				} 
				} 
			else {
			else {
				fileupload.className = 'hidden';
				fileupload.className = 'hidden';
				fileupload.querySelector('input').onchange = function () {
				fileupload.querySelector('input').onchange = function () {
				readfiles(this.files);
				readfiles(this.files);
				};
				};
			}
			}
		</script id="script_previewfile">
		</script id="script_previewfile">


	<script id="script_myfilework>
	<script id="script_myfilework>
		funtion myfilework( j, file ) {
		funtion myfilework( j, file ) {


			alert( j+" file="+file );
			alert( j+" file="+file );
			}
			}


		</script id="script_myfilework>
		</script id="script_myfilework>










		<script id="script_upload_input">>
		<script id="script_upload_input">>
			var upload = document.getElementsByTagName('input')[0],
			var upload = document.getElementsByTagName('input')[0],
			holder2 = document.getElementById('holder2'),
			holder2 = document.getElementById('holder2'),
			state = document.getElementById('status');
			state = document.getElementById('status');


			if (typeof window.FileReader === 'undefined') {
			if (typeof window.FileReader === 'undefined') {
				state.className = 'fail';
				state.className = 'fail';
				} 
				} 
			else {
			else {
				state.className = 'success';
				state.className = 'success';
				state.innerHTML = 'File API & FileReader available';
				state.innerHTML = 'File API & FileReader available';
				}
				}
 
 
			upload.onchange = function (e) {
			upload.onchange = function (e) {
				e.preventDefault();
				e.preventDefault();


				var file = upload.files[0],
				var file = upload.files[0],
				reader = new FileReader();
				reader = new FileReader();
				reader.onload = function (event) {
				reader.onload = function (event) {
					var img = new Image();
					var img = new Image();
					img.src = event.target.result;
					img.src = event.target.result;
// note: no onload required since we've got the dataurl...I think! :)
// note: no onload required since we've got the dataurl...I think! :)
					if (img.width > 560) { // holder width
					if (img.width > 560) { // holder width
						img.width = 560;
						img.width = 560;
						}
						}
					holder2.innerHTML = '';
					holder2.innerHTML = '';
					holder.appendChild(img);
					holder.appendChild(img);
					};
					};
				reader.readAsDataURL(file);
				reader.readAsDataURL(file);


				return false;
				return false;
				};
				};


//			var formData = new FormData();
//			var formData = new FormData();
//			formData.append("part_num", "123ABC"); 
//			formData.append("part_num", "123ABC"); 
//			formData.append("part_price", 7.95);
//			formData.append("part_price", 7.95);
//				formData.append("part_image", somefile)
//				formData.append("part_image", somefile)
//
//
//			var xhr = new XMLHttpRequest();
//			var xhr = new XMLHttpRequest();
//			xhr.open("POST", "http://ka6/ko/bin/php/ko.php?ko=ajax,upload/");  
//			xhr.open("POST", "http://ka6/ko/bin/php/ko.php?ko=ajax,upload/");  
//			xhr.send(formData);
//			xhr.send(formData);
			</script id="script_upload_input">>
			</script id="script_upload_input">>


	<canvas id="canvas_1" color="darkSlategrey" height="100" width="400">
	<canvas id="canvas_1" color="darkSlategrey" height="100" width="400">
		</canvas id="canvas_1" >
		</canvas id="canvas_1" >




	<script id="script_canvas_1" >
	<script id="script_canvas_1" >
		var canvas = document.getElementsByTagName('canvas_1')[0],
		var canvas = document.getElementsByTagName('canvas_1')[0],
    ctx = null,
    ctx = null,
    grad = null,
    grad = null,
    body = document.getElementsByTagName('body')[0],
    body = document.getElementsByTagName('body')[0],
    color = 255;
    color = 255;
    color = lightblue;
    color = lightblue;
    
    
if (canvas.getContext('2d')) {
if (canvas.getContext('2d')) {
  ctx = canvas.getContext('2d');
  ctx = canvas.getContext('2d');
  ctx.clearRect(0, 0, 600, 600);
  ctx.clearRect(0, 0, 600, 600);
  ctx.save();
  ctx.save();


// Create radial gradient
// Create radial gradient
//  grad = ctx.createRadialGradient(0,0,0,0,0,600); 
//  grad = ctx.createRadialGradient(0,0,0,0,0,600); 
//  grad.addColorStop(0, '#000');
//  grad.addColorStop(0, '#000');
//  grad.addColorStop(1, 'rgb(' + color + ', ' + color + ', ' + color + ')');
//  grad.addColorStop(1, 'rgb(' + color + ', ' + color + ', ' + color + ')');


  // assign gradients to fill
  // assign gradients to fill
//  ctx.fillStyle = grad;
//  ctx.fillStyle = grad;
	ctx.fillstyle = "lightblue";
	ctx.fillstyle = "lightblue";


  // draw 600x600 fill
  // draw 600x600 fill
  ctx.fillRect(0,0,600,600);
  ctx.fillRect(0,0,600,600);
  ctx.save();
  ctx.save();
  
  
  body.onmousemove = function (event) {
  body.onmousemove = function (event) {
    var width = window.innerWidth, 
    var width = window.innerWidth, 
        height = window.innerHeight, 
        height = window.innerHeight, 
        x = event.clientX, 
        x = event.clientX, 
        y = event.clientY,
        y = event.clientY,
        rx = 600 * x / width,
        rx = 600 * x / width,
        ry = 600 * y / height;
        ry = 600 * y / height;
        
        
    var xc = ~~(256 * x / width);
    var xc = ~~(256 * x / width);
    var yc = ~~(256 * y / height);
    var yc = ~~(256 * y / height);


    grad = ctx.createRadialGradient(rx, ry, 0, rx, ry, 600); 
    grad = ctx.createRadialGradient(rx, ry, 0, rx, ry, 600); 
    grad.addColorStop(0, '#000');
    grad.addColorStop(0, '#000');
    grad.addColorStop(1, ['rgb(', xc, ', ', (255 - xc), ', ', yc, ')'].join(''));
    grad.addColorStop(1, ['rgb(', xc, ', ', (255 - xc), ', ', yc, ')'].join(''));
    // ctx.restore();
    // ctx.restore();
//    ctx.fillStyle = grad;
//    ctx.fillStyle = grad;
	ctx.fillstyle="lightblue";
	ctx.fillstyle="lightblue";
    ctx.fillRect(0,0,600,600);
    ctx.fillRect(0,0,600,600);
    // ctx.save();
    // ctx.save();
  };
  };
}
}
		</script id="script_canvas_1" >
		</script id="script_canvas_1" >


	<div id="div_csv"><h3></h3>
	<div id="div_csv"><h3></h3>
		</div id="div_csv">
		</div id="div_csv">
	
	
	<script id="script_upload"  type="text/javascript">
	<script id="script_upload"  type="text/javascript">
//		function upload_csv() {
//		function upload_csv() {
		function Upload() {
		function Upload() {
//			var files = evt.dataTransfer.files; // FileList object.
//			var files = evt.dataTransfer.files; // FileList object.
//			var fileUpload = document.getElementById("upload_files");
//			var fileUpload = document.getElementById("upload_files");
			var fileUpload = document.getElementById("fileUpload");
			var fileUpload = document.getElementById("fileUpload");
			var regex = /^([a-zA-Z0-9\s_\\.\-:])+(.csv|.txt|.psv|.py|.htm|.html|.php)$/;
			var regex = /^([a-zA-Z0-9\s_\\.\-:])+(.csv|.txt|.psv|.py|.htm|.html|.php)$/;
//			if (regex.test(fileUpload.value.toLowerCase())) {
//			if (regex.test(fileUpload.value.toLowerCase())) {
			if (regex.test(fileUpload.value.toLowerCase())) {
			if (regex.test(fileUpload.value.toLowerCase())) {
				if (typeof (FileReader) != "undefined") {
				if (typeof (FileReader) != "undefined") {
					var reader = new FileReader();
					var reader = new FileReader();
					reader.onload = function (e) {
					reader.onload = function (e) {
						var table = document.createElement("table");
						var table = document.createElement("table");
						var rows = e.target.result.split("\n");
						var rows = e.target.result.split("\n");
						for (var i = 0; i < rows.length; i++) {
						for (var i = 0; i < rows.length; i++) {
							var row = table.insertRow(-1);
							var row = table.insertRow(-1);
					
					
//							var cells = rows[i].split("|");
//							var cells = rows[i].split("|");
							var cells = rows[i].split(",");
							var cells = rows[i].split(",");
							for (var j = 0; j < cells.length; j++) {
							for (var j = 0; j < cells.length; j++) {
								var cell = row.insertCell(-1);
								var cell = row.insertCell(-1);
								cell.innerHTML = cells[j];
								cell.innerHTML = cells[j];
								}
								}
							}
							}
						var csv2tbl = document.getElementById("csv2tbl");
						var csv2tbl = document.getElementById("csv2tbl");
						csv2tbl.innerHTML = "";
						csv2tbl.innerHTML = "";
						csv2tbl.appendChild(table);
						csv2tbl.appendChild(table);
						}
						}
					reader.readAsText(fileUpload.files[0]);
					reader.readAsText(fileUpload.files[0]);
					file_csv=fileUpload.files[0];
					file_csv=fileUpload.files[0];
					file_csvlen = fileUpload.files.length;
					file_csvlen = fileUpload.files.length;
					alert( "BUGS_4390 CSV file_csvlen="+file_csvlen+" file_csv="+file_csv );
					alert( "BUGS_4390 CSV file_csvlen="+file_csvlen+" file_csv="+file_csv );
					load_file_csv(file_csv);
					load_file_csv(file_csv);
					} 
					} 
				else {
				else {
					alert("csv2tbl warn:  unauthorized access noted");
					alert("csv2tbl warn:  unauthorized access noted");
					}
					}
				} 
				} 
			else {
			else {
				alert("csv2tbl fail:  unsuppoted format");
				alert("csv2tbl fail:  unsuppoted format");
				}
				}
			}
			}
		</script id="script_upload"  type="text/javascript">
		</script id="script_upload"  type="text/javascript">


	<script id="script_load_file_csv">
	<script id="script_load_file_csv">
		function load_file_csv(file_csv) {
		function load_file_csv(file_csv) {
			alert( "BUGS_4400 load_file_csv file_csv="+file_csv" );
			alert( "BUGS_4400 load_file_csv file_csv="+file_csv" );
			file_psv=file_csv;
			file_psv=file_csv;
			return(file_psv);
			return(file_psv);
			}
			}
		</script id="script_load_file_csv">
		</script id="script_load_file_csv">


	<div id="div_filecontainer" >
	<div id="div_filecontainer" >
		<label class="fileContainer">
		<label class="fileContainer">
			files.csv.psv.txt
			files.csv.psv.txt
			<input id="fileUpload" type="file"></input>
			<input id="fileUpload" type="file"></input>
			</label>
			</label>


		&nbsp &nbsp &nbsp
		&nbsp &nbsp &nbsp
		<label class="fileContainer">
		<label class="fileContainer">
			parse.csv.psv.txt
			parse.csv.psv.txt
			<input id="upload" value="Upload" onclick="Upload()" type="button"></input>
			<input id="upload" value="Upload" onclick="Upload()" type="button"></input>
			</label>
			</label>
		</div id="div_filecontainer" >
		</div id="div_filecontainer" >






	<div id="div_csv2tbl"><h3>csv2tbl</h3>
	<div id="div_csv2tbl"><h3>csv2tbl</h3>
		</div id="div_csv2tbl" >
		</div id="div_csv2tbl" >


<!--
<!--
	<button type="button" id="fileUpload" type="file" >select</button> 
	<button type="button" id="fileUpload" type="file" >select</button> 
	<button type="button" id="upload" value="Upload" onclick="Upload()">upload</button> 
	<button type="button" id="upload" value="Upload" onclick="Upload()">upload</button> 
	-->
	-->


<!--
<!--


	<div id="div_showhide" hidden>
	<div id="div_showhide" hidden>
		<script id="script_showhide" >
		<script id="script_showhide" >
			function show_files() {
			function show_files() {
				var div_files = document.getElementbyID("div_files");
				var div_files = document.getElementbyID("div_files");
				div_files.show();
				div_files.show();
				}
				}
			function hide_files() {
			function hide_files() {
				var div_files = document.getElementbyID("div_files");
				var div_files = document.getElementbyID("div_files");
				div_files.hide();
				div_files.hide();
				}
				}
			</script id="script_showhide" hidden>
			</script id="script_showhide" hidden>


		<button type="button" id="show">show</button>
		<button type="button" id="show">show</button>
		<button type="button" id="hide">hide</button>
		<button type="button" id="hide">hide</button>
		<button type="show_files" id="show_files" onclick="show_files()">Show_files</button>
		<button type="show_files" id="show_files" onclick="show_files()">Show_files</button>
		<button type="hide_files" id="hide_files" onclick="hide_files()">Hide_files</button>
		<button type="hide_files" id="hide_files" onclick="hide_files()">Hide_files</button>
		<button type="show_neave_wobble" id="show_neave_wobble">Show_neave_wobble</button>
		<button type="show_neave_wobble" id="show_neave_wobble">Show_neave_wobble</button>
		<button type="hide_neave_wobble" id="hide_neave_wobble">Hide_neave_wobble</button>
		<button type="hide_neave_wobble" id="hide_neave_wobble">Hide_neave_wobble</button>
	-->
	-->
<!--
<!--
		<button type="show_dd" id="show_dd">Show_dd</button>
		<button type="show_dd" id="show_dd">Show_dd</button>
		<button type="hide_dd" id="hide_dd">Hide_dd</button>
		<button type="hide_dd" id="hide_dd">Hide_dd</button>
		<button type="show_bb" id="show_bb">Show_bb</button>
		<button type="show_bb" id="show_bb">Show_bb</button>
		<button type="hide_bb" id="hide_bb">Hide_bb</button>
		<button type="hide_bb" id="hide_bb">Hide_bb</button>
		<button type="show_tl" id="show_tl">Show_tl</button>
		<button type="show_tl" id="show_tl">Show_tl</button>
		<button type="hide_tl" id="hide_tl">Hide_tl</button>
		<button type="hide_tl" id="hide_tl">Hide_tl</button>
		<button type="show_colors" id="show_colors">Show_colors</button>
		<button type="show_colors" id="show_colors">Show_colors</button>
		<button type="hide_colors" id="hide_colors">Hide_colors</button>
		<button type="hide_colors" id="hide_colors">Hide_colors</button>
		<button type="show_fonts" id="show_fonts">Show_fonts</button>
		<button type="show_fonts" id="show_fonts">Show_fonts</button>
		<button type="hide_fonts" id="hide_fonts">Hide_fonts</button>
		<button type="hide_fonts" id="hide_fonts">Hide_fonts</button>
		<button type="show_alldivs" id="show_alldivs">Show_alldivs</button>
		<button type="show_alldivs" id="show_alldivs">Show_alldivs</button>
		<button type="hide_alldivs" id="hide_alldivs">Hide_alldivs</button>
		<button type="hide_alldivs" id="hide_alldivs">Hide_alldivs</button>
		-->
		-->
		</div id="dvi_showhide" >
		</div id="dvi_showhide" >




	<div id="item" >div_item
	<div id="item" >div_item
		</div id="item">
		</div id="item">


<!--
<!--
	<script id="script_showhide">
	<script id="script_showhide">
		$( "#show" ).click(function() {$('#item').show(); });
		$( "#show" ).click(function() {$('#item').show(); });
		$( "#hide" ).click(function() {$('#item').hide();});
		$( "#hide" ).click(function() {$('#item').hide();});
		$( "#show_files" ).click(function() {$('#div_files').show(); });
		$( "#show_files" ).click(function() {$('#div_files').show(); });
		$( "#hide_files" ).click(function() {$('#div_files').hide();});
		$( "#hide_files" ).click(function() {$('#div_files').hide();});
		$( "#show_neave_wobble" ).click(function() {$('#div_neave_wobble').show(); });
		$( "#show_neave_wobble" ).click(function() {$('#div_neave_wobble').show(); });
		$( "#hide_neave_wobble" ).click(function() {$('#div_neave_wobble').hide();});
		$( "#hide_neave_wobble" ).click(function() {$('#div_neave_wobble').hide();});
//		$( "#show_dd" ).click(function() {$('#div_dd').show(); });
//		$( "#show_dd" ).click(function() {$('#div_dd').show(); });
//		$( "#hide_dd" ).click(function() {$('#div_dd').hide();});
//		$( "#hide_dd" ).click(function() {$('#div_dd').hide();});
//		$( "#show_bb" ).click(function() {$('#div_bb').show(); });
//		$( "#show_bb" ).click(function() {$('#div_bb').show(); });
//		$( "#hide_bb" ).click(function() {$('#div_bb').hide();});
//		$( "#hide_bb" ).click(function() {$('#div_bb').hide();});
//		$( "#show_tl" ).click(function() {$('#div_tl').show(); });
//		$( "#show_tl" ).click(function() {$('#div_tl').show(); });
//		$( "#hide_tl" ).click(function() {$('#div_tl').hide();});
//		$( "#hide_tl" ).click(function() {$('#div_tl').hide();});
//		$( "#show_jkwii" ).click(function() {$('#div_jkwii').show(); });
//		$( "#show_jkwii" ).click(function() {$('#div_jkwii').show(); });
//		$( "#hide_jkwii" ).click(function() {$('#div_jkwii').hide();});
//		$( "#hide_jkwii" ).click(function() {$('#div_jkwii').hide();});
//		$( "#show_colors" ).click(function() {$('#div_colors').show(); });
//		$( "#show_colors" ).click(function() {$('#div_colors').show(); });
//		$( "#hide_colors" ).click(function() {$('#div_colors').hide();});
//		$( "#hide_colors" ).click(function() {$('#div_colors').hide();});
//		$( "#show_fonts" ).click(function() {$('#div_fonts').show(); });
//		$( "#show_fonts" ).click(function() {$('#div_fonts').show(); });
//		$( "#hide_fonts" ).click(function() {$('#div_fonts').hide();});
//		$( "#hide_fonts" ).click(function() {$('#div_fonts').hide();});
//		$( "#show_alldivs" ).click(function() {$('#div_alldivs').show(); });
//		$( "#show_alldivs" ).click(function() {$('#div_alldivs').show(); });
//		$( "#hide_alldivs" ).click(function() {$('#div_alldivs').hide();});
//		$( "#hide_alldivs" ).click(function() {$('#div_alldivs').hide();});
		</script id="script_showhide" >
		</script id="script_showhide" >
	-->
	-->




<!--[if IE] -->
<!--[if IE] -->
<!--			
<!--			
	<script src="https://html5shiv.googlecode.com/svn/trunk/html5.js"></script> 
	<script src="https://html5shiv.googlecode.com/svn/trunk/html5.js"></script> 
	-->
	-->
<!--		<![endif]-->
<!--		<![endif]-->
<!--
<!--
		<div class="la-anim-10" hidden></div>
		<div class="la-anim-10" hidden></div>
	-->
	-->


<!-- .corner-preloader -->
<!-- .corner-preloader -->
<!--
<!--
		<div id="wrapper" hidden>
		<div id="wrapper" hidden>
			<div id="upload-widget">
			<div id="upload-widget">
				<h1>
				<h1>
					<i class="fa fa-cloud-upload"></i> File Uploader
					<i class="fa fa-cloud-upload"></i> File Uploader
				</h1>
				</h1>
 
 
				<form id="file-upload-form">
				<form id="file-upload-form">
					<div class="file-input-wrap">
					<div class="file-input-wrap">
						fups
						fups
						<input type="file" name="file" id="file" multiple>
						<input type="file" name="file" id="file" multiple>
					</div><!-- .file-input-wrap -->
					</div><!-- .file-input-wrap -->
				</form><!-- #file-upload-form -->
				</form><!-- #file-upload-form -->
			</div><!-- #upload-widget -->
			</div><!-- #upload-widget -->
 
 
			<div id="upload-result">
			<div id="upload-result">
			</div><!-- #upload-result -->
			</div><!-- #upload-result -->
		</div><!-- #wrapper -->
		</div><!-- #wrapper -->
 
 
		<div id="preloader">
		<div id="preloader">
				<img height=50 src="/imgs/btn/kob.png" alt="preloader_up" />
				<img height=50 src="/imgs/btn/kob.png" alt="preloader_up" />
				</a>
				</a>
			</div>
			</div>


		<!-- SCRIPTS -->
		<!-- SCRIPTS -->
<!--		<script type="text/javascript" src="js/libraries/jquery-2.1.1.min.js"></script> -->
<!--		<script type="text/javascript" src="js/libraries/jquery-2.1.1.min.js"></script> -->
<!--		<script type="text/javascript" src="/js/vue.js" > -->
<!--		<script type="text/javascript" src="/js/vue.js" > -->
		<script type="text/javascript" src="data:/text/plain;base64,LyohCiAqIFZ1ZS5qcyB2Mi41LjE3CiAqIChjKSAyMDE0LTIwMTggRXZhbiBZb3UKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogKi8KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsKCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDoKCXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6CgkoZ2xvYmFsLlZ1ZSA9IGZhY3RvcnkoKSk7Cn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOwoKLyogICovCgp2YXIgZW1wdHlPYmplY3QgPSBPYmplY3QuZnJlZXplKHt9KTsKCi8vIHRoZXNlIGhlbHBlcnMgcHJvZHVjZXMgYmV0dGVyIHZtIGNvZGUgaW4gSlMgZW5naW5lcyBkdWUgdG8gdGhlaXIKLy8gZXhwbGljaXRuZXNzIGFuZCBmdW5jdGlvbiBpbmxpbmluZwpmdW5jdGlvbiBpc1VuZGVmICh2KSB7CiAgcmV0dXJuIHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSBudWxsCn0KCmZ1bmN0aW9uIGlzRGVmICh2KSB7CiAgcmV0dXJuIHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsCn0KCmZ1bmN0aW9uIGlzVHJ1ZSAodikgewogIHJldHVybiB2ID09PSB0cnVlCn0KCmZ1bmN0aW9uIGlzRmFsc2UgKHYpIHsKICByZXR1cm4gdiA9PT0gZmFsc2UKfQoKLyoqCiAqIENoZWNrIGlmIHZhbHVlIGlzIHByaW1pdGl2ZQogKi8KZnVuY3Rpb24gaXNQcmltaXRpdmUgKHZhbHVlKSB7CiAgcmV0dXJuICgKICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwKICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwKICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgdHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJyB8fAogICAgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicKICApCn0KCi8qKgogKiBRdWljayBvYmplY3QgY2hlY2sgLSB0aGlzIGlzIHByaW1hcmlseSB1c2VkIHRvIHRlbGwKICogT2JqZWN0cyBmcm9tIHByaW1pdGl2ZSB2YWx1ZXMgd2hlbiB3ZSBrbm93IHRoZSB2YWx1ZQogKiBpcyBhIEpTT04tY29tcGxpYW50IHR5cGUuCiAqLwpmdW5jdGlvbiBpc09iamVjdCAob2JqKSB7CiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jwp9CgovKioKICogR2V0IHRoZSByYXcgdHlwZSBzdHJpbmcgb2YgYSB2YWx1ZSBlLmcuIFtvYmplY3QgT2JqZWN0XQogKi8KdmFyIF90b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CgpmdW5jdGlvbiB0b1Jhd1R5cGUgKHZhbHVlKSB7CiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSkKfQoKLyoqCiAqIFN0cmljdCBvYmplY3QgdHlwZSBjaGVjay4gT25seSByZXR1cm5zIHRydWUKICogZm9yIHBsYWluIEphdmFTY3JpcHQgb2JqZWN0cy4KICovCmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QgKG9iaikgewogIHJldHVybiBfdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBPYmplY3RdJwp9CgpmdW5jdGlvbiBpc1JlZ0V4cCAodikgewogIHJldHVybiBfdG9TdHJpbmcuY2FsbCh2KSA9PT0gJ1tvYmplY3QgUmVnRXhwXScKfQoKLyoqCiAqIENoZWNrIGlmIHZhbCBpcyBhIHZhbGlkIGFycmF5IGluZGV4LgogKi8KZnVuY3Rpb24gaXNWYWxpZEFycmF5SW5kZXggKHZhbCkgewogIHZhciBuID0gcGFyc2VGbG9hdChTdHJpbmcodmFsKSk7CiAgcmV0dXJuIG4gPj0gMCAmJiBNYXRoLmZsb29yKG4pID09PSBuICYmIGlzRmluaXRlKHZhbCkKfQoKLyoqCiAqIENvbnZlcnQgYSB2YWx1ZSB0byBhIHN0cmluZyB0aGF0IGlzIGFjdHVhbGx5IHJlbmRlcmVkLgogKi8KZnVuY3Rpb24gdG9TdHJpbmcgKHZhbCkgewogIHJldHVybiB2YWwgPT0gbnVsbAogICAgPyAnJwogICAgOiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JwogICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbCwgbnVsbCwgMikKICAgICAgOiBTdHJpbmcodmFsKQp9CgovKioKICogQ29udmVydCBhIGlucHV0IHZhbHVlIHRvIGEgbnVtYmVyIGZvciBwZXJzaXN0ZW5jZS4KICogSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMsIHJldHVybiBvcmlnaW5hbCBzdHJpbmcuCiAqLwpmdW5jdGlvbiB0b051bWJlciAodmFsKSB7CiAgdmFyIG4gPSBwYXJzZUZsb2F0KHZhbCk7CiAgcmV0dXJuIGlzTmFOKG4pID8gdmFsIDogbgp9CgovKioKICogTWFrZSBhIG1hcCBhbmQgcmV0dXJuIGEgZnVuY3Rpb24gZm9yIGNoZWNraW5nIGlmIGEga2V5CiAqIGlzIGluIHRoYXQgbWFwLgogKi8KZnVuY3Rpb24gbWFrZU1hcCAoCiAgc3RyLAogIGV4cGVjdHNMb3dlckNhc2UKKSB7CiAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgdmFyIGxpc3QgPSBzdHIuc3BsaXQoJywnKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgIG1hcFtsaXN0W2ldXSA9IHRydWU7CiAgfQogIHJldHVybiBleHBlY3RzTG93ZXJDYXNlCiAgICA/IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWwudG9Mb3dlckNhc2UoKV07IH0KICAgIDogZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gbWFwW3ZhbF07IH0KfQoKLyoqCiAqIENoZWNrIGlmIGEgdGFnIGlzIGEgYnVpbHQtaW4gdGFnLgogKi8KdmFyIGlzQnVpbHRJblRhZyA9IG1ha2VNYXAoJ3Nsb3QsY29tcG9uZW50JywgdHJ1ZSk7CgovKioKICogQ2hlY2sgaWYgYSBhdHRyaWJ1dGUgaXMgYSByZXNlcnZlZCBhdHRyaWJ1dGUuCiAqLwp2YXIgaXNSZXNlcnZlZEF0dHJpYnV0ZSA9IG1ha2VNYXAoJ2tleSxyZWYsc2xvdCxzbG90LXNjb3BlLGlzJyk7CgovKioKICogUmVtb3ZlIGFuIGl0ZW0gZnJvbSBhbiBhcnJheQogKi8KZnVuY3Rpb24gcmVtb3ZlIChhcnIsIGl0ZW0pIHsKICBpZiAoYXJyLmxlbmd0aCkgewogICAgdmFyIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7CiAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICByZXR1cm4gYXJyLnNwbGljZShpbmRleCwgMSkKICAgIH0KICB9Cn0KCi8qKgogKiBDaGVjayB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eS4KICovCnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CmZ1bmN0aW9uIGhhc093biAob2JqLCBrZXkpIHsKICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkKfQoKLyoqCiAqIENyZWF0ZSBhIGNhY2hlZCB2ZXJzaW9uIG9mIGEgcHVyZSBmdW5jdGlvbi4KICovCmZ1bmN0aW9uIGNhY2hlZCAoZm4pIHsKICB2YXIgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIHJldHVybiAoZnVuY3Rpb24gY2FjaGVkRm4gKHN0cikgewogICAgdmFyIGhpdCA9IGNhY2hlW3N0cl07CiAgICByZXR1cm4gaGl0IHx8IChjYWNoZVtzdHJdID0gZm4oc3RyKSkKICB9KQp9CgovKioKICogQ2FtZWxpemUgYSBoeXBoZW4tZGVsaW1pdGVkIHN0cmluZy4KICovCnZhciBjYW1lbGl6ZVJFID0gLy0oXHcpL2c7CnZhciBjYW1lbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKGNhbWVsaXplUkUsIGZ1bmN0aW9uIChfLCBjKSB7IHJldHVybiBjID8gYy50b1VwcGVyQ2FzZSgpIDogJyc7IH0pCn0pOwoKLyoqCiAqIENhcGl0YWxpemUgYSBzdHJpbmcuCiAqLwp2YXIgY2FwaXRhbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7CiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKQp9KTsKCi8qKgogKiBIeXBoZW5hdGUgYSBjYW1lbENhc2Ugc3RyaW5nLgogKi8KdmFyIGh5cGhlbmF0ZVJFID0gL1xCKFtBLVpdKS9nOwp2YXIgaHlwaGVuYXRlID0gY2FjaGVkKGZ1bmN0aW9uIChzdHIpIHsKICByZXR1cm4gc3RyLnJlcGxhY2UoaHlwaGVuYXRlUkUsICctJDEnKS50b0xvd2VyQ2FzZSgpCn0pOwoKLyoqCiAqIFNpbXBsZSBiaW5kIHBvbHlmaWxsIGZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBpdC4uLiBlLmcuCiAqIFBoYW50b21KUyAxLnguIFRlY2huaWNhbGx5IHdlIGRvbid0IG5lZWQgdGhpcyBhbnltb3JlIHNpbmNlIG5hdGl2ZSBiaW5kIGlzCiAqIG5vdyBtb3JlIHBlcmZvcm1hbnQgaW4gbW9zdCBicm93c2VycywgYnV0IHJlbW92aW5nIGl0IHdvdWxkIGJlIGJyZWFraW5nIGZvcgogKiBjb2RlIHRoYXQgd2FzIGFibGUgdG8gcnVuIGluIFBoYW50b21KUyAxLngsIHNvIHRoaXMgbXVzdCBiZSBrZXB0IGZvcgogKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICovCgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwpmdW5jdGlvbiBwb2x5ZmlsbEJpbmQgKGZuLCBjdHgpIHsKICBmdW5jdGlvbiBib3VuZEZuIChhKSB7CiAgICB2YXIgbCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgICByZXR1cm4gbAogICAgICA/IGwgPiAxCiAgICAgICAgPyBmbi5hcHBseShjdHgsIGFyZ3VtZW50cykKICAgICAgICA6IGZuLmNhbGwoY3R4LCBhKQogICAgICA6IGZuLmNhbGwoY3R4KQogIH0KCiAgYm91bmRGbi5fbGVuZ3RoID0gZm4ubGVuZ3RoOwogIHJldHVybiBib3VuZEZuCn0KCmZ1bmN0aW9uIG5hdGl2ZUJpbmQgKGZuLCBjdHgpIHsKICByZXR1cm4gZm4uYmluZChjdHgpCn0KCnZhciBiaW5kID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQKICA/IG5hdGl2ZUJpbmQKICA6IHBvbHlmaWxsQmluZDsKCi8qKgogKiBDb252ZXJ0IGFuIEFycmF5LWxpa2Ugb2JqZWN0IHRvIGEgcmVhbCBBcnJheS4KICovCmZ1bmN0aW9uIHRvQXJyYXkgKGxpc3QsIHN0YXJ0KSB7CiAgc3RhcnQgPSBzdGFydCB8fCAwOwogIHZhciBpID0gbGlzdC5sZW5ndGggLSBzdGFydDsKICB2YXIgcmV0ID0gbmV3IEFycmF5KGkpOwogIHdoaWxlIChpLS0pIHsKICAgIHJldFtpXSA9IGxpc3RbaSArIHN0YXJ0XTsKICB9CiAgcmV0dXJuIHJldAp9CgovKioKICogTWl4IHByb3BlcnRpZXMgaW50byB0YXJnZXQgb2JqZWN0LgogKi8KZnVuY3Rpb24gZXh0ZW5kICh0bywgX2Zyb20pIHsKICBmb3IgKHZhciBrZXkgaW4gX2Zyb20pIHsKICAgIHRvW2tleV0gPSBfZnJvbVtrZXldOwogIH0KICByZXR1cm4gdG8KfQoKLyoqCiAqIE1lcmdlIGFuIEFycmF5IG9mIE9iamVjdHMgaW50byBhIHNpbmdsZSBPYmplY3QuCiAqLwpmdW5jdGlvbiB0b09iamVjdCAoYXJyKSB7CiAgdmFyIHJlcyA9IHt9OwogIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoYXJyW2ldKSB7CiAgICAgIGV4dGVuZChyZXMsIGFycltpXSk7CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyoqCiAqIFBlcmZvcm0gbm8gb3BlcmF0aW9uLgogKiBTdHViYmluZyBhcmdzIHRvIG1ha2UgRmxvdyBoYXBweSB3aXRob3V0IGxlYXZpbmcgdXNlbGVzcyB0cmFuc3BpbGVkIGNvZGUKICogd2l0aCAuLi5yZXN0IChodHRwczovL2Zsb3cub3JnL2Jsb2cvMjAxNy8wNS8wNy9TdHJpY3QtRnVuY3Rpb24tQ2FsbC1Bcml0eS8pCiAqLwpmdW5jdGlvbiBub29wIChhLCBiLCBjKSB7fQoKLyoqCiAqIEFsd2F5cyByZXR1cm4gZmFsc2UuCiAqLwp2YXIgbm8gPSBmdW5jdGlvbiAoYSwgYiwgYykgeyByZXR1cm4gZmFsc2U7IH07CgovKioKICogUmV0dXJuIHNhbWUgdmFsdWUKICovCnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uIChfKSB7IHJldHVybiBfOyB9OwoKLyoqCiAqIEdlbmVyYXRlIGEgc3RhdGljIGtleXMgc3RyaW5nIGZyb20gY29tcGlsZXIgbW9kdWxlcy4KICovCmZ1bmN0aW9uIGdlblN0YXRpY0tleXMgKG1vZHVsZXMpIHsKICByZXR1cm4gbW9kdWxlcy5yZWR1Y2UoZnVuY3Rpb24gKGtleXMsIG0pIHsKICAgIHJldHVybiBrZXlzLmNvbmNhdChtLnN0YXRpY0tleXMgfHwgW10pCiAgfSwgW10pLmpvaW4oJywnKQp9CgovKioKICogQ2hlY2sgaWYgdHdvIHZhbHVlcyBhcmUgbG9vc2VseSBlcXVhbCAtIHRoYXQgaXMsCiAqIGlmIHRoZXkgYXJlIHBsYWluIG9iamVjdHMsIGRvIHRoZXkgaGF2ZSB0aGUgc2FtZSBzaGFwZT8KICovCmZ1bmN0aW9uIGxvb3NlRXF1YWwgKGEsIGIpIHsKICBpZiAoYSA9PT0gYikgeyByZXR1cm4gdHJ1ZSB9CiAgdmFyIGlzT2JqZWN0QSA9IGlzT2JqZWN0KGEpOwogIHZhciBpc09iamVjdEIgPSBpc09iamVjdChiKTsKICBpZiAoaXNPYmplY3RBICYmIGlzT2JqZWN0QikgewogICAgdHJ5IHsKICAgICAgdmFyIGlzQXJyYXlBID0gQXJyYXkuaXNBcnJheShhKTsKICAgICAgdmFyIGlzQXJyYXlCID0gQXJyYXkuaXNBcnJheShiKTsKICAgICAgaWYgKGlzQXJyYXlBICYmIGlzQXJyYXlCKSB7CiAgICAgICAgcmV0dXJuIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KGZ1bmN0aW9uIChlLCBpKSB7CiAgICAgICAgICByZXR1cm4gbG9vc2VFcXVhbChlLCBiW2ldKQogICAgICAgIH0pCiAgICAgIH0gZWxzZSBpZiAoIWlzQXJyYXlBICYmICFpc0FycmF5QikgewogICAgICAgIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKGEpOwogICAgICAgIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKGIpOwogICAgICAgIHJldHVybiBrZXlzQS5sZW5ndGggPT09IGtleXNCLmxlbmd0aCAmJiBrZXlzQS5ldmVyeShmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICByZXR1cm4gbG9vc2VFcXVhbChhW2tleV0sIGJba2V5XSkKICAgICAgICB9KQogICAgICB9IGVsc2UgewogICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICAgICAgcmV0dXJuIGZhbHNlCiAgICB9CiAgfSBlbHNlIGlmICghaXNPYmplY3RBICYmICFpc09iamVjdEIpIHsKICAgIHJldHVybiBTdHJpbmcoYSkgPT09IFN0cmluZyhiKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZmFsc2UKICB9Cn0KCmZ1bmN0aW9uIGxvb3NlSW5kZXhPZiAoYXJyLCB2YWwpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgewogICAgaWYgKGxvb3NlRXF1YWwoYXJyW2ldLCB2YWwpKSB7IHJldHVybiBpIH0KICB9CiAgcmV0dXJuIC0xCn0KCi8qKgogKiBFbnN1cmUgYSBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBvbmNlLgogKi8KZnVuY3Rpb24gb25jZSAoZm4pIHsKICB2YXIgY2FsbGVkID0gZmFsc2U7CiAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgIGlmICghY2FsbGVkKSB7CiAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgfQp9Cgp2YXIgU1NSX0FUVFIgPSAnZGF0YS1zZXJ2ZXItcmVuZGVyZWQnOwoKdmFyIEFTU0VUX1RZUEVTID0gWwogICdjb21wb25lbnQnLAogICdkaXJlY3RpdmUnLAogICdmaWx0ZXInCl07Cgp2YXIgTElGRUNZQ0xFX0hPT0tTID0gWwogICdiZWZvcmVDcmVhdGUnLAogICdjcmVhdGVkJywKICAnYmVmb3JlTW91bnQnLAogICdtb3VudGVkJywKICAnYmVmb3JlVXBkYXRlJywKICAndXBkYXRlZCcsCiAgJ2JlZm9yZURlc3Ryb3knLAogICdkZXN0cm95ZWQnLAogICdhY3RpdmF0ZWQnLAogICdkZWFjdGl2YXRlZCcsCiAgJ2Vycm9yQ2FwdHVyZWQnCl07CgovKiAgKi8KCnZhciBjb25maWcgPSAoewogIC8qKgogICAqIE9wdGlvbiBtZXJnZSBzdHJhdGVnaWVzICh1c2VkIGluIGNvcmUvdXRpbC9vcHRpb25zKQogICAqLwogIC8vICRmbG93LWRpc2FibGUtbGluZQogIG9wdGlvbk1lcmdlU3RyYXRlZ2llczogT2JqZWN0LmNyZWF0ZShudWxsKSwKCiAgLyoqCiAgICogV2hldGhlciB0byBzdXBwcmVzcyB3YXJuaW5ncy4KICAgKi8KICBzaWxlbnQ6IGZhbHNlLAoKICAvKioKICAgKiBTaG93IHByb2R1Y3Rpb24gbW9kZSB0aXAgbWVzc2FnZSBvbiBib290PwogICAqLwogIHByb2R1Y3Rpb25UaXA6ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJywKCiAgLyoqCiAgICogV2hldGhlciB0byBlbmFibGUgZGV2dG9vbHMKICAgKi8KICBkZXZ0b29sczogImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nLAoKICAvKioKICAgKiBXaGV0aGVyIHRvIHJlY29yZCBwZXJmCiAgICovCiAgcGVyZm9ybWFuY2U6IGZhbHNlLAoKICAvKioKICAgKiBFcnJvciBoYW5kbGVyIGZvciB3YXRjaGVyIGVycm9ycwogICAqLwogIGVycm9ySGFuZGxlcjogbnVsbCwKCiAgLyoqCiAgICogV2FybiBoYW5kbGVyIGZvciB3YXRjaGVyIHdhcm5zCiAgICovCiAgd2FybkhhbmRsZXI6IG51bGwsCgogIC8qKgogICAqIElnbm9yZSBjZXJ0YWluIGN1c3RvbSBlbGVtZW50cwogICAqLwogIGlnbm9yZWRFbGVtZW50czogW10sCgogIC8qKgogICAqIEN1c3RvbSB1c2VyIGtleSBhbGlhc2VzIGZvciB2LW9uCiAgICovCiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAga2V5Q29kZXM6IE9iamVjdC5jcmVhdGUobnVsbCksCgogIC8qKgogICAqIENoZWNrIGlmIGEgdGFnIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHJlZ2lzdGVyZWQgYXMgYQogICAqIGNvbXBvbmVudC4gVGhpcyBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQgYW5kIG1heSBiZSBvdmVyd3JpdHRlbi4KICAgKi8KICBpc1Jlc2VydmVkVGFnOiBubywKCiAgLyoqCiAgICogQ2hlY2sgaWYgYW4gYXR0cmlidXRlIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHVzZWQgYXMgYSBjb21wb25lbnQKICAgKiBwcm9wLiBUaGlzIGlzIHBsYXRmb3JtLWRlcGVuZGVudCBhbmQgbWF5IGJlIG92ZXJ3cml0dGVuLgogICAqLwogIGlzUmVzZXJ2ZWRBdHRyOiBubywKCiAgLyoqCiAgICogQ2hlY2sgaWYgYSB0YWcgaXMgYW4gdW5rbm93biBlbGVtZW50LgogICAqIFBsYXRmb3JtLWRlcGVuZGVudC4KICAgKi8KICBpc1Vua25vd25FbGVtZW50OiBubywKCiAgLyoqCiAgICogR2V0IHRoZSBuYW1lc3BhY2Ugb2YgYW4gZWxlbWVudAogICAqLwogIGdldFRhZ05hbWVzcGFjZTogbm9vcCwKCiAgLyoqCiAgICogUGFyc2UgdGhlIHJlYWwgdGFnIG5hbWUgZm9yIHRoZSBzcGVjaWZpYyBwbGF0Zm9ybS4KICAgKi8KICBwYXJzZVBsYXRmb3JtVGFnTmFtZTogaWRlbnRpdHksCgogIC8qKgogICAqIENoZWNrIGlmIGFuIGF0dHJpYnV0ZSBtdXN0IGJlIGJvdW5kIHVzaW5nIHByb3BlcnR5LCBlLmcuIHZhbHVlCiAgICogUGxhdGZvcm0tZGVwZW5kZW50LgogICAqLwogIG11c3RVc2VQcm9wOiBubywKCiAgLyoqCiAgICogRXhwb3NlZCBmb3IgbGVnYWN5IHJlYXNvbnMKICAgKi8KICBfbGlmZWN5Y2xlSG9va3M6IExJRkVDWUNMRV9IT09LUwp9KQoKLyogICovCgovKioKICogQ2hlY2sgaWYgYSBzdHJpbmcgc3RhcnRzIHdpdGggJCBvciBfCiAqLwpmdW5jdGlvbiBpc1Jlc2VydmVkIChzdHIpIHsKICB2YXIgYyA9IChzdHIgKyAnJykuY2hhckNvZGVBdCgwKTsKICByZXR1cm4gYyA9PT0gMHgyNCB8fCBjID09PSAweDVGCn0KCi8qKgogKiBEZWZpbmUgYSBwcm9wZXJ0eS4KICovCmZ1bmN0aW9uIGRlZiAob2JqLCBrZXksIHZhbCwgZW51bWVyYWJsZSkgewogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgewogICAgdmFsdWU6IHZhbCwKICAgIGVudW1lcmFibGU6ICEhZW51bWVyYWJsZSwKICAgIHdyaXRhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlCiAgfSk7Cn0KCi8qKgogKiBQYXJzZSBzaW1wbGUgcGF0aC4KICovCnZhciBiYWlsUkUgPSAvW15cdy4kXS87CmZ1bmN0aW9uIHBhcnNlUGF0aCAocGF0aCkgewogIGlmIChiYWlsUkUudGVzdChwYXRoKSkgewogICAgcmV0dXJuCiAgfQogIHZhciBzZWdtZW50cyA9IHBhdGguc3BsaXQoJy4nKTsKICByZXR1cm4gZnVuY3Rpb24gKG9iaikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoIW9iaikgeyByZXR1cm4gfQogICAgICBvYmogPSBvYmpbc2VnbWVudHNbaV1dOwogICAgfQogICAgcmV0dXJuIG9iagogIH0KfQoKLyogICovCgovLyBjYW4gd2UgdXNlIF9fcHJvdG9fXz8KdmFyIGhhc1Byb3RvID0gJ19fcHJvdG9fXycgaW4ge307CgovLyBCcm93c2VyIGVudmlyb25tZW50IHNuaWZmaW5nCnZhciBpbkJyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJzsKdmFyIGluV2VleCA9IHR5cGVvZiBXWEVudmlyb25tZW50ICE9PSAndW5kZWZpbmVkJyAmJiAhIVdYRW52aXJvbm1lbnQucGxhdGZvcm07CnZhciB3ZWV4UGxhdGZvcm0gPSBpbldlZXggJiYgV1hFbnZpcm9ubWVudC5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpOwp2YXIgVUEgPSBpbkJyb3dzZXIgJiYgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsKdmFyIGlzSUUgPSBVQSAmJiAvbXNpZXx0cmlkZW50Ly50ZXN0KFVBKTsKdmFyIGlzSUU5ID0gVUEgJiYgVUEuaW5kZXhPZignbXNpZSA5LjAnKSA+IDA7CnZhciBpc0VkZ2UgPSBVQSAmJiBVQS5pbmRleE9mKCdlZGdlLycpID4gMDsKdmFyIGlzQW5kcm9pZCA9IChVQSAmJiBVQS5pbmRleE9mKCdhbmRyb2lkJykgPiAwKSB8fCAod2VleFBsYXRmb3JtID09PSAnYW5kcm9pZCcpOwp2YXIgaXNJT1MgPSAoVUEgJiYgL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KFVBKSkgfHwgKHdlZXhQbGF0Zm9ybSA9PT0gJ2lvcycpOwp2YXIgaXNDaHJvbWUgPSBVQSAmJiAvY2hyb21lXC9cZCsvLnRlc3QoVUEpICYmICFpc0VkZ2U7CgovLyBGaXJlZm94IGhhcyBhICJ3YXRjaCIgZnVuY3Rpb24gb24gT2JqZWN0LnByb3RvdHlwZS4uLgp2YXIgbmF0aXZlV2F0Y2ggPSAoe30pLndhdGNoOwoKdmFyIHN1cHBvcnRzUGFzc2l2ZSA9IGZhbHNlOwppZiAoaW5Ccm93c2VyKSB7CiAgdHJ5IHsKICAgIHZhciBvcHRzID0ge307CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0cywgJ3Bhc3NpdmUnLCAoewogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCAoKSB7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICAgICAgICBzdXBwb3J0c1Bhc3NpdmUgPSB0cnVlOwogICAgICB9CiAgICB9KSk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yODUKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0LXBhc3NpdmUnLCBudWxsLCBvcHRzKTsKICB9IGNhdGNoIChlKSB7fQp9CgovLyB0aGlzIG5lZWRzIHRvIGJlIGxhenktZXZhbGVkIGJlY2F1c2UgdnVlIG1heSBiZSByZXF1aXJlZCBiZWZvcmUKLy8gdnVlLXNlcnZlci1yZW5kZXJlciBjYW4gc2V0IFZVRV9FTlYKdmFyIF9pc1NlcnZlcjsKdmFyIGlzU2VydmVyUmVuZGVyaW5nID0gZnVuY3Rpb24gKCkgewogIGlmIChfaXNTZXJ2ZXIgPT09IHVuZGVmaW5lZCkgewogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoIWluQnJvd3NlciAmJiAhaW5XZWV4ICYmIHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgIC8vIGRldGVjdCBwcmVzZW5jZSBvZiB2dWUtc2VydmVyLXJlbmRlcmVyIGFuZCBhdm9pZAogICAgICAvLyBXZWJwYWNrIHNoaW1taW5nIHRoZSBwcm9jZXNzCiAgICAgIF9pc1NlcnZlciA9IGdsb2JhbFsncHJvY2VzcyddLmVudi5WVUVfRU5WID09PSAnc2VydmVyJzsKICAgIH0gZWxzZSB7CiAgICAgIF9pc1NlcnZlciA9IGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gX2lzU2VydmVyCn07CgovLyBkZXRlY3QgZGV2dG9vbHMKdmFyIGRldnRvb2xzID0gaW5Ccm93c2VyICYmIHdpbmRvdy5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fOwoKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KZnVuY3Rpb24gaXNOYXRpdmUgKEN0b3IpIHsKICByZXR1cm4gdHlwZW9mIEN0b3IgPT09ICdmdW5jdGlvbicgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KEN0b3IudG9TdHJpbmcoKSkKfQoKdmFyIGhhc1N5bWJvbCA9CiAgdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoU3ltYm9sKSAmJgogIHR5cGVvZiBSZWZsZWN0ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShSZWZsZWN0Lm93bktleXMpOwoKdmFyIF9TZXQ7Ci8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLyAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKaWYgKHR5cGVvZiBTZXQgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFNldCkpIHsKICAvLyB1c2UgbmF0aXZlIFNldCB3aGVuIGF2YWlsYWJsZS4KICBfU2V0ID0gU2V0Owp9IGVsc2UgewogIC8vIGEgbm9uLXN0YW5kYXJkIFNldCBwb2x5ZmlsbCB0aGF0IG9ubHkgd29ya3Mgd2l0aCBwcmltaXRpdmUga2V5cy4KICBfU2V0ID0gKGZ1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIFNldCAoKSB7CiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH0KICAgIFNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gaGFzIChrZXkpIHsKICAgICAgcmV0dXJuIHRoaXMuc2V0W2tleV0gPT09IHRydWUKICAgIH07CiAgICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAoa2V5KSB7CiAgICAgIHRoaXMuc2V0W2tleV0gPSB0cnVlOwogICAgfTsKICAgIFNldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBjbGVhciAoKSB7CiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH07CgogICAgcmV0dXJuIFNldDsKICB9KCkpOwp9CgovKiAgKi8KCnZhciB3YXJuID0gbm9vcDsKdmFyIHRpcCA9IG5vb3A7CnZhciBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlID0gKG5vb3ApOyAvLyB3b3JrIGFyb3VuZCBmbG93IGNoZWNrCnZhciBmb3JtYXRDb21wb25lbnROYW1lID0gKG5vb3ApOwoKewogIHZhciBoYXNDb25zb2xlID0gdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnOwogIHZhciBjbGFzc2lmeVJFID0gLyg/Ol58Wy1fXSkoXHcpL2c7CiAgdmFyIGNsYXNzaWZ5ID0gZnVuY3Rpb24gKHN0cikgeyByZXR1cm4gc3RyCiAgICAucmVwbGFjZShjbGFzc2lmeVJFLCBmdW5jdGlvbiAoYykgeyByZXR1cm4gYy50b1VwcGVyQ2FzZSgpOyB9KQogICAgLnJlcGxhY2UoL1stX10vZywgJycpOyB9OwoKICB3YXJuID0gZnVuY3Rpb24gKG1zZywgdm0pIHsKICAgIHZhciB0cmFjZSA9IHZtID8gZ2VuZXJhdGVDb21wb25lbnRUcmFjZSh2bSkgOiAnJzsKCiAgICBpZiAoY29uZmlnLndhcm5IYW5kbGVyKSB7CiAgICAgIGNvbmZpZy53YXJuSGFuZGxlci5jYWxsKG51bGwsIG1zZywgdm0sIHRyYWNlKTsKICAgIH0gZWxzZSBpZiAoaGFzQ29uc29sZSAmJiAoIWNvbmZpZy5zaWxlbnQpKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoKCJbVnVlIHdhcm5dOiAiICsgbXNnICsgdHJhY2UpKTsKICAgIH0KICB9OwoKICB0aXAgPSBmdW5jdGlvbiAobXNnLCB2bSkgewogICAgaWYgKGhhc0NvbnNvbGUgJiYgKCFjb25maWcuc2lsZW50KSkgewogICAgICBjb25zb2xlLndhcm4oIltWdWUgdGlwXTogIiArIG1zZyArICgKICAgICAgICB2bSA/IGdlbmVyYXRlQ29tcG9uZW50VHJhY2Uodm0pIDogJycKICAgICAgKSk7CiAgICB9CiAgfTsKCiAgZm9ybWF0Q29tcG9uZW50TmFtZSA9IGZ1bmN0aW9uICh2bSwgaW5jbHVkZUZpbGUpIHsKICAgIGlmICh2bS4kcm9vdCA9PT0gdm0pIHsKICAgICAgcmV0dXJuICc8Um9vdD4nCiAgICB9CiAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiB2bSA9PT0gJ2Z1bmN0aW9uJyAmJiB2bS5jaWQgIT0gbnVsbAogICAgICA/IHZtLm9wdGlvbnMKICAgICAgOiB2bS5faXNWdWUKICAgICAgICA/IHZtLiRvcHRpb25zIHx8IHZtLmNvbnN0cnVjdG9yLm9wdGlvbnMKICAgICAgICA6IHZtIHx8IHt9OwogICAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWUgfHwgb3B0aW9ucy5fY29tcG9uZW50VGFnOwogICAgdmFyIGZpbGUgPSBvcHRpb25zLl9fZmlsZTsKICAgIGlmICghbmFtZSAmJiBmaWxlKSB7CiAgICAgIHZhciBtYXRjaCA9IGZpbGUubWF0Y2goLyhbXi9cXF0rKVwudnVlJC8pOwogICAgICBuYW1lID0gbWF0Y2ggJiYgbWF0Y2hbMV07CiAgICB9CgogICAgcmV0dXJuICgKICAgICAgKG5hbWUgPyAoIjwiICsgKGNsYXNzaWZ5KG5hbWUpKSArICI+IikgOiAiPEFub255bW91cz4iKSArCiAgICAgIChmaWxlICYmIGluY2x1ZGVGaWxlICE9PSBmYWxzZSA/ICgiIGF0ICIgKyBmaWxlKSA6ICcnKQogICAgKQogIH07CgogIHZhciByZXBlYXQgPSBmdW5jdGlvbiAoc3RyLCBuKSB7CiAgICB2YXIgcmVzID0gJyc7CiAgICB3aGlsZSAobikgewogICAgICBpZiAobiAlIDIgPT09IDEpIHsgcmVzICs9IHN0cjsgfQogICAgICBpZiAobiA+IDEpIHsgc3RyICs9IHN0cjsgfQogICAgICBuID4+PSAxOwogICAgfQogICAgcmV0dXJuIHJlcwogIH07CgogIGdlbmVyYXRlQ29tcG9uZW50VHJhY2UgPSBmdW5jdGlvbiAodm0pIHsKICAgIGlmICh2bS5faXNWdWUgJiYgdm0uJHBhcmVudCkgewogICAgICB2YXIgdHJlZSA9IFtdOwogICAgICB2YXIgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID0gMDsKICAgICAgd2hpbGUgKHZtKSB7CiAgICAgICAgaWYgKHRyZWUubGVuZ3RoID4gMCkgewogICAgICAgICAgdmFyIGxhc3QgPSB0cmVlW3RyZWUubGVuZ3RoIC0gMV07CiAgICAgICAgICBpZiAobGFzdC5jb25zdHJ1Y3RvciA9PT0gdm0uY29uc3RydWN0b3IpIHsKICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlKys7CiAgICAgICAgICAgIHZtID0gdm0uJHBhcmVudDsKICAgICAgICAgICAgY29udGludWUKICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID4gMCkgewogICAgICAgICAgICB0cmVlW3RyZWUubGVuZ3RoIC0gMV0gPSBbbGFzdCwgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlXTsKICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdHJlZS5wdXNoKHZtKTsKICAgICAgICB2bSA9IHZtLiRwYXJlbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuICdcblxuZm91bmQgaW5cblxuJyArIHRyZWUKICAgICAgICAubWFwKGZ1bmN0aW9uICh2bSwgaSkgeyByZXR1cm4gKCIiICsgKGkgPT09IDAgPyAnLS0tPiAnIDogcmVwZWF0KCcgJywgNSArIGkgKiAyKSkgKyAoQXJyYXkuaXNBcnJheSh2bSkKICAgICAgICAgICAgPyAoKGZvcm1hdENvbXBvbmVudE5hbWUodm1bMF0pKSArICIuLi4gKCIgKyAodm1bMV0pICsgIiByZWN1cnNpdmUgY2FsbHMpIikKICAgICAgICAgICAgOiBmb3JtYXRDb21wb25lbnROYW1lKHZtKSkpOyB9KQogICAgICAgIC5qb2luKCdcbicpCiAgICB9IGVsc2UgewogICAgICByZXR1cm4gKCJcblxuKGZvdW5kIGluICIgKyAoZm9ybWF0Q29tcG9uZW50TmFtZSh2bSkpICsgIikiKQogICAgfQogIH07Cn0KCi8qICAqLwoKCnZhciB1aWQgPSAwOwoKLyoqCiAqIEEgZGVwIGlzIGFuIG9ic2VydmFibGUgdGhhdCBjYW4gaGF2ZSBtdWx0aXBsZQogKiBkaXJlY3RpdmVzIHN1YnNjcmliaW5nIHRvIGl0LgogKi8KdmFyIERlcCA9IGZ1bmN0aW9uIERlcCAoKSB7CiAgdGhpcy5pZCA9IHVpZCsrOwogIHRoaXMuc3VicyA9IFtdOwp9OwoKRGVwLnByb3RvdHlwZS5hZGRTdWIgPSBmdW5jdGlvbiBhZGRTdWIgKHN1YikgewogIHRoaXMuc3Vicy5wdXNoKHN1Yik7Cn07CgpEZXAucHJvdG90eXBlLnJlbW92ZVN1YiA9IGZ1bmN0aW9uIHJlbW92ZVN1YiAoc3ViKSB7CiAgcmVtb3ZlKHRoaXMuc3Vicywgc3ViKTsKfTsKCkRlcC5wcm90b3R5cGUuZGVwZW5kID0gZnVuY3Rpb24gZGVwZW5kICgpIHsKICBpZiAoRGVwLnRhcmdldCkgewogICAgRGVwLnRhcmdldC5hZGREZXAodGhpcyk7CiAgfQp9OwoKRGVwLnByb3RvdHlwZS5ub3RpZnkgPSBmdW5jdGlvbiBub3RpZnkgKCkgewogIC8vIHN0YWJpbGl6ZSB0aGUgc3Vic2NyaWJlciBsaXN0IGZpcnN0CiAgdmFyIHN1YnMgPSB0aGlzLnN1YnMuc2xpY2UoKTsKICBmb3IgKHZhciBpID0gMCwgbCA9IHN1YnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICBzdWJzW2ldLnVwZGF0ZSgpOwogIH0KfTsKCi8vIHRoZSBjdXJyZW50IHRhcmdldCB3YXRjaGVyIGJlaW5nIGV2YWx1YXRlZC4KLy8gdGhpcyBpcyBnbG9iYWxseSB1bmlxdWUgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvbmx5IG9uZQovLyB3YXRjaGVyIGJlaW5nIGV2YWx1YXRlZCBhdCBhbnkgdGltZS4KRGVwLnRhcmdldCA9IG51bGw7CnZhciB0YXJnZXRTdGFjayA9IFtdOwoKZnVuY3Rpb24gcHVzaFRhcmdldCAoX3RhcmdldCkgewogIGlmIChEZXAudGFyZ2V0KSB7IHRhcmdldFN0YWNrLnB1c2goRGVwLnRhcmdldCk7IH0KICBEZXAudGFyZ2V0ID0gX3RhcmdldDsKfQoKZnVuY3Rpb24gcG9wVGFyZ2V0ICgpIHsKICBEZXAudGFyZ2V0ID0gdGFyZ2V0U3RhY2sucG9wKCk7Cn0KCi8qICAqLwoKdmFyIFZOb2RlID0gZnVuY3Rpb24gVk5vZGUgKAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIHRleHQsCiAgZWxtLAogIGNvbnRleHQsCiAgY29tcG9uZW50T3B0aW9ucywKICBhc3luY0ZhY3RvcnkKKSB7CiAgdGhpcy50YWcgPSB0YWc7CiAgdGhpcy5kYXRhID0gZGF0YTsKICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47CiAgdGhpcy50ZXh0ID0gdGV4dDsKICB0aGlzLmVsbSA9IGVsbTsKICB0aGlzLm5zID0gdW5kZWZpbmVkOwogIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CiAgdGhpcy5mbkNvbnRleHQgPSB1bmRlZmluZWQ7CiAgdGhpcy5mbk9wdGlvbnMgPSB1bmRlZmluZWQ7CiAgdGhpcy5mblNjb3BlSWQgPSB1bmRlZmluZWQ7CiAgdGhpcy5rZXkgPSBkYXRhICYmIGRhdGEua2V5OwogIHRoaXMuY29tcG9uZW50T3B0aW9ucyA9IGNvbXBvbmVudE9wdGlvbnM7CiAgdGhpcy5jb21wb25lbnRJbnN0YW5jZSA9IHVuZGVmaW5lZDsKICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZDsKICB0aGlzLnJhdyA9IGZhbHNlOwogIHRoaXMuaXNTdGF0aWMgPSBmYWxzZTsKICB0aGlzLmlzUm9vdEluc2VydCA9IHRydWU7CiAgdGhpcy5pc0NvbW1lbnQgPSBmYWxzZTsKICB0aGlzLmlzQ2xvbmVkID0gZmFsc2U7CiAgdGhpcy5pc09uY2UgPSBmYWxzZTsKICB0aGlzLmFzeW5jRmFjdG9yeSA9IGFzeW5jRmFjdG9yeTsKICB0aGlzLmFzeW5jTWV0YSA9IHVuZGVmaW5lZDsKICB0aGlzLmlzQXN5bmNQbGFjZWhvbGRlciA9IGZhbHNlOwp9OwoKdmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgY2hpbGQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTsKCi8vIERFUFJFQ0FURUQ6IGFsaWFzIGZvciBjb21wb25lbnRJbnN0YW5jZSBmb3IgYmFja3dhcmRzIGNvbXBhdC4KLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KcHJvdG90eXBlQWNjZXNzb3JzLmNoaWxkLmdldCA9IGZ1bmN0aW9uICgpIHsKICByZXR1cm4gdGhpcy5jb21wb25lbnRJbnN0YW5jZQp9OwoKT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFZOb2RlLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7Cgp2YXIgY3JlYXRlRW1wdHlWTm9kZSA9IGZ1bmN0aW9uICh0ZXh0KSB7CiAgaWYgKCB0ZXh0ID09PSB2b2lkIDAgKSB0ZXh0ID0gJyc7CgogIHZhciBub2RlID0gbmV3IFZOb2RlKCk7CiAgbm9kZS50ZXh0ID0gdGV4dDsKICBub2RlLmlzQ29tbWVudCA9IHRydWU7CiAgcmV0dXJuIG5vZGUKfTsKCmZ1bmN0aW9uIGNyZWF0ZVRleHRWTm9kZSAodmFsKSB7CiAgcmV0dXJuIG5ldyBWTm9kZSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBTdHJpbmcodmFsKSkKfQoKLy8gb3B0aW1pemVkIHNoYWxsb3cgY2xvbmUKLy8gdXNlZCBmb3Igc3RhdGljIG5vZGVzIGFuZCBzbG90IG5vZGVzIGJlY2F1c2UgdGhleSBtYXkgYmUgcmV1c2VkIGFjcm9zcwovLyBtdWx0aXBsZSByZW5kZXJzLCBjbG9uaW5nIHRoZW0gYXZvaWRzIGVycm9ycyB3aGVuIERPTSBtYW5pcHVsYXRpb25zIHJlbHkKLy8gb24gdGhlaXIgZWxtIHJlZmVyZW5jZS4KZnVuY3Rpb24gY2xvbmVWTm9kZSAodm5vZGUpIHsKICB2YXIgY2xvbmVkID0gbmV3IFZOb2RlKAogICAgdm5vZGUudGFnLAogICAgdm5vZGUuZGF0YSwKICAgIHZub2RlLmNoaWxkcmVuLAogICAgdm5vZGUudGV4dCwKICAgIHZub2RlLmVsbSwKICAgIHZub2RlLmNvbnRleHQsCiAgICB2bm9kZS5jb21wb25lbnRPcHRpb25zLAogICAgdm5vZGUuYXN5bmNGYWN0b3J5CiAgKTsKICBjbG9uZWQubnMgPSB2bm9kZS5uczsKICBjbG9uZWQuaXNTdGF0aWMgPSB2bm9kZS5pc1N0YXRpYzsKICBjbG9uZWQua2V5ID0gdm5vZGUua2V5OwogIGNsb25lZC5pc0NvbW1lbnQgPSB2bm9kZS5pc0NvbW1lbnQ7CiAgY2xvbmVkLmZuQ29udGV4dCA9IHZub2RlLmZuQ29udGV4dDsKICBjbG9uZWQuZm5PcHRpb25zID0gdm5vZGUuZm5PcHRpb25zOwogIGNsb25lZC5mblNjb3BlSWQgPSB2bm9kZS5mblNjb3BlSWQ7CiAgY2xvbmVkLmlzQ2xvbmVkID0gdHJ1ZTsKICByZXR1cm4gY2xvbmVkCn0KCi8qCiAqIG5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBwbGF5IHdlbGwgd2l0aAogKiBkeW5hbWljYWxseSBhY2Nlc3NpbmcgbWV0aG9kcyBvbiBBcnJheSBwcm90b3R5cGUKICovCgp2YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTsKdmFyIGFycmF5TWV0aG9kcyA9IE9iamVjdC5jcmVhdGUoYXJyYXlQcm90byk7Cgp2YXIgbWV0aG9kc1RvUGF0Y2ggPSBbCiAgJ3B1c2gnLAogICdwb3AnLAogICdzaGlmdCcsCiAgJ3Vuc2hpZnQnLAogICdzcGxpY2UnLAogICdzb3J0JywKICAncmV2ZXJzZScKXTsKCi8qKgogKiBJbnRlcmNlcHQgbXV0YXRpbmcgbWV0aG9kcyBhbmQgZW1pdCBldmVudHMKICovCm1ldGhvZHNUb1BhdGNoLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkgewogIC8vIGNhY2hlIG9yaWdpbmFsIG1ldGhvZAogIHZhciBvcmlnaW5hbCA9IGFycmF5UHJvdG9bbWV0aG9kXTsKICBkZWYoYXJyYXlNZXRob2RzLCBtZXRob2QsIGZ1bmN0aW9uIG11dGF0b3IgKCkgewogICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsKICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07CgogICAgdmFyIHJlc3VsdCA9IG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgdmFyIG9iID0gdGhpcy5fX29iX187CiAgICB2YXIgaW5zZXJ0ZWQ7CiAgICBzd2l0Y2ggKG1ldGhvZCkgewogICAgICBjYXNlICdwdXNoJzoKICAgICAgY2FzZSAndW5zaGlmdCc6CiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzOwogICAgICAgIGJyZWFrCiAgICAgIGNhc2UgJ3NwbGljZSc6CiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzLnNsaWNlKDIpOwogICAgICAgIGJyZWFrCiAgICB9CiAgICBpZiAoaW5zZXJ0ZWQpIHsgb2Iub2JzZXJ2ZUFycmF5KGluc2VydGVkKTsgfQogICAgLy8gbm90aWZ5IGNoYW5nZQogICAgb2IuZGVwLm5vdGlmeSgpOwogICAgcmV0dXJuIHJlc3VsdAogIH0pOwp9KTsKCi8qICAqLwoKdmFyIGFycmF5S2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFycmF5TWV0aG9kcyk7CgovKioKICogSW4gc29tZSBjYXNlcyB3ZSBtYXkgd2FudCB0byBkaXNhYmxlIG9ic2VydmF0aW9uIGluc2lkZSBhIGNvbXBvbmVudCdzCiAqIHVwZGF0ZSBjb21wdXRhdGlvbi4KICovCnZhciBzaG91bGRPYnNlcnZlID0gdHJ1ZTsKCmZ1bmN0aW9uIHRvZ2dsZU9ic2VydmluZyAodmFsdWUpIHsKICBzaG91bGRPYnNlcnZlID0gdmFsdWU7Cn0KCi8qKgogKiBPYnNlcnZlciBjbGFzcyB0aGF0IGlzIGF0dGFjaGVkIHRvIGVhY2ggb2JzZXJ2ZWQKICogb2JqZWN0LiBPbmNlIGF0dGFjaGVkLCB0aGUgb2JzZXJ2ZXIgY29udmVydHMgdGhlIHRhcmdldAogKiBvYmplY3QncyBwcm9wZXJ0eSBrZXlzIGludG8gZ2V0dGVyL3NldHRlcnMgdGhhdAogKiBjb2xsZWN0IGRlcGVuZGVuY2llcyBhbmQgZGlzcGF0Y2ggdXBkYXRlcy4KICovCnZhciBPYnNlcnZlciA9IGZ1bmN0aW9uIE9ic2VydmVyICh2YWx1ZSkgewogIHRoaXMudmFsdWUgPSB2YWx1ZTsKICB0aGlzLmRlcCA9IG5ldyBEZXAoKTsKICB0aGlzLnZtQ291bnQgPSAwOwogIGRlZih2YWx1ZSwgJ19fb2JfXycsIHRoaXMpOwogIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgdmFyIGF1Z21lbnQgPSBoYXNQcm90bwogICAgICA/IHByb3RvQXVnbWVudAogICAgICA6IGNvcHlBdWdtZW50OwogICAgYXVnbWVudCh2YWx1ZSwgYXJyYXlNZXRob2RzLCBhcnJheUtleXMpOwogICAgdGhpcy5vYnNlcnZlQXJyYXkodmFsdWUpOwogIH0gZWxzZSB7CiAgICB0aGlzLndhbGsodmFsdWUpOwogIH0KfTsKCi8qKgogKiBXYWxrIHRocm91Z2ggZWFjaCBwcm9wZXJ0eSBhbmQgY29udmVydCB0aGVtIGludG8KICogZ2V0dGVyL3NldHRlcnMuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuCiAqIHZhbHVlIHR5cGUgaXMgT2JqZWN0LgogKi8KT2JzZXJ2ZXIucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiB3YWxrIChvYmopIHsKICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CiAgICBkZWZpbmVSZWFjdGl2ZShvYmosIGtleXNbaV0pOwogIH0KfTsKCi8qKgogKiBPYnNlcnZlIGEgbGlzdCBvZiBBcnJheSBpdGVtcy4KICovCk9ic2VydmVyLnByb3RvdHlwZS5vYnNlcnZlQXJyYXkgPSBmdW5jdGlvbiBvYnNlcnZlQXJyYXkgKGl0ZW1zKSB7CiAgZm9yICh2YXIgaSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIG9ic2VydmUoaXRlbXNbaV0pOwogIH0KfTsKCi8vIGhlbHBlcnMKCi8qKgogKiBBdWdtZW50IGFuIHRhcmdldCBPYmplY3Qgb3IgQXJyYXkgYnkgaW50ZXJjZXB0aW5nCiAqIHRoZSBwcm90b3R5cGUgY2hhaW4gdXNpbmcgX19wcm90b19fCiAqLwpmdW5jdGlvbiBwcm90b0F1Z21lbnQgKHRhcmdldCwgc3JjLCBrZXlzKSB7CiAgLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi8KICB0YXJnZXQuX19wcm90b19fID0gc3JjOwogIC8qIGVzbGludC1lbmFibGUgbm8tcHJvdG8gKi8KfQoKLyoqCiAqIEF1Z21lbnQgYW4gdGFyZ2V0IE9iamVjdCBvciBBcnJheSBieSBkZWZpbmluZwogKiBoaWRkZW4gcHJvcGVydGllcy4KICovCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCmZ1bmN0aW9uIGNvcHlBdWdtZW50ICh0YXJnZXQsIHNyYywga2V5cykgewogIGZvciAodmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIHZhciBrZXkgPSBrZXlzW2ldOwogICAgZGVmKHRhcmdldCwga2V5LCBzcmNba2V5XSk7CiAgfQp9CgovKioKICogQXR0ZW1wdCB0byBjcmVhdGUgYW4gb2JzZXJ2ZXIgaW5zdGFuY2UgZm9yIGEgdmFsdWUsCiAqIHJldHVybnMgdGhlIG5ldyBvYnNlcnZlciBpZiBzdWNjZXNzZnVsbHkgb2JzZXJ2ZWQsCiAqIG9yIHRoZSBleGlzdGluZyBvYnNlcnZlciBpZiB0aGUgdmFsdWUgYWxyZWFkeSBoYXMgb25lLgogKi8KZnVuY3Rpb24gb2JzZXJ2ZSAodmFsdWUsIGFzUm9vdERhdGEpIHsKICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIFZOb2RlKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIG9iOwogIGlmIChoYXNPd24odmFsdWUsICdfX29iX18nKSAmJiB2YWx1ZS5fX29iX18gaW5zdGFuY2VvZiBPYnNlcnZlcikgewogICAgb2IgPSB2YWx1ZS5fX29iX187CiAgfSBlbHNlIGlmICgKICAgIHNob3VsZE9ic2VydmUgJiYKICAgICFpc1NlcnZlclJlbmRlcmluZygpICYmCiAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaXNQbGFpbk9iamVjdCh2YWx1ZSkpICYmCiAgICBPYmplY3QuaXNFeHRlbnNpYmxlKHZhbHVlKSAmJgogICAgIXZhbHVlLl9pc1Z1ZQogICkgewogICAgb2IgPSBuZXcgT2JzZXJ2ZXIodmFsdWUpOwogIH0KICBpZiAoYXNSb290RGF0YSAmJiBvYikgewogICAgb2Iudm1Db3VudCsrOwogIH0KICByZXR1cm4gb2IKfQoKLyoqCiAqIERlZmluZSBhIHJlYWN0aXZlIHByb3BlcnR5IG9uIGFuIE9iamVjdC4KICovCmZ1bmN0aW9uIGRlZmluZVJlYWN0aXZlICgKICBvYmosCiAga2V5LAogIHZhbCwKICBjdXN0b21TZXR0ZXIsCiAgc2hhbGxvdwopIHsKICB2YXIgZGVwID0gbmV3IERlcCgpOwoKICB2YXIgcHJvcGVydHkgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KTsKICBpZiAocHJvcGVydHkgJiYgcHJvcGVydHkuY29uZmlndXJhYmxlID09PSBmYWxzZSkgewogICAgcmV0dXJuCiAgfQoKICAvLyBjYXRlciBmb3IgcHJlLWRlZmluZWQgZ2V0dGVyL3NldHRlcnMKICB2YXIgZ2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuZ2V0OwogIGlmICghZ2V0dGVyICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKICAgIHZhbCA9IG9ialtrZXldOwogIH0KICB2YXIgc2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuc2V0OwoKICB2YXIgY2hpbGRPYiA9ICFzaGFsbG93ICYmIG9ic2VydmUodmFsKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICBnZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlR2V0dGVyICgpIHsKICAgICAgdmFyIHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbDsKICAgICAgaWYgKERlcC50YXJnZXQpIHsKICAgICAgICBkZXAuZGVwZW5kKCk7CiAgICAgICAgaWYgKGNoaWxkT2IpIHsKICAgICAgICAgIGNoaWxkT2IuZGVwLmRlcGVuZCgpOwogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgICAgIGRlcGVuZEFycmF5KHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbHVlCiAgICB9LAogICAgc2V0OiBmdW5jdGlvbiByZWFjdGl2ZVNldHRlciAobmV3VmFsKSB7CiAgICAgIHZhciB2YWx1ZSA9IGdldHRlciA/IGdldHRlci5jYWxsKG9iaikgOiB2YWw7CiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSAqLwogICAgICBpZiAobmV3VmFsID09PSB2YWx1ZSB8fCAobmV3VmFsICE9PSBuZXdWYWwgJiYgdmFsdWUgIT09IHZhbHVlKSkgewogICAgICAgIHJldHVybgogICAgICB9CiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tc2VsZi1jb21wYXJlICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgY3VzdG9tU2V0dGVyKSB7CiAgICAgICAgY3VzdG9tU2V0dGVyKCk7CiAgICAgIH0KICAgICAgaWYgKHNldHRlcikgewogICAgICAgIHNldHRlci5jYWxsKG9iaiwgbmV3VmFsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWwgPSBuZXdWYWw7CiAgICAgIH0KICAgICAgY2hpbGRPYiA9ICFzaGFsbG93ICYmIG9ic2VydmUobmV3VmFsKTsKICAgICAgZGVwLm5vdGlmeSgpOwogICAgfQogIH0pOwp9CgovKioKICogU2V0IGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBBZGRzIHRoZSBuZXcgcHJvcGVydHkgYW5kCiAqIHRyaWdnZXJzIGNoYW5nZSBub3RpZmljYXRpb24gaWYgdGhlIHByb3BlcnR5IGRvZXNuJ3QKICogYWxyZWFkeSBleGlzdC4KICovCmZ1bmN0aW9uIHNldCAodGFyZ2V0LCBrZXksIHZhbCkgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIChpc1VuZGVmKHRhcmdldCkgfHwgaXNQcmltaXRpdmUodGFyZ2V0KSkKICApIHsKICAgIHdhcm4oKCJDYW5ub3Qgc2V0IHJlYWN0aXZlIHByb3BlcnR5IG9uIHVuZGVmaW5lZCwgbnVsbCwgb3IgcHJpbWl0aXZlIHZhbHVlOiAiICsgKCh0YXJnZXQpKSkpOwogIH0KICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIGlzVmFsaWRBcnJheUluZGV4KGtleSkpIHsKICAgIHRhcmdldC5sZW5ndGggPSBNYXRoLm1heCh0YXJnZXQubGVuZ3RoLCBrZXkpOwogICAgdGFyZ2V0LnNwbGljZShrZXksIDEsIHZhbCk7CiAgICByZXR1cm4gdmFsCiAgfQogIGlmIChrZXkgaW4gdGFyZ2V0ICYmICEoa2V5IGluIE9iamVjdC5wcm90b3R5cGUpKSB7CiAgICB0YXJnZXRba2V5XSA9IHZhbDsKICAgIHJldHVybiB2YWwKICB9CiAgdmFyIG9iID0gKHRhcmdldCkuX19vYl9fOwogIGlmICh0YXJnZXQuX2lzVnVlIHx8IChvYiAmJiBvYi52bUNvdW50KSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICdBdm9pZCBhZGRpbmcgcmVhY3RpdmUgcHJvcGVydGllcyB0byBhIFZ1ZSBpbnN0YW5jZSBvciBpdHMgcm9vdCAkZGF0YSAnICsKICAgICAgJ2F0IHJ1bnRpbWUgLSBkZWNsYXJlIGl0IHVwZnJvbnQgaW4gdGhlIGRhdGEgb3B0aW9uLicKICAgICk7CiAgICByZXR1cm4gdmFsCiAgfQogIGlmICghb2IpIHsKICAgIHRhcmdldFtrZXldID0gdmFsOwogICAgcmV0dXJuIHZhbAogIH0KICBkZWZpbmVSZWFjdGl2ZShvYi52YWx1ZSwga2V5LCB2YWwpOwogIG9iLmRlcC5ub3RpZnkoKTsKICByZXR1cm4gdmFsCn0KCi8qKgogKiBEZWxldGUgYSBwcm9wZXJ0eSBhbmQgdHJpZ2dlciBjaGFuZ2UgaWYgbmVjZXNzYXJ5LgogKi8KZnVuY3Rpb24gZGVsICh0YXJnZXQsIGtleSkgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIChpc1VuZGVmKHRhcmdldCkgfHwgaXNQcmltaXRpdmUodGFyZ2V0KSkKICApIHsKICAgIHdhcm4oKCJDYW5ub3QgZGVsZXRlIHJlYWN0aXZlIHByb3BlcnR5IG9uIHVuZGVmaW5lZCwgbnVsbCwgb3IgcHJpbWl0aXZlIHZhbHVlOiAiICsgKCh0YXJnZXQpKSkpOwogIH0KICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIGlzVmFsaWRBcnJheUluZGV4KGtleSkpIHsKICAgIHRhcmdldC5zcGxpY2Uoa2V5LCAxKTsKICAgIHJldHVybgogIH0KICB2YXIgb2IgPSAodGFyZ2V0KS5fX29iX187CiAgaWYgKHRhcmdldC5faXNWdWUgfHwgKG9iICYmIG9iLnZtQ291bnQpKSB7CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgJ0F2b2lkIGRlbGV0aW5nIHByb3BlcnRpZXMgb24gYSBWdWUgaW5zdGFuY2Ugb3IgaXRzIHJvb3QgJGRhdGEgJyArCiAgICAgICctIGp1c3Qgc2V0IGl0IHRvIG51bGwuJwogICAgKTsKICAgIHJldHVybgogIH0KICBpZiAoIWhhc093bih0YXJnZXQsIGtleSkpIHsKICAgIHJldHVybgogIH0KICBkZWxldGUgdGFyZ2V0W2tleV07CiAgaWYgKCFvYikgewogICAgcmV0dXJuCiAgfQogIG9iLmRlcC5ub3RpZnkoKTsKfQoKLyoqCiAqIENvbGxlY3QgZGVwZW5kZW5jaWVzIG9uIGFycmF5IGVsZW1lbnRzIHdoZW4gdGhlIGFycmF5IGlzIHRvdWNoZWQsIHNpbmNlCiAqIHdlIGNhbm5vdCBpbnRlcmNlcHQgYXJyYXkgZWxlbWVudCBhY2Nlc3MgbGlrZSBwcm9wZXJ0eSBnZXR0ZXJzLgogKi8KZnVuY3Rpb24gZGVwZW5kQXJyYXkgKHZhbHVlKSB7CiAgZm9yICh2YXIgZSA9ICh2b2lkIDApLCBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgZSA9IHZhbHVlW2ldOwogICAgZSAmJiBlLl9fb2JfXyAmJiBlLl9fb2JfXy5kZXAuZGVwZW5kKCk7CiAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkgewogICAgICBkZXBlbmRBcnJheShlKTsKICAgIH0KICB9Cn0KCi8qICAqLwoKLyoqCiAqIE9wdGlvbiBvdmVyd3JpdGluZyBzdHJhdGVnaWVzIGFyZSBmdW5jdGlvbnMgdGhhdCBoYW5kbGUKICogaG93IHRvIG1lcmdlIGEgcGFyZW50IG9wdGlvbiB2YWx1ZSBhbmQgYSBjaGlsZCBvcHRpb24KICogdmFsdWUgaW50byB0aGUgZmluYWwgdmFsdWUuCiAqLwp2YXIgc3RyYXRzID0gY29uZmlnLm9wdGlvbk1lcmdlU3RyYXRlZ2llczsKCi8qKgogKiBPcHRpb25zIHdpdGggcmVzdHJpY3Rpb25zCiAqLwp7CiAgc3RyYXRzLmVsID0gc3RyYXRzLnByb3BzRGF0YSA9IGZ1bmN0aW9uIChwYXJlbnQsIGNoaWxkLCB2bSwga2V5KSB7CiAgICBpZiAoIXZtKSB7CiAgICAgIHdhcm4oCiAgICAgICAgIm9wdGlvbiBcIiIgKyBrZXkgKyAiXCIgY2FuIG9ubHkgYmUgdXNlZCBkdXJpbmcgaW5zdGFuY2UgIiArCiAgICAgICAgJ2NyZWF0aW9uIHdpdGggdGhlIGBuZXdgIGtleXdvcmQuJwogICAgICApOwogICAgfQogICAgcmV0dXJuIGRlZmF1bHRTdHJhdChwYXJlbnQsIGNoaWxkKQogIH07Cn0KCi8qKgogKiBIZWxwZXIgdGhhdCByZWN1cnNpdmVseSBtZXJnZXMgdHdvIGRhdGEgb2JqZWN0cyB0b2dldGhlci4KICovCmZ1bmN0aW9uIG1lcmdlRGF0YSAodG8sIGZyb20pIHsKICBpZiAoIWZyb20pIHsgcmV0dXJuIHRvIH0KICB2YXIga2V5LCB0b1ZhbCwgZnJvbVZhbDsKICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZyb20pOwogIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAga2V5ID0ga2V5c1tpXTsKICAgIHRvVmFsID0gdG9ba2V5XTsKICAgIGZyb21WYWwgPSBmcm9tW2tleV07CiAgICBpZiAoIWhhc093bih0bywga2V5KSkgewogICAgICBzZXQodG8sIGtleSwgZnJvbVZhbCk7CiAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodG9WYWwpICYmIGlzUGxhaW5PYmplY3QoZnJvbVZhbCkpIHsKICAgICAgbWVyZ2VEYXRhKHRvVmFsLCBmcm9tVmFsKTsKICAgIH0KICB9CiAgcmV0dXJuIHRvCn0KCi8qKgogKiBEYXRhCiAqLwpmdW5jdGlvbiBtZXJnZURhdGFPckZuICgKICBwYXJlbnRWYWwsCiAgY2hpbGRWYWwsCiAgdm0KKSB7CiAgaWYgKCF2bSkgewogICAgLy8gaW4gYSBWdWUuZXh0ZW5kIG1lcmdlLCBib3RoIHNob3VsZCBiZSBmdW5jdGlvbnMKICAgIGlmICghY2hpbGRWYWwpIHsKICAgICAgcmV0dXJuIHBhcmVudFZhbAogICAgfQogICAgaWYgKCFwYXJlbnRWYWwpIHsKICAgICAgcmV0dXJuIGNoaWxkVmFsCiAgICB9CiAgICAvLyB3aGVuIHBhcmVudFZhbCAmIGNoaWxkVmFsIGFyZSBib3RoIHByZXNlbnQsCiAgICAvLyB3ZSBuZWVkIHRvIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUKICAgIC8vIG1lcmdlZCByZXN1bHQgb2YgYm90aCBmdW5jdGlvbnMuLi4gbm8gbmVlZCB0bwogICAgLy8gY2hlY2sgaWYgcGFyZW50VmFsIGlzIGEgZnVuY3Rpb24gaGVyZSBiZWNhdXNlCiAgICAvLyBpdCBoYXMgdG8gYmUgYSBmdW5jdGlvbiB0byBwYXNzIHByZXZpb3VzIG1lcmdlcy4KICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZWREYXRhRm4gKCkgewogICAgICByZXR1cm4gbWVyZ2VEYXRhKAogICAgICAgIHR5cGVvZiBjaGlsZFZhbCA9PT0gJ2Z1bmN0aW9uJyA/IGNoaWxkVmFsLmNhbGwodGhpcywgdGhpcykgOiBjaGlsZFZhbCwKICAgICAgICB0eXBlb2YgcGFyZW50VmFsID09PSAnZnVuY3Rpb24nID8gcGFyZW50VmFsLmNhbGwodGhpcywgdGhpcykgOiBwYXJlbnRWYWwKICAgICAgKQogICAgfQogIH0gZWxzZSB7CiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VkSW5zdGFuY2VEYXRhRm4gKCkgewogICAgICAvLyBpbnN0YW5jZSBtZXJnZQogICAgICB2YXIgaW5zdGFuY2VEYXRhID0gdHlwZW9mIGNoaWxkVmFsID09PSAnZnVuY3Rpb24nCiAgICAgICAgPyBjaGlsZFZhbC5jYWxsKHZtLCB2bSkKICAgICAgICA6IGNoaWxkVmFsOwogICAgICB2YXIgZGVmYXVsdERhdGEgPSB0eXBlb2YgcGFyZW50VmFsID09PSAnZnVuY3Rpb24nCiAgICAgICAgPyBwYXJlbnRWYWwuY2FsbCh2bSwgdm0pCiAgICAgICAgOiBwYXJlbnRWYWw7CiAgICAgIGlmIChpbnN0YW5jZURhdGEpIHsKICAgICAgICByZXR1cm4gbWVyZ2VEYXRhKGluc3RhbmNlRGF0YSwgZGVmYXVsdERhdGEpCiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGRlZmF1bHREYXRhCiAgICAgIH0KICAgIH0KICB9Cn0KCnN0cmF0cy5kYXRhID0gZnVuY3Rpb24gKAogIHBhcmVudFZhbCwKICBjaGlsZFZhbCwKICB2bQopIHsKICBpZiAoIXZtKSB7CiAgICBpZiAoY2hpbGRWYWwgJiYgdHlwZW9mIGNoaWxkVmFsICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICdUaGUgImRhdGEiIG9wdGlvbiBzaG91bGQgYmUgYSBmdW5jdGlvbiAnICsKICAgICAgICAndGhhdCByZXR1cm5zIGEgcGVyLWluc3RhbmNlIHZhbHVlIGluIGNvbXBvbmVudCAnICsKICAgICAgICAnZGVmaW5pdGlvbnMuJywKICAgICAgICB2bQogICAgICApOwoKICAgICAgcmV0dXJuIHBhcmVudFZhbAogICAgfQogICAgcmV0dXJuIG1lcmdlRGF0YU9yRm4ocGFyZW50VmFsLCBjaGlsZFZhbCkKICB9CgogIHJldHVybiBtZXJnZURhdGFPckZuKHBhcmVudFZhbCwgY2hpbGRWYWwsIHZtKQp9OwoKLyoqCiAqIEhvb2tzIGFuZCBwcm9wcyBhcmUgbWVyZ2VkIGFzIGFycmF5cy4KICovCmZ1bmN0aW9uIG1lcmdlSG9vayAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsCikgewogIHJldHVybiBjaGlsZFZhbAogICAgPyBwYXJlbnRWYWwKICAgICAgPyBwYXJlbnRWYWwuY29uY2F0KGNoaWxkVmFsKQogICAgICA6IEFycmF5LmlzQXJyYXkoY2hpbGRWYWwpCiAgICAgICAgPyBjaGlsZFZhbAogICAgICAgIDogW2NoaWxkVmFsXQogICAgOiBwYXJlbnRWYWwKfQoKTElGRUNZQ0xFX0hPT0tTLmZvckVhY2goZnVuY3Rpb24gKGhvb2spIHsKICBzdHJhdHNbaG9va10gPSBtZXJnZUhvb2s7Cn0pOwoKLyoqCiAqIEFzc2V0cwogKgogKiBXaGVuIGEgdm0gaXMgcHJlc2VudCAoaW5zdGFuY2UgY3JlYXRpb24pLCB3ZSBuZWVkIHRvIGRvCiAqIGEgdGhyZWUtd2F5IG1lcmdlIGJldHdlZW4gY29uc3RydWN0b3Igb3B0aW9ucywgaW5zdGFuY2UKICogb3B0aW9ucyBhbmQgcGFyZW50IG9wdGlvbnMuCiAqLwpmdW5jdGlvbiBtZXJnZUFzc2V0cyAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsLAogIHZtLAogIGtleQopIHsKICB2YXIgcmVzID0gT2JqZWN0LmNyZWF0ZShwYXJlbnRWYWwgfHwgbnVsbCk7CiAgaWYgKGNoaWxkVmFsKSB7CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgICByZXR1cm4gZXh0ZW5kKHJlcywgY2hpbGRWYWwpCiAgfSBlbHNlIHsKICAgIHJldHVybiByZXMKICB9Cn0KCkFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsKICBzdHJhdHNbdHlwZSArICdzJ10gPSBtZXJnZUFzc2V0czsKfSk7CgovKioKICogV2F0Y2hlcnMuCiAqCiAqIFdhdGNoZXJzIGhhc2hlcyBzaG91bGQgbm90IG92ZXJ3cml0ZSBvbmUKICogYW5vdGhlciwgc28gd2UgbWVyZ2UgdGhlbSBhcyBhcnJheXMuCiAqLwpzdHJhdHMud2F0Y2ggPSBmdW5jdGlvbiAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsLAogIHZtLAogIGtleQopIHsKICAvLyB3b3JrIGFyb3VuZCBGaXJlZm94J3MgT2JqZWN0LnByb3RvdHlwZS53YXRjaC4uLgogIGlmIChwYXJlbnRWYWwgPT09IG5hdGl2ZVdhdGNoKSB7IHBhcmVudFZhbCA9IHVuZGVmaW5lZDsgfQogIGlmIChjaGlsZFZhbCA9PT0gbmF0aXZlV2F0Y2gpIHsgY2hpbGRWYWwgPSB1bmRlZmluZWQ7IH0KICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNoaWxkVmFsKSB7IHJldHVybiBPYmplY3QuY3JlYXRlKHBhcmVudFZhbCB8fCBudWxsKSB9CiAgewogICAgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgfQogIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9CiAgdmFyIHJldCA9IHt9OwogIGV4dGVuZChyZXQsIHBhcmVudFZhbCk7CiAgZm9yICh2YXIga2V5JDEgaW4gY2hpbGRWYWwpIHsKICAgIHZhciBwYXJlbnQgPSByZXRba2V5JDFdOwogICAgdmFyIGNoaWxkID0gY2hpbGRWYWxba2V5JDFdOwogICAgaWYgKHBhcmVudCAmJiAhQXJyYXkuaXNBcnJheShwYXJlbnQpKSB7CiAgICAgIHBhcmVudCA9IFtwYXJlbnRdOwogICAgfQogICAgcmV0W2tleSQxXSA9IHBhcmVudAogICAgICA/IHBhcmVudC5jb25jYXQoY2hpbGQpCiAgICAgIDogQXJyYXkuaXNBcnJheShjaGlsZCkgPyBjaGlsZCA6IFtjaGlsZF07CiAgfQogIHJldHVybiByZXQKfTsKCi8qKgogKiBPdGhlciBvYmplY3QgaGFzaGVzLgogKi8Kc3RyYXRzLnByb3BzID0Kc3RyYXRzLm1ldGhvZHMgPQpzdHJhdHMuaW5qZWN0ID0Kc3RyYXRzLmNvbXB1dGVkID0gZnVuY3Rpb24gKAogIHBhcmVudFZhbCwKICBjaGlsZFZhbCwKICB2bSwKICBrZXkKKSB7CiAgaWYgKGNoaWxkVmFsICYmICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgewogICAgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgfQogIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9CiAgdmFyIHJldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgZXh0ZW5kKHJldCwgcGFyZW50VmFsKTsKICBpZiAoY2hpbGRWYWwpIHsgZXh0ZW5kKHJldCwgY2hpbGRWYWwpOyB9CiAgcmV0dXJuIHJldAp9OwpzdHJhdHMucHJvdmlkZSA9IG1lcmdlRGF0YU9yRm47CgovKioKICogRGVmYXVsdCBzdHJhdGVneS4KICovCnZhciBkZWZhdWx0U3RyYXQgPSBmdW5jdGlvbiAocGFyZW50VmFsLCBjaGlsZFZhbCkgewogIHJldHVybiBjaGlsZFZhbCA9PT0gdW5kZWZpbmVkCiAgICA/IHBhcmVudFZhbAogICAgOiBjaGlsZFZhbAp9OwoKLyoqCiAqIFZhbGlkYXRlIGNvbXBvbmVudCBuYW1lcwogKi8KZnVuY3Rpb24gY2hlY2tDb21wb25lbnRzIChvcHRpb25zKSB7CiAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMuY29tcG9uZW50cykgewogICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGtleSk7CiAgfQp9CgpmdW5jdGlvbiB2YWxpZGF0ZUNvbXBvbmVudE5hbWUgKG5hbWUpIHsKICBpZiAoIS9eW2EtekEtWl1bXHctXSokLy50ZXN0KG5hbWUpKSB7CiAgICB3YXJuKAogICAgICAnSW52YWxpZCBjb21wb25lbnQgbmFtZTogIicgKyBuYW1lICsgJyIuIENvbXBvbmVudCBuYW1lcyAnICsKICAgICAgJ2NhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIHRoZSBoeXBoZW4sICcgKwogICAgICAnYW5kIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlci4nCiAgICApOwogIH0KICBpZiAoaXNCdWlsdEluVGFnKG5hbWUpIHx8IGNvbmZpZy5pc1Jlc2VydmVkVGFnKG5hbWUpKSB7CiAgICB3YXJuKAogICAgICAnRG8gbm90IHVzZSBidWlsdC1pbiBvciByZXNlcnZlZCBIVE1MIGVsZW1lbnRzIGFzIGNvbXBvbmVudCAnICsKICAgICAgJ2lkOiAnICsgbmFtZQogICAgKTsKICB9Cn0KCi8qKgogKiBFbnN1cmUgYWxsIHByb3BzIG9wdGlvbiBzeW50YXggYXJlIG5vcm1hbGl6ZWQgaW50byB0aGUKICogT2JqZWN0LWJhc2VkIGZvcm1hdC4KICovCmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzIChvcHRpb25zLCB2bSkgewogIHZhciBwcm9wcyA9IG9wdGlvbnMucHJvcHM7CiAgaWYgKCFwcm9wcykgeyByZXR1cm4gfQogIHZhciByZXMgPSB7fTsKICB2YXIgaSwgdmFsLCBuYW1lOwogIGlmIChBcnJheS5pc0FycmF5KHByb3BzKSkgewogICAgaSA9IHByb3BzLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsKICAgICAgdmFsID0gcHJvcHNbaV07CiAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgewogICAgICAgIG5hbWUgPSBjYW1lbGl6ZSh2YWwpOwogICAgICAgIHJlc1tuYW1lXSA9IHsgdHlwZTogbnVsbCB9OwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oJ3Byb3BzIG11c3QgYmUgc3RyaW5ncyB3aGVuIHVzaW5nIGFycmF5IHN5bnRheC4nKTsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChwcm9wcykpIHsKICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykgewogICAgICB2YWwgPSBwcm9wc1trZXldOwogICAgICBuYW1lID0gY2FtZWxpemUoa2V5KTsKICAgICAgcmVzW25hbWVdID0gaXNQbGFpbk9iamVjdCh2YWwpCiAgICAgICAgPyB2YWwKICAgICAgICA6IHsgdHlwZTogdmFsIH07CiAgICB9CiAgfSBlbHNlIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCJwcm9wc1wiOiBleHBlY3RlZCBhbiBBcnJheSBvciBhbiBPYmplY3QsICIgKwogICAgICAiYnV0IGdvdCAiICsgKHRvUmF3VHlwZShwcm9wcykpICsgIi4iLAogICAgICB2bQogICAgKTsKICB9CiAgb3B0aW9ucy5wcm9wcyA9IHJlczsKfQoKLyoqCiAqIE5vcm1hbGl6ZSBhbGwgaW5qZWN0aW9ucyBpbnRvIE9iamVjdC1iYXNlZCBmb3JtYXQKICovCmZ1bmN0aW9uIG5vcm1hbGl6ZUluamVjdCAob3B0aW9ucywgdm0pIHsKICB2YXIgaW5qZWN0ID0gb3B0aW9ucy5pbmplY3Q7CiAgaWYgKCFpbmplY3QpIHsgcmV0dXJuIH0KICB2YXIgbm9ybWFsaXplZCA9IG9wdGlvbnMuaW5qZWN0ID0ge307CiAgaWYgKEFycmF5LmlzQXJyYXkoaW5qZWN0KSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmplY3QubGVuZ3RoOyBpKyspIHsKICAgICAgbm9ybWFsaXplZFtpbmplY3RbaV1dID0geyBmcm9tOiBpbmplY3RbaV0gfTsKICAgIH0KICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoaW5qZWN0KSkgewogICAgZm9yICh2YXIga2V5IGluIGluamVjdCkgewogICAgICB2YXIgdmFsID0gaW5qZWN0W2tleV07CiAgICAgIG5vcm1hbGl6ZWRba2V5XSA9IGlzUGxhaW5PYmplY3QodmFsKQogICAgICAgID8gZXh0ZW5kKHsgZnJvbToga2V5IH0sIHZhbCkKICAgICAgICA6IHsgZnJvbTogdmFsIH07CiAgICB9CiAgfSBlbHNlIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCJpbmplY3RcIjogZXhwZWN0ZWQgYW4gQXJyYXkgb3IgYW4gT2JqZWN0LCAiICsKICAgICAgImJ1dCBnb3QgIiArICh0b1Jhd1R5cGUoaW5qZWN0KSkgKyAiLiIsCiAgICAgIHZtCiAgICApOwogIH0KfQoKLyoqCiAqIE5vcm1hbGl6ZSByYXcgZnVuY3Rpb24gZGlyZWN0aXZlcyBpbnRvIG9iamVjdCBmb3JtYXQuCiAqLwpmdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzIChvcHRpb25zKSB7CiAgdmFyIGRpcnMgPSBvcHRpb25zLmRpcmVjdGl2ZXM7CiAgaWYgKGRpcnMpIHsKICAgIGZvciAodmFyIGtleSBpbiBkaXJzKSB7CiAgICAgIHZhciBkZWYgPSBkaXJzW2tleV07CiAgICAgIGlmICh0eXBlb2YgZGVmID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgZGlyc1trZXldID0geyBiaW5kOiBkZWYsIHVwZGF0ZTogZGVmIH07CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGFzc2VydE9iamVjdFR5cGUgKG5hbWUsIHZhbHVlLCB2bSkgewogIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCIiICsgbmFtZSArICJcIjogZXhwZWN0ZWQgYW4gT2JqZWN0LCAiICsKICAgICAgImJ1dCBnb3QgIiArICh0b1Jhd1R5cGUodmFsdWUpKSArICIuIiwKICAgICAgdm0KICAgICk7CiAgfQp9CgovKioKICogTWVyZ2UgdHdvIG9wdGlvbiBvYmplY3RzIGludG8gYSBuZXcgb25lLgogKiBDb3JlIHV0aWxpdHkgdXNlZCBpbiBib3RoIGluc3RhbnRpYXRpb24gYW5kIGluaGVyaXRhbmNlLgogKi8KZnVuY3Rpb24gbWVyZ2VPcHRpb25zICgKICBwYXJlbnQsCiAgY2hpbGQsCiAgdm0KKSB7CiAgewogICAgY2hlY2tDb21wb25lbnRzKGNoaWxkKTsKICB9CgogIGlmICh0eXBlb2YgY2hpbGQgPT09ICdmdW5jdGlvbicpIHsKICAgIGNoaWxkID0gY2hpbGQub3B0aW9uczsKICB9CgogIG5vcm1hbGl6ZVByb3BzKGNoaWxkLCB2bSk7CiAgbm9ybWFsaXplSW5qZWN0KGNoaWxkLCB2bSk7CiAgbm9ybWFsaXplRGlyZWN0aXZlcyhjaGlsZCk7CiAgdmFyIGV4dGVuZHNGcm9tID0gY2hpbGQuZXh0ZW5kczsKICBpZiAoZXh0ZW5kc0Zyb20pIHsKICAgIHBhcmVudCA9IG1lcmdlT3B0aW9ucyhwYXJlbnQsIGV4dGVuZHNGcm9tLCB2bSk7CiAgfQogIGlmIChjaGlsZC5taXhpbnMpIHsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGQubWl4aW5zLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICBwYXJlbnQgPSBtZXJnZU9wdGlvbnMocGFyZW50LCBjaGlsZC5taXhpbnNbaV0sIHZtKTsKICAgIH0KICB9CiAgdmFyIG9wdGlvbnMgPSB7fTsKICB2YXIga2V5OwogIGZvciAoa2V5IGluIHBhcmVudCkgewogICAgbWVyZ2VGaWVsZChrZXkpOwogIH0KICBmb3IgKGtleSBpbiBjaGlsZCkgewogICAgaWYgKCFoYXNPd24ocGFyZW50LCBrZXkpKSB7CiAgICAgIG1lcmdlRmllbGQoa2V5KTsKICAgIH0KICB9CiAgZnVuY3Rpb24gbWVyZ2VGaWVsZCAoa2V5KSB7CiAgICB2YXIgc3RyYXQgPSBzdHJhdHNba2V5XSB8fCBkZWZhdWx0U3RyYXQ7CiAgICBvcHRpb25zW2tleV0gPSBzdHJhdChwYXJlbnRba2V5XSwgY2hpbGRba2V5XSwgdm0sIGtleSk7CiAgfQogIHJldHVybiBvcHRpb25zCn0KCi8qKgogKiBSZXNvbHZlIGFuIGFzc2V0LgogKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYmVjYXVzZSBjaGlsZCBpbnN0YW5jZXMgbmVlZCBhY2Nlc3MKICogdG8gYXNzZXRzIGRlZmluZWQgaW4gaXRzIGFuY2VzdG9yIGNoYWluLgogKi8KZnVuY3Rpb24gcmVzb2x2ZUFzc2V0ICgKICBvcHRpb25zLAogIHR5cGUsCiAgaWQsCiAgd2Fybk1pc3NpbmcKKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKHR5cGVvZiBpZCAhPT0gJ3N0cmluZycpIHsKICAgIHJldHVybgogIH0KICB2YXIgYXNzZXRzID0gb3B0aW9uc1t0eXBlXTsKICAvLyBjaGVjayBsb2NhbCByZWdpc3RyYXRpb24gdmFyaWF0aW9ucyBmaXJzdAogIGlmIChoYXNPd24oYXNzZXRzLCBpZCkpIHsgcmV0dXJuIGFzc2V0c1tpZF0gfQogIHZhciBjYW1lbGl6ZWRJZCA9IGNhbWVsaXplKGlkKTsKICBpZiAoaGFzT3duKGFzc2V0cywgY2FtZWxpemVkSWQpKSB7IHJldHVybiBhc3NldHNbY2FtZWxpemVkSWRdIH0KICB2YXIgUGFzY2FsQ2FzZUlkID0gY2FwaXRhbGl6ZShjYW1lbGl6ZWRJZCk7CiAgaWYgKGhhc093bihhc3NldHMsIFBhc2NhbENhc2VJZCkpIHsgcmV0dXJuIGFzc2V0c1tQYXNjYWxDYXNlSWRdIH0KICAvLyBmYWxsYmFjayB0byBwcm90b3R5cGUgY2hhaW4KICB2YXIgcmVzID0gYXNzZXRzW2lkXSB8fCBhc3NldHNbY2FtZWxpemVkSWRdIHx8IGFzc2V0c1tQYXNjYWxDYXNlSWRdOwogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2Fybk1pc3NpbmcgJiYgIXJlcykgewogICAgd2FybigKICAgICAgJ0ZhaWxlZCB0byByZXNvbHZlICcgKyB0eXBlLnNsaWNlKDAsIC0xKSArICc6ICcgKyBpZCwKICAgICAgb3B0aW9ucwogICAgKTsKICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCmZ1bmN0aW9uIHZhbGlkYXRlUHJvcCAoCiAga2V5LAogIHByb3BPcHRpb25zLAogIHByb3BzRGF0YSwKICB2bQopIHsKICB2YXIgcHJvcCA9IHByb3BPcHRpb25zW2tleV07CiAgdmFyIGFic2VudCA9ICFoYXNPd24ocHJvcHNEYXRhLCBrZXkpOwogIHZhciB2YWx1ZSA9IHByb3BzRGF0YVtrZXldOwogIC8vIGJvb2xlYW4gY2FzdGluZwogIHZhciBib29sZWFuSW5kZXggPSBnZXRUeXBlSW5kZXgoQm9vbGVhbiwgcHJvcC50eXBlKTsKICBpZiAoYm9vbGVhbkluZGV4ID4gLTEpIHsKICAgIGlmIChhYnNlbnQgJiYgIWhhc093bihwcm9wLCAnZGVmYXVsdCcpKSB7CiAgICAgIHZhbHVlID0gZmFsc2U7CiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gaHlwaGVuYXRlKGtleSkpIHsKICAgICAgLy8gb25seSBjYXN0IGVtcHR5IHN0cmluZyAvIHNhbWUgbmFtZSB0byBib29sZWFuIGlmCiAgICAgIC8vIGJvb2xlYW4gaGFzIGhpZ2hlciBwcmlvcml0eQogICAgICB2YXIgc3RyaW5nSW5kZXggPSBnZXRUeXBlSW5kZXgoU3RyaW5nLCBwcm9wLnR5cGUpOwogICAgICBpZiAoc3RyaW5nSW5kZXggPCAwIHx8IGJvb2xlYW5JbmRleCA8IHN0cmluZ0luZGV4KSB7CiAgICAgICAgdmFsdWUgPSB0cnVlOwogICAgICB9CiAgICB9CiAgfQogIC8vIGNoZWNrIGRlZmF1bHQgdmFsdWUKICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgdmFsdWUgPSBnZXRQcm9wRGVmYXVsdFZhbHVlKHZtLCBwcm9wLCBrZXkpOwogICAgLy8gc2luY2UgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYSBmcmVzaCBjb3B5LAogICAgLy8gbWFrZSBzdXJlIHRvIG9ic2VydmUgaXQuCiAgICB2YXIgcHJldlNob3VsZE9ic2VydmUgPSBzaG91bGRPYnNlcnZlOwogICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpOwogICAgb2JzZXJ2ZSh2YWx1ZSk7CiAgICB0b2dnbGVPYnNlcnZpbmcocHJldlNob3VsZE9ic2VydmUpOwogIH0KICB7CiAgICBhc3NlcnRQcm9wKHByb3AsIGtleSwgdmFsdWUsIHZtLCBhYnNlbnQpOwogIH0KICByZXR1cm4gdmFsdWUKfQoKLyoqCiAqIEdldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIHByb3AuCiAqLwpmdW5jdGlvbiBnZXRQcm9wRGVmYXVsdFZhbHVlICh2bSwgcHJvcCwga2V5KSB7CiAgLy8gbm8gZGVmYXVsdCwgcmV0dXJuIHVuZGVmaW5lZAogIGlmICghaGFzT3duKHByb3AsICdkZWZhdWx0JykpIHsKICAgIHJldHVybiB1bmRlZmluZWQKICB9CiAgdmFyIGRlZiA9IHByb3AuZGVmYXVsdDsKICAvLyB3YXJuIGFnYWluc3Qgbm9uLWZhY3RvcnkgZGVmYXVsdHMgZm9yIE9iamVjdCAmIEFycmF5CiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBpc09iamVjdChkZWYpKSB7CiAgICB3YXJuKAogICAgICAnSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBwcm9wICInICsga2V5ICsgJyI6ICcgKwogICAgICAnUHJvcHMgd2l0aCB0eXBlIE9iamVjdC9BcnJheSBtdXN0IHVzZSBhIGZhY3RvcnkgZnVuY3Rpb24gJyArCiAgICAgICd0byByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuJywKICAgICAgdm0KICAgICk7CiAgfQogIC8vIHRoZSByYXcgcHJvcCB2YWx1ZSB3YXMgYWxzbyB1bmRlZmluZWQgZnJvbSBwcmV2aW91cyByZW5kZXIsCiAgLy8gcmV0dXJuIHByZXZpb3VzIGRlZmF1bHQgdmFsdWUgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgd2F0Y2hlciB0cmlnZ2VyCiAgaWYgKHZtICYmIHZtLiRvcHRpb25zLnByb3BzRGF0YSAmJgogICAgdm0uJG9wdGlvbnMucHJvcHNEYXRhW2tleV0gPT09IHVuZGVmaW5lZCAmJgogICAgdm0uX3Byb3BzW2tleV0gIT09IHVuZGVmaW5lZAogICkgewogICAgcmV0dXJuIHZtLl9wcm9wc1trZXldCiAgfQogIC8vIGNhbGwgZmFjdG9yeSBmdW5jdGlvbiBmb3Igbm9uLUZ1bmN0aW9uIHR5cGVzCiAgLy8gYSB2YWx1ZSBpcyBGdW5jdGlvbiBpZiBpdHMgcHJvdG90eXBlIGlzIGZ1bmN0aW9uIGV2ZW4gYWNyb3NzIGRpZmZlcmVudCBleGVjdXRpb24gY29udGV4dAogIHJldHVybiB0eXBlb2YgZGVmID09PSAnZnVuY3Rpb24nICYmIGdldFR5cGUocHJvcC50eXBlKSAhPT0gJ0Z1bmN0aW9uJwogICAgPyBkZWYuY2FsbCh2bSkKICAgIDogZGVmCn0KCi8qKgogKiBBc3NlcnQgd2hldGhlciBhIHByb3AgaXMgdmFsaWQuCiAqLwpmdW5jdGlvbiBhc3NlcnRQcm9wICgKICBwcm9wLAogIG5hbWUsCiAgdmFsdWUsCiAgdm0sCiAgYWJzZW50CikgewogIGlmIChwcm9wLnJlcXVpcmVkICYmIGFic2VudCkgewogICAgd2FybigKICAgICAgJ01pc3NpbmcgcmVxdWlyZWQgcHJvcDogIicgKyBuYW1lICsgJyInLAogICAgICB2bQogICAgKTsKICAgIHJldHVybgogIH0KICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhcHJvcC5yZXF1aXJlZCkgewogICAgcmV0dXJuCiAgfQogIHZhciB0eXBlID0gcHJvcC50eXBlOwogIHZhciB2YWxpZCA9ICF0eXBlIHx8IHR5cGUgPT09IHRydWU7CiAgdmFyIGV4cGVjdGVkVHlwZXMgPSBbXTsKICBpZiAodHlwZSkgewogICAgaWYgKCFBcnJheS5pc0FycmF5KHR5cGUpKSB7CiAgICAgIHR5cGUgPSBbdHlwZV07CiAgICB9CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGUubGVuZ3RoICYmICF2YWxpZDsgaSsrKSB7CiAgICAgIHZhciBhc3NlcnRlZFR5cGUgPSBhc3NlcnRUeXBlKHZhbHVlLCB0eXBlW2ldKTsKICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGFzc2VydGVkVHlwZS5leHBlY3RlZFR5cGUgfHwgJycpOwogICAgICB2YWxpZCA9IGFzc2VydGVkVHlwZS52YWxpZDsKICAgIH0KICB9CiAgaWYgKCF2YWxpZCkgewogICAgd2FybigKICAgICAgIkludmFsaWQgcHJvcDogdHlwZSBjaGVjayBmYWlsZWQgZm9yIHByb3AgXCIiICsgbmFtZSArICJcIi4iICsKICAgICAgIiBFeHBlY3RlZCAiICsgKGV4cGVjdGVkVHlwZXMubWFwKGNhcGl0YWxpemUpLmpvaW4oJywgJykpICsKICAgICAgIiwgZ290ICIgKyAodG9SYXdUeXBlKHZhbHVlKSkgKyAiLiIsCiAgICAgIHZtCiAgICApOwogICAgcmV0dXJuCiAgfQogIHZhciB2YWxpZGF0b3IgPSBwcm9wLnZhbGlkYXRvcjsKICBpZiAodmFsaWRhdG9yKSB7CiAgICBpZiAoIXZhbGlkYXRvcih2YWx1ZSkpIHsKICAgICAgd2FybigKICAgICAgICAnSW52YWxpZCBwcm9wOiBjdXN0b20gdmFsaWRhdG9yIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCAiJyArIG5hbWUgKyAnIi4nLAogICAgICAgIHZtCiAgICAgICk7CiAgICB9CiAgfQp9Cgp2YXIgc2ltcGxlQ2hlY2tSRSA9IC9eKFN0cmluZ3xOdW1iZXJ8Qm9vbGVhbnxGdW5jdGlvbnxTeW1ib2wpJC87CgpmdW5jdGlvbiBhc3NlcnRUeXBlICh2YWx1ZSwgdHlwZSkgewogIHZhciB2YWxpZDsKICB2YXIgZXhwZWN0ZWRUeXBlID0gZ2V0VHlwZSh0eXBlKTsKICBpZiAoc2ltcGxlQ2hlY2tSRS50ZXN0KGV4cGVjdGVkVHlwZSkpIHsKICAgIHZhciB0ID0gdHlwZW9mIHZhbHVlOwogICAgdmFsaWQgPSB0ID09PSBleHBlY3RlZFR5cGUudG9Mb3dlckNhc2UoKTsKICAgIC8vIGZvciBwcmltaXRpdmUgd3JhcHBlciBvYmplY3RzCiAgICBpZiAoIXZhbGlkICYmIHQgPT09ICdvYmplY3QnKSB7CiAgICAgIHZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiB0eXBlOwogICAgfQogIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSAnT2JqZWN0JykgewogICAgdmFsaWQgPSBpc1BsYWluT2JqZWN0KHZhbHVlKTsKICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ0FycmF5JykgewogICAgdmFsaWQgPSBBcnJheS5pc0FycmF5KHZhbHVlKTsKICB9IGVsc2UgewogICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7CiAgfQogIHJldHVybiB7CiAgICB2YWxpZDogdmFsaWQsCiAgICBleHBlY3RlZFR5cGU6IGV4cGVjdGVkVHlwZQogIH0KfQoKLyoqCiAqIFVzZSBmdW5jdGlvbiBzdHJpbmcgbmFtZSB0byBjaGVjayBidWlsdC1pbiB0eXBlcywKICogYmVjYXVzZSBhIHNpbXBsZSBlcXVhbGl0eSBjaGVjayB3aWxsIGZhaWwgd2hlbiBydW5uaW5nCiAqIGFjcm9zcyBkaWZmZXJlbnQgdm1zIC8gaWZyYW1lcy4KICovCmZ1bmN0aW9uIGdldFR5cGUgKGZuKSB7CiAgdmFyIG1hdGNoID0gZm4gJiYgZm4udG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7CiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiAnJwp9CgpmdW5jdGlvbiBpc1NhbWVUeXBlIChhLCBiKSB7CiAgcmV0dXJuIGdldFR5cGUoYSkgPT09IGdldFR5cGUoYikKfQoKZnVuY3Rpb24gZ2V0VHlwZUluZGV4ICh0eXBlLCBleHBlY3RlZFR5cGVzKSB7CiAgaWYgKCFBcnJheS5pc0FycmF5KGV4cGVjdGVkVHlwZXMpKSB7CiAgICByZXR1cm4gaXNTYW1lVHlwZShleHBlY3RlZFR5cGVzLCB0eXBlKSA/IDAgOiAtMQogIH0KICBmb3IgKHZhciBpID0gMCwgbGVuID0gZXhwZWN0ZWRUeXBlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgaWYgKGlzU2FtZVR5cGUoZXhwZWN0ZWRUeXBlc1tpXSwgdHlwZSkpIHsKICAgICAgcmV0dXJuIGkKICAgIH0KICB9CiAgcmV0dXJuIC0xCn0KCi8qICAqLwoKZnVuY3Rpb24gaGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICBpZiAodm0pIHsKICAgIHZhciBjdXIgPSB2bTsKICAgIHdoaWxlICgoY3VyID0gY3VyLiRwYXJlbnQpKSB7CiAgICAgIHZhciBob29rcyA9IGN1ci4kb3B0aW9ucy5lcnJvckNhcHR1cmVkOwogICAgICBpZiAoaG9va3MpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB2YXIgY2FwdHVyZSA9IGhvb2tzW2ldLmNhbGwoY3VyLCBlcnIsIHZtLCBpbmZvKSA9PT0gZmFsc2U7CiAgICAgICAgICAgIGlmIChjYXB0dXJlKSB7IHJldHVybiB9CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGdsb2JhbEhhbmRsZUVycm9yKGUsIGN1ciwgJ2Vycm9yQ2FwdHVyZWQgaG9vaycpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBnbG9iYWxIYW5kbGVFcnJvcihlcnIsIHZtLCBpbmZvKTsKfQoKZnVuY3Rpb24gZ2xvYmFsSGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICBpZiAoY29uZmlnLmVycm9ySGFuZGxlcikgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIGNvbmZpZy5lcnJvckhhbmRsZXIuY2FsbChudWxsLCBlcnIsIHZtLCBpbmZvKQogICAgfSBjYXRjaCAoZSkgewogICAgICBsb2dFcnJvcihlLCBudWxsLCAnY29uZmlnLmVycm9ySGFuZGxlcicpOwogICAgfQogIH0KICBsb2dFcnJvcihlcnIsIHZtLCBpbmZvKTsKfQoKZnVuY3Rpb24gbG9nRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICB7CiAgICB3YXJuKCgiRXJyb3IgaW4gIiArIGluZm8gKyAiOiBcIiIgKyAoZXJyLnRvU3RyaW5nKCkpICsgIlwiIiksIHZtKTsKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICBpZiAoKGluQnJvd3NlciB8fCBpbldlZXgpICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykgewogICAgY29uc29sZS5lcnJvcihlcnIpOwogIH0gZWxzZSB7CiAgICB0aHJvdyBlcnIKICB9Cn0KCi8qICAqLwovKiBnbG9iYWxzIE1lc3NhZ2VDaGFubmVsICovCgp2YXIgY2FsbGJhY2tzID0gW107CnZhciBwZW5kaW5nID0gZmFsc2U7CgpmdW5jdGlvbiBmbHVzaENhbGxiYWNrcyAoKSB7CiAgcGVuZGluZyA9IGZhbHNlOwogIHZhciBjb3BpZXMgPSBjYWxsYmFja3Muc2xpY2UoMCk7CiAgY2FsbGJhY2tzLmxlbmd0aCA9IDA7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3BpZXMubGVuZ3RoOyBpKyspIHsKICAgIGNvcGllc1tpXSgpOwogIH0KfQoKLy8gSGVyZSB3ZSBoYXZlIGFzeW5jIGRlZmVycmluZyB3cmFwcGVycyB1c2luZyBib3RoIG1pY3JvdGFza3MgYW5kIChtYWNybykgdGFza3MuCi8vIEluIDwgMi40IHdlIHVzZWQgbWljcm90YXNrcyBldmVyeXdoZXJlLCBidXQgdGhlcmUgYXJlIHNvbWUgc2NlbmFyaW9zIHdoZXJlCi8vIG1pY3JvdGFza3MgaGF2ZSB0b28gaGlnaCBhIHByaW9yaXR5IGFuZCBmaXJlIGluIGJldHdlZW4gc3VwcG9zZWRseQovLyBzZXF1ZW50aWFsIGV2ZW50cyAoZS5nLiAjNDUyMSwgIzY2OTApIG9yIGV2ZW4gYmV0d2VlbiBidWJibGluZyBvZiB0aGUgc2FtZQovLyBldmVudCAoIzY1NjYpLiBIb3dldmVyLCB1c2luZyAobWFjcm8pIHRhc2tzIGV2ZXJ5d2hlcmUgYWxzbyBoYXMgc3VidGxlIHByb2JsZW1zCi8vIHdoZW4gc3RhdGUgaXMgY2hhbmdlZCByaWdodCBiZWZvcmUgcmVwYWludCAoZS5nLiAjNjgxMywgb3V0LWluIHRyYW5zaXRpb25zKS4KLy8gSGVyZSB3ZSB1c2UgbWljcm90YXNrIGJ5IGRlZmF1bHQsIGJ1dCBleHBvc2UgYSB3YXkgdG8gZm9yY2UgKG1hY3JvKSB0YXNrIHdoZW4KLy8gbmVlZGVkIChlLmcuIGluIGV2ZW50IGhhbmRsZXJzIGF0dGFjaGVkIGJ5IHYtb24pLgp2YXIgbWljcm9UaW1lckZ1bmM7CnZhciBtYWNyb1RpbWVyRnVuYzsKdmFyIHVzZU1hY3JvVGFzayA9IGZhbHNlOwoKLy8gRGV0ZXJtaW5lIChtYWNybykgdGFzayBkZWZlciBpbXBsZW1lbnRhdGlvbi4KLy8gVGVjaG5pY2FsbHkgc2V0SW1tZWRpYXRlIHNob3VsZCBiZSB0aGUgaWRlYWwgY2hvaWNlLCBidXQgaXQncyBvbmx5IGF2YWlsYWJsZQovLyBpbiBJRS4gVGhlIG9ubHkgcG9seWZpbGwgdGhhdCBjb25zaXN0ZW50bHkgcXVldWVzIHRoZSBjYWxsYmFjayBhZnRlciBhbGwgRE9NCi8vIGV2ZW50cyB0cmlnZ2VyZWQgaW4gdGhlIHNhbWUgbG9vcCBpcyBieSB1c2luZyBNZXNzYWdlQ2hhbm5lbC4KLyogaXN0YW5idWwgaWdub3JlIGlmICovCmlmICh0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShzZXRJbW1lZGlhdGUpKSB7CiAgbWFjcm9UaW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICBzZXRJbW1lZGlhdGUoZmx1c2hDYWxsYmFja3MpOwogIH07Cn0gZWxzZSBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJyAmJiAoCiAgaXNOYXRpdmUoTWVzc2FnZUNoYW5uZWwpIHx8CiAgLy8gUGhhbnRvbUpTCiAgTWVzc2FnZUNoYW5uZWwudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgTWVzc2FnZUNoYW5uZWxDb25zdHJ1Y3Rvcl0nCikpIHsKICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpOwogIHZhciBwb3J0ID0gY2hhbm5lbC5wb3J0MjsKICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZsdXNoQ2FsbGJhY2tzOwogIG1hY3JvVGltZXJGdW5jID0gZnVuY3Rpb24gKCkgewogICAgcG9ydC5wb3N0TWVzc2FnZSgxKTsKICB9Owp9IGVsc2UgewogIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgbWFjcm9UaW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICBzZXRUaW1lb3V0KGZsdXNoQ2FsbGJhY2tzLCAwKTsKICB9Owp9CgovLyBEZXRlcm1pbmUgbWljcm90YXNrIGRlZmVyIGltcGxlbWVudGF0aW9uLgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCwgJGZsb3ctZGlzYWJsZS1saW5lICovCmlmICh0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoUHJvbWlzZSkpIHsKICB2YXIgcCA9IFByb21pc2UucmVzb2x2ZSgpOwogIG1pY3JvVGltZXJGdW5jID0gZnVuY3Rpb24gKCkgewogICAgcC50aGVuKGZsdXNoQ2FsbGJhY2tzKTsKICAgIC8vIGluIHByb2JsZW1hdGljIFVJV2ViVmlld3MsIFByb21pc2UudGhlbiBkb2Vzbid0IGNvbXBsZXRlbHkgYnJlYWssIGJ1dAogICAgLy8gaXQgY2FuIGdldCBzdHVjayBpbiBhIHdlaXJkIHN0YXRlIHdoZXJlIGNhbGxiYWNrcyBhcmUgcHVzaGVkIGludG8gdGhlCiAgICAvLyBtaWNyb3Rhc2sgcXVldWUgYnV0IHRoZSBxdWV1ZSBpc24ndCBiZWluZyBmbHVzaGVkLCB1bnRpbCB0aGUgYnJvd3NlcgogICAgLy8gbmVlZHMgdG8gZG8gc29tZSBvdGhlciB3b3JrLCBlLmcuIGhhbmRsZSBhIHRpbWVyLiBUaGVyZWZvcmUgd2UgY2FuCiAgICAvLyAiZm9yY2UiIHRoZSBtaWNyb3Rhc2sgcXVldWUgdG8gYmUgZmx1c2hlZCBieSBhZGRpbmcgYW4gZW1wdHkgdGltZXIuCiAgICBpZiAoaXNJT1MpIHsgc2V0VGltZW91dChub29wKTsgfQogIH07Cn0gZWxzZSB7CiAgLy8gZmFsbGJhY2sgdG8gbWFjcm8KICBtaWNyb1RpbWVyRnVuYyA9IG1hY3JvVGltZXJGdW5jOwp9CgovKioKICogV3JhcCBhIGZ1bmN0aW9uIHNvIHRoYXQgaWYgYW55IGNvZGUgaW5zaWRlIHRyaWdnZXJzIHN0YXRlIGNoYW5nZSwKICogdGhlIGNoYW5nZXMgYXJlIHF1ZXVlZCB1c2luZyBhIChtYWNybykgdGFzayBpbnN0ZWFkIG9mIGEgbWljcm90YXNrLgogKi8KZnVuY3Rpb24gd2l0aE1hY3JvVGFzayAoZm4pIHsKICByZXR1cm4gZm4uX3dpdGhUYXNrIHx8IChmbi5fd2l0aFRhc2sgPSBmdW5jdGlvbiAoKSB7CiAgICB1c2VNYWNyb1Rhc2sgPSB0cnVlOwogICAgdmFyIHJlcyA9IGZuLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICB1c2VNYWNyb1Rhc2sgPSBmYWxzZTsKICAgIHJldHVybiByZXMKICB9KQp9CgpmdW5jdGlvbiBuZXh0VGljayAoY2IsIGN0eCkgewogIHZhciBfcmVzb2x2ZTsKICBjYWxsYmFja3MucHVzaChmdW5jdGlvbiAoKSB7CiAgICBpZiAoY2IpIHsKICAgICAgdHJ5IHsKICAgICAgICBjYi5jYWxsKGN0eCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBoYW5kbGVFcnJvcihlLCBjdHgsICduZXh0VGljaycpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKF9yZXNvbHZlKSB7CiAgICAgIF9yZXNvbHZlKGN0eCk7CiAgICB9CiAgfSk7CiAgaWYgKCFwZW5kaW5nKSB7CiAgICBwZW5kaW5nID0gdHJ1ZTsKICAgIGlmICh1c2VNYWNyb1Rhc2spIHsKICAgICAgbWFjcm9UaW1lckZ1bmMoKTsKICAgIH0gZWxzZSB7CiAgICAgIG1pY3JvVGltZXJGdW5jKCk7CiAgICB9CiAgfQogIC8vICRmbG93LWRpc2FibGUtbGluZQogIGlmICghY2IgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgX3Jlc29sdmUgPSByZXNvbHZlOwogICAgfSkKICB9Cn0KCi8qICAqLwoKdmFyIG1hcms7CnZhciBtZWFzdXJlOwoKewogIHZhciBwZXJmID0gaW5Ccm93c2VyICYmIHdpbmRvdy5wZXJmb3JtYW5jZTsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoCiAgICBwZXJmICYmCiAgICBwZXJmLm1hcmsgJiYKICAgIHBlcmYubWVhc3VyZSAmJgogICAgcGVyZi5jbGVhck1hcmtzICYmCiAgICBwZXJmLmNsZWFyTWVhc3VyZXMKICApIHsKICAgIG1hcmsgPSBmdW5jdGlvbiAodGFnKSB7IHJldHVybiBwZXJmLm1hcmsodGFnKTsgfTsKICAgIG1lYXN1cmUgPSBmdW5jdGlvbiAobmFtZSwgc3RhcnRUYWcsIGVuZFRhZykgewogICAgICBwZXJmLm1lYXN1cmUobmFtZSwgc3RhcnRUYWcsIGVuZFRhZyk7CiAgICAgIHBlcmYuY2xlYXJNYXJrcyhzdGFydFRhZyk7CiAgICAgIHBlcmYuY2xlYXJNYXJrcyhlbmRUYWcpOwogICAgICBwZXJmLmNsZWFyTWVhc3VyZXMobmFtZSk7CiAgICB9OwogIH0KfQoKLyogbm90IHR5cGUgY2hlY2tpbmcgdGhpcyBmaWxlIGJlY2F1c2UgZmxvdyBkb2Vzbid0IHBsYXkgd2VsbCB3aXRoIFByb3h5ICovCgp2YXIgaW5pdFByb3h5OwoKewogIHZhciBhbGxvd2VkR2xvYmFscyA9IG1ha2VNYXAoCiAgICAnSW5maW5pdHksdW5kZWZpbmVkLE5hTixpc0Zpbml0ZSxpc05hTiwnICsKICAgICdwYXJzZUZsb2F0LHBhcnNlSW50LGRlY29kZVVSSSxkZWNvZGVVUklDb21wb25lbnQsZW5jb2RlVVJJLGVuY29kZVVSSUNvbXBvbmVudCwnICsKICAgICdNYXRoLE51bWJlcixEYXRlLEFycmF5LE9iamVjdCxCb29sZWFuLFN0cmluZyxSZWdFeHAsTWFwLFNldCxKU09OLEludGwsJyArCiAgICAncmVxdWlyZScgLy8gZm9yIFdlYnBhY2svQnJvd3NlcmlmeQogICk7CgogIHZhciB3YXJuTm9uUHJlc2VudCA9IGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgewogICAgd2FybigKICAgICAgIlByb3BlcnR5IG9yIG1ldGhvZCBcIiIgKyBrZXkgKyAiXCIgaXMgbm90IGRlZmluZWQgb24gdGhlIGluc3RhbmNlIGJ1dCAiICsKICAgICAgJ3JlZmVyZW5jZWQgZHVyaW5nIHJlbmRlci4gTWFrZSBzdXJlIHRoYXQgdGhpcyBwcm9wZXJ0eSBpcyByZWFjdGl2ZSwgJyArCiAgICAgICdlaXRoZXIgaW4gdGhlIGRhdGEgb3B0aW9uLCBvciBmb3IgY2xhc3MtYmFzZWQgY29tcG9uZW50cywgYnkgJyArCiAgICAgICdpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5LiAnICsKICAgICAgJ1NlZTogaHR0cHM6Ly92dWVqcy5vcmcvdjIvZ3VpZGUvcmVhY3Rpdml0eS5odG1sI0RlY2xhcmluZy1SZWFjdGl2ZS1Qcm9wZXJ0aWVzLicsCiAgICAgIHRhcmdldAogICAgKTsKICB9OwoKICB2YXIgaGFzUHJveHkgPQogICAgdHlwZW9mIFByb3h5ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShQcm94eSk7CgogIGlmIChoYXNQcm94eSkgewogICAgdmFyIGlzQnVpbHRJbk1vZGlmaWVyID0gbWFrZU1hcCgnc3RvcCxwcmV2ZW50LHNlbGYsY3RybCxzaGlmdCxhbHQsbWV0YSxleGFjdCcpOwogICAgY29uZmlnLmtleUNvZGVzID0gbmV3IFByb3h5KGNvbmZpZy5rZXlDb2RlcywgewogICAgICBzZXQ6IGZ1bmN0aW9uIHNldCAodGFyZ2V0LCBrZXksIHZhbHVlKSB7CiAgICAgICAgaWYgKGlzQnVpbHRJbk1vZGlmaWVyKGtleSkpIHsKICAgICAgICAgIHdhcm4oKCJBdm9pZCBvdmVyd3JpdGluZyBidWlsdC1pbiBtb2RpZmllciBpbiBjb25maWcua2V5Q29kZXM6IC4iICsga2V5KSk7CiAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTsKICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9CgogIHZhciBoYXNIYW5kbGVyID0gewogICAgaGFzOiBmdW5jdGlvbiBoYXMgKHRhcmdldCwga2V5KSB7CiAgICAgIHZhciBoYXMgPSBrZXkgaW4gdGFyZ2V0OwogICAgICB2YXIgaXNBbGxvd2VkID0gYWxsb3dlZEdsb2JhbHMoa2V5KSB8fCBrZXkuY2hhckF0KDApID09PSAnXyc7CiAgICAgIGlmICghaGFzICYmICFpc0FsbG93ZWQpIHsKICAgICAgICB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGhhcyB8fCAhaXNBbGxvd2VkCiAgICB9CiAgfTsKCiAgdmFyIGdldEhhbmRsZXIgPSB7CiAgICBnZXQ6IGZ1bmN0aW9uIGdldCAodGFyZ2V0LCBrZXkpIHsKICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmICEoa2V5IGluIHRhcmdldCkpIHsKICAgICAgICB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRhcmdldFtrZXldCiAgICB9CiAgfTsKCiAgaW5pdFByb3h5ID0gZnVuY3Rpb24gaW5pdFByb3h5ICh2bSkgewogICAgaWYgKGhhc1Byb3h5KSB7CiAgICAgIC8vIGRldGVybWluZSB3aGljaCBwcm94eSBoYW5kbGVyIHRvIHVzZQogICAgICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zOwogICAgICB2YXIgaGFuZGxlcnMgPSBvcHRpb25zLnJlbmRlciAmJiBvcHRpb25zLnJlbmRlci5fd2l0aFN0cmlwcGVkCiAgICAgICAgPyBnZXRIYW5kbGVyCiAgICAgICAgOiBoYXNIYW5kbGVyOwogICAgICB2bS5fcmVuZGVyUHJveHkgPSBuZXcgUHJveHkodm0sIGhhbmRsZXJzKTsKICAgIH0gZWxzZSB7CiAgICAgIHZtLl9yZW5kZXJQcm94eSA9IHZtOwogICAgfQogIH07Cn0KCi8qICAqLwoKdmFyIHNlZW5PYmplY3RzID0gbmV3IF9TZXQoKTsKCi8qKgogKiBSZWN1cnNpdmVseSB0cmF2ZXJzZSBhbiBvYmplY3QgdG8gZXZva2UgYWxsIGNvbnZlcnRlZAogKiBnZXR0ZXJzLCBzbyB0aGF0IGV2ZXJ5IG5lc3RlZCBwcm9wZXJ0eSBpbnNpZGUgdGhlIG9iamVjdAogKiBpcyBjb2xsZWN0ZWQgYXMgYSAiZGVlcCIgZGVwZW5kZW5jeS4KICovCmZ1bmN0aW9uIHRyYXZlcnNlICh2YWwpIHsKICBfdHJhdmVyc2UodmFsLCBzZWVuT2JqZWN0cyk7CiAgc2Vlbk9iamVjdHMuY2xlYXIoKTsKfQoKZnVuY3Rpb24gX3RyYXZlcnNlICh2YWwsIHNlZW4pIHsKICB2YXIgaSwga2V5czsKICB2YXIgaXNBID0gQXJyYXkuaXNBcnJheSh2YWwpOwogIGlmICgoIWlzQSAmJiAhaXNPYmplY3QodmFsKSkgfHwgT2JqZWN0LmlzRnJvemVuKHZhbCkgfHwgdmFsIGluc3RhbmNlb2YgVk5vZGUpIHsKICAgIHJldHVybgogIH0KICBpZiAodmFsLl9fb2JfXykgewogICAgdmFyIGRlcElkID0gdmFsLl9fb2JfXy5kZXAuaWQ7CiAgICBpZiAoc2Vlbi5oYXMoZGVwSWQpKSB7CiAgICAgIHJldHVybgogICAgfQogICAgc2Vlbi5hZGQoZGVwSWQpOwogIH0KICBpZiAoaXNBKSB7CiAgICBpID0gdmFsLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsgX3RyYXZlcnNlKHZhbFtpXSwgc2Vlbik7IH0KICB9IGVsc2UgewogICAga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7CiAgICBpID0ga2V5cy5sZW5ndGg7CiAgICB3aGlsZSAoaS0tKSB7IF90cmF2ZXJzZSh2YWxba2V5c1tpXV0sIHNlZW4pOyB9CiAgfQp9CgovKiAgKi8KCnZhciBub3JtYWxpemVFdmVudCA9IGNhY2hlZChmdW5jdGlvbiAobmFtZSkgewogIHZhciBwYXNzaXZlID0gbmFtZS5jaGFyQXQoMCkgPT09ICcmJzsKICBuYW1lID0gcGFzc2l2ZSA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lOwogIHZhciBvbmNlJCQxID0gbmFtZS5jaGFyQXQoMCkgPT09ICd+JzsgLy8gUHJlZml4ZWQgbGFzdCwgY2hlY2tlZCBmaXJzdAogIG5hbWUgPSBvbmNlJCQxID8gbmFtZS5zbGljZSgxKSA6IG5hbWU7CiAgdmFyIGNhcHR1cmUgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJyEnOwogIG5hbWUgPSBjYXB0dXJlID8gbmFtZS5zbGljZSgxKSA6IG5hbWU7CiAgcmV0dXJuIHsKICAgIG5hbWU6IG5hbWUsCiAgICBvbmNlOiBvbmNlJCQxLAogICAgY2FwdHVyZTogY2FwdHVyZSwKICAgIHBhc3NpdmU6IHBhc3NpdmUKICB9Cn0pOwoKZnVuY3Rpb24gY3JlYXRlRm5JbnZva2VyIChmbnMpIHsKICBmdW5jdGlvbiBpbnZva2VyICgpIHsKICAgIHZhciBhcmd1bWVudHMkMSA9IGFyZ3VtZW50czsKCiAgICB2YXIgZm5zID0gaW52b2tlci5mbnM7CiAgICBpZiAoQXJyYXkuaXNBcnJheShmbnMpKSB7CiAgICAgIHZhciBjbG9uZWQgPSBmbnMuc2xpY2UoKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9uZWQubGVuZ3RoOyBpKyspIHsKICAgICAgICBjbG9uZWRbaV0uYXBwbHkobnVsbCwgYXJndW1lbnRzJDEpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyByZXR1cm4gaGFuZGxlciByZXR1cm4gdmFsdWUgZm9yIHNpbmdsZSBoYW5kbGVycwogICAgICByZXR1cm4gZm5zLmFwcGx5KG51bGwsIGFyZ3VtZW50cykKICAgIH0KICB9CiAgaW52b2tlci5mbnMgPSBmbnM7CiAgcmV0dXJuIGludm9rZXIKfQoKZnVuY3Rpb24gdXBkYXRlTGlzdGVuZXJzICgKICBvbiwKICBvbGRPbiwKICBhZGQsCiAgcmVtb3ZlJCQxLAogIHZtCikgewogIHZhciBuYW1lLCBkZWYsIGN1ciwgb2xkLCBldmVudDsKICBmb3IgKG5hbWUgaW4gb24pIHsKICAgIGRlZiA9IGN1ciA9IG9uW25hbWVdOwogICAgb2xkID0gb2xkT25bbmFtZV07CiAgICBldmVudCA9IG5vcm1hbGl6ZUV2ZW50KG5hbWUpOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoaXNVbmRlZihjdXIpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJJbnZhbGlkIGhhbmRsZXIgZm9yIGV2ZW50IFwiIiArIChldmVudC5uYW1lKSArICJcIjogZ290ICIgKyBTdHJpbmcoY3VyKSwKICAgICAgICB2bQogICAgICApOwogICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZCkpIHsKICAgICAgaWYgKGlzVW5kZWYoY3VyLmZucykpIHsKICAgICAgICBjdXIgPSBvbltuYW1lXSA9IGNyZWF0ZUZuSW52b2tlcihjdXIpOwogICAgICB9CiAgICAgIGFkZChldmVudC5uYW1lLCBjdXIsIGV2ZW50Lm9uY2UsIGV2ZW50LmNhcHR1cmUsIGV2ZW50LnBhc3NpdmUsIGV2ZW50LnBhcmFtcyk7CiAgICB9IGVsc2UgaWYgKGN1ciAhPT0gb2xkKSB7CiAgICAgIG9sZC5mbnMgPSBjdXI7CiAgICAgIG9uW25hbWVdID0gb2xkOwogICAgfQogIH0KICBmb3IgKG5hbWUgaW4gb2xkT24pIHsKICAgIGlmIChpc1VuZGVmKG9uW25hbWVdKSkgewogICAgICBldmVudCA9IG5vcm1hbGl6ZUV2ZW50KG5hbWUpOwogICAgICByZW1vdmUkJDEoZXZlbnQubmFtZSwgb2xkT25bbmFtZV0sIGV2ZW50LmNhcHR1cmUpOwogICAgfQogIH0KfQoKLyogICovCgpmdW5jdGlvbiBtZXJnZVZOb2RlSG9vayAoZGVmLCBob29rS2V5LCBob29rKSB7CiAgaWYgKGRlZiBpbnN0YW5jZW9mIFZOb2RlKSB7CiAgICBkZWYgPSBkZWYuZGF0YS5ob29rIHx8IChkZWYuZGF0YS5ob29rID0ge30pOwogIH0KICB2YXIgaW52b2tlcjsKICB2YXIgb2xkSG9vayA9IGRlZltob29rS2V5XTsKCiAgZnVuY3Rpb24gd3JhcHBlZEhvb2sgKCkgewogICAgaG9vay5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgLy8gaW1wb3J0YW50OiByZW1vdmUgbWVyZ2VkIGhvb2sgdG8gZW5zdXJlIGl0J3MgY2FsbGVkIG9ubHkgb25jZQogICAgLy8gYW5kIHByZXZlbnQgbWVtb3J5IGxlYWsKICAgIHJlbW92ZShpbnZva2VyLmZucywgd3JhcHBlZEhvb2spOwogIH0KCiAgaWYgKGlzVW5kZWYob2xkSG9vaykpIHsKICAgIC8vIG5vIGV4aXN0aW5nIGhvb2sKICAgIGludm9rZXIgPSBjcmVhdGVGbkludm9rZXIoW3dyYXBwZWRIb29rXSk7CiAgfSBlbHNlIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKGlzRGVmKG9sZEhvb2suZm5zKSAmJiBpc1RydWUob2xkSG9vay5tZXJnZWQpKSB7CiAgICAgIC8vIGFscmVhZHkgYSBtZXJnZWQgaW52b2tlcgogICAgICBpbnZva2VyID0gb2xkSG9vazsKICAgICAgaW52b2tlci5mbnMucHVzaCh3cmFwcGVkSG9vayk7CiAgICB9IGVsc2UgewogICAgICAvLyBleGlzdGluZyBwbGFpbiBob29rCiAgICAgIGludm9rZXIgPSBjcmVhdGVGbkludm9rZXIoW29sZEhvb2ssIHdyYXBwZWRIb29rXSk7CiAgICB9CiAgfQoKICBpbnZva2VyLm1lcmdlZCA9IHRydWU7CiAgZGVmW2hvb2tLZXldID0gaW52b2tlcjsKfQoKLyogICovCgpmdW5jdGlvbiBleHRyYWN0UHJvcHNGcm9tVk5vZGVEYXRhICgKICBkYXRhLAogIEN0b3IsCiAgdGFnCikgewogIC8vIHdlIGFyZSBvbmx5IGV4dHJhY3RpbmcgcmF3IHZhbHVlcyBoZXJlLgogIC8vIHZhbGlkYXRpb24gYW5kIGRlZmF1bHQgdmFsdWVzIGFyZSBoYW5kbGVkIGluIHRoZSBjaGlsZAogIC8vIGNvbXBvbmVudCBpdHNlbGYuCiAgdmFyIHByb3BPcHRpb25zID0gQ3Rvci5vcHRpb25zLnByb3BzOwogIGlmIChpc1VuZGVmKHByb3BPcHRpb25zKSkgewogICAgcmV0dXJuCiAgfQogIHZhciByZXMgPSB7fTsKICB2YXIgYXR0cnMgPSBkYXRhLmF0dHJzOwogIHZhciBwcm9wcyA9IGRhdGEucHJvcHM7CiAgaWYgKGlzRGVmKGF0dHJzKSB8fCBpc0RlZihwcm9wcykpIHsKICAgIGZvciAodmFyIGtleSBpbiBwcm9wT3B0aW9ucykgewogICAgICB2YXIgYWx0S2V5ID0gaHlwaGVuYXRlKGtleSk7CiAgICAgIHsKICAgICAgICB2YXIga2V5SW5Mb3dlckNhc2UgPSBrZXkudG9Mb3dlckNhc2UoKTsKICAgICAgICBpZiAoCiAgICAgICAgICBrZXkgIT09IGtleUluTG93ZXJDYXNlICYmCiAgICAgICAgICBhdHRycyAmJiBoYXNPd24oYXR0cnMsIGtleUluTG93ZXJDYXNlKQogICAgICAgICkgewogICAgICAgICAgdGlwKAogICAgICAgICAgICAiUHJvcCBcIiIgKyBrZXlJbkxvd2VyQ2FzZSArICJcIiBpcyBwYXNzZWQgdG8gY29tcG9uZW50ICIgKwogICAgICAgICAgICAoZm9ybWF0Q29tcG9uZW50TmFtZSh0YWcgfHwgQ3RvcikpICsgIiwgYnV0IHRoZSBkZWNsYXJlZCBwcm9wIG5hbWUgaXMiICsKICAgICAgICAgICAgIiBcIiIgKyBrZXkgKyAiXCIuICIgKwogICAgICAgICAgICAiTm90ZSB0aGF0IEhUTUwgYXR0cmlidXRlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgY2FtZWxDYXNlZCAiICsKICAgICAgICAgICAgInByb3BzIG5lZWQgdG8gdXNlIHRoZWlyIGtlYmFiLWNhc2UgZXF1aXZhbGVudHMgd2hlbiB1c2luZyBpbi1ET00gIiArCiAgICAgICAgICAgICJ0ZW1wbGF0ZXMuIFlvdSBzaG91bGQgcHJvYmFibHkgdXNlIFwiIiArIGFsdEtleSArICJcIiBpbnN0ZWFkIG9mIFwiIiArIGtleSArICJcIi4iCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfQogICAgICBjaGVja1Byb3AocmVzLCBwcm9wcywga2V5LCBhbHRLZXksIHRydWUpIHx8CiAgICAgIGNoZWNrUHJvcChyZXMsIGF0dHJzLCBrZXksIGFsdEtleSwgZmFsc2UpOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIGNoZWNrUHJvcCAoCiAgcmVzLAogIGhhc2gsCiAga2V5LAogIGFsdEtleSwKICBwcmVzZXJ2ZQopIHsKICBpZiAoaXNEZWYoaGFzaCkpIHsKICAgIGlmIChoYXNPd24oaGFzaCwga2V5KSkgewogICAgICByZXNba2V5XSA9IGhhc2hba2V5XTsKICAgICAgaWYgKCFwcmVzZXJ2ZSkgewogICAgICAgIGRlbGV0ZSBoYXNoW2tleV07CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWUKICAgIH0gZWxzZSBpZiAoaGFzT3duKGhhc2gsIGFsdEtleSkpIHsKICAgICAgcmVzW2tleV0gPSBoYXNoW2FsdEtleV07CiAgICAgIGlmICghcHJlc2VydmUpIHsKICAgICAgICBkZWxldGUgaGFzaFthbHRLZXldOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlCiAgICB9CiAgfQogIHJldHVybiBmYWxzZQp9CgovKiAgKi8KCi8vIFRoZSB0ZW1wbGF0ZSBjb21waWxlciBhdHRlbXB0cyB0byBtaW5pbWl6ZSB0aGUgbmVlZCBmb3Igbm9ybWFsaXphdGlvbiBieQovLyBzdGF0aWNhbGx5IGFuYWx5emluZyB0aGUgdGVtcGxhdGUgYXQgY29tcGlsZSB0aW1lLgovLwovLyBGb3IgcGxhaW4gSFRNTCBtYXJrdXAsIG5vcm1hbGl6YXRpb24gY2FuIGJlIGNvbXBsZXRlbHkgc2tpcHBlZCBiZWNhdXNlIHRoZQovLyBnZW5lcmF0ZWQgcmVuZGVyIGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIEFycmF5PFZOb2RlPi4gVGhlcmUgYXJlCi8vIHR3byBjYXNlcyB3aGVyZSBleHRyYSBub3JtYWxpemF0aW9uIGlzIG5lZWRlZDoKCi8vIDEuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbXBvbmVudHMgLSBiZWNhdXNlIGEgZnVuY3Rpb25hbCBjb21wb25lbnQKLy8gbWF5IHJldHVybiBhbiBBcnJheSBpbnN0ZWFkIG9mIGEgc2luZ2xlIHJvb3QuIEluIHRoaXMgY2FzZSwganVzdCBhIHNpbXBsZQovLyBub3JtYWxpemF0aW9uIGlzIG5lZWRlZCAtIGlmIGFueSBjaGlsZCBpcyBhbiBBcnJheSwgd2UgZmxhdHRlbiB0aGUgd2hvbGUKLy8gdGhpbmcgd2l0aCBBcnJheS5wcm90b3R5cGUuY29uY2F0LiBJdCBpcyBndWFyYW50ZWVkIHRvIGJlIG9ubHkgMS1sZXZlbCBkZWVwCi8vIGJlY2F1c2UgZnVuY3Rpb25hbCBjb21wb25lbnRzIGFscmVhZHkgbm9ybWFsaXplIHRoZWlyIG93biBjaGlsZHJlbi4KZnVuY3Rpb24gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4gKGNoaWxkcmVuKSB7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW5baV0pKSB7CiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBjaGlsZHJlbikKICAgIH0KICB9CiAgcmV0dXJuIGNoaWxkcmVuCn0KCi8vIDIuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbnN0cnVjdHMgdGhhdCBhbHdheXMgZ2VuZXJhdGVkIG5lc3RlZCBBcnJheXMsCi8vIGUuZy4gPHRlbXBsYXRlPiwgPHNsb3Q+LCB2LWZvciwgb3Igd2hlbiB0aGUgY2hpbGRyZW4gaXMgcHJvdmlkZWQgYnkgdXNlcgovLyB3aXRoIGhhbmQtd3JpdHRlbiByZW5kZXIgZnVuY3Rpb25zIC8gSlNYLiBJbiBzdWNoIGNhc2VzIGEgZnVsbCBub3JtYWxpemF0aW9uCi8vIGlzIG5lZWRlZCB0byBjYXRlciB0byBhbGwgcG9zc2libGUgdHlwZXMgb2YgY2hpbGRyZW4gdmFsdWVzLgpmdW5jdGlvbiBub3JtYWxpemVDaGlsZHJlbiAoY2hpbGRyZW4pIHsKICByZXR1cm4gaXNQcmltaXRpdmUoY2hpbGRyZW4pCiAgICA/IFtjcmVhdGVUZXh0Vk5vZGUoY2hpbGRyZW4pXQogICAgOiBBcnJheS5pc0FycmF5KGNoaWxkcmVuKQogICAgICA/IG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4oY2hpbGRyZW4pCiAgICAgIDogdW5kZWZpbmVkCn0KCmZ1bmN0aW9uIGlzVGV4dE5vZGUgKG5vZGUpIHsKICByZXR1cm4gaXNEZWYobm9kZSkgJiYgaXNEZWYobm9kZS50ZXh0KSAmJiBpc0ZhbHNlKG5vZGUuaXNDb21tZW50KQp9CgpmdW5jdGlvbiBub3JtYWxpemVBcnJheUNoaWxkcmVuIChjaGlsZHJlbiwgbmVzdGVkSW5kZXgpIHsKICB2YXIgcmVzID0gW107CiAgdmFyIGksIGMsIGxhc3RJbmRleCwgbGFzdDsKICBmb3IgKGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgIGMgPSBjaGlsZHJlbltpXTsKICAgIGlmIChpc1VuZGVmKGMpIHx8IHR5cGVvZiBjID09PSAnYm9vbGVhbicpIHsgY29udGludWUgfQogICAgbGFzdEluZGV4ID0gcmVzLmxlbmd0aCAtIDE7CiAgICBsYXN0ID0gcmVzW2xhc3RJbmRleF07CiAgICAvLyAgbmVzdGVkCiAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkgewogICAgICBpZiAoYy5sZW5ndGggPiAwKSB7CiAgICAgICAgYyA9IG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4oYywgKChuZXN0ZWRJbmRleCB8fCAnJykgKyAiXyIgKyBpKSk7CiAgICAgICAgLy8gbWVyZ2UgYWRqYWNlbnQgdGV4dCBub2RlcwogICAgICAgIGlmIChpc1RleHROb2RlKGNbMF0pICYmIGlzVGV4dE5vZGUobGFzdCkpIHsKICAgICAgICAgIHJlc1tsYXN0SW5kZXhdID0gY3JlYXRlVGV4dFZOb2RlKGxhc3QudGV4dCArIChjWzBdKS50ZXh0KTsKICAgICAgICAgIGMuc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgcmVzLnB1c2guYXBwbHkocmVzLCBjKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZShjKSkgewogICAgICBpZiAoaXNUZXh0Tm9kZShsYXN0KSkgewogICAgICAgIC8vIG1lcmdlIGFkamFjZW50IHRleHQgbm9kZXMKICAgICAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgU1NSIGh5ZHJhdGlvbiBiZWNhdXNlIHRleHQgbm9kZXMgYXJlCiAgICAgICAgLy8gZXNzZW50aWFsbHkgbWVyZ2VkIHdoZW4gcmVuZGVyZWQgdG8gSFRNTCBzdHJpbmdzCiAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYyk7CiAgICAgIH0gZWxzZSBpZiAoYyAhPT0gJycpIHsKICAgICAgICAvLyBjb252ZXJ0IHByaW1pdGl2ZSB0byB2bm9kZQogICAgICAgIHJlcy5wdXNoKGNyZWF0ZVRleHRWTm9kZShjKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChpc1RleHROb2RlKGMpICYmIGlzVGV4dE5vZGUobGFzdCkpIHsKICAgICAgICAvLyBtZXJnZSBhZGphY2VudCB0ZXh0IG5vZGVzCiAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYy50ZXh0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBkZWZhdWx0IGtleSBmb3IgbmVzdGVkIGFycmF5IGNoaWxkcmVuIChsaWtlbHkgZ2VuZXJhdGVkIGJ5IHYtZm9yKQogICAgICAgIGlmIChpc1RydWUoY2hpbGRyZW4uX2lzVkxpc3QpICYmCiAgICAgICAgICBpc0RlZihjLnRhZykgJiYKICAgICAgICAgIGlzVW5kZWYoYy5rZXkpICYmCiAgICAgICAgICBpc0RlZihuZXN0ZWRJbmRleCkpIHsKICAgICAgICAgIGMua2V5ID0gIl9fdmxpc3QiICsgbmVzdGVkSW5kZXggKyAiXyIgKyBpICsgIl9fIjsKICAgICAgICB9CiAgICAgICAgcmVzLnB1c2goYyk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCmZ1bmN0aW9uIGVuc3VyZUN0b3IgKGNvbXAsIGJhc2UpIHsKICBpZiAoCiAgICBjb21wLl9fZXNNb2R1bGUgfHwKICAgIChoYXNTeW1ib2wgJiYgY29tcFtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnTW9kdWxlJykKICApIHsKICAgIGNvbXAgPSBjb21wLmRlZmF1bHQ7CiAgfQogIHJldHVybiBpc09iamVjdChjb21wKQogICAgPyBiYXNlLmV4dGVuZChjb21wKQogICAgOiBjb21wCn0KCmZ1bmN0aW9uIGNyZWF0ZUFzeW5jUGxhY2Vob2xkZXIgKAogIGZhY3RvcnksCiAgZGF0YSwKICBjb250ZXh0LAogIGNoaWxkcmVuLAogIHRhZwopIHsKICB2YXIgbm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTsKICBub2RlLmFzeW5jRmFjdG9yeSA9IGZhY3Rvcnk7CiAgbm9kZS5hc3luY01ldGEgPSB7IGRhdGE6IGRhdGEsIGNvbnRleHQ6IGNvbnRleHQsIGNoaWxkcmVuOiBjaGlsZHJlbiwgdGFnOiB0YWcgfTsKICByZXR1cm4gbm9kZQp9CgpmdW5jdGlvbiByZXNvbHZlQXN5bmNDb21wb25lbnQgKAogIGZhY3RvcnksCiAgYmFzZUN0b3IsCiAgY29udGV4dAopIHsKICBpZiAoaXNUcnVlKGZhY3RvcnkuZXJyb3IpICYmIGlzRGVmKGZhY3RvcnkuZXJyb3JDb21wKSkgewogICAgcmV0dXJuIGZhY3RvcnkuZXJyb3JDb21wCiAgfQoKICBpZiAoaXNEZWYoZmFjdG9yeS5yZXNvbHZlZCkpIHsKICAgIHJldHVybiBmYWN0b3J5LnJlc29sdmVkCiAgfQoKICBpZiAoaXNUcnVlKGZhY3RvcnkubG9hZGluZykgJiYgaXNEZWYoZmFjdG9yeS5sb2FkaW5nQ29tcCkpIHsKICAgIHJldHVybiBmYWN0b3J5LmxvYWRpbmdDb21wCiAgfQoKICBpZiAoaXNEZWYoZmFjdG9yeS5jb250ZXh0cykpIHsKICAgIC8vIGFscmVhZHkgcGVuZGluZwogICAgZmFjdG9yeS5jb250ZXh0cy5wdXNoKGNvbnRleHQpOwogIH0gZWxzZSB7CiAgICB2YXIgY29udGV4dHMgPSBmYWN0b3J5LmNvbnRleHRzID0gW2NvbnRleHRdOwogICAgdmFyIHN5bmMgPSB0cnVlOwoKICAgIHZhciBmb3JjZVJlbmRlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjb250ZXh0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICBjb250ZXh0c1tpXS4kZm9yY2VVcGRhdGUoKTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgcmVzb2x2ZSA9IG9uY2UoZnVuY3Rpb24gKHJlcykgewogICAgICAvLyBjYWNoZSByZXNvbHZlZAogICAgICBmYWN0b3J5LnJlc29sdmVkID0gZW5zdXJlQ3RvcihyZXMsIGJhc2VDdG9yKTsKICAgICAgLy8gaW52b2tlIGNhbGxiYWNrcyBvbmx5IGlmIHRoaXMgaXMgbm90IGEgc3luY2hyb25vdXMgcmVzb2x2ZQogICAgICAvLyAoYXN5bmMgcmVzb2x2ZXMgYXJlIHNoaW1tZWQgYXMgc3luY2hyb25vdXMgZHVyaW5nIFNTUikKICAgICAgaWYgKCFzeW5jKSB7CiAgICAgICAgZm9yY2VSZW5kZXIoKTsKICAgICAgfQogICAgfSk7CgogICAgdmFyIHJlamVjdCA9IG9uY2UoZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgICAiRmFpbGVkIHRvIHJlc29sdmUgYXN5bmMgY29tcG9uZW50OiAiICsgKFN0cmluZyhmYWN0b3J5KSkgKwogICAgICAgIChyZWFzb24gPyAoIlxuUmVhc29uOiAiICsgcmVhc29uKSA6ICcnKQogICAgICApOwogICAgICBpZiAoaXNEZWYoZmFjdG9yeS5lcnJvckNvbXApKSB7CiAgICAgICAgZmFjdG9yeS5lcnJvciA9IHRydWU7CiAgICAgICAgZm9yY2VSZW5kZXIoKTsKICAgICAgfQogICAgfSk7CgogICAgdmFyIHJlcyA9IGZhY3RvcnkocmVzb2x2ZSwgcmVqZWN0KTsKCiAgICBpZiAoaXNPYmplY3QocmVzKSkgewogICAgICBpZiAodHlwZW9mIHJlcy50aGVuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgLy8gKCkgPT4gUHJvbWlzZQogICAgICAgIGlmIChpc1VuZGVmKGZhY3RvcnkucmVzb2x2ZWQpKSB7CiAgICAgICAgICByZXMudGhlbihyZXNvbHZlLCByZWplY3QpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChpc0RlZihyZXMuY29tcG9uZW50KSAmJiB0eXBlb2YgcmVzLmNvbXBvbmVudC50aGVuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmVzLmNvbXBvbmVudC50aGVuKHJlc29sdmUsIHJlamVjdCk7CgogICAgICAgIGlmIChpc0RlZihyZXMuZXJyb3IpKSB7CiAgICAgICAgICBmYWN0b3J5LmVycm9yQ29tcCA9IGVuc3VyZUN0b3IocmVzLmVycm9yLCBiYXNlQ3Rvcik7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNEZWYocmVzLmxvYWRpbmcpKSB7CiAgICAgICAgICBmYWN0b3J5LmxvYWRpbmdDb21wID0gZW5zdXJlQ3RvcihyZXMubG9hZGluZywgYmFzZUN0b3IpOwogICAgICAgICAgaWYgKHJlcy5kZWxheSA9PT0gMCkgewogICAgICAgICAgICBmYWN0b3J5LmxvYWRpbmcgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgaWYgKGlzVW5kZWYoZmFjdG9yeS5yZXNvbHZlZCkgJiYgaXNVbmRlZihmYWN0b3J5LmVycm9yKSkgewogICAgICAgICAgICAgICAgZmFjdG9yeS5sb2FkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGZvcmNlUmVuZGVyKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCByZXMuZGVsYXkgfHwgMjAwKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChpc0RlZihyZXMudGltZW91dCkpIHsKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoaXNVbmRlZihmYWN0b3J5LnJlc29sdmVkKSkgewogICAgICAgICAgICAgIHJlamVjdCgKICAgICAgICAgICAgICAgICJ0aW1lb3V0ICgiICsgKHJlcy50aW1lb3V0KSArICJtcykiCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgcmVzLnRpbWVvdXQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHN5bmMgPSBmYWxzZTsKICAgIC8vIHJldHVybiBpbiBjYXNlIHJlc29sdmVkIHN5bmNocm9ub3VzbHkKICAgIHJldHVybiBmYWN0b3J5LmxvYWRpbmcKICAgICAgPyBmYWN0b3J5LmxvYWRpbmdDb21wCiAgICAgIDogZmFjdG9yeS5yZXNvbHZlZAogIH0KfQoKLyogICovCgpmdW5jdGlvbiBpc0FzeW5jUGxhY2Vob2xkZXIgKG5vZGUpIHsKICByZXR1cm4gbm9kZS5pc0NvbW1lbnQgJiYgbm9kZS5hc3luY0ZhY3RvcnkKfQoKLyogICovCgpmdW5jdGlvbiBnZXRGaXJzdENvbXBvbmVudENoaWxkIChjaGlsZHJlbikgewogIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICB2YXIgYyA9IGNoaWxkcmVuW2ldOwogICAgICBpZiAoaXNEZWYoYykgJiYgKGlzRGVmKGMuY29tcG9uZW50T3B0aW9ucykgfHwgaXNBc3luY1BsYWNlaG9sZGVyKGMpKSkgewogICAgICAgIHJldHVybiBjCiAgICAgIH0KICAgIH0KICB9Cn0KCi8qICAqLwoKLyogICovCgpmdW5jdGlvbiBpbml0RXZlbnRzICh2bSkgewogIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIHZtLl9oYXNIb29rRXZlbnQgPSBmYWxzZTsKICAvLyBpbml0IHBhcmVudCBhdHRhY2hlZCBldmVudHMKICB2YXIgbGlzdGVuZXJzID0gdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVyczsKICBpZiAobGlzdGVuZXJzKSB7CiAgICB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnModm0sIGxpc3RlbmVycyk7CiAgfQp9Cgp2YXIgdGFyZ2V0OwoKZnVuY3Rpb24gYWRkIChldmVudCwgZm4sIG9uY2UpIHsKICBpZiAob25jZSkgewogICAgdGFyZ2V0LiRvbmNlKGV2ZW50LCBmbik7CiAgfSBlbHNlIHsKICAgIHRhcmdldC4kb24oZXZlbnQsIGZuKTsKICB9Cn0KCmZ1bmN0aW9uIHJlbW92ZSQxIChldmVudCwgZm4pIHsKICB0YXJnZXQuJG9mZihldmVudCwgZm4pOwp9CgpmdW5jdGlvbiB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnMgKAogIHZtLAogIGxpc3RlbmVycywKICBvbGRMaXN0ZW5lcnMKKSB7CiAgdGFyZ2V0ID0gdm07CiAgdXBkYXRlTGlzdGVuZXJzKGxpc3RlbmVycywgb2xkTGlzdGVuZXJzIHx8IHt9LCBhZGQsIHJlbW92ZSQxLCB2bSk7CiAgdGFyZ2V0ID0gdW5kZWZpbmVkOwp9CgpmdW5jdGlvbiBldmVudHNNaXhpbiAoVnVlKSB7CiAgdmFyIGhvb2tSRSA9IC9eaG9vazovOwogIFZ1ZS5wcm90b3R5cGUuJG9uID0gZnVuY3Rpb24gKGV2ZW50LCBmbikgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIHZtID0gdGhpczsKICAgIGlmIChBcnJheS5pc0FycmF5KGV2ZW50KSkgewogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGV2ZW50Lmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgIHRoaXMkMS4kb24oZXZlbnRbaV0sIGZuKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgKHZtLl9ldmVudHNbZXZlbnRdIHx8ICh2bS5fZXZlbnRzW2V2ZW50XSA9IFtdKSkucHVzaChmbik7CiAgICAgIC8vIG9wdGltaXplIGhvb2s6ZXZlbnQgY29zdCBieSB1c2luZyBhIGJvb2xlYW4gZmxhZyBtYXJrZWQgYXQgcmVnaXN0cmF0aW9uCiAgICAgIC8vIGluc3RlYWQgb2YgYSBoYXNoIGxvb2t1cAogICAgICBpZiAoaG9va1JFLnRlc3QoZXZlbnQpKSB7CiAgICAgICAgdm0uX2hhc0hvb2tFdmVudCA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2bQogIH07CgogIFZ1ZS5wcm90b3R5cGUuJG9uY2UgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgZnVuY3Rpb24gb24gKCkgewogICAgICB2bS4kb2ZmKGV2ZW50LCBvbik7CiAgICAgIGZuLmFwcGx5KHZtLCBhcmd1bWVudHMpOwogICAgfQogICAgb24uZm4gPSBmbjsKICAgIHZtLiRvbihldmVudCwgb24pOwogICAgcmV0dXJuIHZtCiAgfTsKCiAgVnVlLnByb3RvdHlwZS4kb2ZmID0gZnVuY3Rpb24gKGV2ZW50LCBmbikgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIHZtID0gdGhpczsKICAgIC8vIGFsbAogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICByZXR1cm4gdm0KICAgIH0KICAgIC8vIGFycmF5IG9mIGV2ZW50cwogICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnQpKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gZXZlbnQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgdGhpcyQxLiRvZmYoZXZlbnRbaV0sIGZuKTsKICAgICAgfQogICAgICByZXR1cm4gdm0KICAgIH0KICAgIC8vIHNwZWNpZmljIGV2ZW50CiAgICB2YXIgY2JzID0gdm0uX2V2ZW50c1tldmVudF07CiAgICBpZiAoIWNicykgewogICAgICByZXR1cm4gdm0KICAgIH0KICAgIGlmICghZm4pIHsKICAgICAgdm0uX2V2ZW50c1tldmVudF0gPSBudWxsOwogICAgICByZXR1cm4gdm0KICAgIH0KICAgIGlmIChmbikgewogICAgICAvLyBzcGVjaWZpYyBoYW5kbGVyCiAgICAgIHZhciBjYjsKICAgICAgdmFyIGkkMSA9IGNicy5sZW5ndGg7CiAgICAgIHdoaWxlIChpJDEtLSkgewogICAgICAgIGNiID0gY2JzW2kkMV07CiAgICAgICAgaWYgKGNiID09PSBmbiB8fCBjYi5mbiA9PT0gZm4pIHsKICAgICAgICAgIGNicy5zcGxpY2UoaSQxLCAxKTsKICAgICAgICAgIGJyZWFrCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdm0KICB9OwoKICBWdWUucHJvdG90eXBlLiRlbWl0ID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgewogICAgICB2YXIgbG93ZXJDYXNlRXZlbnQgPSBldmVudC50b0xvd2VyQ2FzZSgpOwogICAgICBpZiAobG93ZXJDYXNlRXZlbnQgIT09IGV2ZW50ICYmIHZtLl9ldmVudHNbbG93ZXJDYXNlRXZlbnRdKSB7CiAgICAgICAgdGlwKAogICAgICAgICAgIkV2ZW50IFwiIiArIGxvd2VyQ2FzZUV2ZW50ICsgIlwiIGlzIGVtaXR0ZWQgaW4gY29tcG9uZW50ICIgKwogICAgICAgICAgKGZvcm1hdENvbXBvbmVudE5hbWUodm0pKSArICIgYnV0IHRoZSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgZm9yIFwiIiArIGV2ZW50ICsgIlwiLiAiICsKICAgICAgICAgICJOb3RlIHRoYXQgSFRNTCBhdHRyaWJ1dGVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCB5b3UgY2Fubm90IHVzZSAiICsKICAgICAgICAgICJ2LW9uIHRvIGxpc3RlbiB0byBjYW1lbENhc2UgZXZlbnRzIHdoZW4gdXNpbmcgaW4tRE9NIHRlbXBsYXRlcy4gIiArCiAgICAgICAgICAiWW91IHNob3VsZCBwcm9iYWJseSB1c2UgXCIiICsgKGh5cGhlbmF0ZShldmVudCkpICsgIlwiIGluc3RlYWQgb2YgXCIiICsgZXZlbnQgKyAiXCIuIgogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIHZhciBjYnMgPSB2bS5fZXZlbnRzW2V2ZW50XTsKICAgIGlmIChjYnMpIHsKICAgICAgY2JzID0gY2JzLmxlbmd0aCA+IDEgPyB0b0FycmF5KGNicykgOiBjYnM7CiAgICAgIHZhciBhcmdzID0gdG9BcnJheShhcmd1bWVudHMsIDEpOwogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNicy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICB0cnkgewogICAgICAgICAgY2JzW2ldLmFwcGx5KHZtLCBhcmdzKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBoYW5kbGVFcnJvcihlLCB2bSwgKCJldmVudCBoYW5kbGVyIGZvciBcIiIgKyBldmVudCArICJcIiIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2bQogIH07Cn0KCi8qICAqLwoKCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyByYXcgY2hpbGRyZW4gVk5vZGVzIGludG8gYSBzbG90IG9iamVjdC4KICovCmZ1bmN0aW9uIHJlc29sdmVTbG90cyAoCiAgY2hpbGRyZW4sCiAgY29udGV4dAopIHsKICB2YXIgc2xvdHMgPSB7fTsKICBpZiAoIWNoaWxkcmVuKSB7CiAgICByZXR1cm4gc2xvdHMKICB9CiAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgdmFyIGRhdGEgPSBjaGlsZC5kYXRhOwogICAgLy8gcmVtb3ZlIHNsb3QgYXR0cmlidXRlIGlmIHRoZSBub2RlIGlzIHJlc29sdmVkIGFzIGEgVnVlIHNsb3Qgbm9kZQogICAgaWYgKGRhdGEgJiYgZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnNsb3QpIHsKICAgICAgZGVsZXRlIGRhdGEuYXR0cnMuc2xvdDsKICAgIH0KICAgIC8vIG5hbWVkIHNsb3RzIHNob3VsZCBvbmx5IGJlIHJlc3BlY3RlZCBpZiB0aGUgdm5vZGUgd2FzIHJlbmRlcmVkIGluIHRoZQogICAgLy8gc2FtZSBjb250ZXh0LgogICAgaWYgKChjaGlsZC5jb250ZXh0ID09PSBjb250ZXh0IHx8IGNoaWxkLmZuQ29udGV4dCA9PT0gY29udGV4dCkgJiYKICAgICAgZGF0YSAmJiBkYXRhLnNsb3QgIT0gbnVsbAogICAgKSB7CiAgICAgIHZhciBuYW1lID0gZGF0YS5zbG90OwogICAgICB2YXIgc2xvdCA9IChzbG90c1tuYW1lXSB8fCAoc2xvdHNbbmFtZV0gPSBbXSkpOwogICAgICBpZiAoY2hpbGQudGFnID09PSAndGVtcGxhdGUnKSB7CiAgICAgICAgc2xvdC5wdXNoLmFwcGx5KHNsb3QsIGNoaWxkLmNoaWxkcmVuIHx8IFtdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzbG90LnB1c2goY2hpbGQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAoc2xvdHMuZGVmYXVsdCB8fCAoc2xvdHMuZGVmYXVsdCA9IFtdKSkucHVzaChjaGlsZCk7CiAgICB9CiAgfQogIC8vIGlnbm9yZSBzbG90cyB0aGF0IGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZQogIGZvciAodmFyIG5hbWUkMSBpbiBzbG90cykgewogICAgaWYgKHNsb3RzW25hbWUkMV0uZXZlcnkoaXNXaGl0ZXNwYWNlKSkgewogICAgICBkZWxldGUgc2xvdHNbbmFtZSQxXTsKICAgIH0KICB9CiAgcmV0dXJuIHNsb3RzCn0KCmZ1bmN0aW9uIGlzV2hpdGVzcGFjZSAobm9kZSkgewogIHJldHVybiAobm9kZS5pc0NvbW1lbnQgJiYgIW5vZGUuYXN5bmNGYWN0b3J5KSB8fCBub2RlLnRleHQgPT09ICcgJwp9CgpmdW5jdGlvbiByZXNvbHZlU2NvcGVkU2xvdHMgKAogIGZucywgLy8gc2VlIGZsb3cvdm5vZGUKICByZXMKKSB7CiAgcmVzID0gcmVzIHx8IHt9OwogIGZvciAodmFyIGkgPSAwOyBpIDwgZm5zLmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShmbnNbaV0pKSB7CiAgICAgIHJlc29sdmVTY29wZWRTbG90cyhmbnNbaV0sIHJlcyk7CiAgICB9IGVsc2UgewogICAgICByZXNbZm5zW2ldLmtleV0gPSBmbnNbaV0uZm47CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyogICovCgp2YXIgYWN0aXZlSW5zdGFuY2UgPSBudWxsOwp2YXIgaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50ID0gZmFsc2U7CgpmdW5jdGlvbiBpbml0TGlmZWN5Y2xlICh2bSkgewogIHZhciBvcHRpb25zID0gdm0uJG9wdGlvbnM7CgogIC8vIGxvY2F0ZSBmaXJzdCBub24tYWJzdHJhY3QgcGFyZW50CiAgdmFyIHBhcmVudCA9IG9wdGlvbnMucGFyZW50OwogIGlmIChwYXJlbnQgJiYgIW9wdGlvbnMuYWJzdHJhY3QpIHsKICAgIHdoaWxlIChwYXJlbnQuJG9wdGlvbnMuYWJzdHJhY3QgJiYgcGFyZW50LiRwYXJlbnQpIHsKICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7CiAgICB9CiAgICBwYXJlbnQuJGNoaWxkcmVuLnB1c2godm0pOwogIH0KCiAgdm0uJHBhcmVudCA9IHBhcmVudDsKICB2bS4kcm9vdCA9IHBhcmVudCA/IHBhcmVudC4kcm9vdCA6IHZtOwoKICB2bS4kY2hpbGRyZW4gPSBbXTsKICB2bS4kcmVmcyA9IHt9OwoKICB2bS5fd2F0Y2hlciA9IG51bGw7CiAgdm0uX2luYWN0aXZlID0gbnVsbDsKICB2bS5fZGlyZWN0SW5hY3RpdmUgPSBmYWxzZTsKICB2bS5faXNNb3VudGVkID0gZmFsc2U7CiAgdm0uX2lzRGVzdHJveWVkID0gZmFsc2U7CiAgdm0uX2lzQmVpbmdEZXN0cm95ZWQgPSBmYWxzZTsKfQoKZnVuY3Rpb24gbGlmZWN5Y2xlTWl4aW4gKFZ1ZSkgewogIFZ1ZS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uICh2bm9kZSwgaHlkcmF0aW5nKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgaWYgKHZtLl9pc01vdW50ZWQpIHsKICAgICAgY2FsbEhvb2sodm0sICdiZWZvcmVVcGRhdGUnKTsKICAgIH0KICAgIHZhciBwcmV2RWwgPSB2bS4kZWw7CiAgICB2YXIgcHJldlZub2RlID0gdm0uX3Zub2RlOwogICAgdmFyIHByZXZBY3RpdmVJbnN0YW5jZSA9IGFjdGl2ZUluc3RhbmNlOwogICAgYWN0aXZlSW5zdGFuY2UgPSB2bTsKICAgIHZtLl92bm9kZSA9IHZub2RlOwogICAgLy8gVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gaXMgaW5qZWN0ZWQgaW4gZW50cnkgcG9pbnRzCiAgICAvLyBiYXNlZCBvbiB0aGUgcmVuZGVyaW5nIGJhY2tlbmQgdXNlZC4KICAgIGlmICghcHJldlZub2RlKSB7CiAgICAgIC8vIGluaXRpYWwgcmVuZGVyCiAgICAgIHZtLiRlbCA9IHZtLl9fcGF0Y2hfXygKICAgICAgICB2bS4kZWwsIHZub2RlLCBoeWRyYXRpbmcsIGZhbHNlIC8qIHJlbW92ZU9ubHkgKi8sCiAgICAgICAgdm0uJG9wdGlvbnMuX3BhcmVudEVsbSwKICAgICAgICB2bS4kb3B0aW9ucy5fcmVmRWxtCiAgICAgICk7CiAgICAgIC8vIG5vIG5lZWQgZm9yIHRoZSByZWYgbm9kZXMgYWZ0ZXIgaW5pdGlhbCBwYXRjaAogICAgICAvLyB0aGlzIHByZXZlbnRzIGtlZXBpbmcgYSBkZXRhY2hlZCBET00gdHJlZSBpbiBtZW1vcnkgKCM1ODUxKQogICAgICB2bS4kb3B0aW9ucy5fcGFyZW50RWxtID0gdm0uJG9wdGlvbnMuX3JlZkVsbSA9IG51bGw7CiAgICB9IGVsc2UgewogICAgICAvLyB1cGRhdGVzCiAgICAgIHZtLiRlbCA9IHZtLl9fcGF0Y2hfXyhwcmV2Vm5vZGUsIHZub2RlKTsKICAgIH0KICAgIGFjdGl2ZUluc3RhbmNlID0gcHJldkFjdGl2ZUluc3RhbmNlOwogICAgLy8gdXBkYXRlIF9fdnVlX18gcmVmZXJlbmNlCiAgICBpZiAocHJldkVsKSB7CiAgICAgIHByZXZFbC5fX3Z1ZV9fID0gbnVsbDsKICAgIH0KICAgIGlmICh2bS4kZWwpIHsKICAgICAgdm0uJGVsLl9fdnVlX18gPSB2bTsKICAgIH0KICAgIC8vIGlmIHBhcmVudCBpcyBhbiBIT0MsIHVwZGF0ZSBpdHMgJGVsIGFzIHdlbGwKICAgIGlmICh2bS4kdm5vZGUgJiYgdm0uJHBhcmVudCAmJiB2bS4kdm5vZGUgPT09IHZtLiRwYXJlbnQuX3Zub2RlKSB7CiAgICAgIHZtLiRwYXJlbnQuJGVsID0gdm0uJGVsOwogICAgfQogICAgLy8gdXBkYXRlZCBob29rIGlzIGNhbGxlZCBieSB0aGUgc2NoZWR1bGVyIHRvIGVuc3VyZSB0aGF0IGNoaWxkcmVuIGFyZQogICAgLy8gdXBkYXRlZCBpbiBhIHBhcmVudCdzIHVwZGF0ZWQgaG9vay4KICB9OwoKICBWdWUucHJvdG90eXBlLiRmb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciB2bSA9IHRoaXM7CiAgICBpZiAodm0uX3dhdGNoZXIpIHsKICAgICAgdm0uX3dhdGNoZXIudXBkYXRlKCk7CiAgICB9CiAgfTsKCiAgVnVlLnByb3RvdHlwZS4kZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciB2bSA9IHRoaXM7CiAgICBpZiAodm0uX2lzQmVpbmdEZXN0cm95ZWQpIHsKICAgICAgcmV0dXJuCiAgICB9CiAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZURlc3Ryb3knKTsKICAgIHZtLl9pc0JlaW5nRGVzdHJveWVkID0gdHJ1ZTsKICAgIC8vIHJlbW92ZSBzZWxmIGZyb20gcGFyZW50CiAgICB2YXIgcGFyZW50ID0gdm0uJHBhcmVudDsKICAgIGlmIChwYXJlbnQgJiYgIXBhcmVudC5faXNCZWluZ0Rlc3Ryb3llZCAmJiAhdm0uJG9wdGlvbnMuYWJzdHJhY3QpIHsKICAgICAgcmVtb3ZlKHBhcmVudC4kY2hpbGRyZW4sIHZtKTsKICAgIH0KICAgIC8vIHRlYXJkb3duIHdhdGNoZXJzCiAgICBpZiAodm0uX3dhdGNoZXIpIHsKICAgICAgdm0uX3dhdGNoZXIudGVhcmRvd24oKTsKICAgIH0KICAgIHZhciBpID0gdm0uX3dhdGNoZXJzLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsKICAgICAgdm0uX3dhdGNoZXJzW2ldLnRlYXJkb3duKCk7CiAgICB9CiAgICAvLyByZW1vdmUgcmVmZXJlbmNlIGZyb20gZGF0YSBvYgogICAgLy8gZnJvemVuIG9iamVjdCBtYXkgbm90IGhhdmUgb2JzZXJ2ZXIuCiAgICBpZiAodm0uX2RhdGEuX19vYl9fKSB7CiAgICAgIHZtLl9kYXRhLl9fb2JfXy52bUNvdW50LS07CiAgICB9CiAgICAvLyBjYWxsIHRoZSBsYXN0IGhvb2suLi4KICAgIHZtLl9pc0Rlc3Ryb3llZCA9IHRydWU7CiAgICAvLyBpbnZva2UgZGVzdHJveSBob29rcyBvbiBjdXJyZW50IHJlbmRlcmVkIHRyZWUKICAgIHZtLl9fcGF0Y2hfXyh2bS5fdm5vZGUsIG51bGwpOwogICAgLy8gZmlyZSBkZXN0cm95ZWQgaG9vawogICAgY2FsbEhvb2sodm0sICdkZXN0cm95ZWQnKTsKICAgIC8vIHR1cm4gb2ZmIGFsbCBpbnN0YW5jZSBsaXN0ZW5lcnMuCiAgICB2bS4kb2ZmKCk7CiAgICAvLyByZW1vdmUgX192dWVfXyByZWZlcmVuY2UKICAgIGlmICh2bS4kZWwpIHsKICAgICAgdm0uJGVsLl9fdnVlX18gPSBudWxsOwogICAgfQogICAgLy8gcmVsZWFzZSBjaXJjdWxhciByZWZlcmVuY2UgKCM2NzU5KQogICAgaWYgKHZtLiR2bm9kZSkgewogICAgICB2bS4kdm5vZGUucGFyZW50ID0gbnVsbDsKICAgIH0KICB9Owp9CgpmdW5jdGlvbiBtb3VudENvbXBvbmVudCAoCiAgdm0sCiAgZWwsCiAgaHlkcmF0aW5nCikgewogIHZtLiRlbCA9IGVsOwogIGlmICghdm0uJG9wdGlvbnMucmVuZGVyKSB7CiAgICB2bS4kb3B0aW9ucy5yZW5kZXIgPSBjcmVhdGVFbXB0eVZOb2RlOwogICAgewogICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgaWYgKCh2bS4kb3B0aW9ucy50ZW1wbGF0ZSAmJiB2bS4kb3B0aW9ucy50ZW1wbGF0ZS5jaGFyQXQoMCkgIT09ICcjJykgfHwKICAgICAgICB2bS4kb3B0aW9ucy5lbCB8fCBlbCkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAnWW91IGFyZSB1c2luZyB0aGUgcnVudGltZS1vbmx5IGJ1aWxkIG9mIFZ1ZSB3aGVyZSB0aGUgdGVtcGxhdGUgJyArCiAgICAgICAgICAnY29tcGlsZXIgaXMgbm90IGF2YWlsYWJsZS4gRWl0aGVyIHByZS1jb21waWxlIHRoZSB0ZW1wbGF0ZXMgaW50byAnICsKICAgICAgICAgICdyZW5kZXIgZnVuY3Rpb25zLCBvciB1c2UgdGhlIGNvbXBpbGVyLWluY2x1ZGVkIGJ1aWxkLicsCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdGYWlsZWQgdG8gbW91bnQgY29tcG9uZW50OiB0ZW1wbGF0ZSBvciByZW5kZXIgZnVuY3Rpb24gbm90IGRlZmluZWQuJywKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgfQogIH0KICBjYWxsSG9vayh2bSwgJ2JlZm9yZU1vdW50Jyk7CgogIHZhciB1cGRhdGVDb21wb25lbnQ7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjb25maWcucGVyZm9ybWFuY2UgJiYgbWFyaykgewogICAgdXBkYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkgewogICAgICB2YXIgbmFtZSA9IHZtLl9uYW1lOwogICAgICB2YXIgaWQgPSB2bS5fdWlkOwogICAgICB2YXIgc3RhcnRUYWcgPSAidnVlLXBlcmYtc3RhcnQ6IiArIGlkOwogICAgICB2YXIgZW5kVGFnID0gInZ1ZS1wZXJmLWVuZDoiICsgaWQ7CgogICAgICBtYXJrKHN0YXJ0VGFnKTsKICAgICAgdmFyIHZub2RlID0gdm0uX3JlbmRlcigpOwogICAgICBtYXJrKGVuZFRhZyk7CiAgICAgIG1lYXN1cmUoKCJ2dWUgIiArIG5hbWUgKyAiIHJlbmRlciIpLCBzdGFydFRhZywgZW5kVGFnKTsKCiAgICAgIG1hcmsoc3RhcnRUYWcpOwogICAgICB2bS5fdXBkYXRlKHZub2RlLCBoeWRyYXRpbmcpOwogICAgICBtYXJrKGVuZFRhZyk7CiAgICAgIG1lYXN1cmUoKCJ2dWUgIiArIG5hbWUgKyAiIHBhdGNoIiksIHN0YXJ0VGFnLCBlbmRUYWcpOwogICAgfTsKICB9IGVsc2UgewogICAgdXBkYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkgewogICAgICB2bS5fdXBkYXRlKHZtLl9yZW5kZXIoKSwgaHlkcmF0aW5nKTsKICAgIH07CiAgfQoKICAvLyB3ZSBzZXQgdGhpcyB0byB2bS5fd2F0Y2hlciBpbnNpZGUgdGhlIHdhdGNoZXIncyBjb25zdHJ1Y3RvcgogIC8vIHNpbmNlIHRoZSB3YXRjaGVyJ3MgaW5pdGlhbCBwYXRjaCBtYXkgY2FsbCAkZm9yY2VVcGRhdGUgKGUuZy4gaW5zaWRlIGNoaWxkCiAgLy8gY29tcG9uZW50J3MgbW91bnRlZCBob29rKSwgd2hpY2ggcmVsaWVzIG9uIHZtLl93YXRjaGVyIGJlaW5nIGFscmVhZHkgZGVmaW5lZAogIG5ldyBXYXRjaGVyKHZtLCB1cGRhdGVDb21wb25lbnQsIG5vb3AsIG51bGwsIHRydWUgLyogaXNSZW5kZXJXYXRjaGVyICovKTsKICBoeWRyYXRpbmcgPSBmYWxzZTsKCiAgLy8gbWFudWFsbHkgbW91bnRlZCBpbnN0YW5jZSwgY2FsbCBtb3VudGVkIG9uIHNlbGYKICAvLyBtb3VudGVkIGlzIGNhbGxlZCBmb3IgcmVuZGVyLWNyZWF0ZWQgY2hpbGQgY29tcG9uZW50cyBpbiBpdHMgaW5zZXJ0ZWQgaG9vawogIGlmICh2bS4kdm5vZGUgPT0gbnVsbCkgewogICAgdm0uX2lzTW91bnRlZCA9IHRydWU7CiAgICBjYWxsSG9vayh2bSwgJ21vdW50ZWQnKTsKICB9CiAgcmV0dXJuIHZtCn0KCmZ1bmN0aW9uIHVwZGF0ZUNoaWxkQ29tcG9uZW50ICgKICB2bSwKICBwcm9wc0RhdGEsCiAgbGlzdGVuZXJzLAogIHBhcmVudFZub2RlLAogIHJlbmRlckNoaWxkcmVuCikgewogIHsKICAgIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IHRydWU7CiAgfQoKICAvLyBkZXRlcm1pbmUgd2hldGhlciBjb21wb25lbnQgaGFzIHNsb3QgY2hpbGRyZW4KICAvLyB3ZSBuZWVkIHRvIGRvIHRoaXMgYmVmb3JlIG92ZXJ3cml0aW5nICRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbgogIHZhciBoYXNDaGlsZHJlbiA9ICEhKAogICAgcmVuZGVyQ2hpbGRyZW4gfHwgICAgICAgICAgICAgICAvLyBoYXMgbmV3IHN0YXRpYyBzbG90cwogICAgdm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuIHx8ICAvLyBoYXMgb2xkIHN0YXRpYyBzbG90cwogICAgcGFyZW50Vm5vZGUuZGF0YS5zY29wZWRTbG90cyB8fCAvLyBoYXMgbmV3IHNjb3BlZCBzbG90cwogICAgdm0uJHNjb3BlZFNsb3RzICE9PSBlbXB0eU9iamVjdCAvLyBoYXMgb2xkIHNjb3BlZCBzbG90cwogICk7CgogIHZtLiRvcHRpb25zLl9wYXJlbnRWbm9kZSA9IHBhcmVudFZub2RlOwogIHZtLiR2bm9kZSA9IHBhcmVudFZub2RlOyAvLyB1cGRhdGUgdm0ncyBwbGFjZWhvbGRlciBub2RlIHdpdGhvdXQgcmUtcmVuZGVyCgogIGlmICh2bS5fdm5vZGUpIHsgLy8gdXBkYXRlIGNoaWxkIHRyZWUncyBwYXJlbnQKICAgIHZtLl92bm9kZS5wYXJlbnQgPSBwYXJlbnRWbm9kZTsKICB9CiAgdm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuID0gcmVuZGVyQ2hpbGRyZW47CgogIC8vIHVwZGF0ZSAkYXR0cnMgYW5kICRsaXN0ZW5lcnMgaGFzaAogIC8vIHRoZXNlIGFyZSBhbHNvIHJlYWN0aXZlIHNvIHRoZXkgbWF5IHRyaWdnZXIgY2hpbGQgdXBkYXRlIGlmIHRoZSBjaGlsZAogIC8vIHVzZWQgdGhlbSBkdXJpbmcgcmVuZGVyCiAgdm0uJGF0dHJzID0gcGFyZW50Vm5vZGUuZGF0YS5hdHRycyB8fCBlbXB0eU9iamVjdDsKICB2bS4kbGlzdGVuZXJzID0gbGlzdGVuZXJzIHx8IGVtcHR5T2JqZWN0OwoKICAvLyB1cGRhdGUgcHJvcHMKICBpZiAocHJvcHNEYXRhICYmIHZtLiRvcHRpb25zLnByb3BzKSB7CiAgICB0b2dnbGVPYnNlcnZpbmcoZmFsc2UpOwogICAgdmFyIHByb3BzID0gdm0uX3Byb3BzOwogICAgdmFyIHByb3BLZXlzID0gdm0uJG9wdGlvbnMuX3Byb3BLZXlzIHx8IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wS2V5cy5sZW5ndGg7IGkrKykgewogICAgICB2YXIga2V5ID0gcHJvcEtleXNbaV07CiAgICAgIHZhciBwcm9wT3B0aW9ucyA9IHZtLiRvcHRpb25zLnByb3BzOyAvLyB3dGYgZmxvdz8KICAgICAgcHJvcHNba2V5XSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BPcHRpb25zLCBwcm9wc0RhdGEsIHZtKTsKICAgIH0KICAgIHRvZ2dsZU9ic2VydmluZyh0cnVlKTsKICAgIC8vIGtlZXAgYSBjb3B5IG9mIHJhdyBwcm9wc0RhdGEKICAgIHZtLiRvcHRpb25zLnByb3BzRGF0YSA9IHByb3BzRGF0YTsKICB9CgogIC8vIHVwZGF0ZSBsaXN0ZW5lcnMKICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3Q7CiAgdmFyIG9sZExpc3RlbmVycyA9IHZtLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7CiAgdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycyA9IGxpc3RlbmVyczsKICB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnModm0sIGxpc3RlbmVycywgb2xkTGlzdGVuZXJzKTsKCiAgLy8gcmVzb2x2ZSBzbG90cyArIGZvcmNlIHVwZGF0ZSBpZiBoYXMgY2hpbGRyZW4KICBpZiAoaGFzQ2hpbGRyZW4pIHsKICAgIHZtLiRzbG90cyA9IHJlc29sdmVTbG90cyhyZW5kZXJDaGlsZHJlbiwgcGFyZW50Vm5vZGUuY29udGV4dCk7CiAgICB2bS4kZm9yY2VVcGRhdGUoKTsKICB9CgogIHsKICAgIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IGZhbHNlOwogIH0KfQoKZnVuY3Rpb24gaXNJbkluYWN0aXZlVHJlZSAodm0pIHsKICB3aGlsZSAodm0gJiYgKHZtID0gdm0uJHBhcmVudCkpIHsKICAgIGlmICh2bS5faW5hY3RpdmUpIHsgcmV0dXJuIHRydWUgfQogIH0KICByZXR1cm4gZmFsc2UKfQoKZnVuY3Rpb24gYWN0aXZhdGVDaGlsZENvbXBvbmVudCAodm0sIGRpcmVjdCkgewogIGlmIChkaXJlY3QpIHsKICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IGZhbHNlOwogICAgaWYgKGlzSW5JbmFjdGl2ZVRyZWUodm0pKSB7CiAgICAgIHJldHVybgogICAgfQogIH0gZWxzZSBpZiAodm0uX2RpcmVjdEluYWN0aXZlKSB7CiAgICByZXR1cm4KICB9CiAgaWYgKHZtLl9pbmFjdGl2ZSB8fCB2bS5faW5hY3RpdmUgPT09IG51bGwpIHsKICAgIHZtLl9pbmFjdGl2ZSA9IGZhbHNlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2bS4kY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudCh2bS4kY2hpbGRyZW5baV0pOwogICAgfQogICAgY2FsbEhvb2sodm0sICdhY3RpdmF0ZWQnKTsKICB9Cn0KCmZ1bmN0aW9uIGRlYWN0aXZhdGVDaGlsZENvbXBvbmVudCAodm0sIGRpcmVjdCkgewogIGlmIChkaXJlY3QpIHsKICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IHRydWU7CiAgICBpZiAoaXNJbkluYWN0aXZlVHJlZSh2bSkpIHsKICAgICAgcmV0dXJuCiAgICB9CiAgfQogIGlmICghdm0uX2luYWN0aXZlKSB7CiAgICB2bS5faW5hY3RpdmUgPSB0cnVlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2bS4kY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KHZtLiRjaGlsZHJlbltpXSk7CiAgICB9CiAgICBjYWxsSG9vayh2bSwgJ2RlYWN0aXZhdGVkJyk7CiAgfQp9CgpmdW5jdGlvbiBjYWxsSG9vayAodm0sIGhvb2spIHsKICAvLyAjNzU3MyBkaXNhYmxlIGRlcCBjb2xsZWN0aW9uIHdoZW4gaW52b2tpbmcgbGlmZWN5Y2xlIGhvb2tzCiAgcHVzaFRhcmdldCgpOwogIHZhciBoYW5kbGVycyA9IHZtLiRvcHRpb25zW2hvb2tdOwogIGlmIChoYW5kbGVycykgewogICAgZm9yICh2YXIgaSA9IDAsIGogPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBqOyBpKyspIHsKICAgICAgdHJ5IHsKICAgICAgICBoYW5kbGVyc1tpXS5jYWxsKHZtKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCAoaG9vayArICIgaG9vayIpKTsKICAgICAgfQogICAgfQogIH0KICBpZiAodm0uX2hhc0hvb2tFdmVudCkgewogICAgdm0uJGVtaXQoJ2hvb2s6JyArIGhvb2spOwogIH0KICBwb3BUYXJnZXQoKTsKfQoKLyogICovCgoKdmFyIE1BWF9VUERBVEVfQ09VTlQgPSAxMDA7Cgp2YXIgcXVldWUgPSBbXTsKdmFyIGFjdGl2YXRlZENoaWxkcmVuID0gW107CnZhciBoYXMgPSB7fTsKdmFyIGNpcmN1bGFyID0ge307CnZhciB3YWl0aW5nID0gZmFsc2U7CnZhciBmbHVzaGluZyA9IGZhbHNlOwp2YXIgaW5kZXggPSAwOwoKLyoqCiAqIFJlc2V0IHRoZSBzY2hlZHVsZXIncyBzdGF0ZS4KICovCmZ1bmN0aW9uIHJlc2V0U2NoZWR1bGVyU3RhdGUgKCkgewogIGluZGV4ID0gcXVldWUubGVuZ3RoID0gYWN0aXZhdGVkQ2hpbGRyZW4ubGVuZ3RoID0gMDsKICBoYXMgPSB7fTsKICB7CiAgICBjaXJjdWxhciA9IHt9OwogIH0KICB3YWl0aW5nID0gZmx1c2hpbmcgPSBmYWxzZTsKfQoKLyoqCiAqIEZsdXNoIGJvdGggcXVldWVzIGFuZCBydW4gdGhlIHdhdGNoZXJzLgogKi8KZnVuY3Rpb24gZmx1c2hTY2hlZHVsZXJRdWV1ZSAoKSB7CiAgZmx1c2hpbmcgPSB0cnVlOwogIHZhciB3YXRjaGVyLCBpZDsKCiAgLy8gU29ydCBxdWV1ZSBiZWZvcmUgZmx1c2guCiAgLy8gVGhpcyBlbnN1cmVzIHRoYXQ6CiAgLy8gMS4gQ29tcG9uZW50cyBhcmUgdXBkYXRlZCBmcm9tIHBhcmVudCB0byBjaGlsZC4gKGJlY2F1c2UgcGFyZW50IGlzIGFsd2F5cwogIC8vICAgIGNyZWF0ZWQgYmVmb3JlIHRoZSBjaGlsZCkKICAvLyAyLiBBIGNvbXBvbmVudCdzIHVzZXIgd2F0Y2hlcnMgYXJlIHJ1biBiZWZvcmUgaXRzIHJlbmRlciB3YXRjaGVyIChiZWNhdXNlCiAgLy8gICAgdXNlciB3YXRjaGVycyBhcmUgY3JlYXRlZCBiZWZvcmUgdGhlIHJlbmRlciB3YXRjaGVyKQogIC8vIDMuIElmIGEgY29tcG9uZW50IGlzIGRlc3Ryb3llZCBkdXJpbmcgYSBwYXJlbnQgY29tcG9uZW50J3Mgd2F0Y2hlciBydW4sCiAgLy8gICAgaXRzIHdhdGNoZXJzIGNhbiBiZSBza2lwcGVkLgogIHF1ZXVlLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEuaWQgLSBiLmlkOyB9KTsKCiAgLy8gZG8gbm90IGNhY2hlIGxlbmd0aCBiZWNhdXNlIG1vcmUgd2F0Y2hlcnMgbWlnaHQgYmUgcHVzaGVkCiAgLy8gYXMgd2UgcnVuIGV4aXN0aW5nIHdhdGNoZXJzCiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcXVldWUubGVuZ3RoOyBpbmRleCsrKSB7CiAgICB3YXRjaGVyID0gcXVldWVbaW5kZXhdOwogICAgaWQgPSB3YXRjaGVyLmlkOwogICAgaGFzW2lkXSA9IG51bGw7CiAgICB3YXRjaGVyLnJ1bigpOwogICAgLy8gaW4gZGV2IGJ1aWxkLCBjaGVjayBhbmQgc3RvcCBjaXJjdWxhciB1cGRhdGVzLgogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBoYXNbaWRdICE9IG51bGwpIHsKICAgICAgY2lyY3VsYXJbaWRdID0gKGNpcmN1bGFyW2lkXSB8fCAwKSArIDE7CiAgICAgIGlmIChjaXJjdWxhcltpZF0gPiBNQVhfVVBEQVRFX0NPVU5UKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdZb3UgbWF5IGhhdmUgYW4gaW5maW5pdGUgdXBkYXRlIGxvb3AgJyArICgKICAgICAgICAgICAgd2F0Y2hlci51c2VyCiAgICAgICAgICAgICAgPyAoImluIHdhdGNoZXIgd2l0aCBleHByZXNzaW9uIFwiIiArICh3YXRjaGVyLmV4cHJlc3Npb24pICsgIlwiIikKICAgICAgICAgICAgICA6ICJpbiBhIGNvbXBvbmVudCByZW5kZXIgZnVuY3Rpb24uIgogICAgICAgICAgKSwKICAgICAgICAgIHdhdGNoZXIudm0KICAgICAgICApOwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgIH0KICB9CgogIC8vIGtlZXAgY29waWVzIG9mIHBvc3QgcXVldWVzIGJlZm9yZSByZXNldHRpbmcgc3RhdGUKICB2YXIgYWN0aXZhdGVkUXVldWUgPSBhY3RpdmF0ZWRDaGlsZHJlbi5zbGljZSgpOwogIHZhciB1cGRhdGVkUXVldWUgPSBxdWV1ZS5zbGljZSgpOwoKICByZXNldFNjaGVkdWxlclN0YXRlKCk7CgogIC8vIGNhbGwgY29tcG9uZW50IHVwZGF0ZWQgYW5kIGFjdGl2YXRlZCBob29rcwogIGNhbGxBY3RpdmF0ZWRIb29rcyhhY3RpdmF0ZWRRdWV1ZSk7CiAgY2FsbFVwZGF0ZWRIb29rcyh1cGRhdGVkUXVldWUpOwoKICAvLyBkZXZ0b29sIGhvb2sKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoZGV2dG9vbHMgJiYgY29uZmlnLmRldnRvb2xzKSB7CiAgICBkZXZ0b29scy5lbWl0KCdmbHVzaCcpOwogIH0KfQoKZnVuY3Rpb24gY2FsbFVwZGF0ZWRIb29rcyAocXVldWUpIHsKICB2YXIgaSA9IHF1ZXVlLmxlbmd0aDsKICB3aGlsZSAoaS0tKSB7CiAgICB2YXIgd2F0Y2hlciA9IHF1ZXVlW2ldOwogICAgdmFyIHZtID0gd2F0Y2hlci52bTsKICAgIGlmICh2bS5fd2F0Y2hlciA9PT0gd2F0Y2hlciAmJiB2bS5faXNNb3VudGVkKSB7CiAgICAgIGNhbGxIb29rKHZtLCAndXBkYXRlZCcpOwogICAgfQogIH0KfQoKLyoqCiAqIFF1ZXVlIGEga2VwdC1hbGl2ZSBjb21wb25lbnQgdGhhdCB3YXMgYWN0aXZhdGVkIGR1cmluZyBwYXRjaC4KICogVGhlIHF1ZXVlIHdpbGwgYmUgcHJvY2Vzc2VkIGFmdGVyIHRoZSBlbnRpcmUgdHJlZSBoYXMgYmVlbiBwYXRjaGVkLgogKi8KZnVuY3Rpb24gcXVldWVBY3RpdmF0ZWRDb21wb25lbnQgKHZtKSB7CiAgLy8gc2V0dGluZyBfaW5hY3RpdmUgdG8gZmFsc2UgaGVyZSBzbyB0aGF0IGEgcmVuZGVyIGZ1bmN0aW9uIGNhbgogIC8vIHJlbHkgb24gY2hlY2tpbmcgd2hldGhlciBpdCdzIGluIGFuIGluYWN0aXZlIHRyZWUgKGUuZy4gcm91dGVyLXZpZXcpCiAgdm0uX2luYWN0aXZlID0gZmFsc2U7CiAgYWN0aXZhdGVkQ2hpbGRyZW4ucHVzaCh2bSk7Cn0KCmZ1bmN0aW9uIGNhbGxBY3RpdmF0ZWRIb29rcyAocXVldWUpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7CiAgICBxdWV1ZVtpXS5faW5hY3RpdmUgPSB0cnVlOwogICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudChxdWV1ZVtpXSwgdHJ1ZSAvKiB0cnVlICovKTsKICB9Cn0KCi8qKgogKiBQdXNoIGEgd2F0Y2hlciBpbnRvIHRoZSB3YXRjaGVyIHF1ZXVlLgogKiBKb2JzIHdpdGggZHVwbGljYXRlIElEcyB3aWxsIGJlIHNraXBwZWQgdW5sZXNzIGl0J3MKICogcHVzaGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGJlaW5nIGZsdXNoZWQuCiAqLwpmdW5jdGlvbiBxdWV1ZVdhdGNoZXIgKHdhdGNoZXIpIHsKICB2YXIgaWQgPSB3YXRjaGVyLmlkOwogIGlmIChoYXNbaWRdID09IG51bGwpIHsKICAgIGhhc1tpZF0gPSB0cnVlOwogICAgaWYgKCFmbHVzaGluZykgewogICAgICBxdWV1ZS5wdXNoKHdhdGNoZXIpOwogICAgfSBlbHNlIHsKICAgICAgLy8gaWYgYWxyZWFkeSBmbHVzaGluZywgc3BsaWNlIHRoZSB3YXRjaGVyIGJhc2VkIG9uIGl0cyBpZAogICAgICAvLyBpZiBhbHJlYWR5IHBhc3QgaXRzIGlkLCBpdCB3aWxsIGJlIHJ1biBuZXh0IGltbWVkaWF0ZWx5LgogICAgICB2YXIgaSA9IHF1ZXVlLmxlbmd0aCAtIDE7CiAgICAgIHdoaWxlIChpID4gaW5kZXggJiYgcXVldWVbaV0uaWQgPiB3YXRjaGVyLmlkKSB7CiAgICAgICAgaS0tOwogICAgICB9CiAgICAgIHF1ZXVlLnNwbGljZShpICsgMSwgMCwgd2F0Y2hlcik7CiAgICB9CiAgICAvLyBxdWV1ZSB0aGUgZmx1c2gKICAgIGlmICghd2FpdGluZykgewogICAgICB3YWl0aW5nID0gdHJ1ZTsKICAgICAgbmV4dFRpY2soZmx1c2hTY2hlZHVsZXJRdWV1ZSk7CiAgICB9CiAgfQp9CgovKiAgKi8KCnZhciB1aWQkMSA9IDA7CgovKioKICogQSB3YXRjaGVyIHBhcnNlcyBhbiBleHByZXNzaW9uLCBjb2xsZWN0cyBkZXBlbmRlbmNpZXMsCiAqIGFuZCBmaXJlcyBjYWxsYmFjayB3aGVuIHRoZSBleHByZXNzaW9uIHZhbHVlIGNoYW5nZXMuCiAqIFRoaXMgaXMgdXNlZCBmb3IgYm90aCB0aGUgJHdhdGNoKCkgYXBpIGFuZCBkaXJlY3RpdmVzLgogKi8KdmFyIFdhdGNoZXIgPSBmdW5jdGlvbiBXYXRjaGVyICgKICB2bSwKICBleHBPckZuLAogIGNiLAogIG9wdGlvbnMsCiAgaXNSZW5kZXJXYXRjaGVyCikgewogIHRoaXMudm0gPSB2bTsKICBpZiAoaXNSZW5kZXJXYXRjaGVyKSB7CiAgICB2bS5fd2F0Y2hlciA9IHRoaXM7CiAgfQogIHZtLl93YXRjaGVycy5wdXNoKHRoaXMpOwogIC8vIG9wdGlvbnMKICBpZiAob3B0aW9ucykgewogICAgdGhpcy5kZWVwID0gISFvcHRpb25zLmRlZXA7CiAgICB0aGlzLnVzZXIgPSAhIW9wdGlvbnMudXNlcjsKICAgIHRoaXMubGF6eSA9ICEhb3B0aW9ucy5sYXp5OwogICAgdGhpcy5zeW5jID0gISFvcHRpb25zLnN5bmM7CiAgfSBlbHNlIHsKICAgIHRoaXMuZGVlcCA9IHRoaXMudXNlciA9IHRoaXMubGF6eSA9IHRoaXMuc3luYyA9IGZhbHNlOwogIH0KICB0aGlzLmNiID0gY2I7CiAgdGhpcy5pZCA9ICsrdWlkJDE7IC8vIHVpZCBmb3IgYmF0Y2hpbmcKICB0aGlzLmFjdGl2ZSA9IHRydWU7CiAgdGhpcy5kaXJ0eSA9IHRoaXMubGF6eTsgLy8gZm9yIGxhenkgd2F0Y2hlcnMKICB0aGlzLmRlcHMgPSBbXTsKICB0aGlzLm5ld0RlcHMgPSBbXTsKICB0aGlzLmRlcElkcyA9IG5ldyBfU2V0KCk7CiAgdGhpcy5uZXdEZXBJZHMgPSBuZXcgX1NldCgpOwogIHRoaXMuZXhwcmVzc2lvbiA9IGV4cE9yRm4udG9TdHJpbmcoKTsKICAvLyBwYXJzZSBleHByZXNzaW9uIGZvciBnZXR0ZXIKICBpZiAodHlwZW9mIGV4cE9yRm4gPT09ICdmdW5jdGlvbicpIHsKICAgIHRoaXMuZ2V0dGVyID0gZXhwT3JGbjsKICB9IGVsc2UgewogICAgdGhpcy5nZXR0ZXIgPSBwYXJzZVBhdGgoZXhwT3JGbik7CiAgICBpZiAoIXRoaXMuZ2V0dGVyKSB7CiAgICAgIHRoaXMuZ2V0dGVyID0gZnVuY3Rpb24gKCkge307CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJGYWlsZWQgd2F0Y2hpbmcgcGF0aDogXCIiICsgZXhwT3JGbiArICJcIiAiICsKICAgICAgICAnV2F0Y2hlciBvbmx5IGFjY2VwdHMgc2ltcGxlIGRvdC1kZWxpbWl0ZWQgcGF0aHMuICcgKwogICAgICAgICdGb3IgZnVsbCBjb250cm9sLCB1c2UgYSBmdW5jdGlvbiBpbnN0ZWFkLicsCiAgICAgICAgdm0KICAgICAgKTsKICAgIH0KICB9CiAgdGhpcy52YWx1ZSA9IHRoaXMubGF6eQogICAgPyB1bmRlZmluZWQKICAgIDogdGhpcy5nZXQoKTsKfTsKCi8qKgogKiBFdmFsdWF0ZSB0aGUgZ2V0dGVyLCBhbmQgcmUtY29sbGVjdCBkZXBlbmRlbmNpZXMuCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKCkgewogIHB1c2hUYXJnZXQodGhpcyk7CiAgdmFyIHZhbHVlOwogIHZhciB2bSA9IHRoaXMudm07CiAgdHJ5IHsKICAgIHZhbHVlID0gdGhpcy5nZXR0ZXIuY2FsbCh2bSwgdm0pOwogIH0gY2F0Y2ggKGUpIHsKICAgIGlmICh0aGlzLnVzZXIpIHsKICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICgiZ2V0dGVyIGZvciB3YXRjaGVyIFwiIiArICh0aGlzLmV4cHJlc3Npb24pICsgIlwiIikpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgZQogICAgfQogIH0gZmluYWxseSB7CiAgICAvLyAidG91Y2giIGV2ZXJ5IHByb3BlcnR5IHNvIHRoZXkgYXJlIGFsbCB0cmFja2VkIGFzCiAgICAvLyBkZXBlbmRlbmNpZXMgZm9yIGRlZXAgd2F0Y2hpbmcKICAgIGlmICh0aGlzLmRlZXApIHsKICAgICAgdHJhdmVyc2UodmFsdWUpOwogICAgfQogICAgcG9wVGFyZ2V0KCk7CiAgICB0aGlzLmNsZWFudXBEZXBzKCk7CiAgfQogIHJldHVybiB2YWx1ZQp9OwoKLyoqCiAqIEFkZCBhIGRlcGVuZGVuY3kgdG8gdGhpcyBkaXJlY3RpdmUuCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5hZGREZXAgPSBmdW5jdGlvbiBhZGREZXAgKGRlcCkgewogIHZhciBpZCA9IGRlcC5pZDsKICBpZiAoIXRoaXMubmV3RGVwSWRzLmhhcyhpZCkpIHsKICAgIHRoaXMubmV3RGVwSWRzLmFkZChpZCk7CiAgICB0aGlzLm5ld0RlcHMucHVzaChkZXApOwogICAgaWYgKCF0aGlzLmRlcElkcy5oYXMoaWQpKSB7CiAgICAgIGRlcC5hZGRTdWIodGhpcyk7CiAgICB9CiAgfQp9OwoKLyoqCiAqIENsZWFuIHVwIGZvciBkZXBlbmRlbmN5IGNvbGxlY3Rpb24uCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5jbGVhbnVwRGVwcyA9IGZ1bmN0aW9uIGNsZWFudXBEZXBzICgpIHsKICAgIHZhciB0aGlzJDEgPSB0aGlzOwoKICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7CiAgd2hpbGUgKGktLSkgewogICAgdmFyIGRlcCA9IHRoaXMkMS5kZXBzW2ldOwogICAgaWYgKCF0aGlzJDEubmV3RGVwSWRzLmhhcyhkZXAuaWQpKSB7CiAgICAgIGRlcC5yZW1vdmVTdWIodGhpcyQxKTsKICAgIH0KICB9CiAgdmFyIHRtcCA9IHRoaXMuZGVwSWRzOwogIHRoaXMuZGVwSWRzID0gdGhpcy5uZXdEZXBJZHM7CiAgdGhpcy5uZXdEZXBJZHMgPSB0bXA7CiAgdGhpcy5uZXdEZXBJZHMuY2xlYXIoKTsKICB0bXAgPSB0aGlzLmRlcHM7CiAgdGhpcy5kZXBzID0gdGhpcy5uZXdEZXBzOwogIHRoaXMubmV3RGVwcyA9IHRtcDsKICB0aGlzLm5ld0RlcHMubGVuZ3RoID0gMDsKfTsKCi8qKgogKiBTdWJzY3JpYmVyIGludGVyZmFjZS4KICogV2lsbCBiZSBjYWxsZWQgd2hlbiBhIGRlcGVuZGVuY3kgY2hhbmdlcy4KICovCldhdGNoZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAoKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICBpZiAodGhpcy5sYXp5KSB7CiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTsKICB9IGVsc2UgaWYgKHRoaXMuc3luYykgewogICAgdGhpcy5ydW4oKTsKICB9IGVsc2UgewogICAgcXVldWVXYXRjaGVyKHRoaXMpOwogIH0KfTsKCi8qKgogKiBTY2hlZHVsZXIgam9iIGludGVyZmFjZS4KICogV2lsbCBiZSBjYWxsZWQgYnkgdGhlIHNjaGVkdWxlci4KICovCldhdGNoZXIucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIHJ1biAoKSB7CiAgaWYgKHRoaXMuYWN0aXZlKSB7CiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldCgpOwogICAgaWYgKAogICAgICB2YWx1ZSAhPT0gdGhpcy52YWx1ZSB8fAogICAgICAvLyBEZWVwIHdhdGNoZXJzIGFuZCB3YXRjaGVycyBvbiBPYmplY3QvQXJyYXlzIHNob3VsZCBmaXJlIGV2ZW4KICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgaXMgdGhlIHNhbWUsIGJlY2F1c2UgdGhlIHZhbHVlIG1heQogICAgICAvLyBoYXZlIG11dGF0ZWQuCiAgICAgIGlzT2JqZWN0KHZhbHVlKSB8fAogICAgICB0aGlzLmRlZXAKICAgICkgewogICAgICAvLyBzZXQgbmV3IHZhbHVlCiAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICAgaWYgKHRoaXMudXNlcikgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLmNiLmNhbGwodGhpcy52bSwgdmFsdWUsIG9sZFZhbHVlKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBoYW5kbGVFcnJvcihlLCB0aGlzLnZtLCAoImNhbGxiYWNrIGZvciB3YXRjaGVyIFwiIiArICh0aGlzLmV4cHJlc3Npb24pICsgIlwiIikpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmNiLmNhbGwodGhpcy52bSwgdmFsdWUsIG9sZFZhbHVlKTsKICAgICAgfQogICAgfQogIH0KfTsKCi8qKgogKiBFdmFsdWF0ZSB0aGUgdmFsdWUgb2YgdGhlIHdhdGNoZXIuCiAqIFRoaXMgb25seSBnZXRzIGNhbGxlZCBmb3IgbGF6eSB3YXRjaGVycy4KICovCldhdGNoZXIucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gZXZhbHVhdGUgKCkgewogIHRoaXMudmFsdWUgPSB0aGlzLmdldCgpOwogIHRoaXMuZGlydHkgPSBmYWxzZTsKfTsKCi8qKgogKiBEZXBlbmQgb24gYWxsIGRlcHMgY29sbGVjdGVkIGJ5IHRoaXMgd2F0Y2hlci4KICovCldhdGNoZXIucHJvdG90eXBlLmRlcGVuZCA9IGZ1bmN0aW9uIGRlcGVuZCAoKSB7CiAgICB2YXIgdGhpcyQxID0gdGhpczsKCiAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoOwogIHdoaWxlIChpLS0pIHsKICAgIHRoaXMkMS5kZXBzW2ldLmRlcGVuZCgpOwogIH0KfTsKCi8qKgogKiBSZW1vdmUgc2VsZiBmcm9tIGFsbCBkZXBlbmRlbmNpZXMnIHN1YnNjcmliZXIgbGlzdC4KICovCldhdGNoZXIucHJvdG90eXBlLnRlYXJkb3duID0gZnVuY3Rpb24gdGVhcmRvd24gKCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogIGlmICh0aGlzLmFjdGl2ZSkgewogICAgLy8gcmVtb3ZlIHNlbGYgZnJvbSB2bSdzIHdhdGNoZXIgbGlzdAogICAgLy8gdGhpcyBpcyBhIHNvbWV3aGF0IGV4cGVuc2l2ZSBvcGVyYXRpb24gc28gd2Ugc2tpcCBpdAogICAgLy8gaWYgdGhlIHZtIGlzIGJlaW5nIGRlc3Ryb3llZC4KICAgIGlmICghdGhpcy52bS5faXNCZWluZ0Rlc3Ryb3llZCkgewogICAgICByZW1vdmUodGhpcy52bS5fd2F0Y2hlcnMsIHRoaXMpOwogICAgfQogICAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoOwogICAgd2hpbGUgKGktLSkgewogICAgICB0aGlzJDEuZGVwc1tpXS5yZW1vdmVTdWIodGhpcyQxKTsKICAgIH0KICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7CiAgfQp9OwoKLyogICovCgp2YXIgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uID0gewogIGVudW1lcmFibGU6IHRydWUsCiAgY29uZmlndXJhYmxlOiB0cnVlLAogIGdldDogbm9vcCwKICBzZXQ6IG5vb3AKfTsKCmZ1bmN0aW9uIHByb3h5ICh0YXJnZXQsIHNvdXJjZUtleSwga2V5KSB7CiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IGZ1bmN0aW9uIHByb3h5R2V0dGVyICgpIHsKICAgIHJldHVybiB0aGlzW3NvdXJjZUtleV1ba2V5XQogIH07CiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLnNldCA9IGZ1bmN0aW9uIHByb3h5U2V0dGVyICh2YWwpIHsKICAgIHRoaXNbc291cmNlS2V5XVtrZXldID0gdmFsOwogIH07CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24pOwp9CgpmdW5jdGlvbiBpbml0U3RhdGUgKHZtKSB7CiAgdm0uX3dhdGNoZXJzID0gW107CiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9uczsKICBpZiAob3B0cy5wcm9wcykgeyBpbml0UHJvcHModm0sIG9wdHMucHJvcHMpOyB9CiAgaWYgKG9wdHMubWV0aG9kcykgeyBpbml0TWV0aG9kcyh2bSwgb3B0cy5tZXRob2RzKTsgfQogIGlmIChvcHRzLmRhdGEpIHsKICAgIGluaXREYXRhKHZtKTsKICB9IGVsc2UgewogICAgb2JzZXJ2ZSh2bS5fZGF0YSA9IHt9LCB0cnVlIC8qIGFzUm9vdERhdGEgKi8pOwogIH0KICBpZiAob3B0cy5jb21wdXRlZCkgeyBpbml0Q29tcHV0ZWQodm0sIG9wdHMuY29tcHV0ZWQpOyB9CiAgaWYgKG9wdHMud2F0Y2ggJiYgb3B0cy53YXRjaCAhPT0gbmF0aXZlV2F0Y2gpIHsKICAgIGluaXRXYXRjaCh2bSwgb3B0cy53YXRjaCk7CiAgfQp9CgpmdW5jdGlvbiBpbml0UHJvcHMgKHZtLCBwcm9wc09wdGlvbnMpIHsKICB2YXIgcHJvcHNEYXRhID0gdm0uJG9wdGlvbnMucHJvcHNEYXRhIHx8IHt9OwogIHZhciBwcm9wcyA9IHZtLl9wcm9wcyA9IHt9OwogIC8vIGNhY2hlIHByb3Aga2V5cyBzbyB0aGF0IGZ1dHVyZSBwcm9wcyB1cGRhdGVzIGNhbiBpdGVyYXRlIHVzaW5nIEFycmF5CiAgLy8gaW5zdGVhZCBvZiBkeW5hbWljIG9iamVjdCBrZXkgZW51bWVyYXRpb24uCiAgdmFyIGtleXMgPSB2bS4kb3B0aW9ucy5fcHJvcEtleXMgPSBbXTsKICB2YXIgaXNSb290ID0gIXZtLiRwYXJlbnQ7CiAgLy8gcm9vdCBpbnN0YW5jZSBwcm9wcyBzaG91bGQgYmUgY29udmVydGVkCiAgaWYgKCFpc1Jvb3QpIHsKICAgIHRvZ2dsZU9ic2VydmluZyhmYWxzZSk7CiAgfQogIHZhciBsb29wID0gZnVuY3Rpb24gKCBrZXkgKSB7CiAgICBrZXlzLnB1c2goa2V5KTsKICAgIHZhciB2YWx1ZSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BzT3B0aW9ucywgcHJvcHNEYXRhLCB2bSk7CiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwogICAgewogICAgICB2YXIgaHlwaGVuYXRlZEtleSA9IGh5cGhlbmF0ZShrZXkpOwogICAgICBpZiAoaXNSZXNlcnZlZEF0dHJpYnV0ZShoeXBoZW5hdGVkS2V5KSB8fAogICAgICAgICAgY29uZmlnLmlzUmVzZXJ2ZWRBdHRyKGh5cGhlbmF0ZWRLZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICgiXCIiICsgaHlwaGVuYXRlZEtleSArICJcIiBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBhbmQgY2Fubm90IGJlIHVzZWQgYXMgY29tcG9uZW50IHByb3AuIiksCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgICAgZGVmaW5lUmVhY3RpdmUocHJvcHMsIGtleSwgdmFsdWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAodm0uJHBhcmVudCAmJiAhaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50KSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAiQXZvaWQgbXV0YXRpbmcgYSBwcm9wIGRpcmVjdGx5IHNpbmNlIHRoZSB2YWx1ZSB3aWxsIGJlICIgKwogICAgICAgICAgICAib3ZlcndyaXR0ZW4gd2hlbmV2ZXIgdGhlIHBhcmVudCBjb21wb25lbnQgcmUtcmVuZGVycy4gIiArCiAgICAgICAgICAgICJJbnN0ZWFkLCB1c2UgYSBkYXRhIG9yIGNvbXB1dGVkIHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwcm9wJ3MgIiArCiAgICAgICAgICAgICJ2YWx1ZS4gUHJvcCBiZWluZyBtdXRhdGVkOiBcIiIgKyBrZXkgKyAiXCIiLAogICAgICAgICAgICB2bQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgLy8gc3RhdGljIHByb3BzIGFyZSBhbHJlYWR5IHByb3hpZWQgb24gdGhlIGNvbXBvbmVudCdzIHByb3RvdHlwZQogICAgLy8gZHVyaW5nIFZ1ZS5leHRlbmQoKS4gV2Ugb25seSBuZWVkIHRvIHByb3h5IHByb3BzIGRlZmluZWQgYXQKICAgIC8vIGluc3RhbnRpYXRpb24gaGVyZS4KICAgIGlmICghKGtleSBpbiB2bSkpIHsKICAgICAgcHJveHkodm0sICJfcHJvcHMiLCBrZXkpOwogICAgfQogIH07CgogIGZvciAodmFyIGtleSBpbiBwcm9wc09wdGlvbnMpIGxvb3AoIGtleSApOwogIHRvZ2dsZU9ic2VydmluZyh0cnVlKTsKfQoKZnVuY3Rpb24gaW5pdERhdGEgKHZtKSB7CiAgdmFyIGRhdGEgPSB2bS4kb3B0aW9ucy5kYXRhOwogIGRhdGEgPSB2bS5fZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nCiAgICA/IGdldERhdGEoZGF0YSwgdm0pCiAgICA6IGRhdGEgfHwge307CiAgaWYgKCFpc1BsYWluT2JqZWN0KGRhdGEpKSB7CiAgICBkYXRhID0ge307CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgJ2RhdGEgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0OlxuJyArCiAgICAgICdodHRwczovL3Z1ZWpzLm9yZy92Mi9ndWlkZS9jb21wb25lbnRzLmh0bWwjZGF0YS1NdXN0LUJlLWEtRnVuY3Rpb24nLAogICAgICB2bQogICAgKTsKICB9CiAgLy8gcHJveHkgZGF0YSBvbiBpbnN0YW5jZQogIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7CiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7CiAgdmFyIG1ldGhvZHMgPSB2bS4kb3B0aW9ucy5tZXRob2RzOwogIHZhciBpID0ga2V5cy5sZW5ndGg7CiAgd2hpbGUgKGktLSkgewogICAgdmFyIGtleSA9IGtleXNbaV07CiAgICB7CiAgICAgIGlmIChtZXRob2RzICYmIGhhc093bihtZXRob2RzLCBrZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICgiTWV0aG9kIFwiIiArIGtleSArICJcIiBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQgYXMgYSBkYXRhIHByb3BlcnR5LiIpLAogICAgICAgICAgdm0KICAgICAgICApOwogICAgICB9CiAgICB9CiAgICBpZiAocHJvcHMgJiYgaGFzT3duKHByb3BzLCBrZXkpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJUaGUgZGF0YSBwcm9wZXJ0eSBcIiIgKyBrZXkgKyAiXCIgaXMgYWxyZWFkeSBkZWNsYXJlZCBhcyBhIHByb3AuICIgKwogICAgICAgICJVc2UgcHJvcCBkZWZhdWx0IHZhbHVlIGluc3RlYWQuIiwKICAgICAgICB2bQogICAgICApOwogICAgfSBlbHNlIGlmICghaXNSZXNlcnZlZChrZXkpKSB7CiAgICAgIHByb3h5KHZtLCAiX2RhdGEiLCBrZXkpOwogICAgfQogIH0KICAvLyBvYnNlcnZlIGRhdGEKICBvYnNlcnZlKGRhdGEsIHRydWUgLyogYXNSb290RGF0YSAqLyk7Cn0KCmZ1bmN0aW9uIGdldERhdGEgKGRhdGEsIHZtKSB7CiAgLy8gIzc1NzMgZGlzYWJsZSBkZXAgY29sbGVjdGlvbiB3aGVuIGludm9raW5nIGRhdGEgZ2V0dGVycwogIHB1c2hUYXJnZXQoKTsKICB0cnkgewogICAgcmV0dXJuIGRhdGEuY2FsbCh2bSwgdm0pCiAgfSBjYXRjaCAoZSkgewogICAgaGFuZGxlRXJyb3IoZSwgdm0sICJkYXRhKCkiKTsKICAgIHJldHVybiB7fQogIH0gZmluYWxseSB7CiAgICBwb3BUYXJnZXQoKTsKICB9Cn0KCnZhciBjb21wdXRlZFdhdGNoZXJPcHRpb25zID0geyBsYXp5OiB0cnVlIH07CgpmdW5jdGlvbiBpbml0Q29tcHV0ZWQgKHZtLCBjb21wdXRlZCkgewogIC8vICRmbG93LWRpc2FibGUtbGluZQogIHZhciB3YXRjaGVycyA9IHZtLl9jb21wdXRlZFdhdGNoZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAvLyBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBqdXN0IGdldHRlcnMgZHVyaW5nIFNTUgogIHZhciBpc1NTUiA9IGlzU2VydmVyUmVuZGVyaW5nKCk7CgogIGZvciAodmFyIGtleSBpbiBjb21wdXRlZCkgewogICAgdmFyIHVzZXJEZWYgPSBjb21wdXRlZFtrZXldOwogICAgdmFyIGdldHRlciA9IHR5cGVvZiB1c2VyRGVmID09PSAnZnVuY3Rpb24nID8gdXNlckRlZiA6IHVzZXJEZWYuZ2V0OwogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBnZXR0ZXIgPT0gbnVsbCkgewogICAgICB3YXJuKAogICAgICAgICgiR2V0dGVyIGlzIG1pc3NpbmcgZm9yIGNvbXB1dGVkIHByb3BlcnR5IFwiIiArIGtleSArICJcIi4iKSwKICAgICAgICB2bQogICAgICApOwogICAgfQoKICAgIGlmICghaXNTU1IpIHsKICAgICAgLy8gY3JlYXRlIGludGVybmFsIHdhdGNoZXIgZm9yIHRoZSBjb21wdXRlZCBwcm9wZXJ0eS4KICAgICAgd2F0Y2hlcnNba2V5XSA9IG5ldyBXYXRjaGVyKAogICAgICAgIHZtLAogICAgICAgIGdldHRlciB8fCBub29wLAogICAgICAgIG5vb3AsCiAgICAgICAgY29tcHV0ZWRXYXRjaGVyT3B0aW9ucwogICAgICApOwogICAgfQoKICAgIC8vIGNvbXBvbmVudC1kZWZpbmVkIGNvbXB1dGVkIHByb3BlcnRpZXMgYXJlIGFscmVhZHkgZGVmaW5lZCBvbiB0aGUKICAgIC8vIGNvbXBvbmVudCBwcm90b3R5cGUuIFdlIG9ubHkgbmVlZCB0byBkZWZpbmUgY29tcHV0ZWQgcHJvcGVydGllcyBkZWZpbmVkCiAgICAvLyBhdCBpbnN0YW50aWF0aW9uIGhlcmUuCiAgICBpZiAoIShrZXkgaW4gdm0pKSB7CiAgICAgIGRlZmluZUNvbXB1dGVkKHZtLCBrZXksIHVzZXJEZWYpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGtleSBpbiB2bS4kZGF0YSkgewogICAgICAgIHdhcm4oKCJUaGUgY29tcHV0ZWQgcHJvcGVydHkgXCIiICsga2V5ICsgIlwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBkYXRhLiIpLCB2bSk7CiAgICAgIH0gZWxzZSBpZiAodm0uJG9wdGlvbnMucHJvcHMgJiYga2V5IGluIHZtLiRvcHRpb25zLnByb3BzKSB7CiAgICAgICAgd2FybigoIlRoZSBjb21wdXRlZCBwcm9wZXJ0eSBcIiIgKyBrZXkgKyAiXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIGEgcHJvcC4iKSwgdm0pOwogICAgICB9CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBkZWZpbmVDb21wdXRlZCAoCiAgdGFyZ2V0LAogIGtleSwKICB1c2VyRGVmCikgewogIHZhciBzaG91bGRDYWNoZSA9ICFpc1NlcnZlclJlbmRlcmluZygpOwogIGlmICh0eXBlb2YgdXNlckRlZiA9PT0gJ2Z1bmN0aW9uJykgewogICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IHNob3VsZENhY2hlCiAgICAgID8gY3JlYXRlQ29tcHV0ZWRHZXR0ZXIoa2V5KQogICAgICA6IHVzZXJEZWY7CiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gbm9vcDsKICB9IGVsc2UgewogICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IHVzZXJEZWYuZ2V0CiAgICAgID8gc2hvdWxkQ2FjaGUgJiYgdXNlckRlZi5jYWNoZSAhPT0gZmFsc2UKICAgICAgICA/IGNyZWF0ZUNvbXB1dGVkR2V0dGVyKGtleSkKICAgICAgICA6IHVzZXJEZWYuZ2V0CiAgICAgIDogbm9vcDsKICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSB1c2VyRGVmLnNldAogICAgICA/IHVzZXJEZWYuc2V0CiAgICAgIDogbm9vcDsKICB9CiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID09PSBub29wKSB7CiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gZnVuY3Rpb24gKCkgewogICAgICB3YXJuKAogICAgICAgICgiQ29tcHV0ZWQgcHJvcGVydHkgXCIiICsga2V5ICsgIlwiIHdhcyBhc3NpZ25lZCB0byBidXQgaXQgaGFzIG5vIHNldHRlci4iKSwKICAgICAgICB0aGlzCiAgICAgICk7CiAgICB9OwogIH0KICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbik7Cn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbXB1dGVkR2V0dGVyIChrZXkpIHsKICByZXR1cm4gZnVuY3Rpb24gY29tcHV0ZWRHZXR0ZXIgKCkgewogICAgdmFyIHdhdGNoZXIgPSB0aGlzLl9jb21wdXRlZFdhdGNoZXJzICYmIHRoaXMuX2NvbXB1dGVkV2F0Y2hlcnNba2V5XTsKICAgIGlmICh3YXRjaGVyKSB7CiAgICAgIGlmICh3YXRjaGVyLmRpcnR5KSB7CiAgICAgICAgd2F0Y2hlci5ldmFsdWF0ZSgpOwogICAgICB9CiAgICAgIGlmIChEZXAudGFyZ2V0KSB7CiAgICAgICAgd2F0Y2hlci5kZXBlbmQoKTsKICAgICAgfQogICAgICByZXR1cm4gd2F0Y2hlci52YWx1ZQogICAgfQogIH0KfQoKZnVuY3Rpb24gaW5pdE1ldGhvZHMgKHZtLCBtZXRob2RzKSB7CiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7CiAgZm9yICh2YXIga2V5IGluIG1ldGhvZHMpIHsKICAgIHsKICAgICAgaWYgKG1ldGhvZHNba2V5XSA9PSBudWxsKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJNZXRob2QgXCIiICsga2V5ICsgIlwiIGhhcyBhbiB1bmRlZmluZWQgdmFsdWUgaW4gdGhlIGNvbXBvbmVudCBkZWZpbml0aW9uLiAiICsKICAgICAgICAgICJEaWQgeW91IHJlZmVyZW5jZSB0aGUgZnVuY3Rpb24gY29ycmVjdGx5PyIsCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgICAgaWYgKHByb3BzICYmIGhhc093bihwcm9wcywga2V5KSkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAoIk1ldGhvZCBcIiIgKyBrZXkgKyAiXCIgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkIGFzIGEgcHJvcC4iKSwKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgICBpZiAoKGtleSBpbiB2bSkgJiYgaXNSZXNlcnZlZChrZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJNZXRob2QgXCIiICsga2V5ICsgIlwiIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIFZ1ZSBpbnN0YW5jZSBtZXRob2QuICIgKwogICAgICAgICAgIkF2b2lkIGRlZmluaW5nIGNvbXBvbmVudCBtZXRob2RzIHRoYXQgc3RhcnQgd2l0aCBfIG9yICQuIgogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIHZtW2tleV0gPSBtZXRob2RzW2tleV0gPT0gbnVsbCA/IG5vb3AgOiBiaW5kKG1ldGhvZHNba2V5XSwgdm0pOwogIH0KfQoKZnVuY3Rpb24gaW5pdFdhdGNoICh2bSwgd2F0Y2gpIHsKICBmb3IgKHZhciBrZXkgaW4gd2F0Y2gpIHsKICAgIHZhciBoYW5kbGVyID0gd2F0Y2hba2V5XTsKICAgIGlmIChBcnJheS5pc0FycmF5KGhhbmRsZXIpKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlci5sZW5ndGg7IGkrKykgewogICAgICAgIGNyZWF0ZVdhdGNoZXIodm0sIGtleSwgaGFuZGxlcltpXSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNyZWF0ZVdhdGNoZXIodm0sIGtleSwgaGFuZGxlcik7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBjcmVhdGVXYXRjaGVyICgKICB2bSwKICBleHBPckZuLAogIGhhbmRsZXIsCiAgb3B0aW9ucwopIHsKICBpZiAoaXNQbGFpbk9iamVjdChoYW5kbGVyKSkgewogICAgb3B0aW9ucyA9IGhhbmRsZXI7CiAgICBoYW5kbGVyID0gaGFuZGxlci5oYW5kbGVyOwogIH0KICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdzdHJpbmcnKSB7CiAgICBoYW5kbGVyID0gdm1baGFuZGxlcl07CiAgfQogIHJldHVybiB2bS4kd2F0Y2goZXhwT3JGbiwgaGFuZGxlciwgb3B0aW9ucykKfQoKZnVuY3Rpb24gc3RhdGVNaXhpbiAoVnVlKSB7CiAgLy8gZmxvdyBzb21laG93IGhhcyBwcm9ibGVtcyB3aXRoIGRpcmVjdGx5IGRlY2xhcmVkIGRlZmluaXRpb24gb2JqZWN0CiAgLy8gd2hlbiB1c2luZyBPYmplY3QuZGVmaW5lUHJvcGVydHksIHNvIHdlIGhhdmUgdG8gcHJvY2VkdXJhbGx5IGJ1aWxkIHVwCiAgLy8gdGhlIG9iamVjdCBoZXJlLgogIHZhciBkYXRhRGVmID0ge307CiAgZGF0YURlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kYXRhIH07CiAgdmFyIHByb3BzRGVmID0ge307CiAgcHJvcHNEZWYuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcHJvcHMgfTsKICB7CiAgICBkYXRhRGVmLnNldCA9IGZ1bmN0aW9uIChuZXdEYXRhKSB7CiAgICAgIHdhcm4oCiAgICAgICAgJ0F2b2lkIHJlcGxhY2luZyBpbnN0YW5jZSByb290ICRkYXRhLiAnICsKICAgICAgICAnVXNlIG5lc3RlZCBkYXRhIHByb3BlcnRpZXMgaW5zdGVhZC4nLAogICAgICAgIHRoaXMKICAgICAgKTsKICAgIH07CiAgICBwcm9wc0RlZi5zZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHdhcm4oIiRwcm9wcyBpcyByZWFkb25seS4iLCB0aGlzKTsKICAgIH07CiAgfQogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGRhdGEnLCBkYXRhRGVmKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRwcm9wcycsIHByb3BzRGVmKTsKCiAgVnVlLnByb3RvdHlwZS4kc2V0ID0gc2V0OwogIFZ1ZS5wcm90b3R5cGUuJGRlbGV0ZSA9IGRlbDsKCiAgVnVlLnByb3RvdHlwZS4kd2F0Y2ggPSBmdW5jdGlvbiAoCiAgICBleHBPckZuLAogICAgY2IsCiAgICBvcHRpb25zCiAgKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgaWYgKGlzUGxhaW5PYmplY3QoY2IpKSB7CiAgICAgIHJldHVybiBjcmVhdGVXYXRjaGVyKHZtLCBleHBPckZuLCBjYiwgb3B0aW9ucykKICAgIH0KICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgb3B0aW9ucy51c2VyID0gdHJ1ZTsKICAgIHZhciB3YXRjaGVyID0gbmV3IFdhdGNoZXIodm0sIGV4cE9yRm4sIGNiLCBvcHRpb25zKTsKICAgIGlmIChvcHRpb25zLmltbWVkaWF0ZSkgewogICAgICBjYi5jYWxsKHZtLCB3YXRjaGVyLnZhbHVlKTsKICAgIH0KICAgIHJldHVybiBmdW5jdGlvbiB1bndhdGNoRm4gKCkgewogICAgICB3YXRjaGVyLnRlYXJkb3duKCk7CiAgICB9CiAgfTsKfQoKLyogICovCgpmdW5jdGlvbiBpbml0UHJvdmlkZSAodm0pIHsKICB2YXIgcHJvdmlkZSA9IHZtLiRvcHRpb25zLnByb3ZpZGU7CiAgaWYgKHByb3ZpZGUpIHsKICAgIHZtLl9wcm92aWRlZCA9IHR5cGVvZiBwcm92aWRlID09PSAnZnVuY3Rpb24nCiAgICAgID8gcHJvdmlkZS5jYWxsKHZtKQogICAgICA6IHByb3ZpZGU7CiAgfQp9CgpmdW5jdGlvbiBpbml0SW5qZWN0aW9ucyAodm0pIHsKICB2YXIgcmVzdWx0ID0gcmVzb2x2ZUluamVjdCh2bS4kb3B0aW9ucy5pbmplY3QsIHZtKTsKICBpZiAocmVzdWx0KSB7CiAgICB0b2dnbGVPYnNlcnZpbmcoZmFsc2UpOwogICAgT2JqZWN0LmtleXMocmVzdWx0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgICAgewogICAgICAgIGRlZmluZVJlYWN0aXZlKHZtLCBrZXksIHJlc3VsdFtrZXldLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAiQXZvaWQgbXV0YXRpbmcgYW4gaW5qZWN0ZWQgdmFsdWUgZGlyZWN0bHkgc2luY2UgdGhlIGNoYW5nZXMgd2lsbCBiZSAiICsKICAgICAgICAgICAgIm92ZXJ3cml0dGVuIHdoZW5ldmVyIHRoZSBwcm92aWRlZCBjb21wb25lbnQgcmUtcmVuZGVycy4gIiArCiAgICAgICAgICAgICJpbmplY3Rpb24gYmVpbmcgbXV0YXRlZDogXCIiICsga2V5ICsgIlwiIiwKICAgICAgICAgICAgdm0KICAgICAgICAgICk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpOwogIH0KfQoKZnVuY3Rpb24gcmVzb2x2ZUluamVjdCAoaW5qZWN0LCB2bSkgewogIGlmIChpbmplY3QpIHsKICAgIC8vIGluamVjdCBpcyA6YW55IGJlY2F1c2UgZmxvdyBpcyBub3Qgc21hcnQgZW5vdWdoIHRvIGZpZ3VyZSBvdXQgY2FjaGVkCiAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHZhciBrZXlzID0gaGFzU3ltYm9sCiAgICAgID8gUmVmbGVjdC5vd25LZXlzKGluamVjdCkuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwogICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGluamVjdCwga2V5KS5lbnVtZXJhYmxlCiAgICAgIH0pCiAgICAgIDogT2JqZWN0LmtleXMoaW5qZWN0KTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGtleSA9IGtleXNbaV07CiAgICAgIHZhciBwcm92aWRlS2V5ID0gaW5qZWN0W2tleV0uZnJvbTsKICAgICAgdmFyIHNvdXJjZSA9IHZtOwogICAgICB3aGlsZSAoc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5fcHJvdmlkZWQgJiYgaGFzT3duKHNvdXJjZS5fcHJvdmlkZWQsIHByb3ZpZGVLZXkpKSB7CiAgICAgICAgICByZXN1bHRba2V5XSA9IHNvdXJjZS5fcHJvdmlkZWRbcHJvdmlkZUtleV07CiAgICAgICAgICBicmVhawogICAgICAgIH0KICAgICAgICBzb3VyY2UgPSBzb3VyY2UuJHBhcmVudDsKICAgICAgfQogICAgICBpZiAoIXNvdXJjZSkgewogICAgICAgIGlmICgnZGVmYXVsdCcgaW4gaW5qZWN0W2tleV0pIHsKICAgICAgICAgIHZhciBwcm92aWRlRGVmYXVsdCA9IGluamVjdFtrZXldLmRlZmF1bHQ7CiAgICAgICAgICByZXN1bHRba2V5XSA9IHR5cGVvZiBwcm92aWRlRGVmYXVsdCA9PT0gJ2Z1bmN0aW9uJwogICAgICAgICAgICA/IHByb3ZpZGVEZWZhdWx0LmNhbGwodm0pCiAgICAgICAgICAgIDogcHJvdmlkZURlZmF1bHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdhcm4oKCJJbmplY3Rpb24gXCIiICsga2V5ICsgIlwiIG5vdCBmb3VuZCIpLCB2bSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0CiAgfQp9CgovKiAgKi8KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgcmVuZGVyaW5nIHYtZm9yIGxpc3RzLgogKi8KZnVuY3Rpb24gcmVuZGVyTGlzdCAoCiAgdmFsLAogIHJlbmRlcgopIHsKICB2YXIgcmV0LCBpLCBsLCBrZXlzLCBrZXk7CiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSB8fCB0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgewogICAgcmV0ID0gbmV3IEFycmF5KHZhbC5sZW5ndGgpOwogICAgZm9yIChpID0gMCwgbCA9IHZhbC5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgcmV0W2ldID0gcmVuZGVyKHZhbFtpXSwgaSk7CiAgICB9CiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykgewogICAgcmV0ID0gbmV3IEFycmF5KHZhbCk7CiAgICBmb3IgKGkgPSAwOyBpIDwgdmFsOyBpKyspIHsKICAgICAgcmV0W2ldID0gcmVuZGVyKGkgKyAxLCBpKTsKICAgIH0KICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbCkpIHsKICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpOwogICAgcmV0ID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKTsKICAgIGZvciAoaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICBrZXkgPSBrZXlzW2ldOwogICAgICByZXRbaV0gPSByZW5kZXIodmFsW2tleV0sIGtleSwgaSk7CiAgICB9CiAgfQogIGlmIChpc0RlZihyZXQpKSB7CiAgICAocmV0KS5faXNWTGlzdCA9IHRydWU7CiAgfQogIHJldHVybiByZXQKfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyA8c2xvdD4KICovCmZ1bmN0aW9uIHJlbmRlclNsb3QgKAogIG5hbWUsCiAgZmFsbGJhY2ssCiAgcHJvcHMsCiAgYmluZE9iamVjdAopIHsKICB2YXIgc2NvcGVkU2xvdEZuID0gdGhpcy4kc2NvcGVkU2xvdHNbbmFtZV07CiAgdmFyIG5vZGVzOwogIGlmIChzY29wZWRTbG90Rm4pIHsgLy8gc2NvcGVkIHNsb3QKICAgIHByb3BzID0gcHJvcHMgfHwge307CiAgICBpZiAoYmluZE9iamVjdCkgewogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmICFpc09iamVjdChiaW5kT2JqZWN0KSkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAnc2xvdCB2LWJpbmQgd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCcsCiAgICAgICAgICB0aGlzCiAgICAgICAgKTsKICAgICAgfQogICAgICBwcm9wcyA9IGV4dGVuZChleHRlbmQoe30sIGJpbmRPYmplY3QpLCBwcm9wcyk7CiAgICB9CiAgICBub2RlcyA9IHNjb3BlZFNsb3RGbihwcm9wcykgfHwgZmFsbGJhY2s7CiAgfSBlbHNlIHsKICAgIHZhciBzbG90Tm9kZXMgPSB0aGlzLiRzbG90c1tuYW1lXTsKICAgIC8vIHdhcm4gZHVwbGljYXRlIHNsb3QgdXNhZ2UKICAgIGlmIChzbG90Tm9kZXMpIHsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBzbG90Tm9kZXMuX3JlbmRlcmVkKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJEdXBsaWNhdGUgcHJlc2VuY2Ugb2Ygc2xvdCBcIiIgKyBuYW1lICsgIlwiIGZvdW5kIGluIHRoZSBzYW1lIHJlbmRlciB0cmVlICIgKwogICAgICAgICAgIi0gdGhpcyB3aWxsIGxpa2VseSBjYXVzZSByZW5kZXIgZXJyb3JzLiIsCiAgICAgICAgICB0aGlzCiAgICAgICAgKTsKICAgICAgfQogICAgICBzbG90Tm9kZXMuX3JlbmRlcmVkID0gdHJ1ZTsKICAgIH0KICAgIG5vZGVzID0gc2xvdE5vZGVzIHx8IGZhbGxiYWNrOwogIH0KCiAgdmFyIHRhcmdldCA9IHByb3BzICYmIHByb3BzLnNsb3Q7CiAgaWYgKHRhcmdldCkgewogICAgcmV0dXJuIHRoaXMuJGNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJywgeyBzbG90OiB0YXJnZXQgfSwgbm9kZXMpCiAgfSBlbHNlIHsKICAgIHJldHVybiBub2RlcwogIH0KfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyBmaWx0ZXJzCiAqLwpmdW5jdGlvbiByZXNvbHZlRmlsdGVyIChpZCkgewogIHJldHVybiByZXNvbHZlQXNzZXQodGhpcy4kb3B0aW9ucywgJ2ZpbHRlcnMnLCBpZCwgdHJ1ZSkgfHwgaWRlbnRpdHkKfQoKLyogICovCgpmdW5jdGlvbiBpc0tleU5vdE1hdGNoIChleHBlY3QsIGFjdHVhbCkgewogIGlmIChBcnJheS5pc0FycmF5KGV4cGVjdCkpIHsKICAgIHJldHVybiBleHBlY3QuaW5kZXhPZihhY3R1YWwpID09PSAtMQogIH0gZWxzZSB7CiAgICByZXR1cm4gZXhwZWN0ICE9PSBhY3R1YWwKICB9Cn0KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgY2hlY2tpbmcga2V5Q29kZXMgZnJvbSBjb25maWcuCiAqIGV4cG9zZWQgYXMgVnVlLnByb3RvdHlwZS5fawogKiBwYXNzaW5nIGluIGV2ZW50S2V5TmFtZSBhcyBsYXN0IGFyZ3VtZW50IHNlcGFyYXRlbHkgZm9yIGJhY2t3YXJkcyBjb21wYXQKICovCmZ1bmN0aW9uIGNoZWNrS2V5Q29kZXMgKAogIGV2ZW50S2V5Q29kZSwKICBrZXksCiAgYnVpbHRJbktleUNvZGUsCiAgZXZlbnRLZXlOYW1lLAogIGJ1aWx0SW5LZXlOYW1lCikgewogIHZhciBtYXBwZWRLZXlDb2RlID0gY29uZmlnLmtleUNvZGVzW2tleV0gfHwgYnVpbHRJbktleUNvZGU7CiAgaWYgKGJ1aWx0SW5LZXlOYW1lICYmIGV2ZW50S2V5TmFtZSAmJiAhY29uZmlnLmtleUNvZGVzW2tleV0pIHsKICAgIHJldHVybiBpc0tleU5vdE1hdGNoKGJ1aWx0SW5LZXlOYW1lLCBldmVudEtleU5hbWUpCiAgfSBlbHNlIGlmIChtYXBwZWRLZXlDb2RlKSB7CiAgICByZXR1cm4gaXNLZXlOb3RNYXRjaChtYXBwZWRLZXlDb2RlLCBldmVudEtleUNvZGUpCiAgfSBlbHNlIGlmIChldmVudEtleU5hbWUpIHsKICAgIHJldHVybiBoeXBoZW5hdGUoZXZlbnRLZXlOYW1lKSAhPT0ga2V5CiAgfQp9CgovKiAgKi8KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgbWVyZ2luZyB2LWJpbmQ9Im9iamVjdCIgaW50byBhIFZOb2RlJ3MgZGF0YS4KICovCmZ1bmN0aW9uIGJpbmRPYmplY3RQcm9wcyAoCiAgZGF0YSwKICB0YWcsCiAgdmFsdWUsCiAgYXNQcm9wLAogIGlzU3luYwopIHsKICBpZiAodmFsdWUpIHsKICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICd2LWJpbmQgd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCBvciBBcnJheSB2YWx1ZScsCiAgICAgICAgdGhpcwogICAgICApOwogICAgfSBlbHNlIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgdmFsdWUgPSB0b09iamVjdCh2YWx1ZSk7CiAgICAgIH0KICAgICAgdmFyIGhhc2g7CiAgICAgIHZhciBsb29wID0gZnVuY3Rpb24gKCBrZXkgKSB7CiAgICAgICAgaWYgKAogICAgICAgICAga2V5ID09PSAnY2xhc3MnIHx8CiAgICAgICAgICBrZXkgPT09ICdzdHlsZScgfHwKICAgICAgICAgIGlzUmVzZXJ2ZWRBdHRyaWJ1dGUoa2V5KQogICAgICAgICkgewogICAgICAgICAgaGFzaCA9IGRhdGE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciB0eXBlID0gZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnR5cGU7CiAgICAgICAgICBoYXNoID0gYXNQcm9wIHx8IGNvbmZpZy5tdXN0VXNlUHJvcCh0YWcsIHR5cGUsIGtleSkKICAgICAgICAgICAgPyBkYXRhLmRvbVByb3BzIHx8IChkYXRhLmRvbVByb3BzID0ge30pCiAgICAgICAgICAgIDogZGF0YS5hdHRycyB8fCAoZGF0YS5hdHRycyA9IHt9KTsKICAgICAgICB9CiAgICAgICAgaWYgKCEoa2V5IGluIGhhc2gpKSB7CiAgICAgICAgICBoYXNoW2tleV0gPSB2YWx1ZVtrZXldOwoKICAgICAgICAgIGlmIChpc1N5bmMpIHsKICAgICAgICAgICAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTsKICAgICAgICAgICAgb25bKCJ1cGRhdGU6IiArIGtleSldID0gZnVuY3Rpb24gKCRldmVudCkgewogICAgICAgICAgICAgIHZhbHVlW2tleV0gPSAkZXZlbnQ7CiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwoKICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSBsb29wKCBrZXkgKTsKICAgIH0KICB9CiAgcmV0dXJuIGRhdGEKfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyBzdGF0aWMgdHJlZXMuCiAqLwpmdW5jdGlvbiByZW5kZXJTdGF0aWMgKAogIGluZGV4LAogIGlzSW5Gb3IKKSB7CiAgdmFyIGNhY2hlZCA9IHRoaXMuX3N0YXRpY1RyZWVzIHx8ICh0aGlzLl9zdGF0aWNUcmVlcyA9IFtdKTsKICB2YXIgdHJlZSA9IGNhY2hlZFtpbmRleF07CiAgLy8gaWYgaGFzIGFscmVhZHktcmVuZGVyZWQgc3RhdGljIHRyZWUgYW5kIG5vdCBpbnNpZGUgdi1mb3IsCiAgLy8gd2UgY2FuIHJldXNlIHRoZSBzYW1lIHRyZWUuCiAgaWYgKHRyZWUgJiYgIWlzSW5Gb3IpIHsKICAgIHJldHVybiB0cmVlCiAgfQogIC8vIG90aGVyd2lzZSwgcmVuZGVyIGEgZnJlc2ggdHJlZS4KICB0cmVlID0gY2FjaGVkW2luZGV4XSA9IHRoaXMuJG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zW2luZGV4XS5jYWxsKAogICAgdGhpcy5fcmVuZGVyUHJveHksCiAgICBudWxsLAogICAgdGhpcyAvLyBmb3IgcmVuZGVyIGZucyBnZW5lcmF0ZWQgZm9yIGZ1bmN0aW9uYWwgY29tcG9uZW50IHRlbXBsYXRlcwogICk7CiAgbWFya1N0YXRpYyh0cmVlLCAoIl9fc3RhdGljX18iICsgaW5kZXgpLCBmYWxzZSk7CiAgcmV0dXJuIHRyZWUKfQoKLyoqCiAqIFJ1bnRpbWUgaGVscGVyIGZvciB2LW9uY2UuCiAqIEVmZmVjdGl2ZWx5IGl0IG1lYW5zIG1hcmtpbmcgdGhlIG5vZGUgYXMgc3RhdGljIHdpdGggYSB1bmlxdWUga2V5LgogKi8KZnVuY3Rpb24gbWFya09uY2UgKAogIHRyZWUsCiAgaW5kZXgsCiAga2V5CikgewogIG1hcmtTdGF0aWModHJlZSwgKCJfX29uY2VfXyIgKyBpbmRleCArIChrZXkgPyAoIl8iICsga2V5KSA6ICIiKSksIHRydWUpOwogIHJldHVybiB0cmVlCn0KCmZ1bmN0aW9uIG1hcmtTdGF0aWMgKAogIHRyZWUsCiAga2V5LAogIGlzT25jZQopIHsKICBpZiAoQXJyYXkuaXNBcnJheSh0cmVlKSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0cmVlW2ldICYmIHR5cGVvZiB0cmVlW2ldICE9PSAnc3RyaW5nJykgewogICAgICAgIG1hcmtTdGF0aWNOb2RlKHRyZWVbaV0sIChrZXkgKyAiXyIgKyBpKSwgaXNPbmNlKTsKICAgICAgfQogICAgfQogIH0gZWxzZSB7CiAgICBtYXJrU3RhdGljTm9kZSh0cmVlLCBrZXksIGlzT25jZSk7CiAgfQp9CgpmdW5jdGlvbiBtYXJrU3RhdGljTm9kZSAobm9kZSwga2V5LCBpc09uY2UpIHsKICBub2RlLmlzU3RhdGljID0gdHJ1ZTsKICBub2RlLmtleSA9IGtleTsKICBub2RlLmlzT25jZSA9IGlzT25jZTsKfQoKLyogICovCgpmdW5jdGlvbiBiaW5kT2JqZWN0TGlzdGVuZXJzIChkYXRhLCB2YWx1ZSkgewogIGlmICh2YWx1ZSkgewogICAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkgewogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgICAndi1vbiB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IHZhbHVlJywKICAgICAgICB0aGlzCiAgICAgICk7CiAgICB9IGVsc2UgewogICAgICB2YXIgb24gPSBkYXRhLm9uID0gZGF0YS5vbiA/IGV4dGVuZCh7fSwgZGF0YS5vbikgOiB7fTsKICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7CiAgICAgICAgdmFyIGV4aXN0aW5nID0gb25ba2V5XTsKICAgICAgICB2YXIgb3VycyA9IHZhbHVlW2tleV07CiAgICAgICAgb25ba2V5XSA9IGV4aXN0aW5nID8gW10uY29uY2F0KGV4aXN0aW5nLCBvdXJzKSA6IG91cnM7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGRhdGEKfQoKLyogICovCgpmdW5jdGlvbiBpbnN0YWxsUmVuZGVySGVscGVycyAodGFyZ2V0KSB7CiAgdGFyZ2V0Ll9vID0gbWFya09uY2U7CiAgdGFyZ2V0Ll9uID0gdG9OdW1iZXI7CiAgdGFyZ2V0Ll9zID0gdG9TdHJpbmc7CiAgdGFyZ2V0Ll9sID0gcmVuZGVyTGlzdDsKICB0YXJnZXQuX3QgPSByZW5kZXJTbG90OwogIHRhcmdldC5fcSA9IGxvb3NlRXF1YWw7CiAgdGFyZ2V0Ll9pID0gbG9vc2VJbmRleE9mOwogIHRhcmdldC5fbSA9IHJlbmRlclN0YXRpYzsKICB0YXJnZXQuX2YgPSByZXNvbHZlRmlsdGVyOwogIHRhcmdldC5fayA9IGNoZWNrS2V5Q29kZXM7CiAgdGFyZ2V0Ll9iID0gYmluZE9iamVjdFByb3BzOwogIHRhcmdldC5fdiA9IGNyZWF0ZVRleHRWTm9kZTsKICB0YXJnZXQuX2UgPSBjcmVhdGVFbXB0eVZOb2RlOwogIHRhcmdldC5fdSA9IHJlc29sdmVTY29wZWRTbG90czsKICB0YXJnZXQuX2cgPSBiaW5kT2JqZWN0TGlzdGVuZXJzOwp9CgovKiAgKi8KCmZ1bmN0aW9uIEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0ICgKICBkYXRhLAogIHByb3BzLAogIGNoaWxkcmVuLAogIHBhcmVudCwKICBDdG9yCikgewogIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zOwogIC8vIGVuc3VyZSB0aGUgY3JlYXRlRWxlbWVudCBmdW5jdGlvbiBpbiBmdW5jdGlvbmFsIGNvbXBvbmVudHMKICAvLyBnZXRzIGEgdW5pcXVlIGNvbnRleHQgLSB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgY29ycmVjdCBuYW1lZCBzbG90IGNoZWNrCiAgdmFyIGNvbnRleHRWbTsKICBpZiAoaGFzT3duKHBhcmVudCwgJ191aWQnKSkgewogICAgY29udGV4dFZtID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQpOwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICBjb250ZXh0Vm0uX29yaWdpbmFsID0gcGFyZW50OwogIH0gZWxzZSB7CiAgICAvLyB0aGUgY29udGV4dCB2bSBwYXNzZWQgaW4gaXMgYSBmdW5jdGlvbmFsIGNvbnRleHQgYXMgd2VsbC4KICAgIC8vIGluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBhcmUgYWJsZSB0byBnZXQgYSBob2xkIHRvIHRoZQogICAgLy8gcmVhbCBjb250ZXh0IGluc3RhbmNlLgogICAgY29udGV4dFZtID0gcGFyZW50OwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICBwYXJlbnQgPSBwYXJlbnQuX29yaWdpbmFsOwogIH0KICB2YXIgaXNDb21waWxlZCA9IGlzVHJ1ZShvcHRpb25zLl9jb21waWxlZCk7CiAgdmFyIG5lZWROb3JtYWxpemF0aW9uID0gIWlzQ29tcGlsZWQ7CgogIHRoaXMuZGF0YSA9IGRhdGE7CiAgdGhpcy5wcm9wcyA9IHByb3BzOwogIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICB0aGlzLmxpc3RlbmVycyA9IGRhdGEub24gfHwgZW1wdHlPYmplY3Q7CiAgdGhpcy5pbmplY3Rpb25zID0gcmVzb2x2ZUluamVjdChvcHRpb25zLmluamVjdCwgcGFyZW50KTsKICB0aGlzLnNsb3RzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzb2x2ZVNsb3RzKGNoaWxkcmVuLCBwYXJlbnQpOyB9OwoKICAvLyBzdXBwb3J0IGZvciBjb21waWxlZCBmdW5jdGlvbmFsIHRlbXBsYXRlCiAgaWYgKGlzQ29tcGlsZWQpIHsKICAgIC8vIGV4cG9zaW5nICRvcHRpb25zIGZvciByZW5kZXJTdGF0aWMoKQogICAgdGhpcy4kb3B0aW9ucyA9IG9wdGlvbnM7CiAgICAvLyBwcmUtcmVzb2x2ZSBzbG90cyBmb3IgcmVuZGVyU2xvdCgpCiAgICB0aGlzLiRzbG90cyA9IHRoaXMuc2xvdHMoKTsKICAgIHRoaXMuJHNjb3BlZFNsb3RzID0gZGF0YS5zY29wZWRTbG90cyB8fCBlbXB0eU9iamVjdDsKICB9CgogIGlmIChvcHRpb25zLl9zY29wZUlkKSB7CiAgICB0aGlzLl9jID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsKICAgICAgdmFyIHZub2RlID0gY3JlYXRlRWxlbWVudChjb250ZXh0Vm0sIGEsIGIsIGMsIGQsIG5lZWROb3JtYWxpemF0aW9uKTsKICAgICAgaWYgKHZub2RlICYmICFBcnJheS5pc0FycmF5KHZub2RlKSkgewogICAgICAgIHZub2RlLmZuU2NvcGVJZCA9IG9wdGlvbnMuX3Njb3BlSWQ7CiAgICAgICAgdm5vZGUuZm5Db250ZXh0ID0gcGFyZW50OwogICAgICB9CiAgICAgIHJldHVybiB2bm9kZQogICAgfTsKICB9IGVsc2UgewogICAgdGhpcy5fYyA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkKSB7IHJldHVybiBjcmVhdGVFbGVtZW50KGNvbnRleHRWbSwgYSwgYiwgYywgZCwgbmVlZE5vcm1hbGl6YXRpb24pOyB9OwogIH0KfQoKaW5zdGFsbFJlbmRlckhlbHBlcnMoRnVuY3Rpb25hbFJlbmRlckNvbnRleHQucHJvdG90eXBlKTsKCmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQgKAogIEN0b3IsCiAgcHJvcHNEYXRhLAogIGRhdGEsCiAgY29udGV4dFZtLAogIGNoaWxkcmVuCikgewogIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zOwogIHZhciBwcm9wcyA9IHt9OwogIHZhciBwcm9wT3B0aW9ucyA9IG9wdGlvbnMucHJvcHM7CiAgaWYgKGlzRGVmKHByb3BPcHRpb25zKSkgewogICAgZm9yICh2YXIga2V5IGluIHByb3BPcHRpb25zKSB7CiAgICAgIHByb3BzW2tleV0gPSB2YWxpZGF0ZVByb3Aoa2V5LCBwcm9wT3B0aW9ucywgcHJvcHNEYXRhIHx8IGVtcHR5T2JqZWN0KTsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKGlzRGVmKGRhdGEuYXR0cnMpKSB7IG1lcmdlUHJvcHMocHJvcHMsIGRhdGEuYXR0cnMpOyB9CiAgICBpZiAoaXNEZWYoZGF0YS5wcm9wcykpIHsgbWVyZ2VQcm9wcyhwcm9wcywgZGF0YS5wcm9wcyk7IH0KICB9CgogIHZhciByZW5kZXJDb250ZXh0ID0gbmV3IEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0KAogICAgZGF0YSwKICAgIHByb3BzLAogICAgY2hpbGRyZW4sCiAgICBjb250ZXh0Vm0sCiAgICBDdG9yCiAgKTsKCiAgdmFyIHZub2RlID0gb3B0aW9ucy5yZW5kZXIuY2FsbChudWxsLCByZW5kZXJDb250ZXh0Ll9jLCByZW5kZXJDb250ZXh0KTsKCiAgaWYgKHZub2RlIGluc3RhbmNlb2YgVk5vZGUpIHsKICAgIHJldHVybiBjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0KHZub2RlLCBkYXRhLCByZW5kZXJDb250ZXh0LnBhcmVudCwgb3B0aW9ucykKICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodm5vZGUpKSB7CiAgICB2YXIgdm5vZGVzID0gbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUpIHx8IFtdOwogICAgdmFyIHJlcyA9IG5ldyBBcnJheSh2bm9kZXMubGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdm5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc1tpXSA9IGNsb25lQW5kTWFya0Z1bmN0aW9uYWxSZXN1bHQodm5vZGVzW2ldLCBkYXRhLCByZW5kZXJDb250ZXh0LnBhcmVudCwgb3B0aW9ucyk7CiAgICB9CiAgICByZXR1cm4gcmVzCiAgfQp9CgpmdW5jdGlvbiBjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0ICh2bm9kZSwgZGF0YSwgY29udGV4dFZtLCBvcHRpb25zKSB7CiAgLy8gIzc4MTcgY2xvbmUgbm9kZSBiZWZvcmUgc2V0dGluZyBmbkNvbnRleHQsIG90aGVyd2lzZSBpZiB0aGUgbm9kZSBpcyByZXVzZWQKICAvLyAoZS5nLiBpdCB3YXMgZnJvbSBhIGNhY2hlZCBub3JtYWwgc2xvdCkgdGhlIGZuQ29udGV4dCBjYXVzZXMgbmFtZWQgc2xvdHMKICAvLyB0aGF0IHNob3VsZCBub3QgYmUgbWF0Y2hlZCB0byBtYXRjaC4KICB2YXIgY2xvbmUgPSBjbG9uZVZOb2RlKHZub2RlKTsKICBjbG9uZS5mbkNvbnRleHQgPSBjb250ZXh0Vm07CiAgY2xvbmUuZm5PcHRpb25zID0gb3B0aW9uczsKICBpZiAoZGF0YS5zbG90KSB7CiAgICAoY2xvbmUuZGF0YSB8fCAoY2xvbmUuZGF0YSA9IHt9KSkuc2xvdCA9IGRhdGEuc2xvdDsKICB9CiAgcmV0dXJuIGNsb25lCn0KCmZ1bmN0aW9uIG1lcmdlUHJvcHMgKHRvLCBmcm9tKSB7CiAgZm9yICh2YXIga2V5IGluIGZyb20pIHsKICAgIHRvW2NhbWVsaXplKGtleSldID0gZnJvbVtrZXldOwogIH0KfQoKLyogICovCgoKCgovLyBSZWdpc3RlciB0aGUgY29tcG9uZW50IGhvb2sgdG8gd2VleCBuYXRpdmUgcmVuZGVyIGVuZ2luZS4KLy8gVGhlIGhvb2sgd2lsbCBiZSB0cmlnZ2VyZWQgYnkgbmF0aXZlLCBub3QgamF2YXNjcmlwdC4KCgovLyBVcGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgY29tcG9uZW50IHRvIHdlZXggbmF0aXZlIHJlbmRlciBlbmdpbmUuCgovKiAgKi8KCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9IYW5rczEwMTAwL3dlZXgtbmF0aXZlLWRpcmVjdGl2ZS90cmVlL21hc3Rlci9jb21wb25lbnQKCi8vIGxpc3RlbmluZyBvbiBuYXRpdmUgY2FsbGJhY2sKCi8qICAqLwoKLyogICovCgovLyBpbmxpbmUgaG9va3MgdG8gYmUgaW52b2tlZCBvbiBjb21wb25lbnQgVk5vZGVzIGR1cmluZyBwYXRjaAp2YXIgY29tcG9uZW50Vk5vZGVIb29rcyA9IHsKICBpbml0OiBmdW5jdGlvbiBpbml0ICgKICAgIHZub2RlLAogICAgaHlkcmF0aW5nLAogICAgcGFyZW50RWxtLAogICAgcmVmRWxtCiAgKSB7CiAgICBpZiAoCiAgICAgIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICYmCiAgICAgICF2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQgJiYKICAgICAgdm5vZGUuZGF0YS5rZWVwQWxpdmUKICAgICkgewogICAgICAvLyBrZXB0LWFsaXZlIGNvbXBvbmVudHMsIHRyZWF0IGFzIGEgcGF0Y2gKICAgICAgdmFyIG1vdW50ZWROb2RlID0gdm5vZGU7IC8vIHdvcmsgYXJvdW5kIGZsb3cKICAgICAgY29tcG9uZW50Vk5vZGVIb29rcy5wcmVwYXRjaChtb3VudGVkTm9kZSwgbW91bnRlZE5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGNoaWxkID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZUZvclZub2RlKAogICAgICAgIHZub2RlLAogICAgICAgIGFjdGl2ZUluc3RhbmNlLAogICAgICAgIHBhcmVudEVsbSwKICAgICAgICByZWZFbG0KICAgICAgKTsKICAgICAgY2hpbGQuJG1vdW50KGh5ZHJhdGluZyA/IHZub2RlLmVsbSA6IHVuZGVmaW5lZCwgaHlkcmF0aW5nKTsKICAgIH0KICB9LAoKICBwcmVwYXRjaDogZnVuY3Rpb24gcHJlcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSkgewogICAgdmFyIG9wdGlvbnMgPSB2bm9kZS5jb21wb25lbnRPcHRpb25zOwogICAgdmFyIGNoaWxkID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBvbGRWbm9kZS5jb21wb25lbnRJbnN0YW5jZTsKICAgIHVwZGF0ZUNoaWxkQ29tcG9uZW50KAogICAgICBjaGlsZCwKICAgICAgb3B0aW9ucy5wcm9wc0RhdGEsIC8vIHVwZGF0ZWQgcHJvcHMKICAgICAgb3B0aW9ucy5saXN0ZW5lcnMsIC8vIHVwZGF0ZWQgbGlzdGVuZXJzCiAgICAgIHZub2RlLCAvLyBuZXcgcGFyZW50IHZub2RlCiAgICAgIG9wdGlvbnMuY2hpbGRyZW4gLy8gbmV3IGNoaWxkcmVuCiAgICApOwogIH0sCgogIGluc2VydDogZnVuY3Rpb24gaW5zZXJ0ICh2bm9kZSkgewogICAgdmFyIGNvbnRleHQgPSB2bm9kZS5jb250ZXh0OwogICAgdmFyIGNvbXBvbmVudEluc3RhbmNlID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2U7CiAgICBpZiAoIWNvbXBvbmVudEluc3RhbmNlLl9pc01vdW50ZWQpIHsKICAgICAgY29tcG9uZW50SW5zdGFuY2UuX2lzTW91bnRlZCA9IHRydWU7CiAgICAgIGNhbGxIb29rKGNvbXBvbmVudEluc3RhbmNlLCAnbW91bnRlZCcpOwogICAgfQogICAgaWYgKHZub2RlLmRhdGEua2VlcEFsaXZlKSB7CiAgICAgIGlmIChjb250ZXh0Ll9pc01vdW50ZWQpIHsKICAgICAgICAvLyB2dWUtcm91dGVyIzEyMTIKICAgICAgICAvLyBEdXJpbmcgdXBkYXRlcywgYSBrZXB0LWFsaXZlIGNvbXBvbmVudCdzIGNoaWxkIGNvbXBvbmVudHMgbWF5CiAgICAgICAgLy8gY2hhbmdlLCBzbyBkaXJlY3RseSB3YWxraW5nIHRoZSB0cmVlIGhlcmUgbWF5IGNhbGwgYWN0aXZhdGVkIGhvb2tzCiAgICAgICAgLy8gb24gaW5jb3JyZWN0IGNoaWxkcmVuLiBJbnN0ZWFkIHdlIHB1c2ggdGhlbSBpbnRvIGEgcXVldWUgd2hpY2ggd2lsbAogICAgICAgIC8vIGJlIHByb2Nlc3NlZCBhZnRlciB0aGUgd2hvbGUgcGF0Y2ggcHJvY2VzcyBlbmRlZC4KICAgICAgICBxdWV1ZUFjdGl2YXRlZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSwgdHJ1ZSAvKiBkaXJlY3QgKi8pOwogICAgICB9CiAgICB9CiAgfSwKCiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHsKICAgIHZhciBjb21wb25lbnRJbnN0YW5jZSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlOwogICAgaWYgKCFjb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQpIHsKICAgICAgaWYgKCF2bm9kZS5kYXRhLmtlZXBBbGl2ZSkgewogICAgICAgIGNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlLCB0cnVlIC8qIGRpcmVjdCAqLyk7CiAgICAgIH0KICAgIH0KICB9Cn07Cgp2YXIgaG9va3NUb01lcmdlID0gT2JqZWN0LmtleXMoY29tcG9uZW50Vk5vZGVIb29rcyk7CgpmdW5jdGlvbiBjcmVhdGVDb21wb25lbnQgKAogIEN0b3IsCiAgZGF0YSwKICBjb250ZXh0LAogIGNoaWxkcmVuLAogIHRhZwopIHsKICBpZiAoaXNVbmRlZihDdG9yKSkgewogICAgcmV0dXJuCiAgfQoKICB2YXIgYmFzZUN0b3IgPSBjb250ZXh0LiRvcHRpb25zLl9iYXNlOwoKICAvLyBwbGFpbiBvcHRpb25zIG9iamVjdDogdHVybiBpdCBpbnRvIGEgY29uc3RydWN0b3IKICBpZiAoaXNPYmplY3QoQ3RvcikpIHsKICAgIEN0b3IgPSBiYXNlQ3Rvci5leHRlbmQoQ3Rvcik7CiAgfQoKICAvLyBpZiBhdCB0aGlzIHN0YWdlIGl0J3Mgbm90IGEgY29uc3RydWN0b3Igb3IgYW4gYXN5bmMgY29tcG9uZW50IGZhY3RvcnksCiAgLy8gcmVqZWN0LgogIGlmICh0eXBlb2YgQ3RvciAhPT0gJ2Z1bmN0aW9uJykgewogICAgewogICAgICB3YXJuKCgiSW52YWxpZCBDb21wb25lbnQgZGVmaW5pdGlvbjogIiArIChTdHJpbmcoQ3RvcikpKSwgY29udGV4dCk7CiAgICB9CiAgICByZXR1cm4KICB9CgogIC8vIGFzeW5jIGNvbXBvbmVudAogIHZhciBhc3luY0ZhY3Rvcnk7CiAgaWYgKGlzVW5kZWYoQ3Rvci5jaWQpKSB7CiAgICBhc3luY0ZhY3RvcnkgPSBDdG9yOwogICAgQ3RvciA9IHJlc29sdmVBc3luY0NvbXBvbmVudChhc3luY0ZhY3RvcnksIGJhc2VDdG9yLCBjb250ZXh0KTsKICAgIGlmIChDdG9yID09PSB1bmRlZmluZWQpIHsKICAgICAgLy8gcmV0dXJuIGEgcGxhY2Vob2xkZXIgbm9kZSBmb3IgYXN5bmMgY29tcG9uZW50LCB3aGljaCBpcyByZW5kZXJlZAogICAgICAvLyBhcyBhIGNvbW1lbnQgbm9kZSBidXQgcHJlc2VydmVzIGFsbCB0aGUgcmF3IGluZm9ybWF0aW9uIGZvciB0aGUgbm9kZS4KICAgICAgLy8gdGhlIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBmb3IgYXN5bmMgc2VydmVyLXJlbmRlcmluZyBhbmQgaHlkcmF0aW9uLgogICAgICByZXR1cm4gY3JlYXRlQXN5bmNQbGFjZWhvbGRlcigKICAgICAgICBhc3luY0ZhY3RvcnksCiAgICAgICAgZGF0YSwKICAgICAgICBjb250ZXh0LAogICAgICAgIGNoaWxkcmVuLAogICAgICAgIHRhZwogICAgICApCiAgICB9CiAgfQoKICBkYXRhID0gZGF0YSB8fCB7fTsKCiAgLy8gcmVzb2x2ZSBjb25zdHJ1Y3RvciBvcHRpb25zIGluIGNhc2UgZ2xvYmFsIG1peGlucyBhcmUgYXBwbGllZCBhZnRlcgogIC8vIGNvbXBvbmVudCBjb25zdHJ1Y3RvciBjcmVhdGlvbgogIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvcik7CgogIC8vIHRyYW5zZm9ybSBjb21wb25lbnQgdi1tb2RlbCBkYXRhIGludG8gcHJvcHMgJiBldmVudHMKICBpZiAoaXNEZWYoZGF0YS5tb2RlbCkpIHsKICAgIHRyYW5zZm9ybU1vZGVsKEN0b3Iub3B0aW9ucywgZGF0YSk7CiAgfQoKICAvLyBleHRyYWN0IHByb3BzCiAgdmFyIHByb3BzRGF0YSA9IGV4dHJhY3RQcm9wc0Zyb21WTm9kZURhdGEoZGF0YSwgQ3RvciwgdGFnKTsKCiAgLy8gZnVuY3Rpb25hbCBjb21wb25lbnQKICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5mdW5jdGlvbmFsKSkgewogICAgcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQoQ3RvciwgcHJvcHNEYXRhLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbikKICB9CgogIC8vIGV4dHJhY3QgbGlzdGVuZXJzLCBzaW5jZSB0aGVzZSBuZWVkcyB0byBiZSB0cmVhdGVkIGFzCiAgLy8gY2hpbGQgY29tcG9uZW50IGxpc3RlbmVycyBpbnN0ZWFkIG9mIERPTSBsaXN0ZW5lcnMKICB2YXIgbGlzdGVuZXJzID0gZGF0YS5vbjsKICAvLyByZXBsYWNlIHdpdGggbGlzdGVuZXJzIHdpdGggLm5hdGl2ZSBtb2RpZmllcgogIC8vIHNvIGl0IGdldHMgcHJvY2Vzc2VkIGR1cmluZyBwYXJlbnQgY29tcG9uZW50IHBhdGNoLgogIGRhdGEub24gPSBkYXRhLm5hdGl2ZU9uOwoKICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5hYnN0cmFjdCkpIHsKICAgIC8vIGFic3RyYWN0IGNvbXBvbmVudHMgZG8gbm90IGtlZXAgYW55dGhpbmcKICAgIC8vIG90aGVyIHRoYW4gcHJvcHMgJiBsaXN0ZW5lcnMgJiBzbG90CgogICAgLy8gd29yayBhcm91bmQgZmxvdwogICAgdmFyIHNsb3QgPSBkYXRhLnNsb3Q7CiAgICBkYXRhID0ge307CiAgICBpZiAoc2xvdCkgewogICAgICBkYXRhLnNsb3QgPSBzbG90OwogICAgfQogIH0KCiAgLy8gaW5zdGFsbCBjb21wb25lbnQgbWFuYWdlbWVudCBob29rcyBvbnRvIHRoZSBwbGFjZWhvbGRlciBub2RlCiAgaW5zdGFsbENvbXBvbmVudEhvb2tzKGRhdGEpOwoKICAvLyByZXR1cm4gYSBwbGFjZWhvbGRlciB2bm9kZQogIHZhciBuYW1lID0gQ3Rvci5vcHRpb25zLm5hbWUgfHwgdGFnOwogIHZhciB2bm9kZSA9IG5ldyBWTm9kZSgKICAgICgidnVlLWNvbXBvbmVudC0iICsgKEN0b3IuY2lkKSArIChuYW1lID8gKCItIiArIG5hbWUpIDogJycpKSwKICAgIGRhdGEsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbnRleHQsCiAgICB7IEN0b3I6IEN0b3IsIHByb3BzRGF0YTogcHJvcHNEYXRhLCBsaXN0ZW5lcnM6IGxpc3RlbmVycywgdGFnOiB0YWcsIGNoaWxkcmVuOiBjaGlsZHJlbiB9LAogICAgYXN5bmNGYWN0b3J5CiAgKTsKCiAgLy8gV2VleCBzcGVjaWZpYzogaW52b2tlIHJlY3ljbGUtbGlzdCBvcHRpbWl6ZWQgQHJlbmRlciBmdW5jdGlvbiBmb3IKICAvLyBleHRyYWN0aW5nIGNlbGwtc2xvdCB0ZW1wbGF0ZS4KICAvLyBodHRwczovL2dpdGh1Yi5jb20vSGFua3MxMDEwMC93ZWV4LW5hdGl2ZS1kaXJlY3RpdmUvdHJlZS9tYXN0ZXIvY29tcG9uZW50CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgcmV0dXJuIHZub2RlCn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlRm9yVm5vZGUgKAogIHZub2RlLCAvLyB3ZSBrbm93IGl0J3MgTW91bnRlZENvbXBvbmVudFZOb2RlIGJ1dCBmbG93IGRvZXNuJ3QKICBwYXJlbnQsIC8vIGFjdGl2ZUluc3RhbmNlIGluIGxpZmVjeWNsZSBzdGF0ZQogIHBhcmVudEVsbSwKICByZWZFbG0KKSB7CiAgdmFyIG9wdGlvbnMgPSB7CiAgICBfaXNDb21wb25lbnQ6IHRydWUsCiAgICBwYXJlbnQ6IHBhcmVudCwKICAgIF9wYXJlbnRWbm9kZTogdm5vZGUsCiAgICBfcGFyZW50RWxtOiBwYXJlbnRFbG0gfHwgbnVsbCwKICAgIF9yZWZFbG06IHJlZkVsbSB8fCBudWxsCiAgfTsKICAvLyBjaGVjayBpbmxpbmUtdGVtcGxhdGUgcmVuZGVyIGZ1bmN0aW9ucwogIHZhciBpbmxpbmVUZW1wbGF0ZSA9IHZub2RlLmRhdGEuaW5saW5lVGVtcGxhdGU7CiAgaWYgKGlzRGVmKGlubGluZVRlbXBsYXRlKSkgewogICAgb3B0aW9ucy5yZW5kZXIgPSBpbmxpbmVUZW1wbGF0ZS5yZW5kZXI7CiAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IGlubGluZVRlbXBsYXRlLnN0YXRpY1JlbmRlckZuczsKICB9CiAgcmV0dXJuIG5ldyB2bm9kZS5jb21wb25lbnRPcHRpb25zLkN0b3Iob3B0aW9ucykKfQoKZnVuY3Rpb24gaW5zdGFsbENvbXBvbmVudEhvb2tzIChkYXRhKSB7CiAgdmFyIGhvb2tzID0gZGF0YS5ob29rIHx8IChkYXRhLmhvb2sgPSB7fSk7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rc1RvTWVyZ2UubGVuZ3RoOyBpKyspIHsKICAgIHZhciBrZXkgPSBob29rc1RvTWVyZ2VbaV07CiAgICBob29rc1trZXldID0gY29tcG9uZW50Vk5vZGVIb29rc1trZXldOwogIH0KfQoKLy8gdHJhbnNmb3JtIGNvbXBvbmVudCB2LW1vZGVsIGluZm8gKHZhbHVlIGFuZCBjYWxsYmFjaykgaW50bwovLyBwcm9wIGFuZCBldmVudCBoYW5kbGVyIHJlc3BlY3RpdmVseS4KZnVuY3Rpb24gdHJhbnNmb3JtTW9kZWwgKG9wdGlvbnMsIGRhdGEpIHsKICB2YXIgcHJvcCA9IChvcHRpb25zLm1vZGVsICYmIG9wdGlvbnMubW9kZWwucHJvcCkgfHwgJ3ZhbHVlJzsKICB2YXIgZXZlbnQgPSAob3B0aW9ucy5tb2RlbCAmJiBvcHRpb25zLm1vZGVsLmV2ZW50KSB8fCAnaW5wdXQnOyhkYXRhLnByb3BzIHx8IChkYXRhLnByb3BzID0ge30pKVtwcm9wXSA9IGRhdGEubW9kZWwudmFsdWU7CiAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTsKICBpZiAoaXNEZWYob25bZXZlbnRdKSkgewogICAgb25bZXZlbnRdID0gW2RhdGEubW9kZWwuY2FsbGJhY2tdLmNvbmNhdChvbltldmVudF0pOwogIH0gZWxzZSB7CiAgICBvbltldmVudF0gPSBkYXRhLm1vZGVsLmNhbGxiYWNrOwogIH0KfQoKLyogICovCgp2YXIgU0lNUExFX05PUk1BTElaRSA9IDE7CnZhciBBTFdBWVNfTk9STUFMSVpFID0gMjsKCi8vIHdyYXBwZXIgZnVuY3Rpb24gZm9yIHByb3ZpZGluZyBhIG1vcmUgZmxleGlibGUgaW50ZXJmYWNlCi8vIHdpdGhvdXQgZ2V0dGluZyB5ZWxsZWQgYXQgYnkgZmxvdwpmdW5jdGlvbiBjcmVhdGVFbGVtZW50ICgKICBjb250ZXh0LAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIG5vcm1hbGl6YXRpb25UeXBlLAogIGFsd2F5c05vcm1hbGl6ZQopIHsKICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSB8fCBpc1ByaW1pdGl2ZShkYXRhKSkgewogICAgbm9ybWFsaXphdGlvblR5cGUgPSBjaGlsZHJlbjsKICAgIGNoaWxkcmVuID0gZGF0YTsKICAgIGRhdGEgPSB1bmRlZmluZWQ7CiAgfQogIGlmIChpc1RydWUoYWx3YXlzTm9ybWFsaXplKSkgewogICAgbm9ybWFsaXphdGlvblR5cGUgPSBBTFdBWVNfTk9STUFMSVpFOwogIH0KICByZXR1cm4gX2NyZWF0ZUVsZW1lbnQoY29udGV4dCwgdGFnLCBkYXRhLCBjaGlsZHJlbiwgbm9ybWFsaXphdGlvblR5cGUpCn0KCmZ1bmN0aW9uIF9jcmVhdGVFbGVtZW50ICgKICBjb250ZXh0LAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIG5vcm1hbGl6YXRpb25UeXBlCikgewogIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZigoZGF0YSkuX19vYl9fKSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICJBdm9pZCB1c2luZyBvYnNlcnZlZCBkYXRhIG9iamVjdCBhcyB2bm9kZSBkYXRhOiAiICsgKEpTT04uc3RyaW5naWZ5KGRhdGEpKSArICJcbiIgKwogICAgICAnQWx3YXlzIGNyZWF0ZSBmcmVzaCB2bm9kZSBkYXRhIG9iamVjdHMgaW4gZWFjaCByZW5kZXIhJywKICAgICAgY29udGV4dAogICAgKTsKICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKCkKICB9CiAgLy8gb2JqZWN0IHN5bnRheCBpbiB2LWJpbmQKICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNEZWYoZGF0YS5pcykpIHsKICAgIHRhZyA9IGRhdGEuaXM7CiAgfQogIGlmICghdGFnKSB7CiAgICAvLyBpbiBjYXNlIG9mIGNvbXBvbmVudCA6aXMgc2V0IHRvIGZhbHN5IHZhbHVlCiAgICByZXR1cm4gY3JlYXRlRW1wdHlWTm9kZSgpCiAgfQogIC8vIHdhcm4gYWdhaW5zdCBub24tcHJpbWl0aXZlIGtleQogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIGlzRGVmKGRhdGEpICYmIGlzRGVmKGRhdGEua2V5KSAmJiAhaXNQcmltaXRpdmUoZGF0YS5rZXkpCiAgKSB7CiAgICB7CiAgICAgIHdhcm4oCiAgICAgICAgJ0F2b2lkIHVzaW5nIG5vbi1wcmltaXRpdmUgdmFsdWUgYXMga2V5LCAnICsKICAgICAgICAndXNlIHN0cmluZy9udW1iZXIgdmFsdWUgaW5zdGVhZC4nLAogICAgICAgIGNvbnRleHQKICAgICAgKTsKICAgIH0KICB9CiAgLy8gc3VwcG9ydCBzaW5nbGUgZnVuY3Rpb24gY2hpbGRyZW4gYXMgZGVmYXVsdCBzY29wZWQgc2xvdAogIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJgogICAgdHlwZW9mIGNoaWxkcmVuWzBdID09PSAnZnVuY3Rpb24nCiAgKSB7CiAgICBkYXRhID0gZGF0YSB8fCB7fTsKICAgIGRhdGEuc2NvcGVkU2xvdHMgPSB7IGRlZmF1bHQ6IGNoaWxkcmVuWzBdIH07CiAgICBjaGlsZHJlbi5sZW5ndGggPSAwOwogIH0KICBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IEFMV0FZU19OT1JNQUxJWkUpIHsKICAgIGNoaWxkcmVuID0gbm9ybWFsaXplQ2hpbGRyZW4oY2hpbGRyZW4pOwogIH0gZWxzZSBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IFNJTVBMRV9OT1JNQUxJWkUpIHsKICAgIGNoaWxkcmVuID0gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4oY2hpbGRyZW4pOwogIH0KICB2YXIgdm5vZGUsIG5zOwogIGlmICh0eXBlb2YgdGFnID09PSAnc3RyaW5nJykgewogICAgdmFyIEN0b3I7CiAgICBucyA9IChjb250ZXh0LiR2bm9kZSAmJiBjb250ZXh0LiR2bm9kZS5ucykgfHwgY29uZmlnLmdldFRhZ05hbWVzcGFjZSh0YWcpOwogICAgaWYgKGNvbmZpZy5pc1Jlc2VydmVkVGFnKHRhZykpIHsKICAgICAgLy8gcGxhdGZvcm0gYnVpbHQtaW4gZWxlbWVudHMKICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoCiAgICAgICAgY29uZmlnLnBhcnNlUGxhdGZvcm1UYWdOYW1lKHRhZyksIGRhdGEsIGNoaWxkcmVuLAogICAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBjb250ZXh0CiAgICAgICk7CiAgICB9IGVsc2UgaWYgKGlzRGVmKEN0b3IgPSByZXNvbHZlQXNzZXQoY29udGV4dC4kb3B0aW9ucywgJ2NvbXBvbmVudHMnLCB0YWcpKSkgewogICAgICAvLyBjb21wb25lbnQKICAgICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQoQ3RvciwgZGF0YSwgY29udGV4dCwgY2hpbGRyZW4sIHRhZyk7CiAgICB9IGVsc2UgewogICAgICAvLyB1bmtub3duIG9yIHVubGlzdGVkIG5hbWVzcGFjZWQgZWxlbWVudHMKICAgICAgLy8gY2hlY2sgYXQgcnVudGltZSBiZWNhdXNlIGl0IG1heSBnZXQgYXNzaWduZWQgYSBuYW1lc3BhY2Ugd2hlbiBpdHMKICAgICAgLy8gcGFyZW50IG5vcm1hbGl6ZXMgY2hpbGRyZW4KICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoCiAgICAgICAgdGFnLCBkYXRhLCBjaGlsZHJlbiwKICAgICAgICB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29udGV4dAogICAgICApOwogICAgfQogIH0gZWxzZSB7CiAgICAvLyBkaXJlY3QgY29tcG9uZW50IG9wdGlvbnMgLyBjb25zdHJ1Y3RvcgogICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQodGFnLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbik7CiAgfQogIGlmIChBcnJheS5pc0FycmF5KHZub2RlKSkgewogICAgcmV0dXJuIHZub2RlCiAgfSBlbHNlIGlmIChpc0RlZih2bm9kZSkpIHsKICAgIGlmIChpc0RlZihucykpIHsgYXBwbHlOUyh2bm9kZSwgbnMpOyB9CiAgICBpZiAoaXNEZWYoZGF0YSkpIHsgcmVnaXN0ZXJEZWVwQmluZGluZ3MoZGF0YSk7IH0KICAgIHJldHVybiB2bm9kZQogIH0gZWxzZSB7CiAgICByZXR1cm4gY3JlYXRlRW1wdHlWTm9kZSgpCiAgfQp9CgpmdW5jdGlvbiBhcHBseU5TICh2bm9kZSwgbnMsIGZvcmNlKSB7CiAgdm5vZGUubnMgPSBuczsKICBpZiAodm5vZGUudGFnID09PSAnZm9yZWlnbk9iamVjdCcpIHsKICAgIC8vIHVzZSBkZWZhdWx0IG5hbWVzcGFjZSBpbnNpZGUgZm9yZWlnbk9iamVjdAogICAgbnMgPSB1bmRlZmluZWQ7CiAgICBmb3JjZSA9IHRydWU7CiAgfQogIGlmIChpc0RlZih2bm9kZS5jaGlsZHJlbikpIHsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciBjaGlsZCA9IHZub2RlLmNoaWxkcmVuW2ldOwogICAgICBpZiAoaXNEZWYoY2hpbGQudGFnKSAmJiAoCiAgICAgICAgaXNVbmRlZihjaGlsZC5ucykgfHwgKGlzVHJ1ZShmb3JjZSkgJiYgY2hpbGQudGFnICE9PSAnc3ZnJykpKSB7CiAgICAgICAgYXBwbHlOUyhjaGlsZCwgbnMsIGZvcmNlKTsKICAgICAgfQogICAgfQogIH0KfQoKLy8gcmVmICM1MzE4Ci8vIG5lY2Vzc2FyeSB0byBlbnN1cmUgcGFyZW50IHJlLXJlbmRlciB3aGVuIGRlZXAgYmluZGluZ3MgbGlrZSA6c3R5bGUgYW5kCi8vIDpjbGFzcyBhcmUgdXNlZCBvbiBzbG90IG5vZGVzCmZ1bmN0aW9uIHJlZ2lzdGVyRGVlcEJpbmRpbmdzIChkYXRhKSB7CiAgaWYgKGlzT2JqZWN0KGRhdGEuc3R5bGUpKSB7CiAgICB0cmF2ZXJzZShkYXRhLnN0eWxlKTsKICB9CiAgaWYgKGlzT2JqZWN0KGRhdGEuY2xhc3MpKSB7CiAgICB0cmF2ZXJzZShkYXRhLmNsYXNzKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdFJlbmRlciAodm0pIHsKICB2bS5fdm5vZGUgPSBudWxsOyAvLyB0aGUgcm9vdCBvZiB0aGUgY2hpbGQgdHJlZQogIHZtLl9zdGF0aWNUcmVlcyA9IG51bGw7IC8vIHYtb25jZSBjYWNoZWQgdHJlZXMKICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zOwogIHZhciBwYXJlbnRWbm9kZSA9IHZtLiR2bm9kZSA9IG9wdGlvbnMuX3BhcmVudFZub2RlOyAvLyB0aGUgcGxhY2Vob2xkZXIgbm9kZSBpbiBwYXJlbnQgdHJlZQogIHZhciByZW5kZXJDb250ZXh0ID0gcGFyZW50Vm5vZGUgJiYgcGFyZW50Vm5vZGUuY29udGV4dDsKICB2bS4kc2xvdHMgPSByZXNvbHZlU2xvdHMob3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4sIHJlbmRlckNvbnRleHQpOwogIHZtLiRzY29wZWRTbG90cyA9IGVtcHR5T2JqZWN0OwogIC8vIGJpbmQgdGhlIGNyZWF0ZUVsZW1lbnQgZm4gdG8gdGhpcyBpbnN0YW5jZQogIC8vIHNvIHRoYXQgd2UgZ2V0IHByb3BlciByZW5kZXIgY29udGV4dCBpbnNpZGUgaXQuCiAgLy8gYXJncyBvcmRlcjogdGFnLCBkYXRhLCBjaGlsZHJlbiwgbm9ybWFsaXphdGlvblR5cGUsIGFsd2F5c05vcm1hbGl6ZQogIC8vIGludGVybmFsIHZlcnNpb24gaXMgdXNlZCBieSByZW5kZXIgZnVuY3Rpb25zIGNvbXBpbGVkIGZyb20gdGVtcGxhdGVzCiAgdm0uX2MgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCkgeyByZXR1cm4gY3JlYXRlRWxlbWVudCh2bSwgYSwgYiwgYywgZCwgZmFsc2UpOyB9OwogIC8vIG5vcm1hbGl6YXRpb24gaXMgYWx3YXlzIGFwcGxpZWQgZm9yIHRoZSBwdWJsaWMgdmVyc2lvbiwgdXNlZCBpbgogIC8vIHVzZXItd3JpdHRlbiByZW5kZXIgZnVuY3Rpb25zLgogIHZtLiRjcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsgcmV0dXJuIGNyZWF0ZUVsZW1lbnQodm0sIGEsIGIsIGMsIGQsIHRydWUpOyB9OwoKICAvLyAkYXR0cnMgJiAkbGlzdGVuZXJzIGFyZSBleHBvc2VkIGZvciBlYXNpZXIgSE9DIGNyZWF0aW9uLgogIC8vIHRoZXkgbmVlZCB0byBiZSByZWFjdGl2ZSBzbyB0aGF0IEhPQ3MgdXNpbmcgdGhlbSBhcmUgYWx3YXlzIHVwZGF0ZWQKICB2YXIgcGFyZW50RGF0YSA9IHBhcmVudFZub2RlICYmIHBhcmVudFZub2RlLmRhdGE7CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgewogICAgZGVmaW5lUmVhY3RpdmUodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICYmIHBhcmVudERhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3QsIGZ1bmN0aW9uICgpIHsKICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKCIkYXR0cnMgaXMgcmVhZG9ubHkuIiwgdm0pOwogICAgfSwgdHJ1ZSk7CiAgICBkZWZpbmVSZWFjdGl2ZSh2bSwgJyRsaXN0ZW5lcnMnLCBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3QsIGZ1bmN0aW9uICgpIHsKICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKCIkbGlzdGVuZXJzIGlzIHJlYWRvbmx5LiIsIHZtKTsKICAgIH0sIHRydWUpOwogIH0KfQoKZnVuY3Rpb24gcmVuZGVyTWl4aW4gKFZ1ZSkgewogIC8vIGluc3RhbGwgcnVudGltZSBjb252ZW5pZW5jZSBoZWxwZXJzCiAgaW5zdGFsbFJlbmRlckhlbHBlcnMoVnVlLnByb3RvdHlwZSk7CgogIFZ1ZS5wcm90b3R5cGUuJG5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7CiAgICByZXR1cm4gbmV4dFRpY2soZm4sIHRoaXMpCiAgfTsKCiAgVnVlLnByb3RvdHlwZS5fcmVuZGVyID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHZtID0gdGhpczsKICAgIHZhciByZWYgPSB2bS4kb3B0aW9uczsKICAgIHZhciByZW5kZXIgPSByZWYucmVuZGVyOwogICAgdmFyIF9wYXJlbnRWbm9kZSA9IHJlZi5fcGFyZW50Vm5vZGU7CgogICAgLy8gcmVzZXQgX3JlbmRlcmVkIGZsYWcgb24gc2xvdHMgZm9yIGR1cGxpY2F0ZSBzbG90IGNoZWNrCiAgICB7CiAgICAgIGZvciAodmFyIGtleSBpbiB2bS4kc2xvdHMpIHsKICAgICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgICAgICB2bS4kc2xvdHNba2V5XS5fcmVuZGVyZWQgPSBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIGlmIChfcGFyZW50Vm5vZGUpIHsKICAgICAgdm0uJHNjb3BlZFNsb3RzID0gX3BhcmVudFZub2RlLmRhdGEuc2NvcGVkU2xvdHMgfHwgZW1wdHlPYmplY3Q7CiAgICB9CgogICAgLy8gc2V0IHBhcmVudCB2bm9kZS4gdGhpcyBhbGxvd3MgcmVuZGVyIGZ1bmN0aW9ucyB0byBoYXZlIGFjY2VzcwogICAgLy8gdG8gdGhlIGRhdGEgb24gdGhlIHBsYWNlaG9sZGVyIG5vZGUuCiAgICB2bS4kdm5vZGUgPSBfcGFyZW50Vm5vZGU7CiAgICAvLyByZW5kZXIgc2VsZgogICAgdmFyIHZub2RlOwogICAgdHJ5IHsKICAgICAgdm5vZGUgPSByZW5kZXIuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICJyZW5kZXIiKTsKICAgICAgLy8gcmV0dXJuIGVycm9yIHJlbmRlciByZXN1bHQsCiAgICAgIC8vIG9yIHByZXZpb3VzIHZub2RlIHRvIHByZXZlbnQgcmVuZGVyIGVycm9yIGNhdXNpbmcgYmxhbmsgY29tcG9uZW50CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgICAgIHsKICAgICAgICBpZiAodm0uJG9wdGlvbnMucmVuZGVyRXJyb3IpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHZub2RlID0gdm0uJG9wdGlvbnMucmVuZGVyRXJyb3IuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50LCBlKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICJyZW5kZXJFcnJvciIpOwogICAgICAgICAgICB2bm9kZSA9IHZtLl92bm9kZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdm5vZGUgPSB2bS5fdm5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvLyByZXR1cm4gZW1wdHkgdm5vZGUgaW4gY2FzZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIGVycm9yZWQgb3V0CiAgICBpZiAoISh2bm9kZSBpbnN0YW5jZW9mIFZOb2RlKSkgewogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIEFycmF5LmlzQXJyYXkodm5vZGUpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdNdWx0aXBsZSByb290IG5vZGVzIHJldHVybmVkIGZyb20gcmVuZGVyIGZ1bmN0aW9uLiBSZW5kZXIgZnVuY3Rpb24gJyArCiAgICAgICAgICAnc2hvdWxkIHJldHVybiBhIHNpbmdsZSByb290IG5vZGUuJywKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgICB2bm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTsKICAgIH0KICAgIC8vIHNldCBwYXJlbnQKICAgIHZub2RlLnBhcmVudCA9IF9wYXJlbnRWbm9kZTsKICAgIHJldHVybiB2bm9kZQogIH07Cn0KCi8qICAqLwoKdmFyIHVpZCQzID0gMDsKCmZ1bmN0aW9uIGluaXRNaXhpbiAoVnVlKSB7CiAgVnVlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgLy8gYSB1aWQKICAgIHZtLl91aWQgPSB1aWQkMysrOwoKICAgIHZhciBzdGFydFRhZywgZW5kVGFnOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNvbmZpZy5wZXJmb3JtYW5jZSAmJiBtYXJrKSB7CiAgICAgIHN0YXJ0VGFnID0gInZ1ZS1wZXJmLXN0YXJ0OiIgKyAodm0uX3VpZCk7CiAgICAgIGVuZFRhZyA9ICJ2dWUtcGVyZi1lbmQ6IiArICh2bS5fdWlkKTsKICAgICAgbWFyayhzdGFydFRhZyk7CiAgICB9CgogICAgLy8gYSBmbGFnIHRvIGF2b2lkIHRoaXMgYmVpbmcgb2JzZXJ2ZWQKICAgIHZtLl9pc1Z1ZSA9IHRydWU7CiAgICAvLyBtZXJnZSBvcHRpb25zCiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLl9pc0NvbXBvbmVudCkgewogICAgICAvLyBvcHRpbWl6ZSBpbnRlcm5hbCBjb21wb25lbnQgaW5zdGFudGlhdGlvbgogICAgICAvLyBzaW5jZSBkeW5hbWljIG9wdGlvbnMgbWVyZ2luZyBpcyBwcmV0dHkgc2xvdywgYW5kIG5vbmUgb2YgdGhlCiAgICAgIC8vIGludGVybmFsIGNvbXBvbmVudCBvcHRpb25zIG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50LgogICAgICBpbml0SW50ZXJuYWxDb21wb25lbnQodm0sIG9wdGlvbnMpOwogICAgfSBlbHNlIHsKICAgICAgdm0uJG9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoCiAgICAgICAgcmVzb2x2ZUNvbnN0cnVjdG9yT3B0aW9ucyh2bS5jb25zdHJ1Y3RvciksCiAgICAgICAgb3B0aW9ucyB8fCB7fSwKICAgICAgICB2bQogICAgICApOwogICAgfQogICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgIHsKICAgICAgaW5pdFByb3h5KHZtKTsKICAgIH0KICAgIC8vIGV4cG9zZSByZWFsIHNlbGYKICAgIHZtLl9zZWxmID0gdm07CiAgICBpbml0TGlmZWN5Y2xlKHZtKTsKICAgIGluaXRFdmVudHModm0pOwogICAgaW5pdFJlbmRlcih2bSk7CiAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZUNyZWF0ZScpOwogICAgaW5pdEluamVjdGlvbnModm0pOyAvLyByZXNvbHZlIGluamVjdGlvbnMgYmVmb3JlIGRhdGEvcHJvcHMKICAgIGluaXRTdGF0ZSh2bSk7CiAgICBpbml0UHJvdmlkZSh2bSk7IC8vIHJlc29sdmUgcHJvdmlkZSBhZnRlciBkYXRhL3Byb3BzCiAgICBjYWxsSG9vayh2bSwgJ2NyZWF0ZWQnKTsKCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHsKICAgICAgdm0uX25hbWUgPSBmb3JtYXRDb21wb25lbnROYW1lKHZtLCBmYWxzZSk7CiAgICAgIG1hcmsoZW5kVGFnKTsKICAgICAgbWVhc3VyZSgoInZ1ZSAiICsgKHZtLl9uYW1lKSArICIgaW5pdCIpLCBzdGFydFRhZywgZW5kVGFnKTsKICAgIH0KCiAgICBpZiAodm0uJG9wdGlvbnMuZWwpIHsKICAgICAgdm0uJG1vdW50KHZtLiRvcHRpb25zLmVsKTsKICAgIH0KICB9Owp9CgpmdW5jdGlvbiBpbml0SW50ZXJuYWxDb21wb25lbnQgKHZtLCBvcHRpb25zKSB7CiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9ucyA9IE9iamVjdC5jcmVhdGUodm0uY29uc3RydWN0b3Iub3B0aW9ucyk7CiAgLy8gZG9pbmcgdGhpcyBiZWNhdXNlIGl0J3MgZmFzdGVyIHRoYW4gZHluYW1pYyBlbnVtZXJhdGlvbi4KICB2YXIgcGFyZW50Vm5vZGUgPSBvcHRpb25zLl9wYXJlbnRWbm9kZTsKICBvcHRzLnBhcmVudCA9IG9wdGlvbnMucGFyZW50OwogIG9wdHMuX3BhcmVudFZub2RlID0gcGFyZW50Vm5vZGU7CiAgb3B0cy5fcGFyZW50RWxtID0gb3B0aW9ucy5fcGFyZW50RWxtOwogIG9wdHMuX3JlZkVsbSA9IG9wdGlvbnMuX3JlZkVsbTsKCiAgdmFyIHZub2RlQ29tcG9uZW50T3B0aW9ucyA9IHBhcmVudFZub2RlLmNvbXBvbmVudE9wdGlvbnM7CiAgb3B0cy5wcm9wc0RhdGEgPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMucHJvcHNEYXRhOwogIG9wdHMuX3BhcmVudExpc3RlbmVycyA9IHZub2RlQ29tcG9uZW50T3B0aW9ucy5saXN0ZW5lcnM7CiAgb3B0cy5fcmVuZGVyQ2hpbGRyZW4gPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMuY2hpbGRyZW47CiAgb3B0cy5fY29tcG9uZW50VGFnID0gdm5vZGVDb21wb25lbnRPcHRpb25zLnRhZzsKCiAgaWYgKG9wdGlvbnMucmVuZGVyKSB7CiAgICBvcHRzLnJlbmRlciA9IG9wdGlvbnMucmVuZGVyOwogICAgb3B0cy5zdGF0aWNSZW5kZXJGbnMgPSBvcHRpb25zLnN0YXRpY1JlbmRlckZuczsKICB9Cn0KCmZ1bmN0aW9uIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMgKEN0b3IpIHsKICB2YXIgb3B0aW9ucyA9IEN0b3Iub3B0aW9uczsKICBpZiAoQ3Rvci5zdXBlcikgewogICAgdmFyIHN1cGVyT3B0aW9ucyA9IHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvci5zdXBlcik7CiAgICB2YXIgY2FjaGVkU3VwZXJPcHRpb25zID0gQ3Rvci5zdXBlck9wdGlvbnM7CiAgICBpZiAoc3VwZXJPcHRpb25zICE9PSBjYWNoZWRTdXBlck9wdGlvbnMpIHsKICAgICAgLy8gc3VwZXIgb3B0aW9uIGNoYW5nZWQsCiAgICAgIC8vIG5lZWQgdG8gcmVzb2x2ZSBuZXcgb3B0aW9ucy4KICAgICAgQ3Rvci5zdXBlck9wdGlvbnMgPSBzdXBlck9wdGlvbnM7CiAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgbGF0ZS1tb2RpZmllZC9hdHRhY2hlZCBvcHRpb25zICgjNDk3NikKICAgICAgdmFyIG1vZGlmaWVkT3B0aW9ucyA9IHJlc29sdmVNb2RpZmllZE9wdGlvbnMoQ3Rvcik7CiAgICAgIC8vIHVwZGF0ZSBiYXNlIGV4dGVuZCBvcHRpb25zCiAgICAgIGlmIChtb2RpZmllZE9wdGlvbnMpIHsKICAgICAgICBleHRlbmQoQ3Rvci5leHRlbmRPcHRpb25zLCBtb2RpZmllZE9wdGlvbnMpOwogICAgICB9CiAgICAgIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoc3VwZXJPcHRpb25zLCBDdG9yLmV4dGVuZE9wdGlvbnMpOwogICAgICBpZiAob3B0aW9ucy5uYW1lKSB7CiAgICAgICAgb3B0aW9ucy5jb21wb25lbnRzW29wdGlvbnMubmFtZV0gPSBDdG9yOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBvcHRpb25zCn0KCmZ1bmN0aW9uIHJlc29sdmVNb2RpZmllZE9wdGlvbnMgKEN0b3IpIHsKICB2YXIgbW9kaWZpZWQ7CiAgdmFyIGxhdGVzdCA9IEN0b3Iub3B0aW9uczsKICB2YXIgZXh0ZW5kZWQgPSBDdG9yLmV4dGVuZE9wdGlvbnM7CiAgdmFyIHNlYWxlZCA9IEN0b3Iuc2VhbGVkT3B0aW9uczsKICBmb3IgKHZhciBrZXkgaW4gbGF0ZXN0KSB7CiAgICBpZiAobGF0ZXN0W2tleV0gIT09IHNlYWxlZFtrZXldKSB7CiAgICAgIGlmICghbW9kaWZpZWQpIHsgbW9kaWZpZWQgPSB7fTsgfQogICAgICBtb2RpZmllZFtrZXldID0gZGVkdXBlKGxhdGVzdFtrZXldLCBleHRlbmRlZFtrZXldLCBzZWFsZWRba2V5XSk7CiAgICB9CiAgfQogIHJldHVybiBtb2RpZmllZAp9CgpmdW5jdGlvbiBkZWR1cGUgKGxhdGVzdCwgZXh0ZW5kZWQsIHNlYWxlZCkgewogIC8vIGNvbXBhcmUgbGF0ZXN0IGFuZCBzZWFsZWQgdG8gZW5zdXJlIGxpZmVjeWNsZSBob29rcyB3b24ndCBiZSBkdXBsaWNhdGVkCiAgLy8gYmV0d2VlbiBtZXJnZXMKICBpZiAoQXJyYXkuaXNBcnJheShsYXRlc3QpKSB7CiAgICB2YXIgcmVzID0gW107CiAgICBzZWFsZWQgPSBBcnJheS5pc0FycmF5KHNlYWxlZCkgPyBzZWFsZWQgOiBbc2VhbGVkXTsKICAgIGV4dGVuZGVkID0gQXJyYXkuaXNBcnJheShleHRlbmRlZCkgPyBleHRlbmRlZCA6IFtleHRlbmRlZF07CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhdGVzdC5sZW5ndGg7IGkrKykgewogICAgICAvLyBwdXNoIG9yaWdpbmFsIG9wdGlvbnMgYW5kIG5vdCBzZWFsZWQgb3B0aW9ucyB0byBleGNsdWRlIGR1cGxpY2F0ZWQgb3B0aW9ucwogICAgICBpZiAoZXh0ZW5kZWQuaW5kZXhPZihsYXRlc3RbaV0pID49IDAgfHwgc2VhbGVkLmluZGV4T2YobGF0ZXN0W2ldKSA8IDApIHsKICAgICAgICByZXMucHVzaChsYXRlc3RbaV0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzCiAgfSBlbHNlIHsKICAgIHJldHVybiBsYXRlc3QKICB9Cn0KCmZ1bmN0aW9uIFZ1ZSAob3B0aW9ucykgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICEodGhpcyBpbnN0YW5jZW9mIFZ1ZSkKICApIHsKICAgIHdhcm4oJ1Z1ZSBpcyBhIGNvbnN0cnVjdG9yIGFuZCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGBuZXdgIGtleXdvcmQnKTsKICB9CiAgdGhpcy5faW5pdChvcHRpb25zKTsKfQoKaW5pdE1peGluKFZ1ZSk7CnN0YXRlTWl4aW4oVnVlKTsKZXZlbnRzTWl4aW4oVnVlKTsKbGlmZWN5Y2xlTWl4aW4oVnVlKTsKcmVuZGVyTWl4aW4oVnVlKTsKCi8qICAqLwoKZnVuY3Rpb24gaW5pdFVzZSAoVnVlKSB7CiAgVnVlLnVzZSA9IGZ1bmN0aW9uIChwbHVnaW4pIHsKICAgIHZhciBpbnN0YWxsZWRQbHVnaW5zID0gKHRoaXMuX2luc3RhbGxlZFBsdWdpbnMgfHwgKHRoaXMuX2luc3RhbGxlZFBsdWdpbnMgPSBbXSkpOwogICAgaWYgKGluc3RhbGxlZFBsdWdpbnMuaW5kZXhPZihwbHVnaW4pID4gLTEpIHsKICAgICAgcmV0dXJuIHRoaXMKICAgIH0KCiAgICAvLyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMKICAgIHZhciBhcmdzID0gdG9BcnJheShhcmd1bWVudHMsIDEpOwogICAgYXJncy51bnNoaWZ0KHRoaXMpOwogICAgaWYgKHR5cGVvZiBwbHVnaW4uaW5zdGFsbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBwbHVnaW4uaW5zdGFsbC5hcHBseShwbHVnaW4sIGFyZ3MpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgcGx1Z2luID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHBsdWdpbi5hcHBseShudWxsLCBhcmdzKTsKICAgIH0KICAgIGluc3RhbGxlZFBsdWdpbnMucHVzaChwbHVnaW4pOwogICAgcmV0dXJuIHRoaXMKICB9Owp9CgovKiAgKi8KCmZ1bmN0aW9uIGluaXRNaXhpbiQxIChWdWUpIHsKICBWdWUubWl4aW4gPSBmdW5jdGlvbiAobWl4aW4pIHsKICAgIHRoaXMub3B0aW9ucyA9IG1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsIG1peGluKTsKICAgIHJldHVybiB0aGlzCiAgfTsKfQoKLyogICovCgpmdW5jdGlvbiBpbml0RXh0ZW5kIChWdWUpIHsKICAvKioKICAgKiBFYWNoIGluc3RhbmNlIGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcgVnVlLCBoYXMgYSB1bmlxdWUKICAgKiBjaWQuIFRoaXMgZW5hYmxlcyB1cyB0byBjcmVhdGUgd3JhcHBlZCAiY2hpbGQKICAgKiBjb25zdHJ1Y3RvcnMiIGZvciBwcm90b3R5cGFsIGluaGVyaXRhbmNlIGFuZCBjYWNoZSB0aGVtLgogICAqLwogIFZ1ZS5jaWQgPSAwOwogIHZhciBjaWQgPSAxOwoKICAvKioKICAgKiBDbGFzcyBpbmhlcml0YW5jZQogICAqLwogIFZ1ZS5leHRlbmQgPSBmdW5jdGlvbiAoZXh0ZW5kT3B0aW9ucykgewogICAgZXh0ZW5kT3B0aW9ucyA9IGV4dGVuZE9wdGlvbnMgfHwge307CiAgICB2YXIgU3VwZXIgPSB0aGlzOwogICAgdmFyIFN1cGVySWQgPSBTdXBlci5jaWQ7CiAgICB2YXIgY2FjaGVkQ3RvcnMgPSBleHRlbmRPcHRpb25zLl9DdG9yIHx8IChleHRlbmRPcHRpb25zLl9DdG9yID0ge30pOwogICAgaWYgKGNhY2hlZEN0b3JzW1N1cGVySWRdKSB7CiAgICAgIHJldHVybiBjYWNoZWRDdG9yc1tTdXBlcklkXQogICAgfQoKICAgIHZhciBuYW1lID0gZXh0ZW5kT3B0aW9ucy5uYW1lIHx8IFN1cGVyLm9wdGlvbnMubmFtZTsKICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgbmFtZSkgewogICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUobmFtZSk7CiAgICB9CgogICAgdmFyIFN1YiA9IGZ1bmN0aW9uIFZ1ZUNvbXBvbmVudCAob3B0aW9ucykgewogICAgICB0aGlzLl9pbml0KG9wdGlvbnMpOwogICAgfTsKICAgIFN1Yi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN1cGVyLnByb3RvdHlwZSk7CiAgICBTdWIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ViOwogICAgU3ViLmNpZCA9IGNpZCsrOwogICAgU3ViLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoCiAgICAgIFN1cGVyLm9wdGlvbnMsCiAgICAgIGV4dGVuZE9wdGlvbnMKICAgICk7CiAgICBTdWJbJ3N1cGVyJ10gPSBTdXBlcjsKCiAgICAvLyBGb3IgcHJvcHMgYW5kIGNvbXB1dGVkIHByb3BlcnRpZXMsIHdlIGRlZmluZSB0aGUgcHJveHkgZ2V0dGVycyBvbgogICAgLy8gdGhlIFZ1ZSBpbnN0YW5jZXMgYXQgZXh0ZW5zaW9uIHRpbWUsIG9uIHRoZSBleHRlbmRlZCBwcm90b3R5cGUuIFRoaXMKICAgIC8vIGF2b2lkcyBPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbHMgZm9yIGVhY2ggaW5zdGFuY2UgY3JlYXRlZC4KICAgIGlmIChTdWIub3B0aW9ucy5wcm9wcykgewogICAgICBpbml0UHJvcHMkMShTdWIpOwogICAgfQogICAgaWYgKFN1Yi5vcHRpb25zLmNvbXB1dGVkKSB7CiAgICAgIGluaXRDb21wdXRlZCQxKFN1Yik7CiAgICB9CgogICAgLy8gYWxsb3cgZnVydGhlciBleHRlbnNpb24vbWl4aW4vcGx1Z2luIHVzYWdlCiAgICBTdWIuZXh0ZW5kID0gU3VwZXIuZXh0ZW5kOwogICAgU3ViLm1peGluID0gU3VwZXIubWl4aW47CiAgICBTdWIudXNlID0gU3VwZXIudXNlOwoKICAgIC8vIGNyZWF0ZSBhc3NldCByZWdpc3RlcnMsIHNvIGV4dGVuZGVkIGNsYXNzZXMKICAgIC8vIGNhbiBoYXZlIHRoZWlyIHByaXZhdGUgYXNzZXRzIHRvby4KICAgIEFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsKICAgICAgU3ViW3R5cGVdID0gU3VwZXJbdHlwZV07CiAgICB9KTsKICAgIC8vIGVuYWJsZSByZWN1cnNpdmUgc2VsZi1sb29rdXAKICAgIGlmIChuYW1lKSB7CiAgICAgIFN1Yi5vcHRpb25zLmNvbXBvbmVudHNbbmFtZV0gPSBTdWI7CiAgICB9CgogICAgLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgc3VwZXIgb3B0aW9ucyBhdCBleHRlbnNpb24gdGltZS4KICAgIC8vIGxhdGVyIGF0IGluc3RhbnRpYXRpb24gd2UgY2FuIGNoZWNrIGlmIFN1cGVyJ3Mgb3B0aW9ucyBoYXZlCiAgICAvLyBiZWVuIHVwZGF0ZWQuCiAgICBTdWIuc3VwZXJPcHRpb25zID0gU3VwZXIub3B0aW9uczsKICAgIFN1Yi5leHRlbmRPcHRpb25zID0gZXh0ZW5kT3B0aW9uczsKICAgIFN1Yi5zZWFsZWRPcHRpb25zID0gZXh0ZW5kKHt9LCBTdWIub3B0aW9ucyk7CgogICAgLy8gY2FjaGUgY29uc3RydWN0b3IKICAgIGNhY2hlZEN0b3JzW1N1cGVySWRdID0gU3ViOwogICAgcmV0dXJuIFN1YgogIH07Cn0KCmZ1bmN0aW9uIGluaXRQcm9wcyQxIChDb21wKSB7CiAgdmFyIHByb3BzID0gQ29tcC5vcHRpb25zLnByb3BzOwogIGZvciAodmFyIGtleSBpbiBwcm9wcykgewogICAgcHJveHkoQ29tcC5wcm90b3R5cGUsICJfcHJvcHMiLCBrZXkpOwogIH0KfQoKZnVuY3Rpb24gaW5pdENvbXB1dGVkJDEgKENvbXApIHsKICB2YXIgY29tcHV0ZWQgPSBDb21wLm9wdGlvbnMuY29tcHV0ZWQ7CiAgZm9yICh2YXIga2V5IGluIGNvbXB1dGVkKSB7CiAgICBkZWZpbmVDb21wdXRlZChDb21wLnByb3RvdHlwZSwga2V5LCBjb21wdXRlZFtrZXldKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdEFzc2V0UmVnaXN0ZXJzIChWdWUpIHsKICAvKioKICAgKiBDcmVhdGUgYXNzZXQgcmVnaXN0cmF0aW9uIG1ldGhvZHMuCiAgICovCiAgQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkgewogICAgVnVlW3R5cGVdID0gZnVuY3Rpb24gKAogICAgICBpZCwKICAgICAgZGVmaW5pdGlvbgogICAgKSB7CiAgICAgIGlmICghZGVmaW5pdGlvbikgewogICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNbdHlwZSArICdzJ11baWRdCiAgICAgIH0gZWxzZSB7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlID09PSAnY29tcG9uZW50JykgewogICAgICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGlkKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGUgPT09ICdjb21wb25lbnQnICYmIGlzUGxhaW5PYmplY3QoZGVmaW5pdGlvbikpIHsKICAgICAgICAgIGRlZmluaXRpb24ubmFtZSA9IGRlZmluaXRpb24ubmFtZSB8fCBpZDsKICAgICAgICAgIGRlZmluaXRpb24gPSB0aGlzLm9wdGlvbnMuX2Jhc2UuZXh0ZW5kKGRlZmluaXRpb24pOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZSA9PT0gJ2RpcmVjdGl2ZScgJiYgdHlwZW9mIGRlZmluaXRpb24gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIGRlZmluaXRpb24gPSB7IGJpbmQ6IGRlZmluaXRpb24sIHVwZGF0ZTogZGVmaW5pdGlvbiB9OwogICAgICAgIH0KICAgICAgICB0aGlzLm9wdGlvbnNbdHlwZSArICdzJ11baWRdID0gZGVmaW5pdGlvbjsKICAgICAgICByZXR1cm4gZGVmaW5pdGlvbgogICAgICB9CiAgICB9OwogIH0pOwp9CgovKiAgKi8KCmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWUgKG9wdHMpIHsKICByZXR1cm4gb3B0cyAmJiAob3B0cy5DdG9yLm9wdGlvbnMubmFtZSB8fCBvcHRzLnRhZykKfQoKZnVuY3Rpb24gbWF0Y2hlcyAocGF0dGVybiwgbmFtZSkgewogIGlmIChBcnJheS5pc0FycmF5KHBhdHRlcm4pKSB7CiAgICByZXR1cm4gcGF0dGVybi5pbmRleE9mKG5hbWUpID4gLTEKICB9IGVsc2UgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykgewogICAgcmV0dXJuIHBhdHRlcm4uc3BsaXQoJywnKS5pbmRleE9mKG5hbWUpID4gLTEKICB9IGVsc2UgaWYgKGlzUmVnRXhwKHBhdHRlcm4pKSB7CiAgICByZXR1cm4gcGF0dGVybi50ZXN0KG5hbWUpCiAgfQogIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgcmV0dXJuIGZhbHNlCn0KCmZ1bmN0aW9uIHBydW5lQ2FjaGUgKGtlZXBBbGl2ZUluc3RhbmNlLCBmaWx0ZXIpIHsKICB2YXIgY2FjaGUgPSBrZWVwQWxpdmVJbnN0YW5jZS5jYWNoZTsKICB2YXIga2V5cyA9IGtlZXBBbGl2ZUluc3RhbmNlLmtleXM7CiAgdmFyIF92bm9kZSA9IGtlZXBBbGl2ZUluc3RhbmNlLl92bm9kZTsKICBmb3IgKHZhciBrZXkgaW4gY2FjaGUpIHsKICAgIHZhciBjYWNoZWROb2RlID0gY2FjaGVba2V5XTsKICAgIGlmIChjYWNoZWROb2RlKSB7CiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjYWNoZWROb2RlLmNvbXBvbmVudE9wdGlvbnMpOwogICAgICBpZiAobmFtZSAmJiAhZmlsdGVyKG5hbWUpKSB7CiAgICAgICAgcHJ1bmVDYWNoZUVudHJ5KGNhY2hlLCBrZXksIGtleXMsIF92bm9kZSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIHBydW5lQ2FjaGVFbnRyeSAoCiAgY2FjaGUsCiAga2V5LAogIGtleXMsCiAgY3VycmVudAopIHsKICB2YXIgY2FjaGVkJCQxID0gY2FjaGVba2V5XTsKICBpZiAoY2FjaGVkJCQxICYmICghY3VycmVudCB8fCBjYWNoZWQkJDEudGFnICE9PSBjdXJyZW50LnRhZykpIHsKICAgIGNhY2hlZCQkMS5jb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpOwogIH0KICBjYWNoZVtrZXldID0gbnVsbDsKICByZW1vdmUoa2V5cywga2V5KTsKfQoKdmFyIHBhdHRlcm5UeXBlcyA9IFtTdHJpbmcsIFJlZ0V4cCwgQXJyYXldOwoKdmFyIEtlZXBBbGl2ZSA9IHsKICBuYW1lOiAna2VlcC1hbGl2ZScsCiAgYWJzdHJhY3Q6IHRydWUsCgogIHByb3BzOiB7CiAgICBpbmNsdWRlOiBwYXR0ZXJuVHlwZXMsCiAgICBleGNsdWRlOiBwYXR0ZXJuVHlwZXMsCiAgICBtYXg6IFtTdHJpbmcsIE51bWJlcl0KICB9LAoKICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkICgpIHsKICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGhpcy5rZXlzID0gW107CiAgfSwKCiAgZGVzdHJveWVkOiBmdW5jdGlvbiBkZXN0cm95ZWQgKCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgZm9yICh2YXIga2V5IGluIHRoaXMkMS5jYWNoZSkgewogICAgICBwcnVuZUNhY2hlRW50cnkodGhpcyQxLmNhY2hlLCBrZXksIHRoaXMkMS5rZXlzKTsKICAgIH0KICB9LAoKICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkICgpIHsKICAgIHZhciB0aGlzJDEgPSB0aGlzOwoKICAgIHRoaXMuJHdhdGNoKCdpbmNsdWRlJywgZnVuY3Rpb24gKHZhbCkgewogICAgICBwcnVuZUNhY2hlKHRoaXMkMSwgZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIG1hdGNoZXModmFsLCBuYW1lKTsgfSk7CiAgICB9KTsKICAgIHRoaXMuJHdhdGNoKCdleGNsdWRlJywgZnVuY3Rpb24gKHZhbCkgewogICAgICBwcnVuZUNhY2hlKHRoaXMkMSwgZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuICFtYXRjaGVzKHZhbCwgbmFtZSk7IH0pOwogICAgfSk7CiAgfSwKCiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKCkgewogICAgdmFyIHNsb3QgPSB0aGlzLiRzbG90cy5kZWZhdWx0OwogICAgdmFyIHZub2RlID0gZ2V0Rmlyc3RDb21wb25lbnRDaGlsZChzbG90KTsKICAgIHZhciBjb21wb25lbnRPcHRpb25zID0gdm5vZGUgJiYgdm5vZGUuY29tcG9uZW50T3B0aW9uczsKICAgIGlmIChjb21wb25lbnRPcHRpb25zKSB7CiAgICAgIC8vIGNoZWNrIHBhdHRlcm4KICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKGNvbXBvbmVudE9wdGlvbnMpOwogICAgICB2YXIgcmVmID0gdGhpczsKICAgICAgdmFyIGluY2x1ZGUgPSByZWYuaW5jbHVkZTsKICAgICAgdmFyIGV4Y2x1ZGUgPSByZWYuZXhjbHVkZTsKICAgICAgaWYgKAogICAgICAgIC8vIG5vdCBpbmNsdWRlZAogICAgICAgIChpbmNsdWRlICYmICghbmFtZSB8fCAhbWF0Y2hlcyhpbmNsdWRlLCBuYW1lKSkpIHx8CiAgICAgICAgLy8gZXhjbHVkZWQKICAgICAgICAoZXhjbHVkZSAmJiBuYW1lICYmIG1hdGNoZXMoZXhjbHVkZSwgbmFtZSkpCiAgICAgICkgewogICAgICAgIHJldHVybiB2bm9kZQogICAgICB9CgogICAgICB2YXIgcmVmJDEgPSB0aGlzOwogICAgICB2YXIgY2FjaGUgPSByZWYkMS5jYWNoZTsKICAgICAgdmFyIGtleXMgPSByZWYkMS5rZXlzOwogICAgICB2YXIga2V5ID0gdm5vZGUua2V5ID09IG51bGwKICAgICAgICAvLyBzYW1lIGNvbnN0cnVjdG9yIG1heSBnZXQgcmVnaXN0ZXJlZCBhcyBkaWZmZXJlbnQgbG9jYWwgY29tcG9uZW50cwogICAgICAgIC8vIHNvIGNpZCBhbG9uZSBpcyBub3QgZW5vdWdoICgjMzI2OSkKICAgICAgICA/IGNvbXBvbmVudE9wdGlvbnMuQ3Rvci5jaWQgKyAoY29tcG9uZW50T3B0aW9ucy50YWcgPyAoIjo6IiArIChjb21wb25lbnRPcHRpb25zLnRhZykpIDogJycpCiAgICAgICAgOiB2bm9kZS5rZXk7CiAgICAgIGlmIChjYWNoZVtrZXldKSB7CiAgICAgICAgdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBjYWNoZVtrZXldLmNvbXBvbmVudEluc3RhbmNlOwogICAgICAgIC8vIG1ha2UgY3VycmVudCBrZXkgZnJlc2hlc3QKICAgICAgICByZW1vdmUoa2V5cywga2V5KTsKICAgICAgICBrZXlzLnB1c2goa2V5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjYWNoZVtrZXldID0gdm5vZGU7CiAgICAgICAga2V5cy5wdXNoKGtleSk7CiAgICAgICAgLy8gcHJ1bmUgb2xkZXN0IGVudHJ5CiAgICAgICAgaWYgKHRoaXMubWF4ICYmIGtleXMubGVuZ3RoID4gcGFyc2VJbnQodGhpcy5tYXgpKSB7CiAgICAgICAgICBwcnVuZUNhY2hlRW50cnkoY2FjaGUsIGtleXNbMF0sIGtleXMsIHRoaXMuX3Zub2RlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZub2RlLmRhdGEua2VlcEFsaXZlID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiB2bm9kZSB8fCAoc2xvdCAmJiBzbG90WzBdKQogIH0KfQoKdmFyIGJ1aWx0SW5Db21wb25lbnRzID0gewogIEtlZXBBbGl2ZTogS2VlcEFsaXZlCn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdEdsb2JhbEFQSSAoVnVlKSB7CiAgLy8gY29uZmlnCiAgdmFyIGNvbmZpZ0RlZiA9IHt9OwogIGNvbmZpZ0RlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25maWc7IH07CiAgewogICAgY29uZmlnRGVmLnNldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgd2FybigKICAgICAgICAnRG8gbm90IHJlcGxhY2UgdGhlIFZ1ZS5jb25maWcgb2JqZWN0LCBzZXQgaW5kaXZpZHVhbCBmaWVsZHMgaW5zdGVhZC4nCiAgICAgICk7CiAgICB9OwogIH0KICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLCAnY29uZmlnJywgY29uZmlnRGVmKTsKCiAgLy8gZXhwb3NlZCB1dGlsIG1ldGhvZHMuCiAgLy8gTk9URTogdGhlc2UgYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkgLSBhdm9pZCByZWx5aW5nIG9uCiAgLy8gdGhlbSB1bmxlc3MgeW91IGFyZSBhd2FyZSBvZiB0aGUgcmlzay4KICBWdWUudXRpbCA9IHsKICAgIHdhcm46IHdhcm4sCiAgICBleHRlbmQ6IGV4dGVuZCwKICAgIG1lcmdlT3B0aW9uczogbWVyZ2VPcHRpb25zLAogICAgZGVmaW5lUmVhY3RpdmU6IGRlZmluZVJlYWN0aXZlCiAgfTsKCiAgVnVlLnNldCA9IHNldDsKICBWdWUuZGVsZXRlID0gZGVsOwogIFZ1ZS5uZXh0VGljayA9IG5leHRUaWNrOwoKICBWdWUub3B0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkgewogICAgVnVlLm9wdGlvbnNbdHlwZSArICdzJ10gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIH0pOwoKICAvLyB0aGlzIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlICJiYXNlIiBjb25zdHJ1Y3RvciB0byBleHRlbmQgYWxsIHBsYWluLW9iamVjdAogIC8vIGNvbXBvbmVudHMgd2l0aCBpbiBXZWV4J3MgbXVsdGktaW5zdGFuY2Ugc2NlbmFyaW9zLgogIFZ1ZS5vcHRpb25zLl9iYXNlID0gVnVlOwoKICBleHRlbmQoVnVlLm9wdGlvbnMuY29tcG9uZW50cywgYnVpbHRJbkNvbXBvbmVudHMpOwoKICBpbml0VXNlKFZ1ZSk7CiAgaW5pdE1peGluJDEoVnVlKTsKICBpbml0RXh0ZW5kKFZ1ZSk7CiAgaW5pdEFzc2V0UmVnaXN0ZXJzKFZ1ZSk7Cn0KCmluaXRHbG9iYWxBUEkoVnVlKTsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGlzU2VydmVyJywgewogIGdldDogaXNTZXJ2ZXJSZW5kZXJpbmcKfSk7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRzc3JDb250ZXh0JywgewogIGdldDogZnVuY3Rpb24gZ2V0ICgpIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgICByZXR1cm4gdGhpcy4kdm5vZGUgJiYgdGhpcy4kdm5vZGUuc3NyQ29udGV4dAogIH0KfSk7CgovLyBleHBvc2UgRnVuY3Rpb25hbFJlbmRlckNvbnRleHQgZm9yIHNzciBydW50aW1lIGhlbHBlciBpbnN0YWxsYXRpb24KT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZSwgJ0Z1bmN0aW9uYWxSZW5kZXJDb250ZXh0JywgewogIHZhbHVlOiBGdW5jdGlvbmFsUmVuZGVyQ29udGV4dAp9KTsKClZ1ZS52ZXJzaW9uID0gJzIuNS4xNyc7CgovKiAgKi8KCi8vIHRoZXNlIGFyZSByZXNlcnZlZCBmb3Igd2ViIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgY29tcGlsZWQgYXdheQovLyBkdXJpbmcgdGVtcGxhdGUgY29tcGlsYXRpb24KdmFyIGlzUmVzZXJ2ZWRBdHRyID0gbWFrZU1hcCgnc3R5bGUsY2xhc3MnKTsKCi8vIGF0dHJpYnV0ZXMgdGhhdCBzaG91bGQgYmUgdXNpbmcgcHJvcHMgZm9yIGJpbmRpbmcKdmFyIGFjY2VwdFZhbHVlID0gbWFrZU1hcCgnaW5wdXQsdGV4dGFyZWEsb3B0aW9uLHNlbGVjdCxwcm9ncmVzcycpOwp2YXIgbXVzdFVzZVByb3AgPSBmdW5jdGlvbiAodGFnLCB0eXBlLCBhdHRyKSB7CiAgcmV0dXJuICgKICAgIChhdHRyID09PSAndmFsdWUnICYmIGFjY2VwdFZhbHVlKHRhZykpICYmIHR5cGUgIT09ICdidXR0b24nIHx8CiAgICAoYXR0ciA9PT0gJ3NlbGVjdGVkJyAmJiB0YWcgPT09ICdvcHRpb24nKSB8fAogICAgKGF0dHIgPT09ICdjaGVja2VkJyAmJiB0YWcgPT09ICdpbnB1dCcpIHx8CiAgICAoYXR0ciA9PT0gJ211dGVkJyAmJiB0YWcgPT09ICd2aWRlbycpCiAgKQp9OwoKdmFyIGlzRW51bWVyYXRlZEF0dHIgPSBtYWtlTWFwKCdjb250ZW50ZWRpdGFibGUsZHJhZ2dhYmxlLHNwZWxsY2hlY2snKTsKCnZhciBpc0Jvb2xlYW5BdHRyID0gbWFrZU1hcCgKICAnYWxsb3dmdWxsc2NyZWVuLGFzeW5jLGF1dG9mb2N1cyxhdXRvcGxheSxjaGVja2VkLGNvbXBhY3QsY29udHJvbHMsZGVjbGFyZSwnICsKICAnZGVmYXVsdCxkZWZhdWx0Y2hlY2tlZCxkZWZhdWx0bXV0ZWQsZGVmYXVsdHNlbGVjdGVkLGRlZmVyLGRpc2FibGVkLCcgKwogICdlbmFibGVkLGZvcm1ub3ZhbGlkYXRlLGhpZGRlbixpbmRldGVybWluYXRlLGluZXJ0LGlzbWFwLGl0ZW1zY29wZSxsb29wLG11bHRpcGxlLCcgKwogICdtdXRlZCxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3ZhbGlkYXRlLG5vd3JhcCxvcGVuLHBhdXNlb25leGl0LHJlYWRvbmx5LCcgKwogICdyZXF1aXJlZCxyZXZlcnNlZCxzY29wZWQsc2VhbWxlc3Msc2VsZWN0ZWQsc29ydGFibGUsdHJhbnNsYXRlLCcgKwogICd0cnVlc3BlZWQsdHlwZW11c3RtYXRjaCx2aXNpYmxlJwopOwoKdmFyIHhsaW5rTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayc7Cgp2YXIgaXNYbGluayA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgcmV0dXJuIG5hbWUuY2hhckF0KDUpID09PSAnOicgJiYgbmFtZS5zbGljZSgwLCA1KSA9PT0gJ3hsaW5rJwp9OwoKdmFyIGdldFhsaW5rUHJvcCA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgcmV0dXJuIGlzWGxpbmsobmFtZSkgPyBuYW1lLnNsaWNlKDYsIG5hbWUubGVuZ3RoKSA6ICcnCn07Cgp2YXIgaXNGYWxzeUF0dHJWYWx1ZSA9IGZ1bmN0aW9uICh2YWwpIHsKICByZXR1cm4gdmFsID09IG51bGwgfHwgdmFsID09PSBmYWxzZQp9OwoKLyogICovCgpmdW5jdGlvbiBnZW5DbGFzc0ZvclZub2RlICh2bm9kZSkgewogIHZhciBkYXRhID0gdm5vZGUuZGF0YTsKICB2YXIgcGFyZW50Tm9kZSA9IHZub2RlOwogIHZhciBjaGlsZE5vZGUgPSB2bm9kZTsKICB3aGlsZSAoaXNEZWYoY2hpbGROb2RlLmNvbXBvbmVudEluc3RhbmNlKSkgewogICAgY2hpbGROb2RlID0gY2hpbGROb2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTsKICAgIGlmIChjaGlsZE5vZGUgJiYgY2hpbGROb2RlLmRhdGEpIHsKICAgICAgZGF0YSA9IG1lcmdlQ2xhc3NEYXRhKGNoaWxkTm9kZS5kYXRhLCBkYXRhKTsKICAgIH0KICB9CiAgd2hpbGUgKGlzRGVmKHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudCkpIHsKICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUuZGF0YSkgewogICAgICBkYXRhID0gbWVyZ2VDbGFzc0RhdGEoZGF0YSwgcGFyZW50Tm9kZS5kYXRhKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlbmRlckNsYXNzKGRhdGEuc3RhdGljQ2xhc3MsIGRhdGEuY2xhc3MpCn0KCmZ1bmN0aW9uIG1lcmdlQ2xhc3NEYXRhIChjaGlsZCwgcGFyZW50KSB7CiAgcmV0dXJuIHsKICAgIHN0YXRpY0NsYXNzOiBjb25jYXQoY2hpbGQuc3RhdGljQ2xhc3MsIHBhcmVudC5zdGF0aWNDbGFzcyksCiAgICBjbGFzczogaXNEZWYoY2hpbGQuY2xhc3MpCiAgICAgID8gW2NoaWxkLmNsYXNzLCBwYXJlbnQuY2xhc3NdCiAgICAgIDogcGFyZW50LmNsYXNzCiAgfQp9CgpmdW5jdGlvbiByZW5kZXJDbGFzcyAoCiAgc3RhdGljQ2xhc3MsCiAgZHluYW1pY0NsYXNzCikgewogIGlmIChpc0RlZihzdGF0aWNDbGFzcykgfHwgaXNEZWYoZHluYW1pY0NsYXNzKSkgewogICAgcmV0dXJuIGNvbmNhdChzdGF0aWNDbGFzcywgc3RyaW5naWZ5Q2xhc3MoZHluYW1pY0NsYXNzKSkKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICByZXR1cm4gJycKfQoKZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7CiAgcmV0dXJuIGEgPyBiID8gKGEgKyAnICcgKyBiKSA6IGEgOiAoYiB8fCAnJykKfQoKZnVuY3Rpb24gc3RyaW5naWZ5Q2xhc3MgKHZhbHVlKSB7CiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICByZXR1cm4gc3RyaW5naWZ5QXJyYXkodmFsdWUpCiAgfQogIGlmIChpc09iamVjdCh2YWx1ZSkpIHsKICAgIHJldHVybiBzdHJpbmdpZnlPYmplY3QodmFsdWUpCiAgfQogIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7CiAgICByZXR1cm4gdmFsdWUKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICByZXR1cm4gJycKfQoKZnVuY3Rpb24gc3RyaW5naWZ5QXJyYXkgKHZhbHVlKSB7CiAgdmFyIHJlcyA9ICcnOwogIHZhciBzdHJpbmdpZmllZDsKICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgaWYgKGlzRGVmKHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5Q2xhc3ModmFsdWVbaV0pKSAmJiBzdHJpbmdpZmllZCAhPT0gJycpIHsKICAgICAgaWYgKHJlcykgeyByZXMgKz0gJyAnOyB9CiAgICAgIHJlcyArPSBzdHJpbmdpZmllZDsKICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgpmdW5jdGlvbiBzdHJpbmdpZnlPYmplY3QgKHZhbHVlKSB7CiAgdmFyIHJlcyA9ICcnOwogIGZvciAodmFyIGtleSBpbiB2YWx1ZSkgewogICAgaWYgKHZhbHVlW2tleV0pIHsKICAgICAgaWYgKHJlcykgeyByZXMgKz0gJyAnOyB9CiAgICAgIHJlcyArPSBrZXk7CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyogICovCgp2YXIgbmFtZXNwYWNlTWFwID0gewogIHN2ZzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywKICBtYXRoOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCcKfTsKCnZhciBpc0hUTUxUYWcgPSBtYWtlTWFwKAogICdodG1sLGJvZHksYmFzZSxoZWFkLGxpbmssbWV0YSxzdHlsZSx0aXRsZSwnICsKICAnYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsaDEsaDIsaDMsaDQsaDUsaDYsaGdyb3VwLG5hdixzZWN0aW9uLCcgKwogICdkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCwnICsKICAnYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsZGF0YSxkZm4sZW0saSxrYmQsbWFyayxxLHJwLHJ0LHJ0YyxydWJ5LCcgKwogICdzLHNhbXAsc21hbGwsc3BhbixzdHJvbmcsc3ViLHN1cCx0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbywnICsKICAnZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsJyArCiAgJ2NhcHRpb24sY29sLGNvbGdyb3VwLHRhYmxlLHRoZWFkLHRib2R5LHRkLHRoLHRyLCcgKwogICdidXR0b24sZGF0YWxpc3QsZmllbGRzZXQsZm9ybSxpbnB1dCxsYWJlbCxsZWdlbmQsbWV0ZXIsb3B0Z3JvdXAsb3B0aW9uLCcgKwogICdvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLCcgKwogICdkZXRhaWxzLGRpYWxvZyxtZW51LG1lbnVpdGVtLHN1bW1hcnksJyArCiAgJ2NvbnRlbnQsZWxlbWVudCxzaGFkb3csdGVtcGxhdGUsYmxvY2txdW90ZSxpZnJhbWUsdGZvb3QnCik7CgovLyB0aGlzIG1hcCBpcyBpbnRlbnRpb25hbGx5IHNlbGVjdGl2ZSwgb25seSBjb3ZlcmluZyBTVkcgZWxlbWVudHMgdGhhdCBtYXkKLy8gY29udGFpbiBjaGlsZCBlbGVtZW50cy4KdmFyIGlzU1ZHID0gbWFrZU1hcCgKICAnc3ZnLGFuaW1hdGUsY2lyY2xlLGNsaXBwYXRoLGN1cnNvcixkZWZzLGRlc2MsZWxsaXBzZSxmaWx0ZXIsZm9udC1mYWNlLCcgKwogICdmb3JlaWduT2JqZWN0LGcsZ2x5cGgsaW1hZ2UsbGluZSxtYXJrZXIsbWFzayxtaXNzaW5nLWdseXBoLHBhdGgscGF0dGVybiwnICsKICAncG9seWdvbixwb2x5bGluZSxyZWN0LHN3aXRjaCxzeW1ib2wsdGV4dCx0ZXh0cGF0aCx0c3Bhbix1c2UsdmlldycsCiAgdHJ1ZQopOwoKdmFyIGlzUHJlVGFnID0gZnVuY3Rpb24gKHRhZykgeyByZXR1cm4gdGFnID09PSAncHJlJzsgfTsKCnZhciBpc1Jlc2VydmVkVGFnID0gZnVuY3Rpb24gKHRhZykgewogIHJldHVybiBpc0hUTUxUYWcodGFnKSB8fCBpc1NWRyh0YWcpCn07CgpmdW5jdGlvbiBnZXRUYWdOYW1lc3BhY2UgKHRhZykgewogIGlmIChpc1NWRyh0YWcpKSB7CiAgICByZXR1cm4gJ3N2ZycKICB9CiAgLy8gYmFzaWMgc3VwcG9ydCBmb3IgTWF0aE1MCiAgLy8gbm90ZSBpdCBkb2Vzbid0IHN1cHBvcnQgb3RoZXIgTWF0aE1MIGVsZW1lbnRzIGJlaW5nIGNvbXBvbmVudCByb290cwogIGlmICh0YWcgPT09ICdtYXRoJykgewogICAgcmV0dXJuICdtYXRoJwogIH0KfQoKdmFyIHVua25vd25FbGVtZW50Q2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwpmdW5jdGlvbiBpc1Vua25vd25FbGVtZW50ICh0YWcpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWluQnJvd3NlcikgewogICAgcmV0dXJuIHRydWUKICB9CiAgaWYgKGlzUmVzZXJ2ZWRUYWcodGFnKSkgewogICAgcmV0dXJuIGZhbHNlCiAgfQogIHRhZyA9IHRhZy50b0xvd2VyQ2FzZSgpOwogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gIT0gbnVsbCkgewogICAgcmV0dXJuIHVua25vd25FbGVtZW50Q2FjaGVbdGFnXQogIH0KICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgaWYgKHRhZy5pbmRleE9mKCctJykgPiAtMSkgewogICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjgyMTAzNjQvMTA3MDI0NAogICAgcmV0dXJuICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gPSAoCiAgICAgIGVsLmNvbnN0cnVjdG9yID09PSB3aW5kb3cuSFRNTFVua25vd25FbGVtZW50IHx8CiAgICAgIGVsLmNvbnN0cnVjdG9yID09PSB3aW5kb3cuSFRNTEVsZW1lbnQKICAgICkpCiAgfSBlbHNlIHsKICAgIHJldHVybiAodW5rbm93bkVsZW1lbnRDYWNoZVt0YWddID0gL0hUTUxVbmtub3duRWxlbWVudC8udGVzdChlbC50b1N0cmluZygpKSkKICB9Cn0KCnZhciBpc1RleHRJbnB1dFR5cGUgPSBtYWtlTWFwKCd0ZXh0LG51bWJlcixwYXNzd29yZCxzZWFyY2gsZW1haWwsdGVsLHVybCcpOwoKLyogICovCgovKioKICogUXVlcnkgYW4gZWxlbWVudCBzZWxlY3RvciBpZiBpdCdzIG5vdCBhbiBlbGVtZW50IGFscmVhZHkuCiAqLwpmdW5jdGlvbiBxdWVyeSAoZWwpIHsKICBpZiAodHlwZW9mIGVsID09PSAnc3RyaW5nJykgewogICAgdmFyIHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbCk7CiAgICBpZiAoIXNlbGVjdGVkKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICdDYW5ub3QgZmluZCBlbGVtZW50OiAnICsgZWwKICAgICAgKTsKICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpCiAgICB9CiAgICByZXR1cm4gc2VsZWN0ZWQKICB9IGVsc2UgewogICAgcmV0dXJuIGVsCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQkMSAodGFnTmFtZSwgdm5vZGUpIHsKICB2YXIgZWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKICBpZiAodGFnTmFtZSAhPT0gJ3NlbGVjdCcpIHsKICAgIHJldHVybiBlbG0KICB9CiAgLy8gZmFsc2Ugb3IgbnVsbCB3aWxsIHJlbW92ZSB0aGUgYXR0cmlidXRlIGJ1dCB1bmRlZmluZWQgd2lsbCBub3QKICBpZiAodm5vZGUuZGF0YSAmJiB2bm9kZS5kYXRhLmF0dHJzICYmIHZub2RlLmRhdGEuYXR0cnMubXVsdGlwbGUgIT09IHVuZGVmaW5lZCkgewogICAgZWxtLnNldEF0dHJpYnV0ZSgnbXVsdGlwbGUnLCAnbXVsdGlwbGUnKTsKICB9CiAgcmV0dXJuIGVsbQp9CgpmdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMgKG5hbWVzcGFjZSwgdGFnTmFtZSkgewogIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlTWFwW25hbWVzcGFjZV0sIHRhZ05hbWUpCn0KCmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlICh0ZXh0KSB7CiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpCn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbW1lbnQgKHRleHQpIHsKICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCh0ZXh0KQp9CgpmdW5jdGlvbiBpbnNlcnRCZWZvcmUgKHBhcmVudE5vZGUsIG5ld05vZGUsIHJlZmVyZW5jZU5vZGUpIHsKICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdOb2RlLCByZWZlcmVuY2VOb2RlKTsKfQoKZnVuY3Rpb24gcmVtb3ZlQ2hpbGQgKG5vZGUsIGNoaWxkKSB7CiAgbm9kZS5yZW1vdmVDaGlsZChjaGlsZCk7Cn0KCmZ1bmN0aW9uIGFwcGVuZENoaWxkIChub2RlLCBjaGlsZCkgewogIG5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpOwp9CgpmdW5jdGlvbiBwYXJlbnROb2RlIChub2RlKSB7CiAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZQp9CgpmdW5jdGlvbiBuZXh0U2libGluZyAobm9kZSkgewogIHJldHVybiBub2RlLm5leHRTaWJsaW5nCn0KCmZ1bmN0aW9uIHRhZ05hbWUgKG5vZGUpIHsKICByZXR1cm4gbm9kZS50YWdOYW1lCn0KCmZ1bmN0aW9uIHNldFRleHRDb250ZW50IChub2RlLCB0ZXh0KSB7CiAgbm9kZS50ZXh0Q29udGVudCA9IHRleHQ7Cn0KCmZ1bmN0aW9uIHNldFN0eWxlU2NvcGUgKG5vZGUsIHNjb3BlSWQpIHsKICBub2RlLnNldEF0dHJpYnV0ZShzY29wZUlkLCAnJyk7Cn0KCgp2YXIgbm9kZU9wcyA9IE9iamVjdC5mcmVlemUoewoJY3JlYXRlRWxlbWVudDogY3JlYXRlRWxlbWVudCQxLAoJY3JlYXRlRWxlbWVudE5TOiBjcmVhdGVFbGVtZW50TlMsCgljcmVhdGVUZXh0Tm9kZTogY3JlYXRlVGV4dE5vZGUsCgljcmVhdGVDb21tZW50OiBjcmVhdGVDb21tZW50LAoJaW5zZXJ0QmVmb3JlOiBpbnNlcnRCZWZvcmUsCglyZW1vdmVDaGlsZDogcmVtb3ZlQ2hpbGQsCglhcHBlbmRDaGlsZDogYXBwZW5kQ2hpbGQsCglwYXJlbnROb2RlOiBwYXJlbnROb2RlLAoJbmV4dFNpYmxpbmc6IG5leHRTaWJsaW5nLAoJdGFnTmFtZTogdGFnTmFtZSwKCXNldFRleHRDb250ZW50OiBzZXRUZXh0Q29udGVudCwKCXNldFN0eWxlU2NvcGU6IHNldFN0eWxlU2NvcGUKfSk7CgovKiAgKi8KCnZhciByZWYgPSB7CiAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUgKF8sIHZub2RlKSB7CiAgICByZWdpc3RlclJlZih2bm9kZSk7CiAgfSwKICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSAob2xkVm5vZGUsIHZub2RlKSB7CiAgICBpZiAob2xkVm5vZGUuZGF0YS5yZWYgIT09IHZub2RlLmRhdGEucmVmKSB7CiAgICAgIHJlZ2lzdGVyUmVmKG9sZFZub2RlLCB0cnVlKTsKICAgICAgcmVnaXN0ZXJSZWYodm5vZGUpOwogICAgfQogIH0sCiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHsKICAgIHJlZ2lzdGVyUmVmKHZub2RlLCB0cnVlKTsKICB9Cn0KCmZ1bmN0aW9uIHJlZ2lzdGVyUmVmICh2bm9kZSwgaXNSZW1vdmFsKSB7CiAgdmFyIGtleSA9IHZub2RlLmRhdGEucmVmOwogIGlmICghaXNEZWYoa2V5KSkgeyByZXR1cm4gfQoKICB2YXIgdm0gPSB2bm9kZS5jb250ZXh0OwogIHZhciByZWYgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSB8fCB2bm9kZS5lbG07CiAgdmFyIHJlZnMgPSB2bS4kcmVmczsKICBpZiAoaXNSZW1vdmFsKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWZzW2tleV0pKSB7CiAgICAgIHJlbW92ZShyZWZzW2tleV0sIHJlZik7CiAgICB9IGVsc2UgaWYgKHJlZnNba2V5XSA9PT0gcmVmKSB7CiAgICAgIHJlZnNba2V5XSA9IHVuZGVmaW5lZDsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKHZub2RlLmRhdGEucmVmSW5Gb3IpIHsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlZnNba2V5XSkpIHsKICAgICAgICByZWZzW2tleV0gPSBbcmVmXTsKICAgICAgfSBlbHNlIGlmIChyZWZzW2tleV0uaW5kZXhPZihyZWYpIDwgMCkgewogICAgICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgICAgIHJlZnNba2V5XS5wdXNoKHJlZik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlZnNba2V5XSA9IHJlZjsKICAgIH0KICB9Cn0KCi8qKgogKiBWaXJ0dWFsIERPTSBwYXRjaGluZyBhbGdvcml0aG0gYmFzZWQgb24gU25hYmJkb20gYnkKICogU2ltb24gRnJpaXMgVmluZHVtIChAcGFsZGVwaW5kKQogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UKICogaHR0cHM6Ly9naXRodWIuY29tL3BhbGRlcGluZC9zbmFiYmRvbS9ibG9iL21hc3Rlci9MSUNFTlNFCiAqCiAqIG1vZGlmaWVkIGJ5IEV2YW4gWW91IChAeXl4OTkwODAzKQogKgogKiBOb3QgdHlwZS1jaGVja2luZyB0aGlzIGJlY2F1c2UgdGhpcyBmaWxlIGlzIHBlcmYtY3JpdGljYWwgYW5kIHRoZSBjb3N0CiAqIG9mIG1ha2luZyBmbG93IHVuZGVyc3RhbmQgaXQgaXMgbm90IHdvcnRoIGl0LgogKi8KCnZhciBlbXB0eU5vZGUgPSBuZXcgVk5vZGUoJycsIHt9LCBbXSk7Cgp2YXIgaG9va3MgPSBbJ2NyZWF0ZScsICdhY3RpdmF0ZScsICd1cGRhdGUnLCAncmVtb3ZlJywgJ2Rlc3Ryb3knXTsKCmZ1bmN0aW9uIHNhbWVWbm9kZSAoYSwgYikgewogIHJldHVybiAoCiAgICBhLmtleSA9PT0gYi5rZXkgJiYgKAogICAgICAoCiAgICAgICAgYS50YWcgPT09IGIudGFnICYmCiAgICAgICAgYS5pc0NvbW1lbnQgPT09IGIuaXNDb21tZW50ICYmCiAgICAgICAgaXNEZWYoYS5kYXRhKSA9PT0gaXNEZWYoYi5kYXRhKSAmJgogICAgICAgIHNhbWVJbnB1dFR5cGUoYSwgYikKICAgICAgKSB8fCAoCiAgICAgICAgaXNUcnVlKGEuaXNBc3luY1BsYWNlaG9sZGVyKSAmJgogICAgICAgIGEuYXN5bmNGYWN0b3J5ID09PSBiLmFzeW5jRmFjdG9yeSAmJgogICAgICAgIGlzVW5kZWYoYi5hc3luY0ZhY3RvcnkuZXJyb3IpCiAgICAgICkKICAgICkKICApCn0KCmZ1bmN0aW9uIHNhbWVJbnB1dFR5cGUgKGEsIGIpIHsKICBpZiAoYS50YWcgIT09ICdpbnB1dCcpIHsgcmV0dXJuIHRydWUgfQogIHZhciBpOwogIHZhciB0eXBlQSA9IGlzRGVmKGkgPSBhLmRhdGEpICYmIGlzRGVmKGkgPSBpLmF0dHJzKSAmJiBpLnR5cGU7CiAgdmFyIHR5cGVCID0gaXNEZWYoaSA9IGIuZGF0YSkgJiYgaXNEZWYoaSA9IGkuYXR0cnMpICYmIGkudHlwZTsKICByZXR1cm4gdHlwZUEgPT09IHR5cGVCIHx8IGlzVGV4dElucHV0VHlwZSh0eXBlQSkgJiYgaXNUZXh0SW5wdXRUeXBlKHR5cGVCKQp9CgpmdW5jdGlvbiBjcmVhdGVLZXlUb09sZElkeCAoY2hpbGRyZW4sIGJlZ2luSWR4LCBlbmRJZHgpIHsKICB2YXIgaSwga2V5OwogIHZhciBtYXAgPSB7fTsKICBmb3IgKGkgPSBiZWdpbklkeDsgaSA8PSBlbmRJZHg7ICsraSkgewogICAga2V5ID0gY2hpbGRyZW5baV0ua2V5OwogICAgaWYgKGlzRGVmKGtleSkpIHsgbWFwW2tleV0gPSBpOyB9CiAgfQogIHJldHVybiBtYXAKfQoKZnVuY3Rpb24gY3JlYXRlUGF0Y2hGdW5jdGlvbiAoYmFja2VuZCkgewogIHZhciBpLCBqOwogIHZhciBjYnMgPSB7fTsKCiAgdmFyIG1vZHVsZXMgPSBiYWNrZW5kLm1vZHVsZXM7CiAgdmFyIG5vZGVPcHMgPSBiYWNrZW5kLm5vZGVPcHM7CgogIGZvciAoaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7ICsraSkgewogICAgY2JzW2hvb2tzW2ldXSA9IFtdOwogICAgZm9yIChqID0gMDsgaiA8IG1vZHVsZXMubGVuZ3RoOyArK2opIHsKICAgICAgaWYgKGlzRGVmKG1vZHVsZXNbal1baG9va3NbaV1dKSkgewogICAgICAgIGNic1tob29rc1tpXV0ucHVzaChtb2R1bGVzW2pdW2hvb2tzW2ldXSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGVtcHR5Tm9kZUF0IChlbG0pIHsKICAgIHJldHVybiBuZXcgVk5vZGUobm9kZU9wcy50YWdOYW1lKGVsbSkudG9Mb3dlckNhc2UoKSwge30sIFtdLCB1bmRlZmluZWQsIGVsbSkKICB9CgogIGZ1bmN0aW9uIGNyZWF0ZVJtQ2IgKGNoaWxkRWxtLCBsaXN0ZW5lcnMpIHsKICAgIGZ1bmN0aW9uIHJlbW92ZSAoKSB7CiAgICAgIGlmICgtLXJlbW92ZS5saXN0ZW5lcnMgPT09IDApIHsKICAgICAgICByZW1vdmVOb2RlKGNoaWxkRWxtKTsKICAgICAgfQogICAgfQogICAgcmVtb3ZlLmxpc3RlbmVycyA9IGxpc3RlbmVyczsKICAgIHJldHVybiByZW1vdmUKICB9CgogIGZ1bmN0aW9uIHJlbW92ZU5vZGUgKGVsKSB7CiAgICB2YXIgcGFyZW50ID0gbm9kZU9wcy5wYXJlbnROb2RlKGVsKTsKICAgIC8vIGVsZW1lbnQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZHVlIHRvIHYtaHRtbCAvIHYtdGV4dAogICAgaWYgKGlzRGVmKHBhcmVudCkpIHsKICAgICAgbm9kZU9wcy5yZW1vdmVDaGlsZChwYXJlbnQsIGVsKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzVW5rbm93bkVsZW1lbnQkJDEgKHZub2RlLCBpblZQcmUpIHsKICAgIHJldHVybiAoCiAgICAgICFpblZQcmUgJiYKICAgICAgIXZub2RlLm5zICYmCiAgICAgICEoCiAgICAgICAgY29uZmlnLmlnbm9yZWRFbGVtZW50cy5sZW5ndGggJiYKICAgICAgICBjb25maWcuaWdub3JlZEVsZW1lbnRzLnNvbWUoZnVuY3Rpb24gKGlnbm9yZSkgewogICAgICAgICAgcmV0dXJuIGlzUmVnRXhwKGlnbm9yZSkKICAgICAgICAgICAgPyBpZ25vcmUudGVzdCh2bm9kZS50YWcpCiAgICAgICAgICAgIDogaWdub3JlID09PSB2bm9kZS50YWcKICAgICAgICB9KQogICAgICApICYmCiAgICAgIGNvbmZpZy5pc1Vua25vd25FbGVtZW50KHZub2RlLnRhZykKICAgICkKICB9CgogIHZhciBjcmVhdGluZ0VsbUluVlByZSA9IDA7CgogIGZ1bmN0aW9uIGNyZWF0ZUVsbSAoCiAgICB2bm9kZSwKICAgIGluc2VydGVkVm5vZGVRdWV1ZSwKICAgIHBhcmVudEVsbSwKICAgIHJlZkVsbSwKICAgIG5lc3RlZCwKICAgIG93bmVyQXJyYXksCiAgICBpbmRleAogICkgewogICAgaWYgKGlzRGVmKHZub2RlLmVsbSkgJiYgaXNEZWYob3duZXJBcnJheSkpIHsKICAgICAgLy8gVGhpcyB2bm9kZSB3YXMgdXNlZCBpbiBhIHByZXZpb3VzIHJlbmRlciEKICAgICAgLy8gbm93IGl0J3MgdXNlZCBhcyBhIG5ldyBub2RlLCBvdmVyd3JpdGluZyBpdHMgZWxtIHdvdWxkIGNhdXNlCiAgICAgIC8vIHBvdGVudGlhbCBwYXRjaCBlcnJvcnMgZG93biB0aGUgcm9hZCB3aGVuIGl0J3MgdXNlZCBhcyBhbiBpbnNlcnRpb24KICAgICAgLy8gcmVmZXJlbmNlIG5vZGUuIEluc3RlYWQsIHdlIGNsb25lIHRoZSBub2RlIG9uLWRlbWFuZCBiZWZvcmUgY3JlYXRpbmcKICAgICAgLy8gYXNzb2NpYXRlZCBET00gZWxlbWVudCBmb3IgaXQuCiAgICAgIHZub2RlID0gb3duZXJBcnJheVtpbmRleF0gPSBjbG9uZVZOb2RlKHZub2RlKTsKICAgIH0KCiAgICB2bm9kZS5pc1Jvb3RJbnNlcnQgPSAhbmVzdGVkOyAvLyBmb3IgdHJhbnNpdGlvbiBlbnRlciBjaGVjawogICAgaWYgKGNyZWF0ZUNvbXBvbmVudCh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkpIHsKICAgICAgcmV0dXJuCiAgICB9CgogICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogICAgdmFyIGNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47CiAgICB2YXIgdGFnID0gdm5vZGUudGFnOwogICAgaWYgKGlzRGVmKHRhZykpIHsKICAgICAgewogICAgICAgIGlmIChkYXRhICYmIGRhdGEucHJlKSB7CiAgICAgICAgICBjcmVhdGluZ0VsbUluVlByZSsrOwogICAgICAgIH0KICAgICAgICBpZiAoaXNVbmtub3duRWxlbWVudCQkMSh2bm9kZSwgY3JlYXRpbmdFbG1JblZQcmUpKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAnVW5rbm93biBjdXN0b20gZWxlbWVudDogPCcgKyB0YWcgKyAnPiAtIGRpZCB5b3UgJyArCiAgICAgICAgICAgICdyZWdpc3RlciB0aGUgY29tcG9uZW50IGNvcnJlY3RseT8gRm9yIHJlY3Vyc2l2ZSBjb21wb25lbnRzLCAnICsKICAgICAgICAgICAgJ21ha2Ugc3VyZSB0byBwcm92aWRlIHRoZSAibmFtZSIgb3B0aW9uLicsCiAgICAgICAgICAgIHZub2RlLmNvbnRleHQKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9CgogICAgICB2bm9kZS5lbG0gPSB2bm9kZS5ucwogICAgICAgID8gbm9kZU9wcy5jcmVhdGVFbGVtZW50TlModm5vZGUubnMsIHRhZykKICAgICAgICA6IG5vZGVPcHMuY3JlYXRlRWxlbWVudCh0YWcsIHZub2RlKTsKICAgICAgc2V0U2NvcGUodm5vZGUpOwoKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIHsKICAgICAgICBjcmVhdGVDaGlsZHJlbih2bm9kZSwgY2hpbGRyZW4sIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgICAgICBpbnZva2VDcmVhdGVIb29rcyh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICB9CiAgICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgICB9CgogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRhdGEgJiYgZGF0YS5wcmUpIHsKICAgICAgICBjcmVhdGluZ0VsbUluVlByZS0tOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzVHJ1ZSh2bm9kZS5pc0NvbW1lbnQpKSB7CiAgICAgIHZub2RlLmVsbSA9IG5vZGVPcHMuY3JlYXRlQ29tbWVudCh2bm9kZS50ZXh0KTsKICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgfSBlbHNlIHsKICAgICAgdm5vZGUuZWxtID0gbm9kZU9wcy5jcmVhdGVUZXh0Tm9kZSh2bm9kZS50ZXh0KTsKICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50ICh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkgewogICAgdmFyIGkgPSB2bm9kZS5kYXRhOwogICAgaWYgKGlzRGVmKGkpKSB7CiAgICAgIHZhciBpc1JlYWN0aXZhdGVkID0gaXNEZWYodm5vZGUuY29tcG9uZW50SW5zdGFuY2UpICYmIGkua2VlcEFsaXZlOwogICAgICBpZiAoaXNEZWYoaSA9IGkuaG9vaykgJiYgaXNEZWYoaSA9IGkuaW5pdCkpIHsKICAgICAgICBpKHZub2RlLCBmYWxzZSAvKiBoeWRyYXRpbmcgKi8sIHBhcmVudEVsbSwgcmVmRWxtKTsKICAgICAgfQogICAgICAvLyBhZnRlciBjYWxsaW5nIHRoZSBpbml0IGhvb2ssIGlmIHRoZSB2bm9kZSBpcyBhIGNoaWxkIGNvbXBvbmVudAogICAgICAvLyBpdCBzaG91bGQndmUgY3JlYXRlZCBhIGNoaWxkIGluc3RhbmNlIGFuZCBtb3VudGVkIGl0LiB0aGUgY2hpbGQKICAgICAgLy8gY29tcG9uZW50IGFsc28gaGFzIHNldCB0aGUgcGxhY2Vob2xkZXIgdm5vZGUncyBlbG0uCiAgICAgIC8vIGluIHRoYXQgY2FzZSB3ZSBjYW4ganVzdCByZXR1cm4gdGhlIGVsZW1lbnQgYW5kIGJlIGRvbmUuCiAgICAgIGlmIChpc0RlZih2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkpIHsKICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIGlmIChpc1RydWUoaXNSZWFjdGl2YXRlZCkpIHsKICAgICAgICAgIHJlYWN0aXZhdGVDb21wb25lbnQodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZQogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbml0Q29tcG9uZW50ICh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7CiAgICBpZiAoaXNEZWYodm5vZGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSkgewogICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaC5hcHBseShpbnNlcnRlZFZub2RlUXVldWUsIHZub2RlLmRhdGEucGVuZGluZ0luc2VydCk7CiAgICAgIHZub2RlLmRhdGEucGVuZGluZ0luc2VydCA9IG51bGw7CiAgICB9CiAgICB2bm9kZS5lbG0gPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZS4kZWw7CiAgICBpZiAoaXNQYXRjaGFibGUodm5vZGUpKSB7CiAgICAgIGludm9rZUNyZWF0ZUhvb2tzKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICBzZXRTY29wZSh2bm9kZSk7CiAgICB9IGVsc2UgewogICAgICAvLyBlbXB0eSBjb21wb25lbnQgcm9vdC4KICAgICAgLy8gc2tpcCBhbGwgZWxlbWVudC1yZWxhdGVkIG1vZHVsZXMgZXhjZXB0IGZvciByZWYgKCMzNDU1KQogICAgICByZWdpc3RlclJlZih2bm9kZSk7CiAgICAgIC8vIG1ha2Ugc3VyZSB0byBpbnZva2UgdGhlIGluc2VydCBob29rCiAgICAgIGluc2VydGVkVm5vZGVRdWV1ZS5wdXNoKHZub2RlKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlYWN0aXZhdGVDb21wb25lbnQgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKSB7CiAgICB2YXIgaTsKICAgIC8vIGhhY2sgZm9yICM0MzM5OiBhIHJlYWN0aXZhdGVkIGNvbXBvbmVudCB3aXRoIGlubmVyIHRyYW5zaXRpb24KICAgIC8vIGRvZXMgbm90IHRyaWdnZXIgYmVjYXVzZSB0aGUgaW5uZXIgbm9kZSdzIGNyZWF0ZWQgaG9va3MgYXJlIG5vdCBjYWxsZWQKICAgIC8vIGFnYWluLiBJdCdzIG5vdCBpZGVhbCB0byBpbnZvbHZlIG1vZHVsZS1zcGVjaWZpYyBsb2dpYyBpbiBoZXJlIGJ1dAogICAgLy8gdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgYmV0dGVyIHdheSB0byBkbyBpdC4KICAgIHZhciBpbm5lck5vZGUgPSB2bm9kZTsKICAgIHdoaWxlIChpbm5lck5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHsKICAgICAgaW5uZXJOb2RlID0gaW5uZXJOb2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTsKICAgICAgaWYgKGlzRGVmKGkgPSBpbm5lck5vZGUuZGF0YSkgJiYgaXNEZWYoaSA9IGkudHJhbnNpdGlvbikpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmFjdGl2YXRlLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICBjYnMuYWN0aXZhdGVbaV0oZW1wdHlOb2RlLCBpbm5lck5vZGUpOwogICAgICAgIH0KICAgICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaChpbm5lck5vZGUpOwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgIH0KICAgIC8vIHVubGlrZSBhIG5ld2x5IGNyZWF0ZWQgY29tcG9uZW50LAogICAgLy8gYSByZWFjdGl2YXRlZCBrZWVwLWFsaXZlIGNvbXBvbmVudCBkb2Vzbid0IGluc2VydCBpdHNlbGYKICAgIGluc2VydChwYXJlbnRFbG0sIHZub2RlLmVsbSwgcmVmRWxtKTsKICB9CgogIGZ1bmN0aW9uIGluc2VydCAocGFyZW50LCBlbG0sIHJlZiQkMSkgewogICAgaWYgKGlzRGVmKHBhcmVudCkpIHsKICAgICAgaWYgKGlzRGVmKHJlZiQkMSkpIHsKICAgICAgICBpZiAocmVmJCQxLnBhcmVudE5vZGUgPT09IHBhcmVudCkgewogICAgICAgICAgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50LCBlbG0sIHJlZiQkMSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIG5vZGVPcHMuYXBwZW5kQ2hpbGQocGFyZW50LCBlbG0pOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjcmVhdGVDaGlsZHJlbiAodm5vZGUsIGNoaWxkcmVuLCBpbnNlcnRlZFZub2RlUXVldWUpIHsKICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgewogICAgICB7CiAgICAgICAgY2hlY2tEdXBsaWNhdGVLZXlzKGNoaWxkcmVuKTsKICAgICAgfQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7CiAgICAgICAgY3JlYXRlRWxtKGNoaWxkcmVuW2ldLCBpbnNlcnRlZFZub2RlUXVldWUsIHZub2RlLmVsbSwgbnVsbCwgdHJ1ZSwgY2hpbGRyZW4sIGkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKHZub2RlLnRleHQpKSB7CiAgICAgIG5vZGVPcHMuYXBwZW5kQ2hpbGQodm5vZGUuZWxtLCBub2RlT3BzLmNyZWF0ZVRleHROb2RlKFN0cmluZyh2bm9kZS50ZXh0KSkpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaXNQYXRjaGFibGUgKHZub2RlKSB7CiAgICB3aGlsZSAodm5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHsKICAgICAgdm5vZGUgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7CiAgICB9CiAgICByZXR1cm4gaXNEZWYodm5vZGUudGFnKQogIH0KCiAgZnVuY3Rpb24gaW52b2tlQ3JlYXRlSG9va3MgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpIHsKICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkgewogICAgICBjYnMuY3JlYXRlW2kkMV0oZW1wdHlOb2RlLCB2bm9kZSk7CiAgICB9CiAgICBpID0gdm5vZGUuZGF0YS5ob29rOyAvLyBSZXVzZSB2YXJpYWJsZQogICAgaWYgKGlzRGVmKGkpKSB7CiAgICAgIGlmIChpc0RlZihpLmNyZWF0ZSkpIHsgaS5jcmVhdGUoZW1wdHlOb2RlLCB2bm9kZSk7IH0KICAgICAgaWYgKGlzRGVmKGkuaW5zZXJ0KSkgeyBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7IH0KICAgIH0KICB9CgogIC8vIHNldCBzY29wZSBpZCBhdHRyaWJ1dGUgZm9yIHNjb3BlZCBDU1MuCiAgLy8gdGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNwZWNpYWwgY2FzZSB0byBhdm9pZCB0aGUgb3ZlcmhlYWQKICAvLyBvZiBnb2luZyB0aHJvdWdoIHRoZSBub3JtYWwgYXR0cmlidXRlIHBhdGNoaW5nIHByb2Nlc3MuCiAgZnVuY3Rpb24gc2V0U2NvcGUgKHZub2RlKSB7CiAgICB2YXIgaTsKICAgIGlmIChpc0RlZihpID0gdm5vZGUuZm5TY29wZUlkKSkgewogICAgICBub2RlT3BzLnNldFN0eWxlU2NvcGUodm5vZGUuZWxtLCBpKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBhbmNlc3RvciA9IHZub2RlOwogICAgICB3aGlsZSAoYW5jZXN0b3IpIHsKICAgICAgICBpZiAoaXNEZWYoaSA9IGFuY2VzdG9yLmNvbnRleHQpICYmIGlzRGVmKGkgPSBpLiRvcHRpb25zLl9zY29wZUlkKSkgewogICAgICAgICAgbm9kZU9wcy5zZXRTdHlsZVNjb3BlKHZub2RlLmVsbSwgaSk7CiAgICAgICAgfQogICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50OwogICAgICB9CiAgICB9CiAgICAvLyBmb3Igc2xvdCBjb250ZW50IHRoZXkgc2hvdWxkIGFsc28gZ2V0IHRoZSBzY29wZUlkIGZyb20gdGhlIGhvc3QgaW5zdGFuY2UuCiAgICBpZiAoaXNEZWYoaSA9IGFjdGl2ZUluc3RhbmNlKSAmJgogICAgICBpICE9PSB2bm9kZS5jb250ZXh0ICYmCiAgICAgIGkgIT09IHZub2RlLmZuQ29udGV4dCAmJgogICAgICBpc0RlZihpID0gaS4kb3B0aW9ucy5fc2NvcGVJZCkKICAgICkgewogICAgICBub2RlT3BzLnNldFN0eWxlU2NvcGUodm5vZGUuZWxtLCBpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGFkZFZub2RlcyAocGFyZW50RWxtLCByZWZFbG0sIHZub2Rlcywgc3RhcnRJZHgsIGVuZElkeCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7CiAgICBmb3IgKDsgc3RhcnRJZHggPD0gZW5kSWR4OyArK3N0YXJ0SWR4KSB7CiAgICAgIGNyZWF0ZUVsbSh2bm9kZXNbc3RhcnRJZHhdLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtLCBmYWxzZSwgdm5vZGVzLCBzdGFydElkeCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbnZva2VEZXN0cm95SG9vayAodm5vZGUpIHsKICAgIHZhciBpLCBqOwogICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5kZXN0cm95KSkgeyBpKHZub2RlKTsgfQogICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmRlc3Ryb3kubGVuZ3RoOyArK2kpIHsgY2JzLmRlc3Ryb3lbaV0odm5vZGUpOyB9CiAgICB9CiAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNoaWxkcmVuKSkgewogICAgICBmb3IgKGogPSAwOyBqIDwgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyArK2opIHsKICAgICAgICBpbnZva2VEZXN0cm95SG9vayh2bm9kZS5jaGlsZHJlbltqXSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlbW92ZVZub2RlcyAocGFyZW50RWxtLCB2bm9kZXMsIHN0YXJ0SWR4LCBlbmRJZHgpIHsKICAgIGZvciAoOyBzdGFydElkeCA8PSBlbmRJZHg7ICsrc3RhcnRJZHgpIHsKICAgICAgdmFyIGNoID0gdm5vZGVzW3N0YXJ0SWR4XTsKICAgICAgaWYgKGlzRGVmKGNoKSkgewogICAgICAgIGlmIChpc0RlZihjaC50YWcpKSB7CiAgICAgICAgICByZW1vdmVBbmRJbnZva2VSZW1vdmVIb29rKGNoKTsKICAgICAgICAgIGludm9rZURlc3Ryb3lIb29rKGNoKTsKICAgICAgICB9IGVsc2UgeyAvLyBUZXh0IG5vZGUKICAgICAgICAgIHJlbW92ZU5vZGUoY2guZWxtKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2sgKHZub2RlLCBybSkgewogICAgaWYgKGlzRGVmKHJtKSB8fCBpc0RlZih2bm9kZS5kYXRhKSkgewogICAgICB2YXIgaTsKICAgICAgdmFyIGxpc3RlbmVycyA9IGNicy5yZW1vdmUubGVuZ3RoICsgMTsKICAgICAgaWYgKGlzRGVmKHJtKSkgewogICAgICAgIC8vIHdlIGhhdmUgYSByZWN1cnNpdmVseSBwYXNzZWQgZG93biBybSBjYWxsYmFjawogICAgICAgIC8vIGluY3JlYXNlIHRoZSBsaXN0ZW5lcnMgY291bnQKICAgICAgICBybS5saXN0ZW5lcnMgKz0gbGlzdGVuZXJzOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIGRpcmVjdGx5IHJlbW92aW5nCiAgICAgICAgcm0gPSBjcmVhdGVSbUNiKHZub2RlLmVsbSwgbGlzdGVuZXJzKTsKICAgICAgfQogICAgICAvLyByZWN1cnNpdmVseSBpbnZva2UgaG9va3Mgb24gY2hpbGQgY29tcG9uZW50IHJvb3Qgbm9kZQogICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSAmJiBpc0RlZihpID0gaS5fdm5vZGUpICYmIGlzRGVmKGkuZGF0YSkpIHsKICAgICAgICByZW1vdmVBbmRJbnZva2VSZW1vdmVIb29rKGksIHJtKTsKICAgICAgfQogICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLnJlbW92ZS5sZW5ndGg7ICsraSkgewogICAgICAgIGNicy5yZW1vdmVbaV0odm5vZGUsIHJtKTsKICAgICAgfQogICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkucmVtb3ZlKSkgewogICAgICAgIGkodm5vZGUsIHJtKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBybSgpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZW1vdmVOb2RlKHZub2RlLmVsbSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVDaGlsZHJlbiAocGFyZW50RWxtLCBvbGRDaCwgbmV3Q2gsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSkgewogICAgdmFyIG9sZFN0YXJ0SWR4ID0gMDsKICAgIHZhciBuZXdTdGFydElkeCA9IDA7CiAgICB2YXIgb2xkRW5kSWR4ID0gb2xkQ2gubGVuZ3RoIC0gMTsKICAgIHZhciBvbGRTdGFydFZub2RlID0gb2xkQ2hbMF07CiAgICB2YXIgb2xkRW5kVm5vZGUgPSBvbGRDaFtvbGRFbmRJZHhdOwogICAgdmFyIG5ld0VuZElkeCA9IG5ld0NoLmxlbmd0aCAtIDE7CiAgICB2YXIgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWzBdOwogICAgdmFyIG5ld0VuZFZub2RlID0gbmV3Q2hbbmV3RW5kSWR4XTsKICAgIHZhciBvbGRLZXlUb0lkeCwgaWR4SW5PbGQsIHZub2RlVG9Nb3ZlLCByZWZFbG07CgogICAgLy8gcmVtb3ZlT25seSBpcyBhIHNwZWNpYWwgZmxhZyB1c2VkIG9ubHkgYnkgPHRyYW5zaXRpb24tZ3JvdXA+CiAgICAvLyB0byBlbnN1cmUgcmVtb3ZlZCBlbGVtZW50cyBzdGF5IGluIGNvcnJlY3QgcmVsYXRpdmUgcG9zaXRpb25zCiAgICAvLyBkdXJpbmcgbGVhdmluZyB0cmFuc2l0aW9ucwogICAgdmFyIGNhbk1vdmUgPSAhcmVtb3ZlT25seTsKCiAgICB7CiAgICAgIGNoZWNrRHVwbGljYXRlS2V5cyhuZXdDaCk7CiAgICB9CgogICAgd2hpbGUgKG9sZFN0YXJ0SWR4IDw9IG9sZEVuZElkeCAmJiBuZXdTdGFydElkeCA8PSBuZXdFbmRJZHgpIHsKICAgICAgaWYgKGlzVW5kZWYob2xkU3RhcnRWbm9kZSkpIHsKICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07IC8vIFZub2RlIGhhcyBiZWVuIG1vdmVkIGxlZnQKICAgICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZEVuZFZub2RlKSkgewogICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdOwogICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRTdGFydFZub2RlLCBuZXdTdGFydFZub2RlKSkgewogICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07CiAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdOwogICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUpKSB7CiAgICAgICAgcGF0Y2hWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgb2xkRW5kVm5vZGUgPSBvbGRDaFstLW9sZEVuZElkeF07CiAgICAgICAgbmV3RW5kVm5vZGUgPSBuZXdDaFstLW5ld0VuZElkeF07CiAgICAgIH0gZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld0VuZFZub2RlKSkgeyAvLyBWbm9kZSBtb3ZlZCByaWdodAogICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgY2FuTW92ZSAmJiBub2RlT3BzLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVuZFZub2RlLmVsbSkpOwogICAgICAgIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFsrK29sZFN0YXJ0SWR4XTsKICAgICAgICBuZXdFbmRWbm9kZSA9IG5ld0NoWy0tbmV3RW5kSWR4XTsKICAgICAgfSBlbHNlIGlmIChzYW1lVm5vZGUob2xkRW5kVm5vZGUsIG5ld1N0YXJ0Vm5vZGUpKSB7IC8vIFZub2RlIG1vdmVkIGxlZnQKICAgICAgICBwYXRjaFZub2RlKG9sZEVuZFZub2RlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIGNhbk1vdmUgJiYgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50RWxtLCBvbGRFbmRWbm9kZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTsKICAgICAgICBvbGRFbmRWbm9kZSA9IG9sZENoWy0tb2xkRW5kSWR4XTsKICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlzVW5kZWYob2xkS2V5VG9JZHgpKSB7IG9sZEtleVRvSWR4ID0gY3JlYXRlS2V5VG9PbGRJZHgob2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpOyB9CiAgICAgICAgaWR4SW5PbGQgPSBpc0RlZihuZXdTdGFydFZub2RlLmtleSkKICAgICAgICAgID8gb2xkS2V5VG9JZHhbbmV3U3RhcnRWbm9kZS5rZXldCiAgICAgICAgICA6IGZpbmRJZHhJbk9sZChuZXdTdGFydFZub2RlLCBvbGRDaCwgb2xkU3RhcnRJZHgsIG9sZEVuZElkeCk7CiAgICAgICAgaWYgKGlzVW5kZWYoaWR4SW5PbGQpKSB7IC8vIE5ldyBlbGVtZW50CiAgICAgICAgICBjcmVhdGVFbG0obmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBmYWxzZSwgbmV3Q2gsIG5ld1N0YXJ0SWR4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdm5vZGVUb01vdmUgPSBvbGRDaFtpZHhJbk9sZF07CiAgICAgICAgICBpZiAoc2FtZVZub2RlKHZub2RlVG9Nb3ZlLCBuZXdTdGFydFZub2RlKSkgewogICAgICAgICAgICBwYXRjaFZub2RlKHZub2RlVG9Nb3ZlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgICAgICBvbGRDaFtpZHhJbk9sZF0gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIGNhbk1vdmUgJiYgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50RWxtLCB2bm9kZVRvTW92ZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIHNhbWUga2V5IGJ1dCBkaWZmZXJlbnQgZWxlbWVudC4gdHJlYXQgYXMgbmV3IGVsZW1lbnQKICAgICAgICAgICAgY3JlYXRlRWxtKG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCBvbGRTdGFydFZub2RlLmVsbSwgZmFsc2UsIG5ld0NoLCBuZXdTdGFydElkeCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTsKICAgICAgfQogICAgfQogICAgaWYgKG9sZFN0YXJ0SWR4ID4gb2xkRW5kSWR4KSB7CiAgICAgIHJlZkVsbSA9IGlzVW5kZWYobmV3Q2hbbmV3RW5kSWR4ICsgMV0pID8gbnVsbCA6IG5ld0NoW25ld0VuZElkeCArIDFdLmVsbTsKICAgICAgYWRkVm5vZGVzKHBhcmVudEVsbSwgcmVmRWxtLCBuZXdDaCwgbmV3U3RhcnRJZHgsIG5ld0VuZElkeCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgIH0gZWxzZSBpZiAobmV3U3RhcnRJZHggPiBuZXdFbmRJZHgpIHsKICAgICAgcmVtb3ZlVm5vZGVzKHBhcmVudEVsbSwgb2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY2hlY2tEdXBsaWNhdGVLZXlzIChjaGlsZHJlbikgewogICAgdmFyIHNlZW5LZXlzID0ge307CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciB2bm9kZSA9IGNoaWxkcmVuW2ldOwogICAgICB2YXIga2V5ID0gdm5vZGUua2V5OwogICAgICBpZiAoaXNEZWYoa2V5KSkgewogICAgICAgIGlmIChzZWVuS2V5c1trZXldKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAoIkR1cGxpY2F0ZSBrZXlzIGRldGVjdGVkOiAnIiArIGtleSArICInLiBUaGlzIG1heSBjYXVzZSBhbiB1cGRhdGUgZXJyb3IuIiksCiAgICAgICAgICAgIHZub2RlLmNvbnRleHQKICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNlZW5LZXlzW2tleV0gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gZmluZElkeEluT2xkIChub2RlLCBvbGRDaCwgc3RhcnQsIGVuZCkgewogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgdmFyIGMgPSBvbGRDaFtpXTsKICAgICAgaWYgKGlzRGVmKGMpICYmIHNhbWVWbm9kZShub2RlLCBjKSkgeyByZXR1cm4gaSB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYXRjaFZub2RlIChvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSkgewogICAgaWYgKG9sZFZub2RlID09PSB2bm9kZSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgZWxtID0gdm5vZGUuZWxtID0gb2xkVm5vZGUuZWxtOwoKICAgIGlmIChpc1RydWUob2xkVm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyKSkgewogICAgICBpZiAoaXNEZWYodm5vZGUuYXN5bmNGYWN0b3J5LnJlc29sdmVkKSkgewogICAgICAgIGh5ZHJhdGUob2xkVm5vZGUuZWxtLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2bm9kZS5pc0FzeW5jUGxhY2Vob2xkZXIgPSB0cnVlOwogICAgICB9CiAgICAgIHJldHVybgogICAgfQoKICAgIC8vIHJldXNlIGVsZW1lbnQgZm9yIHN0YXRpYyB0cmVlcy4KICAgIC8vIG5vdGUgd2Ugb25seSBkbyB0aGlzIGlmIHRoZSB2bm9kZSBpcyBjbG9uZWQgLQogICAgLy8gaWYgdGhlIG5ldyBub2RlIGlzIG5vdCBjbG9uZWQgaXQgbWVhbnMgdGhlIHJlbmRlciBmdW5jdGlvbnMgaGF2ZSBiZWVuCiAgICAvLyByZXNldCBieSB0aGUgaG90LXJlbG9hZC1hcGkgYW5kIHdlIG5lZWQgdG8gZG8gYSBwcm9wZXIgcmUtcmVuZGVyLgogICAgaWYgKGlzVHJ1ZSh2bm9kZS5pc1N0YXRpYykgJiYKICAgICAgaXNUcnVlKG9sZFZub2RlLmlzU3RhdGljKSAmJgogICAgICB2bm9kZS5rZXkgPT09IG9sZFZub2RlLmtleSAmJgogICAgICAoaXNUcnVlKHZub2RlLmlzQ2xvbmVkKSB8fCBpc1RydWUodm5vZGUuaXNPbmNlKSkKICAgICkgewogICAgICB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSA9IG9sZFZub2RlLmNvbXBvbmVudEluc3RhbmNlOwogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgaTsKICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTsKICAgIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5wcmVwYXRjaCkpIHsKICAgICAgaShvbGRWbm9kZSwgdm5vZGUpOwogICAgfQoKICAgIHZhciBvbGRDaCA9IG9sZFZub2RlLmNoaWxkcmVuOwogICAgdmFyIGNoID0gdm5vZGUuY2hpbGRyZW47CiAgICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNQYXRjaGFibGUodm5vZGUpKSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBjYnMudXBkYXRlLmxlbmd0aDsgKytpKSB7IGNicy51cGRhdGVbaV0ob2xkVm5vZGUsIHZub2RlKTsgfQogICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkudXBkYXRlKSkgeyBpKG9sZFZub2RlLCB2bm9kZSk7IH0KICAgIH0KICAgIGlmIChpc1VuZGVmKHZub2RlLnRleHQpKSB7CiAgICAgIGlmIChpc0RlZihvbGRDaCkgJiYgaXNEZWYoY2gpKSB7CiAgICAgICAgaWYgKG9sZENoICE9PSBjaCkgeyB1cGRhdGVDaGlsZHJlbihlbG0sIG9sZENoLCBjaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KTsgfQogICAgICB9IGVsc2UgaWYgKGlzRGVmKGNoKSkgewogICAgICAgIGlmIChpc0RlZihvbGRWbm9kZS50ZXh0KSkgeyBub2RlT3BzLnNldFRleHRDb250ZW50KGVsbSwgJycpOyB9CiAgICAgICAgYWRkVm5vZGVzKGVsbSwgbnVsbCwgY2gsIDAsIGNoLmxlbmd0aCAtIDEsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgIH0gZWxzZSBpZiAoaXNEZWYob2xkQ2gpKSB7CiAgICAgICAgcmVtb3ZlVm5vZGVzKGVsbSwgb2xkQ2gsIDAsIG9sZENoLmxlbmd0aCAtIDEpOwogICAgICB9IGVsc2UgaWYgKGlzRGVmKG9sZFZub2RlLnRleHQpKSB7CiAgICAgICAgbm9kZU9wcy5zZXRUZXh0Q29udGVudChlbG0sICcnKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChvbGRWbm9kZS50ZXh0ICE9PSB2bm9kZS50ZXh0KSB7CiAgICAgIG5vZGVPcHMuc2V0VGV4dENvbnRlbnQoZWxtLCB2bm9kZS50ZXh0KTsKICAgIH0KICAgIGlmIChpc0RlZihkYXRhKSkgewogICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkucG9zdHBhdGNoKSkgeyBpKG9sZFZub2RlLCB2bm9kZSk7IH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGludm9rZUluc2VydEhvb2sgKHZub2RlLCBxdWV1ZSwgaW5pdGlhbCkgewogICAgLy8gZGVsYXkgaW5zZXJ0IGhvb2tzIGZvciBjb21wb25lbnQgcm9vdCBub2RlcywgaW52b2tlIHRoZW0gYWZ0ZXIgdGhlCiAgICAvLyBlbGVtZW50IGlzIHJlYWxseSBpbnNlcnRlZAogICAgaWYgKGlzVHJ1ZShpbml0aWFsKSAmJiBpc0RlZih2bm9kZS5wYXJlbnQpKSB7CiAgICAgIHZub2RlLnBhcmVudC5kYXRhLnBlbmRpbmdJbnNlcnQgPSBxdWV1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyArK2kpIHsKICAgICAgICBxdWV1ZVtpXS5kYXRhLmhvb2suaW5zZXJ0KHF1ZXVlW2ldKTsKICAgICAgfQogICAgfQogIH0KCiAgdmFyIGh5ZHJhdGlvbkJhaWxlZCA9IGZhbHNlOwogIC8vIGxpc3Qgb2YgbW9kdWxlcyB0aGF0IGNhbiBza2lwIGNyZWF0ZSBob29rIGR1cmluZyBoeWRyYXRpb24gYmVjYXVzZSB0aGV5CiAgLy8gYXJlIGFscmVhZHkgcmVuZGVyZWQgb24gdGhlIGNsaWVudCBvciBoYXMgbm8gbmVlZCBmb3IgaW5pdGlhbGl6YXRpb24KICAvLyBOb3RlOiBzdHlsZSBpcyBleGNsdWRlZCBiZWNhdXNlIGl0IHJlbGllcyBvbiBpbml0aWFsIGNsb25lIGZvciBmdXR1cmUKICAvLyBkZWVwIHVwZGF0ZXMgKCM3MDYzKS4KICB2YXIgaXNSZW5kZXJlZE1vZHVsZSA9IG1ha2VNYXAoJ2F0dHJzLGNsYXNzLHN0YXRpY0NsYXNzLHN0YXRpY1N0eWxlLGtleScpOwoKICAvLyBOb3RlOiB0aGlzIGlzIGEgYnJvd3Nlci1vbmx5IGZ1bmN0aW9uIHNvIHdlIGNhbiBhc3N1bWUgZWxtcyBhcmUgRE9NIG5vZGVzLgogIGZ1bmN0aW9uIGh5ZHJhdGUgKGVsbSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgaW5WUHJlKSB7CiAgICB2YXIgaTsKICAgIHZhciB0YWcgPSB2bm9kZS50YWc7CiAgICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7CiAgICB2YXIgY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlbjsKICAgIGluVlByZSA9IGluVlByZSB8fCAoZGF0YSAmJiBkYXRhLnByZSk7CiAgICB2bm9kZS5lbG0gPSBlbG07CgogICAgaWYgKGlzVHJ1ZSh2bm9kZS5pc0NvbW1lbnQpICYmIGlzRGVmKHZub2RlLmFzeW5jRmFjdG9yeSkpIHsKICAgICAgdm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyID0gdHJ1ZTsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICAgIC8vIGFzc2VydCBub2RlIG1hdGNoCiAgICB7CiAgICAgIGlmICghYXNzZXJ0Tm9kZU1hdGNoKGVsbSwgdm5vZGUsIGluVlByZSkpIHsKICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgfQogICAgfQogICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5pbml0KSkgeyBpKHZub2RlLCB0cnVlIC8qIGh5ZHJhdGluZyAqLyk7IH0KICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkpIHsKICAgICAgICAvLyBjaGlsZCBjb21wb25lbnQuIGl0IHNob3VsZCBoYXZlIGh5ZHJhdGVkIGl0cyBvd24gdHJlZS4KICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIHJldHVybiB0cnVlCiAgICAgIH0KICAgIH0KICAgIGlmIChpc0RlZih0YWcpKSB7CiAgICAgIGlmIChpc0RlZihjaGlsZHJlbikpIHsKICAgICAgICAvLyBlbXB0eSBlbGVtZW50LCBhbGxvdyBjbGllbnQgdG8gcGljayB1cCBhbmQgcG9wdWxhdGUgY2hpbGRyZW4KICAgICAgICBpZiAoIWVsbS5oYXNDaGlsZE5vZGVzKCkpIHsKICAgICAgICAgIGNyZWF0ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbiwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gdi1odG1sIGFuZCBkb21Qcm9wczogaW5uZXJIVE1MCiAgICAgICAgICBpZiAoaXNEZWYoaSA9IGRhdGEpICYmIGlzRGVmKGkgPSBpLmRvbVByb3BzKSAmJiBpc0RlZihpID0gaS5pbm5lckhUTUwpKSB7CiAgICAgICAgICAgIGlmIChpICE9PSBlbG0uaW5uZXJIVE1MKSB7CiAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmCiAgICAgICAgICAgICAgICAhaHlkcmF0aW9uQmFpbGVkCiAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICBoeWRyYXRpb25CYWlsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdQYXJlbnQ6ICcsIGVsbSk7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ3NlcnZlciBpbm5lckhUTUw6ICcsIGkpOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdjbGllbnQgaW5uZXJIVE1MOiAnLCBlbG0uaW5uZXJIVE1MKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIGl0ZXJhdGUgYW5kIGNvbXBhcmUgY2hpbGRyZW4gbGlzdHMKICAgICAgICAgICAgdmFyIGNoaWxkcmVuTWF0Y2ggPSB0cnVlOwogICAgICAgICAgICB2YXIgY2hpbGROb2RlID0gZWxtLmZpcnN0Q2hpbGQ7CiAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNoaWxkcmVuLmxlbmd0aDsgaSQxKyspIHsKICAgICAgICAgICAgICBpZiAoIWNoaWxkTm9kZSB8fCAhaHlkcmF0ZShjaGlsZE5vZGUsIGNoaWxkcmVuW2kkMV0sIGluc2VydGVkVm5vZGVRdWV1ZSwgaW5WUHJlKSkgewogICAgICAgICAgICAgICAgY2hpbGRyZW5NYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY2hpbGROb2RlID0gY2hpbGROb2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGlmIGNoaWxkTm9kZSBpcyBub3QgbnVsbCwgaXQgbWVhbnMgdGhlIGFjdHVhbCBjaGlsZE5vZGVzIGxpc3QgaXMKICAgICAgICAgICAgLy8gbG9uZ2VyIHRoYW4gdGhlIHZpcnR1YWwgY2hpbGRyZW4gbGlzdC4KICAgICAgICAgICAgaWYgKCFjaGlsZHJlbk1hdGNoIHx8IGNoaWxkTm9kZSkgewogICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICAgICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJgogICAgICAgICAgICAgICAgIWh5ZHJhdGlvbkJhaWxlZAogICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgaHlkcmF0aW9uQmFpbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUGFyZW50OiAnLCBlbG0pOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdNaXNtYXRjaGluZyBjaGlsZE5vZGVzIHZzLiBWTm9kZXM6ICcsIGVsbS5jaGlsZE5vZGVzLCBjaGlsZHJlbik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpc0RlZihkYXRhKSkgewogICAgICAgIHZhciBmdWxsSW52b2tlID0gZmFsc2U7CiAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICAgIGlmICghaXNSZW5kZXJlZE1vZHVsZShrZXkpKSB7CiAgICAgICAgICAgIGZ1bGxJbnZva2UgPSB0cnVlOwogICAgICAgICAgICBpbnZva2VDcmVhdGVIb29rcyh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICAgICAgYnJlYWsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFmdWxsSW52b2tlICYmIGRhdGFbJ2NsYXNzJ10pIHsKICAgICAgICAgIC8vIGVuc3VyZSBjb2xsZWN0aW5nIGRlcHMgZm9yIGRlZXAgY2xhc3MgYmluZGluZ3MgZm9yIGZ1dHVyZSB1cGRhdGVzCiAgICAgICAgICB0cmF2ZXJzZShkYXRhWydjbGFzcyddKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWxtLmRhdGEgIT09IHZub2RlLnRleHQpIHsKICAgICAgZWxtLmRhdGEgPSB2bm9kZS50ZXh0OwogICAgfQogICAgcmV0dXJuIHRydWUKICB9CgogIGZ1bmN0aW9uIGFzc2VydE5vZGVNYXRjaCAobm9kZSwgdm5vZGUsIGluVlByZSkgewogICAgaWYgKGlzRGVmKHZub2RlLnRhZykpIHsKICAgICAgcmV0dXJuIHZub2RlLnRhZy5pbmRleE9mKCd2dWUtY29tcG9uZW50JykgPT09IDAgfHwgKAogICAgICAgICFpc1Vua25vd25FbGVtZW50JCQxKHZub2RlLCBpblZQcmUpICYmCiAgICAgICAgdm5vZGUudGFnLnRvTG93ZXJDYXNlKCkgPT09IChub2RlLnRhZ05hbWUgJiYgbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpCiAgICAgICkKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAodm5vZGUuaXNDb21tZW50ID8gOCA6IDMpCiAgICB9CiAgfQoKICByZXR1cm4gZnVuY3Rpb24gcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSwgaHlkcmF0aW5nLCByZW1vdmVPbmx5LCBwYXJlbnRFbG0sIHJlZkVsbSkgewogICAgaWYgKGlzVW5kZWYodm5vZGUpKSB7CiAgICAgIGlmIChpc0RlZihvbGRWbm9kZSkpIHsgaW52b2tlRGVzdHJveUhvb2sob2xkVm5vZGUpOyB9CiAgICAgIHJldHVybgogICAgfQoKICAgIHZhciBpc0luaXRpYWxQYXRjaCA9IGZhbHNlOwogICAgdmFyIGluc2VydGVkVm5vZGVRdWV1ZSA9IFtdOwoKICAgIGlmIChpc1VuZGVmKG9sZFZub2RlKSkgewogICAgICAvLyBlbXB0eSBtb3VudCAobGlrZWx5IGFzIGNvbXBvbmVudCksIGNyZWF0ZSBuZXcgcm9vdCBlbGVtZW50CiAgICAgIGlzSW5pdGlhbFBhdGNoID0gdHJ1ZTsKICAgICAgY3JlYXRlRWxtKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBpc1JlYWxFbGVtZW50ID0gaXNEZWYob2xkVm5vZGUubm9kZVR5cGUpOwogICAgICBpZiAoIWlzUmVhbEVsZW1lbnQgJiYgc2FtZVZub2RlKG9sZFZub2RlLCB2bm9kZSkpIHsKICAgICAgICAvLyBwYXRjaCBleGlzdGluZyByb290IG5vZGUKICAgICAgICBwYXRjaFZub2RlKG9sZFZub2RlLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoaXNSZWFsRWxlbWVudCkgewogICAgICAgICAgLy8gbW91bnRpbmcgdG8gYSByZWFsIGVsZW1lbnQKICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQgYW5kIGlmIHdlIGNhbiBwZXJmb3JtCiAgICAgICAgICAvLyBhIHN1Y2Nlc3NmdWwgaHlkcmF0aW9uLgogICAgICAgICAgaWYgKG9sZFZub2RlLm5vZGVUeXBlID09PSAxICYmIG9sZFZub2RlLmhhc0F0dHJpYnV0ZShTU1JfQVRUUikpIHsKICAgICAgICAgICAgb2xkVm5vZGUucmVtb3ZlQXR0cmlidXRlKFNTUl9BVFRSKTsKICAgICAgICAgICAgaHlkcmF0aW5nID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc1RydWUoaHlkcmF0aW5nKSkgewogICAgICAgICAgICBpZiAoaHlkcmF0ZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkpIHsKICAgICAgICAgICAgICBpbnZva2VJbnNlcnRIb29rKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHRydWUpOwogICAgICAgICAgICAgIHJldHVybiBvbGRWbm9kZQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHdhcm4oCiAgICAgICAgICAgICAgICAnVGhlIGNsaWVudC1zaWRlIHJlbmRlcmVkIHZpcnR1YWwgRE9NIHRyZWUgaXMgbm90IG1hdGNoaW5nICcgKwogICAgICAgICAgICAgICAgJ3NlcnZlci1yZW5kZXJlZCBjb250ZW50LiBUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgaW5jb3JyZWN0ICcgKwogICAgICAgICAgICAgICAgJ0hUTUwgbWFya3VwLCBmb3IgZXhhbXBsZSBuZXN0aW5nIGJsb2NrLWxldmVsIGVsZW1lbnRzIGluc2lkZSAnICsKICAgICAgICAgICAgICAgICc8cD4sIG9yIG1pc3NpbmcgPHRib2R5Pi4gQmFpbGluZyBoeWRyYXRpb24gYW5kIHBlcmZvcm1pbmcgJyArCiAgICAgICAgICAgICAgICAnZnVsbCBjbGllbnQtc2lkZSByZW5kZXIuJwogICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIC8vIGVpdGhlciBub3Qgc2VydmVyLXJlbmRlcmVkLCBvciBoeWRyYXRpb24gZmFpbGVkLgogICAgICAgICAgLy8gY3JlYXRlIGFuIGVtcHR5IG5vZGUgYW5kIHJlcGxhY2UgaXQKICAgICAgICAgIG9sZFZub2RlID0gZW1wdHlOb2RlQXQob2xkVm5vZGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gcmVwbGFjaW5nIGV4aXN0aW5nIGVsZW1lbnQKICAgICAgICB2YXIgb2xkRWxtID0gb2xkVm5vZGUuZWxtOwogICAgICAgIHZhciBwYXJlbnRFbG0kMSA9IG5vZGVPcHMucGFyZW50Tm9kZShvbGRFbG0pOwoKICAgICAgICAvLyBjcmVhdGUgbmV3IG5vZGUKICAgICAgICBjcmVhdGVFbG0oCiAgICAgICAgICB2bm9kZSwKICAgICAgICAgIGluc2VydGVkVm5vZGVRdWV1ZSwKICAgICAgICAgIC8vIGV4dHJlbWVseSByYXJlIGVkZ2UgY2FzZTogZG8gbm90IGluc2VydCBpZiBvbGQgZWxlbWVudCBpcyBpbiBhCiAgICAgICAgICAvLyBsZWF2aW5nIHRyYW5zaXRpb24uIE9ubHkgaGFwcGVucyB3aGVuIGNvbWJpbmluZyB0cmFuc2l0aW9uICsKICAgICAgICAgIC8vIGtlZXAtYWxpdmUgKyBIT0NzLiAoIzQ1OTApCiAgICAgICAgICBvbGRFbG0uX2xlYXZlQ2IgPyBudWxsIDogcGFyZW50RWxtJDEsCiAgICAgICAgICBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVsbSkKICAgICAgICApOwoKICAgICAgICAvLyB1cGRhdGUgcGFyZW50IHBsYWNlaG9sZGVyIG5vZGUgZWxlbWVudCwgcmVjdXJzaXZlbHkKICAgICAgICBpZiAoaXNEZWYodm5vZGUucGFyZW50KSkgewogICAgICAgICAgdmFyIGFuY2VzdG9yID0gdm5vZGUucGFyZW50OwogICAgICAgICAgdmFyIHBhdGNoYWJsZSA9IGlzUGF0Y2hhYmxlKHZub2RlKTsKICAgICAgICAgIHdoaWxlIChhbmNlc3RvcikgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNicy5kZXN0cm95Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgY2JzLmRlc3Ryb3lbaV0oYW5jZXN0b3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFuY2VzdG9yLmVsbSA9IHZub2RlLmVsbTsKICAgICAgICAgICAgaWYgKHBhdGNoYWJsZSkgewogICAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkgewogICAgICAgICAgICAgICAgY2JzLmNyZWF0ZVtpJDFdKGVtcHR5Tm9kZSwgYW5jZXN0b3IpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyAjNjUxMwogICAgICAgICAgICAgIC8vIGludm9rZSBpbnNlcnQgaG9va3MgdGhhdCBtYXkgaGF2ZSBiZWVuIG1lcmdlZCBieSBjcmVhdGUgaG9va3MuCiAgICAgICAgICAgICAgLy8gZS5nLiBmb3IgZGlyZWN0aXZlcyB0aGF0IHVzZXMgdGhlICJpbnNlcnRlZCIgaG9vay4KICAgICAgICAgICAgICB2YXIgaW5zZXJ0ID0gYW5jZXN0b3IuZGF0YS5ob29rLmluc2VydDsKICAgICAgICAgICAgICBpZiAoaW5zZXJ0Lm1lcmdlZCkgewogICAgICAgICAgICAgICAgLy8gc3RhcnQgYXQgaW5kZXggMSB0byBhdm9pZCByZS1pbnZva2luZyBjb21wb25lbnQgbW91bnRlZCBob29rCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpJDIgPSAxOyBpJDIgPCBpbnNlcnQuZm5zLmxlbmd0aDsgaSQyKyspIHsKICAgICAgICAgICAgICAgICAgaW5zZXJ0LmZuc1tpJDJdKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJlZ2lzdGVyUmVmKGFuY2VzdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIGRlc3Ryb3kgb2xkIG5vZGUKICAgICAgICBpZiAoaXNEZWYocGFyZW50RWxtJDEpKSB7CiAgICAgICAgICByZW1vdmVWbm9kZXMocGFyZW50RWxtJDEsIFtvbGRWbm9kZV0sIDAsIDApOwogICAgICAgIH0gZWxzZSBpZiAoaXNEZWYob2xkVm5vZGUudGFnKSkgewogICAgICAgICAgaW52b2tlRGVzdHJveUhvb2sob2xkVm5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGludm9rZUluc2VydEhvb2sodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgaXNJbml0aWFsUGF0Y2gpOwogICAgcmV0dXJuIHZub2RlLmVsbQogIH0KfQoKLyogICovCgp2YXIgZGlyZWN0aXZlcyA9IHsKICBjcmVhdGU6IHVwZGF0ZURpcmVjdGl2ZXMsCiAgdXBkYXRlOiB1cGRhdGVEaXJlY3RpdmVzLAogIGRlc3Ryb3k6IGZ1bmN0aW9uIHVuYmluZERpcmVjdGl2ZXMgKHZub2RlKSB7CiAgICB1cGRhdGVEaXJlY3RpdmVzKHZub2RlLCBlbXB0eU5vZGUpOwogIH0KfQoKZnVuY3Rpb24gdXBkYXRlRGlyZWN0aXZlcyAob2xkVm5vZGUsIHZub2RlKSB7CiAgaWYgKG9sZFZub2RlLmRhdGEuZGlyZWN0aXZlcyB8fCB2bm9kZS5kYXRhLmRpcmVjdGl2ZXMpIHsKICAgIF91cGRhdGUob2xkVm5vZGUsIHZub2RlKTsKICB9Cn0KCmZ1bmN0aW9uIF91cGRhdGUgKG9sZFZub2RlLCB2bm9kZSkgewogIHZhciBpc0NyZWF0ZSA9IG9sZFZub2RlID09PSBlbXB0eU5vZGU7CiAgdmFyIGlzRGVzdHJveSA9IHZub2RlID09PSBlbXB0eU5vZGU7CiAgdmFyIG9sZERpcnMgPSBub3JtYWxpemVEaXJlY3RpdmVzJDEob2xkVm5vZGUuZGF0YS5kaXJlY3RpdmVzLCBvbGRWbm9kZS5jb250ZXh0KTsKICB2YXIgbmV3RGlycyA9IG5vcm1hbGl6ZURpcmVjdGl2ZXMkMSh2bm9kZS5kYXRhLmRpcmVjdGl2ZXMsIHZub2RlLmNvbnRleHQpOwoKICB2YXIgZGlyc1dpdGhJbnNlcnQgPSBbXTsKICB2YXIgZGlyc1dpdGhQb3N0cGF0Y2ggPSBbXTsKCiAgdmFyIGtleSwgb2xkRGlyLCBkaXI7CiAgZm9yIChrZXkgaW4gbmV3RGlycykgewogICAgb2xkRGlyID0gb2xkRGlyc1trZXldOwogICAgZGlyID0gbmV3RGlyc1trZXldOwogICAgaWYgKCFvbGREaXIpIHsKICAgICAgLy8gbmV3IGRpcmVjdGl2ZSwgYmluZAogICAgICBjYWxsSG9vayQxKGRpciwgJ2JpbmQnLCB2bm9kZSwgb2xkVm5vZGUpOwogICAgICBpZiAoZGlyLmRlZiAmJiBkaXIuZGVmLmluc2VydGVkKSB7CiAgICAgICAgZGlyc1dpdGhJbnNlcnQucHVzaChkaXIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBleGlzdGluZyBkaXJlY3RpdmUsIHVwZGF0ZQogICAgICBkaXIub2xkVmFsdWUgPSBvbGREaXIudmFsdWU7CiAgICAgIGNhbGxIb29rJDEoZGlyLCAndXBkYXRlJywgdm5vZGUsIG9sZFZub2RlKTsKICAgICAgaWYgKGRpci5kZWYgJiYgZGlyLmRlZi5jb21wb25lbnRVcGRhdGVkKSB7CiAgICAgICAgZGlyc1dpdGhQb3N0cGF0Y2gucHVzaChkaXIpOwogICAgICB9CiAgICB9CiAgfQoKICBpZiAoZGlyc1dpdGhJbnNlcnQubGVuZ3RoKSB7CiAgICB2YXIgY2FsbEluc2VydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXJzV2l0aEluc2VydC5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxIb29rJDEoZGlyc1dpdGhJbnNlcnRbaV0sICdpbnNlcnRlZCcsIHZub2RlLCBvbGRWbm9kZSk7CiAgICAgIH0KICAgIH07CiAgICBpZiAoaXNDcmVhdGUpIHsKICAgICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdpbnNlcnQnLCBjYWxsSW5zZXJ0KTsKICAgIH0gZWxzZSB7CiAgICAgIGNhbGxJbnNlcnQoKTsKICAgIH0KICB9CgogIGlmIChkaXJzV2l0aFBvc3RwYXRjaC5sZW5ndGgpIHsKICAgIG1lcmdlVk5vZGVIb29rKHZub2RlLCAncG9zdHBhdGNoJywgZnVuY3Rpb24gKCkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpcnNXaXRoUG9zdHBhdGNoLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY2FsbEhvb2skMShkaXJzV2l0aFBvc3RwYXRjaFtpXSwgJ2NvbXBvbmVudFVwZGF0ZWQnLCB2bm9kZSwgb2xkVm5vZGUpOwogICAgICB9CiAgICB9KTsKICB9CgogIGlmICghaXNDcmVhdGUpIHsKICAgIGZvciAoa2V5IGluIG9sZERpcnMpIHsKICAgICAgaWYgKCFuZXdEaXJzW2tleV0pIHsKICAgICAgICAvLyBubyBsb25nZXIgcHJlc2VudCwgdW5iaW5kCiAgICAgICAgY2FsbEhvb2skMShvbGREaXJzW2tleV0sICd1bmJpbmQnLCBvbGRWbm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCnZhciBlbXB0eU1vZGlmaWVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CgpmdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzJDEgKAogIGRpcnMsCiAgdm0KKSB7CiAgdmFyIHJlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgaWYgKCFkaXJzKSB7CiAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgIHJldHVybiByZXMKICB9CiAgdmFyIGksIGRpcjsKICBmb3IgKGkgPSAwOyBpIDwgZGlycy5sZW5ndGg7IGkrKykgewogICAgZGlyID0gZGlyc1tpXTsKICAgIGlmICghZGlyLm1vZGlmaWVycykgewogICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgICAgZGlyLm1vZGlmaWVycyA9IGVtcHR5TW9kaWZpZXJzOwogICAgfQogICAgcmVzW2dldFJhd0Rpck5hbWUoZGlyKV0gPSBkaXI7CiAgICBkaXIuZGVmID0gcmVzb2x2ZUFzc2V0KHZtLiRvcHRpb25zLCAnZGlyZWN0aXZlcycsIGRpci5uYW1lLCB0cnVlKTsKICB9CiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgcmV0dXJuIHJlcwp9CgpmdW5jdGlvbiBnZXRSYXdEaXJOYW1lIChkaXIpIHsKICByZXR1cm4gZGlyLnJhd05hbWUgfHwgKChkaXIubmFtZSkgKyAiLiIgKyAoT2JqZWN0LmtleXMoZGlyLm1vZGlmaWVycyB8fCB7fSkuam9pbignLicpKSkKfQoKZnVuY3Rpb24gY2FsbEhvb2skMSAoZGlyLCBob29rLCB2bm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSkgewogIHZhciBmbiA9IGRpci5kZWYgJiYgZGlyLmRlZltob29rXTsKICBpZiAoZm4pIHsKICAgIHRyeSB7CiAgICAgIGZuKHZub2RlLmVsbSwgZGlyLCB2bm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGhhbmRsZUVycm9yKGUsIHZub2RlLmNvbnRleHQsICgiZGlyZWN0aXZlICIgKyAoZGlyLm5hbWUpICsgIiAiICsgaG9vayArICIgaG9vayIpKTsKICAgIH0KICB9Cn0KCnZhciBiYXNlTW9kdWxlcyA9IFsKICByZWYsCiAgZGlyZWN0aXZlcwpdCgovKiAgKi8KCmZ1bmN0aW9uIHVwZGF0ZUF0dHJzIChvbGRWbm9kZSwgdm5vZGUpIHsKICB2YXIgb3B0cyA9IHZub2RlLmNvbXBvbmVudE9wdGlvbnM7CiAgaWYgKGlzRGVmKG9wdHMpICYmIG9wdHMuQ3Rvci5vcHRpb25zLmluaGVyaXRBdHRycyA9PT0gZmFsc2UpIHsKICAgIHJldHVybgogIH0KICBpZiAoaXNVbmRlZihvbGRWbm9kZS5kYXRhLmF0dHJzKSAmJiBpc1VuZGVmKHZub2RlLmRhdGEuYXR0cnMpKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIGtleSwgY3VyLCBvbGQ7CiAgdmFyIGVsbSA9IHZub2RlLmVsbTsKICB2YXIgb2xkQXR0cnMgPSBvbGRWbm9kZS5kYXRhLmF0dHJzIHx8IHt9OwogIHZhciBhdHRycyA9IHZub2RlLmRhdGEuYXR0cnMgfHwge307CiAgLy8gY2xvbmUgb2JzZXJ2ZWQgb2JqZWN0cywgYXMgdGhlIHVzZXIgcHJvYmFibHkgd2FudHMgdG8gbXV0YXRlIGl0CiAgaWYgKGlzRGVmKGF0dHJzLl9fb2JfXykpIHsKICAgIGF0dHJzID0gdm5vZGUuZGF0YS5hdHRycyA9IGV4dGVuZCh7fSwgYXR0cnMpOwogIH0KCiAgZm9yIChrZXkgaW4gYXR0cnMpIHsKICAgIGN1ciA9IGF0dHJzW2tleV07CiAgICBvbGQgPSBvbGRBdHRyc1trZXldOwogICAgaWYgKG9sZCAhPT0gY3VyKSB7CiAgICAgIHNldEF0dHIoZWxtLCBrZXksIGN1cik7CiAgICB9CiAgfQogIC8vICM0MzkxOiBpbiBJRTksIHNldHRpbmcgdHlwZSBjYW4gcmVzZXQgdmFsdWUgZm9yIGlucHV0W3R5cGU9cmFkaW9dCiAgLy8gIzY2NjY6IElFL0VkZ2UgZm9yY2VzIHByb2dyZXNzIHZhbHVlIGRvd24gdG8gMSBiZWZvcmUgc2V0dGluZyBhIG1heAogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmICgoaXNJRSB8fCBpc0VkZ2UpICYmIGF0dHJzLnZhbHVlICE9PSBvbGRBdHRycy52YWx1ZSkgewogICAgc2V0QXR0cihlbG0sICd2YWx1ZScsIGF0dHJzLnZhbHVlKTsKICB9CiAgZm9yIChrZXkgaW4gb2xkQXR0cnMpIHsKICAgIGlmIChpc1VuZGVmKGF0dHJzW2tleV0pKSB7CiAgICAgIGlmIChpc1hsaW5rKGtleSkpIHsKICAgICAgICBlbG0ucmVtb3ZlQXR0cmlidXRlTlMoeGxpbmtOUywgZ2V0WGxpbmtQcm9wKGtleSkpOwogICAgICB9IGVsc2UgaWYgKCFpc0VudW1lcmF0ZWRBdHRyKGtleSkpIHsKICAgICAgICBlbG0ucmVtb3ZlQXR0cmlidXRlKGtleSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIHNldEF0dHIgKGVsLCBrZXksIHZhbHVlKSB7CiAgaWYgKGVsLnRhZ05hbWUuaW5kZXhPZignLScpID4gLTEpIHsKICAgIGJhc2VTZXRBdHRyKGVsLCBrZXksIHZhbHVlKTsKICB9IGVsc2UgaWYgKGlzQm9vbGVhbkF0dHIoa2V5KSkgewogICAgLy8gc2V0IGF0dHJpYnV0ZSBmb3IgYmxhbmsgdmFsdWUKICAgIC8vIGUuZy4gPG9wdGlvbiBkaXNhYmxlZD5TZWxlY3Qgb25lPC9vcHRpb24+CiAgICBpZiAoaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkpIHsKICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGtleSk7CiAgICB9IGVsc2UgewogICAgICAvLyB0ZWNobmljYWxseSBhbGxvd2Z1bGxzY3JlZW4gaXMgYSBib29sZWFuIGF0dHJpYnV0ZSBmb3IgPGlmcmFtZT4sCiAgICAgIC8vIGJ1dCBGbGFzaCBleHBlY3RzIGEgdmFsdWUgb2YgInRydWUiIHdoZW4gdXNlZCBvbiA8ZW1iZWQ+IHRhZwogICAgICB2YWx1ZSA9IGtleSA9PT0gJ2FsbG93ZnVsbHNjcmVlbicgJiYgZWwudGFnTmFtZSA9PT0gJ0VNQkVEJwogICAgICAgID8gJ3RydWUnCiAgICAgICAgOiBrZXk7CiAgICAgIGVsLnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTsKICAgIH0KICB9IGVsc2UgaWYgKGlzRW51bWVyYXRlZEF0dHIoa2V5KSkgewogICAgZWwuc2V0QXR0cmlidXRlKGtleSwgaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkgfHwgdmFsdWUgPT09ICdmYWxzZScgPyAnZmFsc2UnIDogJ3RydWUnKTsKICB9IGVsc2UgaWYgKGlzWGxpbmsoa2V5KSkgewogICAgaWYgKGlzRmFsc3lBdHRyVmFsdWUodmFsdWUpKSB7CiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZU5TKHhsaW5rTlMsIGdldFhsaW5rUHJvcChrZXkpKTsKICAgIH0gZWxzZSB7CiAgICAgIGVsLnNldEF0dHJpYnV0ZU5TKHhsaW5rTlMsIGtleSwgdmFsdWUpOwogICAgfQogIH0gZWxzZSB7CiAgICBiYXNlU2V0QXR0cihlbCwga2V5LCB2YWx1ZSk7CiAgfQp9CgpmdW5jdGlvbiBiYXNlU2V0QXR0ciAoZWwsIGtleSwgdmFsdWUpIHsKICBpZiAoaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkpIHsKICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpOwogIH0gZWxzZSB7CiAgICAvLyAjNzEzODogSUUxMCAmIDExIGZpcmVzIGlucHV0IGV2ZW50IHdoZW4gc2V0dGluZyBwbGFjZWhvbGRlciBvbgogICAgLy8gPHRleHRhcmVhPi4uLiBibG9jayB0aGUgZmlyc3QgaW5wdXQgZXZlbnQgYW5kIHJlbW92ZSB0aGUgYmxvY2tlcgogICAgLy8gaW1tZWRpYXRlbHkuCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIGlmICgKICAgICAgaXNJRSAmJiAhaXNJRTkgJiYKICAgICAgZWwudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyAmJgogICAgICBrZXkgPT09ICdwbGFjZWhvbGRlcicgJiYgIWVsLl9faWVwaAogICAgKSB7CiAgICAgIHZhciBibG9ja2VyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2lucHV0JywgYmxvY2tlcik7CiAgICAgIH07CiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgYmxvY2tlcik7CiAgICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgICBlbC5fX2llcGggPSB0cnVlOyAvKiBJRSBwbGFjZWhvbGRlciBwYXRjaGVkICovCiAgICB9CiAgICBlbC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7CiAgfQp9Cgp2YXIgYXR0cnMgPSB7CiAgY3JlYXRlOiB1cGRhdGVBdHRycywKICB1cGRhdGU6IHVwZGF0ZUF0dHJzCn0KCi8qICAqLwoKZnVuY3Rpb24gdXBkYXRlQ2xhc3MgKG9sZFZub2RlLCB2bm9kZSkgewogIHZhciBlbCA9IHZub2RlLmVsbTsKICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7CiAgdmFyIG9sZERhdGEgPSBvbGRWbm9kZS5kYXRhOwogIGlmICgKICAgIGlzVW5kZWYoZGF0YS5zdGF0aWNDbGFzcykgJiYKICAgIGlzVW5kZWYoZGF0YS5jbGFzcykgJiYgKAogICAgICBpc1VuZGVmKG9sZERhdGEpIHx8ICgKICAgICAgICBpc1VuZGVmKG9sZERhdGEuc3RhdGljQ2xhc3MpICYmCiAgICAgICAgaXNVbmRlZihvbGREYXRhLmNsYXNzKQogICAgICApCiAgICApCiAgKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBjbHMgPSBnZW5DbGFzc0ZvclZub2RlKHZub2RlKTsKCiAgLy8gaGFuZGxlIHRyYW5zaXRpb24gY2xhc3NlcwogIHZhciB0cmFuc2l0aW9uQ2xhc3MgPSBlbC5fdHJhbnNpdGlvbkNsYXNzZXM7CiAgaWYgKGlzRGVmKHRyYW5zaXRpb25DbGFzcykpIHsKICAgIGNscyA9IGNvbmNhdChjbHMsIHN0cmluZ2lmeUNsYXNzKHRyYW5zaXRpb25DbGFzcykpOwogIH0KCiAgLy8gc2V0IHRoZSBjbGFzcwogIGlmIChjbHMgIT09IGVsLl9wcmV2Q2xhc3MpIHsKICAgIGVsLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBjbHMpOwogICAgZWwuX3ByZXZDbGFzcyA9IGNsczsKICB9Cn0KCnZhciBrbGFzcyA9IHsKICBjcmVhdGU6IHVwZGF0ZUNsYXNzLAogIHVwZGF0ZTogdXBkYXRlQ2xhc3MKfQoKLyogICovCgp2YXIgdmFsaWREaXZpc2lvbkNoYXJSRSA9IC9bXHcpLitcLV8kXF1dLzsKCmZ1bmN0aW9uIHBhcnNlRmlsdGVycyAoZXhwKSB7CiAgdmFyIGluU2luZ2xlID0gZmFsc2U7CiAgdmFyIGluRG91YmxlID0gZmFsc2U7CiAgdmFyIGluVGVtcGxhdGVTdHJpbmcgPSBmYWxzZTsKICB2YXIgaW5SZWdleCA9IGZhbHNlOwogIHZhciBjdXJseSA9IDA7CiAgdmFyIHNxdWFyZSA9IDA7CiAgdmFyIHBhcmVuID0gMDsKICB2YXIgbGFzdEZpbHRlckluZGV4ID0gMDsKICB2YXIgYywgcHJldiwgaSwgZXhwcmVzc2lvbiwgZmlsdGVyczsKCiAgZm9yIChpID0gMDsgaSA8IGV4cC5sZW5ndGg7IGkrKykgewogICAgcHJldiA9IGM7CiAgICBjID0gZXhwLmNoYXJDb2RlQXQoaSk7CiAgICBpZiAoaW5TaW5nbGUpIHsKICAgICAgaWYgKGMgPT09IDB4MjcgJiYgcHJldiAhPT0gMHg1QykgeyBpblNpbmdsZSA9IGZhbHNlOyB9CiAgICB9IGVsc2UgaWYgKGluRG91YmxlKSB7CiAgICAgIGlmIChjID09PSAweDIyICYmIHByZXYgIT09IDB4NUMpIHsgaW5Eb3VibGUgPSBmYWxzZTsgfQogICAgfSBlbHNlIGlmIChpblRlbXBsYXRlU3RyaW5nKSB7CiAgICAgIGlmIChjID09PSAweDYwICYmIHByZXYgIT09IDB4NUMpIHsgaW5UZW1wbGF0ZVN0cmluZyA9IGZhbHNlOyB9CiAgICB9IGVsc2UgaWYgKGluUmVnZXgpIHsKICAgICAgaWYgKGMgPT09IDB4MmYgJiYgcHJldiAhPT0gMHg1QykgeyBpblJlZ2V4ID0gZmFsc2U7IH0KICAgIH0gZWxzZSBpZiAoCiAgICAgIGMgPT09IDB4N0MgJiYgLy8gcGlwZQogICAgICBleHAuY2hhckNvZGVBdChpICsgMSkgIT09IDB4N0MgJiYKICAgICAgZXhwLmNoYXJDb2RlQXQoaSAtIDEpICE9PSAweDdDICYmCiAgICAgICFjdXJseSAmJiAhc3F1YXJlICYmICFwYXJlbgogICAgKSB7CiAgICAgIGlmIChleHByZXNzaW9uID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBmaXJzdCBmaWx0ZXIsIGVuZCBvZiBleHByZXNzaW9uCiAgICAgICAgbGFzdEZpbHRlckluZGV4ID0gaSArIDE7CiAgICAgICAgZXhwcmVzc2lvbiA9IGV4cC5zbGljZSgwLCBpKS50cmltKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHVzaEZpbHRlcigpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICBjYXNlIDB4MjI6IGluRG91YmxlID0gdHJ1ZTsgYnJlYWsgICAgICAgICAvLyAiCiAgICAgICAgY2FzZSAweDI3OiBpblNpbmdsZSA9IHRydWU7IGJyZWFrICAgICAgICAgLy8gJwogICAgICAgIGNhc2UgMHg2MDogaW5UZW1wbGF0ZVN0cmluZyA9IHRydWU7IGJyZWFrIC8vIGAKICAgICAgICBjYXNlIDB4Mjg6IHBhcmVuKys7IGJyZWFrICAgICAgICAgICAgICAgICAvLyAoCiAgICAgICAgY2FzZSAweDI5OiBwYXJlbi0tOyBicmVhayAgICAgICAgICAgICAgICAgLy8gKQogICAgICAgIGNhc2UgMHg1Qjogc3F1YXJlKys7IGJyZWFrICAgICAgICAgICAgICAgIC8vIFsKICAgICAgICBjYXNlIDB4NUQ6IHNxdWFyZS0tOyBicmVhayAgICAgICAgICAgICAgICAvLyBdCiAgICAgICAgY2FzZSAweDdCOiBjdXJseSsrOyBicmVhayAgICAgICAgICAgICAgICAgLy8gewogICAgICAgIGNhc2UgMHg3RDogY3VybHktLTsgYnJlYWsgICAgICAgICAgICAgICAgIC8vIH0KICAgICAgfQogICAgICBpZiAoYyA9PT0gMHgyZikgeyAvLyAvCiAgICAgICAgdmFyIGogPSBpIC0gMTsKICAgICAgICB2YXIgcCA9ICh2b2lkIDApOwogICAgICAgIC8vIGZpbmQgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgcHJldiBjaGFyCiAgICAgICAgZm9yICg7IGogPj0gMDsgai0tKSB7CiAgICAgICAgICBwID0gZXhwLmNoYXJBdChqKTsKICAgICAgICAgIGlmIChwICE9PSAnICcpIHsgYnJlYWsgfQogICAgICAgIH0KICAgICAgICBpZiAoIXAgfHwgIXZhbGlkRGl2aXNpb25DaGFyUkUudGVzdChwKSkgewogICAgICAgICAgaW5SZWdleCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBpZiAoZXhwcmVzc2lvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICBleHByZXNzaW9uID0gZXhwLnNsaWNlKDAsIGkpLnRyaW0oKTsKICB9IGVsc2UgaWYgKGxhc3RGaWx0ZXJJbmRleCAhPT0gMCkgewogICAgcHVzaEZpbHRlcigpOwogIH0KCiAgZnVuY3Rpb24gcHVzaEZpbHRlciAoKSB7CiAgICAoZmlsdGVycyB8fCAoZmlsdGVycyA9IFtdKSkucHVzaChleHAuc2xpY2UobGFzdEZpbHRlckluZGV4LCBpKS50cmltKCkpOwogICAgbGFzdEZpbHRlckluZGV4ID0gaSArIDE7CiAgfQoKICBpZiAoZmlsdGVycykgewogICAgZm9yIChpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgZXhwcmVzc2lvbiA9IHdyYXBGaWx0ZXIoZXhwcmVzc2lvbiwgZmlsdGVyc1tpXSk7CiAgICB9CiAgfQoKICByZXR1cm4gZXhwcmVzc2lvbgp9CgpmdW5jdGlvbiB3cmFwRmlsdGVyIChleHAsIGZpbHRlcikgewogIHZhciBpID0gZmlsdGVyLmluZGV4T2YoJygnKTsKICBpZiAoaSA8IDApIHsKICAgIC8vIF9mOiByZXNvbHZlRmlsdGVyCiAgICByZXR1cm4gKCJfZihcIiIgKyBmaWx0ZXIgKyAiXCIpKCIgKyBleHAgKyAiKSIpCiAgfSBlbHNlIHsKICAgIHZhciBuYW1lID0gZmlsdGVyLnNsaWNlKDAsIGkpOwogICAgdmFyIGFyZ3MgPSBmaWx0ZXIuc2xpY2UoaSArIDEpOwogICAgcmV0dXJuICgiX2YoXCIiICsgbmFtZSArICJcIikoIiArIGV4cCArIChhcmdzICE9PSAnKScgPyAnLCcgKyBhcmdzIDogYXJncykpCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGJhc2VXYXJuIChtc2cpIHsKICBjb25zb2xlLmVycm9yKCgiW1Z1ZSBjb21waWxlcl06ICIgKyBtc2cpKTsKfQoKZnVuY3Rpb24gcGx1Y2tNb2R1bGVGdW5jdGlvbiAoCiAgbW9kdWxlcywKICBrZXkKKSB7CiAgcmV0dXJuIG1vZHVsZXMKICAgID8gbW9kdWxlcy5tYXAoZnVuY3Rpb24gKG0pIHsgcmV0dXJuIG1ba2V5XTsgfSkuZmlsdGVyKGZ1bmN0aW9uIChfKSB7IHJldHVybiBfOyB9KQogICAgOiBbXQp9CgpmdW5jdGlvbiBhZGRQcm9wIChlbCwgbmFtZSwgdmFsdWUpIHsKICAoZWwucHJvcHMgfHwgKGVsLnByb3BzID0gW10pKS5wdXNoKHsgbmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlIH0pOwogIGVsLnBsYWluID0gZmFsc2U7Cn0KCmZ1bmN0aW9uIGFkZEF0dHIgKGVsLCBuYW1lLCB2YWx1ZSkgewogIChlbC5hdHRycyB8fCAoZWwuYXR0cnMgPSBbXSkpLnB1c2goeyBuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWUgfSk7CiAgZWwucGxhaW4gPSBmYWxzZTsKfQoKLy8gYWRkIGEgcmF3IGF0dHIgKHVzZSB0aGlzIGluIHByZVRyYW5zZm9ybXMpCmZ1bmN0aW9uIGFkZFJhd0F0dHIgKGVsLCBuYW1lLCB2YWx1ZSkgewogIGVsLmF0dHJzTWFwW25hbWVdID0gdmFsdWU7CiAgZWwuYXR0cnNMaXN0LnB1c2goeyBuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWUgfSk7Cn0KCmZ1bmN0aW9uIGFkZERpcmVjdGl2ZSAoCiAgZWwsCiAgbmFtZSwKICByYXdOYW1lLAogIHZhbHVlLAogIGFyZywKICBtb2RpZmllcnMKKSB7CiAgKGVsLmRpcmVjdGl2ZXMgfHwgKGVsLmRpcmVjdGl2ZXMgPSBbXSkpLnB1c2goeyBuYW1lOiBuYW1lLCByYXdOYW1lOiByYXdOYW1lLCB2YWx1ZTogdmFsdWUsIGFyZzogYXJnLCBtb2RpZmllcnM6IG1vZGlmaWVycyB9KTsKICBlbC5wbGFpbiA9IGZhbHNlOwp9CgpmdW5jdGlvbiBhZGRIYW5kbGVyICgKICBlbCwKICBuYW1lLAogIHZhbHVlLAogIG1vZGlmaWVycywKICBpbXBvcnRhbnQsCiAgd2FybgopIHsKICBtb2RpZmllcnMgPSBtb2RpZmllcnMgfHwgZW1wdHlPYmplY3Q7CiAgLy8gd2FybiBwcmV2ZW50IGFuZCBwYXNzaXZlIG1vZGlmaWVyCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKAogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4gJiYKICAgIG1vZGlmaWVycy5wcmV2ZW50ICYmIG1vZGlmaWVycy5wYXNzaXZlCiAgKSB7CiAgICB3YXJuKAogICAgICAncGFzc2l2ZSBhbmQgcHJldmVudCBjYW5cJ3QgYmUgdXNlZCB0b2dldGhlci4gJyArCiAgICAgICdQYXNzaXZlIGhhbmRsZXIgY2FuXCd0IHByZXZlbnQgZGVmYXVsdCBldmVudC4nCiAgICApOwogIH0KCiAgLy8gY2hlY2sgY2FwdHVyZSBtb2RpZmllcgogIGlmIChtb2RpZmllcnMuY2FwdHVyZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5jYXB0dXJlOwogICAgbmFtZSA9ICchJyArIG5hbWU7IC8vIG1hcmsgdGhlIGV2ZW50IGFzIGNhcHR1cmVkCiAgfQogIGlmIChtb2RpZmllcnMub25jZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5vbmNlOwogICAgbmFtZSA9ICd+JyArIG5hbWU7IC8vIG1hcmsgdGhlIGV2ZW50IGFzIG9uY2UKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKG1vZGlmaWVycy5wYXNzaXZlKSB7CiAgICBkZWxldGUgbW9kaWZpZXJzLnBhc3NpdmU7CiAgICBuYW1lID0gJyYnICsgbmFtZTsgLy8gbWFyayB0aGUgZXZlbnQgYXMgcGFzc2l2ZQogIH0KCiAgLy8gbm9ybWFsaXplIGNsaWNrLnJpZ2h0IGFuZCBjbGljay5taWRkbGUgc2luY2UgdGhleSBkb24ndCBhY3R1YWxseSBmaXJlCiAgLy8gdGhpcyBpcyB0ZWNobmljYWxseSBicm93c2VyLXNwZWNpZmljLCBidXQgYXQgbGVhc3QgZm9yIG5vdyBicm93c2VycyBhcmUKICAvLyB0aGUgb25seSB0YXJnZXQgZW52cyB0aGF0IGhhdmUgcmlnaHQvbWlkZGxlIGNsaWNrcy4KICBpZiAobmFtZSA9PT0gJ2NsaWNrJykgewogICAgaWYgKG1vZGlmaWVycy5yaWdodCkgewogICAgICBuYW1lID0gJ2NvbnRleHRtZW51JzsKICAgICAgZGVsZXRlIG1vZGlmaWVycy5yaWdodDsKICAgIH0gZWxzZSBpZiAobW9kaWZpZXJzLm1pZGRsZSkgewogICAgICBuYW1lID0gJ21vdXNldXAnOwogICAgfQogIH0KCiAgdmFyIGV2ZW50czsKICBpZiAobW9kaWZpZXJzLm5hdGl2ZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5uYXRpdmU7CiAgICBldmVudHMgPSBlbC5uYXRpdmVFdmVudHMgfHwgKGVsLm5hdGl2ZUV2ZW50cyA9IHt9KTsKICB9IGVsc2UgewogICAgZXZlbnRzID0gZWwuZXZlbnRzIHx8IChlbC5ldmVudHMgPSB7fSk7CiAgfQoKICB2YXIgbmV3SGFuZGxlciA9IHsKICAgIHZhbHVlOiB2YWx1ZS50cmltKCkKICB9OwogIGlmIChtb2RpZmllcnMgIT09IGVtcHR5T2JqZWN0KSB7CiAgICBuZXdIYW5kbGVyLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKICB9CgogIHZhciBoYW5kbGVycyA9IGV2ZW50c1tuYW1lXTsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoQXJyYXkuaXNBcnJheShoYW5kbGVycykpIHsKICAgIGltcG9ydGFudCA/IGhhbmRsZXJzLnVuc2hpZnQobmV3SGFuZGxlcikgOiBoYW5kbGVycy5wdXNoKG5ld0hhbmRsZXIpOwogIH0gZWxzZSBpZiAoaGFuZGxlcnMpIHsKICAgIGV2ZW50c1tuYW1lXSA9IGltcG9ydGFudCA/IFtuZXdIYW5kbGVyLCBoYW5kbGVyc10gOiBbaGFuZGxlcnMsIG5ld0hhbmRsZXJdOwogIH0gZWxzZSB7CiAgICBldmVudHNbbmFtZV0gPSBuZXdIYW5kbGVyOwogIH0KCiAgZWwucGxhaW4gPSBmYWxzZTsKfQoKZnVuY3Rpb24gZ2V0QmluZGluZ0F0dHIgKAogIGVsLAogIG5hbWUsCiAgZ2V0U3RhdGljCikgewogIHZhciBkeW5hbWljVmFsdWUgPQogICAgZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJzonICsgbmFtZSkgfHwKICAgIGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LWJpbmQ6JyArIG5hbWUpOwogIGlmIChkeW5hbWljVmFsdWUgIT0gbnVsbCkgewogICAgcmV0dXJuIHBhcnNlRmlsdGVycyhkeW5hbWljVmFsdWUpCiAgfSBlbHNlIGlmIChnZXRTdGF0aWMgIT09IGZhbHNlKSB7CiAgICB2YXIgc3RhdGljVmFsdWUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCBuYW1lKTsKICAgIGlmIChzdGF0aWNWYWx1ZSAhPSBudWxsKSB7CiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzdGF0aWNWYWx1ZSkKICAgIH0KICB9Cn0KCi8vIG5vdGU6IHRoaXMgb25seSByZW1vdmVzIHRoZSBhdHRyIGZyb20gdGhlIEFycmF5IChhdHRyc0xpc3QpIHNvIHRoYXQgaXQKLy8gZG9lc24ndCBnZXQgcHJvY2Vzc2VkIGJ5IHByb2Nlc3NBdHRycy4KLy8gQnkgZGVmYXVsdCBpdCBkb2VzIE5PVCByZW1vdmUgaXQgZnJvbSB0aGUgbWFwIChhdHRyc01hcCkgYmVjYXVzZSB0aGUgbWFwIGlzCi8vIG5lZWRlZCBkdXJpbmcgY29kZWdlbi4KZnVuY3Rpb24gZ2V0QW5kUmVtb3ZlQXR0ciAoCiAgZWwsCiAgbmFtZSwKICByZW1vdmVGcm9tTWFwCikgewogIHZhciB2YWw7CiAgaWYgKCh2YWwgPSBlbC5hdHRyc01hcFtuYW1lXSkgIT0gbnVsbCkgewogICAgdmFyIGxpc3QgPSBlbC5hdHRyc0xpc3Q7CiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIGlmIChsaXN0W2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICBsaXN0LnNwbGljZShpLCAxKTsKICAgICAgICBicmVhawogICAgICB9CiAgICB9CiAgfQogIGlmIChyZW1vdmVGcm9tTWFwKSB7CiAgICBkZWxldGUgZWwuYXR0cnNNYXBbbmFtZV07CiAgfQogIHJldHVybiB2YWwKfQoKLyogICovCgovKioKICogQ3Jvc3MtcGxhdGZvcm0gY29kZSBnZW5lcmF0aW9uIGZvciBjb21wb25lbnQgdi1tb2RlbAogKi8KZnVuY3Rpb24gZ2VuQ29tcG9uZW50TW9kZWwgKAogIGVsLAogIHZhbHVlLAogIG1vZGlmaWVycwopIHsKICB2YXIgcmVmID0gbW9kaWZpZXJzIHx8IHt9OwogIHZhciBudW1iZXIgPSByZWYubnVtYmVyOwogIHZhciB0cmltID0gcmVmLnRyaW07CgogIHZhciBiYXNlVmFsdWVFeHByZXNzaW9uID0gJyQkdic7CiAgdmFyIHZhbHVlRXhwcmVzc2lvbiA9IGJhc2VWYWx1ZUV4cHJlc3Npb247CiAgaWYgKHRyaW0pIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9CiAgICAgICIodHlwZW9mICIgKyBiYXNlVmFsdWVFeHByZXNzaW9uICsgIiA9PT0gJ3N0cmluZyciICsKICAgICAgIj8gIiArIGJhc2VWYWx1ZUV4cHJlc3Npb24gKyAiLnRyaW0oKSIgKwogICAgICAiOiAiICsgYmFzZVZhbHVlRXhwcmVzc2lvbiArICIpIjsKICB9CiAgaWYgKG51bWJlcikgewogICAgdmFsdWVFeHByZXNzaW9uID0gIl9uKCIgKyB2YWx1ZUV4cHJlc3Npb24gKyAiKSI7CiAgfQogIHZhciBhc3NpZ25tZW50ID0gZ2VuQXNzaWdubWVudENvZGUodmFsdWUsIHZhbHVlRXhwcmVzc2lvbik7CgogIGVsLm1vZGVsID0gewogICAgdmFsdWU6ICgiKCIgKyB2YWx1ZSArICIpIiksCiAgICBleHByZXNzaW9uOiAoIlwiIiArIHZhbHVlICsgIlwiIiksCiAgICBjYWxsYmFjazogKCJmdW5jdGlvbiAoIiArIGJhc2VWYWx1ZUV4cHJlc3Npb24gKyAiKSB7IiArIGFzc2lnbm1lbnQgKyAifSIpCiAgfTsKfQoKLyoqCiAqIENyb3NzLXBsYXRmb3JtIGNvZGVnZW4gaGVscGVyIGZvciBnZW5lcmF0aW5nIHYtbW9kZWwgdmFsdWUgYXNzaWdubWVudCBjb2RlLgogKi8KZnVuY3Rpb24gZ2VuQXNzaWdubWVudENvZGUgKAogIHZhbHVlLAogIGFzc2lnbm1lbnQKKSB7CiAgdmFyIHJlcyA9IHBhcnNlTW9kZWwodmFsdWUpOwogIGlmIChyZXMua2V5ID09PSBudWxsKSB7CiAgICByZXR1cm4gKHZhbHVlICsgIj0iICsgYXNzaWdubWVudCkKICB9IGVsc2UgewogICAgcmV0dXJuICgiJHNldCgiICsgKHJlcy5leHApICsgIiwgIiArIChyZXMua2V5KSArICIsICIgKyBhc3NpZ25tZW50ICsgIikiKQogIH0KfQoKLyoqCiAqIFBhcnNlIGEgdi1tb2RlbCBleHByZXNzaW9uIGludG8gYSBiYXNlIHBhdGggYW5kIGEgZmluYWwga2V5IHNlZ21lbnQuCiAqIEhhbmRsZXMgYm90aCBkb3QtcGF0aCBhbmQgcG9zc2libGUgc3F1YXJlIGJyYWNrZXRzLgogKgogKiBQb3NzaWJsZSBjYXNlczoKICoKICogLSB0ZXN0CiAqIC0gdGVzdFtrZXldCiAqIC0gdGVzdFt0ZXN0MVtrZXldXQogKiAtIHRlc3RbImEiXVtrZXldCiAqIC0geHh4LnRlc3RbYVthXS50ZXN0MVtrZXldXQogKiAtIHRlc3QueHh4LmFbImFzYSJdW3Rlc3QxW2tleV1dCiAqCiAqLwoKdmFyIGxlbjsKdmFyIHN0cjsKdmFyIGNocjsKdmFyIGluZGV4JDE7CnZhciBleHByZXNzaW9uUG9zOwp2YXIgZXhwcmVzc2lvbkVuZFBvczsKCgoKZnVuY3Rpb24gcGFyc2VNb2RlbCAodmFsKSB7CiAgLy8gRml4IGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUvcHVsbC83NzMwCiAgLy8gYWxsb3cgdi1tb2RlbD0ib2JqLnZhbCAiICh0cmFpbGluZyB3aGl0ZXNwYWNlKQogIHZhbCA9IHZhbC50cmltKCk7CiAgbGVuID0gdmFsLmxlbmd0aDsKCiAgaWYgKHZhbC5pbmRleE9mKCdbJykgPCAwIHx8IHZhbC5sYXN0SW5kZXhPZignXScpIDwgbGVuIC0gMSkgewogICAgaW5kZXgkMSA9IHZhbC5sYXN0SW5kZXhPZignLicpOwogICAgaWYgKGluZGV4JDEgPiAtMSkgewogICAgICByZXR1cm4gewogICAgICAgIGV4cDogdmFsLnNsaWNlKDAsIGluZGV4JDEpLAogICAgICAgIGtleTogJyInICsgdmFsLnNsaWNlKGluZGV4JDEgKyAxKSArICciJwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gewogICAgICAgIGV4cDogdmFsLAogICAgICAgIGtleTogbnVsbAogICAgICB9CiAgICB9CiAgfQoKICBzdHIgPSB2YWw7CiAgaW5kZXgkMSA9IGV4cHJlc3Npb25Qb3MgPSBleHByZXNzaW9uRW5kUG9zID0gMDsKCiAgd2hpbGUgKCFlb2YoKSkgewogICAgY2hyID0gbmV4dCgpOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoaXNTdHJpbmdTdGFydChjaHIpKSB7CiAgICAgIHBhcnNlU3RyaW5nKGNocik7CiAgICB9IGVsc2UgaWYgKGNociA9PT0gMHg1QikgewogICAgICBwYXJzZUJyYWNrZXQoY2hyKTsKICAgIH0KICB9CgogIHJldHVybiB7CiAgICBleHA6IHZhbC5zbGljZSgwLCBleHByZXNzaW9uUG9zKSwKICAgIGtleTogdmFsLnNsaWNlKGV4cHJlc3Npb25Qb3MgKyAxLCBleHByZXNzaW9uRW5kUG9zKQogIH0KfQoKZnVuY3Rpb24gbmV4dCAoKSB7CiAgcmV0dXJuIHN0ci5jaGFyQ29kZUF0KCsraW5kZXgkMSkKfQoKZnVuY3Rpb24gZW9mICgpIHsKICByZXR1cm4gaW5kZXgkMSA+PSBsZW4KfQoKZnVuY3Rpb24gaXNTdHJpbmdTdGFydCAoY2hyKSB7CiAgcmV0dXJuIGNociA9PT0gMHgyMiB8fCBjaHIgPT09IDB4MjcKfQoKZnVuY3Rpb24gcGFyc2VCcmFja2V0IChjaHIpIHsKICB2YXIgaW5CcmFja2V0ID0gMTsKICBleHByZXNzaW9uUG9zID0gaW5kZXgkMTsKICB3aGlsZSAoIWVvZigpKSB7CiAgICBjaHIgPSBuZXh0KCk7CiAgICBpZiAoaXNTdHJpbmdTdGFydChjaHIpKSB7CiAgICAgIHBhcnNlU3RyaW5nKGNocik7CiAgICAgIGNvbnRpbnVlCiAgICB9CiAgICBpZiAoY2hyID09PSAweDVCKSB7IGluQnJhY2tldCsrOyB9CiAgICBpZiAoY2hyID09PSAweDVEKSB7IGluQnJhY2tldC0tOyB9CiAgICBpZiAoaW5CcmFja2V0ID09PSAwKSB7CiAgICAgIGV4cHJlc3Npb25FbmRQb3MgPSBpbmRleCQxOwogICAgICBicmVhawogICAgfQogIH0KfQoKZnVuY3Rpb24gcGFyc2VTdHJpbmcgKGNocikgewogIHZhciBzdHJpbmdRdW90ZSA9IGNocjsKICB3aGlsZSAoIWVvZigpKSB7CiAgICBjaHIgPSBuZXh0KCk7CiAgICBpZiAoY2hyID09PSBzdHJpbmdRdW90ZSkgewogICAgICBicmVhawogICAgfQogIH0KfQoKLyogICovCgp2YXIgd2FybiQxOwoKLy8gaW4gc29tZSBjYXNlcywgdGhlIGV2ZW50IHVzZWQgaGFzIHRvIGJlIGRldGVybWluZWQgYXQgcnVudGltZQovLyBzbyB3ZSB1c2VkIHNvbWUgcmVzZXJ2ZWQgdG9rZW5zIGR1cmluZyBjb21waWxlLgp2YXIgUkFOR0VfVE9LRU4gPSAnX19yJzsKdmFyIENIRUNLQk9YX1JBRElPX1RPS0VOID0gJ19fYyc7CgpmdW5jdGlvbiBtb2RlbCAoCiAgZWwsCiAgZGlyLAogIF93YXJuCikgewogIHdhcm4kMSA9IF93YXJuOwogIHZhciB2YWx1ZSA9IGRpci52YWx1ZTsKICB2YXIgbW9kaWZpZXJzID0gZGlyLm1vZGlmaWVyczsKICB2YXIgdGFnID0gZWwudGFnOwogIHZhciB0eXBlID0gZWwuYXR0cnNNYXAudHlwZTsKCiAgewogICAgLy8gaW5wdXRzIHdpdGggdHlwZT0iZmlsZSIgYXJlIHJlYWQgb25seSBhbmQgc2V0dGluZyB0aGUgaW5wdXQncwogICAgLy8gdmFsdWUgd2lsbCB0aHJvdyBhbiBlcnJvci4KICAgIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ2ZpbGUnKSB7CiAgICAgIHdhcm4kMSgKICAgICAgICAiPCIgKyAoZWwudGFnKSArICIgdi1tb2RlbD1cIiIgKyB2YWx1ZSArICJcIiB0eXBlPVwiZmlsZVwiPjpcbiIgKwogICAgICAgICJGaWxlIGlucHV0cyBhcmUgcmVhZCBvbmx5LiBVc2UgYSB2LW9uOmNoYW5nZSBsaXN0ZW5lciBpbnN0ZWFkLiIKICAgICAgKTsKICAgIH0KICB9CgogIGlmIChlbC5jb21wb25lbnQpIHsKICAgIGdlbkNvbXBvbmVudE1vZGVsKGVsLCB2YWx1ZSwgbW9kaWZpZXJzKTsKICAgIC8vIGNvbXBvbmVudCB2LW1vZGVsIGRvZXNuJ3QgbmVlZCBleHRyYSBydW50aW1lCiAgICByZXR1cm4gZmFsc2UKICB9IGVsc2UgaWYgKHRhZyA9PT0gJ3NlbGVjdCcpIHsKICAgIGdlblNlbGVjdChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ2NoZWNrYm94JykgewogICAgZ2VuQ2hlY2tib3hNb2RlbChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ3JhZGlvJykgewogICAgZ2VuUmFkaW9Nb2RlbChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAndGV4dGFyZWEnKSB7CiAgICBnZW5EZWZhdWx0TW9kZWwoZWwsIHZhbHVlLCBtb2RpZmllcnMpOwogIH0gZWxzZSBpZiAoIWNvbmZpZy5pc1Jlc2VydmVkVGFnKHRhZykpIHsKICAgIGdlbkNvbXBvbmVudE1vZGVsKGVsLCB2YWx1ZSwgbW9kaWZpZXJzKTsKICAgIC8vIGNvbXBvbmVudCB2LW1vZGVsIGRvZXNuJ3QgbmVlZCBleHRyYSBydW50aW1lCiAgICByZXR1cm4gZmFsc2UKICB9IGVsc2UgewogICAgd2FybiQxKAogICAgICAiPCIgKyAoZWwudGFnKSArICIgdi1tb2RlbD1cIiIgKyB2YWx1ZSArICJcIj46ICIgKwogICAgICAidi1tb2RlbCBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZWxlbWVudCB0eXBlLiAiICsKICAgICAgJ0lmIHlvdSBhcmUgd29ya2luZyB3aXRoIGNvbnRlbnRlZGl0YWJsZSwgaXRcJ3MgcmVjb21tZW5kZWQgdG8gJyArCiAgICAgICd3cmFwIGEgbGlicmFyeSBkZWRpY2F0ZWQgZm9yIHRoYXQgcHVycG9zZSBpbnNpZGUgYSBjdXN0b20gY29tcG9uZW50LicKICAgICk7CiAgfQoKICAvLyBlbnN1cmUgcnVudGltZSBkaXJlY3RpdmUgbWV0YWRhdGEKICByZXR1cm4gdHJ1ZQp9CgpmdW5jdGlvbiBnZW5DaGVja2JveE1vZGVsICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIG51bWJlciA9IG1vZGlmaWVycyAmJiBtb2RpZmllcnMubnVtYmVyOwogIHZhciB2YWx1ZUJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ3ZhbHVlJykgfHwgJ251bGwnOwogIHZhciB0cnVlVmFsdWVCaW5kaW5nID0gZ2V0QmluZGluZ0F0dHIoZWwsICd0cnVlLXZhbHVlJykgfHwgJ3RydWUnOwogIHZhciBmYWxzZVZhbHVlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAnZmFsc2UtdmFsdWUnKSB8fCAnZmFsc2UnOwogIGFkZFByb3AoZWwsICdjaGVja2VkJywKICAgICJBcnJheS5pc0FycmF5KCIgKyB2YWx1ZSArICIpIiArCiAgICAiP19pKCIgKyB2YWx1ZSArICIsIiArIHZhbHVlQmluZGluZyArICIpPi0xIiArICgKICAgICAgdHJ1ZVZhbHVlQmluZGluZyA9PT0gJ3RydWUnCiAgICAgICAgPyAoIjooIiArIHZhbHVlICsgIikiKQogICAgICAgIDogKCI6X3EoIiArIHZhbHVlICsgIiwiICsgdHJ1ZVZhbHVlQmluZGluZyArICIpIikKICAgICkKICApOwogIGFkZEhhbmRsZXIoZWwsICdjaGFuZ2UnLAogICAgInZhciAkJGE9IiArIHZhbHVlICsgIiwiICsKICAgICAgICAnJCRlbD0kZXZlbnQudGFyZ2V0LCcgKwogICAgICAgICIkJGM9JCRlbC5jaGVja2VkPygiICsgdHJ1ZVZhbHVlQmluZGluZyArICIpOigiICsgZmFsc2VWYWx1ZUJpbmRpbmcgKyAiKTsiICsKICAgICdpZihBcnJheS5pc0FycmF5KCQkYSkpeycgKwogICAgICAidmFyICQkdj0iICsgKG51bWJlciA/ICdfbignICsgdmFsdWVCaW5kaW5nICsgJyknIDogdmFsdWVCaW5kaW5nKSArICIsIiArCiAgICAgICAgICAnJCRpPV9pKCQkYSwkJHYpOycgKwogICAgICAiaWYoJCRlbC5jaGVja2VkKXskJGk8MCYmKCIgKyAoZ2VuQXNzaWdubWVudENvZGUodmFsdWUsICckJGEuY29uY2F0KFskJHZdKScpKSArICIpfSIgKwogICAgICAiZWxzZXskJGk+LTEmJigiICsgKGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCAnJCRhLnNsaWNlKDAsJCRpKS5jb25jYXQoJCRhLnNsaWNlKCQkaSsxKSknKSkgKyAiKX0iICsKICAgICJ9ZWxzZXsiICsgKGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCAnJCRjJykpICsgIn0iLAogICAgbnVsbCwgdHJ1ZQogICk7Cn0KCmZ1bmN0aW9uIGdlblJhZGlvTW9kZWwgKAogIGVsLAogIHZhbHVlLAogIG1vZGlmaWVycwopIHsKICB2YXIgbnVtYmVyID0gbW9kaWZpZXJzICYmIG1vZGlmaWVycy5udW1iZXI7CiAgdmFyIHZhbHVlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAndmFsdWUnKSB8fCAnbnVsbCc7CiAgdmFsdWVCaW5kaW5nID0gbnVtYmVyID8gKCJfbigiICsgdmFsdWVCaW5kaW5nICsgIikiKSA6IHZhbHVlQmluZGluZzsKICBhZGRQcm9wKGVsLCAnY2hlY2tlZCcsICgiX3EoIiArIHZhbHVlICsgIiwiICsgdmFsdWVCaW5kaW5nICsgIikiKSk7CiAgYWRkSGFuZGxlcihlbCwgJ2NoYW5nZScsIGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCB2YWx1ZUJpbmRpbmcpLCBudWxsLCB0cnVlKTsKfQoKZnVuY3Rpb24gZ2VuU2VsZWN0ICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIG51bWJlciA9IG1vZGlmaWVycyAmJiBtb2RpZmllcnMubnVtYmVyOwogIHZhciBzZWxlY3RlZFZhbCA9ICJBcnJheS5wcm90b3R5cGUuZmlsdGVyIiArCiAgICAiLmNhbGwoJGV2ZW50LnRhcmdldC5vcHRpb25zLGZ1bmN0aW9uKG8pe3JldHVybiBvLnNlbGVjdGVkfSkiICsKICAgICIubWFwKGZ1bmN0aW9uKG8pe3ZhciB2YWwgPSBcIl92YWx1ZVwiIGluIG8gPyBvLl92YWx1ZSA6IG8udmFsdWU7IiArCiAgICAicmV0dXJuICIgKyAobnVtYmVyID8gJ19uKHZhbCknIDogJ3ZhbCcpICsgIn0pIjsKCiAgdmFyIGFzc2lnbm1lbnQgPSAnJGV2ZW50LnRhcmdldC5tdWx0aXBsZSA/ICQkc2VsZWN0ZWRWYWwgOiAkJHNlbGVjdGVkVmFsWzBdJzsKICB2YXIgY29kZSA9ICJ2YXIgJCRzZWxlY3RlZFZhbCA9ICIgKyBzZWxlY3RlZFZhbCArICI7IjsKICBjb2RlID0gY29kZSArICIgIiArIChnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgYXNzaWdubWVudCkpOwogIGFkZEhhbmRsZXIoZWwsICdjaGFuZ2UnLCBjb2RlLCBudWxsLCB0cnVlKTsKfQoKZnVuY3Rpb24gZ2VuRGVmYXVsdE1vZGVsICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIHR5cGUgPSBlbC5hdHRyc01hcC50eXBlOwoKICAvLyB3YXJuIGlmIHYtYmluZDp2YWx1ZSBjb25mbGljdHMgd2l0aCB2LW1vZGVsCiAgLy8gZXhjZXB0IGZvciBpbnB1dHMgd2l0aCB2LWJpbmQ6dHlwZQogIHsKICAgIHZhciB2YWx1ZSQxID0gZWwuYXR0cnNNYXBbJ3YtYmluZDp2YWx1ZSddIHx8IGVsLmF0dHJzTWFwWyc6dmFsdWUnXTsKICAgIHZhciB0eXBlQmluZGluZyA9IGVsLmF0dHJzTWFwWyd2LWJpbmQ6dHlwZSddIHx8IGVsLmF0dHJzTWFwWyc6dHlwZSddOwogICAgaWYgKHZhbHVlJDEgJiYgIXR5cGVCaW5kaW5nKSB7CiAgICAgIHZhciBiaW5kaW5nID0gZWwuYXR0cnNNYXBbJ3YtYmluZDp2YWx1ZSddID8gJ3YtYmluZDp2YWx1ZScgOiAnOnZhbHVlJzsKICAgICAgd2FybiQxKAogICAgICAgIGJpbmRpbmcgKyAiPVwiIiArIHZhbHVlJDEgKyAiXCIgY29uZmxpY3RzIHdpdGggdi1tb2RlbCBvbiB0aGUgc2FtZSBlbGVtZW50ICIgKwogICAgICAgICdiZWNhdXNlIHRoZSBsYXR0ZXIgYWxyZWFkeSBleHBhbmRzIHRvIGEgdmFsdWUgYmluZGluZyBpbnRlcm5hbGx5JwogICAgICApOwogICAgfQogIH0KCiAgdmFyIHJlZiA9IG1vZGlmaWVycyB8fCB7fTsKICB2YXIgbGF6eSA9IHJlZi5sYXp5OwogIHZhciBudW1iZXIgPSByZWYubnVtYmVyOwogIHZhciB0cmltID0gcmVmLnRyaW07CiAgdmFyIG5lZWRDb21wb3NpdGlvbkd1YXJkID0gIWxhenkgJiYgdHlwZSAhPT0gJ3JhbmdlJzsKICB2YXIgZXZlbnQgPSBsYXp5CiAgICA/ICdjaGFuZ2UnCiAgICA6IHR5cGUgPT09ICdyYW5nZScKICAgICAgPyBSQU5HRV9UT0tFTgogICAgICA6ICdpbnB1dCc7CgogIHZhciB2YWx1ZUV4cHJlc3Npb24gPSAnJGV2ZW50LnRhcmdldC52YWx1ZSc7CiAgaWYgKHRyaW0pIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9ICIkZXZlbnQudGFyZ2V0LnZhbHVlLnRyaW0oKSI7CiAgfQogIGlmIChudW1iZXIpIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9ICJfbigiICsgdmFsdWVFeHByZXNzaW9uICsgIikiOwogIH0KCiAgdmFyIGNvZGUgPSBnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgdmFsdWVFeHByZXNzaW9uKTsKICBpZiAobmVlZENvbXBvc2l0aW9uR3VhcmQpIHsKICAgIGNvZGUgPSAiaWYoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpcmV0dXJuOyIgKyBjb2RlOwogIH0KCiAgYWRkUHJvcChlbCwgJ3ZhbHVlJywgKCIoIiArIHZhbHVlICsgIikiKSk7CiAgYWRkSGFuZGxlcihlbCwgZXZlbnQsIGNvZGUsIG51bGwsIHRydWUpOwogIGlmICh0cmltIHx8IG51bWJlcikgewogICAgYWRkSGFuZGxlcihlbCwgJ2JsdXInLCAnJGZvcmNlVXBkYXRlKCknKTsKICB9Cn0KCi8qICAqLwoKLy8gbm9ybWFsaXplIHYtbW9kZWwgZXZlbnQgdG9rZW5zIHRoYXQgY2FuIG9ubHkgYmUgZGV0ZXJtaW5lZCBhdCBydW50aW1lLgovLyBpdCdzIGltcG9ydGFudCB0byBwbGFjZSB0aGUgZXZlbnQgYXMgdGhlIGZpcnN0IGluIHRoZSBhcnJheSBiZWNhdXNlCi8vIHRoZSB3aG9sZSBwb2ludCBpcyBlbnN1cmluZyB0aGUgdi1tb2RlbCBjYWxsYmFjayBnZXRzIGNhbGxlZCBiZWZvcmUKLy8gdXNlci1hdHRhY2hlZCBoYW5kbGVycy4KZnVuY3Rpb24gbm9ybWFsaXplRXZlbnRzIChvbikgewogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihvbltSQU5HRV9UT0tFTl0pKSB7CiAgICAvLyBJRSBpbnB1dFt0eXBlPXJhbmdlXSBvbmx5IHN1cHBvcnRzIGBjaGFuZ2VgIGV2ZW50CiAgICB2YXIgZXZlbnQgPSBpc0lFID8gJ2NoYW5nZScgOiAnaW5wdXQnOwogICAgb25bZXZlbnRdID0gW10uY29uY2F0KG9uW1JBTkdFX1RPS0VOXSwgb25bZXZlbnRdIHx8IFtdKTsKICAgIGRlbGV0ZSBvbltSQU5HRV9UT0tFTl07CiAgfQogIC8vIFRoaXMgd2FzIG9yaWdpbmFsbHkgaW50ZW5kZWQgdG8gZml4ICM0NTIxIGJ1dCBubyBsb25nZXIgbmVjZXNzYXJ5CiAgLy8gYWZ0ZXIgMi41LiBLZWVwaW5nIGl0IGZvciBiYWNrd2FyZHMgY29tcGF0IHdpdGggZ2VuZXJhdGVkIGNvZGUgZnJvbSA8IDIuNAogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihvbltDSEVDS0JPWF9SQURJT19UT0tFTl0pKSB7CiAgICBvbi5jaGFuZ2UgPSBbXS5jb25jYXQob25bQ0hFQ0tCT1hfUkFESU9fVE9LRU5dLCBvbi5jaGFuZ2UgfHwgW10pOwogICAgZGVsZXRlIG9uW0NIRUNLQk9YX1JBRElPX1RPS0VOXTsKICB9Cn0KCnZhciB0YXJnZXQkMTsKCmZ1bmN0aW9uIGNyZWF0ZU9uY2VIYW5kbGVyIChoYW5kbGVyLCBldmVudCwgY2FwdHVyZSkgewogIHZhciBfdGFyZ2V0ID0gdGFyZ2V0JDE7IC8vIHNhdmUgY3VycmVudCB0YXJnZXQgZWxlbWVudCBpbiBjbG9zdXJlCiAgcmV0dXJuIGZ1bmN0aW9uIG9uY2VIYW5kbGVyICgpIHsKICAgIHZhciByZXMgPSBoYW5kbGVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICBpZiAocmVzICE9PSBudWxsKSB7CiAgICAgIHJlbW92ZSQyKGV2ZW50LCBvbmNlSGFuZGxlciwgY2FwdHVyZSwgX3RhcmdldCk7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBhZGQkMSAoCiAgZXZlbnQsCiAgaGFuZGxlciwKICBvbmNlJCQxLAogIGNhcHR1cmUsCiAgcGFzc2l2ZQopIHsKICBoYW5kbGVyID0gd2l0aE1hY3JvVGFzayhoYW5kbGVyKTsKICBpZiAob25jZSQkMSkgeyBoYW5kbGVyID0gY3JlYXRlT25jZUhhbmRsZXIoaGFuZGxlciwgZXZlbnQsIGNhcHR1cmUpOyB9CiAgdGFyZ2V0JDEuYWRkRXZlbnRMaXN0ZW5lcigKICAgIGV2ZW50LAogICAgaGFuZGxlciwKICAgIHN1cHBvcnRzUGFzc2l2ZQogICAgICA/IHsgY2FwdHVyZTogY2FwdHVyZSwgcGFzc2l2ZTogcGFzc2l2ZSB9CiAgICAgIDogY2FwdHVyZQogICk7Cn0KCmZ1bmN0aW9uIHJlbW92ZSQyICgKICBldmVudCwKICBoYW5kbGVyLAogIGNhcHR1cmUsCiAgX3RhcmdldAopIHsKICAoX3RhcmdldCB8fCB0YXJnZXQkMSkucmVtb3ZlRXZlbnRMaXN0ZW5lcigKICAgIGV2ZW50LAogICAgaGFuZGxlci5fd2l0aFRhc2sgfHwgaGFuZGxlciwKICAgIGNhcHR1cmUKICApOwp9CgpmdW5jdGlvbiB1cGRhdGVET01MaXN0ZW5lcnMgKG9sZFZub2RlLCB2bm9kZSkgewogIGlmIChpc1VuZGVmKG9sZFZub2RlLmRhdGEub24pICYmIGlzVW5kZWYodm5vZGUuZGF0YS5vbikpIHsKICAgIHJldHVybgogIH0KICB2YXIgb24gPSB2bm9kZS5kYXRhLm9uIHx8IHt9OwogIHZhciBvbGRPbiA9IG9sZFZub2RlLmRhdGEub24gfHwge307CiAgdGFyZ2V0JDEgPSB2bm9kZS5lbG07CiAgbm9ybWFsaXplRXZlbnRzKG9uKTsKICB1cGRhdGVMaXN0ZW5lcnMob24sIG9sZE9uLCBhZGQkMSwgcmVtb3ZlJDIsIHZub2RlLmNvbnRleHQpOwogIHRhcmdldCQxID0gdW5kZWZpbmVkOwp9Cgp2YXIgZXZlbnRzID0gewogIGNyZWF0ZTogdXBkYXRlRE9NTGlzdGVuZXJzLAogIHVwZGF0ZTogdXBkYXRlRE9NTGlzdGVuZXJzCn0KCi8qICAqLwoKZnVuY3Rpb24gdXBkYXRlRE9NUHJvcHMgKG9sZFZub2RlLCB2bm9kZSkgewogIGlmIChpc1VuZGVmKG9sZFZub2RlLmRhdGEuZG9tUHJvcHMpICYmIGlzVW5kZWYodm5vZGUuZGF0YS5kb21Qcm9wcykpIHsKICAgIHJldHVybgogIH0KICB2YXIga2V5LCBjdXI7CiAgdmFyIGVsbSA9IHZub2RlLmVsbTsKICB2YXIgb2xkUHJvcHMgPSBvbGRWbm9kZS5kYXRhLmRvbVByb3BzIHx8IHt9OwogIHZhciBwcm9wcyA9IHZub2RlLmRhdGEuZG9tUHJvcHMgfHwge307CiAgLy8gY2xvbmUgb2JzZXJ2ZWQgb2JqZWN0cywgYXMgdGhlIHVzZXIgcHJvYmFibHkgd2FudHMgdG8gbXV0YXRlIGl0CiAgaWYgKGlzRGVmKHByb3BzLl9fb2JfXykpIHsKICAgIHByb3BzID0gdm5vZGUuZGF0YS5kb21Qcm9wcyA9IGV4dGVuZCh7fSwgcHJvcHMpOwogIH0KCiAgZm9yIChrZXkgaW4gb2xkUHJvcHMpIHsKICAgIGlmIChpc1VuZGVmKHByb3BzW2tleV0pKSB7CiAgICAgIGVsbVtrZXldID0gJyc7CiAgICB9CiAgfQogIGZvciAoa2V5IGluIHByb3BzKSB7CiAgICBjdXIgPSBwcm9wc1trZXldOwogICAgLy8gaWdub3JlIGNoaWxkcmVuIGlmIHRoZSBub2RlIGhhcyB0ZXh0Q29udGVudCBvciBpbm5lckhUTUwsCiAgICAvLyBhcyB0aGVzZSB3aWxsIHRocm93IGF3YXkgZXhpc3RpbmcgRE9NIG5vZGVzIGFuZCBjYXVzZSByZW1vdmFsIGVycm9ycwogICAgLy8gb24gc3Vic2VxdWVudCBwYXRjaGVzICgjMzM2MCkKICAgIGlmIChrZXkgPT09ICd0ZXh0Q29udGVudCcgfHwga2V5ID09PSAnaW5uZXJIVE1MJykgewogICAgICBpZiAodm5vZGUuY2hpbGRyZW4pIHsgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoID0gMDsgfQogICAgICBpZiAoY3VyID09PSBvbGRQcm9wc1trZXldKSB7IGNvbnRpbnVlIH0KICAgICAgLy8gIzY2MDEgd29yayBhcm91bmQgQ2hyb21lIHZlcnNpb24gPD0gNTUgYnVnIHdoZXJlIHNpbmdsZSB0ZXh0Tm9kZQogICAgICAvLyByZXBsYWNlZCBieSBpbm5lckhUTUwvdGV4dENvbnRlbnQgcmV0YWlucyBpdHMgcGFyZW50Tm9kZSBwcm9wZXJ0eQogICAgICBpZiAoZWxtLmNoaWxkTm9kZXMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgZWxtLnJlbW92ZUNoaWxkKGVsbS5jaGlsZE5vZGVzWzBdKTsKICAgICAgfQogICAgfQoKICAgIGlmIChrZXkgPT09ICd2YWx1ZScpIHsKICAgICAgLy8gc3RvcmUgdmFsdWUgYXMgX3ZhbHVlIGFzIHdlbGwgc2luY2UKICAgICAgLy8gbm9uLXN0cmluZyB2YWx1ZXMgd2lsbCBiZSBzdHJpbmdpZmllZAogICAgICBlbG0uX3ZhbHVlID0gY3VyOwogICAgICAvLyBhdm9pZCByZXNldHRpbmcgY3Vyc29yIHBvc2l0aW9uIHdoZW4gdmFsdWUgaXMgdGhlIHNhbWUKICAgICAgdmFyIHN0ckN1ciA9IGlzVW5kZWYoY3VyKSA/ICcnIDogU3RyaW5nKGN1cik7CiAgICAgIGlmIChzaG91bGRVcGRhdGVWYWx1ZShlbG0sIHN0ckN1cikpIHsKICAgICAgICBlbG0udmFsdWUgPSBzdHJDdXI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGVsbVtrZXldID0gY3VyOwogICAgfQogIH0KfQoKLy8gY2hlY2sgcGxhdGZvcm1zL3dlYi91dGlsL2F0dHJzLmpzIGFjY2VwdFZhbHVlCgoKZnVuY3Rpb24gc2hvdWxkVXBkYXRlVmFsdWUgKGVsbSwgY2hlY2tWYWwpIHsKICByZXR1cm4gKCFlbG0uY29tcG9zaW5nICYmICgKICAgIGVsbS50YWdOYW1lID09PSAnT1BUSU9OJyB8fAogICAgaXNOb3RJbkZvY3VzQW5kRGlydHkoZWxtLCBjaGVja1ZhbCkgfHwKICAgIGlzRGlydHlXaXRoTW9kaWZpZXJzKGVsbSwgY2hlY2tWYWwpCiAgKSkKfQoKZnVuY3Rpb24gaXNOb3RJbkZvY3VzQW5kRGlydHkgKGVsbSwgY2hlY2tWYWwpIHsKICAvLyByZXR1cm4gdHJ1ZSB3aGVuIHRleHRib3ggKC5udW1iZXIgYW5kIC50cmltKSBsb3NlcyBmb2N1cyBhbmQgaXRzIHZhbHVlIGlzCiAgLy8gbm90IGVxdWFsIHRvIHRoZSB1cGRhdGVkIHZhbHVlCiAgdmFyIG5vdEluRm9jdXMgPSB0cnVlOwogIC8vICM2MTU3CiAgLy8gd29yayBhcm91bmQgSUUgYnVnIHdoZW4gYWNjZXNzaW5nIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW4gYW4gaWZyYW1lCiAgdHJ5IHsgbm90SW5Gb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGVsbTsgfSBjYXRjaCAoZSkge30KICByZXR1cm4gbm90SW5Gb2N1cyAmJiBlbG0udmFsdWUgIT09IGNoZWNrVmFsCn0KCmZ1bmN0aW9uIGlzRGlydHlXaXRoTW9kaWZpZXJzIChlbG0sIG5ld1ZhbCkgewogIHZhciB2YWx1ZSA9IGVsbS52YWx1ZTsKICB2YXIgbW9kaWZpZXJzID0gZWxtLl92TW9kaWZpZXJzOyAvLyBpbmplY3RlZCBieSB2LW1vZGVsIHJ1bnRpbWUKICBpZiAoaXNEZWYobW9kaWZpZXJzKSkgewogICAgaWYgKG1vZGlmaWVycy5sYXp5KSB7CiAgICAgIC8vIGlucHV0cyB3aXRoIGxhenkgc2hvdWxkIG9ubHkgYmUgdXBkYXRlZCB3aGVuIG5vdCBpbiBmb2N1cwogICAgICByZXR1cm4gZmFsc2UKICAgIH0KICAgIGlmIChtb2RpZmllcnMubnVtYmVyKSB7CiAgICAgIHJldHVybiB0b051bWJlcih2YWx1ZSkgIT09IHRvTnVtYmVyKG5ld1ZhbCkKICAgIH0KICAgIGlmIChtb2RpZmllcnMudHJpbSkgewogICAgICByZXR1cm4gdmFsdWUudHJpbSgpICE9PSBuZXdWYWwudHJpbSgpCiAgICB9CiAgfQogIHJldHVybiB2YWx1ZSAhPT0gbmV3VmFsCn0KCnZhciBkb21Qcm9wcyA9IHsKICBjcmVhdGU6IHVwZGF0ZURPTVByb3BzLAogIHVwZGF0ZTogdXBkYXRlRE9NUHJvcHMKfQoKLyogICovCgp2YXIgcGFyc2VTdHlsZVRleHQgPSBjYWNoZWQoZnVuY3Rpb24gKGNzc1RleHQpIHsKICB2YXIgcmVzID0ge307CiAgdmFyIGxpc3REZWxpbWl0ZXIgPSAvOyg/IVteKF0qXCkpL2c7CiAgdmFyIHByb3BlcnR5RGVsaW1pdGVyID0gLzooLispLzsKICBjc3NUZXh0LnNwbGl0KGxpc3REZWxpbWl0ZXIpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgIGlmIChpdGVtKSB7CiAgICAgIHZhciB0bXAgPSBpdGVtLnNwbGl0KHByb3BlcnR5RGVsaW1pdGVyKTsKICAgICAgdG1wLmxlbmd0aCA+IDEgJiYgKHJlc1t0bXBbMF0udHJpbSgpXSA9IHRtcFsxXS50cmltKCkpOwogICAgfQogIH0pOwogIHJldHVybiByZXMKfSk7CgovLyBtZXJnZSBzdGF0aWMgYW5kIGR5bmFtaWMgc3R5bGUgZGF0YSBvbiB0aGUgc2FtZSB2bm9kZQpmdW5jdGlvbiBub3JtYWxpemVTdHlsZURhdGEgKGRhdGEpIHsKICB2YXIgc3R5bGUgPSBub3JtYWxpemVTdHlsZUJpbmRpbmcoZGF0YS5zdHlsZSk7CiAgLy8gc3RhdGljIHN0eWxlIGlzIHByZS1wcm9jZXNzZWQgaW50byBhbiBvYmplY3QgZHVyaW5nIGNvbXBpbGF0aW9uCiAgLy8gYW5kIGlzIGFsd2F5cyBhIGZyZXNoIG9iamVjdCwgc28gaXQncyBzYWZlIHRvIG1lcmdlIGludG8gaXQKICByZXR1cm4gZGF0YS5zdGF0aWNTdHlsZQogICAgPyBleHRlbmQoZGF0YS5zdGF0aWNTdHlsZSwgc3R5bGUpCiAgICA6IHN0eWxlCn0KCi8vIG5vcm1hbGl6ZSBwb3NzaWJsZSBhcnJheSAvIHN0cmluZyB2YWx1ZXMgaW50byBPYmplY3QKZnVuY3Rpb24gbm9ybWFsaXplU3R5bGVCaW5kaW5nIChiaW5kaW5nU3R5bGUpIHsKICBpZiAoQXJyYXkuaXNBcnJheShiaW5kaW5nU3R5bGUpKSB7CiAgICByZXR1cm4gdG9PYmplY3QoYmluZGluZ1N0eWxlKQogIH0KICBpZiAodHlwZW9mIGJpbmRpbmdTdHlsZSA9PT0gJ3N0cmluZycpIHsKICAgIHJldHVybiBwYXJzZVN0eWxlVGV4dChiaW5kaW5nU3R5bGUpCiAgfQogIHJldHVybiBiaW5kaW5nU3R5bGUKfQoKLyoqCiAqIHBhcmVudCBjb21wb25lbnQgc3R5bGUgc2hvdWxkIGJlIGFmdGVyIGNoaWxkJ3MKICogc28gdGhhdCBwYXJlbnQgY29tcG9uZW50J3Mgc3R5bGUgY291bGQgb3ZlcnJpZGUgaXQKICovCmZ1bmN0aW9uIGdldFN0eWxlICh2bm9kZSwgY2hlY2tDaGlsZCkgewogIHZhciByZXMgPSB7fTsKICB2YXIgc3R5bGVEYXRhOwoKICBpZiAoY2hlY2tDaGlsZCkgewogICAgdmFyIGNoaWxkTm9kZSA9IHZub2RlOwogICAgd2hpbGUgKGNoaWxkTm9kZS5jb21wb25lbnRJbnN0YW5jZSkgewogICAgICBjaGlsZE5vZGUgPSBjaGlsZE5vZGUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlOwogICAgICBpZiAoCiAgICAgICAgY2hpbGROb2RlICYmIGNoaWxkTm9kZS5kYXRhICYmCiAgICAgICAgKHN0eWxlRGF0YSA9IG5vcm1hbGl6ZVN0eWxlRGF0YShjaGlsZE5vZGUuZGF0YSkpCiAgICAgICkgewogICAgICAgIGV4dGVuZChyZXMsIHN0eWxlRGF0YSk7CiAgICAgIH0KICAgIH0KICB9CgogIGlmICgoc3R5bGVEYXRhID0gbm9ybWFsaXplU3R5bGVEYXRhKHZub2RlLmRhdGEpKSkgewogICAgZXh0ZW5kKHJlcywgc3R5bGVEYXRhKTsKICB9CgogIHZhciBwYXJlbnROb2RlID0gdm5vZGU7CiAgd2hpbGUgKChwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnQpKSB7CiAgICBpZiAocGFyZW50Tm9kZS5kYXRhICYmIChzdHlsZURhdGEgPSBub3JtYWxpemVTdHlsZURhdGEocGFyZW50Tm9kZS5kYXRhKSkpIHsKICAgICAgZXh0ZW5kKHJlcywgc3R5bGVEYXRhKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCnZhciBjc3NWYXJSRSA9IC9eLS0vOwp2YXIgaW1wb3J0YW50UkUgPSAvXHMqIWltcG9ydGFudCQvOwp2YXIgc2V0UHJvcCA9IGZ1bmN0aW9uIChlbCwgbmFtZSwgdmFsKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGNzc1ZhclJFLnRlc3QobmFtZSkpIHsKICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbCk7CiAgfSBlbHNlIGlmIChpbXBvcnRhbnRSRS50ZXN0KHZhbCkpIHsKICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbC5yZXBsYWNlKGltcG9ydGFudFJFLCAnJyksICdpbXBvcnRhbnQnKTsKICB9IGVsc2UgewogICAgdmFyIG5vcm1hbGl6ZWROYW1lID0gbm9ybWFsaXplKG5hbWUpOwogICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgewogICAgICAvLyBTdXBwb3J0IHZhbHVlcyBhcnJheSBjcmVhdGVkIGJ5IGF1dG9wcmVmaXhlciwgZS5nLgogICAgICAvLyB7ZGlzcGxheTogWyItd2Via2l0LWJveCIsICItbXMtZmxleGJveCIsICJmbGV4Il19CiAgICAgIC8vIFNldCB0aGVtIG9uZSBieSBvbmUsIGFuZCB0aGUgYnJvd3NlciB3aWxsIG9ubHkgc2V0IHRob3NlIGl0IGNhbiByZWNvZ25pemUKICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHZhbC5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgIGVsLnN0eWxlW25vcm1hbGl6ZWROYW1lXSA9IHZhbFtpXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZWwuc3R5bGVbbm9ybWFsaXplZE5hbWVdID0gdmFsOwogICAgfQogIH0KfTsKCnZhciB2ZW5kb3JOYW1lcyA9IFsnV2Via2l0JywgJ01veicsICdtcyddOwoKdmFyIGVtcHR5U3R5bGU7CnZhciBub3JtYWxpemUgPSBjYWNoZWQoZnVuY3Rpb24gKHByb3ApIHsKICBlbXB0eVN0eWxlID0gZW1wdHlTdHlsZSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZTsKICBwcm9wID0gY2FtZWxpemUocHJvcCk7CiAgaWYgKHByb3AgIT09ICdmaWx0ZXInICYmIChwcm9wIGluIGVtcHR5U3R5bGUpKSB7CiAgICByZXR1cm4gcHJvcAogIH0KICB2YXIgY2FwTmFtZSA9IHByb3AuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9wLnNsaWNlKDEpOwogIGZvciAodmFyIGkgPSAwOyBpIDwgdmVuZG9yTmFtZXMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBuYW1lID0gdmVuZG9yTmFtZXNbaV0gKyBjYXBOYW1lOwogICAgaWYgKG5hbWUgaW4gZW1wdHlTdHlsZSkgewogICAgICByZXR1cm4gbmFtZQogICAgfQogIH0KfSk7CgpmdW5jdGlvbiB1cGRhdGVTdHlsZSAob2xkVm5vZGUsIHZub2RlKSB7CiAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogIHZhciBvbGREYXRhID0gb2xkVm5vZGUuZGF0YTsKCiAgaWYgKGlzVW5kZWYoZGF0YS5zdGF0aWNTdHlsZSkgJiYgaXNVbmRlZihkYXRhLnN0eWxlKSAmJgogICAgaXNVbmRlZihvbGREYXRhLnN0YXRpY1N0eWxlKSAmJiBpc1VuZGVmKG9sZERhdGEuc3R5bGUpCiAgKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBjdXIsIG5hbWU7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwogIHZhciBvbGRTdGF0aWNTdHlsZSA9IG9sZERhdGEuc3RhdGljU3R5bGU7CiAgdmFyIG9sZFN0eWxlQmluZGluZyA9IG9sZERhdGEubm9ybWFsaXplZFN0eWxlIHx8IG9sZERhdGEuc3R5bGUgfHwge307CgogIC8vIGlmIHN0YXRpYyBzdHlsZSBleGlzdHMsIHN0eWxlYmluZGluZyBhbHJlYWR5IG1lcmdlZCBpbnRvIGl0IHdoZW4gZG9pbmcgbm9ybWFsaXplU3R5bGVEYXRhCiAgdmFyIG9sZFN0eWxlID0gb2xkU3RhdGljU3R5bGUgfHwgb2xkU3R5bGVCaW5kaW5nOwoKICB2YXIgc3R5bGUgPSBub3JtYWxpemVTdHlsZUJpbmRpbmcodm5vZGUuZGF0YS5zdHlsZSkgfHwge307CgogIC8vIHN0b3JlIG5vcm1hbGl6ZWQgc3R5bGUgdW5kZXIgYSBkaWZmZXJlbnQga2V5IGZvciBuZXh0IGRpZmYKICAvLyBtYWtlIHN1cmUgdG8gY2xvbmUgaXQgaWYgaXQncyByZWFjdGl2ZSwgc2luY2UgdGhlIHVzZXIgbGlrZWx5IHdhbnRzCiAgLy8gdG8gbXV0YXRlIGl0LgogIHZub2RlLmRhdGEubm9ybWFsaXplZFN0eWxlID0gaXNEZWYoc3R5bGUuX19vYl9fKQogICAgPyBleHRlbmQoe30sIHN0eWxlKQogICAgOiBzdHlsZTsKCiAgdmFyIG5ld1N0eWxlID0gZ2V0U3R5bGUodm5vZGUsIHRydWUpOwoKICBmb3IgKG5hbWUgaW4gb2xkU3R5bGUpIHsKICAgIGlmIChpc1VuZGVmKG5ld1N0eWxlW25hbWVdKSkgewogICAgICBzZXRQcm9wKGVsLCBuYW1lLCAnJyk7CiAgICB9CiAgfQogIGZvciAobmFtZSBpbiBuZXdTdHlsZSkgewogICAgY3VyID0gbmV3U3R5bGVbbmFtZV07CiAgICBpZiAoY3VyICE9PSBvbGRTdHlsZVtuYW1lXSkgewogICAgICAvLyBpZTkgc2V0dGluZyB0byBudWxsIGhhcyBubyBlZmZlY3QsIG11c3QgdXNlIGVtcHR5IHN0cmluZwogICAgICBzZXRQcm9wKGVsLCBuYW1lLCBjdXIgPT0gbnVsbCA/ICcnIDogY3VyKTsKICAgIH0KICB9Cn0KCnZhciBzdHlsZSA9IHsKICBjcmVhdGU6IHVwZGF0ZVN0eWxlLAogIHVwZGF0ZTogdXBkYXRlU3R5bGUKfQoKLyogICovCgovKioKICogQWRkIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uCiAqIFNWRyBlbGVtZW50cyBpbiBJRQogKi8KZnVuY3Rpb24gYWRkQ2xhc3MgKGVsLCBjbHMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNscyB8fCAhKGNscyA9IGNscy50cmltKCkpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKGVsLmNsYXNzTGlzdCkgewogICAgaWYgKGNscy5pbmRleE9mKCcgJykgPiAtMSkgewogICAgICBjbHMuc3BsaXQoL1xzKy8pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGVsLmNsYXNzTGlzdC5hZGQoYyk7IH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuY2xhc3NMaXN0LmFkZChjbHMpOwogICAgfQogIH0gZWxzZSB7CiAgICB2YXIgY3VyID0gIiAiICsgKGVsLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJykgKyAiICI7CiAgICBpZiAoY3VyLmluZGV4T2YoJyAnICsgY2xzICsgJyAnKSA8IDApIHsKICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsIChjdXIgKyBjbHMpLnRyaW0oKSk7CiAgICB9CiAgfQp9CgovKioKICogUmVtb3ZlIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uCiAqIFNWRyBlbGVtZW50cyBpbiBJRQogKi8KZnVuY3Rpb24gcmVtb3ZlQ2xhc3MgKGVsLCBjbHMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNscyB8fCAhKGNscyA9IGNscy50cmltKCkpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKGVsLmNsYXNzTGlzdCkgewogICAgaWYgKGNscy5pbmRleE9mKCcgJykgPiAtMSkgewogICAgICBjbHMuc3BsaXQoL1xzKy8pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGVsLmNsYXNzTGlzdC5yZW1vdmUoYyk7IH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShjbHMpOwogICAgfQogICAgaWYgKCFlbC5jbGFzc0xpc3QubGVuZ3RoKSB7CiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTsKICAgIH0KICB9IGVsc2UgewogICAgdmFyIGN1ciA9ICIgIiArIChlbC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgfHwgJycpICsgIiAiOwogICAgdmFyIHRhciA9ICcgJyArIGNscyArICcgJzsKICAgIHdoaWxlIChjdXIuaW5kZXhPZih0YXIpID49IDApIHsKICAgICAgY3VyID0gY3VyLnJlcGxhY2UodGFyLCAnICcpOwogICAgfQogICAgY3VyID0gY3VyLnRyaW0oKTsKICAgIGlmIChjdXIpIHsKICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsIGN1cik7CiAgICB9IGVsc2UgewogICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7CiAgICB9CiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uIChkZWYpIHsKICBpZiAoIWRlZikgewogICAgcmV0dXJuCiAgfQogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKHR5cGVvZiBkZWYgPT09ICdvYmplY3QnKSB7CiAgICB2YXIgcmVzID0ge307CiAgICBpZiAoZGVmLmNzcyAhPT0gZmFsc2UpIHsKICAgICAgZXh0ZW5kKHJlcywgYXV0b0Nzc1RyYW5zaXRpb24oZGVmLm5hbWUgfHwgJ3YnKSk7CiAgICB9CiAgICBleHRlbmQocmVzLCBkZWYpOwogICAgcmV0dXJuIHJlcwogIH0gZWxzZSBpZiAodHlwZW9mIGRlZiA9PT0gJ3N0cmluZycpIHsKICAgIHJldHVybiBhdXRvQ3NzVHJhbnNpdGlvbihkZWYpCiAgfQp9Cgp2YXIgYXV0b0Nzc1RyYW5zaXRpb24gPSBjYWNoZWQoZnVuY3Rpb24gKG5hbWUpIHsKICByZXR1cm4gewogICAgZW50ZXJDbGFzczogKG5hbWUgKyAiLWVudGVyIiksCiAgICBlbnRlclRvQ2xhc3M6IChuYW1lICsgIi1lbnRlci10byIpLAogICAgZW50ZXJBY3RpdmVDbGFzczogKG5hbWUgKyAiLWVudGVyLWFjdGl2ZSIpLAogICAgbGVhdmVDbGFzczogKG5hbWUgKyAiLWxlYXZlIiksCiAgICBsZWF2ZVRvQ2xhc3M6IChuYW1lICsgIi1sZWF2ZS10byIpLAogICAgbGVhdmVBY3RpdmVDbGFzczogKG5hbWUgKyAiLWxlYXZlLWFjdGl2ZSIpCiAgfQp9KTsKCnZhciBoYXNUcmFuc2l0aW9uID0gaW5Ccm93c2VyICYmICFpc0lFOTsKdmFyIFRSQU5TSVRJT04gPSAndHJhbnNpdGlvbic7CnZhciBBTklNQVRJT04gPSAnYW5pbWF0aW9uJzsKCi8vIFRyYW5zaXRpb24gcHJvcGVydHkvZXZlbnQgc25pZmZpbmcKdmFyIHRyYW5zaXRpb25Qcm9wID0gJ3RyYW5zaXRpb24nOwp2YXIgdHJhbnNpdGlvbkVuZEV2ZW50ID0gJ3RyYW5zaXRpb25lbmQnOwp2YXIgYW5pbWF0aW9uUHJvcCA9ICdhbmltYXRpb24nOwp2YXIgYW5pbWF0aW9uRW5kRXZlbnQgPSAnYW5pbWF0aW9uZW5kJzsKaWYgKGhhc1RyYW5zaXRpb24pIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAod2luZG93Lm9udHJhbnNpdGlvbmVuZCA9PT0gdW5kZWZpbmVkICYmCiAgICB3aW5kb3cub253ZWJraXR0cmFuc2l0aW9uZW5kICE9PSB1bmRlZmluZWQKICApIHsKICAgIHRyYW5zaXRpb25Qcm9wID0gJ1dlYmtpdFRyYW5zaXRpb24nOwogICAgdHJhbnNpdGlvbkVuZEV2ZW50ID0gJ3dlYmtpdFRyYW5zaXRpb25FbmQnOwogIH0KICBpZiAod2luZG93Lm9uYW5pbWF0aW9uZW5kID09PSB1bmRlZmluZWQgJiYKICAgIHdpbmRvdy5vbndlYmtpdGFuaW1hdGlvbmVuZCAhPT0gdW5kZWZpbmVkCiAgKSB7CiAgICBhbmltYXRpb25Qcm9wID0gJ1dlYmtpdEFuaW1hdGlvbic7CiAgICBhbmltYXRpb25FbmRFdmVudCA9ICd3ZWJraXRBbmltYXRpb25FbmQnOwogIH0KfQoKLy8gYmluZGluZyB0byB3aW5kb3cgaXMgbmVjZXNzYXJ5IHRvIG1ha2UgaG90IHJlbG9hZCB3b3JrIGluIElFIGluIHN0cmljdCBtb2RlCnZhciByYWYgPSBpbkJyb3dzZXIKICA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUKICAgID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykKICAgIDogc2V0VGltZW91dAogIDogLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gZnVuY3Rpb24gKGZuKSB7IHJldHVybiBmbigpOyB9OwoKZnVuY3Rpb24gbmV4dEZyYW1lIChmbikgewogIHJhZihmdW5jdGlvbiAoKSB7CiAgICByYWYoZm4pOwogIH0pOwp9CgpmdW5jdGlvbiBhZGRUcmFuc2l0aW9uQ2xhc3MgKGVsLCBjbHMpIHsKICB2YXIgdHJhbnNpdGlvbkNsYXNzZXMgPSBlbC5fdHJhbnNpdGlvbkNsYXNzZXMgfHwgKGVsLl90cmFuc2l0aW9uQ2xhc3NlcyA9IFtdKTsKICBpZiAodHJhbnNpdGlvbkNsYXNzZXMuaW5kZXhPZihjbHMpIDwgMCkgewogICAgdHJhbnNpdGlvbkNsYXNzZXMucHVzaChjbHMpOwogICAgYWRkQ2xhc3MoZWwsIGNscyk7CiAgfQp9CgpmdW5jdGlvbiByZW1vdmVUcmFuc2l0aW9uQ2xhc3MgKGVsLCBjbHMpIHsKICBpZiAoZWwuX3RyYW5zaXRpb25DbGFzc2VzKSB7CiAgICByZW1vdmUoZWwuX3RyYW5zaXRpb25DbGFzc2VzLCBjbHMpOwogIH0KICByZW1vdmVDbGFzcyhlbCwgY2xzKTsKfQoKZnVuY3Rpb24gd2hlblRyYW5zaXRpb25FbmRzICgKICBlbCwKICBleHBlY3RlZFR5cGUsCiAgY2IKKSB7CiAgdmFyIHJlZiA9IGdldFRyYW5zaXRpb25JbmZvKGVsLCBleHBlY3RlZFR5cGUpOwogIHZhciB0eXBlID0gcmVmLnR5cGU7CiAgdmFyIHRpbWVvdXQgPSByZWYudGltZW91dDsKICB2YXIgcHJvcENvdW50ID0gcmVmLnByb3BDb3VudDsKICBpZiAoIXR5cGUpIHsgcmV0dXJuIGNiKCkgfQogIHZhciBldmVudCA9IHR5cGUgPT09IFRSQU5TSVRJT04gPyB0cmFuc2l0aW9uRW5kRXZlbnQgOiBhbmltYXRpb25FbmRFdmVudDsKICB2YXIgZW5kZWQgPSAwOwogIHZhciBlbmQgPSBmdW5jdGlvbiAoKSB7CiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBvbkVuZCk7CiAgICBjYigpOwogIH07CiAgdmFyIG9uRW5kID0gZnVuY3Rpb24gKGUpIHsKICAgIGlmIChlLnRhcmdldCA9PT0gZWwpIHsKICAgICAgaWYgKCsrZW5kZWQgPj0gcHJvcENvdW50KSB7CiAgICAgICAgZW5kKCk7CiAgICAgIH0KICAgIH0KICB9OwogIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgaWYgKGVuZGVkIDwgcHJvcENvdW50KSB7CiAgICAgIGVuZCgpOwogICAgfQogIH0sIHRpbWVvdXQgKyAxKTsKICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBvbkVuZCk7Cn0KCnZhciB0cmFuc2Zvcm1SRSA9IC9cYih0cmFuc2Zvcm18YWxsKSgsfCQpLzsKCmZ1bmN0aW9uIGdldFRyYW5zaXRpb25JbmZvIChlbCwgZXhwZWN0ZWRUeXBlKSB7CiAgdmFyIHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTsKICB2YXIgdHJhbnNpdGlvbkRlbGF5cyA9IHN0eWxlc1t0cmFuc2l0aW9uUHJvcCArICdEZWxheSddLnNwbGl0KCcsICcpOwogIHZhciB0cmFuc2l0aW9uRHVyYXRpb25zID0gc3R5bGVzW3RyYW5zaXRpb25Qcm9wICsgJ0R1cmF0aW9uJ10uc3BsaXQoJywgJyk7CiAgdmFyIHRyYW5zaXRpb25UaW1lb3V0ID0gZ2V0VGltZW91dCh0cmFuc2l0aW9uRGVsYXlzLCB0cmFuc2l0aW9uRHVyYXRpb25zKTsKICB2YXIgYW5pbWF0aW9uRGVsYXlzID0gc3R5bGVzW2FuaW1hdGlvblByb3AgKyAnRGVsYXknXS5zcGxpdCgnLCAnKTsKICB2YXIgYW5pbWF0aW9uRHVyYXRpb25zID0gc3R5bGVzW2FuaW1hdGlvblByb3AgKyAnRHVyYXRpb24nXS5zcGxpdCgnLCAnKTsKICB2YXIgYW5pbWF0aW9uVGltZW91dCA9IGdldFRpbWVvdXQoYW5pbWF0aW9uRGVsYXlzLCBhbmltYXRpb25EdXJhdGlvbnMpOwoKICB2YXIgdHlwZTsKICB2YXIgdGltZW91dCA9IDA7CiAgdmFyIHByb3BDb3VudCA9IDA7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGV4cGVjdGVkVHlwZSA9PT0gVFJBTlNJVElPTikgewogICAgaWYgKHRyYW5zaXRpb25UaW1lb3V0ID4gMCkgewogICAgICB0eXBlID0gVFJBTlNJVElPTjsKICAgICAgdGltZW91dCA9IHRyYW5zaXRpb25UaW1lb3V0OwogICAgICBwcm9wQ291bnQgPSB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aDsKICAgIH0KICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gQU5JTUFUSU9OKSB7CiAgICBpZiAoYW5pbWF0aW9uVGltZW91dCA+IDApIHsKICAgICAgdHlwZSA9IEFOSU1BVElPTjsKICAgICAgdGltZW91dCA9IGFuaW1hdGlvblRpbWVvdXQ7CiAgICAgIHByb3BDb3VudCA9IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGg7CiAgICB9CiAgfSBlbHNlIHsKICAgIHRpbWVvdXQgPSBNYXRoLm1heCh0cmFuc2l0aW9uVGltZW91dCwgYW5pbWF0aW9uVGltZW91dCk7CiAgICB0eXBlID0gdGltZW91dCA+IDAKICAgICAgPyB0cmFuc2l0aW9uVGltZW91dCA+IGFuaW1hdGlvblRpbWVvdXQKICAgICAgICA/IFRSQU5TSVRJT04KICAgICAgICA6IEFOSU1BVElPTgogICAgICA6IG51bGw7CiAgICBwcm9wQ291bnQgPSB0eXBlCiAgICAgID8gdHlwZSA9PT0gVFJBTlNJVElPTgogICAgICAgID8gdHJhbnNpdGlvbkR1cmF0aW9ucy5sZW5ndGgKICAgICAgICA6IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGgKICAgICAgOiAwOwogIH0KICB2YXIgaGFzVHJhbnNmb3JtID0KICAgIHR5cGUgPT09IFRSQU5TSVRJT04gJiYKICAgIHRyYW5zZm9ybVJFLnRlc3Qoc3R5bGVzW3RyYW5zaXRpb25Qcm9wICsgJ1Byb3BlcnR5J10pOwogIHJldHVybiB7CiAgICB0eXBlOiB0eXBlLAogICAgdGltZW91dDogdGltZW91dCwKICAgIHByb3BDb3VudDogcHJvcENvdW50LAogICAgaGFzVHJhbnNmb3JtOiBoYXNUcmFuc2Zvcm0KICB9Cn0KCmZ1bmN0aW9uIGdldFRpbWVvdXQgKGRlbGF5cywgZHVyYXRpb25zKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICB3aGlsZSAoZGVsYXlzLmxlbmd0aCA8IGR1cmF0aW9ucy5sZW5ndGgpIHsKICAgIGRlbGF5cyA9IGRlbGF5cy5jb25jYXQoZGVsYXlzKTsKICB9CgogIHJldHVybiBNYXRoLm1heC5hcHBseShudWxsLCBkdXJhdGlvbnMubWFwKGZ1bmN0aW9uIChkLCBpKSB7CiAgICByZXR1cm4gdG9NcyhkKSArIHRvTXMoZGVsYXlzW2ldKQogIH0pKQp9CgpmdW5jdGlvbiB0b01zIChzKSB7CiAgcmV0dXJuIE51bWJlcihzLnNsaWNlKDAsIC0xKSkgKiAxMDAwCn0KCi8qICAqLwoKZnVuY3Rpb24gZW50ZXIgKHZub2RlLCB0b2dnbGVEaXNwbGF5KSB7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwoKICAvLyBjYWxsIGxlYXZlIGNhbGxiYWNrIG5vdwogIGlmIChpc0RlZihlbC5fbGVhdmVDYikpIHsKICAgIGVsLl9sZWF2ZUNiLmNhbmNlbGxlZCA9IHRydWU7CiAgICBlbC5fbGVhdmVDYigpOwogIH0KCiAgdmFyIGRhdGEgPSByZXNvbHZlVHJhbnNpdGlvbih2bm9kZS5kYXRhLnRyYW5zaXRpb24pOwogIGlmIChpc1VuZGVmKGRhdGEpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihlbC5fZW50ZXJDYikgfHwgZWwubm9kZVR5cGUgIT09IDEpIHsKICAgIHJldHVybgogIH0KCiAgdmFyIGNzcyA9IGRhdGEuY3NzOwogIHZhciB0eXBlID0gZGF0YS50eXBlOwogIHZhciBlbnRlckNsYXNzID0gZGF0YS5lbnRlckNsYXNzOwogIHZhciBlbnRlclRvQ2xhc3MgPSBkYXRhLmVudGVyVG9DbGFzczsKICB2YXIgZW50ZXJBY3RpdmVDbGFzcyA9IGRhdGEuZW50ZXJBY3RpdmVDbGFzczsKICB2YXIgYXBwZWFyQ2xhc3MgPSBkYXRhLmFwcGVhckNsYXNzOwogIHZhciBhcHBlYXJUb0NsYXNzID0gZGF0YS5hcHBlYXJUb0NsYXNzOwogIHZhciBhcHBlYXJBY3RpdmVDbGFzcyA9IGRhdGEuYXBwZWFyQWN0aXZlQ2xhc3M7CiAgdmFyIGJlZm9yZUVudGVyID0gZGF0YS5iZWZvcmVFbnRlcjsKICB2YXIgZW50ZXIgPSBkYXRhLmVudGVyOwogIHZhciBhZnRlckVudGVyID0gZGF0YS5hZnRlckVudGVyOwogIHZhciBlbnRlckNhbmNlbGxlZCA9IGRhdGEuZW50ZXJDYW5jZWxsZWQ7CiAgdmFyIGJlZm9yZUFwcGVhciA9IGRhdGEuYmVmb3JlQXBwZWFyOwogIHZhciBhcHBlYXIgPSBkYXRhLmFwcGVhcjsKICB2YXIgYWZ0ZXJBcHBlYXIgPSBkYXRhLmFmdGVyQXBwZWFyOwogIHZhciBhcHBlYXJDYW5jZWxsZWQgPSBkYXRhLmFwcGVhckNhbmNlbGxlZDsKICB2YXIgZHVyYXRpb24gPSBkYXRhLmR1cmF0aW9uOwoKICAvLyBhY3RpdmVJbnN0YW5jZSB3aWxsIGFsd2F5cyBiZSB0aGUgPHRyYW5zaXRpb24+IGNvbXBvbmVudCBtYW5hZ2luZyB0aGlzCiAgLy8gdHJhbnNpdGlvbi4gT25lIGVkZ2UgY2FzZSB0byBjaGVjayBpcyB3aGVuIHRoZSA8dHJhbnNpdGlvbj4gaXMgcGxhY2VkCiAgLy8gYXMgdGhlIHJvb3Qgbm9kZSBvZiBhIGNoaWxkIGNvbXBvbmVudC4gSW4gdGhhdCBjYXNlIHdlIG5lZWQgdG8gY2hlY2sKICAvLyA8dHJhbnNpdGlvbj4ncyBwYXJlbnQgZm9yIGFwcGVhciBjaGVjay4KICB2YXIgY29udGV4dCA9IGFjdGl2ZUluc3RhbmNlOwogIHZhciB0cmFuc2l0aW9uTm9kZSA9IGFjdGl2ZUluc3RhbmNlLiR2bm9kZTsKICB3aGlsZSAodHJhbnNpdGlvbk5vZGUgJiYgdHJhbnNpdGlvbk5vZGUucGFyZW50KSB7CiAgICB0cmFuc2l0aW9uTm9kZSA9IHRyYW5zaXRpb25Ob2RlLnBhcmVudDsKICAgIGNvbnRleHQgPSB0cmFuc2l0aW9uTm9kZS5jb250ZXh0OwogIH0KCiAgdmFyIGlzQXBwZWFyID0gIWNvbnRleHQuX2lzTW91bnRlZCB8fCAhdm5vZGUuaXNSb290SW5zZXJ0OwoKICBpZiAoaXNBcHBlYXIgJiYgIWFwcGVhciAmJiBhcHBlYXIgIT09ICcnKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBzdGFydENsYXNzID0gaXNBcHBlYXIgJiYgYXBwZWFyQ2xhc3MKICAgID8gYXBwZWFyQ2xhc3MKICAgIDogZW50ZXJDbGFzczsKICB2YXIgYWN0aXZlQ2xhc3MgPSBpc0FwcGVhciAmJiBhcHBlYXJBY3RpdmVDbGFzcwogICAgPyBhcHBlYXJBY3RpdmVDbGFzcwogICAgOiBlbnRlckFjdGl2ZUNsYXNzOwogIHZhciB0b0NsYXNzID0gaXNBcHBlYXIgJiYgYXBwZWFyVG9DbGFzcwogICAgPyBhcHBlYXJUb0NsYXNzCiAgICA6IGVudGVyVG9DbGFzczsKCiAgdmFyIGJlZm9yZUVudGVySG9vayA9IGlzQXBwZWFyCiAgICA/IChiZWZvcmVBcHBlYXIgfHwgYmVmb3JlRW50ZXIpCiAgICA6IGJlZm9yZUVudGVyOwogIHZhciBlbnRlckhvb2sgPSBpc0FwcGVhcgogICAgPyAodHlwZW9mIGFwcGVhciA9PT0gJ2Z1bmN0aW9uJyA/IGFwcGVhciA6IGVudGVyKQogICAgOiBlbnRlcjsKICB2YXIgYWZ0ZXJFbnRlckhvb2sgPSBpc0FwcGVhcgogICAgPyAoYWZ0ZXJBcHBlYXIgfHwgYWZ0ZXJFbnRlcikKICAgIDogYWZ0ZXJFbnRlcjsKICB2YXIgZW50ZXJDYW5jZWxsZWRIb29rID0gaXNBcHBlYXIKICAgID8gKGFwcGVhckNhbmNlbGxlZCB8fCBlbnRlckNhbmNlbGxlZCkKICAgIDogZW50ZXJDYW5jZWxsZWQ7CgogIHZhciBleHBsaWNpdEVudGVyRHVyYXRpb24gPSB0b051bWJlcigKICAgIGlzT2JqZWN0KGR1cmF0aW9uKQogICAgICA/IGR1cmF0aW9uLmVudGVyCiAgICAgIDogZHVyYXRpb24KICApOwoKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGV4cGxpY2l0RW50ZXJEdXJhdGlvbiAhPSBudWxsKSB7CiAgICBjaGVja0R1cmF0aW9uKGV4cGxpY2l0RW50ZXJEdXJhdGlvbiwgJ2VudGVyJywgdm5vZGUpOwogIH0KCiAgdmFyIGV4cGVjdHNDU1MgPSBjc3MgIT09IGZhbHNlICYmICFpc0lFOTsKICB2YXIgdXNlcldhbnRzQ29udHJvbCA9IGdldEhvb2tBcmd1bWVudHNMZW5ndGgoZW50ZXJIb29rKTsKCiAgdmFyIGNiID0gZWwuX2VudGVyQ2IgPSBvbmNlKGZ1bmN0aW9uICgpIHsKICAgIGlmIChleHBlY3RzQ1NTKSB7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgdG9DbGFzcyk7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgYWN0aXZlQ2xhc3MpOwogICAgfQogICAgaWYgKGNiLmNhbmNlbGxlZCkgewogICAgICBpZiAoZXhwZWN0c0NTUykgewogICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgc3RhcnRDbGFzcyk7CiAgICAgIH0KICAgICAgZW50ZXJDYW5jZWxsZWRIb29rICYmIGVudGVyQ2FuY2VsbGVkSG9vayhlbCk7CiAgICB9IGVsc2UgewogICAgICBhZnRlckVudGVySG9vayAmJiBhZnRlckVudGVySG9vayhlbCk7CiAgICB9CiAgICBlbC5fZW50ZXJDYiA9IG51bGw7CiAgfSk7CgogIGlmICghdm5vZGUuZGF0YS5zaG93KSB7CiAgICAvLyByZW1vdmUgcGVuZGluZyBsZWF2ZSBlbGVtZW50IG9uIGVudGVyIGJ5IGluamVjdGluZyBhbiBpbnNlcnQgaG9vawogICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdpbnNlcnQnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlOwogICAgICB2YXIgcGVuZGluZ05vZGUgPSBwYXJlbnQgJiYgcGFyZW50Ll9wZW5kaW5nICYmIHBhcmVudC5fcGVuZGluZ1t2bm9kZS5rZXldOwogICAgICBpZiAocGVuZGluZ05vZGUgJiYKICAgICAgICBwZW5kaW5nTm9kZS50YWcgPT09IHZub2RlLnRhZyAmJgogICAgICAgIHBlbmRpbmdOb2RlLmVsbS5fbGVhdmVDYgogICAgICApIHsKICAgICAgICBwZW5kaW5nTm9kZS5lbG0uX2xlYXZlQ2IoKTsKICAgICAgfQogICAgICBlbnRlckhvb2sgJiYgZW50ZXJIb29rKGVsLCBjYik7CiAgICB9KTsKICB9CgogIC8vIHN0YXJ0IGVudGVyIHRyYW5zaXRpb24KICBiZWZvcmVFbnRlckhvb2sgJiYgYmVmb3JlRW50ZXJIb29rKGVsKTsKICBpZiAoZXhwZWN0c0NTUykgewogICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBzdGFydENsYXNzKTsKICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgYWN0aXZlQ2xhc3MpOwogICAgbmV4dEZyYW1lKGZ1bmN0aW9uICgpIHsKICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBzdGFydENsYXNzKTsKICAgICAgaWYgKCFjYi5jYW5jZWxsZWQpIHsKICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIHRvQ2xhc3MpOwogICAgICAgIGlmICghdXNlcldhbnRzQ29udHJvbCkgewogICAgICAgICAgaWYgKGlzVmFsaWREdXJhdGlvbihleHBsaWNpdEVudGVyRHVyYXRpb24pKSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQoY2IsIGV4cGxpY2l0RW50ZXJEdXJhdGlvbik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIHR5cGUsIGNiKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgaWYgKHZub2RlLmRhdGEuc2hvdykgewogICAgdG9nZ2xlRGlzcGxheSAmJiB0b2dnbGVEaXNwbGF5KCk7CiAgICBlbnRlckhvb2sgJiYgZW50ZXJIb29rKGVsLCBjYik7CiAgfQoKICBpZiAoIWV4cGVjdHNDU1MgJiYgIXVzZXJXYW50c0NvbnRyb2wpIHsKICAgIGNiKCk7CiAgfQp9CgpmdW5jdGlvbiBsZWF2ZSAodm5vZGUsIHJtKSB7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwoKICAvLyBjYWxsIGVudGVyIGNhbGxiYWNrIG5vdwogIGlmIChpc0RlZihlbC5fZW50ZXJDYikpIHsKICAgIGVsLl9lbnRlckNiLmNhbmNlbGxlZCA9IHRydWU7CiAgICBlbC5fZW50ZXJDYigpOwogIH0KCiAgdmFyIGRhdGEgPSByZXNvbHZlVHJhbnNpdGlvbih2bm9kZS5kYXRhLnRyYW5zaXRpb24pOwogIGlmIChpc1VuZGVmKGRhdGEpIHx8IGVsLm5vZGVUeXBlICE9PSAxKSB7CiAgICByZXR1cm4gcm0oKQogIH0KCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGlzRGVmKGVsLl9sZWF2ZUNiKSkgewogICAgcmV0dXJuCiAgfQoKICB2YXIgY3NzID0gZGF0YS5jc3M7CiAgdmFyIHR5cGUgPSBkYXRhLnR5cGU7CiAgdmFyIGxlYXZlQ2xhc3MgPSBkYXRhLmxlYXZlQ2xhc3M7CiAgdmFyIGxlYXZlVG9DbGFzcyA9IGRhdGEubGVhdmVUb0NsYXNzOwogIHZhciBsZWF2ZUFjdGl2ZUNsYXNzID0gZGF0YS5sZWF2ZUFjdGl2ZUNsYXNzOwogIHZhciBiZWZvcmVMZWF2ZSA9IGRhdGEuYmVmb3JlTGVhdmU7CiAgdmFyIGxlYXZlID0gZGF0YS5sZWF2ZTsKICB2YXIgYWZ0ZXJMZWF2ZSA9IGRhdGEuYWZ0ZXJMZWF2ZTsKICB2YXIgbGVhdmVDYW5jZWxsZWQgPSBkYXRhLmxlYXZlQ2FuY2VsbGVkOwogIHZhciBkZWxheUxlYXZlID0gZGF0YS5kZWxheUxlYXZlOwogIHZhciBkdXJhdGlvbiA9IGRhdGEuZHVyYXRpb247CgogIHZhciBleHBlY3RzQ1NTID0gY3NzICE9PSBmYWxzZSAmJiAhaXNJRTk7CiAgdmFyIHVzZXJXYW50c0NvbnRyb2wgPSBnZXRIb29rQXJndW1lbnRzTGVuZ3RoKGxlYXZlKTsKCiAgdmFyIGV4cGxpY2l0TGVhdmVEdXJhdGlvbiA9IHRvTnVtYmVyKAogICAgaXNPYmplY3QoZHVyYXRpb24pCiAgICAgID8gZHVyYXRpb24ubGVhdmUKICAgICAgOiBkdXJhdGlvbgogICk7CgogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgaXNEZWYoZXhwbGljaXRMZWF2ZUR1cmF0aW9uKSkgewogICAgY2hlY2tEdXJhdGlvbihleHBsaWNpdExlYXZlRHVyYXRpb24sICdsZWF2ZScsIHZub2RlKTsKICB9CgogIHZhciBjYiA9IGVsLl9sZWF2ZUNiID0gb25jZShmdW5jdGlvbiAoKSB7CiAgICBpZiAoZWwucGFyZW50Tm9kZSAmJiBlbC5wYXJlbnROb2RlLl9wZW5kaW5nKSB7CiAgICAgIGVsLnBhcmVudE5vZGUuX3BlbmRpbmdbdm5vZGUua2V5XSA9IG51bGw7CiAgICB9CiAgICBpZiAoZXhwZWN0c0NTUykgewogICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVBY3RpdmVDbGFzcyk7CiAgICB9CiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7CiAgICAgIGlmIChleHBlY3RzQ1NTKSB7CiAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUNsYXNzKTsKICAgICAgfQogICAgICBsZWF2ZUNhbmNlbGxlZCAmJiBsZWF2ZUNhbmNlbGxlZChlbCk7CiAgICB9IGVsc2UgewogICAgICBybSgpOwogICAgICBhZnRlckxlYXZlICYmIGFmdGVyTGVhdmUoZWwpOwogICAgfQogICAgZWwuX2xlYXZlQ2IgPSBudWxsOwogIH0pOwoKICBpZiAoZGVsYXlMZWF2ZSkgewogICAgZGVsYXlMZWF2ZShwZXJmb3JtTGVhdmUpOwogIH0gZWxzZSB7CiAgICBwZXJmb3JtTGVhdmUoKTsKICB9CgogIGZ1bmN0aW9uIHBlcmZvcm1MZWF2ZSAoKSB7CiAgICAvLyB0aGUgZGVsYXllZCBsZWF2ZSBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkCiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7CiAgICAgIHJldHVybgogICAgfQogICAgLy8gcmVjb3JkIGxlYXZpbmcgZWxlbWVudAogICAgaWYgKCF2bm9kZS5kYXRhLnNob3cpIHsKICAgICAgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgfHwgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgPSB7fSkpWyh2bm9kZS5rZXkpXSA9IHZub2RlOwogICAgfQogICAgYmVmb3JlTGVhdmUgJiYgYmVmb3JlTGVhdmUoZWwpOwogICAgaWYgKGV4cGVjdHNDU1MpIHsKICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUNsYXNzKTsKICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUFjdGl2ZUNsYXNzKTsKICAgICAgbmV4dEZyYW1lKGZ1bmN0aW9uICgpIHsKICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQ2xhc3MpOwogICAgICAgIGlmICghY2IuY2FuY2VsbGVkKSB7CiAgICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7CiAgICAgICAgICBpZiAoIXVzZXJXYW50c0NvbnRyb2wpIHsKICAgICAgICAgICAgaWYgKGlzVmFsaWREdXJhdGlvbihleHBsaWNpdExlYXZlRHVyYXRpb24pKSB7CiAgICAgICAgICAgICAgc2V0VGltZW91dChjYiwgZXhwbGljaXRMZWF2ZUR1cmF0aW9uKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIHR5cGUsIGNiKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBsZWF2ZSAmJiBsZWF2ZShlbCwgY2IpOwogICAgaWYgKCFleHBlY3RzQ1NTICYmICF1c2VyV2FudHNDb250cm9sKSB7CiAgICAgIGNiKCk7CiAgICB9CiAgfQp9CgovLyBvbmx5IHVzZWQgaW4gZGV2IG1vZGUKZnVuY3Rpb24gY2hlY2tEdXJhdGlvbiAodmFsLCBuYW1lLCB2bm9kZSkgewogIGlmICh0eXBlb2YgdmFsICE9PSAnbnVtYmVyJykgewogICAgd2FybigKICAgICAgIjx0cmFuc2l0aW9uPiBleHBsaWNpdCAiICsgbmFtZSArICIgZHVyYXRpb24gaXMgbm90IGEgdmFsaWQgbnVtYmVyIC0gIiArCiAgICAgICJnb3QgIiArIChKU09OLnN0cmluZ2lmeSh2YWwpKSArICIuIiwKICAgICAgdm5vZGUuY29udGV4dAogICAgKTsKICB9IGVsc2UgaWYgKGlzTmFOKHZhbCkpIHsKICAgIHdhcm4oCiAgICAgICI8dHJhbnNpdGlvbj4gZXhwbGljaXQgIiArIG5hbWUgKyAiIGR1cmF0aW9uIGlzIE5hTiAtICIgKwogICAgICAndGhlIGR1cmF0aW9uIGV4cHJlc3Npb24gbWlnaHQgYmUgaW5jb3JyZWN0LicsCiAgICAgIHZub2RlLmNvbnRleHQKICAgICk7CiAgfQp9CgpmdW5jdGlvbiBpc1ZhbGlkRHVyYXRpb24gKHZhbCkgewogIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsKQp9CgovKioKICogTm9ybWFsaXplIGEgdHJhbnNpdGlvbiBob29rJ3MgYXJndW1lbnQgbGVuZ3RoLiBUaGUgaG9vayBtYXkgYmU6CiAqIC0gYSBtZXJnZWQgaG9vayAoaW52b2tlcikgd2l0aCB0aGUgb3JpZ2luYWwgaW4gLmZucwogKiAtIGEgd3JhcHBlZCBjb21wb25lbnQgbWV0aG9kIChjaGVjayAuX2xlbmd0aCkKICogLSBhIHBsYWluIGZ1bmN0aW9uICgubGVuZ3RoKQogKi8KZnVuY3Rpb24gZ2V0SG9va0FyZ3VtZW50c0xlbmd0aCAoZm4pIHsKICBpZiAoaXNVbmRlZihmbikpIHsKICAgIHJldHVybiBmYWxzZQogIH0KICB2YXIgaW52b2tlckZucyA9IGZuLmZuczsKICBpZiAoaXNEZWYoaW52b2tlckZucykpIHsKICAgIC8vIGludm9rZXIKICAgIHJldHVybiBnZXRIb29rQXJndW1lbnRzTGVuZ3RoKAogICAgICBBcnJheS5pc0FycmF5KGludm9rZXJGbnMpCiAgICAgICAgPyBpbnZva2VyRm5zWzBdCiAgICAgICAgOiBpbnZva2VyRm5zCiAgICApCiAgfSBlbHNlIHsKICAgIHJldHVybiAoZm4uX2xlbmd0aCB8fCBmbi5sZW5ndGgpID4gMQogIH0KfQoKZnVuY3Rpb24gX2VudGVyIChfLCB2bm9kZSkgewogIGlmICh2bm9kZS5kYXRhLnNob3cgIT09IHRydWUpIHsKICAgIGVudGVyKHZub2RlKTsKICB9Cn0KCnZhciB0cmFuc2l0aW9uID0gaW5Ccm93c2VyID8gewogIGNyZWF0ZTogX2VudGVyLAogIGFjdGl2YXRlOiBfZW50ZXIsCiAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUkJDEgKHZub2RlLCBybSkgewogICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgIGlmICh2bm9kZS5kYXRhLnNob3cgIT09IHRydWUpIHsKICAgICAgbGVhdmUodm5vZGUsIHJtKTsKICAgIH0gZWxzZSB7CiAgICAgIHJtKCk7CiAgICB9CiAgfQp9IDoge30KCnZhciBwbGF0Zm9ybU1vZHVsZXMgPSBbCiAgYXR0cnMsCiAga2xhc3MsCiAgZXZlbnRzLAogIGRvbVByb3BzLAogIHN0eWxlLAogIHRyYW5zaXRpb24KXQoKLyogICovCgovLyB0aGUgZGlyZWN0aXZlIG1vZHVsZSBzaG91bGQgYmUgYXBwbGllZCBsYXN0LCBhZnRlciBhbGwKLy8gYnVpbHQtaW4gbW9kdWxlcyBoYXZlIGJlZW4gYXBwbGllZC4KdmFyIG1vZHVsZXMgPSBwbGF0Zm9ybU1vZHVsZXMuY29uY2F0KGJhc2VNb2R1bGVzKTsKCnZhciBwYXRjaCA9IGNyZWF0ZVBhdGNoRnVuY3Rpb24oeyBub2RlT3BzOiBub2RlT3BzLCBtb2R1bGVzOiBtb2R1bGVzIH0pOwoKLyoqCiAqIE5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBsaWtlIGF0dGFjaGluZwogKiBwcm9wZXJ0aWVzIHRvIEVsZW1lbnRzLgogKi8KCi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwppZiAoaXNJRTkpIHsKICAvLyBodHRwOi8vd3d3Lm1hdHRzNDExLmNvbS9wb3N0L2ludGVybmV0LWV4cGxvcmVyLTktb25pbnB1dC8KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3Rpb25jaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICB2YXIgZWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50OwogICAgaWYgKGVsICYmIGVsLnZtb2RlbCkgewogICAgICB0cmlnZ2VyKGVsLCAnaW5wdXQnKTsKICAgIH0KICB9KTsKfQoKdmFyIGRpcmVjdGl2ZSA9IHsKICBpbnNlcnRlZDogZnVuY3Rpb24gaW5zZXJ0ZWQgKGVsLCBiaW5kaW5nLCB2bm9kZSwgb2xkVm5vZGUpIHsKICAgIGlmICh2bm9kZS50YWcgPT09ICdzZWxlY3QnKSB7CiAgICAgIC8vICM2OTAzCiAgICAgIGlmIChvbGRWbm9kZS5lbG0gJiYgIW9sZFZub2RlLmVsbS5fdk9wdGlvbnMpIHsKICAgICAgICBtZXJnZVZOb2RlSG9vayh2bm9kZSwgJ3Bvc3RwYXRjaCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGRpcmVjdGl2ZS5jb21wb25lbnRVcGRhdGVkKGVsLCBiaW5kaW5nLCB2bm9kZSk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLmNvbnRleHQpOwogICAgICB9CiAgICAgIGVsLl92T3B0aW9ucyA9IFtdLm1hcC5jYWxsKGVsLm9wdGlvbnMsIGdldFZhbHVlKTsKICAgIH0gZWxzZSBpZiAodm5vZGUudGFnID09PSAndGV4dGFyZWEnIHx8IGlzVGV4dElucHV0VHlwZShlbC50eXBlKSkgewogICAgICBlbC5fdk1vZGlmaWVycyA9IGJpbmRpbmcubW9kaWZpZXJzOwogICAgICBpZiAoIWJpbmRpbmcubW9kaWZpZXJzLmxhenkpIHsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb21wb3NpdGlvbnN0YXJ0Jywgb25Db21wb3NpdGlvblN0YXJ0KTsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb21wb3NpdGlvbmVuZCcsIG9uQ29tcG9zaXRpb25FbmQpOwogICAgICAgIC8vIFNhZmFyaSA8IDEwLjIgJiBVSVdlYlZpZXcgZG9lc24ndCBmaXJlIGNvbXBvc2l0aW9uZW5kIHdoZW4KICAgICAgICAvLyBzd2l0Y2hpbmcgZm9jdXMgYmVmb3JlIGNvbmZpcm1pbmcgY29tcG9zaXRpb24gY2hvaWNlCiAgICAgICAgLy8gdGhpcyBhbHNvIGZpeGVzIHRoZSBpc3N1ZSB3aGVyZSBzb21lIGJyb3dzZXJzIGUuZy4gaU9TIENocm9tZQogICAgICAgIC8vIGZpcmVzICJjaGFuZ2UiIGluc3RlYWQgb2YgImlucHV0IiBvbiBhdXRvY29tcGxldGUuCiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgb25Db21wb3NpdGlvbkVuZCk7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgaWYgKGlzSUU5KSB7CiAgICAgICAgICBlbC52bW9kZWwgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sCgogIGNvbXBvbmVudFVwZGF0ZWQ6IGZ1bmN0aW9uIGNvbXBvbmVudFVwZGF0ZWQgKGVsLCBiaW5kaW5nLCB2bm9kZSkgewogICAgaWYgKHZub2RlLnRhZyA9PT0gJ3NlbGVjdCcpIHsKICAgICAgc2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLmNvbnRleHQpOwogICAgICAvLyBpbiBjYXNlIHRoZSBvcHRpb25zIHJlbmRlcmVkIGJ5IHYtZm9yIGhhdmUgY2hhbmdlZCwKICAgICAgLy8gaXQncyBwb3NzaWJsZSB0aGF0IHRoZSB2YWx1ZSBpcyBvdXQtb2Ytc3luYyB3aXRoIHRoZSByZW5kZXJlZCBvcHRpb25zLgogICAgICAvLyBkZXRlY3Qgc3VjaCBjYXNlcyBhbmQgZmlsdGVyIG91dCB2YWx1ZXMgdGhhdCBubyBsb25nZXIgaGFzIGEgbWF0Y2hpbmcKICAgICAgLy8gb3B0aW9uIGluIHRoZSBET00uCiAgICAgIHZhciBwcmV2T3B0aW9ucyA9IGVsLl92T3B0aW9uczsKICAgICAgdmFyIGN1ck9wdGlvbnMgPSBlbC5fdk9wdGlvbnMgPSBbXS5tYXAuY2FsbChlbC5vcHRpb25zLCBnZXRWYWx1ZSk7CiAgICAgIGlmIChjdXJPcHRpb25zLnNvbWUoZnVuY3Rpb24gKG8sIGkpIHsgcmV0dXJuICFsb29zZUVxdWFsKG8sIHByZXZPcHRpb25zW2ldKTsgfSkpIHsKICAgICAgICAvLyB0cmlnZ2VyIGNoYW5nZSBldmVudCBpZgogICAgICAgIC8vIG5vIG1hdGNoaW5nIG9wdGlvbiBmb3VuZCBmb3IgYXQgbGVhc3Qgb25lIHZhbHVlCiAgICAgICAgdmFyIG5lZWRSZXNldCA9IGVsLm11bHRpcGxlCiAgICAgICAgICA/IGJpbmRpbmcudmFsdWUuc29tZShmdW5jdGlvbiAodikgeyByZXR1cm4gaGFzTm9NYXRjaGluZ09wdGlvbih2LCBjdXJPcHRpb25zKTsgfSkKICAgICAgICAgIDogYmluZGluZy52YWx1ZSAhPT0gYmluZGluZy5vbGRWYWx1ZSAmJiBoYXNOb01hdGNoaW5nT3B0aW9uKGJpbmRpbmcudmFsdWUsIGN1ck9wdGlvbnMpOwogICAgICAgIGlmIChuZWVkUmVzZXQpIHsKICAgICAgICAgIHRyaWdnZXIoZWwsICdjaGFuZ2UnKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn07CgpmdW5jdGlvbiBzZXRTZWxlY3RlZCAoZWwsIGJpbmRpbmcsIHZtKSB7CiAgYWN0dWFsbHlTZXRTZWxlY3RlZChlbCwgYmluZGluZywgdm0pOwogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0lFIHx8IGlzRWRnZSkgewogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgIGFjdHVhbGx5U2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZtKTsKICAgIH0sIDApOwogIH0KfQoKZnVuY3Rpb24gYWN0dWFsbHlTZXRTZWxlY3RlZCAoZWwsIGJpbmRpbmcsIHZtKSB7CiAgdmFyIHZhbHVlID0gYmluZGluZy52YWx1ZTsKICB2YXIgaXNNdWx0aXBsZSA9IGVsLm11bHRpcGxlOwogIGlmIChpc011bHRpcGxlICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICI8c2VsZWN0IG11bHRpcGxlIHYtbW9kZWw9XCIiICsgKGJpbmRpbmcuZXhwcmVzc2lvbikgKyAiXCI+ICIgKwogICAgICAiZXhwZWN0cyBhbiBBcnJheSB2YWx1ZSBmb3IgaXRzIGJpbmRpbmcsIGJ1dCBnb3QgIiArIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKSksCiAgICAgIHZtCiAgICApOwogICAgcmV0dXJuCiAgfQogIHZhciBzZWxlY3RlZCwgb3B0aW9uOwogIGZvciAodmFyIGkgPSAwLCBsID0gZWwub3B0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIG9wdGlvbiA9IGVsLm9wdGlvbnNbaV07CiAgICBpZiAoaXNNdWx0aXBsZSkgewogICAgICBzZWxlY3RlZCA9IGxvb3NlSW5kZXhPZih2YWx1ZSwgZ2V0VmFsdWUob3B0aW9uKSkgPiAtMTsKICAgICAgaWYgKG9wdGlvbi5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHsKICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBzZWxlY3RlZDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKGxvb3NlRXF1YWwoZ2V0VmFsdWUob3B0aW9uKSwgdmFsdWUpKSB7CiAgICAgICAgaWYgKGVsLnNlbGVjdGVkSW5kZXggIT09IGkpIHsKICAgICAgICAgIGVsLnNlbGVjdGVkSW5kZXggPSBpOwogICAgICAgIH0KICAgICAgICByZXR1cm4KICAgICAgfQogICAgfQogIH0KICBpZiAoIWlzTXVsdGlwbGUpIHsKICAgIGVsLnNlbGVjdGVkSW5kZXggPSAtMTsKICB9Cn0KCmZ1bmN0aW9uIGhhc05vTWF0Y2hpbmdPcHRpb24gKHZhbHVlLCBvcHRpb25zKSB7CiAgcmV0dXJuIG9wdGlvbnMuZXZlcnkoZnVuY3Rpb24gKG8pIHsgcmV0dXJuICFsb29zZUVxdWFsKG8sIHZhbHVlKTsgfSkKfQoKZnVuY3Rpb24gZ2V0VmFsdWUgKG9wdGlvbikgewogIHJldHVybiAnX3ZhbHVlJyBpbiBvcHRpb24KICAgID8gb3B0aW9uLl92YWx1ZQogICAgOiBvcHRpb24udmFsdWUKfQoKZnVuY3Rpb24gb25Db21wb3NpdGlvblN0YXJ0IChlKSB7CiAgZS50YXJnZXQuY29tcG9zaW5nID0gdHJ1ZTsKfQoKZnVuY3Rpb24gb25Db21wb3NpdGlvbkVuZCAoZSkgewogIC8vIHByZXZlbnQgdHJpZ2dlcmluZyBhbiBpbnB1dCBldmVudCBmb3Igbm8gcmVhc29uCiAgaWYgKCFlLnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuIH0KICBlLnRhcmdldC5jb21wb3NpbmcgPSBmYWxzZTsKICB0cmlnZ2VyKGUudGFyZ2V0LCAnaW5wdXQnKTsKfQoKZnVuY3Rpb24gdHJpZ2dlciAoZWwsIHR5cGUpIHsKICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7CiAgZS5pbml0RXZlbnQodHlwZSwgdHJ1ZSwgdHJ1ZSk7CiAgZWwuZGlzcGF0Y2hFdmVudChlKTsKfQoKLyogICovCgovLyByZWN1cnNpdmVseSBzZWFyY2ggZm9yIHBvc3NpYmxlIHRyYW5zaXRpb24gZGVmaW5lZCBpbnNpZGUgdGhlIGNvbXBvbmVudCByb290CmZ1bmN0aW9uIGxvY2F0ZU5vZGUgKHZub2RlKSB7CiAgcmV0dXJuIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICYmICghdm5vZGUuZGF0YSB8fCAhdm5vZGUuZGF0YS50cmFuc2l0aW9uKQogICAgPyBsb2NhdGVOb2RlKHZub2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSkKICAgIDogdm5vZGUKfQoKdmFyIHNob3cgPSB7CiAgYmluZDogZnVuY3Rpb24gYmluZCAoZWwsIHJlZiwgdm5vZGUpIHsKICAgIHZhciB2YWx1ZSA9IHJlZi52YWx1ZTsKCiAgICB2bm9kZSA9IGxvY2F0ZU5vZGUodm5vZGUpOwogICAgdmFyIHRyYW5zaXRpb24kJDEgPSB2bm9kZS5kYXRhICYmIHZub2RlLmRhdGEudHJhbnNpdGlvbjsKICAgIHZhciBvcmlnaW5hbERpc3BsYXkgPSBlbC5fX3ZPcmlnaW5hbERpc3BsYXkgPQogICAgICBlbC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnJyA6IGVsLnN0eWxlLmRpc3BsYXk7CiAgICBpZiAodmFsdWUgJiYgdHJhbnNpdGlvbiQkMSkgewogICAgICB2bm9kZS5kYXRhLnNob3cgPSB0cnVlOwogICAgICBlbnRlcih2bm9kZSwgZnVuY3Rpb24gKCkgewogICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSBvcmlnaW5hbERpc3BsYXk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IHZhbHVlID8gb3JpZ2luYWxEaXNwbGF5IDogJ25vbmUnOwogICAgfQogIH0sCgogIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlIChlbCwgcmVmLCB2bm9kZSkgewogICAgdmFyIHZhbHVlID0gcmVmLnZhbHVlOwogICAgdmFyIG9sZFZhbHVlID0gcmVmLm9sZFZhbHVlOwoKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKCF2YWx1ZSA9PT0gIW9sZFZhbHVlKSB7IHJldHVybiB9CiAgICB2bm9kZSA9IGxvY2F0ZU5vZGUodm5vZGUpOwogICAgdmFyIHRyYW5zaXRpb24kJDEgPSB2bm9kZS5kYXRhICYmIHZub2RlLmRhdGEudHJhbnNpdGlvbjsKICAgIGlmICh0cmFuc2l0aW9uJCQxKSB7CiAgICAgIHZub2RlLmRhdGEuc2hvdyA9IHRydWU7CiAgICAgIGlmICh2YWx1ZSkgewogICAgICAgIGVudGVyKHZub2RlLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gZWwuX192T3JpZ2luYWxEaXNwbGF5OwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGxlYXZlKHZub2RlLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIH0pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gdmFsdWUgPyBlbC5fX3ZPcmlnaW5hbERpc3BsYXkgOiAnbm9uZSc7CiAgICB9CiAgfSwKCiAgdW5iaW5kOiBmdW5jdGlvbiB1bmJpbmQgKAogICAgZWwsCiAgICBiaW5kaW5nLAogICAgdm5vZGUsCiAgICBvbGRWbm9kZSwKICAgIGlzRGVzdHJveQogICkgewogICAgaWYgKCFpc0Rlc3Ryb3kpIHsKICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IGVsLl9fdk9yaWdpbmFsRGlzcGxheTsKICAgIH0KICB9Cn0KCnZhciBwbGF0Zm9ybURpcmVjdGl2ZXMgPSB7CiAgbW9kZWw6IGRpcmVjdGl2ZSwKICBzaG93OiBzaG93Cn0KCi8qICAqLwoKLy8gUHJvdmlkZXMgdHJhbnNpdGlvbiBzdXBwb3J0IGZvciBhIHNpbmdsZSBlbGVtZW50L2NvbXBvbmVudC4KLy8gc3VwcG9ydHMgdHJhbnNpdGlvbiBtb2RlIChvdXQtaW4gLyBpbi1vdXQpCgp2YXIgdHJhbnNpdGlvblByb3BzID0gewogIG5hbWU6IFN0cmluZywKICBhcHBlYXI6IEJvb2xlYW4sCiAgY3NzOiBCb29sZWFuLAogIG1vZGU6IFN0cmluZywKICB0eXBlOiBTdHJpbmcsCiAgZW50ZXJDbGFzczogU3RyaW5nLAogIGxlYXZlQ2xhc3M6IFN0cmluZywKICBlbnRlclRvQ2xhc3M6IFN0cmluZywKICBsZWF2ZVRvQ2xhc3M6IFN0cmluZywKICBlbnRlckFjdGl2ZUNsYXNzOiBTdHJpbmcsCiAgbGVhdmVBY3RpdmVDbGFzczogU3RyaW5nLAogIGFwcGVhckNsYXNzOiBTdHJpbmcsCiAgYXBwZWFyQWN0aXZlQ2xhc3M6IFN0cmluZywKICBhcHBlYXJUb0NsYXNzOiBTdHJpbmcsCiAgZHVyYXRpb246IFtOdW1iZXIsIFN0cmluZywgT2JqZWN0XQp9OwoKLy8gaW4gY2FzZSB0aGUgY2hpbGQgaXMgYWxzbyBhbiBhYnN0cmFjdCBjb21wb25lbnQsIGUuZy4gPGtlZXAtYWxpdmU+Ci8vIHdlIHdhbnQgdG8gcmVjdXJzaXZlbHkgcmV0cmlldmUgdGhlIHJlYWwgY29tcG9uZW50IHRvIGJlIHJlbmRlcmVkCmZ1bmN0aW9uIGdldFJlYWxDaGlsZCAodm5vZGUpIHsKICB2YXIgY29tcE9wdGlvbnMgPSB2bm9kZSAmJiB2bm9kZS5jb21wb25lbnRPcHRpb25zOwogIGlmIChjb21wT3B0aW9ucyAmJiBjb21wT3B0aW9ucy5DdG9yLm9wdGlvbnMuYWJzdHJhY3QpIHsKICAgIHJldHVybiBnZXRSZWFsQ2hpbGQoZ2V0Rmlyc3RDb21wb25lbnRDaGlsZChjb21wT3B0aW9ucy5jaGlsZHJlbikpCiAgfSBlbHNlIHsKICAgIHJldHVybiB2bm9kZQogIH0KfQoKZnVuY3Rpb24gZXh0cmFjdFRyYW5zaXRpb25EYXRhIChjb21wKSB7CiAgdmFyIGRhdGEgPSB7fTsKICB2YXIgb3B0aW9ucyA9IGNvbXAuJG9wdGlvbnM7CiAgLy8gcHJvcHMKICBmb3IgKHZhciBrZXkgaW4gb3B0aW9ucy5wcm9wc0RhdGEpIHsKICAgIGRhdGFba2V5XSA9IGNvbXBba2V5XTsKICB9CiAgLy8gZXZlbnRzLgogIC8vIGV4dHJhY3QgbGlzdGVuZXJzIGFuZCBwYXNzIHRoZW0gZGlyZWN0bHkgdG8gdGhlIHRyYW5zaXRpb24gbWV0aG9kcwogIHZhciBsaXN0ZW5lcnMgPSBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7CiAgZm9yICh2YXIga2V5JDEgaW4gbGlzdGVuZXJzKSB7CiAgICBkYXRhW2NhbWVsaXplKGtleSQxKV0gPSBsaXN0ZW5lcnNba2V5JDFdOwogIH0KICByZXR1cm4gZGF0YQp9CgpmdW5jdGlvbiBwbGFjZWhvbGRlciAoaCwgcmF3Q2hpbGQpIHsKICBpZiAoL1xkLWtlZXAtYWxpdmUkLy50ZXN0KHJhd0NoaWxkLnRhZykpIHsKICAgIHJldHVybiBoKCdrZWVwLWFsaXZlJywgewogICAgICBwcm9wczogcmF3Q2hpbGQuY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGEKICAgIH0pCiAgfQp9CgpmdW5jdGlvbiBoYXNQYXJlbnRUcmFuc2l0aW9uICh2bm9kZSkgewogIHdoaWxlICgodm5vZGUgPSB2bm9kZS5wYXJlbnQpKSB7CiAgICBpZiAodm5vZGUuZGF0YS50cmFuc2l0aW9uKSB7CiAgICAgIHJldHVybiB0cnVlCiAgICB9CiAgfQp9CgpmdW5jdGlvbiBpc1NhbWVDaGlsZCAoY2hpbGQsIG9sZENoaWxkKSB7CiAgcmV0dXJuIG9sZENoaWxkLmtleSA9PT0gY2hpbGQua2V5ICYmIG9sZENoaWxkLnRhZyA9PT0gY2hpbGQudGFnCn0KCnZhciBUcmFuc2l0aW9uID0gewogIG5hbWU6ICd0cmFuc2l0aW9uJywKICBwcm9wczogdHJhbnNpdGlvblByb3BzLAogIGFic3RyYWN0OiB0cnVlLAoKICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoaCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIGNoaWxkcmVuID0gdGhpcy4kc2xvdHMuZGVmYXVsdDsKICAgIGlmICghY2hpbGRyZW4pIHsKICAgICAgcmV0dXJuCiAgICB9CgogICAgLy8gZmlsdGVyIG91dCB0ZXh0IG5vZGVzIChwb3NzaWJsZSB3aGl0ZXNwYWNlcykKICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLnRhZyB8fCBpc0FzeW5jUGxhY2Vob2xkZXIoYyk7IH0pOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoIWNoaWxkcmVuLmxlbmd0aCkgewogICAgICByZXR1cm4KICAgIH0KCiAgICAvLyB3YXJuIG11bHRpcGxlIGVsZW1lbnRzCiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNoaWxkcmVuLmxlbmd0aCA+IDEpIHsKICAgICAgd2FybigKICAgICAgICAnPHRyYW5zaXRpb24+IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBzaW5nbGUgZWxlbWVudC4gVXNlICcgKwogICAgICAgICc8dHJhbnNpdGlvbi1ncm91cD4gZm9yIGxpc3RzLicsCiAgICAgICAgdGhpcy4kcGFyZW50CiAgICAgICk7CiAgICB9CgogICAgdmFyIG1vZGUgPSB0aGlzLm1vZGU7CgogICAgLy8gd2FybiBpbnZhbGlkIG1vZGUKICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgbW9kZSAmJiBtb2RlICE9PSAnaW4tb3V0JyAmJiBtb2RlICE9PSAnb3V0LWluJwogICAgKSB7CiAgICAgIHdhcm4oCiAgICAgICAgJ2ludmFsaWQgPHRyYW5zaXRpb24+IG1vZGU6ICcgKyBtb2RlLAogICAgICAgIHRoaXMuJHBhcmVudAogICAgICApOwogICAgfQoKICAgIHZhciByYXdDaGlsZCA9IGNoaWxkcmVuWzBdOwoKICAgIC8vIGlmIHRoaXMgaXMgYSBjb21wb25lbnQgcm9vdCBub2RlIGFuZCB0aGUgY29tcG9uZW50J3MKICAgIC8vIHBhcmVudCBjb250YWluZXIgbm9kZSBhbHNvIGhhcyB0cmFuc2l0aW9uLCBza2lwLgogICAgaWYgKGhhc1BhcmVudFRyYW5zaXRpb24odGhpcy4kdm5vZGUpKSB7CiAgICAgIHJldHVybiByYXdDaGlsZAogICAgfQoKICAgIC8vIGFwcGx5IHRyYW5zaXRpb24gZGF0YSB0byBjaGlsZAogICAgLy8gdXNlIGdldFJlYWxDaGlsZCgpIHRvIGlnbm9yZSBhYnN0cmFjdCBjb21wb25lbnRzIGUuZy4ga2VlcC1hbGl2ZQogICAgdmFyIGNoaWxkID0gZ2V0UmVhbENoaWxkKHJhd0NoaWxkKTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKCFjaGlsZCkgewogICAgICByZXR1cm4gcmF3Q2hpbGQKICAgIH0KCiAgICBpZiAodGhpcy5fbGVhdmluZykgewogICAgICByZXR1cm4gcGxhY2Vob2xkZXIoaCwgcmF3Q2hpbGQpCiAgICB9CgogICAgLy8gZW5zdXJlIGEga2V5IHRoYXQgaXMgdW5pcXVlIHRvIHRoZSB2bm9kZSB0eXBlIGFuZCB0byB0aGlzIHRyYW5zaXRpb24KICAgIC8vIGNvbXBvbmVudCBpbnN0YW5jZS4gVGhpcyBrZXkgd2lsbCBiZSB1c2VkIHRvIHJlbW92ZSBwZW5kaW5nIGxlYXZpbmcgbm9kZXMKICAgIC8vIGR1cmluZyBlbnRlcmluZy4KICAgIHZhciBpZCA9ICJfX3RyYW5zaXRpb24tIiArICh0aGlzLl91aWQpICsgIi0iOwogICAgY2hpbGQua2V5ID0gY2hpbGQua2V5ID09IG51bGwKICAgICAgPyBjaGlsZC5pc0NvbW1lbnQKICAgICAgICA/IGlkICsgJ2NvbW1lbnQnCiAgICAgICAgOiBpZCArIGNoaWxkLnRhZwogICAgICA6IGlzUHJpbWl0aXZlKGNoaWxkLmtleSkKICAgICAgICA/IChTdHJpbmcoY2hpbGQua2V5KS5pbmRleE9mKGlkKSA9PT0gMCA/IGNoaWxkLmtleSA6IGlkICsgY2hpbGQua2V5KQogICAgICAgIDogY2hpbGQua2V5OwoKICAgIHZhciBkYXRhID0gKGNoaWxkLmRhdGEgfHwgKGNoaWxkLmRhdGEgPSB7fSkpLnRyYW5zaXRpb24gPSBleHRyYWN0VHJhbnNpdGlvbkRhdGEodGhpcyk7CiAgICB2YXIgb2xkUmF3Q2hpbGQgPSB0aGlzLl92bm9kZTsKICAgIHZhciBvbGRDaGlsZCA9IGdldFJlYWxDaGlsZChvbGRSYXdDaGlsZCk7CgogICAgLy8gbWFyayB2LXNob3cKICAgIC8vIHNvIHRoYXQgdGhlIHRyYW5zaXRpb24gbW9kdWxlIGNhbiBoYW5kIG92ZXIgdGhlIGNvbnRyb2wgdG8gdGhlIGRpcmVjdGl2ZQogICAgaWYgKGNoaWxkLmRhdGEuZGlyZWN0aXZlcyAmJiBjaGlsZC5kYXRhLmRpcmVjdGl2ZXMuc29tZShmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5uYW1lID09PSAnc2hvdyc7IH0pKSB7CiAgICAgIGNoaWxkLmRhdGEuc2hvdyA9IHRydWU7CiAgICB9CgogICAgaWYgKAogICAgICBvbGRDaGlsZCAmJgogICAgICBvbGRDaGlsZC5kYXRhICYmCiAgICAgICFpc1NhbWVDaGlsZChjaGlsZCwgb2xkQ2hpbGQpICYmCiAgICAgICFpc0FzeW5jUGxhY2Vob2xkZXIob2xkQ2hpbGQpICYmCiAgICAgIC8vICM2Njg3IGNvbXBvbmVudCByb290IGlzIGEgY29tbWVudCBub2RlCiAgICAgICEob2xkQ2hpbGQuY29tcG9uZW50SW5zdGFuY2UgJiYgb2xkQ2hpbGQuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlLmlzQ29tbWVudCkKICAgICkgewogICAgICAvLyByZXBsYWNlIG9sZCBjaGlsZCB0cmFuc2l0aW9uIGRhdGEgd2l0aCBmcmVzaCBvbmUKICAgICAgLy8gaW1wb3J0YW50IGZvciBkeW5hbWljIHRyYW5zaXRpb25zIQogICAgICB2YXIgb2xkRGF0YSA9IG9sZENoaWxkLmRhdGEudHJhbnNpdGlvbiA9IGV4dGVuZCh7fSwgZGF0YSk7CiAgICAgIC8vIGhhbmRsZSB0cmFuc2l0aW9uIG1vZGUKICAgICAgaWYgKG1vZGUgPT09ICdvdXQtaW4nKSB7CiAgICAgICAgLy8gcmV0dXJuIHBsYWNlaG9sZGVyIG5vZGUgYW5kIHF1ZXVlIHVwZGF0ZSB3aGVuIGxlYXZlIGZpbmlzaGVzCiAgICAgICAgdGhpcy5fbGVhdmluZyA9IHRydWU7CiAgICAgICAgbWVyZ2VWTm9kZUhvb2sob2xkRGF0YSwgJ2FmdGVyTGVhdmUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB0aGlzJDEuX2xlYXZpbmcgPSBmYWxzZTsKICAgICAgICAgIHRoaXMkMS4kZm9yY2VVcGRhdGUoKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcGxhY2Vob2xkZXIoaCwgcmF3Q2hpbGQpCiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2luLW91dCcpIHsKICAgICAgICBpZiAoaXNBc3luY1BsYWNlaG9sZGVyKGNoaWxkKSkgewogICAgICAgICAgcmV0dXJuIG9sZFJhd0NoaWxkCiAgICAgICAgfQogICAgICAgIHZhciBkZWxheWVkTGVhdmU7CiAgICAgICAgdmFyIHBlcmZvcm1MZWF2ZSA9IGZ1bmN0aW9uICgpIHsgZGVsYXllZExlYXZlKCk7IH07CiAgICAgICAgbWVyZ2VWTm9kZUhvb2soZGF0YSwgJ2FmdGVyRW50ZXInLCBwZXJmb3JtTGVhdmUpOwogICAgICAgIG1lcmdlVk5vZGVIb29rKGRhdGEsICdlbnRlckNhbmNlbGxlZCcsIHBlcmZvcm1MZWF2ZSk7CiAgICAgICAgbWVyZ2VWTm9kZUhvb2sob2xkRGF0YSwgJ2RlbGF5TGVhdmUnLCBmdW5jdGlvbiAobGVhdmUpIHsgZGVsYXllZExlYXZlID0gbGVhdmU7IH0pOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHJhd0NoaWxkCiAgfQp9CgovKiAgKi8KCi8vIFByb3ZpZGVzIHRyYW5zaXRpb24gc3VwcG9ydCBmb3IgbGlzdCBpdGVtcy4KLy8gc3VwcG9ydHMgbW92ZSB0cmFuc2l0aW9ucyB1c2luZyB0aGUgRkxJUCB0ZWNobmlxdWUuCgovLyBCZWNhdXNlIHRoZSB2ZG9tJ3MgY2hpbGRyZW4gdXBkYXRlIGFsZ29yaXRobSBpcyAidW5zdGFibGUiIC0gaS5lLgovLyBpdCBkb2Vzbid0IGd1YXJhbnRlZSB0aGUgcmVsYXRpdmUgcG9zaXRpb25pbmcgb2YgcmVtb3ZlZCBlbGVtZW50cywKLy8gd2UgZm9yY2UgdHJhbnNpdGlvbi1ncm91cCB0byB1cGRhdGUgaXRzIGNoaWxkcmVuIGludG8gdHdvIHBhc3NlczoKLy8gaW4gdGhlIGZpcnN0IHBhc3MsIHdlIHJlbW92ZSBhbGwgbm9kZXMgdGhhdCBuZWVkIHRvIGJlIHJlbW92ZWQsCi8vIHRyaWdnZXJpbmcgdGhlaXIgbGVhdmluZyB0cmFuc2l0aW9uOyBpbiB0aGUgc2Vjb25kIHBhc3MsIHdlIGluc2VydC9tb3ZlCi8vIGludG8gdGhlIGZpbmFsIGRlc2lyZWQgc3RhdGUuIFRoaXMgd2F5IGluIHRoZSBzZWNvbmQgcGFzcyByZW1vdmVkCi8vIG5vZGVzIHdpbGwgcmVtYWluIHdoZXJlIHRoZXkgc2hvdWxkIGJlLgoKdmFyIHByb3BzID0gZXh0ZW5kKHsKICB0YWc6IFN0cmluZywKICBtb3ZlQ2xhc3M6IFN0cmluZwp9LCB0cmFuc2l0aW9uUHJvcHMpOwoKZGVsZXRlIHByb3BzLm1vZGU7Cgp2YXIgVHJhbnNpdGlvbkdyb3VwID0gewogIHByb3BzOiBwcm9wcywKCiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKGgpIHsKICAgIHZhciB0YWcgPSB0aGlzLnRhZyB8fCB0aGlzLiR2bm9kZS5kYXRhLnRhZyB8fCAnc3Bhbic7CiAgICB2YXIgbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHZhciBwcmV2Q2hpbGRyZW4gPSB0aGlzLnByZXZDaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47CiAgICB2YXIgcmF3Q2hpbGRyZW4gPSB0aGlzLiRzbG90cy5kZWZhdWx0IHx8IFtdOwogICAgdmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgdmFyIHRyYW5zaXRpb25EYXRhID0gZXh0cmFjdFRyYW5zaXRpb25EYXRhKHRoaXMpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmF3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGMgPSByYXdDaGlsZHJlbltpXTsKICAgICAgaWYgKGMudGFnKSB7CiAgICAgICAgaWYgKGMua2V5ICE9IG51bGwgJiYgU3RyaW5nKGMua2V5KS5pbmRleE9mKCdfX3ZsaXN0JykgIT09IDApIHsKICAgICAgICAgIGNoaWxkcmVuLnB1c2goYyk7CiAgICAgICAgICBtYXBbYy5rZXldID0gYwogICAgICAgICAgOyhjLmRhdGEgfHwgKGMuZGF0YSA9IHt9KSkudHJhbnNpdGlvbiA9IHRyYW5zaXRpb25EYXRhOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgb3B0cyA9IGMuY29tcG9uZW50T3B0aW9uczsKICAgICAgICAgIHZhciBuYW1lID0gb3B0cyA/IChvcHRzLkN0b3Iub3B0aW9ucy5uYW1lIHx8IG9wdHMudGFnIHx8ICcnKSA6IGMudGFnOwogICAgICAgICAgd2FybigoIjx0cmFuc2l0aW9uLWdyb3VwPiBjaGlsZHJlbiBtdXN0IGJlIGtleWVkOiA8IiArIG5hbWUgKyAiPiIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAocHJldkNoaWxkcmVuKSB7CiAgICAgIHZhciBrZXB0ID0gW107CiAgICAgIHZhciByZW1vdmVkID0gW107CiAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IHByZXZDaGlsZHJlbi5sZW5ndGg7IGkkMSsrKSB7CiAgICAgICAgdmFyIGMkMSA9IHByZXZDaGlsZHJlbltpJDFdOwogICAgICAgIGMkMS5kYXRhLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uRGF0YTsKICAgICAgICBjJDEuZGF0YS5wb3MgPSBjJDEuZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGlmIChtYXBbYyQxLmtleV0pIHsKICAgICAgICAgIGtlcHQucHVzaChjJDEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZW1vdmVkLnB1c2goYyQxKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5rZXB0ID0gaCh0YWcsIG51bGwsIGtlcHQpOwogICAgICB0aGlzLnJlbW92ZWQgPSByZW1vdmVkOwogICAgfQoKICAgIHJldHVybiBoKHRhZywgbnVsbCwgY2hpbGRyZW4pCiAgfSwKCiAgYmVmb3JlVXBkYXRlOiBmdW5jdGlvbiBiZWZvcmVVcGRhdGUgKCkgewogICAgLy8gZm9yY2UgcmVtb3ZpbmcgcGFzcwogICAgdGhpcy5fX3BhdGNoX18oCiAgICAgIHRoaXMuX3Zub2RlLAogICAgICB0aGlzLmtlcHQsCiAgICAgIGZhbHNlLCAvLyBoeWRyYXRpbmcKICAgICAgdHJ1ZSAvLyByZW1vdmVPbmx5ICghaW1wb3J0YW50LCBhdm9pZHMgdW5uZWNlc3NhcnkgbW92ZXMpCiAgICApOwogICAgdGhpcy5fdm5vZGUgPSB0aGlzLmtlcHQ7CiAgfSwKCiAgdXBkYXRlZDogZnVuY3Rpb24gdXBkYXRlZCAoKSB7CiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByZXZDaGlsZHJlbjsKICAgIHZhciBtb3ZlQ2xhc3MgPSB0aGlzLm1vdmVDbGFzcyB8fCAoKHRoaXMubmFtZSB8fCAndicpICsgJy1tb3ZlJyk7CiAgICBpZiAoIWNoaWxkcmVuLmxlbmd0aCB8fCAhdGhpcy5oYXNNb3ZlKGNoaWxkcmVuWzBdLmVsbSwgbW92ZUNsYXNzKSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICAvLyB3ZSBkaXZpZGUgdGhlIHdvcmsgaW50byB0aHJlZSBsb29wcyB0byBhdm9pZCBtaXhpbmcgRE9NIHJlYWRzIGFuZCB3cml0ZXMKICAgIC8vIGluIGVhY2ggaXRlcmF0aW9uIC0gd2hpY2ggaGVscHMgcHJldmVudCBsYXlvdXQgdGhyYXNoaW5nLgogICAgY2hpbGRyZW4uZm9yRWFjaChjYWxsUGVuZGluZ0Nicyk7CiAgICBjaGlsZHJlbi5mb3JFYWNoKHJlY29yZFBvc2l0aW9uKTsKICAgIGNoaWxkcmVuLmZvckVhY2goYXBwbHlUcmFuc2xhdGlvbik7CgogICAgLy8gZm9yY2UgcmVmbG93IHRvIHB1dCBldmVyeXRoaW5nIGluIHBvc2l0aW9uCiAgICAvLyBhc3NpZ24gdG8gdGhpcyB0byBhdm9pZCBiZWluZyByZW1vdmVkIGluIHRyZWUtc2hha2luZwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICB0aGlzLl9yZWZsb3cgPSBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodDsKCiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7CiAgICAgIGlmIChjLmRhdGEubW92ZWQpIHsKICAgICAgICB2YXIgZWwgPSBjLmVsbTsKICAgICAgICB2YXIgcyA9IGVsLnN0eWxlOwogICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbW92ZUNsYXNzKTsKICAgICAgICBzLnRyYW5zZm9ybSA9IHMuV2Via2l0VHJhbnNmb3JtID0gcy50cmFuc2l0aW9uRHVyYXRpb24gPSAnJzsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKHRyYW5zaXRpb25FbmRFdmVudCwgZWwuX21vdmVDYiA9IGZ1bmN0aW9uIGNiIChlKSB7CiAgICAgICAgICBpZiAoIWUgfHwgL3RyYW5zZm9ybSQvLnRlc3QoZS5wcm9wZXJ0eU5hbWUpKSB7CiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJhbnNpdGlvbkVuZEV2ZW50LCBjYik7CiAgICAgICAgICAgIGVsLl9tb3ZlQ2IgPSBudWxsOwogICAgICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIG1vdmVDbGFzcyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogIH0sCgogIG1ldGhvZHM6IHsKICAgIGhhc01vdmU6IGZ1bmN0aW9uIGhhc01vdmUgKGVsLCBtb3ZlQ2xhc3MpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICghaGFzVHJhbnNpdGlvbikgewogICAgICAgIHJldHVybiBmYWxzZQogICAgICB9CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAodGhpcy5faGFzTW92ZSkgewogICAgICAgIHJldHVybiB0aGlzLl9oYXNNb3ZlCiAgICAgIH0KICAgICAgLy8gRGV0ZWN0IHdoZXRoZXIgYW4gZWxlbWVudCB3aXRoIHRoZSBtb3ZlIGNsYXNzIGFwcGxpZWQgaGFzCiAgICAgIC8vIENTUyB0cmFuc2l0aW9ucy4gU2luY2UgdGhlIGVsZW1lbnQgbWF5IGJlIGluc2lkZSBhbiBlbnRlcmluZwogICAgICAvLyB0cmFuc2l0aW9uIGF0IHRoaXMgdmVyeSBtb21lbnQsIHdlIG1ha2UgYSBjbG9uZSBvZiBpdCBhbmQgcmVtb3ZlCiAgICAgIC8vIGFsbCBvdGhlciB0cmFuc2l0aW9uIGNsYXNzZXMgYXBwbGllZCB0byBlbnN1cmUgb25seSB0aGUgbW92ZSBjbGFzcwogICAgICAvLyBpcyBhcHBsaWVkLgogICAgICB2YXIgY2xvbmUgPSBlbC5jbG9uZU5vZGUoKTsKICAgICAgaWYgKGVsLl90cmFuc2l0aW9uQ2xhc3NlcykgewogICAgICAgIGVsLl90cmFuc2l0aW9uQ2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uIChjbHMpIHsgcmVtb3ZlQ2xhc3MoY2xvbmUsIGNscyk7IH0pOwogICAgICB9CiAgICAgIGFkZENsYXNzKGNsb25lLCBtb3ZlQ2xhc3MpOwogICAgICBjbG9uZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICB0aGlzLiRlbC5hcHBlbmRDaGlsZChjbG9uZSk7CiAgICAgIHZhciBpbmZvID0gZ2V0VHJhbnNpdGlvbkluZm8oY2xvbmUpOwogICAgICB0aGlzLiRlbC5yZW1vdmVDaGlsZChjbG9uZSk7CiAgICAgIHJldHVybiAodGhpcy5faGFzTW92ZSA9IGluZm8uaGFzVHJhbnNmb3JtKQogICAgfQogIH0KfQoKZnVuY3Rpb24gY2FsbFBlbmRpbmdDYnMgKGMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoYy5lbG0uX21vdmVDYikgewogICAgYy5lbG0uX21vdmVDYigpOwogIH0KICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoYy5lbG0uX2VudGVyQ2IpIHsKICAgIGMuZWxtLl9lbnRlckNiKCk7CiAgfQp9CgpmdW5jdGlvbiByZWNvcmRQb3NpdGlvbiAoYykgewogIGMuZGF0YS5uZXdQb3MgPSBjLmVsbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKfQoKZnVuY3Rpb24gYXBwbHlUcmFuc2xhdGlvbiAoYykgewogIHZhciBvbGRQb3MgPSBjLmRhdGEucG9zOwogIHZhciBuZXdQb3MgPSBjLmRhdGEubmV3UG9zOwogIHZhciBkeCA9IG9sZFBvcy5sZWZ0IC0gbmV3UG9zLmxlZnQ7CiAgdmFyIGR5ID0gb2xkUG9zLnRvcCAtIG5ld1Bvcy50b3A7CiAgaWYgKGR4IHx8IGR5KSB7CiAgICBjLmRhdGEubW92ZWQgPSB0cnVlOwogICAgdmFyIHMgPSBjLmVsbS5zdHlsZTsKICAgIHMudHJhbnNmb3JtID0gcy5XZWJraXRUcmFuc2Zvcm0gPSAidHJhbnNsYXRlKCIgKyBkeCArICJweCwiICsgZHkgKyAicHgpIjsKICAgIHMudHJhbnNpdGlvbkR1cmF0aW9uID0gJzBzJzsKICB9Cn0KCnZhciBwbGF0Zm9ybUNvbXBvbmVudHMgPSB7CiAgVHJhbnNpdGlvbjogVHJhbnNpdGlvbiwKICBUcmFuc2l0aW9uR3JvdXA6IFRyYW5zaXRpb25Hcm91cAp9CgovKiAgKi8KCi8vIGluc3RhbGwgcGxhdGZvcm0gc3BlY2lmaWMgdXRpbHMKVnVlLmNvbmZpZy5tdXN0VXNlUHJvcCA9IG11c3RVc2VQcm9wOwpWdWUuY29uZmlnLmlzUmVzZXJ2ZWRUYWcgPSBpc1Jlc2VydmVkVGFnOwpWdWUuY29uZmlnLmlzUmVzZXJ2ZWRBdHRyID0gaXNSZXNlcnZlZEF0dHI7ClZ1ZS5jb25maWcuZ2V0VGFnTmFtZXNwYWNlID0gZ2V0VGFnTmFtZXNwYWNlOwpWdWUuY29uZmlnLmlzVW5rbm93bkVsZW1lbnQgPSBpc1Vua25vd25FbGVtZW50OwoKLy8gaW5zdGFsbCBwbGF0Zm9ybSBydW50aW1lIGRpcmVjdGl2ZXMgJiBjb21wb25lbnRzCmV4dGVuZChWdWUub3B0aW9ucy5kaXJlY3RpdmVzLCBwbGF0Zm9ybURpcmVjdGl2ZXMpOwpleHRlbmQoVnVlLm9wdGlvbnMuY29tcG9uZW50cywgcGxhdGZvcm1Db21wb25lbnRzKTsKCi8vIGluc3RhbGwgcGxhdGZvcm0gcGF0Y2ggZnVuY3Rpb24KVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gPSBpbkJyb3dzZXIgPyBwYXRjaCA6IG5vb3A7CgovLyBwdWJsaWMgbW91bnQgbWV0aG9kClZ1ZS5wcm90b3R5cGUuJG1vdW50ID0gZnVuY3Rpb24gKAogIGVsLAogIGh5ZHJhdGluZwopIHsKICBlbCA9IGVsICYmIGluQnJvd3NlciA/IHF1ZXJ5KGVsKSA6IHVuZGVmaW5lZDsKICByZXR1cm4gbW91bnRDb21wb25lbnQodGhpcywgZWwsIGh5ZHJhdGluZykKfTsKCi8vIGRldnRvb2xzIGdsb2JhbCBob29rCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCmlmIChpbkJyb3dzZXIpIHsKICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgIGlmIChjb25maWcuZGV2dG9vbHMpIHsKICAgICAgaWYgKGRldnRvb2xzKSB7CiAgICAgICAgZGV2dG9vbHMuZW1pdCgnaW5pdCcsIFZ1ZSk7CiAgICAgIH0gZWxzZSBpZiAoCiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmCiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Rlc3QnICYmCiAgICAgICAgaXNDaHJvbWUKICAgICAgKSB7CiAgICAgICAgY29uc29sZVtjb25zb2xlLmluZm8gPyAnaW5mbycgOiAnbG9nJ10oCiAgICAgICAgICAnRG93bmxvYWQgdGhlIFZ1ZSBEZXZ0b29scyBleHRlbnNpb24gZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6XG4nICsKICAgICAgICAgICdodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLWRldnRvb2xzJwogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Rlc3QnICYmCiAgICAgIGNvbmZpZy5wcm9kdWN0aW9uVGlwICE9PSBmYWxzZSAmJgogICAgICB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcKICAgICkgewogICAgICBjb25zb2xlW2NvbnNvbGUuaW5mbyA/ICdpbmZvJyA6ICdsb2cnXSgKICAgICAgICAiWW91IGFyZSBydW5uaW5nIFZ1ZSBpbiBkZXZlbG9wbWVudCBtb2RlLlxuIiArCiAgICAgICAgIk1ha2Ugc3VyZSB0byB0dXJuIG9uIHByb2R1Y3Rpb24gbW9kZSB3aGVuIGRlcGxveWluZyBmb3IgcHJvZHVjdGlvbi5cbiIgKwogICAgICAgICJTZWUgbW9yZSB0aXBzIGF0IGh0dHBzOi8vdnVlanMub3JnL2d1aWRlL2RlcGxveW1lbnQuaHRtbCIKICAgICAgKTsKICAgIH0KICB9LCAwKTsKfQoKLyogICovCgp2YXIgZGVmYXVsdFRhZ1JFID0gL1x7XHsoKD86LnxcbikrPylcfVx9L2c7CnZhciByZWdleEVzY2FwZVJFID0gL1stLiorP14ke30oKXxbXF1cL1xcXS9nOwoKdmFyIGJ1aWxkUmVnZXggPSBjYWNoZWQoZnVuY3Rpb24gKGRlbGltaXRlcnMpIHsKICB2YXIgb3BlbiA9IGRlbGltaXRlcnNbMF0ucmVwbGFjZShyZWdleEVzY2FwZVJFLCAnXFwkJicpOwogIHZhciBjbG9zZSA9IGRlbGltaXRlcnNbMV0ucmVwbGFjZShyZWdleEVzY2FwZVJFLCAnXFwkJicpOwogIHJldHVybiBuZXcgUmVnRXhwKG9wZW4gKyAnKCg/Oi58XFxuKSs/KScgKyBjbG9zZSwgJ2cnKQp9KTsKCgoKZnVuY3Rpb24gcGFyc2VUZXh0ICgKICB0ZXh0LAogIGRlbGltaXRlcnMKKSB7CiAgdmFyIHRhZ1JFID0gZGVsaW1pdGVycyA/IGJ1aWxkUmVnZXgoZGVsaW1pdGVycykgOiBkZWZhdWx0VGFnUkU7CiAgaWYgKCF0YWdSRS50ZXN0KHRleHQpKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIHRva2VucyA9IFtdOwogIHZhciByYXdUb2tlbnMgPSBbXTsKICB2YXIgbGFzdEluZGV4ID0gdGFnUkUubGFzdEluZGV4ID0gMDsKICB2YXIgbWF0Y2gsIGluZGV4LCB0b2tlblZhbHVlOwogIHdoaWxlICgobWF0Y2ggPSB0YWdSRS5leGVjKHRleHQpKSkgewogICAgaW5kZXggPSBtYXRjaC5pbmRleDsKICAgIC8vIHB1c2ggdGV4dCB0b2tlbgogICAgaWYgKGluZGV4ID4gbGFzdEluZGV4KSB7CiAgICAgIHJhd1Rva2Vucy5wdXNoKHRva2VuVmFsdWUgPSB0ZXh0LnNsaWNlKGxhc3RJbmRleCwgaW5kZXgpKTsKICAgICAgdG9rZW5zLnB1c2goSlNPTi5zdHJpbmdpZnkodG9rZW5WYWx1ZSkpOwogICAgfQogICAgLy8gdGFnIHRva2VuCiAgICB2YXIgZXhwID0gcGFyc2VGaWx0ZXJzKG1hdGNoWzFdLnRyaW0oKSk7CiAgICB0b2tlbnMucHVzaCgoIl9zKCIgKyBleHAgKyAiKSIpKTsKICAgIHJhd1Rva2Vucy5wdXNoKHsgJ0BiaW5kaW5nJzogZXhwIH0pOwogICAgbGFzdEluZGV4ID0gaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7CiAgfQogIGlmIChsYXN0SW5kZXggPCB0ZXh0Lmxlbmd0aCkgewogICAgcmF3VG9rZW5zLnB1c2godG9rZW5WYWx1ZSA9IHRleHQuc2xpY2UobGFzdEluZGV4KSk7CiAgICB0b2tlbnMucHVzaChKU09OLnN0cmluZ2lmeSh0b2tlblZhbHVlKSk7CiAgfQogIHJldHVybiB7CiAgICBleHByZXNzaW9uOiB0b2tlbnMuam9pbignKycpLAogICAgdG9rZW5zOiByYXdUb2tlbnMKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gdHJhbnNmb3JtTm9kZSAoZWwsIG9wdGlvbnMpIHsKICB2YXIgd2FybiA9IG9wdGlvbnMud2FybiB8fCBiYXNlV2FybjsKICB2YXIgc3RhdGljQ2xhc3MgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnY2xhc3MnKTsKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHN0YXRpY0NsYXNzKSB7CiAgICB2YXIgcmVzID0gcGFyc2VUZXh0KHN0YXRpY0NsYXNzLCBvcHRpb25zLmRlbGltaXRlcnMpOwogICAgaWYgKHJlcykgewogICAgICB3YXJuKAogICAgICAgICJjbGFzcz1cIiIgKyBzdGF0aWNDbGFzcyArICJcIjogIiArCiAgICAgICAgJ0ludGVycG9sYXRpb24gaW5zaWRlIGF0dHJpYnV0ZXMgaGFzIGJlZW4gcmVtb3ZlZC4gJyArCiAgICAgICAgJ1VzZSB2LWJpbmQgb3IgdGhlIGNvbG9uIHNob3J0aGFuZCBpbnN0ZWFkLiBGb3IgZXhhbXBsZSwgJyArCiAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBjbGFzcz0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDpjbGFzcz0idmFsIj4uJwogICAgICApOwogICAgfQogIH0KICBpZiAoc3RhdGljQ2xhc3MpIHsKICAgIGVsLnN0YXRpY0NsYXNzID0gSlNPTi5zdHJpbmdpZnkoc3RhdGljQ2xhc3MpOwogIH0KICB2YXIgY2xhc3NCaW5kaW5nID0gZ2V0QmluZGluZ0F0dHIoZWwsICdjbGFzcycsIGZhbHNlIC8qIGdldFN0YXRpYyAqLyk7CiAgaWYgKGNsYXNzQmluZGluZykgewogICAgZWwuY2xhc3NCaW5kaW5nID0gY2xhc3NCaW5kaW5nOwogIH0KfQoKZnVuY3Rpb24gZ2VuRGF0YSAoZWwpIHsKICB2YXIgZGF0YSA9ICcnOwogIGlmIChlbC5zdGF0aWNDbGFzcykgewogICAgZGF0YSArPSAic3RhdGljQ2xhc3M6IiArIChlbC5zdGF0aWNDbGFzcykgKyAiLCI7CiAgfQogIGlmIChlbC5jbGFzc0JpbmRpbmcpIHsKICAgIGRhdGEgKz0gImNsYXNzOiIgKyAoZWwuY2xhc3NCaW5kaW5nKSArICIsIjsKICB9CiAgcmV0dXJuIGRhdGEKfQoKdmFyIGtsYXNzJDEgPSB7CiAgc3RhdGljS2V5czogWydzdGF0aWNDbGFzcyddLAogIHRyYW5zZm9ybU5vZGU6IHRyYW5zZm9ybU5vZGUsCiAgZ2VuRGF0YTogZ2VuRGF0YQp9CgovKiAgKi8KCmZ1bmN0aW9uIHRyYW5zZm9ybU5vZGUkMSAoZWwsIG9wdGlvbnMpIHsKICB2YXIgd2FybiA9IG9wdGlvbnMud2FybiB8fCBiYXNlV2FybjsKICB2YXIgc3RhdGljU3R5bGUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc3R5bGUnKTsKICBpZiAoc3RhdGljU3R5bGUpIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgewogICAgICB2YXIgcmVzID0gcGFyc2VUZXh0KHN0YXRpY1N0eWxlLCBvcHRpb25zLmRlbGltaXRlcnMpOwogICAgICBpZiAocmVzKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJzdHlsZT1cIiIgKyBzdGF0aWNTdHlsZSArICJcIjogIiArCiAgICAgICAgICAnSW50ZXJwb2xhdGlvbiBpbnNpZGUgYXR0cmlidXRlcyBoYXMgYmVlbiByZW1vdmVkLiAnICsKICAgICAgICAgICdVc2Ugdi1iaW5kIG9yIHRoZSBjb2xvbiBzaG9ydGhhbmQgaW5zdGVhZC4gRm9yIGV4YW1wbGUsICcgKwogICAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBzdHlsZT0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDpzdHlsZT0idmFsIj4uJwogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIGVsLnN0YXRpY1N0eWxlID0gSlNPTi5zdHJpbmdpZnkocGFyc2VTdHlsZVRleHQoc3RhdGljU3R5bGUpKTsKICB9CgogIHZhciBzdHlsZUJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ3N0eWxlJywgZmFsc2UgLyogZ2V0U3RhdGljICovKTsKICBpZiAoc3R5bGVCaW5kaW5nKSB7CiAgICBlbC5zdHlsZUJpbmRpbmcgPSBzdHlsZUJpbmRpbmc7CiAgfQp9CgpmdW5jdGlvbiBnZW5EYXRhJDEgKGVsKSB7CiAgdmFyIGRhdGEgPSAnJzsKICBpZiAoZWwuc3RhdGljU3R5bGUpIHsKICAgIGRhdGEgKz0gInN0YXRpY1N0eWxlOiIgKyAoZWwuc3RhdGljU3R5bGUpICsgIiwiOwogIH0KICBpZiAoZWwuc3R5bGVCaW5kaW5nKSB7CiAgICBkYXRhICs9ICJzdHlsZTooIiArIChlbC5zdHlsZUJpbmRpbmcpICsgIiksIjsKICB9CiAgcmV0dXJuIGRhdGEKfQoKdmFyIHN0eWxlJDEgPSB7CiAgc3RhdGljS2V5czogWydzdGF0aWNTdHlsZSddLAogIHRyYW5zZm9ybU5vZGU6IHRyYW5zZm9ybU5vZGUkMSwKICBnZW5EYXRhOiBnZW5EYXRhJDEKfQoKLyogICovCgp2YXIgZGVjb2RlcjsKCnZhciBoZSA9IHsKICBkZWNvZGU6IGZ1bmN0aW9uIGRlY29kZSAoaHRtbCkgewogICAgZGVjb2RlciA9IGRlY29kZXIgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBkZWNvZGVyLmlubmVySFRNTCA9IGh0bWw7CiAgICByZXR1cm4gZGVjb2Rlci50ZXh0Q29udGVudAogIH0KfQoKLyogICovCgp2YXIgaXNVbmFyeVRhZyA9IG1ha2VNYXAoCiAgJ2FyZWEsYmFzZSxicixjb2wsZW1iZWQsZnJhbWUsaHIsaW1nLGlucHV0LGlzaW5kZXgsa2V5Z2VuLCcgKwogICdsaW5rLG1ldGEscGFyYW0sc291cmNlLHRyYWNrLHdicicKKTsKCi8vIEVsZW1lbnRzIHRoYXQgeW91IGNhbiwgaW50ZW50aW9uYWxseSwgbGVhdmUgb3BlbgovLyAoYW5kIHdoaWNoIGNsb3NlIHRoZW1zZWx2ZXMpCnZhciBjYW5CZUxlZnRPcGVuVGFnID0gbWFrZU1hcCgKICAnY29sZ3JvdXAsZGQsZHQsbGksb3B0aW9ucyxwLHRkLHRmb290LHRoLHRoZWFkLHRyLHNvdXJjZScKKTsKCi8vIEhUTUw1IHRhZ3MgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvaW5kaWNlcy5odG1sI2VsZW1lbnRzLTMKLy8gUGhyYXNpbmcgQ29udGVudCBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9kb20uaHRtbCNwaHJhc2luZy1jb250ZW50CnZhciBpc05vblBocmFzaW5nVGFnID0gbWFrZU1hcCgKICAnYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGJhc2UsYmxvY2txdW90ZSxib2R5LGNhcHRpb24sY29sLGNvbGdyb3VwLGRkLCcgKwogICdkZXRhaWxzLGRpYWxvZyxkaXYsZGwsZHQsZmllbGRzZXQsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGZvcm0sJyArCiAgJ2gxLGgyLGgzLGg0LGg1LGg2LGhlYWQsaGVhZGVyLGhncm91cCxocixodG1sLGxlZ2VuZCxsaSxtZW51aXRlbSxtZXRhLCcgKwogICdvcHRncm91cCxvcHRpb24scGFyYW0scnAscnQsc291cmNlLHN0eWxlLHN1bW1hcnksdGJvZHksdGQsdGZvb3QsdGgsdGhlYWQsJyArCiAgJ3RpdGxlLHRyLHRyYWNrJwopOwoKLyoqCiAqIE5vdCB0eXBlLWNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGl0J3MgbW9zdGx5IHZlbmRvciBjb2RlLgogKi8KCi8qIQogKiBIVE1MIFBhcnNlciBCeSBKb2huIFJlc2lnIChlam9obi5vcmcpCiAqIE1vZGlmaWVkIGJ5IEp1cml5ICJrYW5nYXgiIFpheXRzZXYKICogT3JpZ2luYWwgY29kZSBieSBFcmlrIEFydmlkc3NvbiwgTW96aWxsYSBQdWJsaWMgTGljZW5zZQogKiBodHRwOi8vZXJpay5lYWUubmV0L3NpbXBsZWh0bWxwYXJzZXIvc2ltcGxlaHRtbHBhcnNlci5qcwogKi8KCi8vIFJlZ3VsYXIgRXhwcmVzc2lvbnMgZm9yIHBhcnNpbmcgdGFncyBhbmQgYXR0cmlidXRlcwp2YXIgYXR0cmlidXRlID0gL15ccyooW15ccyInPD5cLz1dKykoPzpccyooPSlccyooPzoiKFteIl0qKSIrfCcoW14nXSopJyt8KFteXHMiJz08PmBdKykpKT8vOwovLyBjb3VsZCB1c2UgaHR0cHM6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLXhtbC1uYW1lcy0xOTk5MDExNC8jTlQtUU5hbWUKLy8gYnV0IGZvciBWdWUgdGVtcGxhdGVzIHdlIGNhbiBlbmZvcmNlIGEgc2ltcGxlIGNoYXJzZXQKdmFyIG5jbmFtZSA9ICdbYS16QS1aX11bXFx3XFwtXFwuXSonOwp2YXIgcW5hbWVDYXB0dXJlID0gIigoPzoiICsgbmNuYW1lICsgIlxcOik/IiArIG5jbmFtZSArICIpIjsKdmFyIHN0YXJ0VGFnT3BlbiA9IG5ldyBSZWdFeHAoKCJePCIgKyBxbmFtZUNhcHR1cmUpKTsKdmFyIHN0YXJ0VGFnQ2xvc2UgPSAvXlxzKihcLz8pPi87CnZhciBlbmRUYWcgPSBuZXcgUmVnRXhwKCgiXjxcXC8iICsgcW5hbWVDYXB0dXJlICsgIltePl0qPiIpKTsKdmFyIGRvY3R5cGUgPSAvXjwhRE9DVFlQRSBbXj5dKz4vaTsKLy8gIzcyOTg6IGVzY2FwZSAtIHRvIGF2b2lkIGJlaW5nIHBhc2VkIGFzIEhUTUwgY29tbWVudCB3aGVuIGlubGluZWQgaW4gcGFnZQp2YXIgY29tbWVudCA9IC9ePCFcLS0vOwp2YXIgY29uZGl0aW9uYWxDb21tZW50ID0gL148IVxbLzsKCnZhciBJU19SRUdFWF9DQVBUVVJJTkdfQlJPS0VOID0gZmFsc2U7Cid4Jy5yZXBsYWNlKC94KC4pPy9nLCBmdW5jdGlvbiAobSwgZykgewogIElTX1JFR0VYX0NBUFRVUklOR19CUk9LRU4gPSBnID09PSAnJzsKfSk7CgovLyBTcGVjaWFsIEVsZW1lbnRzIChjYW4gY29udGFpbiBhbnl0aGluZykKdmFyIGlzUGxhaW5UZXh0RWxlbWVudCA9IG1ha2VNYXAoJ3NjcmlwdCxzdHlsZSx0ZXh0YXJlYScsIHRydWUpOwp2YXIgcmVDYWNoZSA9IHt9OwoKdmFyIGRlY29kaW5nTWFwID0gewogICcmbHQ7JzogJzwnLAogICcmZ3Q7JzogJz4nLAogICcmcXVvdDsnOiAnIicsCiAgJyZhbXA7JzogJyYnLAogICcmIzEwOyc6ICdcbicsCiAgJyYjOTsnOiAnXHQnCn07CnZhciBlbmNvZGVkQXR0ciA9IC8mKD86bHR8Z3R8cXVvdHxhbXApOy9nOwp2YXIgZW5jb2RlZEF0dHJXaXRoTmV3TGluZXMgPSAvJig/Omx0fGd0fHF1b3R8YW1wfCMxMHwjOSk7L2c7CgovLyAjNTk5Mgp2YXIgaXNJZ25vcmVOZXdsaW5lVGFnID0gbWFrZU1hcCgncHJlLHRleHRhcmVhJywgdHJ1ZSk7CnZhciBzaG91bGRJZ25vcmVGaXJzdE5ld2xpbmUgPSBmdW5jdGlvbiAodGFnLCBodG1sKSB7IHJldHVybiB0YWcgJiYgaXNJZ25vcmVOZXdsaW5lVGFnKHRhZykgJiYgaHRtbFswXSA9PT0gJ1xuJzsgfTsKCmZ1bmN0aW9uIGRlY29kZUF0dHIgKHZhbHVlLCBzaG91bGREZWNvZGVOZXdsaW5lcykgewogIHZhciByZSA9IHNob3VsZERlY29kZU5ld2xpbmVzID8gZW5jb2RlZEF0dHJXaXRoTmV3TGluZXMgOiBlbmNvZGVkQXR0cjsKICByZXR1cm4gdmFsdWUucmVwbGFjZShyZSwgZnVuY3Rpb24gKG1hdGNoKSB7IHJldHVybiBkZWNvZGluZ01hcFttYXRjaF07IH0pCn0KCmZ1bmN0aW9uIHBhcnNlSFRNTCAoaHRtbCwgb3B0aW9ucykgewogIHZhciBzdGFjayA9IFtdOwogIHZhciBleHBlY3RIVE1MID0gb3B0aW9ucy5leHBlY3RIVE1MOwogIHZhciBpc1VuYXJ5VGFnJCQxID0gb3B0aW9ucy5pc1VuYXJ5VGFnIHx8IG5vOwogIHZhciBjYW5CZUxlZnRPcGVuVGFnJCQxID0gb3B0aW9ucy5jYW5CZUxlZnRPcGVuVGFnIHx8IG5vOwogIHZhciBpbmRleCA9IDA7CiAgdmFyIGxhc3QsIGxhc3RUYWc7CiAgd2hpbGUgKGh0bWwpIHsKICAgIGxhc3QgPSBodG1sOwogICAgLy8gTWFrZSBzdXJlIHdlJ3JlIG5vdCBpbiBhIHBsYWludGV4dCBjb250ZW50IGVsZW1lbnQgbGlrZSBzY3JpcHQvc3R5bGUKICAgIGlmICghbGFzdFRhZyB8fCAhaXNQbGFpblRleHRFbGVtZW50KGxhc3RUYWcpKSB7CiAgICAgIHZhciB0ZXh0RW5kID0gaHRtbC5pbmRleE9mKCc8Jyk7CiAgICAgIGlmICh0ZXh0RW5kID09PSAwKSB7CiAgICAgICAgLy8gQ29tbWVudDoKICAgICAgICBpZiAoY29tbWVudC50ZXN0KGh0bWwpKSB7CiAgICAgICAgICB2YXIgY29tbWVudEVuZCA9IGh0bWwuaW5kZXhPZignLS0+Jyk7CgogICAgICAgICAgaWYgKGNvbW1lbnRFbmQgPj0gMCkgewogICAgICAgICAgICBpZiAob3B0aW9ucy5zaG91bGRLZWVwQ29tbWVudCkgewogICAgICAgICAgICAgIG9wdGlvbnMuY29tbWVudChodG1sLnN1YnN0cmluZyg0LCBjb21tZW50RW5kKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWR2YW5jZShjb21tZW50RW5kICsgMyk7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbmRpdGlvbmFsX2NvbW1lbnQjRG93bmxldmVsLXJldmVhbGVkX2NvbmRpdGlvbmFsX2NvbW1lbnQKICAgICAgICBpZiAoY29uZGl0aW9uYWxDb21tZW50LnRlc3QoaHRtbCkpIHsKICAgICAgICAgIHZhciBjb25kaXRpb25hbEVuZCA9IGh0bWwuaW5kZXhPZignXT4nKTsKCiAgICAgICAgICBpZiAoY29uZGl0aW9uYWxFbmQgPj0gMCkgewogICAgICAgICAgICBhZHZhbmNlKGNvbmRpdGlvbmFsRW5kICsgMik7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBEb2N0eXBlOgogICAgICAgIHZhciBkb2N0eXBlTWF0Y2ggPSBodG1sLm1hdGNoKGRvY3R5cGUpOwogICAgICAgIGlmIChkb2N0eXBlTWF0Y2gpIHsKICAgICAgICAgIGFkdmFuY2UoZG9jdHlwZU1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgLy8gRW5kIHRhZzoKICAgICAgICB2YXIgZW5kVGFnTWF0Y2ggPSBodG1sLm1hdGNoKGVuZFRhZyk7CiAgICAgICAgaWYgKGVuZFRhZ01hdGNoKSB7CiAgICAgICAgICB2YXIgY3VySW5kZXggPSBpbmRleDsKICAgICAgICAgIGFkdmFuY2UoZW5kVGFnTWF0Y2hbMF0ubGVuZ3RoKTsKICAgICAgICAgIHBhcnNlRW5kVGFnKGVuZFRhZ01hdGNoWzFdLCBjdXJJbmRleCwgaW5kZXgpOwogICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgIC8vIFN0YXJ0IHRhZzoKICAgICAgICB2YXIgc3RhcnRUYWdNYXRjaCA9IHBhcnNlU3RhcnRUYWcoKTsKICAgICAgICBpZiAoc3RhcnRUYWdNYXRjaCkgewogICAgICAgICAgaGFuZGxlU3RhcnRUYWcoc3RhcnRUYWdNYXRjaCk7CiAgICAgICAgICBpZiAoc2hvdWxkSWdub3JlRmlyc3ROZXdsaW5lKGxhc3RUYWcsIGh0bWwpKSB7CiAgICAgICAgICAgIGFkdmFuY2UoMSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIHRleHQgPSAodm9pZCAwKSwgcmVzdCA9ICh2b2lkIDApLCBuZXh0ID0gKHZvaWQgMCk7CiAgICAgIGlmICh0ZXh0RW5kID49IDApIHsKICAgICAgICByZXN0ID0gaHRtbC5zbGljZSh0ZXh0RW5kKTsKICAgICAgICB3aGlsZSAoCiAgICAgICAgICAhZW5kVGFnLnRlc3QocmVzdCkgJiYKICAgICAgICAgICFzdGFydFRhZ09wZW4udGVzdChyZXN0KSAmJgogICAgICAgICAgIWNvbW1lbnQudGVzdChyZXN0KSAmJgogICAgICAgICAgIWNvbmRpdGlvbmFsQ29tbWVudC50ZXN0KHJlc3QpCiAgICAgICAgKSB7CiAgICAgICAgICAvLyA8IGluIHBsYWluIHRleHQsIGJlIGZvcmdpdmluZyBhbmQgdHJlYXQgaXQgYXMgdGV4dAogICAgICAgICAgbmV4dCA9IHJlc3QuaW5kZXhPZignPCcsIDEpOwogICAgICAgICAgaWYgKG5leHQgPCAwKSB7IGJyZWFrIH0KICAgICAgICAgIHRleHRFbmQgKz0gbmV4dDsKICAgICAgICAgIHJlc3QgPSBodG1sLnNsaWNlKHRleHRFbmQpOwogICAgICAgIH0KICAgICAgICB0ZXh0ID0gaHRtbC5zdWJzdHJpbmcoMCwgdGV4dEVuZCk7CiAgICAgICAgYWR2YW5jZSh0ZXh0RW5kKTsKICAgICAgfQoKICAgICAgaWYgKHRleHRFbmQgPCAwKSB7CiAgICAgICAgdGV4dCA9IGh0bWw7CiAgICAgICAgaHRtbCA9ICcnOwogICAgICB9CgogICAgICBpZiAob3B0aW9ucy5jaGFycyAmJiB0ZXh0KSB7CiAgICAgICAgb3B0aW9ucy5jaGFycyh0ZXh0KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdmFyIGVuZFRhZ0xlbmd0aCA9IDA7CiAgICAgIHZhciBzdGFja2VkVGFnID0gbGFzdFRhZy50b0xvd2VyQ2FzZSgpOwogICAgICB2YXIgcmVTdGFja2VkVGFnID0gcmVDYWNoZVtzdGFja2VkVGFnXSB8fCAocmVDYWNoZVtzdGFja2VkVGFnXSA9IG5ldyBSZWdFeHAoJyhbXFxzXFxTXSo/KSg8LycgKyBzdGFja2VkVGFnICsgJ1tePl0qPiknLCAnaScpKTsKICAgICAgdmFyIHJlc3QkMSA9IGh0bWwucmVwbGFjZShyZVN0YWNrZWRUYWcsIGZ1bmN0aW9uIChhbGwsIHRleHQsIGVuZFRhZykgewogICAgICAgIGVuZFRhZ0xlbmd0aCA9IGVuZFRhZy5sZW5ndGg7CiAgICAgICAgaWYgKCFpc1BsYWluVGV4dEVsZW1lbnQoc3RhY2tlZFRhZykgJiYgc3RhY2tlZFRhZyAhPT0gJ25vc2NyaXB0JykgewogICAgICAgICAgdGV4dCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoLzwhXC0tKFtcc1xTXSo/KS0tPi9nLCAnJDEnKSAvLyAjNzI5OAogICAgICAgICAgICAucmVwbGFjZSgvPCFcW0NEQVRBXFsoW1xzXFNdKj8pXV0+L2csICckMScpOwogICAgICAgIH0KICAgICAgICBpZiAoc2hvdWxkSWdub3JlRmlyc3ROZXdsaW5lKHN0YWNrZWRUYWcsIHRleHQpKSB7CiAgICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgxKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnMpIHsKICAgICAgICAgIG9wdGlvbnMuY2hhcnModGV4dCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAnJwogICAgICB9KTsKICAgICAgaW5kZXggKz0gaHRtbC5sZW5ndGggLSByZXN0JDEubGVuZ3RoOwogICAgICBodG1sID0gcmVzdCQxOwogICAgICBwYXJzZUVuZFRhZyhzdGFja2VkVGFnLCBpbmRleCAtIGVuZFRhZ0xlbmd0aCwgaW5kZXgpOwogICAgfQoKICAgIGlmIChodG1sID09PSBsYXN0KSB7CiAgICAgIG9wdGlvbnMuY2hhcnMgJiYgb3B0aW9ucy5jaGFycyhodG1sKTsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiAhc3RhY2subGVuZ3RoICYmIG9wdGlvbnMud2FybikgewogICAgICAgIG9wdGlvbnMud2FybigoIk1hbC1mb3JtYXR0ZWQgdGFnIGF0IGVuZCBvZiB0ZW1wbGF0ZTogXCIiICsgaHRtbCArICJcIiIpKTsKICAgICAgfQogICAgICBicmVhawogICAgfQogIH0KCiAgLy8gQ2xlYW4gdXAgYW55IHJlbWFpbmluZyB0YWdzCiAgcGFyc2VFbmRUYWcoKTsKCiAgZnVuY3Rpb24gYWR2YW5jZSAobikgewogICAgaW5kZXggKz0gbjsKICAgIGh0bWwgPSBodG1sLnN1YnN0cmluZyhuKTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlU3RhcnRUYWcgKCkgewogICAgdmFyIHN0YXJ0ID0gaHRtbC5tYXRjaChzdGFydFRhZ09wZW4pOwogICAgaWYgKHN0YXJ0KSB7CiAgICAgIHZhciBtYXRjaCA9IHsKICAgICAgICB0YWdOYW1lOiBzdGFydFsxXSwKICAgICAgICBhdHRyczogW10sCiAgICAgICAgc3RhcnQ6IGluZGV4CiAgICAgIH07CiAgICAgIGFkdmFuY2Uoc3RhcnRbMF0ubGVuZ3RoKTsKICAgICAgdmFyIGVuZCwgYXR0cjsKICAgICAgd2hpbGUgKCEoZW5kID0gaHRtbC5tYXRjaChzdGFydFRhZ0Nsb3NlKSkgJiYgKGF0dHIgPSBodG1sLm1hdGNoKGF0dHJpYnV0ZSkpKSB7CiAgICAgICAgYWR2YW5jZShhdHRyWzBdLmxlbmd0aCk7CiAgICAgICAgbWF0Y2guYXR0cnMucHVzaChhdHRyKTsKICAgICAgfQogICAgICBpZiAoZW5kKSB7CiAgICAgICAgbWF0Y2gudW5hcnlTbGFzaCA9IGVuZFsxXTsKICAgICAgICBhZHZhbmNlKGVuZFswXS5sZW5ndGgpOwogICAgICAgIG1hdGNoLmVuZCA9IGluZGV4OwogICAgICAgIHJldHVybiBtYXRjaAogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBoYW5kbGVTdGFydFRhZyAobWF0Y2gpIHsKICAgIHZhciB0YWdOYW1lID0gbWF0Y2gudGFnTmFtZTsKICAgIHZhciB1bmFyeVNsYXNoID0gbWF0Y2gudW5hcnlTbGFzaDsKCiAgICBpZiAoZXhwZWN0SFRNTCkgewogICAgICBpZiAobGFzdFRhZyA9PT0gJ3AnICYmIGlzTm9uUGhyYXNpbmdUYWcodGFnTmFtZSkpIHsKICAgICAgICBwYXJzZUVuZFRhZyhsYXN0VGFnKTsKICAgICAgfQogICAgICBpZiAoY2FuQmVMZWZ0T3BlblRhZyQkMSh0YWdOYW1lKSAmJiBsYXN0VGFnID09PSB0YWdOYW1lKSB7CiAgICAgICAgcGFyc2VFbmRUYWcodGFnTmFtZSk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgdW5hcnkgPSBpc1VuYXJ5VGFnJCQxKHRhZ05hbWUpIHx8ICEhdW5hcnlTbGFzaDsKCiAgICB2YXIgbCA9IG1hdGNoLmF0dHJzLmxlbmd0aDsKICAgIHZhciBhdHRycyA9IG5ldyBBcnJheShsKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciBhcmdzID0gbWF0Y2guYXR0cnNbaV07CiAgICAgIC8vIGhhY2tpc2ggd29yayBhcm91bmQgRkYgYnVnIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTM2OTc3OAogICAgICBpZiAoSVNfUkVHRVhfQ0FQVFVSSU5HX0JST0tFTiAmJiBhcmdzWzBdLmluZGV4T2YoJyIiJykgPT09IC0xKSB7CiAgICAgICAgaWYgKGFyZ3NbM10gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzNdOyB9CiAgICAgICAgaWYgKGFyZ3NbNF0gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzRdOyB9CiAgICAgICAgaWYgKGFyZ3NbNV0gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzVdOyB9CiAgICAgIH0KICAgICAgdmFyIHZhbHVlID0gYXJnc1szXSB8fCBhcmdzWzRdIHx8IGFyZ3NbNV0gfHwgJyc7CiAgICAgIHZhciBzaG91bGREZWNvZGVOZXdsaW5lcyA9IHRhZ05hbWUgPT09ICdhJyAmJiBhcmdzWzFdID09PSAnaHJlZicKICAgICAgICA/IG9wdGlvbnMuc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmCiAgICAgICAgOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzOwogICAgICBhdHRyc1tpXSA9IHsKICAgICAgICBuYW1lOiBhcmdzWzFdLAogICAgICAgIHZhbHVlOiBkZWNvZGVBdHRyKHZhbHVlLCBzaG91bGREZWNvZGVOZXdsaW5lcykKICAgICAgfTsKICAgIH0KCiAgICBpZiAoIXVuYXJ5KSB7CiAgICAgIHN0YWNrLnB1c2goeyB0YWc6IHRhZ05hbWUsIGxvd2VyQ2FzZWRUYWc6IHRhZ05hbWUudG9Mb3dlckNhc2UoKSwgYXR0cnM6IGF0dHJzIH0pOwogICAgICBsYXN0VGFnID0gdGFnTmFtZTsKICAgIH0KCiAgICBpZiAob3B0aW9ucy5zdGFydCkgewogICAgICBvcHRpb25zLnN0YXJ0KHRhZ05hbWUsIGF0dHJzLCB1bmFyeSwgbWF0Y2guc3RhcnQsIG1hdGNoLmVuZCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYXJzZUVuZFRhZyAodGFnTmFtZSwgc3RhcnQsIGVuZCkgewogICAgdmFyIHBvcywgbG93ZXJDYXNlZFRhZ05hbWU7CiAgICBpZiAoc3RhcnQgPT0gbnVsbCkgeyBzdGFydCA9IGluZGV4OyB9CiAgICBpZiAoZW5kID09IG51bGwpIHsgZW5kID0gaW5kZXg7IH0KCiAgICBpZiAodGFnTmFtZSkgewogICAgICBsb3dlckNhc2VkVGFnTmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTsKICAgIH0KCiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IG9wZW5lZCB0YWcgb2YgdGhlIHNhbWUgdHlwZQogICAgaWYgKHRhZ05hbWUpIHsKICAgICAgZm9yIChwb3MgPSBzdGFjay5sZW5ndGggLSAxOyBwb3MgPj0gMDsgcG9zLS0pIHsKICAgICAgICBpZiAoc3RhY2tbcG9zXS5sb3dlckNhc2VkVGFnID09PSBsb3dlckNhc2VkVGFnTmFtZSkgewogICAgICAgICAgYnJlYWsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIElmIG5vIHRhZyBuYW1lIGlzIHByb3ZpZGVkLCBjbGVhbiBzaG9wCiAgICAgIHBvcyA9IDA7CiAgICB9CgogICAgaWYgKHBvcyA+PSAwKSB7CiAgICAgIC8vIENsb3NlIGFsbCB0aGUgb3BlbiBlbGVtZW50cywgdXAgdGhlIHN0YWNrCiAgICAgIGZvciAodmFyIGkgPSBzdGFjay5sZW5ndGggLSAxOyBpID49IHBvczsgaS0tKSB7CiAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICAgICAgKGkgPiBwb3MgfHwgIXRhZ05hbWUpICYmCiAgICAgICAgICBvcHRpb25zLndhcm4KICAgICAgICApIHsKICAgICAgICAgIG9wdGlvbnMud2FybigKICAgICAgICAgICAgKCJ0YWcgPCIgKyAoc3RhY2tbaV0udGFnKSArICI+IGhhcyBubyBtYXRjaGluZyBlbmQgdGFnLiIpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAob3B0aW9ucy5lbmQpIHsKICAgICAgICAgIG9wdGlvbnMuZW5kKHN0YWNrW2ldLnRhZywgc3RhcnQsIGVuZCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBSZW1vdmUgdGhlIG9wZW4gZWxlbWVudHMgZnJvbSB0aGUgc3RhY2sKICAgICAgc3RhY2subGVuZ3RoID0gcG9zOwogICAgICBsYXN0VGFnID0gcG9zICYmIHN0YWNrW3BvcyAtIDFdLnRhZzsKICAgIH0gZWxzZSBpZiAobG93ZXJDYXNlZFRhZ05hbWUgPT09ICdicicpIHsKICAgICAgaWYgKG9wdGlvbnMuc3RhcnQpIHsKICAgICAgICBvcHRpb25zLnN0YXJ0KHRhZ05hbWUsIFtdLCB0cnVlLCBzdGFydCwgZW5kKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChsb3dlckNhc2VkVGFnTmFtZSA9PT0gJ3AnKSB7CiAgICAgIGlmIChvcHRpb25zLnN0YXJ0KSB7CiAgICAgICAgb3B0aW9ucy5zdGFydCh0YWdOYW1lLCBbXSwgZmFsc2UsIHN0YXJ0LCBlbmQpOwogICAgICB9CiAgICAgIGlmIChvcHRpb25zLmVuZCkgewogICAgICAgIG9wdGlvbnMuZW5kKHRhZ05hbWUsIHN0YXJ0LCBlbmQpOwogICAgICB9CiAgICB9CiAgfQp9CgovKiAgKi8KCnZhciBvblJFID0gL15AfF52LW9uOi87CnZhciBkaXJSRSA9IC9edi18XkB8XjovOwp2YXIgZm9yQWxpYXNSRSA9IC8oW15dKj8pXHMrKD86aW58b2YpXHMrKFteXSopLzsKdmFyIGZvckl0ZXJhdG9yUkUgPSAvLChbXixcfVxdXSopKD86LChbXixcfVxdXSopKT8kLzsKdmFyIHN0cmlwUGFyZW5zUkUgPSAvXlwofFwpJC9nOwoKdmFyIGFyZ1JFID0gLzooLiopJC87CnZhciBiaW5kUkUgPSAvXjp8XnYtYmluZDovOwp2YXIgbW9kaWZpZXJSRSA9IC9cLlteLl0rL2c7Cgp2YXIgZGVjb2RlSFRNTENhY2hlZCA9IGNhY2hlZChoZS5kZWNvZGUpOwoKLy8gY29uZmlndXJhYmxlIHN0YXRlCnZhciB3YXJuJDI7CnZhciBkZWxpbWl0ZXJzOwp2YXIgdHJhbnNmb3JtczsKdmFyIHByZVRyYW5zZm9ybXM7CnZhciBwb3N0VHJhbnNmb3JtczsKdmFyIHBsYXRmb3JtSXNQcmVUYWc7CnZhciBwbGF0Zm9ybU11c3RVc2VQcm9wOwp2YXIgcGxhdGZvcm1HZXRUYWdOYW1lc3BhY2U7CgoKCmZ1bmN0aW9uIGNyZWF0ZUFTVEVsZW1lbnQgKAogIHRhZywKICBhdHRycywKICBwYXJlbnQKKSB7CiAgcmV0dXJuIHsKICAgIHR5cGU6IDEsCiAgICB0YWc6IHRhZywKICAgIGF0dHJzTGlzdDogYXR0cnMsCiAgICBhdHRyc01hcDogbWFrZUF0dHJzTWFwKGF0dHJzKSwKICAgIHBhcmVudDogcGFyZW50LAogICAgY2hpbGRyZW46IFtdCiAgfQp9CgovKioKICogQ29udmVydCBIVE1MIHN0cmluZyB0byBBU1QuCiAqLwpmdW5jdGlvbiBwYXJzZSAoCiAgdGVtcGxhdGUsCiAgb3B0aW9ucwopIHsKICB3YXJuJDIgPSBvcHRpb25zLndhcm4gfHwgYmFzZVdhcm47CgogIHBsYXRmb3JtSXNQcmVUYWcgPSBvcHRpb25zLmlzUHJlVGFnIHx8IG5vOwogIHBsYXRmb3JtTXVzdFVzZVByb3AgPSBvcHRpb25zLm11c3RVc2VQcm9wIHx8IG5vOwogIHBsYXRmb3JtR2V0VGFnTmFtZXNwYWNlID0gb3B0aW9ucy5nZXRUYWdOYW1lc3BhY2UgfHwgbm87CgogIHRyYW5zZm9ybXMgPSBwbHVja01vZHVsZUZ1bmN0aW9uKG9wdGlvbnMubW9kdWxlcywgJ3RyYW5zZm9ybU5vZGUnKTsKICBwcmVUcmFuc2Zvcm1zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICdwcmVUcmFuc2Zvcm1Ob2RlJyk7CiAgcG9zdFRyYW5zZm9ybXMgPSBwbHVja01vZHVsZUZ1bmN0aW9uKG9wdGlvbnMubW9kdWxlcywgJ3Bvc3RUcmFuc2Zvcm1Ob2RlJyk7CgogIGRlbGltaXRlcnMgPSBvcHRpb25zLmRlbGltaXRlcnM7CgogIHZhciBzdGFjayA9IFtdOwogIHZhciBwcmVzZXJ2ZVdoaXRlc3BhY2UgPSBvcHRpb25zLnByZXNlcnZlV2hpdGVzcGFjZSAhPT0gZmFsc2U7CiAgdmFyIHJvb3Q7CiAgdmFyIGN1cnJlbnRQYXJlbnQ7CiAgdmFyIGluVlByZSA9IGZhbHNlOwogIHZhciBpblByZSA9IGZhbHNlOwogIHZhciB3YXJuZWQgPSBmYWxzZTsKCiAgZnVuY3Rpb24gd2Fybk9uY2UgKG1zZykgewogICAgaWYgKCF3YXJuZWQpIHsKICAgICAgd2FybmVkID0gdHJ1ZTsKICAgICAgd2FybiQyKG1zZyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjbG9zZUVsZW1lbnQgKGVsZW1lbnQpIHsKICAgIC8vIGNoZWNrIHByZSBzdGF0ZQogICAgaWYgKGVsZW1lbnQucHJlKSB7CiAgICAgIGluVlByZSA9IGZhbHNlOwogICAgfQogICAgaWYgKHBsYXRmb3JtSXNQcmVUYWcoZWxlbWVudC50YWcpKSB7CiAgICAgIGluUHJlID0gZmFsc2U7CiAgICB9CiAgICAvLyBhcHBseSBwb3N0LXRyYW5zZm9ybXMKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zdFRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgICAgcG9zdFRyYW5zZm9ybXNbaV0oZWxlbWVudCwgb3B0aW9ucyk7CiAgICB9CiAgfQoKICBwYXJzZUhUTUwodGVtcGxhdGUsIHsKICAgIHdhcm46IHdhcm4kMiwKICAgIGV4cGVjdEhUTUw6IG9wdGlvbnMuZXhwZWN0SFRNTCwKICAgIGlzVW5hcnlUYWc6IG9wdGlvbnMuaXNVbmFyeVRhZywKICAgIGNhbkJlTGVmdE9wZW5UYWc6IG9wdGlvbnMuY2FuQmVMZWZ0T3BlblRhZywKICAgIHNob3VsZERlY29kZU5ld2xpbmVzOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzLAogICAgc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZiwKICAgIHNob3VsZEtlZXBDb21tZW50OiBvcHRpb25zLmNvbW1lbnRzLAogICAgc3RhcnQ6IGZ1bmN0aW9uIHN0YXJ0ICh0YWcsIGF0dHJzLCB1bmFyeSkgewogICAgICAvLyBjaGVjayBuYW1lc3BhY2UuCiAgICAgIC8vIGluaGVyaXQgcGFyZW50IG5zIGlmIHRoZXJlIGlzIG9uZQogICAgICB2YXIgbnMgPSAoY3VycmVudFBhcmVudCAmJiBjdXJyZW50UGFyZW50Lm5zKSB8fCBwbGF0Zm9ybUdldFRhZ05hbWVzcGFjZSh0YWcpOwoKICAgICAgLy8gaGFuZGxlIElFIHN2ZyBidWcKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmIChpc0lFICYmIG5zID09PSAnc3ZnJykgewogICAgICAgIGF0dHJzID0gZ3VhcmRJRVNWR0J1ZyhhdHRycyk7CiAgICAgIH0KCiAgICAgIHZhciBlbGVtZW50ID0gY3JlYXRlQVNURWxlbWVudCh0YWcsIGF0dHJzLCBjdXJyZW50UGFyZW50KTsKICAgICAgaWYgKG5zKSB7CiAgICAgICAgZWxlbWVudC5ucyA9IG5zOwogICAgICB9CgogICAgICBpZiAoaXNGb3JiaWRkZW5UYWcoZWxlbWVudCkgJiYgIWlzU2VydmVyUmVuZGVyaW5nKCkpIHsKICAgICAgICBlbGVtZW50LmZvcmJpZGRlbiA9IHRydWU7CiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4kMigKICAgICAgICAgICdUZW1wbGF0ZXMgc2hvdWxkIG9ubHkgYmUgcmVzcG9uc2libGUgZm9yIG1hcHBpbmcgdGhlIHN0YXRlIHRvIHRoZSAnICsKICAgICAgICAgICdVSS4gQXZvaWQgcGxhY2luZyB0YWdzIHdpdGggc2lkZS1lZmZlY3RzIGluIHlvdXIgdGVtcGxhdGVzLCBzdWNoIGFzICcgKwogICAgICAgICAgIjwiICsgdGFnICsgIj4iICsgJywgYXMgdGhleSB3aWxsIG5vdCBiZSBwYXJzZWQuJwogICAgICAgICk7CiAgICAgIH0KCiAgICAgIC8vIGFwcGx5IHByZS10cmFuc2Zvcm1zCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJlVHJhbnNmb3Jtcy5sZW5ndGg7IGkrKykgewogICAgICAgIGVsZW1lbnQgPSBwcmVUcmFuc2Zvcm1zW2ldKGVsZW1lbnQsIG9wdGlvbnMpIHx8IGVsZW1lbnQ7CiAgICAgIH0KCiAgICAgIGlmICghaW5WUHJlKSB7CiAgICAgICAgcHJvY2Vzc1ByZShlbGVtZW50KTsKICAgICAgICBpZiAoZWxlbWVudC5wcmUpIHsKICAgICAgICAgIGluVlByZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwbGF0Zm9ybUlzUHJlVGFnKGVsZW1lbnQudGFnKSkgewogICAgICAgIGluUHJlID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoaW5WUHJlKSB7CiAgICAgICAgcHJvY2Vzc1Jhd0F0dHJzKGVsZW1lbnQpOwogICAgICB9IGVsc2UgaWYgKCFlbGVtZW50LnByb2Nlc3NlZCkgewogICAgICAgIC8vIHN0cnVjdHVyYWwgZGlyZWN0aXZlcwogICAgICAgIHByb2Nlc3NGb3IoZWxlbWVudCk7CiAgICAgICAgcHJvY2Vzc0lmKGVsZW1lbnQpOwogICAgICAgIHByb2Nlc3NPbmNlKGVsZW1lbnQpOwogICAgICAgIC8vIGVsZW1lbnQtc2NvcGUgc3R1ZmYKICAgICAgICBwcm9jZXNzRWxlbWVudChlbGVtZW50LCBvcHRpb25zKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gY2hlY2tSb290Q29uc3RyYWludHMgKGVsKSB7CiAgICAgICAgewogICAgICAgICAgaWYgKGVsLnRhZyA9PT0gJ3Nsb3QnIHx8IGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAiQ2Fubm90IHVzZSA8IiArIChlbC50YWcpICsgIj4gYXMgY29tcG9uZW50IHJvb3QgZWxlbWVudCBiZWNhdXNlIGl0IG1heSAiICsKICAgICAgICAgICAgICAnY29udGFpbiBtdWx0aXBsZSBub2Rlcy4nCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZWwuYXR0cnNNYXAuaGFzT3duUHJvcGVydHkoJ3YtZm9yJykpIHsKICAgICAgICAgICAgd2Fybk9uY2UoCiAgICAgICAgICAgICAgJ0Nhbm5vdCB1c2Ugdi1mb3Igb24gc3RhdGVmdWwgY29tcG9uZW50IHJvb3QgZWxlbWVudCBiZWNhdXNlICcgKwogICAgICAgICAgICAgICdpdCByZW5kZXJzIG11bHRpcGxlIGVsZW1lbnRzLicKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIHRyZWUgbWFuYWdlbWVudAogICAgICBpZiAoIXJvb3QpIHsKICAgICAgICByb290ID0gZWxlbWVudDsKICAgICAgICBjaGVja1Jvb3RDb25zdHJhaW50cyhyb290KTsKICAgICAgfSBlbHNlIGlmICghc3RhY2subGVuZ3RoKSB7CiAgICAgICAgLy8gYWxsb3cgcm9vdCBlbGVtZW50cyB3aXRoIHYtaWYsIHYtZWxzZS1pZiBhbmQgdi1lbHNlCiAgICAgICAgaWYgKHJvb3QuaWYgJiYgKGVsZW1lbnQuZWxzZWlmIHx8IGVsZW1lbnQuZWxzZSkpIHsKICAgICAgICAgIGNoZWNrUm9vdENvbnN0cmFpbnRzKGVsZW1lbnQpOwogICAgICAgICAgYWRkSWZDb25kaXRpb24ocm9vdCwgewogICAgICAgICAgICBleHA6IGVsZW1lbnQuZWxzZWlmLAogICAgICAgICAgICBibG9jazogZWxlbWVudAogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdhcm5PbmNlKAogICAgICAgICAgICAiQ29tcG9uZW50IHRlbXBsYXRlIHNob3VsZCBjb250YWluIGV4YWN0bHkgb25lIHJvb3QgZWxlbWVudC4gIiArCiAgICAgICAgICAgICJJZiB5b3UgYXJlIHVzaW5nIHYtaWYgb24gbXVsdGlwbGUgZWxlbWVudHMsICIgKwogICAgICAgICAgICAidXNlIHYtZWxzZS1pZiB0byBjaGFpbiB0aGVtIGluc3RlYWQuIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGN1cnJlbnRQYXJlbnQgJiYgIWVsZW1lbnQuZm9yYmlkZGVuKSB7CiAgICAgICAgaWYgKGVsZW1lbnQuZWxzZWlmIHx8IGVsZW1lbnQuZWxzZSkgewogICAgICAgICAgcHJvY2Vzc0lmQ29uZGl0aW9ucyhlbGVtZW50LCBjdXJyZW50UGFyZW50KTsKICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuc2xvdFNjb3BlKSB7IC8vIHNjb3BlZCBzbG90CiAgICAgICAgICBjdXJyZW50UGFyZW50LnBsYWluID0gZmFsc2U7CiAgICAgICAgICB2YXIgbmFtZSA9IGVsZW1lbnQuc2xvdFRhcmdldCB8fCAnImRlZmF1bHQiJzsoY3VycmVudFBhcmVudC5zY29wZWRTbG90cyB8fCAoY3VycmVudFBhcmVudC5zY29wZWRTbG90cyA9IHt9KSlbbmFtZV0gPSBlbGVtZW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJyZW50UGFyZW50LmNoaWxkcmVuLnB1c2goZWxlbWVudCk7CiAgICAgICAgICBlbGVtZW50LnBhcmVudCA9IGN1cnJlbnRQYXJlbnQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdW5hcnkpIHsKICAgICAgICBjdXJyZW50UGFyZW50ID0gZWxlbWVudDsKICAgICAgICBzdGFjay5wdXNoKGVsZW1lbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIGNsb3NlRWxlbWVudChlbGVtZW50KTsKICAgICAgfQogICAgfSwKCiAgICBlbmQ6IGZ1bmN0aW9uIGVuZCAoKSB7CiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlCiAgICAgIHZhciBlbGVtZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CiAgICAgIHZhciBsYXN0Tm9kZSA9IGVsZW1lbnQuY2hpbGRyZW5bZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggLSAxXTsKICAgICAgaWYgKGxhc3ROb2RlICYmIGxhc3ROb2RlLnR5cGUgPT09IDMgJiYgbGFzdE5vZGUudGV4dCA9PT0gJyAnICYmICFpblByZSkgewogICAgICAgIGVsZW1lbnQuY2hpbGRyZW4ucG9wKCk7CiAgICAgIH0KICAgICAgLy8gcG9wIHN0YWNrCiAgICAgIHN0YWNrLmxlbmd0aCAtPSAxOwogICAgICBjdXJyZW50UGFyZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CiAgICAgIGNsb3NlRWxlbWVudChlbGVtZW50KTsKICAgIH0sCgogICAgY2hhcnM6IGZ1bmN0aW9uIGNoYXJzICh0ZXh0KSB7CiAgICAgIGlmICghY3VycmVudFBhcmVudCkgewogICAgICAgIHsKICAgICAgICAgIGlmICh0ZXh0ID09PSB0ZW1wbGF0ZSkgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAnQ29tcG9uZW50IHRlbXBsYXRlIHJlcXVpcmVzIGEgcm9vdCBlbGVtZW50LCByYXRoZXIgdGhhbiBqdXN0IHRleHQuJwogICAgICAgICAgICApOwogICAgICAgICAgfSBlbHNlIGlmICgodGV4dCA9IHRleHQudHJpbSgpKSkgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAoInRleHQgXCIiICsgdGV4dCArICJcIiBvdXRzaWRlIHJvb3QgZWxlbWVudCB3aWxsIGJlIGlnbm9yZWQuIikKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuCiAgICAgIH0KICAgICAgLy8gSUUgdGV4dGFyZWEgcGxhY2Vob2xkZXIgYnVnCiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAoaXNJRSAmJgogICAgICAgIGN1cnJlbnRQYXJlbnQudGFnID09PSAndGV4dGFyZWEnICYmCiAgICAgICAgY3VycmVudFBhcmVudC5hdHRyc01hcC5wbGFjZWhvbGRlciA9PT0gdGV4dAogICAgICApIHsKICAgICAgICByZXR1cm4KICAgICAgfQogICAgICB2YXIgY2hpbGRyZW4gPSBjdXJyZW50UGFyZW50LmNoaWxkcmVuOwogICAgICB0ZXh0ID0gaW5QcmUgfHwgdGV4dC50cmltKCkKICAgICAgICA/IGlzVGV4dFRhZyhjdXJyZW50UGFyZW50KSA/IHRleHQgOiBkZWNvZGVIVE1MQ2FjaGVkKHRleHQpCiAgICAgICAgLy8gb25seSBwcmVzZXJ2ZSB3aGl0ZXNwYWNlIGlmIGl0cyBub3QgcmlnaHQgYWZ0ZXIgYSBzdGFydGluZyB0YWcKICAgICAgICA6IHByZXNlcnZlV2hpdGVzcGFjZSAmJiBjaGlsZHJlbi5sZW5ndGggPyAnICcgOiAnJzsKICAgICAgaWYgKHRleHQpIHsKICAgICAgICB2YXIgcmVzOwogICAgICAgIGlmICghaW5WUHJlICYmIHRleHQgIT09ICcgJyAmJiAocmVzID0gcGFyc2VUZXh0KHRleHQsIGRlbGltaXRlcnMpKSkgewogICAgICAgICAgY2hpbGRyZW4ucHVzaCh7CiAgICAgICAgICAgIHR5cGU6IDIsCiAgICAgICAgICAgIGV4cHJlc3Npb246IHJlcy5leHByZXNzaW9uLAogICAgICAgICAgICB0b2tlbnM6IHJlcy50b2tlbnMsCiAgICAgICAgICAgIHRleHQ6IHRleHQKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAodGV4dCAhPT0gJyAnIHx8ICFjaGlsZHJlbi5sZW5ndGggfHwgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udGV4dCAhPT0gJyAnKSB7CiAgICAgICAgICBjaGlsZHJlbi5wdXNoKHsKICAgICAgICAgICAgdHlwZTogMywKICAgICAgICAgICAgdGV4dDogdGV4dAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgY29tbWVudDogZnVuY3Rpb24gY29tbWVudCAodGV4dCkgewogICAgICBjdXJyZW50UGFyZW50LmNoaWxkcmVuLnB1c2goewogICAgICAgIHR5cGU6IDMsCiAgICAgICAgdGV4dDogdGV4dCwKICAgICAgICBpc0NvbW1lbnQ6IHRydWUKICAgICAgfSk7CiAgICB9CiAgfSk7CiAgcmV0dXJuIHJvb3QKfQoKZnVuY3Rpb24gcHJvY2Vzc1ByZSAoZWwpIHsKICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtcHJlJykgIT0gbnVsbCkgewogICAgZWwucHJlID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NSYXdBdHRycyAoZWwpIHsKICB2YXIgbCA9IGVsLmF0dHJzTGlzdC5sZW5ndGg7CiAgaWYgKGwpIHsKICAgIHZhciBhdHRycyA9IGVsLmF0dHJzID0gbmV3IEFycmF5KGwpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHsKICAgICAgYXR0cnNbaV0gPSB7CiAgICAgICAgbmFtZTogZWwuYXR0cnNMaXN0W2ldLm5hbWUsCiAgICAgICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KGVsLmF0dHJzTGlzdFtpXS52YWx1ZSkKICAgICAgfTsKICAgIH0KICB9IGVsc2UgaWYgKCFlbC5wcmUpIHsKICAgIC8vIG5vbiByb290IG5vZGUgaW4gcHJlIGJsb2NrcyB3aXRoIG5vIGF0dHJpYnV0ZXMKICAgIGVsLnBsYWluID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NFbGVtZW50IChlbGVtZW50LCBvcHRpb25zKSB7CiAgcHJvY2Vzc0tleShlbGVtZW50KTsKCiAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhIHBsYWluIGVsZW1lbnQgYWZ0ZXIKICAvLyByZW1vdmluZyBzdHJ1Y3R1cmFsIGF0dHJpYnV0ZXMKICBlbGVtZW50LnBsYWluID0gIWVsZW1lbnQua2V5ICYmICFlbGVtZW50LmF0dHJzTGlzdC5sZW5ndGg7CgogIHByb2Nlc3NSZWYoZWxlbWVudCk7CiAgcHJvY2Vzc1Nsb3QoZWxlbWVudCk7CiAgcHJvY2Vzc0NvbXBvbmVudChlbGVtZW50KTsKICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgIGVsZW1lbnQgPSB0cmFuc2Zvcm1zW2ldKGVsZW1lbnQsIG9wdGlvbnMpIHx8IGVsZW1lbnQ7CiAgfQogIHByb2Nlc3NBdHRycyhlbGVtZW50KTsKfQoKZnVuY3Rpb24gcHJvY2Vzc0tleSAoZWwpIHsKICB2YXIgZXhwID0gZ2V0QmluZGluZ0F0dHIoZWwsICdrZXknKTsKICBpZiAoZXhwKSB7CiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICB3YXJuJDIoIjx0ZW1wbGF0ZT4gY2Fubm90IGJlIGtleWVkLiBQbGFjZSB0aGUga2V5IG9uIHJlYWwgZWxlbWVudHMgaW5zdGVhZC4iKTsKICAgIH0KICAgIGVsLmtleSA9IGV4cDsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NSZWYgKGVsKSB7CiAgdmFyIHJlZiA9IGdldEJpbmRpbmdBdHRyKGVsLCAncmVmJyk7CiAgaWYgKHJlZikgewogICAgZWwucmVmID0gcmVmOwogICAgZWwucmVmSW5Gb3IgPSBjaGVja0luRm9yKGVsKTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NGb3IgKGVsKSB7CiAgdmFyIGV4cDsKICBpZiAoKGV4cCA9IGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LWZvcicpKSkgewogICAgdmFyIHJlcyA9IHBhcnNlRm9yKGV4cCk7CiAgICBpZiAocmVzKSB7CiAgICAgIGV4dGVuZChlbCwgcmVzKTsKICAgIH0gZWxzZSB7CiAgICAgIHdhcm4kMigKICAgICAgICAoIkludmFsaWQgdi1mb3IgZXhwcmVzc2lvbjogIiArIGV4cCkKICAgICAgKTsKICAgIH0KICB9Cn0KCgoKZnVuY3Rpb24gcGFyc2VGb3IgKGV4cCkgewogIHZhciBpbk1hdGNoID0gZXhwLm1hdGNoKGZvckFsaWFzUkUpOwogIGlmICghaW5NYXRjaCkgeyByZXR1cm4gfQogIHZhciByZXMgPSB7fTsKICByZXMuZm9yID0gaW5NYXRjaFsyXS50cmltKCk7CiAgdmFyIGFsaWFzID0gaW5NYXRjaFsxXS50cmltKCkucmVwbGFjZShzdHJpcFBhcmVuc1JFLCAnJyk7CiAgdmFyIGl0ZXJhdG9yTWF0Y2ggPSBhbGlhcy5tYXRjaChmb3JJdGVyYXRvclJFKTsKICBpZiAoaXRlcmF0b3JNYXRjaCkgewogICAgcmVzLmFsaWFzID0gYWxpYXMucmVwbGFjZShmb3JJdGVyYXRvclJFLCAnJyk7CiAgICByZXMuaXRlcmF0b3IxID0gaXRlcmF0b3JNYXRjaFsxXS50cmltKCk7CiAgICBpZiAoaXRlcmF0b3JNYXRjaFsyXSkgewogICAgICByZXMuaXRlcmF0b3IyID0gaXRlcmF0b3JNYXRjaFsyXS50cmltKCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIHJlcy5hbGlhcyA9IGFsaWFzOwogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIHByb2Nlc3NJZiAoZWwpIHsKICB2YXIgZXhwID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtaWYnKTsKICBpZiAoZXhwKSB7CiAgICBlbC5pZiA9IGV4cDsKICAgIGFkZElmQ29uZGl0aW9uKGVsLCB7CiAgICAgIGV4cDogZXhwLAogICAgICBibG9jazogZWwKICAgIH0pOwogIH0gZWxzZSB7CiAgICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZScpICE9IG51bGwpIHsKICAgICAgZWwuZWxzZSA9IHRydWU7CiAgICB9CiAgICB2YXIgZWxzZWlmID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZS1pZicpOwogICAgaWYgKGVsc2VpZikgewogICAgICBlbC5lbHNlaWYgPSBlbHNlaWY7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBwcm9jZXNzSWZDb25kaXRpb25zIChlbCwgcGFyZW50KSB7CiAgdmFyIHByZXYgPSBmaW5kUHJldkVsZW1lbnQocGFyZW50LmNoaWxkcmVuKTsKICBpZiAocHJldiAmJiBwcmV2LmlmKSB7CiAgICBhZGRJZkNvbmRpdGlvbihwcmV2LCB7CiAgICAgIGV4cDogZWwuZWxzZWlmLAogICAgICBibG9jazogZWwKICAgIH0pOwogIH0gZWxzZSB7CiAgICB3YXJuJDIoCiAgICAgICJ2LSIgKyAoZWwuZWxzZWlmID8gKCdlbHNlLWlmPSInICsgZWwuZWxzZWlmICsgJyInKSA6ICdlbHNlJykgKyAiICIgKwogICAgICAidXNlZCBvbiBlbGVtZW50IDwiICsgKGVsLnRhZykgKyAiPiB3aXRob3V0IGNvcnJlc3BvbmRpbmcgdi1pZi4iCiAgICApOwogIH0KfQoKZnVuY3Rpb24gZmluZFByZXZFbGVtZW50IChjaGlsZHJlbikgewogIHZhciBpID0gY2hpbGRyZW4ubGVuZ3RoOwogIHdoaWxlIChpLS0pIHsKICAgIGlmIChjaGlsZHJlbltpXS50eXBlID09PSAxKSB7CiAgICAgIHJldHVybiBjaGlsZHJlbltpXQogICAgfSBlbHNlIHsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjaGlsZHJlbltpXS50ZXh0ICE9PSAnICcpIHsKICAgICAgICB3YXJuJDIoCiAgICAgICAgICAidGV4dCBcIiIgKyAoY2hpbGRyZW5baV0udGV4dC50cmltKCkpICsgIlwiIGJldHdlZW4gdi1pZiBhbmQgdi1lbHNlKC1pZikgIiArCiAgICAgICAgICAid2lsbCBiZSBpZ25vcmVkLiIKICAgICAgICApOwogICAgICB9CiAgICAgIGNoaWxkcmVuLnBvcCgpOwogICAgfQogIH0KfQoKZnVuY3Rpb24gYWRkSWZDb25kaXRpb24gKGVsLCBjb25kaXRpb24pIHsKICBpZiAoIWVsLmlmQ29uZGl0aW9ucykgewogICAgZWwuaWZDb25kaXRpb25zID0gW107CiAgfQogIGVsLmlmQ29uZGl0aW9ucy5wdXNoKGNvbmRpdGlvbik7Cn0KCmZ1bmN0aW9uIHByb2Nlc3NPbmNlIChlbCkgewogIHZhciBvbmNlJCQxID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3Ytb25jZScpOwogIGlmIChvbmNlJCQxICE9IG51bGwpIHsKICAgIGVsLm9uY2UgPSB0cnVlOwogIH0KfQoKZnVuY3Rpb24gcHJvY2Vzc1Nsb3QgKGVsKSB7CiAgaWYgKGVsLnRhZyA9PT0gJ3Nsb3QnKSB7CiAgICBlbC5zbG90TmFtZSA9IGdldEJpbmRpbmdBdHRyKGVsLCAnbmFtZScpOwogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBlbC5rZXkpIHsKICAgICAgd2FybiQyKAogICAgICAgICJga2V5YCBkb2VzIG5vdCB3b3JrIG9uIDxzbG90PiBiZWNhdXNlIHNsb3RzIGFyZSBhYnN0cmFjdCBvdXRsZXRzICIgKwogICAgICAgICJhbmQgY2FuIHBvc3NpYmx5IGV4cGFuZCBpbnRvIG11bHRpcGxlIGVsZW1lbnRzLiAiICsKICAgICAgICAiVXNlIHRoZSBrZXkgb24gYSB3cmFwcGluZyBlbGVtZW50IGluc3RlYWQuIgogICAgICApOwogICAgfQogIH0gZWxzZSB7CiAgICB2YXIgc2xvdFNjb3BlOwogICAgaWYgKGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICBzbG90U2NvcGUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc2NvcGUnKTsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgc2xvdFNjb3BlKSB7CiAgICAgICAgd2FybiQyKAogICAgICAgICAgInRoZSBcInNjb3BlXCIgYXR0cmlidXRlIGZvciBzY29wZWQgc2xvdHMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgYW5kICIgKwogICAgICAgICAgInJlcGxhY2VkIGJ5IFwic2xvdC1zY29wZVwiIHNpbmNlIDIuNS4gVGhlIG5ldyBcInNsb3Qtc2NvcGVcIiBhdHRyaWJ1dGUgIiArCiAgICAgICAgICAiY2FuIGFsc28gYmUgdXNlZCBvbiBwbGFpbiBlbGVtZW50cyBpbiBhZGRpdGlvbiB0byA8dGVtcGxhdGU+IHRvICIgKwogICAgICAgICAgImRlbm90ZSBzY29wZWQgc2xvdHMuIiwKICAgICAgICAgIHRydWUKICAgICAgICApOwogICAgICB9CiAgICAgIGVsLnNsb3RTY29wZSA9IHNsb3RTY29wZSB8fCBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc2xvdC1zY29wZScpOwogICAgfSBlbHNlIGlmICgoc2xvdFNjb3BlID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3Nsb3Qtc2NvcGUnKSkpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgZWwuYXR0cnNNYXBbJ3YtZm9yJ10pIHsKICAgICAgICB3YXJuJDIoCiAgICAgICAgICAiQW1iaWd1b3VzIGNvbWJpbmVkIHVzYWdlIG9mIHNsb3Qtc2NvcGUgYW5kIHYtZm9yIG9uIDwiICsgKGVsLnRhZykgKyAiPiAiICsKICAgICAgICAgICIodi1mb3IgdGFrZXMgaGlnaGVyIHByaW9yaXR5KS4gVXNlIGEgd3JhcHBlciA8dGVtcGxhdGU+IGZvciB0aGUgIiArCiAgICAgICAgICAic2NvcGVkIHNsb3QgdG8gbWFrZSBpdCBjbGVhcmVyLiIsCiAgICAgICAgICB0cnVlCiAgICAgICAgKTsKICAgICAgfQogICAgICBlbC5zbG90U2NvcGUgPSBzbG90U2NvcGU7CiAgICB9CiAgICB2YXIgc2xvdFRhcmdldCA9IGdldEJpbmRpbmdBdHRyKGVsLCAnc2xvdCcpOwogICAgaWYgKHNsb3RUYXJnZXQpIHsKICAgICAgZWwuc2xvdFRhcmdldCA9IHNsb3RUYXJnZXQgPT09ICciIicgPyAnImRlZmF1bHQiJyA6IHNsb3RUYXJnZXQ7CiAgICAgIC8vIHByZXNlcnZlIHNsb3QgYXMgYW4gYXR0cmlidXRlIGZvciBuYXRpdmUgc2hhZG93IERPTSBjb21wYXQKICAgICAgLy8gb25seSBmb3Igbm9uLXNjb3BlZCBzbG90cy4KICAgICAgaWYgKGVsLnRhZyAhPT0gJ3RlbXBsYXRlJyAmJiAhZWwuc2xvdFNjb3BlKSB7CiAgICAgICAgYWRkQXR0cihlbCwgJ3Nsb3QnLCBzbG90VGFyZ2V0KTsKICAgICAgfQogICAgfQogIH0KfQoKZnVuY3Rpb24gcHJvY2Vzc0NvbXBvbmVudCAoZWwpIHsKICB2YXIgYmluZGluZzsKICBpZiAoKGJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ2lzJykpKSB7CiAgICBlbC5jb21wb25lbnQgPSBiaW5kaW5nOwogIH0KICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ2lubGluZS10ZW1wbGF0ZScpICE9IG51bGwpIHsKICAgIGVsLmlubGluZVRlbXBsYXRlID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NBdHRycyAoZWwpIHsKICB2YXIgbGlzdCA9IGVsLmF0dHJzTGlzdDsKICB2YXIgaSwgbCwgbmFtZSwgcmF3TmFtZSwgdmFsdWUsIG1vZGlmaWVycywgaXNQcm9wOwogIGZvciAoaSA9IDAsIGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgbmFtZSA9IHJhd05hbWUgPSBsaXN0W2ldLm5hbWU7CiAgICB2YWx1ZSA9IGxpc3RbaV0udmFsdWU7CiAgICBpZiAoZGlyUkUudGVzdChuYW1lKSkgewogICAgICAvLyBtYXJrIGVsZW1lbnQgYXMgZHluYW1pYwogICAgICBlbC5oYXNCaW5kaW5ncyA9IHRydWU7CiAgICAgIC8vIG1vZGlmaWVycwogICAgICBtb2RpZmllcnMgPSBwYXJzZU1vZGlmaWVycyhuYW1lKTsKICAgICAgaWYgKG1vZGlmaWVycykgewogICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UobW9kaWZpZXJSRSwgJycpOwogICAgICB9CiAgICAgIGlmIChiaW5kUkUudGVzdChuYW1lKSkgeyAvLyB2LWJpbmQKICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKGJpbmRSRSwgJycpOwogICAgICAgIHZhbHVlID0gcGFyc2VGaWx0ZXJzKHZhbHVlKTsKICAgICAgICBpc1Byb3AgPSBmYWxzZTsKICAgICAgICBpZiAobW9kaWZpZXJzKSB7CiAgICAgICAgICBpZiAobW9kaWZpZXJzLnByb3ApIHsKICAgICAgICAgICAgaXNQcm9wID0gdHJ1ZTsKICAgICAgICAgICAgbmFtZSA9IGNhbWVsaXplKG5hbWUpOwogICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2lubmVySHRtbCcpIHsgbmFtZSA9ICdpbm5lckhUTUwnOyB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobW9kaWZpZXJzLmNhbWVsKSB7CiAgICAgICAgICAgIG5hbWUgPSBjYW1lbGl6ZShuYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtb2RpZmllcnMuc3luYykgewogICAgICAgICAgICBhZGRIYW5kbGVyKAogICAgICAgICAgICAgIGVsLAogICAgICAgICAgICAgICgidXBkYXRlOiIgKyAoY2FtZWxpemUobmFtZSkpKSwKICAgICAgICAgICAgICBnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgIiRldmVudCIpCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpc1Byb3AgfHwgKAogICAgICAgICAgIWVsLmNvbXBvbmVudCAmJiBwbGF0Zm9ybU11c3RVc2VQcm9wKGVsLnRhZywgZWwuYXR0cnNNYXAudHlwZSwgbmFtZSkKICAgICAgICApKSB7CiAgICAgICAgICBhZGRQcm9wKGVsLCBuYW1lLCB2YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFkZEF0dHIoZWwsIG5hbWUsIHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAob25SRS50ZXN0KG5hbWUpKSB7IC8vIHYtb24KICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKG9uUkUsICcnKTsKICAgICAgICBhZGRIYW5kbGVyKGVsLCBuYW1lLCB2YWx1ZSwgbW9kaWZpZXJzLCBmYWxzZSwgd2FybiQyKTsKICAgICAgfSBlbHNlIHsgLy8gbm9ybWFsIGRpcmVjdGl2ZXMKICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKGRpclJFLCAnJyk7CiAgICAgICAgLy8gcGFyc2UgYXJnCiAgICAgICAgdmFyIGFyZ01hdGNoID0gbmFtZS5tYXRjaChhcmdSRSk7CiAgICAgICAgdmFyIGFyZyA9IGFyZ01hdGNoICYmIGFyZ01hdGNoWzFdOwogICAgICAgIGlmIChhcmcpIHsKICAgICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIC0oYXJnLmxlbmd0aCArIDEpKTsKICAgICAgICB9CiAgICAgICAgYWRkRGlyZWN0aXZlKGVsLCBuYW1lLCByYXdOYW1lLCB2YWx1ZSwgYXJnLCBtb2RpZmllcnMpOwogICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgbmFtZSA9PT0gJ21vZGVsJykgewogICAgICAgICAgY2hlY2tGb3JBbGlhc01vZGVsKGVsLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBsaXRlcmFsIGF0dHJpYnV0ZQogICAgICB7CiAgICAgICAgdmFyIHJlcyA9IHBhcnNlVGV4dCh2YWx1ZSwgZGVsaW1pdGVycyk7CiAgICAgICAgaWYgKHJlcykgewogICAgICAgICAgd2FybiQyKAogICAgICAgICAgICBuYW1lICsgIj1cIiIgKyB2YWx1ZSArICJcIjogIiArCiAgICAgICAgICAgICdJbnRlcnBvbGF0aW9uIGluc2lkZSBhdHRyaWJ1dGVzIGhhcyBiZWVuIHJlbW92ZWQuICcgKwogICAgICAgICAgICAnVXNlIHYtYmluZCBvciB0aGUgY29sb24gc2hvcnRoYW5kIGluc3RlYWQuIEZvciBleGFtcGxlLCAnICsKICAgICAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBpZD0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDppZD0idmFsIj4uJwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYWRkQXR0cihlbCwgbmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTsKICAgICAgLy8gIzY4ODcgZmlyZWZveCBkb2Vzbid0IHVwZGF0ZSBtdXRlZCBzdGF0ZSBpZiBzZXQgdmlhIGF0dHJpYnV0ZQogICAgICAvLyBldmVuIGltbWVkaWF0ZWx5IGFmdGVyIGVsZW1lbnQgY3JlYXRpb24KICAgICAgaWYgKCFlbC5jb21wb25lbnQgJiYKICAgICAgICAgIG5hbWUgPT09ICdtdXRlZCcgJiYKICAgICAgICAgIHBsYXRmb3JtTXVzdFVzZVByb3AoZWwudGFnLCBlbC5hdHRyc01hcC50eXBlLCBuYW1lKSkgewogICAgICAgIGFkZFByb3AoZWwsIG5hbWUsICd0cnVlJyk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGNoZWNrSW5Gb3IgKGVsKSB7CiAgdmFyIHBhcmVudCA9IGVsOwogIHdoaWxlIChwYXJlbnQpIHsKICAgIGlmIChwYXJlbnQuZm9yICE9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgfQogIHJldHVybiBmYWxzZQp9CgpmdW5jdGlvbiBwYXJzZU1vZGlmaWVycyAobmFtZSkgewogIHZhciBtYXRjaCA9IG5hbWUubWF0Y2gobW9kaWZpZXJSRSk7CiAgaWYgKG1hdGNoKSB7CiAgICB2YXIgcmV0ID0ge307CiAgICBtYXRjaC5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7IHJldFttLnNsaWNlKDEpXSA9IHRydWU7IH0pOwogICAgcmV0dXJuIHJldAogIH0KfQoKZnVuY3Rpb24gbWFrZUF0dHJzTWFwIChhdHRycykgewogIHZhciBtYXAgPSB7fTsKICBmb3IgKHZhciBpID0gMCwgbCA9IGF0dHJzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgaWYgKAogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgbWFwW2F0dHJzW2ldLm5hbWVdICYmICFpc0lFICYmICFpc0VkZ2UKICAgICkgewogICAgICB3YXJuJDIoJ2R1cGxpY2F0ZSBhdHRyaWJ1dGU6ICcgKyBhdHRyc1tpXS5uYW1lKTsKICAgIH0KICAgIG1hcFthdHRyc1tpXS5uYW1lXSA9IGF0dHJzW2ldLnZhbHVlOwogIH0KICByZXR1cm4gbWFwCn0KCi8vIGZvciBzY3JpcHQgKGUuZy4gdHlwZT0ieC90ZW1wbGF0ZSIpIG9yIHN0eWxlLCBkbyBub3QgZGVjb2RlIGNvbnRlbnQKZnVuY3Rpb24gaXNUZXh0VGFnIChlbCkgewogIHJldHVybiBlbC50YWcgPT09ICdzY3JpcHQnIHx8IGVsLnRhZyA9PT0gJ3N0eWxlJwp9CgpmdW5jdGlvbiBpc0ZvcmJpZGRlblRhZyAoZWwpIHsKICByZXR1cm4gKAogICAgZWwudGFnID09PSAnc3R5bGUnIHx8CiAgICAoZWwudGFnID09PSAnc2NyaXB0JyAmJiAoCiAgICAgICFlbC5hdHRyc01hcC50eXBlIHx8CiAgICAgIGVsLmF0dHJzTWFwLnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnCiAgICApKQogICkKfQoKdmFyIGllTlNCdWcgPSAvXnhtbG5zOk5TXGQrLzsKdmFyIGllTlNQcmVmaXggPSAvXk5TXGQrOi87CgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwpmdW5jdGlvbiBndWFyZElFU1ZHQnVnIChhdHRycykgewogIHZhciByZXMgPSBbXTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgYXR0ciA9IGF0dHJzW2ldOwogICAgaWYgKCFpZU5TQnVnLnRlc3QoYXR0ci5uYW1lKSkgewogICAgICBhdHRyLm5hbWUgPSBhdHRyLm5hbWUucmVwbGFjZShpZU5TUHJlZml4LCAnJyk7CiAgICAgIHJlcy5wdXNoKGF0dHIpOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIGNoZWNrRm9yQWxpYXNNb2RlbCAoZWwsIHZhbHVlKSB7CiAgdmFyIF9lbCA9IGVsOwogIHdoaWxlIChfZWwpIHsKICAgIGlmIChfZWwuZm9yICYmIF9lbC5hbGlhcyA9PT0gdmFsdWUpIHsKICAgICAgd2FybiQyKAogICAgICAgICI8IiArIChlbC50YWcpICsgIiB2LW1vZGVsPVwiIiArIHZhbHVlICsgIlwiPjogIiArCiAgICAgICAgIllvdSBhcmUgYmluZGluZyB2LW1vZGVsIGRpcmVjdGx5IHRvIGEgdi1mb3IgaXRlcmF0aW9uIGFsaWFzLiAiICsKICAgICAgICAiVGhpcyB3aWxsIG5vdCBiZSBhYmxlIHRvIG1vZGlmeSB0aGUgdi1mb3Igc291cmNlIGFycmF5IGJlY2F1c2UgIiArCiAgICAgICAgIndyaXRpbmcgdG8gdGhlIGFsaWFzIGlzIGxpa2UgbW9kaWZ5aW5nIGEgZnVuY3Rpb24gbG9jYWwgdmFyaWFibGUuICIgKwogICAgICAgICJDb25zaWRlciB1c2luZyBhbiBhcnJheSBvZiBvYmplY3RzIGFuZCB1c2Ugdi1tb2RlbCBvbiBhbiBvYmplY3QgcHJvcGVydHkgaW5zdGVhZC4iCiAgICAgICk7CiAgICB9CiAgICBfZWwgPSBfZWwucGFyZW50OwogIH0KfQoKLyogICovCgovKioKICogRXhwYW5kIGlucHV0W3YtbW9kZWxdIHdpdGggZHlhbm1pYyB0eXBlIGJpbmRpbmdzIGludG8gdi1pZi1lbHNlIGNoYWlucwogKiBUdXJuIHRoaXM6CiAqICAgPGlucHV0IHYtbW9kZWw9ImRhdGFbdHlwZV0iIDp0eXBlPSJ0eXBlIj4KICogaW50byB0aGlzOgogKiAgIDxpbnB1dCB2LWlmPSJ0eXBlID09PSAnY2hlY2tib3gnIiB0eXBlPSJjaGVja2JveCIgdi1tb2RlbD0iZGF0YVt0eXBlXSI+CiAqICAgPGlucHV0IHYtZWxzZS1pZj0idHlwZSA9PT0gJ3JhZGlvJyIgdHlwZT0icmFkaW8iIHYtbW9kZWw9ImRhdGFbdHlwZV0iPgogKiAgIDxpbnB1dCB2LWVsc2UgOnR5cGU9InR5cGUiIHYtbW9kZWw9ImRhdGFbdHlwZV0iPgogKi8KCmZ1bmN0aW9uIHByZVRyYW5zZm9ybU5vZGUgKGVsLCBvcHRpb25zKSB7CiAgaWYgKGVsLnRhZyA9PT0gJ2lucHV0JykgewogICAgdmFyIG1hcCA9IGVsLmF0dHJzTWFwOwogICAgaWYgKCFtYXBbJ3YtbW9kZWwnXSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgdHlwZUJpbmRpbmc7CiAgICBpZiAobWFwWyc6dHlwZSddIHx8IG1hcFsndi1iaW5kOnR5cGUnXSkgewogICAgICB0eXBlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAndHlwZScpOwogICAgfQogICAgaWYgKCFtYXAudHlwZSAmJiAhdHlwZUJpbmRpbmcgJiYgbWFwWyd2LWJpbmQnXSkgewogICAgICB0eXBlQmluZGluZyA9ICIoIiArIChtYXBbJ3YtYmluZCddKSArICIpLnR5cGUiOwogICAgfQoKICAgIGlmICh0eXBlQmluZGluZykgewogICAgICB2YXIgaWZDb25kaXRpb24gPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAndi1pZicsIHRydWUpOwogICAgICB2YXIgaWZDb25kaXRpb25FeHRyYSA9IGlmQ29uZGl0aW9uID8gKCImJigiICsgaWZDb25kaXRpb24gKyAiKSIpIDogIiI7CiAgICAgIHZhciBoYXNFbHNlID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZScsIHRydWUpICE9IG51bGw7CiAgICAgIHZhciBlbHNlSWZDb25kaXRpb24gPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAndi1lbHNlLWlmJywgdHJ1ZSk7CiAgICAgIC8vIDEuIGNoZWNrYm94CiAgICAgIHZhciBicmFuY2gwID0gY2xvbmVBU1RFbGVtZW50KGVsKTsKICAgICAgLy8gcHJvY2VzcyBmb3Igb24gdGhlIG1haW4gbm9kZQogICAgICBwcm9jZXNzRm9yKGJyYW5jaDApOwogICAgICBhZGRSYXdBdHRyKGJyYW5jaDAsICd0eXBlJywgJ2NoZWNrYm94Jyk7CiAgICAgIHByb2Nlc3NFbGVtZW50KGJyYW5jaDAsIG9wdGlvbnMpOwogICAgICBicmFuY2gwLnByb2Nlc3NlZCA9IHRydWU7IC8vIHByZXZlbnQgaXQgZnJvbSBkb3VibGUtcHJvY2Vzc2VkCiAgICAgIGJyYW5jaDAuaWYgPSAiKCIgKyB0eXBlQmluZGluZyArICIpPT09J2NoZWNrYm94JyIgKyBpZkNvbmRpdGlvbkV4dHJhOwogICAgICBhZGRJZkNvbmRpdGlvbihicmFuY2gwLCB7CiAgICAgICAgZXhwOiBicmFuY2gwLmlmLAogICAgICAgIGJsb2NrOiBicmFuY2gwCiAgICAgIH0pOwogICAgICAvLyAyLiBhZGQgcmFkaW8gZWxzZS1pZiBjb25kaXRpb24KICAgICAgdmFyIGJyYW5jaDEgPSBjbG9uZUFTVEVsZW1lbnQoZWwpOwogICAgICBnZXRBbmRSZW1vdmVBdHRyKGJyYW5jaDEsICd2LWZvcicsIHRydWUpOwogICAgICBhZGRSYXdBdHRyKGJyYW5jaDEsICd0eXBlJywgJ3JhZGlvJyk7CiAgICAgIHByb2Nlc3NFbGVtZW50KGJyYW5jaDEsIG9wdGlvbnMpOwogICAgICBhZGRJZkNvbmRpdGlvbihicmFuY2gwLCB7CiAgICAgICAgZXhwOiAiKCIgKyB0eXBlQmluZGluZyArICIpPT09J3JhZGlvJyIgKyBpZkNvbmRpdGlvbkV4dHJhLAogICAgICAgIGJsb2NrOiBicmFuY2gxCiAgICAgIH0pOwogICAgICAvLyAzLiBvdGhlcgogICAgICB2YXIgYnJhbmNoMiA9IGNsb25lQVNURWxlbWVudChlbCk7CiAgICAgIGdldEFuZFJlbW92ZUF0dHIoYnJhbmNoMiwgJ3YtZm9yJywgdHJ1ZSk7CiAgICAgIGFkZFJhd0F0dHIoYnJhbmNoMiwgJzp0eXBlJywgdHlwZUJpbmRpbmcpOwogICAgICBwcm9jZXNzRWxlbWVudChicmFuY2gyLCBvcHRpb25zKTsKICAgICAgYWRkSWZDb25kaXRpb24oYnJhbmNoMCwgewogICAgICAgIGV4cDogaWZDb25kaXRpb24sCiAgICAgICAgYmxvY2s6IGJyYW5jaDIKICAgICAgfSk7CgogICAgICBpZiAoaGFzRWxzZSkgewogICAgICAgIGJyYW5jaDAuZWxzZSA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAoZWxzZUlmQ29uZGl0aW9uKSB7CiAgICAgICAgYnJhbmNoMC5lbHNlaWYgPSBlbHNlSWZDb25kaXRpb247CiAgICAgIH0KCiAgICAgIHJldHVybiBicmFuY2gwCiAgICB9CiAgfQp9CgpmdW5jdGlvbiBjbG9uZUFTVEVsZW1lbnQgKGVsKSB7CiAgcmV0dXJuIGNyZWF0ZUFTVEVsZW1lbnQoZWwudGFnLCBlbC5hdHRyc0xpc3Quc2xpY2UoKSwgZWwucGFyZW50KQp9Cgp2YXIgbW9kZWwkMiA9IHsKICBwcmVUcmFuc2Zvcm1Ob2RlOiBwcmVUcmFuc2Zvcm1Ob2RlCn0KCnZhciBtb2R1bGVzJDEgPSBbCiAga2xhc3MkMSwKICBzdHlsZSQxLAogIG1vZGVsJDIKXQoKLyogICovCgpmdW5jdGlvbiB0ZXh0IChlbCwgZGlyKSB7CiAgaWYgKGRpci52YWx1ZSkgewogICAgYWRkUHJvcChlbCwgJ3RleHRDb250ZW50JywgKCJfcygiICsgKGRpci52YWx1ZSkgKyAiKSIpKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaHRtbCAoZWwsIGRpcikgewogIGlmIChkaXIudmFsdWUpIHsKICAgIGFkZFByb3AoZWwsICdpbm5lckhUTUwnLCAoIl9zKCIgKyAoZGlyLnZhbHVlKSArICIpIikpOwogIH0KfQoKdmFyIGRpcmVjdGl2ZXMkMSA9IHsKICBtb2RlbDogbW9kZWwsCiAgdGV4dDogdGV4dCwKICBodG1sOiBodG1sCn0KCi8qICAqLwoKdmFyIGJhc2VPcHRpb25zID0gewogIGV4cGVjdEhUTUw6IHRydWUsCiAgbW9kdWxlczogbW9kdWxlcyQxLAogIGRpcmVjdGl2ZXM6IGRpcmVjdGl2ZXMkMSwKICBpc1ByZVRhZzogaXNQcmVUYWcsCiAgaXNVbmFyeVRhZzogaXNVbmFyeVRhZywKICBtdXN0VXNlUHJvcDogbXVzdFVzZVByb3AsCiAgY2FuQmVMZWZ0T3BlblRhZzogY2FuQmVMZWZ0T3BlblRhZywKICBpc1Jlc2VydmVkVGFnOiBpc1Jlc2VydmVkVGFnLAogIGdldFRhZ05hbWVzcGFjZTogZ2V0VGFnTmFtZXNwYWNlLAogIHN0YXRpY0tleXM6IGdlblN0YXRpY0tleXMobW9kdWxlcyQxKQp9OwoKLyogICovCgp2YXIgaXNTdGF0aWNLZXk7CnZhciBpc1BsYXRmb3JtUmVzZXJ2ZWRUYWc7Cgp2YXIgZ2VuU3RhdGljS2V5c0NhY2hlZCA9IGNhY2hlZChnZW5TdGF0aWNLZXlzJDEpOwoKLyoqCiAqIEdvYWwgb2YgdGhlIG9wdGltaXplcjogd2FsayB0aGUgZ2VuZXJhdGVkIHRlbXBsYXRlIEFTVCB0cmVlCiAqIGFuZCBkZXRlY3Qgc3ViLXRyZWVzIHRoYXQgYXJlIHB1cmVseSBzdGF0aWMsIGkuZS4gcGFydHMgb2YKICogdGhlIERPTSB0aGF0IG5ldmVyIG5lZWRzIHRvIGNoYW5nZS4KICoKICogT25jZSB3ZSBkZXRlY3QgdGhlc2Ugc3ViLXRyZWVzLCB3ZSBjYW46CiAqCiAqIDEuIEhvaXN0IHRoZW0gaW50byBjb25zdGFudHMsIHNvIHRoYXQgd2Ugbm8gbG9uZ2VyIG5lZWQgdG8KICogICAgY3JlYXRlIGZyZXNoIG5vZGVzIGZvciB0aGVtIG9uIGVhY2ggcmUtcmVuZGVyOwogKiAyLiBDb21wbGV0ZWx5IHNraXAgdGhlbSBpbiB0aGUgcGF0Y2hpbmcgcHJvY2Vzcy4KICovCmZ1bmN0aW9uIG9wdGltaXplIChyb290LCBvcHRpb25zKSB7CiAgaWYgKCFyb290KSB7IHJldHVybiB9CiAgaXNTdGF0aWNLZXkgPSBnZW5TdGF0aWNLZXlzQ2FjaGVkKG9wdGlvbnMuc3RhdGljS2V5cyB8fCAnJyk7CiAgaXNQbGF0Zm9ybVJlc2VydmVkVGFnID0gb3B0aW9ucy5pc1Jlc2VydmVkVGFnIHx8IG5vOwogIC8vIGZpcnN0IHBhc3M6IG1hcmsgYWxsIG5vbi1zdGF0aWMgbm9kZXMuCiAgbWFya1N0YXRpYyQxKHJvb3QpOwogIC8vIHNlY29uZCBwYXNzOiBtYXJrIHN0YXRpYyByb290cy4KICBtYXJrU3RhdGljUm9vdHMocm9vdCwgZmFsc2UpOwp9CgpmdW5jdGlvbiBnZW5TdGF0aWNLZXlzJDEgKGtleXMpIHsKICByZXR1cm4gbWFrZU1hcCgKICAgICd0eXBlLHRhZyxhdHRyc0xpc3QsYXR0cnNNYXAscGxhaW4scGFyZW50LGNoaWxkcmVuLGF0dHJzJyArCiAgICAoa2V5cyA/ICcsJyArIGtleXMgOiAnJykKICApCn0KCmZ1bmN0aW9uIG1hcmtTdGF0aWMkMSAobm9kZSkgewogIG5vZGUuc3RhdGljID0gaXNTdGF0aWMobm9kZSk7CiAgaWYgKG5vZGUudHlwZSA9PT0gMSkgewogICAgLy8gZG8gbm90IG1ha2UgY29tcG9uZW50IHNsb3QgY29udGVudCBzdGF0aWMuIHRoaXMgYXZvaWRzCiAgICAvLyAxLiBjb21wb25lbnRzIG5vdCBhYmxlIHRvIG11dGF0ZSBzbG90IG5vZGVzCiAgICAvLyAyLiBzdGF0aWMgc2xvdCBjb250ZW50IGZhaWxzIGZvciBob3QtcmVsb2FkaW5nCiAgICBpZiAoCiAgICAgICFpc1BsYXRmb3JtUmVzZXJ2ZWRUYWcobm9kZS50YWcpICYmCiAgICAgIG5vZGUudGFnICE9PSAnc2xvdCcgJiYKICAgICAgbm9kZS5hdHRyc01hcFsnaW5saW5lLXRlbXBsYXRlJ10gPT0gbnVsbAogICAgKSB7CiAgICAgIHJldHVybgogICAgfQogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldOwogICAgICBtYXJrU3RhdGljJDEoY2hpbGQpOwogICAgICBpZiAoIWNoaWxkLnN0YXRpYykgewogICAgICAgIG5vZGUuc3RhdGljID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmIChub2RlLmlmQ29uZGl0aW9ucykgewogICAgICBmb3IgKHZhciBpJDEgPSAxLCBsJDEgPSBub2RlLmlmQ29uZGl0aW9ucy5sZW5ndGg7IGkkMSA8IGwkMTsgaSQxKyspIHsKICAgICAgICB2YXIgYmxvY2sgPSBub2RlLmlmQ29uZGl0aW9uc1tpJDFdLmJsb2NrOwogICAgICAgIG1hcmtTdGF0aWMkMShibG9jayk7CiAgICAgICAgaWYgKCFibG9jay5zdGF0aWMpIHsKICAgICAgICAgIG5vZGUuc3RhdGljID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBtYXJrU3RhdGljUm9vdHMgKG5vZGUsIGlzSW5Gb3IpIHsKICBpZiAobm9kZS50eXBlID09PSAxKSB7CiAgICBpZiAobm9kZS5zdGF0aWMgfHwgbm9kZS5vbmNlKSB7CiAgICAgIG5vZGUuc3RhdGljSW5Gb3IgPSBpc0luRm9yOwogICAgfQogICAgLy8gRm9yIGEgbm9kZSB0byBxdWFsaWZ5IGFzIGEgc3RhdGljIHJvb3QsIGl0IHNob3VsZCBoYXZlIGNoaWxkcmVuIHRoYXQKICAgIC8vIGFyZSBub3QganVzdCBzdGF0aWMgdGV4dC4gT3RoZXJ3aXNlIHRoZSBjb3N0IG9mIGhvaXN0aW5nIG91dCB3aWxsCiAgICAvLyBvdXR3ZWlnaCB0aGUgYmVuZWZpdHMgYW5kIGl0J3MgYmV0dGVyIG9mZiB0byBqdXN0IGFsd2F5cyByZW5kZXIgaXQgZnJlc2guCiAgICBpZiAobm9kZS5zdGF0aWMgJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggJiYgISgKICAgICAgbm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYKICAgICAgbm9kZS5jaGlsZHJlblswXS50eXBlID09PSAzCiAgICApKSB7CiAgICAgIG5vZGUuc3RhdGljUm9vdCA9IHRydWU7CiAgICAgIHJldHVybgogICAgfSBlbHNlIHsKICAgICAgbm9kZS5zdGF0aWNSb290ID0gZmFsc2U7CiAgICB9CiAgICBpZiAobm9kZS5jaGlsZHJlbikgewogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgbWFya1N0YXRpY1Jvb3RzKG5vZGUuY2hpbGRyZW5baV0sIGlzSW5Gb3IgfHwgISFub2RlLmZvcik7CiAgICAgIH0KICAgIH0KICAgIGlmIChub2RlLmlmQ29uZGl0aW9ucykgewogICAgICBmb3IgKHZhciBpJDEgPSAxLCBsJDEgPSBub2RlLmlmQ29uZGl0aW9ucy5sZW5ndGg7IGkkMSA8IGwkMTsgaSQxKyspIHsKICAgICAgICBtYXJrU3RhdGljUm9vdHMobm9kZS5pZkNvbmRpdGlvbnNbaSQxXS5ibG9jaywgaXNJbkZvcik7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGlzU3RhdGljIChub2RlKSB7CiAgaWYgKG5vZGUudHlwZSA9PT0gMikgeyAvLyBleHByZXNzaW9uCiAgICByZXR1cm4gZmFsc2UKICB9CiAgaWYgKG5vZGUudHlwZSA9PT0gMykgeyAvLyB0ZXh0CiAgICByZXR1cm4gdHJ1ZQogIH0KICByZXR1cm4gISEobm9kZS5wcmUgfHwgKAogICAgIW5vZGUuaGFzQmluZGluZ3MgJiYgLy8gbm8gZHluYW1pYyBiaW5kaW5ncwogICAgIW5vZGUuaWYgJiYgIW5vZGUuZm9yICYmIC8vIG5vdCB2LWlmIG9yIHYtZm9yIG9yIHYtZWxzZQogICAgIWlzQnVpbHRJblRhZyhub2RlLnRhZykgJiYgLy8gbm90IGEgYnVpbHQtaW4KICAgIGlzUGxhdGZvcm1SZXNlcnZlZFRhZyhub2RlLnRhZykgJiYgLy8gbm90IGEgY29tcG9uZW50CiAgICAhaXNEaXJlY3RDaGlsZE9mVGVtcGxhdGVGb3Iobm9kZSkgJiYKICAgIE9iamVjdC5rZXlzKG5vZGUpLmV2ZXJ5KGlzU3RhdGljS2V5KQogICkpCn0KCmZ1bmN0aW9uIGlzRGlyZWN0Q2hpbGRPZlRlbXBsYXRlRm9yIChub2RlKSB7CiAgd2hpbGUgKG5vZGUucGFyZW50KSB7CiAgICBub2RlID0gbm9kZS5wYXJlbnQ7CiAgICBpZiAobm9kZS50YWcgIT09ICd0ZW1wbGF0ZScpIHsKICAgICAgcmV0dXJuIGZhbHNlCiAgICB9CiAgICBpZiAobm9kZS5mb3IpIHsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICB9CiAgcmV0dXJuIGZhbHNlCn0KCi8qICAqLwoKdmFyIGZuRXhwUkUgPSAvXihbXHckX10rfFwoW14pXSo/XCkpXHMqPT58XmZ1bmN0aW9uXHMqXCgvOwp2YXIgc2ltcGxlUGF0aFJFID0gL15bQS1aYS16XyRdW1x3JF0qKD86XC5bQS1aYS16XyRdW1x3JF0qfFxbJ1teJ10qPyddfFxbIlteIl0qPyJdfFxbXGQrXXxcW1tBLVphLXpfJF1bXHckXSpdKSokLzsKCi8vIEtleWJvYXJkRXZlbnQua2V5Q29kZSBhbGlhc2VzCnZhciBrZXlDb2RlcyA9IHsKICBlc2M6IDI3LAogIHRhYjogOSwKICBlbnRlcjogMTMsCiAgc3BhY2U6IDMyLAogIHVwOiAzOCwKICBsZWZ0OiAzNywKICByaWdodDogMzksCiAgZG93bjogNDAsCiAgJ2RlbGV0ZSc6IFs4LCA0Nl0KfTsKCi8vIEtleWJvYXJkRXZlbnQua2V5IGFsaWFzZXMKdmFyIGtleU5hbWVzID0gewogIGVzYzogJ0VzY2FwZScsCiAgdGFiOiAnVGFiJywKICBlbnRlcjogJ0VudGVyJywKICBzcGFjZTogJyAnLAogIC8vICM3ODA2OiBJRTExIHVzZXMga2V5IG5hbWVzIHdpdGhvdXQgYEFycm93YCBwcmVmaXggZm9yIGFycm93IGtleXMuCiAgdXA6IFsnVXAnLCAnQXJyb3dVcCddLAogIGxlZnQ6IFsnTGVmdCcsICdBcnJvd0xlZnQnXSwKICByaWdodDogWydSaWdodCcsICdBcnJvd1JpZ2h0J10sCiAgZG93bjogWydEb3duJywgJ0Fycm93RG93biddLAogICdkZWxldGUnOiBbJ0JhY2tzcGFjZScsICdEZWxldGUnXQp9OwoKLy8gIzQ4Njg6IG1vZGlmaWVycyB0aGF0IHByZXZlbnQgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbGlzdGVuZXIKLy8gbmVlZCB0byBleHBsaWNpdGx5IHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGRldGVybWluZSB3aGV0aGVyIHRvIHJlbW92ZQovLyB0aGUgbGlzdGVuZXIgZm9yIC5vbmNlCnZhciBnZW5HdWFyZCA9IGZ1bmN0aW9uIChjb25kaXRpb24pIHsgcmV0dXJuICgiaWYoIiArIGNvbmRpdGlvbiArICIpcmV0dXJuIG51bGw7Iik7IH07Cgp2YXIgbW9kaWZpZXJDb2RlID0gewogIHN0b3A6ICckZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7JywKICBwcmV2ZW50OiAnJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7JywKICBzZWxmOiBnZW5HdWFyZCgiJGV2ZW50LnRhcmdldCAhPT0gJGV2ZW50LmN1cnJlbnRUYXJnZXQiKSwKICBjdHJsOiBnZW5HdWFyZCgiISRldmVudC5jdHJsS2V5IiksCiAgc2hpZnQ6IGdlbkd1YXJkKCIhJGV2ZW50LnNoaWZ0S2V5IiksCiAgYWx0OiBnZW5HdWFyZCgiISRldmVudC5hbHRLZXkiKSwKICBtZXRhOiBnZW5HdWFyZCgiISRldmVudC5tZXRhS2V5IiksCiAgbGVmdDogZ2VuR3VhcmQoIididXR0b24nIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAwIiksCiAgbWlkZGxlOiBnZW5HdWFyZCgiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDEiKSwKICByaWdodDogZ2VuR3VhcmQoIididXR0b24nIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAyIikKfTsKCmZ1bmN0aW9uIGdlbkhhbmRsZXJzICgKICBldmVudHMsCiAgaXNOYXRpdmUsCiAgd2FybgopIHsKICB2YXIgcmVzID0gaXNOYXRpdmUgPyAnbmF0aXZlT246eycgOiAnb246eyc7CiAgZm9yICh2YXIgbmFtZSBpbiBldmVudHMpIHsKICAgIHJlcyArPSAiXCIiICsgbmFtZSArICJcIjoiICsgKGdlbkhhbmRsZXIobmFtZSwgZXZlbnRzW25hbWVdKSkgKyAiLCI7CiAgfQogIHJldHVybiByZXMuc2xpY2UoMCwgLTEpICsgJ30nCn0KCmZ1bmN0aW9uIGdlbkhhbmRsZXIgKAogIG5hbWUsCiAgaGFuZGxlcgopIHsKICBpZiAoIWhhbmRsZXIpIHsKICAgIHJldHVybiAnZnVuY3Rpb24oKXt9JwogIH0KCiAgaWYgKEFycmF5LmlzQXJyYXkoaGFuZGxlcikpIHsKICAgIHJldHVybiAoIlsiICsgKGhhbmRsZXIubWFwKGZ1bmN0aW9uIChoYW5kbGVyKSB7IHJldHVybiBnZW5IYW5kbGVyKG5hbWUsIGhhbmRsZXIpOyB9KS5qb2luKCcsJykpICsgIl0iKQogIH0KCiAgdmFyIGlzTWV0aG9kUGF0aCA9IHNpbXBsZVBhdGhSRS50ZXN0KGhhbmRsZXIudmFsdWUpOwogIHZhciBpc0Z1bmN0aW9uRXhwcmVzc2lvbiA9IGZuRXhwUkUudGVzdChoYW5kbGVyLnZhbHVlKTsKCiAgaWYgKCFoYW5kbGVyLm1vZGlmaWVycykgewogICAgaWYgKGlzTWV0aG9kUGF0aCB8fCBpc0Z1bmN0aW9uRXhwcmVzc2lvbikgewogICAgICByZXR1cm4gaGFuZGxlci52YWx1ZQogICAgfQogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICByZXR1cm4gKCJmdW5jdGlvbigkZXZlbnQpeyIgKyAoaGFuZGxlci52YWx1ZSkgKyAifSIpIC8vIGlubGluZSBzdGF0ZW1lbnQKICB9IGVsc2UgewogICAgdmFyIGNvZGUgPSAnJzsKICAgIHZhciBnZW5Nb2RpZmllckNvZGUgPSAnJzsKICAgIHZhciBrZXlzID0gW107CiAgICBmb3IgKHZhciBrZXkgaW4gaGFuZGxlci5tb2RpZmllcnMpIHsKICAgICAgaWYgKG1vZGlmaWVyQ29kZVtrZXldKSB7CiAgICAgICAgZ2VuTW9kaWZpZXJDb2RlICs9IG1vZGlmaWVyQ29kZVtrZXldOwogICAgICAgIC8vIGxlZnQvcmlnaHQKICAgICAgICBpZiAoa2V5Q29kZXNba2V5XSkgewogICAgICAgICAga2V5cy5wdXNoKGtleSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2V4YWN0JykgewogICAgICAgIHZhciBtb2RpZmllcnMgPSAoaGFuZGxlci5tb2RpZmllcnMpOwogICAgICAgIGdlbk1vZGlmaWVyQ29kZSArPSBnZW5HdWFyZCgKICAgICAgICAgIFsnY3RybCcsICdzaGlmdCcsICdhbHQnLCAnbWV0YSddCiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGtleU1vZGlmaWVyKSB7IHJldHVybiAhbW9kaWZpZXJzW2tleU1vZGlmaWVyXTsgfSkKICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoa2V5TW9kaWZpZXIpIHsgcmV0dXJuICgiJGV2ZW50LiIgKyBrZXlNb2RpZmllciArICJLZXkiKTsgfSkKICAgICAgICAgICAgLmpvaW4oJ3x8JykKICAgICAgICApOwogICAgICB9IGVsc2UgewogICAgICAgIGtleXMucHVzaChrZXkpOwogICAgICB9CiAgICB9CiAgICBpZiAoa2V5cy5sZW5ndGgpIHsKICAgICAgY29kZSArPSBnZW5LZXlGaWx0ZXIoa2V5cyk7CiAgICB9CiAgICAvLyBNYWtlIHN1cmUgbW9kaWZpZXJzIGxpa2UgcHJldmVudCBhbmQgc3RvcCBnZXQgZXhlY3V0ZWQgYWZ0ZXIga2V5IGZpbHRlcmluZwogICAgaWYgKGdlbk1vZGlmaWVyQ29kZSkgewogICAgICBjb2RlICs9IGdlbk1vZGlmaWVyQ29kZTsKICAgIH0KICAgIHZhciBoYW5kbGVyQ29kZSA9IGlzTWV0aG9kUGF0aAogICAgICA/ICgicmV0dXJuICIgKyAoaGFuZGxlci52YWx1ZSkgKyAiKCRldmVudCkiKQogICAgICA6IGlzRnVuY3Rpb25FeHByZXNzaW9uCiAgICAgICAgPyAoInJldHVybiAoIiArIChoYW5kbGVyLnZhbHVlKSArICIpKCRldmVudCkiKQogICAgICAgIDogaGFuZGxlci52YWx1ZTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgcmV0dXJuICgiZnVuY3Rpb24oJGV2ZW50KXsiICsgY29kZSArIGhhbmRsZXJDb2RlICsgIn0iKQogIH0KfQoKZnVuY3Rpb24gZ2VuS2V5RmlsdGVyIChrZXlzKSB7CiAgcmV0dXJuICgiaWYoISgnYnV0dG9uJyBpbiAkZXZlbnQpJiYiICsgKGtleXMubWFwKGdlbkZpbHRlckNvZGUpLmpvaW4oJyYmJykpICsgIilyZXR1cm4gbnVsbDsiKQp9CgpmdW5jdGlvbiBnZW5GaWx0ZXJDb2RlIChrZXkpIHsKICB2YXIga2V5VmFsID0gcGFyc2VJbnQoa2V5LCAxMCk7CiAgaWYgKGtleVZhbCkgewogICAgcmV0dXJuICgiJGV2ZW50LmtleUNvZGUhPT0iICsga2V5VmFsKQogIH0KICB2YXIga2V5Q29kZSA9IGtleUNvZGVzW2tleV07CiAgdmFyIGtleU5hbWUgPSBrZXlOYW1lc1trZXldOwogIHJldHVybiAoCiAgICAiX2soJGV2ZW50LmtleUNvZGUsIiArCiAgICAoSlNPTi5zdHJpbmdpZnkoa2V5KSkgKyAiLCIgKwogICAgKEpTT04uc3RyaW5naWZ5KGtleUNvZGUpKSArICIsIiArCiAgICAiJGV2ZW50LmtleSwiICsKICAgICIiICsgKEpTT04uc3RyaW5naWZ5KGtleU5hbWUpKSArCiAgICAiKSIKICApCn0KCi8qICAqLwoKZnVuY3Rpb24gb24gKGVsLCBkaXIpIHsKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRpci5tb2RpZmllcnMpIHsKICAgIHdhcm4oInYtb24gd2l0aG91dCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IG1vZGlmaWVycy4iKTsKICB9CiAgZWwud3JhcExpc3RlbmVycyA9IGZ1bmN0aW9uIChjb2RlKSB7IHJldHVybiAoIl9nKCIgKyBjb2RlICsgIiwiICsgKGRpci52YWx1ZSkgKyAiKSIpOyB9Owp9CgovKiAgKi8KCmZ1bmN0aW9uIGJpbmQkMSAoZWwsIGRpcikgewogIGVsLndyYXBEYXRhID0gZnVuY3Rpb24gKGNvZGUpIHsKICAgIHJldHVybiAoIl9iKCIgKyBjb2RlICsgIiwnIiArIChlbC50YWcpICsgIicsIiArIChkaXIudmFsdWUpICsgIiwiICsgKGRpci5tb2RpZmllcnMgJiYgZGlyLm1vZGlmaWVycy5wcm9wID8gJ3RydWUnIDogJ2ZhbHNlJykgKyAoZGlyLm1vZGlmaWVycyAmJiBkaXIubW9kaWZpZXJzLnN5bmMgPyAnLHRydWUnIDogJycpICsgIikiKQogIH07Cn0KCi8qICAqLwoKdmFyIGJhc2VEaXJlY3RpdmVzID0gewogIG9uOiBvbiwKICBiaW5kOiBiaW5kJDEsCiAgY2xvYWs6IG5vb3AKfQoKLyogICovCgp2YXIgQ29kZWdlblN0YXRlID0gZnVuY3Rpb24gQ29kZWdlblN0YXRlIChvcHRpb25zKSB7CiAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICB0aGlzLndhcm4gPSBvcHRpb25zLndhcm4gfHwgYmFzZVdhcm47CiAgdGhpcy50cmFuc2Zvcm1zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICd0cmFuc2Zvcm1Db2RlJyk7CiAgdGhpcy5kYXRhR2VuRm5zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICdnZW5EYXRhJyk7CiAgdGhpcy5kaXJlY3RpdmVzID0gZXh0ZW5kKGV4dGVuZCh7fSwgYmFzZURpcmVjdGl2ZXMpLCBvcHRpb25zLmRpcmVjdGl2ZXMpOwogIHZhciBpc1Jlc2VydmVkVGFnID0gb3B0aW9ucy5pc1Jlc2VydmVkVGFnIHx8IG5vOwogIHRoaXMubWF5YmVDb21wb25lbnQgPSBmdW5jdGlvbiAoZWwpIHsgcmV0dXJuICFpc1Jlc2VydmVkVGFnKGVsLnRhZyk7IH07CiAgdGhpcy5vbmNlSWQgPSAwOwogIHRoaXMuc3RhdGljUmVuZGVyRm5zID0gW107Cn07CgoKCmZ1bmN0aW9uIGdlbmVyYXRlICgKICBhc3QsCiAgb3B0aW9ucwopIHsKICB2YXIgc3RhdGUgPSBuZXcgQ29kZWdlblN0YXRlKG9wdGlvbnMpOwogIHZhciBjb2RlID0gYXN0ID8gZ2VuRWxlbWVudChhc3QsIHN0YXRlKSA6ICdfYygiZGl2IiknOwogIHJldHVybiB7CiAgICByZW5kZXI6ICgid2l0aCh0aGlzKXtyZXR1cm4gIiArIGNvZGUgKyAifSIpLAogICAgc3RhdGljUmVuZGVyRm5zOiBzdGF0ZS5zdGF0aWNSZW5kZXJGbnMKICB9Cn0KCmZ1bmN0aW9uIGdlbkVsZW1lbnQgKGVsLCBzdGF0ZSkgewogIGlmIChlbC5zdGF0aWNSb290ICYmICFlbC5zdGF0aWNQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5TdGF0aWMoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwub25jZSAmJiAhZWwub25jZVByb2Nlc3NlZCkgewogICAgcmV0dXJuIGdlbk9uY2UoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwuZm9yICYmICFlbC5mb3JQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5Gb3IoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwuaWYgJiYgIWVsLmlmUHJvY2Vzc2VkKSB7CiAgICByZXR1cm4gZ2VuSWYoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwudGFnID09PSAndGVtcGxhdGUnICYmICFlbC5zbG90VGFyZ2V0KSB7CiAgICByZXR1cm4gZ2VuQ2hpbGRyZW4oZWwsIHN0YXRlKSB8fCAndm9pZCAwJwogIH0gZWxzZSBpZiAoZWwudGFnID09PSAnc2xvdCcpIHsKICAgIHJldHVybiBnZW5TbG90KGVsLCBzdGF0ZSkKICB9IGVsc2UgewogICAgLy8gY29tcG9uZW50IG9yIGVsZW1lbnQKICAgIHZhciBjb2RlOwogICAgaWYgKGVsLmNvbXBvbmVudCkgewogICAgICBjb2RlID0gZ2VuQ29tcG9uZW50KGVsLmNvbXBvbmVudCwgZWwsIHN0YXRlKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBkYXRhID0gZWwucGxhaW4gPyB1bmRlZmluZWQgOiBnZW5EYXRhJDIoZWwsIHN0YXRlKTsKCiAgICAgIHZhciBjaGlsZHJlbiA9IGVsLmlubGluZVRlbXBsYXRlID8gbnVsbCA6IGdlbkNoaWxkcmVuKGVsLCBzdGF0ZSwgdHJ1ZSk7CiAgICAgIGNvZGUgPSAiX2MoJyIgKyAoZWwudGFnKSArICInIiArIChkYXRhID8gKCIsIiArIGRhdGEpIDogJycpICsgKGNoaWxkcmVuID8gKCIsIiArIGNoaWxkcmVuKSA6ICcnKSArICIpIjsKICAgIH0KICAgIC8vIG1vZHVsZSB0cmFuc2Zvcm1zCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlLnRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgICAgY29kZSA9IHN0YXRlLnRyYW5zZm9ybXNbaV0oZWwsIGNvZGUpOwogICAgfQogICAgcmV0dXJuIGNvZGUKICB9Cn0KCi8vIGhvaXN0IHN0YXRpYyBzdWItdHJlZXMgb3V0CmZ1bmN0aW9uIGdlblN0YXRpYyAoZWwsIHN0YXRlKSB7CiAgZWwuc3RhdGljUHJvY2Vzc2VkID0gdHJ1ZTsKICBzdGF0ZS5zdGF0aWNSZW5kZXJGbnMucHVzaCgoIndpdGgodGhpcyl7cmV0dXJuICIgKyAoZ2VuRWxlbWVudChlbCwgc3RhdGUpKSArICJ9IikpOwogIHJldHVybiAoIl9tKCIgKyAoc3RhdGUuc3RhdGljUmVuZGVyRm5zLmxlbmd0aCAtIDEpICsgKGVsLnN0YXRpY0luRm9yID8gJyx0cnVlJyA6ICcnKSArICIpIikKfQoKLy8gdi1vbmNlCmZ1bmN0aW9uIGdlbk9uY2UgKGVsLCBzdGF0ZSkgewogIGVsLm9uY2VQcm9jZXNzZWQgPSB0cnVlOwogIGlmIChlbC5pZiAmJiAhZWwuaWZQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5JZihlbCwgc3RhdGUpCiAgfSBlbHNlIGlmIChlbC5zdGF0aWNJbkZvcikgewogICAgdmFyIGtleSA9ICcnOwogICAgdmFyIHBhcmVudCA9IGVsLnBhcmVudDsKICAgIHdoaWxlIChwYXJlbnQpIHsKICAgICAgaWYgKHBhcmVudC5mb3IpIHsKICAgICAgICBrZXkgPSBwYXJlbnQua2V5OwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDsKICAgIH0KICAgIGlmICgha2V5KSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBzdGF0ZS53YXJuKAogICAgICAgICJ2LW9uY2UgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgdi1mb3IgdGhhdCBpcyBrZXllZC4gIgogICAgICApOwogICAgICByZXR1cm4gZ2VuRWxlbWVudChlbCwgc3RhdGUpCiAgICB9CiAgICByZXR1cm4gKCJfbygiICsgKGdlbkVsZW1lbnQoZWwsIHN0YXRlKSkgKyAiLCIgKyAoc3RhdGUub25jZUlkKyspICsgIiwiICsga2V5ICsgIikiKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZ2VuU3RhdGljKGVsLCBzdGF0ZSkKICB9Cn0KCmZ1bmN0aW9uIGdlbklmICgKICBlbCwKICBzdGF0ZSwKICBhbHRHZW4sCiAgYWx0RW1wdHkKKSB7CiAgZWwuaWZQcm9jZXNzZWQgPSB0cnVlOyAvLyBhdm9pZCByZWN1cnNpb24KICByZXR1cm4gZ2VuSWZDb25kaXRpb25zKGVsLmlmQ29uZGl0aW9ucy5zbGljZSgpLCBzdGF0ZSwgYWx0R2VuLCBhbHRFbXB0eSkKfQoKZnVuY3Rpb24gZ2VuSWZDb25kaXRpb25zICgKICBjb25kaXRpb25zLAogIHN0YXRlLAogIGFsdEdlbiwKICBhbHRFbXB0eQopIHsKICBpZiAoIWNvbmRpdGlvbnMubGVuZ3RoKSB7CiAgICByZXR1cm4gYWx0RW1wdHkgfHwgJ19lKCknCiAgfQoKICB2YXIgY29uZGl0aW9uID0gY29uZGl0aW9ucy5zaGlmdCgpOwogIGlmIChjb25kaXRpb24uZXhwKSB7CiAgICByZXR1cm4gKCIoIiArIChjb25kaXRpb24uZXhwKSArICIpPyIgKyAoZ2VuVGVybmFyeUV4cChjb25kaXRpb24uYmxvY2spKSArICI6IiArIChnZW5JZkNvbmRpdGlvbnMoY29uZGl0aW9ucywgc3RhdGUsIGFsdEdlbiwgYWx0RW1wdHkpKSkKICB9IGVsc2UgewogICAgcmV0dXJuICgiIiArIChnZW5UZXJuYXJ5RXhwKGNvbmRpdGlvbi5ibG9jaykpKQogIH0KCiAgLy8gdi1pZiB3aXRoIHYtb25jZSBzaG91bGQgZ2VuZXJhdGUgY29kZSBsaWtlIChhKT9fbSgwKTpfbSgxKQogIGZ1bmN0aW9uIGdlblRlcm5hcnlFeHAgKGVsKSB7CiAgICByZXR1cm4gYWx0R2VuCiAgICAgID8gYWx0R2VuKGVsLCBzdGF0ZSkKICAgICAgOiBlbC5vbmNlCiAgICAgICAgPyBnZW5PbmNlKGVsLCBzdGF0ZSkKICAgICAgICA6IGdlbkVsZW1lbnQoZWwsIHN0YXRlKQogIH0KfQoKZnVuY3Rpb24gZ2VuRm9yICgKICBlbCwKICBzdGF0ZSwKICBhbHRHZW4sCiAgYWx0SGVscGVyCikgewogIHZhciBleHAgPSBlbC5mb3I7CiAgdmFyIGFsaWFzID0gZWwuYWxpYXM7CiAgdmFyIGl0ZXJhdG9yMSA9IGVsLml0ZXJhdG9yMSA/ICgiLCIgKyAoZWwuaXRlcmF0b3IxKSkgOiAnJzsKICB2YXIgaXRlcmF0b3IyID0gZWwuaXRlcmF0b3IyID8gKCIsIiArIChlbC5pdGVyYXRvcjIpKSA6ICcnOwoKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmCiAgICBzdGF0ZS5tYXliZUNvbXBvbmVudChlbCkgJiYKICAgIGVsLnRhZyAhPT0gJ3Nsb3QnICYmCiAgICBlbC50YWcgIT09ICd0ZW1wbGF0ZScgJiYKICAgICFlbC5rZXkKICApIHsKICAgIHN0YXRlLndhcm4oCiAgICAgICI8IiArIChlbC50YWcpICsgIiB2LWZvcj1cIiIgKyBhbGlhcyArICIgaW4gIiArIGV4cCArICJcIj46IGNvbXBvbmVudCBsaXN0cyByZW5kZXJlZCB3aXRoICIgKwogICAgICAidi1mb3Igc2hvdWxkIGhhdmUgZXhwbGljaXQga2V5cy4gIiArCiAgICAgICJTZWUgaHR0cHM6Ly92dWVqcy5vcmcvZ3VpZGUvbGlzdC5odG1sI2tleSBmb3IgbW9yZSBpbmZvLiIsCiAgICAgIHRydWUgLyogdGlwICovCiAgICApOwogIH0KCiAgZWwuZm9yUHJvY2Vzc2VkID0gdHJ1ZTsgLy8gYXZvaWQgcmVjdXJzaW9uCiAgcmV0dXJuIChhbHRIZWxwZXIgfHwgJ19sJykgKyAiKCgiICsgZXhwICsgIiksIiArCiAgICAiZnVuY3Rpb24oIiArIGFsaWFzICsgaXRlcmF0b3IxICsgaXRlcmF0b3IyICsgIil7IiArCiAgICAgICJyZXR1cm4gIiArICgoYWx0R2VuIHx8IGdlbkVsZW1lbnQpKGVsLCBzdGF0ZSkpICsKICAgICd9KScKfQoKZnVuY3Rpb24gZ2VuRGF0YSQyIChlbCwgc3RhdGUpIHsKICB2YXIgZGF0YSA9ICd7JzsKCiAgLy8gZGlyZWN0aXZlcyBmaXJzdC4KICAvLyBkaXJlY3RpdmVzIG1heSBtdXRhdGUgdGhlIGVsJ3Mgb3RoZXIgcHJvcGVydGllcyBiZWZvcmUgdGhleSBhcmUgZ2VuZXJhdGVkLgogIHZhciBkaXJzID0gZ2VuRGlyZWN0aXZlcyhlbCwgc3RhdGUpOwogIGlmIChkaXJzKSB7IGRhdGEgKz0gZGlycyArICcsJzsgfQoKICAvLyBrZXkKICBpZiAoZWwua2V5KSB7CiAgICBkYXRhICs9ICJrZXk6IiArIChlbC5rZXkpICsgIiwiOwogIH0KICAvLyByZWYKICBpZiAoZWwucmVmKSB7CiAgICBkYXRhICs9ICJyZWY6IiArIChlbC5yZWYpICsgIiwiOwogIH0KICBpZiAoZWwucmVmSW5Gb3IpIHsKICAgIGRhdGEgKz0gInJlZkluRm9yOnRydWUsIjsKICB9CiAgLy8gcHJlCiAgaWYgKGVsLnByZSkgewogICAgZGF0YSArPSAicHJlOnRydWUsIjsKICB9CiAgLy8gcmVjb3JkIG9yaWdpbmFsIHRhZyBuYW1lIGZvciBjb21wb25lbnRzIHVzaW5nICJpcyIgYXR0cmlidXRlCiAgaWYgKGVsLmNvbXBvbmVudCkgewogICAgZGF0YSArPSAidGFnOlwiIiArIChlbC50YWcpICsgIlwiLCI7CiAgfQogIC8vIG1vZHVsZSBkYXRhIGdlbmVyYXRpb24gZnVuY3Rpb25zCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZS5kYXRhR2VuRm5zLmxlbmd0aDsgaSsrKSB7CiAgICBkYXRhICs9IHN0YXRlLmRhdGFHZW5GbnNbaV0oZWwpOwogIH0KICAvLyBhdHRyaWJ1dGVzCiAgaWYgKGVsLmF0dHJzKSB7CiAgICBkYXRhICs9ICJhdHRyczp7IiArIChnZW5Qcm9wcyhlbC5hdHRycykpICsgIn0sIjsKICB9CiAgLy8gRE9NIHByb3BzCiAgaWYgKGVsLnByb3BzKSB7CiAgICBkYXRhICs9ICJkb21Qcm9wczp7IiArIChnZW5Qcm9wcyhlbC5wcm9wcykpICsgIn0sIjsKICB9CiAgLy8gZXZlbnQgaGFuZGxlcnMKICBpZiAoZWwuZXZlbnRzKSB7CiAgICBkYXRhICs9IChnZW5IYW5kbGVycyhlbC5ldmVudHMsIGZhbHNlLCBzdGF0ZS53YXJuKSkgKyAiLCI7CiAgfQogIGlmIChlbC5uYXRpdmVFdmVudHMpIHsKICAgIGRhdGEgKz0gKGdlbkhhbmRsZXJzKGVsLm5hdGl2ZUV2ZW50cywgdHJ1ZSwgc3RhdGUud2FybikpICsgIiwiOwogIH0KICAvLyBzbG90IHRhcmdldAogIC8vIG9ubHkgZm9yIG5vbi1zY29wZWQgc2xvdHMKICBpZiAoZWwuc2xvdFRhcmdldCAmJiAhZWwuc2xvdFNjb3BlKSB7CiAgICBkYXRhICs9ICJzbG90OiIgKyAoZWwuc2xvdFRhcmdldCkgKyAiLCI7CiAgfQogIC8vIHNjb3BlZCBzbG90cwogIGlmIChlbC5zY29wZWRTbG90cykgewogICAgZGF0YSArPSAoZ2VuU2NvcGVkU2xvdHMoZWwuc2NvcGVkU2xvdHMsIHN0YXRlKSkgKyAiLCI7CiAgfQogIC8vIGNvbXBvbmVudCB2LW1vZGVsCiAgaWYgKGVsLm1vZGVsKSB7CiAgICBkYXRhICs9ICJtb2RlbDp7dmFsdWU6IiArIChlbC5tb2RlbC52YWx1ZSkgKyAiLGNhbGxiYWNrOiIgKyAoZWwubW9kZWwuY2FsbGJhY2spICsgIixleHByZXNzaW9uOiIgKyAoZWwubW9kZWwuZXhwcmVzc2lvbikgKyAifSwiOwogIH0KICAvLyBpbmxpbmUtdGVtcGxhdGUKICBpZiAoZWwuaW5saW5lVGVtcGxhdGUpIHsKICAgIHZhciBpbmxpbmVUZW1wbGF0ZSA9IGdlbklubGluZVRlbXBsYXRlKGVsLCBzdGF0ZSk7CiAgICBpZiAoaW5saW5lVGVtcGxhdGUpIHsKICAgICAgZGF0YSArPSBpbmxpbmVUZW1wbGF0ZSArICIsIjsKICAgIH0KICB9CiAgZGF0YSA9IGRhdGEucmVwbGFjZSgvLCQvLCAnJykgKyAnfSc7CiAgLy8gdi1iaW5kIGRhdGEgd3JhcAogIGlmIChlbC53cmFwRGF0YSkgewogICAgZGF0YSA9IGVsLndyYXBEYXRhKGRhdGEpOwogIH0KICAvLyB2LW9uIGRhdGEgd3JhcAogIGlmIChlbC53cmFwTGlzdGVuZXJzKSB7CiAgICBkYXRhID0gZWwud3JhcExpc3RlbmVycyhkYXRhKTsKICB9CiAgcmV0dXJuIGRhdGEKfQoKZnVuY3Rpb24gZ2VuRGlyZWN0aXZlcyAoZWwsIHN0YXRlKSB7CiAgdmFyIGRpcnMgPSBlbC5kaXJlY3RpdmVzOwogIGlmICghZGlycykgeyByZXR1cm4gfQogIHZhciByZXMgPSAnZGlyZWN0aXZlczpbJzsKICB2YXIgaGFzUnVudGltZSA9IGZhbHNlOwogIHZhciBpLCBsLCBkaXIsIG5lZWRSdW50aW1lOwogIGZvciAoaSA9IDAsIGwgPSBkaXJzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgZGlyID0gZGlyc1tpXTsKICAgIG5lZWRSdW50aW1lID0gdHJ1ZTsKICAgIHZhciBnZW4gPSBzdGF0ZS5kaXJlY3RpdmVzW2Rpci5uYW1lXTsKICAgIGlmIChnZW4pIHsKICAgICAgLy8gY29tcGlsZS10aW1lIGRpcmVjdGl2ZSB0aGF0IG1hbmlwdWxhdGVzIEFTVC4KICAgICAgLy8gcmV0dXJucyB0cnVlIGlmIGl0IGFsc28gbmVlZHMgYSBydW50aW1lIGNvdW50ZXJwYXJ0LgogICAgICBuZWVkUnVudGltZSA9ICEhZ2VuKGVsLCBkaXIsIHN0YXRlLndhcm4pOwogICAgfQogICAgaWYgKG5lZWRSdW50aW1lKSB7CiAgICAgIGhhc1J1bnRpbWUgPSB0cnVlOwogICAgICByZXMgKz0gIntuYW1lOlwiIiArIChkaXIubmFtZSkgKyAiXCIscmF3TmFtZTpcIiIgKyAoZGlyLnJhd05hbWUpICsgIlwiIiArIChkaXIudmFsdWUgPyAoIix2YWx1ZTooIiArIChkaXIudmFsdWUpICsgIiksZXhwcmVzc2lvbjoiICsgKEpTT04uc3RyaW5naWZ5KGRpci52YWx1ZSkpKSA6ICcnKSArIChkaXIuYXJnID8gKCIsYXJnOlwiIiArIChkaXIuYXJnKSArICJcIiIpIDogJycpICsgKGRpci5tb2RpZmllcnMgPyAoIixtb2RpZmllcnM6IiArIChKU09OLnN0cmluZ2lmeShkaXIubW9kaWZpZXJzKSkpIDogJycpICsgIn0sIjsKICAgIH0KICB9CiAgaWYgKGhhc1J1bnRpbWUpIHsKICAgIHJldHVybiByZXMuc2xpY2UoMCwgLTEpICsgJ10nCiAgfQp9CgpmdW5jdGlvbiBnZW5JbmxpbmVUZW1wbGF0ZSAoZWwsIHN0YXRlKSB7CiAgdmFyIGFzdCA9IGVsLmNoaWxkcmVuWzBdOwogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgKAogICAgZWwuY2hpbGRyZW4ubGVuZ3RoICE9PSAxIHx8IGFzdC50eXBlICE9PSAxCiAgKSkgewogICAgc3RhdGUud2FybignSW5saW5lLXRlbXBsYXRlIGNvbXBvbmVudHMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGNoaWxkIGVsZW1lbnQuJyk7CiAgfQogIGlmIChhc3QudHlwZSA9PT0gMSkgewogICAgdmFyIGlubGluZVJlbmRlckZucyA9IGdlbmVyYXRlKGFzdCwgc3RhdGUub3B0aW9ucyk7CiAgICByZXR1cm4gKCJpbmxpbmVUZW1wbGF0ZTp7cmVuZGVyOmZ1bmN0aW9uKCl7IiArIChpbmxpbmVSZW5kZXJGbnMucmVuZGVyKSArICJ9LHN0YXRpY1JlbmRlckZuczpbIiArIChpbmxpbmVSZW5kZXJGbnMuc3RhdGljUmVuZGVyRm5zLm1hcChmdW5jdGlvbiAoY29kZSkgeyByZXR1cm4gKCJmdW5jdGlvbigpeyIgKyBjb2RlICsgIn0iKTsgfSkuam9pbignLCcpKSArICJdfSIpCiAgfQp9CgpmdW5jdGlvbiBnZW5TY29wZWRTbG90cyAoCiAgc2xvdHMsCiAgc3RhdGUKKSB7CiAgcmV0dXJuICgic2NvcGVkU2xvdHM6X3UoWyIgKyAoT2JqZWN0LmtleXMoc2xvdHMpLm1hcChmdW5jdGlvbiAoa2V5KSB7CiAgICAgIHJldHVybiBnZW5TY29wZWRTbG90KGtleSwgc2xvdHNba2V5XSwgc3RhdGUpCiAgICB9KS5qb2luKCcsJykpICsgIl0pIikKfQoKZnVuY3Rpb24gZ2VuU2NvcGVkU2xvdCAoCiAga2V5LAogIGVsLAogIHN0YXRlCikgewogIGlmIChlbC5mb3IgJiYgIWVsLmZvclByb2Nlc3NlZCkgewogICAgcmV0dXJuIGdlbkZvclNjb3BlZFNsb3Qoa2V5LCBlbCwgc3RhdGUpCiAgfQogIHZhciBmbiA9ICJmdW5jdGlvbigiICsgKFN0cmluZyhlbC5zbG90U2NvcGUpKSArICIpeyIgKwogICAgInJldHVybiAiICsgKGVsLnRhZyA9PT0gJ3RlbXBsYXRlJwogICAgICA/IGVsLmlmCiAgICAgICAgPyAoKGVsLmlmKSArICI/IiArIChnZW5DaGlsZHJlbihlbCwgc3RhdGUpIHx8ICd1bmRlZmluZWQnKSArICI6dW5kZWZpbmVkIikKICAgICAgICA6IGdlbkNoaWxkcmVuKGVsLCBzdGF0ZSkgfHwgJ3VuZGVmaW5lZCcKICAgICAgOiBnZW5FbGVtZW50KGVsLCBzdGF0ZSkpICsgIn0iOwogIHJldHVybiAoIntrZXk6IiArIGtleSArICIsZm46IiArIGZuICsgIn0iKQp9CgpmdW5jdGlvbiBnZW5Gb3JTY29wZWRTbG90ICgKICBrZXksCiAgZWwsCiAgc3RhdGUKKSB7CiAgdmFyIGV4cCA9IGVsLmZvcjsKICB2YXIgYWxpYXMgPSBlbC5hbGlhczsKICB2YXIgaXRlcmF0b3IxID0gZWwuaXRlcmF0b3IxID8gKCIsIiArIChlbC5pdGVyYXRvcjEpKSA6ICcnOwogIHZhciBpdGVyYXRvcjIgPSBlbC5pdGVyYXRvcjIgPyAoIiwiICsgKGVsLml0ZXJhdG9yMikpIDogJyc7CiAgZWwuZm9yUHJvY2Vzc2VkID0gdHJ1ZTsgLy8gYXZvaWQgcmVjdXJzaW9uCiAgcmV0dXJuICJfbCgoIiArIGV4cCArICIpLCIgKwogICAgImZ1bmN0aW9uKCIgKyBhbGlhcyArIGl0ZXJhdG9yMSArIGl0ZXJhdG9yMiArICIpeyIgKwogICAgICAicmV0dXJuICIgKyAoZ2VuU2NvcGVkU2xvdChrZXksIGVsLCBzdGF0ZSkpICsKICAgICd9KScKfQoKZnVuY3Rpb24gZ2VuQ2hpbGRyZW4gKAogIGVsLAogIHN0YXRlLAogIGNoZWNrU2tpcCwKICBhbHRHZW5FbGVtZW50LAogIGFsdEdlbk5vZGUKKSB7CiAgdmFyIGNoaWxkcmVuID0gZWwuY2hpbGRyZW47CiAgaWYgKGNoaWxkcmVuLmxlbmd0aCkgewogICAgdmFyIGVsJDEgPSBjaGlsZHJlblswXTsKICAgIC8vIG9wdGltaXplIHNpbmdsZSB2LWZvcgogICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJgogICAgICBlbCQxLmZvciAmJgogICAgICBlbCQxLnRhZyAhPT0gJ3RlbXBsYXRlJyAmJgogICAgICBlbCQxLnRhZyAhPT0gJ3Nsb3QnCiAgICApIHsKICAgICAgcmV0dXJuIChhbHRHZW5FbGVtZW50IHx8IGdlbkVsZW1lbnQpKGVsJDEsIHN0YXRlKQogICAgfQogICAgdmFyIG5vcm1hbGl6YXRpb25UeXBlID0gY2hlY2tTa2lwCiAgICAgID8gZ2V0Tm9ybWFsaXphdGlvblR5cGUoY2hpbGRyZW4sIHN0YXRlLm1heWJlQ29tcG9uZW50KQogICAgICA6IDA7CiAgICB2YXIgZ2VuID0gYWx0R2VuTm9kZSB8fCBnZW5Ob2RlOwogICAgcmV0dXJuICgiWyIgKyAoY2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChjKSB7IHJldHVybiBnZW4oYywgc3RhdGUpOyB9KS5qb2luKCcsJykpICsgIl0iICsgKG5vcm1hbGl6YXRpb25UeXBlID8gKCIsIiArIG5vcm1hbGl6YXRpb25UeXBlKSA6ICcnKSkKICB9Cn0KCi8vIGRldGVybWluZSB0aGUgbm9ybWFsaXphdGlvbiBuZWVkZWQgZm9yIHRoZSBjaGlsZHJlbiBhcnJheS4KLy8gMDogbm8gbm9ybWFsaXphdGlvbiBuZWVkZWQKLy8gMTogc2ltcGxlIG5vcm1hbGl6YXRpb24gbmVlZGVkIChwb3NzaWJsZSAxLWxldmVsIGRlZXAgbmVzdGVkIGFycmF5KQovLyAyOiBmdWxsIG5vcm1hbGl6YXRpb24gbmVlZGVkCmZ1bmN0aW9uIGdldE5vcm1hbGl6YXRpb25UeXBlICgKICBjaGlsZHJlbiwKICBtYXliZUNvbXBvbmVudAopIHsKICB2YXIgcmVzID0gMDsKICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgZWwgPSBjaGlsZHJlbltpXTsKICAgIGlmIChlbC50eXBlICE9PSAxKSB7CiAgICAgIGNvbnRpbnVlCiAgICB9CiAgICBpZiAobmVlZHNOb3JtYWxpemF0aW9uKGVsKSB8fAogICAgICAgIChlbC5pZkNvbmRpdGlvbnMgJiYgZWwuaWZDb25kaXRpb25zLnNvbWUoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIG5lZWRzTm9ybWFsaXphdGlvbihjLmJsb2NrKTsgfSkpKSB7CiAgICAgIHJlcyA9IDI7CiAgICAgIGJyZWFrCiAgICB9CiAgICBpZiAobWF5YmVDb21wb25lbnQoZWwpIHx8CiAgICAgICAgKGVsLmlmQ29uZGl0aW9ucyAmJiBlbC5pZkNvbmRpdGlvbnMuc29tZShmdW5jdGlvbiAoYykgeyByZXR1cm4gbWF5YmVDb21wb25lbnQoYy5ibG9jayk7IH0pKSkgewogICAgICByZXMgPSAxOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIG5lZWRzTm9ybWFsaXphdGlvbiAoZWwpIHsKICByZXR1cm4gZWwuZm9yICE9PSB1bmRlZmluZWQgfHwgZWwudGFnID09PSAndGVtcGxhdGUnIHx8IGVsLnRhZyA9PT0gJ3Nsb3QnCn0KCmZ1bmN0aW9uIGdlbk5vZGUgKG5vZGUsIHN0YXRlKSB7CiAgaWYgKG5vZGUudHlwZSA9PT0gMSkgewogICAgcmV0dXJuIGdlbkVsZW1lbnQobm9kZSwgc3RhdGUpCiAgfSBpZiAobm9kZS50eXBlID09PSAzICYmIG5vZGUuaXNDb21tZW50KSB7CiAgICByZXR1cm4gZ2VuQ29tbWVudChub2RlKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZ2VuVGV4dChub2RlKQogIH0KfQoKZnVuY3Rpb24gZ2VuVGV4dCAodGV4dCkgewogIHJldHVybiAoIl92KCIgKyAodGV4dC50eXBlID09PSAyCiAgICA/IHRleHQuZXhwcmVzc2lvbiAvLyBubyBuZWVkIGZvciAoKSBiZWNhdXNlIGFscmVhZHkgd3JhcHBlZCBpbiBfcygpCiAgICA6IHRyYW5zZm9ybVNwZWNpYWxOZXdsaW5lcyhKU09OLnN0cmluZ2lmeSh0ZXh0LnRleHQpKSkgKyAiKSIpCn0KCmZ1bmN0aW9uIGdlbkNvbW1lbnQgKGNvbW1lbnQpIHsKICByZXR1cm4gKCJfZSgiICsgKEpTT04uc3RyaW5naWZ5KGNvbW1lbnQudGV4dCkpICsgIikiKQp9CgpmdW5jdGlvbiBnZW5TbG90IChlbCwgc3RhdGUpIHsKICB2YXIgc2xvdE5hbWUgPSBlbC5zbG90TmFtZSB8fCAnImRlZmF1bHQiJzsKICB2YXIgY2hpbGRyZW4gPSBnZW5DaGlsZHJlbihlbCwgc3RhdGUpOwogIHZhciByZXMgPSAiX3QoIiArIHNsb3ROYW1lICsgKGNoaWxkcmVuID8gKCIsIiArIGNoaWxkcmVuKSA6ICcnKTsKICB2YXIgYXR0cnMgPSBlbC5hdHRycyAmJiAoInsiICsgKGVsLmF0dHJzLm1hcChmdW5jdGlvbiAoYSkgeyByZXR1cm4gKChjYW1lbGl6ZShhLm5hbWUpKSArICI6IiArIChhLnZhbHVlKSk7IH0pLmpvaW4oJywnKSkgKyAifSIpOwogIHZhciBiaW5kJCQxID0gZWwuYXR0cnNNYXBbJ3YtYmluZCddOwogIGlmICgoYXR0cnMgfHwgYmluZCQkMSkgJiYgIWNoaWxkcmVuKSB7CiAgICByZXMgKz0gIixudWxsIjsKICB9CiAgaWYgKGF0dHJzKSB7CiAgICByZXMgKz0gIiwiICsgYXR0cnM7CiAgfQogIGlmIChiaW5kJCQxKSB7CiAgICByZXMgKz0gKGF0dHJzID8gJycgOiAnLG51bGwnKSArICIsIiArIGJpbmQkJDE7CiAgfQogIHJldHVybiByZXMgKyAnKScKfQoKLy8gY29tcG9uZW50TmFtZSBpcyBlbC5jb21wb25lbnQsIHRha2UgaXQgYXMgYXJndW1lbnQgdG8gc2h1biBmbG93J3MgcGVzc2ltaXN0aWMgcmVmaW5lbWVudApmdW5jdGlvbiBnZW5Db21wb25lbnQgKAogIGNvbXBvbmVudE5hbWUsCiAgZWwsCiAgc3RhdGUKKSB7CiAgdmFyIGNoaWxkcmVuID0gZWwuaW5saW5lVGVtcGxhdGUgPyBudWxsIDogZ2VuQ2hpbGRyZW4oZWwsIHN0YXRlLCB0cnVlKTsKICByZXR1cm4gKCJfYygiICsgY29tcG9uZW50TmFtZSArICIsIiArIChnZW5EYXRhJDIoZWwsIHN0YXRlKSkgKyAoY2hpbGRyZW4gPyAoIiwiICsgY2hpbGRyZW4pIDogJycpICsgIikiKQp9CgpmdW5jdGlvbiBnZW5Qcm9wcyAocHJvcHMpIHsKICB2YXIgcmVzID0gJyc7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgdmFyIHByb3AgPSBwcm9wc1tpXTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgewogICAgICByZXMgKz0gIlwiIiArIChwcm9wLm5hbWUpICsgIlwiOiIgKyAodHJhbnNmb3JtU3BlY2lhbE5ld2xpbmVzKHByb3AudmFsdWUpKSArICIsIjsKICAgIH0KICB9CiAgcmV0dXJuIHJlcy5zbGljZSgwLCAtMSkKfQoKLy8gIzM4OTUsICM0MjY4CmZ1bmN0aW9uIHRyYW5zZm9ybVNwZWNpYWxOZXdsaW5lcyAodGV4dCkgewogIHJldHVybiB0ZXh0CiAgICAucmVwbGFjZSgvXHUyMDI4L2csICdcXHUyMDI4JykKICAgIC5yZXBsYWNlKC9cdTIwMjkvZywgJ1xcdTIwMjknKQp9CgovKiAgKi8KCi8vIHRoZXNlIGtleXdvcmRzIHNob3VsZCBub3QgYXBwZWFyIGluc2lkZSBleHByZXNzaW9ucywgYnV0IG9wZXJhdG9ycyBsaWtlCi8vIHR5cGVvZiwgaW5zdGFuY2VvZiBhbmQgaW4gYXJlIGFsbG93ZWQKdmFyIHByb2hpYml0ZWRLZXl3b3JkUkUgPSBuZXcgUmVnRXhwKCdcXGInICsgKAogICdkbyxpZixmb3IsbGV0LG5ldyx0cnksdmFyLGNhc2UsZWxzZSx3aXRoLGF3YWl0LGJyZWFrLGNhdGNoLGNsYXNzLGNvbnN0LCcgKwogICdzdXBlcix0aHJvdyx3aGlsZSx5aWVsZCxkZWxldGUsZXhwb3J0LGltcG9ydCxyZXR1cm4sc3dpdGNoLGRlZmF1bHQsJyArCiAgJ2V4dGVuZHMsZmluYWxseSxjb250aW51ZSxkZWJ1Z2dlcixmdW5jdGlvbixhcmd1bWVudHMnCikuc3BsaXQoJywnKS5qb2luKCdcXGJ8XFxiJykgKyAnXFxiJyk7CgovLyB0aGVzZSB1bmFyeSBvcGVyYXRvcnMgc2hvdWxkIG5vdCBiZSB1c2VkIGFzIHByb3BlcnR5L21ldGhvZCBuYW1lcwp2YXIgdW5hcnlPcGVyYXRvcnNSRSA9IG5ldyBSZWdFeHAoJ1xcYicgKyAoCiAgJ2RlbGV0ZSx0eXBlb2Ysdm9pZCcKKS5zcGxpdCgnLCcpLmpvaW4oJ1xccypcXChbXlxcKV0qXFwpfFxcYicpICsgJ1xccypcXChbXlxcKV0qXFwpJyk7CgovLyBzdHJpcCBzdHJpbmdzIGluIGV4cHJlc3Npb25zCnZhciBzdHJpcFN0cmluZ1JFID0gLycoPzpbXidcXF18XFwuKSonfCIoPzpbXiJcXF18XFwuKSoifGAoPzpbXmBcXF18XFwuKSpcJFx7fFx9KD86W15gXFxdfFxcLikqYHxgKD86W15gXFxdfFxcLikqYC9nOwoKLy8gZGV0ZWN0IHByb2JsZW1hdGljIGV4cHJlc3Npb25zIGluIGEgdGVtcGxhdGUKZnVuY3Rpb24gZGV0ZWN0RXJyb3JzIChhc3QpIHsKICB2YXIgZXJyb3JzID0gW107CiAgaWYgKGFzdCkgewogICAgY2hlY2tOb2RlKGFzdCwgZXJyb3JzKTsKICB9CiAgcmV0dXJuIGVycm9ycwp9CgpmdW5jdGlvbiBjaGVja05vZGUgKG5vZGUsIGVycm9ycykgewogIGlmIChub2RlLnR5cGUgPT09IDEpIHsKICAgIGZvciAodmFyIG5hbWUgaW4gbm9kZS5hdHRyc01hcCkgewogICAgICBpZiAoZGlyUkUudGVzdChuYW1lKSkgewogICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuYXR0cnNNYXBbbmFtZV07CiAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICBpZiAobmFtZSA9PT0gJ3YtZm9yJykgewogICAgICAgICAgICBjaGVja0Zvcihub2RlLCAoInYtZm9yPVwiIiArIHZhbHVlICsgIlwiIiksIGVycm9ycyk7CiAgICAgICAgICB9IGVsc2UgaWYgKG9uUkUudGVzdChuYW1lKSkgewogICAgICAgICAgICBjaGVja0V2ZW50KHZhbHVlLCAobmFtZSArICI9XCIiICsgdmFsdWUgKyAiXCIiKSwgZXJyb3JzKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNoZWNrRXhwcmVzc2lvbih2YWx1ZSwgKG5hbWUgKyAiPVwiIiArIHZhbHVlICsgIlwiIiksIGVycm9ycyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAobm9kZS5jaGlsZHJlbikgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICBjaGVja05vZGUobm9kZS5jaGlsZHJlbltpXSwgZXJyb3JzKTsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAyKSB7CiAgICBjaGVja0V4cHJlc3Npb24obm9kZS5leHByZXNzaW9uLCBub2RlLnRleHQsIGVycm9ycyk7CiAgfQp9CgpmdW5jdGlvbiBjaGVja0V2ZW50IChleHAsIHRleHQsIGVycm9ycykgewogIHZhciBzdGlwcGVkID0gZXhwLnJlcGxhY2Uoc3RyaXBTdHJpbmdSRSwgJycpOwogIHZhciBrZXl3b3JkTWF0Y2ggPSBzdGlwcGVkLm1hdGNoKHVuYXJ5T3BlcmF0b3JzUkUpOwogIGlmIChrZXl3b3JkTWF0Y2ggJiYgc3RpcHBlZC5jaGFyQXQoa2V5d29yZE1hdGNoLmluZGV4IC0gMSkgIT09ICckJykgewogICAgZXJyb3JzLnB1c2goCiAgICAgICJhdm9pZCB1c2luZyBKYXZhU2NyaXB0IHVuYXJ5IG9wZXJhdG9yIGFzIHByb3BlcnR5IG5hbWU6ICIgKwogICAgICAiXCIiICsgKGtleXdvcmRNYXRjaFswXSkgKyAiXCIgaW4gZXhwcmVzc2lvbiAiICsgKHRleHQudHJpbSgpKQogICAgKTsKICB9CiAgY2hlY2tFeHByZXNzaW9uKGV4cCwgdGV4dCwgZXJyb3JzKTsKfQoKZnVuY3Rpb24gY2hlY2tGb3IgKG5vZGUsIHRleHQsIGVycm9ycykgewogIGNoZWNrRXhwcmVzc2lvbihub2RlLmZvciB8fCAnJywgdGV4dCwgZXJyb3JzKTsKICBjaGVja0lkZW50aWZpZXIobm9kZS5hbGlhcywgJ3YtZm9yIGFsaWFzJywgdGV4dCwgZXJyb3JzKTsKICBjaGVja0lkZW50aWZpZXIobm9kZS5pdGVyYXRvcjEsICd2LWZvciBpdGVyYXRvcicsIHRleHQsIGVycm9ycyk7CiAgY2hlY2tJZGVudGlmaWVyKG5vZGUuaXRlcmF0b3IyLCAndi1mb3IgaXRlcmF0b3InLCB0ZXh0LCBlcnJvcnMpOwp9CgpmdW5jdGlvbiBjaGVja0lkZW50aWZpZXIgKAogIGlkZW50LAogIHR5cGUsCiAgdGV4dCwKICBlcnJvcnMKKSB7CiAgaWYgKHR5cGVvZiBpZGVudCA9PT0gJ3N0cmluZycpIHsKICAgIHRyeSB7CiAgICAgIG5ldyBGdW5jdGlvbigoInZhciAiICsgaWRlbnQgKyAiPV8iKSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGVycm9ycy5wdXNoKCgiaW52YWxpZCAiICsgdHlwZSArICIgXCIiICsgaWRlbnQgKyAiXCIgaW4gZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkpKTsKICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGNoZWNrRXhwcmVzc2lvbiAoZXhwLCB0ZXh0LCBlcnJvcnMpIHsKICB0cnkgewogICAgbmV3IEZ1bmN0aW9uKCgicmV0dXJuICIgKyBleHApKTsKICB9IGNhdGNoIChlKSB7CiAgICB2YXIga2V5d29yZE1hdGNoID0gZXhwLnJlcGxhY2Uoc3RyaXBTdHJpbmdSRSwgJycpLm1hdGNoKHByb2hpYml0ZWRLZXl3b3JkUkUpOwogICAgaWYgKGtleXdvcmRNYXRjaCkgewogICAgICBlcnJvcnMucHVzaCgKICAgICAgICAiYXZvaWQgdXNpbmcgSmF2YVNjcmlwdCBrZXl3b3JkIGFzIHByb3BlcnR5IG5hbWU6ICIgKwogICAgICAgICJcIiIgKyAoa2V5d29yZE1hdGNoWzBdKSArICJcIlxuICBSYXcgZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkKICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIGVycm9ycy5wdXNoKAogICAgICAgICJpbnZhbGlkIGV4cHJlc3Npb246ICIgKyAoZS5tZXNzYWdlKSArICIgaW5cblxuIiArCiAgICAgICAgIiAgICAiICsgZXhwICsgIlxuXG4iICsKICAgICAgICAiICBSYXcgZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkgKyAiXG4iCiAgICAgICk7CiAgICB9CiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uIChjb2RlLCBlcnJvcnMpIHsKICB0cnkgewogICAgcmV0dXJuIG5ldyBGdW5jdGlvbihjb2RlKQogIH0gY2F0Y2ggKGVycikgewogICAgZXJyb3JzLnB1c2goeyBlcnI6IGVyciwgY29kZTogY29kZSB9KTsKICAgIHJldHVybiBub29wCiAgfQp9CgpmdW5jdGlvbiBjcmVhdGVDb21waWxlVG9GdW5jdGlvbkZuIChjb21waWxlKSB7CiAgdmFyIGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKCiAgcmV0dXJuIGZ1bmN0aW9uIGNvbXBpbGVUb0Z1bmN0aW9ucyAoCiAgICB0ZW1wbGF0ZSwKICAgIG9wdGlvbnMsCiAgICB2bQogICkgewogICAgb3B0aW9ucyA9IGV4dGVuZCh7fSwgb3B0aW9ucyk7CiAgICB2YXIgd2FybiQkMSA9IG9wdGlvbnMud2FybiB8fCB3YXJuOwogICAgZGVsZXRlIG9wdGlvbnMud2FybjsKCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIHsKICAgICAgLy8gZGV0ZWN0IHBvc3NpYmxlIENTUCByZXN0cmljdGlvbgogICAgICB0cnkgewogICAgICAgIG5ldyBGdW5jdGlvbigncmV0dXJuIDEnKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChlLnRvU3RyaW5nKCkubWF0Y2goL3Vuc2FmZS1ldmFsfENTUC8pKSB7CiAgICAgICAgICB3YXJuJCQxKAogICAgICAgICAgICAnSXQgc2VlbXMgeW91IGFyZSB1c2luZyB0aGUgc3RhbmRhbG9uZSBidWlsZCBvZiBWdWUuanMgaW4gYW4gJyArCiAgICAgICAgICAgICdlbnZpcm9ubWVudCB3aXRoIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IHRoYXQgcHJvaGliaXRzIHVuc2FmZS1ldmFsLiAnICsKICAgICAgICAgICAgJ1RoZSB0ZW1wbGF0ZSBjb21waWxlciBjYW5ub3Qgd29yayBpbiB0aGlzIGVudmlyb25tZW50LiBDb25zaWRlciAnICsKICAgICAgICAgICAgJ3JlbGF4aW5nIHRoZSBwb2xpY3kgdG8gYWxsb3cgdW5zYWZlLWV2YWwgb3IgcHJlLWNvbXBpbGluZyB5b3VyICcgKwogICAgICAgICAgICAndGVtcGxhdGVzIGludG8gcmVuZGVyIGZ1bmN0aW9ucy4nCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIGNoZWNrIGNhY2hlCiAgICB2YXIga2V5ID0gb3B0aW9ucy5kZWxpbWl0ZXJzCiAgICAgID8gU3RyaW5nKG9wdGlvbnMuZGVsaW1pdGVycykgKyB0ZW1wbGF0ZQogICAgICA6IHRlbXBsYXRlOwogICAgaWYgKGNhY2hlW2tleV0pIHsKICAgICAgcmV0dXJuIGNhY2hlW2tleV0KICAgIH0KCiAgICAvLyBjb21waWxlCiAgICB2YXIgY29tcGlsZWQgPSBjb21waWxlKHRlbXBsYXRlLCBvcHRpb25zKTsKCiAgICAvLyBjaGVjayBjb21waWxhdGlvbiBlcnJvcnMvdGlwcwogICAgewogICAgICBpZiAoY29tcGlsZWQuZXJyb3JzICYmIGNvbXBpbGVkLmVycm9ycy5sZW5ndGgpIHsKICAgICAgICB3YXJuJCQxKAogICAgICAgICAgIkVycm9yIGNvbXBpbGluZyB0ZW1wbGF0ZTpcblxuIiArIHRlbXBsYXRlICsgIlxuXG4iICsKICAgICAgICAgIGNvbXBpbGVkLmVycm9ycy5tYXAoZnVuY3Rpb24gKGUpIHsgcmV0dXJuICgiLSAiICsgZSk7IH0pLmpvaW4oJ1xuJykgKyAnXG4nLAogICAgICAgICAgdm0KICAgICAgICApOwogICAgICB9CiAgICAgIGlmIChjb21waWxlZC50aXBzICYmIGNvbXBpbGVkLnRpcHMubGVuZ3RoKSB7CiAgICAgICAgY29tcGlsZWQudGlwcy5mb3JFYWNoKGZ1bmN0aW9uIChtc2cpIHsgcmV0dXJuIHRpcChtc2csIHZtKTsgfSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyB0dXJuIGNvZGUgaW50byBmdW5jdGlvbnMKICAgIHZhciByZXMgPSB7fTsKICAgIHZhciBmbkdlbkVycm9ycyA9IFtdOwogICAgcmVzLnJlbmRlciA9IGNyZWF0ZUZ1bmN0aW9uKGNvbXBpbGVkLnJlbmRlciwgZm5HZW5FcnJvcnMpOwogICAgcmVzLnN0YXRpY1JlbmRlckZucyA9IGNvbXBpbGVkLnN0YXRpY1JlbmRlckZucy5tYXAoZnVuY3Rpb24gKGNvZGUpIHsKICAgICAgcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uKGNvZGUsIGZuR2VuRXJyb3JzKQogICAgfSk7CgogICAgLy8gY2hlY2sgZnVuY3Rpb24gZ2VuZXJhdGlvbiBlcnJvcnMuCiAgICAvLyB0aGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB0aGVyZSBpcyBhIGJ1ZyBpbiB0aGUgY29tcGlsZXIgaXRzZWxmLgogICAgLy8gbW9zdGx5IGZvciBjb2RlZ2VuIGRldmVsb3BtZW50IHVzZQogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICB7CiAgICAgIGlmICgoIWNvbXBpbGVkLmVycm9ycyB8fCAhY29tcGlsZWQuZXJyb3JzLmxlbmd0aCkgJiYgZm5HZW5FcnJvcnMubGVuZ3RoKSB7CiAgICAgICAgd2FybiQkMSgKICAgICAgICAgICJGYWlsZWQgdG8gZ2VuZXJhdGUgcmVuZGVyIGZ1bmN0aW9uOlxuXG4iICsKICAgICAgICAgIGZuR2VuRXJyb3JzLm1hcChmdW5jdGlvbiAocmVmKSB7CiAgICAgICAgICAgIHZhciBlcnIgPSByZWYuZXJyOwogICAgICAgICAgICB2YXIgY29kZSA9IHJlZi5jb2RlOwoKICAgICAgICAgICAgcmV0dXJuICgoZXJyLnRvU3RyaW5nKCkpICsgIiBpblxuXG4iICsgY29kZSArICJcbiIpOwogICAgICAgIH0pLmpvaW4oJ1xuJyksCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gKGNhY2hlW2tleV0gPSByZXMpCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUNvbXBpbGVyQ3JlYXRvciAoYmFzZUNvbXBpbGUpIHsKICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlQ29tcGlsZXIgKGJhc2VPcHRpb25zKSB7CiAgICBmdW5jdGlvbiBjb21waWxlICgKICAgICAgdGVtcGxhdGUsCiAgICAgIG9wdGlvbnMKICAgICkgewogICAgICB2YXIgZmluYWxPcHRpb25zID0gT2JqZWN0LmNyZWF0ZShiYXNlT3B0aW9ucyk7CiAgICAgIHZhciBlcnJvcnMgPSBbXTsKICAgICAgdmFyIHRpcHMgPSBbXTsKICAgICAgZmluYWxPcHRpb25zLndhcm4gPSBmdW5jdGlvbiAobXNnLCB0aXApIHsKICAgICAgICAodGlwID8gdGlwcyA6IGVycm9ycykucHVzaChtc2cpOwogICAgICB9OwoKICAgICAgaWYgKG9wdGlvbnMpIHsKICAgICAgICAvLyBtZXJnZSBjdXN0b20gbW9kdWxlcwogICAgICAgIGlmIChvcHRpb25zLm1vZHVsZXMpIHsKICAgICAgICAgIGZpbmFsT3B0aW9ucy5tb2R1bGVzID0KICAgICAgICAgICAgKGJhc2VPcHRpb25zLm1vZHVsZXMgfHwgW10pLmNvbmNhdChvcHRpb25zLm1vZHVsZXMpOwogICAgICAgIH0KICAgICAgICAvLyBtZXJnZSBjdXN0b20gZGlyZWN0aXZlcwogICAgICAgIGlmIChvcHRpb25zLmRpcmVjdGl2ZXMpIHsKICAgICAgICAgIGZpbmFsT3B0aW9ucy5kaXJlY3RpdmVzID0gZXh0ZW5kKAogICAgICAgICAgICBPYmplY3QuY3JlYXRlKGJhc2VPcHRpb25zLmRpcmVjdGl2ZXMgfHwgbnVsbCksCiAgICAgICAgICAgIG9wdGlvbnMuZGlyZWN0aXZlcwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgLy8gY29weSBvdGhlciBvcHRpb25zCiAgICAgICAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMpIHsKICAgICAgICAgIGlmIChrZXkgIT09ICdtb2R1bGVzJyAmJiBrZXkgIT09ICdkaXJlY3RpdmVzJykgewogICAgICAgICAgICBmaW5hbE9wdGlvbnNba2V5XSA9IG9wdGlvbnNba2V5XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciBjb21waWxlZCA9IGJhc2VDb21waWxlKHRlbXBsYXRlLCBmaW5hbE9wdGlvbnMpOwogICAgICB7CiAgICAgICAgZXJyb3JzLnB1c2guYXBwbHkoZXJyb3JzLCBkZXRlY3RFcnJvcnMoY29tcGlsZWQuYXN0KSk7CiAgICAgIH0KICAgICAgY29tcGlsZWQuZXJyb3JzID0gZXJyb3JzOwogICAgICBjb21waWxlZC50aXBzID0gdGlwczsKICAgICAgcmV0dXJuIGNvbXBpbGVkCiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgY29tcGlsZTogY29tcGlsZSwKICAgICAgY29tcGlsZVRvRnVuY3Rpb25zOiBjcmVhdGVDb21waWxlVG9GdW5jdGlvbkZuKGNvbXBpbGUpCiAgICB9CiAgfQp9CgovKiAgKi8KCi8vIGBjcmVhdGVDb21waWxlckNyZWF0b3JgIGFsbG93cyBjcmVhdGluZyBjb21waWxlcnMgdGhhdCB1c2UgYWx0ZXJuYXRpdmUKLy8gcGFyc2VyL29wdGltaXplci9jb2RlZ2VuLCBlLmcgdGhlIFNTUiBvcHRpbWl6aW5nIGNvbXBpbGVyLgovLyBIZXJlIHdlIGp1c3QgZXhwb3J0IGEgZGVmYXVsdCBjb21waWxlciB1c2luZyB0aGUgZGVmYXVsdCBwYXJ0cy4KdmFyIGNyZWF0ZUNvbXBpbGVyID0gY3JlYXRlQ29tcGlsZXJDcmVhdG9yKGZ1bmN0aW9uIGJhc2VDb21waWxlICgKICB0ZW1wbGF0ZSwKICBvcHRpb25zCikgewogIHZhciBhc3QgPSBwYXJzZSh0ZW1wbGF0ZS50cmltKCksIG9wdGlvbnMpOwogIGlmIChvcHRpb25zLm9wdGltaXplICE9PSBmYWxzZSkgewogICAgb3B0aW1pemUoYXN0LCBvcHRpb25zKTsKICB9CiAgdmFyIGNvZGUgPSBnZW5lcmF0ZShhc3QsIG9wdGlvbnMpOwogIHJldHVybiB7CiAgICBhc3Q6IGFzdCwKICAgIHJlbmRlcjogY29kZS5yZW5kZXIsCiAgICBzdGF0aWNSZW5kZXJGbnM6IGNvZGUuc3RhdGljUmVuZGVyRm5zCiAgfQp9KTsKCi8qICAqLwoKdmFyIHJlZiQxID0gY3JlYXRlQ29tcGlsZXIoYmFzZU9wdGlvbnMpOwp2YXIgY29tcGlsZVRvRnVuY3Rpb25zID0gcmVmJDEuY29tcGlsZVRvRnVuY3Rpb25zOwoKLyogICovCgovLyBjaGVjayB3aGV0aGVyIGN1cnJlbnQgYnJvd3NlciBlbmNvZGVzIGEgY2hhciBpbnNpZGUgYXR0cmlidXRlIHZhbHVlcwp2YXIgZGl2OwpmdW5jdGlvbiBnZXRTaG91bGREZWNvZGUgKGhyZWYpIHsKICBkaXYgPSBkaXYgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgZGl2LmlubmVySFRNTCA9IGhyZWYgPyAiPGEgaHJlZj1cIlxuXCIvPiIgOiAiPGRpdiBhPVwiXG5cIi8+IjsKICByZXR1cm4gZGl2LmlubmVySFRNTC5pbmRleE9mKCcmIzEwOycpID4gMAp9CgovLyAjMzY2MzogSUUgZW5jb2RlcyBuZXdsaW5lcyBpbnNpZGUgYXR0cmlidXRlIHZhbHVlcyB3aGlsZSBvdGhlciBicm93c2VycyBkb24ndAp2YXIgc2hvdWxkRGVjb2RlTmV3bGluZXMgPSBpbkJyb3dzZXIgPyBnZXRTaG91bGREZWNvZGUoZmFsc2UpIDogZmFsc2U7Ci8vICM2ODI4OiBjaHJvbWUgZW5jb2RlcyBjb250ZW50IGluIGFbaHJlZl0KdmFyIHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZiA9IGluQnJvd3NlciA/IGdldFNob3VsZERlY29kZSh0cnVlKSA6IGZhbHNlOwoKLyogICovCgp2YXIgaWRUb1RlbXBsYXRlID0gY2FjaGVkKGZ1bmN0aW9uIChpZCkgewogIHZhciBlbCA9IHF1ZXJ5KGlkKTsKICByZXR1cm4gZWwgJiYgZWwuaW5uZXJIVE1MCn0pOwoKdmFyIG1vdW50ID0gVnVlLnByb3RvdHlwZS4kbW91bnQ7ClZ1ZS5wcm90b3R5cGUuJG1vdW50ID0gZnVuY3Rpb24gKAogIGVsLAogIGh5ZHJhdGluZwopIHsKICBlbCA9IGVsICYmIHF1ZXJ5KGVsKTsKCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGVsID09PSBkb2N1bWVudC5ib2R5IHx8IGVsID09PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHsKICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAiRG8gbm90IG1vdW50IFZ1ZSB0byA8aHRtbD4gb3IgPGJvZHk+IC0gbW91bnQgdG8gbm9ybWFsIGVsZW1lbnRzIGluc3RlYWQuIgogICAgKTsKICAgIHJldHVybiB0aGlzCiAgfQoKICB2YXIgb3B0aW9ucyA9IHRoaXMuJG9wdGlvbnM7CiAgLy8gcmVzb2x2ZSB0ZW1wbGF0ZS9lbCBhbmQgY29udmVydCB0byByZW5kZXIgZnVuY3Rpb24KICBpZiAoIW9wdGlvbnMucmVuZGVyKSB7CiAgICB2YXIgdGVtcGxhdGUgPSBvcHRpb25zLnRlbXBsYXRlOwogICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgaWYgKHRlbXBsYXRlLmNoYXJBdCgwKSA9PT0gJyMnKSB7CiAgICAgICAgICB0ZW1wbGF0ZSA9IGlkVG9UZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgIXRlbXBsYXRlKSB7CiAgICAgICAgICAgIHdhcm4oCiAgICAgICAgICAgICAgKCJUZW1wbGF0ZSBlbGVtZW50IG5vdCBmb3VuZCBvciBpcyBlbXB0eTogIiArIChvcHRpb25zLnRlbXBsYXRlKSksCiAgICAgICAgICAgICAgdGhpcwogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0ZW1wbGF0ZS5ub2RlVHlwZSkgewogICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUuaW5uZXJIVE1MOwogICAgICB9IGVsc2UgewogICAgICAgIHsKICAgICAgICAgIHdhcm4oJ2ludmFsaWQgdGVtcGxhdGUgb3B0aW9uOicgKyB0ZW1wbGF0ZSwgdGhpcyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzCiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWwpIHsKICAgICAgdGVtcGxhdGUgPSBnZXRPdXRlckhUTUwoZWwpOwogICAgfQogICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNvbmZpZy5wZXJmb3JtYW5jZSAmJiBtYXJrKSB7CiAgICAgICAgbWFyaygnY29tcGlsZScpOwogICAgICB9CgogICAgICB2YXIgcmVmID0gY29tcGlsZVRvRnVuY3Rpb25zKHRlbXBsYXRlLCB7CiAgICAgICAgc2hvdWxkRGVjb2RlTmV3bGluZXM6IHNob3VsZERlY29kZU5ld2xpbmVzLAogICAgICAgIHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjogc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmLAogICAgICAgIGRlbGltaXRlcnM6IG9wdGlvbnMuZGVsaW1pdGVycywKICAgICAgICBjb21tZW50czogb3B0aW9ucy5jb21tZW50cwogICAgICB9LCB0aGlzKTsKICAgICAgdmFyIHJlbmRlciA9IHJlZi5yZW5kZXI7CiAgICAgIHZhciBzdGF0aWNSZW5kZXJGbnMgPSByZWYuc3RhdGljUmVuZGVyRm5zOwogICAgICBvcHRpb25zLnJlbmRlciA9IHJlbmRlcjsKICAgICAgb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBzdGF0aWNSZW5kZXJGbnM7CgogICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjb25maWcucGVyZm9ybWFuY2UgJiYgbWFyaykgewogICAgICAgIG1hcmsoJ2NvbXBpbGUgZW5kJyk7CiAgICAgICAgbWVhc3VyZSgoInZ1ZSAiICsgKHRoaXMuX25hbWUpICsgIiBjb21waWxlIiksICdjb21waWxlJywgJ2NvbXBpbGUgZW5kJyk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIG1vdW50LmNhbGwodGhpcywgZWwsIGh5ZHJhdGluZykKfTsKCi8qKgogKiBHZXQgb3V0ZXJIVE1MIG9mIGVsZW1lbnRzLCB0YWtpbmcgY2FyZQogKiBvZiBTVkcgZWxlbWVudHMgaW4gSUUgYXMgd2VsbC4KICovCmZ1bmN0aW9uIGdldE91dGVySFRNTCAoZWwpIHsKICBpZiAoZWwub3V0ZXJIVE1MKSB7CiAgICByZXR1cm4gZWwub3V0ZXJIVE1MCiAgfSBlbHNlIHsKICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbC5jbG9uZU5vZGUodHJ1ZSkpOwogICAgcmV0dXJuIGNvbnRhaW5lci5pbm5lckhUTUwKICB9Cn0KClZ1ZS5jb21waWxlID0gY29tcGlsZVRvRnVuY3Rpb25zOwoKcmV0dXJuIFZ1ZTsKCn0pKSk7Cg==" >
		<script type="text/javascript" src="data:/text/plain;base64,LyohCiAqIFZ1ZS5qcyB2Mi41LjE3CiAqIChjKSAyMDE0LTIwMTggRXZhbiBZb3UKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogKi8KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsKCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDoKCXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6CgkoZ2xvYmFsLlZ1ZSA9IGZhY3RvcnkoKSk7Cn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOwoKLyogICovCgp2YXIgZW1wdHlPYmplY3QgPSBPYmplY3QuZnJlZXplKHt9KTsKCi8vIHRoZXNlIGhlbHBlcnMgcHJvZHVjZXMgYmV0dGVyIHZtIGNvZGUgaW4gSlMgZW5naW5lcyBkdWUgdG8gdGhlaXIKLy8gZXhwbGljaXRuZXNzIGFuZCBmdW5jdGlvbiBpbmxpbmluZwpmdW5jdGlvbiBpc1VuZGVmICh2KSB7CiAgcmV0dXJuIHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSBudWxsCn0KCmZ1bmN0aW9uIGlzRGVmICh2KSB7CiAgcmV0dXJuIHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsCn0KCmZ1bmN0aW9uIGlzVHJ1ZSAodikgewogIHJldHVybiB2ID09PSB0cnVlCn0KCmZ1bmN0aW9uIGlzRmFsc2UgKHYpIHsKICByZXR1cm4gdiA9PT0gZmFsc2UKfQoKLyoqCiAqIENoZWNrIGlmIHZhbHVlIGlzIHByaW1pdGl2ZQogKi8KZnVuY3Rpb24gaXNQcmltaXRpdmUgKHZhbHVlKSB7CiAgcmV0dXJuICgKICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwKICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwKICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgdHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJyB8fAogICAgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicKICApCn0KCi8qKgogKiBRdWljayBvYmplY3QgY2hlY2sgLSB0aGlzIGlzIHByaW1hcmlseSB1c2VkIHRvIHRlbGwKICogT2JqZWN0cyBmcm9tIHByaW1pdGl2ZSB2YWx1ZXMgd2hlbiB3ZSBrbm93IHRoZSB2YWx1ZQogKiBpcyBhIEpTT04tY29tcGxpYW50IHR5cGUuCiAqLwpmdW5jdGlvbiBpc09iamVjdCAob2JqKSB7CiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jwp9CgovKioKICogR2V0IHRoZSByYXcgdHlwZSBzdHJpbmcgb2YgYSB2YWx1ZSBlLmcuIFtvYmplY3QgT2JqZWN0XQogKi8KdmFyIF90b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CgpmdW5jdGlvbiB0b1Jhd1R5cGUgKHZhbHVlKSB7CiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSkKfQoKLyoqCiAqIFN0cmljdCBvYmplY3QgdHlwZSBjaGVjay4gT25seSByZXR1cm5zIHRydWUKICogZm9yIHBsYWluIEphdmFTY3JpcHQgb2JqZWN0cy4KICovCmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QgKG9iaikgewogIHJldHVybiBfdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBPYmplY3RdJwp9CgpmdW5jdGlvbiBpc1JlZ0V4cCAodikgewogIHJldHVybiBfdG9TdHJpbmcuY2FsbCh2KSA9PT0gJ1tvYmplY3QgUmVnRXhwXScKfQoKLyoqCiAqIENoZWNrIGlmIHZhbCBpcyBhIHZhbGlkIGFycmF5IGluZGV4LgogKi8KZnVuY3Rpb24gaXNWYWxpZEFycmF5SW5kZXggKHZhbCkgewogIHZhciBuID0gcGFyc2VGbG9hdChTdHJpbmcodmFsKSk7CiAgcmV0dXJuIG4gPj0gMCAmJiBNYXRoLmZsb29yKG4pID09PSBuICYmIGlzRmluaXRlKHZhbCkKfQoKLyoqCiAqIENvbnZlcnQgYSB2YWx1ZSB0byBhIHN0cmluZyB0aGF0IGlzIGFjdHVhbGx5IHJlbmRlcmVkLgogKi8KZnVuY3Rpb24gdG9TdHJpbmcgKHZhbCkgewogIHJldHVybiB2YWwgPT0gbnVsbAogICAgPyAnJwogICAgOiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JwogICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbCwgbnVsbCwgMikKICAgICAgOiBTdHJpbmcodmFsKQp9CgovKioKICogQ29udmVydCBhIGlucHV0IHZhbHVlIHRvIGEgbnVtYmVyIGZvciBwZXJzaXN0ZW5jZS4KICogSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMsIHJldHVybiBvcmlnaW5hbCBzdHJpbmcuCiAqLwpmdW5jdGlvbiB0b051bWJlciAodmFsKSB7CiAgdmFyIG4gPSBwYXJzZUZsb2F0KHZhbCk7CiAgcmV0dXJuIGlzTmFOKG4pID8gdmFsIDogbgp9CgovKioKICogTWFrZSBhIG1hcCBhbmQgcmV0dXJuIGEgZnVuY3Rpb24gZm9yIGNoZWNraW5nIGlmIGEga2V5CiAqIGlzIGluIHRoYXQgbWFwLgogKi8KZnVuY3Rpb24gbWFrZU1hcCAoCiAgc3RyLAogIGV4cGVjdHNMb3dlckNhc2UKKSB7CiAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgdmFyIGxpc3QgPSBzdHIuc3BsaXQoJywnKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgIG1hcFtsaXN0W2ldXSA9IHRydWU7CiAgfQogIHJldHVybiBleHBlY3RzTG93ZXJDYXNlCiAgICA/IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWwudG9Mb3dlckNhc2UoKV07IH0KICAgIDogZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gbWFwW3ZhbF07IH0KfQoKLyoqCiAqIENoZWNrIGlmIGEgdGFnIGlzIGEgYnVpbHQtaW4gdGFnLgogKi8KdmFyIGlzQnVpbHRJblRhZyA9IG1ha2VNYXAoJ3Nsb3QsY29tcG9uZW50JywgdHJ1ZSk7CgovKioKICogQ2hlY2sgaWYgYSBhdHRyaWJ1dGUgaXMgYSByZXNlcnZlZCBhdHRyaWJ1dGUuCiAqLwp2YXIgaXNSZXNlcnZlZEF0dHJpYnV0ZSA9IG1ha2VNYXAoJ2tleSxyZWYsc2xvdCxzbG90LXNjb3BlLGlzJyk7CgovKioKICogUmVtb3ZlIGFuIGl0ZW0gZnJvbSBhbiBhcnJheQogKi8KZnVuY3Rpb24gcmVtb3ZlIChhcnIsIGl0ZW0pIHsKICBpZiAoYXJyLmxlbmd0aCkgewogICAgdmFyIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7CiAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICByZXR1cm4gYXJyLnNwbGljZShpbmRleCwgMSkKICAgIH0KICB9Cn0KCi8qKgogKiBDaGVjayB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eS4KICovCnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CmZ1bmN0aW9uIGhhc093biAob2JqLCBrZXkpIHsKICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkKfQoKLyoqCiAqIENyZWF0ZSBhIGNhY2hlZCB2ZXJzaW9uIG9mIGEgcHVyZSBmdW5jdGlvbi4KICovCmZ1bmN0aW9uIGNhY2hlZCAoZm4pIHsKICB2YXIgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIHJldHVybiAoZnVuY3Rpb24gY2FjaGVkRm4gKHN0cikgewogICAgdmFyIGhpdCA9IGNhY2hlW3N0cl07CiAgICByZXR1cm4gaGl0IHx8IChjYWNoZVtzdHJdID0gZm4oc3RyKSkKICB9KQp9CgovKioKICogQ2FtZWxpemUgYSBoeXBoZW4tZGVsaW1pdGVkIHN0cmluZy4KICovCnZhciBjYW1lbGl6ZVJFID0gLy0oXHcpL2c7CnZhciBjYW1lbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKGNhbWVsaXplUkUsIGZ1bmN0aW9uIChfLCBjKSB7IHJldHVybiBjID8gYy50b1VwcGVyQ2FzZSgpIDogJyc7IH0pCn0pOwoKLyoqCiAqIENhcGl0YWxpemUgYSBzdHJpbmcuCiAqLwp2YXIgY2FwaXRhbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7CiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKQp9KTsKCi8qKgogKiBIeXBoZW5hdGUgYSBjYW1lbENhc2Ugc3RyaW5nLgogKi8KdmFyIGh5cGhlbmF0ZVJFID0gL1xCKFtBLVpdKS9nOwp2YXIgaHlwaGVuYXRlID0gY2FjaGVkKGZ1bmN0aW9uIChzdHIpIHsKICByZXR1cm4gc3RyLnJlcGxhY2UoaHlwaGVuYXRlUkUsICctJDEnKS50b0xvd2VyQ2FzZSgpCn0pOwoKLyoqCiAqIFNpbXBsZSBiaW5kIHBvbHlmaWxsIGZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBpdC4uLiBlLmcuCiAqIFBoYW50b21KUyAxLnguIFRlY2huaWNhbGx5IHdlIGRvbid0IG5lZWQgdGhpcyBhbnltb3JlIHNpbmNlIG5hdGl2ZSBiaW5kIGlzCiAqIG5vdyBtb3JlIHBlcmZvcm1hbnQgaW4gbW9zdCBicm93c2VycywgYnV0IHJlbW92aW5nIGl0IHdvdWxkIGJlIGJyZWFraW5nIGZvcgogKiBjb2RlIHRoYXQgd2FzIGFibGUgdG8gcnVuIGluIFBoYW50b21KUyAxLngsIHNvIHRoaXMgbXVzdCBiZSBrZXB0IGZvcgogKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICovCgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwpmdW5jdGlvbiBwb2x5ZmlsbEJpbmQgKGZuLCBjdHgpIHsKICBmdW5jdGlvbiBib3VuZEZuIChhKSB7CiAgICB2YXIgbCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgICByZXR1cm4gbAogICAgICA/IGwgPiAxCiAgICAgICAgPyBmbi5hcHBseShjdHgsIGFyZ3VtZW50cykKICAgICAgICA6IGZuLmNhbGwoY3R4LCBhKQogICAgICA6IGZuLmNhbGwoY3R4KQogIH0KCiAgYm91bmRGbi5fbGVuZ3RoID0gZm4ubGVuZ3RoOwogIHJldHVybiBib3VuZEZuCn0KCmZ1bmN0aW9uIG5hdGl2ZUJpbmQgKGZuLCBjdHgpIHsKICByZXR1cm4gZm4uYmluZChjdHgpCn0KCnZhciBiaW5kID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQKICA/IG5hdGl2ZUJpbmQKICA6IHBvbHlmaWxsQmluZDsKCi8qKgogKiBDb252ZXJ0IGFuIEFycmF5LWxpa2Ugb2JqZWN0IHRvIGEgcmVhbCBBcnJheS4KICovCmZ1bmN0aW9uIHRvQXJyYXkgKGxpc3QsIHN0YXJ0KSB7CiAgc3RhcnQgPSBzdGFydCB8fCAwOwogIHZhciBpID0gbGlzdC5sZW5ndGggLSBzdGFydDsKICB2YXIgcmV0ID0gbmV3IEFycmF5KGkpOwogIHdoaWxlIChpLS0pIHsKICAgIHJldFtpXSA9IGxpc3RbaSArIHN0YXJ0XTsKICB9CiAgcmV0dXJuIHJldAp9CgovKioKICogTWl4IHByb3BlcnRpZXMgaW50byB0YXJnZXQgb2JqZWN0LgogKi8KZnVuY3Rpb24gZXh0ZW5kICh0bywgX2Zyb20pIHsKICBmb3IgKHZhciBrZXkgaW4gX2Zyb20pIHsKICAgIHRvW2tleV0gPSBfZnJvbVtrZXldOwogIH0KICByZXR1cm4gdG8KfQoKLyoqCiAqIE1lcmdlIGFuIEFycmF5IG9mIE9iamVjdHMgaW50byBhIHNpbmdsZSBPYmplY3QuCiAqLwpmdW5jdGlvbiB0b09iamVjdCAoYXJyKSB7CiAgdmFyIHJlcyA9IHt9OwogIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoYXJyW2ldKSB7CiAgICAgIGV4dGVuZChyZXMsIGFycltpXSk7CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyoqCiAqIFBlcmZvcm0gbm8gb3BlcmF0aW9uLgogKiBTdHViYmluZyBhcmdzIHRvIG1ha2UgRmxvdyBoYXBweSB3aXRob3V0IGxlYXZpbmcgdXNlbGVzcyB0cmFuc3BpbGVkIGNvZGUKICogd2l0aCAuLi5yZXN0IChodHRwczovL2Zsb3cub3JnL2Jsb2cvMjAxNy8wNS8wNy9TdHJpY3QtRnVuY3Rpb24tQ2FsbC1Bcml0eS8pCiAqLwpmdW5jdGlvbiBub29wIChhLCBiLCBjKSB7fQoKLyoqCiAqIEFsd2F5cyByZXR1cm4gZmFsc2UuCiAqLwp2YXIgbm8gPSBmdW5jdGlvbiAoYSwgYiwgYykgeyByZXR1cm4gZmFsc2U7IH07CgovKioKICogUmV0dXJuIHNhbWUgdmFsdWUKICovCnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uIChfKSB7IHJldHVybiBfOyB9OwoKLyoqCiAqIEdlbmVyYXRlIGEgc3RhdGljIGtleXMgc3RyaW5nIGZyb20gY29tcGlsZXIgbW9kdWxlcy4KICovCmZ1bmN0aW9uIGdlblN0YXRpY0tleXMgKG1vZHVsZXMpIHsKICByZXR1cm4gbW9kdWxlcy5yZWR1Y2UoZnVuY3Rpb24gKGtleXMsIG0pIHsKICAgIHJldHVybiBrZXlzLmNvbmNhdChtLnN0YXRpY0tleXMgfHwgW10pCiAgfSwgW10pLmpvaW4oJywnKQp9CgovKioKICogQ2hlY2sgaWYgdHdvIHZhbHVlcyBhcmUgbG9vc2VseSBlcXVhbCAtIHRoYXQgaXMsCiAqIGlmIHRoZXkgYXJlIHBsYWluIG9iamVjdHMsIGRvIHRoZXkgaGF2ZSB0aGUgc2FtZSBzaGFwZT8KICovCmZ1bmN0aW9uIGxvb3NlRXF1YWwgKGEsIGIpIHsKICBpZiAoYSA9PT0gYikgeyByZXR1cm4gdHJ1ZSB9CiAgdmFyIGlzT2JqZWN0QSA9IGlzT2JqZWN0KGEpOwogIHZhciBpc09iamVjdEIgPSBpc09iamVjdChiKTsKICBpZiAoaXNPYmplY3RBICYmIGlzT2JqZWN0QikgewogICAgdHJ5IHsKICAgICAgdmFyIGlzQXJyYXlBID0gQXJyYXkuaXNBcnJheShhKTsKICAgICAgdmFyIGlzQXJyYXlCID0gQXJyYXkuaXNBcnJheShiKTsKICAgICAgaWYgKGlzQXJyYXlBICYmIGlzQXJyYXlCKSB7CiAgICAgICAgcmV0dXJuIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KGZ1bmN0aW9uIChlLCBpKSB7CiAgICAgICAgICByZXR1cm4gbG9vc2VFcXVhbChlLCBiW2ldKQogICAgICAgIH0pCiAgICAgIH0gZWxzZSBpZiAoIWlzQXJyYXlBICYmICFpc0FycmF5QikgewogICAgICAgIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKGEpOwogICAgICAgIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKGIpOwogICAgICAgIHJldHVybiBrZXlzQS5sZW5ndGggPT09IGtleXNCLmxlbmd0aCAmJiBrZXlzQS5ldmVyeShmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICByZXR1cm4gbG9vc2VFcXVhbChhW2tleV0sIGJba2V5XSkKICAgICAgICB9KQogICAgICB9IGVsc2UgewogICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICAgICAgcmV0dXJuIGZhbHNlCiAgICB9CiAgfSBlbHNlIGlmICghaXNPYmplY3RBICYmICFpc09iamVjdEIpIHsKICAgIHJldHVybiBTdHJpbmcoYSkgPT09IFN0cmluZyhiKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZmFsc2UKICB9Cn0KCmZ1bmN0aW9uIGxvb3NlSW5kZXhPZiAoYXJyLCB2YWwpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgewogICAgaWYgKGxvb3NlRXF1YWwoYXJyW2ldLCB2YWwpKSB7IHJldHVybiBpIH0KICB9CiAgcmV0dXJuIC0xCn0KCi8qKgogKiBFbnN1cmUgYSBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBvbmNlLgogKi8KZnVuY3Rpb24gb25jZSAoZm4pIHsKICB2YXIgY2FsbGVkID0gZmFsc2U7CiAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgIGlmICghY2FsbGVkKSB7CiAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgfQp9Cgp2YXIgU1NSX0FUVFIgPSAnZGF0YS1zZXJ2ZXItcmVuZGVyZWQnOwoKdmFyIEFTU0VUX1RZUEVTID0gWwogICdjb21wb25lbnQnLAogICdkaXJlY3RpdmUnLAogICdmaWx0ZXInCl07Cgp2YXIgTElGRUNZQ0xFX0hPT0tTID0gWwogICdiZWZvcmVDcmVhdGUnLAogICdjcmVhdGVkJywKICAnYmVmb3JlTW91bnQnLAogICdtb3VudGVkJywKICAnYmVmb3JlVXBkYXRlJywKICAndXBkYXRlZCcsCiAgJ2JlZm9yZURlc3Ryb3knLAogICdkZXN0cm95ZWQnLAogICdhY3RpdmF0ZWQnLAogICdkZWFjdGl2YXRlZCcsCiAgJ2Vycm9yQ2FwdHVyZWQnCl07CgovKiAgKi8KCnZhciBjb25maWcgPSAoewogIC8qKgogICAqIE9wdGlvbiBtZXJnZSBzdHJhdGVnaWVzICh1c2VkIGluIGNvcmUvdXRpbC9vcHRpb25zKQogICAqLwogIC8vICRmbG93LWRpc2FibGUtbGluZQogIG9wdGlvbk1lcmdlU3RyYXRlZ2llczogT2JqZWN0LmNyZWF0ZShudWxsKSwKCiAgLyoqCiAgICogV2hldGhlciB0byBzdXBwcmVzcyB3YXJuaW5ncy4KICAgKi8KICBzaWxlbnQ6IGZhbHNlLAoKICAvKioKICAgKiBTaG93IHByb2R1Y3Rpb24gbW9kZSB0aXAgbWVzc2FnZSBvbiBib290PwogICAqLwogIHByb2R1Y3Rpb25UaXA6ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJywKCiAgLyoqCiAgICogV2hldGhlciB0byBlbmFibGUgZGV2dG9vbHMKICAgKi8KICBkZXZ0b29sczogImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nLAoKICAvKioKICAgKiBXaGV0aGVyIHRvIHJlY29yZCBwZXJmCiAgICovCiAgcGVyZm9ybWFuY2U6IGZhbHNlLAoKICAvKioKICAgKiBFcnJvciBoYW5kbGVyIGZvciB3YXRjaGVyIGVycm9ycwogICAqLwogIGVycm9ySGFuZGxlcjogbnVsbCwKCiAgLyoqCiAgICogV2FybiBoYW5kbGVyIGZvciB3YXRjaGVyIHdhcm5zCiAgICovCiAgd2FybkhhbmRsZXI6IG51bGwsCgogIC8qKgogICAqIElnbm9yZSBjZXJ0YWluIGN1c3RvbSBlbGVtZW50cwogICAqLwogIGlnbm9yZWRFbGVtZW50czogW10sCgogIC8qKgogICAqIEN1c3RvbSB1c2VyIGtleSBhbGlhc2VzIGZvciB2LW9uCiAgICovCiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAga2V5Q29kZXM6IE9iamVjdC5jcmVhdGUobnVsbCksCgogIC8qKgogICAqIENoZWNrIGlmIGEgdGFnIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHJlZ2lzdGVyZWQgYXMgYQogICAqIGNvbXBvbmVudC4gVGhpcyBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQgYW5kIG1heSBiZSBvdmVyd3JpdHRlbi4KICAgKi8KICBpc1Jlc2VydmVkVGFnOiBubywKCiAgLyoqCiAgICogQ2hlY2sgaWYgYW4gYXR0cmlidXRlIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHVzZWQgYXMgYSBjb21wb25lbnQKICAgKiBwcm9wLiBUaGlzIGlzIHBsYXRmb3JtLWRlcGVuZGVudCBhbmQgbWF5IGJlIG92ZXJ3cml0dGVuLgogICAqLwogIGlzUmVzZXJ2ZWRBdHRyOiBubywKCiAgLyoqCiAgICogQ2hlY2sgaWYgYSB0YWcgaXMgYW4gdW5rbm93biBlbGVtZW50LgogICAqIFBsYXRmb3JtLWRlcGVuZGVudC4KICAgKi8KICBpc1Vua25vd25FbGVtZW50OiBubywKCiAgLyoqCiAgICogR2V0IHRoZSBuYW1lc3BhY2Ugb2YgYW4gZWxlbWVudAogICAqLwogIGdldFRhZ05hbWVzcGFjZTogbm9vcCwKCiAgLyoqCiAgICogUGFyc2UgdGhlIHJlYWwgdGFnIG5hbWUgZm9yIHRoZSBzcGVjaWZpYyBwbGF0Zm9ybS4KICAgKi8KICBwYXJzZVBsYXRmb3JtVGFnTmFtZTogaWRlbnRpdHksCgogIC8qKgogICAqIENoZWNrIGlmIGFuIGF0dHJpYnV0ZSBtdXN0IGJlIGJvdW5kIHVzaW5nIHByb3BlcnR5LCBlLmcuIHZhbHVlCiAgICogUGxhdGZvcm0tZGVwZW5kZW50LgogICAqLwogIG11c3RVc2VQcm9wOiBubywKCiAgLyoqCiAgICogRXhwb3NlZCBmb3IgbGVnYWN5IHJlYXNvbnMKICAgKi8KICBfbGlmZWN5Y2xlSG9va3M6IExJRkVDWUNMRV9IT09LUwp9KQoKLyogICovCgovKioKICogQ2hlY2sgaWYgYSBzdHJpbmcgc3RhcnRzIHdpdGggJCBvciBfCiAqLwpmdW5jdGlvbiBpc1Jlc2VydmVkIChzdHIpIHsKICB2YXIgYyA9IChzdHIgKyAnJykuY2hhckNvZGVBdCgwKTsKICByZXR1cm4gYyA9PT0gMHgyNCB8fCBjID09PSAweDVGCn0KCi8qKgogKiBEZWZpbmUgYSBwcm9wZXJ0eS4KICovCmZ1bmN0aW9uIGRlZiAob2JqLCBrZXksIHZhbCwgZW51bWVyYWJsZSkgewogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgewogICAgdmFsdWU6IHZhbCwKICAgIGVudW1lcmFibGU6ICEhZW51bWVyYWJsZSwKICAgIHdyaXRhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlCiAgfSk7Cn0KCi8qKgogKiBQYXJzZSBzaW1wbGUgcGF0aC4KICovCnZhciBiYWlsUkUgPSAvW15cdy4kXS87CmZ1bmN0aW9uIHBhcnNlUGF0aCAocGF0aCkgewogIGlmIChiYWlsUkUudGVzdChwYXRoKSkgewogICAgcmV0dXJuCiAgfQogIHZhciBzZWdtZW50cyA9IHBhdGguc3BsaXQoJy4nKTsKICByZXR1cm4gZnVuY3Rpb24gKG9iaikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoIW9iaikgeyByZXR1cm4gfQogICAgICBvYmogPSBvYmpbc2VnbWVudHNbaV1dOwogICAgfQogICAgcmV0dXJuIG9iagogIH0KfQoKLyogICovCgovLyBjYW4gd2UgdXNlIF9fcHJvdG9fXz8KdmFyIGhhc1Byb3RvID0gJ19fcHJvdG9fXycgaW4ge307CgovLyBCcm93c2VyIGVudmlyb25tZW50IHNuaWZmaW5nCnZhciBpbkJyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJzsKdmFyIGluV2VleCA9IHR5cGVvZiBXWEVudmlyb25tZW50ICE9PSAndW5kZWZpbmVkJyAmJiAhIVdYRW52aXJvbm1lbnQucGxhdGZvcm07CnZhciB3ZWV4UGxhdGZvcm0gPSBpbldlZXggJiYgV1hFbnZpcm9ubWVudC5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpOwp2YXIgVUEgPSBpbkJyb3dzZXIgJiYgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsKdmFyIGlzSUUgPSBVQSAmJiAvbXNpZXx0cmlkZW50Ly50ZXN0KFVBKTsKdmFyIGlzSUU5ID0gVUEgJiYgVUEuaW5kZXhPZignbXNpZSA5LjAnKSA+IDA7CnZhciBpc0VkZ2UgPSBVQSAmJiBVQS5pbmRleE9mKCdlZGdlLycpID4gMDsKdmFyIGlzQW5kcm9pZCA9IChVQSAmJiBVQS5pbmRleE9mKCdhbmRyb2lkJykgPiAwKSB8fCAod2VleFBsYXRmb3JtID09PSAnYW5kcm9pZCcpOwp2YXIgaXNJT1MgPSAoVUEgJiYgL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KFVBKSkgfHwgKHdlZXhQbGF0Zm9ybSA9PT0gJ2lvcycpOwp2YXIgaXNDaHJvbWUgPSBVQSAmJiAvY2hyb21lXC9cZCsvLnRlc3QoVUEpICYmICFpc0VkZ2U7CgovLyBGaXJlZm94IGhhcyBhICJ3YXRjaCIgZnVuY3Rpb24gb24gT2JqZWN0LnByb3RvdHlwZS4uLgp2YXIgbmF0aXZlV2F0Y2ggPSAoe30pLndhdGNoOwoKdmFyIHN1cHBvcnRzUGFzc2l2ZSA9IGZhbHNlOwppZiAoaW5Ccm93c2VyKSB7CiAgdHJ5IHsKICAgIHZhciBvcHRzID0ge307CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0cywgJ3Bhc3NpdmUnLCAoewogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCAoKSB7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICAgICAgICBzdXBwb3J0c1Bhc3NpdmUgPSB0cnVlOwogICAgICB9CiAgICB9KSk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yODUKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0LXBhc3NpdmUnLCBudWxsLCBvcHRzKTsKICB9IGNhdGNoIChlKSB7fQp9CgovLyB0aGlzIG5lZWRzIHRvIGJlIGxhenktZXZhbGVkIGJlY2F1c2UgdnVlIG1heSBiZSByZXF1aXJlZCBiZWZvcmUKLy8gdnVlLXNlcnZlci1yZW5kZXJlciBjYW4gc2V0IFZVRV9FTlYKdmFyIF9pc1NlcnZlcjsKdmFyIGlzU2VydmVyUmVuZGVyaW5nID0gZnVuY3Rpb24gKCkgewogIGlmIChfaXNTZXJ2ZXIgPT09IHVuZGVmaW5lZCkgewogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoIWluQnJvd3NlciAmJiAhaW5XZWV4ICYmIHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgIC8vIGRldGVjdCBwcmVzZW5jZSBvZiB2dWUtc2VydmVyLXJlbmRlcmVyIGFuZCBhdm9pZAogICAgICAvLyBXZWJwYWNrIHNoaW1taW5nIHRoZSBwcm9jZXNzCiAgICAgIF9pc1NlcnZlciA9IGdsb2JhbFsncHJvY2VzcyddLmVudi5WVUVfRU5WID09PSAnc2VydmVyJzsKICAgIH0gZWxzZSB7CiAgICAgIF9pc1NlcnZlciA9IGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gX2lzU2VydmVyCn07CgovLyBkZXRlY3QgZGV2dG9vbHMKdmFyIGRldnRvb2xzID0gaW5Ccm93c2VyICYmIHdpbmRvdy5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fOwoKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KZnVuY3Rpb24gaXNOYXRpdmUgKEN0b3IpIHsKICByZXR1cm4gdHlwZW9mIEN0b3IgPT09ICdmdW5jdGlvbicgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KEN0b3IudG9TdHJpbmcoKSkKfQoKdmFyIGhhc1N5bWJvbCA9CiAgdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoU3ltYm9sKSAmJgogIHR5cGVvZiBSZWZsZWN0ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShSZWZsZWN0Lm93bktleXMpOwoKdmFyIF9TZXQ7Ci8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLyAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKaWYgKHR5cGVvZiBTZXQgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFNldCkpIHsKICAvLyB1c2UgbmF0aXZlIFNldCB3aGVuIGF2YWlsYWJsZS4KICBfU2V0ID0gU2V0Owp9IGVsc2UgewogIC8vIGEgbm9uLXN0YW5kYXJkIFNldCBwb2x5ZmlsbCB0aGF0IG9ubHkgd29ya3Mgd2l0aCBwcmltaXRpdmUga2V5cy4KICBfU2V0ID0gKGZ1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIFNldCAoKSB7CiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH0KICAgIFNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gaGFzIChrZXkpIHsKICAgICAgcmV0dXJuIHRoaXMuc2V0W2tleV0gPT09IHRydWUKICAgIH07CiAgICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAoa2V5KSB7CiAgICAgIHRoaXMuc2V0W2tleV0gPSB0cnVlOwogICAgfTsKICAgIFNldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBjbGVhciAoKSB7CiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH07CgogICAgcmV0dXJuIFNldDsKICB9KCkpOwp9CgovKiAgKi8KCnZhciB3YXJuID0gbm9vcDsKdmFyIHRpcCA9IG5vb3A7CnZhciBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlID0gKG5vb3ApOyAvLyB3b3JrIGFyb3VuZCBmbG93IGNoZWNrCnZhciBmb3JtYXRDb21wb25lbnROYW1lID0gKG5vb3ApOwoKewogIHZhciBoYXNDb25zb2xlID0gdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnOwogIHZhciBjbGFzc2lmeVJFID0gLyg/Ol58Wy1fXSkoXHcpL2c7CiAgdmFyIGNsYXNzaWZ5ID0gZnVuY3Rpb24gKHN0cikgeyByZXR1cm4gc3RyCiAgICAucmVwbGFjZShjbGFzc2lmeVJFLCBmdW5jdGlvbiAoYykgeyByZXR1cm4gYy50b1VwcGVyQ2FzZSgpOyB9KQogICAgLnJlcGxhY2UoL1stX10vZywgJycpOyB9OwoKICB3YXJuID0gZnVuY3Rpb24gKG1zZywgdm0pIHsKICAgIHZhciB0cmFjZSA9IHZtID8gZ2VuZXJhdGVDb21wb25lbnRUcmFjZSh2bSkgOiAnJzsKCiAgICBpZiAoY29uZmlnLndhcm5IYW5kbGVyKSB7CiAgICAgIGNvbmZpZy53YXJuSGFuZGxlci5jYWxsKG51bGwsIG1zZywgdm0sIHRyYWNlKTsKICAgIH0gZWxzZSBpZiAoaGFzQ29uc29sZSAmJiAoIWNvbmZpZy5zaWxlbnQpKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoKCJbVnVlIHdhcm5dOiAiICsgbXNnICsgdHJhY2UpKTsKICAgIH0KICB9OwoKICB0aXAgPSBmdW5jdGlvbiAobXNnLCB2bSkgewogICAgaWYgKGhhc0NvbnNvbGUgJiYgKCFjb25maWcuc2lsZW50KSkgewogICAgICBjb25zb2xlLndhcm4oIltWdWUgdGlwXTogIiArIG1zZyArICgKICAgICAgICB2bSA/IGdlbmVyYXRlQ29tcG9uZW50VHJhY2Uodm0pIDogJycKICAgICAgKSk7CiAgICB9CiAgfTsKCiAgZm9ybWF0Q29tcG9uZW50TmFtZSA9IGZ1bmN0aW9uICh2bSwgaW5jbHVkZUZpbGUpIHsKICAgIGlmICh2bS4kcm9vdCA9PT0gdm0pIHsKICAgICAgcmV0dXJuICc8Um9vdD4nCiAgICB9CiAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiB2bSA9PT0gJ2Z1bmN0aW9uJyAmJiB2bS5jaWQgIT0gbnVsbAogICAgICA/IHZtLm9wdGlvbnMKICAgICAgOiB2bS5faXNWdWUKICAgICAgICA/IHZtLiRvcHRpb25zIHx8IHZtLmNvbnN0cnVjdG9yLm9wdGlvbnMKICAgICAgICA6IHZtIHx8IHt9OwogICAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWUgfHwgb3B0aW9ucy5fY29tcG9uZW50VGFnOwogICAgdmFyIGZpbGUgPSBvcHRpb25zLl9fZmlsZTsKICAgIGlmICghbmFtZSAmJiBmaWxlKSB7CiAgICAgIHZhciBtYXRjaCA9IGZpbGUubWF0Y2goLyhbXi9cXF0rKVwudnVlJC8pOwogICAgICBuYW1lID0gbWF0Y2ggJiYgbWF0Y2hbMV07CiAgICB9CgogICAgcmV0dXJuICgKICAgICAgKG5hbWUgPyAoIjwiICsgKGNsYXNzaWZ5KG5hbWUpKSArICI+IikgOiAiPEFub255bW91cz4iKSArCiAgICAgIChmaWxlICYmIGluY2x1ZGVGaWxlICE9PSBmYWxzZSA/ICgiIGF0ICIgKyBmaWxlKSA6ICcnKQogICAgKQogIH07CgogIHZhciByZXBlYXQgPSBmdW5jdGlvbiAoc3RyLCBuKSB7CiAgICB2YXIgcmVzID0gJyc7CiAgICB3aGlsZSAobikgewogICAgICBpZiAobiAlIDIgPT09IDEpIHsgcmVzICs9IHN0cjsgfQogICAgICBpZiAobiA+IDEpIHsgc3RyICs9IHN0cjsgfQogICAgICBuID4+PSAxOwogICAgfQogICAgcmV0dXJuIHJlcwogIH07CgogIGdlbmVyYXRlQ29tcG9uZW50VHJhY2UgPSBmdW5jdGlvbiAodm0pIHsKICAgIGlmICh2bS5faXNWdWUgJiYgdm0uJHBhcmVudCkgewogICAgICB2YXIgdHJlZSA9IFtdOwogICAgICB2YXIgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID0gMDsKICAgICAgd2hpbGUgKHZtKSB7CiAgICAgICAgaWYgKHRyZWUubGVuZ3RoID4gMCkgewogICAgICAgICAgdmFyIGxhc3QgPSB0cmVlW3RyZWUubGVuZ3RoIC0gMV07CiAgICAgICAgICBpZiAobGFzdC5jb25zdHJ1Y3RvciA9PT0gdm0uY29uc3RydWN0b3IpIHsKICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlKys7CiAgICAgICAgICAgIHZtID0gdm0uJHBhcmVudDsKICAgICAgICAgICAgY29udGludWUKICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID4gMCkgewogICAgICAgICAgICB0cmVlW3RyZWUubGVuZ3RoIC0gMV0gPSBbbGFzdCwgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlXTsKICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdHJlZS5wdXNoKHZtKTsKICAgICAgICB2bSA9IHZtLiRwYXJlbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuICdcblxuZm91bmQgaW5cblxuJyArIHRyZWUKICAgICAgICAubWFwKGZ1bmN0aW9uICh2bSwgaSkgeyByZXR1cm4gKCIiICsgKGkgPT09IDAgPyAnLS0tPiAnIDogcmVwZWF0KCcgJywgNSArIGkgKiAyKSkgKyAoQXJyYXkuaXNBcnJheSh2bSkKICAgICAgICAgICAgPyAoKGZvcm1hdENvbXBvbmVudE5hbWUodm1bMF0pKSArICIuLi4gKCIgKyAodm1bMV0pICsgIiByZWN1cnNpdmUgY2FsbHMpIikKICAgICAgICAgICAgOiBmb3JtYXRDb21wb25lbnROYW1lKHZtKSkpOyB9KQogICAgICAgIC5qb2luKCdcbicpCiAgICB9IGVsc2UgewogICAgICByZXR1cm4gKCJcblxuKGZvdW5kIGluICIgKyAoZm9ybWF0Q29tcG9uZW50TmFtZSh2bSkpICsgIikiKQogICAgfQogIH07Cn0KCi8qICAqLwoKCnZhciB1aWQgPSAwOwoKLyoqCiAqIEEgZGVwIGlzIGFuIG9ic2VydmFibGUgdGhhdCBjYW4gaGF2ZSBtdWx0aXBsZQogKiBkaXJlY3RpdmVzIHN1YnNjcmliaW5nIHRvIGl0LgogKi8KdmFyIERlcCA9IGZ1bmN0aW9uIERlcCAoKSB7CiAgdGhpcy5pZCA9IHVpZCsrOwogIHRoaXMuc3VicyA9IFtdOwp9OwoKRGVwLnByb3RvdHlwZS5hZGRTdWIgPSBmdW5jdGlvbiBhZGRTdWIgKHN1YikgewogIHRoaXMuc3Vicy5wdXNoKHN1Yik7Cn07CgpEZXAucHJvdG90eXBlLnJlbW92ZVN1YiA9IGZ1bmN0aW9uIHJlbW92ZVN1YiAoc3ViKSB7CiAgcmVtb3ZlKHRoaXMuc3Vicywgc3ViKTsKfTsKCkRlcC5wcm90b3R5cGUuZGVwZW5kID0gZnVuY3Rpb24gZGVwZW5kICgpIHsKICBpZiAoRGVwLnRhcmdldCkgewogICAgRGVwLnRhcmdldC5hZGREZXAodGhpcyk7CiAgfQp9OwoKRGVwLnByb3RvdHlwZS5ub3RpZnkgPSBmdW5jdGlvbiBub3RpZnkgKCkgewogIC8vIHN0YWJpbGl6ZSB0aGUgc3Vic2NyaWJlciBsaXN0IGZpcnN0CiAgdmFyIHN1YnMgPSB0aGlzLnN1YnMuc2xpY2UoKTsKICBmb3IgKHZhciBpID0gMCwgbCA9IHN1YnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICBzdWJzW2ldLnVwZGF0ZSgpOwogIH0KfTsKCi8vIHRoZSBjdXJyZW50IHRhcmdldCB3YXRjaGVyIGJlaW5nIGV2YWx1YXRlZC4KLy8gdGhpcyBpcyBnbG9iYWxseSB1bmlxdWUgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvbmx5IG9uZQovLyB3YXRjaGVyIGJlaW5nIGV2YWx1YXRlZCBhdCBhbnkgdGltZS4KRGVwLnRhcmdldCA9IG51bGw7CnZhciB0YXJnZXRTdGFjayA9IFtdOwoKZnVuY3Rpb24gcHVzaFRhcmdldCAoX3RhcmdldCkgewogIGlmIChEZXAudGFyZ2V0KSB7IHRhcmdldFN0YWNrLnB1c2goRGVwLnRhcmdldCk7IH0KICBEZXAudGFyZ2V0ID0gX3RhcmdldDsKfQoKZnVuY3Rpb24gcG9wVGFyZ2V0ICgpIHsKICBEZXAudGFyZ2V0ID0gdGFyZ2V0U3RhY2sucG9wKCk7Cn0KCi8qICAqLwoKdmFyIFZOb2RlID0gZnVuY3Rpb24gVk5vZGUgKAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIHRleHQsCiAgZWxtLAogIGNvbnRleHQsCiAgY29tcG9uZW50T3B0aW9ucywKICBhc3luY0ZhY3RvcnkKKSB7CiAgdGhpcy50YWcgPSB0YWc7CiAgdGhpcy5kYXRhID0gZGF0YTsKICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47CiAgdGhpcy50ZXh0ID0gdGV4dDsKICB0aGlzLmVsbSA9IGVsbTsKICB0aGlzLm5zID0gdW5kZWZpbmVkOwogIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CiAgdGhpcy5mbkNvbnRleHQgPSB1bmRlZmluZWQ7CiAgdGhpcy5mbk9wdGlvbnMgPSB1bmRlZmluZWQ7CiAgdGhpcy5mblNjb3BlSWQgPSB1bmRlZmluZWQ7CiAgdGhpcy5rZXkgPSBkYXRhICYmIGRhdGEua2V5OwogIHRoaXMuY29tcG9uZW50T3B0aW9ucyA9IGNvbXBvbmVudE9wdGlvbnM7CiAgdGhpcy5jb21wb25lbnRJbnN0YW5jZSA9IHVuZGVmaW5lZDsKICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZDsKICB0aGlzLnJhdyA9IGZhbHNlOwogIHRoaXMuaXNTdGF0aWMgPSBmYWxzZTsKICB0aGlzLmlzUm9vdEluc2VydCA9IHRydWU7CiAgdGhpcy5pc0NvbW1lbnQgPSBmYWxzZTsKICB0aGlzLmlzQ2xvbmVkID0gZmFsc2U7CiAgdGhpcy5pc09uY2UgPSBmYWxzZTsKICB0aGlzLmFzeW5jRmFjdG9yeSA9IGFzeW5jRmFjdG9yeTsKICB0aGlzLmFzeW5jTWV0YSA9IHVuZGVmaW5lZDsKICB0aGlzLmlzQXN5bmNQbGFjZWhvbGRlciA9IGZhbHNlOwp9OwoKdmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgY2hpbGQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTsKCi8vIERFUFJFQ0FURUQ6IGFsaWFzIGZvciBjb21wb25lbnRJbnN0YW5jZSBmb3IgYmFja3dhcmRzIGNvbXBhdC4KLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KcHJvdG90eXBlQWNjZXNzb3JzLmNoaWxkLmdldCA9IGZ1bmN0aW9uICgpIHsKICByZXR1cm4gdGhpcy5jb21wb25lbnRJbnN0YW5jZQp9OwoKT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFZOb2RlLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7Cgp2YXIgY3JlYXRlRW1wdHlWTm9kZSA9IGZ1bmN0aW9uICh0ZXh0KSB7CiAgaWYgKCB0ZXh0ID09PSB2b2lkIDAgKSB0ZXh0ID0gJyc7CgogIHZhciBub2RlID0gbmV3IFZOb2RlKCk7CiAgbm9kZS50ZXh0ID0gdGV4dDsKICBub2RlLmlzQ29tbWVudCA9IHRydWU7CiAgcmV0dXJuIG5vZGUKfTsKCmZ1bmN0aW9uIGNyZWF0ZVRleHRWTm9kZSAodmFsKSB7CiAgcmV0dXJuIG5ldyBWTm9kZSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBTdHJpbmcodmFsKSkKfQoKLy8gb3B0aW1pemVkIHNoYWxsb3cgY2xvbmUKLy8gdXNlZCBmb3Igc3RhdGljIG5vZGVzIGFuZCBzbG90IG5vZGVzIGJlY2F1c2UgdGhleSBtYXkgYmUgcmV1c2VkIGFjcm9zcwovLyBtdWx0aXBsZSByZW5kZXJzLCBjbG9uaW5nIHRoZW0gYXZvaWRzIGVycm9ycyB3aGVuIERPTSBtYW5pcHVsYXRpb25zIHJlbHkKLy8gb24gdGhlaXIgZWxtIHJlZmVyZW5jZS4KZnVuY3Rpb24gY2xvbmVWTm9kZSAodm5vZGUpIHsKICB2YXIgY2xvbmVkID0gbmV3IFZOb2RlKAogICAgdm5vZGUudGFnLAogICAgdm5vZGUuZGF0YSwKICAgIHZub2RlLmNoaWxkcmVuLAogICAgdm5vZGUudGV4dCwKICAgIHZub2RlLmVsbSwKICAgIHZub2RlLmNvbnRleHQsCiAgICB2bm9kZS5jb21wb25lbnRPcHRpb25zLAogICAgdm5vZGUuYXN5bmNGYWN0b3J5CiAgKTsKICBjbG9uZWQubnMgPSB2bm9kZS5uczsKICBjbG9uZWQuaXNTdGF0aWMgPSB2bm9kZS5pc1N0YXRpYzsKICBjbG9uZWQua2V5ID0gdm5vZGUua2V5OwogIGNsb25lZC5pc0NvbW1lbnQgPSB2bm9kZS5pc0NvbW1lbnQ7CiAgY2xvbmVkLmZuQ29udGV4dCA9IHZub2RlLmZuQ29udGV4dDsKICBjbG9uZWQuZm5PcHRpb25zID0gdm5vZGUuZm5PcHRpb25zOwogIGNsb25lZC5mblNjb3BlSWQgPSB2bm9kZS5mblNjb3BlSWQ7CiAgY2xvbmVkLmlzQ2xvbmVkID0gdHJ1ZTsKICByZXR1cm4gY2xvbmVkCn0KCi8qCiAqIG5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBwbGF5IHdlbGwgd2l0aAogKiBkeW5hbWljYWxseSBhY2Nlc3NpbmcgbWV0aG9kcyBvbiBBcnJheSBwcm90b3R5cGUKICovCgp2YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTsKdmFyIGFycmF5TWV0aG9kcyA9IE9iamVjdC5jcmVhdGUoYXJyYXlQcm90byk7Cgp2YXIgbWV0aG9kc1RvUGF0Y2ggPSBbCiAgJ3B1c2gnLAogICdwb3AnLAogICdzaGlmdCcsCiAgJ3Vuc2hpZnQnLAogICdzcGxpY2UnLAogICdzb3J0JywKICAncmV2ZXJzZScKXTsKCi8qKgogKiBJbnRlcmNlcHQgbXV0YXRpbmcgbWV0aG9kcyBhbmQgZW1pdCBldmVudHMKICovCm1ldGhvZHNUb1BhdGNoLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkgewogIC8vIGNhY2hlIG9yaWdpbmFsIG1ldGhvZAogIHZhciBvcmlnaW5hbCA9IGFycmF5UHJvdG9bbWV0aG9kXTsKICBkZWYoYXJyYXlNZXRob2RzLCBtZXRob2QsIGZ1bmN0aW9uIG11dGF0b3IgKCkgewogICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsKICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07CgogICAgdmFyIHJlc3VsdCA9IG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgdmFyIG9iID0gdGhpcy5fX29iX187CiAgICB2YXIgaW5zZXJ0ZWQ7CiAgICBzd2l0Y2ggKG1ldGhvZCkgewogICAgICBjYXNlICdwdXNoJzoKICAgICAgY2FzZSAndW5zaGlmdCc6CiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzOwogICAgICAgIGJyZWFrCiAgICAgIGNhc2UgJ3NwbGljZSc6CiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzLnNsaWNlKDIpOwogICAgICAgIGJyZWFrCiAgICB9CiAgICBpZiAoaW5zZXJ0ZWQpIHsgb2Iub2JzZXJ2ZUFycmF5KGluc2VydGVkKTsgfQogICAgLy8gbm90aWZ5IGNoYW5nZQogICAgb2IuZGVwLm5vdGlmeSgpOwogICAgcmV0dXJuIHJlc3VsdAogIH0pOwp9KTsKCi8qICAqLwoKdmFyIGFycmF5S2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFycmF5TWV0aG9kcyk7CgovKioKICogSW4gc29tZSBjYXNlcyB3ZSBtYXkgd2FudCB0byBkaXNhYmxlIG9ic2VydmF0aW9uIGluc2lkZSBhIGNvbXBvbmVudCdzCiAqIHVwZGF0ZSBjb21wdXRhdGlvbi4KICovCnZhciBzaG91bGRPYnNlcnZlID0gdHJ1ZTsKCmZ1bmN0aW9uIHRvZ2dsZU9ic2VydmluZyAodmFsdWUpIHsKICBzaG91bGRPYnNlcnZlID0gdmFsdWU7Cn0KCi8qKgogKiBPYnNlcnZlciBjbGFzcyB0aGF0IGlzIGF0dGFjaGVkIHRvIGVhY2ggb2JzZXJ2ZWQKICogb2JqZWN0LiBPbmNlIGF0dGFjaGVkLCB0aGUgb2JzZXJ2ZXIgY29udmVydHMgdGhlIHRhcmdldAogKiBvYmplY3QncyBwcm9wZXJ0eSBrZXlzIGludG8gZ2V0dGVyL3NldHRlcnMgdGhhdAogKiBjb2xsZWN0IGRlcGVuZGVuY2llcyBhbmQgZGlzcGF0Y2ggdXBkYXRlcy4KICovCnZhciBPYnNlcnZlciA9IGZ1bmN0aW9uIE9ic2VydmVyICh2YWx1ZSkgewogIHRoaXMudmFsdWUgPSB2YWx1ZTsKICB0aGlzLmRlcCA9IG5ldyBEZXAoKTsKICB0aGlzLnZtQ291bnQgPSAwOwogIGRlZih2YWx1ZSwgJ19fb2JfXycsIHRoaXMpOwogIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgdmFyIGF1Z21lbnQgPSBoYXNQcm90bwogICAgICA/IHByb3RvQXVnbWVudAogICAgICA6IGNvcHlBdWdtZW50OwogICAgYXVnbWVudCh2YWx1ZSwgYXJyYXlNZXRob2RzLCBhcnJheUtleXMpOwogICAgdGhpcy5vYnNlcnZlQXJyYXkodmFsdWUpOwogIH0gZWxzZSB7CiAgICB0aGlzLndhbGsodmFsdWUpOwogIH0KfTsKCi8qKgogKiBXYWxrIHRocm91Z2ggZWFjaCBwcm9wZXJ0eSBhbmQgY29udmVydCB0aGVtIGludG8KICogZ2V0dGVyL3NldHRlcnMuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuCiAqIHZhbHVlIHR5cGUgaXMgT2JqZWN0LgogKi8KT2JzZXJ2ZXIucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiB3YWxrIChvYmopIHsKICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CiAgICBkZWZpbmVSZWFjdGl2ZShvYmosIGtleXNbaV0pOwogIH0KfTsKCi8qKgogKiBPYnNlcnZlIGEgbGlzdCBvZiBBcnJheSBpdGVtcy4KICovCk9ic2VydmVyLnByb3RvdHlwZS5vYnNlcnZlQXJyYXkgPSBmdW5jdGlvbiBvYnNlcnZlQXJyYXkgKGl0ZW1zKSB7CiAgZm9yICh2YXIgaSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIG9ic2VydmUoaXRlbXNbaV0pOwogIH0KfTsKCi8vIGhlbHBlcnMKCi8qKgogKiBBdWdtZW50IGFuIHRhcmdldCBPYmplY3Qgb3IgQXJyYXkgYnkgaW50ZXJjZXB0aW5nCiAqIHRoZSBwcm90b3R5cGUgY2hhaW4gdXNpbmcgX19wcm90b19fCiAqLwpmdW5jdGlvbiBwcm90b0F1Z21lbnQgKHRhcmdldCwgc3JjLCBrZXlzKSB7CiAgLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi8KICB0YXJnZXQuX19wcm90b19fID0gc3JjOwogIC8qIGVzbGludC1lbmFibGUgbm8tcHJvdG8gKi8KfQoKLyoqCiAqIEF1Z21lbnQgYW4gdGFyZ2V0IE9iamVjdCBvciBBcnJheSBieSBkZWZpbmluZwogKiBoaWRkZW4gcHJvcGVydGllcy4KICovCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCmZ1bmN0aW9uIGNvcHlBdWdtZW50ICh0YXJnZXQsIHNyYywga2V5cykgewogIGZvciAodmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIHZhciBrZXkgPSBrZXlzW2ldOwogICAgZGVmKHRhcmdldCwga2V5LCBzcmNba2V5XSk7CiAgfQp9CgovKioKICogQXR0ZW1wdCB0byBjcmVhdGUgYW4gb2JzZXJ2ZXIgaW5zdGFuY2UgZm9yIGEgdmFsdWUsCiAqIHJldHVybnMgdGhlIG5ldyBvYnNlcnZlciBpZiBzdWNjZXNzZnVsbHkgb2JzZXJ2ZWQsCiAqIG9yIHRoZSBleGlzdGluZyBvYnNlcnZlciBpZiB0aGUgdmFsdWUgYWxyZWFkeSBoYXMgb25lLgogKi8KZnVuY3Rpb24gb2JzZXJ2ZSAodmFsdWUsIGFzUm9vdERhdGEpIHsKICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIFZOb2RlKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIG9iOwogIGlmIChoYXNPd24odmFsdWUsICdfX29iX18nKSAmJiB2YWx1ZS5fX29iX18gaW5zdGFuY2VvZiBPYnNlcnZlcikgewogICAgb2IgPSB2YWx1ZS5fX29iX187CiAgfSBlbHNlIGlmICgKICAgIHNob3VsZE9ic2VydmUgJiYKICAgICFpc1NlcnZlclJlbmRlcmluZygpICYmCiAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaXNQbGFpbk9iamVjdCh2YWx1ZSkpICYmCiAgICBPYmplY3QuaXNFeHRlbnNpYmxlKHZhbHVlKSAmJgogICAgIXZhbHVlLl9pc1Z1ZQogICkgewogICAgb2IgPSBuZXcgT2JzZXJ2ZXIodmFsdWUpOwogIH0KICBpZiAoYXNSb290RGF0YSAmJiBvYikgewogICAgb2Iudm1Db3VudCsrOwogIH0KICByZXR1cm4gb2IKfQoKLyoqCiAqIERlZmluZSBhIHJlYWN0aXZlIHByb3BlcnR5IG9uIGFuIE9iamVjdC4KICovCmZ1bmN0aW9uIGRlZmluZVJlYWN0aXZlICgKICBvYmosCiAga2V5LAogIHZhbCwKICBjdXN0b21TZXR0ZXIsCiAgc2hhbGxvdwopIHsKICB2YXIgZGVwID0gbmV3IERlcCgpOwoKICB2YXIgcHJvcGVydHkgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KTsKICBpZiAocHJvcGVydHkgJiYgcHJvcGVydHkuY29uZmlndXJhYmxlID09PSBmYWxzZSkgewogICAgcmV0dXJuCiAgfQoKICAvLyBjYXRlciBmb3IgcHJlLWRlZmluZWQgZ2V0dGVyL3NldHRlcnMKICB2YXIgZ2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuZ2V0OwogIGlmICghZ2V0dGVyICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKICAgIHZhbCA9IG9ialtrZXldOwogIH0KICB2YXIgc2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuc2V0OwoKICB2YXIgY2hpbGRPYiA9ICFzaGFsbG93ICYmIG9ic2VydmUodmFsKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICBnZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlR2V0dGVyICgpIHsKICAgICAgdmFyIHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbDsKICAgICAgaWYgKERlcC50YXJnZXQpIHsKICAgICAgICBkZXAuZGVwZW5kKCk7CiAgICAgICAgaWYgKGNoaWxkT2IpIHsKICAgICAgICAgIGNoaWxkT2IuZGVwLmRlcGVuZCgpOwogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgICAgIGRlcGVuZEFycmF5KHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbHVlCiAgICB9LAogICAgc2V0OiBmdW5jdGlvbiByZWFjdGl2ZVNldHRlciAobmV3VmFsKSB7CiAgICAgIHZhciB2YWx1ZSA9IGdldHRlciA/IGdldHRlci5jYWxsKG9iaikgOiB2YWw7CiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSAqLwogICAgICBpZiAobmV3VmFsID09PSB2YWx1ZSB8fCAobmV3VmFsICE9PSBuZXdWYWwgJiYgdmFsdWUgIT09IHZhbHVlKSkgewogICAgICAgIHJldHVybgogICAgICB9CiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tc2VsZi1jb21wYXJlICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgY3VzdG9tU2V0dGVyKSB7CiAgICAgICAgY3VzdG9tU2V0dGVyKCk7CiAgICAgIH0KICAgICAgaWYgKHNldHRlcikgewogICAgICAgIHNldHRlci5jYWxsKG9iaiwgbmV3VmFsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWwgPSBuZXdWYWw7CiAgICAgIH0KICAgICAgY2hpbGRPYiA9ICFzaGFsbG93ICYmIG9ic2VydmUobmV3VmFsKTsKICAgICAgZGVwLm5vdGlmeSgpOwogICAgfQogIH0pOwp9CgovKioKICogU2V0IGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBBZGRzIHRoZSBuZXcgcHJvcGVydHkgYW5kCiAqIHRyaWdnZXJzIGNoYW5nZSBub3RpZmljYXRpb24gaWYgdGhlIHByb3BlcnR5IGRvZXNuJ3QKICogYWxyZWFkeSBleGlzdC4KICovCmZ1bmN0aW9uIHNldCAodGFyZ2V0LCBrZXksIHZhbCkgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIChpc1VuZGVmKHRhcmdldCkgfHwgaXNQcmltaXRpdmUodGFyZ2V0KSkKICApIHsKICAgIHdhcm4oKCJDYW5ub3Qgc2V0IHJlYWN0aXZlIHByb3BlcnR5IG9uIHVuZGVmaW5lZCwgbnVsbCwgb3IgcHJpbWl0aXZlIHZhbHVlOiAiICsgKCh0YXJnZXQpKSkpOwogIH0KICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIGlzVmFsaWRBcnJheUluZGV4KGtleSkpIHsKICAgIHRhcmdldC5sZW5ndGggPSBNYXRoLm1heCh0YXJnZXQubGVuZ3RoLCBrZXkpOwogICAgdGFyZ2V0LnNwbGljZShrZXksIDEsIHZhbCk7CiAgICByZXR1cm4gdmFsCiAgfQogIGlmIChrZXkgaW4gdGFyZ2V0ICYmICEoa2V5IGluIE9iamVjdC5wcm90b3R5cGUpKSB7CiAgICB0YXJnZXRba2V5XSA9IHZhbDsKICAgIHJldHVybiB2YWwKICB9CiAgdmFyIG9iID0gKHRhcmdldCkuX19vYl9fOwogIGlmICh0YXJnZXQuX2lzVnVlIHx8IChvYiAmJiBvYi52bUNvdW50KSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICdBdm9pZCBhZGRpbmcgcmVhY3RpdmUgcHJvcGVydGllcyB0byBhIFZ1ZSBpbnN0YW5jZSBvciBpdHMgcm9vdCAkZGF0YSAnICsKICAgICAgJ2F0IHJ1bnRpbWUgLSBkZWNsYXJlIGl0IHVwZnJvbnQgaW4gdGhlIGRhdGEgb3B0aW9uLicKICAgICk7CiAgICByZXR1cm4gdmFsCiAgfQogIGlmICghb2IpIHsKICAgIHRhcmdldFtrZXldID0gdmFsOwogICAgcmV0dXJuIHZhbAogIH0KICBkZWZpbmVSZWFjdGl2ZShvYi52YWx1ZSwga2V5LCB2YWwpOwogIG9iLmRlcC5ub3RpZnkoKTsKICByZXR1cm4gdmFsCn0KCi8qKgogKiBEZWxldGUgYSBwcm9wZXJ0eSBhbmQgdHJpZ2dlciBjaGFuZ2UgaWYgbmVjZXNzYXJ5LgogKi8KZnVuY3Rpb24gZGVsICh0YXJnZXQsIGtleSkgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIChpc1VuZGVmKHRhcmdldCkgfHwgaXNQcmltaXRpdmUodGFyZ2V0KSkKICApIHsKICAgIHdhcm4oKCJDYW5ub3QgZGVsZXRlIHJlYWN0aXZlIHByb3BlcnR5IG9uIHVuZGVmaW5lZCwgbnVsbCwgb3IgcHJpbWl0aXZlIHZhbHVlOiAiICsgKCh0YXJnZXQpKSkpOwogIH0KICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIGlzVmFsaWRBcnJheUluZGV4KGtleSkpIHsKICAgIHRhcmdldC5zcGxpY2Uoa2V5LCAxKTsKICAgIHJldHVybgogIH0KICB2YXIgb2IgPSAodGFyZ2V0KS5fX29iX187CiAgaWYgKHRhcmdldC5faXNWdWUgfHwgKG9iICYmIG9iLnZtQ291bnQpKSB7CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgJ0F2b2lkIGRlbGV0aW5nIHByb3BlcnRpZXMgb24gYSBWdWUgaW5zdGFuY2Ugb3IgaXRzIHJvb3QgJGRhdGEgJyArCiAgICAgICctIGp1c3Qgc2V0IGl0IHRvIG51bGwuJwogICAgKTsKICAgIHJldHVybgogIH0KICBpZiAoIWhhc093bih0YXJnZXQsIGtleSkpIHsKICAgIHJldHVybgogIH0KICBkZWxldGUgdGFyZ2V0W2tleV07CiAgaWYgKCFvYikgewogICAgcmV0dXJuCiAgfQogIG9iLmRlcC5ub3RpZnkoKTsKfQoKLyoqCiAqIENvbGxlY3QgZGVwZW5kZW5jaWVzIG9uIGFycmF5IGVsZW1lbnRzIHdoZW4gdGhlIGFycmF5IGlzIHRvdWNoZWQsIHNpbmNlCiAqIHdlIGNhbm5vdCBpbnRlcmNlcHQgYXJyYXkgZWxlbWVudCBhY2Nlc3MgbGlrZSBwcm9wZXJ0eSBnZXR0ZXJzLgogKi8KZnVuY3Rpb24gZGVwZW5kQXJyYXkgKHZhbHVlKSB7CiAgZm9yICh2YXIgZSA9ICh2b2lkIDApLCBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgZSA9IHZhbHVlW2ldOwogICAgZSAmJiBlLl9fb2JfXyAmJiBlLl9fb2JfXy5kZXAuZGVwZW5kKCk7CiAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkgewogICAgICBkZXBlbmRBcnJheShlKTsKICAgIH0KICB9Cn0KCi8qICAqLwoKLyoqCiAqIE9wdGlvbiBvdmVyd3JpdGluZyBzdHJhdGVnaWVzIGFyZSBmdW5jdGlvbnMgdGhhdCBoYW5kbGUKICogaG93IHRvIG1lcmdlIGEgcGFyZW50IG9wdGlvbiB2YWx1ZSBhbmQgYSBjaGlsZCBvcHRpb24KICogdmFsdWUgaW50byB0aGUgZmluYWwgdmFsdWUuCiAqLwp2YXIgc3RyYXRzID0gY29uZmlnLm9wdGlvbk1lcmdlU3RyYXRlZ2llczsKCi8qKgogKiBPcHRpb25zIHdpdGggcmVzdHJpY3Rpb25zCiAqLwp7CiAgc3RyYXRzLmVsID0gc3RyYXRzLnByb3BzRGF0YSA9IGZ1bmN0aW9uIChwYXJlbnQsIGNoaWxkLCB2bSwga2V5KSB7CiAgICBpZiAoIXZtKSB7CiAgICAgIHdhcm4oCiAgICAgICAgIm9wdGlvbiBcIiIgKyBrZXkgKyAiXCIgY2FuIG9ubHkgYmUgdXNlZCBkdXJpbmcgaW5zdGFuY2UgIiArCiAgICAgICAgJ2NyZWF0aW9uIHdpdGggdGhlIGBuZXdgIGtleXdvcmQuJwogICAgICApOwogICAgfQogICAgcmV0dXJuIGRlZmF1bHRTdHJhdChwYXJlbnQsIGNoaWxkKQogIH07Cn0KCi8qKgogKiBIZWxwZXIgdGhhdCByZWN1cnNpdmVseSBtZXJnZXMgdHdvIGRhdGEgb2JqZWN0cyB0b2dldGhlci4KICovCmZ1bmN0aW9uIG1lcmdlRGF0YSAodG8sIGZyb20pIHsKICBpZiAoIWZyb20pIHsgcmV0dXJuIHRvIH0KICB2YXIga2V5LCB0b1ZhbCwgZnJvbVZhbDsKICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZyb20pOwogIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAga2V5ID0ga2V5c1tpXTsKICAgIHRvVmFsID0gdG9ba2V5XTsKICAgIGZyb21WYWwgPSBmcm9tW2tleV07CiAgICBpZiAoIWhhc093bih0bywga2V5KSkgewogICAgICBzZXQodG8sIGtleSwgZnJvbVZhbCk7CiAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodG9WYWwpICYmIGlzUGxhaW5PYmplY3QoZnJvbVZhbCkpIHsKICAgICAgbWVyZ2VEYXRhKHRvVmFsLCBmcm9tVmFsKTsKICAgIH0KICB9CiAgcmV0dXJuIHRvCn0KCi8qKgogKiBEYXRhCiAqLwpmdW5jdGlvbiBtZXJnZURhdGFPckZuICgKICBwYXJlbnRWYWwsCiAgY2hpbGRWYWwsCiAgdm0KKSB7CiAgaWYgKCF2bSkgewogICAgLy8gaW4gYSBWdWUuZXh0ZW5kIG1lcmdlLCBib3RoIHNob3VsZCBiZSBmdW5jdGlvbnMKICAgIGlmICghY2hpbGRWYWwpIHsKICAgICAgcmV0dXJuIHBhcmVudFZhbAogICAgfQogICAgaWYgKCFwYXJlbnRWYWwpIHsKICAgICAgcmV0dXJuIGNoaWxkVmFsCiAgICB9CiAgICAvLyB3aGVuIHBhcmVudFZhbCAmIGNoaWxkVmFsIGFyZSBib3RoIHByZXNlbnQsCiAgICAvLyB3ZSBuZWVkIHRvIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUKICAgIC8vIG1lcmdlZCByZXN1bHQgb2YgYm90aCBmdW5jdGlvbnMuLi4gbm8gbmVlZCB0bwogICAgLy8gY2hlY2sgaWYgcGFyZW50VmFsIGlzIGEgZnVuY3Rpb24gaGVyZSBiZWNhdXNlCiAgICAvLyBpdCBoYXMgdG8gYmUgYSBmdW5jdGlvbiB0byBwYXNzIHByZXZpb3VzIG1lcmdlcy4KICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZWREYXRhRm4gKCkgewogICAgICByZXR1cm4gbWVyZ2VEYXRhKAogICAgICAgIHR5cGVvZiBjaGlsZFZhbCA9PT0gJ2Z1bmN0aW9uJyA/IGNoaWxkVmFsLmNhbGwodGhpcywgdGhpcykgOiBjaGlsZFZhbCwKICAgICAgICB0eXBlb2YgcGFyZW50VmFsID09PSAnZnVuY3Rpb24nID8gcGFyZW50VmFsLmNhbGwodGhpcywgdGhpcykgOiBwYXJlbnRWYWwKICAgICAgKQogICAgfQogIH0gZWxzZSB7CiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VkSW5zdGFuY2VEYXRhRm4gKCkgewogICAgICAvLyBpbnN0YW5jZSBtZXJnZQogICAgICB2YXIgaW5zdGFuY2VEYXRhID0gdHlwZW9mIGNoaWxkVmFsID09PSAnZnVuY3Rpb24nCiAgICAgICAgPyBjaGlsZFZhbC5jYWxsKHZtLCB2bSkKICAgICAgICA6IGNoaWxkVmFsOwogICAgICB2YXIgZGVmYXVsdERhdGEgPSB0eXBlb2YgcGFyZW50VmFsID09PSAnZnVuY3Rpb24nCiAgICAgICAgPyBwYXJlbnRWYWwuY2FsbCh2bSwgdm0pCiAgICAgICAgOiBwYXJlbnRWYWw7CiAgICAgIGlmIChpbnN0YW5jZURhdGEpIHsKICAgICAgICByZXR1cm4gbWVyZ2VEYXRhKGluc3RhbmNlRGF0YSwgZGVmYXVsdERhdGEpCiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGRlZmF1bHREYXRhCiAgICAgIH0KICAgIH0KICB9Cn0KCnN0cmF0cy5kYXRhID0gZnVuY3Rpb24gKAogIHBhcmVudFZhbCwKICBjaGlsZFZhbCwKICB2bQopIHsKICBpZiAoIXZtKSB7CiAgICBpZiAoY2hpbGRWYWwgJiYgdHlwZW9mIGNoaWxkVmFsICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICdUaGUgImRhdGEiIG9wdGlvbiBzaG91bGQgYmUgYSBmdW5jdGlvbiAnICsKICAgICAgICAndGhhdCByZXR1cm5zIGEgcGVyLWluc3RhbmNlIHZhbHVlIGluIGNvbXBvbmVudCAnICsKICAgICAgICAnZGVmaW5pdGlvbnMuJywKICAgICAgICB2bQogICAgICApOwoKICAgICAgcmV0dXJuIHBhcmVudFZhbAogICAgfQogICAgcmV0dXJuIG1lcmdlRGF0YU9yRm4ocGFyZW50VmFsLCBjaGlsZFZhbCkKICB9CgogIHJldHVybiBtZXJnZURhdGFPckZuKHBhcmVudFZhbCwgY2hpbGRWYWwsIHZtKQp9OwoKLyoqCiAqIEhvb2tzIGFuZCBwcm9wcyBhcmUgbWVyZ2VkIGFzIGFycmF5cy4KICovCmZ1bmN0aW9uIG1lcmdlSG9vayAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsCikgewogIHJldHVybiBjaGlsZFZhbAogICAgPyBwYXJlbnRWYWwKICAgICAgPyBwYXJlbnRWYWwuY29uY2F0KGNoaWxkVmFsKQogICAgICA6IEFycmF5LmlzQXJyYXkoY2hpbGRWYWwpCiAgICAgICAgPyBjaGlsZFZhbAogICAgICAgIDogW2NoaWxkVmFsXQogICAgOiBwYXJlbnRWYWwKfQoKTElGRUNZQ0xFX0hPT0tTLmZvckVhY2goZnVuY3Rpb24gKGhvb2spIHsKICBzdHJhdHNbaG9va10gPSBtZXJnZUhvb2s7Cn0pOwoKLyoqCiAqIEFzc2V0cwogKgogKiBXaGVuIGEgdm0gaXMgcHJlc2VudCAoaW5zdGFuY2UgY3JlYXRpb24pLCB3ZSBuZWVkIHRvIGRvCiAqIGEgdGhyZWUtd2F5IG1lcmdlIGJldHdlZW4gY29uc3RydWN0b3Igb3B0aW9ucywgaW5zdGFuY2UKICogb3B0aW9ucyBhbmQgcGFyZW50IG9wdGlvbnMuCiAqLwpmdW5jdGlvbiBtZXJnZUFzc2V0cyAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsLAogIHZtLAogIGtleQopIHsKICB2YXIgcmVzID0gT2JqZWN0LmNyZWF0ZShwYXJlbnRWYWwgfHwgbnVsbCk7CiAgaWYgKGNoaWxkVmFsKSB7CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgICByZXR1cm4gZXh0ZW5kKHJlcywgY2hpbGRWYWwpCiAgfSBlbHNlIHsKICAgIHJldHVybiByZXMKICB9Cn0KCkFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsKICBzdHJhdHNbdHlwZSArICdzJ10gPSBtZXJnZUFzc2V0czsKfSk7CgovKioKICogV2F0Y2hlcnMuCiAqCiAqIFdhdGNoZXJzIGhhc2hlcyBzaG91bGQgbm90IG92ZXJ3cml0ZSBvbmUKICogYW5vdGhlciwgc28gd2UgbWVyZ2UgdGhlbSBhcyBhcnJheXMuCiAqLwpzdHJhdHMud2F0Y2ggPSBmdW5jdGlvbiAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsLAogIHZtLAogIGtleQopIHsKICAvLyB3b3JrIGFyb3VuZCBGaXJlZm94J3MgT2JqZWN0LnByb3RvdHlwZS53YXRjaC4uLgogIGlmIChwYXJlbnRWYWwgPT09IG5hdGl2ZVdhdGNoKSB7IHBhcmVudFZhbCA9IHVuZGVmaW5lZDsgfQogIGlmIChjaGlsZFZhbCA9PT0gbmF0aXZlV2F0Y2gpIHsgY2hpbGRWYWwgPSB1bmRlZmluZWQ7IH0KICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNoaWxkVmFsKSB7IHJldHVybiBPYmplY3QuY3JlYXRlKHBhcmVudFZhbCB8fCBudWxsKSB9CiAgewogICAgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgfQogIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9CiAgdmFyIHJldCA9IHt9OwogIGV4dGVuZChyZXQsIHBhcmVudFZhbCk7CiAgZm9yICh2YXIga2V5JDEgaW4gY2hpbGRWYWwpIHsKICAgIHZhciBwYXJlbnQgPSByZXRba2V5JDFdOwogICAgdmFyIGNoaWxkID0gY2hpbGRWYWxba2V5JDFdOwogICAgaWYgKHBhcmVudCAmJiAhQXJyYXkuaXNBcnJheShwYXJlbnQpKSB7CiAgICAgIHBhcmVudCA9IFtwYXJlbnRdOwogICAgfQogICAgcmV0W2tleSQxXSA9IHBhcmVudAogICAgICA/IHBhcmVudC5jb25jYXQoY2hpbGQpCiAgICAgIDogQXJyYXkuaXNBcnJheShjaGlsZCkgPyBjaGlsZCA6IFtjaGlsZF07CiAgfQogIHJldHVybiByZXQKfTsKCi8qKgogKiBPdGhlciBvYmplY3QgaGFzaGVzLgogKi8Kc3RyYXRzLnByb3BzID0Kc3RyYXRzLm1ldGhvZHMgPQpzdHJhdHMuaW5qZWN0ID0Kc3RyYXRzLmNvbXB1dGVkID0gZnVuY3Rpb24gKAogIHBhcmVudFZhbCwKICBjaGlsZFZhbCwKICB2bSwKICBrZXkKKSB7CiAgaWYgKGNoaWxkVmFsICYmICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgewogICAgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgfQogIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9CiAgdmFyIHJldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgZXh0ZW5kKHJldCwgcGFyZW50VmFsKTsKICBpZiAoY2hpbGRWYWwpIHsgZXh0ZW5kKHJldCwgY2hpbGRWYWwpOyB9CiAgcmV0dXJuIHJldAp9OwpzdHJhdHMucHJvdmlkZSA9IG1lcmdlRGF0YU9yRm47CgovKioKICogRGVmYXVsdCBzdHJhdGVneS4KICovCnZhciBkZWZhdWx0U3RyYXQgPSBmdW5jdGlvbiAocGFyZW50VmFsLCBjaGlsZFZhbCkgewogIHJldHVybiBjaGlsZFZhbCA9PT0gdW5kZWZpbmVkCiAgICA/IHBhcmVudFZhbAogICAgOiBjaGlsZFZhbAp9OwoKLyoqCiAqIFZhbGlkYXRlIGNvbXBvbmVudCBuYW1lcwogKi8KZnVuY3Rpb24gY2hlY2tDb21wb25lbnRzIChvcHRpb25zKSB7CiAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMuY29tcG9uZW50cykgewogICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGtleSk7CiAgfQp9CgpmdW5jdGlvbiB2YWxpZGF0ZUNvbXBvbmVudE5hbWUgKG5hbWUpIHsKICBpZiAoIS9eW2EtekEtWl1bXHctXSokLy50ZXN0KG5hbWUpKSB7CiAgICB3YXJuKAogICAgICAnSW52YWxpZCBjb21wb25lbnQgbmFtZTogIicgKyBuYW1lICsgJyIuIENvbXBvbmVudCBuYW1lcyAnICsKICAgICAgJ2NhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIHRoZSBoeXBoZW4sICcgKwogICAgICAnYW5kIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlci4nCiAgICApOwogIH0KICBpZiAoaXNCdWlsdEluVGFnKG5hbWUpIHx8IGNvbmZpZy5pc1Jlc2VydmVkVGFnKG5hbWUpKSB7CiAgICB3YXJuKAogICAgICAnRG8gbm90IHVzZSBidWlsdC1pbiBvciByZXNlcnZlZCBIVE1MIGVsZW1lbnRzIGFzIGNvbXBvbmVudCAnICsKICAgICAgJ2lkOiAnICsgbmFtZQogICAgKTsKICB9Cn0KCi8qKgogKiBFbnN1cmUgYWxsIHByb3BzIG9wdGlvbiBzeW50YXggYXJlIG5vcm1hbGl6ZWQgaW50byB0aGUKICogT2JqZWN0LWJhc2VkIGZvcm1hdC4KICovCmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzIChvcHRpb25zLCB2bSkgewogIHZhciBwcm9wcyA9IG9wdGlvbnMucHJvcHM7CiAgaWYgKCFwcm9wcykgeyByZXR1cm4gfQogIHZhciByZXMgPSB7fTsKICB2YXIgaSwgdmFsLCBuYW1lOwogIGlmIChBcnJheS5pc0FycmF5KHByb3BzKSkgewogICAgaSA9IHByb3BzLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsKICAgICAgdmFsID0gcHJvcHNbaV07CiAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgewogICAgICAgIG5hbWUgPSBjYW1lbGl6ZSh2YWwpOwogICAgICAgIHJlc1tuYW1lXSA9IHsgdHlwZTogbnVsbCB9OwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oJ3Byb3BzIG11c3QgYmUgc3RyaW5ncyB3aGVuIHVzaW5nIGFycmF5IHN5bnRheC4nKTsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChwcm9wcykpIHsKICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykgewogICAgICB2YWwgPSBwcm9wc1trZXldOwogICAgICBuYW1lID0gY2FtZWxpemUoa2V5KTsKICAgICAgcmVzW25hbWVdID0gaXNQbGFpbk9iamVjdCh2YWwpCiAgICAgICAgPyB2YWwKICAgICAgICA6IHsgdHlwZTogdmFsIH07CiAgICB9CiAgfSBlbHNlIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCJwcm9wc1wiOiBleHBlY3RlZCBhbiBBcnJheSBvciBhbiBPYmplY3QsICIgKwogICAgICAiYnV0IGdvdCAiICsgKHRvUmF3VHlwZShwcm9wcykpICsgIi4iLAogICAgICB2bQogICAgKTsKICB9CiAgb3B0aW9ucy5wcm9wcyA9IHJlczsKfQoKLyoqCiAqIE5vcm1hbGl6ZSBhbGwgaW5qZWN0aW9ucyBpbnRvIE9iamVjdC1iYXNlZCBmb3JtYXQKICovCmZ1bmN0aW9uIG5vcm1hbGl6ZUluamVjdCAob3B0aW9ucywgdm0pIHsKICB2YXIgaW5qZWN0ID0gb3B0aW9ucy5pbmplY3Q7CiAgaWYgKCFpbmplY3QpIHsgcmV0dXJuIH0KICB2YXIgbm9ybWFsaXplZCA9IG9wdGlvbnMuaW5qZWN0ID0ge307CiAgaWYgKEFycmF5LmlzQXJyYXkoaW5qZWN0KSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmplY3QubGVuZ3RoOyBpKyspIHsKICAgICAgbm9ybWFsaXplZFtpbmplY3RbaV1dID0geyBmcm9tOiBpbmplY3RbaV0gfTsKICAgIH0KICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoaW5qZWN0KSkgewogICAgZm9yICh2YXIga2V5IGluIGluamVjdCkgewogICAgICB2YXIgdmFsID0gaW5qZWN0W2tleV07CiAgICAgIG5vcm1hbGl6ZWRba2V5XSA9IGlzUGxhaW5PYmplY3QodmFsKQogICAgICAgID8gZXh0ZW5kKHsgZnJvbToga2V5IH0sIHZhbCkKICAgICAgICA6IHsgZnJvbTogdmFsIH07CiAgICB9CiAgfSBlbHNlIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCJpbmplY3RcIjogZXhwZWN0ZWQgYW4gQXJyYXkgb3IgYW4gT2JqZWN0LCAiICsKICAgICAgImJ1dCBnb3QgIiArICh0b1Jhd1R5cGUoaW5qZWN0KSkgKyAiLiIsCiAgICAgIHZtCiAgICApOwogIH0KfQoKLyoqCiAqIE5vcm1hbGl6ZSByYXcgZnVuY3Rpb24gZGlyZWN0aXZlcyBpbnRvIG9iamVjdCBmb3JtYXQuCiAqLwpmdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzIChvcHRpb25zKSB7CiAgdmFyIGRpcnMgPSBvcHRpb25zLmRpcmVjdGl2ZXM7CiAgaWYgKGRpcnMpIHsKICAgIGZvciAodmFyIGtleSBpbiBkaXJzKSB7CiAgICAgIHZhciBkZWYgPSBkaXJzW2tleV07CiAgICAgIGlmICh0eXBlb2YgZGVmID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgZGlyc1trZXldID0geyBiaW5kOiBkZWYsIHVwZGF0ZTogZGVmIH07CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGFzc2VydE9iamVjdFR5cGUgKG5hbWUsIHZhbHVlLCB2bSkgewogIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCIiICsgbmFtZSArICJcIjogZXhwZWN0ZWQgYW4gT2JqZWN0LCAiICsKICAgICAgImJ1dCBnb3QgIiArICh0b1Jhd1R5cGUodmFsdWUpKSArICIuIiwKICAgICAgdm0KICAgICk7CiAgfQp9CgovKioKICogTWVyZ2UgdHdvIG9wdGlvbiBvYmplY3RzIGludG8gYSBuZXcgb25lLgogKiBDb3JlIHV0aWxpdHkgdXNlZCBpbiBib3RoIGluc3RhbnRpYXRpb24gYW5kIGluaGVyaXRhbmNlLgogKi8KZnVuY3Rpb24gbWVyZ2VPcHRpb25zICgKICBwYXJlbnQsCiAgY2hpbGQsCiAgdm0KKSB7CiAgewogICAgY2hlY2tDb21wb25lbnRzKGNoaWxkKTsKICB9CgogIGlmICh0eXBlb2YgY2hpbGQgPT09ICdmdW5jdGlvbicpIHsKICAgIGNoaWxkID0gY2hpbGQub3B0aW9uczsKICB9CgogIG5vcm1hbGl6ZVByb3BzKGNoaWxkLCB2bSk7CiAgbm9ybWFsaXplSW5qZWN0KGNoaWxkLCB2bSk7CiAgbm9ybWFsaXplRGlyZWN0aXZlcyhjaGlsZCk7CiAgdmFyIGV4dGVuZHNGcm9tID0gY2hpbGQuZXh0ZW5kczsKICBpZiAoZXh0ZW5kc0Zyb20pIHsKICAgIHBhcmVudCA9IG1lcmdlT3B0aW9ucyhwYXJlbnQsIGV4dGVuZHNGcm9tLCB2bSk7CiAgfQogIGlmIChjaGlsZC5taXhpbnMpIHsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGQubWl4aW5zLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICBwYXJlbnQgPSBtZXJnZU9wdGlvbnMocGFyZW50LCBjaGlsZC5taXhpbnNbaV0sIHZtKTsKICAgIH0KICB9CiAgdmFyIG9wdGlvbnMgPSB7fTsKICB2YXIga2V5OwogIGZvciAoa2V5IGluIHBhcmVudCkgewogICAgbWVyZ2VGaWVsZChrZXkpOwogIH0KICBmb3IgKGtleSBpbiBjaGlsZCkgewogICAgaWYgKCFoYXNPd24ocGFyZW50LCBrZXkpKSB7CiAgICAgIG1lcmdlRmllbGQoa2V5KTsKICAgIH0KICB9CiAgZnVuY3Rpb24gbWVyZ2VGaWVsZCAoa2V5KSB7CiAgICB2YXIgc3RyYXQgPSBzdHJhdHNba2V5XSB8fCBkZWZhdWx0U3RyYXQ7CiAgICBvcHRpb25zW2tleV0gPSBzdHJhdChwYXJlbnRba2V5XSwgY2hpbGRba2V5XSwgdm0sIGtleSk7CiAgfQogIHJldHVybiBvcHRpb25zCn0KCi8qKgogKiBSZXNvbHZlIGFuIGFzc2V0LgogKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYmVjYXVzZSBjaGlsZCBpbnN0YW5jZXMgbmVlZCBhY2Nlc3MKICogdG8gYXNzZXRzIGRlZmluZWQgaW4gaXRzIGFuY2VzdG9yIGNoYWluLgogKi8KZnVuY3Rpb24gcmVzb2x2ZUFzc2V0ICgKICBvcHRpb25zLAogIHR5cGUsCiAgaWQsCiAgd2Fybk1pc3NpbmcKKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKHR5cGVvZiBpZCAhPT0gJ3N0cmluZycpIHsKICAgIHJldHVybgogIH0KICB2YXIgYXNzZXRzID0gb3B0aW9uc1t0eXBlXTsKICAvLyBjaGVjayBsb2NhbCByZWdpc3RyYXRpb24gdmFyaWF0aW9ucyBmaXJzdAogIGlmIChoYXNPd24oYXNzZXRzLCBpZCkpIHsgcmV0dXJuIGFzc2V0c1tpZF0gfQogIHZhciBjYW1lbGl6ZWRJZCA9IGNhbWVsaXplKGlkKTsKICBpZiAoaGFzT3duKGFzc2V0cywgY2FtZWxpemVkSWQpKSB7IHJldHVybiBhc3NldHNbY2FtZWxpemVkSWRdIH0KICB2YXIgUGFzY2FsQ2FzZUlkID0gY2FwaXRhbGl6ZShjYW1lbGl6ZWRJZCk7CiAgaWYgKGhhc093bihhc3NldHMsIFBhc2NhbENhc2VJZCkpIHsgcmV0dXJuIGFzc2V0c1tQYXNjYWxDYXNlSWRdIH0KICAvLyBmYWxsYmFjayB0byBwcm90b3R5cGUgY2hhaW4KICB2YXIgcmVzID0gYXNzZXRzW2lkXSB8fCBhc3NldHNbY2FtZWxpemVkSWRdIHx8IGFzc2V0c1tQYXNjYWxDYXNlSWRdOwogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2Fybk1pc3NpbmcgJiYgIXJlcykgewogICAgd2FybigKICAgICAgJ0ZhaWxlZCB0byByZXNvbHZlICcgKyB0eXBlLnNsaWNlKDAsIC0xKSArICc6ICcgKyBpZCwKICAgICAgb3B0aW9ucwogICAgKTsKICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCmZ1bmN0aW9uIHZhbGlkYXRlUHJvcCAoCiAga2V5LAogIHByb3BPcHRpb25zLAogIHByb3BzRGF0YSwKICB2bQopIHsKICB2YXIgcHJvcCA9IHByb3BPcHRpb25zW2tleV07CiAgdmFyIGFic2VudCA9ICFoYXNPd24ocHJvcHNEYXRhLCBrZXkpOwogIHZhciB2YWx1ZSA9IHByb3BzRGF0YVtrZXldOwogIC8vIGJvb2xlYW4gY2FzdGluZwogIHZhciBib29sZWFuSW5kZXggPSBnZXRUeXBlSW5kZXgoQm9vbGVhbiwgcHJvcC50eXBlKTsKICBpZiAoYm9vbGVhbkluZGV4ID4gLTEpIHsKICAgIGlmIChhYnNlbnQgJiYgIWhhc093bihwcm9wLCAnZGVmYXVsdCcpKSB7CiAgICAgIHZhbHVlID0gZmFsc2U7CiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gaHlwaGVuYXRlKGtleSkpIHsKICAgICAgLy8gb25seSBjYXN0IGVtcHR5IHN0cmluZyAvIHNhbWUgbmFtZSB0byBib29sZWFuIGlmCiAgICAgIC8vIGJvb2xlYW4gaGFzIGhpZ2hlciBwcmlvcml0eQogICAgICB2YXIgc3RyaW5nSW5kZXggPSBnZXRUeXBlSW5kZXgoU3RyaW5nLCBwcm9wLnR5cGUpOwogICAgICBpZiAoc3RyaW5nSW5kZXggPCAwIHx8IGJvb2xlYW5JbmRleCA8IHN0cmluZ0luZGV4KSB7CiAgICAgICAgdmFsdWUgPSB0cnVlOwogICAgICB9CiAgICB9CiAgfQogIC8vIGNoZWNrIGRlZmF1bHQgdmFsdWUKICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgdmFsdWUgPSBnZXRQcm9wRGVmYXVsdFZhbHVlKHZtLCBwcm9wLCBrZXkpOwogICAgLy8gc2luY2UgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYSBmcmVzaCBjb3B5LAogICAgLy8gbWFrZSBzdXJlIHRvIG9ic2VydmUgaXQuCiAgICB2YXIgcHJldlNob3VsZE9ic2VydmUgPSBzaG91bGRPYnNlcnZlOwogICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpOwogICAgb2JzZXJ2ZSh2YWx1ZSk7CiAgICB0b2dnbGVPYnNlcnZpbmcocHJldlNob3VsZE9ic2VydmUpOwogIH0KICB7CiAgICBhc3NlcnRQcm9wKHByb3AsIGtleSwgdmFsdWUsIHZtLCBhYnNlbnQpOwogIH0KICByZXR1cm4gdmFsdWUKfQoKLyoqCiAqIEdldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIHByb3AuCiAqLwpmdW5jdGlvbiBnZXRQcm9wRGVmYXVsdFZhbHVlICh2bSwgcHJvcCwga2V5KSB7CiAgLy8gbm8gZGVmYXVsdCwgcmV0dXJuIHVuZGVmaW5lZAogIGlmICghaGFzT3duKHByb3AsICdkZWZhdWx0JykpIHsKICAgIHJldHVybiB1bmRlZmluZWQKICB9CiAgdmFyIGRlZiA9IHByb3AuZGVmYXVsdDsKICAvLyB3YXJuIGFnYWluc3Qgbm9uLWZhY3RvcnkgZGVmYXVsdHMgZm9yIE9iamVjdCAmIEFycmF5CiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBpc09iamVjdChkZWYpKSB7CiAgICB3YXJuKAogICAgICAnSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBwcm9wICInICsga2V5ICsgJyI6ICcgKwogICAgICAnUHJvcHMgd2l0aCB0eXBlIE9iamVjdC9BcnJheSBtdXN0IHVzZSBhIGZhY3RvcnkgZnVuY3Rpb24gJyArCiAgICAgICd0byByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuJywKICAgICAgdm0KICAgICk7CiAgfQogIC8vIHRoZSByYXcgcHJvcCB2YWx1ZSB3YXMgYWxzbyB1bmRlZmluZWQgZnJvbSBwcmV2aW91cyByZW5kZXIsCiAgLy8gcmV0dXJuIHByZXZpb3VzIGRlZmF1bHQgdmFsdWUgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgd2F0Y2hlciB0cmlnZ2VyCiAgaWYgKHZtICYmIHZtLiRvcHRpb25zLnByb3BzRGF0YSAmJgogICAgdm0uJG9wdGlvbnMucHJvcHNEYXRhW2tleV0gPT09IHVuZGVmaW5lZCAmJgogICAgdm0uX3Byb3BzW2tleV0gIT09IHVuZGVmaW5lZAogICkgewogICAgcmV0dXJuIHZtLl9wcm9wc1trZXldCiAgfQogIC8vIGNhbGwgZmFjdG9yeSBmdW5jdGlvbiBmb3Igbm9uLUZ1bmN0aW9uIHR5cGVzCiAgLy8gYSB2YWx1ZSBpcyBGdW5jdGlvbiBpZiBpdHMgcHJvdG90eXBlIGlzIGZ1bmN0aW9uIGV2ZW4gYWNyb3NzIGRpZmZlcmVudCBleGVjdXRpb24gY29udGV4dAogIHJldHVybiB0eXBlb2YgZGVmID09PSAnZnVuY3Rpb24nICYmIGdldFR5cGUocHJvcC50eXBlKSAhPT0gJ0Z1bmN0aW9uJwogICAgPyBkZWYuY2FsbCh2bSkKICAgIDogZGVmCn0KCi8qKgogKiBBc3NlcnQgd2hldGhlciBhIHByb3AgaXMgdmFsaWQuCiAqLwpmdW5jdGlvbiBhc3NlcnRQcm9wICgKICBwcm9wLAogIG5hbWUsCiAgdmFsdWUsCiAgdm0sCiAgYWJzZW50CikgewogIGlmIChwcm9wLnJlcXVpcmVkICYmIGFic2VudCkgewogICAgd2FybigKICAgICAgJ01pc3NpbmcgcmVxdWlyZWQgcHJvcDogIicgKyBuYW1lICsgJyInLAogICAgICB2bQogICAgKTsKICAgIHJldHVybgogIH0KICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhcHJvcC5yZXF1aXJlZCkgewogICAgcmV0dXJuCiAgfQogIHZhciB0eXBlID0gcHJvcC50eXBlOwogIHZhciB2YWxpZCA9ICF0eXBlIHx8IHR5cGUgPT09IHRydWU7CiAgdmFyIGV4cGVjdGVkVHlwZXMgPSBbXTsKICBpZiAodHlwZSkgewogICAgaWYgKCFBcnJheS5pc0FycmF5KHR5cGUpKSB7CiAgICAgIHR5cGUgPSBbdHlwZV07CiAgICB9CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGUubGVuZ3RoICYmICF2YWxpZDsgaSsrKSB7CiAgICAgIHZhciBhc3NlcnRlZFR5cGUgPSBhc3NlcnRUeXBlKHZhbHVlLCB0eXBlW2ldKTsKICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGFzc2VydGVkVHlwZS5leHBlY3RlZFR5cGUgfHwgJycpOwogICAgICB2YWxpZCA9IGFzc2VydGVkVHlwZS52YWxpZDsKICAgIH0KICB9CiAgaWYgKCF2YWxpZCkgewogICAgd2FybigKICAgICAgIkludmFsaWQgcHJvcDogdHlwZSBjaGVjayBmYWlsZWQgZm9yIHByb3AgXCIiICsgbmFtZSArICJcIi4iICsKICAgICAgIiBFeHBlY3RlZCAiICsgKGV4cGVjdGVkVHlwZXMubWFwKGNhcGl0YWxpemUpLmpvaW4oJywgJykpICsKICAgICAgIiwgZ290ICIgKyAodG9SYXdUeXBlKHZhbHVlKSkgKyAiLiIsCiAgICAgIHZtCiAgICApOwogICAgcmV0dXJuCiAgfQogIHZhciB2YWxpZGF0b3IgPSBwcm9wLnZhbGlkYXRvcjsKICBpZiAodmFsaWRhdG9yKSB7CiAgICBpZiAoIXZhbGlkYXRvcih2YWx1ZSkpIHsKICAgICAgd2FybigKICAgICAgICAnSW52YWxpZCBwcm9wOiBjdXN0b20gdmFsaWRhdG9yIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCAiJyArIG5hbWUgKyAnIi4nLAogICAgICAgIHZtCiAgICAgICk7CiAgICB9CiAgfQp9Cgp2YXIgc2ltcGxlQ2hlY2tSRSA9IC9eKFN0cmluZ3xOdW1iZXJ8Qm9vbGVhbnxGdW5jdGlvbnxTeW1ib2wpJC87CgpmdW5jdGlvbiBhc3NlcnRUeXBlICh2YWx1ZSwgdHlwZSkgewogIHZhciB2YWxpZDsKICB2YXIgZXhwZWN0ZWRUeXBlID0gZ2V0VHlwZSh0eXBlKTsKICBpZiAoc2ltcGxlQ2hlY2tSRS50ZXN0KGV4cGVjdGVkVHlwZSkpIHsKICAgIHZhciB0ID0gdHlwZW9mIHZhbHVlOwogICAgdmFsaWQgPSB0ID09PSBleHBlY3RlZFR5cGUudG9Mb3dlckNhc2UoKTsKICAgIC8vIGZvciBwcmltaXRpdmUgd3JhcHBlciBvYmplY3RzCiAgICBpZiAoIXZhbGlkICYmIHQgPT09ICdvYmplY3QnKSB7CiAgICAgIHZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiB0eXBlOwogICAgfQogIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSAnT2JqZWN0JykgewogICAgdmFsaWQgPSBpc1BsYWluT2JqZWN0KHZhbHVlKTsKICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ0FycmF5JykgewogICAgdmFsaWQgPSBBcnJheS5pc0FycmF5KHZhbHVlKTsKICB9IGVsc2UgewogICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7CiAgfQogIHJldHVybiB7CiAgICB2YWxpZDogdmFsaWQsCiAgICBleHBlY3RlZFR5cGU6IGV4cGVjdGVkVHlwZQogIH0KfQoKLyoqCiAqIFVzZSBmdW5jdGlvbiBzdHJpbmcgbmFtZSB0byBjaGVjayBidWlsdC1pbiB0eXBlcywKICogYmVjYXVzZSBhIHNpbXBsZSBlcXVhbGl0eSBjaGVjayB3aWxsIGZhaWwgd2hlbiBydW5uaW5nCiAqIGFjcm9zcyBkaWZmZXJlbnQgdm1zIC8gaWZyYW1lcy4KICovCmZ1bmN0aW9uIGdldFR5cGUgKGZuKSB7CiAgdmFyIG1hdGNoID0gZm4gJiYgZm4udG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7CiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiAnJwp9CgpmdW5jdGlvbiBpc1NhbWVUeXBlIChhLCBiKSB7CiAgcmV0dXJuIGdldFR5cGUoYSkgPT09IGdldFR5cGUoYikKfQoKZnVuY3Rpb24gZ2V0VHlwZUluZGV4ICh0eXBlLCBleHBlY3RlZFR5cGVzKSB7CiAgaWYgKCFBcnJheS5pc0FycmF5KGV4cGVjdGVkVHlwZXMpKSB7CiAgICByZXR1cm4gaXNTYW1lVHlwZShleHBlY3RlZFR5cGVzLCB0eXBlKSA/IDAgOiAtMQogIH0KICBmb3IgKHZhciBpID0gMCwgbGVuID0gZXhwZWN0ZWRUeXBlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgaWYgKGlzU2FtZVR5cGUoZXhwZWN0ZWRUeXBlc1tpXSwgdHlwZSkpIHsKICAgICAgcmV0dXJuIGkKICAgIH0KICB9CiAgcmV0dXJuIC0xCn0KCi8qICAqLwoKZnVuY3Rpb24gaGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICBpZiAodm0pIHsKICAgIHZhciBjdXIgPSB2bTsKICAgIHdoaWxlICgoY3VyID0gY3VyLiRwYXJlbnQpKSB7CiAgICAgIHZhciBob29rcyA9IGN1ci4kb3B0aW9ucy5lcnJvckNhcHR1cmVkOwogICAgICBpZiAoaG9va3MpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB2YXIgY2FwdHVyZSA9IGhvb2tzW2ldLmNhbGwoY3VyLCBlcnIsIHZtLCBpbmZvKSA9PT0gZmFsc2U7CiAgICAgICAgICAgIGlmIChjYXB0dXJlKSB7IHJldHVybiB9CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGdsb2JhbEhhbmRsZUVycm9yKGUsIGN1ciwgJ2Vycm9yQ2FwdHVyZWQgaG9vaycpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBnbG9iYWxIYW5kbGVFcnJvcihlcnIsIHZtLCBpbmZvKTsKfQoKZnVuY3Rpb24gZ2xvYmFsSGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICBpZiAoY29uZmlnLmVycm9ySGFuZGxlcikgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIGNvbmZpZy5lcnJvckhhbmRsZXIuY2FsbChudWxsLCBlcnIsIHZtLCBpbmZvKQogICAgfSBjYXRjaCAoZSkgewogICAgICBsb2dFcnJvcihlLCBudWxsLCAnY29uZmlnLmVycm9ySGFuZGxlcicpOwogICAgfQogIH0KICBsb2dFcnJvcihlcnIsIHZtLCBpbmZvKTsKfQoKZnVuY3Rpb24gbG9nRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICB7CiAgICB3YXJuKCgiRXJyb3IgaW4gIiArIGluZm8gKyAiOiBcIiIgKyAoZXJyLnRvU3RyaW5nKCkpICsgIlwiIiksIHZtKTsKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICBpZiAoKGluQnJvd3NlciB8fCBpbldlZXgpICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykgewogICAgY29uc29sZS5lcnJvcihlcnIpOwogIH0gZWxzZSB7CiAgICB0aHJvdyBlcnIKICB9Cn0KCi8qICAqLwovKiBnbG9iYWxzIE1lc3NhZ2VDaGFubmVsICovCgp2YXIgY2FsbGJhY2tzID0gW107CnZhciBwZW5kaW5nID0gZmFsc2U7CgpmdW5jdGlvbiBmbHVzaENhbGxiYWNrcyAoKSB7CiAgcGVuZGluZyA9IGZhbHNlOwogIHZhciBjb3BpZXMgPSBjYWxsYmFja3Muc2xpY2UoMCk7CiAgY2FsbGJhY2tzLmxlbmd0aCA9IDA7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3BpZXMubGVuZ3RoOyBpKyspIHsKICAgIGNvcGllc1tpXSgpOwogIH0KfQoKLy8gSGVyZSB3ZSBoYXZlIGFzeW5jIGRlZmVycmluZyB3cmFwcGVycyB1c2luZyBib3RoIG1pY3JvdGFza3MgYW5kIChtYWNybykgdGFza3MuCi8vIEluIDwgMi40IHdlIHVzZWQgbWljcm90YXNrcyBldmVyeXdoZXJlLCBidXQgdGhlcmUgYXJlIHNvbWUgc2NlbmFyaW9zIHdoZXJlCi8vIG1pY3JvdGFza3MgaGF2ZSB0b28gaGlnaCBhIHByaW9yaXR5IGFuZCBmaXJlIGluIGJldHdlZW4gc3VwcG9zZWRseQovLyBzZXF1ZW50aWFsIGV2ZW50cyAoZS5nLiAjNDUyMSwgIzY2OTApIG9yIGV2ZW4gYmV0d2VlbiBidWJibGluZyBvZiB0aGUgc2FtZQovLyBldmVudCAoIzY1NjYpLiBIb3dldmVyLCB1c2luZyAobWFjcm8pIHRhc2tzIGV2ZXJ5d2hlcmUgYWxzbyBoYXMgc3VidGxlIHByb2JsZW1zCi8vIHdoZW4gc3RhdGUgaXMgY2hhbmdlZCByaWdodCBiZWZvcmUgcmVwYWludCAoZS5nLiAjNjgxMywgb3V0LWluIHRyYW5zaXRpb25zKS4KLy8gSGVyZSB3ZSB1c2UgbWljcm90YXNrIGJ5IGRlZmF1bHQsIGJ1dCBleHBvc2UgYSB3YXkgdG8gZm9yY2UgKG1hY3JvKSB0YXNrIHdoZW4KLy8gbmVlZGVkIChlLmcuIGluIGV2ZW50IGhhbmRsZXJzIGF0dGFjaGVkIGJ5IHYtb24pLgp2YXIgbWljcm9UaW1lckZ1bmM7CnZhciBtYWNyb1RpbWVyRnVuYzsKdmFyIHVzZU1hY3JvVGFzayA9IGZhbHNlOwoKLy8gRGV0ZXJtaW5lIChtYWNybykgdGFzayBkZWZlciBpbXBsZW1lbnRhdGlvbi4KLy8gVGVjaG5pY2FsbHkgc2V0SW1tZWRpYXRlIHNob3VsZCBiZSB0aGUgaWRlYWwgY2hvaWNlLCBidXQgaXQncyBvbmx5IGF2YWlsYWJsZQovLyBpbiBJRS4gVGhlIG9ubHkgcG9seWZpbGwgdGhhdCBjb25zaXN0ZW50bHkgcXVldWVzIHRoZSBjYWxsYmFjayBhZnRlciBhbGwgRE9NCi8vIGV2ZW50cyB0cmlnZ2VyZWQgaW4gdGhlIHNhbWUgbG9vcCBpcyBieSB1c2luZyBNZXNzYWdlQ2hhbm5lbC4KLyogaXN0YW5idWwgaWdub3JlIGlmICovCmlmICh0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShzZXRJbW1lZGlhdGUpKSB7CiAgbWFjcm9UaW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICBzZXRJbW1lZGlhdGUoZmx1c2hDYWxsYmFja3MpOwogIH07Cn0gZWxzZSBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJyAmJiAoCiAgaXNOYXRpdmUoTWVzc2FnZUNoYW5uZWwpIHx8CiAgLy8gUGhhbnRvbUpTCiAgTWVzc2FnZUNoYW5uZWwudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgTWVzc2FnZUNoYW5uZWxDb25zdHJ1Y3Rvcl0nCikpIHsKICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpOwogIHZhciBwb3J0ID0gY2hhbm5lbC5wb3J0MjsKICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZsdXNoQ2FsbGJhY2tzOwogIG1hY3JvVGltZXJGdW5jID0gZnVuY3Rpb24gKCkgewogICAgcG9ydC5wb3N0TWVzc2FnZSgxKTsKICB9Owp9IGVsc2UgewogIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgbWFjcm9UaW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICBzZXRUaW1lb3V0KGZsdXNoQ2FsbGJhY2tzLCAwKTsKICB9Owp9CgovLyBEZXRlcm1pbmUgbWljcm90YXNrIGRlZmVyIGltcGxlbWVudGF0aW9uLgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCwgJGZsb3ctZGlzYWJsZS1saW5lICovCmlmICh0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoUHJvbWlzZSkpIHsKICB2YXIgcCA9IFByb21pc2UucmVzb2x2ZSgpOwogIG1pY3JvVGltZXJGdW5jID0gZnVuY3Rpb24gKCkgewogICAgcC50aGVuKGZsdXNoQ2FsbGJhY2tzKTsKICAgIC8vIGluIHByb2JsZW1hdGljIFVJV2ViVmlld3MsIFByb21pc2UudGhlbiBkb2Vzbid0IGNvbXBsZXRlbHkgYnJlYWssIGJ1dAogICAgLy8gaXQgY2FuIGdldCBzdHVjayBpbiBhIHdlaXJkIHN0YXRlIHdoZXJlIGNhbGxiYWNrcyBhcmUgcHVzaGVkIGludG8gdGhlCiAgICAvLyBtaWNyb3Rhc2sgcXVldWUgYnV0IHRoZSBxdWV1ZSBpc24ndCBiZWluZyBmbHVzaGVkLCB1bnRpbCB0aGUgYnJvd3NlcgogICAgLy8gbmVlZHMgdG8gZG8gc29tZSBvdGhlciB3b3JrLCBlLmcuIGhhbmRsZSBhIHRpbWVyLiBUaGVyZWZvcmUgd2UgY2FuCiAgICAvLyAiZm9yY2UiIHRoZSBtaWNyb3Rhc2sgcXVldWUgdG8gYmUgZmx1c2hlZCBieSBhZGRpbmcgYW4gZW1wdHkgdGltZXIuCiAgICBpZiAoaXNJT1MpIHsgc2V0VGltZW91dChub29wKTsgfQogIH07Cn0gZWxzZSB7CiAgLy8gZmFsbGJhY2sgdG8gbWFjcm8KICBtaWNyb1RpbWVyRnVuYyA9IG1hY3JvVGltZXJGdW5jOwp9CgovKioKICogV3JhcCBhIGZ1bmN0aW9uIHNvIHRoYXQgaWYgYW55IGNvZGUgaW5zaWRlIHRyaWdnZXJzIHN0YXRlIGNoYW5nZSwKICogdGhlIGNoYW5nZXMgYXJlIHF1ZXVlZCB1c2luZyBhIChtYWNybykgdGFzayBpbnN0ZWFkIG9mIGEgbWljcm90YXNrLgogKi8KZnVuY3Rpb24gd2l0aE1hY3JvVGFzayAoZm4pIHsKICByZXR1cm4gZm4uX3dpdGhUYXNrIHx8IChmbi5fd2l0aFRhc2sgPSBmdW5jdGlvbiAoKSB7CiAgICB1c2VNYWNyb1Rhc2sgPSB0cnVlOwogICAgdmFyIHJlcyA9IGZuLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICB1c2VNYWNyb1Rhc2sgPSBmYWxzZTsKICAgIHJldHVybiByZXMKICB9KQp9CgpmdW5jdGlvbiBuZXh0VGljayAoY2IsIGN0eCkgewogIHZhciBfcmVzb2x2ZTsKICBjYWxsYmFja3MucHVzaChmdW5jdGlvbiAoKSB7CiAgICBpZiAoY2IpIHsKICAgICAgdHJ5IHsKICAgICAgICBjYi5jYWxsKGN0eCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBoYW5kbGVFcnJvcihlLCBjdHgsICduZXh0VGljaycpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKF9yZXNvbHZlKSB7CiAgICAgIF9yZXNvbHZlKGN0eCk7CiAgICB9CiAgfSk7CiAgaWYgKCFwZW5kaW5nKSB7CiAgICBwZW5kaW5nID0gdHJ1ZTsKICAgIGlmICh1c2VNYWNyb1Rhc2spIHsKICAgICAgbWFjcm9UaW1lckZ1bmMoKTsKICAgIH0gZWxzZSB7CiAgICAgIG1pY3JvVGltZXJGdW5jKCk7CiAgICB9CiAgfQogIC8vICRmbG93LWRpc2FibGUtbGluZQogIGlmICghY2IgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgX3Jlc29sdmUgPSByZXNvbHZlOwogICAgfSkKICB9Cn0KCi8qICAqLwoKdmFyIG1hcms7CnZhciBtZWFzdXJlOwoKewogIHZhciBwZXJmID0gaW5Ccm93c2VyICYmIHdpbmRvdy5wZXJmb3JtYW5jZTsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoCiAgICBwZXJmICYmCiAgICBwZXJmLm1hcmsgJiYKICAgIHBlcmYubWVhc3VyZSAmJgogICAgcGVyZi5jbGVhck1hcmtzICYmCiAgICBwZXJmLmNsZWFyTWVhc3VyZXMKICApIHsKICAgIG1hcmsgPSBmdW5jdGlvbiAodGFnKSB7IHJldHVybiBwZXJmLm1hcmsodGFnKTsgfTsKICAgIG1lYXN1cmUgPSBmdW5jdGlvbiAobmFtZSwgc3RhcnRUYWcsIGVuZFRhZykgewogICAgICBwZXJmLm1lYXN1cmUobmFtZSwgc3RhcnRUYWcsIGVuZFRhZyk7CiAgICAgIHBlcmYuY2xlYXJNYXJrcyhzdGFydFRhZyk7CiAgICAgIHBlcmYuY2xlYXJNYXJrcyhlbmRUYWcpOwogICAgICBwZXJmLmNsZWFyTWVhc3VyZXMobmFtZSk7CiAgICB9OwogIH0KfQoKLyogbm90IHR5cGUgY2hlY2tpbmcgdGhpcyBmaWxlIGJlY2F1c2UgZmxvdyBkb2Vzbid0IHBsYXkgd2VsbCB3aXRoIFByb3h5ICovCgp2YXIgaW5pdFByb3h5OwoKewogIHZhciBhbGxvd2VkR2xvYmFscyA9IG1ha2VNYXAoCiAgICAnSW5maW5pdHksdW5kZWZpbmVkLE5hTixpc0Zpbml0ZSxpc05hTiwnICsKICAgICdwYXJzZUZsb2F0LHBhcnNlSW50LGRlY29kZVVSSSxkZWNvZGVVUklDb21wb25lbnQsZW5jb2RlVVJJLGVuY29kZVVSSUNvbXBvbmVudCwnICsKICAgICdNYXRoLE51bWJlcixEYXRlLEFycmF5LE9iamVjdCxCb29sZWFuLFN0cmluZyxSZWdFeHAsTWFwLFNldCxKU09OLEludGwsJyArCiAgICAncmVxdWlyZScgLy8gZm9yIFdlYnBhY2svQnJvd3NlcmlmeQogICk7CgogIHZhciB3YXJuTm9uUHJlc2VudCA9IGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgewogICAgd2FybigKICAgICAgIlByb3BlcnR5IG9yIG1ldGhvZCBcIiIgKyBrZXkgKyAiXCIgaXMgbm90IGRlZmluZWQgb24gdGhlIGluc3RhbmNlIGJ1dCAiICsKICAgICAgJ3JlZmVyZW5jZWQgZHVyaW5nIHJlbmRlci4gTWFrZSBzdXJlIHRoYXQgdGhpcyBwcm9wZXJ0eSBpcyByZWFjdGl2ZSwgJyArCiAgICAgICdlaXRoZXIgaW4gdGhlIGRhdGEgb3B0aW9uLCBvciBmb3IgY2xhc3MtYmFzZWQgY29tcG9uZW50cywgYnkgJyArCiAgICAgICdpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5LiAnICsKICAgICAgJ1NlZTogaHR0cHM6Ly92dWVqcy5vcmcvdjIvZ3VpZGUvcmVhY3Rpdml0eS5odG1sI0RlY2xhcmluZy1SZWFjdGl2ZS1Qcm9wZXJ0aWVzLicsCiAgICAgIHRhcmdldAogICAgKTsKICB9OwoKICB2YXIgaGFzUHJveHkgPQogICAgdHlwZW9mIFByb3h5ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShQcm94eSk7CgogIGlmIChoYXNQcm94eSkgewogICAgdmFyIGlzQnVpbHRJbk1vZGlmaWVyID0gbWFrZU1hcCgnc3RvcCxwcmV2ZW50LHNlbGYsY3RybCxzaGlmdCxhbHQsbWV0YSxleGFjdCcpOwogICAgY29uZmlnLmtleUNvZGVzID0gbmV3IFByb3h5KGNvbmZpZy5rZXlDb2RlcywgewogICAgICBzZXQ6IGZ1bmN0aW9uIHNldCAodGFyZ2V0LCBrZXksIHZhbHVlKSB7CiAgICAgICAgaWYgKGlzQnVpbHRJbk1vZGlmaWVyKGtleSkpIHsKICAgICAgICAgIHdhcm4oKCJBdm9pZCBvdmVyd3JpdGluZyBidWlsdC1pbiBtb2RpZmllciBpbiBjb25maWcua2V5Q29kZXM6IC4iICsga2V5KSk7CiAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTsKICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9CgogIHZhciBoYXNIYW5kbGVyID0gewogICAgaGFzOiBmdW5jdGlvbiBoYXMgKHRhcmdldCwga2V5KSB7CiAgICAgIHZhciBoYXMgPSBrZXkgaW4gdGFyZ2V0OwogICAgICB2YXIgaXNBbGxvd2VkID0gYWxsb3dlZEdsb2JhbHMoa2V5KSB8fCBrZXkuY2hhckF0KDApID09PSAnXyc7CiAgICAgIGlmICghaGFzICYmICFpc0FsbG93ZWQpIHsKICAgICAgICB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGhhcyB8fCAhaXNBbGxvd2VkCiAgICB9CiAgfTsKCiAgdmFyIGdldEhhbmRsZXIgPSB7CiAgICBnZXQ6IGZ1bmN0aW9uIGdldCAodGFyZ2V0LCBrZXkpIHsKICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmICEoa2V5IGluIHRhcmdldCkpIHsKICAgICAgICB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRhcmdldFtrZXldCiAgICB9CiAgfTsKCiAgaW5pdFByb3h5ID0gZnVuY3Rpb24gaW5pdFByb3h5ICh2bSkgewogICAgaWYgKGhhc1Byb3h5KSB7CiAgICAgIC8vIGRldGVybWluZSB3aGljaCBwcm94eSBoYW5kbGVyIHRvIHVzZQogICAgICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zOwogICAgICB2YXIgaGFuZGxlcnMgPSBvcHRpb25zLnJlbmRlciAmJiBvcHRpb25zLnJlbmRlci5fd2l0aFN0cmlwcGVkCiAgICAgICAgPyBnZXRIYW5kbGVyCiAgICAgICAgOiBoYXNIYW5kbGVyOwogICAgICB2bS5fcmVuZGVyUHJveHkgPSBuZXcgUHJveHkodm0sIGhhbmRsZXJzKTsKICAgIH0gZWxzZSB7CiAgICAgIHZtLl9yZW5kZXJQcm94eSA9IHZtOwogICAgfQogIH07Cn0KCi8qICAqLwoKdmFyIHNlZW5PYmplY3RzID0gbmV3IF9TZXQoKTsKCi8qKgogKiBSZWN1cnNpdmVseSB0cmF2ZXJzZSBhbiBvYmplY3QgdG8gZXZva2UgYWxsIGNvbnZlcnRlZAogKiBnZXR0ZXJzLCBzbyB0aGF0IGV2ZXJ5IG5lc3RlZCBwcm9wZXJ0eSBpbnNpZGUgdGhlIG9iamVjdAogKiBpcyBjb2xsZWN0ZWQgYXMgYSAiZGVlcCIgZGVwZW5kZW5jeS4KICovCmZ1bmN0aW9uIHRyYXZlcnNlICh2YWwpIHsKICBfdHJhdmVyc2UodmFsLCBzZWVuT2JqZWN0cyk7CiAgc2Vlbk9iamVjdHMuY2xlYXIoKTsKfQoKZnVuY3Rpb24gX3RyYXZlcnNlICh2YWwsIHNlZW4pIHsKICB2YXIgaSwga2V5czsKICB2YXIgaXNBID0gQXJyYXkuaXNBcnJheSh2YWwpOwogIGlmICgoIWlzQSAmJiAhaXNPYmplY3QodmFsKSkgfHwgT2JqZWN0LmlzRnJvemVuKHZhbCkgfHwgdmFsIGluc3RhbmNlb2YgVk5vZGUpIHsKICAgIHJldHVybgogIH0KICBpZiAodmFsLl9fb2JfXykgewogICAgdmFyIGRlcElkID0gdmFsLl9fb2JfXy5kZXAuaWQ7CiAgICBpZiAoc2Vlbi5oYXMoZGVwSWQpKSB7CiAgICAgIHJldHVybgogICAgfQogICAgc2Vlbi5hZGQoZGVwSWQpOwogIH0KICBpZiAoaXNBKSB7CiAgICBpID0gdmFsLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsgX3RyYXZlcnNlKHZhbFtpXSwgc2Vlbik7IH0KICB9IGVsc2UgewogICAga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7CiAgICBpID0ga2V5cy5sZW5ndGg7CiAgICB3aGlsZSAoaS0tKSB7IF90cmF2ZXJzZSh2YWxba2V5c1tpXV0sIHNlZW4pOyB9CiAgfQp9CgovKiAgKi8KCnZhciBub3JtYWxpemVFdmVudCA9IGNhY2hlZChmdW5jdGlvbiAobmFtZSkgewogIHZhciBwYXNzaXZlID0gbmFtZS5jaGFyQXQoMCkgPT09ICcmJzsKICBuYW1lID0gcGFzc2l2ZSA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lOwogIHZhciBvbmNlJCQxID0gbmFtZS5jaGFyQXQoMCkgPT09ICd+JzsgLy8gUHJlZml4ZWQgbGFzdCwgY2hlY2tlZCBmaXJzdAogIG5hbWUgPSBvbmNlJCQxID8gbmFtZS5zbGljZSgxKSA6IG5hbWU7CiAgdmFyIGNhcHR1cmUgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJyEnOwogIG5hbWUgPSBjYXB0dXJlID8gbmFtZS5zbGljZSgxKSA6IG5hbWU7CiAgcmV0dXJuIHsKICAgIG5hbWU6IG5hbWUsCiAgICBvbmNlOiBvbmNlJCQxLAogICAgY2FwdHVyZTogY2FwdHVyZSwKICAgIHBhc3NpdmU6IHBhc3NpdmUKICB9Cn0pOwoKZnVuY3Rpb24gY3JlYXRlRm5JbnZva2VyIChmbnMpIHsKICBmdW5jdGlvbiBpbnZva2VyICgpIHsKICAgIHZhciBhcmd1bWVudHMkMSA9IGFyZ3VtZW50czsKCiAgICB2YXIgZm5zID0gaW52b2tlci5mbnM7CiAgICBpZiAoQXJyYXkuaXNBcnJheShmbnMpKSB7CiAgICAgIHZhciBjbG9uZWQgPSBmbnMuc2xpY2UoKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9uZWQubGVuZ3RoOyBpKyspIHsKICAgICAgICBjbG9uZWRbaV0uYXBwbHkobnVsbCwgYXJndW1lbnRzJDEpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyByZXR1cm4gaGFuZGxlciByZXR1cm4gdmFsdWUgZm9yIHNpbmdsZSBoYW5kbGVycwogICAgICByZXR1cm4gZm5zLmFwcGx5KG51bGwsIGFyZ3VtZW50cykKICAgIH0KICB9CiAgaW52b2tlci5mbnMgPSBmbnM7CiAgcmV0dXJuIGludm9rZXIKfQoKZnVuY3Rpb24gdXBkYXRlTGlzdGVuZXJzICgKICBvbiwKICBvbGRPbiwKICBhZGQsCiAgcmVtb3ZlJCQxLAogIHZtCikgewogIHZhciBuYW1lLCBkZWYsIGN1ciwgb2xkLCBldmVudDsKICBmb3IgKG5hbWUgaW4gb24pIHsKICAgIGRlZiA9IGN1ciA9IG9uW25hbWVdOwogICAgb2xkID0gb2xkT25bbmFtZV07CiAgICBldmVudCA9IG5vcm1hbGl6ZUV2ZW50KG5hbWUpOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoaXNVbmRlZihjdXIpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJJbnZhbGlkIGhhbmRsZXIgZm9yIGV2ZW50IFwiIiArIChldmVudC5uYW1lKSArICJcIjogZ290ICIgKyBTdHJpbmcoY3VyKSwKICAgICAgICB2bQogICAgICApOwogICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZCkpIHsKICAgICAgaWYgKGlzVW5kZWYoY3VyLmZucykpIHsKICAgICAgICBjdXIgPSBvbltuYW1lXSA9IGNyZWF0ZUZuSW52b2tlcihjdXIpOwogICAgICB9CiAgICAgIGFkZChldmVudC5uYW1lLCBjdXIsIGV2ZW50Lm9uY2UsIGV2ZW50LmNhcHR1cmUsIGV2ZW50LnBhc3NpdmUsIGV2ZW50LnBhcmFtcyk7CiAgICB9IGVsc2UgaWYgKGN1ciAhPT0gb2xkKSB7CiAgICAgIG9sZC5mbnMgPSBjdXI7CiAgICAgIG9uW25hbWVdID0gb2xkOwogICAgfQogIH0KICBmb3IgKG5hbWUgaW4gb2xkT24pIHsKICAgIGlmIChpc1VuZGVmKG9uW25hbWVdKSkgewogICAgICBldmVudCA9IG5vcm1hbGl6ZUV2ZW50KG5hbWUpOwogICAgICByZW1vdmUkJDEoZXZlbnQubmFtZSwgb2xkT25bbmFtZV0sIGV2ZW50LmNhcHR1cmUpOwogICAgfQogIH0KfQoKLyogICovCgpmdW5jdGlvbiBtZXJnZVZOb2RlSG9vayAoZGVmLCBob29rS2V5LCBob29rKSB7CiAgaWYgKGRlZiBpbnN0YW5jZW9mIFZOb2RlKSB7CiAgICBkZWYgPSBkZWYuZGF0YS5ob29rIHx8IChkZWYuZGF0YS5ob29rID0ge30pOwogIH0KICB2YXIgaW52b2tlcjsKICB2YXIgb2xkSG9vayA9IGRlZltob29rS2V5XTsKCiAgZnVuY3Rpb24gd3JhcHBlZEhvb2sgKCkgewogICAgaG9vay5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgLy8gaW1wb3J0YW50OiByZW1vdmUgbWVyZ2VkIGhvb2sgdG8gZW5zdXJlIGl0J3MgY2FsbGVkIG9ubHkgb25jZQogICAgLy8gYW5kIHByZXZlbnQgbWVtb3J5IGxlYWsKICAgIHJlbW92ZShpbnZva2VyLmZucywgd3JhcHBlZEhvb2spOwogIH0KCiAgaWYgKGlzVW5kZWYob2xkSG9vaykpIHsKICAgIC8vIG5vIGV4aXN0aW5nIGhvb2sKICAgIGludm9rZXIgPSBjcmVhdGVGbkludm9rZXIoW3dyYXBwZWRIb29rXSk7CiAgfSBlbHNlIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKGlzRGVmKG9sZEhvb2suZm5zKSAmJiBpc1RydWUob2xkSG9vay5tZXJnZWQpKSB7CiAgICAgIC8vIGFscmVhZHkgYSBtZXJnZWQgaW52b2tlcgogICAgICBpbnZva2VyID0gb2xkSG9vazsKICAgICAgaW52b2tlci5mbnMucHVzaCh3cmFwcGVkSG9vayk7CiAgICB9IGVsc2UgewogICAgICAvLyBleGlzdGluZyBwbGFpbiBob29rCiAgICAgIGludm9rZXIgPSBjcmVhdGVGbkludm9rZXIoW29sZEhvb2ssIHdyYXBwZWRIb29rXSk7CiAgICB9CiAgfQoKICBpbnZva2VyLm1lcmdlZCA9IHRydWU7CiAgZGVmW2hvb2tLZXldID0gaW52b2tlcjsKfQoKLyogICovCgpmdW5jdGlvbiBleHRyYWN0UHJvcHNGcm9tVk5vZGVEYXRhICgKICBkYXRhLAogIEN0b3IsCiAgdGFnCikgewogIC8vIHdlIGFyZSBvbmx5IGV4dHJhY3RpbmcgcmF3IHZhbHVlcyBoZXJlLgogIC8vIHZhbGlkYXRpb24gYW5kIGRlZmF1bHQgdmFsdWVzIGFyZSBoYW5kbGVkIGluIHRoZSBjaGlsZAogIC8vIGNvbXBvbmVudCBpdHNlbGYuCiAgdmFyIHByb3BPcHRpb25zID0gQ3Rvci5vcHRpb25zLnByb3BzOwogIGlmIChpc1VuZGVmKHByb3BPcHRpb25zKSkgewogICAgcmV0dXJuCiAgfQogIHZhciByZXMgPSB7fTsKICB2YXIgYXR0cnMgPSBkYXRhLmF0dHJzOwogIHZhciBwcm9wcyA9IGRhdGEucHJvcHM7CiAgaWYgKGlzRGVmKGF0dHJzKSB8fCBpc0RlZihwcm9wcykpIHsKICAgIGZvciAodmFyIGtleSBpbiBwcm9wT3B0aW9ucykgewogICAgICB2YXIgYWx0S2V5ID0gaHlwaGVuYXRlKGtleSk7CiAgICAgIHsKICAgICAgICB2YXIga2V5SW5Mb3dlckNhc2UgPSBrZXkudG9Mb3dlckNhc2UoKTsKICAgICAgICBpZiAoCiAgICAgICAgICBrZXkgIT09IGtleUluTG93ZXJDYXNlICYmCiAgICAgICAgICBhdHRycyAmJiBoYXNPd24oYXR0cnMsIGtleUluTG93ZXJDYXNlKQogICAgICAgICkgewogICAgICAgICAgdGlwKAogICAgICAgICAgICAiUHJvcCBcIiIgKyBrZXlJbkxvd2VyQ2FzZSArICJcIiBpcyBwYXNzZWQgdG8gY29tcG9uZW50ICIgKwogICAgICAgICAgICAoZm9ybWF0Q29tcG9uZW50TmFtZSh0YWcgfHwgQ3RvcikpICsgIiwgYnV0IHRoZSBkZWNsYXJlZCBwcm9wIG5hbWUgaXMiICsKICAgICAgICAgICAgIiBcIiIgKyBrZXkgKyAiXCIuICIgKwogICAgICAgICAgICAiTm90ZSB0aGF0IEhUTUwgYXR0cmlidXRlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgY2FtZWxDYXNlZCAiICsKICAgICAgICAgICAgInByb3BzIG5lZWQgdG8gdXNlIHRoZWlyIGtlYmFiLWNhc2UgZXF1aXZhbGVudHMgd2hlbiB1c2luZyBpbi1ET00gIiArCiAgICAgICAgICAgICJ0ZW1wbGF0ZXMuIFlvdSBzaG91bGQgcHJvYmFibHkgdXNlIFwiIiArIGFsdEtleSArICJcIiBpbnN0ZWFkIG9mIFwiIiArIGtleSArICJcIi4iCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfQogICAgICBjaGVja1Byb3AocmVzLCBwcm9wcywga2V5LCBhbHRLZXksIHRydWUpIHx8CiAgICAgIGNoZWNrUHJvcChyZXMsIGF0dHJzLCBrZXksIGFsdEtleSwgZmFsc2UpOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIGNoZWNrUHJvcCAoCiAgcmVzLAogIGhhc2gsCiAga2V5LAogIGFsdEtleSwKICBwcmVzZXJ2ZQopIHsKICBpZiAoaXNEZWYoaGFzaCkpIHsKICAgIGlmIChoYXNPd24oaGFzaCwga2V5KSkgewogICAgICByZXNba2V5XSA9IGhhc2hba2V5XTsKICAgICAgaWYgKCFwcmVzZXJ2ZSkgewogICAgICAgIGRlbGV0ZSBoYXNoW2tleV07CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWUKICAgIH0gZWxzZSBpZiAoaGFzT3duKGhhc2gsIGFsdEtleSkpIHsKICAgICAgcmVzW2tleV0gPSBoYXNoW2FsdEtleV07CiAgICAgIGlmICghcHJlc2VydmUpIHsKICAgICAgICBkZWxldGUgaGFzaFthbHRLZXldOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlCiAgICB9CiAgfQogIHJldHVybiBmYWxzZQp9CgovKiAgKi8KCi8vIFRoZSB0ZW1wbGF0ZSBjb21waWxlciBhdHRlbXB0cyB0byBtaW5pbWl6ZSB0aGUgbmVlZCBmb3Igbm9ybWFsaXphdGlvbiBieQovLyBzdGF0aWNhbGx5IGFuYWx5emluZyB0aGUgdGVtcGxhdGUgYXQgY29tcGlsZSB0aW1lLgovLwovLyBGb3IgcGxhaW4gSFRNTCBtYXJrdXAsIG5vcm1hbGl6YXRpb24gY2FuIGJlIGNvbXBsZXRlbHkgc2tpcHBlZCBiZWNhdXNlIHRoZQovLyBnZW5lcmF0ZWQgcmVuZGVyIGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIEFycmF5PFZOb2RlPi4gVGhlcmUgYXJlCi8vIHR3byBjYXNlcyB3aGVyZSBleHRyYSBub3JtYWxpemF0aW9uIGlzIG5lZWRlZDoKCi8vIDEuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbXBvbmVudHMgLSBiZWNhdXNlIGEgZnVuY3Rpb25hbCBjb21wb25lbnQKLy8gbWF5IHJldHVybiBhbiBBcnJheSBpbnN0ZWFkIG9mIGEgc2luZ2xlIHJvb3QuIEluIHRoaXMgY2FzZSwganVzdCBhIHNpbXBsZQovLyBub3JtYWxpemF0aW9uIGlzIG5lZWRlZCAtIGlmIGFueSBjaGlsZCBpcyBhbiBBcnJheSwgd2UgZmxhdHRlbiB0aGUgd2hvbGUKLy8gdGhpbmcgd2l0aCBBcnJheS5wcm90b3R5cGUuY29uY2F0LiBJdCBpcyBndWFyYW50ZWVkIHRvIGJlIG9ubHkgMS1sZXZlbCBkZWVwCi8vIGJlY2F1c2UgZnVuY3Rpb25hbCBjb21wb25lbnRzIGFscmVhZHkgbm9ybWFsaXplIHRoZWlyIG93biBjaGlsZHJlbi4KZnVuY3Rpb24gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4gKGNoaWxkcmVuKSB7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW5baV0pKSB7CiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBjaGlsZHJlbikKICAgIH0KICB9CiAgcmV0dXJuIGNoaWxkcmVuCn0KCi8vIDIuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbnN0cnVjdHMgdGhhdCBhbHdheXMgZ2VuZXJhdGVkIG5lc3RlZCBBcnJheXMsCi8vIGUuZy4gPHRlbXBsYXRlPiwgPHNsb3Q+LCB2LWZvciwgb3Igd2hlbiB0aGUgY2hpbGRyZW4gaXMgcHJvdmlkZWQgYnkgdXNlcgovLyB3aXRoIGhhbmQtd3JpdHRlbiByZW5kZXIgZnVuY3Rpb25zIC8gSlNYLiBJbiBzdWNoIGNhc2VzIGEgZnVsbCBub3JtYWxpemF0aW9uCi8vIGlzIG5lZWRlZCB0byBjYXRlciB0byBhbGwgcG9zc2libGUgdHlwZXMgb2YgY2hpbGRyZW4gdmFsdWVzLgpmdW5jdGlvbiBub3JtYWxpemVDaGlsZHJlbiAoY2hpbGRyZW4pIHsKICByZXR1cm4gaXNQcmltaXRpdmUoY2hpbGRyZW4pCiAgICA/IFtjcmVhdGVUZXh0Vk5vZGUoY2hpbGRyZW4pXQogICAgOiBBcnJheS5pc0FycmF5KGNoaWxkcmVuKQogICAgICA/IG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4oY2hpbGRyZW4pCiAgICAgIDogdW5kZWZpbmVkCn0KCmZ1bmN0aW9uIGlzVGV4dE5vZGUgKG5vZGUpIHsKICByZXR1cm4gaXNEZWYobm9kZSkgJiYgaXNEZWYobm9kZS50ZXh0KSAmJiBpc0ZhbHNlKG5vZGUuaXNDb21tZW50KQp9CgpmdW5jdGlvbiBub3JtYWxpemVBcnJheUNoaWxkcmVuIChjaGlsZHJlbiwgbmVzdGVkSW5kZXgpIHsKICB2YXIgcmVzID0gW107CiAgdmFyIGksIGMsIGxhc3RJbmRleCwgbGFzdDsKICBmb3IgKGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgIGMgPSBjaGlsZHJlbltpXTsKICAgIGlmIChpc1VuZGVmKGMpIHx8IHR5cGVvZiBjID09PSAnYm9vbGVhbicpIHsgY29udGludWUgfQogICAgbGFzdEluZGV4ID0gcmVzLmxlbmd0aCAtIDE7CiAgICBsYXN0ID0gcmVzW2xhc3RJbmRleF07CiAgICAvLyAgbmVzdGVkCiAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkgewogICAgICBpZiAoYy5sZW5ndGggPiAwKSB7CiAgICAgICAgYyA9IG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4oYywgKChuZXN0ZWRJbmRleCB8fCAnJykgKyAiXyIgKyBpKSk7CiAgICAgICAgLy8gbWVyZ2UgYWRqYWNlbnQgdGV4dCBub2RlcwogICAgICAgIGlmIChpc1RleHROb2RlKGNbMF0pICYmIGlzVGV4dE5vZGUobGFzdCkpIHsKICAgICAgICAgIHJlc1tsYXN0SW5kZXhdID0gY3JlYXRlVGV4dFZOb2RlKGxhc3QudGV4dCArIChjWzBdKS50ZXh0KTsKICAgICAgICAgIGMuc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgcmVzLnB1c2guYXBwbHkocmVzLCBjKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZShjKSkgewogICAgICBpZiAoaXNUZXh0Tm9kZShsYXN0KSkgewogICAgICAgIC8vIG1lcmdlIGFkamFjZW50IHRleHQgbm9kZXMKICAgICAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgU1NSIGh5ZHJhdGlvbiBiZWNhdXNlIHRleHQgbm9kZXMgYXJlCiAgICAgICAgLy8gZXNzZW50aWFsbHkgbWVyZ2VkIHdoZW4gcmVuZGVyZWQgdG8gSFRNTCBzdHJpbmdzCiAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYyk7CiAgICAgIH0gZWxzZSBpZiAoYyAhPT0gJycpIHsKICAgICAgICAvLyBjb252ZXJ0IHByaW1pdGl2ZSB0byB2bm9kZQogICAgICAgIHJlcy5wdXNoKGNyZWF0ZVRleHRWTm9kZShjKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChpc1RleHROb2RlKGMpICYmIGlzVGV4dE5vZGUobGFzdCkpIHsKICAgICAgICAvLyBtZXJnZSBhZGphY2VudCB0ZXh0IG5vZGVzCiAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYy50ZXh0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBkZWZhdWx0IGtleSBmb3IgbmVzdGVkIGFycmF5IGNoaWxkcmVuIChsaWtlbHkgZ2VuZXJhdGVkIGJ5IHYtZm9yKQogICAgICAgIGlmIChpc1RydWUoY2hpbGRyZW4uX2lzVkxpc3QpICYmCiAgICAgICAgICBpc0RlZihjLnRhZykgJiYKICAgICAgICAgIGlzVW5kZWYoYy5rZXkpICYmCiAgICAgICAgICBpc0RlZihuZXN0ZWRJbmRleCkpIHsKICAgICAgICAgIGMua2V5ID0gIl9fdmxpc3QiICsgbmVzdGVkSW5kZXggKyAiXyIgKyBpICsgIl9fIjsKICAgICAgICB9CiAgICAgICAgcmVzLnB1c2goYyk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCmZ1bmN0aW9uIGVuc3VyZUN0b3IgKGNvbXAsIGJhc2UpIHsKICBpZiAoCiAgICBjb21wLl9fZXNNb2R1bGUgfHwKICAgIChoYXNTeW1ib2wgJiYgY29tcFtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnTW9kdWxlJykKICApIHsKICAgIGNvbXAgPSBjb21wLmRlZmF1bHQ7CiAgfQogIHJldHVybiBpc09iamVjdChjb21wKQogICAgPyBiYXNlLmV4dGVuZChjb21wKQogICAgOiBjb21wCn0KCmZ1bmN0aW9uIGNyZWF0ZUFzeW5jUGxhY2Vob2xkZXIgKAogIGZhY3RvcnksCiAgZGF0YSwKICBjb250ZXh0LAogIGNoaWxkcmVuLAogIHRhZwopIHsKICB2YXIgbm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTsKICBub2RlLmFzeW5jRmFjdG9yeSA9IGZhY3Rvcnk7CiAgbm9kZS5hc3luY01ldGEgPSB7IGRhdGE6IGRhdGEsIGNvbnRleHQ6IGNvbnRleHQsIGNoaWxkcmVuOiBjaGlsZHJlbiwgdGFnOiB0YWcgfTsKICByZXR1cm4gbm9kZQp9CgpmdW5jdGlvbiByZXNvbHZlQXN5bmNDb21wb25lbnQgKAogIGZhY3RvcnksCiAgYmFzZUN0b3IsCiAgY29udGV4dAopIHsKICBpZiAoaXNUcnVlKGZhY3RvcnkuZXJyb3IpICYmIGlzRGVmKGZhY3RvcnkuZXJyb3JDb21wKSkgewogICAgcmV0dXJuIGZhY3RvcnkuZXJyb3JDb21wCiAgfQoKICBpZiAoaXNEZWYoZmFjdG9yeS5yZXNvbHZlZCkpIHsKICAgIHJldHVybiBmYWN0b3J5LnJlc29sdmVkCiAgfQoKICBpZiAoaXNUcnVlKGZhY3RvcnkubG9hZGluZykgJiYgaXNEZWYoZmFjdG9yeS5sb2FkaW5nQ29tcCkpIHsKICAgIHJldHVybiBmYWN0b3J5LmxvYWRpbmdDb21wCiAgfQoKICBpZiAoaXNEZWYoZmFjdG9yeS5jb250ZXh0cykpIHsKICAgIC8vIGFscmVhZHkgcGVuZGluZwogICAgZmFjdG9yeS5jb250ZXh0cy5wdXNoKGNvbnRleHQpOwogIH0gZWxzZSB7CiAgICB2YXIgY29udGV4dHMgPSBmYWN0b3J5LmNvbnRleHRzID0gW2NvbnRleHRdOwogICAgdmFyIHN5bmMgPSB0cnVlOwoKICAgIHZhciBmb3JjZVJlbmRlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjb250ZXh0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICBjb250ZXh0c1tpXS4kZm9yY2VVcGRhdGUoKTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgcmVzb2x2ZSA9IG9uY2UoZnVuY3Rpb24gKHJlcykgewogICAgICAvLyBjYWNoZSByZXNvbHZlZAogICAgICBmYWN0b3J5LnJlc29sdmVkID0gZW5zdXJlQ3RvcihyZXMsIGJhc2VDdG9yKTsKICAgICAgLy8gaW52b2tlIGNhbGxiYWNrcyBvbmx5IGlmIHRoaXMgaXMgbm90IGEgc3luY2hyb25vdXMgcmVzb2x2ZQogICAgICAvLyAoYXN5bmMgcmVzb2x2ZXMgYXJlIHNoaW1tZWQgYXMgc3luY2hyb25vdXMgZHVyaW5nIFNTUikKICAgICAgaWYgKCFzeW5jKSB7CiAgICAgICAgZm9yY2VSZW5kZXIoKTsKICAgICAgfQogICAgfSk7CgogICAgdmFyIHJlamVjdCA9IG9uY2UoZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgICAiRmFpbGVkIHRvIHJlc29sdmUgYXN5bmMgY29tcG9uZW50OiAiICsgKFN0cmluZyhmYWN0b3J5KSkgKwogICAgICAgIChyZWFzb24gPyAoIlxuUmVhc29uOiAiICsgcmVhc29uKSA6ICcnKQogICAgICApOwogICAgICBpZiAoaXNEZWYoZmFjdG9yeS5lcnJvckNvbXApKSB7CiAgICAgICAgZmFjdG9yeS5lcnJvciA9IHRydWU7CiAgICAgICAgZm9yY2VSZW5kZXIoKTsKICAgICAgfQogICAgfSk7CgogICAgdmFyIHJlcyA9IGZhY3RvcnkocmVzb2x2ZSwgcmVqZWN0KTsKCiAgICBpZiAoaXNPYmplY3QocmVzKSkgewogICAgICBpZiAodHlwZW9mIHJlcy50aGVuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgLy8gKCkgPT4gUHJvbWlzZQogICAgICAgIGlmIChpc1VuZGVmKGZhY3RvcnkucmVzb2x2ZWQpKSB7CiAgICAgICAgICByZXMudGhlbihyZXNvbHZlLCByZWplY3QpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChpc0RlZihyZXMuY29tcG9uZW50KSAmJiB0eXBlb2YgcmVzLmNvbXBvbmVudC50aGVuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmVzLmNvbXBvbmVudC50aGVuKHJlc29sdmUsIHJlamVjdCk7CgogICAgICAgIGlmIChpc0RlZihyZXMuZXJyb3IpKSB7CiAgICAgICAgICBmYWN0b3J5LmVycm9yQ29tcCA9IGVuc3VyZUN0b3IocmVzLmVycm9yLCBiYXNlQ3Rvcik7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNEZWYocmVzLmxvYWRpbmcpKSB7CiAgICAgICAgICBmYWN0b3J5LmxvYWRpbmdDb21wID0gZW5zdXJlQ3RvcihyZXMubG9hZGluZywgYmFzZUN0b3IpOwogICAgICAgICAgaWYgKHJlcy5kZWxheSA9PT0gMCkgewogICAgICAgICAgICBmYWN0b3J5LmxvYWRpbmcgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgaWYgKGlzVW5kZWYoZmFjdG9yeS5yZXNvbHZlZCkgJiYgaXNVbmRlZihmYWN0b3J5LmVycm9yKSkgewogICAgICAgICAgICAgICAgZmFjdG9yeS5sb2FkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGZvcmNlUmVuZGVyKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCByZXMuZGVsYXkgfHwgMjAwKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChpc0RlZihyZXMudGltZW91dCkpIHsKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoaXNVbmRlZihmYWN0b3J5LnJlc29sdmVkKSkgewogICAgICAgICAgICAgIHJlamVjdCgKICAgICAgICAgICAgICAgICJ0aW1lb3V0ICgiICsgKHJlcy50aW1lb3V0KSArICJtcykiCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgcmVzLnRpbWVvdXQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHN5bmMgPSBmYWxzZTsKICAgIC8vIHJldHVybiBpbiBjYXNlIHJlc29sdmVkIHN5bmNocm9ub3VzbHkKICAgIHJldHVybiBmYWN0b3J5LmxvYWRpbmcKICAgICAgPyBmYWN0b3J5LmxvYWRpbmdDb21wCiAgICAgIDogZmFjdG9yeS5yZXNvbHZlZAogIH0KfQoKLyogICovCgpmdW5jdGlvbiBpc0FzeW5jUGxhY2Vob2xkZXIgKG5vZGUpIHsKICByZXR1cm4gbm9kZS5pc0NvbW1lbnQgJiYgbm9kZS5hc3luY0ZhY3RvcnkKfQoKLyogICovCgpmdW5jdGlvbiBnZXRGaXJzdENvbXBvbmVudENoaWxkIChjaGlsZHJlbikgewogIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICB2YXIgYyA9IGNoaWxkcmVuW2ldOwogICAgICBpZiAoaXNEZWYoYykgJiYgKGlzRGVmKGMuY29tcG9uZW50T3B0aW9ucykgfHwgaXNBc3luY1BsYWNlaG9sZGVyKGMpKSkgewogICAgICAgIHJldHVybiBjCiAgICAgIH0KICAgIH0KICB9Cn0KCi8qICAqLwoKLyogICovCgpmdW5jdGlvbiBpbml0RXZlbnRzICh2bSkgewogIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIHZtLl9oYXNIb29rRXZlbnQgPSBmYWxzZTsKICAvLyBpbml0IHBhcmVudCBhdHRhY2hlZCBldmVudHMKICB2YXIgbGlzdGVuZXJzID0gdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVyczsKICBpZiAobGlzdGVuZXJzKSB7CiAgICB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnModm0sIGxpc3RlbmVycyk7CiAgfQp9Cgp2YXIgdGFyZ2V0OwoKZnVuY3Rpb24gYWRkIChldmVudCwgZm4sIG9uY2UpIHsKICBpZiAob25jZSkgewogICAgdGFyZ2V0LiRvbmNlKGV2ZW50LCBmbik7CiAgfSBlbHNlIHsKICAgIHRhcmdldC4kb24oZXZlbnQsIGZuKTsKICB9Cn0KCmZ1bmN0aW9uIHJlbW92ZSQxIChldmVudCwgZm4pIHsKICB0YXJnZXQuJG9mZihldmVudCwgZm4pOwp9CgpmdW5jdGlvbiB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnMgKAogIHZtLAogIGxpc3RlbmVycywKICBvbGRMaXN0ZW5lcnMKKSB7CiAgdGFyZ2V0ID0gdm07CiAgdXBkYXRlTGlzdGVuZXJzKGxpc3RlbmVycywgb2xkTGlzdGVuZXJzIHx8IHt9LCBhZGQsIHJlbW92ZSQxLCB2bSk7CiAgdGFyZ2V0ID0gdW5kZWZpbmVkOwp9CgpmdW5jdGlvbiBldmVudHNNaXhpbiAoVnVlKSB7CiAgdmFyIGhvb2tSRSA9IC9eaG9vazovOwogIFZ1ZS5wcm90b3R5cGUuJG9uID0gZnVuY3Rpb24gKGV2ZW50LCBmbikgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIHZtID0gdGhpczsKICAgIGlmIChBcnJheS5pc0FycmF5KGV2ZW50KSkgewogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGV2ZW50Lmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgIHRoaXMkMS4kb24oZXZlbnRbaV0sIGZuKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgKHZtLl9ldmVudHNbZXZlbnRdIHx8ICh2bS5fZXZlbnRzW2V2ZW50XSA9IFtdKSkucHVzaChmbik7CiAgICAgIC8vIG9wdGltaXplIGhvb2s6ZXZlbnQgY29zdCBieSB1c2luZyBhIGJvb2xlYW4gZmxhZyBtYXJrZWQgYXQgcmVnaXN0cmF0aW9uCiAgICAgIC8vIGluc3RlYWQgb2YgYSBoYXNoIGxvb2t1cAogICAgICBpZiAoaG9va1JFLnRlc3QoZXZlbnQpKSB7CiAgICAgICAgdm0uX2hhc0hvb2tFdmVudCA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2bQogIH07CgogIFZ1ZS5wcm90b3R5cGUuJG9uY2UgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgZnVuY3Rpb24gb24gKCkgewogICAgICB2bS4kb2ZmKGV2ZW50LCBvbik7CiAgICAgIGZuLmFwcGx5KHZtLCBhcmd1bWVudHMpOwogICAgfQogICAgb24uZm4gPSBmbjsKICAgIHZtLiRvbihldmVudCwgb24pOwogICAgcmV0dXJuIHZtCiAgfTsKCiAgVnVlLnByb3RvdHlwZS4kb2ZmID0gZnVuY3Rpb24gKGV2ZW50LCBmbikgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIHZtID0gdGhpczsKICAgIC8vIGFsbAogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICByZXR1cm4gdm0KICAgIH0KICAgIC8vIGFycmF5IG9mIGV2ZW50cwogICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnQpKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gZXZlbnQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgdGhpcyQxLiRvZmYoZXZlbnRbaV0sIGZuKTsKICAgICAgfQogICAgICByZXR1cm4gdm0KICAgIH0KICAgIC8vIHNwZWNpZmljIGV2ZW50CiAgICB2YXIgY2JzID0gdm0uX2V2ZW50c1tldmVudF07CiAgICBpZiAoIWNicykgewogICAgICByZXR1cm4gdm0KICAgIH0KICAgIGlmICghZm4pIHsKICAgICAgdm0uX2V2ZW50c1tldmVudF0gPSBudWxsOwogICAgICByZXR1cm4gdm0KICAgIH0KICAgIGlmIChmbikgewogICAgICAvLyBzcGVjaWZpYyBoYW5kbGVyCiAgICAgIHZhciBjYjsKICAgICAgdmFyIGkkMSA9IGNicy5sZW5ndGg7CiAgICAgIHdoaWxlIChpJDEtLSkgewogICAgICAgIGNiID0gY2JzW2kkMV07CiAgICAgICAgaWYgKGNiID09PSBmbiB8fCBjYi5mbiA9PT0gZm4pIHsKICAgICAgICAgIGNicy5zcGxpY2UoaSQxLCAxKTsKICAgICAgICAgIGJyZWFrCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdm0KICB9OwoKICBWdWUucHJvdG90eXBlLiRlbWl0ID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgewogICAgICB2YXIgbG93ZXJDYXNlRXZlbnQgPSBldmVudC50b0xvd2VyQ2FzZSgpOwogICAgICBpZiAobG93ZXJDYXNlRXZlbnQgIT09IGV2ZW50ICYmIHZtLl9ldmVudHNbbG93ZXJDYXNlRXZlbnRdKSB7CiAgICAgICAgdGlwKAogICAgICAgICAgIkV2ZW50IFwiIiArIGxvd2VyQ2FzZUV2ZW50ICsgIlwiIGlzIGVtaXR0ZWQgaW4gY29tcG9uZW50ICIgKwogICAgICAgICAgKGZvcm1hdENvbXBvbmVudE5hbWUodm0pKSArICIgYnV0IHRoZSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgZm9yIFwiIiArIGV2ZW50ICsgIlwiLiAiICsKICAgICAgICAgICJOb3RlIHRoYXQgSFRNTCBhdHRyaWJ1dGVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCB5b3UgY2Fubm90IHVzZSAiICsKICAgICAgICAgICJ2LW9uIHRvIGxpc3RlbiB0byBjYW1lbENhc2UgZXZlbnRzIHdoZW4gdXNpbmcgaW4tRE9NIHRlbXBsYXRlcy4gIiArCiAgICAgICAgICAiWW91IHNob3VsZCBwcm9iYWJseSB1c2UgXCIiICsgKGh5cGhlbmF0ZShldmVudCkpICsgIlwiIGluc3RlYWQgb2YgXCIiICsgZXZlbnQgKyAiXCIuIgogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIHZhciBjYnMgPSB2bS5fZXZlbnRzW2V2ZW50XTsKICAgIGlmIChjYnMpIHsKICAgICAgY2JzID0gY2JzLmxlbmd0aCA+IDEgPyB0b0FycmF5KGNicykgOiBjYnM7CiAgICAgIHZhciBhcmdzID0gdG9BcnJheShhcmd1bWVudHMsIDEpOwogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNicy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICB0cnkgewogICAgICAgICAgY2JzW2ldLmFwcGx5KHZtLCBhcmdzKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBoYW5kbGVFcnJvcihlLCB2bSwgKCJldmVudCBoYW5kbGVyIGZvciBcIiIgKyBldmVudCArICJcIiIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2bQogIH07Cn0KCi8qICAqLwoKCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyByYXcgY2hpbGRyZW4gVk5vZGVzIGludG8gYSBzbG90IG9iamVjdC4KICovCmZ1bmN0aW9uIHJlc29sdmVTbG90cyAoCiAgY2hpbGRyZW4sCiAgY29udGV4dAopIHsKICB2YXIgc2xvdHMgPSB7fTsKICBpZiAoIWNoaWxkcmVuKSB7CiAgICByZXR1cm4gc2xvdHMKICB9CiAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgdmFyIGRhdGEgPSBjaGlsZC5kYXRhOwogICAgLy8gcmVtb3ZlIHNsb3QgYXR0cmlidXRlIGlmIHRoZSBub2RlIGlzIHJlc29sdmVkIGFzIGEgVnVlIHNsb3Qgbm9kZQogICAgaWYgKGRhdGEgJiYgZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnNsb3QpIHsKICAgICAgZGVsZXRlIGRhdGEuYXR0cnMuc2xvdDsKICAgIH0KICAgIC8vIG5hbWVkIHNsb3RzIHNob3VsZCBvbmx5IGJlIHJlc3BlY3RlZCBpZiB0aGUgdm5vZGUgd2FzIHJlbmRlcmVkIGluIHRoZQogICAgLy8gc2FtZSBjb250ZXh0LgogICAgaWYgKChjaGlsZC5jb250ZXh0ID09PSBjb250ZXh0IHx8IGNoaWxkLmZuQ29udGV4dCA9PT0gY29udGV4dCkgJiYKICAgICAgZGF0YSAmJiBkYXRhLnNsb3QgIT0gbnVsbAogICAgKSB7CiAgICAgIHZhciBuYW1lID0gZGF0YS5zbG90OwogICAgICB2YXIgc2xvdCA9IChzbG90c1tuYW1lXSB8fCAoc2xvdHNbbmFtZV0gPSBbXSkpOwogICAgICBpZiAoY2hpbGQudGFnID09PSAndGVtcGxhdGUnKSB7CiAgICAgICAgc2xvdC5wdXNoLmFwcGx5KHNsb3QsIGNoaWxkLmNoaWxkcmVuIHx8IFtdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzbG90LnB1c2goY2hpbGQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAoc2xvdHMuZGVmYXVsdCB8fCAoc2xvdHMuZGVmYXVsdCA9IFtdKSkucHVzaChjaGlsZCk7CiAgICB9CiAgfQogIC8vIGlnbm9yZSBzbG90cyB0aGF0IGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZQogIGZvciAodmFyIG5hbWUkMSBpbiBzbG90cykgewogICAgaWYgKHNsb3RzW25hbWUkMV0uZXZlcnkoaXNXaGl0ZXNwYWNlKSkgewogICAgICBkZWxldGUgc2xvdHNbbmFtZSQxXTsKICAgIH0KICB9CiAgcmV0dXJuIHNsb3RzCn0KCmZ1bmN0aW9uIGlzV2hpdGVzcGFjZSAobm9kZSkgewogIHJldHVybiAobm9kZS5pc0NvbW1lbnQgJiYgIW5vZGUuYXN5bmNGYWN0b3J5KSB8fCBub2RlLnRleHQgPT09ICcgJwp9CgpmdW5jdGlvbiByZXNvbHZlU2NvcGVkU2xvdHMgKAogIGZucywgLy8gc2VlIGZsb3cvdm5vZGUKICByZXMKKSB7CiAgcmVzID0gcmVzIHx8IHt9OwogIGZvciAodmFyIGkgPSAwOyBpIDwgZm5zLmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShmbnNbaV0pKSB7CiAgICAgIHJlc29sdmVTY29wZWRTbG90cyhmbnNbaV0sIHJlcyk7CiAgICB9IGVsc2UgewogICAgICByZXNbZm5zW2ldLmtleV0gPSBmbnNbaV0uZm47CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyogICovCgp2YXIgYWN0aXZlSW5zdGFuY2UgPSBudWxsOwp2YXIgaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50ID0gZmFsc2U7CgpmdW5jdGlvbiBpbml0TGlmZWN5Y2xlICh2bSkgewogIHZhciBvcHRpb25zID0gdm0uJG9wdGlvbnM7CgogIC8vIGxvY2F0ZSBmaXJzdCBub24tYWJzdHJhY3QgcGFyZW50CiAgdmFyIHBhcmVudCA9IG9wdGlvbnMucGFyZW50OwogIGlmIChwYXJlbnQgJiYgIW9wdGlvbnMuYWJzdHJhY3QpIHsKICAgIHdoaWxlIChwYXJlbnQuJG9wdGlvbnMuYWJzdHJhY3QgJiYgcGFyZW50LiRwYXJlbnQpIHsKICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7CiAgICB9CiAgICBwYXJlbnQuJGNoaWxkcmVuLnB1c2godm0pOwogIH0KCiAgdm0uJHBhcmVudCA9IHBhcmVudDsKICB2bS4kcm9vdCA9IHBhcmVudCA/IHBhcmVudC4kcm9vdCA6IHZtOwoKICB2bS4kY2hpbGRyZW4gPSBbXTsKICB2bS4kcmVmcyA9IHt9OwoKICB2bS5fd2F0Y2hlciA9IG51bGw7CiAgdm0uX2luYWN0aXZlID0gbnVsbDsKICB2bS5fZGlyZWN0SW5hY3RpdmUgPSBmYWxzZTsKICB2bS5faXNNb3VudGVkID0gZmFsc2U7CiAgdm0uX2lzRGVzdHJveWVkID0gZmFsc2U7CiAgdm0uX2lzQmVpbmdEZXN0cm95ZWQgPSBmYWxzZTsKfQoKZnVuY3Rpb24gbGlmZWN5Y2xlTWl4aW4gKFZ1ZSkgewogIFZ1ZS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uICh2bm9kZSwgaHlkcmF0aW5nKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgaWYgKHZtLl9pc01vdW50ZWQpIHsKICAgICAgY2FsbEhvb2sodm0sICdiZWZvcmVVcGRhdGUnKTsKICAgIH0KICAgIHZhciBwcmV2RWwgPSB2bS4kZWw7CiAgICB2YXIgcHJldlZub2RlID0gdm0uX3Zub2RlOwogICAgdmFyIHByZXZBY3RpdmVJbnN0YW5jZSA9IGFjdGl2ZUluc3RhbmNlOwogICAgYWN0aXZlSW5zdGFuY2UgPSB2bTsKICAgIHZtLl92bm9kZSA9IHZub2RlOwogICAgLy8gVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gaXMgaW5qZWN0ZWQgaW4gZW50cnkgcG9pbnRzCiAgICAvLyBiYXNlZCBvbiB0aGUgcmVuZGVyaW5nIGJhY2tlbmQgdXNlZC4KICAgIGlmICghcHJldlZub2RlKSB7CiAgICAgIC8vIGluaXRpYWwgcmVuZGVyCiAgICAgIHZtLiRlbCA9IHZtLl9fcGF0Y2hfXygKICAgICAgICB2bS4kZWwsIHZub2RlLCBoeWRyYXRpbmcsIGZhbHNlIC8qIHJlbW92ZU9ubHkgKi8sCiAgICAgICAgdm0uJG9wdGlvbnMuX3BhcmVudEVsbSwKICAgICAgICB2bS4kb3B0aW9ucy5fcmVmRWxtCiAgICAgICk7CiAgICAgIC8vIG5vIG5lZWQgZm9yIHRoZSByZWYgbm9kZXMgYWZ0ZXIgaW5pdGlhbCBwYXRjaAogICAgICAvLyB0aGlzIHByZXZlbnRzIGtlZXBpbmcgYSBkZXRhY2hlZCBET00gdHJlZSBpbiBtZW1vcnkgKCM1ODUxKQogICAgICB2bS4kb3B0aW9ucy5fcGFyZW50RWxtID0gdm0uJG9wdGlvbnMuX3JlZkVsbSA9IG51bGw7CiAgICB9IGVsc2UgewogICAgICAvLyB1cGRhdGVzCiAgICAgIHZtLiRlbCA9IHZtLl9fcGF0Y2hfXyhwcmV2Vm5vZGUsIHZub2RlKTsKICAgIH0KICAgIGFjdGl2ZUluc3RhbmNlID0gcHJldkFjdGl2ZUluc3RhbmNlOwogICAgLy8gdXBkYXRlIF9fdnVlX18gcmVmZXJlbmNlCiAgICBpZiAocHJldkVsKSB7CiAgICAgIHByZXZFbC5fX3Z1ZV9fID0gbnVsbDsKICAgIH0KICAgIGlmICh2bS4kZWwpIHsKICAgICAgdm0uJGVsLl9fdnVlX18gPSB2bTsKICAgIH0KICAgIC8vIGlmIHBhcmVudCBpcyBhbiBIT0MsIHVwZGF0ZSBpdHMgJGVsIGFzIHdlbGwKICAgIGlmICh2bS4kdm5vZGUgJiYgdm0uJHBhcmVudCAmJiB2bS4kdm5vZGUgPT09IHZtLiRwYXJlbnQuX3Zub2RlKSB7CiAgICAgIHZtLiRwYXJlbnQuJGVsID0gdm0uJGVsOwogICAgfQogICAgLy8gdXBkYXRlZCBob29rIGlzIGNhbGxlZCBieSB0aGUgc2NoZWR1bGVyIHRvIGVuc3VyZSB0aGF0IGNoaWxkcmVuIGFyZQogICAgLy8gdXBkYXRlZCBpbiBhIHBhcmVudCdzIHVwZGF0ZWQgaG9vay4KICB9OwoKICBWdWUucHJvdG90eXBlLiRmb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciB2bSA9IHRoaXM7CiAgICBpZiAodm0uX3dhdGNoZXIpIHsKICAgICAgdm0uX3dhdGNoZXIudXBkYXRlKCk7CiAgICB9CiAgfTsKCiAgVnVlLnByb3RvdHlwZS4kZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciB2bSA9IHRoaXM7CiAgICBpZiAodm0uX2lzQmVpbmdEZXN0cm95ZWQpIHsKICAgICAgcmV0dXJuCiAgICB9CiAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZURlc3Ryb3knKTsKICAgIHZtLl9pc0JlaW5nRGVzdHJveWVkID0gdHJ1ZTsKICAgIC8vIHJlbW92ZSBzZWxmIGZyb20gcGFyZW50CiAgICB2YXIgcGFyZW50ID0gdm0uJHBhcmVudDsKICAgIGlmIChwYXJlbnQgJiYgIXBhcmVudC5faXNCZWluZ0Rlc3Ryb3llZCAmJiAhdm0uJG9wdGlvbnMuYWJzdHJhY3QpIHsKICAgICAgcmVtb3ZlKHBhcmVudC4kY2hpbGRyZW4sIHZtKTsKICAgIH0KICAgIC8vIHRlYXJkb3duIHdhdGNoZXJzCiAgICBpZiAodm0uX3dhdGNoZXIpIHsKICAgICAgdm0uX3dhdGNoZXIudGVhcmRvd24oKTsKICAgIH0KICAgIHZhciBpID0gdm0uX3dhdGNoZXJzLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsKICAgICAgdm0uX3dhdGNoZXJzW2ldLnRlYXJkb3duKCk7CiAgICB9CiAgICAvLyByZW1vdmUgcmVmZXJlbmNlIGZyb20gZGF0YSBvYgogICAgLy8gZnJvemVuIG9iamVjdCBtYXkgbm90IGhhdmUgb2JzZXJ2ZXIuCiAgICBpZiAodm0uX2RhdGEuX19vYl9fKSB7CiAgICAgIHZtLl9kYXRhLl9fb2JfXy52bUNvdW50LS07CiAgICB9CiAgICAvLyBjYWxsIHRoZSBsYXN0IGhvb2suLi4KICAgIHZtLl9pc0Rlc3Ryb3llZCA9IHRydWU7CiAgICAvLyBpbnZva2UgZGVzdHJveSBob29rcyBvbiBjdXJyZW50IHJlbmRlcmVkIHRyZWUKICAgIHZtLl9fcGF0Y2hfXyh2bS5fdm5vZGUsIG51bGwpOwogICAgLy8gZmlyZSBkZXN0cm95ZWQgaG9vawogICAgY2FsbEhvb2sodm0sICdkZXN0cm95ZWQnKTsKICAgIC8vIHR1cm4gb2ZmIGFsbCBpbnN0YW5jZSBsaXN0ZW5lcnMuCiAgICB2bS4kb2ZmKCk7CiAgICAvLyByZW1vdmUgX192dWVfXyByZWZlcmVuY2UKICAgIGlmICh2bS4kZWwpIHsKICAgICAgdm0uJGVsLl9fdnVlX18gPSBudWxsOwogICAgfQogICAgLy8gcmVsZWFzZSBjaXJjdWxhciByZWZlcmVuY2UgKCM2NzU5KQogICAgaWYgKHZtLiR2bm9kZSkgewogICAgICB2bS4kdm5vZGUucGFyZW50ID0gbnVsbDsKICAgIH0KICB9Owp9CgpmdW5jdGlvbiBtb3VudENvbXBvbmVudCAoCiAgdm0sCiAgZWwsCiAgaHlkcmF0aW5nCikgewogIHZtLiRlbCA9IGVsOwogIGlmICghdm0uJG9wdGlvbnMucmVuZGVyKSB7CiAgICB2bS4kb3B0aW9ucy5yZW5kZXIgPSBjcmVhdGVFbXB0eVZOb2RlOwogICAgewogICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgaWYgKCh2bS4kb3B0aW9ucy50ZW1wbGF0ZSAmJiB2bS4kb3B0aW9ucy50ZW1wbGF0ZS5jaGFyQXQoMCkgIT09ICcjJykgfHwKICAgICAgICB2bS4kb3B0aW9ucy5lbCB8fCBlbCkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAnWW91IGFyZSB1c2luZyB0aGUgcnVudGltZS1vbmx5IGJ1aWxkIG9mIFZ1ZSB3aGVyZSB0aGUgdGVtcGxhdGUgJyArCiAgICAgICAgICAnY29tcGlsZXIgaXMgbm90IGF2YWlsYWJsZS4gRWl0aGVyIHByZS1jb21waWxlIHRoZSB0ZW1wbGF0ZXMgaW50byAnICsKICAgICAgICAgICdyZW5kZXIgZnVuY3Rpb25zLCBvciB1c2UgdGhlIGNvbXBpbGVyLWluY2x1ZGVkIGJ1aWxkLicsCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdGYWlsZWQgdG8gbW91bnQgY29tcG9uZW50OiB0ZW1wbGF0ZSBvciByZW5kZXIgZnVuY3Rpb24gbm90IGRlZmluZWQuJywKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgfQogIH0KICBjYWxsSG9vayh2bSwgJ2JlZm9yZU1vdW50Jyk7CgogIHZhciB1cGRhdGVDb21wb25lbnQ7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjb25maWcucGVyZm9ybWFuY2UgJiYgbWFyaykgewogICAgdXBkYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkgewogICAgICB2YXIgbmFtZSA9IHZtLl9uYW1lOwogICAgICB2YXIgaWQgPSB2bS5fdWlkOwogICAgICB2YXIgc3RhcnRUYWcgPSAidnVlLXBlcmYtc3RhcnQ6IiArIGlkOwogICAgICB2YXIgZW5kVGFnID0gInZ1ZS1wZXJmLWVuZDoiICsgaWQ7CgogICAgICBtYXJrKHN0YXJ0VGFnKTsKICAgICAgdmFyIHZub2RlID0gdm0uX3JlbmRlcigpOwogICAgICBtYXJrKGVuZFRhZyk7CiAgICAgIG1lYXN1cmUoKCJ2dWUgIiArIG5hbWUgKyAiIHJlbmRlciIpLCBzdGFydFRhZywgZW5kVGFnKTsKCiAgICAgIG1hcmsoc3RhcnRUYWcpOwogICAgICB2bS5fdXBkYXRlKHZub2RlLCBoeWRyYXRpbmcpOwogICAgICBtYXJrKGVuZFRhZyk7CiAgICAgIG1lYXN1cmUoKCJ2dWUgIiArIG5hbWUgKyAiIHBhdGNoIiksIHN0YXJ0VGFnLCBlbmRUYWcpOwogICAgfTsKICB9IGVsc2UgewogICAgdXBkYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkgewogICAgICB2bS5fdXBkYXRlKHZtLl9yZW5kZXIoKSwgaHlkcmF0aW5nKTsKICAgIH07CiAgfQoKICAvLyB3ZSBzZXQgdGhpcyB0byB2bS5fd2F0Y2hlciBpbnNpZGUgdGhlIHdhdGNoZXIncyBjb25zdHJ1Y3RvcgogIC8vIHNpbmNlIHRoZSB3YXRjaGVyJ3MgaW5pdGlhbCBwYXRjaCBtYXkgY2FsbCAkZm9yY2VVcGRhdGUgKGUuZy4gaW5zaWRlIGNoaWxkCiAgLy8gY29tcG9uZW50J3MgbW91bnRlZCBob29rKSwgd2hpY2ggcmVsaWVzIG9uIHZtLl93YXRjaGVyIGJlaW5nIGFscmVhZHkgZGVmaW5lZAogIG5ldyBXYXRjaGVyKHZtLCB1cGRhdGVDb21wb25lbnQsIG5vb3AsIG51bGwsIHRydWUgLyogaXNSZW5kZXJXYXRjaGVyICovKTsKICBoeWRyYXRpbmcgPSBmYWxzZTsKCiAgLy8gbWFudWFsbHkgbW91bnRlZCBpbnN0YW5jZSwgY2FsbCBtb3VudGVkIG9uIHNlbGYKICAvLyBtb3VudGVkIGlzIGNhbGxlZCBmb3IgcmVuZGVyLWNyZWF0ZWQgY2hpbGQgY29tcG9uZW50cyBpbiBpdHMgaW5zZXJ0ZWQgaG9vawogIGlmICh2bS4kdm5vZGUgPT0gbnVsbCkgewogICAgdm0uX2lzTW91bnRlZCA9IHRydWU7CiAgICBjYWxsSG9vayh2bSwgJ21vdW50ZWQnKTsKICB9CiAgcmV0dXJuIHZtCn0KCmZ1bmN0aW9uIHVwZGF0ZUNoaWxkQ29tcG9uZW50ICgKICB2bSwKICBwcm9wc0RhdGEsCiAgbGlzdGVuZXJzLAogIHBhcmVudFZub2RlLAogIHJlbmRlckNoaWxkcmVuCikgewogIHsKICAgIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IHRydWU7CiAgfQoKICAvLyBkZXRlcm1pbmUgd2hldGhlciBjb21wb25lbnQgaGFzIHNsb3QgY2hpbGRyZW4KICAvLyB3ZSBuZWVkIHRvIGRvIHRoaXMgYmVmb3JlIG92ZXJ3cml0aW5nICRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbgogIHZhciBoYXNDaGlsZHJlbiA9ICEhKAogICAgcmVuZGVyQ2hpbGRyZW4gfHwgICAgICAgICAgICAgICAvLyBoYXMgbmV3IHN0YXRpYyBzbG90cwogICAgdm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuIHx8ICAvLyBoYXMgb2xkIHN0YXRpYyBzbG90cwogICAgcGFyZW50Vm5vZGUuZGF0YS5zY29wZWRTbG90cyB8fCAvLyBoYXMgbmV3IHNjb3BlZCBzbG90cwogICAgdm0uJHNjb3BlZFNsb3RzICE9PSBlbXB0eU9iamVjdCAvLyBoYXMgb2xkIHNjb3BlZCBzbG90cwogICk7CgogIHZtLiRvcHRpb25zLl9wYXJlbnRWbm9kZSA9IHBhcmVudFZub2RlOwogIHZtLiR2bm9kZSA9IHBhcmVudFZub2RlOyAvLyB1cGRhdGUgdm0ncyBwbGFjZWhvbGRlciBub2RlIHdpdGhvdXQgcmUtcmVuZGVyCgogIGlmICh2bS5fdm5vZGUpIHsgLy8gdXBkYXRlIGNoaWxkIHRyZWUncyBwYXJlbnQKICAgIHZtLl92bm9kZS5wYXJlbnQgPSBwYXJlbnRWbm9kZTsKICB9CiAgdm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuID0gcmVuZGVyQ2hpbGRyZW47CgogIC8vIHVwZGF0ZSAkYXR0cnMgYW5kICRsaXN0ZW5lcnMgaGFzaAogIC8vIHRoZXNlIGFyZSBhbHNvIHJlYWN0aXZlIHNvIHRoZXkgbWF5IHRyaWdnZXIgY2hpbGQgdXBkYXRlIGlmIHRoZSBjaGlsZAogIC8vIHVzZWQgdGhlbSBkdXJpbmcgcmVuZGVyCiAgdm0uJGF0dHJzID0gcGFyZW50Vm5vZGUuZGF0YS5hdHRycyB8fCBlbXB0eU9iamVjdDsKICB2bS4kbGlzdGVuZXJzID0gbGlzdGVuZXJzIHx8IGVtcHR5T2JqZWN0OwoKICAvLyB1cGRhdGUgcHJvcHMKICBpZiAocHJvcHNEYXRhICYmIHZtLiRvcHRpb25zLnByb3BzKSB7CiAgICB0b2dnbGVPYnNlcnZpbmcoZmFsc2UpOwogICAgdmFyIHByb3BzID0gdm0uX3Byb3BzOwogICAgdmFyIHByb3BLZXlzID0gdm0uJG9wdGlvbnMuX3Byb3BLZXlzIHx8IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wS2V5cy5sZW5ndGg7IGkrKykgewogICAgICB2YXIga2V5ID0gcHJvcEtleXNbaV07CiAgICAgIHZhciBwcm9wT3B0aW9ucyA9IHZtLiRvcHRpb25zLnByb3BzOyAvLyB3dGYgZmxvdz8KICAgICAgcHJvcHNba2V5XSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BPcHRpb25zLCBwcm9wc0RhdGEsIHZtKTsKICAgIH0KICAgIHRvZ2dsZU9ic2VydmluZyh0cnVlKTsKICAgIC8vIGtlZXAgYSBjb3B5IG9mIHJhdyBwcm9wc0RhdGEKICAgIHZtLiRvcHRpb25zLnByb3BzRGF0YSA9IHByb3BzRGF0YTsKICB9CgogIC8vIHVwZGF0ZSBsaXN0ZW5lcnMKICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3Q7CiAgdmFyIG9sZExpc3RlbmVycyA9IHZtLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7CiAgdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycyA9IGxpc3RlbmVyczsKICB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnModm0sIGxpc3RlbmVycywgb2xkTGlzdGVuZXJzKTsKCiAgLy8gcmVzb2x2ZSBzbG90cyArIGZvcmNlIHVwZGF0ZSBpZiBoYXMgY2hpbGRyZW4KICBpZiAoaGFzQ2hpbGRyZW4pIHsKICAgIHZtLiRzbG90cyA9IHJlc29sdmVTbG90cyhyZW5kZXJDaGlsZHJlbiwgcGFyZW50Vm5vZGUuY29udGV4dCk7CiAgICB2bS4kZm9yY2VVcGRhdGUoKTsKICB9CgogIHsKICAgIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IGZhbHNlOwogIH0KfQoKZnVuY3Rpb24gaXNJbkluYWN0aXZlVHJlZSAodm0pIHsKICB3aGlsZSAodm0gJiYgKHZtID0gdm0uJHBhcmVudCkpIHsKICAgIGlmICh2bS5faW5hY3RpdmUpIHsgcmV0dXJuIHRydWUgfQogIH0KICByZXR1cm4gZmFsc2UKfQoKZnVuY3Rpb24gYWN0aXZhdGVDaGlsZENvbXBvbmVudCAodm0sIGRpcmVjdCkgewogIGlmIChkaXJlY3QpIHsKICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IGZhbHNlOwogICAgaWYgKGlzSW5JbmFjdGl2ZVRyZWUodm0pKSB7CiAgICAgIHJldHVybgogICAgfQogIH0gZWxzZSBpZiAodm0uX2RpcmVjdEluYWN0aXZlKSB7CiAgICByZXR1cm4KICB9CiAgaWYgKHZtLl9pbmFjdGl2ZSB8fCB2bS5faW5hY3RpdmUgPT09IG51bGwpIHsKICAgIHZtLl9pbmFjdGl2ZSA9IGZhbHNlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2bS4kY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudCh2bS4kY2hpbGRyZW5baV0pOwogICAgfQogICAgY2FsbEhvb2sodm0sICdhY3RpdmF0ZWQnKTsKICB9Cn0KCmZ1bmN0aW9uIGRlYWN0aXZhdGVDaGlsZENvbXBvbmVudCAodm0sIGRpcmVjdCkgewogIGlmIChkaXJlY3QpIHsKICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IHRydWU7CiAgICBpZiAoaXNJbkluYWN0aXZlVHJlZSh2bSkpIHsKICAgICAgcmV0dXJuCiAgICB9CiAgfQogIGlmICghdm0uX2luYWN0aXZlKSB7CiAgICB2bS5faW5hY3RpdmUgPSB0cnVlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2bS4kY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KHZtLiRjaGlsZHJlbltpXSk7CiAgICB9CiAgICBjYWxsSG9vayh2bSwgJ2RlYWN0aXZhdGVkJyk7CiAgfQp9CgpmdW5jdGlvbiBjYWxsSG9vayAodm0sIGhvb2spIHsKICAvLyAjNzU3MyBkaXNhYmxlIGRlcCBjb2xsZWN0aW9uIHdoZW4gaW52b2tpbmcgbGlmZWN5Y2xlIGhvb2tzCiAgcHVzaFRhcmdldCgpOwogIHZhciBoYW5kbGVycyA9IHZtLiRvcHRpb25zW2hvb2tdOwogIGlmIChoYW5kbGVycykgewogICAgZm9yICh2YXIgaSA9IDAsIGogPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBqOyBpKyspIHsKICAgICAgdHJ5IHsKICAgICAgICBoYW5kbGVyc1tpXS5jYWxsKHZtKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCAoaG9vayArICIgaG9vayIpKTsKICAgICAgfQogICAgfQogIH0KICBpZiAodm0uX2hhc0hvb2tFdmVudCkgewogICAgdm0uJGVtaXQoJ2hvb2s6JyArIGhvb2spOwogIH0KICBwb3BUYXJnZXQoKTsKfQoKLyogICovCgoKdmFyIE1BWF9VUERBVEVfQ09VTlQgPSAxMDA7Cgp2YXIgcXVldWUgPSBbXTsKdmFyIGFjdGl2YXRlZENoaWxkcmVuID0gW107CnZhciBoYXMgPSB7fTsKdmFyIGNpcmN1bGFyID0ge307CnZhciB3YWl0aW5nID0gZmFsc2U7CnZhciBmbHVzaGluZyA9IGZhbHNlOwp2YXIgaW5kZXggPSAwOwoKLyoqCiAqIFJlc2V0IHRoZSBzY2hlZHVsZXIncyBzdGF0ZS4KICovCmZ1bmN0aW9uIHJlc2V0U2NoZWR1bGVyU3RhdGUgKCkgewogIGluZGV4ID0gcXVldWUubGVuZ3RoID0gYWN0aXZhdGVkQ2hpbGRyZW4ubGVuZ3RoID0gMDsKICBoYXMgPSB7fTsKICB7CiAgICBjaXJjdWxhciA9IHt9OwogIH0KICB3YWl0aW5nID0gZmx1c2hpbmcgPSBmYWxzZTsKfQoKLyoqCiAqIEZsdXNoIGJvdGggcXVldWVzIGFuZCBydW4gdGhlIHdhdGNoZXJzLgogKi8KZnVuY3Rpb24gZmx1c2hTY2hlZHVsZXJRdWV1ZSAoKSB7CiAgZmx1c2hpbmcgPSB0cnVlOwogIHZhciB3YXRjaGVyLCBpZDsKCiAgLy8gU29ydCBxdWV1ZSBiZWZvcmUgZmx1c2guCiAgLy8gVGhpcyBlbnN1cmVzIHRoYXQ6CiAgLy8gMS4gQ29tcG9uZW50cyBhcmUgdXBkYXRlZCBmcm9tIHBhcmVudCB0byBjaGlsZC4gKGJlY2F1c2UgcGFyZW50IGlzIGFsd2F5cwogIC8vICAgIGNyZWF0ZWQgYmVmb3JlIHRoZSBjaGlsZCkKICAvLyAyLiBBIGNvbXBvbmVudCdzIHVzZXIgd2F0Y2hlcnMgYXJlIHJ1biBiZWZvcmUgaXRzIHJlbmRlciB3YXRjaGVyIChiZWNhdXNlCiAgLy8gICAgdXNlciB3YXRjaGVycyBhcmUgY3JlYXRlZCBiZWZvcmUgdGhlIHJlbmRlciB3YXRjaGVyKQogIC8vIDMuIElmIGEgY29tcG9uZW50IGlzIGRlc3Ryb3llZCBkdXJpbmcgYSBwYXJlbnQgY29tcG9uZW50J3Mgd2F0Y2hlciBydW4sCiAgLy8gICAgaXRzIHdhdGNoZXJzIGNhbiBiZSBza2lwcGVkLgogIHF1ZXVlLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEuaWQgLSBiLmlkOyB9KTsKCiAgLy8gZG8gbm90IGNhY2hlIGxlbmd0aCBiZWNhdXNlIG1vcmUgd2F0Y2hlcnMgbWlnaHQgYmUgcHVzaGVkCiAgLy8gYXMgd2UgcnVuIGV4aXN0aW5nIHdhdGNoZXJzCiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcXVldWUubGVuZ3RoOyBpbmRleCsrKSB7CiAgICB3YXRjaGVyID0gcXVldWVbaW5kZXhdOwogICAgaWQgPSB3YXRjaGVyLmlkOwogICAgaGFzW2lkXSA9IG51bGw7CiAgICB3YXRjaGVyLnJ1bigpOwogICAgLy8gaW4gZGV2IGJ1aWxkLCBjaGVjayBhbmQgc3RvcCBjaXJjdWxhciB1cGRhdGVzLgogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBoYXNbaWRdICE9IG51bGwpIHsKICAgICAgY2lyY3VsYXJbaWRdID0gKGNpcmN1bGFyW2lkXSB8fCAwKSArIDE7CiAgICAgIGlmIChjaXJjdWxhcltpZF0gPiBNQVhfVVBEQVRFX0NPVU5UKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdZb3UgbWF5IGhhdmUgYW4gaW5maW5pdGUgdXBkYXRlIGxvb3AgJyArICgKICAgICAgICAgICAgd2F0Y2hlci51c2VyCiAgICAgICAgICAgICAgPyAoImluIHdhdGNoZXIgd2l0aCBleHByZXNzaW9uIFwiIiArICh3YXRjaGVyLmV4cHJlc3Npb24pICsgIlwiIikKICAgICAgICAgICAgICA6ICJpbiBhIGNvbXBvbmVudCByZW5kZXIgZnVuY3Rpb24uIgogICAgICAgICAgKSwKICAgICAgICAgIHdhdGNoZXIudm0KICAgICAgICApOwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgIH0KICB9CgogIC8vIGtlZXAgY29waWVzIG9mIHBvc3QgcXVldWVzIGJlZm9yZSByZXNldHRpbmcgc3RhdGUKICB2YXIgYWN0aXZhdGVkUXVldWUgPSBhY3RpdmF0ZWRDaGlsZHJlbi5zbGljZSgpOwogIHZhciB1cGRhdGVkUXVldWUgPSBxdWV1ZS5zbGljZSgpOwoKICByZXNldFNjaGVkdWxlclN0YXRlKCk7CgogIC8vIGNhbGwgY29tcG9uZW50IHVwZGF0ZWQgYW5kIGFjdGl2YXRlZCBob29rcwogIGNhbGxBY3RpdmF0ZWRIb29rcyhhY3RpdmF0ZWRRdWV1ZSk7CiAgY2FsbFVwZGF0ZWRIb29rcyh1cGRhdGVkUXVldWUpOwoKICAvLyBkZXZ0b29sIGhvb2sKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoZGV2dG9vbHMgJiYgY29uZmlnLmRldnRvb2xzKSB7CiAgICBkZXZ0b29scy5lbWl0KCdmbHVzaCcpOwogIH0KfQoKZnVuY3Rpb24gY2FsbFVwZGF0ZWRIb29rcyAocXVldWUpIHsKICB2YXIgaSA9IHF1ZXVlLmxlbmd0aDsKICB3aGlsZSAoaS0tKSB7CiAgICB2YXIgd2F0Y2hlciA9IHF1ZXVlW2ldOwogICAgdmFyIHZtID0gd2F0Y2hlci52bTsKICAgIGlmICh2bS5fd2F0Y2hlciA9PT0gd2F0Y2hlciAmJiB2bS5faXNNb3VudGVkKSB7CiAgICAgIGNhbGxIb29rKHZtLCAndXBkYXRlZCcpOwogICAgfQogIH0KfQoKLyoqCiAqIFF1ZXVlIGEga2VwdC1hbGl2ZSBjb21wb25lbnQgdGhhdCB3YXMgYWN0aXZhdGVkIGR1cmluZyBwYXRjaC4KICogVGhlIHF1ZXVlIHdpbGwgYmUgcHJvY2Vzc2VkIGFmdGVyIHRoZSBlbnRpcmUgdHJlZSBoYXMgYmVlbiBwYXRjaGVkLgogKi8KZnVuY3Rpb24gcXVldWVBY3RpdmF0ZWRDb21wb25lbnQgKHZtKSB7CiAgLy8gc2V0dGluZyBfaW5hY3RpdmUgdG8gZmFsc2UgaGVyZSBzbyB0aGF0IGEgcmVuZGVyIGZ1bmN0aW9uIGNhbgogIC8vIHJlbHkgb24gY2hlY2tpbmcgd2hldGhlciBpdCdzIGluIGFuIGluYWN0aXZlIHRyZWUgKGUuZy4gcm91dGVyLXZpZXcpCiAgdm0uX2luYWN0aXZlID0gZmFsc2U7CiAgYWN0aXZhdGVkQ2hpbGRyZW4ucHVzaCh2bSk7Cn0KCmZ1bmN0aW9uIGNhbGxBY3RpdmF0ZWRIb29rcyAocXVldWUpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7CiAgICBxdWV1ZVtpXS5faW5hY3RpdmUgPSB0cnVlOwogICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudChxdWV1ZVtpXSwgdHJ1ZSAvKiB0cnVlICovKTsKICB9Cn0KCi8qKgogKiBQdXNoIGEgd2F0Y2hlciBpbnRvIHRoZSB3YXRjaGVyIHF1ZXVlLgogKiBKb2JzIHdpdGggZHVwbGljYXRlIElEcyB3aWxsIGJlIHNraXBwZWQgdW5sZXNzIGl0J3MKICogcHVzaGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGJlaW5nIGZsdXNoZWQuCiAqLwpmdW5jdGlvbiBxdWV1ZVdhdGNoZXIgKHdhdGNoZXIpIHsKICB2YXIgaWQgPSB3YXRjaGVyLmlkOwogIGlmIChoYXNbaWRdID09IG51bGwpIHsKICAgIGhhc1tpZF0gPSB0cnVlOwogICAgaWYgKCFmbHVzaGluZykgewogICAgICBxdWV1ZS5wdXNoKHdhdGNoZXIpOwogICAgfSBlbHNlIHsKICAgICAgLy8gaWYgYWxyZWFkeSBmbHVzaGluZywgc3BsaWNlIHRoZSB3YXRjaGVyIGJhc2VkIG9uIGl0cyBpZAogICAgICAvLyBpZiBhbHJlYWR5IHBhc3QgaXRzIGlkLCBpdCB3aWxsIGJlIHJ1biBuZXh0IGltbWVkaWF0ZWx5LgogICAgICB2YXIgaSA9IHF1ZXVlLmxlbmd0aCAtIDE7CiAgICAgIHdoaWxlIChpID4gaW5kZXggJiYgcXVldWVbaV0uaWQgPiB3YXRjaGVyLmlkKSB7CiAgICAgICAgaS0tOwogICAgICB9CiAgICAgIHF1ZXVlLnNwbGljZShpICsgMSwgMCwgd2F0Y2hlcik7CiAgICB9CiAgICAvLyBxdWV1ZSB0aGUgZmx1c2gKICAgIGlmICghd2FpdGluZykgewogICAgICB3YWl0aW5nID0gdHJ1ZTsKICAgICAgbmV4dFRpY2soZmx1c2hTY2hlZHVsZXJRdWV1ZSk7CiAgICB9CiAgfQp9CgovKiAgKi8KCnZhciB1aWQkMSA9IDA7CgovKioKICogQSB3YXRjaGVyIHBhcnNlcyBhbiBleHByZXNzaW9uLCBjb2xsZWN0cyBkZXBlbmRlbmNpZXMsCiAqIGFuZCBmaXJlcyBjYWxsYmFjayB3aGVuIHRoZSBleHByZXNzaW9uIHZhbHVlIGNoYW5nZXMuCiAqIFRoaXMgaXMgdXNlZCBmb3IgYm90aCB0aGUgJHdhdGNoKCkgYXBpIGFuZCBkaXJlY3RpdmVzLgogKi8KdmFyIFdhdGNoZXIgPSBmdW5jdGlvbiBXYXRjaGVyICgKICB2bSwKICBleHBPckZuLAogIGNiLAogIG9wdGlvbnMsCiAgaXNSZW5kZXJXYXRjaGVyCikgewogIHRoaXMudm0gPSB2bTsKICBpZiAoaXNSZW5kZXJXYXRjaGVyKSB7CiAgICB2bS5fd2F0Y2hlciA9IHRoaXM7CiAgfQogIHZtLl93YXRjaGVycy5wdXNoKHRoaXMpOwogIC8vIG9wdGlvbnMKICBpZiAob3B0aW9ucykgewogICAgdGhpcy5kZWVwID0gISFvcHRpb25zLmRlZXA7CiAgICB0aGlzLnVzZXIgPSAhIW9wdGlvbnMudXNlcjsKICAgIHRoaXMubGF6eSA9ICEhb3B0aW9ucy5sYXp5OwogICAgdGhpcy5zeW5jID0gISFvcHRpb25zLnN5bmM7CiAgfSBlbHNlIHsKICAgIHRoaXMuZGVlcCA9IHRoaXMudXNlciA9IHRoaXMubGF6eSA9IHRoaXMuc3luYyA9IGZhbHNlOwogIH0KICB0aGlzLmNiID0gY2I7CiAgdGhpcy5pZCA9ICsrdWlkJDE7IC8vIHVpZCBmb3IgYmF0Y2hpbmcKICB0aGlzLmFjdGl2ZSA9IHRydWU7CiAgdGhpcy5kaXJ0eSA9IHRoaXMubGF6eTsgLy8gZm9yIGxhenkgd2F0Y2hlcnMKICB0aGlzLmRlcHMgPSBbXTsKICB0aGlzLm5ld0RlcHMgPSBbXTsKICB0aGlzLmRlcElkcyA9IG5ldyBfU2V0KCk7CiAgdGhpcy5uZXdEZXBJZHMgPSBuZXcgX1NldCgpOwogIHRoaXMuZXhwcmVzc2lvbiA9IGV4cE9yRm4udG9TdHJpbmcoKTsKICAvLyBwYXJzZSBleHByZXNzaW9uIGZvciBnZXR0ZXIKICBpZiAodHlwZW9mIGV4cE9yRm4gPT09ICdmdW5jdGlvbicpIHsKICAgIHRoaXMuZ2V0dGVyID0gZXhwT3JGbjsKICB9IGVsc2UgewogICAgdGhpcy5nZXR0ZXIgPSBwYXJzZVBhdGgoZXhwT3JGbik7CiAgICBpZiAoIXRoaXMuZ2V0dGVyKSB7CiAgICAgIHRoaXMuZ2V0dGVyID0gZnVuY3Rpb24gKCkge307CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJGYWlsZWQgd2F0Y2hpbmcgcGF0aDogXCIiICsgZXhwT3JGbiArICJcIiAiICsKICAgICAgICAnV2F0Y2hlciBvbmx5IGFjY2VwdHMgc2ltcGxlIGRvdC1kZWxpbWl0ZWQgcGF0aHMuICcgKwogICAgICAgICdGb3IgZnVsbCBjb250cm9sLCB1c2UgYSBmdW5jdGlvbiBpbnN0ZWFkLicsCiAgICAgICAgdm0KICAgICAgKTsKICAgIH0KICB9CiAgdGhpcy52YWx1ZSA9IHRoaXMubGF6eQogICAgPyB1bmRlZmluZWQKICAgIDogdGhpcy5nZXQoKTsKfTsKCi8qKgogKiBFdmFsdWF0ZSB0aGUgZ2V0dGVyLCBhbmQgcmUtY29sbGVjdCBkZXBlbmRlbmNpZXMuCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKCkgewogIHB1c2hUYXJnZXQodGhpcyk7CiAgdmFyIHZhbHVlOwogIHZhciB2bSA9IHRoaXMudm07CiAgdHJ5IHsKICAgIHZhbHVlID0gdGhpcy5nZXR0ZXIuY2FsbCh2bSwgdm0pOwogIH0gY2F0Y2ggKGUpIHsKICAgIGlmICh0aGlzLnVzZXIpIHsKICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICgiZ2V0dGVyIGZvciB3YXRjaGVyIFwiIiArICh0aGlzLmV4cHJlc3Npb24pICsgIlwiIikpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgZQogICAgfQogIH0gZmluYWxseSB7CiAgICAvLyAidG91Y2giIGV2ZXJ5IHByb3BlcnR5IHNvIHRoZXkgYXJlIGFsbCB0cmFja2VkIGFzCiAgICAvLyBkZXBlbmRlbmNpZXMgZm9yIGRlZXAgd2F0Y2hpbmcKICAgIGlmICh0aGlzLmRlZXApIHsKICAgICAgdHJhdmVyc2UodmFsdWUpOwogICAgfQogICAgcG9wVGFyZ2V0KCk7CiAgICB0aGlzLmNsZWFudXBEZXBzKCk7CiAgfQogIHJldHVybiB2YWx1ZQp9OwoKLyoqCiAqIEFkZCBhIGRlcGVuZGVuY3kgdG8gdGhpcyBkaXJlY3RpdmUuCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5hZGREZXAgPSBmdW5jdGlvbiBhZGREZXAgKGRlcCkgewogIHZhciBpZCA9IGRlcC5pZDsKICBpZiAoIXRoaXMubmV3RGVwSWRzLmhhcyhpZCkpIHsKICAgIHRoaXMubmV3RGVwSWRzLmFkZChpZCk7CiAgICB0aGlzLm5ld0RlcHMucHVzaChkZXApOwogICAgaWYgKCF0aGlzLmRlcElkcy5oYXMoaWQpKSB7CiAgICAgIGRlcC5hZGRTdWIodGhpcyk7CiAgICB9CiAgfQp9OwoKLyoqCiAqIENsZWFuIHVwIGZvciBkZXBlbmRlbmN5IGNvbGxlY3Rpb24uCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5jbGVhbnVwRGVwcyA9IGZ1bmN0aW9uIGNsZWFudXBEZXBzICgpIHsKICAgIHZhciB0aGlzJDEgPSB0aGlzOwoKICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7CiAgd2hpbGUgKGktLSkgewogICAgdmFyIGRlcCA9IHRoaXMkMS5kZXBzW2ldOwogICAgaWYgKCF0aGlzJDEubmV3RGVwSWRzLmhhcyhkZXAuaWQpKSB7CiAgICAgIGRlcC5yZW1vdmVTdWIodGhpcyQxKTsKICAgIH0KICB9CiAgdmFyIHRtcCA9IHRoaXMuZGVwSWRzOwogIHRoaXMuZGVwSWRzID0gdGhpcy5uZXdEZXBJZHM7CiAgdGhpcy5uZXdEZXBJZHMgPSB0bXA7CiAgdGhpcy5uZXdEZXBJZHMuY2xlYXIoKTsKICB0bXAgPSB0aGlzLmRlcHM7CiAgdGhpcy5kZXBzID0gdGhpcy5uZXdEZXBzOwogIHRoaXMubmV3RGVwcyA9IHRtcDsKICB0aGlzLm5ld0RlcHMubGVuZ3RoID0gMDsKfTsKCi8qKgogKiBTdWJzY3JpYmVyIGludGVyZmFjZS4KICogV2lsbCBiZSBjYWxsZWQgd2hlbiBhIGRlcGVuZGVuY3kgY2hhbmdlcy4KICovCldhdGNoZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAoKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICBpZiAodGhpcy5sYXp5KSB7CiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTsKICB9IGVsc2UgaWYgKHRoaXMuc3luYykgewogICAgdGhpcy5ydW4oKTsKICB9IGVsc2UgewogICAgcXVldWVXYXRjaGVyKHRoaXMpOwogIH0KfTsKCi8qKgogKiBTY2hlZHVsZXIgam9iIGludGVyZmFjZS4KICogV2lsbCBiZSBjYWxsZWQgYnkgdGhlIHNjaGVkdWxlci4KICovCldhdGNoZXIucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIHJ1biAoKSB7CiAgaWYgKHRoaXMuYWN0aXZlKSB7CiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldCgpOwogICAgaWYgKAogICAgICB2YWx1ZSAhPT0gdGhpcy52YWx1ZSB8fAogICAgICAvLyBEZWVwIHdhdGNoZXJzIGFuZCB3YXRjaGVycyBvbiBPYmplY3QvQXJyYXlzIHNob3VsZCBmaXJlIGV2ZW4KICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgaXMgdGhlIHNhbWUsIGJlY2F1c2UgdGhlIHZhbHVlIG1heQogICAgICAvLyBoYXZlIG11dGF0ZWQuCiAgICAgIGlzT2JqZWN0KHZhbHVlKSB8fAogICAgICB0aGlzLmRlZXAKICAgICkgewogICAgICAvLyBzZXQgbmV3IHZhbHVlCiAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICAgaWYgKHRoaXMudXNlcikgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLmNiLmNhbGwodGhpcy52bSwgdmFsdWUsIG9sZFZhbHVlKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBoYW5kbGVFcnJvcihlLCB0aGlzLnZtLCAoImNhbGxiYWNrIGZvciB3YXRjaGVyIFwiIiArICh0aGlzLmV4cHJlc3Npb24pICsgIlwiIikpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmNiLmNhbGwodGhpcy52bSwgdmFsdWUsIG9sZFZhbHVlKTsKICAgICAgfQogICAgfQogIH0KfTsKCi8qKgogKiBFdmFsdWF0ZSB0aGUgdmFsdWUgb2YgdGhlIHdhdGNoZXIuCiAqIFRoaXMgb25seSBnZXRzIGNhbGxlZCBmb3IgbGF6eSB3YXRjaGVycy4KICovCldhdGNoZXIucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gZXZhbHVhdGUgKCkgewogIHRoaXMudmFsdWUgPSB0aGlzLmdldCgpOwogIHRoaXMuZGlydHkgPSBmYWxzZTsKfTsKCi8qKgogKiBEZXBlbmQgb24gYWxsIGRlcHMgY29sbGVjdGVkIGJ5IHRoaXMgd2F0Y2hlci4KICovCldhdGNoZXIucHJvdG90eXBlLmRlcGVuZCA9IGZ1bmN0aW9uIGRlcGVuZCAoKSB7CiAgICB2YXIgdGhpcyQxID0gdGhpczsKCiAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoOwogIHdoaWxlIChpLS0pIHsKICAgIHRoaXMkMS5kZXBzW2ldLmRlcGVuZCgpOwogIH0KfTsKCi8qKgogKiBSZW1vdmUgc2VsZiBmcm9tIGFsbCBkZXBlbmRlbmNpZXMnIHN1YnNjcmliZXIgbGlzdC4KICovCldhdGNoZXIucHJvdG90eXBlLnRlYXJkb3duID0gZnVuY3Rpb24gdGVhcmRvd24gKCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogIGlmICh0aGlzLmFjdGl2ZSkgewogICAgLy8gcmVtb3ZlIHNlbGYgZnJvbSB2bSdzIHdhdGNoZXIgbGlzdAogICAgLy8gdGhpcyBpcyBhIHNvbWV3aGF0IGV4cGVuc2l2ZSBvcGVyYXRpb24gc28gd2Ugc2tpcCBpdAogICAgLy8gaWYgdGhlIHZtIGlzIGJlaW5nIGRlc3Ryb3llZC4KICAgIGlmICghdGhpcy52bS5faXNCZWluZ0Rlc3Ryb3llZCkgewogICAgICByZW1vdmUodGhpcy52bS5fd2F0Y2hlcnMsIHRoaXMpOwogICAgfQogICAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoOwogICAgd2hpbGUgKGktLSkgewogICAgICB0aGlzJDEuZGVwc1tpXS5yZW1vdmVTdWIodGhpcyQxKTsKICAgIH0KICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7CiAgfQp9OwoKLyogICovCgp2YXIgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uID0gewogIGVudW1lcmFibGU6IHRydWUsCiAgY29uZmlndXJhYmxlOiB0cnVlLAogIGdldDogbm9vcCwKICBzZXQ6IG5vb3AKfTsKCmZ1bmN0aW9uIHByb3h5ICh0YXJnZXQsIHNvdXJjZUtleSwga2V5KSB7CiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IGZ1bmN0aW9uIHByb3h5R2V0dGVyICgpIHsKICAgIHJldHVybiB0aGlzW3NvdXJjZUtleV1ba2V5XQogIH07CiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLnNldCA9IGZ1bmN0aW9uIHByb3h5U2V0dGVyICh2YWwpIHsKICAgIHRoaXNbc291cmNlS2V5XVtrZXldID0gdmFsOwogIH07CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24pOwp9CgpmdW5jdGlvbiBpbml0U3RhdGUgKHZtKSB7CiAgdm0uX3dhdGNoZXJzID0gW107CiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9uczsKICBpZiAob3B0cy5wcm9wcykgeyBpbml0UHJvcHModm0sIG9wdHMucHJvcHMpOyB9CiAgaWYgKG9wdHMubWV0aG9kcykgeyBpbml0TWV0aG9kcyh2bSwgb3B0cy5tZXRob2RzKTsgfQogIGlmIChvcHRzLmRhdGEpIHsKICAgIGluaXREYXRhKHZtKTsKICB9IGVsc2UgewogICAgb2JzZXJ2ZSh2bS5fZGF0YSA9IHt9LCB0cnVlIC8qIGFzUm9vdERhdGEgKi8pOwogIH0KICBpZiAob3B0cy5jb21wdXRlZCkgeyBpbml0Q29tcHV0ZWQodm0sIG9wdHMuY29tcHV0ZWQpOyB9CiAgaWYgKG9wdHMud2F0Y2ggJiYgb3B0cy53YXRjaCAhPT0gbmF0aXZlV2F0Y2gpIHsKICAgIGluaXRXYXRjaCh2bSwgb3B0cy53YXRjaCk7CiAgfQp9CgpmdW5jdGlvbiBpbml0UHJvcHMgKHZtLCBwcm9wc09wdGlvbnMpIHsKICB2YXIgcHJvcHNEYXRhID0gdm0uJG9wdGlvbnMucHJvcHNEYXRhIHx8IHt9OwogIHZhciBwcm9wcyA9IHZtLl9wcm9wcyA9IHt9OwogIC8vIGNhY2hlIHByb3Aga2V5cyBzbyB0aGF0IGZ1dHVyZSBwcm9wcyB1cGRhdGVzIGNhbiBpdGVyYXRlIHVzaW5nIEFycmF5CiAgLy8gaW5zdGVhZCBvZiBkeW5hbWljIG9iamVjdCBrZXkgZW51bWVyYXRpb24uCiAgdmFyIGtleXMgPSB2bS4kb3B0aW9ucy5fcHJvcEtleXMgPSBbXTsKICB2YXIgaXNSb290ID0gIXZtLiRwYXJlbnQ7CiAgLy8gcm9vdCBpbnN0YW5jZSBwcm9wcyBzaG91bGQgYmUgY29udmVydGVkCiAgaWYgKCFpc1Jvb3QpIHsKICAgIHRvZ2dsZU9ic2VydmluZyhmYWxzZSk7CiAgfQogIHZhciBsb29wID0gZnVuY3Rpb24gKCBrZXkgKSB7CiAgICBrZXlzLnB1c2goa2V5KTsKICAgIHZhciB2YWx1ZSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BzT3B0aW9ucywgcHJvcHNEYXRhLCB2bSk7CiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwogICAgewogICAgICB2YXIgaHlwaGVuYXRlZEtleSA9IGh5cGhlbmF0ZShrZXkpOwogICAgICBpZiAoaXNSZXNlcnZlZEF0dHJpYnV0ZShoeXBoZW5hdGVkS2V5KSB8fAogICAgICAgICAgY29uZmlnLmlzUmVzZXJ2ZWRBdHRyKGh5cGhlbmF0ZWRLZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICgiXCIiICsgaHlwaGVuYXRlZEtleSArICJcIiBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBhbmQgY2Fubm90IGJlIHVzZWQgYXMgY29tcG9uZW50IHByb3AuIiksCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgICAgZGVmaW5lUmVhY3RpdmUocHJvcHMsIGtleSwgdmFsdWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAodm0uJHBhcmVudCAmJiAhaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50KSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAiQXZvaWQgbXV0YXRpbmcgYSBwcm9wIGRpcmVjdGx5IHNpbmNlIHRoZSB2YWx1ZSB3aWxsIGJlICIgKwogICAgICAgICAgICAib3ZlcndyaXR0ZW4gd2hlbmV2ZXIgdGhlIHBhcmVudCBjb21wb25lbnQgcmUtcmVuZGVycy4gIiArCiAgICAgICAgICAgICJJbnN0ZWFkLCB1c2UgYSBkYXRhIG9yIGNvbXB1dGVkIHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwcm9wJ3MgIiArCiAgICAgICAgICAgICJ2YWx1ZS4gUHJvcCBiZWluZyBtdXRhdGVkOiBcIiIgKyBrZXkgKyAiXCIiLAogICAgICAgICAgICB2bQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgLy8gc3RhdGljIHByb3BzIGFyZSBhbHJlYWR5IHByb3hpZWQgb24gdGhlIGNvbXBvbmVudCdzIHByb3RvdHlwZQogICAgLy8gZHVyaW5nIFZ1ZS5leHRlbmQoKS4gV2Ugb25seSBuZWVkIHRvIHByb3h5IHByb3BzIGRlZmluZWQgYXQKICAgIC8vIGluc3RhbnRpYXRpb24gaGVyZS4KICAgIGlmICghKGtleSBpbiB2bSkpIHsKICAgICAgcHJveHkodm0sICJfcHJvcHMiLCBrZXkpOwogICAgfQogIH07CgogIGZvciAodmFyIGtleSBpbiBwcm9wc09wdGlvbnMpIGxvb3AoIGtleSApOwogIHRvZ2dsZU9ic2VydmluZyh0cnVlKTsKfQoKZnVuY3Rpb24gaW5pdERhdGEgKHZtKSB7CiAgdmFyIGRhdGEgPSB2bS4kb3B0aW9ucy5kYXRhOwogIGRhdGEgPSB2bS5fZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nCiAgICA/IGdldERhdGEoZGF0YSwgdm0pCiAgICA6IGRhdGEgfHwge307CiAgaWYgKCFpc1BsYWluT2JqZWN0KGRhdGEpKSB7CiAgICBkYXRhID0ge307CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgJ2RhdGEgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0OlxuJyArCiAgICAgICdodHRwczovL3Z1ZWpzLm9yZy92Mi9ndWlkZS9jb21wb25lbnRzLmh0bWwjZGF0YS1NdXN0LUJlLWEtRnVuY3Rpb24nLAogICAgICB2bQogICAgKTsKICB9CiAgLy8gcHJveHkgZGF0YSBvbiBpbnN0YW5jZQogIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7CiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7CiAgdmFyIG1ldGhvZHMgPSB2bS4kb3B0aW9ucy5tZXRob2RzOwogIHZhciBpID0ga2V5cy5sZW5ndGg7CiAgd2hpbGUgKGktLSkgewogICAgdmFyIGtleSA9IGtleXNbaV07CiAgICB7CiAgICAgIGlmIChtZXRob2RzICYmIGhhc093bihtZXRob2RzLCBrZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICgiTWV0aG9kIFwiIiArIGtleSArICJcIiBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQgYXMgYSBkYXRhIHByb3BlcnR5LiIpLAogICAgICAgICAgdm0KICAgICAgICApOwogICAgICB9CiAgICB9CiAgICBpZiAocHJvcHMgJiYgaGFzT3duKHByb3BzLCBrZXkpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJUaGUgZGF0YSBwcm9wZXJ0eSBcIiIgKyBrZXkgKyAiXCIgaXMgYWxyZWFkeSBkZWNsYXJlZCBhcyBhIHByb3AuICIgKwogICAgICAgICJVc2UgcHJvcCBkZWZhdWx0IHZhbHVlIGluc3RlYWQuIiwKICAgICAgICB2bQogICAgICApOwogICAgfSBlbHNlIGlmICghaXNSZXNlcnZlZChrZXkpKSB7CiAgICAgIHByb3h5KHZtLCAiX2RhdGEiLCBrZXkpOwogICAgfQogIH0KICAvLyBvYnNlcnZlIGRhdGEKICBvYnNlcnZlKGRhdGEsIHRydWUgLyogYXNSb290RGF0YSAqLyk7Cn0KCmZ1bmN0aW9uIGdldERhdGEgKGRhdGEsIHZtKSB7CiAgLy8gIzc1NzMgZGlzYWJsZSBkZXAgY29sbGVjdGlvbiB3aGVuIGludm9raW5nIGRhdGEgZ2V0dGVycwogIHB1c2hUYXJnZXQoKTsKICB0cnkgewogICAgcmV0dXJuIGRhdGEuY2FsbCh2bSwgdm0pCiAgfSBjYXRjaCAoZSkgewogICAgaGFuZGxlRXJyb3IoZSwgdm0sICJkYXRhKCkiKTsKICAgIHJldHVybiB7fQogIH0gZmluYWxseSB7CiAgICBwb3BUYXJnZXQoKTsKICB9Cn0KCnZhciBjb21wdXRlZFdhdGNoZXJPcHRpb25zID0geyBsYXp5OiB0cnVlIH07CgpmdW5jdGlvbiBpbml0Q29tcHV0ZWQgKHZtLCBjb21wdXRlZCkgewogIC8vICRmbG93LWRpc2FibGUtbGluZQogIHZhciB3YXRjaGVycyA9IHZtLl9jb21wdXRlZFdhdGNoZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAvLyBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBqdXN0IGdldHRlcnMgZHVyaW5nIFNTUgogIHZhciBpc1NTUiA9IGlzU2VydmVyUmVuZGVyaW5nKCk7CgogIGZvciAodmFyIGtleSBpbiBjb21wdXRlZCkgewogICAgdmFyIHVzZXJEZWYgPSBjb21wdXRlZFtrZXldOwogICAgdmFyIGdldHRlciA9IHR5cGVvZiB1c2VyRGVmID09PSAnZnVuY3Rpb24nID8gdXNlckRlZiA6IHVzZXJEZWYuZ2V0OwogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBnZXR0ZXIgPT0gbnVsbCkgewogICAgICB3YXJuKAogICAgICAgICgiR2V0dGVyIGlzIG1pc3NpbmcgZm9yIGNvbXB1dGVkIHByb3BlcnR5IFwiIiArIGtleSArICJcIi4iKSwKICAgICAgICB2bQogICAgICApOwogICAgfQoKICAgIGlmICghaXNTU1IpIHsKICAgICAgLy8gY3JlYXRlIGludGVybmFsIHdhdGNoZXIgZm9yIHRoZSBjb21wdXRlZCBwcm9wZXJ0eS4KICAgICAgd2F0Y2hlcnNba2V5XSA9IG5ldyBXYXRjaGVyKAogICAgICAgIHZtLAogICAgICAgIGdldHRlciB8fCBub29wLAogICAgICAgIG5vb3AsCiAgICAgICAgY29tcHV0ZWRXYXRjaGVyT3B0aW9ucwogICAgICApOwogICAgfQoKICAgIC8vIGNvbXBvbmVudC1kZWZpbmVkIGNvbXB1dGVkIHByb3BlcnRpZXMgYXJlIGFscmVhZHkgZGVmaW5lZCBvbiB0aGUKICAgIC8vIGNvbXBvbmVudCBwcm90b3R5cGUuIFdlIG9ubHkgbmVlZCB0byBkZWZpbmUgY29tcHV0ZWQgcHJvcGVydGllcyBkZWZpbmVkCiAgICAvLyBhdCBpbnN0YW50aWF0aW9uIGhlcmUuCiAgICBpZiAoIShrZXkgaW4gdm0pKSB7CiAgICAgIGRlZmluZUNvbXB1dGVkKHZtLCBrZXksIHVzZXJEZWYpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGtleSBpbiB2bS4kZGF0YSkgewogICAgICAgIHdhcm4oKCJUaGUgY29tcHV0ZWQgcHJvcGVydHkgXCIiICsga2V5ICsgIlwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBkYXRhLiIpLCB2bSk7CiAgICAgIH0gZWxzZSBpZiAodm0uJG9wdGlvbnMucHJvcHMgJiYga2V5IGluIHZtLiRvcHRpb25zLnByb3BzKSB7CiAgICAgICAgd2FybigoIlRoZSBjb21wdXRlZCBwcm9wZXJ0eSBcIiIgKyBrZXkgKyAiXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIGEgcHJvcC4iKSwgdm0pOwogICAgICB9CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBkZWZpbmVDb21wdXRlZCAoCiAgdGFyZ2V0LAogIGtleSwKICB1c2VyRGVmCikgewogIHZhciBzaG91bGRDYWNoZSA9ICFpc1NlcnZlclJlbmRlcmluZygpOwogIGlmICh0eXBlb2YgdXNlckRlZiA9PT0gJ2Z1bmN0aW9uJykgewogICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IHNob3VsZENhY2hlCiAgICAgID8gY3JlYXRlQ29tcHV0ZWRHZXR0ZXIoa2V5KQogICAgICA6IHVzZXJEZWY7CiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gbm9vcDsKICB9IGVsc2UgewogICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IHVzZXJEZWYuZ2V0CiAgICAgID8gc2hvdWxkQ2FjaGUgJiYgdXNlckRlZi5jYWNoZSAhPT0gZmFsc2UKICAgICAgICA/IGNyZWF0ZUNvbXB1dGVkR2V0dGVyKGtleSkKICAgICAgICA6IHVzZXJEZWYuZ2V0CiAgICAgIDogbm9vcDsKICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSB1c2VyRGVmLnNldAogICAgICA/IHVzZXJEZWYuc2V0CiAgICAgIDogbm9vcDsKICB9CiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID09PSBub29wKSB7CiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gZnVuY3Rpb24gKCkgewogICAgICB3YXJuKAogICAgICAgICgiQ29tcHV0ZWQgcHJvcGVydHkgXCIiICsga2V5ICsgIlwiIHdhcyBhc3NpZ25lZCB0byBidXQgaXQgaGFzIG5vIHNldHRlci4iKSwKICAgICAgICB0aGlzCiAgICAgICk7CiAgICB9OwogIH0KICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbik7Cn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbXB1dGVkR2V0dGVyIChrZXkpIHsKICByZXR1cm4gZnVuY3Rpb24gY29tcHV0ZWRHZXR0ZXIgKCkgewogICAgdmFyIHdhdGNoZXIgPSB0aGlzLl9jb21wdXRlZFdhdGNoZXJzICYmIHRoaXMuX2NvbXB1dGVkV2F0Y2hlcnNba2V5XTsKICAgIGlmICh3YXRjaGVyKSB7CiAgICAgIGlmICh3YXRjaGVyLmRpcnR5KSB7CiAgICAgICAgd2F0Y2hlci5ldmFsdWF0ZSgpOwogICAgICB9CiAgICAgIGlmIChEZXAudGFyZ2V0KSB7CiAgICAgICAgd2F0Y2hlci5kZXBlbmQoKTsKICAgICAgfQogICAgICByZXR1cm4gd2F0Y2hlci52YWx1ZQogICAgfQogIH0KfQoKZnVuY3Rpb24gaW5pdE1ldGhvZHMgKHZtLCBtZXRob2RzKSB7CiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7CiAgZm9yICh2YXIga2V5IGluIG1ldGhvZHMpIHsKICAgIHsKICAgICAgaWYgKG1ldGhvZHNba2V5XSA9PSBudWxsKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJNZXRob2QgXCIiICsga2V5ICsgIlwiIGhhcyBhbiB1bmRlZmluZWQgdmFsdWUgaW4gdGhlIGNvbXBvbmVudCBkZWZpbml0aW9uLiAiICsKICAgICAgICAgICJEaWQgeW91IHJlZmVyZW5jZSB0aGUgZnVuY3Rpb24gY29ycmVjdGx5PyIsCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgICAgaWYgKHByb3BzICYmIGhhc093bihwcm9wcywga2V5KSkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAoIk1ldGhvZCBcIiIgKyBrZXkgKyAiXCIgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkIGFzIGEgcHJvcC4iKSwKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgICBpZiAoKGtleSBpbiB2bSkgJiYgaXNSZXNlcnZlZChrZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJNZXRob2QgXCIiICsga2V5ICsgIlwiIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIFZ1ZSBpbnN0YW5jZSBtZXRob2QuICIgKwogICAgICAgICAgIkF2b2lkIGRlZmluaW5nIGNvbXBvbmVudCBtZXRob2RzIHRoYXQgc3RhcnQgd2l0aCBfIG9yICQuIgogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIHZtW2tleV0gPSBtZXRob2RzW2tleV0gPT0gbnVsbCA/IG5vb3AgOiBiaW5kKG1ldGhvZHNba2V5XSwgdm0pOwogIH0KfQoKZnVuY3Rpb24gaW5pdFdhdGNoICh2bSwgd2F0Y2gpIHsKICBmb3IgKHZhciBrZXkgaW4gd2F0Y2gpIHsKICAgIHZhciBoYW5kbGVyID0gd2F0Y2hba2V5XTsKICAgIGlmIChBcnJheS5pc0FycmF5KGhhbmRsZXIpKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlci5sZW5ndGg7IGkrKykgewogICAgICAgIGNyZWF0ZVdhdGNoZXIodm0sIGtleSwgaGFuZGxlcltpXSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNyZWF0ZVdhdGNoZXIodm0sIGtleSwgaGFuZGxlcik7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBjcmVhdGVXYXRjaGVyICgKICB2bSwKICBleHBPckZuLAogIGhhbmRsZXIsCiAgb3B0aW9ucwopIHsKICBpZiAoaXNQbGFpbk9iamVjdChoYW5kbGVyKSkgewogICAgb3B0aW9ucyA9IGhhbmRsZXI7CiAgICBoYW5kbGVyID0gaGFuZGxlci5oYW5kbGVyOwogIH0KICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdzdHJpbmcnKSB7CiAgICBoYW5kbGVyID0gdm1baGFuZGxlcl07CiAgfQogIHJldHVybiB2bS4kd2F0Y2goZXhwT3JGbiwgaGFuZGxlciwgb3B0aW9ucykKfQoKZnVuY3Rpb24gc3RhdGVNaXhpbiAoVnVlKSB7CiAgLy8gZmxvdyBzb21laG93IGhhcyBwcm9ibGVtcyB3aXRoIGRpcmVjdGx5IGRlY2xhcmVkIGRlZmluaXRpb24gb2JqZWN0CiAgLy8gd2hlbiB1c2luZyBPYmplY3QuZGVmaW5lUHJvcGVydHksIHNvIHdlIGhhdmUgdG8gcHJvY2VkdXJhbGx5IGJ1aWxkIHVwCiAgLy8gdGhlIG9iamVjdCBoZXJlLgogIHZhciBkYXRhRGVmID0ge307CiAgZGF0YURlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kYXRhIH07CiAgdmFyIHByb3BzRGVmID0ge307CiAgcHJvcHNEZWYuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcHJvcHMgfTsKICB7CiAgICBkYXRhRGVmLnNldCA9IGZ1bmN0aW9uIChuZXdEYXRhKSB7CiAgICAgIHdhcm4oCiAgICAgICAgJ0F2b2lkIHJlcGxhY2luZyBpbnN0YW5jZSByb290ICRkYXRhLiAnICsKICAgICAgICAnVXNlIG5lc3RlZCBkYXRhIHByb3BlcnRpZXMgaW5zdGVhZC4nLAogICAgICAgIHRoaXMKICAgICAgKTsKICAgIH07CiAgICBwcm9wc0RlZi5zZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHdhcm4oIiRwcm9wcyBpcyByZWFkb25seS4iLCB0aGlzKTsKICAgIH07CiAgfQogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGRhdGEnLCBkYXRhRGVmKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRwcm9wcycsIHByb3BzRGVmKTsKCiAgVnVlLnByb3RvdHlwZS4kc2V0ID0gc2V0OwogIFZ1ZS5wcm90b3R5cGUuJGRlbGV0ZSA9IGRlbDsKCiAgVnVlLnByb3RvdHlwZS4kd2F0Y2ggPSBmdW5jdGlvbiAoCiAgICBleHBPckZuLAogICAgY2IsCiAgICBvcHRpb25zCiAgKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgaWYgKGlzUGxhaW5PYmplY3QoY2IpKSB7CiAgICAgIHJldHVybiBjcmVhdGVXYXRjaGVyKHZtLCBleHBPckZuLCBjYiwgb3B0aW9ucykKICAgIH0KICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgb3B0aW9ucy51c2VyID0gdHJ1ZTsKICAgIHZhciB3YXRjaGVyID0gbmV3IFdhdGNoZXIodm0sIGV4cE9yRm4sIGNiLCBvcHRpb25zKTsKICAgIGlmIChvcHRpb25zLmltbWVkaWF0ZSkgewogICAgICBjYi5jYWxsKHZtLCB3YXRjaGVyLnZhbHVlKTsKICAgIH0KICAgIHJldHVybiBmdW5jdGlvbiB1bndhdGNoRm4gKCkgewogICAgICB3YXRjaGVyLnRlYXJkb3duKCk7CiAgICB9CiAgfTsKfQoKLyogICovCgpmdW5jdGlvbiBpbml0UHJvdmlkZSAodm0pIHsKICB2YXIgcHJvdmlkZSA9IHZtLiRvcHRpb25zLnByb3ZpZGU7CiAgaWYgKHByb3ZpZGUpIHsKICAgIHZtLl9wcm92aWRlZCA9IHR5cGVvZiBwcm92aWRlID09PSAnZnVuY3Rpb24nCiAgICAgID8gcHJvdmlkZS5jYWxsKHZtKQogICAgICA6IHByb3ZpZGU7CiAgfQp9CgpmdW5jdGlvbiBpbml0SW5qZWN0aW9ucyAodm0pIHsKICB2YXIgcmVzdWx0ID0gcmVzb2x2ZUluamVjdCh2bS4kb3B0aW9ucy5pbmplY3QsIHZtKTsKICBpZiAocmVzdWx0KSB7CiAgICB0b2dnbGVPYnNlcnZpbmcoZmFsc2UpOwogICAgT2JqZWN0LmtleXMocmVzdWx0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgICAgewogICAgICAgIGRlZmluZVJlYWN0aXZlKHZtLCBrZXksIHJlc3VsdFtrZXldLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAiQXZvaWQgbXV0YXRpbmcgYW4gaW5qZWN0ZWQgdmFsdWUgZGlyZWN0bHkgc2luY2UgdGhlIGNoYW5nZXMgd2lsbCBiZSAiICsKICAgICAgICAgICAgIm92ZXJ3cml0dGVuIHdoZW5ldmVyIHRoZSBwcm92aWRlZCBjb21wb25lbnQgcmUtcmVuZGVycy4gIiArCiAgICAgICAgICAgICJpbmplY3Rpb24gYmVpbmcgbXV0YXRlZDogXCIiICsga2V5ICsgIlwiIiwKICAgICAgICAgICAgdm0KICAgICAgICAgICk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpOwogIH0KfQoKZnVuY3Rpb24gcmVzb2x2ZUluamVjdCAoaW5qZWN0LCB2bSkgewogIGlmIChpbmplY3QpIHsKICAgIC8vIGluamVjdCBpcyA6YW55IGJlY2F1c2UgZmxvdyBpcyBub3Qgc21hcnQgZW5vdWdoIHRvIGZpZ3VyZSBvdXQgY2FjaGVkCiAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHZhciBrZXlzID0gaGFzU3ltYm9sCiAgICAgID8gUmVmbGVjdC5vd25LZXlzKGluamVjdCkuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwogICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGluamVjdCwga2V5KS5lbnVtZXJhYmxlCiAgICAgIH0pCiAgICAgIDogT2JqZWN0LmtleXMoaW5qZWN0KTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGtleSA9IGtleXNbaV07CiAgICAgIHZhciBwcm92aWRlS2V5ID0gaW5qZWN0W2tleV0uZnJvbTsKICAgICAgdmFyIHNvdXJjZSA9IHZtOwogICAgICB3aGlsZSAoc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5fcHJvdmlkZWQgJiYgaGFzT3duKHNvdXJjZS5fcHJvdmlkZWQsIHByb3ZpZGVLZXkpKSB7CiAgICAgICAgICByZXN1bHRba2V5XSA9IHNvdXJjZS5fcHJvdmlkZWRbcHJvdmlkZUtleV07CiAgICAgICAgICBicmVhawogICAgICAgIH0KICAgICAgICBzb3VyY2UgPSBzb3VyY2UuJHBhcmVudDsKICAgICAgfQogICAgICBpZiAoIXNvdXJjZSkgewogICAgICAgIGlmICgnZGVmYXVsdCcgaW4gaW5qZWN0W2tleV0pIHsKICAgICAgICAgIHZhciBwcm92aWRlRGVmYXVsdCA9IGluamVjdFtrZXldLmRlZmF1bHQ7CiAgICAgICAgICByZXN1bHRba2V5XSA9IHR5cGVvZiBwcm92aWRlRGVmYXVsdCA9PT0gJ2Z1bmN0aW9uJwogICAgICAgICAgICA/IHByb3ZpZGVEZWZhdWx0LmNhbGwodm0pCiAgICAgICAgICAgIDogcHJvdmlkZURlZmF1bHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdhcm4oKCJJbmplY3Rpb24gXCIiICsga2V5ICsgIlwiIG5vdCBmb3VuZCIpLCB2bSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0CiAgfQp9CgovKiAgKi8KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgcmVuZGVyaW5nIHYtZm9yIGxpc3RzLgogKi8KZnVuY3Rpb24gcmVuZGVyTGlzdCAoCiAgdmFsLAogIHJlbmRlcgopIHsKICB2YXIgcmV0LCBpLCBsLCBrZXlzLCBrZXk7CiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSB8fCB0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgewogICAgcmV0ID0gbmV3IEFycmF5KHZhbC5sZW5ndGgpOwogICAgZm9yIChpID0gMCwgbCA9IHZhbC5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgcmV0W2ldID0gcmVuZGVyKHZhbFtpXSwgaSk7CiAgICB9CiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykgewogICAgcmV0ID0gbmV3IEFycmF5KHZhbCk7CiAgICBmb3IgKGkgPSAwOyBpIDwgdmFsOyBpKyspIHsKICAgICAgcmV0W2ldID0gcmVuZGVyKGkgKyAxLCBpKTsKICAgIH0KICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbCkpIHsKICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpOwogICAgcmV0ID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKTsKICAgIGZvciAoaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICBrZXkgPSBrZXlzW2ldOwogICAgICByZXRbaV0gPSByZW5kZXIodmFsW2tleV0sIGtleSwgaSk7CiAgICB9CiAgfQogIGlmIChpc0RlZihyZXQpKSB7CiAgICAocmV0KS5faXNWTGlzdCA9IHRydWU7CiAgfQogIHJldHVybiByZXQKfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyA8c2xvdD4KICovCmZ1bmN0aW9uIHJlbmRlclNsb3QgKAogIG5hbWUsCiAgZmFsbGJhY2ssCiAgcHJvcHMsCiAgYmluZE9iamVjdAopIHsKICB2YXIgc2NvcGVkU2xvdEZuID0gdGhpcy4kc2NvcGVkU2xvdHNbbmFtZV07CiAgdmFyIG5vZGVzOwogIGlmIChzY29wZWRTbG90Rm4pIHsgLy8gc2NvcGVkIHNsb3QKICAgIHByb3BzID0gcHJvcHMgfHwge307CiAgICBpZiAoYmluZE9iamVjdCkgewogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmICFpc09iamVjdChiaW5kT2JqZWN0KSkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAnc2xvdCB2LWJpbmQgd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCcsCiAgICAgICAgICB0aGlzCiAgICAgICAgKTsKICAgICAgfQogICAgICBwcm9wcyA9IGV4dGVuZChleHRlbmQoe30sIGJpbmRPYmplY3QpLCBwcm9wcyk7CiAgICB9CiAgICBub2RlcyA9IHNjb3BlZFNsb3RGbihwcm9wcykgfHwgZmFsbGJhY2s7CiAgfSBlbHNlIHsKICAgIHZhciBzbG90Tm9kZXMgPSB0aGlzLiRzbG90c1tuYW1lXTsKICAgIC8vIHdhcm4gZHVwbGljYXRlIHNsb3QgdXNhZ2UKICAgIGlmIChzbG90Tm9kZXMpIHsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBzbG90Tm9kZXMuX3JlbmRlcmVkKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJEdXBsaWNhdGUgcHJlc2VuY2Ugb2Ygc2xvdCBcIiIgKyBuYW1lICsgIlwiIGZvdW5kIGluIHRoZSBzYW1lIHJlbmRlciB0cmVlICIgKwogICAgICAgICAgIi0gdGhpcyB3aWxsIGxpa2VseSBjYXVzZSByZW5kZXIgZXJyb3JzLiIsCiAgICAgICAgICB0aGlzCiAgICAgICAgKTsKICAgICAgfQogICAgICBzbG90Tm9kZXMuX3JlbmRlcmVkID0gdHJ1ZTsKICAgIH0KICAgIG5vZGVzID0gc2xvdE5vZGVzIHx8IGZhbGxiYWNrOwogIH0KCiAgdmFyIHRhcmdldCA9IHByb3BzICYmIHByb3BzLnNsb3Q7CiAgaWYgKHRhcmdldCkgewogICAgcmV0dXJuIHRoaXMuJGNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJywgeyBzbG90OiB0YXJnZXQgfSwgbm9kZXMpCiAgfSBlbHNlIHsKICAgIHJldHVybiBub2RlcwogIH0KfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyBmaWx0ZXJzCiAqLwpmdW5jdGlvbiByZXNvbHZlRmlsdGVyIChpZCkgewogIHJldHVybiByZXNvbHZlQXNzZXQodGhpcy4kb3B0aW9ucywgJ2ZpbHRlcnMnLCBpZCwgdHJ1ZSkgfHwgaWRlbnRpdHkKfQoKLyogICovCgpmdW5jdGlvbiBpc0tleU5vdE1hdGNoIChleHBlY3QsIGFjdHVhbCkgewogIGlmIChBcnJheS5pc0FycmF5KGV4cGVjdCkpIHsKICAgIHJldHVybiBleHBlY3QuaW5kZXhPZihhY3R1YWwpID09PSAtMQogIH0gZWxzZSB7CiAgICByZXR1cm4gZXhwZWN0ICE9PSBhY3R1YWwKICB9Cn0KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgY2hlY2tpbmcga2V5Q29kZXMgZnJvbSBjb25maWcuCiAqIGV4cG9zZWQgYXMgVnVlLnByb3RvdHlwZS5fawogKiBwYXNzaW5nIGluIGV2ZW50S2V5TmFtZSBhcyBsYXN0IGFyZ3VtZW50IHNlcGFyYXRlbHkgZm9yIGJhY2t3YXJkcyBjb21wYXQKICovCmZ1bmN0aW9uIGNoZWNrS2V5Q29kZXMgKAogIGV2ZW50S2V5Q29kZSwKICBrZXksCiAgYnVpbHRJbktleUNvZGUsCiAgZXZlbnRLZXlOYW1lLAogIGJ1aWx0SW5LZXlOYW1lCikgewogIHZhciBtYXBwZWRLZXlDb2RlID0gY29uZmlnLmtleUNvZGVzW2tleV0gfHwgYnVpbHRJbktleUNvZGU7CiAgaWYgKGJ1aWx0SW5LZXlOYW1lICYmIGV2ZW50S2V5TmFtZSAmJiAhY29uZmlnLmtleUNvZGVzW2tleV0pIHsKICAgIHJldHVybiBpc0tleU5vdE1hdGNoKGJ1aWx0SW5LZXlOYW1lLCBldmVudEtleU5hbWUpCiAgfSBlbHNlIGlmIChtYXBwZWRLZXlDb2RlKSB7CiAgICByZXR1cm4gaXNLZXlOb3RNYXRjaChtYXBwZWRLZXlDb2RlLCBldmVudEtleUNvZGUpCiAgfSBlbHNlIGlmIChldmVudEtleU5hbWUpIHsKICAgIHJldHVybiBoeXBoZW5hdGUoZXZlbnRLZXlOYW1lKSAhPT0ga2V5CiAgfQp9CgovKiAgKi8KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgbWVyZ2luZyB2LWJpbmQ9Im9iamVjdCIgaW50byBhIFZOb2RlJ3MgZGF0YS4KICovCmZ1bmN0aW9uIGJpbmRPYmplY3RQcm9wcyAoCiAgZGF0YSwKICB0YWcsCiAgdmFsdWUsCiAgYXNQcm9wLAogIGlzU3luYwopIHsKICBpZiAodmFsdWUpIHsKICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICd2LWJpbmQgd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCBvciBBcnJheSB2YWx1ZScsCiAgICAgICAgdGhpcwogICAgICApOwogICAgfSBlbHNlIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgdmFsdWUgPSB0b09iamVjdCh2YWx1ZSk7CiAgICAgIH0KICAgICAgdmFyIGhhc2g7CiAgICAgIHZhciBsb29wID0gZnVuY3Rpb24gKCBrZXkgKSB7CiAgICAgICAgaWYgKAogICAgICAgICAga2V5ID09PSAnY2xhc3MnIHx8CiAgICAgICAgICBrZXkgPT09ICdzdHlsZScgfHwKICAgICAgICAgIGlzUmVzZXJ2ZWRBdHRyaWJ1dGUoa2V5KQogICAgICAgICkgewogICAgICAgICAgaGFzaCA9IGRhdGE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciB0eXBlID0gZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnR5cGU7CiAgICAgICAgICBoYXNoID0gYXNQcm9wIHx8IGNvbmZpZy5tdXN0VXNlUHJvcCh0YWcsIHR5cGUsIGtleSkKICAgICAgICAgICAgPyBkYXRhLmRvbVByb3BzIHx8IChkYXRhLmRvbVByb3BzID0ge30pCiAgICAgICAgICAgIDogZGF0YS5hdHRycyB8fCAoZGF0YS5hdHRycyA9IHt9KTsKICAgICAgICB9CiAgICAgICAgaWYgKCEoa2V5IGluIGhhc2gpKSB7CiAgICAgICAgICBoYXNoW2tleV0gPSB2YWx1ZVtrZXldOwoKICAgICAgICAgIGlmIChpc1N5bmMpIHsKICAgICAgICAgICAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTsKICAgICAgICAgICAgb25bKCJ1cGRhdGU6IiArIGtleSldID0gZnVuY3Rpb24gKCRldmVudCkgewogICAgICAgICAgICAgIHZhbHVlW2tleV0gPSAkZXZlbnQ7CiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwoKICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSBsb29wKCBrZXkgKTsKICAgIH0KICB9CiAgcmV0dXJuIGRhdGEKfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyBzdGF0aWMgdHJlZXMuCiAqLwpmdW5jdGlvbiByZW5kZXJTdGF0aWMgKAogIGluZGV4LAogIGlzSW5Gb3IKKSB7CiAgdmFyIGNhY2hlZCA9IHRoaXMuX3N0YXRpY1RyZWVzIHx8ICh0aGlzLl9zdGF0aWNUcmVlcyA9IFtdKTsKICB2YXIgdHJlZSA9IGNhY2hlZFtpbmRleF07CiAgLy8gaWYgaGFzIGFscmVhZHktcmVuZGVyZWQgc3RhdGljIHRyZWUgYW5kIG5vdCBpbnNpZGUgdi1mb3IsCiAgLy8gd2UgY2FuIHJldXNlIHRoZSBzYW1lIHRyZWUuCiAgaWYgKHRyZWUgJiYgIWlzSW5Gb3IpIHsKICAgIHJldHVybiB0cmVlCiAgfQogIC8vIG90aGVyd2lzZSwgcmVuZGVyIGEgZnJlc2ggdHJlZS4KICB0cmVlID0gY2FjaGVkW2luZGV4XSA9IHRoaXMuJG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zW2luZGV4XS5jYWxsKAogICAgdGhpcy5fcmVuZGVyUHJveHksCiAgICBudWxsLAogICAgdGhpcyAvLyBmb3IgcmVuZGVyIGZucyBnZW5lcmF0ZWQgZm9yIGZ1bmN0aW9uYWwgY29tcG9uZW50IHRlbXBsYXRlcwogICk7CiAgbWFya1N0YXRpYyh0cmVlLCAoIl9fc3RhdGljX18iICsgaW5kZXgpLCBmYWxzZSk7CiAgcmV0dXJuIHRyZWUKfQoKLyoqCiAqIFJ1bnRpbWUgaGVscGVyIGZvciB2LW9uY2UuCiAqIEVmZmVjdGl2ZWx5IGl0IG1lYW5zIG1hcmtpbmcgdGhlIG5vZGUgYXMgc3RhdGljIHdpdGggYSB1bmlxdWUga2V5LgogKi8KZnVuY3Rpb24gbWFya09uY2UgKAogIHRyZWUsCiAgaW5kZXgsCiAga2V5CikgewogIG1hcmtTdGF0aWModHJlZSwgKCJfX29uY2VfXyIgKyBpbmRleCArIChrZXkgPyAoIl8iICsga2V5KSA6ICIiKSksIHRydWUpOwogIHJldHVybiB0cmVlCn0KCmZ1bmN0aW9uIG1hcmtTdGF0aWMgKAogIHRyZWUsCiAga2V5LAogIGlzT25jZQopIHsKICBpZiAoQXJyYXkuaXNBcnJheSh0cmVlKSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0cmVlW2ldICYmIHR5cGVvZiB0cmVlW2ldICE9PSAnc3RyaW5nJykgewogICAgICAgIG1hcmtTdGF0aWNOb2RlKHRyZWVbaV0sIChrZXkgKyAiXyIgKyBpKSwgaXNPbmNlKTsKICAgICAgfQogICAgfQogIH0gZWxzZSB7CiAgICBtYXJrU3RhdGljTm9kZSh0cmVlLCBrZXksIGlzT25jZSk7CiAgfQp9CgpmdW5jdGlvbiBtYXJrU3RhdGljTm9kZSAobm9kZSwga2V5LCBpc09uY2UpIHsKICBub2RlLmlzU3RhdGljID0gdHJ1ZTsKICBub2RlLmtleSA9IGtleTsKICBub2RlLmlzT25jZSA9IGlzT25jZTsKfQoKLyogICovCgpmdW5jdGlvbiBiaW5kT2JqZWN0TGlzdGVuZXJzIChkYXRhLCB2YWx1ZSkgewogIGlmICh2YWx1ZSkgewogICAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkgewogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgICAndi1vbiB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IHZhbHVlJywKICAgICAgICB0aGlzCiAgICAgICk7CiAgICB9IGVsc2UgewogICAgICB2YXIgb24gPSBkYXRhLm9uID0gZGF0YS5vbiA/IGV4dGVuZCh7fSwgZGF0YS5vbikgOiB7fTsKICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7CiAgICAgICAgdmFyIGV4aXN0aW5nID0gb25ba2V5XTsKICAgICAgICB2YXIgb3VycyA9IHZhbHVlW2tleV07CiAgICAgICAgb25ba2V5XSA9IGV4aXN0aW5nID8gW10uY29uY2F0KGV4aXN0aW5nLCBvdXJzKSA6IG91cnM7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGRhdGEKfQoKLyogICovCgpmdW5jdGlvbiBpbnN0YWxsUmVuZGVySGVscGVycyAodGFyZ2V0KSB7CiAgdGFyZ2V0Ll9vID0gbWFya09uY2U7CiAgdGFyZ2V0Ll9uID0gdG9OdW1iZXI7CiAgdGFyZ2V0Ll9zID0gdG9TdHJpbmc7CiAgdGFyZ2V0Ll9sID0gcmVuZGVyTGlzdDsKICB0YXJnZXQuX3QgPSByZW5kZXJTbG90OwogIHRhcmdldC5fcSA9IGxvb3NlRXF1YWw7CiAgdGFyZ2V0Ll9pID0gbG9vc2VJbmRleE9mOwogIHRhcmdldC5fbSA9IHJlbmRlclN0YXRpYzsKICB0YXJnZXQuX2YgPSByZXNvbHZlRmlsdGVyOwogIHRhcmdldC5fayA9IGNoZWNrS2V5Q29kZXM7CiAgdGFyZ2V0Ll9iID0gYmluZE9iamVjdFByb3BzOwogIHRhcmdldC5fdiA9IGNyZWF0ZVRleHRWTm9kZTsKICB0YXJnZXQuX2UgPSBjcmVhdGVFbXB0eVZOb2RlOwogIHRhcmdldC5fdSA9IHJlc29sdmVTY29wZWRTbG90czsKICB0YXJnZXQuX2cgPSBiaW5kT2JqZWN0TGlzdGVuZXJzOwp9CgovKiAgKi8KCmZ1bmN0aW9uIEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0ICgKICBkYXRhLAogIHByb3BzLAogIGNoaWxkcmVuLAogIHBhcmVudCwKICBDdG9yCikgewogIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zOwogIC8vIGVuc3VyZSB0aGUgY3JlYXRlRWxlbWVudCBmdW5jdGlvbiBpbiBmdW5jdGlvbmFsIGNvbXBvbmVudHMKICAvLyBnZXRzIGEgdW5pcXVlIGNvbnRleHQgLSB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgY29ycmVjdCBuYW1lZCBzbG90IGNoZWNrCiAgdmFyIGNvbnRleHRWbTsKICBpZiAoaGFzT3duKHBhcmVudCwgJ191aWQnKSkgewogICAgY29udGV4dFZtID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQpOwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICBjb250ZXh0Vm0uX29yaWdpbmFsID0gcGFyZW50OwogIH0gZWxzZSB7CiAgICAvLyB0aGUgY29udGV4dCB2bSBwYXNzZWQgaW4gaXMgYSBmdW5jdGlvbmFsIGNvbnRleHQgYXMgd2VsbC4KICAgIC8vIGluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBhcmUgYWJsZSB0byBnZXQgYSBob2xkIHRvIHRoZQogICAgLy8gcmVhbCBjb250ZXh0IGluc3RhbmNlLgogICAgY29udGV4dFZtID0gcGFyZW50OwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICBwYXJlbnQgPSBwYXJlbnQuX29yaWdpbmFsOwogIH0KICB2YXIgaXNDb21waWxlZCA9IGlzVHJ1ZShvcHRpb25zLl9jb21waWxlZCk7CiAgdmFyIG5lZWROb3JtYWxpemF0aW9uID0gIWlzQ29tcGlsZWQ7CgogIHRoaXMuZGF0YSA9IGRhdGE7CiAgdGhpcy5wcm9wcyA9IHByb3BzOwogIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICB0aGlzLmxpc3RlbmVycyA9IGRhdGEub24gfHwgZW1wdHlPYmplY3Q7CiAgdGhpcy5pbmplY3Rpb25zID0gcmVzb2x2ZUluamVjdChvcHRpb25zLmluamVjdCwgcGFyZW50KTsKICB0aGlzLnNsb3RzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzb2x2ZVNsb3RzKGNoaWxkcmVuLCBwYXJlbnQpOyB9OwoKICAvLyBzdXBwb3J0IGZvciBjb21waWxlZCBmdW5jdGlvbmFsIHRlbXBsYXRlCiAgaWYgKGlzQ29tcGlsZWQpIHsKICAgIC8vIGV4cG9zaW5nICRvcHRpb25zIGZvciByZW5kZXJTdGF0aWMoKQogICAgdGhpcy4kb3B0aW9ucyA9IG9wdGlvbnM7CiAgICAvLyBwcmUtcmVzb2x2ZSBzbG90cyBmb3IgcmVuZGVyU2xvdCgpCiAgICB0aGlzLiRzbG90cyA9IHRoaXMuc2xvdHMoKTsKICAgIHRoaXMuJHNjb3BlZFNsb3RzID0gZGF0YS5zY29wZWRTbG90cyB8fCBlbXB0eU9iamVjdDsKICB9CgogIGlmIChvcHRpb25zLl9zY29wZUlkKSB7CiAgICB0aGlzLl9jID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsKICAgICAgdmFyIHZub2RlID0gY3JlYXRlRWxlbWVudChjb250ZXh0Vm0sIGEsIGIsIGMsIGQsIG5lZWROb3JtYWxpemF0aW9uKTsKICAgICAgaWYgKHZub2RlICYmICFBcnJheS5pc0FycmF5KHZub2RlKSkgewogICAgICAgIHZub2RlLmZuU2NvcGVJZCA9IG9wdGlvbnMuX3Njb3BlSWQ7CiAgICAgICAgdm5vZGUuZm5Db250ZXh0ID0gcGFyZW50OwogICAgICB9CiAgICAgIHJldHVybiB2bm9kZQogICAgfTsKICB9IGVsc2UgewogICAgdGhpcy5fYyA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkKSB7IHJldHVybiBjcmVhdGVFbGVtZW50KGNvbnRleHRWbSwgYSwgYiwgYywgZCwgbmVlZE5vcm1hbGl6YXRpb24pOyB9OwogIH0KfQoKaW5zdGFsbFJlbmRlckhlbHBlcnMoRnVuY3Rpb25hbFJlbmRlckNvbnRleHQucHJvdG90eXBlKTsKCmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQgKAogIEN0b3IsCiAgcHJvcHNEYXRhLAogIGRhdGEsCiAgY29udGV4dFZtLAogIGNoaWxkcmVuCikgewogIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zOwogIHZhciBwcm9wcyA9IHt9OwogIHZhciBwcm9wT3B0aW9ucyA9IG9wdGlvbnMucHJvcHM7CiAgaWYgKGlzRGVmKHByb3BPcHRpb25zKSkgewogICAgZm9yICh2YXIga2V5IGluIHByb3BPcHRpb25zKSB7CiAgICAgIHByb3BzW2tleV0gPSB2YWxpZGF0ZVByb3Aoa2V5LCBwcm9wT3B0aW9ucywgcHJvcHNEYXRhIHx8IGVtcHR5T2JqZWN0KTsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKGlzRGVmKGRhdGEuYXR0cnMpKSB7IG1lcmdlUHJvcHMocHJvcHMsIGRhdGEuYXR0cnMpOyB9CiAgICBpZiAoaXNEZWYoZGF0YS5wcm9wcykpIHsgbWVyZ2VQcm9wcyhwcm9wcywgZGF0YS5wcm9wcyk7IH0KICB9CgogIHZhciByZW5kZXJDb250ZXh0ID0gbmV3IEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0KAogICAgZGF0YSwKICAgIHByb3BzLAogICAgY2hpbGRyZW4sCiAgICBjb250ZXh0Vm0sCiAgICBDdG9yCiAgKTsKCiAgdmFyIHZub2RlID0gb3B0aW9ucy5yZW5kZXIuY2FsbChudWxsLCByZW5kZXJDb250ZXh0Ll9jLCByZW5kZXJDb250ZXh0KTsKCiAgaWYgKHZub2RlIGluc3RhbmNlb2YgVk5vZGUpIHsKICAgIHJldHVybiBjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0KHZub2RlLCBkYXRhLCByZW5kZXJDb250ZXh0LnBhcmVudCwgb3B0aW9ucykKICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodm5vZGUpKSB7CiAgICB2YXIgdm5vZGVzID0gbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUpIHx8IFtdOwogICAgdmFyIHJlcyA9IG5ldyBBcnJheSh2bm9kZXMubGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdm5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc1tpXSA9IGNsb25lQW5kTWFya0Z1bmN0aW9uYWxSZXN1bHQodm5vZGVzW2ldLCBkYXRhLCByZW5kZXJDb250ZXh0LnBhcmVudCwgb3B0aW9ucyk7CiAgICB9CiAgICByZXR1cm4gcmVzCiAgfQp9CgpmdW5jdGlvbiBjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0ICh2bm9kZSwgZGF0YSwgY29udGV4dFZtLCBvcHRpb25zKSB7CiAgLy8gIzc4MTcgY2xvbmUgbm9kZSBiZWZvcmUgc2V0dGluZyBmbkNvbnRleHQsIG90aGVyd2lzZSBpZiB0aGUgbm9kZSBpcyByZXVzZWQKICAvLyAoZS5nLiBpdCB3YXMgZnJvbSBhIGNhY2hlZCBub3JtYWwgc2xvdCkgdGhlIGZuQ29udGV4dCBjYXVzZXMgbmFtZWQgc2xvdHMKICAvLyB0aGF0IHNob3VsZCBub3QgYmUgbWF0Y2hlZCB0byBtYXRjaC4KICB2YXIgY2xvbmUgPSBjbG9uZVZOb2RlKHZub2RlKTsKICBjbG9uZS5mbkNvbnRleHQgPSBjb250ZXh0Vm07CiAgY2xvbmUuZm5PcHRpb25zID0gb3B0aW9uczsKICBpZiAoZGF0YS5zbG90KSB7CiAgICAoY2xvbmUuZGF0YSB8fCAoY2xvbmUuZGF0YSA9IHt9KSkuc2xvdCA9IGRhdGEuc2xvdDsKICB9CiAgcmV0dXJuIGNsb25lCn0KCmZ1bmN0aW9uIG1lcmdlUHJvcHMgKHRvLCBmcm9tKSB7CiAgZm9yICh2YXIga2V5IGluIGZyb20pIHsKICAgIHRvW2NhbWVsaXplKGtleSldID0gZnJvbVtrZXldOwogIH0KfQoKLyogICovCgoKCgovLyBSZWdpc3RlciB0aGUgY29tcG9uZW50IGhvb2sgdG8gd2VleCBuYXRpdmUgcmVuZGVyIGVuZ2luZS4KLy8gVGhlIGhvb2sgd2lsbCBiZSB0cmlnZ2VyZWQgYnkgbmF0aXZlLCBub3QgamF2YXNjcmlwdC4KCgovLyBVcGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgY29tcG9uZW50IHRvIHdlZXggbmF0aXZlIHJlbmRlciBlbmdpbmUuCgovKiAgKi8KCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9IYW5rczEwMTAwL3dlZXgtbmF0aXZlLWRpcmVjdGl2ZS90cmVlL21hc3Rlci9jb21wb25lbnQKCi8vIGxpc3RlbmluZyBvbiBuYXRpdmUgY2FsbGJhY2sKCi8qICAqLwoKLyogICovCgovLyBpbmxpbmUgaG9va3MgdG8gYmUgaW52b2tlZCBvbiBjb21wb25lbnQgVk5vZGVzIGR1cmluZyBwYXRjaAp2YXIgY29tcG9uZW50Vk5vZGVIb29rcyA9IHsKICBpbml0OiBmdW5jdGlvbiBpbml0ICgKICAgIHZub2RlLAogICAgaHlkcmF0aW5nLAogICAgcGFyZW50RWxtLAogICAgcmVmRWxtCiAgKSB7CiAgICBpZiAoCiAgICAgIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICYmCiAgICAgICF2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQgJiYKICAgICAgdm5vZGUuZGF0YS5rZWVwQWxpdmUKICAgICkgewogICAgICAvLyBrZXB0LWFsaXZlIGNvbXBvbmVudHMsIHRyZWF0IGFzIGEgcGF0Y2gKICAgICAgdmFyIG1vdW50ZWROb2RlID0gdm5vZGU7IC8vIHdvcmsgYXJvdW5kIGZsb3cKICAgICAgY29tcG9uZW50Vk5vZGVIb29rcy5wcmVwYXRjaChtb3VudGVkTm9kZSwgbW91bnRlZE5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGNoaWxkID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZUZvclZub2RlKAogICAgICAgIHZub2RlLAogICAgICAgIGFjdGl2ZUluc3RhbmNlLAogICAgICAgIHBhcmVudEVsbSwKICAgICAgICByZWZFbG0KICAgICAgKTsKICAgICAgY2hpbGQuJG1vdW50KGh5ZHJhdGluZyA/IHZub2RlLmVsbSA6IHVuZGVmaW5lZCwgaHlkcmF0aW5nKTsKICAgIH0KICB9LAoKICBwcmVwYXRjaDogZnVuY3Rpb24gcHJlcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSkgewogICAgdmFyIG9wdGlvbnMgPSB2bm9kZS5jb21wb25lbnRPcHRpb25zOwogICAgdmFyIGNoaWxkID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBvbGRWbm9kZS5jb21wb25lbnRJbnN0YW5jZTsKICAgIHVwZGF0ZUNoaWxkQ29tcG9uZW50KAogICAgICBjaGlsZCwKICAgICAgb3B0aW9ucy5wcm9wc0RhdGEsIC8vIHVwZGF0ZWQgcHJvcHMKICAgICAgb3B0aW9ucy5saXN0ZW5lcnMsIC8vIHVwZGF0ZWQgbGlzdGVuZXJzCiAgICAgIHZub2RlLCAvLyBuZXcgcGFyZW50IHZub2RlCiAgICAgIG9wdGlvbnMuY2hpbGRyZW4gLy8gbmV3IGNoaWxkcmVuCiAgICApOwogIH0sCgogIGluc2VydDogZnVuY3Rpb24gaW5zZXJ0ICh2bm9kZSkgewogICAgdmFyIGNvbnRleHQgPSB2bm9kZS5jb250ZXh0OwogICAgdmFyIGNvbXBvbmVudEluc3RhbmNlID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2U7CiAgICBpZiAoIWNvbXBvbmVudEluc3RhbmNlLl9pc01vdW50ZWQpIHsKICAgICAgY29tcG9uZW50SW5zdGFuY2UuX2lzTW91bnRlZCA9IHRydWU7CiAgICAgIGNhbGxIb29rKGNvbXBvbmVudEluc3RhbmNlLCAnbW91bnRlZCcpOwogICAgfQogICAgaWYgKHZub2RlLmRhdGEua2VlcEFsaXZlKSB7CiAgICAgIGlmIChjb250ZXh0Ll9pc01vdW50ZWQpIHsKICAgICAgICAvLyB2dWUtcm91dGVyIzEyMTIKICAgICAgICAvLyBEdXJpbmcgdXBkYXRlcywgYSBrZXB0LWFsaXZlIGNvbXBvbmVudCdzIGNoaWxkIGNvbXBvbmVudHMgbWF5CiAgICAgICAgLy8gY2hhbmdlLCBzbyBkaXJlY3RseSB3YWxraW5nIHRoZSB0cmVlIGhlcmUgbWF5IGNhbGwgYWN0aXZhdGVkIGhvb2tzCiAgICAgICAgLy8gb24gaW5jb3JyZWN0IGNoaWxkcmVuLiBJbnN0ZWFkIHdlIHB1c2ggdGhlbSBpbnRvIGEgcXVldWUgd2hpY2ggd2lsbAogICAgICAgIC8vIGJlIHByb2Nlc3NlZCBhZnRlciB0aGUgd2hvbGUgcGF0Y2ggcHJvY2VzcyBlbmRlZC4KICAgICAgICBxdWV1ZUFjdGl2YXRlZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSwgdHJ1ZSAvKiBkaXJlY3QgKi8pOwogICAgICB9CiAgICB9CiAgfSwKCiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHsKICAgIHZhciBjb21wb25lbnRJbnN0YW5jZSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlOwogICAgaWYgKCFjb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQpIHsKICAgICAgaWYgKCF2bm9kZS5kYXRhLmtlZXBBbGl2ZSkgewogICAgICAgIGNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlLCB0cnVlIC8qIGRpcmVjdCAqLyk7CiAgICAgIH0KICAgIH0KICB9Cn07Cgp2YXIgaG9va3NUb01lcmdlID0gT2JqZWN0LmtleXMoY29tcG9uZW50Vk5vZGVIb29rcyk7CgpmdW5jdGlvbiBjcmVhdGVDb21wb25lbnQgKAogIEN0b3IsCiAgZGF0YSwKICBjb250ZXh0LAogIGNoaWxkcmVuLAogIHRhZwopIHsKICBpZiAoaXNVbmRlZihDdG9yKSkgewogICAgcmV0dXJuCiAgfQoKICB2YXIgYmFzZUN0b3IgPSBjb250ZXh0LiRvcHRpb25zLl9iYXNlOwoKICAvLyBwbGFpbiBvcHRpb25zIG9iamVjdDogdHVybiBpdCBpbnRvIGEgY29uc3RydWN0b3IKICBpZiAoaXNPYmplY3QoQ3RvcikpIHsKICAgIEN0b3IgPSBiYXNlQ3Rvci5leHRlbmQoQ3Rvcik7CiAgfQoKICAvLyBpZiBhdCB0aGlzIHN0YWdlIGl0J3Mgbm90IGEgY29uc3RydWN0b3Igb3IgYW4gYXN5bmMgY29tcG9uZW50IGZhY3RvcnksCiAgLy8gcmVqZWN0LgogIGlmICh0eXBlb2YgQ3RvciAhPT0gJ2Z1bmN0aW9uJykgewogICAgewogICAgICB3YXJuKCgiSW52YWxpZCBDb21wb25lbnQgZGVmaW5pdGlvbjogIiArIChTdHJpbmcoQ3RvcikpKSwgY29udGV4dCk7CiAgICB9CiAgICByZXR1cm4KICB9CgogIC8vIGFzeW5jIGNvbXBvbmVudAogIHZhciBhc3luY0ZhY3Rvcnk7CiAgaWYgKGlzVW5kZWYoQ3Rvci5jaWQpKSB7CiAgICBhc3luY0ZhY3RvcnkgPSBDdG9yOwogICAgQ3RvciA9IHJlc29sdmVBc3luY0NvbXBvbmVudChhc3luY0ZhY3RvcnksIGJhc2VDdG9yLCBjb250ZXh0KTsKICAgIGlmIChDdG9yID09PSB1bmRlZmluZWQpIHsKICAgICAgLy8gcmV0dXJuIGEgcGxhY2Vob2xkZXIgbm9kZSBmb3IgYXN5bmMgY29tcG9uZW50LCB3aGljaCBpcyByZW5kZXJlZAogICAgICAvLyBhcyBhIGNvbW1lbnQgbm9kZSBidXQgcHJlc2VydmVzIGFsbCB0aGUgcmF3IGluZm9ybWF0aW9uIGZvciB0aGUgbm9kZS4KICAgICAgLy8gdGhlIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBmb3IgYXN5bmMgc2VydmVyLXJlbmRlcmluZyBhbmQgaHlkcmF0aW9uLgogICAgICByZXR1cm4gY3JlYXRlQXN5bmNQbGFjZWhvbGRlcigKICAgICAgICBhc3luY0ZhY3RvcnksCiAgICAgICAgZGF0YSwKICAgICAgICBjb250ZXh0LAogICAgICAgIGNoaWxkcmVuLAogICAgICAgIHRhZwogICAgICApCiAgICB9CiAgfQoKICBkYXRhID0gZGF0YSB8fCB7fTsKCiAgLy8gcmVzb2x2ZSBjb25zdHJ1Y3RvciBvcHRpb25zIGluIGNhc2UgZ2xvYmFsIG1peGlucyBhcmUgYXBwbGllZCBhZnRlcgogIC8vIGNvbXBvbmVudCBjb25zdHJ1Y3RvciBjcmVhdGlvbgogIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvcik7CgogIC8vIHRyYW5zZm9ybSBjb21wb25lbnQgdi1tb2RlbCBkYXRhIGludG8gcHJvcHMgJiBldmVudHMKICBpZiAoaXNEZWYoZGF0YS5tb2RlbCkpIHsKICAgIHRyYW5zZm9ybU1vZGVsKEN0b3Iub3B0aW9ucywgZGF0YSk7CiAgfQoKICAvLyBleHRyYWN0IHByb3BzCiAgdmFyIHByb3BzRGF0YSA9IGV4dHJhY3RQcm9wc0Zyb21WTm9kZURhdGEoZGF0YSwgQ3RvciwgdGFnKTsKCiAgLy8gZnVuY3Rpb25hbCBjb21wb25lbnQKICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5mdW5jdGlvbmFsKSkgewogICAgcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQoQ3RvciwgcHJvcHNEYXRhLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbikKICB9CgogIC8vIGV4dHJhY3QgbGlzdGVuZXJzLCBzaW5jZSB0aGVzZSBuZWVkcyB0byBiZSB0cmVhdGVkIGFzCiAgLy8gY2hpbGQgY29tcG9uZW50IGxpc3RlbmVycyBpbnN0ZWFkIG9mIERPTSBsaXN0ZW5lcnMKICB2YXIgbGlzdGVuZXJzID0gZGF0YS5vbjsKICAvLyByZXBsYWNlIHdpdGggbGlzdGVuZXJzIHdpdGggLm5hdGl2ZSBtb2RpZmllcgogIC8vIHNvIGl0IGdldHMgcHJvY2Vzc2VkIGR1cmluZyBwYXJlbnQgY29tcG9uZW50IHBhdGNoLgogIGRhdGEub24gPSBkYXRhLm5hdGl2ZU9uOwoKICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5hYnN0cmFjdCkpIHsKICAgIC8vIGFic3RyYWN0IGNvbXBvbmVudHMgZG8gbm90IGtlZXAgYW55dGhpbmcKICAgIC8vIG90aGVyIHRoYW4gcHJvcHMgJiBsaXN0ZW5lcnMgJiBzbG90CgogICAgLy8gd29yayBhcm91bmQgZmxvdwogICAgdmFyIHNsb3QgPSBkYXRhLnNsb3Q7CiAgICBkYXRhID0ge307CiAgICBpZiAoc2xvdCkgewogICAgICBkYXRhLnNsb3QgPSBzbG90OwogICAgfQogIH0KCiAgLy8gaW5zdGFsbCBjb21wb25lbnQgbWFuYWdlbWVudCBob29rcyBvbnRvIHRoZSBwbGFjZWhvbGRlciBub2RlCiAgaW5zdGFsbENvbXBvbmVudEhvb2tzKGRhdGEpOwoKICAvLyByZXR1cm4gYSBwbGFjZWhvbGRlciB2bm9kZQogIHZhciBuYW1lID0gQ3Rvci5vcHRpb25zLm5hbWUgfHwgdGFnOwogIHZhciB2bm9kZSA9IG5ldyBWTm9kZSgKICAgICgidnVlLWNvbXBvbmVudC0iICsgKEN0b3IuY2lkKSArIChuYW1lID8gKCItIiArIG5hbWUpIDogJycpKSwKICAgIGRhdGEsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbnRleHQsCiAgICB7IEN0b3I6IEN0b3IsIHByb3BzRGF0YTogcHJvcHNEYXRhLCBsaXN0ZW5lcnM6IGxpc3RlbmVycywgdGFnOiB0YWcsIGNoaWxkcmVuOiBjaGlsZHJlbiB9LAogICAgYXN5bmNGYWN0b3J5CiAgKTsKCiAgLy8gV2VleCBzcGVjaWZpYzogaW52b2tlIHJlY3ljbGUtbGlzdCBvcHRpbWl6ZWQgQHJlbmRlciBmdW5jdGlvbiBmb3IKICAvLyBleHRyYWN0aW5nIGNlbGwtc2xvdCB0ZW1wbGF0ZS4KICAvLyBodHRwczovL2dpdGh1Yi5jb20vSGFua3MxMDEwMC93ZWV4LW5hdGl2ZS1kaXJlY3RpdmUvdHJlZS9tYXN0ZXIvY29tcG9uZW50CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgcmV0dXJuIHZub2RlCn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlRm9yVm5vZGUgKAogIHZub2RlLCAvLyB3ZSBrbm93IGl0J3MgTW91bnRlZENvbXBvbmVudFZOb2RlIGJ1dCBmbG93IGRvZXNuJ3QKICBwYXJlbnQsIC8vIGFjdGl2ZUluc3RhbmNlIGluIGxpZmVjeWNsZSBzdGF0ZQogIHBhcmVudEVsbSwKICByZWZFbG0KKSB7CiAgdmFyIG9wdGlvbnMgPSB7CiAgICBfaXNDb21wb25lbnQ6IHRydWUsCiAgICBwYXJlbnQ6IHBhcmVudCwKICAgIF9wYXJlbnRWbm9kZTogdm5vZGUsCiAgICBfcGFyZW50RWxtOiBwYXJlbnRFbG0gfHwgbnVsbCwKICAgIF9yZWZFbG06IHJlZkVsbSB8fCBudWxsCiAgfTsKICAvLyBjaGVjayBpbmxpbmUtdGVtcGxhdGUgcmVuZGVyIGZ1bmN0aW9ucwogIHZhciBpbmxpbmVUZW1wbGF0ZSA9IHZub2RlLmRhdGEuaW5saW5lVGVtcGxhdGU7CiAgaWYgKGlzRGVmKGlubGluZVRlbXBsYXRlKSkgewogICAgb3B0aW9ucy5yZW5kZXIgPSBpbmxpbmVUZW1wbGF0ZS5yZW5kZXI7CiAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IGlubGluZVRlbXBsYXRlLnN0YXRpY1JlbmRlckZuczsKICB9CiAgcmV0dXJuIG5ldyB2bm9kZS5jb21wb25lbnRPcHRpb25zLkN0b3Iob3B0aW9ucykKfQoKZnVuY3Rpb24gaW5zdGFsbENvbXBvbmVudEhvb2tzIChkYXRhKSB7CiAgdmFyIGhvb2tzID0gZGF0YS5ob29rIHx8IChkYXRhLmhvb2sgPSB7fSk7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rc1RvTWVyZ2UubGVuZ3RoOyBpKyspIHsKICAgIHZhciBrZXkgPSBob29rc1RvTWVyZ2VbaV07CiAgICBob29rc1trZXldID0gY29tcG9uZW50Vk5vZGVIb29rc1trZXldOwogIH0KfQoKLy8gdHJhbnNmb3JtIGNvbXBvbmVudCB2LW1vZGVsIGluZm8gKHZhbHVlIGFuZCBjYWxsYmFjaykgaW50bwovLyBwcm9wIGFuZCBldmVudCBoYW5kbGVyIHJlc3BlY3RpdmVseS4KZnVuY3Rpb24gdHJhbnNmb3JtTW9kZWwgKG9wdGlvbnMsIGRhdGEpIHsKICB2YXIgcHJvcCA9IChvcHRpb25zLm1vZGVsICYmIG9wdGlvbnMubW9kZWwucHJvcCkgfHwgJ3ZhbHVlJzsKICB2YXIgZXZlbnQgPSAob3B0aW9ucy5tb2RlbCAmJiBvcHRpb25zLm1vZGVsLmV2ZW50KSB8fCAnaW5wdXQnOyhkYXRhLnByb3BzIHx8IChkYXRhLnByb3BzID0ge30pKVtwcm9wXSA9IGRhdGEubW9kZWwudmFsdWU7CiAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTsKICBpZiAoaXNEZWYob25bZXZlbnRdKSkgewogICAgb25bZXZlbnRdID0gW2RhdGEubW9kZWwuY2FsbGJhY2tdLmNvbmNhdChvbltldmVudF0pOwogIH0gZWxzZSB7CiAgICBvbltldmVudF0gPSBkYXRhLm1vZGVsLmNhbGxiYWNrOwogIH0KfQoKLyogICovCgp2YXIgU0lNUExFX05PUk1BTElaRSA9IDE7CnZhciBBTFdBWVNfTk9STUFMSVpFID0gMjsKCi8vIHdyYXBwZXIgZnVuY3Rpb24gZm9yIHByb3ZpZGluZyBhIG1vcmUgZmxleGlibGUgaW50ZXJmYWNlCi8vIHdpdGhvdXQgZ2V0dGluZyB5ZWxsZWQgYXQgYnkgZmxvdwpmdW5jdGlvbiBjcmVhdGVFbGVtZW50ICgKICBjb250ZXh0LAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIG5vcm1hbGl6YXRpb25UeXBlLAogIGFsd2F5c05vcm1hbGl6ZQopIHsKICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSB8fCBpc1ByaW1pdGl2ZShkYXRhKSkgewogICAgbm9ybWFsaXphdGlvblR5cGUgPSBjaGlsZHJlbjsKICAgIGNoaWxkcmVuID0gZGF0YTsKICAgIGRhdGEgPSB1bmRlZmluZWQ7CiAgfQogIGlmIChpc1RydWUoYWx3YXlzTm9ybWFsaXplKSkgewogICAgbm9ybWFsaXphdGlvblR5cGUgPSBBTFdBWVNfTk9STUFMSVpFOwogIH0KICByZXR1cm4gX2NyZWF0ZUVsZW1lbnQoY29udGV4dCwgdGFnLCBkYXRhLCBjaGlsZHJlbiwgbm9ybWFsaXphdGlvblR5cGUpCn0KCmZ1bmN0aW9uIF9jcmVhdGVFbGVtZW50ICgKICBjb250ZXh0LAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIG5vcm1hbGl6YXRpb25UeXBlCikgewogIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZigoZGF0YSkuX19vYl9fKSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICJBdm9pZCB1c2luZyBvYnNlcnZlZCBkYXRhIG9iamVjdCBhcyB2bm9kZSBkYXRhOiAiICsgKEpTT04uc3RyaW5naWZ5KGRhdGEpKSArICJcbiIgKwogICAgICAnQWx3YXlzIGNyZWF0ZSBmcmVzaCB2bm9kZSBkYXRhIG9iamVjdHMgaW4gZWFjaCByZW5kZXIhJywKICAgICAgY29udGV4dAogICAgKTsKICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKCkKICB9CiAgLy8gb2JqZWN0IHN5bnRheCBpbiB2LWJpbmQKICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNEZWYoZGF0YS5pcykpIHsKICAgIHRhZyA9IGRhdGEuaXM7CiAgfQogIGlmICghdGFnKSB7CiAgICAvLyBpbiBjYXNlIG9mIGNvbXBvbmVudCA6aXMgc2V0IHRvIGZhbHN5IHZhbHVlCiAgICByZXR1cm4gY3JlYXRlRW1wdHlWTm9kZSgpCiAgfQogIC8vIHdhcm4gYWdhaW5zdCBub24tcHJpbWl0aXZlIGtleQogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIGlzRGVmKGRhdGEpICYmIGlzRGVmKGRhdGEua2V5KSAmJiAhaXNQcmltaXRpdmUoZGF0YS5rZXkpCiAgKSB7CiAgICB7CiAgICAgIHdhcm4oCiAgICAgICAgJ0F2b2lkIHVzaW5nIG5vbi1wcmltaXRpdmUgdmFsdWUgYXMga2V5LCAnICsKICAgICAgICAndXNlIHN0cmluZy9udW1iZXIgdmFsdWUgaW5zdGVhZC4nLAogICAgICAgIGNvbnRleHQKICAgICAgKTsKICAgIH0KICB9CiAgLy8gc3VwcG9ydCBzaW5nbGUgZnVuY3Rpb24gY2hpbGRyZW4gYXMgZGVmYXVsdCBzY29wZWQgc2xvdAogIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJgogICAgdHlwZW9mIGNoaWxkcmVuWzBdID09PSAnZnVuY3Rpb24nCiAgKSB7CiAgICBkYXRhID0gZGF0YSB8fCB7fTsKICAgIGRhdGEuc2NvcGVkU2xvdHMgPSB7IGRlZmF1bHQ6IGNoaWxkcmVuWzBdIH07CiAgICBjaGlsZHJlbi5sZW5ndGggPSAwOwogIH0KICBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IEFMV0FZU19OT1JNQUxJWkUpIHsKICAgIGNoaWxkcmVuID0gbm9ybWFsaXplQ2hpbGRyZW4oY2hpbGRyZW4pOwogIH0gZWxzZSBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IFNJTVBMRV9OT1JNQUxJWkUpIHsKICAgIGNoaWxkcmVuID0gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4oY2hpbGRyZW4pOwogIH0KICB2YXIgdm5vZGUsIG5zOwogIGlmICh0eXBlb2YgdGFnID09PSAnc3RyaW5nJykgewogICAgdmFyIEN0b3I7CiAgICBucyA9IChjb250ZXh0LiR2bm9kZSAmJiBjb250ZXh0LiR2bm9kZS5ucykgfHwgY29uZmlnLmdldFRhZ05hbWVzcGFjZSh0YWcpOwogICAgaWYgKGNvbmZpZy5pc1Jlc2VydmVkVGFnKHRhZykpIHsKICAgICAgLy8gcGxhdGZvcm0gYnVpbHQtaW4gZWxlbWVudHMKICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoCiAgICAgICAgY29uZmlnLnBhcnNlUGxhdGZvcm1UYWdOYW1lKHRhZyksIGRhdGEsIGNoaWxkcmVuLAogICAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBjb250ZXh0CiAgICAgICk7CiAgICB9IGVsc2UgaWYgKGlzRGVmKEN0b3IgPSByZXNvbHZlQXNzZXQoY29udGV4dC4kb3B0aW9ucywgJ2NvbXBvbmVudHMnLCB0YWcpKSkgewogICAgICAvLyBjb21wb25lbnQKICAgICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQoQ3RvciwgZGF0YSwgY29udGV4dCwgY2hpbGRyZW4sIHRhZyk7CiAgICB9IGVsc2UgewogICAgICAvLyB1bmtub3duIG9yIHVubGlzdGVkIG5hbWVzcGFjZWQgZWxlbWVudHMKICAgICAgLy8gY2hlY2sgYXQgcnVudGltZSBiZWNhdXNlIGl0IG1heSBnZXQgYXNzaWduZWQgYSBuYW1lc3BhY2Ugd2hlbiBpdHMKICAgICAgLy8gcGFyZW50IG5vcm1hbGl6ZXMgY2hpbGRyZW4KICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoCiAgICAgICAgdGFnLCBkYXRhLCBjaGlsZHJlbiwKICAgICAgICB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29udGV4dAogICAgICApOwogICAgfQogIH0gZWxzZSB7CiAgICAvLyBkaXJlY3QgY29tcG9uZW50IG9wdGlvbnMgLyBjb25zdHJ1Y3RvcgogICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQodGFnLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbik7CiAgfQogIGlmIChBcnJheS5pc0FycmF5KHZub2RlKSkgewogICAgcmV0dXJuIHZub2RlCiAgfSBlbHNlIGlmIChpc0RlZih2bm9kZSkpIHsKICAgIGlmIChpc0RlZihucykpIHsgYXBwbHlOUyh2bm9kZSwgbnMpOyB9CiAgICBpZiAoaXNEZWYoZGF0YSkpIHsgcmVnaXN0ZXJEZWVwQmluZGluZ3MoZGF0YSk7IH0KICAgIHJldHVybiB2bm9kZQogIH0gZWxzZSB7CiAgICByZXR1cm4gY3JlYXRlRW1wdHlWTm9kZSgpCiAgfQp9CgpmdW5jdGlvbiBhcHBseU5TICh2bm9kZSwgbnMsIGZvcmNlKSB7CiAgdm5vZGUubnMgPSBuczsKICBpZiAodm5vZGUudGFnID09PSAnZm9yZWlnbk9iamVjdCcpIHsKICAgIC8vIHVzZSBkZWZhdWx0IG5hbWVzcGFjZSBpbnNpZGUgZm9yZWlnbk9iamVjdAogICAgbnMgPSB1bmRlZmluZWQ7CiAgICBmb3JjZSA9IHRydWU7CiAgfQogIGlmIChpc0RlZih2bm9kZS5jaGlsZHJlbikpIHsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciBjaGlsZCA9IHZub2RlLmNoaWxkcmVuW2ldOwogICAgICBpZiAoaXNEZWYoY2hpbGQudGFnKSAmJiAoCiAgICAgICAgaXNVbmRlZihjaGlsZC5ucykgfHwgKGlzVHJ1ZShmb3JjZSkgJiYgY2hpbGQudGFnICE9PSAnc3ZnJykpKSB7CiAgICAgICAgYXBwbHlOUyhjaGlsZCwgbnMsIGZvcmNlKTsKICAgICAgfQogICAgfQogIH0KfQoKLy8gcmVmICM1MzE4Ci8vIG5lY2Vzc2FyeSB0byBlbnN1cmUgcGFyZW50IHJlLXJlbmRlciB3aGVuIGRlZXAgYmluZGluZ3MgbGlrZSA6c3R5bGUgYW5kCi8vIDpjbGFzcyBhcmUgdXNlZCBvbiBzbG90IG5vZGVzCmZ1bmN0aW9uIHJlZ2lzdGVyRGVlcEJpbmRpbmdzIChkYXRhKSB7CiAgaWYgKGlzT2JqZWN0KGRhdGEuc3R5bGUpKSB7CiAgICB0cmF2ZXJzZShkYXRhLnN0eWxlKTsKICB9CiAgaWYgKGlzT2JqZWN0KGRhdGEuY2xhc3MpKSB7CiAgICB0cmF2ZXJzZShkYXRhLmNsYXNzKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdFJlbmRlciAodm0pIHsKICB2bS5fdm5vZGUgPSBudWxsOyAvLyB0aGUgcm9vdCBvZiB0aGUgY2hpbGQgdHJlZQogIHZtLl9zdGF0aWNUcmVlcyA9IG51bGw7IC8vIHYtb25jZSBjYWNoZWQgdHJlZXMKICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zOwogIHZhciBwYXJlbnRWbm9kZSA9IHZtLiR2bm9kZSA9IG9wdGlvbnMuX3BhcmVudFZub2RlOyAvLyB0aGUgcGxhY2Vob2xkZXIgbm9kZSBpbiBwYXJlbnQgdHJlZQogIHZhciByZW5kZXJDb250ZXh0ID0gcGFyZW50Vm5vZGUgJiYgcGFyZW50Vm5vZGUuY29udGV4dDsKICB2bS4kc2xvdHMgPSByZXNvbHZlU2xvdHMob3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4sIHJlbmRlckNvbnRleHQpOwogIHZtLiRzY29wZWRTbG90cyA9IGVtcHR5T2JqZWN0OwogIC8vIGJpbmQgdGhlIGNyZWF0ZUVsZW1lbnQgZm4gdG8gdGhpcyBpbnN0YW5jZQogIC8vIHNvIHRoYXQgd2UgZ2V0IHByb3BlciByZW5kZXIgY29udGV4dCBpbnNpZGUgaXQuCiAgLy8gYXJncyBvcmRlcjogdGFnLCBkYXRhLCBjaGlsZHJlbiwgbm9ybWFsaXphdGlvblR5cGUsIGFsd2F5c05vcm1hbGl6ZQogIC8vIGludGVybmFsIHZlcnNpb24gaXMgdXNlZCBieSByZW5kZXIgZnVuY3Rpb25zIGNvbXBpbGVkIGZyb20gdGVtcGxhdGVzCiAgdm0uX2MgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCkgeyByZXR1cm4gY3JlYXRlRWxlbWVudCh2bSwgYSwgYiwgYywgZCwgZmFsc2UpOyB9OwogIC8vIG5vcm1hbGl6YXRpb24gaXMgYWx3YXlzIGFwcGxpZWQgZm9yIHRoZSBwdWJsaWMgdmVyc2lvbiwgdXNlZCBpbgogIC8vIHVzZXItd3JpdHRlbiByZW5kZXIgZnVuY3Rpb25zLgogIHZtLiRjcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsgcmV0dXJuIGNyZWF0ZUVsZW1lbnQodm0sIGEsIGIsIGMsIGQsIHRydWUpOyB9OwoKICAvLyAkYXR0cnMgJiAkbGlzdGVuZXJzIGFyZSBleHBvc2VkIGZvciBlYXNpZXIgSE9DIGNyZWF0aW9uLgogIC8vIHRoZXkgbmVlZCB0byBiZSByZWFjdGl2ZSBzbyB0aGF0IEhPQ3MgdXNpbmcgdGhlbSBhcmUgYWx3YXlzIHVwZGF0ZWQKICB2YXIgcGFyZW50RGF0YSA9IHBhcmVudFZub2RlICYmIHBhcmVudFZub2RlLmRhdGE7CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgewogICAgZGVmaW5lUmVhY3RpdmUodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICYmIHBhcmVudERhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3QsIGZ1bmN0aW9uICgpIHsKICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKCIkYXR0cnMgaXMgcmVhZG9ubHkuIiwgdm0pOwogICAgfSwgdHJ1ZSk7CiAgICBkZWZpbmVSZWFjdGl2ZSh2bSwgJyRsaXN0ZW5lcnMnLCBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3QsIGZ1bmN0aW9uICgpIHsKICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKCIkbGlzdGVuZXJzIGlzIHJlYWRvbmx5LiIsIHZtKTsKICAgIH0sIHRydWUpOwogIH0KfQoKZnVuY3Rpb24gcmVuZGVyTWl4aW4gKFZ1ZSkgewogIC8vIGluc3RhbGwgcnVudGltZSBjb252ZW5pZW5jZSBoZWxwZXJzCiAgaW5zdGFsbFJlbmRlckhlbHBlcnMoVnVlLnByb3RvdHlwZSk7CgogIFZ1ZS5wcm90b3R5cGUuJG5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7CiAgICByZXR1cm4gbmV4dFRpY2soZm4sIHRoaXMpCiAgfTsKCiAgVnVlLnByb3RvdHlwZS5fcmVuZGVyID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHZtID0gdGhpczsKICAgIHZhciByZWYgPSB2bS4kb3B0aW9uczsKICAgIHZhciByZW5kZXIgPSByZWYucmVuZGVyOwogICAgdmFyIF9wYXJlbnRWbm9kZSA9IHJlZi5fcGFyZW50Vm5vZGU7CgogICAgLy8gcmVzZXQgX3JlbmRlcmVkIGZsYWcgb24gc2xvdHMgZm9yIGR1cGxpY2F0ZSBzbG90IGNoZWNrCiAgICB7CiAgICAgIGZvciAodmFyIGtleSBpbiB2bS4kc2xvdHMpIHsKICAgICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgICAgICB2bS4kc2xvdHNba2V5XS5fcmVuZGVyZWQgPSBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIGlmIChfcGFyZW50Vm5vZGUpIHsKICAgICAgdm0uJHNjb3BlZFNsb3RzID0gX3BhcmVudFZub2RlLmRhdGEuc2NvcGVkU2xvdHMgfHwgZW1wdHlPYmplY3Q7CiAgICB9CgogICAgLy8gc2V0IHBhcmVudCB2bm9kZS4gdGhpcyBhbGxvd3MgcmVuZGVyIGZ1bmN0aW9ucyB0byBoYXZlIGFjY2VzcwogICAgLy8gdG8gdGhlIGRhdGEgb24gdGhlIHBsYWNlaG9sZGVyIG5vZGUuCiAgICB2bS4kdm5vZGUgPSBfcGFyZW50Vm5vZGU7CiAgICAvLyByZW5kZXIgc2VsZgogICAgdmFyIHZub2RlOwogICAgdHJ5IHsKICAgICAgdm5vZGUgPSByZW5kZXIuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICJyZW5kZXIiKTsKICAgICAgLy8gcmV0dXJuIGVycm9yIHJlbmRlciByZXN1bHQsCiAgICAgIC8vIG9yIHByZXZpb3VzIHZub2RlIHRvIHByZXZlbnQgcmVuZGVyIGVycm9yIGNhdXNpbmcgYmxhbmsgY29tcG9uZW50CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgICAgIHsKICAgICAgICBpZiAodm0uJG9wdGlvbnMucmVuZGVyRXJyb3IpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHZub2RlID0gdm0uJG9wdGlvbnMucmVuZGVyRXJyb3IuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50LCBlKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICJyZW5kZXJFcnJvciIpOwogICAgICAgICAgICB2bm9kZSA9IHZtLl92bm9kZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdm5vZGUgPSB2bS5fdm5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvLyByZXR1cm4gZW1wdHkgdm5vZGUgaW4gY2FzZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIGVycm9yZWQgb3V0CiAgICBpZiAoISh2bm9kZSBpbnN0YW5jZW9mIFZOb2RlKSkgewogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIEFycmF5LmlzQXJyYXkodm5vZGUpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdNdWx0aXBsZSByb290IG5vZGVzIHJldHVybmVkIGZyb20gcmVuZGVyIGZ1bmN0aW9uLiBSZW5kZXIgZnVuY3Rpb24gJyArCiAgICAgICAgICAnc2hvdWxkIHJldHVybiBhIHNpbmdsZSByb290IG5vZGUuJywKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgICB2bm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTsKICAgIH0KICAgIC8vIHNldCBwYXJlbnQKICAgIHZub2RlLnBhcmVudCA9IF9wYXJlbnRWbm9kZTsKICAgIHJldHVybiB2bm9kZQogIH07Cn0KCi8qICAqLwoKdmFyIHVpZCQzID0gMDsKCmZ1bmN0aW9uIGluaXRNaXhpbiAoVnVlKSB7CiAgVnVlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgLy8gYSB1aWQKICAgIHZtLl91aWQgPSB1aWQkMysrOwoKICAgIHZhciBzdGFydFRhZywgZW5kVGFnOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNvbmZpZy5wZXJmb3JtYW5jZSAmJiBtYXJrKSB7CiAgICAgIHN0YXJ0VGFnID0gInZ1ZS1wZXJmLXN0YXJ0OiIgKyAodm0uX3VpZCk7CiAgICAgIGVuZFRhZyA9ICJ2dWUtcGVyZi1lbmQ6IiArICh2bS5fdWlkKTsKICAgICAgbWFyayhzdGFydFRhZyk7CiAgICB9CgogICAgLy8gYSBmbGFnIHRvIGF2b2lkIHRoaXMgYmVpbmcgb2JzZXJ2ZWQKICAgIHZtLl9pc1Z1ZSA9IHRydWU7CiAgICAvLyBtZXJnZSBvcHRpb25zCiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLl9pc0NvbXBvbmVudCkgewogICAgICAvLyBvcHRpbWl6ZSBpbnRlcm5hbCBjb21wb25lbnQgaW5zdGFudGlhdGlvbgogICAgICAvLyBzaW5jZSBkeW5hbWljIG9wdGlvbnMgbWVyZ2luZyBpcyBwcmV0dHkgc2xvdywgYW5kIG5vbmUgb2YgdGhlCiAgICAgIC8vIGludGVybmFsIGNvbXBvbmVudCBvcHRpb25zIG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50LgogICAgICBpbml0SW50ZXJuYWxDb21wb25lbnQodm0sIG9wdGlvbnMpOwogICAgfSBlbHNlIHsKICAgICAgdm0uJG9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoCiAgICAgICAgcmVzb2x2ZUNvbnN0cnVjdG9yT3B0aW9ucyh2bS5jb25zdHJ1Y3RvciksCiAgICAgICAgb3B0aW9ucyB8fCB7fSwKICAgICAgICB2bQogICAgICApOwogICAgfQogICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgIHsKICAgICAgaW5pdFByb3h5KHZtKTsKICAgIH0KICAgIC8vIGV4cG9zZSByZWFsIHNlbGYKICAgIHZtLl9zZWxmID0gdm07CiAgICBpbml0TGlmZWN5Y2xlKHZtKTsKICAgIGluaXRFdmVudHModm0pOwogICAgaW5pdFJlbmRlcih2bSk7CiAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZUNyZWF0ZScpOwogICAgaW5pdEluamVjdGlvbnModm0pOyAvLyByZXNvbHZlIGluamVjdGlvbnMgYmVmb3JlIGRhdGEvcHJvcHMKICAgIGluaXRTdGF0ZSh2bSk7CiAgICBpbml0UHJvdmlkZSh2bSk7IC8vIHJlc29sdmUgcHJvdmlkZSBhZnRlciBkYXRhL3Byb3BzCiAgICBjYWxsSG9vayh2bSwgJ2NyZWF0ZWQnKTsKCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHsKICAgICAgdm0uX25hbWUgPSBmb3JtYXRDb21wb25lbnROYW1lKHZtLCBmYWxzZSk7CiAgICAgIG1hcmsoZW5kVGFnKTsKICAgICAgbWVhc3VyZSgoInZ1ZSAiICsgKHZtLl9uYW1lKSArICIgaW5pdCIpLCBzdGFydFRhZywgZW5kVGFnKTsKICAgIH0KCiAgICBpZiAodm0uJG9wdGlvbnMuZWwpIHsKICAgICAgdm0uJG1vdW50KHZtLiRvcHRpb25zLmVsKTsKICAgIH0KICB9Owp9CgpmdW5jdGlvbiBpbml0SW50ZXJuYWxDb21wb25lbnQgKHZtLCBvcHRpb25zKSB7CiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9ucyA9IE9iamVjdC5jcmVhdGUodm0uY29uc3RydWN0b3Iub3B0aW9ucyk7CiAgLy8gZG9pbmcgdGhpcyBiZWNhdXNlIGl0J3MgZmFzdGVyIHRoYW4gZHluYW1pYyBlbnVtZXJhdGlvbi4KICB2YXIgcGFyZW50Vm5vZGUgPSBvcHRpb25zLl9wYXJlbnRWbm9kZTsKICBvcHRzLnBhcmVudCA9IG9wdGlvbnMucGFyZW50OwogIG9wdHMuX3BhcmVudFZub2RlID0gcGFyZW50Vm5vZGU7CiAgb3B0cy5fcGFyZW50RWxtID0gb3B0aW9ucy5fcGFyZW50RWxtOwogIG9wdHMuX3JlZkVsbSA9IG9wdGlvbnMuX3JlZkVsbTsKCiAgdmFyIHZub2RlQ29tcG9uZW50T3B0aW9ucyA9IHBhcmVudFZub2RlLmNvbXBvbmVudE9wdGlvbnM7CiAgb3B0cy5wcm9wc0RhdGEgPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMucHJvcHNEYXRhOwogIG9wdHMuX3BhcmVudExpc3RlbmVycyA9IHZub2RlQ29tcG9uZW50T3B0aW9ucy5saXN0ZW5lcnM7CiAgb3B0cy5fcmVuZGVyQ2hpbGRyZW4gPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMuY2hpbGRyZW47CiAgb3B0cy5fY29tcG9uZW50VGFnID0gdm5vZGVDb21wb25lbnRPcHRpb25zLnRhZzsKCiAgaWYgKG9wdGlvbnMucmVuZGVyKSB7CiAgICBvcHRzLnJlbmRlciA9IG9wdGlvbnMucmVuZGVyOwogICAgb3B0cy5zdGF0aWNSZW5kZXJGbnMgPSBvcHRpb25zLnN0YXRpY1JlbmRlckZuczsKICB9Cn0KCmZ1bmN0aW9uIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMgKEN0b3IpIHsKICB2YXIgb3B0aW9ucyA9IEN0b3Iub3B0aW9uczsKICBpZiAoQ3Rvci5zdXBlcikgewogICAgdmFyIHN1cGVyT3B0aW9ucyA9IHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvci5zdXBlcik7CiAgICB2YXIgY2FjaGVkU3VwZXJPcHRpb25zID0gQ3Rvci5zdXBlck9wdGlvbnM7CiAgICBpZiAoc3VwZXJPcHRpb25zICE9PSBjYWNoZWRTdXBlck9wdGlvbnMpIHsKICAgICAgLy8gc3VwZXIgb3B0aW9uIGNoYW5nZWQsCiAgICAgIC8vIG5lZWQgdG8gcmVzb2x2ZSBuZXcgb3B0aW9ucy4KICAgICAgQ3Rvci5zdXBlck9wdGlvbnMgPSBzdXBlck9wdGlvbnM7CiAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgbGF0ZS1tb2RpZmllZC9hdHRhY2hlZCBvcHRpb25zICgjNDk3NikKICAgICAgdmFyIG1vZGlmaWVkT3B0aW9ucyA9IHJlc29sdmVNb2RpZmllZE9wdGlvbnMoQ3Rvcik7CiAgICAgIC8vIHVwZGF0ZSBiYXNlIGV4dGVuZCBvcHRpb25zCiAgICAgIGlmIChtb2RpZmllZE9wdGlvbnMpIHsKICAgICAgICBleHRlbmQoQ3Rvci5leHRlbmRPcHRpb25zLCBtb2RpZmllZE9wdGlvbnMpOwogICAgICB9CiAgICAgIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoc3VwZXJPcHRpb25zLCBDdG9yLmV4dGVuZE9wdGlvbnMpOwogICAgICBpZiAob3B0aW9ucy5uYW1lKSB7CiAgICAgICAgb3B0aW9ucy5jb21wb25lbnRzW29wdGlvbnMubmFtZV0gPSBDdG9yOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBvcHRpb25zCn0KCmZ1bmN0aW9uIHJlc29sdmVNb2RpZmllZE9wdGlvbnMgKEN0b3IpIHsKICB2YXIgbW9kaWZpZWQ7CiAgdmFyIGxhdGVzdCA9IEN0b3Iub3B0aW9uczsKICB2YXIgZXh0ZW5kZWQgPSBDdG9yLmV4dGVuZE9wdGlvbnM7CiAgdmFyIHNlYWxlZCA9IEN0b3Iuc2VhbGVkT3B0aW9uczsKICBmb3IgKHZhciBrZXkgaW4gbGF0ZXN0KSB7CiAgICBpZiAobGF0ZXN0W2tleV0gIT09IHNlYWxlZFtrZXldKSB7CiAgICAgIGlmICghbW9kaWZpZWQpIHsgbW9kaWZpZWQgPSB7fTsgfQogICAgICBtb2RpZmllZFtrZXldID0gZGVkdXBlKGxhdGVzdFtrZXldLCBleHRlbmRlZFtrZXldLCBzZWFsZWRba2V5XSk7CiAgICB9CiAgfQogIHJldHVybiBtb2RpZmllZAp9CgpmdW5jdGlvbiBkZWR1cGUgKGxhdGVzdCwgZXh0ZW5kZWQsIHNlYWxlZCkgewogIC8vIGNvbXBhcmUgbGF0ZXN0IGFuZCBzZWFsZWQgdG8gZW5zdXJlIGxpZmVjeWNsZSBob29rcyB3b24ndCBiZSBkdXBsaWNhdGVkCiAgLy8gYmV0d2VlbiBtZXJnZXMKICBpZiAoQXJyYXkuaXNBcnJheShsYXRlc3QpKSB7CiAgICB2YXIgcmVzID0gW107CiAgICBzZWFsZWQgPSBBcnJheS5pc0FycmF5KHNlYWxlZCkgPyBzZWFsZWQgOiBbc2VhbGVkXTsKICAgIGV4dGVuZGVkID0gQXJyYXkuaXNBcnJheShleHRlbmRlZCkgPyBleHRlbmRlZCA6IFtleHRlbmRlZF07CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhdGVzdC5sZW5ndGg7IGkrKykgewogICAgICAvLyBwdXNoIG9yaWdpbmFsIG9wdGlvbnMgYW5kIG5vdCBzZWFsZWQgb3B0aW9ucyB0byBleGNsdWRlIGR1cGxpY2F0ZWQgb3B0aW9ucwogICAgICBpZiAoZXh0ZW5kZWQuaW5kZXhPZihsYXRlc3RbaV0pID49IDAgfHwgc2VhbGVkLmluZGV4T2YobGF0ZXN0W2ldKSA8IDApIHsKICAgICAgICByZXMucHVzaChsYXRlc3RbaV0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzCiAgfSBlbHNlIHsKICAgIHJldHVybiBsYXRlc3QKICB9Cn0KCmZ1bmN0aW9uIFZ1ZSAob3B0aW9ucykgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICEodGhpcyBpbnN0YW5jZW9mIFZ1ZSkKICApIHsKICAgIHdhcm4oJ1Z1ZSBpcyBhIGNvbnN0cnVjdG9yIGFuZCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGBuZXdgIGtleXdvcmQnKTsKICB9CiAgdGhpcy5faW5pdChvcHRpb25zKTsKfQoKaW5pdE1peGluKFZ1ZSk7CnN0YXRlTWl4aW4oVnVlKTsKZXZlbnRzTWl4aW4oVnVlKTsKbGlmZWN5Y2xlTWl4aW4oVnVlKTsKcmVuZGVyTWl4aW4oVnVlKTsKCi8qICAqLwoKZnVuY3Rpb24gaW5pdFVzZSAoVnVlKSB7CiAgVnVlLnVzZSA9IGZ1bmN0aW9uIChwbHVnaW4pIHsKICAgIHZhciBpbnN0YWxsZWRQbHVnaW5zID0gKHRoaXMuX2luc3RhbGxlZFBsdWdpbnMgfHwgKHRoaXMuX2luc3RhbGxlZFBsdWdpbnMgPSBbXSkpOwogICAgaWYgKGluc3RhbGxlZFBsdWdpbnMuaW5kZXhPZihwbHVnaW4pID4gLTEpIHsKICAgICAgcmV0dXJuIHRoaXMKICAgIH0KCiAgICAvLyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMKICAgIHZhciBhcmdzID0gdG9BcnJheShhcmd1bWVudHMsIDEpOwogICAgYXJncy51bnNoaWZ0KHRoaXMpOwogICAgaWYgKHR5cGVvZiBwbHVnaW4uaW5zdGFsbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBwbHVnaW4uaW5zdGFsbC5hcHBseShwbHVnaW4sIGFyZ3MpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgcGx1Z2luID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHBsdWdpbi5hcHBseShudWxsLCBhcmdzKTsKICAgIH0KICAgIGluc3RhbGxlZFBsdWdpbnMucHVzaChwbHVnaW4pOwogICAgcmV0dXJuIHRoaXMKICB9Owp9CgovKiAgKi8KCmZ1bmN0aW9uIGluaXRNaXhpbiQxIChWdWUpIHsKICBWdWUubWl4aW4gPSBmdW5jdGlvbiAobWl4aW4pIHsKICAgIHRoaXMub3B0aW9ucyA9IG1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsIG1peGluKTsKICAgIHJldHVybiB0aGlzCiAgfTsKfQoKLyogICovCgpmdW5jdGlvbiBpbml0RXh0ZW5kIChWdWUpIHsKICAvKioKICAgKiBFYWNoIGluc3RhbmNlIGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcgVnVlLCBoYXMgYSB1bmlxdWUKICAgKiBjaWQuIFRoaXMgZW5hYmxlcyB1cyB0byBjcmVhdGUgd3JhcHBlZCAiY2hpbGQKICAgKiBjb25zdHJ1Y3RvcnMiIGZvciBwcm90b3R5cGFsIGluaGVyaXRhbmNlIGFuZCBjYWNoZSB0aGVtLgogICAqLwogIFZ1ZS5jaWQgPSAwOwogIHZhciBjaWQgPSAxOwoKICAvKioKICAgKiBDbGFzcyBpbmhlcml0YW5jZQogICAqLwogIFZ1ZS5leHRlbmQgPSBmdW5jdGlvbiAoZXh0ZW5kT3B0aW9ucykgewogICAgZXh0ZW5kT3B0aW9ucyA9IGV4dGVuZE9wdGlvbnMgfHwge307CiAgICB2YXIgU3VwZXIgPSB0aGlzOwogICAgdmFyIFN1cGVySWQgPSBTdXBlci5jaWQ7CiAgICB2YXIgY2FjaGVkQ3RvcnMgPSBleHRlbmRPcHRpb25zLl9DdG9yIHx8IChleHRlbmRPcHRpb25zLl9DdG9yID0ge30pOwogICAgaWYgKGNhY2hlZEN0b3JzW1N1cGVySWRdKSB7CiAgICAgIHJldHVybiBjYWNoZWRDdG9yc1tTdXBlcklkXQogICAgfQoKICAgIHZhciBuYW1lID0gZXh0ZW5kT3B0aW9ucy5uYW1lIHx8IFN1cGVyLm9wdGlvbnMubmFtZTsKICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgbmFtZSkgewogICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUobmFtZSk7CiAgICB9CgogICAgdmFyIFN1YiA9IGZ1bmN0aW9uIFZ1ZUNvbXBvbmVudCAob3B0aW9ucykgewogICAgICB0aGlzLl9pbml0KG9wdGlvbnMpOwogICAgfTsKICAgIFN1Yi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN1cGVyLnByb3RvdHlwZSk7CiAgICBTdWIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ViOwogICAgU3ViLmNpZCA9IGNpZCsrOwogICAgU3ViLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoCiAgICAgIFN1cGVyLm9wdGlvbnMsCiAgICAgIGV4dGVuZE9wdGlvbnMKICAgICk7CiAgICBTdWJbJ3N1cGVyJ10gPSBTdXBlcjsKCiAgICAvLyBGb3IgcHJvcHMgYW5kIGNvbXB1dGVkIHByb3BlcnRpZXMsIHdlIGRlZmluZSB0aGUgcHJveHkgZ2V0dGVycyBvbgogICAgLy8gdGhlIFZ1ZSBpbnN0YW5jZXMgYXQgZXh0ZW5zaW9uIHRpbWUsIG9uIHRoZSBleHRlbmRlZCBwcm90b3R5cGUuIFRoaXMKICAgIC8vIGF2b2lkcyBPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbHMgZm9yIGVhY2ggaW5zdGFuY2UgY3JlYXRlZC4KICAgIGlmIChTdWIub3B0aW9ucy5wcm9wcykgewogICAgICBpbml0UHJvcHMkMShTdWIpOwogICAgfQogICAgaWYgKFN1Yi5vcHRpb25zLmNvbXB1dGVkKSB7CiAgICAgIGluaXRDb21wdXRlZCQxKFN1Yik7CiAgICB9CgogICAgLy8gYWxsb3cgZnVydGhlciBleHRlbnNpb24vbWl4aW4vcGx1Z2luIHVzYWdlCiAgICBTdWIuZXh0ZW5kID0gU3VwZXIuZXh0ZW5kOwogICAgU3ViLm1peGluID0gU3VwZXIubWl4aW47CiAgICBTdWIudXNlID0gU3VwZXIudXNlOwoKICAgIC8vIGNyZWF0ZSBhc3NldCByZWdpc3RlcnMsIHNvIGV4dGVuZGVkIGNsYXNzZXMKICAgIC8vIGNhbiBoYXZlIHRoZWlyIHByaXZhdGUgYXNzZXRzIHRvby4KICAgIEFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsKICAgICAgU3ViW3R5cGVdID0gU3VwZXJbdHlwZV07CiAgICB9KTsKICAgIC8vIGVuYWJsZSByZWN1cnNpdmUgc2VsZi1sb29rdXAKICAgIGlmIChuYW1lKSB7CiAgICAgIFN1Yi5vcHRpb25zLmNvbXBvbmVudHNbbmFtZV0gPSBTdWI7CiAgICB9CgogICAgLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgc3VwZXIgb3B0aW9ucyBhdCBleHRlbnNpb24gdGltZS4KICAgIC8vIGxhdGVyIGF0IGluc3RhbnRpYXRpb24gd2UgY2FuIGNoZWNrIGlmIFN1cGVyJ3Mgb3B0aW9ucyBoYXZlCiAgICAvLyBiZWVuIHVwZGF0ZWQuCiAgICBTdWIuc3VwZXJPcHRpb25zID0gU3VwZXIub3B0aW9uczsKICAgIFN1Yi5leHRlbmRPcHRpb25zID0gZXh0ZW5kT3B0aW9uczsKICAgIFN1Yi5zZWFsZWRPcHRpb25zID0gZXh0ZW5kKHt9LCBTdWIub3B0aW9ucyk7CgogICAgLy8gY2FjaGUgY29uc3RydWN0b3IKICAgIGNhY2hlZEN0b3JzW1N1cGVySWRdID0gU3ViOwogICAgcmV0dXJuIFN1YgogIH07Cn0KCmZ1bmN0aW9uIGluaXRQcm9wcyQxIChDb21wKSB7CiAgdmFyIHByb3BzID0gQ29tcC5vcHRpb25zLnByb3BzOwogIGZvciAodmFyIGtleSBpbiBwcm9wcykgewogICAgcHJveHkoQ29tcC5wcm90b3R5cGUsICJfcHJvcHMiLCBrZXkpOwogIH0KfQoKZnVuY3Rpb24gaW5pdENvbXB1dGVkJDEgKENvbXApIHsKICB2YXIgY29tcHV0ZWQgPSBDb21wLm9wdGlvbnMuY29tcHV0ZWQ7CiAgZm9yICh2YXIga2V5IGluIGNvbXB1dGVkKSB7CiAgICBkZWZpbmVDb21wdXRlZChDb21wLnByb3RvdHlwZSwga2V5LCBjb21wdXRlZFtrZXldKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdEFzc2V0UmVnaXN0ZXJzIChWdWUpIHsKICAvKioKICAgKiBDcmVhdGUgYXNzZXQgcmVnaXN0cmF0aW9uIG1ldGhvZHMuCiAgICovCiAgQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkgewogICAgVnVlW3R5cGVdID0gZnVuY3Rpb24gKAogICAgICBpZCwKICAgICAgZGVmaW5pdGlvbgogICAgKSB7CiAgICAgIGlmICghZGVmaW5pdGlvbikgewogICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNbdHlwZSArICdzJ11baWRdCiAgICAgIH0gZWxzZSB7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlID09PSAnY29tcG9uZW50JykgewogICAgICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGlkKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGUgPT09ICdjb21wb25lbnQnICYmIGlzUGxhaW5PYmplY3QoZGVmaW5pdGlvbikpIHsKICAgICAgICAgIGRlZmluaXRpb24ubmFtZSA9IGRlZmluaXRpb24ubmFtZSB8fCBpZDsKICAgICAgICAgIGRlZmluaXRpb24gPSB0aGlzLm9wdGlvbnMuX2Jhc2UuZXh0ZW5kKGRlZmluaXRpb24pOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZSA9PT0gJ2RpcmVjdGl2ZScgJiYgdHlwZW9mIGRlZmluaXRpb24gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIGRlZmluaXRpb24gPSB7IGJpbmQ6IGRlZmluaXRpb24sIHVwZGF0ZTogZGVmaW5pdGlvbiB9OwogICAgICAgIH0KICAgICAgICB0aGlzLm9wdGlvbnNbdHlwZSArICdzJ11baWRdID0gZGVmaW5pdGlvbjsKICAgICAgICByZXR1cm4gZGVmaW5pdGlvbgogICAgICB9CiAgICB9OwogIH0pOwp9CgovKiAgKi8KCmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWUgKG9wdHMpIHsKICByZXR1cm4gb3B0cyAmJiAob3B0cy5DdG9yLm9wdGlvbnMubmFtZSB8fCBvcHRzLnRhZykKfQoKZnVuY3Rpb24gbWF0Y2hlcyAocGF0dGVybiwgbmFtZSkgewogIGlmIChBcnJheS5pc0FycmF5KHBhdHRlcm4pKSB7CiAgICByZXR1cm4gcGF0dGVybi5pbmRleE9mKG5hbWUpID4gLTEKICB9IGVsc2UgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykgewogICAgcmV0dXJuIHBhdHRlcm4uc3BsaXQoJywnKS5pbmRleE9mKG5hbWUpID4gLTEKICB9IGVsc2UgaWYgKGlzUmVnRXhwKHBhdHRlcm4pKSB7CiAgICByZXR1cm4gcGF0dGVybi50ZXN0KG5hbWUpCiAgfQogIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgcmV0dXJuIGZhbHNlCn0KCmZ1bmN0aW9uIHBydW5lQ2FjaGUgKGtlZXBBbGl2ZUluc3RhbmNlLCBmaWx0ZXIpIHsKICB2YXIgY2FjaGUgPSBrZWVwQWxpdmVJbnN0YW5jZS5jYWNoZTsKICB2YXIga2V5cyA9IGtlZXBBbGl2ZUluc3RhbmNlLmtleXM7CiAgdmFyIF92bm9kZSA9IGtlZXBBbGl2ZUluc3RhbmNlLl92bm9kZTsKICBmb3IgKHZhciBrZXkgaW4gY2FjaGUpIHsKICAgIHZhciBjYWNoZWROb2RlID0gY2FjaGVba2V5XTsKICAgIGlmIChjYWNoZWROb2RlKSB7CiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjYWNoZWROb2RlLmNvbXBvbmVudE9wdGlvbnMpOwogICAgICBpZiAobmFtZSAmJiAhZmlsdGVyKG5hbWUpKSB7CiAgICAgICAgcHJ1bmVDYWNoZUVudHJ5KGNhY2hlLCBrZXksIGtleXMsIF92bm9kZSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIHBydW5lQ2FjaGVFbnRyeSAoCiAgY2FjaGUsCiAga2V5LAogIGtleXMsCiAgY3VycmVudAopIHsKICB2YXIgY2FjaGVkJCQxID0gY2FjaGVba2V5XTsKICBpZiAoY2FjaGVkJCQxICYmICghY3VycmVudCB8fCBjYWNoZWQkJDEudGFnICE9PSBjdXJyZW50LnRhZykpIHsKICAgIGNhY2hlZCQkMS5jb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpOwogIH0KICBjYWNoZVtrZXldID0gbnVsbDsKICByZW1vdmUoa2V5cywga2V5KTsKfQoKdmFyIHBhdHRlcm5UeXBlcyA9IFtTdHJpbmcsIFJlZ0V4cCwgQXJyYXldOwoKdmFyIEtlZXBBbGl2ZSA9IHsKICBuYW1lOiAna2VlcC1hbGl2ZScsCiAgYWJzdHJhY3Q6IHRydWUsCgogIHByb3BzOiB7CiAgICBpbmNsdWRlOiBwYXR0ZXJuVHlwZXMsCiAgICBleGNsdWRlOiBwYXR0ZXJuVHlwZXMsCiAgICBtYXg6IFtTdHJpbmcsIE51bWJlcl0KICB9LAoKICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkICgpIHsKICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGhpcy5rZXlzID0gW107CiAgfSwKCiAgZGVzdHJveWVkOiBmdW5jdGlvbiBkZXN0cm95ZWQgKCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgZm9yICh2YXIga2V5IGluIHRoaXMkMS5jYWNoZSkgewogICAgICBwcnVuZUNhY2hlRW50cnkodGhpcyQxLmNhY2hlLCBrZXksIHRoaXMkMS5rZXlzKTsKICAgIH0KICB9LAoKICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkICgpIHsKICAgIHZhciB0aGlzJDEgPSB0aGlzOwoKICAgIHRoaXMuJHdhdGNoKCdpbmNsdWRlJywgZnVuY3Rpb24gKHZhbCkgewogICAgICBwcnVuZUNhY2hlKHRoaXMkMSwgZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIG1hdGNoZXModmFsLCBuYW1lKTsgfSk7CiAgICB9KTsKICAgIHRoaXMuJHdhdGNoKCdleGNsdWRlJywgZnVuY3Rpb24gKHZhbCkgewogICAgICBwcnVuZUNhY2hlKHRoaXMkMSwgZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuICFtYXRjaGVzKHZhbCwgbmFtZSk7IH0pOwogICAgfSk7CiAgfSwKCiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKCkgewogICAgdmFyIHNsb3QgPSB0aGlzLiRzbG90cy5kZWZhdWx0OwogICAgdmFyIHZub2RlID0gZ2V0Rmlyc3RDb21wb25lbnRDaGlsZChzbG90KTsKICAgIHZhciBjb21wb25lbnRPcHRpb25zID0gdm5vZGUgJiYgdm5vZGUuY29tcG9uZW50T3B0aW9uczsKICAgIGlmIChjb21wb25lbnRPcHRpb25zKSB7CiAgICAgIC8vIGNoZWNrIHBhdHRlcm4KICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKGNvbXBvbmVudE9wdGlvbnMpOwogICAgICB2YXIgcmVmID0gdGhpczsKICAgICAgdmFyIGluY2x1ZGUgPSByZWYuaW5jbHVkZTsKICAgICAgdmFyIGV4Y2x1ZGUgPSByZWYuZXhjbHVkZTsKICAgICAgaWYgKAogICAgICAgIC8vIG5vdCBpbmNsdWRlZAogICAgICAgIChpbmNsdWRlICYmICghbmFtZSB8fCAhbWF0Y2hlcyhpbmNsdWRlLCBuYW1lKSkpIHx8CiAgICAgICAgLy8gZXhjbHVkZWQKICAgICAgICAoZXhjbHVkZSAmJiBuYW1lICYmIG1hdGNoZXMoZXhjbHVkZSwgbmFtZSkpCiAgICAgICkgewogICAgICAgIHJldHVybiB2bm9kZQogICAgICB9CgogICAgICB2YXIgcmVmJDEgPSB0aGlzOwogICAgICB2YXIgY2FjaGUgPSByZWYkMS5jYWNoZTsKICAgICAgdmFyIGtleXMgPSByZWYkMS5rZXlzOwogICAgICB2YXIga2V5ID0gdm5vZGUua2V5ID09IG51bGwKICAgICAgICAvLyBzYW1lIGNvbnN0cnVjdG9yIG1heSBnZXQgcmVnaXN0ZXJlZCBhcyBkaWZmZXJlbnQgbG9jYWwgY29tcG9uZW50cwogICAgICAgIC8vIHNvIGNpZCBhbG9uZSBpcyBub3QgZW5vdWdoICgjMzI2OSkKICAgICAgICA/IGNvbXBvbmVudE9wdGlvbnMuQ3Rvci5jaWQgKyAoY29tcG9uZW50T3B0aW9ucy50YWcgPyAoIjo6IiArIChjb21wb25lbnRPcHRpb25zLnRhZykpIDogJycpCiAgICAgICAgOiB2bm9kZS5rZXk7CiAgICAgIGlmIChjYWNoZVtrZXldKSB7CiAgICAgICAgdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBjYWNoZVtrZXldLmNvbXBvbmVudEluc3RhbmNlOwogICAgICAgIC8vIG1ha2UgY3VycmVudCBrZXkgZnJlc2hlc3QKICAgICAgICByZW1vdmUoa2V5cywga2V5KTsKICAgICAgICBrZXlzLnB1c2goa2V5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjYWNoZVtrZXldID0gdm5vZGU7CiAgICAgICAga2V5cy5wdXNoKGtleSk7CiAgICAgICAgLy8gcHJ1bmUgb2xkZXN0IGVudHJ5CiAgICAgICAgaWYgKHRoaXMubWF4ICYmIGtleXMubGVuZ3RoID4gcGFyc2VJbnQodGhpcy5tYXgpKSB7CiAgICAgICAgICBwcnVuZUNhY2hlRW50cnkoY2FjaGUsIGtleXNbMF0sIGtleXMsIHRoaXMuX3Zub2RlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZub2RlLmRhdGEua2VlcEFsaXZlID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiB2bm9kZSB8fCAoc2xvdCAmJiBzbG90WzBdKQogIH0KfQoKdmFyIGJ1aWx0SW5Db21wb25lbnRzID0gewogIEtlZXBBbGl2ZTogS2VlcEFsaXZlCn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdEdsb2JhbEFQSSAoVnVlKSB7CiAgLy8gY29uZmlnCiAgdmFyIGNvbmZpZ0RlZiA9IHt9OwogIGNvbmZpZ0RlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25maWc7IH07CiAgewogICAgY29uZmlnRGVmLnNldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgd2FybigKICAgICAgICAnRG8gbm90IHJlcGxhY2UgdGhlIFZ1ZS5jb25maWcgb2JqZWN0LCBzZXQgaW5kaXZpZHVhbCBmaWVsZHMgaW5zdGVhZC4nCiAgICAgICk7CiAgICB9OwogIH0KICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLCAnY29uZmlnJywgY29uZmlnRGVmKTsKCiAgLy8gZXhwb3NlZCB1dGlsIG1ldGhvZHMuCiAgLy8gTk9URTogdGhlc2UgYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkgLSBhdm9pZCByZWx5aW5nIG9uCiAgLy8gdGhlbSB1bmxlc3MgeW91IGFyZSBhd2FyZSBvZiB0aGUgcmlzay4KICBWdWUudXRpbCA9IHsKICAgIHdhcm46IHdhcm4sCiAgICBleHRlbmQ6IGV4dGVuZCwKICAgIG1lcmdlT3B0aW9uczogbWVyZ2VPcHRpb25zLAogICAgZGVmaW5lUmVhY3RpdmU6IGRlZmluZVJlYWN0aXZlCiAgfTsKCiAgVnVlLnNldCA9IHNldDsKICBWdWUuZGVsZXRlID0gZGVsOwogIFZ1ZS5uZXh0VGljayA9IG5leHRUaWNrOwoKICBWdWUub3B0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkgewogICAgVnVlLm9wdGlvbnNbdHlwZSArICdzJ10gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIH0pOwoKICAvLyB0aGlzIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlICJiYXNlIiBjb25zdHJ1Y3RvciB0byBleHRlbmQgYWxsIHBsYWluLW9iamVjdAogIC8vIGNvbXBvbmVudHMgd2l0aCBpbiBXZWV4J3MgbXVsdGktaW5zdGFuY2Ugc2NlbmFyaW9zLgogIFZ1ZS5vcHRpb25zLl9iYXNlID0gVnVlOwoKICBleHRlbmQoVnVlLm9wdGlvbnMuY29tcG9uZW50cywgYnVpbHRJbkNvbXBvbmVudHMpOwoKICBpbml0VXNlKFZ1ZSk7CiAgaW5pdE1peGluJDEoVnVlKTsKICBpbml0RXh0ZW5kKFZ1ZSk7CiAgaW5pdEFzc2V0UmVnaXN0ZXJzKFZ1ZSk7Cn0KCmluaXRHbG9iYWxBUEkoVnVlKTsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGlzU2VydmVyJywgewogIGdldDogaXNTZXJ2ZXJSZW5kZXJpbmcKfSk7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRzc3JDb250ZXh0JywgewogIGdldDogZnVuY3Rpb24gZ2V0ICgpIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgICByZXR1cm4gdGhpcy4kdm5vZGUgJiYgdGhpcy4kdm5vZGUuc3NyQ29udGV4dAogIH0KfSk7CgovLyBleHBvc2UgRnVuY3Rpb25hbFJlbmRlckNvbnRleHQgZm9yIHNzciBydW50aW1lIGhlbHBlciBpbnN0YWxsYXRpb24KT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZSwgJ0Z1bmN0aW9uYWxSZW5kZXJDb250ZXh0JywgewogIHZhbHVlOiBGdW5jdGlvbmFsUmVuZGVyQ29udGV4dAp9KTsKClZ1ZS52ZXJzaW9uID0gJzIuNS4xNyc7CgovKiAgKi8KCi8vIHRoZXNlIGFyZSByZXNlcnZlZCBmb3Igd2ViIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgY29tcGlsZWQgYXdheQovLyBkdXJpbmcgdGVtcGxhdGUgY29tcGlsYXRpb24KdmFyIGlzUmVzZXJ2ZWRBdHRyID0gbWFrZU1hcCgnc3R5bGUsY2xhc3MnKTsKCi8vIGF0dHJpYnV0ZXMgdGhhdCBzaG91bGQgYmUgdXNpbmcgcHJvcHMgZm9yIGJpbmRpbmcKdmFyIGFjY2VwdFZhbHVlID0gbWFrZU1hcCgnaW5wdXQsdGV4dGFyZWEsb3B0aW9uLHNlbGVjdCxwcm9ncmVzcycpOwp2YXIgbXVzdFVzZVByb3AgPSBmdW5jdGlvbiAodGFnLCB0eXBlLCBhdHRyKSB7CiAgcmV0dXJuICgKICAgIChhdHRyID09PSAndmFsdWUnICYmIGFjY2VwdFZhbHVlKHRhZykpICYmIHR5cGUgIT09ICdidXR0b24nIHx8CiAgICAoYXR0ciA9PT0gJ3NlbGVjdGVkJyAmJiB0YWcgPT09ICdvcHRpb24nKSB8fAogICAgKGF0dHIgPT09ICdjaGVja2VkJyAmJiB0YWcgPT09ICdpbnB1dCcpIHx8CiAgICAoYXR0ciA9PT0gJ211dGVkJyAmJiB0YWcgPT09ICd2aWRlbycpCiAgKQp9OwoKdmFyIGlzRW51bWVyYXRlZEF0dHIgPSBtYWtlTWFwKCdjb250ZW50ZWRpdGFibGUsZHJhZ2dhYmxlLHNwZWxsY2hlY2snKTsKCnZhciBpc0Jvb2xlYW5BdHRyID0gbWFrZU1hcCgKICAnYWxsb3dmdWxsc2NyZWVuLGFzeW5jLGF1dG9mb2N1cyxhdXRvcGxheSxjaGVja2VkLGNvbXBhY3QsY29udHJvbHMsZGVjbGFyZSwnICsKICAnZGVmYXVsdCxkZWZhdWx0Y2hlY2tlZCxkZWZhdWx0bXV0ZWQsZGVmYXVsdHNlbGVjdGVkLGRlZmVyLGRpc2FibGVkLCcgKwogICdlbmFibGVkLGZvcm1ub3ZhbGlkYXRlLGhpZGRlbixpbmRldGVybWluYXRlLGluZXJ0LGlzbWFwLGl0ZW1zY29wZSxsb29wLG11bHRpcGxlLCcgKwogICdtdXRlZCxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3ZhbGlkYXRlLG5vd3JhcCxvcGVuLHBhdXNlb25leGl0LHJlYWRvbmx5LCcgKwogICdyZXF1aXJlZCxyZXZlcnNlZCxzY29wZWQsc2VhbWxlc3Msc2VsZWN0ZWQsc29ydGFibGUsdHJhbnNsYXRlLCcgKwogICd0cnVlc3BlZWQsdHlwZW11c3RtYXRjaCx2aXNpYmxlJwopOwoKdmFyIHhsaW5rTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayc7Cgp2YXIgaXNYbGluayA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgcmV0dXJuIG5hbWUuY2hhckF0KDUpID09PSAnOicgJiYgbmFtZS5zbGljZSgwLCA1KSA9PT0gJ3hsaW5rJwp9OwoKdmFyIGdldFhsaW5rUHJvcCA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgcmV0dXJuIGlzWGxpbmsobmFtZSkgPyBuYW1lLnNsaWNlKDYsIG5hbWUubGVuZ3RoKSA6ICcnCn07Cgp2YXIgaXNGYWxzeUF0dHJWYWx1ZSA9IGZ1bmN0aW9uICh2YWwpIHsKICByZXR1cm4gdmFsID09IG51bGwgfHwgdmFsID09PSBmYWxzZQp9OwoKLyogICovCgpmdW5jdGlvbiBnZW5DbGFzc0ZvclZub2RlICh2bm9kZSkgewogIHZhciBkYXRhID0gdm5vZGUuZGF0YTsKICB2YXIgcGFyZW50Tm9kZSA9IHZub2RlOwogIHZhciBjaGlsZE5vZGUgPSB2bm9kZTsKICB3aGlsZSAoaXNEZWYoY2hpbGROb2RlLmNvbXBvbmVudEluc3RhbmNlKSkgewogICAgY2hpbGROb2RlID0gY2hpbGROb2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTsKICAgIGlmIChjaGlsZE5vZGUgJiYgY2hpbGROb2RlLmRhdGEpIHsKICAgICAgZGF0YSA9IG1lcmdlQ2xhc3NEYXRhKGNoaWxkTm9kZS5kYXRhLCBkYXRhKTsKICAgIH0KICB9CiAgd2hpbGUgKGlzRGVmKHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudCkpIHsKICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUuZGF0YSkgewogICAgICBkYXRhID0gbWVyZ2VDbGFzc0RhdGEoZGF0YSwgcGFyZW50Tm9kZS5kYXRhKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlbmRlckNsYXNzKGRhdGEuc3RhdGljQ2xhc3MsIGRhdGEuY2xhc3MpCn0KCmZ1bmN0aW9uIG1lcmdlQ2xhc3NEYXRhIChjaGlsZCwgcGFyZW50KSB7CiAgcmV0dXJuIHsKICAgIHN0YXRpY0NsYXNzOiBjb25jYXQoY2hpbGQuc3RhdGljQ2xhc3MsIHBhcmVudC5zdGF0aWNDbGFzcyksCiAgICBjbGFzczogaXNEZWYoY2hpbGQuY2xhc3MpCiAgICAgID8gW2NoaWxkLmNsYXNzLCBwYXJlbnQuY2xhc3NdCiAgICAgIDogcGFyZW50LmNsYXNzCiAgfQp9CgpmdW5jdGlvbiByZW5kZXJDbGFzcyAoCiAgc3RhdGljQ2xhc3MsCiAgZHluYW1pY0NsYXNzCikgewogIGlmIChpc0RlZihzdGF0aWNDbGFzcykgfHwgaXNEZWYoZHluYW1pY0NsYXNzKSkgewogICAgcmV0dXJuIGNvbmNhdChzdGF0aWNDbGFzcywgc3RyaW5naWZ5Q2xhc3MoZHluYW1pY0NsYXNzKSkKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICByZXR1cm4gJycKfQoKZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7CiAgcmV0dXJuIGEgPyBiID8gKGEgKyAnICcgKyBiKSA6IGEgOiAoYiB8fCAnJykKfQoKZnVuY3Rpb24gc3RyaW5naWZ5Q2xhc3MgKHZhbHVlKSB7CiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICByZXR1cm4gc3RyaW5naWZ5QXJyYXkodmFsdWUpCiAgfQogIGlmIChpc09iamVjdCh2YWx1ZSkpIHsKICAgIHJldHVybiBzdHJpbmdpZnlPYmplY3QodmFsdWUpCiAgfQogIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7CiAgICByZXR1cm4gdmFsdWUKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICByZXR1cm4gJycKfQoKZnVuY3Rpb24gc3RyaW5naWZ5QXJyYXkgKHZhbHVlKSB7CiAgdmFyIHJlcyA9ICcnOwogIHZhciBzdHJpbmdpZmllZDsKICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgaWYgKGlzRGVmKHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5Q2xhc3ModmFsdWVbaV0pKSAmJiBzdHJpbmdpZmllZCAhPT0gJycpIHsKICAgICAgaWYgKHJlcykgeyByZXMgKz0gJyAnOyB9CiAgICAgIHJlcyArPSBzdHJpbmdpZmllZDsKICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgpmdW5jdGlvbiBzdHJpbmdpZnlPYmplY3QgKHZhbHVlKSB7CiAgdmFyIHJlcyA9ICcnOwogIGZvciAodmFyIGtleSBpbiB2YWx1ZSkgewogICAgaWYgKHZhbHVlW2tleV0pIHsKICAgICAgaWYgKHJlcykgeyByZXMgKz0gJyAnOyB9CiAgICAgIHJlcyArPSBrZXk7CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyogICovCgp2YXIgbmFtZXNwYWNlTWFwID0gewogIHN2ZzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywKICBtYXRoOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCcKfTsKCnZhciBpc0hUTUxUYWcgPSBtYWtlTWFwKAogICdodG1sLGJvZHksYmFzZSxoZWFkLGxpbmssbWV0YSxzdHlsZSx0aXRsZSwnICsKICAnYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsaDEsaDIsaDMsaDQsaDUsaDYsaGdyb3VwLG5hdixzZWN0aW9uLCcgKwogICdkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCwnICsKICAnYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsZGF0YSxkZm4sZW0saSxrYmQsbWFyayxxLHJwLHJ0LHJ0YyxydWJ5LCcgKwogICdzLHNhbXAsc21hbGwsc3BhbixzdHJvbmcsc3ViLHN1cCx0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbywnICsKICAnZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsJyArCiAgJ2NhcHRpb24sY29sLGNvbGdyb3VwLHRhYmxlLHRoZWFkLHRib2R5LHRkLHRoLHRyLCcgKwogICdidXR0b24sZGF0YWxpc3QsZmllbGRzZXQsZm9ybSxpbnB1dCxsYWJlbCxsZWdlbmQsbWV0ZXIsb3B0Z3JvdXAsb3B0aW9uLCcgKwogICdvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLCcgKwogICdkZXRhaWxzLGRpYWxvZyxtZW51LG1lbnVpdGVtLHN1bW1hcnksJyArCiAgJ2NvbnRlbnQsZWxlbWVudCxzaGFkb3csdGVtcGxhdGUsYmxvY2txdW90ZSxpZnJhbWUsdGZvb3QnCik7CgovLyB0aGlzIG1hcCBpcyBpbnRlbnRpb25hbGx5IHNlbGVjdGl2ZSwgb25seSBjb3ZlcmluZyBTVkcgZWxlbWVudHMgdGhhdCBtYXkKLy8gY29udGFpbiBjaGlsZCBlbGVtZW50cy4KdmFyIGlzU1ZHID0gbWFrZU1hcCgKICAnc3ZnLGFuaW1hdGUsY2lyY2xlLGNsaXBwYXRoLGN1cnNvcixkZWZzLGRlc2MsZWxsaXBzZSxmaWx0ZXIsZm9udC1mYWNlLCcgKwogICdmb3JlaWduT2JqZWN0LGcsZ2x5cGgsaW1hZ2UsbGluZSxtYXJrZXIsbWFzayxtaXNzaW5nLWdseXBoLHBhdGgscGF0dGVybiwnICsKICAncG9seWdvbixwb2x5bGluZSxyZWN0LHN3aXRjaCxzeW1ib2wsdGV4dCx0ZXh0cGF0aCx0c3Bhbix1c2UsdmlldycsCiAgdHJ1ZQopOwoKdmFyIGlzUHJlVGFnID0gZnVuY3Rpb24gKHRhZykgeyByZXR1cm4gdGFnID09PSAncHJlJzsgfTsKCnZhciBpc1Jlc2VydmVkVGFnID0gZnVuY3Rpb24gKHRhZykgewogIHJldHVybiBpc0hUTUxUYWcodGFnKSB8fCBpc1NWRyh0YWcpCn07CgpmdW5jdGlvbiBnZXRUYWdOYW1lc3BhY2UgKHRhZykgewogIGlmIChpc1NWRyh0YWcpKSB7CiAgICByZXR1cm4gJ3N2ZycKICB9CiAgLy8gYmFzaWMgc3VwcG9ydCBmb3IgTWF0aE1MCiAgLy8gbm90ZSBpdCBkb2Vzbid0IHN1cHBvcnQgb3RoZXIgTWF0aE1MIGVsZW1lbnRzIGJlaW5nIGNvbXBvbmVudCByb290cwogIGlmICh0YWcgPT09ICdtYXRoJykgewogICAgcmV0dXJuICdtYXRoJwogIH0KfQoKdmFyIHVua25vd25FbGVtZW50Q2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwpmdW5jdGlvbiBpc1Vua25vd25FbGVtZW50ICh0YWcpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWluQnJvd3NlcikgewogICAgcmV0dXJuIHRydWUKICB9CiAgaWYgKGlzUmVzZXJ2ZWRUYWcodGFnKSkgewogICAgcmV0dXJuIGZhbHNlCiAgfQogIHRhZyA9IHRhZy50b0xvd2VyQ2FzZSgpOwogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gIT0gbnVsbCkgewogICAgcmV0dXJuIHVua25vd25FbGVtZW50Q2FjaGVbdGFnXQogIH0KICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgaWYgKHRhZy5pbmRleE9mKCctJykgPiAtMSkgewogICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjgyMTAzNjQvMTA3MDI0NAogICAgcmV0dXJuICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gPSAoCiAgICAgIGVsLmNvbnN0cnVjdG9yID09PSB3aW5kb3cuSFRNTFVua25vd25FbGVtZW50IHx8CiAgICAgIGVsLmNvbnN0cnVjdG9yID09PSB3aW5kb3cuSFRNTEVsZW1lbnQKICAgICkpCiAgfSBlbHNlIHsKICAgIHJldHVybiAodW5rbm93bkVsZW1lbnRDYWNoZVt0YWddID0gL0hUTUxVbmtub3duRWxlbWVudC8udGVzdChlbC50b1N0cmluZygpKSkKICB9Cn0KCnZhciBpc1RleHRJbnB1dFR5cGUgPSBtYWtlTWFwKCd0ZXh0LG51bWJlcixwYXNzd29yZCxzZWFyY2gsZW1haWwsdGVsLHVybCcpOwoKLyogICovCgovKioKICogUXVlcnkgYW4gZWxlbWVudCBzZWxlY3RvciBpZiBpdCdzIG5vdCBhbiBlbGVtZW50IGFscmVhZHkuCiAqLwpmdW5jdGlvbiBxdWVyeSAoZWwpIHsKICBpZiAodHlwZW9mIGVsID09PSAnc3RyaW5nJykgewogICAgdmFyIHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbCk7CiAgICBpZiAoIXNlbGVjdGVkKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICdDYW5ub3QgZmluZCBlbGVtZW50OiAnICsgZWwKICAgICAgKTsKICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpCiAgICB9CiAgICByZXR1cm4gc2VsZWN0ZWQKICB9IGVsc2UgewogICAgcmV0dXJuIGVsCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQkMSAodGFnTmFtZSwgdm5vZGUpIHsKICB2YXIgZWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKICBpZiAodGFnTmFtZSAhPT0gJ3NlbGVjdCcpIHsKICAgIHJldHVybiBlbG0KICB9CiAgLy8gZmFsc2Ugb3IgbnVsbCB3aWxsIHJlbW92ZSB0aGUgYXR0cmlidXRlIGJ1dCB1bmRlZmluZWQgd2lsbCBub3QKICBpZiAodm5vZGUuZGF0YSAmJiB2bm9kZS5kYXRhLmF0dHJzICYmIHZub2RlLmRhdGEuYXR0cnMubXVsdGlwbGUgIT09IHVuZGVmaW5lZCkgewogICAgZWxtLnNldEF0dHJpYnV0ZSgnbXVsdGlwbGUnLCAnbXVsdGlwbGUnKTsKICB9CiAgcmV0dXJuIGVsbQp9CgpmdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMgKG5hbWVzcGFjZSwgdGFnTmFtZSkgewogIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlTWFwW25hbWVzcGFjZV0sIHRhZ05hbWUpCn0KCmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlICh0ZXh0KSB7CiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpCn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbW1lbnQgKHRleHQpIHsKICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCh0ZXh0KQp9CgpmdW5jdGlvbiBpbnNlcnRCZWZvcmUgKHBhcmVudE5vZGUsIG5ld05vZGUsIHJlZmVyZW5jZU5vZGUpIHsKICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdOb2RlLCByZWZlcmVuY2VOb2RlKTsKfQoKZnVuY3Rpb24gcmVtb3ZlQ2hpbGQgKG5vZGUsIGNoaWxkKSB7CiAgbm9kZS5yZW1vdmVDaGlsZChjaGlsZCk7Cn0KCmZ1bmN0aW9uIGFwcGVuZENoaWxkIChub2RlLCBjaGlsZCkgewogIG5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpOwp9CgpmdW5jdGlvbiBwYXJlbnROb2RlIChub2RlKSB7CiAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZQp9CgpmdW5jdGlvbiBuZXh0U2libGluZyAobm9kZSkgewogIHJldHVybiBub2RlLm5leHRTaWJsaW5nCn0KCmZ1bmN0aW9uIHRhZ05hbWUgKG5vZGUpIHsKICByZXR1cm4gbm9kZS50YWdOYW1lCn0KCmZ1bmN0aW9uIHNldFRleHRDb250ZW50IChub2RlLCB0ZXh0KSB7CiAgbm9kZS50ZXh0Q29udGVudCA9IHRleHQ7Cn0KCmZ1bmN0aW9uIHNldFN0eWxlU2NvcGUgKG5vZGUsIHNjb3BlSWQpIHsKICBub2RlLnNldEF0dHJpYnV0ZShzY29wZUlkLCAnJyk7Cn0KCgp2YXIgbm9kZU9wcyA9IE9iamVjdC5mcmVlemUoewoJY3JlYXRlRWxlbWVudDogY3JlYXRlRWxlbWVudCQxLAoJY3JlYXRlRWxlbWVudE5TOiBjcmVhdGVFbGVtZW50TlMsCgljcmVhdGVUZXh0Tm9kZTogY3JlYXRlVGV4dE5vZGUsCgljcmVhdGVDb21tZW50OiBjcmVhdGVDb21tZW50LAoJaW5zZXJ0QmVmb3JlOiBpbnNlcnRCZWZvcmUsCglyZW1vdmVDaGlsZDogcmVtb3ZlQ2hpbGQsCglhcHBlbmRDaGlsZDogYXBwZW5kQ2hpbGQsCglwYXJlbnROb2RlOiBwYXJlbnROb2RlLAoJbmV4dFNpYmxpbmc6IG5leHRTaWJsaW5nLAoJdGFnTmFtZTogdGFnTmFtZSwKCXNldFRleHRDb250ZW50OiBzZXRUZXh0Q29udGVudCwKCXNldFN0eWxlU2NvcGU6IHNldFN0eWxlU2NvcGUKfSk7CgovKiAgKi8KCnZhciByZWYgPSB7CiAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUgKF8sIHZub2RlKSB7CiAgICByZWdpc3RlclJlZih2bm9kZSk7CiAgfSwKICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSAob2xkVm5vZGUsIHZub2RlKSB7CiAgICBpZiAob2xkVm5vZGUuZGF0YS5yZWYgIT09IHZub2RlLmRhdGEucmVmKSB7CiAgICAgIHJlZ2lzdGVyUmVmKG9sZFZub2RlLCB0cnVlKTsKICAgICAgcmVnaXN0ZXJSZWYodm5vZGUpOwogICAgfQogIH0sCiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHsKICAgIHJlZ2lzdGVyUmVmKHZub2RlLCB0cnVlKTsKICB9Cn0KCmZ1bmN0aW9uIHJlZ2lzdGVyUmVmICh2bm9kZSwgaXNSZW1vdmFsKSB7CiAgdmFyIGtleSA9IHZub2RlLmRhdGEucmVmOwogIGlmICghaXNEZWYoa2V5KSkgeyByZXR1cm4gfQoKICB2YXIgdm0gPSB2bm9kZS5jb250ZXh0OwogIHZhciByZWYgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSB8fCB2bm9kZS5lbG07CiAgdmFyIHJlZnMgPSB2bS4kcmVmczsKICBpZiAoaXNSZW1vdmFsKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWZzW2tleV0pKSB7CiAgICAgIHJlbW92ZShyZWZzW2tleV0sIHJlZik7CiAgICB9IGVsc2UgaWYgKHJlZnNba2V5XSA9PT0gcmVmKSB7CiAgICAgIHJlZnNba2V5XSA9IHVuZGVmaW5lZDsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKHZub2RlLmRhdGEucmVmSW5Gb3IpIHsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlZnNba2V5XSkpIHsKICAgICAgICByZWZzW2tleV0gPSBbcmVmXTsKICAgICAgfSBlbHNlIGlmIChyZWZzW2tleV0uaW5kZXhPZihyZWYpIDwgMCkgewogICAgICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgICAgIHJlZnNba2V5XS5wdXNoKHJlZik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlZnNba2V5XSA9IHJlZjsKICAgIH0KICB9Cn0KCi8qKgogKiBWaXJ0dWFsIERPTSBwYXRjaGluZyBhbGdvcml0aG0gYmFzZWQgb24gU25hYmJkb20gYnkKICogU2ltb24gRnJpaXMgVmluZHVtIChAcGFsZGVwaW5kKQogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UKICogaHR0cHM6Ly9naXRodWIuY29tL3BhbGRlcGluZC9zbmFiYmRvbS9ibG9iL21hc3Rlci9MSUNFTlNFCiAqCiAqIG1vZGlmaWVkIGJ5IEV2YW4gWW91IChAeXl4OTkwODAzKQogKgogKiBOb3QgdHlwZS1jaGVja2luZyB0aGlzIGJlY2F1c2UgdGhpcyBmaWxlIGlzIHBlcmYtY3JpdGljYWwgYW5kIHRoZSBjb3N0CiAqIG9mIG1ha2luZyBmbG93IHVuZGVyc3RhbmQgaXQgaXMgbm90IHdvcnRoIGl0LgogKi8KCnZhciBlbXB0eU5vZGUgPSBuZXcgVk5vZGUoJycsIHt9LCBbXSk7Cgp2YXIgaG9va3MgPSBbJ2NyZWF0ZScsICdhY3RpdmF0ZScsICd1cGRhdGUnLCAncmVtb3ZlJywgJ2Rlc3Ryb3knXTsKCmZ1bmN0aW9uIHNhbWVWbm9kZSAoYSwgYikgewogIHJldHVybiAoCiAgICBhLmtleSA9PT0gYi5rZXkgJiYgKAogICAgICAoCiAgICAgICAgYS50YWcgPT09IGIudGFnICYmCiAgICAgICAgYS5pc0NvbW1lbnQgPT09IGIuaXNDb21tZW50ICYmCiAgICAgICAgaXNEZWYoYS5kYXRhKSA9PT0gaXNEZWYoYi5kYXRhKSAmJgogICAgICAgIHNhbWVJbnB1dFR5cGUoYSwgYikKICAgICAgKSB8fCAoCiAgICAgICAgaXNUcnVlKGEuaXNBc3luY1BsYWNlaG9sZGVyKSAmJgogICAgICAgIGEuYXN5bmNGYWN0b3J5ID09PSBiLmFzeW5jRmFjdG9yeSAmJgogICAgICAgIGlzVW5kZWYoYi5hc3luY0ZhY3RvcnkuZXJyb3IpCiAgICAgICkKICAgICkKICApCn0KCmZ1bmN0aW9uIHNhbWVJbnB1dFR5cGUgKGEsIGIpIHsKICBpZiAoYS50YWcgIT09ICdpbnB1dCcpIHsgcmV0dXJuIHRydWUgfQogIHZhciBpOwogIHZhciB0eXBlQSA9IGlzRGVmKGkgPSBhLmRhdGEpICYmIGlzRGVmKGkgPSBpLmF0dHJzKSAmJiBpLnR5cGU7CiAgdmFyIHR5cGVCID0gaXNEZWYoaSA9IGIuZGF0YSkgJiYgaXNEZWYoaSA9IGkuYXR0cnMpICYmIGkudHlwZTsKICByZXR1cm4gdHlwZUEgPT09IHR5cGVCIHx8IGlzVGV4dElucHV0VHlwZSh0eXBlQSkgJiYgaXNUZXh0SW5wdXRUeXBlKHR5cGVCKQp9CgpmdW5jdGlvbiBjcmVhdGVLZXlUb09sZElkeCAoY2hpbGRyZW4sIGJlZ2luSWR4LCBlbmRJZHgpIHsKICB2YXIgaSwga2V5OwogIHZhciBtYXAgPSB7fTsKICBmb3IgKGkgPSBiZWdpbklkeDsgaSA8PSBlbmRJZHg7ICsraSkgewogICAga2V5ID0gY2hpbGRyZW5baV0ua2V5OwogICAgaWYgKGlzRGVmKGtleSkpIHsgbWFwW2tleV0gPSBpOyB9CiAgfQogIHJldHVybiBtYXAKfQoKZnVuY3Rpb24gY3JlYXRlUGF0Y2hGdW5jdGlvbiAoYmFja2VuZCkgewogIHZhciBpLCBqOwogIHZhciBjYnMgPSB7fTsKCiAgdmFyIG1vZHVsZXMgPSBiYWNrZW5kLm1vZHVsZXM7CiAgdmFyIG5vZGVPcHMgPSBiYWNrZW5kLm5vZGVPcHM7CgogIGZvciAoaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7ICsraSkgewogICAgY2JzW2hvb2tzW2ldXSA9IFtdOwogICAgZm9yIChqID0gMDsgaiA8IG1vZHVsZXMubGVuZ3RoOyArK2opIHsKICAgICAgaWYgKGlzRGVmKG1vZHVsZXNbal1baG9va3NbaV1dKSkgewogICAgICAgIGNic1tob29rc1tpXV0ucHVzaChtb2R1bGVzW2pdW2hvb2tzW2ldXSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGVtcHR5Tm9kZUF0IChlbG0pIHsKICAgIHJldHVybiBuZXcgVk5vZGUobm9kZU9wcy50YWdOYW1lKGVsbSkudG9Mb3dlckNhc2UoKSwge30sIFtdLCB1bmRlZmluZWQsIGVsbSkKICB9CgogIGZ1bmN0aW9uIGNyZWF0ZVJtQ2IgKGNoaWxkRWxtLCBsaXN0ZW5lcnMpIHsKICAgIGZ1bmN0aW9uIHJlbW92ZSAoKSB7CiAgICAgIGlmICgtLXJlbW92ZS5saXN0ZW5lcnMgPT09IDApIHsKICAgICAgICByZW1vdmVOb2RlKGNoaWxkRWxtKTsKICAgICAgfQogICAgfQogICAgcmVtb3ZlLmxpc3RlbmVycyA9IGxpc3RlbmVyczsKICAgIHJldHVybiByZW1vdmUKICB9CgogIGZ1bmN0aW9uIHJlbW92ZU5vZGUgKGVsKSB7CiAgICB2YXIgcGFyZW50ID0gbm9kZU9wcy5wYXJlbnROb2RlKGVsKTsKICAgIC8vIGVsZW1lbnQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZHVlIHRvIHYtaHRtbCAvIHYtdGV4dAogICAgaWYgKGlzRGVmKHBhcmVudCkpIHsKICAgICAgbm9kZU9wcy5yZW1vdmVDaGlsZChwYXJlbnQsIGVsKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzVW5rbm93bkVsZW1lbnQkJDEgKHZub2RlLCBpblZQcmUpIHsKICAgIHJldHVybiAoCiAgICAgICFpblZQcmUgJiYKICAgICAgIXZub2RlLm5zICYmCiAgICAgICEoCiAgICAgICAgY29uZmlnLmlnbm9yZWRFbGVtZW50cy5sZW5ndGggJiYKICAgICAgICBjb25maWcuaWdub3JlZEVsZW1lbnRzLnNvbWUoZnVuY3Rpb24gKGlnbm9yZSkgewogICAgICAgICAgcmV0dXJuIGlzUmVnRXhwKGlnbm9yZSkKICAgICAgICAgICAgPyBpZ25vcmUudGVzdCh2bm9kZS50YWcpCiAgICAgICAgICAgIDogaWdub3JlID09PSB2bm9kZS50YWcKICAgICAgICB9KQogICAgICApICYmCiAgICAgIGNvbmZpZy5pc1Vua25vd25FbGVtZW50KHZub2RlLnRhZykKICAgICkKICB9CgogIHZhciBjcmVhdGluZ0VsbUluVlByZSA9IDA7CgogIGZ1bmN0aW9uIGNyZWF0ZUVsbSAoCiAgICB2bm9kZSwKICAgIGluc2VydGVkVm5vZGVRdWV1ZSwKICAgIHBhcmVudEVsbSwKICAgIHJlZkVsbSwKICAgIG5lc3RlZCwKICAgIG93bmVyQXJyYXksCiAgICBpbmRleAogICkgewogICAgaWYgKGlzRGVmKHZub2RlLmVsbSkgJiYgaXNEZWYob3duZXJBcnJheSkpIHsKICAgICAgLy8gVGhpcyB2bm9kZSB3YXMgdXNlZCBpbiBhIHByZXZpb3VzIHJlbmRlciEKICAgICAgLy8gbm93IGl0J3MgdXNlZCBhcyBhIG5ldyBub2RlLCBvdmVyd3JpdGluZyBpdHMgZWxtIHdvdWxkIGNhdXNlCiAgICAgIC8vIHBvdGVudGlhbCBwYXRjaCBlcnJvcnMgZG93biB0aGUgcm9hZCB3aGVuIGl0J3MgdXNlZCBhcyBhbiBpbnNlcnRpb24KICAgICAgLy8gcmVmZXJlbmNlIG5vZGUuIEluc3RlYWQsIHdlIGNsb25lIHRoZSBub2RlIG9uLWRlbWFuZCBiZWZvcmUgY3JlYXRpbmcKICAgICAgLy8gYXNzb2NpYXRlZCBET00gZWxlbWVudCBmb3IgaXQuCiAgICAgIHZub2RlID0gb3duZXJBcnJheVtpbmRleF0gPSBjbG9uZVZOb2RlKHZub2RlKTsKICAgIH0KCiAgICB2bm9kZS5pc1Jvb3RJbnNlcnQgPSAhbmVzdGVkOyAvLyBmb3IgdHJhbnNpdGlvbiBlbnRlciBjaGVjawogICAgaWYgKGNyZWF0ZUNvbXBvbmVudCh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkpIHsKICAgICAgcmV0dXJuCiAgICB9CgogICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogICAgdmFyIGNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47CiAgICB2YXIgdGFnID0gdm5vZGUudGFnOwogICAgaWYgKGlzRGVmKHRhZykpIHsKICAgICAgewogICAgICAgIGlmIChkYXRhICYmIGRhdGEucHJlKSB7CiAgICAgICAgICBjcmVhdGluZ0VsbUluVlByZSsrOwogICAgICAgIH0KICAgICAgICBpZiAoaXNVbmtub3duRWxlbWVudCQkMSh2bm9kZSwgY3JlYXRpbmdFbG1JblZQcmUpKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAnVW5rbm93biBjdXN0b20gZWxlbWVudDogPCcgKyB0YWcgKyAnPiAtIGRpZCB5b3UgJyArCiAgICAgICAgICAgICdyZWdpc3RlciB0aGUgY29tcG9uZW50IGNvcnJlY3RseT8gRm9yIHJlY3Vyc2l2ZSBjb21wb25lbnRzLCAnICsKICAgICAgICAgICAgJ21ha2Ugc3VyZSB0byBwcm92aWRlIHRoZSAibmFtZSIgb3B0aW9uLicsCiAgICAgICAgICAgIHZub2RlLmNvbnRleHQKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9CgogICAgICB2bm9kZS5lbG0gPSB2bm9kZS5ucwogICAgICAgID8gbm9kZU9wcy5jcmVhdGVFbGVtZW50TlModm5vZGUubnMsIHRhZykKICAgICAgICA6IG5vZGVPcHMuY3JlYXRlRWxlbWVudCh0YWcsIHZub2RlKTsKICAgICAgc2V0U2NvcGUodm5vZGUpOwoKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIHsKICAgICAgICBjcmVhdGVDaGlsZHJlbih2bm9kZSwgY2hpbGRyZW4sIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgICAgICBpbnZva2VDcmVhdGVIb29rcyh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICB9CiAgICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgICB9CgogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRhdGEgJiYgZGF0YS5wcmUpIHsKICAgICAgICBjcmVhdGluZ0VsbUluVlByZS0tOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzVHJ1ZSh2bm9kZS5pc0NvbW1lbnQpKSB7CiAgICAgIHZub2RlLmVsbSA9IG5vZGVPcHMuY3JlYXRlQ29tbWVudCh2bm9kZS50ZXh0KTsKICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgfSBlbHNlIHsKICAgICAgdm5vZGUuZWxtID0gbm9kZU9wcy5jcmVhdGVUZXh0Tm9kZSh2bm9kZS50ZXh0KTsKICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50ICh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkgewogICAgdmFyIGkgPSB2bm9kZS5kYXRhOwogICAgaWYgKGlzRGVmKGkpKSB7CiAgICAgIHZhciBpc1JlYWN0aXZhdGVkID0gaXNEZWYodm5vZGUuY29tcG9uZW50SW5zdGFuY2UpICYmIGkua2VlcEFsaXZlOwogICAgICBpZiAoaXNEZWYoaSA9IGkuaG9vaykgJiYgaXNEZWYoaSA9IGkuaW5pdCkpIHsKICAgICAgICBpKHZub2RlLCBmYWxzZSAvKiBoeWRyYXRpbmcgKi8sIHBhcmVudEVsbSwgcmVmRWxtKTsKICAgICAgfQogICAgICAvLyBhZnRlciBjYWxsaW5nIHRoZSBpbml0IGhvb2ssIGlmIHRoZSB2bm9kZSBpcyBhIGNoaWxkIGNvbXBvbmVudAogICAgICAvLyBpdCBzaG91bGQndmUgY3JlYXRlZCBhIGNoaWxkIGluc3RhbmNlIGFuZCBtb3VudGVkIGl0LiB0aGUgY2hpbGQKICAgICAgLy8gY29tcG9uZW50IGFsc28gaGFzIHNldCB0aGUgcGxhY2Vob2xkZXIgdm5vZGUncyBlbG0uCiAgICAgIC8vIGluIHRoYXQgY2FzZSB3ZSBjYW4ganVzdCByZXR1cm4gdGhlIGVsZW1lbnQgYW5kIGJlIGRvbmUuCiAgICAgIGlmIChpc0RlZih2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkpIHsKICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIGlmIChpc1RydWUoaXNSZWFjdGl2YXRlZCkpIHsKICAgICAgICAgIHJlYWN0aXZhdGVDb21wb25lbnQodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZQogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbml0Q29tcG9uZW50ICh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7CiAgICBpZiAoaXNEZWYodm5vZGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSkgewogICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaC5hcHBseShpbnNlcnRlZFZub2RlUXVldWUsIHZub2RlLmRhdGEucGVuZGluZ0luc2VydCk7CiAgICAgIHZub2RlLmRhdGEucGVuZGluZ0luc2VydCA9IG51bGw7CiAgICB9CiAgICB2bm9kZS5lbG0gPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZS4kZWw7CiAgICBpZiAoaXNQYXRjaGFibGUodm5vZGUpKSB7CiAgICAgIGludm9rZUNyZWF0ZUhvb2tzKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICBzZXRTY29wZSh2bm9kZSk7CiAgICB9IGVsc2UgewogICAgICAvLyBlbXB0eSBjb21wb25lbnQgcm9vdC4KICAgICAgLy8gc2tpcCBhbGwgZWxlbWVudC1yZWxhdGVkIG1vZHVsZXMgZXhjZXB0IGZvciByZWYgKCMzNDU1KQogICAgICByZWdpc3RlclJlZih2bm9kZSk7CiAgICAgIC8vIG1ha2Ugc3VyZSB0byBpbnZva2UgdGhlIGluc2VydCBob29rCiAgICAgIGluc2VydGVkVm5vZGVRdWV1ZS5wdXNoKHZub2RlKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlYWN0aXZhdGVDb21wb25lbnQgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKSB7CiAgICB2YXIgaTsKICAgIC8vIGhhY2sgZm9yICM0MzM5OiBhIHJlYWN0aXZhdGVkIGNvbXBvbmVudCB3aXRoIGlubmVyIHRyYW5zaXRpb24KICAgIC8vIGRvZXMgbm90IHRyaWdnZXIgYmVjYXVzZSB0aGUgaW5uZXIgbm9kZSdzIGNyZWF0ZWQgaG9va3MgYXJlIG5vdCBjYWxsZWQKICAgIC8vIGFnYWluLiBJdCdzIG5vdCBpZGVhbCB0byBpbnZvbHZlIG1vZHVsZS1zcGVjaWZpYyBsb2dpYyBpbiBoZXJlIGJ1dAogICAgLy8gdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgYmV0dGVyIHdheSB0byBkbyBpdC4KICAgIHZhciBpbm5lck5vZGUgPSB2bm9kZTsKICAgIHdoaWxlIChpbm5lck5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHsKICAgICAgaW5uZXJOb2RlID0gaW5uZXJOb2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTsKICAgICAgaWYgKGlzRGVmKGkgPSBpbm5lck5vZGUuZGF0YSkgJiYgaXNEZWYoaSA9IGkudHJhbnNpdGlvbikpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmFjdGl2YXRlLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICBjYnMuYWN0aXZhdGVbaV0oZW1wdHlOb2RlLCBpbm5lck5vZGUpOwogICAgICAgIH0KICAgICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaChpbm5lck5vZGUpOwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgIH0KICAgIC8vIHVubGlrZSBhIG5ld2x5IGNyZWF0ZWQgY29tcG9uZW50LAogICAgLy8gYSByZWFjdGl2YXRlZCBrZWVwLWFsaXZlIGNvbXBvbmVudCBkb2Vzbid0IGluc2VydCBpdHNlbGYKICAgIGluc2VydChwYXJlbnRFbG0sIHZub2RlLmVsbSwgcmVmRWxtKTsKICB9CgogIGZ1bmN0aW9uIGluc2VydCAocGFyZW50LCBlbG0sIHJlZiQkMSkgewogICAgaWYgKGlzRGVmKHBhcmVudCkpIHsKICAgICAgaWYgKGlzRGVmKHJlZiQkMSkpIHsKICAgICAgICBpZiAocmVmJCQxLnBhcmVudE5vZGUgPT09IHBhcmVudCkgewogICAgICAgICAgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50LCBlbG0sIHJlZiQkMSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIG5vZGVPcHMuYXBwZW5kQ2hpbGQocGFyZW50LCBlbG0pOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjcmVhdGVDaGlsZHJlbiAodm5vZGUsIGNoaWxkcmVuLCBpbnNlcnRlZFZub2RlUXVldWUpIHsKICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgewogICAgICB7CiAgICAgICAgY2hlY2tEdXBsaWNhdGVLZXlzKGNoaWxkcmVuKTsKICAgICAgfQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7CiAgICAgICAgY3JlYXRlRWxtKGNoaWxkcmVuW2ldLCBpbnNlcnRlZFZub2RlUXVldWUsIHZub2RlLmVsbSwgbnVsbCwgdHJ1ZSwgY2hpbGRyZW4sIGkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKHZub2RlLnRleHQpKSB7CiAgICAgIG5vZGVPcHMuYXBwZW5kQ2hpbGQodm5vZGUuZWxtLCBub2RlT3BzLmNyZWF0ZVRleHROb2RlKFN0cmluZyh2bm9kZS50ZXh0KSkpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaXNQYXRjaGFibGUgKHZub2RlKSB7CiAgICB3aGlsZSAodm5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHsKICAgICAgdm5vZGUgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7CiAgICB9CiAgICByZXR1cm4gaXNEZWYodm5vZGUudGFnKQogIH0KCiAgZnVuY3Rpb24gaW52b2tlQ3JlYXRlSG9va3MgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpIHsKICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkgewogICAgICBjYnMuY3JlYXRlW2kkMV0oZW1wdHlOb2RlLCB2bm9kZSk7CiAgICB9CiAgICBpID0gdm5vZGUuZGF0YS5ob29rOyAvLyBSZXVzZSB2YXJpYWJsZQogICAgaWYgKGlzRGVmKGkpKSB7CiAgICAgIGlmIChpc0RlZihpLmNyZWF0ZSkpIHsgaS5jcmVhdGUoZW1wdHlOb2RlLCB2bm9kZSk7IH0KICAgICAgaWYgKGlzRGVmKGkuaW5zZXJ0KSkgeyBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7IH0KICAgIH0KICB9CgogIC8vIHNldCBzY29wZSBpZCBhdHRyaWJ1dGUgZm9yIHNjb3BlZCBDU1MuCiAgLy8gdGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNwZWNpYWwgY2FzZSB0byBhdm9pZCB0aGUgb3ZlcmhlYWQKICAvLyBvZiBnb2luZyB0aHJvdWdoIHRoZSBub3JtYWwgYXR0cmlidXRlIHBhdGNoaW5nIHByb2Nlc3MuCiAgZnVuY3Rpb24gc2V0U2NvcGUgKHZub2RlKSB7CiAgICB2YXIgaTsKICAgIGlmIChpc0RlZihpID0gdm5vZGUuZm5TY29wZUlkKSkgewogICAgICBub2RlT3BzLnNldFN0eWxlU2NvcGUodm5vZGUuZWxtLCBpKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBhbmNlc3RvciA9IHZub2RlOwogICAgICB3aGlsZSAoYW5jZXN0b3IpIHsKICAgICAgICBpZiAoaXNEZWYoaSA9IGFuY2VzdG9yLmNvbnRleHQpICYmIGlzRGVmKGkgPSBpLiRvcHRpb25zLl9zY29wZUlkKSkgewogICAgICAgICAgbm9kZU9wcy5zZXRTdHlsZVNjb3BlKHZub2RlLmVsbSwgaSk7CiAgICAgICAgfQogICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50OwogICAgICB9CiAgICB9CiAgICAvLyBmb3Igc2xvdCBjb250ZW50IHRoZXkgc2hvdWxkIGFsc28gZ2V0IHRoZSBzY29wZUlkIGZyb20gdGhlIGhvc3QgaW5zdGFuY2UuCiAgICBpZiAoaXNEZWYoaSA9IGFjdGl2ZUluc3RhbmNlKSAmJgogICAgICBpICE9PSB2bm9kZS5jb250ZXh0ICYmCiAgICAgIGkgIT09IHZub2RlLmZuQ29udGV4dCAmJgogICAgICBpc0RlZihpID0gaS4kb3B0aW9ucy5fc2NvcGVJZCkKICAgICkgewogICAgICBub2RlT3BzLnNldFN0eWxlU2NvcGUodm5vZGUuZWxtLCBpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGFkZFZub2RlcyAocGFyZW50RWxtLCByZWZFbG0sIHZub2Rlcywgc3RhcnRJZHgsIGVuZElkeCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7CiAgICBmb3IgKDsgc3RhcnRJZHggPD0gZW5kSWR4OyArK3N0YXJ0SWR4KSB7CiAgICAgIGNyZWF0ZUVsbSh2bm9kZXNbc3RhcnRJZHhdLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtLCBmYWxzZSwgdm5vZGVzLCBzdGFydElkeCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbnZva2VEZXN0cm95SG9vayAodm5vZGUpIHsKICAgIHZhciBpLCBqOwogICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5kZXN0cm95KSkgeyBpKHZub2RlKTsgfQogICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmRlc3Ryb3kubGVuZ3RoOyArK2kpIHsgY2JzLmRlc3Ryb3lbaV0odm5vZGUpOyB9CiAgICB9CiAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNoaWxkcmVuKSkgewogICAgICBmb3IgKGogPSAwOyBqIDwgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyArK2opIHsKICAgICAgICBpbnZva2VEZXN0cm95SG9vayh2bm9kZS5jaGlsZHJlbltqXSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlbW92ZVZub2RlcyAocGFyZW50RWxtLCB2bm9kZXMsIHN0YXJ0SWR4LCBlbmRJZHgpIHsKICAgIGZvciAoOyBzdGFydElkeCA8PSBlbmRJZHg7ICsrc3RhcnRJZHgpIHsKICAgICAgdmFyIGNoID0gdm5vZGVzW3N0YXJ0SWR4XTsKICAgICAgaWYgKGlzRGVmKGNoKSkgewogICAgICAgIGlmIChpc0RlZihjaC50YWcpKSB7CiAgICAgICAgICByZW1vdmVBbmRJbnZva2VSZW1vdmVIb29rKGNoKTsKICAgICAgICAgIGludm9rZURlc3Ryb3lIb29rKGNoKTsKICAgICAgICB9IGVsc2UgeyAvLyBUZXh0IG5vZGUKICAgICAgICAgIHJlbW92ZU5vZGUoY2guZWxtKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2sgKHZub2RlLCBybSkgewogICAgaWYgKGlzRGVmKHJtKSB8fCBpc0RlZih2bm9kZS5kYXRhKSkgewogICAgICB2YXIgaTsKICAgICAgdmFyIGxpc3RlbmVycyA9IGNicy5yZW1vdmUubGVuZ3RoICsgMTsKICAgICAgaWYgKGlzRGVmKHJtKSkgewogICAgICAgIC8vIHdlIGhhdmUgYSByZWN1cnNpdmVseSBwYXNzZWQgZG93biBybSBjYWxsYmFjawogICAgICAgIC8vIGluY3JlYXNlIHRoZSBsaXN0ZW5lcnMgY291bnQKICAgICAgICBybS5saXN0ZW5lcnMgKz0gbGlzdGVuZXJzOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIGRpcmVjdGx5IHJlbW92aW5nCiAgICAgICAgcm0gPSBjcmVhdGVSbUNiKHZub2RlLmVsbSwgbGlzdGVuZXJzKTsKICAgICAgfQogICAgICAvLyByZWN1cnNpdmVseSBpbnZva2UgaG9va3Mgb24gY2hpbGQgY29tcG9uZW50IHJvb3Qgbm9kZQogICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSAmJiBpc0RlZihpID0gaS5fdm5vZGUpICYmIGlzRGVmKGkuZGF0YSkpIHsKICAgICAgICByZW1vdmVBbmRJbnZva2VSZW1vdmVIb29rKGksIHJtKTsKICAgICAgfQogICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLnJlbW92ZS5sZW5ndGg7ICsraSkgewogICAgICAgIGNicy5yZW1vdmVbaV0odm5vZGUsIHJtKTsKICAgICAgfQogICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkucmVtb3ZlKSkgewogICAgICAgIGkodm5vZGUsIHJtKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBybSgpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZW1vdmVOb2RlKHZub2RlLmVsbSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVDaGlsZHJlbiAocGFyZW50RWxtLCBvbGRDaCwgbmV3Q2gsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSkgewogICAgdmFyIG9sZFN0YXJ0SWR4ID0gMDsKICAgIHZhciBuZXdTdGFydElkeCA9IDA7CiAgICB2YXIgb2xkRW5kSWR4ID0gb2xkQ2gubGVuZ3RoIC0gMTsKICAgIHZhciBvbGRTdGFydFZub2RlID0gb2xkQ2hbMF07CiAgICB2YXIgb2xkRW5kVm5vZGUgPSBvbGRDaFtvbGRFbmRJZHhdOwogICAgdmFyIG5ld0VuZElkeCA9IG5ld0NoLmxlbmd0aCAtIDE7CiAgICB2YXIgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWzBdOwogICAgdmFyIG5ld0VuZFZub2RlID0gbmV3Q2hbbmV3RW5kSWR4XTsKICAgIHZhciBvbGRLZXlUb0lkeCwgaWR4SW5PbGQsIHZub2RlVG9Nb3ZlLCByZWZFbG07CgogICAgLy8gcmVtb3ZlT25seSBpcyBhIHNwZWNpYWwgZmxhZyB1c2VkIG9ubHkgYnkgPHRyYW5zaXRpb24tZ3JvdXA+CiAgICAvLyB0byBlbnN1cmUgcmVtb3ZlZCBlbGVtZW50cyBzdGF5IGluIGNvcnJlY3QgcmVsYXRpdmUgcG9zaXRpb25zCiAgICAvLyBkdXJpbmcgbGVhdmluZyB0cmFuc2l0aW9ucwogICAgdmFyIGNhbk1vdmUgPSAhcmVtb3ZlT25seTsKCiAgICB7CiAgICAgIGNoZWNrRHVwbGljYXRlS2V5cyhuZXdDaCk7CiAgICB9CgogICAgd2hpbGUgKG9sZFN0YXJ0SWR4IDw9IG9sZEVuZElkeCAmJiBuZXdTdGFydElkeCA8PSBuZXdFbmRJZHgpIHsKICAgICAgaWYgKGlzVW5kZWYob2xkU3RhcnRWbm9kZSkpIHsKICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07IC8vIFZub2RlIGhhcyBiZWVuIG1vdmVkIGxlZnQKICAgICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZEVuZFZub2RlKSkgewogICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdOwogICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRTdGFydFZub2RlLCBuZXdTdGFydFZub2RlKSkgewogICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07CiAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdOwogICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUpKSB7CiAgICAgICAgcGF0Y2hWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgb2xkRW5kVm5vZGUgPSBvbGRDaFstLW9sZEVuZElkeF07CiAgICAgICAgbmV3RW5kVm5vZGUgPSBuZXdDaFstLW5ld0VuZElkeF07CiAgICAgIH0gZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld0VuZFZub2RlKSkgeyAvLyBWbm9kZSBtb3ZlZCByaWdodAogICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgY2FuTW92ZSAmJiBub2RlT3BzLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVuZFZub2RlLmVsbSkpOwogICAgICAgIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFsrK29sZFN0YXJ0SWR4XTsKICAgICAgICBuZXdFbmRWbm9kZSA9IG5ld0NoWy0tbmV3RW5kSWR4XTsKICAgICAgfSBlbHNlIGlmIChzYW1lVm5vZGUob2xkRW5kVm5vZGUsIG5ld1N0YXJ0Vm5vZGUpKSB7IC8vIFZub2RlIG1vdmVkIGxlZnQKICAgICAgICBwYXRjaFZub2RlKG9sZEVuZFZub2RlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIGNhbk1vdmUgJiYgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50RWxtLCBvbGRFbmRWbm9kZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTsKICAgICAgICBvbGRFbmRWbm9kZSA9IG9sZENoWy0tb2xkRW5kSWR4XTsKICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlzVW5kZWYob2xkS2V5VG9JZHgpKSB7IG9sZEtleVRvSWR4ID0gY3JlYXRlS2V5VG9PbGRJZHgob2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpOyB9CiAgICAgICAgaWR4SW5PbGQgPSBpc0RlZihuZXdTdGFydFZub2RlLmtleSkKICAgICAgICAgID8gb2xkS2V5VG9JZHhbbmV3U3RhcnRWbm9kZS5rZXldCiAgICAgICAgICA6IGZpbmRJZHhJbk9sZChuZXdTdGFydFZub2RlLCBvbGRDaCwgb2xkU3RhcnRJZHgsIG9sZEVuZElkeCk7CiAgICAgICAgaWYgKGlzVW5kZWYoaWR4SW5PbGQpKSB7IC8vIE5ldyBlbGVtZW50CiAgICAgICAgICBjcmVhdGVFbG0obmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBmYWxzZSwgbmV3Q2gsIG5ld1N0YXJ0SWR4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdm5vZGVUb01vdmUgPSBvbGRDaFtpZHhJbk9sZF07CiAgICAgICAgICBpZiAoc2FtZVZub2RlKHZub2RlVG9Nb3ZlLCBuZXdTdGFydFZub2RlKSkgewogICAgICAgICAgICBwYXRjaFZub2RlKHZub2RlVG9Nb3ZlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgICAgICBvbGRDaFtpZHhJbk9sZF0gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIGNhbk1vdmUgJiYgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50RWxtLCB2bm9kZVRvTW92ZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIHNhbWUga2V5IGJ1dCBkaWZmZXJlbnQgZWxlbWVudC4gdHJlYXQgYXMgbmV3IGVsZW1lbnQKICAgICAgICAgICAgY3JlYXRlRWxtKG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCBvbGRTdGFydFZub2RlLmVsbSwgZmFsc2UsIG5ld0NoLCBuZXdTdGFydElkeCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTsKICAgICAgfQogICAgfQogICAgaWYgKG9sZFN0YXJ0SWR4ID4gb2xkRW5kSWR4KSB7CiAgICAgIHJlZkVsbSA9IGlzVW5kZWYobmV3Q2hbbmV3RW5kSWR4ICsgMV0pID8gbnVsbCA6IG5ld0NoW25ld0VuZElkeCArIDFdLmVsbTsKICAgICAgYWRkVm5vZGVzKHBhcmVudEVsbSwgcmVmRWxtLCBuZXdDaCwgbmV3U3RhcnRJZHgsIG5ld0VuZElkeCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgIH0gZWxzZSBpZiAobmV3U3RhcnRJZHggPiBuZXdFbmRJZHgpIHsKICAgICAgcmVtb3ZlVm5vZGVzKHBhcmVudEVsbSwgb2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY2hlY2tEdXBsaWNhdGVLZXlzIChjaGlsZHJlbikgewogICAgdmFyIHNlZW5LZXlzID0ge307CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciB2bm9kZSA9IGNoaWxkcmVuW2ldOwogICAgICB2YXIga2V5ID0gdm5vZGUua2V5OwogICAgICBpZiAoaXNEZWYoa2V5KSkgewogICAgICAgIGlmIChzZWVuS2V5c1trZXldKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAoIkR1cGxpY2F0ZSBrZXlzIGRldGVjdGVkOiAnIiArIGtleSArICInLiBUaGlzIG1heSBjYXVzZSBhbiB1cGRhdGUgZXJyb3IuIiksCiAgICAgICAgICAgIHZub2RlLmNvbnRleHQKICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNlZW5LZXlzW2tleV0gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gZmluZElkeEluT2xkIChub2RlLCBvbGRDaCwgc3RhcnQsIGVuZCkgewogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgdmFyIGMgPSBvbGRDaFtpXTsKICAgICAgaWYgKGlzRGVmKGMpICYmIHNhbWVWbm9kZShub2RlLCBjKSkgeyByZXR1cm4gaSB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYXRjaFZub2RlIChvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSkgewogICAgaWYgKG9sZFZub2RlID09PSB2bm9kZSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgZWxtID0gdm5vZGUuZWxtID0gb2xkVm5vZGUuZWxtOwoKICAgIGlmIChpc1RydWUob2xkVm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyKSkgewogICAgICBpZiAoaXNEZWYodm5vZGUuYXN5bmNGYWN0b3J5LnJlc29sdmVkKSkgewogICAgICAgIGh5ZHJhdGUob2xkVm5vZGUuZWxtLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2bm9kZS5pc0FzeW5jUGxhY2Vob2xkZXIgPSB0cnVlOwogICAgICB9CiAgICAgIHJldHVybgogICAgfQoKICAgIC8vIHJldXNlIGVsZW1lbnQgZm9yIHN0YXRpYyB0cmVlcy4KICAgIC8vIG5vdGUgd2Ugb25seSBkbyB0aGlzIGlmIHRoZSB2bm9kZSBpcyBjbG9uZWQgLQogICAgLy8gaWYgdGhlIG5ldyBub2RlIGlzIG5vdCBjbG9uZWQgaXQgbWVhbnMgdGhlIHJlbmRlciBmdW5jdGlvbnMgaGF2ZSBiZWVuCiAgICAvLyByZXNldCBieSB0aGUgaG90LXJlbG9hZC1hcGkgYW5kIHdlIG5lZWQgdG8gZG8gYSBwcm9wZXIgcmUtcmVuZGVyLgogICAgaWYgKGlzVHJ1ZSh2bm9kZS5pc1N0YXRpYykgJiYKICAgICAgaXNUcnVlKG9sZFZub2RlLmlzU3RhdGljKSAmJgogICAgICB2bm9kZS5rZXkgPT09IG9sZFZub2RlLmtleSAmJgogICAgICAoaXNUcnVlKHZub2RlLmlzQ2xvbmVkKSB8fCBpc1RydWUodm5vZGUuaXNPbmNlKSkKICAgICkgewogICAgICB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSA9IG9sZFZub2RlLmNvbXBvbmVudEluc3RhbmNlOwogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgaTsKICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTsKICAgIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5wcmVwYXRjaCkpIHsKICAgICAgaShvbGRWbm9kZSwgdm5vZGUpOwogICAgfQoKICAgIHZhciBvbGRDaCA9IG9sZFZub2RlLmNoaWxkcmVuOwogICAgdmFyIGNoID0gdm5vZGUuY2hpbGRyZW47CiAgICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNQYXRjaGFibGUodm5vZGUpKSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBjYnMudXBkYXRlLmxlbmd0aDsgKytpKSB7IGNicy51cGRhdGVbaV0ob2xkVm5vZGUsIHZub2RlKTsgfQogICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkudXBkYXRlKSkgeyBpKG9sZFZub2RlLCB2bm9kZSk7IH0KICAgIH0KICAgIGlmIChpc1VuZGVmKHZub2RlLnRleHQpKSB7CiAgICAgIGlmIChpc0RlZihvbGRDaCkgJiYgaXNEZWYoY2gpKSB7CiAgICAgICAgaWYgKG9sZENoICE9PSBjaCkgeyB1cGRhdGVDaGlsZHJlbihlbG0sIG9sZENoLCBjaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KTsgfQogICAgICB9IGVsc2UgaWYgKGlzRGVmKGNoKSkgewogICAgICAgIGlmIChpc0RlZihvbGRWbm9kZS50ZXh0KSkgeyBub2RlT3BzLnNldFRleHRDb250ZW50KGVsbSwgJycpOyB9CiAgICAgICAgYWRkVm5vZGVzKGVsbSwgbnVsbCwgY2gsIDAsIGNoLmxlbmd0aCAtIDEsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgIH0gZWxzZSBpZiAoaXNEZWYob2xkQ2gpKSB7CiAgICAgICAgcmVtb3ZlVm5vZGVzKGVsbSwgb2xkQ2gsIDAsIG9sZENoLmxlbmd0aCAtIDEpOwogICAgICB9IGVsc2UgaWYgKGlzRGVmKG9sZFZub2RlLnRleHQpKSB7CiAgICAgICAgbm9kZU9wcy5zZXRUZXh0Q29udGVudChlbG0sICcnKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChvbGRWbm9kZS50ZXh0ICE9PSB2bm9kZS50ZXh0KSB7CiAgICAgIG5vZGVPcHMuc2V0VGV4dENvbnRlbnQoZWxtLCB2bm9kZS50ZXh0KTsKICAgIH0KICAgIGlmIChpc0RlZihkYXRhKSkgewogICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkucG9zdHBhdGNoKSkgeyBpKG9sZFZub2RlLCB2bm9kZSk7IH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGludm9rZUluc2VydEhvb2sgKHZub2RlLCBxdWV1ZSwgaW5pdGlhbCkgewogICAgLy8gZGVsYXkgaW5zZXJ0IGhvb2tzIGZvciBjb21wb25lbnQgcm9vdCBub2RlcywgaW52b2tlIHRoZW0gYWZ0ZXIgdGhlCiAgICAvLyBlbGVtZW50IGlzIHJlYWxseSBpbnNlcnRlZAogICAgaWYgKGlzVHJ1ZShpbml0aWFsKSAmJiBpc0RlZih2bm9kZS5wYXJlbnQpKSB7CiAgICAgIHZub2RlLnBhcmVudC5kYXRhLnBlbmRpbmdJbnNlcnQgPSBxdWV1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyArK2kpIHsKICAgICAgICBxdWV1ZVtpXS5kYXRhLmhvb2suaW5zZXJ0KHF1ZXVlW2ldKTsKICAgICAgfQogICAgfQogIH0KCiAgdmFyIGh5ZHJhdGlvbkJhaWxlZCA9IGZhbHNlOwogIC8vIGxpc3Qgb2YgbW9kdWxlcyB0aGF0IGNhbiBza2lwIGNyZWF0ZSBob29rIGR1cmluZyBoeWRyYXRpb24gYmVjYXVzZSB0aGV5CiAgLy8gYXJlIGFscmVhZHkgcmVuZGVyZWQgb24gdGhlIGNsaWVudCBvciBoYXMgbm8gbmVlZCBmb3IgaW5pdGlhbGl6YXRpb24KICAvLyBOb3RlOiBzdHlsZSBpcyBleGNsdWRlZCBiZWNhdXNlIGl0IHJlbGllcyBvbiBpbml0aWFsIGNsb25lIGZvciBmdXR1cmUKICAvLyBkZWVwIHVwZGF0ZXMgKCM3MDYzKS4KICB2YXIgaXNSZW5kZXJlZE1vZHVsZSA9IG1ha2VNYXAoJ2F0dHJzLGNsYXNzLHN0YXRpY0NsYXNzLHN0YXRpY1N0eWxlLGtleScpOwoKICAvLyBOb3RlOiB0aGlzIGlzIGEgYnJvd3Nlci1vbmx5IGZ1bmN0aW9uIHNvIHdlIGNhbiBhc3N1bWUgZWxtcyBhcmUgRE9NIG5vZGVzLgogIGZ1bmN0aW9uIGh5ZHJhdGUgKGVsbSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgaW5WUHJlKSB7CiAgICB2YXIgaTsKICAgIHZhciB0YWcgPSB2bm9kZS50YWc7CiAgICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7CiAgICB2YXIgY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlbjsKICAgIGluVlByZSA9IGluVlByZSB8fCAoZGF0YSAmJiBkYXRhLnByZSk7CiAgICB2bm9kZS5lbG0gPSBlbG07CgogICAgaWYgKGlzVHJ1ZSh2bm9kZS5pc0NvbW1lbnQpICYmIGlzRGVmKHZub2RlLmFzeW5jRmFjdG9yeSkpIHsKICAgICAgdm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyID0gdHJ1ZTsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICAgIC8vIGFzc2VydCBub2RlIG1hdGNoCiAgICB7CiAgICAgIGlmICghYXNzZXJ0Tm9kZU1hdGNoKGVsbSwgdm5vZGUsIGluVlByZSkpIHsKICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgfQogICAgfQogICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5pbml0KSkgeyBpKHZub2RlLCB0cnVlIC8qIGh5ZHJhdGluZyAqLyk7IH0KICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkpIHsKICAgICAgICAvLyBjaGlsZCBjb21wb25lbnQuIGl0IHNob3VsZCBoYXZlIGh5ZHJhdGVkIGl0cyBvd24gdHJlZS4KICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIHJldHVybiB0cnVlCiAgICAgIH0KICAgIH0KICAgIGlmIChpc0RlZih0YWcpKSB7CiAgICAgIGlmIChpc0RlZihjaGlsZHJlbikpIHsKICAgICAgICAvLyBlbXB0eSBlbGVtZW50LCBhbGxvdyBjbGllbnQgdG8gcGljayB1cCBhbmQgcG9wdWxhdGUgY2hpbGRyZW4KICAgICAgICBpZiAoIWVsbS5oYXNDaGlsZE5vZGVzKCkpIHsKICAgICAgICAgIGNyZWF0ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbiwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gdi1odG1sIGFuZCBkb21Qcm9wczogaW5uZXJIVE1MCiAgICAgICAgICBpZiAoaXNEZWYoaSA9IGRhdGEpICYmIGlzRGVmKGkgPSBpLmRvbVByb3BzKSAmJiBpc0RlZihpID0gaS5pbm5lckhUTUwpKSB7CiAgICAgICAgICAgIGlmIChpICE9PSBlbG0uaW5uZXJIVE1MKSB7CiAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmCiAgICAgICAgICAgICAgICAhaHlkcmF0aW9uQmFpbGVkCiAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICBoeWRyYXRpb25CYWlsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdQYXJlbnQ6ICcsIGVsbSk7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ3NlcnZlciBpbm5lckhUTUw6ICcsIGkpOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdjbGllbnQgaW5uZXJIVE1MOiAnLCBlbG0uaW5uZXJIVE1MKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIGl0ZXJhdGUgYW5kIGNvbXBhcmUgY2hpbGRyZW4gbGlzdHMKICAgICAgICAgICAgdmFyIGNoaWxkcmVuTWF0Y2ggPSB0cnVlOwogICAgICAgICAgICB2YXIgY2hpbGROb2RlID0gZWxtLmZpcnN0Q2hpbGQ7CiAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNoaWxkcmVuLmxlbmd0aDsgaSQxKyspIHsKICAgICAgICAgICAgICBpZiAoIWNoaWxkTm9kZSB8fCAhaHlkcmF0ZShjaGlsZE5vZGUsIGNoaWxkcmVuW2kkMV0sIGluc2VydGVkVm5vZGVRdWV1ZSwgaW5WUHJlKSkgewogICAgICAgICAgICAgICAgY2hpbGRyZW5NYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY2hpbGROb2RlID0gY2hpbGROb2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGlmIGNoaWxkTm9kZSBpcyBub3QgbnVsbCwgaXQgbWVhbnMgdGhlIGFjdHVhbCBjaGlsZE5vZGVzIGxpc3QgaXMKICAgICAgICAgICAgLy8gbG9uZ2VyIHRoYW4gdGhlIHZpcnR1YWwgY2hpbGRyZW4gbGlzdC4KICAgICAgICAgICAgaWYgKCFjaGlsZHJlbk1hdGNoIHx8IGNoaWxkTm9kZSkgewogICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICAgICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJgogICAgICAgICAgICAgICAgIWh5ZHJhdGlvbkJhaWxlZAogICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgaHlkcmF0aW9uQmFpbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUGFyZW50OiAnLCBlbG0pOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdNaXNtYXRjaGluZyBjaGlsZE5vZGVzIHZzLiBWTm9kZXM6ICcsIGVsbS5jaGlsZE5vZGVzLCBjaGlsZHJlbik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpc0RlZihkYXRhKSkgewogICAgICAgIHZhciBmdWxsSW52b2tlID0gZmFsc2U7CiAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICAgIGlmICghaXNSZW5kZXJlZE1vZHVsZShrZXkpKSB7CiAgICAgICAgICAgIGZ1bGxJbnZva2UgPSB0cnVlOwogICAgICAgICAgICBpbnZva2VDcmVhdGVIb29rcyh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICAgICAgYnJlYWsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFmdWxsSW52b2tlICYmIGRhdGFbJ2NsYXNzJ10pIHsKICAgICAgICAgIC8vIGVuc3VyZSBjb2xsZWN0aW5nIGRlcHMgZm9yIGRlZXAgY2xhc3MgYmluZGluZ3MgZm9yIGZ1dHVyZSB1cGRhdGVzCiAgICAgICAgICB0cmF2ZXJzZShkYXRhWydjbGFzcyddKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWxtLmRhdGEgIT09IHZub2RlLnRleHQpIHsKICAgICAgZWxtLmRhdGEgPSB2bm9kZS50ZXh0OwogICAgfQogICAgcmV0dXJuIHRydWUKICB9CgogIGZ1bmN0aW9uIGFzc2VydE5vZGVNYXRjaCAobm9kZSwgdm5vZGUsIGluVlByZSkgewogICAgaWYgKGlzRGVmKHZub2RlLnRhZykpIHsKICAgICAgcmV0dXJuIHZub2RlLnRhZy5pbmRleE9mKCd2dWUtY29tcG9uZW50JykgPT09IDAgfHwgKAogICAgICAgICFpc1Vua25vd25FbGVtZW50JCQxKHZub2RlLCBpblZQcmUpICYmCiAgICAgICAgdm5vZGUudGFnLnRvTG93ZXJDYXNlKCkgPT09IChub2RlLnRhZ05hbWUgJiYgbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpCiAgICAgICkKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAodm5vZGUuaXNDb21tZW50ID8gOCA6IDMpCiAgICB9CiAgfQoKICByZXR1cm4gZnVuY3Rpb24gcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSwgaHlkcmF0aW5nLCByZW1vdmVPbmx5LCBwYXJlbnRFbG0sIHJlZkVsbSkgewogICAgaWYgKGlzVW5kZWYodm5vZGUpKSB7CiAgICAgIGlmIChpc0RlZihvbGRWbm9kZSkpIHsgaW52b2tlRGVzdHJveUhvb2sob2xkVm5vZGUpOyB9CiAgICAgIHJldHVybgogICAgfQoKICAgIHZhciBpc0luaXRpYWxQYXRjaCA9IGZhbHNlOwogICAgdmFyIGluc2VydGVkVm5vZGVRdWV1ZSA9IFtdOwoKICAgIGlmIChpc1VuZGVmKG9sZFZub2RlKSkgewogICAgICAvLyBlbXB0eSBtb3VudCAobGlrZWx5IGFzIGNvbXBvbmVudCksIGNyZWF0ZSBuZXcgcm9vdCBlbGVtZW50CiAgICAgIGlzSW5pdGlhbFBhdGNoID0gdHJ1ZTsKICAgICAgY3JlYXRlRWxtKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBpc1JlYWxFbGVtZW50ID0gaXNEZWYob2xkVm5vZGUubm9kZVR5cGUpOwogICAgICBpZiAoIWlzUmVhbEVsZW1lbnQgJiYgc2FtZVZub2RlKG9sZFZub2RlLCB2bm9kZSkpIHsKICAgICAgICAvLyBwYXRjaCBleGlzdGluZyByb290IG5vZGUKICAgICAgICBwYXRjaFZub2RlKG9sZFZub2RlLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoaXNSZWFsRWxlbWVudCkgewogICAgICAgICAgLy8gbW91bnRpbmcgdG8gYSByZWFsIGVsZW1lbnQKICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQgYW5kIGlmIHdlIGNhbiBwZXJmb3JtCiAgICAgICAgICAvLyBhIHN1Y2Nlc3NmdWwgaHlkcmF0aW9uLgogICAgICAgICAgaWYgKG9sZFZub2RlLm5vZGVUeXBlID09PSAxICYmIG9sZFZub2RlLmhhc0F0dHJpYnV0ZShTU1JfQVRUUikpIHsKICAgICAgICAgICAgb2xkVm5vZGUucmVtb3ZlQXR0cmlidXRlKFNTUl9BVFRSKTsKICAgICAgICAgICAgaHlkcmF0aW5nID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc1RydWUoaHlkcmF0aW5nKSkgewogICAgICAgICAgICBpZiAoaHlkcmF0ZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkpIHsKICAgICAgICAgICAgICBpbnZva2VJbnNlcnRIb29rKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHRydWUpOwogICAgICAgICAgICAgIHJldHVybiBvbGRWbm9kZQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHdhcm4oCiAgICAgICAgICAgICAgICAnVGhlIGNsaWVudC1zaWRlIHJlbmRlcmVkIHZpcnR1YWwgRE9NIHRyZWUgaXMgbm90IG1hdGNoaW5nICcgKwogICAgICAgICAgICAgICAgJ3NlcnZlci1yZW5kZXJlZCBjb250ZW50LiBUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgaW5jb3JyZWN0ICcgKwogICAgICAgICAgICAgICAgJ0hUTUwgbWFya3VwLCBmb3IgZXhhbXBsZSBuZXN0aW5nIGJsb2NrLWxldmVsIGVsZW1lbnRzIGluc2lkZSAnICsKICAgICAgICAgICAgICAgICc8cD4sIG9yIG1pc3NpbmcgPHRib2R5Pi4gQmFpbGluZyBoeWRyYXRpb24gYW5kIHBlcmZvcm1pbmcgJyArCiAgICAgICAgICAgICAgICAnZnVsbCBjbGllbnQtc2lkZSByZW5kZXIuJwogICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIC8vIGVpdGhlciBub3Qgc2VydmVyLXJlbmRlcmVkLCBvciBoeWRyYXRpb24gZmFpbGVkLgogICAgICAgICAgLy8gY3JlYXRlIGFuIGVtcHR5IG5vZGUgYW5kIHJlcGxhY2UgaXQKICAgICAgICAgIG9sZFZub2RlID0gZW1wdHlOb2RlQXQob2xkVm5vZGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gcmVwbGFjaW5nIGV4aXN0aW5nIGVsZW1lbnQKICAgICAgICB2YXIgb2xkRWxtID0gb2xkVm5vZGUuZWxtOwogICAgICAgIHZhciBwYXJlbnRFbG0kMSA9IG5vZGVPcHMucGFyZW50Tm9kZShvbGRFbG0pOwoKICAgICAgICAvLyBjcmVhdGUgbmV3IG5vZGUKICAgICAgICBjcmVhdGVFbG0oCiAgICAgICAgICB2bm9kZSwKICAgICAgICAgIGluc2VydGVkVm5vZGVRdWV1ZSwKICAgICAgICAgIC8vIGV4dHJlbWVseSByYXJlIGVkZ2UgY2FzZTogZG8gbm90IGluc2VydCBpZiBvbGQgZWxlbWVudCBpcyBpbiBhCiAgICAgICAgICAvLyBsZWF2aW5nIHRyYW5zaXRpb24uIE9ubHkgaGFwcGVucyB3aGVuIGNvbWJpbmluZyB0cmFuc2l0aW9uICsKICAgICAgICAgIC8vIGtlZXAtYWxpdmUgKyBIT0NzLiAoIzQ1OTApCiAgICAgICAgICBvbGRFbG0uX2xlYXZlQ2IgPyBudWxsIDogcGFyZW50RWxtJDEsCiAgICAgICAgICBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVsbSkKICAgICAgICApOwoKICAgICAgICAvLyB1cGRhdGUgcGFyZW50IHBsYWNlaG9sZGVyIG5vZGUgZWxlbWVudCwgcmVjdXJzaXZlbHkKICAgICAgICBpZiAoaXNEZWYodm5vZGUucGFyZW50KSkgewogICAgICAgICAgdmFyIGFuY2VzdG9yID0gdm5vZGUucGFyZW50OwogICAgICAgICAgdmFyIHBhdGNoYWJsZSA9IGlzUGF0Y2hhYmxlKHZub2RlKTsKICAgICAgICAgIHdoaWxlIChhbmNlc3RvcikgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNicy5kZXN0cm95Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgY2JzLmRlc3Ryb3lbaV0oYW5jZXN0b3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFuY2VzdG9yLmVsbSA9IHZub2RlLmVsbTsKICAgICAgICAgICAgaWYgKHBhdGNoYWJsZSkgewogICAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkgewogICAgICAgICAgICAgICAgY2JzLmNyZWF0ZVtpJDFdKGVtcHR5Tm9kZSwgYW5jZXN0b3IpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyAjNjUxMwogICAgICAgICAgICAgIC8vIGludm9rZSBpbnNlcnQgaG9va3MgdGhhdCBtYXkgaGF2ZSBiZWVuIG1lcmdlZCBieSBjcmVhdGUgaG9va3MuCiAgICAgICAgICAgICAgLy8gZS5nLiBmb3IgZGlyZWN0aXZlcyB0aGF0IHVzZXMgdGhlICJpbnNlcnRlZCIgaG9vay4KICAgICAgICAgICAgICB2YXIgaW5zZXJ0ID0gYW5jZXN0b3IuZGF0YS5ob29rLmluc2VydDsKICAgICAgICAgICAgICBpZiAoaW5zZXJ0Lm1lcmdlZCkgewogICAgICAgICAgICAgICAgLy8gc3RhcnQgYXQgaW5kZXggMSB0byBhdm9pZCByZS1pbnZva2luZyBjb21wb25lbnQgbW91bnRlZCBob29rCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpJDIgPSAxOyBpJDIgPCBpbnNlcnQuZm5zLmxlbmd0aDsgaSQyKyspIHsKICAgICAgICAgICAgICAgICAgaW5zZXJ0LmZuc1tpJDJdKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJlZ2lzdGVyUmVmKGFuY2VzdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIGRlc3Ryb3kgb2xkIG5vZGUKICAgICAgICBpZiAoaXNEZWYocGFyZW50RWxtJDEpKSB7CiAgICAgICAgICByZW1vdmVWbm9kZXMocGFyZW50RWxtJDEsIFtvbGRWbm9kZV0sIDAsIDApOwogICAgICAgIH0gZWxzZSBpZiAoaXNEZWYob2xkVm5vZGUudGFnKSkgewogICAgICAgICAgaW52b2tlRGVzdHJveUhvb2sob2xkVm5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGludm9rZUluc2VydEhvb2sodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgaXNJbml0aWFsUGF0Y2gpOwogICAgcmV0dXJuIHZub2RlLmVsbQogIH0KfQoKLyogICovCgp2YXIgZGlyZWN0aXZlcyA9IHsKICBjcmVhdGU6IHVwZGF0ZURpcmVjdGl2ZXMsCiAgdXBkYXRlOiB1cGRhdGVEaXJlY3RpdmVzLAogIGRlc3Ryb3k6IGZ1bmN0aW9uIHVuYmluZERpcmVjdGl2ZXMgKHZub2RlKSB7CiAgICB1cGRhdGVEaXJlY3RpdmVzKHZub2RlLCBlbXB0eU5vZGUpOwogIH0KfQoKZnVuY3Rpb24gdXBkYXRlRGlyZWN0aXZlcyAob2xkVm5vZGUsIHZub2RlKSB7CiAgaWYgKG9sZFZub2RlLmRhdGEuZGlyZWN0aXZlcyB8fCB2bm9kZS5kYXRhLmRpcmVjdGl2ZXMpIHsKICAgIF91cGRhdGUob2xkVm5vZGUsIHZub2RlKTsKICB9Cn0KCmZ1bmN0aW9uIF91cGRhdGUgKG9sZFZub2RlLCB2bm9kZSkgewogIHZhciBpc0NyZWF0ZSA9IG9sZFZub2RlID09PSBlbXB0eU5vZGU7CiAgdmFyIGlzRGVzdHJveSA9IHZub2RlID09PSBlbXB0eU5vZGU7CiAgdmFyIG9sZERpcnMgPSBub3JtYWxpemVEaXJlY3RpdmVzJDEob2xkVm5vZGUuZGF0YS5kaXJlY3RpdmVzLCBvbGRWbm9kZS5jb250ZXh0KTsKICB2YXIgbmV3RGlycyA9IG5vcm1hbGl6ZURpcmVjdGl2ZXMkMSh2bm9kZS5kYXRhLmRpcmVjdGl2ZXMsIHZub2RlLmNvbnRleHQpOwoKICB2YXIgZGlyc1dpdGhJbnNlcnQgPSBbXTsKICB2YXIgZGlyc1dpdGhQb3N0cGF0Y2ggPSBbXTsKCiAgdmFyIGtleSwgb2xkRGlyLCBkaXI7CiAgZm9yIChrZXkgaW4gbmV3RGlycykgewogICAgb2xkRGlyID0gb2xkRGlyc1trZXldOwogICAgZGlyID0gbmV3RGlyc1trZXldOwogICAgaWYgKCFvbGREaXIpIHsKICAgICAgLy8gbmV3IGRpcmVjdGl2ZSwgYmluZAogICAgICBjYWxsSG9vayQxKGRpciwgJ2JpbmQnLCB2bm9kZSwgb2xkVm5vZGUpOwogICAgICBpZiAoZGlyLmRlZiAmJiBkaXIuZGVmLmluc2VydGVkKSB7CiAgICAgICAgZGlyc1dpdGhJbnNlcnQucHVzaChkaXIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBleGlzdGluZyBkaXJlY3RpdmUsIHVwZGF0ZQogICAgICBkaXIub2xkVmFsdWUgPSBvbGREaXIudmFsdWU7CiAgICAgIGNhbGxIb29rJDEoZGlyLCAndXBkYXRlJywgdm5vZGUsIG9sZFZub2RlKTsKICAgICAgaWYgKGRpci5kZWYgJiYgZGlyLmRlZi5jb21wb25lbnRVcGRhdGVkKSB7CiAgICAgICAgZGlyc1dpdGhQb3N0cGF0Y2gucHVzaChkaXIpOwogICAgICB9CiAgICB9CiAgfQoKICBpZiAoZGlyc1dpdGhJbnNlcnQubGVuZ3RoKSB7CiAgICB2YXIgY2FsbEluc2VydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXJzV2l0aEluc2VydC5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxIb29rJDEoZGlyc1dpdGhJbnNlcnRbaV0sICdpbnNlcnRlZCcsIHZub2RlLCBvbGRWbm9kZSk7CiAgICAgIH0KICAgIH07CiAgICBpZiAoaXNDcmVhdGUpIHsKICAgICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdpbnNlcnQnLCBjYWxsSW5zZXJ0KTsKICAgIH0gZWxzZSB7CiAgICAgIGNhbGxJbnNlcnQoKTsKICAgIH0KICB9CgogIGlmIChkaXJzV2l0aFBvc3RwYXRjaC5sZW5ndGgpIHsKICAgIG1lcmdlVk5vZGVIb29rKHZub2RlLCAncG9zdHBhdGNoJywgZnVuY3Rpb24gKCkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpcnNXaXRoUG9zdHBhdGNoLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY2FsbEhvb2skMShkaXJzV2l0aFBvc3RwYXRjaFtpXSwgJ2NvbXBvbmVudFVwZGF0ZWQnLCB2bm9kZSwgb2xkVm5vZGUpOwogICAgICB9CiAgICB9KTsKICB9CgogIGlmICghaXNDcmVhdGUpIHsKICAgIGZvciAoa2V5IGluIG9sZERpcnMpIHsKICAgICAgaWYgKCFuZXdEaXJzW2tleV0pIHsKICAgICAgICAvLyBubyBsb25nZXIgcHJlc2VudCwgdW5iaW5kCiAgICAgICAgY2FsbEhvb2skMShvbGREaXJzW2tleV0sICd1bmJpbmQnLCBvbGRWbm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCnZhciBlbXB0eU1vZGlmaWVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CgpmdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzJDEgKAogIGRpcnMsCiAgdm0KKSB7CiAgdmFyIHJlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgaWYgKCFkaXJzKSB7CiAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgIHJldHVybiByZXMKICB9CiAgdmFyIGksIGRpcjsKICBmb3IgKGkgPSAwOyBpIDwgZGlycy5sZW5ndGg7IGkrKykgewogICAgZGlyID0gZGlyc1tpXTsKICAgIGlmICghZGlyLm1vZGlmaWVycykgewogICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgICAgZGlyLm1vZGlmaWVycyA9IGVtcHR5TW9kaWZpZXJzOwogICAgfQogICAgcmVzW2dldFJhd0Rpck5hbWUoZGlyKV0gPSBkaXI7CiAgICBkaXIuZGVmID0gcmVzb2x2ZUFzc2V0KHZtLiRvcHRpb25zLCAnZGlyZWN0aXZlcycsIGRpci5uYW1lLCB0cnVlKTsKICB9CiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgcmV0dXJuIHJlcwp9CgpmdW5jdGlvbiBnZXRSYXdEaXJOYW1lIChkaXIpIHsKICByZXR1cm4gZGlyLnJhd05hbWUgfHwgKChkaXIubmFtZSkgKyAiLiIgKyAoT2JqZWN0LmtleXMoZGlyLm1vZGlmaWVycyB8fCB7fSkuam9pbignLicpKSkKfQoKZnVuY3Rpb24gY2FsbEhvb2skMSAoZGlyLCBob29rLCB2bm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSkgewogIHZhciBmbiA9IGRpci5kZWYgJiYgZGlyLmRlZltob29rXTsKICBpZiAoZm4pIHsKICAgIHRyeSB7CiAgICAgIGZuKHZub2RlLmVsbSwgZGlyLCB2bm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGhhbmRsZUVycm9yKGUsIHZub2RlLmNvbnRleHQsICgiZGlyZWN0aXZlICIgKyAoZGlyLm5hbWUpICsgIiAiICsgaG9vayArICIgaG9vayIpKTsKICAgIH0KICB9Cn0KCnZhciBiYXNlTW9kdWxlcyA9IFsKICByZWYsCiAgZGlyZWN0aXZlcwpdCgovKiAgKi8KCmZ1bmN0aW9uIHVwZGF0ZUF0dHJzIChvbGRWbm9kZSwgdm5vZGUpIHsKICB2YXIgb3B0cyA9IHZub2RlLmNvbXBvbmVudE9wdGlvbnM7CiAgaWYgKGlzRGVmKG9wdHMpICYmIG9wdHMuQ3Rvci5vcHRpb25zLmluaGVyaXRBdHRycyA9PT0gZmFsc2UpIHsKICAgIHJldHVybgogIH0KICBpZiAoaXNVbmRlZihvbGRWbm9kZS5kYXRhLmF0dHJzKSAmJiBpc1VuZGVmKHZub2RlLmRhdGEuYXR0cnMpKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIGtleSwgY3VyLCBvbGQ7CiAgdmFyIGVsbSA9IHZub2RlLmVsbTsKICB2YXIgb2xkQXR0cnMgPSBvbGRWbm9kZS5kYXRhLmF0dHJzIHx8IHt9OwogIHZhciBhdHRycyA9IHZub2RlLmRhdGEuYXR0cnMgfHwge307CiAgLy8gY2xvbmUgb2JzZXJ2ZWQgb2JqZWN0cywgYXMgdGhlIHVzZXIgcHJvYmFibHkgd2FudHMgdG8gbXV0YXRlIGl0CiAgaWYgKGlzRGVmKGF0dHJzLl9fb2JfXykpIHsKICAgIGF0dHJzID0gdm5vZGUuZGF0YS5hdHRycyA9IGV4dGVuZCh7fSwgYXR0cnMpOwogIH0KCiAgZm9yIChrZXkgaW4gYXR0cnMpIHsKICAgIGN1ciA9IGF0dHJzW2tleV07CiAgICBvbGQgPSBvbGRBdHRyc1trZXldOwogICAgaWYgKG9sZCAhPT0gY3VyKSB7CiAgICAgIHNldEF0dHIoZWxtLCBrZXksIGN1cik7CiAgICB9CiAgfQogIC8vICM0MzkxOiBpbiBJRTksIHNldHRpbmcgdHlwZSBjYW4gcmVzZXQgdmFsdWUgZm9yIGlucHV0W3R5cGU9cmFkaW9dCiAgLy8gIzY2NjY6IElFL0VkZ2UgZm9yY2VzIHByb2dyZXNzIHZhbHVlIGRvd24gdG8gMSBiZWZvcmUgc2V0dGluZyBhIG1heAogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmICgoaXNJRSB8fCBpc0VkZ2UpICYmIGF0dHJzLnZhbHVlICE9PSBvbGRBdHRycy52YWx1ZSkgewogICAgc2V0QXR0cihlbG0sICd2YWx1ZScsIGF0dHJzLnZhbHVlKTsKICB9CiAgZm9yIChrZXkgaW4gb2xkQXR0cnMpIHsKICAgIGlmIChpc1VuZGVmKGF0dHJzW2tleV0pKSB7CiAgICAgIGlmIChpc1hsaW5rKGtleSkpIHsKICAgICAgICBlbG0ucmVtb3ZlQXR0cmlidXRlTlMoeGxpbmtOUywgZ2V0WGxpbmtQcm9wKGtleSkpOwogICAgICB9IGVsc2UgaWYgKCFpc0VudW1lcmF0ZWRBdHRyKGtleSkpIHsKICAgICAgICBlbG0ucmVtb3ZlQXR0cmlidXRlKGtleSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIHNldEF0dHIgKGVsLCBrZXksIHZhbHVlKSB7CiAgaWYgKGVsLnRhZ05hbWUuaW5kZXhPZignLScpID4gLTEpIHsKICAgIGJhc2VTZXRBdHRyKGVsLCBrZXksIHZhbHVlKTsKICB9IGVsc2UgaWYgKGlzQm9vbGVhbkF0dHIoa2V5KSkgewogICAgLy8gc2V0IGF0dHJpYnV0ZSBmb3IgYmxhbmsgdmFsdWUKICAgIC8vIGUuZy4gPG9wdGlvbiBkaXNhYmxlZD5TZWxlY3Qgb25lPC9vcHRpb24+CiAgICBpZiAoaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkpIHsKICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGtleSk7CiAgICB9IGVsc2UgewogICAgICAvLyB0ZWNobmljYWxseSBhbGxvd2Z1bGxzY3JlZW4gaXMgYSBib29sZWFuIGF0dHJpYnV0ZSBmb3IgPGlmcmFtZT4sCiAgICAgIC8vIGJ1dCBGbGFzaCBleHBlY3RzIGEgdmFsdWUgb2YgInRydWUiIHdoZW4gdXNlZCBvbiA8ZW1iZWQ+IHRhZwogICAgICB2YWx1ZSA9IGtleSA9PT0gJ2FsbG93ZnVsbHNjcmVlbicgJiYgZWwudGFnTmFtZSA9PT0gJ0VNQkVEJwogICAgICAgID8gJ3RydWUnCiAgICAgICAgOiBrZXk7CiAgICAgIGVsLnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTsKICAgIH0KICB9IGVsc2UgaWYgKGlzRW51bWVyYXRlZEF0dHIoa2V5KSkgewogICAgZWwuc2V0QXR0cmlidXRlKGtleSwgaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkgfHwgdmFsdWUgPT09ICdmYWxzZScgPyAnZmFsc2UnIDogJ3RydWUnKTsKICB9IGVsc2UgaWYgKGlzWGxpbmsoa2V5KSkgewogICAgaWYgKGlzRmFsc3lBdHRyVmFsdWUodmFsdWUpKSB7CiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZU5TKHhsaW5rTlMsIGdldFhsaW5rUHJvcChrZXkpKTsKICAgIH0gZWxzZSB7CiAgICAgIGVsLnNldEF0dHJpYnV0ZU5TKHhsaW5rTlMsIGtleSwgdmFsdWUpOwogICAgfQogIH0gZWxzZSB7CiAgICBiYXNlU2V0QXR0cihlbCwga2V5LCB2YWx1ZSk7CiAgfQp9CgpmdW5jdGlvbiBiYXNlU2V0QXR0ciAoZWwsIGtleSwgdmFsdWUpIHsKICBpZiAoaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkpIHsKICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpOwogIH0gZWxzZSB7CiAgICAvLyAjNzEzODogSUUxMCAmIDExIGZpcmVzIGlucHV0IGV2ZW50IHdoZW4gc2V0dGluZyBwbGFjZWhvbGRlciBvbgogICAgLy8gPHRleHRhcmVhPi4uLiBibG9jayB0aGUgZmlyc3QgaW5wdXQgZXZlbnQgYW5kIHJlbW92ZSB0aGUgYmxvY2tlcgogICAgLy8gaW1tZWRpYXRlbHkuCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIGlmICgKICAgICAgaXNJRSAmJiAhaXNJRTkgJiYKICAgICAgZWwudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyAmJgogICAgICBrZXkgPT09ICdwbGFjZWhvbGRlcicgJiYgIWVsLl9faWVwaAogICAgKSB7CiAgICAgIHZhciBibG9ja2VyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2lucHV0JywgYmxvY2tlcik7CiAgICAgIH07CiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgYmxvY2tlcik7CiAgICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgICBlbC5fX2llcGggPSB0cnVlOyAvKiBJRSBwbGFjZWhvbGRlciBwYXRjaGVkICovCiAgICB9CiAgICBlbC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7CiAgfQp9Cgp2YXIgYXR0cnMgPSB7CiAgY3JlYXRlOiB1cGRhdGVBdHRycywKICB1cGRhdGU6IHVwZGF0ZUF0dHJzCn0KCi8qICAqLwoKZnVuY3Rpb24gdXBkYXRlQ2xhc3MgKG9sZFZub2RlLCB2bm9kZSkgewogIHZhciBlbCA9IHZub2RlLmVsbTsKICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7CiAgdmFyIG9sZERhdGEgPSBvbGRWbm9kZS5kYXRhOwogIGlmICgKICAgIGlzVW5kZWYoZGF0YS5zdGF0aWNDbGFzcykgJiYKICAgIGlzVW5kZWYoZGF0YS5jbGFzcykgJiYgKAogICAgICBpc1VuZGVmKG9sZERhdGEpIHx8ICgKICAgICAgICBpc1VuZGVmKG9sZERhdGEuc3RhdGljQ2xhc3MpICYmCiAgICAgICAgaXNVbmRlZihvbGREYXRhLmNsYXNzKQogICAgICApCiAgICApCiAgKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBjbHMgPSBnZW5DbGFzc0ZvclZub2RlKHZub2RlKTsKCiAgLy8gaGFuZGxlIHRyYW5zaXRpb24gY2xhc3NlcwogIHZhciB0cmFuc2l0aW9uQ2xhc3MgPSBlbC5fdHJhbnNpdGlvbkNsYXNzZXM7CiAgaWYgKGlzRGVmKHRyYW5zaXRpb25DbGFzcykpIHsKICAgIGNscyA9IGNvbmNhdChjbHMsIHN0cmluZ2lmeUNsYXNzKHRyYW5zaXRpb25DbGFzcykpOwogIH0KCiAgLy8gc2V0IHRoZSBjbGFzcwogIGlmIChjbHMgIT09IGVsLl9wcmV2Q2xhc3MpIHsKICAgIGVsLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBjbHMpOwogICAgZWwuX3ByZXZDbGFzcyA9IGNsczsKICB9Cn0KCnZhciBrbGFzcyA9IHsKICBjcmVhdGU6IHVwZGF0ZUNsYXNzLAogIHVwZGF0ZTogdXBkYXRlQ2xhc3MKfQoKLyogICovCgp2YXIgdmFsaWREaXZpc2lvbkNoYXJSRSA9IC9bXHcpLitcLV8kXF1dLzsKCmZ1bmN0aW9uIHBhcnNlRmlsdGVycyAoZXhwKSB7CiAgdmFyIGluU2luZ2xlID0gZmFsc2U7CiAgdmFyIGluRG91YmxlID0gZmFsc2U7CiAgdmFyIGluVGVtcGxhdGVTdHJpbmcgPSBmYWxzZTsKICB2YXIgaW5SZWdleCA9IGZhbHNlOwogIHZhciBjdXJseSA9IDA7CiAgdmFyIHNxdWFyZSA9IDA7CiAgdmFyIHBhcmVuID0gMDsKICB2YXIgbGFzdEZpbHRlckluZGV4ID0gMDsKICB2YXIgYywgcHJldiwgaSwgZXhwcmVzc2lvbiwgZmlsdGVyczsKCiAgZm9yIChpID0gMDsgaSA8IGV4cC5sZW5ndGg7IGkrKykgewogICAgcHJldiA9IGM7CiAgICBjID0gZXhwLmNoYXJDb2RlQXQoaSk7CiAgICBpZiAoaW5TaW5nbGUpIHsKICAgICAgaWYgKGMgPT09IDB4MjcgJiYgcHJldiAhPT0gMHg1QykgeyBpblNpbmdsZSA9IGZhbHNlOyB9CiAgICB9IGVsc2UgaWYgKGluRG91YmxlKSB7CiAgICAgIGlmIChjID09PSAweDIyICYmIHByZXYgIT09IDB4NUMpIHsgaW5Eb3VibGUgPSBmYWxzZTsgfQogICAgfSBlbHNlIGlmIChpblRlbXBsYXRlU3RyaW5nKSB7CiAgICAgIGlmIChjID09PSAweDYwICYmIHByZXYgIT09IDB4NUMpIHsgaW5UZW1wbGF0ZVN0cmluZyA9IGZhbHNlOyB9CiAgICB9IGVsc2UgaWYgKGluUmVnZXgpIHsKICAgICAgaWYgKGMgPT09IDB4MmYgJiYgcHJldiAhPT0gMHg1QykgeyBpblJlZ2V4ID0gZmFsc2U7IH0KICAgIH0gZWxzZSBpZiAoCiAgICAgIGMgPT09IDB4N0MgJiYgLy8gcGlwZQogICAgICBleHAuY2hhckNvZGVBdChpICsgMSkgIT09IDB4N0MgJiYKICAgICAgZXhwLmNoYXJDb2RlQXQoaSAtIDEpICE9PSAweDdDICYmCiAgICAgICFjdXJseSAmJiAhc3F1YXJlICYmICFwYXJlbgogICAgKSB7CiAgICAgIGlmIChleHByZXNzaW9uID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBmaXJzdCBmaWx0ZXIsIGVuZCBvZiBleHByZXNzaW9uCiAgICAgICAgbGFzdEZpbHRlckluZGV4ID0gaSArIDE7CiAgICAgICAgZXhwcmVzc2lvbiA9IGV4cC5zbGljZSgwLCBpKS50cmltKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHVzaEZpbHRlcigpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICBjYXNlIDB4MjI6IGluRG91YmxlID0gdHJ1ZTsgYnJlYWsgICAgICAgICAvLyAiCiAgICAgICAgY2FzZSAweDI3OiBpblNpbmdsZSA9IHRydWU7IGJyZWFrICAgICAgICAgLy8gJwogICAgICAgIGNhc2UgMHg2MDogaW5UZW1wbGF0ZVN0cmluZyA9IHRydWU7IGJyZWFrIC8vIGAKICAgICAgICBjYXNlIDB4Mjg6IHBhcmVuKys7IGJyZWFrICAgICAgICAgICAgICAgICAvLyAoCiAgICAgICAgY2FzZSAweDI5OiBwYXJlbi0tOyBicmVhayAgICAgICAgICAgICAgICAgLy8gKQogICAgICAgIGNhc2UgMHg1Qjogc3F1YXJlKys7IGJyZWFrICAgICAgICAgICAgICAgIC8vIFsKICAgICAgICBjYXNlIDB4NUQ6IHNxdWFyZS0tOyBicmVhayAgICAgICAgICAgICAgICAvLyBdCiAgICAgICAgY2FzZSAweDdCOiBjdXJseSsrOyBicmVhayAgICAgICAgICAgICAgICAgLy8gewogICAgICAgIGNhc2UgMHg3RDogY3VybHktLTsgYnJlYWsgICAgICAgICAgICAgICAgIC8vIH0KICAgICAgfQogICAgICBpZiAoYyA9PT0gMHgyZikgeyAvLyAvCiAgICAgICAgdmFyIGogPSBpIC0gMTsKICAgICAgICB2YXIgcCA9ICh2b2lkIDApOwogICAgICAgIC8vIGZpbmQgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgcHJldiBjaGFyCiAgICAgICAgZm9yICg7IGogPj0gMDsgai0tKSB7CiAgICAgICAgICBwID0gZXhwLmNoYXJBdChqKTsKICAgICAgICAgIGlmIChwICE9PSAnICcpIHsgYnJlYWsgfQogICAgICAgIH0KICAgICAgICBpZiAoIXAgfHwgIXZhbGlkRGl2aXNpb25DaGFyUkUudGVzdChwKSkgewogICAgICAgICAgaW5SZWdleCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBpZiAoZXhwcmVzc2lvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICBleHByZXNzaW9uID0gZXhwLnNsaWNlKDAsIGkpLnRyaW0oKTsKICB9IGVsc2UgaWYgKGxhc3RGaWx0ZXJJbmRleCAhPT0gMCkgewogICAgcHVzaEZpbHRlcigpOwogIH0KCiAgZnVuY3Rpb24gcHVzaEZpbHRlciAoKSB7CiAgICAoZmlsdGVycyB8fCAoZmlsdGVycyA9IFtdKSkucHVzaChleHAuc2xpY2UobGFzdEZpbHRlckluZGV4LCBpKS50cmltKCkpOwogICAgbGFzdEZpbHRlckluZGV4ID0gaSArIDE7CiAgfQoKICBpZiAoZmlsdGVycykgewogICAgZm9yIChpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgZXhwcmVzc2lvbiA9IHdyYXBGaWx0ZXIoZXhwcmVzc2lvbiwgZmlsdGVyc1tpXSk7CiAgICB9CiAgfQoKICByZXR1cm4gZXhwcmVzc2lvbgp9CgpmdW5jdGlvbiB3cmFwRmlsdGVyIChleHAsIGZpbHRlcikgewogIHZhciBpID0gZmlsdGVyLmluZGV4T2YoJygnKTsKICBpZiAoaSA8IDApIHsKICAgIC8vIF9mOiByZXNvbHZlRmlsdGVyCiAgICByZXR1cm4gKCJfZihcIiIgKyBmaWx0ZXIgKyAiXCIpKCIgKyBleHAgKyAiKSIpCiAgfSBlbHNlIHsKICAgIHZhciBuYW1lID0gZmlsdGVyLnNsaWNlKDAsIGkpOwogICAgdmFyIGFyZ3MgPSBmaWx0ZXIuc2xpY2UoaSArIDEpOwogICAgcmV0dXJuICgiX2YoXCIiICsgbmFtZSArICJcIikoIiArIGV4cCArIChhcmdzICE9PSAnKScgPyAnLCcgKyBhcmdzIDogYXJncykpCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGJhc2VXYXJuIChtc2cpIHsKICBjb25zb2xlLmVycm9yKCgiW1Z1ZSBjb21waWxlcl06ICIgKyBtc2cpKTsKfQoKZnVuY3Rpb24gcGx1Y2tNb2R1bGVGdW5jdGlvbiAoCiAgbW9kdWxlcywKICBrZXkKKSB7CiAgcmV0dXJuIG1vZHVsZXMKICAgID8gbW9kdWxlcy5tYXAoZnVuY3Rpb24gKG0pIHsgcmV0dXJuIG1ba2V5XTsgfSkuZmlsdGVyKGZ1bmN0aW9uIChfKSB7IHJldHVybiBfOyB9KQogICAgOiBbXQp9CgpmdW5jdGlvbiBhZGRQcm9wIChlbCwgbmFtZSwgdmFsdWUpIHsKICAoZWwucHJvcHMgfHwgKGVsLnByb3BzID0gW10pKS5wdXNoKHsgbmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlIH0pOwogIGVsLnBsYWluID0gZmFsc2U7Cn0KCmZ1bmN0aW9uIGFkZEF0dHIgKGVsLCBuYW1lLCB2YWx1ZSkgewogIChlbC5hdHRycyB8fCAoZWwuYXR0cnMgPSBbXSkpLnB1c2goeyBuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWUgfSk7CiAgZWwucGxhaW4gPSBmYWxzZTsKfQoKLy8gYWRkIGEgcmF3IGF0dHIgKHVzZSB0aGlzIGluIHByZVRyYW5zZm9ybXMpCmZ1bmN0aW9uIGFkZFJhd0F0dHIgKGVsLCBuYW1lLCB2YWx1ZSkgewogIGVsLmF0dHJzTWFwW25hbWVdID0gdmFsdWU7CiAgZWwuYXR0cnNMaXN0LnB1c2goeyBuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWUgfSk7Cn0KCmZ1bmN0aW9uIGFkZERpcmVjdGl2ZSAoCiAgZWwsCiAgbmFtZSwKICByYXdOYW1lLAogIHZhbHVlLAogIGFyZywKICBtb2RpZmllcnMKKSB7CiAgKGVsLmRpcmVjdGl2ZXMgfHwgKGVsLmRpcmVjdGl2ZXMgPSBbXSkpLnB1c2goeyBuYW1lOiBuYW1lLCByYXdOYW1lOiByYXdOYW1lLCB2YWx1ZTogdmFsdWUsIGFyZzogYXJnLCBtb2RpZmllcnM6IG1vZGlmaWVycyB9KTsKICBlbC5wbGFpbiA9IGZhbHNlOwp9CgpmdW5jdGlvbiBhZGRIYW5kbGVyICgKICBlbCwKICBuYW1lLAogIHZhbHVlLAogIG1vZGlmaWVycywKICBpbXBvcnRhbnQsCiAgd2FybgopIHsKICBtb2RpZmllcnMgPSBtb2RpZmllcnMgfHwgZW1wdHlPYmplY3Q7CiAgLy8gd2FybiBwcmV2ZW50IGFuZCBwYXNzaXZlIG1vZGlmaWVyCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKAogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4gJiYKICAgIG1vZGlmaWVycy5wcmV2ZW50ICYmIG1vZGlmaWVycy5wYXNzaXZlCiAgKSB7CiAgICB3YXJuKAogICAgICAncGFzc2l2ZSBhbmQgcHJldmVudCBjYW5cJ3QgYmUgdXNlZCB0b2dldGhlci4gJyArCiAgICAgICdQYXNzaXZlIGhhbmRsZXIgY2FuXCd0IHByZXZlbnQgZGVmYXVsdCBldmVudC4nCiAgICApOwogIH0KCiAgLy8gY2hlY2sgY2FwdHVyZSBtb2RpZmllcgogIGlmIChtb2RpZmllcnMuY2FwdHVyZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5jYXB0dXJlOwogICAgbmFtZSA9ICchJyArIG5hbWU7IC8vIG1hcmsgdGhlIGV2ZW50IGFzIGNhcHR1cmVkCiAgfQogIGlmIChtb2RpZmllcnMub25jZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5vbmNlOwogICAgbmFtZSA9ICd+JyArIG5hbWU7IC8vIG1hcmsgdGhlIGV2ZW50IGFzIG9uY2UKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKG1vZGlmaWVycy5wYXNzaXZlKSB7CiAgICBkZWxldGUgbW9kaWZpZXJzLnBhc3NpdmU7CiAgICBuYW1lID0gJyYnICsgbmFtZTsgLy8gbWFyayB0aGUgZXZlbnQgYXMgcGFzc2l2ZQogIH0KCiAgLy8gbm9ybWFsaXplIGNsaWNrLnJpZ2h0IGFuZCBjbGljay5taWRkbGUgc2luY2UgdGhleSBkb24ndCBhY3R1YWxseSBmaXJlCiAgLy8gdGhpcyBpcyB0ZWNobmljYWxseSBicm93c2VyLXNwZWNpZmljLCBidXQgYXQgbGVhc3QgZm9yIG5vdyBicm93c2VycyBhcmUKICAvLyB0aGUgb25seSB0YXJnZXQgZW52cyB0aGF0IGhhdmUgcmlnaHQvbWlkZGxlIGNsaWNrcy4KICBpZiAobmFtZSA9PT0gJ2NsaWNrJykgewogICAgaWYgKG1vZGlmaWVycy5yaWdodCkgewogICAgICBuYW1lID0gJ2NvbnRleHRtZW51JzsKICAgICAgZGVsZXRlIG1vZGlmaWVycy5yaWdodDsKICAgIH0gZWxzZSBpZiAobW9kaWZpZXJzLm1pZGRsZSkgewogICAgICBuYW1lID0gJ21vdXNldXAnOwogICAgfQogIH0KCiAgdmFyIGV2ZW50czsKICBpZiAobW9kaWZpZXJzLm5hdGl2ZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5uYXRpdmU7CiAgICBldmVudHMgPSBlbC5uYXRpdmVFdmVudHMgfHwgKGVsLm5hdGl2ZUV2ZW50cyA9IHt9KTsKICB9IGVsc2UgewogICAgZXZlbnRzID0gZWwuZXZlbnRzIHx8IChlbC5ldmVudHMgPSB7fSk7CiAgfQoKICB2YXIgbmV3SGFuZGxlciA9IHsKICAgIHZhbHVlOiB2YWx1ZS50cmltKCkKICB9OwogIGlmIChtb2RpZmllcnMgIT09IGVtcHR5T2JqZWN0KSB7CiAgICBuZXdIYW5kbGVyLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKICB9CgogIHZhciBoYW5kbGVycyA9IGV2ZW50c1tuYW1lXTsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoQXJyYXkuaXNBcnJheShoYW5kbGVycykpIHsKICAgIGltcG9ydGFudCA/IGhhbmRsZXJzLnVuc2hpZnQobmV3SGFuZGxlcikgOiBoYW5kbGVycy5wdXNoKG5ld0hhbmRsZXIpOwogIH0gZWxzZSBpZiAoaGFuZGxlcnMpIHsKICAgIGV2ZW50c1tuYW1lXSA9IGltcG9ydGFudCA/IFtuZXdIYW5kbGVyLCBoYW5kbGVyc10gOiBbaGFuZGxlcnMsIG5ld0hhbmRsZXJdOwogIH0gZWxzZSB7CiAgICBldmVudHNbbmFtZV0gPSBuZXdIYW5kbGVyOwogIH0KCiAgZWwucGxhaW4gPSBmYWxzZTsKfQoKZnVuY3Rpb24gZ2V0QmluZGluZ0F0dHIgKAogIGVsLAogIG5hbWUsCiAgZ2V0U3RhdGljCikgewogIHZhciBkeW5hbWljVmFsdWUgPQogICAgZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJzonICsgbmFtZSkgfHwKICAgIGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LWJpbmQ6JyArIG5hbWUpOwogIGlmIChkeW5hbWljVmFsdWUgIT0gbnVsbCkgewogICAgcmV0dXJuIHBhcnNlRmlsdGVycyhkeW5hbWljVmFsdWUpCiAgfSBlbHNlIGlmIChnZXRTdGF0aWMgIT09IGZhbHNlKSB7CiAgICB2YXIgc3RhdGljVmFsdWUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCBuYW1lKTsKICAgIGlmIChzdGF0aWNWYWx1ZSAhPSBudWxsKSB7CiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzdGF0aWNWYWx1ZSkKICAgIH0KICB9Cn0KCi8vIG5vdGU6IHRoaXMgb25seSByZW1vdmVzIHRoZSBhdHRyIGZyb20gdGhlIEFycmF5IChhdHRyc0xpc3QpIHNvIHRoYXQgaXQKLy8gZG9lc24ndCBnZXQgcHJvY2Vzc2VkIGJ5IHByb2Nlc3NBdHRycy4KLy8gQnkgZGVmYXVsdCBpdCBkb2VzIE5PVCByZW1vdmUgaXQgZnJvbSB0aGUgbWFwIChhdHRyc01hcCkgYmVjYXVzZSB0aGUgbWFwIGlzCi8vIG5lZWRlZCBkdXJpbmcgY29kZWdlbi4KZnVuY3Rpb24gZ2V0QW5kUmVtb3ZlQXR0ciAoCiAgZWwsCiAgbmFtZSwKICByZW1vdmVGcm9tTWFwCikgewogIHZhciB2YWw7CiAgaWYgKCh2YWwgPSBlbC5hdHRyc01hcFtuYW1lXSkgIT0gbnVsbCkgewogICAgdmFyIGxpc3QgPSBlbC5hdHRyc0xpc3Q7CiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIGlmIChsaXN0W2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICBsaXN0LnNwbGljZShpLCAxKTsKICAgICAgICBicmVhawogICAgICB9CiAgICB9CiAgfQogIGlmIChyZW1vdmVGcm9tTWFwKSB7CiAgICBkZWxldGUgZWwuYXR0cnNNYXBbbmFtZV07CiAgfQogIHJldHVybiB2YWwKfQoKLyogICovCgovKioKICogQ3Jvc3MtcGxhdGZvcm0gY29kZSBnZW5lcmF0aW9uIGZvciBjb21wb25lbnQgdi1tb2RlbAogKi8KZnVuY3Rpb24gZ2VuQ29tcG9uZW50TW9kZWwgKAogIGVsLAogIHZhbHVlLAogIG1vZGlmaWVycwopIHsKICB2YXIgcmVmID0gbW9kaWZpZXJzIHx8IHt9OwogIHZhciBudW1iZXIgPSByZWYubnVtYmVyOwogIHZhciB0cmltID0gcmVmLnRyaW07CgogIHZhciBiYXNlVmFsdWVFeHByZXNzaW9uID0gJyQkdic7CiAgdmFyIHZhbHVlRXhwcmVzc2lvbiA9IGJhc2VWYWx1ZUV4cHJlc3Npb247CiAgaWYgKHRyaW0pIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9CiAgICAgICIodHlwZW9mICIgKyBiYXNlVmFsdWVFeHByZXNzaW9uICsgIiA9PT0gJ3N0cmluZyciICsKICAgICAgIj8gIiArIGJhc2VWYWx1ZUV4cHJlc3Npb24gKyAiLnRyaW0oKSIgKwogICAgICAiOiAiICsgYmFzZVZhbHVlRXhwcmVzc2lvbiArICIpIjsKICB9CiAgaWYgKG51bWJlcikgewogICAgdmFsdWVFeHByZXNzaW9uID0gIl9uKCIgKyB2YWx1ZUV4cHJlc3Npb24gKyAiKSI7CiAgfQogIHZhciBhc3NpZ25tZW50ID0gZ2VuQXNzaWdubWVudENvZGUodmFsdWUsIHZhbHVlRXhwcmVzc2lvbik7CgogIGVsLm1vZGVsID0gewogICAgdmFsdWU6ICgiKCIgKyB2YWx1ZSArICIpIiksCiAgICBleHByZXNzaW9uOiAoIlwiIiArIHZhbHVlICsgIlwiIiksCiAgICBjYWxsYmFjazogKCJmdW5jdGlvbiAoIiArIGJhc2VWYWx1ZUV4cHJlc3Npb24gKyAiKSB7IiArIGFzc2lnbm1lbnQgKyAifSIpCiAgfTsKfQoKLyoqCiAqIENyb3NzLXBsYXRmb3JtIGNvZGVnZW4gaGVscGVyIGZvciBnZW5lcmF0aW5nIHYtbW9kZWwgdmFsdWUgYXNzaWdubWVudCBjb2RlLgogKi8KZnVuY3Rpb24gZ2VuQXNzaWdubWVudENvZGUgKAogIHZhbHVlLAogIGFzc2lnbm1lbnQKKSB7CiAgdmFyIHJlcyA9IHBhcnNlTW9kZWwodmFsdWUpOwogIGlmIChyZXMua2V5ID09PSBudWxsKSB7CiAgICByZXR1cm4gKHZhbHVlICsgIj0iICsgYXNzaWdubWVudCkKICB9IGVsc2UgewogICAgcmV0dXJuICgiJHNldCgiICsgKHJlcy5leHApICsgIiwgIiArIChyZXMua2V5KSArICIsICIgKyBhc3NpZ25tZW50ICsgIikiKQogIH0KfQoKLyoqCiAqIFBhcnNlIGEgdi1tb2RlbCBleHByZXNzaW9uIGludG8gYSBiYXNlIHBhdGggYW5kIGEgZmluYWwga2V5IHNlZ21lbnQuCiAqIEhhbmRsZXMgYm90aCBkb3QtcGF0aCBhbmQgcG9zc2libGUgc3F1YXJlIGJyYWNrZXRzLgogKgogKiBQb3NzaWJsZSBjYXNlczoKICoKICogLSB0ZXN0CiAqIC0gdGVzdFtrZXldCiAqIC0gdGVzdFt0ZXN0MVtrZXldXQogKiAtIHRlc3RbImEiXVtrZXldCiAqIC0geHh4LnRlc3RbYVthXS50ZXN0MVtrZXldXQogKiAtIHRlc3QueHh4LmFbImFzYSJdW3Rlc3QxW2tleV1dCiAqCiAqLwoKdmFyIGxlbjsKdmFyIHN0cjsKdmFyIGNocjsKdmFyIGluZGV4JDE7CnZhciBleHByZXNzaW9uUG9zOwp2YXIgZXhwcmVzc2lvbkVuZFBvczsKCgoKZnVuY3Rpb24gcGFyc2VNb2RlbCAodmFsKSB7CiAgLy8gRml4IGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUvcHVsbC83NzMwCiAgLy8gYWxsb3cgdi1tb2RlbD0ib2JqLnZhbCAiICh0cmFpbGluZyB3aGl0ZXNwYWNlKQogIHZhbCA9IHZhbC50cmltKCk7CiAgbGVuID0gdmFsLmxlbmd0aDsKCiAgaWYgKHZhbC5pbmRleE9mKCdbJykgPCAwIHx8IHZhbC5sYXN0SW5kZXhPZignXScpIDwgbGVuIC0gMSkgewogICAgaW5kZXgkMSA9IHZhbC5sYXN0SW5kZXhPZignLicpOwogICAgaWYgKGluZGV4JDEgPiAtMSkgewogICAgICByZXR1cm4gewogICAgICAgIGV4cDogdmFsLnNsaWNlKDAsIGluZGV4JDEpLAogICAgICAgIGtleTogJyInICsgdmFsLnNsaWNlKGluZGV4JDEgKyAxKSArICciJwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gewogICAgICAgIGV4cDogdmFsLAogICAgICAgIGtleTogbnVsbAogICAgICB9CiAgICB9CiAgfQoKICBzdHIgPSB2YWw7CiAgaW5kZXgkMSA9IGV4cHJlc3Npb25Qb3MgPSBleHByZXNzaW9uRW5kUG9zID0gMDsKCiAgd2hpbGUgKCFlb2YoKSkgewogICAgY2hyID0gbmV4dCgpOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoaXNTdHJpbmdTdGFydChjaHIpKSB7CiAgICAgIHBhcnNlU3RyaW5nKGNocik7CiAgICB9IGVsc2UgaWYgKGNociA9PT0gMHg1QikgewogICAgICBwYXJzZUJyYWNrZXQoY2hyKTsKICAgIH0KICB9CgogIHJldHVybiB7CiAgICBleHA6IHZhbC5zbGljZSgwLCBleHByZXNzaW9uUG9zKSwKICAgIGtleTogdmFsLnNsaWNlKGV4cHJlc3Npb25Qb3MgKyAxLCBleHByZXNzaW9uRW5kUG9zKQogIH0KfQoKZnVuY3Rpb24gbmV4dCAoKSB7CiAgcmV0dXJuIHN0ci5jaGFyQ29kZUF0KCsraW5kZXgkMSkKfQoKZnVuY3Rpb24gZW9mICgpIHsKICByZXR1cm4gaW5kZXgkMSA+PSBsZW4KfQoKZnVuY3Rpb24gaXNTdHJpbmdTdGFydCAoY2hyKSB7CiAgcmV0dXJuIGNociA9PT0gMHgyMiB8fCBjaHIgPT09IDB4MjcKfQoKZnVuY3Rpb24gcGFyc2VCcmFja2V0IChjaHIpIHsKICB2YXIgaW5CcmFja2V0ID0gMTsKICBleHByZXNzaW9uUG9zID0gaW5kZXgkMTsKICB3aGlsZSAoIWVvZigpKSB7CiAgICBjaHIgPSBuZXh0KCk7CiAgICBpZiAoaXNTdHJpbmdTdGFydChjaHIpKSB7CiAgICAgIHBhcnNlU3RyaW5nKGNocik7CiAgICAgIGNvbnRpbnVlCiAgICB9CiAgICBpZiAoY2hyID09PSAweDVCKSB7IGluQnJhY2tldCsrOyB9CiAgICBpZiAoY2hyID09PSAweDVEKSB7IGluQnJhY2tldC0tOyB9CiAgICBpZiAoaW5CcmFja2V0ID09PSAwKSB7CiAgICAgIGV4cHJlc3Npb25FbmRQb3MgPSBpbmRleCQxOwogICAgICBicmVhawogICAgfQogIH0KfQoKZnVuY3Rpb24gcGFyc2VTdHJpbmcgKGNocikgewogIHZhciBzdHJpbmdRdW90ZSA9IGNocjsKICB3aGlsZSAoIWVvZigpKSB7CiAgICBjaHIgPSBuZXh0KCk7CiAgICBpZiAoY2hyID09PSBzdHJpbmdRdW90ZSkgewogICAgICBicmVhawogICAgfQogIH0KfQoKLyogICovCgp2YXIgd2FybiQxOwoKLy8gaW4gc29tZSBjYXNlcywgdGhlIGV2ZW50IHVzZWQgaGFzIHRvIGJlIGRldGVybWluZWQgYXQgcnVudGltZQovLyBzbyB3ZSB1c2VkIHNvbWUgcmVzZXJ2ZWQgdG9rZW5zIGR1cmluZyBjb21waWxlLgp2YXIgUkFOR0VfVE9LRU4gPSAnX19yJzsKdmFyIENIRUNLQk9YX1JBRElPX1RPS0VOID0gJ19fYyc7CgpmdW5jdGlvbiBtb2RlbCAoCiAgZWwsCiAgZGlyLAogIF93YXJuCikgewogIHdhcm4kMSA9IF93YXJuOwogIHZhciB2YWx1ZSA9IGRpci52YWx1ZTsKICB2YXIgbW9kaWZpZXJzID0gZGlyLm1vZGlmaWVyczsKICB2YXIgdGFnID0gZWwudGFnOwogIHZhciB0eXBlID0gZWwuYXR0cnNNYXAudHlwZTsKCiAgewogICAgLy8gaW5wdXRzIHdpdGggdHlwZT0iZmlsZSIgYXJlIHJlYWQgb25seSBhbmQgc2V0dGluZyB0aGUgaW5wdXQncwogICAgLy8gdmFsdWUgd2lsbCB0aHJvdyBhbiBlcnJvci4KICAgIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ2ZpbGUnKSB7CiAgICAgIHdhcm4kMSgKICAgICAgICAiPCIgKyAoZWwudGFnKSArICIgdi1tb2RlbD1cIiIgKyB2YWx1ZSArICJcIiB0eXBlPVwiZmlsZVwiPjpcbiIgKwogICAgICAgICJGaWxlIGlucHV0cyBhcmUgcmVhZCBvbmx5LiBVc2UgYSB2LW9uOmNoYW5nZSBsaXN0ZW5lciBpbnN0ZWFkLiIKICAgICAgKTsKICAgIH0KICB9CgogIGlmIChlbC5jb21wb25lbnQpIHsKICAgIGdlbkNvbXBvbmVudE1vZGVsKGVsLCB2YWx1ZSwgbW9kaWZpZXJzKTsKICAgIC8vIGNvbXBvbmVudCB2LW1vZGVsIGRvZXNuJ3QgbmVlZCBleHRyYSBydW50aW1lCiAgICByZXR1cm4gZmFsc2UKICB9IGVsc2UgaWYgKHRhZyA9PT0gJ3NlbGVjdCcpIHsKICAgIGdlblNlbGVjdChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ2NoZWNrYm94JykgewogICAgZ2VuQ2hlY2tib3hNb2RlbChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ3JhZGlvJykgewogICAgZ2VuUmFkaW9Nb2RlbChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAndGV4dGFyZWEnKSB7CiAgICBnZW5EZWZhdWx0TW9kZWwoZWwsIHZhbHVlLCBtb2RpZmllcnMpOwogIH0gZWxzZSBpZiAoIWNvbmZpZy5pc1Jlc2VydmVkVGFnKHRhZykpIHsKICAgIGdlbkNvbXBvbmVudE1vZGVsKGVsLCB2YWx1ZSwgbW9kaWZpZXJzKTsKICAgIC8vIGNvbXBvbmVudCB2LW1vZGVsIGRvZXNuJ3QgbmVlZCBleHRyYSBydW50aW1lCiAgICByZXR1cm4gZmFsc2UKICB9IGVsc2UgewogICAgd2FybiQxKAogICAgICAiPCIgKyAoZWwudGFnKSArICIgdi1tb2RlbD1cIiIgKyB2YWx1ZSArICJcIj46ICIgKwogICAgICAidi1tb2RlbCBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZWxlbWVudCB0eXBlLiAiICsKICAgICAgJ0lmIHlvdSBhcmUgd29ya2luZyB3aXRoIGNvbnRlbnRlZGl0YWJsZSwgaXRcJ3MgcmVjb21tZW5kZWQgdG8gJyArCiAgICAgICd3cmFwIGEgbGlicmFyeSBkZWRpY2F0ZWQgZm9yIHRoYXQgcHVycG9zZSBpbnNpZGUgYSBjdXN0b20gY29tcG9uZW50LicKICAgICk7CiAgfQoKICAvLyBlbnN1cmUgcnVudGltZSBkaXJlY3RpdmUgbWV0YWRhdGEKICByZXR1cm4gdHJ1ZQp9CgpmdW5jdGlvbiBnZW5DaGVja2JveE1vZGVsICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIG51bWJlciA9IG1vZGlmaWVycyAmJiBtb2RpZmllcnMubnVtYmVyOwogIHZhciB2YWx1ZUJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ3ZhbHVlJykgfHwgJ251bGwnOwogIHZhciB0cnVlVmFsdWVCaW5kaW5nID0gZ2V0QmluZGluZ0F0dHIoZWwsICd0cnVlLXZhbHVlJykgfHwgJ3RydWUnOwogIHZhciBmYWxzZVZhbHVlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAnZmFsc2UtdmFsdWUnKSB8fCAnZmFsc2UnOwogIGFkZFByb3AoZWwsICdjaGVja2VkJywKICAgICJBcnJheS5pc0FycmF5KCIgKyB2YWx1ZSArICIpIiArCiAgICAiP19pKCIgKyB2YWx1ZSArICIsIiArIHZhbHVlQmluZGluZyArICIpPi0xIiArICgKICAgICAgdHJ1ZVZhbHVlQmluZGluZyA9PT0gJ3RydWUnCiAgICAgICAgPyAoIjooIiArIHZhbHVlICsgIikiKQogICAgICAgIDogKCI6X3EoIiArIHZhbHVlICsgIiwiICsgdHJ1ZVZhbHVlQmluZGluZyArICIpIikKICAgICkKICApOwogIGFkZEhhbmRsZXIoZWwsICdjaGFuZ2UnLAogICAgInZhciAkJGE9IiArIHZhbHVlICsgIiwiICsKICAgICAgICAnJCRlbD0kZXZlbnQudGFyZ2V0LCcgKwogICAgICAgICIkJGM9JCRlbC5jaGVja2VkPygiICsgdHJ1ZVZhbHVlQmluZGluZyArICIpOigiICsgZmFsc2VWYWx1ZUJpbmRpbmcgKyAiKTsiICsKICAgICdpZihBcnJheS5pc0FycmF5KCQkYSkpeycgKwogICAgICAidmFyICQkdj0iICsgKG51bWJlciA/ICdfbignICsgdmFsdWVCaW5kaW5nICsgJyknIDogdmFsdWVCaW5kaW5nKSArICIsIiArCiAgICAgICAgICAnJCRpPV9pKCQkYSwkJHYpOycgKwogICAgICAiaWYoJCRlbC5jaGVja2VkKXskJGk8MCYmKCIgKyAoZ2VuQXNzaWdubWVudENvZGUodmFsdWUsICckJGEuY29uY2F0KFskJHZdKScpKSArICIpfSIgKwogICAgICAiZWxzZXskJGk+LTEmJigiICsgKGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCAnJCRhLnNsaWNlKDAsJCRpKS5jb25jYXQoJCRhLnNsaWNlKCQkaSsxKSknKSkgKyAiKX0iICsKICAgICJ9ZWxzZXsiICsgKGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCAnJCRjJykpICsgIn0iLAogICAgbnVsbCwgdHJ1ZQogICk7Cn0KCmZ1bmN0aW9uIGdlblJhZGlvTW9kZWwgKAogIGVsLAogIHZhbHVlLAogIG1vZGlmaWVycwopIHsKICB2YXIgbnVtYmVyID0gbW9kaWZpZXJzICYmIG1vZGlmaWVycy5udW1iZXI7CiAgdmFyIHZhbHVlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAndmFsdWUnKSB8fCAnbnVsbCc7CiAgdmFsdWVCaW5kaW5nID0gbnVtYmVyID8gKCJfbigiICsgdmFsdWVCaW5kaW5nICsgIikiKSA6IHZhbHVlQmluZGluZzsKICBhZGRQcm9wKGVsLCAnY2hlY2tlZCcsICgiX3EoIiArIHZhbHVlICsgIiwiICsgdmFsdWVCaW5kaW5nICsgIikiKSk7CiAgYWRkSGFuZGxlcihlbCwgJ2NoYW5nZScsIGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCB2YWx1ZUJpbmRpbmcpLCBudWxsLCB0cnVlKTsKfQoKZnVuY3Rpb24gZ2VuU2VsZWN0ICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIG51bWJlciA9IG1vZGlmaWVycyAmJiBtb2RpZmllcnMubnVtYmVyOwogIHZhciBzZWxlY3RlZFZhbCA9ICJBcnJheS5wcm90b3R5cGUuZmlsdGVyIiArCiAgICAiLmNhbGwoJGV2ZW50LnRhcmdldC5vcHRpb25zLGZ1bmN0aW9uKG8pe3JldHVybiBvLnNlbGVjdGVkfSkiICsKICAgICIubWFwKGZ1bmN0aW9uKG8pe3ZhciB2YWwgPSBcIl92YWx1ZVwiIGluIG8gPyBvLl92YWx1ZSA6IG8udmFsdWU7IiArCiAgICAicmV0dXJuICIgKyAobnVtYmVyID8gJ19uKHZhbCknIDogJ3ZhbCcpICsgIn0pIjsKCiAgdmFyIGFzc2lnbm1lbnQgPSAnJGV2ZW50LnRhcmdldC5tdWx0aXBsZSA/ICQkc2VsZWN0ZWRWYWwgOiAkJHNlbGVjdGVkVmFsWzBdJzsKICB2YXIgY29kZSA9ICJ2YXIgJCRzZWxlY3RlZFZhbCA9ICIgKyBzZWxlY3RlZFZhbCArICI7IjsKICBjb2RlID0gY29kZSArICIgIiArIChnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgYXNzaWdubWVudCkpOwogIGFkZEhhbmRsZXIoZWwsICdjaGFuZ2UnLCBjb2RlLCBudWxsLCB0cnVlKTsKfQoKZnVuY3Rpb24gZ2VuRGVmYXVsdE1vZGVsICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIHR5cGUgPSBlbC5hdHRyc01hcC50eXBlOwoKICAvLyB3YXJuIGlmIHYtYmluZDp2YWx1ZSBjb25mbGljdHMgd2l0aCB2LW1vZGVsCiAgLy8gZXhjZXB0IGZvciBpbnB1dHMgd2l0aCB2LWJpbmQ6dHlwZQogIHsKICAgIHZhciB2YWx1ZSQxID0gZWwuYXR0cnNNYXBbJ3YtYmluZDp2YWx1ZSddIHx8IGVsLmF0dHJzTWFwWyc6dmFsdWUnXTsKICAgIHZhciB0eXBlQmluZGluZyA9IGVsLmF0dHJzTWFwWyd2LWJpbmQ6dHlwZSddIHx8IGVsLmF0dHJzTWFwWyc6dHlwZSddOwogICAgaWYgKHZhbHVlJDEgJiYgIXR5cGVCaW5kaW5nKSB7CiAgICAgIHZhciBiaW5kaW5nID0gZWwuYXR0cnNNYXBbJ3YtYmluZDp2YWx1ZSddID8gJ3YtYmluZDp2YWx1ZScgOiAnOnZhbHVlJzsKICAgICAgd2FybiQxKAogICAgICAgIGJpbmRpbmcgKyAiPVwiIiArIHZhbHVlJDEgKyAiXCIgY29uZmxpY3RzIHdpdGggdi1tb2RlbCBvbiB0aGUgc2FtZSBlbGVtZW50ICIgKwogICAgICAgICdiZWNhdXNlIHRoZSBsYXR0ZXIgYWxyZWFkeSBleHBhbmRzIHRvIGEgdmFsdWUgYmluZGluZyBpbnRlcm5hbGx5JwogICAgICApOwogICAgfQogIH0KCiAgdmFyIHJlZiA9IG1vZGlmaWVycyB8fCB7fTsKICB2YXIgbGF6eSA9IHJlZi5sYXp5OwogIHZhciBudW1iZXIgPSByZWYubnVtYmVyOwogIHZhciB0cmltID0gcmVmLnRyaW07CiAgdmFyIG5lZWRDb21wb3NpdGlvbkd1YXJkID0gIWxhenkgJiYgdHlwZSAhPT0gJ3JhbmdlJzsKICB2YXIgZXZlbnQgPSBsYXp5CiAgICA/ICdjaGFuZ2UnCiAgICA6IHR5cGUgPT09ICdyYW5nZScKICAgICAgPyBSQU5HRV9UT0tFTgogICAgICA6ICdpbnB1dCc7CgogIHZhciB2YWx1ZUV4cHJlc3Npb24gPSAnJGV2ZW50LnRhcmdldC52YWx1ZSc7CiAgaWYgKHRyaW0pIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9ICIkZXZlbnQudGFyZ2V0LnZhbHVlLnRyaW0oKSI7CiAgfQogIGlmIChudW1iZXIpIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9ICJfbigiICsgdmFsdWVFeHByZXNzaW9uICsgIikiOwogIH0KCiAgdmFyIGNvZGUgPSBnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgdmFsdWVFeHByZXNzaW9uKTsKICBpZiAobmVlZENvbXBvc2l0aW9uR3VhcmQpIHsKICAgIGNvZGUgPSAiaWYoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpcmV0dXJuOyIgKyBjb2RlOwogIH0KCiAgYWRkUHJvcChlbCwgJ3ZhbHVlJywgKCIoIiArIHZhbHVlICsgIikiKSk7CiAgYWRkSGFuZGxlcihlbCwgZXZlbnQsIGNvZGUsIG51bGwsIHRydWUpOwogIGlmICh0cmltIHx8IG51bWJlcikgewogICAgYWRkSGFuZGxlcihlbCwgJ2JsdXInLCAnJGZvcmNlVXBkYXRlKCknKTsKICB9Cn0KCi8qICAqLwoKLy8gbm9ybWFsaXplIHYtbW9kZWwgZXZlbnQgdG9rZW5zIHRoYXQgY2FuIG9ubHkgYmUgZGV0ZXJtaW5lZCBhdCBydW50aW1lLgovLyBpdCdzIGltcG9ydGFudCB0byBwbGFjZSB0aGUgZXZlbnQgYXMgdGhlIGZpcnN0IGluIHRoZSBhcnJheSBiZWNhdXNlCi8vIHRoZSB3aG9sZSBwb2ludCBpcyBlbnN1cmluZyB0aGUgdi1tb2RlbCBjYWxsYmFjayBnZXRzIGNhbGxlZCBiZWZvcmUKLy8gdXNlci1hdHRhY2hlZCBoYW5kbGVycy4KZnVuY3Rpb24gbm9ybWFsaXplRXZlbnRzIChvbikgewogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihvbltSQU5HRV9UT0tFTl0pKSB7CiAgICAvLyBJRSBpbnB1dFt0eXBlPXJhbmdlXSBvbmx5IHN1cHBvcnRzIGBjaGFuZ2VgIGV2ZW50CiAgICB2YXIgZXZlbnQgPSBpc0lFID8gJ2NoYW5nZScgOiAnaW5wdXQnOwogICAgb25bZXZlbnRdID0gW10uY29uY2F0KG9uW1JBTkdFX1RPS0VOXSwgb25bZXZlbnRdIHx8IFtdKTsKICAgIGRlbGV0ZSBvbltSQU5HRV9UT0tFTl07CiAgfQogIC8vIFRoaXMgd2FzIG9yaWdpbmFsbHkgaW50ZW5kZWQgdG8gZml4ICM0NTIxIGJ1dCBubyBsb25nZXIgbmVjZXNzYXJ5CiAgLy8gYWZ0ZXIgMi41LiBLZWVwaW5nIGl0IGZvciBiYWNrd2FyZHMgY29tcGF0IHdpdGggZ2VuZXJhdGVkIGNvZGUgZnJvbSA8IDIuNAogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihvbltDSEVDS0JPWF9SQURJT19UT0tFTl0pKSB7CiAgICBvbi5jaGFuZ2UgPSBbXS5jb25jYXQob25bQ0hFQ0tCT1hfUkFESU9fVE9LRU5dLCBvbi5jaGFuZ2UgfHwgW10pOwogICAgZGVsZXRlIG9uW0NIRUNLQk9YX1JBRElPX1RPS0VOXTsKICB9Cn0KCnZhciB0YXJnZXQkMTsKCmZ1bmN0aW9uIGNyZWF0ZU9uY2VIYW5kbGVyIChoYW5kbGVyLCBldmVudCwgY2FwdHVyZSkgewogIHZhciBfdGFyZ2V0ID0gdGFyZ2V0JDE7IC8vIHNhdmUgY3VycmVudCB0YXJnZXQgZWxlbWVudCBpbiBjbG9zdXJlCiAgcmV0dXJuIGZ1bmN0aW9uIG9uY2VIYW5kbGVyICgpIHsKICAgIHZhciByZXMgPSBoYW5kbGVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICBpZiAocmVzICE9PSBudWxsKSB7CiAgICAgIHJlbW92ZSQyKGV2ZW50LCBvbmNlSGFuZGxlciwgY2FwdHVyZSwgX3RhcmdldCk7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBhZGQkMSAoCiAgZXZlbnQsCiAgaGFuZGxlciwKICBvbmNlJCQxLAogIGNhcHR1cmUsCiAgcGFzc2l2ZQopIHsKICBoYW5kbGVyID0gd2l0aE1hY3JvVGFzayhoYW5kbGVyKTsKICBpZiAob25jZSQkMSkgeyBoYW5kbGVyID0gY3JlYXRlT25jZUhhbmRsZXIoaGFuZGxlciwgZXZlbnQsIGNhcHR1cmUpOyB9CiAgdGFyZ2V0JDEuYWRkRXZlbnRMaXN0ZW5lcigKICAgIGV2ZW50LAogICAgaGFuZGxlciwKICAgIHN1cHBvcnRzUGFzc2l2ZQogICAgICA/IHsgY2FwdHVyZTogY2FwdHVyZSwgcGFzc2l2ZTogcGFzc2l2ZSB9CiAgICAgIDogY2FwdHVyZQogICk7Cn0KCmZ1bmN0aW9uIHJlbW92ZSQyICgKICBldmVudCwKICBoYW5kbGVyLAogIGNhcHR1cmUsCiAgX3RhcmdldAopIHsKICAoX3RhcmdldCB8fCB0YXJnZXQkMSkucmVtb3ZlRXZlbnRMaXN0ZW5lcigKICAgIGV2ZW50LAogICAgaGFuZGxlci5fd2l0aFRhc2sgfHwgaGFuZGxlciwKICAgIGNhcHR1cmUKICApOwp9CgpmdW5jdGlvbiB1cGRhdGVET01MaXN0ZW5lcnMgKG9sZFZub2RlLCB2bm9kZSkgewogIGlmIChpc1VuZGVmKG9sZFZub2RlLmRhdGEub24pICYmIGlzVW5kZWYodm5vZGUuZGF0YS5vbikpIHsKICAgIHJldHVybgogIH0KICB2YXIgb24gPSB2bm9kZS5kYXRhLm9uIHx8IHt9OwogIHZhciBvbGRPbiA9IG9sZFZub2RlLmRhdGEub24gfHwge307CiAgdGFyZ2V0JDEgPSB2bm9kZS5lbG07CiAgbm9ybWFsaXplRXZlbnRzKG9uKTsKICB1cGRhdGVMaXN0ZW5lcnMob24sIG9sZE9uLCBhZGQkMSwgcmVtb3ZlJDIsIHZub2RlLmNvbnRleHQpOwogIHRhcmdldCQxID0gdW5kZWZpbmVkOwp9Cgp2YXIgZXZlbnRzID0gewogIGNyZWF0ZTogdXBkYXRlRE9NTGlzdGVuZXJzLAogIHVwZGF0ZTogdXBkYXRlRE9NTGlzdGVuZXJzCn0KCi8qICAqLwoKZnVuY3Rpb24gdXBkYXRlRE9NUHJvcHMgKG9sZFZub2RlLCB2bm9kZSkgewogIGlmIChpc1VuZGVmKG9sZFZub2RlLmRhdGEuZG9tUHJvcHMpICYmIGlzVW5kZWYodm5vZGUuZGF0YS5kb21Qcm9wcykpIHsKICAgIHJldHVybgogIH0KICB2YXIga2V5LCBjdXI7CiAgdmFyIGVsbSA9IHZub2RlLmVsbTsKICB2YXIgb2xkUHJvcHMgPSBvbGRWbm9kZS5kYXRhLmRvbVByb3BzIHx8IHt9OwogIHZhciBwcm9wcyA9IHZub2RlLmRhdGEuZG9tUHJvcHMgfHwge307CiAgLy8gY2xvbmUgb2JzZXJ2ZWQgb2JqZWN0cywgYXMgdGhlIHVzZXIgcHJvYmFibHkgd2FudHMgdG8gbXV0YXRlIGl0CiAgaWYgKGlzRGVmKHByb3BzLl9fb2JfXykpIHsKICAgIHByb3BzID0gdm5vZGUuZGF0YS5kb21Qcm9wcyA9IGV4dGVuZCh7fSwgcHJvcHMpOwogIH0KCiAgZm9yIChrZXkgaW4gb2xkUHJvcHMpIHsKICAgIGlmIChpc1VuZGVmKHByb3BzW2tleV0pKSB7CiAgICAgIGVsbVtrZXldID0gJyc7CiAgICB9CiAgfQogIGZvciAoa2V5IGluIHByb3BzKSB7CiAgICBjdXIgPSBwcm9wc1trZXldOwogICAgLy8gaWdub3JlIGNoaWxkcmVuIGlmIHRoZSBub2RlIGhhcyB0ZXh0Q29udGVudCBvciBpbm5lckhUTUwsCiAgICAvLyBhcyB0aGVzZSB3aWxsIHRocm93IGF3YXkgZXhpc3RpbmcgRE9NIG5vZGVzIGFuZCBjYXVzZSByZW1vdmFsIGVycm9ycwogICAgLy8gb24gc3Vic2VxdWVudCBwYXRjaGVzICgjMzM2MCkKICAgIGlmIChrZXkgPT09ICd0ZXh0Q29udGVudCcgfHwga2V5ID09PSAnaW5uZXJIVE1MJykgewogICAgICBpZiAodm5vZGUuY2hpbGRyZW4pIHsgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoID0gMDsgfQogICAgICBpZiAoY3VyID09PSBvbGRQcm9wc1trZXldKSB7IGNvbnRpbnVlIH0KICAgICAgLy8gIzY2MDEgd29yayBhcm91bmQgQ2hyb21lIHZlcnNpb24gPD0gNTUgYnVnIHdoZXJlIHNpbmdsZSB0ZXh0Tm9kZQogICAgICAvLyByZXBsYWNlZCBieSBpbm5lckhUTUwvdGV4dENvbnRlbnQgcmV0YWlucyBpdHMgcGFyZW50Tm9kZSBwcm9wZXJ0eQogICAgICBpZiAoZWxtLmNoaWxkTm9kZXMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgZWxtLnJlbW92ZUNoaWxkKGVsbS5jaGlsZE5vZGVzWzBdKTsKICAgICAgfQogICAgfQoKICAgIGlmIChrZXkgPT09ICd2YWx1ZScpIHsKICAgICAgLy8gc3RvcmUgdmFsdWUgYXMgX3ZhbHVlIGFzIHdlbGwgc2luY2UKICAgICAgLy8gbm9uLXN0cmluZyB2YWx1ZXMgd2lsbCBiZSBzdHJpbmdpZmllZAogICAgICBlbG0uX3ZhbHVlID0gY3VyOwogICAgICAvLyBhdm9pZCByZXNldHRpbmcgY3Vyc29yIHBvc2l0aW9uIHdoZW4gdmFsdWUgaXMgdGhlIHNhbWUKICAgICAgdmFyIHN0ckN1ciA9IGlzVW5kZWYoY3VyKSA/ICcnIDogU3RyaW5nKGN1cik7CiAgICAgIGlmIChzaG91bGRVcGRhdGVWYWx1ZShlbG0sIHN0ckN1cikpIHsKICAgICAgICBlbG0udmFsdWUgPSBzdHJDdXI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGVsbVtrZXldID0gY3VyOwogICAgfQogIH0KfQoKLy8gY2hlY2sgcGxhdGZvcm1zL3dlYi91dGlsL2F0dHJzLmpzIGFjY2VwdFZhbHVlCgoKZnVuY3Rpb24gc2hvdWxkVXBkYXRlVmFsdWUgKGVsbSwgY2hlY2tWYWwpIHsKICByZXR1cm4gKCFlbG0uY29tcG9zaW5nICYmICgKICAgIGVsbS50YWdOYW1lID09PSAnT1BUSU9OJyB8fAogICAgaXNOb3RJbkZvY3VzQW5kRGlydHkoZWxtLCBjaGVja1ZhbCkgfHwKICAgIGlzRGlydHlXaXRoTW9kaWZpZXJzKGVsbSwgY2hlY2tWYWwpCiAgKSkKfQoKZnVuY3Rpb24gaXNOb3RJbkZvY3VzQW5kRGlydHkgKGVsbSwgY2hlY2tWYWwpIHsKICAvLyByZXR1cm4gdHJ1ZSB3aGVuIHRleHRib3ggKC5udW1iZXIgYW5kIC50cmltKSBsb3NlcyBmb2N1cyBhbmQgaXRzIHZhbHVlIGlzCiAgLy8gbm90IGVxdWFsIHRvIHRoZSB1cGRhdGVkIHZhbHVlCiAgdmFyIG5vdEluRm9jdXMgPSB0cnVlOwogIC8vICM2MTU3CiAgLy8gd29yayBhcm91bmQgSUUgYnVnIHdoZW4gYWNjZXNzaW5nIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW4gYW4gaWZyYW1lCiAgdHJ5IHsgbm90SW5Gb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGVsbTsgfSBjYXRjaCAoZSkge30KICByZXR1cm4gbm90SW5Gb2N1cyAmJiBlbG0udmFsdWUgIT09IGNoZWNrVmFsCn0KCmZ1bmN0aW9uIGlzRGlydHlXaXRoTW9kaWZpZXJzIChlbG0sIG5ld1ZhbCkgewogIHZhciB2YWx1ZSA9IGVsbS52YWx1ZTsKICB2YXIgbW9kaWZpZXJzID0gZWxtLl92TW9kaWZpZXJzOyAvLyBpbmplY3RlZCBieSB2LW1vZGVsIHJ1bnRpbWUKICBpZiAoaXNEZWYobW9kaWZpZXJzKSkgewogICAgaWYgKG1vZGlmaWVycy5sYXp5KSB7CiAgICAgIC8vIGlucHV0cyB3aXRoIGxhenkgc2hvdWxkIG9ubHkgYmUgdXBkYXRlZCB3aGVuIG5vdCBpbiBmb2N1cwogICAgICByZXR1cm4gZmFsc2UKICAgIH0KICAgIGlmIChtb2RpZmllcnMubnVtYmVyKSB7CiAgICAgIHJldHVybiB0b051bWJlcih2YWx1ZSkgIT09IHRvTnVtYmVyKG5ld1ZhbCkKICAgIH0KICAgIGlmIChtb2RpZmllcnMudHJpbSkgewogICAgICByZXR1cm4gdmFsdWUudHJpbSgpICE9PSBuZXdWYWwudHJpbSgpCiAgICB9CiAgfQogIHJldHVybiB2YWx1ZSAhPT0gbmV3VmFsCn0KCnZhciBkb21Qcm9wcyA9IHsKICBjcmVhdGU6IHVwZGF0ZURPTVByb3BzLAogIHVwZGF0ZTogdXBkYXRlRE9NUHJvcHMKfQoKLyogICovCgp2YXIgcGFyc2VTdHlsZVRleHQgPSBjYWNoZWQoZnVuY3Rpb24gKGNzc1RleHQpIHsKICB2YXIgcmVzID0ge307CiAgdmFyIGxpc3REZWxpbWl0ZXIgPSAvOyg/IVteKF0qXCkpL2c7CiAgdmFyIHByb3BlcnR5RGVsaW1pdGVyID0gLzooLispLzsKICBjc3NUZXh0LnNwbGl0KGxpc3REZWxpbWl0ZXIpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgIGlmIChpdGVtKSB7CiAgICAgIHZhciB0bXAgPSBpdGVtLnNwbGl0KHByb3BlcnR5RGVsaW1pdGVyKTsKICAgICAgdG1wLmxlbmd0aCA+IDEgJiYgKHJlc1t0bXBbMF0udHJpbSgpXSA9IHRtcFsxXS50cmltKCkpOwogICAgfQogIH0pOwogIHJldHVybiByZXMKfSk7CgovLyBtZXJnZSBzdGF0aWMgYW5kIGR5bmFtaWMgc3R5bGUgZGF0YSBvbiB0aGUgc2FtZSB2bm9kZQpmdW5jdGlvbiBub3JtYWxpemVTdHlsZURhdGEgKGRhdGEpIHsKICB2YXIgc3R5bGUgPSBub3JtYWxpemVTdHlsZUJpbmRpbmcoZGF0YS5zdHlsZSk7CiAgLy8gc3RhdGljIHN0eWxlIGlzIHByZS1wcm9jZXNzZWQgaW50byBhbiBvYmplY3QgZHVyaW5nIGNvbXBpbGF0aW9uCiAgLy8gYW5kIGlzIGFsd2F5cyBhIGZyZXNoIG9iamVjdCwgc28gaXQncyBzYWZlIHRvIG1lcmdlIGludG8gaXQKICByZXR1cm4gZGF0YS5zdGF0aWNTdHlsZQogICAgPyBleHRlbmQoZGF0YS5zdGF0aWNTdHlsZSwgc3R5bGUpCiAgICA6IHN0eWxlCn0KCi8vIG5vcm1hbGl6ZSBwb3NzaWJsZSBhcnJheSAvIHN0cmluZyB2YWx1ZXMgaW50byBPYmplY3QKZnVuY3Rpb24gbm9ybWFsaXplU3R5bGVCaW5kaW5nIChiaW5kaW5nU3R5bGUpIHsKICBpZiAoQXJyYXkuaXNBcnJheShiaW5kaW5nU3R5bGUpKSB7CiAgICByZXR1cm4gdG9PYmplY3QoYmluZGluZ1N0eWxlKQogIH0KICBpZiAodHlwZW9mIGJpbmRpbmdTdHlsZSA9PT0gJ3N0cmluZycpIHsKICAgIHJldHVybiBwYXJzZVN0eWxlVGV4dChiaW5kaW5nU3R5bGUpCiAgfQogIHJldHVybiBiaW5kaW5nU3R5bGUKfQoKLyoqCiAqIHBhcmVudCBjb21wb25lbnQgc3R5bGUgc2hvdWxkIGJlIGFmdGVyIGNoaWxkJ3MKICogc28gdGhhdCBwYXJlbnQgY29tcG9uZW50J3Mgc3R5bGUgY291bGQgb3ZlcnJpZGUgaXQKICovCmZ1bmN0aW9uIGdldFN0eWxlICh2bm9kZSwgY2hlY2tDaGlsZCkgewogIHZhciByZXMgPSB7fTsKICB2YXIgc3R5bGVEYXRhOwoKICBpZiAoY2hlY2tDaGlsZCkgewogICAgdmFyIGNoaWxkTm9kZSA9IHZub2RlOwogICAgd2hpbGUgKGNoaWxkTm9kZS5jb21wb25lbnRJbnN0YW5jZSkgewogICAgICBjaGlsZE5vZGUgPSBjaGlsZE5vZGUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlOwogICAgICBpZiAoCiAgICAgICAgY2hpbGROb2RlICYmIGNoaWxkTm9kZS5kYXRhICYmCiAgICAgICAgKHN0eWxlRGF0YSA9IG5vcm1hbGl6ZVN0eWxlRGF0YShjaGlsZE5vZGUuZGF0YSkpCiAgICAgICkgewogICAgICAgIGV4dGVuZChyZXMsIHN0eWxlRGF0YSk7CiAgICAgIH0KICAgIH0KICB9CgogIGlmICgoc3R5bGVEYXRhID0gbm9ybWFsaXplU3R5bGVEYXRhKHZub2RlLmRhdGEpKSkgewogICAgZXh0ZW5kKHJlcywgc3R5bGVEYXRhKTsKICB9CgogIHZhciBwYXJlbnROb2RlID0gdm5vZGU7CiAgd2hpbGUgKChwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnQpKSB7CiAgICBpZiAocGFyZW50Tm9kZS5kYXRhICYmIChzdHlsZURhdGEgPSBub3JtYWxpemVTdHlsZURhdGEocGFyZW50Tm9kZS5kYXRhKSkpIHsKICAgICAgZXh0ZW5kKHJlcywgc3R5bGVEYXRhKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCnZhciBjc3NWYXJSRSA9IC9eLS0vOwp2YXIgaW1wb3J0YW50UkUgPSAvXHMqIWltcG9ydGFudCQvOwp2YXIgc2V0UHJvcCA9IGZ1bmN0aW9uIChlbCwgbmFtZSwgdmFsKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGNzc1ZhclJFLnRlc3QobmFtZSkpIHsKICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbCk7CiAgfSBlbHNlIGlmIChpbXBvcnRhbnRSRS50ZXN0KHZhbCkpIHsKICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbC5yZXBsYWNlKGltcG9ydGFudFJFLCAnJyksICdpbXBvcnRhbnQnKTsKICB9IGVsc2UgewogICAgdmFyIG5vcm1hbGl6ZWROYW1lID0gbm9ybWFsaXplKG5hbWUpOwogICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgewogICAgICAvLyBTdXBwb3J0IHZhbHVlcyBhcnJheSBjcmVhdGVkIGJ5IGF1dG9wcmVmaXhlciwgZS5nLgogICAgICAvLyB7ZGlzcGxheTogWyItd2Via2l0LWJveCIsICItbXMtZmxleGJveCIsICJmbGV4Il19CiAgICAgIC8vIFNldCB0aGVtIG9uZSBieSBvbmUsIGFuZCB0aGUgYnJvd3NlciB3aWxsIG9ubHkgc2V0IHRob3NlIGl0IGNhbiByZWNvZ25pemUKICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHZhbC5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgIGVsLnN0eWxlW25vcm1hbGl6ZWROYW1lXSA9IHZhbFtpXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZWwuc3R5bGVbbm9ybWFsaXplZE5hbWVdID0gdmFsOwogICAgfQogIH0KfTsKCnZhciB2ZW5kb3JOYW1lcyA9IFsnV2Via2l0JywgJ01veicsICdtcyddOwoKdmFyIGVtcHR5U3R5bGU7CnZhciBub3JtYWxpemUgPSBjYWNoZWQoZnVuY3Rpb24gKHByb3ApIHsKICBlbXB0eVN0eWxlID0gZW1wdHlTdHlsZSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZTsKICBwcm9wID0gY2FtZWxpemUocHJvcCk7CiAgaWYgKHByb3AgIT09ICdmaWx0ZXInICYmIChwcm9wIGluIGVtcHR5U3R5bGUpKSB7CiAgICByZXR1cm4gcHJvcAogIH0KICB2YXIgY2FwTmFtZSA9IHByb3AuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9wLnNsaWNlKDEpOwogIGZvciAodmFyIGkgPSAwOyBpIDwgdmVuZG9yTmFtZXMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBuYW1lID0gdmVuZG9yTmFtZXNbaV0gKyBjYXBOYW1lOwogICAgaWYgKG5hbWUgaW4gZW1wdHlTdHlsZSkgewogICAgICByZXR1cm4gbmFtZQogICAgfQogIH0KfSk7CgpmdW5jdGlvbiB1cGRhdGVTdHlsZSAob2xkVm5vZGUsIHZub2RlKSB7CiAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogIHZhciBvbGREYXRhID0gb2xkVm5vZGUuZGF0YTsKCiAgaWYgKGlzVW5kZWYoZGF0YS5zdGF0aWNTdHlsZSkgJiYgaXNVbmRlZihkYXRhLnN0eWxlKSAmJgogICAgaXNVbmRlZihvbGREYXRhLnN0YXRpY1N0eWxlKSAmJiBpc1VuZGVmKG9sZERhdGEuc3R5bGUpCiAgKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBjdXIsIG5hbWU7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwogIHZhciBvbGRTdGF0aWNTdHlsZSA9IG9sZERhdGEuc3RhdGljU3R5bGU7CiAgdmFyIG9sZFN0eWxlQmluZGluZyA9IG9sZERhdGEubm9ybWFsaXplZFN0eWxlIHx8IG9sZERhdGEuc3R5bGUgfHwge307CgogIC8vIGlmIHN0YXRpYyBzdHlsZSBleGlzdHMsIHN0eWxlYmluZGluZyBhbHJlYWR5IG1lcmdlZCBpbnRvIGl0IHdoZW4gZG9pbmcgbm9ybWFsaXplU3R5bGVEYXRhCiAgdmFyIG9sZFN0eWxlID0gb2xkU3RhdGljU3R5bGUgfHwgb2xkU3R5bGVCaW5kaW5nOwoKICB2YXIgc3R5bGUgPSBub3JtYWxpemVTdHlsZUJpbmRpbmcodm5vZGUuZGF0YS5zdHlsZSkgfHwge307CgogIC8vIHN0b3JlIG5vcm1hbGl6ZWQgc3R5bGUgdW5kZXIgYSBkaWZmZXJlbnQga2V5IGZvciBuZXh0IGRpZmYKICAvLyBtYWtlIHN1cmUgdG8gY2xvbmUgaXQgaWYgaXQncyByZWFjdGl2ZSwgc2luY2UgdGhlIHVzZXIgbGlrZWx5IHdhbnRzCiAgLy8gdG8gbXV0YXRlIGl0LgogIHZub2RlLmRhdGEubm9ybWFsaXplZFN0eWxlID0gaXNEZWYoc3R5bGUuX19vYl9fKQogICAgPyBleHRlbmQoe30sIHN0eWxlKQogICAgOiBzdHlsZTsKCiAgdmFyIG5ld1N0eWxlID0gZ2V0U3R5bGUodm5vZGUsIHRydWUpOwoKICBmb3IgKG5hbWUgaW4gb2xkU3R5bGUpIHsKICAgIGlmIChpc1VuZGVmKG5ld1N0eWxlW25hbWVdKSkgewogICAgICBzZXRQcm9wKGVsLCBuYW1lLCAnJyk7CiAgICB9CiAgfQogIGZvciAobmFtZSBpbiBuZXdTdHlsZSkgewogICAgY3VyID0gbmV3U3R5bGVbbmFtZV07CiAgICBpZiAoY3VyICE9PSBvbGRTdHlsZVtuYW1lXSkgewogICAgICAvLyBpZTkgc2V0dGluZyB0byBudWxsIGhhcyBubyBlZmZlY3QsIG11c3QgdXNlIGVtcHR5IHN0cmluZwogICAgICBzZXRQcm9wKGVsLCBuYW1lLCBjdXIgPT0gbnVsbCA/ICcnIDogY3VyKTsKICAgIH0KICB9Cn0KCnZhciBzdHlsZSA9IHsKICBjcmVhdGU6IHVwZGF0ZVN0eWxlLAogIHVwZGF0ZTogdXBkYXRlU3R5bGUKfQoKLyogICovCgovKioKICogQWRkIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uCiAqIFNWRyBlbGVtZW50cyBpbiBJRQogKi8KZnVuY3Rpb24gYWRkQ2xhc3MgKGVsLCBjbHMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNscyB8fCAhKGNscyA9IGNscy50cmltKCkpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKGVsLmNsYXNzTGlzdCkgewogICAgaWYgKGNscy5pbmRleE9mKCcgJykgPiAtMSkgewogICAgICBjbHMuc3BsaXQoL1xzKy8pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGVsLmNsYXNzTGlzdC5hZGQoYyk7IH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuY2xhc3NMaXN0LmFkZChjbHMpOwogICAgfQogIH0gZWxzZSB7CiAgICB2YXIgY3VyID0gIiAiICsgKGVsLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJykgKyAiICI7CiAgICBpZiAoY3VyLmluZGV4T2YoJyAnICsgY2xzICsgJyAnKSA8IDApIHsKICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsIChjdXIgKyBjbHMpLnRyaW0oKSk7CiAgICB9CiAgfQp9CgovKioKICogUmVtb3ZlIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uCiAqIFNWRyBlbGVtZW50cyBpbiBJRQogKi8KZnVuY3Rpb24gcmVtb3ZlQ2xhc3MgKGVsLCBjbHMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNscyB8fCAhKGNscyA9IGNscy50cmltKCkpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKGVsLmNsYXNzTGlzdCkgewogICAgaWYgKGNscy5pbmRleE9mKCcgJykgPiAtMSkgewogICAgICBjbHMuc3BsaXQoL1xzKy8pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGVsLmNsYXNzTGlzdC5yZW1vdmUoYyk7IH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShjbHMpOwogICAgfQogICAgaWYgKCFlbC5jbGFzc0xpc3QubGVuZ3RoKSB7CiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTsKICAgIH0KICB9IGVsc2UgewogICAgdmFyIGN1ciA9ICIgIiArIChlbC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgfHwgJycpICsgIiAiOwogICAgdmFyIHRhciA9ICcgJyArIGNscyArICcgJzsKICAgIHdoaWxlIChjdXIuaW5kZXhPZih0YXIpID49IDApIHsKICAgICAgY3VyID0gY3VyLnJlcGxhY2UodGFyLCAnICcpOwogICAgfQogICAgY3VyID0gY3VyLnRyaW0oKTsKICAgIGlmIChjdXIpIHsKICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsIGN1cik7CiAgICB9IGVsc2UgewogICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7CiAgICB9CiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uIChkZWYpIHsKICBpZiAoIWRlZikgewogICAgcmV0dXJuCiAgfQogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKHR5cGVvZiBkZWYgPT09ICdvYmplY3QnKSB7CiAgICB2YXIgcmVzID0ge307CiAgICBpZiAoZGVmLmNzcyAhPT0gZmFsc2UpIHsKICAgICAgZXh0ZW5kKHJlcywgYXV0b0Nzc1RyYW5zaXRpb24oZGVmLm5hbWUgfHwgJ3YnKSk7CiAgICB9CiAgICBleHRlbmQocmVzLCBkZWYpOwogICAgcmV0dXJuIHJlcwogIH0gZWxzZSBpZiAodHlwZW9mIGRlZiA9PT0gJ3N0cmluZycpIHsKICAgIHJldHVybiBhdXRvQ3NzVHJhbnNpdGlvbihkZWYpCiAgfQp9Cgp2YXIgYXV0b0Nzc1RyYW5zaXRpb24gPSBjYWNoZWQoZnVuY3Rpb24gKG5hbWUpIHsKICByZXR1cm4gewogICAgZW50ZXJDbGFzczogKG5hbWUgKyAiLWVudGVyIiksCiAgICBlbnRlclRvQ2xhc3M6IChuYW1lICsgIi1lbnRlci10byIpLAogICAgZW50ZXJBY3RpdmVDbGFzczogKG5hbWUgKyAiLWVudGVyLWFjdGl2ZSIpLAogICAgbGVhdmVDbGFzczogKG5hbWUgKyAiLWxlYXZlIiksCiAgICBsZWF2ZVRvQ2xhc3M6IChuYW1lICsgIi1sZWF2ZS10byIpLAogICAgbGVhdmVBY3RpdmVDbGFzczogKG5hbWUgKyAiLWxlYXZlLWFjdGl2ZSIpCiAgfQp9KTsKCnZhciBoYXNUcmFuc2l0aW9uID0gaW5Ccm93c2VyICYmICFpc0lFOTsKdmFyIFRSQU5TSVRJT04gPSAndHJhbnNpdGlvbic7CnZhciBBTklNQVRJT04gPSAnYW5pbWF0aW9uJzsKCi8vIFRyYW5zaXRpb24gcHJvcGVydHkvZXZlbnQgc25pZmZpbmcKdmFyIHRyYW5zaXRpb25Qcm9wID0gJ3RyYW5zaXRpb24nOwp2YXIgdHJhbnNpdGlvbkVuZEV2ZW50ID0gJ3RyYW5zaXRpb25lbmQnOwp2YXIgYW5pbWF0aW9uUHJvcCA9ICdhbmltYXRpb24nOwp2YXIgYW5pbWF0aW9uRW5kRXZlbnQgPSAnYW5pbWF0aW9uZW5kJzsKaWYgKGhhc1RyYW5zaXRpb24pIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAod2luZG93Lm9udHJhbnNpdGlvbmVuZCA9PT0gdW5kZWZpbmVkICYmCiAgICB3aW5kb3cub253ZWJraXR0cmFuc2l0aW9uZW5kICE9PSB1bmRlZmluZWQKICApIHsKICAgIHRyYW5zaXRpb25Qcm9wID0gJ1dlYmtpdFRyYW5zaXRpb24nOwogICAgdHJhbnNpdGlvbkVuZEV2ZW50ID0gJ3dlYmtpdFRyYW5zaXRpb25FbmQnOwogIH0KICBpZiAod2luZG93Lm9uYW5pbWF0aW9uZW5kID09PSB1bmRlZmluZWQgJiYKICAgIHdpbmRvdy5vbndlYmtpdGFuaW1hdGlvbmVuZCAhPT0gdW5kZWZpbmVkCiAgKSB7CiAgICBhbmltYXRpb25Qcm9wID0gJ1dlYmtpdEFuaW1hdGlvbic7CiAgICBhbmltYXRpb25FbmRFdmVudCA9ICd3ZWJraXRBbmltYXRpb25FbmQnOwogIH0KfQoKLy8gYmluZGluZyB0byB3aW5kb3cgaXMgbmVjZXNzYXJ5IHRvIG1ha2UgaG90IHJlbG9hZCB3b3JrIGluIElFIGluIHN0cmljdCBtb2RlCnZhciByYWYgPSBpbkJyb3dzZXIKICA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUKICAgID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykKICAgIDogc2V0VGltZW91dAogIDogLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gZnVuY3Rpb24gKGZuKSB7IHJldHVybiBmbigpOyB9OwoKZnVuY3Rpb24gbmV4dEZyYW1lIChmbikgewogIHJhZihmdW5jdGlvbiAoKSB7CiAgICByYWYoZm4pOwogIH0pOwp9CgpmdW5jdGlvbiBhZGRUcmFuc2l0aW9uQ2xhc3MgKGVsLCBjbHMpIHsKICB2YXIgdHJhbnNpdGlvbkNsYXNzZXMgPSBlbC5fdHJhbnNpdGlvbkNsYXNzZXMgfHwgKGVsLl90cmFuc2l0aW9uQ2xhc3NlcyA9IFtdKTsKICBpZiAodHJhbnNpdGlvbkNsYXNzZXMuaW5kZXhPZihjbHMpIDwgMCkgewogICAgdHJhbnNpdGlvbkNsYXNzZXMucHVzaChjbHMpOwogICAgYWRkQ2xhc3MoZWwsIGNscyk7CiAgfQp9CgpmdW5jdGlvbiByZW1vdmVUcmFuc2l0aW9uQ2xhc3MgKGVsLCBjbHMpIHsKICBpZiAoZWwuX3RyYW5zaXRpb25DbGFzc2VzKSB7CiAgICByZW1vdmUoZWwuX3RyYW5zaXRpb25DbGFzc2VzLCBjbHMpOwogIH0KICByZW1vdmVDbGFzcyhlbCwgY2xzKTsKfQoKZnVuY3Rpb24gd2hlblRyYW5zaXRpb25FbmRzICgKICBlbCwKICBleHBlY3RlZFR5cGUsCiAgY2IKKSB7CiAgdmFyIHJlZiA9IGdldFRyYW5zaXRpb25JbmZvKGVsLCBleHBlY3RlZFR5cGUpOwogIHZhciB0eXBlID0gcmVmLnR5cGU7CiAgdmFyIHRpbWVvdXQgPSByZWYudGltZW91dDsKICB2YXIgcHJvcENvdW50ID0gcmVmLnByb3BDb3VudDsKICBpZiAoIXR5cGUpIHsgcmV0dXJuIGNiKCkgfQogIHZhciBldmVudCA9IHR5cGUgPT09IFRSQU5TSVRJT04gPyB0cmFuc2l0aW9uRW5kRXZlbnQgOiBhbmltYXRpb25FbmRFdmVudDsKICB2YXIgZW5kZWQgPSAwOwogIHZhciBlbmQgPSBmdW5jdGlvbiAoKSB7CiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBvbkVuZCk7CiAgICBjYigpOwogIH07CiAgdmFyIG9uRW5kID0gZnVuY3Rpb24gKGUpIHsKICAgIGlmIChlLnRhcmdldCA9PT0gZWwpIHsKICAgICAgaWYgKCsrZW5kZWQgPj0gcHJvcENvdW50KSB7CiAgICAgICAgZW5kKCk7CiAgICAgIH0KICAgIH0KICB9OwogIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgaWYgKGVuZGVkIDwgcHJvcENvdW50KSB7CiAgICAgIGVuZCgpOwogICAgfQogIH0sIHRpbWVvdXQgKyAxKTsKICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBvbkVuZCk7Cn0KCnZhciB0cmFuc2Zvcm1SRSA9IC9cYih0cmFuc2Zvcm18YWxsKSgsfCQpLzsKCmZ1bmN0aW9uIGdldFRyYW5zaXRpb25JbmZvIChlbCwgZXhwZWN0ZWRUeXBlKSB7CiAgdmFyIHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTsKICB2YXIgdHJhbnNpdGlvbkRlbGF5cyA9IHN0eWxlc1t0cmFuc2l0aW9uUHJvcCArICdEZWxheSddLnNwbGl0KCcsICcpOwogIHZhciB0cmFuc2l0aW9uRHVyYXRpb25zID0gc3R5bGVzW3RyYW5zaXRpb25Qcm9wICsgJ0R1cmF0aW9uJ10uc3BsaXQoJywgJyk7CiAgdmFyIHRyYW5zaXRpb25UaW1lb3V0ID0gZ2V0VGltZW91dCh0cmFuc2l0aW9uRGVsYXlzLCB0cmFuc2l0aW9uRHVyYXRpb25zKTsKICB2YXIgYW5pbWF0aW9uRGVsYXlzID0gc3R5bGVzW2FuaW1hdGlvblByb3AgKyAnRGVsYXknXS5zcGxpdCgnLCAnKTsKICB2YXIgYW5pbWF0aW9uRHVyYXRpb25zID0gc3R5bGVzW2FuaW1hdGlvblByb3AgKyAnRHVyYXRpb24nXS5zcGxpdCgnLCAnKTsKICB2YXIgYW5pbWF0aW9uVGltZW91dCA9IGdldFRpbWVvdXQoYW5pbWF0aW9uRGVsYXlzLCBhbmltYXRpb25EdXJhdGlvbnMpOwoKICB2YXIgdHlwZTsKICB2YXIgdGltZW91dCA9IDA7CiAgdmFyIHByb3BDb3VudCA9IDA7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGV4cGVjdGVkVHlwZSA9PT0gVFJBTlNJVElPTikgewogICAgaWYgKHRyYW5zaXRpb25UaW1lb3V0ID4gMCkgewogICAgICB0eXBlID0gVFJBTlNJVElPTjsKICAgICAgdGltZW91dCA9IHRyYW5zaXRpb25UaW1lb3V0OwogICAgICBwcm9wQ291bnQgPSB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aDsKICAgIH0KICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gQU5JTUFUSU9OKSB7CiAgICBpZiAoYW5pbWF0aW9uVGltZW91dCA+IDApIHsKICAgICAgdHlwZSA9IEFOSU1BVElPTjsKICAgICAgdGltZW91dCA9IGFuaW1hdGlvblRpbWVvdXQ7CiAgICAgIHByb3BDb3VudCA9IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGg7CiAgICB9CiAgfSBlbHNlIHsKICAgIHRpbWVvdXQgPSBNYXRoLm1heCh0cmFuc2l0aW9uVGltZW91dCwgYW5pbWF0aW9uVGltZW91dCk7CiAgICB0eXBlID0gdGltZW91dCA+IDAKICAgICAgPyB0cmFuc2l0aW9uVGltZW91dCA+IGFuaW1hdGlvblRpbWVvdXQKICAgICAgICA/IFRSQU5TSVRJT04KICAgICAgICA6IEFOSU1BVElPTgogICAgICA6IG51bGw7CiAgICBwcm9wQ291bnQgPSB0eXBlCiAgICAgID8gdHlwZSA9PT0gVFJBTlNJVElPTgogICAgICAgID8gdHJhbnNpdGlvbkR1cmF0aW9ucy5sZW5ndGgKICAgICAgICA6IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGgKICAgICAgOiAwOwogIH0KICB2YXIgaGFzVHJhbnNmb3JtID0KICAgIHR5cGUgPT09IFRSQU5TSVRJT04gJiYKICAgIHRyYW5zZm9ybVJFLnRlc3Qoc3R5bGVzW3RyYW5zaXRpb25Qcm9wICsgJ1Byb3BlcnR5J10pOwogIHJldHVybiB7CiAgICB0eXBlOiB0eXBlLAogICAgdGltZW91dDogdGltZW91dCwKICAgIHByb3BDb3VudDogcHJvcENvdW50LAogICAgaGFzVHJhbnNmb3JtOiBoYXNUcmFuc2Zvcm0KICB9Cn0KCmZ1bmN0aW9uIGdldFRpbWVvdXQgKGRlbGF5cywgZHVyYXRpb25zKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICB3aGlsZSAoZGVsYXlzLmxlbmd0aCA8IGR1cmF0aW9ucy5sZW5ndGgpIHsKICAgIGRlbGF5cyA9IGRlbGF5cy5jb25jYXQoZGVsYXlzKTsKICB9CgogIHJldHVybiBNYXRoLm1heC5hcHBseShudWxsLCBkdXJhdGlvbnMubWFwKGZ1bmN0aW9uIChkLCBpKSB7CiAgICByZXR1cm4gdG9NcyhkKSArIHRvTXMoZGVsYXlzW2ldKQogIH0pKQp9CgpmdW5jdGlvbiB0b01zIChzKSB7CiAgcmV0dXJuIE51bWJlcihzLnNsaWNlKDAsIC0xKSkgKiAxMDAwCn0KCi8qICAqLwoKZnVuY3Rpb24gZW50ZXIgKHZub2RlLCB0b2dnbGVEaXNwbGF5KSB7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwoKICAvLyBjYWxsIGxlYXZlIGNhbGxiYWNrIG5vdwogIGlmIChpc0RlZihlbC5fbGVhdmVDYikpIHsKICAgIGVsLl9sZWF2ZUNiLmNhbmNlbGxlZCA9IHRydWU7CiAgICBlbC5fbGVhdmVDYigpOwogIH0KCiAgdmFyIGRhdGEgPSByZXNvbHZlVHJhbnNpdGlvbih2bm9kZS5kYXRhLnRyYW5zaXRpb24pOwogIGlmIChpc1VuZGVmKGRhdGEpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihlbC5fZW50ZXJDYikgfHwgZWwubm9kZVR5cGUgIT09IDEpIHsKICAgIHJldHVybgogIH0KCiAgdmFyIGNzcyA9IGRhdGEuY3NzOwogIHZhciB0eXBlID0gZGF0YS50eXBlOwogIHZhciBlbnRlckNsYXNzID0gZGF0YS5lbnRlckNsYXNzOwogIHZhciBlbnRlclRvQ2xhc3MgPSBkYXRhLmVudGVyVG9DbGFzczsKICB2YXIgZW50ZXJBY3RpdmVDbGFzcyA9IGRhdGEuZW50ZXJBY3RpdmVDbGFzczsKICB2YXIgYXBwZWFyQ2xhc3MgPSBkYXRhLmFwcGVhckNsYXNzOwogIHZhciBhcHBlYXJUb0NsYXNzID0gZGF0YS5hcHBlYXJUb0NsYXNzOwogIHZhciBhcHBlYXJBY3RpdmVDbGFzcyA9IGRhdGEuYXBwZWFyQWN0aXZlQ2xhc3M7CiAgdmFyIGJlZm9yZUVudGVyID0gZGF0YS5iZWZvcmVFbnRlcjsKICB2YXIgZW50ZXIgPSBkYXRhLmVudGVyOwogIHZhciBhZnRlckVudGVyID0gZGF0YS5hZnRlckVudGVyOwogIHZhciBlbnRlckNhbmNlbGxlZCA9IGRhdGEuZW50ZXJDYW5jZWxsZWQ7CiAgdmFyIGJlZm9yZUFwcGVhciA9IGRhdGEuYmVmb3JlQXBwZWFyOwogIHZhciBhcHBlYXIgPSBkYXRhLmFwcGVhcjsKICB2YXIgYWZ0ZXJBcHBlYXIgPSBkYXRhLmFmdGVyQXBwZWFyOwogIHZhciBhcHBlYXJDYW5jZWxsZWQgPSBkYXRhLmFwcGVhckNhbmNlbGxlZDsKICB2YXIgZHVyYXRpb24gPSBkYXRhLmR1cmF0aW9uOwoKICAvLyBhY3RpdmVJbnN0YW5jZSB3aWxsIGFsd2F5cyBiZSB0aGUgPHRyYW5zaXRpb24+IGNvbXBvbmVudCBtYW5hZ2luZyB0aGlzCiAgLy8gdHJhbnNpdGlvbi4gT25lIGVkZ2UgY2FzZSB0byBjaGVjayBpcyB3aGVuIHRoZSA8dHJhbnNpdGlvbj4gaXMgcGxhY2VkCiAgLy8gYXMgdGhlIHJvb3Qgbm9kZSBvZiBhIGNoaWxkIGNvbXBvbmVudC4gSW4gdGhhdCBjYXNlIHdlIG5lZWQgdG8gY2hlY2sKICAvLyA8dHJhbnNpdGlvbj4ncyBwYXJlbnQgZm9yIGFwcGVhciBjaGVjay4KICB2YXIgY29udGV4dCA9IGFjdGl2ZUluc3RhbmNlOwogIHZhciB0cmFuc2l0aW9uTm9kZSA9IGFjdGl2ZUluc3RhbmNlLiR2bm9kZTsKICB3aGlsZSAodHJhbnNpdGlvbk5vZGUgJiYgdHJhbnNpdGlvbk5vZGUucGFyZW50KSB7CiAgICB0cmFuc2l0aW9uTm9kZSA9IHRyYW5zaXRpb25Ob2RlLnBhcmVudDsKICAgIGNvbnRleHQgPSB0cmFuc2l0aW9uTm9kZS5jb250ZXh0OwogIH0KCiAgdmFyIGlzQXBwZWFyID0gIWNvbnRleHQuX2lzTW91bnRlZCB8fCAhdm5vZGUuaXNSb290SW5zZXJ0OwoKICBpZiAoaXNBcHBlYXIgJiYgIWFwcGVhciAmJiBhcHBlYXIgIT09ICcnKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBzdGFydENsYXNzID0gaXNBcHBlYXIgJiYgYXBwZWFyQ2xhc3MKICAgID8gYXBwZWFyQ2xhc3MKICAgIDogZW50ZXJDbGFzczsKICB2YXIgYWN0aXZlQ2xhc3MgPSBpc0FwcGVhciAmJiBhcHBlYXJBY3RpdmVDbGFzcwogICAgPyBhcHBlYXJBY3RpdmVDbGFzcwogICAgOiBlbnRlckFjdGl2ZUNsYXNzOwogIHZhciB0b0NsYXNzID0gaXNBcHBlYXIgJiYgYXBwZWFyVG9DbGFzcwogICAgPyBhcHBlYXJUb0NsYXNzCiAgICA6IGVudGVyVG9DbGFzczsKCiAgdmFyIGJlZm9yZUVudGVySG9vayA9IGlzQXBwZWFyCiAgICA/IChiZWZvcmVBcHBlYXIgfHwgYmVmb3JlRW50ZXIpCiAgICA6IGJlZm9yZUVudGVyOwogIHZhciBlbnRlckhvb2sgPSBpc0FwcGVhcgogICAgPyAodHlwZW9mIGFwcGVhciA9PT0gJ2Z1bmN0aW9uJyA/IGFwcGVhciA6IGVudGVyKQogICAgOiBlbnRlcjsKICB2YXIgYWZ0ZXJFbnRlckhvb2sgPSBpc0FwcGVhcgogICAgPyAoYWZ0ZXJBcHBlYXIgfHwgYWZ0ZXJFbnRlcikKICAgIDogYWZ0ZXJFbnRlcjsKICB2YXIgZW50ZXJDYW5jZWxsZWRIb29rID0gaXNBcHBlYXIKICAgID8gKGFwcGVhckNhbmNlbGxlZCB8fCBlbnRlckNhbmNlbGxlZCkKICAgIDogZW50ZXJDYW5jZWxsZWQ7CgogIHZhciBleHBsaWNpdEVudGVyRHVyYXRpb24gPSB0b051bWJlcigKICAgIGlzT2JqZWN0KGR1cmF0aW9uKQogICAgICA/IGR1cmF0aW9uLmVudGVyCiAgICAgIDogZHVyYXRpb24KICApOwoKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGV4cGxpY2l0RW50ZXJEdXJhdGlvbiAhPSBudWxsKSB7CiAgICBjaGVja0R1cmF0aW9uKGV4cGxpY2l0RW50ZXJEdXJhdGlvbiwgJ2VudGVyJywgdm5vZGUpOwogIH0KCiAgdmFyIGV4cGVjdHNDU1MgPSBjc3MgIT09IGZhbHNlICYmICFpc0lFOTsKICB2YXIgdXNlcldhbnRzQ29udHJvbCA9IGdldEhvb2tBcmd1bWVudHNMZW5ndGgoZW50ZXJIb29rKTsKCiAgdmFyIGNiID0gZWwuX2VudGVyQ2IgPSBvbmNlKGZ1bmN0aW9uICgpIHsKICAgIGlmIChleHBlY3RzQ1NTKSB7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgdG9DbGFzcyk7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgYWN0aXZlQ2xhc3MpOwogICAgfQogICAgaWYgKGNiLmNhbmNlbGxlZCkgewogICAgICBpZiAoZXhwZWN0c0NTUykgewogICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgc3RhcnRDbGFzcyk7CiAgICAgIH0KICAgICAgZW50ZXJDYW5jZWxsZWRIb29rICYmIGVudGVyQ2FuY2VsbGVkSG9vayhlbCk7CiAgICB9IGVsc2UgewogICAgICBhZnRlckVudGVySG9vayAmJiBhZnRlckVudGVySG9vayhlbCk7CiAgICB9CiAgICBlbC5fZW50ZXJDYiA9IG51bGw7CiAgfSk7CgogIGlmICghdm5vZGUuZGF0YS5zaG93KSB7CiAgICAvLyByZW1vdmUgcGVuZGluZyBsZWF2ZSBlbGVtZW50IG9uIGVudGVyIGJ5IGluamVjdGluZyBhbiBpbnNlcnQgaG9vawogICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdpbnNlcnQnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlOwogICAgICB2YXIgcGVuZGluZ05vZGUgPSBwYXJlbnQgJiYgcGFyZW50Ll9wZW5kaW5nICYmIHBhcmVudC5fcGVuZGluZ1t2bm9kZS5rZXldOwogICAgICBpZiAocGVuZGluZ05vZGUgJiYKICAgICAgICBwZW5kaW5nTm9kZS50YWcgPT09IHZub2RlLnRhZyAmJgogICAgICAgIHBlbmRpbmdOb2RlLmVsbS5fbGVhdmVDYgogICAgICApIHsKICAgICAgICBwZW5kaW5nTm9kZS5lbG0uX2xlYXZlQ2IoKTsKICAgICAgfQogICAgICBlbnRlckhvb2sgJiYgZW50ZXJIb29rKGVsLCBjYik7CiAgICB9KTsKICB9CgogIC8vIHN0YXJ0IGVudGVyIHRyYW5zaXRpb24KICBiZWZvcmVFbnRlckhvb2sgJiYgYmVmb3JlRW50ZXJIb29rKGVsKTsKICBpZiAoZXhwZWN0c0NTUykgewogICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBzdGFydENsYXNzKTsKICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgYWN0aXZlQ2xhc3MpOwogICAgbmV4dEZyYW1lKGZ1bmN0aW9uICgpIHsKICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBzdGFydENsYXNzKTsKICAgICAgaWYgKCFjYi5jYW5jZWxsZWQpIHsKICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIHRvQ2xhc3MpOwogICAgICAgIGlmICghdXNlcldhbnRzQ29udHJvbCkgewogICAgICAgICAgaWYgKGlzVmFsaWREdXJhdGlvbihleHBsaWNpdEVudGVyRHVyYXRpb24pKSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQoY2IsIGV4cGxpY2l0RW50ZXJEdXJhdGlvbik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIHR5cGUsIGNiKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgaWYgKHZub2RlLmRhdGEuc2hvdykgewogICAgdG9nZ2xlRGlzcGxheSAmJiB0b2dnbGVEaXNwbGF5KCk7CiAgICBlbnRlckhvb2sgJiYgZW50ZXJIb29rKGVsLCBjYik7CiAgfQoKICBpZiAoIWV4cGVjdHNDU1MgJiYgIXVzZXJXYW50c0NvbnRyb2wpIHsKICAgIGNiKCk7CiAgfQp9CgpmdW5jdGlvbiBsZWF2ZSAodm5vZGUsIHJtKSB7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwoKICAvLyBjYWxsIGVudGVyIGNhbGxiYWNrIG5vdwogIGlmIChpc0RlZihlbC5fZW50ZXJDYikpIHsKICAgIGVsLl9lbnRlckNiLmNhbmNlbGxlZCA9IHRydWU7CiAgICBlbC5fZW50ZXJDYigpOwogIH0KCiAgdmFyIGRhdGEgPSByZXNvbHZlVHJhbnNpdGlvbih2bm9kZS5kYXRhLnRyYW5zaXRpb24pOwogIGlmIChpc1VuZGVmKGRhdGEpIHx8IGVsLm5vZGVUeXBlICE9PSAxKSB7CiAgICByZXR1cm4gcm0oKQogIH0KCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGlzRGVmKGVsLl9sZWF2ZUNiKSkgewogICAgcmV0dXJuCiAgfQoKICB2YXIgY3NzID0gZGF0YS5jc3M7CiAgdmFyIHR5cGUgPSBkYXRhLnR5cGU7CiAgdmFyIGxlYXZlQ2xhc3MgPSBkYXRhLmxlYXZlQ2xhc3M7CiAgdmFyIGxlYXZlVG9DbGFzcyA9IGRhdGEubGVhdmVUb0NsYXNzOwogIHZhciBsZWF2ZUFjdGl2ZUNsYXNzID0gZGF0YS5sZWF2ZUFjdGl2ZUNsYXNzOwogIHZhciBiZWZvcmVMZWF2ZSA9IGRhdGEuYmVmb3JlTGVhdmU7CiAgdmFyIGxlYXZlID0gZGF0YS5sZWF2ZTsKICB2YXIgYWZ0ZXJMZWF2ZSA9IGRhdGEuYWZ0ZXJMZWF2ZTsKICB2YXIgbGVhdmVDYW5jZWxsZWQgPSBkYXRhLmxlYXZlQ2FuY2VsbGVkOwogIHZhciBkZWxheUxlYXZlID0gZGF0YS5kZWxheUxlYXZlOwogIHZhciBkdXJhdGlvbiA9IGRhdGEuZHVyYXRpb247CgogIHZhciBleHBlY3RzQ1NTID0gY3NzICE9PSBmYWxzZSAmJiAhaXNJRTk7CiAgdmFyIHVzZXJXYW50c0NvbnRyb2wgPSBnZXRIb29rQXJndW1lbnRzTGVuZ3RoKGxlYXZlKTsKCiAgdmFyIGV4cGxpY2l0TGVhdmVEdXJhdGlvbiA9IHRvTnVtYmVyKAogICAgaXNPYmplY3QoZHVyYXRpb24pCiAgICAgID8gZHVyYXRpb24ubGVhdmUKICAgICAgOiBkdXJhdGlvbgogICk7CgogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgaXNEZWYoZXhwbGljaXRMZWF2ZUR1cmF0aW9uKSkgewogICAgY2hlY2tEdXJhdGlvbihleHBsaWNpdExlYXZlRHVyYXRpb24sICdsZWF2ZScsIHZub2RlKTsKICB9CgogIHZhciBjYiA9IGVsLl9sZWF2ZUNiID0gb25jZShmdW5jdGlvbiAoKSB7CiAgICBpZiAoZWwucGFyZW50Tm9kZSAmJiBlbC5wYXJlbnROb2RlLl9wZW5kaW5nKSB7CiAgICAgIGVsLnBhcmVudE5vZGUuX3BlbmRpbmdbdm5vZGUua2V5XSA9IG51bGw7CiAgICB9CiAgICBpZiAoZXhwZWN0c0NTUykgewogICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVBY3RpdmVDbGFzcyk7CiAgICB9CiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7CiAgICAgIGlmIChleHBlY3RzQ1NTKSB7CiAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUNsYXNzKTsKICAgICAgfQogICAgICBsZWF2ZUNhbmNlbGxlZCAmJiBsZWF2ZUNhbmNlbGxlZChlbCk7CiAgICB9IGVsc2UgewogICAgICBybSgpOwogICAgICBhZnRlckxlYXZlICYmIGFmdGVyTGVhdmUoZWwpOwogICAgfQogICAgZWwuX2xlYXZlQ2IgPSBudWxsOwogIH0pOwoKICBpZiAoZGVsYXlMZWF2ZSkgewogICAgZGVsYXlMZWF2ZShwZXJmb3JtTGVhdmUpOwogIH0gZWxzZSB7CiAgICBwZXJmb3JtTGVhdmUoKTsKICB9CgogIGZ1bmN0aW9uIHBlcmZvcm1MZWF2ZSAoKSB7CiAgICAvLyB0aGUgZGVsYXllZCBsZWF2ZSBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkCiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7CiAgICAgIHJldHVybgogICAgfQogICAgLy8gcmVjb3JkIGxlYXZpbmcgZWxlbWVudAogICAgaWYgKCF2bm9kZS5kYXRhLnNob3cpIHsKICAgICAgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgfHwgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgPSB7fSkpWyh2bm9kZS5rZXkpXSA9IHZub2RlOwogICAgfQogICAgYmVmb3JlTGVhdmUgJiYgYmVmb3JlTGVhdmUoZWwpOwogICAgaWYgKGV4cGVjdHNDU1MpIHsKICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUNsYXNzKTsKICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUFjdGl2ZUNsYXNzKTsKICAgICAgbmV4dEZyYW1lKGZ1bmN0aW9uICgpIHsKICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQ2xhc3MpOwogICAgICAgIGlmICghY2IuY2FuY2VsbGVkKSB7CiAgICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7CiAgICAgICAgICBpZiAoIXVzZXJXYW50c0NvbnRyb2wpIHsKICAgICAgICAgICAgaWYgKGlzVmFsaWREdXJhdGlvbihleHBsaWNpdExlYXZlRHVyYXRpb24pKSB7CiAgICAgICAgICAgICAgc2V0VGltZW91dChjYiwgZXhwbGljaXRMZWF2ZUR1cmF0aW9uKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIHR5cGUsIGNiKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBsZWF2ZSAmJiBsZWF2ZShlbCwgY2IpOwogICAgaWYgKCFleHBlY3RzQ1NTICYmICF1c2VyV2FudHNDb250cm9sKSB7CiAgICAgIGNiKCk7CiAgICB9CiAgfQp9CgovLyBvbmx5IHVzZWQgaW4gZGV2IG1vZGUKZnVuY3Rpb24gY2hlY2tEdXJhdGlvbiAodmFsLCBuYW1lLCB2bm9kZSkgewogIGlmICh0eXBlb2YgdmFsICE9PSAnbnVtYmVyJykgewogICAgd2FybigKICAgICAgIjx0cmFuc2l0aW9uPiBleHBsaWNpdCAiICsgbmFtZSArICIgZHVyYXRpb24gaXMgbm90IGEgdmFsaWQgbnVtYmVyIC0gIiArCiAgICAgICJnb3QgIiArIChKU09OLnN0cmluZ2lmeSh2YWwpKSArICIuIiwKICAgICAgdm5vZGUuY29udGV4dAogICAgKTsKICB9IGVsc2UgaWYgKGlzTmFOKHZhbCkpIHsKICAgIHdhcm4oCiAgICAgICI8dHJhbnNpdGlvbj4gZXhwbGljaXQgIiArIG5hbWUgKyAiIGR1cmF0aW9uIGlzIE5hTiAtICIgKwogICAgICAndGhlIGR1cmF0aW9uIGV4cHJlc3Npb24gbWlnaHQgYmUgaW5jb3JyZWN0LicsCiAgICAgIHZub2RlLmNvbnRleHQKICAgICk7CiAgfQp9CgpmdW5jdGlvbiBpc1ZhbGlkRHVyYXRpb24gKHZhbCkgewogIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsKQp9CgovKioKICogTm9ybWFsaXplIGEgdHJhbnNpdGlvbiBob29rJ3MgYXJndW1lbnQgbGVuZ3RoLiBUaGUgaG9vayBtYXkgYmU6CiAqIC0gYSBtZXJnZWQgaG9vayAoaW52b2tlcikgd2l0aCB0aGUgb3JpZ2luYWwgaW4gLmZucwogKiAtIGEgd3JhcHBlZCBjb21wb25lbnQgbWV0aG9kIChjaGVjayAuX2xlbmd0aCkKICogLSBhIHBsYWluIGZ1bmN0aW9uICgubGVuZ3RoKQogKi8KZnVuY3Rpb24gZ2V0SG9va0FyZ3VtZW50c0xlbmd0aCAoZm4pIHsKICBpZiAoaXNVbmRlZihmbikpIHsKICAgIHJldHVybiBmYWxzZQogIH0KICB2YXIgaW52b2tlckZucyA9IGZuLmZuczsKICBpZiAoaXNEZWYoaW52b2tlckZucykpIHsKICAgIC8vIGludm9rZXIKICAgIHJldHVybiBnZXRIb29rQXJndW1lbnRzTGVuZ3RoKAogICAgICBBcnJheS5pc0FycmF5KGludm9rZXJGbnMpCiAgICAgICAgPyBpbnZva2VyRm5zWzBdCiAgICAgICAgOiBpbnZva2VyRm5zCiAgICApCiAgfSBlbHNlIHsKICAgIHJldHVybiAoZm4uX2xlbmd0aCB8fCBmbi5sZW5ndGgpID4gMQogIH0KfQoKZnVuY3Rpb24gX2VudGVyIChfLCB2bm9kZSkgewogIGlmICh2bm9kZS5kYXRhLnNob3cgIT09IHRydWUpIHsKICAgIGVudGVyKHZub2RlKTsKICB9Cn0KCnZhciB0cmFuc2l0aW9uID0gaW5Ccm93c2VyID8gewogIGNyZWF0ZTogX2VudGVyLAogIGFjdGl2YXRlOiBfZW50ZXIsCiAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUkJDEgKHZub2RlLCBybSkgewogICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgIGlmICh2bm9kZS5kYXRhLnNob3cgIT09IHRydWUpIHsKICAgICAgbGVhdmUodm5vZGUsIHJtKTsKICAgIH0gZWxzZSB7CiAgICAgIHJtKCk7CiAgICB9CiAgfQp9IDoge30KCnZhciBwbGF0Zm9ybU1vZHVsZXMgPSBbCiAgYXR0cnMsCiAga2xhc3MsCiAgZXZlbnRzLAogIGRvbVByb3BzLAogIHN0eWxlLAogIHRyYW5zaXRpb24KXQoKLyogICovCgovLyB0aGUgZGlyZWN0aXZlIG1vZHVsZSBzaG91bGQgYmUgYXBwbGllZCBsYXN0LCBhZnRlciBhbGwKLy8gYnVpbHQtaW4gbW9kdWxlcyBoYXZlIGJlZW4gYXBwbGllZC4KdmFyIG1vZHVsZXMgPSBwbGF0Zm9ybU1vZHVsZXMuY29uY2F0KGJhc2VNb2R1bGVzKTsKCnZhciBwYXRjaCA9IGNyZWF0ZVBhdGNoRnVuY3Rpb24oeyBub2RlT3BzOiBub2RlT3BzLCBtb2R1bGVzOiBtb2R1bGVzIH0pOwoKLyoqCiAqIE5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBsaWtlIGF0dGFjaGluZwogKiBwcm9wZXJ0aWVzIHRvIEVsZW1lbnRzLgogKi8KCi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwppZiAoaXNJRTkpIHsKICAvLyBodHRwOi8vd3d3Lm1hdHRzNDExLmNvbS9wb3N0L2ludGVybmV0LWV4cGxvcmVyLTktb25pbnB1dC8KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3Rpb25jaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICB2YXIgZWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50OwogICAgaWYgKGVsICYmIGVsLnZtb2RlbCkgewogICAgICB0cmlnZ2VyKGVsLCAnaW5wdXQnKTsKICAgIH0KICB9KTsKfQoKdmFyIGRpcmVjdGl2ZSA9IHsKICBpbnNlcnRlZDogZnVuY3Rpb24gaW5zZXJ0ZWQgKGVsLCBiaW5kaW5nLCB2bm9kZSwgb2xkVm5vZGUpIHsKICAgIGlmICh2bm9kZS50YWcgPT09ICdzZWxlY3QnKSB7CiAgICAgIC8vICM2OTAzCiAgICAgIGlmIChvbGRWbm9kZS5lbG0gJiYgIW9sZFZub2RlLmVsbS5fdk9wdGlvbnMpIHsKICAgICAgICBtZXJnZVZOb2RlSG9vayh2bm9kZSwgJ3Bvc3RwYXRjaCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGRpcmVjdGl2ZS5jb21wb25lbnRVcGRhdGVkKGVsLCBiaW5kaW5nLCB2bm9kZSk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLmNvbnRleHQpOwogICAgICB9CiAgICAgIGVsLl92T3B0aW9ucyA9IFtdLm1hcC5jYWxsKGVsLm9wdGlvbnMsIGdldFZhbHVlKTsKICAgIH0gZWxzZSBpZiAodm5vZGUudGFnID09PSAndGV4dGFyZWEnIHx8IGlzVGV4dElucHV0VHlwZShlbC50eXBlKSkgewogICAgICBlbC5fdk1vZGlmaWVycyA9IGJpbmRpbmcubW9kaWZpZXJzOwogICAgICBpZiAoIWJpbmRpbmcubW9kaWZpZXJzLmxhenkpIHsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb21wb3NpdGlvbnN0YXJ0Jywgb25Db21wb3NpdGlvblN0YXJ0KTsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb21wb3NpdGlvbmVuZCcsIG9uQ29tcG9zaXRpb25FbmQpOwogICAgICAgIC8vIFNhZmFyaSA8IDEwLjIgJiBVSVdlYlZpZXcgZG9lc24ndCBmaXJlIGNvbXBvc2l0aW9uZW5kIHdoZW4KICAgICAgICAvLyBzd2l0Y2hpbmcgZm9jdXMgYmVmb3JlIGNvbmZpcm1pbmcgY29tcG9zaXRpb24gY2hvaWNlCiAgICAgICAgLy8gdGhpcyBhbHNvIGZpeGVzIHRoZSBpc3N1ZSB3aGVyZSBzb21lIGJyb3dzZXJzIGUuZy4gaU9TIENocm9tZQogICAgICAgIC8vIGZpcmVzICJjaGFuZ2UiIGluc3RlYWQgb2YgImlucHV0IiBvbiBhdXRvY29tcGxldGUuCiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgb25Db21wb3NpdGlvbkVuZCk7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgaWYgKGlzSUU5KSB7CiAgICAgICAgICBlbC52bW9kZWwgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sCgogIGNvbXBvbmVudFVwZGF0ZWQ6IGZ1bmN0aW9uIGNvbXBvbmVudFVwZGF0ZWQgKGVsLCBiaW5kaW5nLCB2bm9kZSkgewogICAgaWYgKHZub2RlLnRhZyA9PT0gJ3NlbGVjdCcpIHsKICAgICAgc2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLmNvbnRleHQpOwogICAgICAvLyBpbiBjYXNlIHRoZSBvcHRpb25zIHJlbmRlcmVkIGJ5IHYtZm9yIGhhdmUgY2hhbmdlZCwKICAgICAgLy8gaXQncyBwb3NzaWJsZSB0aGF0IHRoZSB2YWx1ZSBpcyBvdXQtb2Ytc3luYyB3aXRoIHRoZSByZW5kZXJlZCBvcHRpb25zLgogICAgICAvLyBkZXRlY3Qgc3VjaCBjYXNlcyBhbmQgZmlsdGVyIG91dCB2YWx1ZXMgdGhhdCBubyBsb25nZXIgaGFzIGEgbWF0Y2hpbmcKICAgICAgLy8gb3B0aW9uIGluIHRoZSBET00uCiAgICAgIHZhciBwcmV2T3B0aW9ucyA9IGVsLl92T3B0aW9uczsKICAgICAgdmFyIGN1ck9wdGlvbnMgPSBlbC5fdk9wdGlvbnMgPSBbXS5tYXAuY2FsbChlbC5vcHRpb25zLCBnZXRWYWx1ZSk7CiAgICAgIGlmIChjdXJPcHRpb25zLnNvbWUoZnVuY3Rpb24gKG8sIGkpIHsgcmV0dXJuICFsb29zZUVxdWFsKG8sIHByZXZPcHRpb25zW2ldKTsgfSkpIHsKICAgICAgICAvLyB0cmlnZ2VyIGNoYW5nZSBldmVudCBpZgogICAgICAgIC8vIG5vIG1hdGNoaW5nIG9wdGlvbiBmb3VuZCBmb3IgYXQgbGVhc3Qgb25lIHZhbHVlCiAgICAgICAgdmFyIG5lZWRSZXNldCA9IGVsLm11bHRpcGxlCiAgICAgICAgICA/IGJpbmRpbmcudmFsdWUuc29tZShmdW5jdGlvbiAodikgeyByZXR1cm4gaGFzTm9NYXRjaGluZ09wdGlvbih2LCBjdXJPcHRpb25zKTsgfSkKICAgICAgICAgIDogYmluZGluZy52YWx1ZSAhPT0gYmluZGluZy5vbGRWYWx1ZSAmJiBoYXNOb01hdGNoaW5nT3B0aW9uKGJpbmRpbmcudmFsdWUsIGN1ck9wdGlvbnMpOwogICAgICAgIGlmIChuZWVkUmVzZXQpIHsKICAgICAgICAgIHRyaWdnZXIoZWwsICdjaGFuZ2UnKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn07CgpmdW5jdGlvbiBzZXRTZWxlY3RlZCAoZWwsIGJpbmRpbmcsIHZtKSB7CiAgYWN0dWFsbHlTZXRTZWxlY3RlZChlbCwgYmluZGluZywgdm0pOwogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0lFIHx8IGlzRWRnZSkgewogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgIGFjdHVhbGx5U2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZtKTsKICAgIH0sIDApOwogIH0KfQoKZnVuY3Rpb24gYWN0dWFsbHlTZXRTZWxlY3RlZCAoZWwsIGJpbmRpbmcsIHZtKSB7CiAgdmFyIHZhbHVlID0gYmluZGluZy52YWx1ZTsKICB2YXIgaXNNdWx0aXBsZSA9IGVsLm11bHRpcGxlOwogIGlmIChpc011bHRpcGxlICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICI8c2VsZWN0IG11bHRpcGxlIHYtbW9kZWw9XCIiICsgKGJpbmRpbmcuZXhwcmVzc2lvbikgKyAiXCI+ICIgKwogICAgICAiZXhwZWN0cyBhbiBBcnJheSB2YWx1ZSBmb3IgaXRzIGJpbmRpbmcsIGJ1dCBnb3QgIiArIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKSksCiAgICAgIHZtCiAgICApOwogICAgcmV0dXJuCiAgfQogIHZhciBzZWxlY3RlZCwgb3B0aW9uOwogIGZvciAodmFyIGkgPSAwLCBsID0gZWwub3B0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIG9wdGlvbiA9IGVsLm9wdGlvbnNbaV07CiAgICBpZiAoaXNNdWx0aXBsZSkgewogICAgICBzZWxlY3RlZCA9IGxvb3NlSW5kZXhPZih2YWx1ZSwgZ2V0VmFsdWUob3B0aW9uKSkgPiAtMTsKICAgICAgaWYgKG9wdGlvbi5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHsKICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBzZWxlY3RlZDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKGxvb3NlRXF1YWwoZ2V0VmFsdWUob3B0aW9uKSwgdmFsdWUpKSB7CiAgICAgICAgaWYgKGVsLnNlbGVjdGVkSW5kZXggIT09IGkpIHsKICAgICAgICAgIGVsLnNlbGVjdGVkSW5kZXggPSBpOwogICAgICAgIH0KICAgICAgICByZXR1cm4KICAgICAgfQogICAgfQogIH0KICBpZiAoIWlzTXVsdGlwbGUpIHsKICAgIGVsLnNlbGVjdGVkSW5kZXggPSAtMTsKICB9Cn0KCmZ1bmN0aW9uIGhhc05vTWF0Y2hpbmdPcHRpb24gKHZhbHVlLCBvcHRpb25zKSB7CiAgcmV0dXJuIG9wdGlvbnMuZXZlcnkoZnVuY3Rpb24gKG8pIHsgcmV0dXJuICFsb29zZUVxdWFsKG8sIHZhbHVlKTsgfSkKfQoKZnVuY3Rpb24gZ2V0VmFsdWUgKG9wdGlvbikgewogIHJldHVybiAnX3ZhbHVlJyBpbiBvcHRpb24KICAgID8gb3B0aW9uLl92YWx1ZQogICAgOiBvcHRpb24udmFsdWUKfQoKZnVuY3Rpb24gb25Db21wb3NpdGlvblN0YXJ0IChlKSB7CiAgZS50YXJnZXQuY29tcG9zaW5nID0gdHJ1ZTsKfQoKZnVuY3Rpb24gb25Db21wb3NpdGlvbkVuZCAoZSkgewogIC8vIHByZXZlbnQgdHJpZ2dlcmluZyBhbiBpbnB1dCBldmVudCBmb3Igbm8gcmVhc29uCiAgaWYgKCFlLnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuIH0KICBlLnRhcmdldC5jb21wb3NpbmcgPSBmYWxzZTsKICB0cmlnZ2VyKGUudGFyZ2V0LCAnaW5wdXQnKTsKfQoKZnVuY3Rpb24gdHJpZ2dlciAoZWwsIHR5cGUpIHsKICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7CiAgZS5pbml0RXZlbnQodHlwZSwgdHJ1ZSwgdHJ1ZSk7CiAgZWwuZGlzcGF0Y2hFdmVudChlKTsKfQoKLyogICovCgovLyByZWN1cnNpdmVseSBzZWFyY2ggZm9yIHBvc3NpYmxlIHRyYW5zaXRpb24gZGVmaW5lZCBpbnNpZGUgdGhlIGNvbXBvbmVudCByb290CmZ1bmN0aW9uIGxvY2F0ZU5vZGUgKHZub2RlKSB7CiAgcmV0dXJuIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICYmICghdm5vZGUuZGF0YSB8fCAhdm5vZGUuZGF0YS50cmFuc2l0aW9uKQogICAgPyBsb2NhdGVOb2RlKHZub2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSkKICAgIDogdm5vZGUKfQoKdmFyIHNob3cgPSB7CiAgYmluZDogZnVuY3Rpb24gYmluZCAoZWwsIHJlZiwgdm5vZGUpIHsKICAgIHZhciB2YWx1ZSA9IHJlZi52YWx1ZTsKCiAgICB2bm9kZSA9IGxvY2F0ZU5vZGUodm5vZGUpOwogICAgdmFyIHRyYW5zaXRpb24kJDEgPSB2bm9kZS5kYXRhICYmIHZub2RlLmRhdGEudHJhbnNpdGlvbjsKICAgIHZhciBvcmlnaW5hbERpc3BsYXkgPSBlbC5fX3ZPcmlnaW5hbERpc3BsYXkgPQogICAgICBlbC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnJyA6IGVsLnN0eWxlLmRpc3BsYXk7CiAgICBpZiAodmFsdWUgJiYgdHJhbnNpdGlvbiQkMSkgewogICAgICB2bm9kZS5kYXRhLnNob3cgPSB0cnVlOwogICAgICBlbnRlcih2bm9kZSwgZnVuY3Rpb24gKCkgewogICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSBvcmlnaW5hbERpc3BsYXk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IHZhbHVlID8gb3JpZ2luYWxEaXNwbGF5IDogJ25vbmUnOwogICAgfQogIH0sCgogIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlIChlbCwgcmVmLCB2bm9kZSkgewogICAgdmFyIHZhbHVlID0gcmVmLnZhbHVlOwogICAgdmFyIG9sZFZhbHVlID0gcmVmLm9sZFZhbHVlOwoKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKCF2YWx1ZSA9PT0gIW9sZFZhbHVlKSB7IHJldHVybiB9CiAgICB2bm9kZSA9IGxvY2F0ZU5vZGUodm5vZGUpOwogICAgdmFyIHRyYW5zaXRpb24kJDEgPSB2bm9kZS5kYXRhICYmIHZub2RlLmRhdGEudHJhbnNpdGlvbjsKICAgIGlmICh0cmFuc2l0aW9uJCQxKSB7CiAgICAgIHZub2RlLmRhdGEuc2hvdyA9IHRydWU7CiAgICAgIGlmICh2YWx1ZSkgewogICAgICAgIGVudGVyKHZub2RlLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gZWwuX192T3JpZ2luYWxEaXNwbGF5OwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGxlYXZlKHZub2RlLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIH0pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gdmFsdWUgPyBlbC5fX3ZPcmlnaW5hbERpc3BsYXkgOiAnbm9uZSc7CiAgICB9CiAgfSwKCiAgdW5iaW5kOiBmdW5jdGlvbiB1bmJpbmQgKAogICAgZWwsCiAgICBiaW5kaW5nLAogICAgdm5vZGUsCiAgICBvbGRWbm9kZSwKICAgIGlzRGVzdHJveQogICkgewogICAgaWYgKCFpc0Rlc3Ryb3kpIHsKICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IGVsLl9fdk9yaWdpbmFsRGlzcGxheTsKICAgIH0KICB9Cn0KCnZhciBwbGF0Zm9ybURpcmVjdGl2ZXMgPSB7CiAgbW9kZWw6IGRpcmVjdGl2ZSwKICBzaG93OiBzaG93Cn0KCi8qICAqLwoKLy8gUHJvdmlkZXMgdHJhbnNpdGlvbiBzdXBwb3J0IGZvciBhIHNpbmdsZSBlbGVtZW50L2NvbXBvbmVudC4KLy8gc3VwcG9ydHMgdHJhbnNpdGlvbiBtb2RlIChvdXQtaW4gLyBpbi1vdXQpCgp2YXIgdHJhbnNpdGlvblByb3BzID0gewogIG5hbWU6IFN0cmluZywKICBhcHBlYXI6IEJvb2xlYW4sCiAgY3NzOiBCb29sZWFuLAogIG1vZGU6IFN0cmluZywKICB0eXBlOiBTdHJpbmcsCiAgZW50ZXJDbGFzczogU3RyaW5nLAogIGxlYXZlQ2xhc3M6IFN0cmluZywKICBlbnRlclRvQ2xhc3M6IFN0cmluZywKICBsZWF2ZVRvQ2xhc3M6IFN0cmluZywKICBlbnRlckFjdGl2ZUNsYXNzOiBTdHJpbmcsCiAgbGVhdmVBY3RpdmVDbGFzczogU3RyaW5nLAogIGFwcGVhckNsYXNzOiBTdHJpbmcsCiAgYXBwZWFyQWN0aXZlQ2xhc3M6IFN0cmluZywKICBhcHBlYXJUb0NsYXNzOiBTdHJpbmcsCiAgZHVyYXRpb246IFtOdW1iZXIsIFN0cmluZywgT2JqZWN0XQp9OwoKLy8gaW4gY2FzZSB0aGUgY2hpbGQgaXMgYWxzbyBhbiBhYnN0cmFjdCBjb21wb25lbnQsIGUuZy4gPGtlZXAtYWxpdmU+Ci8vIHdlIHdhbnQgdG8gcmVjdXJzaXZlbHkgcmV0cmlldmUgdGhlIHJlYWwgY29tcG9uZW50IHRvIGJlIHJlbmRlcmVkCmZ1bmN0aW9uIGdldFJlYWxDaGlsZCAodm5vZGUpIHsKICB2YXIgY29tcE9wdGlvbnMgPSB2bm9kZSAmJiB2bm9kZS5jb21wb25lbnRPcHRpb25zOwogIGlmIChjb21wT3B0aW9ucyAmJiBjb21wT3B0aW9ucy5DdG9yLm9wdGlvbnMuYWJzdHJhY3QpIHsKICAgIHJldHVybiBnZXRSZWFsQ2hpbGQoZ2V0Rmlyc3RDb21wb25lbnRDaGlsZChjb21wT3B0aW9ucy5jaGlsZHJlbikpCiAgfSBlbHNlIHsKICAgIHJldHVybiB2bm9kZQogIH0KfQoKZnVuY3Rpb24gZXh0cmFjdFRyYW5zaXRpb25EYXRhIChjb21wKSB7CiAgdmFyIGRhdGEgPSB7fTsKICB2YXIgb3B0aW9ucyA9IGNvbXAuJG9wdGlvbnM7CiAgLy8gcHJvcHMKICBmb3IgKHZhciBrZXkgaW4gb3B0aW9ucy5wcm9wc0RhdGEpIHsKICAgIGRhdGFba2V5XSA9IGNvbXBba2V5XTsKICB9CiAgLy8gZXZlbnRzLgogIC8vIGV4dHJhY3QgbGlzdGVuZXJzIGFuZCBwYXNzIHRoZW0gZGlyZWN0bHkgdG8gdGhlIHRyYW5zaXRpb24gbWV0aG9kcwogIHZhciBsaXN0ZW5lcnMgPSBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7CiAgZm9yICh2YXIga2V5JDEgaW4gbGlzdGVuZXJzKSB7CiAgICBkYXRhW2NhbWVsaXplKGtleSQxKV0gPSBsaXN0ZW5lcnNba2V5JDFdOwogIH0KICByZXR1cm4gZGF0YQp9CgpmdW5jdGlvbiBwbGFjZWhvbGRlciAoaCwgcmF3Q2hpbGQpIHsKICBpZiAoL1xkLWtlZXAtYWxpdmUkLy50ZXN0KHJhd0NoaWxkLnRhZykpIHsKICAgIHJldHVybiBoKCdrZWVwLWFsaXZlJywgewogICAgICBwcm9wczogcmF3Q2hpbGQuY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGEKICAgIH0pCiAgfQp9CgpmdW5jdGlvbiBoYXNQYXJlbnRUcmFuc2l0aW9uICh2bm9kZSkgewogIHdoaWxlICgodm5vZGUgPSB2bm9kZS5wYXJlbnQpKSB7CiAgICBpZiAodm5vZGUuZGF0YS50cmFuc2l0aW9uKSB7CiAgICAgIHJldHVybiB0cnVlCiAgICB9CiAgfQp9CgpmdW5jdGlvbiBpc1NhbWVDaGlsZCAoY2hpbGQsIG9sZENoaWxkKSB7CiAgcmV0dXJuIG9sZENoaWxkLmtleSA9PT0gY2hpbGQua2V5ICYmIG9sZENoaWxkLnRhZyA9PT0gY2hpbGQudGFnCn0KCnZhciBUcmFuc2l0aW9uID0gewogIG5hbWU6ICd0cmFuc2l0aW9uJywKICBwcm9wczogdHJhbnNpdGlvblByb3BzLAogIGFic3RyYWN0OiB0cnVlLAoKICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoaCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIGNoaWxkcmVuID0gdGhpcy4kc2xvdHMuZGVmYXVsdDsKICAgIGlmICghY2hpbGRyZW4pIHsKICAgICAgcmV0dXJuCiAgICB9CgogICAgLy8gZmlsdGVyIG91dCB0ZXh0IG5vZGVzIChwb3NzaWJsZSB3aGl0ZXNwYWNlcykKICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLnRhZyB8fCBpc0FzeW5jUGxhY2Vob2xkZXIoYyk7IH0pOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoIWNoaWxkcmVuLmxlbmd0aCkgewogICAgICByZXR1cm4KICAgIH0KCiAgICAvLyB3YXJuIG11bHRpcGxlIGVsZW1lbnRzCiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNoaWxkcmVuLmxlbmd0aCA+IDEpIHsKICAgICAgd2FybigKICAgICAgICAnPHRyYW5zaXRpb24+IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBzaW5nbGUgZWxlbWVudC4gVXNlICcgKwogICAgICAgICc8dHJhbnNpdGlvbi1ncm91cD4gZm9yIGxpc3RzLicsCiAgICAgICAgdGhpcy4kcGFyZW50CiAgICAgICk7CiAgICB9CgogICAgdmFyIG1vZGUgPSB0aGlzLm1vZGU7CgogICAgLy8gd2FybiBpbnZhbGlkIG1vZGUKICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgbW9kZSAmJiBtb2RlICE9PSAnaW4tb3V0JyAmJiBtb2RlICE9PSAnb3V0LWluJwogICAgKSB7CiAgICAgIHdhcm4oCiAgICAgICAgJ2ludmFsaWQgPHRyYW5zaXRpb24+IG1vZGU6ICcgKyBtb2RlLAogICAgICAgIHRoaXMuJHBhcmVudAogICAgICApOwogICAgfQoKICAgIHZhciByYXdDaGlsZCA9IGNoaWxkcmVuWzBdOwoKICAgIC8vIGlmIHRoaXMgaXMgYSBjb21wb25lbnQgcm9vdCBub2RlIGFuZCB0aGUgY29tcG9uZW50J3MKICAgIC8vIHBhcmVudCBjb250YWluZXIgbm9kZSBhbHNvIGhhcyB0cmFuc2l0aW9uLCBza2lwLgogICAgaWYgKGhhc1BhcmVudFRyYW5zaXRpb24odGhpcy4kdm5vZGUpKSB7CiAgICAgIHJldHVybiByYXdDaGlsZAogICAgfQoKICAgIC8vIGFwcGx5IHRyYW5zaXRpb24gZGF0YSB0byBjaGlsZAogICAgLy8gdXNlIGdldFJlYWxDaGlsZCgpIHRvIGlnbm9yZSBhYnN0cmFjdCBjb21wb25lbnRzIGUuZy4ga2VlcC1hbGl2ZQogICAgdmFyIGNoaWxkID0gZ2V0UmVhbENoaWxkKHJhd0NoaWxkKTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKCFjaGlsZCkgewogICAgICByZXR1cm4gcmF3Q2hpbGQKICAgIH0KCiAgICBpZiAodGhpcy5fbGVhdmluZykgewogICAgICByZXR1cm4gcGxhY2Vob2xkZXIoaCwgcmF3Q2hpbGQpCiAgICB9CgogICAgLy8gZW5zdXJlIGEga2V5IHRoYXQgaXMgdW5pcXVlIHRvIHRoZSB2bm9kZSB0eXBlIGFuZCB0byB0aGlzIHRyYW5zaXRpb24KICAgIC8vIGNvbXBvbmVudCBpbnN0YW5jZS4gVGhpcyBrZXkgd2lsbCBiZSB1c2VkIHRvIHJlbW92ZSBwZW5kaW5nIGxlYXZpbmcgbm9kZXMKICAgIC8vIGR1cmluZyBlbnRlcmluZy4KICAgIHZhciBpZCA9ICJfX3RyYW5zaXRpb24tIiArICh0aGlzLl91aWQpICsgIi0iOwogICAgY2hpbGQua2V5ID0gY2hpbGQua2V5ID09IG51bGwKICAgICAgPyBjaGlsZC5pc0NvbW1lbnQKICAgICAgICA/IGlkICsgJ2NvbW1lbnQnCiAgICAgICAgOiBpZCArIGNoaWxkLnRhZwogICAgICA6IGlzUHJpbWl0aXZlKGNoaWxkLmtleSkKICAgICAgICA/IChTdHJpbmcoY2hpbGQua2V5KS5pbmRleE9mKGlkKSA9PT0gMCA/IGNoaWxkLmtleSA6IGlkICsgY2hpbGQua2V5KQogICAgICAgIDogY2hpbGQua2V5OwoKICAgIHZhciBkYXRhID0gKGNoaWxkLmRhdGEgfHwgKGNoaWxkLmRhdGEgPSB7fSkpLnRyYW5zaXRpb24gPSBleHRyYWN0VHJhbnNpdGlvbkRhdGEodGhpcyk7CiAgICB2YXIgb2xkUmF3Q2hpbGQgPSB0aGlzLl92bm9kZTsKICAgIHZhciBvbGRDaGlsZCA9IGdldFJlYWxDaGlsZChvbGRSYXdDaGlsZCk7CgogICAgLy8gbWFyayB2LXNob3cKICAgIC8vIHNvIHRoYXQgdGhlIHRyYW5zaXRpb24gbW9kdWxlIGNhbiBoYW5kIG92ZXIgdGhlIGNvbnRyb2wgdG8gdGhlIGRpcmVjdGl2ZQogICAgaWYgKGNoaWxkLmRhdGEuZGlyZWN0aXZlcyAmJiBjaGlsZC5kYXRhLmRpcmVjdGl2ZXMuc29tZShmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5uYW1lID09PSAnc2hvdyc7IH0pKSB7CiAgICAgIGNoaWxkLmRhdGEuc2hvdyA9IHRydWU7CiAgICB9CgogICAgaWYgKAogICAgICBvbGRDaGlsZCAmJgogICAgICBvbGRDaGlsZC5kYXRhICYmCiAgICAgICFpc1NhbWVDaGlsZChjaGlsZCwgb2xkQ2hpbGQpICYmCiAgICAgICFpc0FzeW5jUGxhY2Vob2xkZXIob2xkQ2hpbGQpICYmCiAgICAgIC8vICM2Njg3IGNvbXBvbmVudCByb290IGlzIGEgY29tbWVudCBub2RlCiAgICAgICEob2xkQ2hpbGQuY29tcG9uZW50SW5zdGFuY2UgJiYgb2xkQ2hpbGQuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlLmlzQ29tbWVudCkKICAgICkgewogICAgICAvLyByZXBsYWNlIG9sZCBjaGlsZCB0cmFuc2l0aW9uIGRhdGEgd2l0aCBmcmVzaCBvbmUKICAgICAgLy8gaW1wb3J0YW50IGZvciBkeW5hbWljIHRyYW5zaXRpb25zIQogICAgICB2YXIgb2xkRGF0YSA9IG9sZENoaWxkLmRhdGEudHJhbnNpdGlvbiA9IGV4dGVuZCh7fSwgZGF0YSk7CiAgICAgIC8vIGhhbmRsZSB0cmFuc2l0aW9uIG1vZGUKICAgICAgaWYgKG1vZGUgPT09ICdvdXQtaW4nKSB7CiAgICAgICAgLy8gcmV0dXJuIHBsYWNlaG9sZGVyIG5vZGUgYW5kIHF1ZXVlIHVwZGF0ZSB3aGVuIGxlYXZlIGZpbmlzaGVzCiAgICAgICAgdGhpcy5fbGVhdmluZyA9IHRydWU7CiAgICAgICAgbWVyZ2VWTm9kZUhvb2sob2xkRGF0YSwgJ2FmdGVyTGVhdmUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB0aGlzJDEuX2xlYXZpbmcgPSBmYWxzZTsKICAgICAgICAgIHRoaXMkMS4kZm9yY2VVcGRhdGUoKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcGxhY2Vob2xkZXIoaCwgcmF3Q2hpbGQpCiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2luLW91dCcpIHsKICAgICAgICBpZiAoaXNBc3luY1BsYWNlaG9sZGVyKGNoaWxkKSkgewogICAgICAgICAgcmV0dXJuIG9sZFJhd0NoaWxkCiAgICAgICAgfQogICAgICAgIHZhciBkZWxheWVkTGVhdmU7CiAgICAgICAgdmFyIHBlcmZvcm1MZWF2ZSA9IGZ1bmN0aW9uICgpIHsgZGVsYXllZExlYXZlKCk7IH07CiAgICAgICAgbWVyZ2VWTm9kZUhvb2soZGF0YSwgJ2FmdGVyRW50ZXInLCBwZXJmb3JtTGVhdmUpOwogICAgICAgIG1lcmdlVk5vZGVIb29rKGRhdGEsICdlbnRlckNhbmNlbGxlZCcsIHBlcmZvcm1MZWF2ZSk7CiAgICAgICAgbWVyZ2VWTm9kZUhvb2sob2xkRGF0YSwgJ2RlbGF5TGVhdmUnLCBmdW5jdGlvbiAobGVhdmUpIHsgZGVsYXllZExlYXZlID0gbGVhdmU7IH0pOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHJhd0NoaWxkCiAgfQp9CgovKiAgKi8KCi8vIFByb3ZpZGVzIHRyYW5zaXRpb24gc3VwcG9ydCBmb3IgbGlzdCBpdGVtcy4KLy8gc3VwcG9ydHMgbW92ZSB0cmFuc2l0aW9ucyB1c2luZyB0aGUgRkxJUCB0ZWNobmlxdWUuCgovLyBCZWNhdXNlIHRoZSB2ZG9tJ3MgY2hpbGRyZW4gdXBkYXRlIGFsZ29yaXRobSBpcyAidW5zdGFibGUiIC0gaS5lLgovLyBpdCBkb2Vzbid0IGd1YXJhbnRlZSB0aGUgcmVsYXRpdmUgcG9zaXRpb25pbmcgb2YgcmVtb3ZlZCBlbGVtZW50cywKLy8gd2UgZm9yY2UgdHJhbnNpdGlvbi1ncm91cCB0byB1cGRhdGUgaXRzIGNoaWxkcmVuIGludG8gdHdvIHBhc3NlczoKLy8gaW4gdGhlIGZpcnN0IHBhc3MsIHdlIHJlbW92ZSBhbGwgbm9kZXMgdGhhdCBuZWVkIHRvIGJlIHJlbW92ZWQsCi8vIHRyaWdnZXJpbmcgdGhlaXIgbGVhdmluZyB0cmFuc2l0aW9uOyBpbiB0aGUgc2Vjb25kIHBhc3MsIHdlIGluc2VydC9tb3ZlCi8vIGludG8gdGhlIGZpbmFsIGRlc2lyZWQgc3RhdGUuIFRoaXMgd2F5IGluIHRoZSBzZWNvbmQgcGFzcyByZW1vdmVkCi8vIG5vZGVzIHdpbGwgcmVtYWluIHdoZXJlIHRoZXkgc2hvdWxkIGJlLgoKdmFyIHByb3BzID0gZXh0ZW5kKHsKICB0YWc6IFN0cmluZywKICBtb3ZlQ2xhc3M6IFN0cmluZwp9LCB0cmFuc2l0aW9uUHJvcHMpOwoKZGVsZXRlIHByb3BzLm1vZGU7Cgp2YXIgVHJhbnNpdGlvbkdyb3VwID0gewogIHByb3BzOiBwcm9wcywKCiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKGgpIHsKICAgIHZhciB0YWcgPSB0aGlzLnRhZyB8fCB0aGlzLiR2bm9kZS5kYXRhLnRhZyB8fCAnc3Bhbic7CiAgICB2YXIgbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHZhciBwcmV2Q2hpbGRyZW4gPSB0aGlzLnByZXZDaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47CiAgICB2YXIgcmF3Q2hpbGRyZW4gPSB0aGlzLiRzbG90cy5kZWZhdWx0IHx8IFtdOwogICAgdmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgdmFyIHRyYW5zaXRpb25EYXRhID0gZXh0cmFjdFRyYW5zaXRpb25EYXRhKHRoaXMpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmF3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGMgPSByYXdDaGlsZHJlbltpXTsKICAgICAgaWYgKGMudGFnKSB7CiAgICAgICAgaWYgKGMua2V5ICE9IG51bGwgJiYgU3RyaW5nKGMua2V5KS5pbmRleE9mKCdfX3ZsaXN0JykgIT09IDApIHsKICAgICAgICAgIGNoaWxkcmVuLnB1c2goYyk7CiAgICAgICAgICBtYXBbYy5rZXldID0gYwogICAgICAgICAgOyhjLmRhdGEgfHwgKGMuZGF0YSA9IHt9KSkudHJhbnNpdGlvbiA9IHRyYW5zaXRpb25EYXRhOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgb3B0cyA9IGMuY29tcG9uZW50T3B0aW9uczsKICAgICAgICAgIHZhciBuYW1lID0gb3B0cyA/IChvcHRzLkN0b3Iub3B0aW9ucy5uYW1lIHx8IG9wdHMudGFnIHx8ICcnKSA6IGMudGFnOwogICAgICAgICAgd2FybigoIjx0cmFuc2l0aW9uLWdyb3VwPiBjaGlsZHJlbiBtdXN0IGJlIGtleWVkOiA8IiArIG5hbWUgKyAiPiIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAocHJldkNoaWxkcmVuKSB7CiAgICAgIHZhciBrZXB0ID0gW107CiAgICAgIHZhciByZW1vdmVkID0gW107CiAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IHByZXZDaGlsZHJlbi5sZW5ndGg7IGkkMSsrKSB7CiAgICAgICAgdmFyIGMkMSA9IHByZXZDaGlsZHJlbltpJDFdOwogICAgICAgIGMkMS5kYXRhLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uRGF0YTsKICAgICAgICBjJDEuZGF0YS5wb3MgPSBjJDEuZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGlmIChtYXBbYyQxLmtleV0pIHsKICAgICAgICAgIGtlcHQucHVzaChjJDEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZW1vdmVkLnB1c2goYyQxKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5rZXB0ID0gaCh0YWcsIG51bGwsIGtlcHQpOwogICAgICB0aGlzLnJlbW92ZWQgPSByZW1vdmVkOwogICAgfQoKICAgIHJldHVybiBoKHRhZywgbnVsbCwgY2hpbGRyZW4pCiAgfSwKCiAgYmVmb3JlVXBkYXRlOiBmdW5jdGlvbiBiZWZvcmVVcGRhdGUgKCkgewogICAgLy8gZm9yY2UgcmVtb3ZpbmcgcGFzcwogICAgdGhpcy5fX3BhdGNoX18oCiAgICAgIHRoaXMuX3Zub2RlLAogICAgICB0aGlzLmtlcHQsCiAgICAgIGZhbHNlLCAvLyBoeWRyYXRpbmcKICAgICAgdHJ1ZSAvLyByZW1vdmVPbmx5ICghaW1wb3J0YW50LCBhdm9pZHMgdW5uZWNlc3NhcnkgbW92ZXMpCiAgICApOwogICAgdGhpcy5fdm5vZGUgPSB0aGlzLmtlcHQ7CiAgfSwKCiAgdXBkYXRlZDogZnVuY3Rpb24gdXBkYXRlZCAoKSB7CiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByZXZDaGlsZHJlbjsKICAgIHZhciBtb3ZlQ2xhc3MgPSB0aGlzLm1vdmVDbGFzcyB8fCAoKHRoaXMubmFtZSB8fCAndicpICsgJy1tb3ZlJyk7CiAgICBpZiAoIWNoaWxkcmVuLmxlbmd0aCB8fCAhdGhpcy5oYXNNb3ZlKGNoaWxkcmVuWzBdLmVsbSwgbW92ZUNsYXNzKSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICAvLyB3ZSBkaXZpZGUgdGhlIHdvcmsgaW50byB0aHJlZSBsb29wcyB0byBhdm9pZCBtaXhpbmcgRE9NIHJlYWRzIGFuZCB3cml0ZXMKICAgIC8vIGluIGVhY2ggaXRlcmF0aW9uIC0gd2hpY2ggaGVscHMgcHJldmVudCBsYXlvdXQgdGhyYXNoaW5nLgogICAgY2hpbGRyZW4uZm9yRWFjaChjYWxsUGVuZGluZ0Nicyk7CiAgICBjaGlsZHJlbi5mb3JFYWNoKHJlY29yZFBvc2l0aW9uKTsKICAgIGNoaWxkcmVuLmZvckVhY2goYXBwbHlUcmFuc2xhdGlvbik7CgogICAgLy8gZm9yY2UgcmVmbG93IHRvIHB1dCBldmVyeXRoaW5nIGluIHBvc2l0aW9uCiAgICAvLyBhc3NpZ24gdG8gdGhpcyB0byBhdm9pZCBiZWluZyByZW1vdmVkIGluIHRyZWUtc2hha2luZwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICB0aGlzLl9yZWZsb3cgPSBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodDsKCiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7CiAgICAgIGlmIChjLmRhdGEubW92ZWQpIHsKICAgICAgICB2YXIgZWwgPSBjLmVsbTsKICAgICAgICB2YXIgcyA9IGVsLnN0eWxlOwogICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbW92ZUNsYXNzKTsKICAgICAgICBzLnRyYW5zZm9ybSA9IHMuV2Via2l0VHJhbnNmb3JtID0gcy50cmFuc2l0aW9uRHVyYXRpb24gPSAnJzsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKHRyYW5zaXRpb25FbmRFdmVudCwgZWwuX21vdmVDYiA9IGZ1bmN0aW9uIGNiIChlKSB7CiAgICAgICAgICBpZiAoIWUgfHwgL3RyYW5zZm9ybSQvLnRlc3QoZS5wcm9wZXJ0eU5hbWUpKSB7CiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJhbnNpdGlvbkVuZEV2ZW50LCBjYik7CiAgICAgICAgICAgIGVsLl9tb3ZlQ2IgPSBudWxsOwogICAgICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIG1vdmVDbGFzcyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogIH0sCgogIG1ldGhvZHM6IHsKICAgIGhhc01vdmU6IGZ1bmN0aW9uIGhhc01vdmUgKGVsLCBtb3ZlQ2xhc3MpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICghaGFzVHJhbnNpdGlvbikgewogICAgICAgIHJldHVybiBmYWxzZQogICAgICB9CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAodGhpcy5faGFzTW92ZSkgewogICAgICAgIHJldHVybiB0aGlzLl9oYXNNb3ZlCiAgICAgIH0KICAgICAgLy8gRGV0ZWN0IHdoZXRoZXIgYW4gZWxlbWVudCB3aXRoIHRoZSBtb3ZlIGNsYXNzIGFwcGxpZWQgaGFzCiAgICAgIC8vIENTUyB0cmFuc2l0aW9ucy4gU2luY2UgdGhlIGVsZW1lbnQgbWF5IGJlIGluc2lkZSBhbiBlbnRlcmluZwogICAgICAvLyB0cmFuc2l0aW9uIGF0IHRoaXMgdmVyeSBtb21lbnQsIHdlIG1ha2UgYSBjbG9uZSBvZiBpdCBhbmQgcmVtb3ZlCiAgICAgIC8vIGFsbCBvdGhlciB0cmFuc2l0aW9uIGNsYXNzZXMgYXBwbGllZCB0byBlbnN1cmUgb25seSB0aGUgbW92ZSBjbGFzcwogICAgICAvLyBpcyBhcHBsaWVkLgogICAgICB2YXIgY2xvbmUgPSBlbC5jbG9uZU5vZGUoKTsKICAgICAgaWYgKGVsLl90cmFuc2l0aW9uQ2xhc3NlcykgewogICAgICAgIGVsLl90cmFuc2l0aW9uQ2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uIChjbHMpIHsgcmVtb3ZlQ2xhc3MoY2xvbmUsIGNscyk7IH0pOwogICAgICB9CiAgICAgIGFkZENsYXNzKGNsb25lLCBtb3ZlQ2xhc3MpOwogICAgICBjbG9uZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICB0aGlzLiRlbC5hcHBlbmRDaGlsZChjbG9uZSk7CiAgICAgIHZhciBpbmZvID0gZ2V0VHJhbnNpdGlvbkluZm8oY2xvbmUpOwogICAgICB0aGlzLiRlbC5yZW1vdmVDaGlsZChjbG9uZSk7CiAgICAgIHJldHVybiAodGhpcy5faGFzTW92ZSA9IGluZm8uaGFzVHJhbnNmb3JtKQogICAgfQogIH0KfQoKZnVuY3Rpb24gY2FsbFBlbmRpbmdDYnMgKGMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoYy5lbG0uX21vdmVDYikgewogICAgYy5lbG0uX21vdmVDYigpOwogIH0KICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoYy5lbG0uX2VudGVyQ2IpIHsKICAgIGMuZWxtLl9lbnRlckNiKCk7CiAgfQp9CgpmdW5jdGlvbiByZWNvcmRQb3NpdGlvbiAoYykgewogIGMuZGF0YS5uZXdQb3MgPSBjLmVsbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKfQoKZnVuY3Rpb24gYXBwbHlUcmFuc2xhdGlvbiAoYykgewogIHZhciBvbGRQb3MgPSBjLmRhdGEucG9zOwogIHZhciBuZXdQb3MgPSBjLmRhdGEubmV3UG9zOwogIHZhciBkeCA9IG9sZFBvcy5sZWZ0IC0gbmV3UG9zLmxlZnQ7CiAgdmFyIGR5ID0gb2xkUG9zLnRvcCAtIG5ld1Bvcy50b3A7CiAgaWYgKGR4IHx8IGR5KSB7CiAgICBjLmRhdGEubW92ZWQgPSB0cnVlOwogICAgdmFyIHMgPSBjLmVsbS5zdHlsZTsKICAgIHMudHJhbnNmb3JtID0gcy5XZWJraXRUcmFuc2Zvcm0gPSAidHJhbnNsYXRlKCIgKyBkeCArICJweCwiICsgZHkgKyAicHgpIjsKICAgIHMudHJhbnNpdGlvbkR1cmF0aW9uID0gJzBzJzsKICB9Cn0KCnZhciBwbGF0Zm9ybUNvbXBvbmVudHMgPSB7CiAgVHJhbnNpdGlvbjogVHJhbnNpdGlvbiwKICBUcmFuc2l0aW9uR3JvdXA6IFRyYW5zaXRpb25Hcm91cAp9CgovKiAgKi8KCi8vIGluc3RhbGwgcGxhdGZvcm0gc3BlY2lmaWMgdXRpbHMKVnVlLmNvbmZpZy5tdXN0VXNlUHJvcCA9IG11c3RVc2VQcm9wOwpWdWUuY29uZmlnLmlzUmVzZXJ2ZWRUYWcgPSBpc1Jlc2VydmVkVGFnOwpWdWUuY29uZmlnLmlzUmVzZXJ2ZWRBdHRyID0gaXNSZXNlcnZlZEF0dHI7ClZ1ZS5jb25maWcuZ2V0VGFnTmFtZXNwYWNlID0gZ2V0VGFnTmFtZXNwYWNlOwpWdWUuY29uZmlnLmlzVW5rbm93bkVsZW1lbnQgPSBpc1Vua25vd25FbGVtZW50OwoKLy8gaW5zdGFsbCBwbGF0Zm9ybSBydW50aW1lIGRpcmVjdGl2ZXMgJiBjb21wb25lbnRzCmV4dGVuZChWdWUub3B0aW9ucy5kaXJlY3RpdmVzLCBwbGF0Zm9ybURpcmVjdGl2ZXMpOwpleHRlbmQoVnVlLm9wdGlvbnMuY29tcG9uZW50cywgcGxhdGZvcm1Db21wb25lbnRzKTsKCi8vIGluc3RhbGwgcGxhdGZvcm0gcGF0Y2ggZnVuY3Rpb24KVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gPSBpbkJyb3dzZXIgPyBwYXRjaCA6IG5vb3A7CgovLyBwdWJsaWMgbW91bnQgbWV0aG9kClZ1ZS5wcm90b3R5cGUuJG1vdW50ID0gZnVuY3Rpb24gKAogIGVsLAogIGh5ZHJhdGluZwopIHsKICBlbCA9IGVsICYmIGluQnJvd3NlciA/IHF1ZXJ5KGVsKSA6IHVuZGVmaW5lZDsKICByZXR1cm4gbW91bnRDb21wb25lbnQodGhpcywgZWwsIGh5ZHJhdGluZykKfTsKCi8vIGRldnRvb2xzIGdsb2JhbCBob29rCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCmlmIChpbkJyb3dzZXIpIHsKICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgIGlmIChjb25maWcuZGV2dG9vbHMpIHsKICAgICAgaWYgKGRldnRvb2xzKSB7CiAgICAgICAgZGV2dG9vbHMuZW1pdCgnaW5pdCcsIFZ1ZSk7CiAgICAgIH0gZWxzZSBpZiAoCiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmCiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Rlc3QnICYmCiAgICAgICAgaXNDaHJvbWUKICAgICAgKSB7CiAgICAgICAgY29uc29sZVtjb25zb2xlLmluZm8gPyAnaW5mbycgOiAnbG9nJ10oCiAgICAgICAgICAnRG93bmxvYWQgdGhlIFZ1ZSBEZXZ0b29scyBleHRlbnNpb24gZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6XG4nICsKICAgICAgICAgICdodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLWRldnRvb2xzJwogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Rlc3QnICYmCiAgICAgIGNvbmZpZy5wcm9kdWN0aW9uVGlwICE9PSBmYWxzZSAmJgogICAgICB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcKICAgICkgewogICAgICBjb25zb2xlW2NvbnNvbGUuaW5mbyA/ICdpbmZvJyA6ICdsb2cnXSgKICAgICAgICAiWW91IGFyZSBydW5uaW5nIFZ1ZSBpbiBkZXZlbG9wbWVudCBtb2RlLlxuIiArCiAgICAgICAgIk1ha2Ugc3VyZSB0byB0dXJuIG9uIHByb2R1Y3Rpb24gbW9kZSB3aGVuIGRlcGxveWluZyBmb3IgcHJvZHVjdGlvbi5cbiIgKwogICAgICAgICJTZWUgbW9yZSB0aXBzIGF0IGh0dHBzOi8vdnVlanMub3JnL2d1aWRlL2RlcGxveW1lbnQuaHRtbCIKICAgICAgKTsKICAgIH0KICB9LCAwKTsKfQoKLyogICovCgp2YXIgZGVmYXVsdFRhZ1JFID0gL1x7XHsoKD86LnxcbikrPylcfVx9L2c7CnZhciByZWdleEVzY2FwZVJFID0gL1stLiorP14ke30oKXxbXF1cL1xcXS9nOwoKdmFyIGJ1aWxkUmVnZXggPSBjYWNoZWQoZnVuY3Rpb24gKGRlbGltaXRlcnMpIHsKICB2YXIgb3BlbiA9IGRlbGltaXRlcnNbMF0ucmVwbGFjZShyZWdleEVzY2FwZVJFLCAnXFwkJicpOwogIHZhciBjbG9zZSA9IGRlbGltaXRlcnNbMV0ucmVwbGFjZShyZWdleEVzY2FwZVJFLCAnXFwkJicpOwogIHJldHVybiBuZXcgUmVnRXhwKG9wZW4gKyAnKCg/Oi58XFxuKSs/KScgKyBjbG9zZSwgJ2cnKQp9KTsKCgoKZnVuY3Rpb24gcGFyc2VUZXh0ICgKICB0ZXh0LAogIGRlbGltaXRlcnMKKSB7CiAgdmFyIHRhZ1JFID0gZGVsaW1pdGVycyA/IGJ1aWxkUmVnZXgoZGVsaW1pdGVycykgOiBkZWZhdWx0VGFnUkU7CiAgaWYgKCF0YWdSRS50ZXN0KHRleHQpKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIHRva2VucyA9IFtdOwogIHZhciByYXdUb2tlbnMgPSBbXTsKICB2YXIgbGFzdEluZGV4ID0gdGFnUkUubGFzdEluZGV4ID0gMDsKICB2YXIgbWF0Y2gsIGluZGV4LCB0b2tlblZhbHVlOwogIHdoaWxlICgobWF0Y2ggPSB0YWdSRS5leGVjKHRleHQpKSkgewogICAgaW5kZXggPSBtYXRjaC5pbmRleDsKICAgIC8vIHB1c2ggdGV4dCB0b2tlbgogICAgaWYgKGluZGV4ID4gbGFzdEluZGV4KSB7CiAgICAgIHJhd1Rva2Vucy5wdXNoKHRva2VuVmFsdWUgPSB0ZXh0LnNsaWNlKGxhc3RJbmRleCwgaW5kZXgpKTsKICAgICAgdG9rZW5zLnB1c2goSlNPTi5zdHJpbmdpZnkodG9rZW5WYWx1ZSkpOwogICAgfQogICAgLy8gdGFnIHRva2VuCiAgICB2YXIgZXhwID0gcGFyc2VGaWx0ZXJzKG1hdGNoWzFdLnRyaW0oKSk7CiAgICB0b2tlbnMucHVzaCgoIl9zKCIgKyBleHAgKyAiKSIpKTsKICAgIHJhd1Rva2Vucy5wdXNoKHsgJ0BiaW5kaW5nJzogZXhwIH0pOwogICAgbGFzdEluZGV4ID0gaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7CiAgfQogIGlmIChsYXN0SW5kZXggPCB0ZXh0Lmxlbmd0aCkgewogICAgcmF3VG9rZW5zLnB1c2godG9rZW5WYWx1ZSA9IHRleHQuc2xpY2UobGFzdEluZGV4KSk7CiAgICB0b2tlbnMucHVzaChKU09OLnN0cmluZ2lmeSh0b2tlblZhbHVlKSk7CiAgfQogIHJldHVybiB7CiAgICBleHByZXNzaW9uOiB0b2tlbnMuam9pbignKycpLAogICAgdG9rZW5zOiByYXdUb2tlbnMKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gdHJhbnNmb3JtTm9kZSAoZWwsIG9wdGlvbnMpIHsKICB2YXIgd2FybiA9IG9wdGlvbnMud2FybiB8fCBiYXNlV2FybjsKICB2YXIgc3RhdGljQ2xhc3MgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnY2xhc3MnKTsKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHN0YXRpY0NsYXNzKSB7CiAgICB2YXIgcmVzID0gcGFyc2VUZXh0KHN0YXRpY0NsYXNzLCBvcHRpb25zLmRlbGltaXRlcnMpOwogICAgaWYgKHJlcykgewogICAgICB3YXJuKAogICAgICAgICJjbGFzcz1cIiIgKyBzdGF0aWNDbGFzcyArICJcIjogIiArCiAgICAgICAgJ0ludGVycG9sYXRpb24gaW5zaWRlIGF0dHJpYnV0ZXMgaGFzIGJlZW4gcmVtb3ZlZC4gJyArCiAgICAgICAgJ1VzZSB2LWJpbmQgb3IgdGhlIGNvbG9uIHNob3J0aGFuZCBpbnN0ZWFkLiBGb3IgZXhhbXBsZSwgJyArCiAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBjbGFzcz0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDpjbGFzcz0idmFsIj4uJwogICAgICApOwogICAgfQogIH0KICBpZiAoc3RhdGljQ2xhc3MpIHsKICAgIGVsLnN0YXRpY0NsYXNzID0gSlNPTi5zdHJpbmdpZnkoc3RhdGljQ2xhc3MpOwogIH0KICB2YXIgY2xhc3NCaW5kaW5nID0gZ2V0QmluZGluZ0F0dHIoZWwsICdjbGFzcycsIGZhbHNlIC8qIGdldFN0YXRpYyAqLyk7CiAgaWYgKGNsYXNzQmluZGluZykgewogICAgZWwuY2xhc3NCaW5kaW5nID0gY2xhc3NCaW5kaW5nOwogIH0KfQoKZnVuY3Rpb24gZ2VuRGF0YSAoZWwpIHsKICB2YXIgZGF0YSA9ICcnOwogIGlmIChlbC5zdGF0aWNDbGFzcykgewogICAgZGF0YSArPSAic3RhdGljQ2xhc3M6IiArIChlbC5zdGF0aWNDbGFzcykgKyAiLCI7CiAgfQogIGlmIChlbC5jbGFzc0JpbmRpbmcpIHsKICAgIGRhdGEgKz0gImNsYXNzOiIgKyAoZWwuY2xhc3NCaW5kaW5nKSArICIsIjsKICB9CiAgcmV0dXJuIGRhdGEKfQoKdmFyIGtsYXNzJDEgPSB7CiAgc3RhdGljS2V5czogWydzdGF0aWNDbGFzcyddLAogIHRyYW5zZm9ybU5vZGU6IHRyYW5zZm9ybU5vZGUsCiAgZ2VuRGF0YTogZ2VuRGF0YQp9CgovKiAgKi8KCmZ1bmN0aW9uIHRyYW5zZm9ybU5vZGUkMSAoZWwsIG9wdGlvbnMpIHsKICB2YXIgd2FybiA9IG9wdGlvbnMud2FybiB8fCBiYXNlV2FybjsKICB2YXIgc3RhdGljU3R5bGUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc3R5bGUnKTsKICBpZiAoc3RhdGljU3R5bGUpIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgewogICAgICB2YXIgcmVzID0gcGFyc2VUZXh0KHN0YXRpY1N0eWxlLCBvcHRpb25zLmRlbGltaXRlcnMpOwogICAgICBpZiAocmVzKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJzdHlsZT1cIiIgKyBzdGF0aWNTdHlsZSArICJcIjogIiArCiAgICAgICAgICAnSW50ZXJwb2xhdGlvbiBpbnNpZGUgYXR0cmlidXRlcyBoYXMgYmVlbiByZW1vdmVkLiAnICsKICAgICAgICAgICdVc2Ugdi1iaW5kIG9yIHRoZSBjb2xvbiBzaG9ydGhhbmQgaW5zdGVhZC4gRm9yIGV4YW1wbGUsICcgKwogICAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBzdHlsZT0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDpzdHlsZT0idmFsIj4uJwogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIGVsLnN0YXRpY1N0eWxlID0gSlNPTi5zdHJpbmdpZnkocGFyc2VTdHlsZVRleHQoc3RhdGljU3R5bGUpKTsKICB9CgogIHZhciBzdHlsZUJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ3N0eWxlJywgZmFsc2UgLyogZ2V0U3RhdGljICovKTsKICBpZiAoc3R5bGVCaW5kaW5nKSB7CiAgICBlbC5zdHlsZUJpbmRpbmcgPSBzdHlsZUJpbmRpbmc7CiAgfQp9CgpmdW5jdGlvbiBnZW5EYXRhJDEgKGVsKSB7CiAgdmFyIGRhdGEgPSAnJzsKICBpZiAoZWwuc3RhdGljU3R5bGUpIHsKICAgIGRhdGEgKz0gInN0YXRpY1N0eWxlOiIgKyAoZWwuc3RhdGljU3R5bGUpICsgIiwiOwogIH0KICBpZiAoZWwuc3R5bGVCaW5kaW5nKSB7CiAgICBkYXRhICs9ICJzdHlsZTooIiArIChlbC5zdHlsZUJpbmRpbmcpICsgIiksIjsKICB9CiAgcmV0dXJuIGRhdGEKfQoKdmFyIHN0eWxlJDEgPSB7CiAgc3RhdGljS2V5czogWydzdGF0aWNTdHlsZSddLAogIHRyYW5zZm9ybU5vZGU6IHRyYW5zZm9ybU5vZGUkMSwKICBnZW5EYXRhOiBnZW5EYXRhJDEKfQoKLyogICovCgp2YXIgZGVjb2RlcjsKCnZhciBoZSA9IHsKICBkZWNvZGU6IGZ1bmN0aW9uIGRlY29kZSAoaHRtbCkgewogICAgZGVjb2RlciA9IGRlY29kZXIgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBkZWNvZGVyLmlubmVySFRNTCA9IGh0bWw7CiAgICByZXR1cm4gZGVjb2Rlci50ZXh0Q29udGVudAogIH0KfQoKLyogICovCgp2YXIgaXNVbmFyeVRhZyA9IG1ha2VNYXAoCiAgJ2FyZWEsYmFzZSxicixjb2wsZW1iZWQsZnJhbWUsaHIsaW1nLGlucHV0LGlzaW5kZXgsa2V5Z2VuLCcgKwogICdsaW5rLG1ldGEscGFyYW0sc291cmNlLHRyYWNrLHdicicKKTsKCi8vIEVsZW1lbnRzIHRoYXQgeW91IGNhbiwgaW50ZW50aW9uYWxseSwgbGVhdmUgb3BlbgovLyAoYW5kIHdoaWNoIGNsb3NlIHRoZW1zZWx2ZXMpCnZhciBjYW5CZUxlZnRPcGVuVGFnID0gbWFrZU1hcCgKICAnY29sZ3JvdXAsZGQsZHQsbGksb3B0aW9ucyxwLHRkLHRmb290LHRoLHRoZWFkLHRyLHNvdXJjZScKKTsKCi8vIEhUTUw1IHRhZ3MgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvaW5kaWNlcy5odG1sI2VsZW1lbnRzLTMKLy8gUGhyYXNpbmcgQ29udGVudCBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9kb20uaHRtbCNwaHJhc2luZy1jb250ZW50CnZhciBpc05vblBocmFzaW5nVGFnID0gbWFrZU1hcCgKICAnYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGJhc2UsYmxvY2txdW90ZSxib2R5LGNhcHRpb24sY29sLGNvbGdyb3VwLGRkLCcgKwogICdkZXRhaWxzLGRpYWxvZyxkaXYsZGwsZHQsZmllbGRzZXQsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGZvcm0sJyArCiAgJ2gxLGgyLGgzLGg0LGg1LGg2LGhlYWQsaGVhZGVyLGhncm91cCxocixodG1sLGxlZ2VuZCxsaSxtZW51aXRlbSxtZXRhLCcgKwogICdvcHRncm91cCxvcHRpb24scGFyYW0scnAscnQsc291cmNlLHN0eWxlLHN1bW1hcnksdGJvZHksdGQsdGZvb3QsdGgsdGhlYWQsJyArCiAgJ3RpdGxlLHRyLHRyYWNrJwopOwoKLyoqCiAqIE5vdCB0eXBlLWNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGl0J3MgbW9zdGx5IHZlbmRvciBjb2RlLgogKi8KCi8qIQogKiBIVE1MIFBhcnNlciBCeSBKb2huIFJlc2lnIChlam9obi5vcmcpCiAqIE1vZGlmaWVkIGJ5IEp1cml5ICJrYW5nYXgiIFpheXRzZXYKICogT3JpZ2luYWwgY29kZSBieSBFcmlrIEFydmlkc3NvbiwgTW96aWxsYSBQdWJsaWMgTGljZW5zZQogKiBodHRwOi8vZXJpay5lYWUubmV0L3NpbXBsZWh0bWxwYXJzZXIvc2ltcGxlaHRtbHBhcnNlci5qcwogKi8KCi8vIFJlZ3VsYXIgRXhwcmVzc2lvbnMgZm9yIHBhcnNpbmcgdGFncyBhbmQgYXR0cmlidXRlcwp2YXIgYXR0cmlidXRlID0gL15ccyooW15ccyInPD5cLz1dKykoPzpccyooPSlccyooPzoiKFteIl0qKSIrfCcoW14nXSopJyt8KFteXHMiJz08PmBdKykpKT8vOwovLyBjb3VsZCB1c2UgaHR0cHM6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLXhtbC1uYW1lcy0xOTk5MDExNC8jTlQtUU5hbWUKLy8gYnV0IGZvciBWdWUgdGVtcGxhdGVzIHdlIGNhbiBlbmZvcmNlIGEgc2ltcGxlIGNoYXJzZXQKdmFyIG5jbmFtZSA9ICdbYS16QS1aX11bXFx3XFwtXFwuXSonOwp2YXIgcW5hbWVDYXB0dXJlID0gIigoPzoiICsgbmNuYW1lICsgIlxcOik/IiArIG5jbmFtZSArICIpIjsKdmFyIHN0YXJ0VGFnT3BlbiA9IG5ldyBSZWdFeHAoKCJePCIgKyBxbmFtZUNhcHR1cmUpKTsKdmFyIHN0YXJ0VGFnQ2xvc2UgPSAvXlxzKihcLz8pPi87CnZhciBlbmRUYWcgPSBuZXcgUmVnRXhwKCgiXjxcXC8iICsgcW5hbWVDYXB0dXJlICsgIltePl0qPiIpKTsKdmFyIGRvY3R5cGUgPSAvXjwhRE9DVFlQRSBbXj5dKz4vaTsKLy8gIzcyOTg6IGVzY2FwZSAtIHRvIGF2b2lkIGJlaW5nIHBhc2VkIGFzIEhUTUwgY29tbWVudCB3aGVuIGlubGluZWQgaW4gcGFnZQp2YXIgY29tbWVudCA9IC9ePCFcLS0vOwp2YXIgY29uZGl0aW9uYWxDb21tZW50ID0gL148IVxbLzsKCnZhciBJU19SRUdFWF9DQVBUVVJJTkdfQlJPS0VOID0gZmFsc2U7Cid4Jy5yZXBsYWNlKC94KC4pPy9nLCBmdW5jdGlvbiAobSwgZykgewogIElTX1JFR0VYX0NBUFRVUklOR19CUk9LRU4gPSBnID09PSAnJzsKfSk7CgovLyBTcGVjaWFsIEVsZW1lbnRzIChjYW4gY29udGFpbiBhbnl0aGluZykKdmFyIGlzUGxhaW5UZXh0RWxlbWVudCA9IG1ha2VNYXAoJ3NjcmlwdCxzdHlsZSx0ZXh0YXJlYScsIHRydWUpOwp2YXIgcmVDYWNoZSA9IHt9OwoKdmFyIGRlY29kaW5nTWFwID0gewogICcmbHQ7JzogJzwnLAogICcmZ3Q7JzogJz4nLAogICcmcXVvdDsnOiAnIicsCiAgJyZhbXA7JzogJyYnLAogICcmIzEwOyc6ICdcbicsCiAgJyYjOTsnOiAnXHQnCn07CnZhciBlbmNvZGVkQXR0ciA9IC8mKD86bHR8Z3R8cXVvdHxhbXApOy9nOwp2YXIgZW5jb2RlZEF0dHJXaXRoTmV3TGluZXMgPSAvJig/Omx0fGd0fHF1b3R8YW1wfCMxMHwjOSk7L2c7CgovLyAjNTk5Mgp2YXIgaXNJZ25vcmVOZXdsaW5lVGFnID0gbWFrZU1hcCgncHJlLHRleHRhcmVhJywgdHJ1ZSk7CnZhciBzaG91bGRJZ25vcmVGaXJzdE5ld2xpbmUgPSBmdW5jdGlvbiAodGFnLCBodG1sKSB7IHJldHVybiB0YWcgJiYgaXNJZ25vcmVOZXdsaW5lVGFnKHRhZykgJiYgaHRtbFswXSA9PT0gJ1xuJzsgfTsKCmZ1bmN0aW9uIGRlY29kZUF0dHIgKHZhbHVlLCBzaG91bGREZWNvZGVOZXdsaW5lcykgewogIHZhciByZSA9IHNob3VsZERlY29kZU5ld2xpbmVzID8gZW5jb2RlZEF0dHJXaXRoTmV3TGluZXMgOiBlbmNvZGVkQXR0cjsKICByZXR1cm4gdmFsdWUucmVwbGFjZShyZSwgZnVuY3Rpb24gKG1hdGNoKSB7IHJldHVybiBkZWNvZGluZ01hcFttYXRjaF07IH0pCn0KCmZ1bmN0aW9uIHBhcnNlSFRNTCAoaHRtbCwgb3B0aW9ucykgewogIHZhciBzdGFjayA9IFtdOwogIHZhciBleHBlY3RIVE1MID0gb3B0aW9ucy5leHBlY3RIVE1MOwogIHZhciBpc1VuYXJ5VGFnJCQxID0gb3B0aW9ucy5pc1VuYXJ5VGFnIHx8IG5vOwogIHZhciBjYW5CZUxlZnRPcGVuVGFnJCQxID0gb3B0aW9ucy5jYW5CZUxlZnRPcGVuVGFnIHx8IG5vOwogIHZhciBpbmRleCA9IDA7CiAgdmFyIGxhc3QsIGxhc3RUYWc7CiAgd2hpbGUgKGh0bWwpIHsKICAgIGxhc3QgPSBodG1sOwogICAgLy8gTWFrZSBzdXJlIHdlJ3JlIG5vdCBpbiBhIHBsYWludGV4dCBjb250ZW50IGVsZW1lbnQgbGlrZSBzY3JpcHQvc3R5bGUKICAgIGlmICghbGFzdFRhZyB8fCAhaXNQbGFpblRleHRFbGVtZW50KGxhc3RUYWcpKSB7CiAgICAgIHZhciB0ZXh0RW5kID0gaHRtbC5pbmRleE9mKCc8Jyk7CiAgICAgIGlmICh0ZXh0RW5kID09PSAwKSB7CiAgICAgICAgLy8gQ29tbWVudDoKICAgICAgICBpZiAoY29tbWVudC50ZXN0KGh0bWwpKSB7CiAgICAgICAgICB2YXIgY29tbWVudEVuZCA9IGh0bWwuaW5kZXhPZignLS0+Jyk7CgogICAgICAgICAgaWYgKGNvbW1lbnRFbmQgPj0gMCkgewogICAgICAgICAgICBpZiAob3B0aW9ucy5zaG91bGRLZWVwQ29tbWVudCkgewogICAgICAgICAgICAgIG9wdGlvbnMuY29tbWVudChodG1sLnN1YnN0cmluZyg0LCBjb21tZW50RW5kKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWR2YW5jZShjb21tZW50RW5kICsgMyk7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbmRpdGlvbmFsX2NvbW1lbnQjRG93bmxldmVsLXJldmVhbGVkX2NvbmRpdGlvbmFsX2NvbW1lbnQKICAgICAgICBpZiAoY29uZGl0aW9uYWxDb21tZW50LnRlc3QoaHRtbCkpIHsKICAgICAgICAgIHZhciBjb25kaXRpb25hbEVuZCA9IGh0bWwuaW5kZXhPZignXT4nKTsKCiAgICAgICAgICBpZiAoY29uZGl0aW9uYWxFbmQgPj0gMCkgewogICAgICAgICAgICBhZHZhbmNlKGNvbmRpdGlvbmFsRW5kICsgMik7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBEb2N0eXBlOgogICAgICAgIHZhciBkb2N0eXBlTWF0Y2ggPSBodG1sLm1hdGNoKGRvY3R5cGUpOwogICAgICAgIGlmIChkb2N0eXBlTWF0Y2gpIHsKICAgICAgICAgIGFkdmFuY2UoZG9jdHlwZU1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgLy8gRW5kIHRhZzoKICAgICAgICB2YXIgZW5kVGFnTWF0Y2ggPSBodG1sLm1hdGNoKGVuZFRhZyk7CiAgICAgICAgaWYgKGVuZFRhZ01hdGNoKSB7CiAgICAgICAgICB2YXIgY3VySW5kZXggPSBpbmRleDsKICAgICAgICAgIGFkdmFuY2UoZW5kVGFnTWF0Y2hbMF0ubGVuZ3RoKTsKICAgICAgICAgIHBhcnNlRW5kVGFnKGVuZFRhZ01hdGNoWzFdLCBjdXJJbmRleCwgaW5kZXgpOwogICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgIC8vIFN0YXJ0IHRhZzoKICAgICAgICB2YXIgc3RhcnRUYWdNYXRjaCA9IHBhcnNlU3RhcnRUYWcoKTsKICAgICAgICBpZiAoc3RhcnRUYWdNYXRjaCkgewogICAgICAgICAgaGFuZGxlU3RhcnRUYWcoc3RhcnRUYWdNYXRjaCk7CiAgICAgICAgICBpZiAoc2hvdWxkSWdub3JlRmlyc3ROZXdsaW5lKGxhc3RUYWcsIGh0bWwpKSB7CiAgICAgICAgICAgIGFkdmFuY2UoMSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIHRleHQgPSAodm9pZCAwKSwgcmVzdCA9ICh2b2lkIDApLCBuZXh0ID0gKHZvaWQgMCk7CiAgICAgIGlmICh0ZXh0RW5kID49IDApIHsKICAgICAgICByZXN0ID0gaHRtbC5zbGljZSh0ZXh0RW5kKTsKICAgICAgICB3aGlsZSAoCiAgICAgICAgICAhZW5kVGFnLnRlc3QocmVzdCkgJiYKICAgICAgICAgICFzdGFydFRhZ09wZW4udGVzdChyZXN0KSAmJgogICAgICAgICAgIWNvbW1lbnQudGVzdChyZXN0KSAmJgogICAgICAgICAgIWNvbmRpdGlvbmFsQ29tbWVudC50ZXN0KHJlc3QpCiAgICAgICAgKSB7CiAgICAgICAgICAvLyA8IGluIHBsYWluIHRleHQsIGJlIGZvcmdpdmluZyBhbmQgdHJlYXQgaXQgYXMgdGV4dAogICAgICAgICAgbmV4dCA9IHJlc3QuaW5kZXhPZignPCcsIDEpOwogICAgICAgICAgaWYgKG5leHQgPCAwKSB7IGJyZWFrIH0KICAgICAgICAgIHRleHRFbmQgKz0gbmV4dDsKICAgICAgICAgIHJlc3QgPSBodG1sLnNsaWNlKHRleHRFbmQpOwogICAgICAgIH0KICAgICAgICB0ZXh0ID0gaHRtbC5zdWJzdHJpbmcoMCwgdGV4dEVuZCk7CiAgICAgICAgYWR2YW5jZSh0ZXh0RW5kKTsKICAgICAgfQoKICAgICAgaWYgKHRleHRFbmQgPCAwKSB7CiAgICAgICAgdGV4dCA9IGh0bWw7CiAgICAgICAgaHRtbCA9ICcnOwogICAgICB9CgogICAgICBpZiAob3B0aW9ucy5jaGFycyAmJiB0ZXh0KSB7CiAgICAgICAgb3B0aW9ucy5jaGFycyh0ZXh0KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdmFyIGVuZFRhZ0xlbmd0aCA9IDA7CiAgICAgIHZhciBzdGFja2VkVGFnID0gbGFzdFRhZy50b0xvd2VyQ2FzZSgpOwogICAgICB2YXIgcmVTdGFja2VkVGFnID0gcmVDYWNoZVtzdGFja2VkVGFnXSB8fCAocmVDYWNoZVtzdGFja2VkVGFnXSA9IG5ldyBSZWdFeHAoJyhbXFxzXFxTXSo/KSg8LycgKyBzdGFja2VkVGFnICsgJ1tePl0qPiknLCAnaScpKTsKICAgICAgdmFyIHJlc3QkMSA9IGh0bWwucmVwbGFjZShyZVN0YWNrZWRUYWcsIGZ1bmN0aW9uIChhbGwsIHRleHQsIGVuZFRhZykgewogICAgICAgIGVuZFRhZ0xlbmd0aCA9IGVuZFRhZy5sZW5ndGg7CiAgICAgICAgaWYgKCFpc1BsYWluVGV4dEVsZW1lbnQoc3RhY2tlZFRhZykgJiYgc3RhY2tlZFRhZyAhPT0gJ25vc2NyaXB0JykgewogICAgICAgICAgdGV4dCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoLzwhXC0tKFtcc1xTXSo/KS0tPi9nLCAnJDEnKSAvLyAjNzI5OAogICAgICAgICAgICAucmVwbGFjZSgvPCFcW0NEQVRBXFsoW1xzXFNdKj8pXV0+L2csICckMScpOwogICAgICAgIH0KICAgICAgICBpZiAoc2hvdWxkSWdub3JlRmlyc3ROZXdsaW5lKHN0YWNrZWRUYWcsIHRleHQpKSB7CiAgICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgxKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnMpIHsKICAgICAgICAgIG9wdGlvbnMuY2hhcnModGV4dCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAnJwogICAgICB9KTsKICAgICAgaW5kZXggKz0gaHRtbC5sZW5ndGggLSByZXN0JDEubGVuZ3RoOwogICAgICBodG1sID0gcmVzdCQxOwogICAgICBwYXJzZUVuZFRhZyhzdGFja2VkVGFnLCBpbmRleCAtIGVuZFRhZ0xlbmd0aCwgaW5kZXgpOwogICAgfQoKICAgIGlmIChodG1sID09PSBsYXN0KSB7CiAgICAgIG9wdGlvbnMuY2hhcnMgJiYgb3B0aW9ucy5jaGFycyhodG1sKTsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiAhc3RhY2subGVuZ3RoICYmIG9wdGlvbnMud2FybikgewogICAgICAgIG9wdGlvbnMud2FybigoIk1hbC1mb3JtYXR0ZWQgdGFnIGF0IGVuZCBvZiB0ZW1wbGF0ZTogXCIiICsgaHRtbCArICJcIiIpKTsKICAgICAgfQogICAgICBicmVhawogICAgfQogIH0KCiAgLy8gQ2xlYW4gdXAgYW55IHJlbWFpbmluZyB0YWdzCiAgcGFyc2VFbmRUYWcoKTsKCiAgZnVuY3Rpb24gYWR2YW5jZSAobikgewogICAgaW5kZXggKz0gbjsKICAgIGh0bWwgPSBodG1sLnN1YnN0cmluZyhuKTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlU3RhcnRUYWcgKCkgewogICAgdmFyIHN0YXJ0ID0gaHRtbC5tYXRjaChzdGFydFRhZ09wZW4pOwogICAgaWYgKHN0YXJ0KSB7CiAgICAgIHZhciBtYXRjaCA9IHsKICAgICAgICB0YWdOYW1lOiBzdGFydFsxXSwKICAgICAgICBhdHRyczogW10sCiAgICAgICAgc3RhcnQ6IGluZGV4CiAgICAgIH07CiAgICAgIGFkdmFuY2Uoc3RhcnRbMF0ubGVuZ3RoKTsKICAgICAgdmFyIGVuZCwgYXR0cjsKICAgICAgd2hpbGUgKCEoZW5kID0gaHRtbC5tYXRjaChzdGFydFRhZ0Nsb3NlKSkgJiYgKGF0dHIgPSBodG1sLm1hdGNoKGF0dHJpYnV0ZSkpKSB7CiAgICAgICAgYWR2YW5jZShhdHRyWzBdLmxlbmd0aCk7CiAgICAgICAgbWF0Y2guYXR0cnMucHVzaChhdHRyKTsKICAgICAgfQogICAgICBpZiAoZW5kKSB7CiAgICAgICAgbWF0Y2gudW5hcnlTbGFzaCA9IGVuZFsxXTsKICAgICAgICBhZHZhbmNlKGVuZFswXS5sZW5ndGgpOwogICAgICAgIG1hdGNoLmVuZCA9IGluZGV4OwogICAgICAgIHJldHVybiBtYXRjaAogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBoYW5kbGVTdGFydFRhZyAobWF0Y2gpIHsKICAgIHZhciB0YWdOYW1lID0gbWF0Y2gudGFnTmFtZTsKICAgIHZhciB1bmFyeVNsYXNoID0gbWF0Y2gudW5hcnlTbGFzaDsKCiAgICBpZiAoZXhwZWN0SFRNTCkgewogICAgICBpZiAobGFzdFRhZyA9PT0gJ3AnICYmIGlzTm9uUGhyYXNpbmdUYWcodGFnTmFtZSkpIHsKICAgICAgICBwYXJzZUVuZFRhZyhsYXN0VGFnKTsKICAgICAgfQogICAgICBpZiAoY2FuQmVMZWZ0T3BlblRhZyQkMSh0YWdOYW1lKSAmJiBsYXN0VGFnID09PSB0YWdOYW1lKSB7CiAgICAgICAgcGFyc2VFbmRUYWcodGFnTmFtZSk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgdW5hcnkgPSBpc1VuYXJ5VGFnJCQxKHRhZ05hbWUpIHx8ICEhdW5hcnlTbGFzaDsKCiAgICB2YXIgbCA9IG1hdGNoLmF0dHJzLmxlbmd0aDsKICAgIHZhciBhdHRycyA9IG5ldyBBcnJheShsKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciBhcmdzID0gbWF0Y2guYXR0cnNbaV07CiAgICAgIC8vIGhhY2tpc2ggd29yayBhcm91bmQgRkYgYnVnIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTM2OTc3OAogICAgICBpZiAoSVNfUkVHRVhfQ0FQVFVSSU5HX0JST0tFTiAmJiBhcmdzWzBdLmluZGV4T2YoJyIiJykgPT09IC0xKSB7CiAgICAgICAgaWYgKGFyZ3NbM10gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzNdOyB9CiAgICAgICAgaWYgKGFyZ3NbNF0gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzRdOyB9CiAgICAgICAgaWYgKGFyZ3NbNV0gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzVdOyB9CiAgICAgIH0KICAgICAgdmFyIHZhbHVlID0gYXJnc1szXSB8fCBhcmdzWzRdIHx8IGFyZ3NbNV0gfHwgJyc7CiAgICAgIHZhciBzaG91bGREZWNvZGVOZXdsaW5lcyA9IHRhZ05hbWUgPT09ICdhJyAmJiBhcmdzWzFdID09PSAnaHJlZicKICAgICAgICA/IG9wdGlvbnMuc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmCiAgICAgICAgOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzOwogICAgICBhdHRyc1tpXSA9IHsKICAgICAgICBuYW1lOiBhcmdzWzFdLAogICAgICAgIHZhbHVlOiBkZWNvZGVBdHRyKHZhbHVlLCBzaG91bGREZWNvZGVOZXdsaW5lcykKICAgICAgfTsKICAgIH0KCiAgICBpZiAoIXVuYXJ5KSB7CiAgICAgIHN0YWNrLnB1c2goeyB0YWc6IHRhZ05hbWUsIGxvd2VyQ2FzZWRUYWc6IHRhZ05hbWUudG9Mb3dlckNhc2UoKSwgYXR0cnM6IGF0dHJzIH0pOwogICAgICBsYXN0VGFnID0gdGFnTmFtZTsKICAgIH0KCiAgICBpZiAob3B0aW9ucy5zdGFydCkgewogICAgICBvcHRpb25zLnN0YXJ0KHRhZ05hbWUsIGF0dHJzLCB1bmFyeSwgbWF0Y2guc3RhcnQsIG1hdGNoLmVuZCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYXJzZUVuZFRhZyAodGFnTmFtZSwgc3RhcnQsIGVuZCkgewogICAgdmFyIHBvcywgbG93ZXJDYXNlZFRhZ05hbWU7CiAgICBpZiAoc3RhcnQgPT0gbnVsbCkgeyBzdGFydCA9IGluZGV4OyB9CiAgICBpZiAoZW5kID09IG51bGwpIHsgZW5kID0gaW5kZXg7IH0KCiAgICBpZiAodGFnTmFtZSkgewogICAgICBsb3dlckNhc2VkVGFnTmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTsKICAgIH0KCiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IG9wZW5lZCB0YWcgb2YgdGhlIHNhbWUgdHlwZQogICAgaWYgKHRhZ05hbWUpIHsKICAgICAgZm9yIChwb3MgPSBzdGFjay5sZW5ndGggLSAxOyBwb3MgPj0gMDsgcG9zLS0pIHsKICAgICAgICBpZiAoc3RhY2tbcG9zXS5sb3dlckNhc2VkVGFnID09PSBsb3dlckNhc2VkVGFnTmFtZSkgewogICAgICAgICAgYnJlYWsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIElmIG5vIHRhZyBuYW1lIGlzIHByb3ZpZGVkLCBjbGVhbiBzaG9wCiAgICAgIHBvcyA9IDA7CiAgICB9CgogICAgaWYgKHBvcyA+PSAwKSB7CiAgICAgIC8vIENsb3NlIGFsbCB0aGUgb3BlbiBlbGVtZW50cywgdXAgdGhlIHN0YWNrCiAgICAgIGZvciAodmFyIGkgPSBzdGFjay5sZW5ndGggLSAxOyBpID49IHBvczsgaS0tKSB7CiAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICAgICAgKGkgPiBwb3MgfHwgIXRhZ05hbWUpICYmCiAgICAgICAgICBvcHRpb25zLndhcm4KICAgICAgICApIHsKICAgICAgICAgIG9wdGlvbnMud2FybigKICAgICAgICAgICAgKCJ0YWcgPCIgKyAoc3RhY2tbaV0udGFnKSArICI+IGhhcyBubyBtYXRjaGluZyBlbmQgdGFnLiIpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAob3B0aW9ucy5lbmQpIHsKICAgICAgICAgIG9wdGlvbnMuZW5kKHN0YWNrW2ldLnRhZywgc3RhcnQsIGVuZCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBSZW1vdmUgdGhlIG9wZW4gZWxlbWVudHMgZnJvbSB0aGUgc3RhY2sKICAgICAgc3RhY2subGVuZ3RoID0gcG9zOwogICAgICBsYXN0VGFnID0gcG9zICYmIHN0YWNrW3BvcyAtIDFdLnRhZzsKICAgIH0gZWxzZSBpZiAobG93ZXJDYXNlZFRhZ05hbWUgPT09ICdicicpIHsKICAgICAgaWYgKG9wdGlvbnMuc3RhcnQpIHsKICAgICAgICBvcHRpb25zLnN0YXJ0KHRhZ05hbWUsIFtdLCB0cnVlLCBzdGFydCwgZW5kKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChsb3dlckNhc2VkVGFnTmFtZSA9PT0gJ3AnKSB7CiAgICAgIGlmIChvcHRpb25zLnN0YXJ0KSB7CiAgICAgICAgb3B0aW9ucy5zdGFydCh0YWdOYW1lLCBbXSwgZmFsc2UsIHN0YXJ0LCBlbmQpOwogICAgICB9CiAgICAgIGlmIChvcHRpb25zLmVuZCkgewogICAgICAgIG9wdGlvbnMuZW5kKHRhZ05hbWUsIHN0YXJ0LCBlbmQpOwogICAgICB9CiAgICB9CiAgfQp9CgovKiAgKi8KCnZhciBvblJFID0gL15AfF52LW9uOi87CnZhciBkaXJSRSA9IC9edi18XkB8XjovOwp2YXIgZm9yQWxpYXNSRSA9IC8oW15dKj8pXHMrKD86aW58b2YpXHMrKFteXSopLzsKdmFyIGZvckl0ZXJhdG9yUkUgPSAvLChbXixcfVxdXSopKD86LChbXixcfVxdXSopKT8kLzsKdmFyIHN0cmlwUGFyZW5zUkUgPSAvXlwofFwpJC9nOwoKdmFyIGFyZ1JFID0gLzooLiopJC87CnZhciBiaW5kUkUgPSAvXjp8XnYtYmluZDovOwp2YXIgbW9kaWZpZXJSRSA9IC9cLlteLl0rL2c7Cgp2YXIgZGVjb2RlSFRNTENhY2hlZCA9IGNhY2hlZChoZS5kZWNvZGUpOwoKLy8gY29uZmlndXJhYmxlIHN0YXRlCnZhciB3YXJuJDI7CnZhciBkZWxpbWl0ZXJzOwp2YXIgdHJhbnNmb3JtczsKdmFyIHByZVRyYW5zZm9ybXM7CnZhciBwb3N0VHJhbnNmb3JtczsKdmFyIHBsYXRmb3JtSXNQcmVUYWc7CnZhciBwbGF0Zm9ybU11c3RVc2VQcm9wOwp2YXIgcGxhdGZvcm1HZXRUYWdOYW1lc3BhY2U7CgoKCmZ1bmN0aW9uIGNyZWF0ZUFTVEVsZW1lbnQgKAogIHRhZywKICBhdHRycywKICBwYXJlbnQKKSB7CiAgcmV0dXJuIHsKICAgIHR5cGU6IDEsCiAgICB0YWc6IHRhZywKICAgIGF0dHJzTGlzdDogYXR0cnMsCiAgICBhdHRyc01hcDogbWFrZUF0dHJzTWFwKGF0dHJzKSwKICAgIHBhcmVudDogcGFyZW50LAogICAgY2hpbGRyZW46IFtdCiAgfQp9CgovKioKICogQ29udmVydCBIVE1MIHN0cmluZyB0byBBU1QuCiAqLwpmdW5jdGlvbiBwYXJzZSAoCiAgdGVtcGxhdGUsCiAgb3B0aW9ucwopIHsKICB3YXJuJDIgPSBvcHRpb25zLndhcm4gfHwgYmFzZVdhcm47CgogIHBsYXRmb3JtSXNQcmVUYWcgPSBvcHRpb25zLmlzUHJlVGFnIHx8IG5vOwogIHBsYXRmb3JtTXVzdFVzZVByb3AgPSBvcHRpb25zLm11c3RVc2VQcm9wIHx8IG5vOwogIHBsYXRmb3JtR2V0VGFnTmFtZXNwYWNlID0gb3B0aW9ucy5nZXRUYWdOYW1lc3BhY2UgfHwgbm87CgogIHRyYW5zZm9ybXMgPSBwbHVja01vZHVsZUZ1bmN0aW9uKG9wdGlvbnMubW9kdWxlcywgJ3RyYW5zZm9ybU5vZGUnKTsKICBwcmVUcmFuc2Zvcm1zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICdwcmVUcmFuc2Zvcm1Ob2RlJyk7CiAgcG9zdFRyYW5zZm9ybXMgPSBwbHVja01vZHVsZUZ1bmN0aW9uKG9wdGlvbnMubW9kdWxlcywgJ3Bvc3RUcmFuc2Zvcm1Ob2RlJyk7CgogIGRlbGltaXRlcnMgPSBvcHRpb25zLmRlbGltaXRlcnM7CgogIHZhciBzdGFjayA9IFtdOwogIHZhciBwcmVzZXJ2ZVdoaXRlc3BhY2UgPSBvcHRpb25zLnByZXNlcnZlV2hpdGVzcGFjZSAhPT0gZmFsc2U7CiAgdmFyIHJvb3Q7CiAgdmFyIGN1cnJlbnRQYXJlbnQ7CiAgdmFyIGluVlByZSA9IGZhbHNlOwogIHZhciBpblByZSA9IGZhbHNlOwogIHZhciB3YXJuZWQgPSBmYWxzZTsKCiAgZnVuY3Rpb24gd2Fybk9uY2UgKG1zZykgewogICAgaWYgKCF3YXJuZWQpIHsKICAgICAgd2FybmVkID0gdHJ1ZTsKICAgICAgd2FybiQyKG1zZyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjbG9zZUVsZW1lbnQgKGVsZW1lbnQpIHsKICAgIC8vIGNoZWNrIHByZSBzdGF0ZQogICAgaWYgKGVsZW1lbnQucHJlKSB7CiAgICAgIGluVlByZSA9IGZhbHNlOwogICAgfQogICAgaWYgKHBsYXRmb3JtSXNQcmVUYWcoZWxlbWVudC50YWcpKSB7CiAgICAgIGluUHJlID0gZmFsc2U7CiAgICB9CiAgICAvLyBhcHBseSBwb3N0LXRyYW5zZm9ybXMKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zdFRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgICAgcG9zdFRyYW5zZm9ybXNbaV0oZWxlbWVudCwgb3B0aW9ucyk7CiAgICB9CiAgfQoKICBwYXJzZUhUTUwodGVtcGxhdGUsIHsKICAgIHdhcm46IHdhcm4kMiwKICAgIGV4cGVjdEhUTUw6IG9wdGlvbnMuZXhwZWN0SFRNTCwKICAgIGlzVW5hcnlUYWc6IG9wdGlvbnMuaXNVbmFyeVRhZywKICAgIGNhbkJlTGVmdE9wZW5UYWc6IG9wdGlvbnMuY2FuQmVMZWZ0T3BlblRhZywKICAgIHNob3VsZERlY29kZU5ld2xpbmVzOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzLAogICAgc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZiwKICAgIHNob3VsZEtlZXBDb21tZW50OiBvcHRpb25zLmNvbW1lbnRzLAogICAgc3RhcnQ6IGZ1bmN0aW9uIHN0YXJ0ICh0YWcsIGF0dHJzLCB1bmFyeSkgewogICAgICAvLyBjaGVjayBuYW1lc3BhY2UuCiAgICAgIC8vIGluaGVyaXQgcGFyZW50IG5zIGlmIHRoZXJlIGlzIG9uZQogICAgICB2YXIgbnMgPSAoY3VycmVudFBhcmVudCAmJiBjdXJyZW50UGFyZW50Lm5zKSB8fCBwbGF0Zm9ybUdldFRhZ05hbWVzcGFjZSh0YWcpOwoKICAgICAgLy8gaGFuZGxlIElFIHN2ZyBidWcKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmIChpc0lFICYmIG5zID09PSAnc3ZnJykgewogICAgICAgIGF0dHJzID0gZ3VhcmRJRVNWR0J1ZyhhdHRycyk7CiAgICAgIH0KCiAgICAgIHZhciBlbGVtZW50ID0gY3JlYXRlQVNURWxlbWVudCh0YWcsIGF0dHJzLCBjdXJyZW50UGFyZW50KTsKICAgICAgaWYgKG5zKSB7CiAgICAgICAgZWxlbWVudC5ucyA9IG5zOwogICAgICB9CgogICAgICBpZiAoaXNGb3JiaWRkZW5UYWcoZWxlbWVudCkgJiYgIWlzU2VydmVyUmVuZGVyaW5nKCkpIHsKICAgICAgICBlbGVtZW50LmZvcmJpZGRlbiA9IHRydWU7CiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4kMigKICAgICAgICAgICdUZW1wbGF0ZXMgc2hvdWxkIG9ubHkgYmUgcmVzcG9uc2libGUgZm9yIG1hcHBpbmcgdGhlIHN0YXRlIHRvIHRoZSAnICsKICAgICAgICAgICdVSS4gQXZvaWQgcGxhY2luZyB0YWdzIHdpdGggc2lkZS1lZmZlY3RzIGluIHlvdXIgdGVtcGxhdGVzLCBzdWNoIGFzICcgKwogICAgICAgICAgIjwiICsgdGFnICsgIj4iICsgJywgYXMgdGhleSB3aWxsIG5vdCBiZSBwYXJzZWQuJwogICAgICAgICk7CiAgICAgIH0KCiAgICAgIC8vIGFwcGx5IHByZS10cmFuc2Zvcm1zCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJlVHJhbnNmb3Jtcy5sZW5ndGg7IGkrKykgewogICAgICAgIGVsZW1lbnQgPSBwcmVUcmFuc2Zvcm1zW2ldKGVsZW1lbnQsIG9wdGlvbnMpIHx8IGVsZW1lbnQ7CiAgICAgIH0KCiAgICAgIGlmICghaW5WUHJlKSB7CiAgICAgICAgcHJvY2Vzc1ByZShlbGVtZW50KTsKICAgICAgICBpZiAoZWxlbWVudC5wcmUpIHsKICAgICAgICAgIGluVlByZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwbGF0Zm9ybUlzUHJlVGFnKGVsZW1lbnQudGFnKSkgewogICAgICAgIGluUHJlID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoaW5WUHJlKSB7CiAgICAgICAgcHJvY2Vzc1Jhd0F0dHJzKGVsZW1lbnQpOwogICAgICB9IGVsc2UgaWYgKCFlbGVtZW50LnByb2Nlc3NlZCkgewogICAgICAgIC8vIHN0cnVjdHVyYWwgZGlyZWN0aXZlcwogICAgICAgIHByb2Nlc3NGb3IoZWxlbWVudCk7CiAgICAgICAgcHJvY2Vzc0lmKGVsZW1lbnQpOwogICAgICAgIHByb2Nlc3NPbmNlKGVsZW1lbnQpOwogICAgICAgIC8vIGVsZW1lbnQtc2NvcGUgc3R1ZmYKICAgICAgICBwcm9jZXNzRWxlbWVudChlbGVtZW50LCBvcHRpb25zKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gY2hlY2tSb290Q29uc3RyYWludHMgKGVsKSB7CiAgICAgICAgewogICAgICAgICAgaWYgKGVsLnRhZyA9PT0gJ3Nsb3QnIHx8IGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAiQ2Fubm90IHVzZSA8IiArIChlbC50YWcpICsgIj4gYXMgY29tcG9uZW50IHJvb3QgZWxlbWVudCBiZWNhdXNlIGl0IG1heSAiICsKICAgICAgICAgICAgICAnY29udGFpbiBtdWx0aXBsZSBub2Rlcy4nCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZWwuYXR0cnNNYXAuaGFzT3duUHJvcGVydHkoJ3YtZm9yJykpIHsKICAgICAgICAgICAgd2Fybk9uY2UoCiAgICAgICAgICAgICAgJ0Nhbm5vdCB1c2Ugdi1mb3Igb24gc3RhdGVmdWwgY29tcG9uZW50IHJvb3QgZWxlbWVudCBiZWNhdXNlICcgKwogICAgICAgICAgICAgICdpdCByZW5kZXJzIG11bHRpcGxlIGVsZW1lbnRzLicKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIHRyZWUgbWFuYWdlbWVudAogICAgICBpZiAoIXJvb3QpIHsKICAgICAgICByb290ID0gZWxlbWVudDsKICAgICAgICBjaGVja1Jvb3RDb25zdHJhaW50cyhyb290KTsKICAgICAgfSBlbHNlIGlmICghc3RhY2subGVuZ3RoKSB7CiAgICAgICAgLy8gYWxsb3cgcm9vdCBlbGVtZW50cyB3aXRoIHYtaWYsIHYtZWxzZS1pZiBhbmQgdi1lbHNlCiAgICAgICAgaWYgKHJvb3QuaWYgJiYgKGVsZW1lbnQuZWxzZWlmIHx8IGVsZW1lbnQuZWxzZSkpIHsKICAgICAgICAgIGNoZWNrUm9vdENvbnN0cmFpbnRzKGVsZW1lbnQpOwogICAgICAgICAgYWRkSWZDb25kaXRpb24ocm9vdCwgewogICAgICAgICAgICBleHA6IGVsZW1lbnQuZWxzZWlmLAogICAgICAgICAgICBibG9jazogZWxlbWVudAogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdhcm5PbmNlKAogICAgICAgICAgICAiQ29tcG9uZW50IHRlbXBsYXRlIHNob3VsZCBjb250YWluIGV4YWN0bHkgb25lIHJvb3QgZWxlbWVudC4gIiArCiAgICAgICAgICAgICJJZiB5b3UgYXJlIHVzaW5nIHYtaWYgb24gbXVsdGlwbGUgZWxlbWVudHMsICIgKwogICAgICAgICAgICAidXNlIHYtZWxzZS1pZiB0byBjaGFpbiB0aGVtIGluc3RlYWQuIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGN1cnJlbnRQYXJlbnQgJiYgIWVsZW1lbnQuZm9yYmlkZGVuKSB7CiAgICAgICAgaWYgKGVsZW1lbnQuZWxzZWlmIHx8IGVsZW1lbnQuZWxzZSkgewogICAgICAgICAgcHJvY2Vzc0lmQ29uZGl0aW9ucyhlbGVtZW50LCBjdXJyZW50UGFyZW50KTsKICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuc2xvdFNjb3BlKSB7IC8vIHNjb3BlZCBzbG90CiAgICAgICAgICBjdXJyZW50UGFyZW50LnBsYWluID0gZmFsc2U7CiAgICAgICAgICB2YXIgbmFtZSA9IGVsZW1lbnQuc2xvdFRhcmdldCB8fCAnImRlZmF1bHQiJzsoY3VycmVudFBhcmVudC5zY29wZWRTbG90cyB8fCAoY3VycmVudFBhcmVudC5zY29wZWRTbG90cyA9IHt9KSlbbmFtZV0gPSBlbGVtZW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJyZW50UGFyZW50LmNoaWxkcmVuLnB1c2goZWxlbWVudCk7CiAgICAgICAgICBlbGVtZW50LnBhcmVudCA9IGN1cnJlbnRQYXJlbnQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdW5hcnkpIHsKICAgICAgICBjdXJyZW50UGFyZW50ID0gZWxlbWVudDsKICAgICAgICBzdGFjay5wdXNoKGVsZW1lbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIGNsb3NlRWxlbWVudChlbGVtZW50KTsKICAgICAgfQogICAgfSwKCiAgICBlbmQ6IGZ1bmN0aW9uIGVuZCAoKSB7CiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlCiAgICAgIHZhciBlbGVtZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CiAgICAgIHZhciBsYXN0Tm9kZSA9IGVsZW1lbnQuY2hpbGRyZW5bZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggLSAxXTsKICAgICAgaWYgKGxhc3ROb2RlICYmIGxhc3ROb2RlLnR5cGUgPT09IDMgJiYgbGFzdE5vZGUudGV4dCA9PT0gJyAnICYmICFpblByZSkgewogICAgICAgIGVsZW1lbnQuY2hpbGRyZW4ucG9wKCk7CiAgICAgIH0KICAgICAgLy8gcG9wIHN0YWNrCiAgICAgIHN0YWNrLmxlbmd0aCAtPSAxOwogICAgICBjdXJyZW50UGFyZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CiAgICAgIGNsb3NlRWxlbWVudChlbGVtZW50KTsKICAgIH0sCgogICAgY2hhcnM6IGZ1bmN0aW9uIGNoYXJzICh0ZXh0KSB7CiAgICAgIGlmICghY3VycmVudFBhcmVudCkgewogICAgICAgIHsKICAgICAgICAgIGlmICh0ZXh0ID09PSB0ZW1wbGF0ZSkgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAnQ29tcG9uZW50IHRlbXBsYXRlIHJlcXVpcmVzIGEgcm9vdCBlbGVtZW50LCByYXRoZXIgdGhhbiBqdXN0IHRleHQuJwogICAgICAgICAgICApOwogICAgICAgICAgfSBlbHNlIGlmICgodGV4dCA9IHRleHQudHJpbSgpKSkgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAoInRleHQgXCIiICsgdGV4dCArICJcIiBvdXRzaWRlIHJvb3QgZWxlbWVudCB3aWxsIGJlIGlnbm9yZWQuIikKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuCiAgICAgIH0KICAgICAgLy8gSUUgdGV4dGFyZWEgcGxhY2Vob2xkZXIgYnVnCiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAoaXNJRSAmJgogICAgICAgIGN1cnJlbnRQYXJlbnQudGFnID09PSAndGV4dGFyZWEnICYmCiAgICAgICAgY3VycmVudFBhcmVudC5hdHRyc01hcC5wbGFjZWhvbGRlciA9PT0gdGV4dAogICAgICApIHsKICAgICAgICByZXR1cm4KICAgICAgfQogICAgICB2YXIgY2hpbGRyZW4gPSBjdXJyZW50UGFyZW50LmNoaWxkcmVuOwogICAgICB0ZXh0ID0gaW5QcmUgfHwgdGV4dC50cmltKCkKICAgICAgICA/IGlzVGV4dFRhZyhjdXJyZW50UGFyZW50KSA/IHRleHQgOiBkZWNvZGVIVE1MQ2FjaGVkKHRleHQpCiAgICAgICAgLy8gb25seSBwcmVzZXJ2ZSB3aGl0ZXNwYWNlIGlmIGl0cyBub3QgcmlnaHQgYWZ0ZXIgYSBzdGFydGluZyB0YWcKICAgICAgICA6IHByZXNlcnZlV2hpdGVzcGFjZSAmJiBjaGlsZHJlbi5sZW5ndGggPyAnICcgOiAnJzsKICAgICAgaWYgKHRleHQpIHsKICAgICAgICB2YXIgcmVzOwogICAgICAgIGlmICghaW5WUHJlICYmIHRleHQgIT09ICcgJyAmJiAocmVzID0gcGFyc2VUZXh0KHRleHQsIGRlbGltaXRlcnMpKSkgewogICAgICAgICAgY2hpbGRyZW4ucHVzaCh7CiAgICAgICAgICAgIHR5cGU6IDIsCiAgICAgICAgICAgIGV4cHJlc3Npb246IHJlcy5leHByZXNzaW9uLAogICAgICAgICAgICB0b2tlbnM6IHJlcy50b2tlbnMsCiAgICAgICAgICAgIHRleHQ6IHRleHQKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAodGV4dCAhPT0gJyAnIHx8ICFjaGlsZHJlbi5sZW5ndGggfHwgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udGV4dCAhPT0gJyAnKSB7CiAgICAgICAgICBjaGlsZHJlbi5wdXNoKHsKICAgICAgICAgICAgdHlwZTogMywKICAgICAgICAgICAgdGV4dDogdGV4dAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgY29tbWVudDogZnVuY3Rpb24gY29tbWVudCAodGV4dCkgewogICAgICBjdXJyZW50UGFyZW50LmNoaWxkcmVuLnB1c2goewogICAgICAgIHR5cGU6IDMsCiAgICAgICAgdGV4dDogdGV4dCwKICAgICAgICBpc0NvbW1lbnQ6IHRydWUKICAgICAgfSk7CiAgICB9CiAgfSk7CiAgcmV0dXJuIHJvb3QKfQoKZnVuY3Rpb24gcHJvY2Vzc1ByZSAoZWwpIHsKICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtcHJlJykgIT0gbnVsbCkgewogICAgZWwucHJlID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NSYXdBdHRycyAoZWwpIHsKICB2YXIgbCA9IGVsLmF0dHJzTGlzdC5sZW5ndGg7CiAgaWYgKGwpIHsKICAgIHZhciBhdHRycyA9IGVsLmF0dHJzID0gbmV3IEFycmF5KGwpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHsKICAgICAgYXR0cnNbaV0gPSB7CiAgICAgICAgbmFtZTogZWwuYXR0cnNMaXN0W2ldLm5hbWUsCiAgICAgICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KGVsLmF0dHJzTGlzdFtpXS52YWx1ZSkKICAgICAgfTsKICAgIH0KICB9IGVsc2UgaWYgKCFlbC5wcmUpIHsKICAgIC8vIG5vbiByb290IG5vZGUgaW4gcHJlIGJsb2NrcyB3aXRoIG5vIGF0dHJpYnV0ZXMKICAgIGVsLnBsYWluID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NFbGVtZW50IChlbGVtZW50LCBvcHRpb25zKSB7CiAgcHJvY2Vzc0tleShlbGVtZW50KTsKCiAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhIHBsYWluIGVsZW1lbnQgYWZ0ZXIKICAvLyByZW1vdmluZyBzdHJ1Y3R1cmFsIGF0dHJpYnV0ZXMKICBlbGVtZW50LnBsYWluID0gIWVsZW1lbnQua2V5ICYmICFlbGVtZW50LmF0dHJzTGlzdC5sZW5ndGg7CgogIHByb2Nlc3NSZWYoZWxlbWVudCk7CiAgcHJvY2Vzc1Nsb3QoZWxlbWVudCk7CiAgcHJvY2Vzc0NvbXBvbmVudChlbGVtZW50KTsKICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgIGVsZW1lbnQgPSB0cmFuc2Zvcm1zW2ldKGVsZW1lbnQsIG9wdGlvbnMpIHx8IGVsZW1lbnQ7CiAgfQogIHByb2Nlc3NBdHRycyhlbGVtZW50KTsKfQoKZnVuY3Rpb24gcHJvY2Vzc0tleSAoZWwpIHsKICB2YXIgZXhwID0gZ2V0QmluZGluZ0F0dHIoZWwsICdrZXknKTsKICBpZiAoZXhwKSB7CiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICB3YXJuJDIoIjx0ZW1wbGF0ZT4gY2Fubm90IGJlIGtleWVkLiBQbGFjZSB0aGUga2V5IG9uIHJlYWwgZWxlbWVudHMgaW5zdGVhZC4iKTsKICAgIH0KICAgIGVsLmtleSA9IGV4cDsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NSZWYgKGVsKSB7CiAgdmFyIHJlZiA9IGdldEJpbmRpbmdBdHRyKGVsLCAncmVmJyk7CiAgaWYgKHJlZikgewogICAgZWwucmVmID0gcmVmOwogICAgZWwucmVmSW5Gb3IgPSBjaGVja0luRm9yKGVsKTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NGb3IgKGVsKSB7CiAgdmFyIGV4cDsKICBpZiAoKGV4cCA9IGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LWZvcicpKSkgewogICAgdmFyIHJlcyA9IHBhcnNlRm9yKGV4cCk7CiAgICBpZiAocmVzKSB7CiAgICAgIGV4dGVuZChlbCwgcmVzKTsKICAgIH0gZWxzZSB7CiAgICAgIHdhcm4kMigKICAgICAgICAoIkludmFsaWQgdi1mb3IgZXhwcmVzc2lvbjogIiArIGV4cCkKICAgICAgKTsKICAgIH0KICB9Cn0KCgoKZnVuY3Rpb24gcGFyc2VGb3IgKGV4cCkgewogIHZhciBpbk1hdGNoID0gZXhwLm1hdGNoKGZvckFsaWFzUkUpOwogIGlmICghaW5NYXRjaCkgeyByZXR1cm4gfQogIHZhciByZXMgPSB7fTsKICByZXMuZm9yID0gaW5NYXRjaFsyXS50cmltKCk7CiAgdmFyIGFsaWFzID0gaW5NYXRjaFsxXS50cmltKCkucmVwbGFjZShzdHJpcFBhcmVuc1JFLCAnJyk7CiAgdmFyIGl0ZXJhdG9yTWF0Y2ggPSBhbGlhcy5tYXRjaChmb3JJdGVyYXRvclJFKTsKICBpZiAoaXRlcmF0b3JNYXRjaCkgewogICAgcmVzLmFsaWFzID0gYWxpYXMucmVwbGFjZShmb3JJdGVyYXRvclJFLCAnJyk7CiAgICByZXMuaXRlcmF0b3IxID0gaXRlcmF0b3JNYXRjaFsxXS50cmltKCk7CiAgICBpZiAoaXRlcmF0b3JNYXRjaFsyXSkgewogICAgICByZXMuaXRlcmF0b3IyID0gaXRlcmF0b3JNYXRjaFsyXS50cmltKCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIHJlcy5hbGlhcyA9IGFsaWFzOwogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIHByb2Nlc3NJZiAoZWwpIHsKICB2YXIgZXhwID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtaWYnKTsKICBpZiAoZXhwKSB7CiAgICBlbC5pZiA9IGV4cDsKICAgIGFkZElmQ29uZGl0aW9uKGVsLCB7CiAgICAgIGV4cDogZXhwLAogICAgICBibG9jazogZWwKICAgIH0pOwogIH0gZWxzZSB7CiAgICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZScpICE9IG51bGwpIHsKICAgICAgZWwuZWxzZSA9IHRydWU7CiAgICB9CiAgICB2YXIgZWxzZWlmID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZS1pZicpOwogICAgaWYgKGVsc2VpZikgewogICAgICBlbC5lbHNlaWYgPSBlbHNlaWY7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBwcm9jZXNzSWZDb25kaXRpb25zIChlbCwgcGFyZW50KSB7CiAgdmFyIHByZXYgPSBmaW5kUHJldkVsZW1lbnQocGFyZW50LmNoaWxkcmVuKTsKICBpZiAocHJldiAmJiBwcmV2LmlmKSB7CiAgICBhZGRJZkNvbmRpdGlvbihwcmV2LCB7CiAgICAgIGV4cDogZWwuZWxzZWlmLAogICAgICBibG9jazogZWwKICAgIH0pOwogIH0gZWxzZSB7CiAgICB3YXJuJDIoCiAgICAgICJ2LSIgKyAoZWwuZWxzZWlmID8gKCdlbHNlLWlmPSInICsgZWwuZWxzZWlmICsgJyInKSA6ICdlbHNlJykgKyAiICIgKwogICAgICAidXNlZCBvbiBlbGVtZW50IDwiICsgKGVsLnRhZykgKyAiPiB3aXRob3V0IGNvcnJlc3BvbmRpbmcgdi1pZi4iCiAgICApOwogIH0KfQoKZnVuY3Rpb24gZmluZFByZXZFbGVtZW50IChjaGlsZHJlbikgewogIHZhciBpID0gY2hpbGRyZW4ubGVuZ3RoOwogIHdoaWxlIChpLS0pIHsKICAgIGlmIChjaGlsZHJlbltpXS50eXBlID09PSAxKSB7CiAgICAgIHJldHVybiBjaGlsZHJlbltpXQogICAgfSBlbHNlIHsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjaGlsZHJlbltpXS50ZXh0ICE9PSAnICcpIHsKICAgICAgICB3YXJuJDIoCiAgICAgICAgICAidGV4dCBcIiIgKyAoY2hpbGRyZW5baV0udGV4dC50cmltKCkpICsgIlwiIGJldHdlZW4gdi1pZiBhbmQgdi1lbHNlKC1pZikgIiArCiAgICAgICAgICAid2lsbCBiZSBpZ25vcmVkLiIKICAgICAgICApOwogICAgICB9CiAgICAgIGNoaWxkcmVuLnBvcCgpOwogICAgfQogIH0KfQoKZnVuY3Rpb24gYWRkSWZDb25kaXRpb24gKGVsLCBjb25kaXRpb24pIHsKICBpZiAoIWVsLmlmQ29uZGl0aW9ucykgewogICAgZWwuaWZDb25kaXRpb25zID0gW107CiAgfQogIGVsLmlmQ29uZGl0aW9ucy5wdXNoKGNvbmRpdGlvbik7Cn0KCmZ1bmN0aW9uIHByb2Nlc3NPbmNlIChlbCkgewogIHZhciBvbmNlJCQxID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3Ytb25jZScpOwogIGlmIChvbmNlJCQxICE9IG51bGwpIHsKICAgIGVsLm9uY2UgPSB0cnVlOwogIH0KfQoKZnVuY3Rpb24gcHJvY2Vzc1Nsb3QgKGVsKSB7CiAgaWYgKGVsLnRhZyA9PT0gJ3Nsb3QnKSB7CiAgICBlbC5zbG90TmFtZSA9IGdldEJpbmRpbmdBdHRyKGVsLCAnbmFtZScpOwogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBlbC5rZXkpIHsKICAgICAgd2FybiQyKAogICAgICAgICJga2V5YCBkb2VzIG5vdCB3b3JrIG9uIDxzbG90PiBiZWNhdXNlIHNsb3RzIGFyZSBhYnN0cmFjdCBvdXRsZXRzICIgKwogICAgICAgICJhbmQgY2FuIHBvc3NpYmx5IGV4cGFuZCBpbnRvIG11bHRpcGxlIGVsZW1lbnRzLiAiICsKICAgICAgICAiVXNlIHRoZSBrZXkgb24gYSB3cmFwcGluZyBlbGVtZW50IGluc3RlYWQuIgogICAgICApOwogICAgfQogIH0gZWxzZSB7CiAgICB2YXIgc2xvdFNjb3BlOwogICAgaWYgKGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICBzbG90U2NvcGUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc2NvcGUnKTsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgc2xvdFNjb3BlKSB7CiAgICAgICAgd2FybiQyKAogICAgICAgICAgInRoZSBcInNjb3BlXCIgYXR0cmlidXRlIGZvciBzY29wZWQgc2xvdHMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgYW5kICIgKwogICAgICAgICAgInJlcGxhY2VkIGJ5IFwic2xvdC1zY29wZVwiIHNpbmNlIDIuNS4gVGhlIG5ldyBcInNsb3Qtc2NvcGVcIiBhdHRyaWJ1dGUgIiArCiAgICAgICAgICAiY2FuIGFsc28gYmUgdXNlZCBvbiBwbGFpbiBlbGVtZW50cyBpbiBhZGRpdGlvbiB0byA8dGVtcGxhdGU+IHRvICIgKwogICAgICAgICAgImRlbm90ZSBzY29wZWQgc2xvdHMuIiwKICAgICAgICAgIHRydWUKICAgICAgICApOwogICAgICB9CiAgICAgIGVsLnNsb3RTY29wZSA9IHNsb3RTY29wZSB8fCBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc2xvdC1zY29wZScpOwogICAgfSBlbHNlIGlmICgoc2xvdFNjb3BlID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3Nsb3Qtc2NvcGUnKSkpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgZWwuYXR0cnNNYXBbJ3YtZm9yJ10pIHsKICAgICAgICB3YXJuJDIoCiAgICAgICAgICAiQW1iaWd1b3VzIGNvbWJpbmVkIHVzYWdlIG9mIHNsb3Qtc2NvcGUgYW5kIHYtZm9yIG9uIDwiICsgKGVsLnRhZykgKyAiPiAiICsKICAgICAgICAgICIodi1mb3IgdGFrZXMgaGlnaGVyIHByaW9yaXR5KS4gVXNlIGEgd3JhcHBlciA8dGVtcGxhdGU+IGZvciB0aGUgIiArCiAgICAgICAgICAic2NvcGVkIHNsb3QgdG8gbWFrZSBpdCBjbGVhcmVyLiIsCiAgICAgICAgICB0cnVlCiAgICAgICAgKTsKICAgICAgfQogICAgICBlbC5zbG90U2NvcGUgPSBzbG90U2NvcGU7CiAgICB9CiAgICB2YXIgc2xvdFRhcmdldCA9IGdldEJpbmRpbmdBdHRyKGVsLCAnc2xvdCcpOwogICAgaWYgKHNsb3RUYXJnZXQpIHsKICAgICAgZWwuc2xvdFRhcmdldCA9IHNsb3RUYXJnZXQgPT09ICciIicgPyAnImRlZmF1bHQiJyA6IHNsb3RUYXJnZXQ7CiAgICAgIC8vIHByZXNlcnZlIHNsb3QgYXMgYW4gYXR0cmlidXRlIGZvciBuYXRpdmUgc2hhZG93IERPTSBjb21wYXQKICAgICAgLy8gb25seSBmb3Igbm9uLXNjb3BlZCBzbG90cy4KICAgICAgaWYgKGVsLnRhZyAhPT0gJ3RlbXBsYXRlJyAmJiAhZWwuc2xvdFNjb3BlKSB7CiAgICAgICAgYWRkQXR0cihlbCwgJ3Nsb3QnLCBzbG90VGFyZ2V0KTsKICAgICAgfQogICAgfQogIH0KfQoKZnVuY3Rpb24gcHJvY2Vzc0NvbXBvbmVudCAoZWwpIHsKICB2YXIgYmluZGluZzsKICBpZiAoKGJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ2lzJykpKSB7CiAgICBlbC5jb21wb25lbnQgPSBiaW5kaW5nOwogIH0KICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ2lubGluZS10ZW1wbGF0ZScpICE9IG51bGwpIHsKICAgIGVsLmlubGluZVRlbXBsYXRlID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NBdHRycyAoZWwpIHsKICB2YXIgbGlzdCA9IGVsLmF0dHJzTGlzdDsKICB2YXIgaSwgbCwgbmFtZSwgcmF3TmFtZSwgdmFsdWUsIG1vZGlmaWVycywgaXNQcm9wOwogIGZvciAoaSA9IDAsIGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgbmFtZSA9IHJhd05hbWUgPSBsaXN0W2ldLm5hbWU7CiAgICB2YWx1ZSA9IGxpc3RbaV0udmFsdWU7CiAgICBpZiAoZGlyUkUudGVzdChuYW1lKSkgewogICAgICAvLyBtYXJrIGVsZW1lbnQgYXMgZHluYW1pYwogICAgICBlbC5oYXNCaW5kaW5ncyA9IHRydWU7CiAgICAgIC8vIG1vZGlmaWVycwogICAgICBtb2RpZmllcnMgPSBwYXJzZU1vZGlmaWVycyhuYW1lKTsKICAgICAgaWYgKG1vZGlmaWVycykgewogICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UobW9kaWZpZXJSRSwgJycpOwogICAgICB9CiAgICAgIGlmIChiaW5kUkUudGVzdChuYW1lKSkgeyAvLyB2LWJpbmQKICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKGJpbmRSRSwgJycpOwogICAgICAgIHZhbHVlID0gcGFyc2VGaWx0ZXJzKHZhbHVlKTsKICAgICAgICBpc1Byb3AgPSBmYWxzZTsKICAgICAgICBpZiAobW9kaWZpZXJzKSB7CiAgICAgICAgICBpZiAobW9kaWZpZXJzLnByb3ApIHsKICAgICAgICAgICAgaXNQcm9wID0gdHJ1ZTsKICAgICAgICAgICAgbmFtZSA9IGNhbWVsaXplKG5hbWUpOwogICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2lubmVySHRtbCcpIHsgbmFtZSA9ICdpbm5lckhUTUwnOyB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobW9kaWZpZXJzLmNhbWVsKSB7CiAgICAgICAgICAgIG5hbWUgPSBjYW1lbGl6ZShuYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtb2RpZmllcnMuc3luYykgewogICAgICAgICAgICBhZGRIYW5kbGVyKAogICAgICAgICAgICAgIGVsLAogICAgICAgICAgICAgICgidXBkYXRlOiIgKyAoY2FtZWxpemUobmFtZSkpKSwKICAgICAgICAgICAgICBnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgIiRldmVudCIpCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpc1Byb3AgfHwgKAogICAgICAgICAgIWVsLmNvbXBvbmVudCAmJiBwbGF0Zm9ybU11c3RVc2VQcm9wKGVsLnRhZywgZWwuYXR0cnNNYXAudHlwZSwgbmFtZSkKICAgICAgICApKSB7CiAgICAgICAgICBhZGRQcm9wKGVsLCBuYW1lLCB2YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFkZEF0dHIoZWwsIG5hbWUsIHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAob25SRS50ZXN0KG5hbWUpKSB7IC8vIHYtb24KICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKG9uUkUsICcnKTsKICAgICAgICBhZGRIYW5kbGVyKGVsLCBuYW1lLCB2YWx1ZSwgbW9kaWZpZXJzLCBmYWxzZSwgd2FybiQyKTsKICAgICAgfSBlbHNlIHsgLy8gbm9ybWFsIGRpcmVjdGl2ZXMKICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKGRpclJFLCAnJyk7CiAgICAgICAgLy8gcGFyc2UgYXJnCiAgICAgICAgdmFyIGFyZ01hdGNoID0gbmFtZS5tYXRjaChhcmdSRSk7CiAgICAgICAgdmFyIGFyZyA9IGFyZ01hdGNoICYmIGFyZ01hdGNoWzFdOwogICAgICAgIGlmIChhcmcpIHsKICAgICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIC0oYXJnLmxlbmd0aCArIDEpKTsKICAgICAgICB9CiAgICAgICAgYWRkRGlyZWN0aXZlKGVsLCBuYW1lLCByYXdOYW1lLCB2YWx1ZSwgYXJnLCBtb2RpZmllcnMpOwogICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgbmFtZSA9PT0gJ21vZGVsJykgewogICAgICAgICAgY2hlY2tGb3JBbGlhc01vZGVsKGVsLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBsaXRlcmFsIGF0dHJpYnV0ZQogICAgICB7CiAgICAgICAgdmFyIHJlcyA9IHBhcnNlVGV4dCh2YWx1ZSwgZGVsaW1pdGVycyk7CiAgICAgICAgaWYgKHJlcykgewogICAgICAgICAgd2FybiQyKAogICAgICAgICAgICBuYW1lICsgIj1cIiIgKyB2YWx1ZSArICJcIjogIiArCiAgICAgICAgICAgICdJbnRlcnBvbGF0aW9uIGluc2lkZSBhdHRyaWJ1dGVzIGhhcyBiZWVuIHJlbW92ZWQuICcgKwogICAgICAgICAgICAnVXNlIHYtYmluZCBvciB0aGUgY29sb24gc2hvcnRoYW5kIGluc3RlYWQuIEZvciBleGFtcGxlLCAnICsKICAgICAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBpZD0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDppZD0idmFsIj4uJwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYWRkQXR0cihlbCwgbmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTsKICAgICAgLy8gIzY4ODcgZmlyZWZveCBkb2Vzbid0IHVwZGF0ZSBtdXRlZCBzdGF0ZSBpZiBzZXQgdmlhIGF0dHJpYnV0ZQogICAgICAvLyBldmVuIGltbWVkaWF0ZWx5IGFmdGVyIGVsZW1lbnQgY3JlYXRpb24KICAgICAgaWYgKCFlbC5jb21wb25lbnQgJiYKICAgICAgICAgIG5hbWUgPT09ICdtdXRlZCcgJiYKICAgICAgICAgIHBsYXRmb3JtTXVzdFVzZVByb3AoZWwudGFnLCBlbC5hdHRyc01hcC50eXBlLCBuYW1lKSkgewogICAgICAgIGFkZFByb3AoZWwsIG5hbWUsICd0cnVlJyk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGNoZWNrSW5Gb3IgKGVsKSB7CiAgdmFyIHBhcmVudCA9IGVsOwogIHdoaWxlIChwYXJlbnQpIHsKICAgIGlmIChwYXJlbnQuZm9yICE9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgfQogIHJldHVybiBmYWxzZQp9CgpmdW5jdGlvbiBwYXJzZU1vZGlmaWVycyAobmFtZSkgewogIHZhciBtYXRjaCA9IG5hbWUubWF0Y2gobW9kaWZpZXJSRSk7CiAgaWYgKG1hdGNoKSB7CiAgICB2YXIgcmV0ID0ge307CiAgICBtYXRjaC5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7IHJldFttLnNsaWNlKDEpXSA9IHRydWU7IH0pOwogICAgcmV0dXJuIHJldAogIH0KfQoKZnVuY3Rpb24gbWFrZUF0dHJzTWFwIChhdHRycykgewogIHZhciBtYXAgPSB7fTsKICBmb3IgKHZhciBpID0gMCwgbCA9IGF0dHJzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgaWYgKAogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgbWFwW2F0dHJzW2ldLm5hbWVdICYmICFpc0lFICYmICFpc0VkZ2UKICAgICkgewogICAgICB3YXJuJDIoJ2R1cGxpY2F0ZSBhdHRyaWJ1dGU6ICcgKyBhdHRyc1tpXS5uYW1lKTsKICAgIH0KICAgIG1hcFthdHRyc1tpXS5uYW1lXSA9IGF0dHJzW2ldLnZhbHVlOwogIH0KICByZXR1cm4gbWFwCn0KCi8vIGZvciBzY3JpcHQgKGUuZy4gdHlwZT0ieC90ZW1wbGF0ZSIpIG9yIHN0eWxlLCBkbyBub3QgZGVjb2RlIGNvbnRlbnQKZnVuY3Rpb24gaXNUZXh0VGFnIChlbCkgewogIHJldHVybiBlbC50YWcgPT09ICdzY3JpcHQnIHx8IGVsLnRhZyA9PT0gJ3N0eWxlJwp9CgpmdW5jdGlvbiBpc0ZvcmJpZGRlblRhZyAoZWwpIHsKICByZXR1cm4gKAogICAgZWwudGFnID09PSAnc3R5bGUnIHx8CiAgICAoZWwudGFnID09PSAnc2NyaXB0JyAmJiAoCiAgICAgICFlbC5hdHRyc01hcC50eXBlIHx8CiAgICAgIGVsLmF0dHJzTWFwLnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnCiAgICApKQogICkKfQoKdmFyIGllTlNCdWcgPSAvXnhtbG5zOk5TXGQrLzsKdmFyIGllTlNQcmVmaXggPSAvXk5TXGQrOi87CgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwpmdW5jdGlvbiBndWFyZElFU1ZHQnVnIChhdHRycykgewogIHZhciByZXMgPSBbXTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgYXR0ciA9IGF0dHJzW2ldOwogICAgaWYgKCFpZU5TQnVnLnRlc3QoYXR0ci5uYW1lKSkgewogICAgICBhdHRyLm5hbWUgPSBhdHRyLm5hbWUucmVwbGFjZShpZU5TUHJlZml4LCAnJyk7CiAgICAgIHJlcy5wdXNoKGF0dHIpOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIGNoZWNrRm9yQWxpYXNNb2RlbCAoZWwsIHZhbHVlKSB7CiAgdmFyIF9lbCA9IGVsOwogIHdoaWxlIChfZWwpIHsKICAgIGlmIChfZWwuZm9yICYmIF9lbC5hbGlhcyA9PT0gdmFsdWUpIHsKICAgICAgd2FybiQyKAogICAgICAgICI8IiArIChlbC50YWcpICsgIiB2LW1vZGVsPVwiIiArIHZhbHVlICsgIlwiPjogIiArCiAgICAgICAgIllvdSBhcmUgYmluZGluZyB2LW1vZGVsIGRpcmVjdGx5IHRvIGEgdi1mb3IgaXRlcmF0aW9uIGFsaWFzLiAiICsKICAgICAgICAiVGhpcyB3aWxsIG5vdCBiZSBhYmxlIHRvIG1vZGlmeSB0aGUgdi1mb3Igc291cmNlIGFycmF5IGJlY2F1c2UgIiArCiAgICAgICAgIndyaXRpbmcgdG8gdGhlIGFsaWFzIGlzIGxpa2UgbW9kaWZ5aW5nIGEgZnVuY3Rpb24gbG9jYWwgdmFyaWFibGUuICIgKwogICAgICAgICJDb25zaWRlciB1c2luZyBhbiBhcnJheSBvZiBvYmplY3RzIGFuZCB1c2Ugdi1tb2RlbCBvbiBhbiBvYmplY3QgcHJvcGVydHkgaW5zdGVhZC4iCiAgICAgICk7CiAgICB9CiAgICBfZWwgPSBfZWwucGFyZW50OwogIH0KfQoKLyogICovCgovKioKICogRXhwYW5kIGlucHV0W3YtbW9kZWxdIHdpdGggZHlhbm1pYyB0eXBlIGJpbmRpbmdzIGludG8gdi1pZi1lbHNlIGNoYWlucwogKiBUdXJuIHRoaXM6CiAqICAgPGlucHV0IHYtbW9kZWw9ImRhdGFbdHlwZV0iIDp0eXBlPSJ0eXBlIj4KICogaW50byB0aGlzOgogKiAgIDxpbnB1dCB2LWlmPSJ0eXBlID09PSAnY2hlY2tib3gnIiB0eXBlPSJjaGVja2JveCIgdi1tb2RlbD0iZGF0YVt0eXBlXSI+CiAqICAgPGlucHV0IHYtZWxzZS1pZj0idHlwZSA9PT0gJ3JhZGlvJyIgdHlwZT0icmFkaW8iIHYtbW9kZWw9ImRhdGFbdHlwZV0iPgogKiAgIDxpbnB1dCB2LWVsc2UgOnR5cGU9InR5cGUiIHYtbW9kZWw9ImRhdGFbdHlwZV0iPgogKi8KCmZ1bmN0aW9uIHByZVRyYW5zZm9ybU5vZGUgKGVsLCBvcHRpb25zKSB7CiAgaWYgKGVsLnRhZyA9PT0gJ2lucHV0JykgewogICAgdmFyIG1hcCA9IGVsLmF0dHJzTWFwOwogICAgaWYgKCFtYXBbJ3YtbW9kZWwnXSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgdHlwZUJpbmRpbmc7CiAgICBpZiAobWFwWyc6dHlwZSddIHx8IG1hcFsndi1iaW5kOnR5cGUnXSkgewogICAgICB0eXBlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAndHlwZScpOwogICAgfQogICAgaWYgKCFtYXAudHlwZSAmJiAhdHlwZUJpbmRpbmcgJiYgbWFwWyd2LWJpbmQnXSkgewogICAgICB0eXBlQmluZGluZyA9ICIoIiArIChtYXBbJ3YtYmluZCddKSArICIpLnR5cGUiOwogICAgfQoKICAgIGlmICh0eXBlQmluZGluZykgewogICAgICB2YXIgaWZDb25kaXRpb24gPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAndi1pZicsIHRydWUpOwogICAgICB2YXIgaWZDb25kaXRpb25FeHRyYSA9IGlmQ29uZGl0aW9uID8gKCImJigiICsgaWZDb25kaXRpb24gKyAiKSIpIDogIiI7CiAgICAgIHZhciBoYXNFbHNlID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZScsIHRydWUpICE9IG51bGw7CiAgICAgIHZhciBlbHNlSWZDb25kaXRpb24gPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAndi1lbHNlLWlmJywgdHJ1ZSk7CiAgICAgIC8vIDEuIGNoZWNrYm94CiAgICAgIHZhciBicmFuY2gwID0gY2xvbmVBU1RFbGVtZW50KGVsKTsKICAgICAgLy8gcHJvY2VzcyBmb3Igb24gdGhlIG1haW4gbm9kZQogICAgICBwcm9jZXNzRm9yKGJyYW5jaDApOwogICAgICBhZGRSYXdBdHRyKGJyYW5jaDAsICd0eXBlJywgJ2NoZWNrYm94Jyk7CiAgICAgIHByb2Nlc3NFbGVtZW50KGJyYW5jaDAsIG9wdGlvbnMpOwogICAgICBicmFuY2gwLnByb2Nlc3NlZCA9IHRydWU7IC8vIHByZXZlbnQgaXQgZnJvbSBkb3VibGUtcHJvY2Vzc2VkCiAgICAgIGJyYW5jaDAuaWYgPSAiKCIgKyB0eXBlQmluZGluZyArICIpPT09J2NoZWNrYm94JyIgKyBpZkNvbmRpdGlvbkV4dHJhOwogICAgICBhZGRJZkNvbmRpdGlvbihicmFuY2gwLCB7CiAgICAgICAgZXhwOiBicmFuY2gwLmlmLAogICAgICAgIGJsb2NrOiBicmFuY2gwCiAgICAgIH0pOwogICAgICAvLyAyLiBhZGQgcmFkaW8gZWxzZS1pZiBjb25kaXRpb24KICAgICAgdmFyIGJyYW5jaDEgPSBjbG9uZUFTVEVsZW1lbnQoZWwpOwogICAgICBnZXRBbmRSZW1vdmVBdHRyKGJyYW5jaDEsICd2LWZvcicsIHRydWUpOwogICAgICBhZGRSYXdBdHRyKGJyYW5jaDEsICd0eXBlJywgJ3JhZGlvJyk7CiAgICAgIHByb2Nlc3NFbGVtZW50KGJyYW5jaDEsIG9wdGlvbnMpOwogICAgICBhZGRJZkNvbmRpdGlvbihicmFuY2gwLCB7CiAgICAgICAgZXhwOiAiKCIgKyB0eXBlQmluZGluZyArICIpPT09J3JhZGlvJyIgKyBpZkNvbmRpdGlvbkV4dHJhLAogICAgICAgIGJsb2NrOiBicmFuY2gxCiAgICAgIH0pOwogICAgICAvLyAzLiBvdGhlcgogICAgICB2YXIgYnJhbmNoMiA9IGNsb25lQVNURWxlbWVudChlbCk7CiAgICAgIGdldEFuZFJlbW92ZUF0dHIoYnJhbmNoMiwgJ3YtZm9yJywgdHJ1ZSk7CiAgICAgIGFkZFJhd0F0dHIoYnJhbmNoMiwgJzp0eXBlJywgdHlwZUJpbmRpbmcpOwogICAgICBwcm9jZXNzRWxlbWVudChicmFuY2gyLCBvcHRpb25zKTsKICAgICAgYWRkSWZDb25kaXRpb24oYnJhbmNoMCwgewogICAgICAgIGV4cDogaWZDb25kaXRpb24sCiAgICAgICAgYmxvY2s6IGJyYW5jaDIKICAgICAgfSk7CgogICAgICBpZiAoaGFzRWxzZSkgewogICAgICAgIGJyYW5jaDAuZWxzZSA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAoZWxzZUlmQ29uZGl0aW9uKSB7CiAgICAgICAgYnJhbmNoMC5lbHNlaWYgPSBlbHNlSWZDb25kaXRpb247CiAgICAgIH0KCiAgICAgIHJldHVybiBicmFuY2gwCiAgICB9CiAgfQp9CgpmdW5jdGlvbiBjbG9uZUFTVEVsZW1lbnQgKGVsKSB7CiAgcmV0dXJuIGNyZWF0ZUFTVEVsZW1lbnQoZWwudGFnLCBlbC5hdHRyc0xpc3Quc2xpY2UoKSwgZWwucGFyZW50KQp9Cgp2YXIgbW9kZWwkMiA9IHsKICBwcmVUcmFuc2Zvcm1Ob2RlOiBwcmVUcmFuc2Zvcm1Ob2RlCn0KCnZhciBtb2R1bGVzJDEgPSBbCiAga2xhc3MkMSwKICBzdHlsZSQxLAogIG1vZGVsJDIKXQoKLyogICovCgpmdW5jdGlvbiB0ZXh0IChlbCwgZGlyKSB7CiAgaWYgKGRpci52YWx1ZSkgewogICAgYWRkUHJvcChlbCwgJ3RleHRDb250ZW50JywgKCJfcygiICsgKGRpci52YWx1ZSkgKyAiKSIpKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaHRtbCAoZWwsIGRpcikgewogIGlmIChkaXIudmFsdWUpIHsKICAgIGFkZFByb3AoZWwsICdpbm5lckhUTUwnLCAoIl9zKCIgKyAoZGlyLnZhbHVlKSArICIpIikpOwogIH0KfQoKdmFyIGRpcmVjdGl2ZXMkMSA9IHsKICBtb2RlbDogbW9kZWwsCiAgdGV4dDogdGV4dCwKICBodG1sOiBodG1sCn0KCi8qICAqLwoKdmFyIGJhc2VPcHRpb25zID0gewogIGV4cGVjdEhUTUw6IHRydWUsCiAgbW9kdWxlczogbW9kdWxlcyQxLAogIGRpcmVjdGl2ZXM6IGRpcmVjdGl2ZXMkMSwKICBpc1ByZVRhZzogaXNQcmVUYWcsCiAgaXNVbmFyeVRhZzogaXNVbmFyeVRhZywKICBtdXN0VXNlUHJvcDogbXVzdFVzZVByb3AsCiAgY2FuQmVMZWZ0T3BlblRhZzogY2FuQmVMZWZ0T3BlblRhZywKICBpc1Jlc2VydmVkVGFnOiBpc1Jlc2VydmVkVGFnLAogIGdldFRhZ05hbWVzcGFjZTogZ2V0VGFnTmFtZXNwYWNlLAogIHN0YXRpY0tleXM6IGdlblN0YXRpY0tleXMobW9kdWxlcyQxKQp9OwoKLyogICovCgp2YXIgaXNTdGF0aWNLZXk7CnZhciBpc1BsYXRmb3JtUmVzZXJ2ZWRUYWc7Cgp2YXIgZ2VuU3RhdGljS2V5c0NhY2hlZCA9IGNhY2hlZChnZW5TdGF0aWNLZXlzJDEpOwoKLyoqCiAqIEdvYWwgb2YgdGhlIG9wdGltaXplcjogd2FsayB0aGUgZ2VuZXJhdGVkIHRlbXBsYXRlIEFTVCB0cmVlCiAqIGFuZCBkZXRlY3Qgc3ViLXRyZWVzIHRoYXQgYXJlIHB1cmVseSBzdGF0aWMsIGkuZS4gcGFydHMgb2YKICogdGhlIERPTSB0aGF0IG5ldmVyIG5lZWRzIHRvIGNoYW5nZS4KICoKICogT25jZSB3ZSBkZXRlY3QgdGhlc2Ugc3ViLXRyZWVzLCB3ZSBjYW46CiAqCiAqIDEuIEhvaXN0IHRoZW0gaW50byBjb25zdGFudHMsIHNvIHRoYXQgd2Ugbm8gbG9uZ2VyIG5lZWQgdG8KICogICAgY3JlYXRlIGZyZXNoIG5vZGVzIGZvciB0aGVtIG9uIGVhY2ggcmUtcmVuZGVyOwogKiAyLiBDb21wbGV0ZWx5IHNraXAgdGhlbSBpbiB0aGUgcGF0Y2hpbmcgcHJvY2Vzcy4KICovCmZ1bmN0aW9uIG9wdGltaXplIChyb290LCBvcHRpb25zKSB7CiAgaWYgKCFyb290KSB7IHJldHVybiB9CiAgaXNTdGF0aWNLZXkgPSBnZW5TdGF0aWNLZXlzQ2FjaGVkKG9wdGlvbnMuc3RhdGljS2V5cyB8fCAnJyk7CiAgaXNQbGF0Zm9ybVJlc2VydmVkVGFnID0gb3B0aW9ucy5pc1Jlc2VydmVkVGFnIHx8IG5vOwogIC8vIGZpcnN0IHBhc3M6IG1hcmsgYWxsIG5vbi1zdGF0aWMgbm9kZXMuCiAgbWFya1N0YXRpYyQxKHJvb3QpOwogIC8vIHNlY29uZCBwYXNzOiBtYXJrIHN0YXRpYyByb290cy4KICBtYXJrU3RhdGljUm9vdHMocm9vdCwgZmFsc2UpOwp9CgpmdW5jdGlvbiBnZW5TdGF0aWNLZXlzJDEgKGtleXMpIHsKICByZXR1cm4gbWFrZU1hcCgKICAgICd0eXBlLHRhZyxhdHRyc0xpc3QsYXR0cnNNYXAscGxhaW4scGFyZW50LGNoaWxkcmVuLGF0dHJzJyArCiAgICAoa2V5cyA/ICcsJyArIGtleXMgOiAnJykKICApCn0KCmZ1bmN0aW9uIG1hcmtTdGF0aWMkMSAobm9kZSkgewogIG5vZGUuc3RhdGljID0gaXNTdGF0aWMobm9kZSk7CiAgaWYgKG5vZGUudHlwZSA9PT0gMSkgewogICAgLy8gZG8gbm90IG1ha2UgY29tcG9uZW50IHNsb3QgY29udGVudCBzdGF0aWMuIHRoaXMgYXZvaWRzCiAgICAvLyAxLiBjb21wb25lbnRzIG5vdCBhYmxlIHRvIG11dGF0ZSBzbG90IG5vZGVzCiAgICAvLyAyLiBzdGF0aWMgc2xvdCBjb250ZW50IGZhaWxzIGZvciBob3QtcmVsb2FkaW5nCiAgICBpZiAoCiAgICAgICFpc1BsYXRmb3JtUmVzZXJ2ZWRUYWcobm9kZS50YWcpICYmCiAgICAgIG5vZGUudGFnICE9PSAnc2xvdCcgJiYKICAgICAgbm9kZS5hdHRyc01hcFsnaW5saW5lLXRlbXBsYXRlJ10gPT0gbnVsbAogICAgKSB7CiAgICAgIHJldHVybgogICAgfQogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldOwogICAgICBtYXJrU3RhdGljJDEoY2hpbGQpOwogICAgICBpZiAoIWNoaWxkLnN0YXRpYykgewogICAgICAgIG5vZGUuc3RhdGljID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmIChub2RlLmlmQ29uZGl0aW9ucykgewogICAgICBmb3IgKHZhciBpJDEgPSAxLCBsJDEgPSBub2RlLmlmQ29uZGl0aW9ucy5sZW5ndGg7IGkkMSA8IGwkMTsgaSQxKyspIHsKICAgICAgICB2YXIgYmxvY2sgPSBub2RlLmlmQ29uZGl0aW9uc1tpJDFdLmJsb2NrOwogICAgICAgIG1hcmtTdGF0aWMkMShibG9jayk7CiAgICAgICAgaWYgKCFibG9jay5zdGF0aWMpIHsKICAgICAgICAgIG5vZGUuc3RhdGljID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBtYXJrU3RhdGljUm9vdHMgKG5vZGUsIGlzSW5Gb3IpIHsKICBpZiAobm9kZS50eXBlID09PSAxKSB7CiAgICBpZiAobm9kZS5zdGF0aWMgfHwgbm9kZS5vbmNlKSB7CiAgICAgIG5vZGUuc3RhdGljSW5Gb3IgPSBpc0luRm9yOwogICAgfQogICAgLy8gRm9yIGEgbm9kZSB0byBxdWFsaWZ5IGFzIGEgc3RhdGljIHJvb3QsIGl0IHNob3VsZCBoYXZlIGNoaWxkcmVuIHRoYXQKICAgIC8vIGFyZSBub3QganVzdCBzdGF0aWMgdGV4dC4gT3RoZXJ3aXNlIHRoZSBjb3N0IG9mIGhvaXN0aW5nIG91dCB3aWxsCiAgICAvLyBvdXR3ZWlnaCB0aGUgYmVuZWZpdHMgYW5kIGl0J3MgYmV0dGVyIG9mZiB0byBqdXN0IGFsd2F5cyByZW5kZXIgaXQgZnJlc2guCiAgICBpZiAobm9kZS5zdGF0aWMgJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggJiYgISgKICAgICAgbm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYKICAgICAgbm9kZS5jaGlsZHJlblswXS50eXBlID09PSAzCiAgICApKSB7CiAgICAgIG5vZGUuc3RhdGljUm9vdCA9IHRydWU7CiAgICAgIHJldHVybgogICAgfSBlbHNlIHsKICAgICAgbm9kZS5zdGF0aWNSb290ID0gZmFsc2U7CiAgICB9CiAgICBpZiAobm9kZS5jaGlsZHJlbikgewogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgbWFya1N0YXRpY1Jvb3RzKG5vZGUuY2hpbGRyZW5baV0sIGlzSW5Gb3IgfHwgISFub2RlLmZvcik7CiAgICAgIH0KICAgIH0KICAgIGlmIChub2RlLmlmQ29uZGl0aW9ucykgewogICAgICBmb3IgKHZhciBpJDEgPSAxLCBsJDEgPSBub2RlLmlmQ29uZGl0aW9ucy5sZW5ndGg7IGkkMSA8IGwkMTsgaSQxKyspIHsKICAgICAgICBtYXJrU3RhdGljUm9vdHMobm9kZS5pZkNvbmRpdGlvbnNbaSQxXS5ibG9jaywgaXNJbkZvcik7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGlzU3RhdGljIChub2RlKSB7CiAgaWYgKG5vZGUudHlwZSA9PT0gMikgeyAvLyBleHByZXNzaW9uCiAgICByZXR1cm4gZmFsc2UKICB9CiAgaWYgKG5vZGUudHlwZSA9PT0gMykgeyAvLyB0ZXh0CiAgICByZXR1cm4gdHJ1ZQogIH0KICByZXR1cm4gISEobm9kZS5wcmUgfHwgKAogICAgIW5vZGUuaGFzQmluZGluZ3MgJiYgLy8gbm8gZHluYW1pYyBiaW5kaW5ncwogICAgIW5vZGUuaWYgJiYgIW5vZGUuZm9yICYmIC8vIG5vdCB2LWlmIG9yIHYtZm9yIG9yIHYtZWxzZQogICAgIWlzQnVpbHRJblRhZyhub2RlLnRhZykgJiYgLy8gbm90IGEgYnVpbHQtaW4KICAgIGlzUGxhdGZvcm1SZXNlcnZlZFRhZyhub2RlLnRhZykgJiYgLy8gbm90IGEgY29tcG9uZW50CiAgICAhaXNEaXJlY3RDaGlsZE9mVGVtcGxhdGVGb3Iobm9kZSkgJiYKICAgIE9iamVjdC5rZXlzKG5vZGUpLmV2ZXJ5KGlzU3RhdGljS2V5KQogICkpCn0KCmZ1bmN0aW9uIGlzRGlyZWN0Q2hpbGRPZlRlbXBsYXRlRm9yIChub2RlKSB7CiAgd2hpbGUgKG5vZGUucGFyZW50KSB7CiAgICBub2RlID0gbm9kZS5wYXJlbnQ7CiAgICBpZiAobm9kZS50YWcgIT09ICd0ZW1wbGF0ZScpIHsKICAgICAgcmV0dXJuIGZhbHNlCiAgICB9CiAgICBpZiAobm9kZS5mb3IpIHsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICB9CiAgcmV0dXJuIGZhbHNlCn0KCi8qICAqLwoKdmFyIGZuRXhwUkUgPSAvXihbXHckX10rfFwoW14pXSo/XCkpXHMqPT58XmZ1bmN0aW9uXHMqXCgvOwp2YXIgc2ltcGxlUGF0aFJFID0gL15bQS1aYS16XyRdW1x3JF0qKD86XC5bQS1aYS16XyRdW1x3JF0qfFxbJ1teJ10qPyddfFxbIlteIl0qPyJdfFxbXGQrXXxcW1tBLVphLXpfJF1bXHckXSpdKSokLzsKCi8vIEtleWJvYXJkRXZlbnQua2V5Q29kZSBhbGlhc2VzCnZhciBrZXlDb2RlcyA9IHsKICBlc2M6IDI3LAogIHRhYjogOSwKICBlbnRlcjogMTMsCiAgc3BhY2U6IDMyLAogIHVwOiAzOCwKICBsZWZ0OiAzNywKICByaWdodDogMzksCiAgZG93bjogNDAsCiAgJ2RlbGV0ZSc6IFs4LCA0Nl0KfTsKCi8vIEtleWJvYXJkRXZlbnQua2V5IGFsaWFzZXMKdmFyIGtleU5hbWVzID0gewogIGVzYzogJ0VzY2FwZScsCiAgdGFiOiAnVGFiJywKICBlbnRlcjogJ0VudGVyJywKICBzcGFjZTogJyAnLAogIC8vICM3ODA2OiBJRTExIHVzZXMga2V5IG5hbWVzIHdpdGhvdXQgYEFycm93YCBwcmVmaXggZm9yIGFycm93IGtleXMuCiAgdXA6IFsnVXAnLCAnQXJyb3dVcCddLAogIGxlZnQ6IFsnTGVmdCcsICdBcnJvd0xlZnQnXSwKICByaWdodDogWydSaWdodCcsICdBcnJvd1JpZ2h0J10sCiAgZG93bjogWydEb3duJywgJ0Fycm93RG93biddLAogICdkZWxldGUnOiBbJ0JhY2tzcGFjZScsICdEZWxldGUnXQp9OwoKLy8gIzQ4Njg6IG1vZGlmaWVycyB0aGF0IHByZXZlbnQgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbGlzdGVuZXIKLy8gbmVlZCB0byBleHBsaWNpdGx5IHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGRldGVybWluZSB3aGV0aGVyIHRvIHJlbW92ZQovLyB0aGUgbGlzdGVuZXIgZm9yIC5vbmNlCnZhciBnZW5HdWFyZCA9IGZ1bmN0aW9uIChjb25kaXRpb24pIHsgcmV0dXJuICgiaWYoIiArIGNvbmRpdGlvbiArICIpcmV0dXJuIG51bGw7Iik7IH07Cgp2YXIgbW9kaWZpZXJDb2RlID0gewogIHN0b3A6ICckZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7JywKICBwcmV2ZW50OiAnJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7JywKICBzZWxmOiBnZW5HdWFyZCgiJGV2ZW50LnRhcmdldCAhPT0gJGV2ZW50LmN1cnJlbnRUYXJnZXQiKSwKICBjdHJsOiBnZW5HdWFyZCgiISRldmVudC5jdHJsS2V5IiksCiAgc2hpZnQ6IGdlbkd1YXJkKCIhJGV2ZW50LnNoaWZ0S2V5IiksCiAgYWx0OiBnZW5HdWFyZCgiISRldmVudC5hbHRLZXkiKSwKICBtZXRhOiBnZW5HdWFyZCgiISRldmVudC5tZXRhS2V5IiksCiAgbGVmdDogZ2VuR3VhcmQoIididXR0b24nIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAwIiksCiAgbWlkZGxlOiBnZW5HdWFyZCgiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDEiKSwKICByaWdodDogZ2VuR3VhcmQoIididXR0b24nIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAyIikKfTsKCmZ1bmN0aW9uIGdlbkhhbmRsZXJzICgKICBldmVudHMsCiAgaXNOYXRpdmUsCiAgd2FybgopIHsKICB2YXIgcmVzID0gaXNOYXRpdmUgPyAnbmF0aXZlT246eycgOiAnb246eyc7CiAgZm9yICh2YXIgbmFtZSBpbiBldmVudHMpIHsKICAgIHJlcyArPSAiXCIiICsgbmFtZSArICJcIjoiICsgKGdlbkhhbmRsZXIobmFtZSwgZXZlbnRzW25hbWVdKSkgKyAiLCI7CiAgfQogIHJldHVybiByZXMuc2xpY2UoMCwgLTEpICsgJ30nCn0KCmZ1bmN0aW9uIGdlbkhhbmRsZXIgKAogIG5hbWUsCiAgaGFuZGxlcgopIHsKICBpZiAoIWhhbmRsZXIpIHsKICAgIHJldHVybiAnZnVuY3Rpb24oKXt9JwogIH0KCiAgaWYgKEFycmF5LmlzQXJyYXkoaGFuZGxlcikpIHsKICAgIHJldHVybiAoIlsiICsgKGhhbmRsZXIubWFwKGZ1bmN0aW9uIChoYW5kbGVyKSB7IHJldHVybiBnZW5IYW5kbGVyKG5hbWUsIGhhbmRsZXIpOyB9KS5qb2luKCcsJykpICsgIl0iKQogIH0KCiAgdmFyIGlzTWV0aG9kUGF0aCA9IHNpbXBsZVBhdGhSRS50ZXN0KGhhbmRsZXIudmFsdWUpOwogIHZhciBpc0Z1bmN0aW9uRXhwcmVzc2lvbiA9IGZuRXhwUkUudGVzdChoYW5kbGVyLnZhbHVlKTsKCiAgaWYgKCFoYW5kbGVyLm1vZGlmaWVycykgewogICAgaWYgKGlzTWV0aG9kUGF0aCB8fCBpc0Z1bmN0aW9uRXhwcmVzc2lvbikgewogICAgICByZXR1cm4gaGFuZGxlci52YWx1ZQogICAgfQogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICByZXR1cm4gKCJmdW5jdGlvbigkZXZlbnQpeyIgKyAoaGFuZGxlci52YWx1ZSkgKyAifSIpIC8vIGlubGluZSBzdGF0ZW1lbnQKICB9IGVsc2UgewogICAgdmFyIGNvZGUgPSAnJzsKICAgIHZhciBnZW5Nb2RpZmllckNvZGUgPSAnJzsKICAgIHZhciBrZXlzID0gW107CiAgICBmb3IgKHZhciBrZXkgaW4gaGFuZGxlci5tb2RpZmllcnMpIHsKICAgICAgaWYgKG1vZGlmaWVyQ29kZVtrZXldKSB7CiAgICAgICAgZ2VuTW9kaWZpZXJDb2RlICs9IG1vZGlmaWVyQ29kZVtrZXldOwogICAgICAgIC8vIGxlZnQvcmlnaHQKICAgICAgICBpZiAoa2V5Q29kZXNba2V5XSkgewogICAgICAgICAga2V5cy5wdXNoKGtleSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2V4YWN0JykgewogICAgICAgIHZhciBtb2RpZmllcnMgPSAoaGFuZGxlci5tb2RpZmllcnMpOwogICAgICAgIGdlbk1vZGlmaWVyQ29kZSArPSBnZW5HdWFyZCgKICAgICAgICAgIFsnY3RybCcsICdzaGlmdCcsICdhbHQnLCAnbWV0YSddCiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGtleU1vZGlmaWVyKSB7IHJldHVybiAhbW9kaWZpZXJzW2tleU1vZGlmaWVyXTsgfSkKICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoa2V5TW9kaWZpZXIpIHsgcmV0dXJuICgiJGV2ZW50LiIgKyBrZXlNb2RpZmllciArICJLZXkiKTsgfSkKICAgICAgICAgICAgLmpvaW4oJ3x8JykKICAgICAgICApOwogICAgICB9IGVsc2UgewogICAgICAgIGtleXMucHVzaChrZXkpOwogICAgICB9CiAgICB9CiAgICBpZiAoa2V5cy5sZW5ndGgpIHsKICAgICAgY29kZSArPSBnZW5LZXlGaWx0ZXIoa2V5cyk7CiAgICB9CiAgICAvLyBNYWtlIHN1cmUgbW9kaWZpZXJzIGxpa2UgcHJldmVudCBhbmQgc3RvcCBnZXQgZXhlY3V0ZWQgYWZ0ZXIga2V5IGZpbHRlcmluZwogICAgaWYgKGdlbk1vZGlmaWVyQ29kZSkgewogICAgICBjb2RlICs9IGdlbk1vZGlmaWVyQ29kZTsKICAgIH0KICAgIHZhciBoYW5kbGVyQ29kZSA9IGlzTWV0aG9kUGF0aAogICAgICA/ICgicmV0dXJuICIgKyAoaGFuZGxlci52YWx1ZSkgKyAiKCRldmVudCkiKQogICAgICA6IGlzRnVuY3Rpb25FeHByZXNzaW9uCiAgICAgICAgPyAoInJldHVybiAoIiArIChoYW5kbGVyLnZhbHVlKSArICIpKCRldmVudCkiKQogICAgICAgIDogaGFuZGxlci52YWx1ZTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgcmV0dXJuICgiZnVuY3Rpb24oJGV2ZW50KXsiICsgY29kZSArIGhhbmRsZXJDb2RlICsgIn0iKQogIH0KfQoKZnVuY3Rpb24gZ2VuS2V5RmlsdGVyIChrZXlzKSB7CiAgcmV0dXJuICgiaWYoISgnYnV0dG9uJyBpbiAkZXZlbnQpJiYiICsgKGtleXMubWFwKGdlbkZpbHRlckNvZGUpLmpvaW4oJyYmJykpICsgIilyZXR1cm4gbnVsbDsiKQp9CgpmdW5jdGlvbiBnZW5GaWx0ZXJDb2RlIChrZXkpIHsKICB2YXIga2V5VmFsID0gcGFyc2VJbnQoa2V5LCAxMCk7CiAgaWYgKGtleVZhbCkgewogICAgcmV0dXJuICgiJGV2ZW50LmtleUNvZGUhPT0iICsga2V5VmFsKQogIH0KICB2YXIga2V5Q29kZSA9IGtleUNvZGVzW2tleV07CiAgdmFyIGtleU5hbWUgPSBrZXlOYW1lc1trZXldOwogIHJldHVybiAoCiAgICAiX2soJGV2ZW50LmtleUNvZGUsIiArCiAgICAoSlNPTi5zdHJpbmdpZnkoa2V5KSkgKyAiLCIgKwogICAgKEpTT04uc3RyaW5naWZ5KGtleUNvZGUpKSArICIsIiArCiAgICAiJGV2ZW50LmtleSwiICsKICAgICIiICsgKEpTT04uc3RyaW5naWZ5KGtleU5hbWUpKSArCiAgICAiKSIKICApCn0KCi8qICAqLwoKZnVuY3Rpb24gb24gKGVsLCBkaXIpIHsKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRpci5tb2RpZmllcnMpIHsKICAgIHdhcm4oInYtb24gd2l0aG91dCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IG1vZGlmaWVycy4iKTsKICB9CiAgZWwud3JhcExpc3RlbmVycyA9IGZ1bmN0aW9uIChjb2RlKSB7IHJldHVybiAoIl9nKCIgKyBjb2RlICsgIiwiICsgKGRpci52YWx1ZSkgKyAiKSIpOyB9Owp9CgovKiAgKi8KCmZ1bmN0aW9uIGJpbmQkMSAoZWwsIGRpcikgewogIGVsLndyYXBEYXRhID0gZnVuY3Rpb24gKGNvZGUpIHsKICAgIHJldHVybiAoIl9iKCIgKyBjb2RlICsgIiwnIiArIChlbC50YWcpICsgIicsIiArIChkaXIudmFsdWUpICsgIiwiICsgKGRpci5tb2RpZmllcnMgJiYgZGlyLm1vZGlmaWVycy5wcm9wID8gJ3RydWUnIDogJ2ZhbHNlJykgKyAoZGlyLm1vZGlmaWVycyAmJiBkaXIubW9kaWZpZXJzLnN5bmMgPyAnLHRydWUnIDogJycpICsgIikiKQogIH07Cn0KCi8qICAqLwoKdmFyIGJhc2VEaXJlY3RpdmVzID0gewogIG9uOiBvbiwKICBiaW5kOiBiaW5kJDEsCiAgY2xvYWs6IG5vb3AKfQoKLyogICovCgp2YXIgQ29kZWdlblN0YXRlID0gZnVuY3Rpb24gQ29kZWdlblN0YXRlIChvcHRpb25zKSB7CiAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICB0aGlzLndhcm4gPSBvcHRpb25zLndhcm4gfHwgYmFzZVdhcm47CiAgdGhpcy50cmFuc2Zvcm1zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICd0cmFuc2Zvcm1Db2RlJyk7CiAgdGhpcy5kYXRhR2VuRm5zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICdnZW5EYXRhJyk7CiAgdGhpcy5kaXJlY3RpdmVzID0gZXh0ZW5kKGV4dGVuZCh7fSwgYmFzZURpcmVjdGl2ZXMpLCBvcHRpb25zLmRpcmVjdGl2ZXMpOwogIHZhciBpc1Jlc2VydmVkVGFnID0gb3B0aW9ucy5pc1Jlc2VydmVkVGFnIHx8IG5vOwogIHRoaXMubWF5YmVDb21wb25lbnQgPSBmdW5jdGlvbiAoZWwpIHsgcmV0dXJuICFpc1Jlc2VydmVkVGFnKGVsLnRhZyk7IH07CiAgdGhpcy5vbmNlSWQgPSAwOwogIHRoaXMuc3RhdGljUmVuZGVyRm5zID0gW107Cn07CgoKCmZ1bmN0aW9uIGdlbmVyYXRlICgKICBhc3QsCiAgb3B0aW9ucwopIHsKICB2YXIgc3RhdGUgPSBuZXcgQ29kZWdlblN0YXRlKG9wdGlvbnMpOwogIHZhciBjb2RlID0gYXN0ID8gZ2VuRWxlbWVudChhc3QsIHN0YXRlKSA6ICdfYygiZGl2IiknOwogIHJldHVybiB7CiAgICByZW5kZXI6ICgid2l0aCh0aGlzKXtyZXR1cm4gIiArIGNvZGUgKyAifSIpLAogICAgc3RhdGljUmVuZGVyRm5zOiBzdGF0ZS5zdGF0aWNSZW5kZXJGbnMKICB9Cn0KCmZ1bmN0aW9uIGdlbkVsZW1lbnQgKGVsLCBzdGF0ZSkgewogIGlmIChlbC5zdGF0aWNSb290ICYmICFlbC5zdGF0aWNQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5TdGF0aWMoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwub25jZSAmJiAhZWwub25jZVByb2Nlc3NlZCkgewogICAgcmV0dXJuIGdlbk9uY2UoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwuZm9yICYmICFlbC5mb3JQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5Gb3IoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwuaWYgJiYgIWVsLmlmUHJvY2Vzc2VkKSB7CiAgICByZXR1cm4gZ2VuSWYoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwudGFnID09PSAndGVtcGxhdGUnICYmICFlbC5zbG90VGFyZ2V0KSB7CiAgICByZXR1cm4gZ2VuQ2hpbGRyZW4oZWwsIHN0YXRlKSB8fCAndm9pZCAwJwogIH0gZWxzZSBpZiAoZWwudGFnID09PSAnc2xvdCcpIHsKICAgIHJldHVybiBnZW5TbG90KGVsLCBzdGF0ZSkKICB9IGVsc2UgewogICAgLy8gY29tcG9uZW50IG9yIGVsZW1lbnQKICAgIHZhciBjb2RlOwogICAgaWYgKGVsLmNvbXBvbmVudCkgewogICAgICBjb2RlID0gZ2VuQ29tcG9uZW50KGVsLmNvbXBvbmVudCwgZWwsIHN0YXRlKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBkYXRhID0gZWwucGxhaW4gPyB1bmRlZmluZWQgOiBnZW5EYXRhJDIoZWwsIHN0YXRlKTsKCiAgICAgIHZhciBjaGlsZHJlbiA9IGVsLmlubGluZVRlbXBsYXRlID8gbnVsbCA6IGdlbkNoaWxkcmVuKGVsLCBzdGF0ZSwgdHJ1ZSk7CiAgICAgIGNvZGUgPSAiX2MoJyIgKyAoZWwudGFnKSArICInIiArIChkYXRhID8gKCIsIiArIGRhdGEpIDogJycpICsgKGNoaWxkcmVuID8gKCIsIiArIGNoaWxkcmVuKSA6ICcnKSArICIpIjsKICAgIH0KICAgIC8vIG1vZHVsZSB0cmFuc2Zvcm1zCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlLnRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgICAgY29kZSA9IHN0YXRlLnRyYW5zZm9ybXNbaV0oZWwsIGNvZGUpOwogICAgfQogICAgcmV0dXJuIGNvZGUKICB9Cn0KCi8vIGhvaXN0IHN0YXRpYyBzdWItdHJlZXMgb3V0CmZ1bmN0aW9uIGdlblN0YXRpYyAoZWwsIHN0YXRlKSB7CiAgZWwuc3RhdGljUHJvY2Vzc2VkID0gdHJ1ZTsKICBzdGF0ZS5zdGF0aWNSZW5kZXJGbnMucHVzaCgoIndpdGgodGhpcyl7cmV0dXJuICIgKyAoZ2VuRWxlbWVudChlbCwgc3RhdGUpKSArICJ9IikpOwogIHJldHVybiAoIl9tKCIgKyAoc3RhdGUuc3RhdGljUmVuZGVyRm5zLmxlbmd0aCAtIDEpICsgKGVsLnN0YXRpY0luRm9yID8gJyx0cnVlJyA6ICcnKSArICIpIikKfQoKLy8gdi1vbmNlCmZ1bmN0aW9uIGdlbk9uY2UgKGVsLCBzdGF0ZSkgewogIGVsLm9uY2VQcm9jZXNzZWQgPSB0cnVlOwogIGlmIChlbC5pZiAmJiAhZWwuaWZQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5JZihlbCwgc3RhdGUpCiAgfSBlbHNlIGlmIChlbC5zdGF0aWNJbkZvcikgewogICAgdmFyIGtleSA9ICcnOwogICAgdmFyIHBhcmVudCA9IGVsLnBhcmVudDsKICAgIHdoaWxlIChwYXJlbnQpIHsKICAgICAgaWYgKHBhcmVudC5mb3IpIHsKICAgICAgICBrZXkgPSBwYXJlbnQua2V5OwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDsKICAgIH0KICAgIGlmICgha2V5KSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBzdGF0ZS53YXJuKAogICAgICAgICJ2LW9uY2UgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgdi1mb3IgdGhhdCBpcyBrZXllZC4gIgogICAgICApOwogICAgICByZXR1cm4gZ2VuRWxlbWVudChlbCwgc3RhdGUpCiAgICB9CiAgICByZXR1cm4gKCJfbygiICsgKGdlbkVsZW1lbnQoZWwsIHN0YXRlKSkgKyAiLCIgKyAoc3RhdGUub25jZUlkKyspICsgIiwiICsga2V5ICsgIikiKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZ2VuU3RhdGljKGVsLCBzdGF0ZSkKICB9Cn0KCmZ1bmN0aW9uIGdlbklmICgKICBlbCwKICBzdGF0ZSwKICBhbHRHZW4sCiAgYWx0RW1wdHkKKSB7CiAgZWwuaWZQcm9jZXNzZWQgPSB0cnVlOyAvLyBhdm9pZCByZWN1cnNpb24KICByZXR1cm4gZ2VuSWZDb25kaXRpb25zKGVsLmlmQ29uZGl0aW9ucy5zbGljZSgpLCBzdGF0ZSwgYWx0R2VuLCBhbHRFbXB0eSkKfQoKZnVuY3Rpb24gZ2VuSWZDb25kaXRpb25zICgKICBjb25kaXRpb25zLAogIHN0YXRlLAogIGFsdEdlbiwKICBhbHRFbXB0eQopIHsKICBpZiAoIWNvbmRpdGlvbnMubGVuZ3RoKSB7CiAgICByZXR1cm4gYWx0RW1wdHkgfHwgJ19lKCknCiAgfQoKICB2YXIgY29uZGl0aW9uID0gY29uZGl0aW9ucy5zaGlmdCgpOwogIGlmIChjb25kaXRpb24uZXhwKSB7CiAgICByZXR1cm4gKCIoIiArIChjb25kaXRpb24uZXhwKSArICIpPyIgKyAoZ2VuVGVybmFyeUV4cChjb25kaXRpb24uYmxvY2spKSArICI6IiArIChnZW5JZkNvbmRpdGlvbnMoY29uZGl0aW9ucywgc3RhdGUsIGFsdEdlbiwgYWx0RW1wdHkpKSkKICB9IGVsc2UgewogICAgcmV0dXJuICgiIiArIChnZW5UZXJuYXJ5RXhwKGNvbmRpdGlvbi5ibG9jaykpKQogIH0KCiAgLy8gdi1pZiB3aXRoIHYtb25jZSBzaG91bGQgZ2VuZXJhdGUgY29kZSBsaWtlIChhKT9fbSgwKTpfbSgxKQogIGZ1bmN0aW9uIGdlblRlcm5hcnlFeHAgKGVsKSB7CiAgICByZXR1cm4gYWx0R2VuCiAgICAgID8gYWx0R2VuKGVsLCBzdGF0ZSkKICAgICAgOiBlbC5vbmNlCiAgICAgICAgPyBnZW5PbmNlKGVsLCBzdGF0ZSkKICAgICAgICA6IGdlbkVsZW1lbnQoZWwsIHN0YXRlKQogIH0KfQoKZnVuY3Rpb24gZ2VuRm9yICgKICBlbCwKICBzdGF0ZSwKICBhbHRHZW4sCiAgYWx0SGVscGVyCikgewogIHZhciBleHAgPSBlbC5mb3I7CiAgdmFyIGFsaWFzID0gZWwuYWxpYXM7CiAgdmFyIGl0ZXJhdG9yMSA9IGVsLml0ZXJhdG9yMSA/ICgiLCIgKyAoZWwuaXRlcmF0b3IxKSkgOiAnJzsKICB2YXIgaXRlcmF0b3IyID0gZWwuaXRlcmF0b3IyID8gKCIsIiArIChlbC5pdGVyYXRvcjIpKSA6ICcnOwoKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmCiAgICBzdGF0ZS5tYXliZUNvbXBvbmVudChlbCkgJiYKICAgIGVsLnRhZyAhPT0gJ3Nsb3QnICYmCiAgICBlbC50YWcgIT09ICd0ZW1wbGF0ZScgJiYKICAgICFlbC5rZXkKICApIHsKICAgIHN0YXRlLndhcm4oCiAgICAgICI8IiArIChlbC50YWcpICsgIiB2LWZvcj1cIiIgKyBhbGlhcyArICIgaW4gIiArIGV4cCArICJcIj46IGNvbXBvbmVudCBsaXN0cyByZW5kZXJlZCB3aXRoICIgKwogICAgICAidi1mb3Igc2hvdWxkIGhhdmUgZXhwbGljaXQga2V5cy4gIiArCiAgICAgICJTZWUgaHR0cHM6Ly92dWVqcy5vcmcvZ3VpZGUvbGlzdC5odG1sI2tleSBmb3IgbW9yZSBpbmZvLiIsCiAgICAgIHRydWUgLyogdGlwICovCiAgICApOwogIH0KCiAgZWwuZm9yUHJvY2Vzc2VkID0gdHJ1ZTsgLy8gYXZvaWQgcmVjdXJzaW9uCiAgcmV0dXJuIChhbHRIZWxwZXIgfHwgJ19sJykgKyAiKCgiICsgZXhwICsgIiksIiArCiAgICAiZnVuY3Rpb24oIiArIGFsaWFzICsgaXRlcmF0b3IxICsgaXRlcmF0b3IyICsgIil7IiArCiAgICAgICJyZXR1cm4gIiArICgoYWx0R2VuIHx8IGdlbkVsZW1lbnQpKGVsLCBzdGF0ZSkpICsKICAgICd9KScKfQoKZnVuY3Rpb24gZ2VuRGF0YSQyIChlbCwgc3RhdGUpIHsKICB2YXIgZGF0YSA9ICd7JzsKCiAgLy8gZGlyZWN0aXZlcyBmaXJzdC4KICAvLyBkaXJlY3RpdmVzIG1heSBtdXRhdGUgdGhlIGVsJ3Mgb3RoZXIgcHJvcGVydGllcyBiZWZvcmUgdGhleSBhcmUgZ2VuZXJhdGVkLgogIHZhciBkaXJzID0gZ2VuRGlyZWN0aXZlcyhlbCwgc3RhdGUpOwogIGlmIChkaXJzKSB7IGRhdGEgKz0gZGlycyArICcsJzsgfQoKICAvLyBrZXkKICBpZiAoZWwua2V5KSB7CiAgICBkYXRhICs9ICJrZXk6IiArIChlbC5rZXkpICsgIiwiOwogIH0KICAvLyByZWYKICBpZiAoZWwucmVmKSB7CiAgICBkYXRhICs9ICJyZWY6IiArIChlbC5yZWYpICsgIiwiOwogIH0KICBpZiAoZWwucmVmSW5Gb3IpIHsKICAgIGRhdGEgKz0gInJlZkluRm9yOnRydWUsIjsKICB9CiAgLy8gcHJlCiAgaWYgKGVsLnByZSkgewogICAgZGF0YSArPSAicHJlOnRydWUsIjsKICB9CiAgLy8gcmVjb3JkIG9yaWdpbmFsIHRhZyBuYW1lIGZvciBjb21wb25lbnRzIHVzaW5nICJpcyIgYXR0cmlidXRlCiAgaWYgKGVsLmNvbXBvbmVudCkgewogICAgZGF0YSArPSAidGFnOlwiIiArIChlbC50YWcpICsgIlwiLCI7CiAgfQogIC8vIG1vZHVsZSBkYXRhIGdlbmVyYXRpb24gZnVuY3Rpb25zCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZS5kYXRhR2VuRm5zLmxlbmd0aDsgaSsrKSB7CiAgICBkYXRhICs9IHN0YXRlLmRhdGFHZW5GbnNbaV0oZWwpOwogIH0KICAvLyBhdHRyaWJ1dGVzCiAgaWYgKGVsLmF0dHJzKSB7CiAgICBkYXRhICs9ICJhdHRyczp7IiArIChnZW5Qcm9wcyhlbC5hdHRycykpICsgIn0sIjsKICB9CiAgLy8gRE9NIHByb3BzCiAgaWYgKGVsLnByb3BzKSB7CiAgICBkYXRhICs9ICJkb21Qcm9wczp7IiArIChnZW5Qcm9wcyhlbC5wcm9wcykpICsgIn0sIjsKICB9CiAgLy8gZXZlbnQgaGFuZGxlcnMKICBpZiAoZWwuZXZlbnRzKSB7CiAgICBkYXRhICs9IChnZW5IYW5kbGVycyhlbC5ldmVudHMsIGZhbHNlLCBzdGF0ZS53YXJuKSkgKyAiLCI7CiAgfQogIGlmIChlbC5uYXRpdmVFdmVudHMpIHsKICAgIGRhdGEgKz0gKGdlbkhhbmRsZXJzKGVsLm5hdGl2ZUV2ZW50cywgdHJ1ZSwgc3RhdGUud2FybikpICsgIiwiOwogIH0KICAvLyBzbG90IHRhcmdldAogIC8vIG9ubHkgZm9yIG5vbi1zY29wZWQgc2xvdHMKICBpZiAoZWwuc2xvdFRhcmdldCAmJiAhZWwuc2xvdFNjb3BlKSB7CiAgICBkYXRhICs9ICJzbG90OiIgKyAoZWwuc2xvdFRhcmdldCkgKyAiLCI7CiAgfQogIC8vIHNjb3BlZCBzbG90cwogIGlmIChlbC5zY29wZWRTbG90cykgewogICAgZGF0YSArPSAoZ2VuU2NvcGVkU2xvdHMoZWwuc2NvcGVkU2xvdHMsIHN0YXRlKSkgKyAiLCI7CiAgfQogIC8vIGNvbXBvbmVudCB2LW1vZGVsCiAgaWYgKGVsLm1vZGVsKSB7CiAgICBkYXRhICs9ICJtb2RlbDp7dmFsdWU6IiArIChlbC5tb2RlbC52YWx1ZSkgKyAiLGNhbGxiYWNrOiIgKyAoZWwubW9kZWwuY2FsbGJhY2spICsgIixleHByZXNzaW9uOiIgKyAoZWwubW9kZWwuZXhwcmVzc2lvbikgKyAifSwiOwogIH0KICAvLyBpbmxpbmUtdGVtcGxhdGUKICBpZiAoZWwuaW5saW5lVGVtcGxhdGUpIHsKICAgIHZhciBpbmxpbmVUZW1wbGF0ZSA9IGdlbklubGluZVRlbXBsYXRlKGVsLCBzdGF0ZSk7CiAgICBpZiAoaW5saW5lVGVtcGxhdGUpIHsKICAgICAgZGF0YSArPSBpbmxpbmVUZW1wbGF0ZSArICIsIjsKICAgIH0KICB9CiAgZGF0YSA9IGRhdGEucmVwbGFjZSgvLCQvLCAnJykgKyAnfSc7CiAgLy8gdi1iaW5kIGRhdGEgd3JhcAogIGlmIChlbC53cmFwRGF0YSkgewogICAgZGF0YSA9IGVsLndyYXBEYXRhKGRhdGEpOwogIH0KICAvLyB2LW9uIGRhdGEgd3JhcAogIGlmIChlbC53cmFwTGlzdGVuZXJzKSB7CiAgICBkYXRhID0gZWwud3JhcExpc3RlbmVycyhkYXRhKTsKICB9CiAgcmV0dXJuIGRhdGEKfQoKZnVuY3Rpb24gZ2VuRGlyZWN0aXZlcyAoZWwsIHN0YXRlKSB7CiAgdmFyIGRpcnMgPSBlbC5kaXJlY3RpdmVzOwogIGlmICghZGlycykgeyByZXR1cm4gfQogIHZhciByZXMgPSAnZGlyZWN0aXZlczpbJzsKICB2YXIgaGFzUnVudGltZSA9IGZhbHNlOwogIHZhciBpLCBsLCBkaXIsIG5lZWRSdW50aW1lOwogIGZvciAoaSA9IDAsIGwgPSBkaXJzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgZGlyID0gZGlyc1tpXTsKICAgIG5lZWRSdW50aW1lID0gdHJ1ZTsKICAgIHZhciBnZW4gPSBzdGF0ZS5kaXJlY3RpdmVzW2Rpci5uYW1lXTsKICAgIGlmIChnZW4pIHsKICAgICAgLy8gY29tcGlsZS10aW1lIGRpcmVjdGl2ZSB0aGF0IG1hbmlwdWxhdGVzIEFTVC4KICAgICAgLy8gcmV0dXJucyB0cnVlIGlmIGl0IGFsc28gbmVlZHMgYSBydW50aW1lIGNvdW50ZXJwYXJ0LgogICAgICBuZWVkUnVudGltZSA9ICEhZ2VuKGVsLCBkaXIsIHN0YXRlLndhcm4pOwogICAgfQogICAgaWYgKG5lZWRSdW50aW1lKSB7CiAgICAgIGhhc1J1bnRpbWUgPSB0cnVlOwogICAgICByZXMgKz0gIntuYW1lOlwiIiArIChkaXIubmFtZSkgKyAiXCIscmF3TmFtZTpcIiIgKyAoZGlyLnJhd05hbWUpICsgIlwiIiArIChkaXIudmFsdWUgPyAoIix2YWx1ZTooIiArIChkaXIudmFsdWUpICsgIiksZXhwcmVzc2lvbjoiICsgKEpTT04uc3RyaW5naWZ5KGRpci52YWx1ZSkpKSA6ICcnKSArIChkaXIuYXJnID8gKCIsYXJnOlwiIiArIChkaXIuYXJnKSArICJcIiIpIDogJycpICsgKGRpci5tb2RpZmllcnMgPyAoIixtb2RpZmllcnM6IiArIChKU09OLnN0cmluZ2lmeShkaXIubW9kaWZpZXJzKSkpIDogJycpICsgIn0sIjsKICAgIH0KICB9CiAgaWYgKGhhc1J1bnRpbWUpIHsKICAgIHJldHVybiByZXMuc2xpY2UoMCwgLTEpICsgJ10nCiAgfQp9CgpmdW5jdGlvbiBnZW5JbmxpbmVUZW1wbGF0ZSAoZWwsIHN0YXRlKSB7CiAgdmFyIGFzdCA9IGVsLmNoaWxkcmVuWzBdOwogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgKAogICAgZWwuY2hpbGRyZW4ubGVuZ3RoICE9PSAxIHx8IGFzdC50eXBlICE9PSAxCiAgKSkgewogICAgc3RhdGUud2FybignSW5saW5lLXRlbXBsYXRlIGNvbXBvbmVudHMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGNoaWxkIGVsZW1lbnQuJyk7CiAgfQogIGlmIChhc3QudHlwZSA9PT0gMSkgewogICAgdmFyIGlubGluZVJlbmRlckZucyA9IGdlbmVyYXRlKGFzdCwgc3RhdGUub3B0aW9ucyk7CiAgICByZXR1cm4gKCJpbmxpbmVUZW1wbGF0ZTp7cmVuZGVyOmZ1bmN0aW9uKCl7IiArIChpbmxpbmVSZW5kZXJGbnMucmVuZGVyKSArICJ9LHN0YXRpY1JlbmRlckZuczpbIiArIChpbmxpbmVSZW5kZXJGbnMuc3RhdGljUmVuZGVyRm5zLm1hcChmdW5jdGlvbiAoY29kZSkgeyByZXR1cm4gKCJmdW5jdGlvbigpeyIgKyBjb2RlICsgIn0iKTsgfSkuam9pbignLCcpKSArICJdfSIpCiAgfQp9CgpmdW5jdGlvbiBnZW5TY29wZWRTbG90cyAoCiAgc2xvdHMsCiAgc3RhdGUKKSB7CiAgcmV0dXJuICgic2NvcGVkU2xvdHM6X3UoWyIgKyAoT2JqZWN0LmtleXMoc2xvdHMpLm1hcChmdW5jdGlvbiAoa2V5KSB7CiAgICAgIHJldHVybiBnZW5TY29wZWRTbG90KGtleSwgc2xvdHNba2V5XSwgc3RhdGUpCiAgICB9KS5qb2luKCcsJykpICsgIl0pIikKfQoKZnVuY3Rpb24gZ2VuU2NvcGVkU2xvdCAoCiAga2V5LAogIGVsLAogIHN0YXRlCikgewogIGlmIChlbC5mb3IgJiYgIWVsLmZvclByb2Nlc3NlZCkgewogICAgcmV0dXJuIGdlbkZvclNjb3BlZFNsb3Qoa2V5LCBlbCwgc3RhdGUpCiAgfQogIHZhciBmbiA9ICJmdW5jdGlvbigiICsgKFN0cmluZyhlbC5zbG90U2NvcGUpKSArICIpeyIgKwogICAgInJldHVybiAiICsgKGVsLnRhZyA9PT0gJ3RlbXBsYXRlJwogICAgICA/IGVsLmlmCiAgICAgICAgPyAoKGVsLmlmKSArICI/IiArIChnZW5DaGlsZHJlbihlbCwgc3RhdGUpIHx8ICd1bmRlZmluZWQnKSArICI6dW5kZWZpbmVkIikKICAgICAgICA6IGdlbkNoaWxkcmVuKGVsLCBzdGF0ZSkgfHwgJ3VuZGVmaW5lZCcKICAgICAgOiBnZW5FbGVtZW50KGVsLCBzdGF0ZSkpICsgIn0iOwogIHJldHVybiAoIntrZXk6IiArIGtleSArICIsZm46IiArIGZuICsgIn0iKQp9CgpmdW5jdGlvbiBnZW5Gb3JTY29wZWRTbG90ICgKICBrZXksCiAgZWwsCiAgc3RhdGUKKSB7CiAgdmFyIGV4cCA9IGVsLmZvcjsKICB2YXIgYWxpYXMgPSBlbC5hbGlhczsKICB2YXIgaXRlcmF0b3IxID0gZWwuaXRlcmF0b3IxID8gKCIsIiArIChlbC5pdGVyYXRvcjEpKSA6ICcnOwogIHZhciBpdGVyYXRvcjIgPSBlbC5pdGVyYXRvcjIgPyAoIiwiICsgKGVsLml0ZXJhdG9yMikpIDogJyc7CiAgZWwuZm9yUHJvY2Vzc2VkID0gdHJ1ZTsgLy8gYXZvaWQgcmVjdXJzaW9uCiAgcmV0dXJuICJfbCgoIiArIGV4cCArICIpLCIgKwogICAgImZ1bmN0aW9uKCIgKyBhbGlhcyArIGl0ZXJhdG9yMSArIGl0ZXJhdG9yMiArICIpeyIgKwogICAgICAicmV0dXJuICIgKyAoZ2VuU2NvcGVkU2xvdChrZXksIGVsLCBzdGF0ZSkpICsKICAgICd9KScKfQoKZnVuY3Rpb24gZ2VuQ2hpbGRyZW4gKAogIGVsLAogIHN0YXRlLAogIGNoZWNrU2tpcCwKICBhbHRHZW5FbGVtZW50LAogIGFsdEdlbk5vZGUKKSB7CiAgdmFyIGNoaWxkcmVuID0gZWwuY2hpbGRyZW47CiAgaWYgKGNoaWxkcmVuLmxlbmd0aCkgewogICAgdmFyIGVsJDEgPSBjaGlsZHJlblswXTsKICAgIC8vIG9wdGltaXplIHNpbmdsZSB2LWZvcgogICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJgogICAgICBlbCQxLmZvciAmJgogICAgICBlbCQxLnRhZyAhPT0gJ3RlbXBsYXRlJyAmJgogICAgICBlbCQxLnRhZyAhPT0gJ3Nsb3QnCiAgICApIHsKICAgICAgcmV0dXJuIChhbHRHZW5FbGVtZW50IHx8IGdlbkVsZW1lbnQpKGVsJDEsIHN0YXRlKQogICAgfQogICAgdmFyIG5vcm1hbGl6YXRpb25UeXBlID0gY2hlY2tTa2lwCiAgICAgID8gZ2V0Tm9ybWFsaXphdGlvblR5cGUoY2hpbGRyZW4sIHN0YXRlLm1heWJlQ29tcG9uZW50KQogICAgICA6IDA7CiAgICB2YXIgZ2VuID0gYWx0R2VuTm9kZSB8fCBnZW5Ob2RlOwogICAgcmV0dXJuICgiWyIgKyAoY2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChjKSB7IHJldHVybiBnZW4oYywgc3RhdGUpOyB9KS5qb2luKCcsJykpICsgIl0iICsgKG5vcm1hbGl6YXRpb25UeXBlID8gKCIsIiArIG5vcm1hbGl6YXRpb25UeXBlKSA6ICcnKSkKICB9Cn0KCi8vIGRldGVybWluZSB0aGUgbm9ybWFsaXphdGlvbiBuZWVkZWQgZm9yIHRoZSBjaGlsZHJlbiBhcnJheS4KLy8gMDogbm8gbm9ybWFsaXphdGlvbiBuZWVkZWQKLy8gMTogc2ltcGxlIG5vcm1hbGl6YXRpb24gbmVlZGVkIChwb3NzaWJsZSAxLWxldmVsIGRlZXAgbmVzdGVkIGFycmF5KQovLyAyOiBmdWxsIG5vcm1hbGl6YXRpb24gbmVlZGVkCmZ1bmN0aW9uIGdldE5vcm1hbGl6YXRpb25UeXBlICgKICBjaGlsZHJlbiwKICBtYXliZUNvbXBvbmVudAopIHsKICB2YXIgcmVzID0gMDsKICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgZWwgPSBjaGlsZHJlbltpXTsKICAgIGlmIChlbC50eXBlICE9PSAxKSB7CiAgICAgIGNvbnRpbnVlCiAgICB9CiAgICBpZiAobmVlZHNOb3JtYWxpemF0aW9uKGVsKSB8fAogICAgICAgIChlbC5pZkNvbmRpdGlvbnMgJiYgZWwuaWZDb25kaXRpb25zLnNvbWUoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIG5lZWRzTm9ybWFsaXphdGlvbihjLmJsb2NrKTsgfSkpKSB7CiAgICAgIHJlcyA9IDI7CiAgICAgIGJyZWFrCiAgICB9CiAgICBpZiAobWF5YmVDb21wb25lbnQoZWwpIHx8CiAgICAgICAgKGVsLmlmQ29uZGl0aW9ucyAmJiBlbC5pZkNvbmRpdGlvbnMuc29tZShmdW5jdGlvbiAoYykgeyByZXR1cm4gbWF5YmVDb21wb25lbnQoYy5ibG9jayk7IH0pKSkgewogICAgICByZXMgPSAxOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIG5lZWRzTm9ybWFsaXphdGlvbiAoZWwpIHsKICByZXR1cm4gZWwuZm9yICE9PSB1bmRlZmluZWQgfHwgZWwudGFnID09PSAndGVtcGxhdGUnIHx8IGVsLnRhZyA9PT0gJ3Nsb3QnCn0KCmZ1bmN0aW9uIGdlbk5vZGUgKG5vZGUsIHN0YXRlKSB7CiAgaWYgKG5vZGUudHlwZSA9PT0gMSkgewogICAgcmV0dXJuIGdlbkVsZW1lbnQobm9kZSwgc3RhdGUpCiAgfSBpZiAobm9kZS50eXBlID09PSAzICYmIG5vZGUuaXNDb21tZW50KSB7CiAgICByZXR1cm4gZ2VuQ29tbWVudChub2RlKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZ2VuVGV4dChub2RlKQogIH0KfQoKZnVuY3Rpb24gZ2VuVGV4dCAodGV4dCkgewogIHJldHVybiAoIl92KCIgKyAodGV4dC50eXBlID09PSAyCiAgICA/IHRleHQuZXhwcmVzc2lvbiAvLyBubyBuZWVkIGZvciAoKSBiZWNhdXNlIGFscmVhZHkgd3JhcHBlZCBpbiBfcygpCiAgICA6IHRyYW5zZm9ybVNwZWNpYWxOZXdsaW5lcyhKU09OLnN0cmluZ2lmeSh0ZXh0LnRleHQpKSkgKyAiKSIpCn0KCmZ1bmN0aW9uIGdlbkNvbW1lbnQgKGNvbW1lbnQpIHsKICByZXR1cm4gKCJfZSgiICsgKEpTT04uc3RyaW5naWZ5KGNvbW1lbnQudGV4dCkpICsgIikiKQp9CgpmdW5jdGlvbiBnZW5TbG90IChlbCwgc3RhdGUpIHsKICB2YXIgc2xvdE5hbWUgPSBlbC5zbG90TmFtZSB8fCAnImRlZmF1bHQiJzsKICB2YXIgY2hpbGRyZW4gPSBnZW5DaGlsZHJlbihlbCwgc3RhdGUpOwogIHZhciByZXMgPSAiX3QoIiArIHNsb3ROYW1lICsgKGNoaWxkcmVuID8gKCIsIiArIGNoaWxkcmVuKSA6ICcnKTsKICB2YXIgYXR0cnMgPSBlbC5hdHRycyAmJiAoInsiICsgKGVsLmF0dHJzLm1hcChmdW5jdGlvbiAoYSkgeyByZXR1cm4gKChjYW1lbGl6ZShhLm5hbWUpKSArICI6IiArIChhLnZhbHVlKSk7IH0pLmpvaW4oJywnKSkgKyAifSIpOwogIHZhciBiaW5kJCQxID0gZWwuYXR0cnNNYXBbJ3YtYmluZCddOwogIGlmICgoYXR0cnMgfHwgYmluZCQkMSkgJiYgIWNoaWxkcmVuKSB7CiAgICByZXMgKz0gIixudWxsIjsKICB9CiAgaWYgKGF0dHJzKSB7CiAgICByZXMgKz0gIiwiICsgYXR0cnM7CiAgfQogIGlmIChiaW5kJCQxKSB7CiAgICByZXMgKz0gKGF0dHJzID8gJycgOiAnLG51bGwnKSArICIsIiArIGJpbmQkJDE7CiAgfQogIHJldHVybiByZXMgKyAnKScKfQoKLy8gY29tcG9uZW50TmFtZSBpcyBlbC5jb21wb25lbnQsIHRha2UgaXQgYXMgYXJndW1lbnQgdG8gc2h1biBmbG93J3MgcGVzc2ltaXN0aWMgcmVmaW5lbWVudApmdW5jdGlvbiBnZW5Db21wb25lbnQgKAogIGNvbXBvbmVudE5hbWUsCiAgZWwsCiAgc3RhdGUKKSB7CiAgdmFyIGNoaWxkcmVuID0gZWwuaW5saW5lVGVtcGxhdGUgPyBudWxsIDogZ2VuQ2hpbGRyZW4oZWwsIHN0YXRlLCB0cnVlKTsKICByZXR1cm4gKCJfYygiICsgY29tcG9uZW50TmFtZSArICIsIiArIChnZW5EYXRhJDIoZWwsIHN0YXRlKSkgKyAoY2hpbGRyZW4gPyAoIiwiICsgY2hpbGRyZW4pIDogJycpICsgIikiKQp9CgpmdW5jdGlvbiBnZW5Qcm9wcyAocHJvcHMpIHsKICB2YXIgcmVzID0gJyc7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgdmFyIHByb3AgPSBwcm9wc1tpXTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgewogICAgICByZXMgKz0gIlwiIiArIChwcm9wLm5hbWUpICsgIlwiOiIgKyAodHJhbnNmb3JtU3BlY2lhbE5ld2xpbmVzKHByb3AudmFsdWUpKSArICIsIjsKICAgIH0KICB9CiAgcmV0dXJuIHJlcy5zbGljZSgwLCAtMSkKfQoKLy8gIzM4OTUsICM0MjY4CmZ1bmN0aW9uIHRyYW5zZm9ybVNwZWNpYWxOZXdsaW5lcyAodGV4dCkgewogIHJldHVybiB0ZXh0CiAgICAucmVwbGFjZSgvXHUyMDI4L2csICdcXHUyMDI4JykKICAgIC5yZXBsYWNlKC9cdTIwMjkvZywgJ1xcdTIwMjknKQp9CgovKiAgKi8KCi8vIHRoZXNlIGtleXdvcmRzIHNob3VsZCBub3QgYXBwZWFyIGluc2lkZSBleHByZXNzaW9ucywgYnV0IG9wZXJhdG9ycyBsaWtlCi8vIHR5cGVvZiwgaW5zdGFuY2VvZiBhbmQgaW4gYXJlIGFsbG93ZWQKdmFyIHByb2hpYml0ZWRLZXl3b3JkUkUgPSBuZXcgUmVnRXhwKCdcXGInICsgKAogICdkbyxpZixmb3IsbGV0LG5ldyx0cnksdmFyLGNhc2UsZWxzZSx3aXRoLGF3YWl0LGJyZWFrLGNhdGNoLGNsYXNzLGNvbnN0LCcgKwogICdzdXBlcix0aHJvdyx3aGlsZSx5aWVsZCxkZWxldGUsZXhwb3J0LGltcG9ydCxyZXR1cm4sc3dpdGNoLGRlZmF1bHQsJyArCiAgJ2V4dGVuZHMsZmluYWxseSxjb250aW51ZSxkZWJ1Z2dlcixmdW5jdGlvbixhcmd1bWVudHMnCikuc3BsaXQoJywnKS5qb2luKCdcXGJ8XFxiJykgKyAnXFxiJyk7CgovLyB0aGVzZSB1bmFyeSBvcGVyYXRvcnMgc2hvdWxkIG5vdCBiZSB1c2VkIGFzIHByb3BlcnR5L21ldGhvZCBuYW1lcwp2YXIgdW5hcnlPcGVyYXRvcnNSRSA9IG5ldyBSZWdFeHAoJ1xcYicgKyAoCiAgJ2RlbGV0ZSx0eXBlb2Ysdm9pZCcKKS5zcGxpdCgnLCcpLmpvaW4oJ1xccypcXChbXlxcKV0qXFwpfFxcYicpICsgJ1xccypcXChbXlxcKV0qXFwpJyk7CgovLyBzdHJpcCBzdHJpbmdzIGluIGV4cHJlc3Npb25zCnZhciBzdHJpcFN0cmluZ1JFID0gLycoPzpbXidcXF18XFwuKSonfCIoPzpbXiJcXF18XFwuKSoifGAoPzpbXmBcXF18XFwuKSpcJFx7fFx9KD86W15gXFxdfFxcLikqYHxgKD86W15gXFxdfFxcLikqYC9nOwoKLy8gZGV0ZWN0IHByb2JsZW1hdGljIGV4cHJlc3Npb25zIGluIGEgdGVtcGxhdGUKZnVuY3Rpb24gZGV0ZWN0RXJyb3JzIChhc3QpIHsKICB2YXIgZXJyb3JzID0gW107CiAgaWYgKGFzdCkgewogICAgY2hlY2tOb2RlKGFzdCwgZXJyb3JzKTsKICB9CiAgcmV0dXJuIGVycm9ycwp9CgpmdW5jdGlvbiBjaGVja05vZGUgKG5vZGUsIGVycm9ycykgewogIGlmIChub2RlLnR5cGUgPT09IDEpIHsKICAgIGZvciAodmFyIG5hbWUgaW4gbm9kZS5hdHRyc01hcCkgewogICAgICBpZiAoZGlyUkUudGVzdChuYW1lKSkgewogICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuYXR0cnNNYXBbbmFtZV07CiAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICBpZiAobmFtZSA9PT0gJ3YtZm9yJykgewogICAgICAgICAgICBjaGVja0Zvcihub2RlLCAoInYtZm9yPVwiIiArIHZhbHVlICsgIlwiIiksIGVycm9ycyk7CiAgICAgICAgICB9IGVsc2UgaWYgKG9uUkUudGVzdChuYW1lKSkgewogICAgICAgICAgICBjaGVja0V2ZW50KHZhbHVlLCAobmFtZSArICI9XCIiICsgdmFsdWUgKyAiXCIiKSwgZXJyb3JzKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNoZWNrRXhwcmVzc2lvbih2YWx1ZSwgKG5hbWUgKyAiPVwiIiArIHZhbHVlICsgIlwiIiksIGVycm9ycyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAobm9kZS5jaGlsZHJlbikgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICBjaGVja05vZGUobm9kZS5jaGlsZHJlbltpXSwgZXJyb3JzKTsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAyKSB7CiAgICBjaGVja0V4cHJlc3Npb24obm9kZS5leHByZXNzaW9uLCBub2RlLnRleHQsIGVycm9ycyk7CiAgfQp9CgpmdW5jdGlvbiBjaGVja0V2ZW50IChleHAsIHRleHQsIGVycm9ycykgewogIHZhciBzdGlwcGVkID0gZXhwLnJlcGxhY2Uoc3RyaXBTdHJpbmdSRSwgJycpOwogIHZhciBrZXl3b3JkTWF0Y2ggPSBzdGlwcGVkLm1hdGNoKHVuYXJ5T3BlcmF0b3JzUkUpOwogIGlmIChrZXl3b3JkTWF0Y2ggJiYgc3RpcHBlZC5jaGFyQXQoa2V5d29yZE1hdGNoLmluZGV4IC0gMSkgIT09ICckJykgewogICAgZXJyb3JzLnB1c2goCiAgICAgICJhdm9pZCB1c2luZyBKYXZhU2NyaXB0IHVuYXJ5IG9wZXJhdG9yIGFzIHByb3BlcnR5IG5hbWU6ICIgKwogICAgICAiXCIiICsgKGtleXdvcmRNYXRjaFswXSkgKyAiXCIgaW4gZXhwcmVzc2lvbiAiICsgKHRleHQudHJpbSgpKQogICAgKTsKICB9CiAgY2hlY2tFeHByZXNzaW9uKGV4cCwgdGV4dCwgZXJyb3JzKTsKfQoKZnVuY3Rpb24gY2hlY2tGb3IgKG5vZGUsIHRleHQsIGVycm9ycykgewogIGNoZWNrRXhwcmVzc2lvbihub2RlLmZvciB8fCAnJywgdGV4dCwgZXJyb3JzKTsKICBjaGVja0lkZW50aWZpZXIobm9kZS5hbGlhcywgJ3YtZm9yIGFsaWFzJywgdGV4dCwgZXJyb3JzKTsKICBjaGVja0lkZW50aWZpZXIobm9kZS5pdGVyYXRvcjEsICd2LWZvciBpdGVyYXRvcicsIHRleHQsIGVycm9ycyk7CiAgY2hlY2tJZGVudGlmaWVyKG5vZGUuaXRlcmF0b3IyLCAndi1mb3IgaXRlcmF0b3InLCB0ZXh0LCBlcnJvcnMpOwp9CgpmdW5jdGlvbiBjaGVja0lkZW50aWZpZXIgKAogIGlkZW50LAogIHR5cGUsCiAgdGV4dCwKICBlcnJvcnMKKSB7CiAgaWYgKHR5cGVvZiBpZGVudCA9PT0gJ3N0cmluZycpIHsKICAgIHRyeSB7CiAgICAgIG5ldyBGdW5jdGlvbigoInZhciAiICsgaWRlbnQgKyAiPV8iKSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGVycm9ycy5wdXNoKCgiaW52YWxpZCAiICsgdHlwZSArICIgXCIiICsgaWRlbnQgKyAiXCIgaW4gZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkpKTsKICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGNoZWNrRXhwcmVzc2lvbiAoZXhwLCB0ZXh0LCBlcnJvcnMpIHsKICB0cnkgewogICAgbmV3IEZ1bmN0aW9uKCgicmV0dXJuICIgKyBleHApKTsKICB9IGNhdGNoIChlKSB7CiAgICB2YXIga2V5d29yZE1hdGNoID0gZXhwLnJlcGxhY2Uoc3RyaXBTdHJpbmdSRSwgJycpLm1hdGNoKHByb2hpYml0ZWRLZXl3b3JkUkUpOwogICAgaWYgKGtleXdvcmRNYXRjaCkgewogICAgICBlcnJvcnMucHVzaCgKICAgICAgICAiYXZvaWQgdXNpbmcgSmF2YVNjcmlwdCBrZXl3b3JkIGFzIHByb3BlcnR5IG5hbWU6ICIgKwogICAgICAgICJcIiIgKyAoa2V5d29yZE1hdGNoWzBdKSArICJcIlxuICBSYXcgZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkKICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIGVycm9ycy5wdXNoKAogICAgICAgICJpbnZhbGlkIGV4cHJlc3Npb246ICIgKyAoZS5tZXNzYWdlKSArICIgaW5cblxuIiArCiAgICAgICAgIiAgICAiICsgZXhwICsgIlxuXG4iICsKICAgICAgICAiICBSYXcgZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkgKyAiXG4iCiAgICAgICk7CiAgICB9CiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uIChjb2RlLCBlcnJvcnMpIHsKICB0cnkgewogICAgcmV0dXJuIG5ldyBGdW5jdGlvbihjb2RlKQogIH0gY2F0Y2ggKGVycikgewogICAgZXJyb3JzLnB1c2goeyBlcnI6IGVyciwgY29kZTogY29kZSB9KTsKICAgIHJldHVybiBub29wCiAgfQp9CgpmdW5jdGlvbiBjcmVhdGVDb21waWxlVG9GdW5jdGlvbkZuIChjb21waWxlKSB7CiAgdmFyIGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKCiAgcmV0dXJuIGZ1bmN0aW9uIGNvbXBpbGVUb0Z1bmN0aW9ucyAoCiAgICB0ZW1wbGF0ZSwKICAgIG9wdGlvbnMsCiAgICB2bQogICkgewogICAgb3B0aW9ucyA9IGV4dGVuZCh7fSwgb3B0aW9ucyk7CiAgICB2YXIgd2FybiQkMSA9IG9wdGlvbnMud2FybiB8fCB3YXJuOwogICAgZGVsZXRlIG9wdGlvbnMud2FybjsKCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIHsKICAgICAgLy8gZGV0ZWN0IHBvc3NpYmxlIENTUCByZXN0cmljdGlvbgogICAgICB0cnkgewogICAgICAgIG5ldyBGdW5jdGlvbigncmV0dXJuIDEnKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChlLnRvU3RyaW5nKCkubWF0Y2goL3Vuc2FmZS1ldmFsfENTUC8pKSB7CiAgICAgICAgICB3YXJuJCQxKAogICAgICAgICAgICAnSXQgc2VlbXMgeW91IGFyZSB1c2luZyB0aGUgc3RhbmRhbG9uZSBidWlsZCBvZiBWdWUuanMgaW4gYW4gJyArCiAgICAgICAgICAgICdlbnZpcm9ubWVudCB3aXRoIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IHRoYXQgcHJvaGliaXRzIHVuc2FmZS1ldmFsLiAnICsKICAgICAgICAgICAgJ1RoZSB0ZW1wbGF0ZSBjb21waWxlciBjYW5ub3Qgd29yayBpbiB0aGlzIGVudmlyb25tZW50LiBDb25zaWRlciAnICsKICAgICAgICAgICAgJ3JlbGF4aW5nIHRoZSBwb2xpY3kgdG8gYWxsb3cgdW5zYWZlLWV2YWwgb3IgcHJlLWNvbXBpbGluZyB5b3VyICcgKwogICAgICAgICAgICAndGVtcGxhdGVzIGludG8gcmVuZGVyIGZ1bmN0aW9ucy4nCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIGNoZWNrIGNhY2hlCiAgICB2YXIga2V5ID0gb3B0aW9ucy5kZWxpbWl0ZXJzCiAgICAgID8gU3RyaW5nKG9wdGlvbnMuZGVsaW1pdGVycykgKyB0ZW1wbGF0ZQogICAgICA6IHRlbXBsYXRlOwogICAgaWYgKGNhY2hlW2tleV0pIHsKICAgICAgcmV0dXJuIGNhY2hlW2tleV0KICAgIH0KCiAgICAvLyBjb21waWxlCiAgICB2YXIgY29tcGlsZWQgPSBjb21waWxlKHRlbXBsYXRlLCBvcHRpb25zKTsKCiAgICAvLyBjaGVjayBjb21waWxhdGlvbiBlcnJvcnMvdGlwcwogICAgewogICAgICBpZiAoY29tcGlsZWQuZXJyb3JzICYmIGNvbXBpbGVkLmVycm9ycy5sZW5ndGgpIHsKICAgICAgICB3YXJuJCQxKAogICAgICAgICAgIkVycm9yIGNvbXBpbGluZyB0ZW1wbGF0ZTpcblxuIiArIHRlbXBsYXRlICsgIlxuXG4iICsKICAgICAgICAgIGNvbXBpbGVkLmVycm9ycy5tYXAoZnVuY3Rpb24gKGUpIHsgcmV0dXJuICgiLSAiICsgZSk7IH0pLmpvaW4oJ1xuJykgKyAnXG4nLAogICAgICAgICAgdm0KICAgICAgICApOwogICAgICB9CiAgICAgIGlmIChjb21waWxlZC50aXBzICYmIGNvbXBpbGVkLnRpcHMubGVuZ3RoKSB7CiAgICAgICAgY29tcGlsZWQudGlwcy5mb3JFYWNoKGZ1bmN0aW9uIChtc2cpIHsgcmV0dXJuIHRpcChtc2csIHZtKTsgfSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyB0dXJuIGNvZGUgaW50byBmdW5jdGlvbnMKICAgIHZhciByZXMgPSB7fTsKICAgIHZhciBmbkdlbkVycm9ycyA9IFtdOwogICAgcmVzLnJlbmRlciA9IGNyZWF0ZUZ1bmN0aW9uKGNvbXBpbGVkLnJlbmRlciwgZm5HZW5FcnJvcnMpOwogICAgcmVzLnN0YXRpY1JlbmRlckZucyA9IGNvbXBpbGVkLnN0YXRpY1JlbmRlckZucy5tYXAoZnVuY3Rpb24gKGNvZGUpIHsKICAgICAgcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uKGNvZGUsIGZuR2VuRXJyb3JzKQogICAgfSk7CgogICAgLy8gY2hlY2sgZnVuY3Rpb24gZ2VuZXJhdGlvbiBlcnJvcnMuCiAgICAvLyB0aGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB0aGVyZSBpcyBhIGJ1ZyBpbiB0aGUgY29tcGlsZXIgaXRzZWxmLgogICAgLy8gbW9zdGx5IGZvciBjb2RlZ2VuIGRldmVsb3BtZW50IHVzZQogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICB7CiAgICAgIGlmICgoIWNvbXBpbGVkLmVycm9ycyB8fCAhY29tcGlsZWQuZXJyb3JzLmxlbmd0aCkgJiYgZm5HZW5FcnJvcnMubGVuZ3RoKSB7CiAgICAgICAgd2FybiQkMSgKICAgICAgICAgICJGYWlsZWQgdG8gZ2VuZXJhdGUgcmVuZGVyIGZ1bmN0aW9uOlxuXG4iICsKICAgICAgICAgIGZuR2VuRXJyb3JzLm1hcChmdW5jdGlvbiAocmVmKSB7CiAgICAgICAgICAgIHZhciBlcnIgPSByZWYuZXJyOwogICAgICAgICAgICB2YXIgY29kZSA9IHJlZi5jb2RlOwoKICAgICAgICAgICAgcmV0dXJuICgoZXJyLnRvU3RyaW5nKCkpICsgIiBpblxuXG4iICsgY29kZSArICJcbiIpOwogICAgICAgIH0pLmpvaW4oJ1xuJyksCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gKGNhY2hlW2tleV0gPSByZXMpCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUNvbXBpbGVyQ3JlYXRvciAoYmFzZUNvbXBpbGUpIHsKICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlQ29tcGlsZXIgKGJhc2VPcHRpb25zKSB7CiAgICBmdW5jdGlvbiBjb21waWxlICgKICAgICAgdGVtcGxhdGUsCiAgICAgIG9wdGlvbnMKICAgICkgewogICAgICB2YXIgZmluYWxPcHRpb25zID0gT2JqZWN0LmNyZWF0ZShiYXNlT3B0aW9ucyk7CiAgICAgIHZhciBlcnJvcnMgPSBbXTsKICAgICAgdmFyIHRpcHMgPSBbXTsKICAgICAgZmluYWxPcHRpb25zLndhcm4gPSBmdW5jdGlvbiAobXNnLCB0aXApIHsKICAgICAgICAodGlwID8gdGlwcyA6IGVycm9ycykucHVzaChtc2cpOwogICAgICB9OwoKICAgICAgaWYgKG9wdGlvbnMpIHsKICAgICAgICAvLyBtZXJnZSBjdXN0b20gbW9kdWxlcwogICAgICAgIGlmIChvcHRpb25zLm1vZHVsZXMpIHsKICAgICAgICAgIGZpbmFsT3B0aW9ucy5tb2R1bGVzID0KICAgICAgICAgICAgKGJhc2VPcHRpb25zLm1vZHVsZXMgfHwgW10pLmNvbmNhdChvcHRpb25zLm1vZHVsZXMpOwogICAgICAgIH0KICAgICAgICAvLyBtZXJnZSBjdXN0b20gZGlyZWN0aXZlcwogICAgICAgIGlmIChvcHRpb25zLmRpcmVjdGl2ZXMpIHsKICAgICAgICAgIGZpbmFsT3B0aW9ucy5kaXJlY3RpdmVzID0gZXh0ZW5kKAogICAgICAgICAgICBPYmplY3QuY3JlYXRlKGJhc2VPcHRpb25zLmRpcmVjdGl2ZXMgfHwgbnVsbCksCiAgICAgICAgICAgIG9wdGlvbnMuZGlyZWN0aXZlcwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgLy8gY29weSBvdGhlciBvcHRpb25zCiAgICAgICAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMpIHsKICAgICAgICAgIGlmIChrZXkgIT09ICdtb2R1bGVzJyAmJiBrZXkgIT09ICdkaXJlY3RpdmVzJykgewogICAgICAgICAgICBmaW5hbE9wdGlvbnNba2V5XSA9IG9wdGlvbnNba2V5XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciBjb21waWxlZCA9IGJhc2VDb21waWxlKHRlbXBsYXRlLCBmaW5hbE9wdGlvbnMpOwogICAgICB7CiAgICAgICAgZXJyb3JzLnB1c2guYXBwbHkoZXJyb3JzLCBkZXRlY3RFcnJvcnMoY29tcGlsZWQuYXN0KSk7CiAgICAgIH0KICAgICAgY29tcGlsZWQuZXJyb3JzID0gZXJyb3JzOwogICAgICBjb21waWxlZC50aXBzID0gdGlwczsKICAgICAgcmV0dXJuIGNvbXBpbGVkCiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgY29tcGlsZTogY29tcGlsZSwKICAgICAgY29tcGlsZVRvRnVuY3Rpb25zOiBjcmVhdGVDb21waWxlVG9GdW5jdGlvbkZuKGNvbXBpbGUpCiAgICB9CiAgfQp9CgovKiAgKi8KCi8vIGBjcmVhdGVDb21waWxlckNyZWF0b3JgIGFsbG93cyBjcmVhdGluZyBjb21waWxlcnMgdGhhdCB1c2UgYWx0ZXJuYXRpdmUKLy8gcGFyc2VyL29wdGltaXplci9jb2RlZ2VuLCBlLmcgdGhlIFNTUiBvcHRpbWl6aW5nIGNvbXBpbGVyLgovLyBIZXJlIHdlIGp1c3QgZXhwb3J0IGEgZGVmYXVsdCBjb21waWxlciB1c2luZyB0aGUgZGVmYXVsdCBwYXJ0cy4KdmFyIGNyZWF0ZUNvbXBpbGVyID0gY3JlYXRlQ29tcGlsZXJDcmVhdG9yKGZ1bmN0aW9uIGJhc2VDb21waWxlICgKICB0ZW1wbGF0ZSwKICBvcHRpb25zCikgewogIHZhciBhc3QgPSBwYXJzZSh0ZW1wbGF0ZS50cmltKCksIG9wdGlvbnMpOwogIGlmIChvcHRpb25zLm9wdGltaXplICE9PSBmYWxzZSkgewogICAgb3B0aW1pemUoYXN0LCBvcHRpb25zKTsKICB9CiAgdmFyIGNvZGUgPSBnZW5lcmF0ZShhc3QsIG9wdGlvbnMpOwogIHJldHVybiB7CiAgICBhc3Q6IGFzdCwKICAgIHJlbmRlcjogY29kZS5yZW5kZXIsCiAgICBzdGF0aWNSZW5kZXJGbnM6IGNvZGUuc3RhdGljUmVuZGVyRm5zCiAgfQp9KTsKCi8qICAqLwoKdmFyIHJlZiQxID0gY3JlYXRlQ29tcGlsZXIoYmFzZU9wdGlvbnMpOwp2YXIgY29tcGlsZVRvRnVuY3Rpb25zID0gcmVmJDEuY29tcGlsZVRvRnVuY3Rpb25zOwoKLyogICovCgovLyBjaGVjayB3aGV0aGVyIGN1cnJlbnQgYnJvd3NlciBlbmNvZGVzIGEgY2hhciBpbnNpZGUgYXR0cmlidXRlIHZhbHVlcwp2YXIgZGl2OwpmdW5jdGlvbiBnZXRTaG91bGREZWNvZGUgKGhyZWYpIHsKICBkaXYgPSBkaXYgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgZGl2LmlubmVySFRNTCA9IGhyZWYgPyAiPGEgaHJlZj1cIlxuXCIvPiIgOiAiPGRpdiBhPVwiXG5cIi8+IjsKICByZXR1cm4gZGl2LmlubmVySFRNTC5pbmRleE9mKCcmIzEwOycpID4gMAp9CgovLyAjMzY2MzogSUUgZW5jb2RlcyBuZXdsaW5lcyBpbnNpZGUgYXR0cmlidXRlIHZhbHVlcyB3aGlsZSBvdGhlciBicm93c2VycyBkb24ndAp2YXIgc2hvdWxkRGVjb2RlTmV3bGluZXMgPSBpbkJyb3dzZXIgPyBnZXRTaG91bGREZWNvZGUoZmFsc2UpIDogZmFsc2U7Ci8vICM2ODI4OiBjaHJvbWUgZW5jb2RlcyBjb250ZW50IGluIGFbaHJlZl0KdmFyIHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZiA9IGluQnJvd3NlciA/IGdldFNob3VsZERlY29kZSh0cnVlKSA6IGZhbHNlOwoKLyogICovCgp2YXIgaWRUb1RlbXBsYXRlID0gY2FjaGVkKGZ1bmN0aW9uIChpZCkgewogIHZhciBlbCA9IHF1ZXJ5KGlkKTsKICByZXR1cm4gZWwgJiYgZWwuaW5uZXJIVE1MCn0pOwoKdmFyIG1vdW50ID0gVnVlLnByb3RvdHlwZS4kbW91bnQ7ClZ1ZS5wcm90b3R5cGUuJG1vdW50ID0gZnVuY3Rpb24gKAogIGVsLAogIGh5ZHJhdGluZwopIHsKICBlbCA9IGVsICYmIHF1ZXJ5KGVsKTsKCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGVsID09PSBkb2N1bWVudC5ib2R5IHx8IGVsID09PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHsKICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAiRG8gbm90IG1vdW50IFZ1ZSB0byA8aHRtbD4gb3IgPGJvZHk+IC0gbW91bnQgdG8gbm9ybWFsIGVsZW1lbnRzIGluc3RlYWQuIgogICAgKTsKICAgIHJldHVybiB0aGlzCiAgfQoKICB2YXIgb3B0aW9ucyA9IHRoaXMuJG9wdGlvbnM7CiAgLy8gcmVzb2x2ZSB0ZW1wbGF0ZS9lbCBhbmQgY29udmVydCB0byByZW5kZXIgZnVuY3Rpb24KICBpZiAoIW9wdGlvbnMucmVuZGVyKSB7CiAgICB2YXIgdGVtcGxhdGUgPSBvcHRpb25zLnRlbXBsYXRlOwogICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgaWYgKHRlbXBsYXRlLmNoYXJBdCgwKSA9PT0gJyMnKSB7CiAgICAgICAgICB0ZW1wbGF0ZSA9IGlkVG9UZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgIXRlbXBsYXRlKSB7CiAgICAgICAgICAgIHdhcm4oCiAgICAgICAgICAgICAgKCJUZW1wbGF0ZSBlbGVtZW50IG5vdCBmb3VuZCBvciBpcyBlbXB0eTogIiArIChvcHRpb25zLnRlbXBsYXRlKSksCiAgICAgICAgICAgICAgdGhpcwogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0ZW1wbGF0ZS5ub2RlVHlwZSkgewogICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUuaW5uZXJIVE1MOwogICAgICB9IGVsc2UgewogICAgICAgIHsKICAgICAgICAgIHdhcm4oJ2ludmFsaWQgdGVtcGxhdGUgb3B0aW9uOicgKyB0ZW1wbGF0ZSwgdGhpcyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzCiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWwpIHsKICAgICAgdGVtcGxhdGUgPSBnZXRPdXRlckhUTUwoZWwpOwogICAgfQogICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNvbmZpZy5wZXJmb3JtYW5jZSAmJiBtYXJrKSB7CiAgICAgICAgbWFyaygnY29tcGlsZScpOwogICAgICB9CgogICAgICB2YXIgcmVmID0gY29tcGlsZVRvRnVuY3Rpb25zKHRlbXBsYXRlLCB7CiAgICAgICAgc2hvdWxkRGVjb2RlTmV3bGluZXM6IHNob3VsZERlY29kZU5ld2xpbmVzLAogICAgICAgIHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjogc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmLAogICAgICAgIGRlbGltaXRlcnM6IG9wdGlvbnMuZGVsaW1pdGVycywKICAgICAgICBjb21tZW50czogb3B0aW9ucy5jb21tZW50cwogICAgICB9LCB0aGlzKTsKICAgICAgdmFyIHJlbmRlciA9IHJlZi5yZW5kZXI7CiAgICAgIHZhciBzdGF0aWNSZW5kZXJGbnMgPSByZWYuc3RhdGljUmVuZGVyRm5zOwogICAgICBvcHRpb25zLnJlbmRlciA9IHJlbmRlcjsKICAgICAgb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBzdGF0aWNSZW5kZXJGbnM7CgogICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjb25maWcucGVyZm9ybWFuY2UgJiYgbWFyaykgewogICAgICAgIG1hcmsoJ2NvbXBpbGUgZW5kJyk7CiAgICAgICAgbWVhc3VyZSgoInZ1ZSAiICsgKHRoaXMuX25hbWUpICsgIiBjb21waWxlIiksICdjb21waWxlJywgJ2NvbXBpbGUgZW5kJyk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIG1vdW50LmNhbGwodGhpcywgZWwsIGh5ZHJhdGluZykKfTsKCi8qKgogKiBHZXQgb3V0ZXJIVE1MIG9mIGVsZW1lbnRzLCB0YWtpbmcgY2FyZQogKiBvZiBTVkcgZWxlbWVudHMgaW4gSUUgYXMgd2VsbC4KICovCmZ1bmN0aW9uIGdldE91dGVySFRNTCAoZWwpIHsKICBpZiAoZWwub3V0ZXJIVE1MKSB7CiAgICByZXR1cm4gZWwub3V0ZXJIVE1MCiAgfSBlbHNlIHsKICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbC5jbG9uZU5vZGUodHJ1ZSkpOwogICAgcmV0dXJuIGNvbnRhaW5lci5pbm5lckhUTUwKICB9Cn0KClZ1ZS5jb21waWxlID0gY29tcGlsZVRvRnVuY3Rpb25zOwoKcmV0dXJuIFZ1ZTsKCn0pKSk7Cg==" >


<!--		<script type="text/javascript" src="/jquery-3.3.1.js" > -->
<!--		<script type="text/javascript" src="/jquery-3.3.1.js" > -->
		<script type="text/javascript" src="data:/text/plain;base64,LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuMy4xCiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiAyMDE4LTAxLTIwVDE3OjI0WgogKi8KKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkgewoKCSJ1c2Ugc3RyaWN0IjsKCglpZiAoIHR5cGVvZiBtb2R1bGUgPT09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gIm9iamVjdCIgKSB7CgoJCS8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgd2hlcmUgYSBwcm9wZXIgYHdpbmRvd2AKCQkvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LgoJCS8vIEZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIGB3aW5kb3dgIHdpdGggYSBgZG9jdW1lbnRgCgkJLy8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMuCgkJLy8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC4KCQkvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKCJqcXVlcnkiKSh3aW5kb3cpOwoJCS8vIFNlZSB0aWNrZXQgIzE0NTQ5IGZvciBtb3JlIGluZm8uCgkJbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuZG9jdW1lbnQgPwoJCQlmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6CgkJCWZ1bmN0aW9uKCB3ICkgewoJCQkJaWYgKCAhdy5kb2N1bWVudCApIHsKCQkJCQl0aHJvdyBuZXcgRXJyb3IoICJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50IiApOwoJCQkJfQoJCQkJcmV0dXJuIGZhY3RvcnkoIHcgKTsKCQkJfTsKCX0gZWxzZSB7CgkJZmFjdG9yeSggZ2xvYmFsICk7Cgl9CgovLyBQYXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldAp9ICkoIHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oIHdpbmRvdywgbm9HbG9iYWwgKSB7CgovLyBFZGdlIDw9IDEyIC0gMTMrLCBGaXJlZm94IDw9MTggLSA0NSssIElFIDEwIC0gMTEsIFNhZmFyaSA1LjEgLSA5KywgaU9TIDYgLSA5LjEKLy8gdGhyb3cgZXhjZXB0aW9ucyB3aGVuIG5vbi1zdHJpY3QgY29kZSAoZS5nLiwgQVNQLk5FVCA0LjUpIGFjY2Vzc2VzIHN0cmljdCBtb2RlCi8vIGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyICh0cmFjLTEzMzM1KS4gQnV0IGFzIG9mIGpRdWVyeSAzLjAgKDIwMTYpLCBzdHJpY3QgbW9kZSBzaG91bGQgYmUgY29tbW9uCi8vIGVub3VnaCB0aGF0IGFsbCBzdWNoIGF0dGVtcHRzIGFyZSBndWFyZGVkIGluIGEgdHJ5IGJsb2NrLgoidXNlIHN0cmljdCI7Cgp2YXIgYXJyID0gW107Cgp2YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7Cgp2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7Cgp2YXIgc2xpY2UgPSBhcnIuc2xpY2U7Cgp2YXIgY29uY2F0ID0gYXJyLmNvbmNhdDsKCnZhciBwdXNoID0gYXJyLnB1c2g7Cgp2YXIgaW5kZXhPZiA9IGFyci5pbmRleE9mOwoKdmFyIGNsYXNzMnR5cGUgPSB7fTsKCnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7Cgp2YXIgaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eTsKCnZhciBmblRvU3RyaW5nID0gaGFzT3duLnRvU3RyaW5nOwoKdmFyIE9iamVjdEZ1bmN0aW9uU3RyaW5nID0gZm5Ub1N0cmluZy5jYWxsKCBPYmplY3QgKTsKCnZhciBzdXBwb3J0ID0ge307Cgp2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24oIG9iaiApIHsKCiAgICAgIC8vIFN1cHBvcnQ6IENocm9tZSA8PTU3LCBGaXJlZm94IDw9NTIKICAgICAgLy8gSW4gc29tZSBicm93c2VycywgdHlwZW9mIHJldHVybnMgImZ1bmN0aW9uIiBmb3IgSFRNTCA8b2JqZWN0PiBlbGVtZW50cwogICAgICAvLyAoaS5lLiwgYHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAib2JqZWN0IiApID09PSAiZnVuY3Rpb24iYCkuCiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gY2xhc3NpZnkgKmFueSogRE9NIG5vZGUgYXMgYSBmdW5jdGlvbi4KICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIG9iai5ub2RlVHlwZSAhPT0gIm51bWJlciI7CiAgfTsKCgp2YXIgaXNXaW5kb3cgPSBmdW5jdGlvbiBpc1dpbmRvdyggb2JqICkgewoJCXJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7Cgl9OwoKCgoKCXZhciBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzID0gewoJCXR5cGU6IHRydWUsCgkJc3JjOiB0cnVlLAoJCW5vTW9kdWxlOiB0cnVlCgl9OwoKCWZ1bmN0aW9uIERPTUV2YWwoIGNvZGUsIGRvYywgbm9kZSApIHsKCQlkb2MgPSBkb2MgfHwgZG9jdW1lbnQ7CgoJCXZhciBpLAoJCQlzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudCggInNjcmlwdCIgKTsKCgkJc2NyaXB0LnRleHQgPSBjb2RlOwoJCWlmICggbm9kZSApIHsKCQkJZm9yICggaSBpbiBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzICkgewoJCQkJaWYgKCBub2RlWyBpIF0gKSB7CgkJCQkJc2NyaXB0WyBpIF0gPSBub2RlWyBpIF07CgkJCQl9CgkJCX0KCQl9CgkJZG9jLmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwoJfQoKCmZ1bmN0aW9uIHRvVHlwZSggb2JqICkgewoJaWYgKCBvYmogPT0gbnVsbCApIHsKCQlyZXR1cm4gb2JqICsgIiI7Cgl9CgoJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTIuMyBvbmx5IChmdW5jdGlvbmlzaCBSZWdFeHApCglyZXR1cm4gdHlwZW9mIG9iaiA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIG9iaiA9PT0gImZ1bmN0aW9uIiA/CgkJY2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbCggb2JqICkgXSB8fCAib2JqZWN0IiA6CgkJdHlwZW9mIG9iajsKfQovKiBnbG9iYWwgU3ltYm9sICovCi8vIERlZmluaW5nIHRoaXMgZ2xvYmFsIGluIC5lc2xpbnRyYy5qc29uIHdvdWxkIGNyZWF0ZSBhIGRhbmdlciBvZiB1c2luZyB0aGUgZ2xvYmFsCi8vIHVuZ3VhcmRlZCBpbiBhbm90aGVyIHBsYWNlLCBpdCBzZWVtcyBzYWZlciB0byBkZWZpbmUgZ2xvYmFsIG9ubHkgZm9yIHRoaXMgbW9kdWxlCgoKCnZhcgoJdmVyc2lvbiA9ICIzLjMuMSIsCgoJLy8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnkKCWpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKCgkJLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnCgkJLy8gTmVlZCBpbml0IGlmIGpRdWVyeSBpcyBjYWxsZWQgKGp1c3QgYWxsb3cgZXJyb3IgdG8gYmUgdGhyb3duIGlmIG5vdCBpbmNsdWRlZCkKCQlyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApOwoJfSwKCgkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHkKCS8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUAoJcnRyaW0gPSAvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7CgpqUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0gewoKCS8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKCWpxdWVyeTogdmVyc2lvbiwKCgljb25zdHJ1Y3RvcjogalF1ZXJ5LAoKCS8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMgMAoJbGVuZ3RoOiAwLAoKCXRvQXJyYXk6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7Cgl9LAoKCS8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1IKCS8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5CglnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7CgoJCS8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGluIGEgY2xlYW4gYXJyYXkKCQlpZiAoIG51bSA9PSBudWxsICkgewoJCQlyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApOwoJCX0KCgkJLy8gUmV0dXJuIGp1c3QgdGhlIG9uZSBlbGVtZW50IGZyb20gdGhlIHNldAoJCXJldHVybiBudW0gPCAwID8gdGhpc1sgbnVtICsgdGhpcy5sZW5ndGggXSA6IHRoaXNbIG51bSBdOwoJfSwKCgkvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrCgkvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldCkKCXB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkgewoKCQkvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldAoJCXZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTsKCgkJLy8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSkKCQlyZXQucHJldk9iamVjdCA9IHRoaXM7CgoJCS8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0CgkJcmV0dXJuIHJldDsKCX0sCgoJLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4KCWVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKCQlyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrICk7Cgl9LAoKCW1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCggdGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJCXJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CgkJfSApICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSApOwoJfSwKCglmaXJzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIDAgKTsKCX0sCgoJbGFzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIC0xICk7Cgl9LAoKCWVxOiBmdW5jdGlvbiggaSApIHsKCQl2YXIgbGVuID0gdGhpcy5sZW5ndGgsCgkJCWogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1sgaiBdIF0gOiBbXSApOwoJfSwKCgllbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcigpOwoJfSwKCgkvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCgkvLyBCZWhhdmVzIGxpa2UgYW4gQXJyYXkncyBtZXRob2QsIG5vdCBsaWtlIGEgalF1ZXJ5IG1ldGhvZC4KCXB1c2g6IHB1c2gsCglzb3J0OiBhcnIuc29ydCwKCXNwbGljZTogYXJyLnNwbGljZQp9OwoKalF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHsKCXZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSwKCQl0YXJnZXQgPSBhcmd1bWVudHNbIDAgXSB8fCB7fSwKCQlpID0gMSwKCQlsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLAoJCWRlZXAgPSBmYWxzZTsKCgkvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uCglpZiAoIHR5cGVvZiB0YXJnZXQgPT09ICJib29sZWFuIiApIHsKCQlkZWVwID0gdGFyZ2V0OwoKCQkvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0CgkJdGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307CgkJaSsrOwoJfQoKCS8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQoJaWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiAhaXNGdW5jdGlvbiggdGFyZ2V0ICkgKSB7CgkJdGFyZ2V0ID0ge307Cgl9CgoJLy8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGkgPT09IGxlbmd0aCApIHsKCQl0YXJnZXQgPSB0aGlzOwoJCWktLTsKCX0KCglmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCgkJLy8gT25seSBkZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlcwoJCWlmICggKCBvcHRpb25zID0gYXJndW1lbnRzWyBpIF0gKSAhPSBudWxsICkgewoKCQkJLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdAoJCQlmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CgkJCQlzcmMgPSB0YXJnZXRbIG5hbWUgXTsKCQkJCWNvcHkgPSBvcHRpb25zWyBuYW1lIF07CgoJCQkJLy8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcAoJCQkJaWYgKCB0YXJnZXQgPT09IGNvcHkgKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJLy8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzCgkJCQlpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb3B5ICkgfHwKCQkJCQkoIGNvcHlJc0FycmF5ID0gQXJyYXkuaXNBcnJheSggY29weSApICkgKSApIHsKCgkJCQkJaWYgKCBjb3B5SXNBcnJheSApIHsKCQkJCQkJY29weUlzQXJyYXkgPSBmYWxzZTsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgQXJyYXkuaXNBcnJheSggc3JjICkgPyBzcmMgOiBbXTsKCgkJCQkJfSBlbHNlIHsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHNyYyApID8gc3JjIDoge307CgkJCQkJfQoKCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CgoJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcwoJCQkJfSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXRhcmdldFsgbmFtZSBdID0gY29weTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAoJcmV0dXJuIHRhcmdldDsKfTsKCmpRdWVyeS5leHRlbmQoIHsKCgkvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2UKCWV4cGFuZG86ICJqUXVlcnkiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cRC9nLCAiIiApLAoKCS8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlCglpc1JlYWR5OiB0cnVlLAoKCWVycm9yOiBmdW5jdGlvbiggbXNnICkgewoJCXRocm93IG5ldyBFcnJvciggbXNnICk7Cgl9LAoKCW5vb3A6IGZ1bmN0aW9uKCkge30sCgoJaXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCQl2YXIgcHJvdG8sIEN0b3I7CgoJCS8vIERldGVjdCBvYnZpb3VzIG5lZ2F0aXZlcwoJCS8vIFVzZSB0b1N0cmluZyBpbnN0ZWFkIG9mIGpRdWVyeS50eXBlIHRvIGNhdGNoIGhvc3Qgb2JqZWN0cwoJCWlmICggIW9iaiB8fCB0b1N0cmluZy5jYWxsKCBvYmogKSAhPT0gIltvYmplY3QgT2JqZWN0XSIgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXByb3RvID0gZ2V0UHJvdG8oIG9iaiApOwoKCQkvLyBPYmplY3RzIHdpdGggbm8gcHJvdG90eXBlIChlLmcuLCBgT2JqZWN0LmNyZWF0ZSggbnVsbCApYCkgYXJlIHBsYWluCgkJaWYgKCAhcHJvdG8gKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCgkJLy8gT2JqZWN0cyB3aXRoIHByb3RvdHlwZSBhcmUgcGxhaW4gaWZmIHRoZXkgd2VyZSBjb25zdHJ1Y3RlZCBieSBhIGdsb2JhbCBPYmplY3QgZnVuY3Rpb24KCQlDdG9yID0gaGFzT3duLmNhbGwoIHByb3RvLCAiY29uc3RydWN0b3IiICkgJiYgcHJvdG8uY29uc3RydWN0b3I7CgkJcmV0dXJuIHR5cGVvZiBDdG9yID09PSAiZnVuY3Rpb24iICYmIGZuVG9TdHJpbmcuY2FsbCggQ3RvciApID09PSBPYmplY3RGdW5jdGlvblN0cmluZzsKCX0sCgoJaXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCgkJLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KCQkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvaXNzdWVzLzYxMjUKCQl2YXIgbmFtZTsKCgkJZm9yICggbmFtZSBpbiBvYmogKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuIHRydWU7Cgl9LAoKCS8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0CglnbG9iYWxFdmFsOiBmdW5jdGlvbiggY29kZSApIHsKCQlET01FdmFsKCBjb2RlICk7Cgl9LAoKCWVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkgewoJCXZhciBsZW5ndGgsIGkgPSAwOwoKCQlpZiAoIGlzQXJyYXlMaWtlKCBvYmogKSApIHsKCQkJbGVuZ3RoID0gb2JqLmxlbmd0aDsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQlpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCWZvciAoIGkgaW4gb2JqICkgewoJCQkJaWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBvYmo7Cgl9LAoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seQoJdHJpbTogZnVuY3Rpb24oIHRleHQgKSB7CgkJcmV0dXJuIHRleHQgPT0gbnVsbCA/CgkJCSIiIDoKCQkJKCB0ZXh0ICsgIiIgKS5yZXBsYWNlKCBydHJpbSwgIiIgKTsKCX0sCgoJLy8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQoJbWFrZUFycmF5OiBmdW5jdGlvbiggYXJyLCByZXN1bHRzICkgewoJCXZhciByZXQgPSByZXN1bHRzIHx8IFtdOwoKCQlpZiAoIGFyciAhPSBudWxsICkgewoJCQlpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7CgkJCQlqUXVlcnkubWVyZ2UoIHJldCwKCQkJCQl0eXBlb2YgYXJyID09PSAic3RyaW5nIiA/CgkJCQkJWyBhcnIgXSA6IGFycgoJCQkJKTsKCQkJfSBlbHNlIHsKCQkJCXB1c2guY2FsbCggcmV0LCBhcnIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJaW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHsKCQlyZXR1cm4gYXJyID09IG51bGwgPyAtMSA6IGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7Cgl9LAoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seQoJLy8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdAoJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgewoJCXZhciBsZW4gPSArc2Vjb25kLmxlbmd0aCwKCQkJaiA9IDAsCgkJCWkgPSBmaXJzdC5sZW5ndGg7CgoJCWZvciAoIDsgaiA8IGxlbjsgaisrICkgewoJCQlmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTsKCQl9CgoJCWZpcnN0Lmxlbmd0aCA9IGk7CgoJCXJldHVybiBmaXJzdDsKCX0sCgoJZ3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkgewoJCXZhciBjYWxsYmFja0ludmVyc2UsCgkJCW1hdGNoZXMgPSBbXSwKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aCwKCQkJY2FsbGJhY2tFeHBlY3QgPSAhaW52ZXJ0OwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zCgkJLy8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24KCQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJY2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CgkJCWlmICggY2FsbGJhY2tJbnZlcnNlICE9PSBjYWxsYmFja0V4cGVjdCApIHsKCQkJCW1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApOwoJCQl9CgkJfQoKCQlyZXR1cm4gbWF0Y2hlczsKCX0sCgoJLy8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CgltYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHsKCQl2YXIgbGVuZ3RoLCB2YWx1ZSwKCQkJaSA9IDAsCgkJCXJldCA9IFtdOwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlcwoJCWlmICggaXNBcnJheUxpa2UoIGVsZW1zICkgKSB7CgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aDsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQl2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTsKCgkJCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7CgkJCQkJcmV0LnB1c2goIHZhbHVlICk7CgkJCQl9CgkJCX0KCgkJLy8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCwKCQl9IGVsc2UgewoJCQlmb3IgKCBpIGluIGVsZW1zICkgewoJCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CgoJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewoJCQkJCXJldC5wdXNoKCB2YWx1ZSApOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzCgkJcmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApOwoJfSwKCgkvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHMKCWd1aWQ6IDEsCgoJLy8galF1ZXJ5LnN1cHBvcnQgaXMgbm90IHVzZWQgaW4gQ29yZSBidXQgb3RoZXIgcHJvamVjdHMgYXR0YWNoIHRoZWlyCgkvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LgoJc3VwcG9ydDogc3VwcG9ydAp9ICk7CgppZiAoIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgKSB7CglqUXVlcnkuZm5bIFN5bWJvbC5pdGVyYXRvciBdID0gYXJyWyBTeW1ib2wuaXRlcmF0b3IgXTsKfQoKLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwCmpRdWVyeS5lYWNoKCAiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCAiICIgKSwKZnVuY3Rpb24oIGksIG5hbWUgKSB7CgljbGFzczJ0eXBlWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpOwp9ICk7CgpmdW5jdGlvbiBpc0FycmF5TGlrZSggb2JqICkgewoKCS8vIFN1cHBvcnQ6IHJlYWwgaU9TIDguMiBvbmx5IChub3QgcmVwcm9kdWNpYmxlIGluIHNpbXVsYXRvcikKCS8vIGBpbmAgY2hlY2sgdXNlZCB0byBwcmV2ZW50IEpJVCBlcnJvciAoZ2gtMjE0NSkKCS8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlcwoJLy8gcmVnYXJkaW5nIE5vZGVsaXN0IGxlbmd0aCBpbiBJRQoJdmFyIGxlbmd0aCA9ICEhb2JqICYmICJsZW5ndGgiIGluIG9iaiAmJiBvYmoubGVuZ3RoLAoJCXR5cGUgPSB0b1R5cGUoIG9iaiApOwoKCWlmICggaXNGdW5jdGlvbiggb2JqICkgfHwgaXNXaW5kb3coIG9iaiApICkgewoJCXJldHVybiBmYWxzZTsKCX0KCglyZXR1cm4gdHlwZSA9PT0gImFycmF5IiB8fCBsZW5ndGggPT09IDAgfHwKCQl0eXBlb2YgbGVuZ3RoID09PSAibnVtYmVyIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajsKfQp2YXIgU2l6emxlID0KLyohCiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIHYyLjMuMwogKiBodHRwczovL3NpenpsZWpzLmNvbS8KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogRGF0ZTogMjAxNi0wOC0wOAogKi8KKGZ1bmN0aW9uKCB3aW5kb3cgKSB7Cgp2YXIgaSwKCXN1cHBvcnQsCglFeHByLAoJZ2V0VGV4dCwKCWlzWE1MLAoJdG9rZW5pemUsCgljb21waWxlLAoJc2VsZWN0LAoJb3V0ZXJtb3N0Q29udGV4dCwKCXNvcnRJbnB1dCwKCWhhc0R1cGxpY2F0ZSwKCgkvLyBMb2NhbCBkb2N1bWVudCB2YXJzCglzZXREb2N1bWVudCwKCWRvY3VtZW50LAoJZG9jRWxlbSwKCWRvY3VtZW50SXNIVE1MLAoJcmJ1Z2d5UVNBLAoJcmJ1Z2d5TWF0Y2hlcywKCW1hdGNoZXMsCgljb250YWlucywKCgkvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhCglleHBhbmRvID0gInNpenpsZSIgKyAxICogbmV3IERhdGUoKSwKCXByZWZlcnJlZERvYyA9IHdpbmRvdy5kb2N1bWVudCwKCWRpcnJ1bnMgPSAwLAoJZG9uZSA9IDAsCgljbGFzc0NhY2hlID0gY3JlYXRlQ2FjaGUoKSwKCXRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAoJY29tcGlsZXJDYWNoZSA9IGNyZWF0ZUNhY2hlKCksCglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlpZiAoIGEgPT09IGIgKSB7CgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CgkJfQoJCXJldHVybiAwOwoJfSwKCgkvLyBJbnN0YW5jZSBtZXRob2RzCgloYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LAoJYXJyID0gW10sCglwb3AgPSBhcnIucG9wLAoJcHVzaF9uYXRpdmUgPSBhcnIucHVzaCwKCXB1c2ggPSBhcnIucHVzaCwKCXNsaWNlID0gYXJyLnNsaWNlLAoJLy8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlCgkvLyBodHRwczovL2pzcGVyZi5jb20vdGhvci1pbmRleG9mLXZzLWZvci81CglpbmRleE9mID0gZnVuY3Rpb24oIGxpc3QsIGVsZW0gKSB7CgkJdmFyIGkgPSAwLAoJCQlsZW4gPSBsaXN0Lmxlbmd0aDsKCQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQkJaWYgKCBsaXN0W2ldID09PSBlbGVtICkgewoJCQkJcmV0dXJuIGk7CgkJCX0KCQl9CgkJcmV0dXJuIC0xOwoJfSwKCglib29sZWFucyA9ICJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsCgoJLy8gUmVndWxhciBleHByZXNzaW9ucwoKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyN3aGl0ZXNwYWNlCgl3aGl0ZXNwYWNlID0gIltcXHgyMFxcdFxcclxcblxcZl0iLAoKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllcgoJaWRlbnRpZmllciA9ICIoPzpcXFxcLnxbXFx3LV18W15cMC1cXHhhMF0pKyIsCgoJLy8gQXR0cmlidXRlIHNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzCglhdHRyaWJ1dGVzID0gIlxcWyIgKyB3aGl0ZXNwYWNlICsgIiooIiArIGlkZW50aWZpZXIgKyAiKSg/OiIgKyB3aGl0ZXNwYWNlICsKCQkvLyBPcGVyYXRvciAoY2FwdHVyZSAyKQoJCSIqKFsqXiR8IX5dPz0pIiArIHdoaXRlc3BhY2UgKwoJCS8vICJBdHRyaWJ1dGUgdmFsdWVzIG11c3QgYmUgQ1NTIGlkZW50aWZpZXJzIFtjYXB0dXJlIDVdIG9yIHN0cmluZ3MgW2NhcHR1cmUgMyBvciBjYXB0dXJlIDRdIgoJCSIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIgKyBpZGVudGlmaWVyICsgIikpfCkiICsgd2hpdGVzcGFjZSArCgkJIipcXF0iLAoKCXBzZXVkb3MgPSAiOigiICsgaWRlbnRpZmllciArICIpKD86XFwoKCIgKwoJCS8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6CgkJLy8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpCgkJIignKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8IiArCgkJLy8gMi4gc2ltcGxlIChjYXB0dXJlIDYpCgkJIigoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIgKyBhdHRyaWJ1dGVzICsgIikqKXwiICsKCQkvLyAzLiBhbnl0aGluZyBlbHNlIChjYXB0dXJlIDIpCgkJIi4qIiArCgkJIilcXCl8KSIsCgoJLy8gTGVhZGluZyBhbmQgbm9uLWVzY2FwZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgY2FwdHVyaW5nIHNvbWUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBwcmVjZWRpbmcgdGhlIGxhdHRlcgoJcndoaXRlc3BhY2UgPSBuZXcgUmVnRXhwKCB3aGl0ZXNwYWNlICsgIisiLCAiZyIgKSwKCXJ0cmltID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiICsgd2hpdGVzcGFjZSArICIrJCIsICJnIiApLAoKCXJjb21tYSA9IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKiwiICsgd2hpdGVzcGFjZSArICIqIiApLAoJcmNvbWJpbmF0b3JzID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqKFs+K35dfCIgKyB3aGl0ZXNwYWNlICsgIikiICsgd2hpdGVzcGFjZSArICIqIiApLAoKCXJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCAiPSIgKyB3aGl0ZXNwYWNlICsgIiooW15cXF0nXCJdKj8pIiArIHdoaXRlc3BhY2UgKyAiKlxcXSIsICJnIiApLAoKCXJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksCglyaWRlbnRpZmllciA9IG5ldyBSZWdFeHAoICJeIiArIGlkZW50aWZpZXIgKyAiJCIgKSwKCgltYXRjaEV4cHIgPSB7CgkJIklEIjogbmV3IFJlZ0V4cCggIl4jKCIgKyBpZGVudGlmaWVyICsgIikiICksCgkJIkNMQVNTIjogbmV3IFJlZ0V4cCggIl5cXC4oIiArIGlkZW50aWZpZXIgKyAiKSIgKSwKCQkiVEFHIjogbmV3IFJlZ0V4cCggIl4oIiArIGlkZW50aWZpZXIgKyAifFsqXSkiICksCgkJIkFUVFIiOiBuZXcgUmVnRXhwKCAiXiIgKyBhdHRyaWJ1dGVzICksCgkJIlBTRVVETyI6IG5ldyBSZWdFeHAoICJeIiArIHBzZXVkb3MgKSwKCQkiQ0hJTEQiOiBuZXcgUmVnRXhwKCAiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIiArIHdoaXRlc3BhY2UgKwoJCQkiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyB3aGl0ZXNwYWNlICsgIiooPzooWystXXwpIiArIHdoaXRlc3BhY2UgKwoJCQkiKihcXGQrKXwpKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSIsICJpIiApLAoJCSJib29sIjogbmV3IFJlZ0V4cCggIl4oPzoiICsgYm9vbGVhbnMgKyAiKSQiLCAiaSIgKSwKCQkvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKCkKCQkvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgCgkJIm5lZWRzQ29udGV4dCI6IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIiArCgkJCXdoaXRlc3BhY2UgKyAiKigoPzotXFxkKT9cXGQqKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSg/PVteLV18JCkiLCAiaSIgKQoJfSwKCglyaW5wdXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKCXJoZWFkZXIgPSAvXmhcZCQvaSwKCglybmF0aXZlID0gL15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLAoKCS8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9ycwoJcnF1aWNrRXhwciA9IC9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sCgoJcnNpYmxpbmcgPSAvWyt+XS8sCgoJLy8gQ1NTIGVzY2FwZXMKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnMKCXJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoICJcXFxcKFtcXGRhLWZdezEsNn0iICsgd2hpdGVzcGFjZSArICI/fCgiICsgd2hpdGVzcGFjZSArICIpfC4pIiwgImlnIiApLAoJZnVuZXNjYXBlID0gZnVuY3Rpb24oIF8sIGVzY2FwZWQsIGVzY2FwZWRXaGl0ZXNwYWNlICkgewoJCXZhciBoaWdoID0gIjB4IiArIGVzY2FwZWQgLSAweDEwMDAwOwoJCS8vIE5hTiBtZWFucyBub24tY29kZXBvaW50CgkJLy8gU3VwcG9ydDogRmlyZWZveDwyNAoJCS8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgKyIweCIKCQlyZXR1cm4gaGlnaCAhPT0gaGlnaCB8fCBlc2NhcGVkV2hpdGVzcGFjZSA/CgkJCWVzY2FwZWQgOgoJCQloaWdoIDwgMCA/CgkJCQkvLyBCTVAgY29kZXBvaW50CgkJCQlTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDoKCQkJCS8vIFN1cHBsZW1lbnRhbCBQbGFuZSBjb2RlcG9pbnQgKHN1cnJvZ2F0ZSBwYWlyKQoJCQkJU3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7Cgl9LAoKCS8vIENTUyBzdHJpbmcvaWRlbnRpZmllciBzZXJpYWxpemF0aW9uCgkvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI2NvbW1vbi1zZXJpYWxpemluZy1pZGlvbXMKCXJjc3Nlc2NhcGUgPSAvKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZywKCWZjc3Nlc2NhcGUgPSBmdW5jdGlvbiggY2gsIGFzQ29kZVBvaW50ICkgewoJCWlmICggYXNDb2RlUG9pbnQgKSB7CgoJCQkvLyBVKzAwMDAgTlVMTCBiZWNvbWVzIFUrRkZGRCBSRVBMQUNFTUVOVCBDSEFSQUNURVIKCQkJaWYgKCBjaCA9PT0gIlwwIiApIHsKCQkJCXJldHVybiAiXHVGRkZEIjsKCQkJfQoKCQkJLy8gQ29udHJvbCBjaGFyYWN0ZXJzIGFuZCAoZGVwZW5kZW50IHVwb24gcG9zaXRpb24pIG51bWJlcnMgZ2V0IGVzY2FwZWQgYXMgY29kZSBwb2ludHMKCQkJcmV0dXJuIGNoLnNsaWNlKCAwLCAtMSApICsgIlxcIiArIGNoLmNoYXJDb2RlQXQoIGNoLmxlbmd0aCAtIDEgKS50b1N0cmluZyggMTYgKSArICIgIjsKCQl9CgoJCS8vIE90aGVyIHBvdGVudGlhbGx5LXNwZWNpYWwgQVNDSUkgY2hhcmFjdGVycyBnZXQgYmFja3NsYXNoLWVzY2FwZWQKCQlyZXR1cm4gIlxcIiArIGNoOwoJfSwKCgkvLyBVc2VkIGZvciBpZnJhbWVzCgkvLyBTZWUgc2V0RG9jdW1lbnQoKQoJLy8gUmVtb3ZpbmcgdGhlIGZ1bmN0aW9uIHdyYXBwZXIgY2F1c2VzIGEgIlBlcm1pc3Npb24gRGVuaWVkIgoJLy8gZXJyb3IgaW4gSUUKCXVubG9hZEhhbmRsZXIgPSBmdW5jdGlvbigpIHsKCQlzZXREb2N1bWVudCgpOwoJfSwKCglkaXNhYmxlZEFuY2VzdG9yID0gYWRkQ29tYmluYXRvcigKCQlmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWUgJiYgKCJmb3JtIiBpbiBlbGVtIHx8ICJsYWJlbCIgaW4gZWxlbSk7CgkJfSwKCQl7IGRpcjogInBhcmVudE5vZGUiLCBuZXh0OiAibGVnZW5kIiB9CgkpOwoKLy8gT3B0aW1pemUgZm9yIHB1c2guYXBwbHkoIF8sIE5vZGVMaXN0ICkKdHJ5IHsKCXB1c2guYXBwbHkoCgkJKGFyciA9IHNsaWNlLmNhbGwoIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzICkpLAoJCXByZWZlcnJlZERvYy5jaGlsZE5vZGVzCgkpOwoJLy8gU3VwcG9ydDogQW5kcm9pZDw0LjAKCS8vIERldGVjdCBzaWxlbnRseSBmYWlsaW5nIHB1c2guYXBwbHkKCWFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7Cn0gY2F0Y2ggKCBlICkgewoJcHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggPwoKCQkvLyBMZXZlcmFnZSBzbGljZSBpZiBwb3NzaWJsZQoJCWZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHsKCQkJcHVzaF9uYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbChlbHMpICk7CgkJfSA6CgoJCS8vIFN1cHBvcnQ6IElFPDkKCQkvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5CgkJZnVuY3Rpb24oIHRhcmdldCwgZWxzICkgewoJCQl2YXIgaiA9IHRhcmdldC5sZW5ndGgsCgkJCQlpID0gMDsKCQkJLy8gQ2FuJ3QgdHJ1c3QgTm9kZUxpc3QubGVuZ3RoCgkJCXdoaWxlICggKHRhcmdldFtqKytdID0gZWxzW2krK10pICkge30KCQkJdGFyZ2V0Lmxlbmd0aCA9IGogLSAxOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7Cgl2YXIgbSwgaSwgZWxlbSwgbmlkLCBtYXRjaCwgZ3JvdXBzLCBuZXdTZWxlY3RvciwKCQluZXdDb250ZXh0ID0gY29udGV4dCAmJiBjb250ZXh0Lm93bmVyRG9jdW1lbnQsCgoJCS8vIG5vZGVUeXBlIGRlZmF1bHRzIHRvIDksIHNpbmNlIGNvbnRleHQgZGVmYXVsdHMgdG8gZG9jdW1lbnQKCQlub2RlVHlwZSA9IGNvbnRleHQgPyBjb250ZXh0Lm5vZGVUeXBlIDogOTsKCglyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTsKCgkvLyBSZXR1cm4gZWFybHkgZnJvbSBjYWxscyB3aXRoIGludmFsaWQgc2VsZWN0b3Igb3IgY29udGV4dAoJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciIHx8ICFzZWxlY3RvciB8fAoJCW5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHsKCgkJcmV0dXJuIHJlc3VsdHM7Cgl9CgoJLy8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50cwoJaWYgKCAhc2VlZCApIHsKCgkJaWYgKCAoIGNvbnRleHQgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IHByZWZlcnJlZERvYyApICE9PSBkb2N1bWVudCApIHsKCQkJc2V0RG9jdW1lbnQoIGNvbnRleHQgKTsKCQl9CgkJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CgoJCWlmICggZG9jdW1lbnRJc0hUTUwgKSB7CgoJCQkvLyBJZiB0aGUgc2VsZWN0b3IgaXMgc3VmZmljaWVudGx5IHNpbXBsZSwgdHJ5IHVzaW5nIGEgImdldCpCeSoiIERPTSBtZXRob2QKCQkJLy8gKGV4Y2VwdGluZyBEb2N1bWVudEZyYWdtZW50IGNvbnRleHQsIHdoZXJlIHRoZSBtZXRob2RzIGRvbid0IGV4aXN0KQoJCQlpZiAoIG5vZGVUeXBlICE9PSAxMSAmJiAobWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICkpICkgewoKCQkJCS8vIElEIHNlbGVjdG9yCgkJCQlpZiAoIChtID0gbWF0Y2hbMV0pICkgewoKCQkJCQkvLyBEb2N1bWVudCBjb250ZXh0CgkJCQkJaWYgKCBub2RlVHlwZSA9PT0gOSApIHsKCQkJCQkJaWYgKCAoZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgKSB7CgoJCQkJCQkJLy8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXQKCQkJCQkJCS8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zCgkJCQkJCQkvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElECgkJCQkJCQlpZiAoIGVsZW0uaWQgPT09IG0gKSB7CgkJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJCQkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQkJCQl9CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCQkJfQoKCQkJCQkvLyBFbGVtZW50IGNvbnRleHQKCQkJCQl9IGVsc2UgewoKCQkJCQkJLy8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXQKCQkJCQkJLy8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnMKCQkJCQkJLy8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRAoJCQkJCQlpZiAoIG5ld0NvbnRleHQgJiYgKGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICYmCgkJCQkJCQljb250YWlucyggY29udGV4dCwgZWxlbSApICYmCgkJCQkJCQllbGVtLmlkID09PSBtICkgewoKCQkJCQkJCXJlc3VsdHMucHVzaCggZWxlbSApOwoJCQkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQkJCX0KCQkJCQl9CgoJCQkJLy8gVHlwZSBzZWxlY3RvcgoJCQkJfSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7CgkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApOwoJCQkJCXJldHVybiByZXN1bHRzOwoKCQkJCS8vIENsYXNzIHNlbGVjdG9yCgkJCQl9IGVsc2UgaWYgKCAobSA9IG1hdGNoWzNdKSAmJiBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYKCQkJCQljb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7CgoJCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7CgkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQl9CgkJCX0KCgkJCS8vIFRha2UgYWR2YW50YWdlIG9mIHF1ZXJ5U2VsZWN0b3JBbGwKCQkJaWYgKCBzdXBwb3J0LnFzYSAmJgoJCQkJIWNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF0gJiYKCQkJCSghcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSkgKSB7CgoJCQkJaWYgKCBub2RlVHlwZSAhPT0gMSApIHsKCQkJCQluZXdDb250ZXh0ID0gY29udGV4dDsKCQkJCQluZXdTZWxlY3RvciA9IHNlbGVjdG9yOwoKCQkJCS8vIHFTQSBsb29rcyBvdXRzaWRlIEVsZW1lbnQgY29udGV4dCwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudAoJCQkJLy8gVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoaXMgd29ya2Fyb3VuZCB0ZWNobmlxdWUKCQkJCS8vIFN1cHBvcnQ6IElFIDw9OAoJCQkJLy8gRXhjbHVkZSBvYmplY3QgZWxlbWVudHMKCQkJCX0gZWxzZSBpZiAoIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gIm9iamVjdCIgKSB7CgoJCQkJCS8vIENhcHR1cmUgdGhlIGNvbnRleHQgSUQsIHNldHRpbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5CgkJCQkJaWYgKCAobmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoICJpZCIgKSkgKSB7CgkJCQkJCW5pZCA9IG5pZC5yZXBsYWNlKCByY3NzZXNjYXBlLCBmY3NzZXNjYXBlICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJY29udGV4dC5zZXRBdHRyaWJ1dGUoICJpZCIsIChuaWQgPSBleHBhbmRvKSApOwoJCQkJCX0KCgkJCQkJLy8gUHJlZml4IGV2ZXJ5IHNlbGVjdG9yIGluIHRoZSBsaXN0CgkJCQkJZ3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7CgkJCQkJaSA9IGdyb3Vwcy5sZW5ndGg7CgkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCWdyb3Vwc1tpXSA9ICIjIiArIG5pZCArICIgIiArIHRvU2VsZWN0b3IoIGdyb3Vwc1tpXSApOwoJCQkJCX0KCQkJCQluZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCAiLCIgKTsKCgkJCQkJLy8gRXhwYW5kIGNvbnRleHQgZm9yIHNpYmxpbmcgc2VsZWN0b3JzCgkJCQkJbmV3Q29udGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8CgkJCQkJCWNvbnRleHQ7CgkJCQl9CgoJCQkJaWYgKCBuZXdTZWxlY3RvciApIHsKCQkJCQl0cnkgewoJCQkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLAoJCQkJCQkJbmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApCgkJCQkJCSk7CgkJCQkJCXJldHVybiByZXN1bHRzOwoJCQkJCX0gY2F0Y2ggKCBxc2FFcnJvciApIHsKCQkJCQl9IGZpbmFsbHkgewoJCQkJCQlpZiAoIG5pZCA9PT0gZXhwYW5kbyApIHsKCQkJCQkJCWNvbnRleHQucmVtb3ZlQXR0cmlidXRlKCAiaWQiICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLy8gQWxsIG90aGVycwoJcmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sICIkMSIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApOwp9CgovKioKICogQ3JlYXRlIGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBzaXplCiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGgKICoJcHJvcGVydHkgbmFtZSB0aGUgKHNwYWNlLXN1ZmZpeGVkKSBzdHJpbmcgYW5kIChpZiB0aGUgY2FjaGUgaXMgbGFyZ2VyIHRoYW4gRXhwci5jYWNoZUxlbmd0aCkKICoJZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeQogKi8KZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7Cgl2YXIga2V5cyA9IFtdOwoKCWZ1bmN0aW9uIGNhY2hlKCBrZXksIHZhbHVlICkgewoJCS8vIFVzZSAoa2V5ICsgIiAiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KQoJCWlmICgga2V5cy5wdXNoKCBrZXkgKyAiICIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7CgkJCS8vIE9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgZW50cmllcwoJCQlkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdOwoJCX0KCQlyZXR1cm4gKGNhY2hlWyBrZXkgKyAiICIgXSA9IHZhbHVlKTsKCX0KCXJldHVybiBjYWNoZTsKfQoKLyoqCiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlCiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtYXJrCiAqLwpmdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkgewoJZm5bIGV4cGFuZG8gXSA9IHRydWU7CglyZXR1cm4gZm47Cn0KCi8qKgogKiBTdXBwb3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudAogKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0CiAqLwpmdW5jdGlvbiBhc3NlcnQoIGZuICkgewoJdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKTsKCgl0cnkgewoJCXJldHVybiAhIWZuKCBlbCApOwoJfSBjYXRjaCAoZSkgewoJCXJldHVybiBmYWxzZTsKCX0gZmluYWxseSB7CgkJLy8gUmVtb3ZlIGZyb20gaXRzIHBhcmVudCBieSBkZWZhdWx0CgkJaWYgKCBlbC5wYXJlbnROb2RlICkgewoJCQllbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbCApOwoJCX0KCQkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQoJCWVsID0gbnVsbDsKCX0KfQoKLyoqCiAqIEFkZHMgdGhlIHNhbWUgaGFuZGxlciBmb3IgYWxsIG9mIHRoZSBzcGVjaWZpZWQgYXR0cnMKICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlcwogKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGFwcGxpZWQKICovCmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7Cgl2YXIgYXJyID0gYXR0cnMuc3BsaXQoInwiKSwKCQlpID0gYXJyLmxlbmd0aDsKCgl3aGlsZSAoIGktLSApIHsKCQlFeHByLmF0dHJIYW5kbGVbIGFycltpXSBdID0gaGFuZGxlcjsKCX0KfQoKLyoqCiAqIENoZWNrcyBkb2N1bWVudCBvcmRlciBvZiB0d28gc2libGluZ3MKICogQHBhcmFtIHtFbGVtZW50fSBhCiAqIEBwYXJhbSB7RWxlbWVudH0gYgogKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIGxlc3MgdGhhbiAwIGlmIGEgcHJlY2VkZXMgYiwgZ3JlYXRlciB0aGFuIDAgaWYgYSBmb2xsb3dzIGIKICovCmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHsKCXZhciBjdXIgPSBiICYmIGEsCgkJZGlmZiA9IGN1ciAmJiBhLm5vZGVUeXBlID09PSAxICYmIGIubm9kZVR5cGUgPT09IDEgJiYKCQkJYS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7CgoJLy8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzCglpZiAoIGRpZmYgKSB7CgkJcmV0dXJuIGRpZmY7Cgl9CgoJLy8gQ2hlY2sgaWYgYiBmb2xsb3dzIGEKCWlmICggY3VyICkgewoJCXdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7CgkJCWlmICggY3VyID09PSBiICkgewoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJfQoJfQoKCXJldHVybiBhID8gMSA6IC0xOwp9CgovKioKICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlcwogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKi8KZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7CglyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJcmV0dXJuIG5hbWUgPT09ICJpbnB1dCIgJiYgZWxlbS50eXBlID09PSB0eXBlOwoJfTsKfQoKLyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgYnV0dG9ucwogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKi8KZnVuY3Rpb24gY3JlYXRlQnV0dG9uUHNldWRvKCB0eXBlICkgewoJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCXZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJCXJldHVybiAobmFtZSA9PT0gImlucHV0IiB8fCBuYW1lID09PSAiYnV0dG9uIikgJiYgZWxlbS50eXBlID09PSB0eXBlOwoJfTsKfQoKLyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgOmVuYWJsZWQvOmRpc2FibGVkCiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzYWJsZWQgdHJ1ZSBmb3IgOmRpc2FibGVkOyBmYWxzZSBmb3IgOmVuYWJsZWQKICovCmZ1bmN0aW9uIGNyZWF0ZURpc2FibGVkUHNldWRvKCBkaXNhYmxlZCApIHsKCgkvLyBLbm93biA6ZGlzYWJsZWQgZmFsc2UgcG9zaXRpdmVzOiBmaWVsZHNldFtkaXNhYmxlZF0gPiBsZWdlbmQ6bnRoLW9mLXR5cGUobisyKSA6Y2FuLWRpc2FibGUKCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gT25seSBjZXJ0YWluIGVsZW1lbnRzIGNhbiBtYXRjaCA6ZW5hYmxlZCBvciA6ZGlzYWJsZWQKCQkvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1lbmFibGVkCgkJLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjc2VsZWN0b3ItZGlzYWJsZWQKCQlpZiAoICJmb3JtIiBpbiBlbGVtICkgewoKCQkJLy8gQ2hlY2sgZm9yIGluaGVyaXRlZCBkaXNhYmxlZG5lc3Mgb24gcmVsZXZhbnQgbm9uLWRpc2FibGVkIGVsZW1lbnRzOgoJCQkvLyAqIGxpc3RlZCBmb3JtLWFzc29jaWF0ZWQgZWxlbWVudHMgaW4gYSBkaXNhYmxlZCBmaWVsZHNldAoJCQkvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY2F0ZWdvcnktbGlzdGVkCgkJCS8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjb25jZXB0LWZlLWRpc2FibGVkCgkJCS8vICogb3B0aW9uIGVsZW1lbnRzIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXAKCQkJLy8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NvbmNlcHQtb3B0aW9uLWRpc2FibGVkCgkJCS8vIEFsbCBzdWNoIGVsZW1lbnRzIGhhdmUgYSAiZm9ybSIgcHJvcGVydHkuCgkJCWlmICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlICkgewoKCQkJCS8vIE9wdGlvbiBlbGVtZW50cyBkZWZlciB0byBhIHBhcmVudCBvcHRncm91cCBpZiBwcmVzZW50CgkJCQlpZiAoICJsYWJlbCIgaW4gZWxlbSApIHsKCQkJCQlpZiAoICJsYWJlbCIgaW4gZWxlbS5wYXJlbnROb2RlICkgewoJCQkJCQlyZXR1cm4gZWxlbS5wYXJlbnROb2RlLmRpc2FibGVkID09PSBkaXNhYmxlZDsKCQkJCQl9IGVsc2UgewoJCQkJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFN1cHBvcnQ6IElFIDYgLSAxMQoJCQkJLy8gVXNlIHRoZSBpc0Rpc2FibGVkIHNob3J0Y3V0IHByb3BlcnR5IHRvIGNoZWNrIGZvciBkaXNhYmxlZCBmaWVsZHNldCBhbmNlc3RvcnMKCQkJCXJldHVybiBlbGVtLmlzRGlzYWJsZWQgPT09IGRpc2FibGVkIHx8CgoJCQkJCS8vIFdoZXJlIHRoZXJlIGlzIG5vIGlzRGlzYWJsZWQsIGNoZWNrIG1hbnVhbGx5CgkJCQkJLyoganNoaW50IC1XMDE4ICovCgkJCQkJZWxlbS5pc0Rpc2FibGVkICE9PSAhZGlzYWJsZWQgJiYKCQkJCQkJZGlzYWJsZWRBbmNlc3RvciggZWxlbSApID09PSBkaXNhYmxlZDsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGRpc2FibGVkOwoKCQkvLyBUcnkgdG8gd2lubm93IG91dCBlbGVtZW50cyB0aGF0IGNhbid0IGJlIGRpc2FibGVkIGJlZm9yZSB0cnVzdGluZyB0aGUgZGlzYWJsZWQgcHJvcGVydHkuCgkJLy8gU29tZSB2aWN0aW1zIGdldCBjYXVnaHQgaW4gb3VyIG5ldCAobGFiZWwsIGxlZ2VuZCwgbWVudSwgdHJhY2spLCBidXQgaXQgc2hvdWxkbid0CgkJLy8gZXZlbiBleGlzdCBvbiB0aGVtLCBsZXQgYWxvbmUgaGF2ZSBhIGJvb2xlYW4gdmFsdWUuCgkJfSBlbHNlIGlmICggImxhYmVsIiBpbiBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7CgkJfQoKCQkvLyBSZW1haW5pbmcgZWxlbWVudHMgYXJlIG5laXRoZXIgOmVuYWJsZWQgbm9yIDpkaXNhYmxlZAoJCXJldHVybiBmYWxzZTsKCX07Cn0KCi8qKgogKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzCiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuCiAqLwpmdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHsKCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGFyZ3VtZW50ICkgewoJCWFyZ3VtZW50ID0gK2FyZ3VtZW50OwoJCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7CgkJCXZhciBqLAoJCQkJbWF0Y2hJbmRleGVzID0gZm4oIFtdLCBzZWVkLmxlbmd0aCwgYXJndW1lbnQgKSwKCQkJCWkgPSBtYXRjaEluZGV4ZXMubGVuZ3RoOwoKCQkJLy8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzCgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHsKCQkJCQlzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7CgkJCQl9CgkJCX0KCQl9KTsKCX0pOwp9CgovKioKICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dAogKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0PX0gY29udGV4dAogKiBAcmV0dXJucyB7RWxlbWVudHxPYmplY3R8Qm9vbGVhbn0gVGhlIGlucHV0IG5vZGUgaWYgYWNjZXB0YWJsZSwgb3RoZXJ3aXNlIGEgZmFsc3kgdmFsdWUKICovCmZ1bmN0aW9uIHRlc3RDb250ZXh0KCBjb250ZXh0ICkgewoJcmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICYmIGNvbnRleHQ7Cn0KCi8vIEV4cG9zZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlCnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9OwoKLyoqCiAqIERldGVjdHMgWE1MIG5vZGVzCiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0gQW4gZWxlbWVudCBvciBhIGRvY3VtZW50CiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGUKICovCmlzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0CgkvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMykKCXZhciBkb2N1bWVudEVsZW1lbnQgPSBlbGVtICYmIChlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSkuZG9jdW1lbnRFbGVtZW50OwoJcmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIDogZmFsc2U7Cn07CgovKioKICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50CiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IFtkb2NdIEFuIGVsZW1lbnQgb3IgZG9jdW1lbnQgb2JqZWN0IHRvIHVzZSB0byBzZXQgdGhlIGRvY3VtZW50CiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGN1cnJlbnQgZG9jdW1lbnQKICovCnNldERvY3VtZW50ID0gU2l6emxlLnNldERvY3VtZW50ID0gZnVuY3Rpb24oIG5vZGUgKSB7Cgl2YXIgaGFzQ29tcGFyZSwgc3ViV2luZG93LAoJCWRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYzsKCgkvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZAoJaWYgKCBkb2MgPT09IGRvY3VtZW50IHx8IGRvYy5ub2RlVHlwZSAhPT0gOSB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCApIHsKCQlyZXR1cm4gZG9jdW1lbnQ7Cgl9CgoJLy8gVXBkYXRlIGdsb2JhbCB2YXJpYWJsZXMKCWRvY3VtZW50ID0gZG9jOwoJZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCWRvY3VtZW50SXNIVE1MID0gIWlzWE1MKCBkb2N1bWVudCApOwoKCS8vIFN1cHBvcnQ6IElFIDktMTEsIEVkZ2UKCS8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgInBlcm1pc3Npb24gZGVuaWVkIiBlcnJvcnMgKGpRdWVyeSAjMTM5MzYpCglpZiAoIHByZWZlcnJlZERvYyAhPT0gZG9jdW1lbnQgJiYKCQkoc3ViV2luZG93ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcpICYmIHN1YldpbmRvdy50b3AgIT09IHN1YldpbmRvdyApIHsKCgkJLy8gU3VwcG9ydDogSUUgMTEsIEVkZ2UKCQlpZiAoIHN1YldpbmRvdy5hZGRFdmVudExpc3RlbmVyICkgewoJCQlzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggInVubG9hZCIsIHVubG9hZEhhbmRsZXIsIGZhbHNlICk7CgoJCS8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5CgkJfSBlbHNlIGlmICggc3ViV2luZG93LmF0dGFjaEV2ZW50ICkgewoJCQlzdWJXaW5kb3cuYXR0YWNoRXZlbnQoICJvbnVubG9hZCIsIHVubG9hZEhhbmRsZXIgKTsKCQl9Cgl9CgoJLyogQXR0cmlidXRlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIFN1cHBvcnQ6IElFPDgKCS8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllcwoJLy8gKGV4Y2VwdGluZyBJRTggYm9vbGVhbnMpCglzdXBwb3J0LmF0dHJpYnV0ZXMgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJCWVsLmNsYXNzTmFtZSA9ICJpIjsKCQlyZXR1cm4gIWVsLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIik7Cgl9KTsKCgkvKiBnZXRFbGVtZW50KHMpQnkqCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSByZXR1cm5zIG9ubHkgZWxlbWVudHMKCXN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJCWVsLmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSApOwoJCXJldHVybiAhZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg7Cgl9KTsKCgkvLyBTdXBwb3J0OiBJRTw5CglzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTsKCgkvLyBTdXBwb3J0OiBJRTwxMAoJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudEJ5SWQgcmV0dXJucyBlbGVtZW50cyBieSBuYW1lCgkvLyBUaGUgYnJva2VuIGdldEVsZW1lbnRCeUlkIG1ldGhvZHMgZG9uJ3QgcGljayB1cCBwcm9ncmFtbWF0aWNhbGx5LXNldCBuYW1lcywKCS8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdAoJc3VwcG9ydC5nZXRCeUlkID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCQlkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlkID0gZXhwYW5kbzsKCQlyZXR1cm4gIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lIHx8ICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDsKCX0pOwoKCS8vIElEIGZpbHRlciBhbmQgZmluZAoJaWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7CgkJRXhwci5maWx0ZXJbIklEIl0gPSBmdW5jdGlvbiggaWQgKSB7CgkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09IGF0dHJJZDsKCQkJfTsKCQl9OwoJCUV4cHIuZmluZFsiSUQiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7CgkJCQl2YXIgZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7CgkJCQlyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107CgkJCX0KCQl9OwoJfSBlbHNlIHsKCQlFeHByLmZpbHRlclsiSUQiXSA9ICBmdW5jdGlvbiggaWQgKSB7CgkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmCgkJCQkJZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpOwoJCQkJcmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkOwoJCQl9OwoJCX07CgoJCS8vIFN1cHBvcnQ6IElFIDYgLSA3IG9ubHkKCQkvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0CgkJRXhwci5maW5kWyJJRCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkgewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudElzSFRNTCApIHsKCQkJCXZhciBub2RlLCBpLCBlbGVtcywKCQkJCQllbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTsKCgkJCQlpZiAoIGVsZW0gKSB7CgoJCQkJCS8vIFZlcmlmeSB0aGUgaWQgYXR0cmlidXRlCgkJCQkJbm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsKCQkJCQlpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7CgkJCQkJCXJldHVybiBbIGVsZW0gXTsKCQkJCQl9CgoJCQkJCS8vIEZhbGwgYmFjayBvbiBnZXRFbGVtZW50c0J5TmFtZQoJCQkJCWVsZW1zID0gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSggaWQgKTsKCQkJCQlpID0gMDsKCQkJCQl3aGlsZSAoIChlbGVtID0gZWxlbXNbaSsrXSkgKSB7CgkJCQkJCW5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7CgkJCQkJCWlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHsKCQkJCQkJCXJldHVybiBbIGVsZW0gXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gW107CgkJCX0KCQl9OwoJfQoKCS8vIFRhZwoJRXhwci5maW5kWyJUQUciXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPwoJCWZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7CgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOwoKCQkJLy8gRG9jdW1lbnRGcmFnbWVudCBub2RlcyBkb24ndCBoYXZlIGdFQlROCgkJCX0gZWxzZSBpZiAoIHN1cHBvcnQucXNhICkgewoJCQkJcmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnICk7CgkJCX0KCQl9IDoKCgkJZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHsKCQkJdmFyIGVsZW0sCgkJCQl0bXAgPSBbXSwKCQkJCWkgPSAwLAoJCQkJLy8gQnkgaGFwcHkgY29pbmNpZGVuY2UsIGEgKGJyb2tlbikgZ0VCVE4gYXBwZWFycyBvbiBEb2N1bWVudEZyYWdtZW50IG5vZGVzIHRvbwoJCQkJcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOwoKCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cwoJCQlpZiAoIHRhZyA9PT0gIioiICkgewoJCQkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQl0bXAucHVzaCggZWxlbSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdG1wOwoJCQl9CgkJCXJldHVybiByZXN1bHRzOwoJCX07CgoJLy8gQ2xhc3MKCUV4cHIuZmluZFsiQ0xBU1MiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0ICkgewoJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApOwoJCX0KCX07CgoJLyogUVNBL21hdGNoZXNTZWxlY3RvcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnQKCgkvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KQoJcmJ1Z2d5TWF0Y2hlcyA9IFtdOwoKCS8vIHFTYSg6Zm9jdXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpCgkvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3IKCS8vIHdoZW5ldmVyIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YCBpcyBhY2Nlc3NlZCBvbiBhbiBpZnJhbWUKCS8vIFNvLCB3ZSBhbGxvdyA6Zm9jdXMgdG8gcGFzcyB0aHJvdWdoIFFTQSBhbGwgdGhlIHRpbWUgdG8gYXZvaWQgdGhlIElFIGVycm9yCgkvLyBTZWUgaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4CglyYnVnZ3lRU0EgPSBbXTsKCglpZiAoIChzdXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApKSApIHsKCQkvLyBCdWlsZCBRU0EgcmVnZXgKCQkvLyBSZWdleCBzdHJhdGVneSBhZG9wdGVkIGZyb20gRGllZ28gUGVyaW5pCgkJYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCQkJLy8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZQoJCQkvLyBUaGlzIGlzIHRvIHRlc3QgSUUncyB0cmVhdG1lbnQgb2Ygbm90IGV4cGxpY2l0bHkKCQkJLy8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsCgkJCS8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoCgkJCS8vIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjM1OQoJCQlkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlubmVySFRNTCA9ICI8YSBpZD0nIiArIGV4cGFuZG8gKyAiJz48L2E+IiArCgkJCQkiPHNlbGVjdCBpZD0nIiArIGV4cGFuZG8gKyAiLVxyXFwnIG1zYWxsb3djYXB0dXJlPScnPiIgKwoJCQkJIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IjsKCgkJCS8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTYKCQkJLy8gTm90aGluZyBzaG91bGQgYmUgc2VsZWN0ZWQgd2hlbiBlbXB0eSBzdHJpbmdzIGZvbGxvdyBePSBvciAkPSBvciAqPQoJCQkvLyBUaGUgdGVzdCBhdHRyaWJ1dGUgbXVzdCBiZSB1bmtub3duIGluIE9wZXJhIGJ1dCAic2FmZSIgZm9yIFdpblJUCgkJCS8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvaGg0NjUzODguYXNweCNhdHRyaWJ1dGVfc2VjdGlvbgoJCQlpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIlttc2FsbG93Y2FwdHVyZV49JyddIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJbKl4kXT0iICsgd2hpdGVzcGFjZSArICIqKD86Jyd8XCJcIikiICk7CgkJCX0KCgkJCS8vIFN1cHBvcnQ6IElFOAoJCQkvLyBCb29sZWFuIGF0dHJpYnV0ZXMgYW5kICJ2YWx1ZSIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseQoJCQlpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJcXFsiICsgd2hpdGVzcGFjZSArICIqKD86dmFsdWV8IiArIGJvb2xlYW5zICsgIikiICk7CgkJCX0KCgkJCS8vIFN1cHBvcnQ6IENocm9tZTwyOSwgQW5kcm9pZDw0LjQsIFNhZmFyaTw3LjArLCBpT1M8Ny4wKywgUGhhbnRvbUpTPDEuOS44KwoJCQlpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCAiW2lkfj0iICsgZXhwYW5kbyArICItXSIgKS5sZW5ndGggKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCgifj0iKTsKCQkJfQoKCQkJLy8gV2Via2l0L09wZXJhIC0gOmNoZWNrZWQgc2hvdWxkIHJldHVybiBzZWxlY3RlZCBvcHRpb24gZWxlbWVudHMKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWQKCQkJLy8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHMKCQkJaWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGggKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCgiOmNoZWNrZWQiKTsKCQkJfQoKCQkJLy8gU3VwcG9ydDogU2FmYXJpIDgrLCBpT1MgOCsKCQkJLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MQoJCQkvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJsaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzCgkJCWlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoICJhIyIgKyBleHBhbmRvICsgIisqIiApLmxlbmd0aCApIHsKCQkJCXJidWdneVFTQS5wdXNoKCIuIy4rWyt+XSIpOwoJCQl9CgkJfSk7CgoJCWFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkJCWVsLmlubmVySFRNTCA9ICI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPiIgKwoJCQkJIjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iOwoKCQkJLy8gU3VwcG9ydDogV2luZG93cyA4IE5hdGl2ZSBBcHBzCgkJCS8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudAoJCQl2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwoJCQlpbnB1dC5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgImhpZGRlbiIgKTsKCQkJZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCAibmFtZSIsICJEIiApOwoKCQkJLy8gU3VwcG9ydDogSUU4CgkJCS8vIEVuZm9yY2UgY2FzZS1zZW5zaXRpdml0eSBvZiBuYW1lIGF0dHJpYnV0ZQoJCQlpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJuYW1lIiArIHdoaXRlc3BhY2UgKyAiKlsqXiR8IX5dPz0iICk7CgkJCX0KCgkJCS8vIEZGIDMuNSAtIDplbmFibGVkLzpkaXNhYmxlZCBhbmQgaGlkZGVuIGVsZW1lbnRzIChoaWRkZW4gZWxlbWVudHMgYXJlIHN0aWxsIGVuYWJsZWQpCgkJCS8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzCgkJCWlmICggZWwucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGggIT09IDIgKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCggIjplbmFibGVkIiwgIjpkaXNhYmxlZCIgKTsKCQkJfQoKCQkJLy8gU3VwcG9ydDogSUU5LTExKwoJCQkvLyBJRSdzIDpkaXNhYmxlZCBzZWxlY3RvciBkb2VzIG5vdCBwaWNrIHVwIHRoZSBjaGlsZHJlbiBvZiBkaXNhYmxlZCBmaWVsZHNldHMKCQkJZG9jRWxlbS5hcHBlbmRDaGlsZCggZWwgKS5kaXNhYmxlZCA9IHRydWU7CgkJCWlmICggZWwucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoICE9PSAyICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICI6ZW5hYmxlZCIsICI6ZGlzYWJsZWQiICk7CgkJCX0KCgkJCS8vIE9wZXJhIDEwLTExIGRvZXMgbm90IHRocm93IG9uIHBvc3QtY29tbWEgaW52YWxpZCBwc2V1ZG9zCgkJCWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKTsKCQkJcmJ1Z2d5UVNBLnB1c2goIiwuKjoiKTsKCQl9KTsKCX0KCglpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHwKCQlkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fAoJCWRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8CgkJZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8CgkJZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7CgoJCWFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkJCS8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvcgoJCQkvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KQoJCQlzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoID0gbWF0Y2hlcy5jYWxsKCBlbCwgIioiICk7CgoJCQkvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uCgkJCS8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWQKCQkJbWF0Y2hlcy5jYWxsKCBlbCwgIltzIT0nJ106eCIgKTsKCQkJcmJ1Z2d5TWF0Y2hlcy5wdXNoKCAiIT0iLCBwc2V1ZG9zICk7CgkJfSk7Cgl9CgoJcmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbigifCIpICk7CglyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKCJ8IikgKTsKCgkvKiBDb250YWlucwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJaGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApOwoKCS8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlcgoJLy8gUHVycG9zZWZ1bGx5IHNlbGYtZXhjbHVzaXZlCgkvLyBBcyBpbiwgYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZgoJY29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID8KCQlmdW5jdGlvbiggYSwgYiApIHsKCQkJdmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50IDogYSwKCQkJCWJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlOwoJCQlyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmICgKCQkJCWFkb3duLmNvbnRhaW5zID8KCQkJCQlhZG93bi5jb250YWlucyggYnVwICkgOgoJCQkJCWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNgoJCQkpKTsKCQl9IDoKCQlmdW5jdGlvbiggYSwgYiApIHsKCQkJaWYgKCBiICkgewoJCQkJd2hpbGUgKCAoYiA9IGIucGFyZW50Tm9kZSkgKSB7CgkJCQkJaWYgKCBiID09PSBhICkgewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX07CgoJLyogU29ydGluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmcKCXNvcnRPcmRlciA9IGhhc0NvbXBhcmUgPwoJZnVuY3Rpb24oIGEsIGIgKSB7CgoJCS8vIEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsCgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCS8vIFNvcnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb24KCQl2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247CgkJaWYgKCBjb21wYXJlICkgewoJCQlyZXR1cm4gY29tcGFyZTsKCQl9CgoJCS8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnQKCQljb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgPwoJCQlhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBiICkgOgoKCQkJLy8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkCgkJCTE7CgoJCS8vIERpc2Nvbm5lY3RlZCBub2RlcwoJCWlmICggY29tcGFyZSAmIDEgfHwKCQkJKCFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUpICkgewoKCQkJLy8gQ2hvb3NlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcmVsYXRlZCB0byBvdXIgcHJlZmVycmVkIGRvY3VtZW50CgkJCWlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHsKCQkJCXJldHVybiAtMTsKCQkJfQoJCQlpZiAoIGIgPT09IGRvY3VtZW50IHx8IGIub3duZXJEb2N1bWVudCA9PT0gcHJlZmVycmVkRG9jICYmIGNvbnRhaW5zKHByZWZlcnJlZERvYywgYikgKSB7CgkJCQlyZXR1cm4gMTsKCQkJfQoKCQkJLy8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXIKCQkJcmV0dXJuIHNvcnRJbnB1dCA/CgkJCQkoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6CgkJCQkwOwoJCX0KCgkJcmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxOwoJfSA6CglmdW5jdGlvbiggYSwgYiApIHsKCQkvLyBFeGl0IGVhcmx5IGlmIHRoZSBub2RlcyBhcmUgaWRlbnRpY2FsCgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCXZhciBjdXIsCgkJCWkgPSAwLAoJCQlhdXAgPSBhLnBhcmVudE5vZGUsCgkJCWJ1cCA9IGIucGFyZW50Tm9kZSwKCQkJYXAgPSBbIGEgXSwKCQkJYnAgPSBbIGIgXTsKCgkJLy8gUGFyZW50bGVzcyBub2RlcyBhcmUgZWl0aGVyIGRvY3VtZW50cyBvciBkaXNjb25uZWN0ZWQKCQlpZiAoICFhdXAgfHwgIWJ1cCApIHsKCQkJcmV0dXJuIGEgPT09IGRvY3VtZW50ID8gLTEgOgoJCQkJYiA9PT0gZG9jdW1lbnQgPyAxIDoKCQkJCWF1cCA/IC0xIDoKCQkJCWJ1cCA/IDEgOgoJCQkJc29ydElucHV0ID8KCQkJCSggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDoKCQkJCTA7CgoJCS8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrCgkJfSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7CgkJCXJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTsKCQl9CgoJCS8vIE90aGVyd2lzZSB3ZSBuZWVkIGZ1bGwgbGlzdHMgb2YgdGhlaXIgYW5jZXN0b3JzIGZvciBjb21wYXJpc29uCgkJY3VyID0gYTsKCQl3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7CgkJCWFwLnVuc2hpZnQoIGN1ciApOwoJCX0KCQljdXIgPSBiOwoJCXdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHsKCQkJYnAudW5zaGlmdCggY3VyICk7CgkJfQoKCQkvLyBXYWxrIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBkaXNjcmVwYW5jeQoJCXdoaWxlICggYXBbaV0gPT09IGJwW2ldICkgewoJCQlpKys7CgkJfQoKCQlyZXR1cm4gaSA/CgkJCS8vIERvIGEgc2libGluZyBjaGVjayBpZiB0aGUgbm9kZXMgaGF2ZSBhIGNvbW1vbiBhbmNlc3RvcgoJCQlzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDoKCgkJCS8vIE90aGVyd2lzZSBub2RlcyBpbiBvdXIgZG9jdW1lbnQgc29ydCBmaXJzdAoJCQlhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOgoJCQlicFtpXSA9PT0gcHJlZmVycmVkRG9jID8gMSA6CgkJCTA7Cgl9OwoKCXJldHVybiBkb2N1bWVudDsKfTsKClNpenpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1lbnRzICkgewoJcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTsKfTsKClNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHsKCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAoJaWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkgewoJCXNldERvY3VtZW50KCBlbGVtICk7Cgl9CgoJLy8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkCglleHByID0gZXhwci5yZXBsYWNlKCByYXR0cmlidXRlUXVvdGVzLCAiPSckMSddIiApOwoKCWlmICggc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgJiYgZG9jdW1lbnRJc0hUTUwgJiYKCQkhY29tcGlsZXJDYWNoZVsgZXhwciArICIgIiBdICYmCgkJKCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJgoJCSggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHsKCgkJdHJ5IHsKCQkJdmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApOwoKCQkJLy8gSUUgOSdzIG1hdGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5lY3RlZCBub2RlcwoJCQlpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8CgkJCQkJLy8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnQKCQkJCQkvLyBmcmFnbWVudCBpbiBJRSA5CgkJCQkJZWxlbS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5vZGVUeXBlICE9PSAxMSApIHsKCQkJCXJldHVybiByZXQ7CgkJCX0KCQl9IGNhdGNoIChlKSB7fQoJfQoKCXJldHVybiBTaXp6bGUoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBbIGVsZW0gXSApLmxlbmd0aCA+IDA7Cn07CgpTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggY29udGV4dCwgZWxlbSApIHsKCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAoJaWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkgewoJCXNldERvY3VtZW50KCBjb250ZXh0ICk7Cgl9CglyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTsKfTsKClNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWQKCWlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHsKCQlzZXREb2N1bWVudCggZWxlbSApOwoJfQoKCXZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sCgkJLy8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpCgkJdmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgPwoJCQlmbiggZWxlbSwgbmFtZSwgIWRvY3VtZW50SXNIVE1MICkgOgoJCQl1bmRlZmluZWQ7CgoJcmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID8KCQl2YWwgOgoJCXN1cHBvcnQuYXR0cmlidXRlcyB8fCAhZG9jdW1lbnRJc0hUTUwgPwoJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDoKCQkJKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSkgJiYgdmFsLnNwZWNpZmllZCA/CgkJCQl2YWwudmFsdWUgOgoJCQkJbnVsbDsKfTsKClNpenpsZS5lc2NhcGUgPSBmdW5jdGlvbiggc2VsICkgewoJcmV0dXJuIChzZWwgKyAiIikucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApOwp9OwoKU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHsKCXRocm93IG5ldyBFcnJvciggIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2cgKTsKfTsKCi8qKgogKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzCiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzCiAqLwpTaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkgewoJdmFyIGVsZW0sCgkJZHVwbGljYXRlcyA9IFtdLAoJCWogPSAwLAoJCWkgPSAwOwoKCS8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRldGVjdCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2UKCWhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7Cglzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHJlc3VsdHMuc2xpY2UoIDAgKTsKCXJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7CgoJaWYgKCBoYXNEdXBsaWNhdGUgKSB7CgkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CgkJCWlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSBdICkgewoJCQkJaiA9IGR1cGxpY2F0ZXMucHVzaCggaSApOwoJCQl9CgkJfQoJCXdoaWxlICggai0tICkgewoJCQlyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7CgkJfQoJfQoKCS8vIENsZWFyIGlucHV0IGFmdGVyIHNvcnRpbmcgdG8gcmVsZWFzZSBvYmplY3RzCgkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvcHVsbC8yMjUKCXNvcnRJbnB1dCA9IG51bGw7CgoJcmV0dXJuIHJlc3VsdHM7Cn07CgovKioKICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXMKICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtCiAqLwpnZXRUZXh0ID0gU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbSApIHsKCXZhciBub2RlLAoJCXJldCA9ICIiLAoJCWkgPSAwLAoJCW5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTsKCglpZiAoICFub2RlVHlwZSApIHsKCQkvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheQoJCXdoaWxlICggKG5vZGUgPSBlbGVtW2krK10pICkgewoJCQkvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2RlcwoJCQlyZXQgKz0gZ2V0VGV4dCggbm9kZSApOwoJCX0KCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHsKCQkvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzCgkJLy8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1MykKCQlpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7CgkJfSBlbHNlIHsKCQkJLy8gVHJhdmVyc2UgaXRzIGNoaWxkcmVuCgkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewoJCQkJcmV0ICs9IGdldFRleHQoIGVsZW0gKTsKCQkJfQoJCX0KCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkgewoJCXJldHVybiBlbGVtLm5vZGVWYWx1ZTsKCX0KCS8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2RlcwoKCXJldHVybiByZXQ7Cn07CgpFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsKCgkvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXIKCWNhY2hlTGVuZ3RoOiA1MCwKCgljcmVhdGVQc2V1ZG86IG1hcmtGdW5jdGlvbiwKCgltYXRjaDogbWF0Y2hFeHByLAoKCWF0dHJIYW5kbGU6IHt9LAoKCWZpbmQ6IHt9LAoKCXJlbGF0aXZlOiB7CgkJIj4iOiB7IGRpcjogInBhcmVudE5vZGUiLCBmaXJzdDogdHJ1ZSB9LAoJCSIgIjogeyBkaXI6ICJwYXJlbnROb2RlIiB9LAoJCSIrIjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciLCBmaXJzdDogdHJ1ZSB9LAoJCSJ+IjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciIH0KCX0sCgoJcHJlRmlsdGVyOiB7CgkJIkFUVFIiOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCW1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTsKCgkJCS8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkCgkJCW1hdGNoWzNdID0gKCBtYXRjaFszXSB8fCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgoJCQlpZiAoIG1hdGNoWzJdID09PSAifj0iICkgewoJCQkJbWF0Y2hbM10gPSAiICIgKyBtYXRjaFszXSArICIgIjsKCQkJfQoKCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCA0ICk7CgkJfSwKCgkJIkNISUxEIjogZnVuY3Rpb24oIG1hdGNoICkgewoJCQkvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByWyJDSElMRCJdCgkJCQkxIHR5cGUgKG9ubHl8bnRofC4uLikKCQkJCTIgd2hhdCAoY2hpbGR8b2YtdHlwZSkKCQkJCTMgYXJndW1lbnQgKGV2ZW58b2RkfFxkKnxcZCpuKFsrLV1cZCspP3wuLi4pCgkJCQk0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xkKm58KQoJCQkJNSBzaWduIG9mIHhuLWNvbXBvbmVudAoJCQkJNiB4IG9mIHhuLWNvbXBvbmVudAoJCQkJNyBzaWduIG9mIHktY29tcG9uZW50CgkJCQk4IHkgb2YgeS1jb21wb25lbnQKCQkJKi8KCQkJbWF0Y2hbMV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpOwoKCQkJaWYgKCBtYXRjaFsxXS5zbGljZSggMCwgMyApID09PSAibnRoIiApIHsKCQkJCS8vIG50aC0qIHJlcXVpcmVzIGFyZ3VtZW50CgkJCQlpZiAoICFtYXRjaFszXSApIHsKCQkJCQlTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7CgkJCQl9CgoJCQkJLy8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxECgkJCQkvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xCgkJCQltYXRjaFs0XSA9ICsoIG1hdGNoWzRdID8gbWF0Y2hbNV0gKyAobWF0Y2hbNl0gfHwgMSkgOiAyICogKCBtYXRjaFszXSA9PT0gImV2ZW4iIHx8IG1hdGNoWzNdID09PSAib2RkIiApICk7CgkJCQltYXRjaFs1XSA9ICsoICggbWF0Y2hbN10gKyBtYXRjaFs4XSApIHx8IG1hdGNoWzNdID09PSAib2RkIiApOwoKCQkJLy8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIG1hdGNoWzNdICkgewoJCQkJU2l6emxlLmVycm9yKCBtYXRjaFswXSApOwoJCQl9CgoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBtYXRjaCApIHsKCQkJdmFyIGV4Y2VzcywKCQkJCXVucXVvdGVkID0gIW1hdGNoWzZdICYmIG1hdGNoWzJdOwoKCQkJaWYgKCBtYXRjaEV4cHJbIkNISUxEIl0udGVzdCggbWF0Y2hbMF0gKSApIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgoJCQkvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pcwoJCQlpZiAoIG1hdGNoWzNdICkgewoJCQkJbWF0Y2hbMl0gPSBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIjsKCgkJCS8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIHVucXVvdGVkICYmIHJwc2V1ZG8udGVzdCggdW5xdW90ZWQgKSAmJgoJCQkJLy8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSkKCQkJCShleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiYKCQkJCS8vIGFkdmFuY2UgdG8gdGhlIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpcwoJCQkJKGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoICIpIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGgpICkgewoKCQkJCS8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4CgkJCQltYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKCAwLCBleGNlc3MgKTsKCQkJCW1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApOwoJCQl9CgoJCQkvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudCkKCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCAzICk7CgkJfQoJfSwKCglmaWx0ZXI6IHsKCgkJIlRBRyI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkgewoJCQl2YXIgbm9kZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIG5vZGVOYW1lU2VsZWN0b3IgPT09ICIqIiA/CgkJCQlmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOgoJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTsKCQkJCX07CgkJfSwKCgkJIkNMQVNTIjogZnVuY3Rpb24oIGNsYXNzTmFtZSApIHsKCQkJdmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyAiICIgXTsKCgkJCXJldHVybiBwYXR0ZXJuIHx8CgkJCQkocGF0dGVybiA9IG5ldyBSZWdFeHAoICIoXnwiICsgd2hpdGVzcGFjZSArICIpIiArIGNsYXNzTmFtZSArICIoIiArIHdoaXRlc3BhY2UgKyAifCQpIiApKSAmJgoJCQkJY2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJCQlyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09ICJzdHJpbmciICYmIGVsZW0uY2xhc3NOYW1lIHx8IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSAhPT0gInVuZGVmaW5lZCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiIgKTsKCQkJCX0pOwoJCX0sCgoJCSJBVFRSIjogZnVuY3Rpb24oIG5hbWUsIG9wZXJhdG9yLCBjaGVjayApIHsKCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJdmFyIHJlc3VsdCA9IFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICk7CgoJCQkJaWYgKCByZXN1bHQgPT0gbnVsbCApIHsKCQkJCQlyZXR1cm4gb3BlcmF0b3IgPT09ICIhPSI7CgkJCQl9CgkJCQlpZiAoICFvcGVyYXRvciApIHsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCgkJCQlyZXN1bHQgKz0gIiI7CgoJCQkJcmV0dXJuIG9wZXJhdG9yID09PSAiPSIgPyByZXN1bHQgPT09IGNoZWNrIDoKCQkJCQlvcGVyYXRvciA9PT0gIiE9IiA/IHJlc3VsdCAhPT0gY2hlY2sgOgoJCQkJCW9wZXJhdG9yID09PSAiXj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDAgOgoJCQkJCW9wZXJhdG9yID09PSAiKj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPiAtMSA6CgkJCQkJb3BlcmF0b3IgPT09ICIkPSIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOgoJCQkJCW9wZXJhdG9yID09PSAifj0iID8gKCAiICIgKyByZXN1bHQucmVwbGFjZSggcndoaXRlc3BhY2UsICIgIiApICsgIiAiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDoKCQkJCQlvcGVyYXRvciA9PT0gInw9IiA/IHJlc3VsdCA9PT0gY2hlY2sgfHwgcmVzdWx0LnNsaWNlKCAwLCBjaGVjay5sZW5ndGggKyAxICkgPT09IGNoZWNrICsgIi0iIDoKCQkJCQlmYWxzZTsKCQkJfTsKCQl9LAoKCQkiQ0hJTEQiOiBmdW5jdGlvbiggdHlwZSwgd2hhdCwgYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkgewoJCQl2YXIgc2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSAibnRoIiwKCQkJCWZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSAibGFzdCIsCgkJCQlvZlR5cGUgPSB3aGF0ID09PSAib2YtdHlwZSI7CgoJCQlyZXR1cm4gZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCA/CgoJCQkJLy8gU2hvcnRjdXQgZm9yIDpudGgtKihuKQoJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkJcmV0dXJuICEhZWxlbS5wYXJlbnROb2RlOwoJCQkJfSA6CgoJCQkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJCQl2YXIgY2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LAoJCQkJCQlkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyAibmV4dFNpYmxpbmciIDogInByZXZpb3VzU2libGluZyIsCgkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSwKCQkJCQkJbmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksCgkJCQkJCXVzZUNhY2hlID0gIXhtbCAmJiAhb2ZUeXBlLAoJCQkJCQlkaWZmID0gZmFsc2U7CgoJCQkJCWlmICggcGFyZW50ICkgewoKCQkJCQkJLy8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKQoJCQkJCQlpZiAoIHNpbXBsZSApIHsKCQkJCQkJCXdoaWxlICggZGlyICkgewoJCQkJCQkJCW5vZGUgPSBlbGVtOwoJCQkJCQkJCXdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7CgkJCQkJCQkJCWlmICggb2ZUeXBlID8KCQkJCQkJCQkJCW5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6CgkJCQkJCQkJCQlub2RlLm5vZGVUeXBlID09PSAxICkgewoKCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQkvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbykKCQkJCQkJCQlzdGFydCA9IGRpciA9IHR5cGUgPT09ICJvbmx5IiAmJiAhc3RhcnQgJiYgIm5leHRTaWJsaW5nIjsKCQkJCQkJCX0KCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQl9CgoJCQkJCQlzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdOwoKCQkJCQkJLy8gbm9uLXhtbCA6bnRoLWNoaWxkKC4uLikgc3RvcmVzIGNhY2hlIGRhdGEgb24gYHBhcmVudGAKCQkJCQkJaWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkgewoKCQkJCQkJCS8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleAoKCQkJCQkJCS8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXkKCQkJCQkJCW5vZGUgPSBwYXJlbnQ7CgkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJLy8gU3VwcG9ydDogSUUgPDkgb25seQoJCQkJCQkJLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpCgkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCShvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7CgoJCQkJCQkJY2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdOwoJCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdOwoJCQkJCQkJZGlmZiA9IG5vZGVJbmRleCAmJiBjYWNoZVsgMiBdOwoJCQkJCQkJbm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07CgoJCQkJCQkJd2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHwKCgkJCQkJCQkJLy8gRmFsbGJhY2sgdG8gc2Vla2luZyBgZWxlbWAgZnJvbSB0aGUgc3RhcnQKCQkJCQkJCQkoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHsKCgkJCQkJCQkJLy8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWsKCQkJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7CgkJCQkJCQkJCXVuaXF1ZUNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlCgkJCQkJCQlpZiAoIHVzZUNhY2hlICkgewoJCQkJCQkJCS8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXkKCQkJCQkJCQlub2RlID0gZWxlbTsKCQkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJCQkvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSkKCQkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCQkob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pOwoKCQkJCQkJCQljYWNoZSA9IHVuaXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107CgkJCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdOwoJCQkJCQkJCWRpZmYgPSBub2RlSW5kZXg7CgkJCQkJCQl9CgoJCQkJCQkJLy8geG1sIDpudGgtY2hpbGQoLi4uKQoJCQkJCQkJLy8gb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKQoJCQkJCQkJaWYgKCBkaWZmID09PSBmYWxzZSApIHsKCQkJCQkJCQkvLyBVc2UgdGhlIHNhbWUgbG9vcCBhcyBhYm92ZSB0byBzZWVrIGBlbGVtYCBmcm9tIHRoZSBzdGFydAoJCQkJCQkJCXdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8CgkJCQkJCQkJCShkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkgewoKCQkJCQkJCQkJaWYgKCAoIG9mVHlwZSA/CgkJCQkJCQkJCQlub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOgoJCQkJCQkJCQkJbm9kZS5ub2RlVHlwZSA9PT0gMSApICYmCgkJCQkJCQkJCQkrK2RpZmYgKSB7CgoJCQkJCQkJCQkJLy8gQ2FjaGUgdGhlIGluZGV4IG9mIGVhY2ggZW5jb3VudGVyZWQgZWxlbWVudAoJCQkJCQkJCQkJaWYgKCB1c2VDYWNoZSApIHsKCQkJCQkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJCQkJCQkvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSkKCQkJCQkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCQkJCQkob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pOwoKCQkJCQkJCQkJCQl1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07CgkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJaWYgKCBub2RlID09PSBlbGVtICkgewoJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQkvLyBJbmNvcnBvcmF0ZSB0aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZQoJCQkJCQlkaWZmIC09IGxhc3Q7CgkJCQkJCXJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOwoJCQkJCX0KCQkJCX07CgkJfSwKCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkgewoJCQkvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3NlcwoJCQkvLyBQcmlvcml0aXplIGJ5IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBlcmNhc2UgbGV0dGVycwoJCQkvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zCgkJCXZhciBhcmdzLAoJCQkJZm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fAoJCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIHBzZXVkbzogIiArIHBzZXVkbyApOwoKCQkJLy8gVGhlIHVzZXIgbWF5IHVzZSBjcmVhdGVQc2V1ZG8gdG8gaW5kaWNhdGUgdGhhdAoJCQkvLyBhcmd1bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvbgoJCQkvLyBqdXN0IGFzIFNpenpsZSBkb2VzCgkJCWlmICggZm5bIGV4cGFuZG8gXSApIHsKCQkJCXJldHVybiBmbiggYXJndW1lbnQgKTsKCQkJfQoKCQkJLy8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzCgkJCWlmICggZm4ubGVuZ3RoID4gMSApIHsKCQkJCWFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCAiIiwgYXJndW1lbnQgXTsKCQkJCXJldHVybiBFeHByLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgPwoJCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHsKCQkJCQkJdmFyIGlkeCwKCQkJCQkJCW1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSwKCQkJCQkJCWkgPSBtYXRjaGVkLmxlbmd0aDsKCQkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCQlpZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkW2ldICk7CgkJCQkJCQlzZWVkWyBpZHggXSA9ICEoIG1hdGNoZXNbIGlkeCBdID0gbWF0Y2hlZFtpXSApOwoJCQkJCQl9CgkJCQkJfSkgOgoJCQkJCWZ1bmN0aW9uKCBlbGVtICkgewoJCQkJCQlyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTsKCQkJCQl9OwoJCQl9CgoJCQlyZXR1cm4gZm47CgkJfQoJfSwKCglwc2V1ZG9zOiB7CgkJLy8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zCgkJIm5vdCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJCS8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlCgkJCS8vIHRvIGF2b2lkIHRyZWF0aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nCgkJCS8vIHNwYWNlcyBhcyBjb21iaW5hdG9ycwoJCQl2YXIgaW5wdXQgPSBbXSwKCQkJCXJlc3VsdHMgPSBbXSwKCQkJCW1hdGNoZXIgPSBjb21waWxlKCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgIiQxIiApICk7CgoJCQlyZXR1cm4gbWF0Y2hlclsgZXhwYW5kbyBdID8KCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkgewoJCQkJCXZhciBlbGVtLAoJCQkJCQl1bm1hdGNoZWQgPSBtYXRjaGVyKCBzZWVkLCBudWxsLCB4bWwsIFtdICksCgkJCQkJCWkgPSBzZWVkLmxlbmd0aDsKCgkJCQkJLy8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYAoJCQkJCXdoaWxlICggaS0tICkgewoJCQkJCQlpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHsKCQkJCQkJCXNlZWRbaV0gPSAhKG1hdGNoZXNbaV0gPSBlbGVtKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0pIDoKCQkJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CgkJCQkJaW5wdXRbMF0gPSBlbGVtOwoJCQkJCW1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTsKCQkJCQkvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KQoJCQkJCWlucHV0WzBdID0gbnVsbDsKCQkJCQlyZXR1cm4gIXJlc3VsdHMucG9wKCk7CgkJCQl9OwoJCX0pLAoKCQkiaGFzIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJcmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwOwoJCQl9OwoJCX0pLAoKCQkiY29udGFpbnMiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHRleHQgKSB7CgkJCXRleHQgPSB0ZXh0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgkJCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgZ2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7CgkJCX07CgkJfSksCgoJCS8vICJXaGV0aGVyIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9yCgkJLy8gaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUKCQkvLyBiZWluZyBlcXVhbCB0byB0aGUgaWRlbnRpZmllciBDLAoJCS8vIG9yIGJlZ2lubmluZyB3aXRoIHRoZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgIi0iLgoJCS8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LgoJCS8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuIgoJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG8KCQkibGFuZyI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7CgkJCS8vIGxhbmcgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXIKCQkJaWYgKCAhcmlkZW50aWZpZXIudGVzdChsYW5nIHx8ICIiKSApIHsKCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIGxhbmc6ICIgKyBsYW5nICk7CgkJCX0KCQkJbGFuZyA9IGxhbmcucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgZWxlbUxhbmc7CgkJCQlkbyB7CgkJCQkJaWYgKCAoZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/CgkJCQkJCWVsZW0ubGFuZyA6CgkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJsYW5nIikpICkgewoKCQkJCQkJZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpOwoJCQkJCQlyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArICItIiApID09PSAwOwoJCQkJCX0KCQkJCX0gd2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9OwoJCX0pLAoKCQkvLyBNaXNjZWxsYW5lb3VzCgkJInRhcmdldCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaGFzaDsKCQkJcmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkOwoJCX0sCgoJCSJyb290IjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtID09PSBkb2NFbGVtOwoJCX0sCgoJCSJmb2N1cyI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFiSW5kZXgpOwoJCX0sCgoJCS8vIEJvb2xlYW4gcHJvcGVydGllcwoJCSJlbmFibGVkIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGZhbHNlICksCgkJImRpc2FibGVkIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIHRydWUgKSwKCgkJImNoZWNrZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gSW4gQ1NTMywgOmNoZWNrZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzCgkJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkCgkJCXZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIChub2RlTmFtZSA9PT0gImlucHV0IiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwgKG5vZGVOYW1lID09PSAib3B0aW9uIiAmJiAhIWVsZW0uc2VsZWN0ZWQpOwoJCX0sCgoJCSJzZWxlY3RlZCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0CgkJCS8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHkKCQkJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7CgkJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7CgkJfSwKCgkJLy8gQ29udGVudHMKCQkiZW1wdHkiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG8KCQkJLy8gOmVtcHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAoMSkgb3IgY29udGVudCBub2RlcyAodGV4dDogMzsgY2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLAoJCQkvLyAgIGJ1dCBub3QgYnkgb3RoZXJzIChjb21tZW50OiA4OyBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiA3OyBldGMuKQoJCQkvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuCgkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJInBhcmVudCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gIUV4cHIucHNldWRvc1siZW1wdHkiXSggZWxlbSApOwoJCX0sCgoJCS8vIEVsZW1lbnQvaW5wdXQgdHlwZXMKCQkiaGVhZGVyIjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiByaGVhZGVyLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsKCQl9LAoKCQkiaW5wdXQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApOwoJCX0sCgoJCSJidXR0b24iOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJCXJldHVybiBuYW1lID09PSAiaW5wdXQiICYmIGVsZW0udHlwZSA9PT0gImJ1dHRvbiIgfHwgbmFtZSA9PT0gImJ1dHRvbiI7CgkJfSwKCgkJInRleHQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIGF0dHI7CgkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYKCQkJCWVsZW0udHlwZSA9PT0gInRleHQiICYmCgoJCQkJLy8gU3VwcG9ydDogSUU8OAoJCQkJLy8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sICJzZWFyY2giKSBhcHBlYXIgd2l0aCBlbGVtLnR5cGUgPT09ICJ0ZXh0IgoJCQkJKCAoYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSAidGV4dCIgKTsKCQl9LAoKCQkvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uCgkJImZpcnN0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbigpIHsKCQkJcmV0dXJuIFsgMCBdOwoJCX0pLAoKCQkibGFzdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgewoJCQlyZXR1cm4gWyBsZW5ndGggLSAxIF07CgkJfSksCgoJCSJlcSI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKCQkJcmV0dXJuIFsgYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudCBdOwoJCX0pLAoKCQkiZXZlbiI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgewoJCQl2YXIgaSA9IDA7CgkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkgewoJCQkJbWF0Y2hJbmRleGVzLnB1c2goIGkgKTsKCQkJfQoJCQlyZXR1cm4gbWF0Y2hJbmRleGVzOwoJCX0pLAoKCQkib2RkIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7CgkJCXZhciBpID0gMTsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7CgkJCQltYXRjaEluZGV4ZXMucHVzaCggaSApOwoJCQl9CgkJCXJldHVybiBtYXRjaEluZGV4ZXM7CgkJfSksCgoJCSJsdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKCQkJdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50OwoJCQlmb3IgKCA7IC0taSA+PSAwOyApIHsKCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKCQl9KSwKCgkJImd0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgewoJCQl2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7CgkJCWZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHsKCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKCQl9KQoJfQp9OwoKRXhwci5wc2V1ZG9zWyJudGgiXSA9IEV4cHIucHNldWRvc1siZXEiXTsKCi8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zCmZvciAoIGkgaW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1ZSB9ICkgewoJRXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApOwp9CmZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7CglFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApOwp9CgovLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNldEZpbHRlcnMKZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9CnNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zOwpFeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0RmlsdGVycygpOwoKdG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHsKCXZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0eXBlLAoJCXNvRmFyLCBncm91cHMsIHByZUZpbHRlcnMsCgkJY2FjaGVkID0gdG9rZW5DYWNoZVsgc2VsZWN0b3IgKyAiICIgXTsKCglpZiAoIGNhY2hlZCApIHsKCQlyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApOwoJfQoKCXNvRmFyID0gc2VsZWN0b3I7Cglncm91cHMgPSBbXTsKCXByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjsKCgl3aGlsZSAoIHNvRmFyICkgewoKCQkvLyBDb21tYSBhbmQgZmlyc3QgcnVuCgkJaWYgKCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7CgkJCWlmICggbWF0Y2ggKSB7CgkJCQkvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZAoJCQkJc29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICkgfHwgc29GYXI7CgkJCX0KCQkJZ3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTsKCQl9CgoJCW1hdGNoZWQgPSBmYWxzZTsKCgkJLy8gQ29tYmluYXRvcnMKCQlpZiAoIChtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApKSApIHsKCQkJbWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7CgkJCXRva2Vucy5wdXNoKHsKCQkJCXZhbHVlOiBtYXRjaGVkLAoJCQkJLy8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlCgkJCQl0eXBlOiBtYXRjaFswXS5yZXBsYWNlKCBydHJpbSwgIiAiICkKCQkJfSk7CgkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CgkJfQoKCQkvLyBGaWx0ZXJzCgkJZm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHsKCQkJaWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fAoJCQkJKG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7CgkJCQltYXRjaGVkID0gbWF0Y2guc2hpZnQoKTsKCQkJCXRva2Vucy5wdXNoKHsKCQkJCQl2YWx1ZTogbWF0Y2hlZCwKCQkJCQl0eXBlOiB0eXBlLAoJCQkJCW1hdGNoZXM6IG1hdGNoCgkJCQl9KTsKCQkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CgkJCX0KCQl9CgoJCWlmICggIW1hdGNoZWQgKSB7CgkJCWJyZWFrOwoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNlc3MKCS8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZwoJLy8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvciBvciByZXR1cm4gdG9rZW5zCglyZXR1cm4gcGFyc2VPbmx5ID8KCQlzb0Zhci5sZW5ndGggOgoJCXNvRmFyID8KCQkJU2l6emxlLmVycm9yKCBzZWxlY3RvciApIDoKCQkJLy8gQ2FjaGUgdGhlIHRva2VucwoJCQl0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTsKfTsKCmZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHsKCXZhciBpID0gMCwKCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAoJCXNlbGVjdG9yID0gIiI7Cglmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQlzZWxlY3RvciArPSB0b2tlbnNbaV0udmFsdWU7Cgl9CglyZXR1cm4gc2VsZWN0b3I7Cn0KCmZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7Cgl2YXIgZGlyID0gY29tYmluYXRvci5kaXIsCgkJc2tpcCA9IGNvbWJpbmF0b3IubmV4dCwKCQlrZXkgPSBza2lwIHx8IGRpciwKCQljaGVja05vbkVsZW1lbnRzID0gYmFzZSAmJiBrZXkgPT09ICJwYXJlbnROb2RlIiwKCQlkb25lTmFtZSA9IGRvbmUrKzsKCglyZXR1cm4gY29tYmluYXRvci5maXJzdCA/CgkJLy8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50CgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkgewoJCQkJCXJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfSA6CgoJCS8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50cwoJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CgkJCXZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsCgkJCQluZXdDYWNoZSA9IFsgZGlycnVucywgZG9uZU5hbWUgXTsKCgkJCS8vIFdlIGNhbid0IHNldCBhcmJpdHJhcnkgZGF0YSBvbiBYTUwgbm9kZXMsIHNvIHRoZXkgZG9uJ3QgYmVuZWZpdCBmcm9tIGNvbWJpbmF0b3IgY2FjaGluZwoJCQlpZiAoIHhtbCApIHsKCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CgkJCQkJCWlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7CgkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CgkJCQkJCW91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKGVsZW1bIGV4cGFuZG8gXSA9IHt9KTsKCgkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpCgkJCQkJCXVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7CgoJCQkJCQlpZiAoIHNraXAgJiYgc2tpcCA9PT0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICkgewoJCQkJCQkJZWxlbSA9IGVsZW1bIGRpciBdIHx8IGVsZW07CgkJCQkJCX0gZWxzZSBpZiAoIChvbGRDYWNoZSA9IHVuaXF1ZUNhY2hlWyBrZXkgXSkgJiYKCQkJCQkJCW9sZENhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgb2xkQ2FjaGVbIDEgXSA9PT0gZG9uZU5hbWUgKSB7CgoJCQkJCQkJLy8gQXNzaWduIHRvIG5ld0NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHMKCQkJCQkJCXJldHVybiAobmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50cwoJCQkJCQkJdW5pcXVlQ2FjaGVbIGtleSBdID0gbmV3Q2FjaGU7CgoJCQkJCQkJLy8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nCgkJCQkJCQlpZiAoIChuZXdDYWNoZVsgMiBdID0gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkpICkgewoJCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9Owp9CgpmdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7CglyZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/CgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJdmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7CgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCAhbWF0Y2hlcnNbaV0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkgewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gdHJ1ZTsKCQl9IDoKCQltYXRjaGVyc1swXTsKfQoKZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkgewoJdmFyIGkgPSAwLAoJCWxlbiA9IGNvbnRleHRzLmxlbmd0aDsKCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewoJCVNpenpsZSggc2VsZWN0b3IsIGNvbnRleHRzW2ldLCByZXN1bHRzICk7Cgl9CglyZXR1cm4gcmVzdWx0czsKfQoKZnVuY3Rpb24gY29uZGVuc2UoIHVubWF0Y2hlZCwgbWFwLCBmaWx0ZXIsIGNvbnRleHQsIHhtbCApIHsKCXZhciBlbGVtLAoJCW5ld1VubWF0Y2hlZCA9IFtdLAoJCWkgPSAwLAoJCWxlbiA9IHVubWF0Y2hlZC5sZW5ndGgsCgkJbWFwcGVkID0gbWFwICE9IG51bGw7CgoJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJaWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7CgkJCWlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkgewoJCQkJbmV3VW5tYXRjaGVkLnB1c2goIGVsZW0gKTsKCQkJCWlmICggbWFwcGVkICkgewoJCQkJCW1hcC5wdXNoKCBpICk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIG5ld1VubWF0Y2hlZDsKfQoKZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkgewoJaWYgKCBwb3N0RmlsdGVyICYmICFwb3N0RmlsdGVyWyBleHBhbmRvIF0gKSB7CgkJcG9zdEZpbHRlciA9IHNldE1hdGNoZXIoIHBvc3RGaWx0ZXIgKTsKCX0KCWlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkgewoJCXBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTsKCX0KCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHsKCQl2YXIgdGVtcCwgaSwgZWxlbSwKCQkJcHJlTWFwID0gW10sCgkJCXBvc3RNYXAgPSBbXSwKCQkJcHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCwKCgkJCS8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0CgkJCWVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCAiKiIsIGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksCgoJCQkvLyBQcmVmaWx0ZXIgdG8gZ2V0IG1hdGNoZXIgaW5wdXQsIHByZXNlcnZpbmcgYSBtYXAgZm9yIHNlZWQtcmVzdWx0cyBzeW5jaHJvbml6YXRpb24KCQkJbWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/CgkJCQljb25kZW5zZSggZWxlbXMsIHByZU1hcCwgcHJlRmlsdGVyLCBjb250ZXh0LCB4bWwgKSA6CgkJCQllbGVtcywKCgkJCW1hdGNoZXJPdXQgPSBtYXRjaGVyID8KCQkJCS8vIElmIHdlIGhhdmUgYSBwb3N0RmluZGVyLCBvciBmaWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyIG9yIHByZWV4aXN0aW5nIHJlc3VsdHMsCgkJCQlwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/CgoJCQkJCS8vIC4uLmludGVybWVkaWF0ZSBwcm9jZXNzaW5nIGlzIG5lY2Vzc2FyeQoJCQkJCVtdIDoKCgkJCQkJLy8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5CgkJCQkJcmVzdWx0cyA6CgkJCQltYXRjaGVySW47CgoJCS8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzCgkJaWYgKCBtYXRjaGVyICkgewoJCQltYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApOwoJCX0KCgkJLy8gQXBwbHkgcG9zdEZpbHRlcgoJCWlmICggcG9zdEZpbHRlciApIHsKCQkJdGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7CgkJCXBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTsKCgkJCS8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW4KCQkJaSA9IHRlbXAubGVuZ3RoOwoJCQl3aGlsZSAoIGktLSApIHsKCQkJCWlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHsKCQkJCQltYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7CgkJCQl9CgkJCX0KCQl9CgoJCWlmICggc2VlZCApIHsKCQkJaWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHsKCQkJCWlmICggcG9zdEZpbmRlciApIHsKCQkJCQkvLyBHZXQgdGhlIGZpbmFsIG1hdGNoZXJPdXQgYnkgY29uZGVuc2luZyB0aGlzIGludGVybWVkaWF0ZSBpbnRvIHBvc3RGaW5kZXIgY29udGV4dHMKCQkJCQl0ZW1wID0gW107CgkJCQkJaSA9IG1hdGNoZXJPdXQubGVuZ3RoOwoJCQkJCXdoaWxlICggaS0tICkgewoJCQkJCQlpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7CgkJCQkJCQkvLyBSZXN0b3JlIG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQgYSBmaW5hbCBtYXRjaAoJCQkJCQkJdGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlwb3N0RmluZGVyKCBudWxsLCAobWF0Y2hlck91dCA9IFtdKSwgdGVtcCwgeG1sICk7CgkJCQl9CgoJCQkJLy8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWQKCQkJCWkgPSBtYXRjaGVyT3V0Lmxlbmd0aDsKCQkJCXdoaWxlICggaS0tICkgewoJCQkJCWlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSAmJgoJCQkJCQkodGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mKCBzZWVkLCBlbGVtICkgOiBwcmVNYXBbaV0pID4gLTEgKSB7CgoJCQkJCQlzZWVkW3RlbXBdID0gIShyZXN1bHRzW3RlbXBdID0gZWxlbSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCS8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZAoJCX0gZWxzZSB7CgkJCW1hdGNoZXJPdXQgPSBjb25kZW5zZSgKCQkJCW1hdGNoZXJPdXQgPT09IHJlc3VsdHMgPwoJCQkJCW1hdGNoZXJPdXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6CgkJCQkJbWF0Y2hlck91dAoJCQkpOwoJCQlpZiAoIHBvc3RGaW5kZXIgKSB7CgkJCQlwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTsKCQkJfSBlbHNlIHsKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTsKCQkJfQoJCX0KCX0pOwp9CgpmdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkgewoJdmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaiwKCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAoJCWxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1swXS50eXBlIF0sCgkJaW1wbGljaXRSZWxhdGl2ZSA9IGxlYWRpbmdSZWxhdGl2ZSB8fCBFeHByLnJlbGF0aXZlWyIgIl0sCgkJaSA9IGxlYWRpbmdSZWxhdGl2ZSA/IDEgOiAwLAoKCQkvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKQoJCW1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0OwoJCX0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSwKCQltYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGluZGV4T2YoIGNoZWNrQ29udGV4dCwgZWxlbSApID4gLTE7CgkJfSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLAoJCW1hdGNoZXJzID0gWyBmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgewoJCQl2YXIgcmV0ID0gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8ICgKCQkJCShjaGVja0NvbnRleHQgPSBjb250ZXh0KS5ub2RlVHlwZSA/CgkJCQkJbWF0Y2hDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSA6CgkJCQkJbWF0Y2hBbnlDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSApOwoJCQkvLyBBdm9pZCBoYW5naW5nIG9udG8gZWxlbWVudCAoaXNzdWUgIzI5OSkKCQkJY2hlY2tDb250ZXh0ID0gbnVsbDsKCQkJcmV0dXJuIHJldDsKCQl9IF07CgoJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJaWYgKCAobWF0Y2hlciA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1tpXS50eXBlIF0pICkgewoJCQltYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlcikgXTsKCQl9IGVsc2UgewoJCQltYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7CgoJCQkvLyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlcgoJCQlpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHsKCQkJCS8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZwoJCQkJaiA9ICsraTsKCQkJCWZvciAoIDsgaiA8IGxlbjsgaisrICkgewoJCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJcmV0dXJuIHNldE1hdGNoZXIoCgkJCQkJaSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksCgkJCQkJaSA+IDEgJiYgdG9TZWxlY3RvcigKCQkJCQkJLy8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmAKCQkJCQkJdG9rZW5zLnNsaWNlKCAwLCBpIC0gMSApLmNvbmNhdCh7IHZhbHVlOiB0b2tlbnNbIGkgLSAyIF0udHlwZSA9PT0gIiAiID8gIioiIDogIiIgfSkKCQkJCQkpLnJlcGxhY2UoIHJ0cmltLCAiJDEiICksCgkJCQkJbWF0Y2hlciwKCQkJCQlpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSwKCQkJCQlqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksCgkJCQkJaiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKQoJCQkJKTsKCQkJfQoJCQltYXRjaGVycy5wdXNoKCBtYXRjaGVyICk7CgkJfQoJfQoKCXJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTsKfQoKZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgewoJdmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCwKCQlieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCwKCQlzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBvdXRlcm1vc3QgKSB7CgkJCXZhciBlbGVtLCBqLCBtYXRjaGVyLAoJCQkJbWF0Y2hlZENvdW50ID0gMCwKCQkJCWkgPSAiMCIsCgkJCQl1bm1hdGNoZWQgPSBzZWVkICYmIFtdLAoJCQkJc2V0TWF0Y2hlZCA9IFtdLAoJCQkJY29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsCgkJCQkvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0CgkJCQllbGVtcyA9IHNlZWQgfHwgYnlFbGVtZW50ICYmIEV4cHIuZmluZFsiVEFHIl0oICIqIiwgb3V0ZXJtb3N0ICksCgkJCQkvLyBVc2UgaW50ZWdlciBkaXJydW5zIGlmZiB0aGlzIGlzIHRoZSBvdXRlcm1vc3QgbWF0Y2hlcgoJCQkJZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksCgkJCQlsZW4gPSBlbGVtcy5sZW5ndGg7CgoJCQlpZiAoIG91dGVybW9zdCApIHsKCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDsKCQkJfQoKCQkJLy8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHMKCQkJLy8gU3VwcG9ydDogSUU8OSwgU2FmYXJpCgkJCS8vIFRvbGVyYXRlIE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiAibGVuZ3RoIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0Y2hpbmcgZWxlbWVudHMgYnkgaWQKCQkJZm9yICggOyBpICE9PSBsZW4gJiYgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBieUVsZW1lbnQgJiYgZWxlbSApIHsKCQkJCQlqID0gMDsKCQkJCQlpZiAoICFjb250ZXh0ICYmIGVsZW0ub3duZXJEb2N1bWVudCAhPT0gZG9jdW1lbnQgKSB7CgkJCQkJCXNldERvY3VtZW50KCBlbGVtICk7CgkJCQkJCXhtbCA9ICFkb2N1bWVudElzSFRNTDsKCQkJCQl9CgkJCQkJd2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHsKCQkJCQkJaWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0IHx8IGRvY3VtZW50LCB4bWwpICkgewoJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCQlpZiAoIG91dGVybW9zdCApIHsKCQkJCQkJZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnMKCQkJCWlmICggYnlTZXQgKSB7CgkJCQkJLy8gVGhleSB3aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVycwoJCQkJCWlmICggKGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtKSApIHsKCQkJCQkJbWF0Y2hlZENvdW50LS07CgkJCQkJfQoKCQkJCQkvLyBMZW5ndGhlbiB0aGUgYXJyYXkgZm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Igbm90CgkJCQkJaWYgKCBzZWVkICkgewoJCQkJCQl1bm1hdGNoZWQucHVzaCggZWxlbSApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gYGlgIGlzIG5vdyB0aGUgY291bnQgb2YgZWxlbWVudHMgdmlzaXRlZCBhYm92ZSwgYW5kIGFkZGluZyBpdCB0byBgbWF0Y2hlZENvdW50YAoJCQkvLyBtYWtlcyB0aGUgbGF0dGVyIG5vbm5lZ2F0aXZlLgoJCQltYXRjaGVkQ291bnQgKz0gaTsKCgkJCS8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50cwoJCQkvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgCgkJCS8vIGVxdWFscyBgaWApLCB1bmxlc3Mgd2UgZGlkbid0IHZpc2l0IF9hbnlfIGVsZW1lbnRzIGluIHRoZSBhYm92ZSBsb29wIGJlY2F1c2Ugd2UgaGF2ZQoJCQkvLyBubyBlbGVtZW50IG1hdGNoZXJzIGFuZCBubyBzZWVkLgoJCQkvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyAiMCIgYGlgIGFsbG93cyBgaWAgdG8gcmVtYWluIGEgc3RyaW5nIG9ubHkgaW4gdGhhdAoJCQkvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhICIwMCIgYG1hdGNoZWRDb3VudGAgdGhhdCBkaWZmZXJzIGZyb20gYGlgIGJ1dCBpcyBhbHNvCgkJCS8vIG51bWVyaWNhbGx5IHplcm8uCgkJCWlmICggYnlTZXQgJiYgaSAhPT0gbWF0Y2hlZENvdW50ICkgewoJCQkJaiA9IDA7CgkJCQl3aGlsZSAoIChtYXRjaGVyID0gc2V0TWF0Y2hlcnNbaisrXSkgKSB7CgkJCQkJbWF0Y2hlciggdW5tYXRjaGVkLCBzZXRNYXRjaGVkLCBjb250ZXh0LCB4bWwgKTsKCQkJCX0KCgkJCQlpZiAoIHNlZWQgKSB7CgkJCQkJLy8gUmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZwoJCQkJCWlmICggbWF0Y2hlZENvdW50ID4gMCApIHsKCQkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCQlpZiAoICEodW5tYXRjaGVkW2ldIHx8IHNldE1hdGNoZWRbaV0pICkgewoJCQkJCQkJCXNldE1hdGNoZWRbaV0gPSBwb3AuY2FsbCggcmVzdWx0cyApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBEaXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlcwoJCQkJCXNldE1hdGNoZWQgPSBjb25kZW5zZSggc2V0TWF0Y2hlZCApOwoJCQkJfQoKCQkJCS8vIEFkZCBtYXRjaGVzIHRvIHJlc3VsdHMKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTsKCgkJCQkvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmcKCQkJCWlmICggb3V0ZXJtb3N0ICYmICFzZWVkICYmIHNldE1hdGNoZWQubGVuZ3RoID4gMCAmJgoJCQkJCSggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAxICkgewoKCQkJCQlTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOwoJCQkJfQoJCQl9CgoJCQkvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnMKCQkJaWYgKCBvdXRlcm1vc3QgKSB7CgkJCQlkaXJydW5zID0gZGlycnVuc1VuaXF1ZTsKCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0QmFja3VwOwoJCQl9CgoJCQlyZXR1cm4gdW5tYXRjaGVkOwoJCX07CgoJcmV0dXJuIGJ5U2V0ID8KCQltYXJrRnVuY3Rpb24oIHN1cGVyTWF0Y2hlciApIDoKCQlzdXBlck1hdGNoZXI7Cn0KCmNvbXBpbGUgPSBTaXp6bGUuY29tcGlsZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgbWF0Y2ggLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7Cgl2YXIgaSwKCQlzZXRNYXRjaGVycyA9IFtdLAoJCWVsZW1lbnRNYXRjaGVycyA9IFtdLAoJCWNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF07CgoJaWYgKCAhY2FjaGVkICkgewoJCS8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudAoJCWlmICggIW1hdGNoICkgewoJCQltYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApOwoJCX0KCQlpID0gbWF0Y2gubGVuZ3RoOwoJCXdoaWxlICggaS0tICkgewoJCQljYWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggbWF0Y2hbaV0gKTsKCQkJaWYgKCBjYWNoZWRbIGV4cGFuZG8gXSApIHsKCQkJCXNldE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOwoJCQl9CgkJfQoKCQkvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24KCQljYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTsKCgkJLy8gU2F2ZSBzZWxlY3RvciBhbmQgdG9rZW5pemF0aW9uCgkJY2FjaGVkLnNlbGVjdG9yID0gc2VsZWN0b3I7Cgl9CglyZXR1cm4gY2FjaGVkOwp9OwoKLyoqCiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWQKICogIHNlbGVjdG9yIGZ1bmN0aW9ucwogKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc2VsZWN0b3IgQSBzZWxlY3RvciBvciBhIHByZS1jb21waWxlZAogKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZQogKiBAcGFyYW0ge0VsZW1lbnR9IGNvbnRleHQKICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdHNdCiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0CiAqLwpzZWxlY3QgPSBTaXp6bGUuc2VsZWN0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkgewoJdmFyIGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZpbmQsCgkJY29tcGlsZWQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgJiYgc2VsZWN0b3IsCgkJbWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7CgoJcmVzdWx0cyA9IHJlc3VsdHMgfHwgW107CgoJLy8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWQKCS8vICh0aGUgbGF0dGVyIG9mIHdoaWNoIGd1YXJhbnRlZXMgdXMgY29udGV4dCkKCWlmICggbWF0Y2gubGVuZ3RoID09PSAxICkgewoKCQkvLyBSZWR1Y2UgY29udGV4dCBpZiB0aGUgbGVhZGluZyBjb21wb3VuZCBzZWxlY3RvciBpcyBhbiBJRAoJCXRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTsKCQlpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gIklEIiAmJgoJCQkJY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJiBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkgewoKCQkJY29udGV4dCA9ICggRXhwci5maW5kWyJJRCJdKCB0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UocnVuZXNjYXBlLCBmdW5lc2NhcGUpLCBjb250ZXh0ICkgfHwgW10gKVswXTsKCQkJaWYgKCAhY29udGV4dCApIHsKCQkJCXJldHVybiByZXN1bHRzOwoKCQkJLy8gUHJlY29tcGlsZWQgbWF0Y2hlcnMgd2lsbCBzdGlsbCB2ZXJpZnkgYW5jZXN0cnksIHNvIHN0ZXAgdXAgYSBsZXZlbAoJCQl9IGVsc2UgaWYgKCBjb21waWxlZCApIHsKCQkJCWNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGU7CgkJCX0KCgkJCXNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApOwoJCX0KCgkJLy8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZwoJCWkgPSBtYXRjaEV4cHJbIm5lZWRzQ29udGV4dCJdLnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDsKCQl3aGlsZSAoIGktLSApIHsKCQkJdG9rZW4gPSB0b2tlbnNbaV07CgoJCQkvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yCgkJCWlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBdICkgewoJCQkJYnJlYWs7CgkJCX0KCQkJaWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHsKCQkJCS8vIFNlYXJjaCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBjb21iaW5hdG9ycwoJCQkJaWYgKCAoc2VlZCA9IGZpbmQoCgkJCQkJdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLAoJCQkJCXJzaWJsaW5nLnRlc3QoIHRva2Vuc1swXS50eXBlICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHQKCQkJCSkpICkgewoKCQkJCQkvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHkKCQkJCQl0b2tlbnMuc3BsaWNlKCBpLCAxICk7CgkJCQkJc2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTsKCQkJCQlpZiAoICFzZWxlY3RvciApIHsKCQkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgc2VlZCApOwoJCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCQl9CgoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoJfQoKCS8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRlZAoJLy8gUHJvdmlkZSBgbWF0Y2hgIHRvIGF2b2lkIHJldG9rZW5pemF0aW9uIGlmIHdlIG1vZGlmaWVkIHRoZSBzZWxlY3RvciBhYm92ZQoJKCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKAoJCXNlZWQsCgkJY29udGV4dCwKCQkhZG9jdW1lbnRJc0hUTUwsCgkJcmVzdWx0cywKCQkhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0CgkpOwoJcmV0dXJuIHJlc3VsdHM7Cn07CgovLyBPbmUtdGltZSBhc3NpZ25tZW50cwoKLy8gU29ydCBzdGFiaWxpdHkKc3VwcG9ydC5zb3J0U3RhYmxlID0gZXhwYW5kby5zcGxpdCgiIikuc29ydCggc29ydE9yZGVyICkuam9pbigiIikgPT09IGV4cGFuZG87CgovLyBTdXBwb3J0OiBDaHJvbWUgMTQtMzUrCi8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24Kc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gISFoYXNEdXBsaWNhdGU7CgovLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnQKc2V0RG9jdW1lbnQoKTsKCi8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBpbiBDaHJvbWUgMjcpCi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKgpzdXBwb3J0LnNvcnREZXRhY2hlZCA9IGFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZykKCXJldHVybiBlbC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSApICYgMTsKfSk7CgovLyBTdXBwb3J0OiBJRTw4Ci8vIFByZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5ICJpbnRlcnBvbGF0aW9uIgovLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM2NDI5JTI4VlMuODUlMjkuYXNweAppZiAoICFhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJZWwuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iOwoJcmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikgPT09ICIjIiA7Cn0pICkgewoJYWRkSGFuZGxlKCAidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHsKCQlpZiAoICFpc1hNTCApIHsKCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJ0eXBlIiA/IDEgOiAyICk7CgkJfQoJfSk7Cn0KCi8vIFN1cHBvcnQ6IElFPDkKLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoInZhbHVlIikKaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJZWwuaW5uZXJIVE1MID0gIjxpbnB1dC8+IjsKCWVsLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCAidmFsdWUiLCAiIiApOwoJcmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCAidmFsdWUiICkgPT09ICIiOwp9KSApIHsKCWFkZEhhbmRsZSggInZhbHVlIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewoJCWlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiApIHsKCQkJcmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlOwoJCX0KCX0pOwp9CgovLyBTdXBwb3J0OiBJRTw5Ci8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXMKaWYgKCAhYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCXJldHVybiBlbC5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT0gbnVsbDsKfSkgKSB7CglhZGRIYW5kbGUoIGJvb2xlYW5zLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7CgkJdmFyIHZhbDsKCQlpZiAoICFpc1hNTCApIHsKCQkJcmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6CgkJCQkJKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID8KCQkJCQl2YWwudmFsdWUgOgoJCQkJbnVsbDsKCQl9Cgl9KTsKfQoKcmV0dXJuIFNpenpsZTsKCn0pKCB3aW5kb3cgKTsKCgoKalF1ZXJ5LmZpbmQgPSBTaXp6bGU7CmpRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9yczsKCi8vIERlcHJlY2F0ZWQKalF1ZXJ5LmV4cHJbICI6IiBdID0galF1ZXJ5LmV4cHIucHNldWRvczsKalF1ZXJ5LnVuaXF1ZVNvcnQgPSBqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7CmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7CmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDsKalF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zOwpqUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBTaXp6bGUuZXNjYXBlOwoKCgoKdmFyIGRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkgewoJdmFyIG1hdGNoZWQgPSBbXSwKCQl0cnVuY2F0ZSA9IHVudGlsICE9PSB1bmRlZmluZWQ7CgoJd2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICYmIGVsZW0ubm9kZVR5cGUgIT09IDkgKSB7CgkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQlpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkgewoJCQkJYnJlYWs7CgkJCX0KCQkJbWF0Y2hlZC5wdXNoKCBlbGVtICk7CgkJfQoJfQoJcmV0dXJuIG1hdGNoZWQ7Cn07CgoKdmFyIHNpYmxpbmdzID0gZnVuY3Rpb24oIG4sIGVsZW0gKSB7Cgl2YXIgbWF0Y2hlZCA9IFtdOwoKCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7CgkJaWYgKCBuLm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7CgkJCW1hdGNoZWQucHVzaCggbiApOwoJCX0KCX0KCglyZXR1cm4gbWF0Y2hlZDsKfTsKCgp2YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDsKCgoKZnVuY3Rpb24gbm9kZU5hbWUoIGVsZW0sIG5hbWUgKSB7CgogIHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKfTsKdmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pICk7CgoKCi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90CmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwgbm90ICkgewoJaWYgKCBpc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHsKCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJcmV0dXJuICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKSAhPT0gbm90OwoJCX0gKTsKCX0KCgkvLyBTaW5nbGUgZWxlbWVudAoJaWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7CgkJfSApOwoJfQoKCS8vIEFycmF5bGlrZSBvZiBlbGVtZW50cyAoalF1ZXJ5LCBhcmd1bWVudHMsIEFycmF5KQoJaWYgKCB0eXBlb2YgcXVhbGlmaWVyICE9PSAic3RyaW5nIiApIHsKCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuICggaW5kZXhPZi5jYWxsKCBxdWFsaWZpZXIsIGVsZW0gKSA+IC0xICkgIT09IG5vdDsKCQl9ICk7Cgl9CgoJLy8gRmlsdGVyZWQgZGlyZWN0bHkgZm9yIGJvdGggc2ltcGxlIGFuZCBjb21wbGV4IHNlbGVjdG9ycwoJcmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApOwp9CgpqUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7Cgl2YXIgZWxlbSA9IGVsZW1zWyAwIF07CgoJaWYgKCBub3QgKSB7CgkJZXhwciA9ICI6bm90KCIgKyBleHByICsgIikiOwoJfQoKCWlmICggZWxlbXMubGVuZ3RoID09PSAxICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJcmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZWxlbSwgZXhwciApID8gWyBlbGVtIF0gOiBbXTsKCX0KCglyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTsKCX0gKSApOwp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBpLCByZXQsCgkJCWxlbiA9IHRoaXMubGVuZ3RoLAoJCQlzZWxmID0gdGhpczsKCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoIGZ1bmN0aW9uKCkgewoJCQkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKCQkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7CgkJCQkJCXJldHVybiB0cnVlOwoJCQkJCX0KCQkJCX0KCQkJfSApICk7CgkJfQoKCQlyZXQgPSB0aGlzLnB1c2hTdGFjayggW10gKTsKCgkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKCQkJalF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCBzZWxmWyBpIF0sIHJldCApOwoJCX0KCgkJcmV0dXJuIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggcmV0ICkgOiByZXQ7Cgl9LAoJZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSApICk7Cgl9LAoJbm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCB0cnVlICkgKTsKCX0sCglpczogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiAhIXdpbm5vdygKCQkJdGhpcywKCgkJCS8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXQKCQkJLy8gc28gJCgicDpmaXJzdCIpLmlzKCJwOmxhc3QiKSB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gInAiLgoJCQl0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICYmIHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/CgkJCQlqUXVlcnkoIHNlbGVjdG9yICkgOgoJCQkJc2VsZWN0b3IgfHwgW10sCgkJCWZhbHNlCgkJKS5sZW5ndGg7Cgl9Cn0gKTsKCgovLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdAoKCi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KQp2YXIgcm9vdGpRdWVyeSwKCgkvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5ncwoJLy8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKQoJLy8gU3RyaWN0IEhUTUwgcmVjb2duaXRpb24gKCMxMTI5MDogbXVzdCBzdGFydCB3aXRoIDwpCgkvLyBTaG9ydGN1dCBzaW1wbGUgI2lkIGNhc2UgZm9yIHNwZWVkCglycXVpY2tFeHByID0gL14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLywKCglpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7CgkJdmFyIG1hdGNoLCBlbGVtOwoKCQkvLyBIQU5ETEU6ICQoIiIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpCgkJaWYgKCAhc2VsZWN0b3IgKSB7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJLy8gTWV0aG9kIGluaXQoKSBhY2NlcHRzIGFuIGFsdGVybmF0ZSByb290alF1ZXJ5CgkJLy8gc28gbWlncmF0ZSBjYW4gc3VwcG9ydCBqUXVlcnkuc3ViIChnaC0yMTAxKQoJCXJvb3QgPSByb290IHx8IHJvb3RqUXVlcnk7CgoJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCWlmICggc2VsZWN0b3JbIDAgXSA9PT0gIjwiICYmCgkJCQlzZWxlY3Rvclsgc2VsZWN0b3IubGVuZ3RoIC0gMSBdID09PSAiPiIgJiYKCQkJCXNlbGVjdG9yLmxlbmd0aCA+PSAzICkgewoKCQkJCS8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrCgkJCQltYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTsKCgkJCX0gZWxzZSB7CgkJCQltYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTsKCQkJfQoKCQkJLy8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZAoJCQlpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkgewoKCQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQoJCQkJaWYgKCBtYXRjaFsgMSBdICkgewoJCQkJCWNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFsgMCBdIDogY29udGV4dDsKCgkJCQkJLy8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0CgkJCQkJLy8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnQKCQkJCQlqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoCgkJCQkJCW1hdGNoWyAxIF0sCgkJCQkJCWNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsCgkJCQkJCXRydWUKCQkJCQkpICk7CgoJCQkJCS8vIEhBTkRMRTogJChodG1sLCBwcm9wcykKCQkJCQlpZiAoIHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbIDEgXSApICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7CgkJCQkJCWZvciAoIG1hdGNoIGluIGNvbnRleHQgKSB7CgoJCQkJCQkJLy8gUHJvcGVydGllcyBvZiBjb250ZXh0IGFyZSBjYWxsZWQgYXMgbWV0aG9kcyBpZiBwb3NzaWJsZQoJCQkJCQkJaWYgKCBpc0Z1bmN0aW9uKCB0aGlzWyBtYXRjaCBdICkgKSB7CgkJCQkJCQkJdGhpc1sgbWF0Y2ggXSggY29udGV4dFsgbWF0Y2ggXSApOwoKCQkJCQkJCS8vIC4uLmFuZCBvdGhlcndpc2Ugc2V0IGFzIGF0dHJpYnV0ZXMKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJdGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQlyZXR1cm4gdGhpczsKCgkJCQkvLyBIQU5ETEU6ICQoI2lkKQoJCQkJfSBlbHNlIHsKCQkJCQllbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTsKCgkJCQkJaWYgKCBlbGVtICkgewoKCQkJCQkJLy8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKCQkJCQkJdGhpc1sgMCBdID0gZWxlbTsKCQkJCQkJdGhpcy5sZW5ndGggPSAxOwoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCgkJCS8vIEhBTkRMRTogJChleHByLCAkKC4uLikpCgkJCX0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1ZXJ5ICkgewoJCQkJcmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTsKCgkJCS8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KQoJCQkvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcikKCQkJfSBlbHNlIHsKCQkJCXJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTsKCQkJfQoKCQkvLyBIQU5ETEU6ICQoRE9NRWxlbWVudCkKCQl9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHsKCQkJdGhpc1sgMCBdID0gc2VsZWN0b3I7CgkJCXRoaXMubGVuZ3RoID0gMTsKCQkJcmV0dXJuIHRoaXM7CgoJCS8vIEhBTkRMRTogJChmdW5jdGlvbikKCQkvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHkKCQl9IGVsc2UgaWYgKCBpc0Z1bmN0aW9uKCBzZWxlY3RvciApICkgewoJCQlyZXR1cm4gcm9vdC5yZWFkeSAhPT0gdW5kZWZpbmVkID8KCQkJCXJvb3QucmVhZHkoIHNlbGVjdG9yICkgOgoKCQkJCS8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnQKCQkJCXNlbGVjdG9yKCBqUXVlcnkgKTsKCQl9CgoJCXJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApOwoJfTsKCi8vIEdpdmUgdGhlIGluaXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb24KaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CgovLyBJbml0aWFsaXplIGNlbnRyYWwgcmVmZXJlbmNlCnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7CgoKdmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLAoKCS8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0CglndWFyYW50ZWVkVW5pcXVlID0gewoJCWNoaWxkcmVuOiB0cnVlLAoJCWNvbnRlbnRzOiB0cnVlLAoJCW5leHQ6IHRydWUsCgkJcHJldjogdHJ1ZQoJfTsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCWhhczogZnVuY3Rpb24oIHRhcmdldCApIHsKCQl2YXIgdGFyZ2V0cyA9IGpRdWVyeSggdGFyZ2V0LCB0aGlzICksCgkJCWwgPSB0YXJnZXRzLmxlbmd0aDsKCgkJcmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHsKCQkJdmFyIGkgPSAwOwoJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1sgaSBdICkgKSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0KCQl9ICk7Cgl9LAoKCWNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7CgkJdmFyIGN1ciwKCQkJaSA9IDAsCgkJCWwgPSB0aGlzLmxlbmd0aCwKCQkJbWF0Y2hlZCA9IFtdLAoJCQl0YXJnZXRzID0gdHlwZW9mIHNlbGVjdG9ycyAhPT0gInN0cmluZyIgJiYgalF1ZXJ5KCBzZWxlY3RvcnMgKTsKCgkJLy8gUG9zaXRpb25hbCBzZWxlY3RvcnMgbmV2ZXIgbWF0Y2gsIHNpbmNlIHRoZXJlJ3Mgbm8gX3NlbGVjdGlvbl8gY29udGV4dAoJCWlmICggIXJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgKSB7CgkJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKCQkJCWZvciAoIGN1ciA9IHRoaXNbIGkgXTsgY3VyICYmIGN1ciAhPT0gY29udGV4dDsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7CgoJCQkJCS8vIEFsd2F5cyBza2lwIGRvY3VtZW50IGZyYWdtZW50cwoJCQkJCWlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKCB0YXJnZXRzID8KCQkJCQkJdGFyZ2V0cy5pbmRleCggY3VyICkgPiAtMSA6CgoJCQkJCQkvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGUKCQkJCQkJY3VyLm5vZGVUeXBlID09PSAxICYmCgkJCQkJCQlqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGN1ciwgc2VsZWN0b3JzICkgKSApIHsKCgkJCQkJCW1hdGNoZWQucHVzaCggY3VyICk7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApIDogbWF0Y2hlZCApOwoJfSwKCgkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBzZXQKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnQKCQlpZiAoICFlbGVtICkgewoJCQlyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7CgkJfQoKCQkvLyBJbmRleCBpbiBzZWxlY3RvcgoJCWlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gaW5kZXhPZi5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdGhpc1sgMCBdICk7CgkJfQoKCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4gaW5kZXhPZi5jYWxsKCB0aGlzLAoKCQkJLy8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkCgkJCWVsZW0uanF1ZXJ5ID8gZWxlbVsgMCBdIDogZWxlbQoJCSk7Cgl9LAoKCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjaygKCQkJalF1ZXJ5LnVuaXF1ZVNvcnQoCgkJCQlqUXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSApCgkJCSkKCQkpOwoJfSwKCglhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID8KCQkJdGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKQoJCSk7Cgl9Cn0gKTsKCmZ1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkgewoJd2hpbGUgKCAoIGN1ciA9IGN1clsgZGlyIF0gKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fQoJcmV0dXJuIGN1cjsKfQoKalF1ZXJ5LmVhY2goIHsKCXBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQlyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsOwoJfSwKCXBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJwYXJlbnROb2RlIiApOwoJfSwKCXBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJwYXJlbnROb2RlIiwgdW50aWwgKTsKCX0sCgluZXh0OiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gc2libGluZyggZWxlbSwgIm5leHRTaWJsaW5nIiApOwoJfSwKCXByZXY6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5nKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwoJfSwKCW5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJuZXh0U2libGluZyIgKTsKCX0sCglwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZGlyKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwoJfSwKCW5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJuZXh0U2libGluZyIsIHVudGlsICk7Cgl9LAoJcHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7CgkJcmV0dXJuIGRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIsIHVudGlsICk7Cgl9LAoJc2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5ncyggKCBlbGVtLnBhcmVudE5vZGUgfHwge30gKS5maXJzdENoaWxkLCBlbGVtICk7Cgl9LAoJY2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5ncyggZWxlbS5maXJzdENoaWxkICk7Cgl9LAoJY29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewogICAgICAgIGlmICggbm9kZU5hbWUoIGVsZW0sICJpZnJhbWUiICkgKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtLmNvbnRlbnREb2N1bWVudDsKICAgICAgICB9CgogICAgICAgIC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5LCBpT1MgNyBvbmx5LCBBbmRyb2lkIEJyb3dzZXIgPD00LjMgb25seQogICAgICAgIC8vIFRyZWF0IHRoZSB0ZW1wbGF0ZSBlbGVtZW50IGFzIGEgcmVndWxhciBvbmUgaW4gYnJvd3NlcnMgdGhhdAogICAgICAgIC8vIGRvbid0IHN1cHBvcnQgaXQuCiAgICAgICAgaWYgKCBub2RlTmFtZSggZWxlbSwgInRlbXBsYXRlIiApICkgewogICAgICAgICAgICBlbGVtID0gZWxlbS5jb250ZW50IHx8IGVsZW07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7Cgl9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHsKCQl2YXIgbWF0Y2hlZCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApOwoKCQlpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09ICJVbnRpbCIgKSB7CgkJCXNlbGVjdG9yID0gdW50aWw7CgkJfQoKCQlpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCW1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApOwoJCX0KCgkJaWYgKCB0aGlzLmxlbmd0aCA+IDEgKSB7CgoJCQkvLyBSZW1vdmUgZHVwbGljYXRlcwoJCQlpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7CgkJCQlqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApOwoJCQl9CgoJCQkvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlcwoJCQlpZiAoIHJwYXJlbnRzcHJldi50ZXN0KCBuYW1lICkgKSB7CgkJCQltYXRjaGVkLnJldmVyc2UoKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkICk7Cgl9Owp9ICk7CnZhciBybm90aHRtbHdoaXRlID0gKCAvW15ceDIwXHRcclxuXGZdKy9nICk7CgoKCi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzCmZ1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7Cgl2YXIgb2JqZWN0ID0ge307CglqUXVlcnkuZWFjaCggb3B0aW9ucy5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbiggXywgZmxhZyApIHsKCQlvYmplY3RbIGZsYWcgXSA9IHRydWU7Cgl9ICk7CglyZXR1cm4gb2JqZWN0Owp9CgovKgogKiBDcmVhdGUgYSBjYWxsYmFjayBsaXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKICoKICoJb3B0aW9uczogYW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvdwogKgkJCXRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3QKICoKICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmUKICogImZpcmVkIiBtdWx0aXBsZSB0aW1lcy4KICoKICogUG9zc2libGUgb3B0aW9uczoKICoKICoJb25jZToJCQl3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpCiAqCiAqCW1lbW9yeToJCQl3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkCiAqCQkJCQlhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCAibWVtb3JpemVkIgogKgkJCQkJdmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpCiAqCiAqCXVuaXF1ZToJCQl3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdCkKICoKICoJc3RvcE9uRmFsc2U6CWludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZQogKgogKi8KalF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoKCS8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWQKCS8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdCkKCW9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gInN0cmluZyIgPwoJCWNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSA6CgkJalF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTsKCgl2YXIgLy8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZwoJCWZpcmluZywKCgkJLy8gTGFzdCBmaXJlIHZhbHVlIGZvciBub24tZm9yZ2V0dGFibGUgbGlzdHMKCQltZW1vcnksCgoJCS8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkCgkJZmlyZWQsCgoJCS8vIEZsYWcgdG8gcHJldmVudCBmaXJpbmcKCQlsb2NrZWQsCgoJCS8vIEFjdHVhbCBjYWxsYmFjayBsaXN0CgkJbGlzdCA9IFtdLAoKCQkvLyBRdWV1ZSBvZiBleGVjdXRpb24gZGF0YSBmb3IgcmVwZWF0YWJsZSBsaXN0cwoJCXF1ZXVlID0gW10sCgoJCS8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IGFkZC9yZW1vdmUgYXMgbmVlZGVkKQoJCWZpcmluZ0luZGV4ID0gLTEsCgoJCS8vIEZpcmUgY2FsbGJhY2tzCgkJZmlyZSA9IGZ1bmN0aW9uKCkgewoKCQkJLy8gRW5mb3JjZSBzaW5nbGUtZmlyaW5nCgkJCWxvY2tlZCA9IGxvY2tlZCB8fCBvcHRpb25zLm9uY2U7CgoJCQkvLyBFeGVjdXRlIGNhbGxiYWNrcyBmb3IgYWxsIHBlbmRpbmcgZXhlY3V0aW9ucywKCQkJLy8gcmVzcGVjdGluZyBmaXJpbmdJbmRleCBvdmVycmlkZXMgYW5kIHJ1bnRpbWUgY2hhbmdlcwoJCQlmaXJlZCA9IGZpcmluZyA9IHRydWU7CgkJCWZvciAoIDsgcXVldWUubGVuZ3RoOyBmaXJpbmdJbmRleCA9IC0xICkgewoJCQkJbWVtb3J5ID0gcXVldWUuc2hpZnQoKTsKCQkJCXdoaWxlICggKytmaXJpbmdJbmRleCA8IGxpc3QubGVuZ3RoICkgewoKCQkJCQkvLyBSdW4gY2FsbGJhY2sgYW5kIGNoZWNrIGZvciBlYXJseSB0ZXJtaW5hdGlvbgoJCQkJCWlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggbWVtb3J5WyAwIF0sIG1lbW9yeVsgMSBdICkgPT09IGZhbHNlICYmCgkJCQkJCW9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7CgoJCQkJCQkvLyBKdW1wIHRvIGVuZCBhbmQgZm9yZ2V0IHRoZSBkYXRhIHNvIC5hZGQgZG9lc24ndCByZS1maXJlCgkJCQkJCWZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGg7CgkJCQkJCW1lbW9yeSA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gRm9yZ2V0IHRoZSBkYXRhIGlmIHdlJ3JlIGRvbmUgd2l0aCBpdAoJCQlpZiAoICFvcHRpb25zLm1lbW9yeSApIHsKCQkJCW1lbW9yeSA9IGZhbHNlOwoJCQl9CgoJCQlmaXJpbmcgPSBmYWxzZTsKCgkJCS8vIENsZWFuIHVwIGlmIHdlJ3JlIGRvbmUgZmlyaW5nIGZvciBnb29kCgkJCWlmICggbG9ja2VkICkgewoKCQkJCS8vIEtlZXAgYW4gZW1wdHkgbGlzdCBpZiB3ZSBoYXZlIGRhdGEgZm9yIGZ1dHVyZSBhZGQgY2FsbHMKCQkJCWlmICggbWVtb3J5ICkgewoJCQkJCWxpc3QgPSBbXTsKCgkJCQkvLyBPdGhlcndpc2UsIHRoaXMgb2JqZWN0IGlzIHNwZW50CgkJCQl9IGVsc2UgewoJCQkJCWxpc3QgPSAiIjsKCQkJCX0KCQkJfQoJCX0sCgoJCS8vIEFjdHVhbCBDYWxsYmFja3Mgb2JqZWN0CgkJc2VsZiA9IHsKCgkJCS8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3QKCQkJYWRkOiBmdW5jdGlvbigpIHsKCQkJCWlmICggbGlzdCApIHsKCgkJCQkJLy8gSWYgd2UgaGF2ZSBtZW1vcnkgZnJvbSBhIHBhc3QgcnVuLCB3ZSBzaG91bGQgZmlyZSBhZnRlciBhZGRpbmcKCQkJCQlpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkgewoJCQkJCQlmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoIC0gMTsKCQkJCQkJcXVldWUucHVzaCggbWVtb3J5ICk7CgkJCQkJfQoKCQkJCQkoIGZ1bmN0aW9uIGFkZCggYXJncyApIHsKCQkJCQkJalF1ZXJ5LmVhY2goIGFyZ3MsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7CgkJCQkJCQlpZiAoIGlzRnVuY3Rpb24oIGFyZyApICkgewoJCQkJCQkJCWlmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7CgkJCQkJCQkJCWxpc3QucHVzaCggYXJnICk7CgkJCQkJCQkJfQoJCQkJCQkJfSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgdG9UeXBlKCBhcmcgKSAhPT0gInN0cmluZyIgKSB7CgoJCQkJCQkJCS8vIEluc3BlY3QgcmVjdXJzaXZlbHkKCQkJCQkJCQlhZGQoIGFyZyApOwoJCQkJCQkJfQoJCQkJCQl9ICk7CgkJCQkJfSApKCBhcmd1bWVudHMgKTsKCgkJCQkJaWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHsKCQkJCQkJZmlyZSgpOwoJCQkJCX0KCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoKCQkJLy8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdAoJCQlyZW1vdmU6IGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHsKCQkJCQl2YXIgaW5kZXg7CgkJCQkJd2hpbGUgKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXkoIGFyZywgbGlzdCwgaW5kZXggKSApID4gLTEgKSB7CgkJCQkJCWxpc3Quc3BsaWNlKCBpbmRleCwgMSApOwoKCQkJCQkJLy8gSGFuZGxlIGZpcmluZyBpbmRleGVzCgkJCQkJCWlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7CgkJCQkJCQlmaXJpbmdJbmRleC0tOwoJCQkJCQl9CgkJCQkJfQoJCQkJfSApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgoJCQkvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LgoJCQkvLyBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IGxpc3QgaGFzIGNhbGxiYWNrcyBhdHRhY2hlZC4KCQkJaGFzOiBmdW5jdGlvbiggZm4gKSB7CgkJCQlyZXR1cm4gZm4gPwoJCQkJCWpRdWVyeS5pbkFycmF5KCBmbiwgbGlzdCApID4gLTEgOgoJCQkJCWxpc3QubGVuZ3RoID4gMDsKCQkJfSwKCgkJCS8vIFJlbW92ZSBhbGwgY2FsbGJhY2tzIGZyb20gdGhlIGxpc3QKCQkJZW1wdHk6IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBsaXN0ICkgewoJCQkJCWxpc3QgPSBbXTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoKCQkJLy8gRGlzYWJsZSAuZmlyZSBhbmQgLmFkZAoJCQkvLyBBYm9ydCBhbnkgY3VycmVudC9wZW5kaW5nIGV4ZWN1dGlvbnMKCQkJLy8gQ2xlYXIgYWxsIGNhbGxiYWNrcyBhbmQgdmFsdWVzCgkJCWRpc2FibGU6IGZ1bmN0aW9uKCkgewoJCQkJbG9ja2VkID0gcXVldWUgPSBbXTsKCQkJCWxpc3QgPSBtZW1vcnkgPSAiIjsKCQkJCXJldHVybiB0aGlzOwoJCQl9LAoJCQlkaXNhYmxlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gIWxpc3Q7CgkJCX0sCgoJCQkvLyBEaXNhYmxlIC5maXJlCgkJCS8vIEFsc28gZGlzYWJsZSAuYWRkIHVubGVzcyB3ZSBoYXZlIG1lbW9yeSAoc2luY2UgaXQgd291bGQgaGF2ZSBubyBlZmZlY3QpCgkJCS8vIEFib3J0IGFueSBwZW5kaW5nIGV4ZWN1dGlvbnMKCQkJbG9jazogZnVuY3Rpb24oKSB7CgkJCQlsb2NrZWQgPSBxdWV1ZSA9IFtdOwoJCQkJaWYgKCAhbWVtb3J5ICYmICFmaXJpbmcgKSB7CgkJCQkJbGlzdCA9IG1lbW9yeSA9ICIiOwoJCQkJfQoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgkJCWxvY2tlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gISFsb2NrZWQ7CgkJCX0sCgoJCQkvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzCgkJCWZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHsKCQkJCWlmICggIWxvY2tlZCApIHsKCQkJCQlhcmdzID0gYXJncyB8fCBbXTsKCQkJCQlhcmdzID0gWyBjb250ZXh0LCBhcmdzLnNsaWNlID8gYXJncy5zbGljZSgpIDogYXJncyBdOwoJCQkJCXF1ZXVlLnB1c2goIGFyZ3MgKTsKCQkJCQlpZiAoICFmaXJpbmcgKSB7CgkJCQkJCWZpcmUoKTsKCQkJCQl9CgkJCQl9CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCgkJCS8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzCgkJCWZpcmU6IGZ1bmN0aW9uKCkgewoJCQkJc2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCgkJCS8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZQoJCQlmaXJlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gISFmaXJlZDsKCQkJfQoJCX07CgoJcmV0dXJuIHNlbGY7Cn07CgoKZnVuY3Rpb24gSWRlbnRpdHkoIHYgKSB7CglyZXR1cm4gdjsKfQpmdW5jdGlvbiBUaHJvd2VyKCBleCApIHsKCXRocm93IGV4Owp9CgpmdW5jdGlvbiBhZG9wdFZhbHVlKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0LCBub1ZhbHVlICkgewoJdmFyIG1ldGhvZDsKCgl0cnkgewoKCQkvLyBDaGVjayBmb3IgcHJvbWlzZSBhc3BlY3QgZmlyc3QgdG8gcHJpdmlsZWdlIHN5bmNocm9ub3VzIGJlaGF2aW9yCgkJaWYgKCB2YWx1ZSAmJiBpc0Z1bmN0aW9uKCAoIG1ldGhvZCA9IHZhbHVlLnByb21pc2UgKSApICkgewoJCQltZXRob2QuY2FsbCggdmFsdWUgKS5kb25lKCByZXNvbHZlICkuZmFpbCggcmVqZWN0ICk7CgoJCS8vIE90aGVyIHRoZW5hYmxlcwoJCX0gZWxzZSBpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUudGhlbiApICkgKSB7CgkJCW1ldGhvZC5jYWxsKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0ICk7CgoJCS8vIE90aGVyIG5vbi10aGVuYWJsZXMKCQl9IGVsc2UgewoKCQkJLy8gQ29udHJvbCBgcmVzb2x2ZWAgYXJndW1lbnRzIGJ5IGxldHRpbmcgQXJyYXkjc2xpY2UgY2FzdCBib29sZWFuIGBub1ZhbHVlYCB0byBpbnRlZ2VyOgoJCQkvLyAqIGZhbHNlOiBbIHZhbHVlIF0uc2xpY2UoIDAgKSA9PiByZXNvbHZlKCB2YWx1ZSApCgkJCS8vICogdHJ1ZTogWyB2YWx1ZSBdLnNsaWNlKCAxICkgPT4gcmVzb2x2ZSgpCgkJCXJlc29sdmUuYXBwbHkoIHVuZGVmaW5lZCwgWyB2YWx1ZSBdLnNsaWNlKCBub1ZhbHVlICkgKTsKCQl9CgoJLy8gRm9yIFByb21pc2VzL0ErLCBjb252ZXJ0IGV4Y2VwdGlvbnMgaW50byByZWplY3Rpb25zCgkvLyBTaW5jZSBqUXVlcnkud2hlbiBkb2Vzbid0IHVud3JhcCB0aGVuYWJsZXMsIHdlIGNhbiBza2lwIHRoZSBleHRyYSBjaGVja3MgYXBwZWFyaW5nIGluCgkvLyBEZWZlcnJlZCN0aGVuIHRvIGNvbmRpdGlvbmFsbHkgc3VwcHJlc3MgcmVqZWN0aW9uLgoJfSBjYXRjaCAoIHZhbHVlICkgewoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCBvbmx5CgkJLy8gU3RyaWN0IG1vZGUgZnVuY3Rpb25zIGludm9rZWQgd2l0aG91dCAuY2FsbC8uYXBwbHkgZ2V0IGdsb2JhbC1vYmplY3QgY29udGV4dAoJCXJlamVjdC5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0gKTsKCX0KfQoKalF1ZXJ5LmV4dGVuZCggewoKCURlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHsKCQl2YXIgdHVwbGVzID0gWwoKCQkJCS8vIGFjdGlvbiwgYWRkIGxpc3RlbmVyLCBjYWxsYmFja3MsCgkJCQkvLyAuLi4gLnRoZW4gaGFuZGxlcnMsIGFyZ3VtZW50IGluZGV4LCBbZmluYWwgc3RhdGVdCgkJCQlbICJub3RpZnkiLCAicHJvZ3Jlc3MiLCBqUXVlcnkuQ2FsbGJhY2tzKCAibWVtb3J5IiApLAoJCQkJCWpRdWVyeS5DYWxsYmFja3MoICJtZW1vcnkiICksIDIgXSwKCQkJCVsgInJlc29sdmUiLCAiZG9uZSIsIGpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKSwKCQkJCQlqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksIDAsICJyZXNvbHZlZCIgXSwKCQkJCVsgInJlamVjdCIsICJmYWlsIiwgalF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5IiApLAoJCQkJCWpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKSwgMSwgInJlamVjdGVkIiBdCgkJCV0sCgkJCXN0YXRlID0gInBlbmRpbmciLAoJCQlwcm9taXNlID0gewoJCQkJc3RhdGU6IGZ1bmN0aW9uKCkgewoJCQkJCXJldHVybiBzdGF0ZTsKCQkJCX0sCgkJCQlhbHdheXM6IGZ1bmN0aW9uKCkgewoJCQkJCWRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfSwKCQkJCSJjYXRjaCI6IGZ1bmN0aW9uKCBmbiApIHsKCQkJCQlyZXR1cm4gcHJvbWlzZS50aGVuKCBudWxsLCBmbiApOwoJCQkJfSwKCgkJCQkvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0CgkJCQlwaXBlOiBmdW5jdGlvbiggLyogZm5Eb25lLCBmbkZhaWwsIGZuUHJvZ3Jlc3MgKi8gKSB7CgkJCQkJdmFyIGZucyA9IGFyZ3VtZW50czsKCgkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkgewoJCQkJCQlqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7CgoJCQkJCQkJLy8gTWFwIHR1cGxlcyAocHJvZ3Jlc3MsIGRvbmUsIGZhaWwpIHRvIGFyZ3VtZW50cyAoZG9uZSwgZmFpbCwgcHJvZ3Jlc3MpCgkJCQkJCQl2YXIgZm4gPSBpc0Z1bmN0aW9uKCBmbnNbIHR1cGxlWyA0IF0gXSApICYmIGZuc1sgdHVwbGVbIDQgXSBdOwoKCQkJCQkJCS8vIGRlZmVycmVkLnByb2dyZXNzKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLm5vdGlmeSB9KQoJCQkJCQkJLy8gZGVmZXJyZWQuZG9uZShmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5yZXNvbHZlIH0pCgkJCQkJCQkvLyBkZWZlcnJlZC5mYWlsKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlamVjdCB9KQoJCQkJCQkJZGVmZXJyZWRbIHR1cGxlWyAxIF0gXSggZnVuY3Rpb24oKSB7CgkJCQkJCQkJdmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJCQkJCWlmICggcmV0dXJuZWQgJiYgaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkgewoJCQkJCQkJCQlyZXR1cm5lZC5wcm9taXNlKCkKCQkJCQkJCQkJCS5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5ICkKCQkJCQkJCQkJCS5kb25lKCBuZXdEZWZlci5yZXNvbHZlICkKCQkJCQkJCQkJCS5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTsKCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQluZXdEZWZlclsgdHVwbGVbIDAgXSArICJXaXRoIiBdKAoJCQkJCQkJCQkJdGhpcywKCQkJCQkJCQkJCWZuID8gWyByZXR1cm5lZCBdIDogYXJndW1lbnRzCgkJCQkJCQkJCSk7CgkJCQkJCQkJfQoJCQkJCQkJfSApOwoJCQkJCQl9ICk7CgkJCQkJCWZucyA9IG51bGw7CgkJCQkJfSApLnByb21pc2UoKTsKCQkJCX0sCgkJCQl0aGVuOiBmdW5jdGlvbiggb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIG9uUHJvZ3Jlc3MgKSB7CgkJCQkJdmFyIG1heERlcHRoID0gMDsKCQkJCQlmdW5jdGlvbiByZXNvbHZlKCBkZXB0aCwgZGVmZXJyZWQsIGhhbmRsZXIsIHNwZWNpYWwgKSB7CgkJCQkJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJCQkJCXZhciB0aGF0ID0gdGhpcywKCQkJCQkJCQlhcmdzID0gYXJndW1lbnRzLAoJCQkJCQkJCW1pZ2h0VGhyb3cgPSBmdW5jdGlvbigpIHsKCQkJCQkJCQkJdmFyIHJldHVybmVkLCB0aGVuOwoKCQkJCQkJCQkJLy8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjMKCQkJCQkJCQkJLy8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTkKCQkJCQkJCQkJLy8gSWdub3JlIGRvdWJsZS1yZXNvbHV0aW9uIGF0dGVtcHRzCgkJCQkJCQkJCWlmICggZGVwdGggPCBtYXhEZXB0aCApIHsKCQkJCQkJCQkJCXJldHVybjsKCQkJCQkJCQkJfQoKCQkJCQkJCQkJcmV0dXJuZWQgPSBoYW5kbGVyLmFwcGx5KCB0aGF0LCBhcmdzICk7CgoJCQkJCQkJCQkvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4xCgkJCQkJCQkJCS8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTQ4CgkJCQkJCQkJCWlmICggcmV0dXJuZWQgPT09IGRlZmVycmVkLnByb21pc2UoKSApIHsKCQkJCQkJCQkJCXRocm93IG5ldyBUeXBlRXJyb3IoICJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iICk7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb25zIDIuMy4zLjEsIDMuNQoJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01NAoJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC03NQoJCQkJCQkJCQkvLyBSZXRyaWV2ZSBgdGhlbmAgb25seSBvbmNlCgkJCQkJCQkJCXRoZW4gPSByZXR1cm5lZCAmJgoKCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjQKCQkJCQkJCQkJCS8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTY0CgkJCQkJCQkJCQkvLyBPbmx5IGNoZWNrIG9iamVjdHMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlbmFiaWxpdHkKCQkJCQkJCQkJCSggdHlwZW9mIHJldHVybmVkID09PSAib2JqZWN0IiB8fAoJCQkJCQkJCQkJCXR5cGVvZiByZXR1cm5lZCA9PT0gImZ1bmN0aW9uIiApICYmCgkJCQkJCQkJCQlyZXR1cm5lZC50aGVuOwoKCQkJCQkJCQkJLy8gSGFuZGxlIGEgcmV0dXJuZWQgdGhlbmFibGUKCQkJCQkJCQkJaWYgKCBpc0Z1bmN0aW9uKCB0aGVuICkgKSB7CgoJCQkJCQkJCQkJLy8gU3BlY2lhbCBwcm9jZXNzb3JzIChub3RpZnkpIGp1c3Qgd2FpdCBmb3IgcmVzb2x1dGlvbgoJCQkJCQkJCQkJaWYgKCBzcGVjaWFsICkgewoJCQkJCQkJCQkJCXRoZW4uY2FsbCgKCQkJCQkJCQkJCQkJcmV0dXJuZWQsCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSwKCQkJCQkJCQkJCQkJcmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICkKCQkJCQkJCQkJCQkpOwoKCQkJCQkJCQkJCS8vIE5vcm1hbCBwcm9jZXNzb3JzIChyZXNvbHZlKSBhbHNvIGhvb2sgaW50byBwcm9ncmVzcwoJCQkJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJCQkJLy8gLi4uYW5kIGRpc3JlZ2FyZCBvbGRlciByZXNvbHV0aW9uIHZhbHVlcwoJCQkJCQkJCQkJCW1heERlcHRoKys7CgoJCQkJCQkJCQkJCXRoZW4uY2FsbCgKCQkJCQkJCQkJCQkJcmV0dXJuZWQsCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSwKCQkJCQkJCQkJCQkJcmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICksCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksCgkJCQkJCQkJCQkJCQlkZWZlcnJlZC5ub3RpZnlXaXRoICkKCQkJCQkJCQkJCQkpOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJLy8gSGFuZGxlIGFsbCBvdGhlciByZXR1cm5lZCB2YWx1ZXMKCQkJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJCQkvLyBPbmx5IHN1YnN0aXR1dGUgaGFuZGxlcnMgcGFzcyBvbiBjb250ZXh0CgkJCQkJCQkJCQkvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcikKCQkJCQkJCQkJCWlmICggaGFuZGxlciAhPT0gSWRlbnRpdHkgKSB7CgkJCQkJCQkJCQkJdGhhdCA9IHVuZGVmaW5lZDsKCQkJCQkJCQkJCQlhcmdzID0gWyByZXR1cm5lZCBdOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCS8vIFByb2Nlc3MgdGhlIHZhbHVlKHMpCgkJCQkJCQkJCQkvLyBEZWZhdWx0IHByb2Nlc3MgaXMgcmVzb2x2ZQoJCQkJCQkJCQkJKCBzcGVjaWFsIHx8IGRlZmVycmVkLnJlc29sdmVXaXRoICkoIHRoYXQsIGFyZ3MgKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0sCgoJCQkJCQkJCS8vIE9ubHkgbm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGNhdGNoIGFuZCByZWplY3QgZXhjZXB0aW9ucwoJCQkJCQkJCXByb2Nlc3MgPSBzcGVjaWFsID8KCQkJCQkJCQkJbWlnaHRUaHJvdyA6CgkJCQkJCQkJCWZ1bmN0aW9uKCkgewoJCQkJCQkJCQkJdHJ5IHsKCQkJCQkJCQkJCQltaWdodFRocm93KCk7CgkJCQkJCQkJCQl9IGNhdGNoICggZSApIHsKCgkJCQkJCQkJCQkJaWYgKCBqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayApIHsKCQkJCQkJCQkJCQkJalF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soIGUsCgkJCQkJCQkJCQkJCQlwcm9jZXNzLnN0YWNrVHJhY2UgKTsKCQkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy40LjEKCQkJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC02MQoJCQkJCQkJCQkJCS8vIElnbm9yZSBwb3N0LXJlc29sdXRpb24gZXhjZXB0aW9ucwoJCQkJCQkJCQkJCWlmICggZGVwdGggKyAxID49IG1heERlcHRoICkgewoKCQkJCQkJCQkJCQkJLy8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dAoJCQkJCQkJCQkJCQkvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcikKCQkJCQkJCQkJCQkJaWYgKCBoYW5kbGVyICE9PSBUaHJvd2VyICkgewoJCQkJCQkJCQkJCQkJdGhhdCA9IHVuZGVmaW5lZDsKCQkJCQkJCQkJCQkJCWFyZ3MgPSBbIGUgXTsKCQkJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCQkJZGVmZXJyZWQucmVqZWN0V2l0aCggdGhhdCwgYXJncyApOwoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCX0KCQkJCQkJCQkJfTsKCgkJCQkJCQkvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuMQoJCQkJCQkJLy8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTcKCQkJCQkJCS8vIFJlLXJlc29sdmUgcHJvbWlzZXMgaW1tZWRpYXRlbHkgdG8gZG9kZ2UgZmFsc2UgcmVqZWN0aW9uIGZyb20KCQkJCQkJCS8vIHN1YnNlcXVlbnQgZXJyb3JzCgkJCQkJCQlpZiAoIGRlcHRoICkgewoJCQkJCQkJCXByb2Nlc3MoKTsKCQkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJCS8vIENhbGwgYW4gb3B0aW9uYWwgaG9vayB0byByZWNvcmQgdGhlIHN0YWNrLCBpbiBjYXNlIG9mIGV4Y2VwdGlvbgoJCQkJCQkJCS8vIHNpbmNlIGl0J3Mgb3RoZXJ3aXNlIGxvc3Qgd2hlbiBleGVjdXRpb24gZ29lcyBhc3luYwoJCQkJCQkJCWlmICggalF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vayApIHsKCQkJCQkJCQkJcHJvY2Vzcy5zdGFja1RyYWNlID0galF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vaygpOwoJCQkJCQkJCX0KCQkJCQkJCQl3aW5kb3cuc2V0VGltZW91dCggcHJvY2VzcyApOwoJCQkJCQkJfQoJCQkJCQl9OwoJCQkJCX0KCgkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkgewoKCQkJCQkJLy8gcHJvZ3Jlc3NfaGFuZGxlcnMuYWRkKCAuLi4gKQoJCQkJCQl0dXBsZXNbIDAgXVsgMyBdLmFkZCgKCQkJCQkJCXJlc29sdmUoCgkJCQkJCQkJMCwKCQkJCQkJCQluZXdEZWZlciwKCQkJCQkJCQlpc0Z1bmN0aW9uKCBvblByb2dyZXNzICkgPwoJCQkJCQkJCQlvblByb2dyZXNzIDoKCQkJCQkJCQkJSWRlbnRpdHksCgkJCQkJCQkJbmV3RGVmZXIubm90aWZ5V2l0aAoJCQkJCQkJKQoJCQkJCQkpOwoKCQkJCQkJLy8gZnVsZmlsbGVkX2hhbmRsZXJzLmFkZCggLi4uICkKCQkJCQkJdHVwbGVzWyAxIF1bIDMgXS5hZGQoCgkJCQkJCQlyZXNvbHZlKAoJCQkJCQkJCTAsCgkJCQkJCQkJbmV3RGVmZXIsCgkJCQkJCQkJaXNGdW5jdGlvbiggb25GdWxmaWxsZWQgKSA/CgkJCQkJCQkJCW9uRnVsZmlsbGVkIDoKCQkJCQkJCQkJSWRlbnRpdHkKCQkJCQkJCSkKCQkJCQkJKTsKCgkJCQkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmFkZCggLi4uICkKCQkJCQkJdHVwbGVzWyAyIF1bIDMgXS5hZGQoCgkJCQkJCQlyZXNvbHZlKAoJCQkJCQkJCTAsCgkJCQkJCQkJbmV3RGVmZXIsCgkJCQkJCQkJaXNGdW5jdGlvbiggb25SZWplY3RlZCApID8KCQkJCQkJCQkJb25SZWplY3RlZCA6CgkJCQkJCQkJCVRocm93ZXIKCQkJCQkJCSkKCQkJCQkJKTsKCQkJCQl9ICkucHJvbWlzZSgpOwoJCQkJfSwKCgkJCQkvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkCgkJCQkvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0CgkJCQlwcm9taXNlOiBmdW5jdGlvbiggb2JqICkgewoJCQkJCXJldHVybiBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQoIG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTsKCQkJCX0KCQkJfSwKCQkJZGVmZXJyZWQgPSB7fTsKCgkJLy8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kcwoJCWpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHsKCQkJdmFyIGxpc3QgPSB0dXBsZVsgMiBdLAoJCQkJc3RhdGVTdHJpbmcgPSB0dXBsZVsgNSBdOwoKCQkJLy8gcHJvbWlzZS5wcm9ncmVzcyA9IGxpc3QuYWRkCgkJCS8vIHByb21pc2UuZG9uZSA9IGxpc3QuYWRkCgkJCS8vIHByb21pc2UuZmFpbCA9IGxpc3QuYWRkCgkJCXByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRkOwoKCQkJLy8gSGFuZGxlIHN0YXRlCgkJCWlmICggc3RhdGVTdHJpbmcgKSB7CgkJCQlsaXN0LmFkZCgKCQkJCQlmdW5jdGlvbigpIHsKCgkJCQkJCS8vIHN0YXRlID0gInJlc29sdmVkIiAoaS5lLiwgZnVsZmlsbGVkKQoJCQkJCQkvLyBzdGF0ZSA9ICJyZWplY3RlZCIKCQkJCQkJc3RhdGUgPSBzdGF0ZVN0cmluZzsKCQkJCQl9LAoKCQkJCQkvLyByZWplY3RlZF9jYWxsYmFja3MuZGlzYWJsZQoJCQkJCS8vIGZ1bGZpbGxlZF9jYWxsYmFja3MuZGlzYWJsZQoJCQkJCXR1cGxlc1sgMyAtIGkgXVsgMiBdLmRpc2FibGUsCgoJCQkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmRpc2FibGUKCQkJCQkvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZGlzYWJsZQoJCQkJCXR1cGxlc1sgMyAtIGkgXVsgMyBdLmRpc2FibGUsCgoJCQkJCS8vIHByb2dyZXNzX2NhbGxiYWNrcy5sb2NrCgkJCQkJdHVwbGVzWyAwIF1bIDIgXS5sb2NrLAoKCQkJCQkvLyBwcm9ncmVzc19oYW5kbGVycy5sb2NrCgkJCQkJdHVwbGVzWyAwIF1bIDMgXS5sb2NrCgkJCQkpOwoJCQl9CgoJCQkvLyBwcm9ncmVzc19oYW5kbGVycy5maXJlCgkJCS8vIGZ1bGZpbGxlZF9oYW5kbGVycy5maXJlCgkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmZpcmUKCQkJbGlzdC5hZGQoIHR1cGxlWyAzIF0uZmlyZSApOwoKCQkJLy8gZGVmZXJyZWQubm90aWZ5ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLm5vdGlmeVdpdGgoLi4uKSB9CgkJCS8vIGRlZmVycmVkLnJlc29sdmUgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZVdpdGgoLi4uKSB9CgkJCS8vIGRlZmVycmVkLnJlamVjdCA9IGZ1bmN0aW9uKCkgeyBkZWZlcnJlZC5yZWplY3RXaXRoKC4uLikgfQoJCQlkZWZlcnJlZFsgdHVwbGVbIDAgXSBdID0gZnVuY3Rpb24oKSB7CgkJCQlkZWZlcnJlZFsgdHVwbGVbIDAgXSArICJXaXRoIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHVuZGVmaW5lZCA6IHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX07CgoJCQkvLyBkZWZlcnJlZC5ub3RpZnlXaXRoID0gbGlzdC5maXJlV2l0aAoJCQkvLyBkZWZlcnJlZC5yZXNvbHZlV2l0aCA9IGxpc3QuZmlyZVdpdGgKCQkJLy8gZGVmZXJyZWQucmVqZWN0V2l0aCA9IGxpc3QuZmlyZVdpdGgKCQkJZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyAiV2l0aCIgXSA9IGxpc3QuZmlyZVdpdGg7CgkJfSApOwoKCQkvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2UKCQlwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7CgoJCS8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnkKCQlpZiAoIGZ1bmMgKSB7CgkJCWZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7CgkJfQoKCQkvLyBBbGwgZG9uZSEKCQlyZXR1cm4gZGVmZXJyZWQ7Cgl9LAoKCS8vIERlZmVycmVkIGhlbHBlcgoJd2hlbjogZnVuY3Rpb24oIHNpbmdsZVZhbHVlICkgewoJCXZhcgoKCQkJLy8gY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzCgkJCXJlbWFpbmluZyA9IGFyZ3VtZW50cy5sZW5ndGgsCgoJCQkvLyBjb3VudCBvZiB1bnByb2Nlc3NlZCBhcmd1bWVudHMKCQkJaSA9IHJlbWFpbmluZywKCgkJCS8vIHN1Ym9yZGluYXRlIGZ1bGZpbGxtZW50IGRhdGEKCQkJcmVzb2x2ZUNvbnRleHRzID0gQXJyYXkoIGkgKSwKCQkJcmVzb2x2ZVZhbHVlcyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLAoKCQkJLy8gdGhlIG1hc3RlciBEZWZlcnJlZAoJCQltYXN0ZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSwKCgkJCS8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3RvcnkKCQkJdXBkYXRlRnVuYyA9IGZ1bmN0aW9uKCBpICkgewoJCQkJcmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCQlyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7CgkJCQkJcmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlOwoJCQkJCWlmICggISggLS1yZW1haW5pbmcgKSApIHsKCQkJCQkJbWFzdGVyLnJlc29sdmVXaXRoKCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKTsKCQkJCQl9CgkJCQl9OwoJCQl9OwoKCQkvLyBTaW5nbGUtIGFuZCBlbXB0eSBhcmd1bWVudHMgYXJlIGFkb3B0ZWQgbGlrZSBQcm9taXNlLnJlc29sdmUKCQlpZiAoIHJlbWFpbmluZyA8PSAxICkgewoJCQlhZG9wdFZhbHVlKCBzaW5nbGVWYWx1ZSwgbWFzdGVyLmRvbmUoIHVwZGF0ZUZ1bmMoIGkgKSApLnJlc29sdmUsIG1hc3Rlci5yZWplY3QsCgkJCQkhcmVtYWluaW5nICk7CgoJCQkvLyBVc2UgLnRoZW4oKSB0byB1bndyYXAgc2Vjb25kYXJ5IHRoZW5hYmxlcyAoY2YuIGdoLTMwMDApCgkJCWlmICggbWFzdGVyLnN0YXRlKCkgPT09ICJwZW5kaW5nIiB8fAoJCQkJaXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIHJlc29sdmVWYWx1ZXNbIGkgXS50aGVuICkgKSB7CgoJCQkJcmV0dXJuIG1hc3Rlci50aGVuKCk7CgkJCX0KCQl9CgoJCS8vIE11bHRpcGxlIGFyZ3VtZW50cyBhcmUgYWdncmVnYXRlZCBsaWtlIFByb21pc2UuYWxsIGFycmF5IGVsZW1lbnRzCgkJd2hpbGUgKCBpLS0gKSB7CgkJCWFkb3B0VmFsdWUoIHJlc29sdmVWYWx1ZXNbIGkgXSwgdXBkYXRlRnVuYyggaSApLCBtYXN0ZXIucmVqZWN0ICk7CgkJfQoKCQlyZXR1cm4gbWFzdGVyLnByb21pc2UoKTsKCX0KfSApOwoKCi8vIFRoZXNlIHVzdWFsbHkgaW5kaWNhdGUgYSBwcm9ncmFtbWVyIG1pc3Rha2UgZHVyaW5nIGRldmVsb3BtZW50LAovLyB3YXJuIGFib3V0IHRoZW0gQVNBUCByYXRoZXIgdGhhbiBzd2FsbG93aW5nIHRoZW0gYnkgZGVmYXVsdC4KdmFyIHJlcnJvck5hbWVzID0gL14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87CgpqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayA9IGZ1bmN0aW9uKCBlcnJvciwgc3RhY2sgKSB7CgoJLy8gU3VwcG9ydDogSUUgOCAtIDkgb25seQoJLy8gQ29uc29sZSBleGlzdHMgd2hlbiBkZXYgdG9vbHMgYXJlIG9wZW4sIHdoaWNoIGNhbiBoYXBwZW4gYXQgYW55IHRpbWUKCWlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUud2FybiAmJiBlcnJvciAmJiByZXJyb3JOYW1lcy50ZXN0KCBlcnJvci5uYW1lICkgKSB7CgkJd2luZG93LmNvbnNvbGUud2FybiggImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIgKyBlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjaywgc3RhY2sgKTsKCX0KfTsKCgoKCmpRdWVyeS5yZWFkeUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKCBlcnJvciApIHsKCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQl0aHJvdyBlcnJvcjsKCX0gKTsKfTsKCgoKCi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeQp2YXIgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7CgpqUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7CgoJcmVhZHlMaXN0CgkJLnRoZW4oIGZuICkKCgkJLy8gV3JhcCBqUXVlcnkucmVhZHlFeGNlcHRpb24gaW4gYSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBsb29rdXAKCQkvLyBoYXBwZW5zIGF0IHRoZSB0aW1lIG9mIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgY2FsbGJhY2sKCQkvLyByZWdpc3RyYXRpb24uCgkJLmNhdGNoKCBmdW5jdGlvbiggZXJyb3IgKSB7CgkJCWpRdWVyeS5yZWFkeUV4Y2VwdGlvbiggZXJyb3IgKTsKCQl9ICk7CgoJcmV0dXJuIHRoaXM7Cn07CgpqUXVlcnkuZXh0ZW5kKCB7CgoJLy8gSXMgdGhlIERPTSByZWFkeSB0byBiZSB1c2VkPyBTZXQgdG8gdHJ1ZSBvbmNlIGl0IG9jY3Vycy4KCWlzUmVhZHk6IGZhbHNlLAoKCS8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmUKCS8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxCglyZWFkeVdhaXQ6IDEsCgoJLy8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeQoJcmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkgewoKCQkvLyBBYm9ydCBpZiB0aGVyZSBhcmUgcGVuZGluZyBob2xkcyBvciB3ZSdyZSBhbHJlYWR5IHJlYWR5CgkJaWYgKCB3YWl0ID09PSB0cnVlID8gLS1qUXVlcnkucmVhZHlXYWl0IDogalF1ZXJ5LmlzUmVhZHkgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQoJCWpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTsKCgkJLy8gSWYgYSBub3JtYWwgRE9NIFJlYWR5IGV2ZW50IGZpcmVkLCBkZWNyZW1lbnQsIGFuZCB3YWl0IGlmIG5lZWQgYmUKCQlpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQoJCXJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTsKCX0KfSApOwoKalF1ZXJ5LnJlYWR5LnRoZW4gPSByZWFkeUxpc3QudGhlbjsKCi8vIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kCmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHsKCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgY29tcGxldGVkICk7Cgl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQgKTsKCWpRdWVyeS5yZWFkeSgpOwp9CgovLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZAovLyBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KLy8gU3VwcG9ydDogSUUgPD05IC0gMTAgb25seQovLyBPbGRlciBJRSBzb21ldGltZXMgc2lnbmFscyAiaW50ZXJhY3RpdmUiIHRvbyBzb29uCmlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fAoJKCBkb2N1bWVudC5yZWFkeVN0YXRlICE9PSAibG9hZGluZyIgJiYgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCApICkgewoKCS8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQoJd2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApOwoKfSBlbHNlIHsKCgkvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrCglkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGNvbXBsZXRlZCApOwoKCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCgl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQgKTsKfQoKCgoKLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uCi8vIFRoZSB2YWx1ZS9zIGNhbiBvcHRpb25hbGx5IGJlIGV4ZWN1dGVkIGlmIGl0J3MgYSBmdW5jdGlvbgp2YXIgYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkgewoJdmFyIGkgPSAwLAoJCWxlbiA9IGVsZW1zLmxlbmd0aCwKCQlidWxrID0ga2V5ID09IG51bGw7CgoJLy8gU2V0cyBtYW55IHZhbHVlcwoJaWYgKCB0b1R5cGUoIGtleSApID09PSAib2JqZWN0IiApIHsKCQljaGFpbmFibGUgPSB0cnVlOwoJCWZvciAoIGkgaW4ga2V5ICkgewoJCQlhY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5WyBpIF0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTsKCQl9CgoJLy8gU2V0cyBvbmUgdmFsdWUKCX0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJY2hhaW5hYmxlID0gdHJ1ZTsKCgkJaWYgKCAhaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmF3ID0gdHJ1ZTsKCQl9CgoJCWlmICggYnVsayApIHsKCgkJCS8vIEJ1bGsgb3BlcmF0aW9ucyBydW4gYWdhaW5zdCB0aGUgZW50aXJlIHNldAoJCQlpZiAoIHJhdyApIHsKCQkJCWZuLmNhbGwoIGVsZW1zLCB2YWx1ZSApOwoJCQkJZm4gPSBudWxsOwoKCQkJLy8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlcwoJCQl9IGVsc2UgewoJCQkJYnVsayA9IGZuOwoJCQkJZm4gPSBmdW5jdGlvbiggZWxlbSwga2V5LCB2YWx1ZSApIHsKCQkJCQlyZXR1cm4gYnVsay5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTsKCQkJCX07CgkJCX0KCQl9CgoJCWlmICggZm4gKSB7CgkJCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewoJCQkJZm4oCgkJCQkJZWxlbXNbIGkgXSwga2V5LCByYXcgPwoJCQkJCXZhbHVlIDoKCQkJCQl2YWx1ZS5jYWxsKCBlbGVtc1sgaSBdLCBpLCBmbiggZWxlbXNbIGkgXSwga2V5ICkgKQoJCQkJKTsKCQkJfQoJCX0KCX0KCglpZiAoIGNoYWluYWJsZSApIHsKCQlyZXR1cm4gZWxlbXM7Cgl9CgoJLy8gR2V0cwoJaWYgKCBidWxrICkgewoJCXJldHVybiBmbi5jYWxsKCBlbGVtcyApOwoJfQoKCXJldHVybiBsZW4gPyBmbiggZWxlbXNbIDAgXSwga2V5ICkgOiBlbXB0eUdldDsKfTsKCgovLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmcKdmFyIHJtc1ByZWZpeCA9IC9eLW1zLS8sCglyZGFzaEFscGhhID0gLy0oW2Etel0pL2c7CgovLyBVc2VkIGJ5IGNhbWVsQ2FzZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKCkKZnVuY3Rpb24gZmNhbWVsQ2FzZSggYWxsLCBsZXR0ZXIgKSB7CglyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7Cn0KCi8vIENvbnZlcnQgZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFuZCBkYXRhIG1vZHVsZXMKLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNQovLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpCmZ1bmN0aW9uIGNhbWVsQ2FzZSggc3RyaW5nICkgewoJcmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsICJtcy0iICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApOwp9CnZhciBhY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkgewoKCS8vIEFjY2VwdHMgb25seToKCS8vICAtIE5vZGUKCS8vICAgIC0gTm9kZS5FTEVNRU5UX05PREUKCS8vICAgIC0gTm9kZS5ET0NVTUVOVF9OT0RFCgkvLyAgLSBPYmplY3QKCS8vICAgIC0gQW55CglyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7Cn07CgoKCgpmdW5jdGlvbiBEYXRhKCkgewoJdGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrOwp9CgpEYXRhLnVpZCA9IDE7CgpEYXRhLnByb3RvdHlwZSA9IHsKCgljYWNoZTogZnVuY3Rpb24oIG93bmVyICkgewoKCQkvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGUKCQl2YXIgdmFsdWUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07CgoJCS8vIElmIG5vdCwgY3JlYXRlIG9uZQoJCWlmICggIXZhbHVlICkgewoJCQl2YWx1ZSA9IHt9OwoKCQkJLy8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsCgkJCS8vIGJ1dCB3ZSBzaG91bGQgbm90LCBzZWUgIzgzMzUuCgkJCS8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LgoJCQlpZiAoIGFjY2VwdERhdGEoIG93bmVyICkgKSB7CgoJCQkJLy8gSWYgaXQgaXMgYSBub2RlIHVubGlrZWx5IHRvIGJlIHN0cmluZ2lmeS1lZCBvciBsb29wZWQgb3ZlcgoJCQkJLy8gdXNlIHBsYWluIGFzc2lnbm1lbnQKCQkJCWlmICggb3duZXIubm9kZVR5cGUgKSB7CgkJCQkJb3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdmFsdWU7CgoJCQkJLy8gT3RoZXJ3aXNlIHNlY3VyZSBpdCBpbiBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5CgkJCQkvLyBjb25maWd1cmFibGUgbXVzdCBiZSB0cnVlIHRvIGFsbG93IHRoZSBwcm9wZXJ0eSB0byBiZQoJCQkJLy8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3ZlZAoJCQkJfSBlbHNlIHsKCQkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoIG93bmVyLCB0aGlzLmV4cGFuZG8sIHsKCQkJCQkJdmFsdWU6IHZhbHVlLAoJCQkJCQljb25maWd1cmFibGU6IHRydWUKCQkJCQl9ICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiB2YWx1ZTsKCX0sCglzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7CgkJdmFyIHByb3AsCgkJCWNhY2hlID0gdGhpcy5jYWNoZSggb3duZXIgKTsKCgkJLy8gSGFuZGxlOiBbIG93bmVyLCBrZXksIHZhbHVlIF0gYXJncwoJCS8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1NykKCQlpZiAoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApIHsKCQkJY2FjaGVbIGNhbWVsQ2FzZSggZGF0YSApIF0gPSB2YWx1ZTsKCgkJLy8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3MKCQl9IGVsc2UgewoKCQkJLy8gQ29weSB0aGUgcHJvcGVydGllcyBvbmUtYnktb25lIHRvIHRoZSBjYWNoZSBvYmplY3QKCQkJZm9yICggcHJvcCBpbiBkYXRhICkgewoJCQkJY2FjaGVbIGNhbWVsQ2FzZSggcHJvcCApIF0gPSBkYXRhWyBwcm9wIF07CgkJCX0KCQl9CgkJcmV0dXJuIGNhY2hlOwoJfSwKCWdldDogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7CgkJcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8KCQkJdGhpcy5jYWNoZSggb3duZXIgKSA6CgoJCQkvLyBBbHdheXMgdXNlIGNhbWVsQ2FzZSBrZXkgKGdoLTIyNTcpCgkJCW93bmVyWyB0aGlzLmV4cGFuZG8gXSAmJiBvd25lclsgdGhpcy5leHBhbmRvIF1bIGNhbWVsQ2FzZSgga2V5ICkgXTsKCX0sCglhY2Nlc3M6IGZ1bmN0aW9uKCBvd25lciwga2V5LCB2YWx1ZSApIHsKCgkJLy8gSW4gY2FzZXMgd2hlcmUgZWl0aGVyOgoJCS8vCgkJLy8gICAxLiBObyBrZXkgd2FzIHNwZWNpZmllZAoJCS8vICAgMi4gQSBzdHJpbmcga2V5IHdhcyBzcGVjaWZpZWQsIGJ1dCBubyB2YWx1ZSBwcm92aWRlZAoJCS8vCgkJLy8gVGFrZSB0aGUgInJlYWQiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZQoJCS8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjoKCQkvLwoJCS8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3QKCQkvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5CgkJLy8KCQlpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8CgkJCQkoICgga2V5ICYmIHR5cGVvZiBrZXkgPT09ICJzdHJpbmciICkgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApICkgewoKCQkJcmV0dXJuIHRoaXMuZ2V0KCBvd25lciwga2V5ICk7CgkJfQoKCQkvLyBXaGVuIHRoZSBrZXkgaXMgbm90IGEgc3RyaW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1ZQoJCS8vIGFyZSBzcGVjaWZpZWQsIHNldCBvciBleHRlbmQgKGV4aXN0aW5nIG9iamVjdHMpIHdpdGggZWl0aGVyOgoJCS8vCgkJLy8gICAxLiBBbiBvYmplY3Qgb2YgcHJvcGVydGllcwoJCS8vICAgMi4gQSBrZXkgYW5kIHZhbHVlCgkJLy8KCQl0aGlzLnNldCggb3duZXIsIGtleSwgdmFsdWUgKTsKCgkJLy8gU2luY2UgdGhlICJzZXQiIHBhdGggY2FuIGhhdmUgdHdvIHBvc3NpYmxlIGVudHJ5IHBvaW50cwoJCS8vIHJldHVybiB0aGUgZXhwZWN0ZWQgZGF0YSBiYXNlZCBvbiB3aGljaCBwYXRoIHdhcyB0YWtlblsqXQoJCXJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrZXk7Cgl9LAoJcmVtb3ZlOiBmdW5jdGlvbiggb3duZXIsIGtleSApIHsKCQl2YXIgaSwKCQkJY2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07CgoJCWlmICggY2FjaGUgPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBrZXkgIT09IHVuZGVmaW5lZCApIHsKCgkJCS8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBrZXlzCgkJCWlmICggQXJyYXkuaXNBcnJheSgga2V5ICkgKSB7CgoJCQkJLy8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi4KCQkJCS8vIFdlIGFsd2F5cyBzZXQgY2FtZWxDYXNlIGtleXMsIHNvIHJlbW92ZSB0aGF0LgoJCQkJa2V5ID0ga2V5Lm1hcCggY2FtZWxDYXNlICk7CgkJCX0gZWxzZSB7CgkJCQlrZXkgPSBjYW1lbENhc2UoIGtleSApOwoKCQkJCS8vIElmIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMsIHVzZSBpdC4KCQkJCS8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlCgkJCQlrZXkgPSBrZXkgaW4gY2FjaGUgPwoJCQkJCVsga2V5IF0gOgoJCQkJCSgga2V5Lm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10gKTsKCQkJfQoKCQkJaSA9IGtleS5sZW5ndGg7CgoJCQl3aGlsZSAoIGktLSApIHsKCQkJCWRlbGV0ZSBjYWNoZVsga2V5WyBpIF0gXTsKCQkJfQoJCX0KCgkJLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIHRoZXJlJ3Mgbm8gbW9yZSBkYXRhCgkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKSApIHsKCgkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUKCQkJLy8gV2Via2l0ICYgQmxpbmsgcGVyZm9ybWFuY2Ugc3VmZmVycyB3aGVuIGRlbGV0aW5nIHByb3BlcnRpZXMKCQkJLy8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZAoJCQkvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNzg2MDcgKGJ1ZyByZXN0cmljdGVkKQoJCQlpZiAoIG93bmVyLm5vZGVUeXBlICkgewoJCQkJb3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQl9IGVsc2UgewoJCQkJZGVsZXRlIG93bmVyWyB0aGlzLmV4cGFuZG8gXTsKCQkJfQoJCX0KCX0sCgloYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7CgkJdmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdOwoJCXJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTsKCX0KfTsKdmFyIGRhdGFQcml2ID0gbmV3IERhdGEoKTsKCnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7CgoKCi8vCUltcGxlbWVudGF0aW9uIFN1bW1hcnkKLy8KLy8JMS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRoIDEuOS54IGJyYW5jaAovLwkyLiBJbXByb3ZlIHRoZSBtb2R1bGUncyBtYWludGFpbmFiaWxpdHkgYnkgcmVkdWNpbmcgdGhlIHN0b3JhZ2UKLy8JCXBhdGhzIHRvIGEgc2luZ2xlIG1lY2hhbmlzbS4KLy8JMy4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCAicHJpdmF0ZSIgYW5kICJ1c2VyIiBkYXRhLgovLwk0LiBfTmV2ZXJfIGV4cG9zZSAicHJpdmF0ZSIgZGF0YSB0byB1c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKQovLwk1LiBBdm9pZCBleHBvc2luZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9uIHVzZXIgb2JqZWN0cyAoZWcuIGV4cGFuZG8gcHJvcGVydGllcykKLy8JNi4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0Cgp2YXIgcmJyYWNlID0gL14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLywKCXJtdWx0aURhc2ggPSAvW0EtWl0vZzsKCmZ1bmN0aW9uIGdldERhdGEoIGRhdGEgKSB7CglpZiAoIGRhdGEgPT09ICJ0cnVlIiApIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCglpZiAoIGRhdGEgPT09ICJmYWxzZSIgKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWlmICggZGF0YSA9PT0gIm51bGwiICkgewoJCXJldHVybiBudWxsOwoJfQoKCS8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nCglpZiAoIGRhdGEgPT09ICtkYXRhICsgIiIgKSB7CgkJcmV0dXJuICtkYXRhOwoJfQoKCWlmICggcmJyYWNlLnRlc3QoIGRhdGEgKSApIHsKCQlyZXR1cm4gSlNPTi5wYXJzZSggZGF0YSApOwoJfQoKCXJldHVybiBkYXRhOwp9CgpmdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkgewoJdmFyIG5hbWU7CgoJLy8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueQoJLy8gZGF0YSBmcm9tIHRoZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlCglpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCW5hbWUgPSAiZGF0YS0iICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsICItJCYiICkudG9Mb3dlckNhc2UoKTsKCQlkYXRhID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKCgkJaWYgKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKSB7CgkJCXRyeSB7CgkJCQlkYXRhID0gZ2V0RGF0YSggZGF0YSApOwoJCQl9IGNhdGNoICggZSApIHt9CgoJCQkvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXIKCQkJZGF0YVVzZXIuc2V0KCBlbGVtLCBrZXksIGRhdGEgKTsKCQl9IGVsc2UgewoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0KCX0KCXJldHVybiBkYXRhOwp9CgpqUXVlcnkuZXh0ZW5kKCB7CgloYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTsKCX0sCgoJZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7CgkJcmV0dXJuIGRhdGFVc2VyLmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQlkYXRhVXNlci5yZW1vdmUoIGVsZW0sIG5hbWUgKTsKCX0sCgoJLy8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWQKCS8vIHdpdGggZGlyZWN0IGNhbGxzIHRvIGRhdGFQcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLgoJX2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgewoJCXJldHVybiBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTsKCX0sCgoJX3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCWRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApOwoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CglkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgaSwgbmFtZSwgZGF0YSwKCQkJZWxlbSA9IHRoaXNbIDAgXSwKCQkJYXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlczsKCgkJLy8gR2V0cyBhbGwgdmFsdWVzCgkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHsKCQkJaWYgKCB0aGlzLmxlbmd0aCApIHsKCQkJCWRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0gKTsKCgkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWRhdGFQcml2LmdldCggZWxlbSwgImhhc0RhdGFBdHRycyIgKSApIHsKCQkJCQlpID0gYXR0cnMubGVuZ3RoOwoJCQkJCXdoaWxlICggaS0tICkgewoKCQkJCQkJLy8gU3VwcG9ydDogSUUgMTEgb25seQoJCQkJCQkvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKCMxNDg5NCkKCQkJCQkJaWYgKCBhdHRyc1sgaSBdICkgewoJCQkJCQkJbmFtZSA9IGF0dHJzWyBpIF0ubmFtZTsKCQkJCQkJCWlmICggbmFtZS5pbmRleE9mKCAiZGF0YS0iICkgPT09IDAgKSB7CgkJCQkJCQkJbmFtZSA9IGNhbWVsQ2FzZSggbmFtZS5zbGljZSggNSApICk7CgkJCQkJCQkJZGF0YUF0dHIoIGVsZW0sIG5hbWUsIGRhdGFbIG5hbWUgXSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJCWRhdGFQcml2LnNldCggZWxlbSwgImhhc0RhdGFBdHRycyIsIHRydWUgKTsKCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGRhdGE7CgkJfQoKCQkvLyBTZXRzIG11bHRpcGxlIHZhbHVlcwoJCWlmICggdHlwZW9mIGtleSA9PT0gIm9iamVjdCIgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQkJZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXkgKTsKCQkJfSApOwoJCX0KCgkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewoJCQl2YXIgZGF0YTsKCgkJCS8vIFRoZSBjYWxsaW5nIGpRdWVyeSBvYmplY3QgKGVsZW1lbnQgbWF0Y2hlcykgaXMgbm90IGVtcHR5CgkJCS8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlCgkJCS8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0CgkJCS8vIHdpbGwgcmVzdWx0IGluIGB1bmRlZmluZWRgIGZvciBlbGVtID0gdGhpc1sgMCBdIHdoaWNoIHdpbGwKCQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS4KCQkJaWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgoJCQkJLy8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZQoJCQkJLy8gVGhlIGtleSB3aWxsIGFsd2F5cyBiZSBjYW1lbENhc2VkIGluIERhdGEKCQkJCWRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0sIGtleSApOwoJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIGRhdGE7CgkJCQl9CgoJCQkJLy8gQXR0ZW1wdCB0byAiZGlzY292ZXIiIHRoZSBkYXRhIGluCgkJCQkvLyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzCgkJCQlkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGtleSApOwoJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIGRhdGE7CgkJCQl9CgoJCQkJLy8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LgoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBTZXQgdGhlIGRhdGEuLi4KCQkJdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCgkJCQkvLyBXZSBhbHdheXMgc3RvcmUgdGhlIGNhbWVsQ2FzZWQga2V5CgkJCQlkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTsKCQkJfSApOwoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgdHJ1ZSApOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlkYXRhVXNlci5yZW1vdmUoIHRoaXMsIGtleSApOwoJCX0gKTsKCX0KfSApOwoKCmpRdWVyeS5leHRlbmQoIHsKCXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHsKCQl2YXIgcXVldWU7CgoJCWlmICggZWxlbSApIHsKCQkJdHlwZSA9ICggdHlwZSB8fCAiZngiICkgKyAicXVldWUiOwoJCQlxdWV1ZSA9IGRhdGFQcml2LmdldCggZWxlbSwgdHlwZSApOwoKCQkJLy8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cAoJCQlpZiAoIGRhdGEgKSB7CgkJCQlpZiAoICFxdWV1ZSB8fCBBcnJheS5pc0FycmF5KCBkYXRhICkgKSB7CgkJCQkJcXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApOwoJCQkJfSBlbHNlIHsKCQkJCQlxdWV1ZS5wdXNoKCBkYXRhICk7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHF1ZXVlIHx8IFtdOwoJCX0KCX0sCgoJZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7CgkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCgkJdmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksCgkJCXN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLAoJCQlmbiA9IHF1ZXVlLnNoaWZ0KCksCgkJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCB0eXBlICksCgkJCW5leHQgPSBmdW5jdGlvbigpIHsKCQkJCWpRdWVyeS5kZXF1ZXVlKCBlbGVtLCB0eXBlICk7CgkJCX07CgoJCS8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWwKCQlpZiAoIGZuID09PSAiaW5wcm9ncmVzcyIgKSB7CgkJCWZuID0gcXVldWUuc2hpZnQoKTsKCQkJc3RhcnRMZW5ndGgtLTsKCQl9CgoJCWlmICggZm4gKSB7CgoJCQkvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nCgkJCS8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWQKCQkJaWYgKCB0eXBlID09PSAiZngiICkgewoJCQkJcXVldWUudW5zaGlmdCggImlucHJvZ3Jlc3MiICk7CgkJCX0KCgkJCS8vIENsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb24KCQkJZGVsZXRlIGhvb2tzLnN0b3A7CgkJCWZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7CgkJfQoKCQlpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHsKCQkJaG9va3MuZW1wdHkuZmlyZSgpOwoJCX0KCX0sCgoJLy8gTm90IHB1YmxpYyAtIGdlbmVyYXRlIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybiB0aGUgY3VycmVudCBvbmUKCV9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKCQl2YXIga2V5ID0gdHlwZSArICJxdWV1ZUhvb2tzIjsKCQlyZXR1cm4gZGF0YVByaXYuZ2V0KCBlbGVtLCBrZXkgKSB8fCBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIGtleSwgewoJCQllbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5IiApLmFkZCggZnVuY3Rpb24oKSB7CgkJCQlkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArICJxdWV1ZSIsIGtleSBdICk7CgkJCX0gKQoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJcXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXZhciBzZXR0ZXIgPSAyOwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZGF0YSA9IHR5cGU7CgkJCXR5cGUgPSAiZngiOwoJCQlzZXR0ZXItLTsKCQl9CgoJCWlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHsKCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7CgkJfQoKCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID8KCQkJdGhpcyA6CgkJCXRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsKCgkJCQkvLyBFbnN1cmUgYSBob29rcyBmb3IgdGhpcyBxdWV1ZQoJCQkJalF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7CgoJCQkJaWYgKCB0eXBlID09PSAiZngiICYmIHF1ZXVlWyAwIF0gIT09ICJpbnByb2dyZXNzIiApIHsKCQkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQkJfQoJCQl9ICk7Cgl9LAoJZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CgkJfSApOwoJfSwKCWNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewoJCXJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7Cgl9LAoKCS8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGUKCS8vIGFyZSBlbXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KQoJcHJvbWlzZTogZnVuY3Rpb24oIHR5cGUsIG9iaiApIHsKCQl2YXIgdG1wLAoJCQljb3VudCA9IDEsCgkJCWRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWVsZW1lbnRzID0gdGhpcywKCQkJaSA9IHRoaXMubGVuZ3RoLAoJCQlyZXNvbHZlID0gZnVuY3Rpb24oKSB7CgkJCQlpZiAoICEoIC0tY291bnQgKSApIHsKCQkJCQlkZWZlci5yZXNvbHZlV2l0aCggZWxlbWVudHMsIFsgZWxlbWVudHMgXSApOwoJCQkJfQoJCQl9OwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJb2JqID0gdHlwZTsKCQkJdHlwZSA9IHVuZGVmaW5lZDsKCQl9CgkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCgkJd2hpbGUgKCBpLS0gKSB7CgkJCXRtcCA9IGRhdGFQcml2LmdldCggZWxlbWVudHNbIGkgXSwgdHlwZSArICJxdWV1ZUhvb2tzIiApOwoJCQlpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7CgkJCQljb3VudCsrOwoJCQkJdG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApOwoJCQl9CgkJfQoJCXJlc29sdmUoKTsKCQlyZXR1cm4gZGVmZXIucHJvbWlzZSggb2JqICk7Cgl9Cn0gKTsKdmFyIHBudW0gPSAoIC9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8gKS5zb3VyY2U7Cgp2YXIgcmNzc051bSA9IG5ldyBSZWdFeHAoICJeKD86KFsrLV0pPXwpKCIgKyBwbnVtICsgIikoW2EteiVdKikkIiwgImkiICk7CgoKdmFyIGNzc0V4cGFuZCA9IFsgIlRvcCIsICJSaWdodCIsICJCb3R0b20iLCAiTGVmdCIgXTsKCnZhciBpc0hpZGRlbldpdGhpblRyZWUgPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7CgoJCS8vIGlzSGlkZGVuV2l0aGluVHJlZSBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uOwoJCS8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudAoJCWVsZW0gPSBlbCB8fCBlbGVtOwoKCQkvLyBJbmxpbmUgc3R5bGUgdHJ1bXBzIGFsbAoJCXJldHVybiBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICJub25lIiB8fAoJCQllbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmCgoJCQkvLyBPdGhlcndpc2UsIGNoZWNrIGNvbXB1dGVkIHN0eWxlCgkJCS8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MyAtIDQ1CgkJCS8vIERpc2Nvbm5lY3RlZCBlbGVtZW50cyBjYW4gaGF2ZSBjb21wdXRlZCBkaXNwbGF5OiBub25lLCBzbyBmaXJzdCBjb25maXJtIHRoYXQgZWxlbSBpcwoJCQkvLyBpbiB0aGUgZG9jdW1lbnQuCgkJCWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgJiYKCgkJCWpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApID09PSAibm9uZSI7Cgl9OwoKdmFyIHN3YXAgPSBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2ssIGFyZ3MgKSB7Cgl2YXIgcmV0LCBuYW1lLAoJCW9sZCA9IHt9OwoKCS8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lcwoJZm9yICggbmFtZSBpbiBvcHRpb25zICkgewoJCW9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdOwoJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTsKCX0KCglyZXQgPSBjYWxsYmFjay5hcHBseSggZWxlbSwgYXJncyB8fCBbXSApOwoKCS8vIFJldmVydCB0aGUgb2xkIHZhbHVlcwoJZm9yICggbmFtZSBpbiBvcHRpb25zICkgewoJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOwoJfQoKCXJldHVybiByZXQ7Cn07CgoKCgpmdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0sIHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkgewoJdmFyIGFkanVzdGVkLCBzY2FsZSwKCQltYXhJdGVyYXRpb25zID0gMjAsCgkJY3VycmVudFZhbHVlID0gdHdlZW4gPwoJCQlmdW5jdGlvbigpIHsKCQkJCXJldHVybiB0d2Vlbi5jdXIoKTsKCQkJfSA6CgkJCWZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AsICIiICk7CgkJCX0sCgkJaW5pdGlhbCA9IGN1cnJlbnRWYWx1ZSgpLAoJCXVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/ICIiIDogInB4IiApLAoKCQkvLyBTdGFydGluZyB2YWx1ZSBjb21wdXRhdGlvbiBpcyByZXF1aXJlZCBmb3IgcG90ZW50aWFsIHVuaXQgbWlzbWF0Y2hlcwoJCWluaXRpYWxJblVuaXQgPSAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0ICE9PSAicHgiICYmICtpbml0aWFsICkgJiYKCQkJcmNzc051bS5leGVjKCBqUXVlcnkuY3NzKCBlbGVtLCBwcm9wICkgKTsKCglpZiAoIGluaXRpYWxJblVuaXQgJiYgaW5pdGlhbEluVW5pdFsgMyBdICE9PSB1bml0ICkgewoKCQkvLyBTdXBwb3J0OiBGaXJlZm94IDw9NTQKCQkvLyBIYWx2ZSB0aGUgaXRlcmF0aW9uIHRhcmdldCB2YWx1ZSB0byBwcmV2ZW50IGludGVyZmVyZW5jZSBmcm9tIENTUyB1cHBlciBib3VuZHMgKGdoLTIxNDQpCgkJaW5pdGlhbCA9IGluaXRpYWwgLyAyOwoKCQkvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzCgkJdW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdOwoKCQkvLyBJdGVyYXRpdmVseSBhcHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFydGluZyBwb2ludAoJCWluaXRpYWxJblVuaXQgPSAraW5pdGlhbCB8fCAxOwoKCQl3aGlsZSAoIG1heEl0ZXJhdGlvbnMtLSApIHsKCgkJCS8vIEV2YWx1YXRlIGFuZCB1cGRhdGUgb3VyIGJlc3QgZ3Vlc3MgKGRvdWJsaW5nIGd1ZXNzZXMgdGhhdCB6ZXJvIG91dCkuCgkJCS8vIEZpbmlzaCBpZiB0aGUgc2NhbGUgZXF1YWxzIG9yIGNyb3NzZXMgMSAobWFraW5nIHRoZSBvbGQqbmV3IHByb2R1Y3Qgbm9uLXBvc2l0aXZlKS4KCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApOwoJCQlpZiAoICggMSAtIHNjYWxlICkgKiAoIDEgLSAoIHNjYWxlID0gY3VycmVudFZhbHVlKCkgLyBpbml0aWFsIHx8IDAuNSApICkgPD0gMCApIHsKCQkJCW1heEl0ZXJhdGlvbnMgPSAwOwoJCQl9CgkJCWluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7CgoJCX0KCgkJaW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgKiAyOwoJCWpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgaW5pdGlhbEluVW5pdCArIHVuaXQgKTsKCgkJLy8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvbgoJCXZhbHVlUGFydHMgPSB2YWx1ZVBhcnRzIHx8IFtdOwoJfQoKCWlmICggdmFsdWVQYXJ0cyApIHsKCQlpbml0aWFsSW5Vbml0ID0gK2luaXRpYWxJblVuaXQgfHwgK2luaXRpYWwgfHwgMDsKCgkJLy8gQXBwbHkgcmVsYXRpdmUgb2Zmc2V0ICgrPS8tPSkgaWYgc3BlY2lmaWVkCgkJYWRqdXN0ZWQgPSB2YWx1ZVBhcnRzWyAxIF0gPwoJCQlpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOgoJCQkrdmFsdWVQYXJ0c1sgMiBdOwoJCWlmICggdHdlZW4gKSB7CgkJCXR3ZWVuLnVuaXQgPSB1bml0OwoJCQl0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7CgkJCXR3ZWVuLmVuZCA9IGFkanVzdGVkOwoJCX0KCX0KCXJldHVybiBhZGp1c3RlZDsKfQoKCnZhciBkZWZhdWx0RGlzcGxheU1hcCA9IHt9OwoKZnVuY3Rpb24gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKSB7Cgl2YXIgdGVtcCwKCQlkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsCgkJbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLAoJCWRpc3BsYXkgPSBkZWZhdWx0RGlzcGxheU1hcFsgbm9kZU5hbWUgXTsKCglpZiAoIGRpc3BsYXkgKSB7CgkJcmV0dXJuIGRpc3BsYXk7Cgl9CgoJdGVtcCA9IGRvYy5ib2R5LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKSApOwoJZGlzcGxheSA9IGpRdWVyeS5jc3MoIHRlbXAsICJkaXNwbGF5IiApOwoKCXRlbXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGVtcCApOwoKCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCWRpc3BsYXkgPSAiYmxvY2siOwoJfQoJZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF0gPSBkaXNwbGF5OwoKCXJldHVybiBkaXNwbGF5Owp9CgpmdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7Cgl2YXIgZGlzcGxheSwgZWxlbSwKCQl2YWx1ZXMgPSBbXSwKCQlpbmRleCA9IDAsCgkJbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOwoKCS8vIERldGVybWluZSBuZXcgZGlzcGxheSB2YWx1ZSBmb3IgZWxlbWVudHMgdGhhdCBuZWVkIHRvIGNoYW5nZQoJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQllbGVtID0gZWxlbWVudHNbIGluZGV4IF07CgkJaWYgKCAhZWxlbS5zdHlsZSApIHsKCQkJY29udGludWU7CgkJfQoKCQlkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5OwoJCWlmICggc2hvdyApIHsKCgkJCS8vIFNpbmNlIHdlIGZvcmNlIHZpc2liaWxpdHkgdXBvbiBjYXNjYWRlLWhpZGRlbiBlbGVtZW50cywgYW4gaW1tZWRpYXRlIChhbmQgc2xvdykKCQkJLy8gY2hlY2sgaXMgcmVxdWlyZWQgaW4gdGhpcyBmaXJzdCBsb29wIHVubGVzcyB3ZSBoYXZlIGEgbm9uZW1wdHkgZGlzcGxheSB2YWx1ZSAoZWl0aGVyCgkJCS8vIGlubGluZSBvciBhYm91dC10by1iZS1yZXN0b3JlZCkKCQkJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgKSB7CgkJCQl2YWx1ZXNbIGluZGV4IF0gPSBkYXRhUHJpdi5nZXQoIGVsZW0sICJkaXNwbGF5IiApIHx8IG51bGw7CgkJCQlpZiAoICF2YWx1ZXNbIGluZGV4IF0gKSB7CgkJCQkJZWxlbS5zdHlsZS5kaXNwbGF5ID0gIiI7CgkJCQl9CgkJCX0KCQkJaWYgKCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApICkgewoJCQkJdmFsdWVzWyBpbmRleCBdID0gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKTsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmICggZGlzcGxheSAhPT0gIm5vbmUiICkgewoJCQkJdmFsdWVzWyBpbmRleCBdID0gIm5vbmUiOwoKCQkJCS8vIFJlbWVtYmVyIHdoYXQgd2UncmUgb3ZlcndyaXRpbmcKCQkJCWRhdGFQcml2LnNldCggZWxlbSwgImRpc3BsYXkiLCBkaXNwbGF5ICk7CgkJCX0KCQl9Cgl9CgoJLy8gU2V0IHRoZSBkaXNwbGF5IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wIHRvIGF2b2lkIGNvbnN0YW50IHJlZmxvdwoJZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQlpZiAoIHZhbHVlc1sgaW5kZXggXSAhPSBudWxsICkgewoJCQllbGVtZW50c1sgaW5kZXggXS5zdHlsZS5kaXNwbGF5ID0gdmFsdWVzWyBpbmRleCBdOwoJCX0KCX0KCglyZXR1cm4gZWxlbWVudHM7Cn0KCmpRdWVyeS5mbi5leHRlbmQoIHsKCXNob3c6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApOwoJfSwKCWhpZGU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzaG93SGlkZSggdGhpcyApOwoJfSwKCXRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkgewoJCWlmICggdHlwZW9mIHN0YXRlID09PSAiYm9vbGVhbiIgKSB7CgkJCXJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJaWYgKCBpc0hpZGRlbldpdGhpblRyZWUoIHRoaXMgKSApIHsKCQkJCWpRdWVyeSggdGhpcyApLnNob3coKTsKCQkJfSBlbHNlIHsKCQkJCWpRdWVyeSggdGhpcyApLmhpZGUoKTsKCQkJfQoJCX0gKTsKCX0KfSApOwp2YXIgcmNoZWNrYWJsZVR5cGUgPSAoIC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pICk7Cgp2YXIgcnRhZ05hbWUgPSAoIC88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0rKS9pICk7Cgp2YXIgcnNjcmlwdFR5cGUgPSAoIC9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSApOwoKCgovLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKQp2YXIgd3JhcE1hcCA9IHsKCgkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJb3B0aW9uOiBbIDEsICI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwgIjwvc2VsZWN0PiIgXSwKCgkvLyBYSFRNTCBwYXJzZXJzIGRvIG5vdCBtYWdpY2FsbHkgaW5zZXJ0IGVsZW1lbnRzIGluIHRoZQoJLy8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlbgoJLy8gdGhpcyBieSBvbWl0dGluZyA8dGJvZHk+IG9yIG90aGVyIHJlcXVpcmVkIGVsZW1lbnRzLgoJdGhlYWQ6IFsgMSwgIjx0YWJsZT4iLCAiPC90YWJsZT4iIF0sCgljb2w6IFsgMiwgIjx0YWJsZT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sCgl0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKCXRkOiBbIDMsICI8dGFibGU+PHRib2R5Pjx0cj4iLCAiPC90cj48L3Rib2R5PjwvdGFibGU+IiBdLAoKCV9kZWZhdWx0OiBbIDAsICIiLCAiIiBdCn07CgovLyBTdXBwb3J0OiBJRSA8PTkgb25seQp3cmFwTWFwLm9wdGdyb3VwID0gd3JhcE1hcC5vcHRpb247Cgp3cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkOwp3cmFwTWFwLnRoID0gd3JhcE1hcC50ZDsKCgpmdW5jdGlvbiBnZXRBbGwoIGNvbnRleHQsIHRhZyApIHsKCgkvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5CgkvLyBVc2UgdHlwZW9mIHRvIGF2b2lkIHplcm8tYXJndW1lbnQgbWV0aG9kIGludm9jYXRpb24gb24gaG9zdCBvYmplY3RzICgjMTUxNTEpCgl2YXIgcmV0OwoKCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCXJldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCAiKiIgKTsKCgl9IGVsc2UgaWYgKCB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSAidW5kZWZpbmVkIiApIHsKCQlyZXQgPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyB8fCAiKiIgKTsKCgl9IGVsc2UgewoJCXJldCA9IFtdOwoJfQoKCWlmICggdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIG5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSApIHsKCQlyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICk7Cgl9CgoJcmV0dXJuIHJldDsKfQoKCi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZApmdW5jdGlvbiBzZXRHbG9iYWxFdmFsKCBlbGVtcywgcmVmRWxlbWVudHMgKSB7Cgl2YXIgaSA9IDAsCgkJbCA9IGVsZW1zLmxlbmd0aDsKCglmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJZGF0YVByaXYuc2V0KAoJCQllbGVtc1sgaSBdLAoJCQkiZ2xvYmFsRXZhbCIsCgkJCSFyZWZFbGVtZW50cyB8fCBkYXRhUHJpdi5nZXQoIHJlZkVsZW1lbnRzWyBpIF0sICJnbG9iYWxFdmFsIiApCgkJKTsKCX0KfQoKCnZhciByaHRtbCA9IC88fCYjP1x3KzsvOwoKZnVuY3Rpb24gYnVpbGRGcmFnbWVudCggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiwgaWdub3JlZCApIHsKCXZhciBlbGVtLCB0bXAsIHRhZywgd3JhcCwgY29udGFpbnMsIGosCgkJZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKCQlub2RlcyA9IFtdLAoJCWkgPSAwLAoJCWwgPSBlbGVtcy5sZW5ndGg7CgoJZm9yICggOyBpIDwgbDsgaSsrICkgewoJCWVsZW0gPSBlbGVtc1sgaSBdOwoKCQlpZiAoIGVsZW0gfHwgZWxlbSA9PT0gMCApIHsKCgkJCS8vIEFkZCBub2RlcyBkaXJlY3RseQoJCQlpZiAoIHRvVHlwZSggZWxlbSApID09PSAib2JqZWN0IiApIHsKCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHkKCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTsKCgkJCS8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZQoJCQl9IGVsc2UgaWYgKCAhcmh0bWwudGVzdCggZWxlbSApICkgewoJCQkJbm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7CgoJCQkvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXMKCQkJfSBlbHNlIHsKCQkJCXRtcCA9IHRtcCB8fCBmcmFnbWVudC5hcHBlbmRDaGlsZCggY29udGV4dC5jcmVhdGVFbGVtZW50KCAiZGl2IiApICk7CgoJCQkJLy8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvbgoJCQkJdGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTsKCQkJCXdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0OwoJCQkJdG1wLmlubmVySFRNTCA9IHdyYXBbIDEgXSArIGpRdWVyeS5odG1sUHJlZmlsdGVyKCBlbGVtICkgKyB3cmFwWyAyIF07CgoJCQkJLy8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50CgkJCQlqID0gd3JhcFsgMCBdOwoJCQkJd2hpbGUgKCBqLS0gKSB7CgkJCQkJdG1wID0gdG1wLmxhc3RDaGlsZDsKCQkJCX0KCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHkKCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7CgoJCQkJLy8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXIKCQkJCXRtcCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7CgoJCQkJLy8gRW5zdXJlIHRoZSBjcmVhdGVkIG5vZGVzIGFyZSBvcnBoYW5lZCAoIzEyMzkyKQoJCQkJdG1wLnRleHRDb250ZW50ID0gIiI7CgkJCX0KCQl9Cgl9CgoJLy8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudAoJZnJhZ21lbnQudGV4dENvbnRlbnQgPSAiIjsKCglpID0gMDsKCXdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7CgoJCS8vIFNraXAgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgY29udGV4dCBjb2xsZWN0aW9uICh0cmFjLTQwODcpCgkJaWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApID4gLTEgKSB7CgkJCWlmICggaWdub3JlZCApIHsKCQkJCWlnbm9yZWQucHVzaCggZWxlbSApOwoJCQl9CgkJCWNvbnRpbnVlOwoJCX0KCgkJY29udGFpbnMgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwoKCQkvLyBBcHBlbmQgdG8gZnJhZ21lbnQKCQl0bXAgPSBnZXRBbGwoIGZyYWdtZW50LmFwcGVuZENoaWxkKCBlbGVtICksICJzY3JpcHQiICk7CgoJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKCQlpZiAoIGNvbnRhaW5zICkgewoJCQlzZXRHbG9iYWxFdmFsKCB0bXAgKTsKCQl9CgoJCS8vIENhcHR1cmUgZXhlY3V0YWJsZXMKCQlpZiAoIHNjcmlwdHMgKSB7CgkJCWogPSAwOwoJCQl3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHsKCQkJCWlmICggcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlIHx8ICIiICkgKSB7CgkJCQkJc2NyaXB0cy5wdXNoKCBlbGVtICk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIGZyYWdtZW50Owp9CgoKKCBmdW5jdGlvbigpIHsKCXZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKCQlkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSApLAoJCWlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApOwoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHkKCS8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpCgkvLyBTdXBwb3J0OiBXaW5kb3dzIFdlYiBBcHBzIChXV0EpCgkvLyBgbmFtZWAgYW5kIGB0eXBlYCBtdXN0IHVzZSAuc2V0QXR0cmlidXRlIGZvciBXV0EgKCMxNDkwMSkKCWlucHV0LnNldEF0dHJpYnV0ZSggInR5cGUiLCAicmFkaW8iICk7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgImNoZWNrZWQiICk7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJuYW1lIiwgInQiICk7CgoJZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApOwoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgb25seQoJLy8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzCglzdXBwb3J0LmNoZWNrQ2xvbmUgPSBkaXYuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7CgoJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkvLyBNYWtlIHN1cmUgdGV4dGFyZWEgKGFuZCBjaGVja2JveCkgZGVmYXVsdFZhbHVlIGlzIHByb3Blcmx5IGNsb25lZAoJZGl2LmlubmVySFRNTCA9ICI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IjsKCXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgPSAhIWRpdi5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlOwp9ICkoKTsKdmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCgoKdmFyCglya2V5RXZlbnQgPSAvXmtleS8sCglybW91c2VFdmVudCA9IC9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLywKCXJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XC4oLispfCkvOwoKZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKCXJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiByZXR1cm5GYWxzZSgpIHsKCXJldHVybiBmYWxzZTsKfQoKLy8gU3VwcG9ydDogSUUgPD05IG9ubHkKLy8gU2VlICMxMzM5MyBmb3IgbW9yZSBpbmZvCmZ1bmN0aW9uIHNhZmVBY3RpdmVFbGVtZW50KCkgewoJdHJ5IHsKCQlyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKCX0gY2F0Y2ggKCBlcnIgKSB7IH0KfQoKZnVuY3Rpb24gb24oIGVsZW0sIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIG9uZSApIHsKCXZhciBvcmlnRm4sIHR5cGU7CgoJLy8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzCglpZiAoIHR5cGVvZiB0eXBlcyA9PT0gIm9iamVjdCIgKSB7CgoJCS8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoKCQkJLy8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKQoJCQlkYXRhID0gZGF0YSB8fCBzZWxlY3RvcjsKCQkJc2VsZWN0b3IgPSB1bmRlZmluZWQ7CgkJfQoJCWZvciAoIHR5cGUgaW4gdHlwZXMgKSB7CgkJCW9uKCBlbGVtLCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7CgkJfQoJCXJldHVybiBlbGVtOwoJfQoKCWlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7CgoJCS8vICggdHlwZXMsIGZuICkKCQlmbiA9IHNlbGVjdG9yOwoJCWRhdGEgPSBzZWxlY3RvciA9IHVuZGVmaW5lZDsKCX0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7CgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgewoKCQkJLy8gKCB0eXBlcywgc2VsZWN0b3IsIGZuICkKCQkJZm4gPSBkYXRhOwoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0gZWxzZSB7CgoJCQkvLyAoIHR5cGVzLCBkYXRhLCBmbiApCgkJCWZuID0gZGF0YTsKCQkJZGF0YSA9IHNlbGVjdG9yOwoJCQlzZWxlY3RvciA9IHVuZGVmaW5lZDsKCQl9Cgl9CglpZiAoIGZuID09PSBmYWxzZSApIHsKCQlmbiA9IHJldHVybkZhbHNlOwoJfSBlbHNlIGlmICggIWZuICkgewoJCXJldHVybiBlbGVtOwoJfQoKCWlmICggb25lID09PSAxICkgewoJCW9yaWdGbiA9IGZuOwoJCWZuID0gZnVuY3Rpb24oIGV2ZW50ICkgewoKCQkJLy8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvCgkJCWpRdWVyeSgpLm9mZiggZXZlbnQgKTsKCQkJcmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfTsKCgkJLy8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm4KCQlmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTsKCX0KCXJldHVybiBlbGVtLmVhY2goIGZ1bmN0aW9uKCkgewoJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTsKCX0gKTsKfQoKLyoKICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgogKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLgogKi8KalF1ZXJ5LmV2ZW50ID0gewoKCWdsb2JhbDoge30sCgoJYWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkgewoKCQl2YXIgaGFuZGxlT2JqSW4sIGV2ZW50SGFuZGxlLCB0bXAsCgkJCWV2ZW50cywgdCwgaGFuZGxlT2JqLAoJCQlzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsCgkJCWVsZW1EYXRhID0gZGF0YVByaXYuZ2V0KCBlbGVtICk7CgoJCS8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpCgkJaWYgKCAhZWxlbURhdGEgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBvYmplY3Qgb2YgY3VzdG9tIGRhdGEgaW4gbGlldSBvZiB0aGUgaGFuZGxlcgoJCWlmICggaGFuZGxlci5oYW5kbGVyICkgewoJCQloYW5kbGVPYmpJbiA9IGhhbmRsZXI7CgkJCWhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyOwoJCQlzZWxlY3RvciA9IGhhbmRsZU9iakluLnNlbGVjdG9yOwoJCX0KCgkJLy8gRW5zdXJlIHRoYXQgaW52YWxpZCBzZWxlY3RvcnMgdGhyb3cgZXhjZXB0aW9ucyBhdCBhdHRhY2ggdGltZQoJCS8vIEV2YWx1YXRlIGFnYWluc3QgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgZWxlbSBpcyBhIG5vbi1lbGVtZW50IG5vZGUgKGUuZy4sIGRvY3VtZW50KQoJCWlmICggc2VsZWN0b3IgKSB7CgkJCWpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZG9jdW1lbnRFbGVtZW50LCBzZWxlY3RvciApOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyCgkJaWYgKCAhaGFuZGxlci5ndWlkICkgewoJCQloYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrOwoJCX0KCgkJLy8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBmaXJzdAoJCWlmICggISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7CgkJCWV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyA9IHt9OwoJCX0KCQlpZiAoICEoIGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlICkgKSB7CgkJCWV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7CgoJCQkJLy8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmQKCQkJCS8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQKCQkJCXJldHVybiB0eXBlb2YgalF1ZXJ5ICE9PSAidW5kZWZpbmVkIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgPwoJCQkJCWpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7CgkJCX07CgkJfQoKCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlCgkJdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgkJdCA9IHR5cGVzLmxlbmd0aDsKCQl3aGlsZSAoIHQtLSApIHsKCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdOwoJCQl0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTsKCQkJbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwoKCQkJLy8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx5IGhhbmRsZXJzCgkJCWlmICggIXR5cGUgKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwoKCQkJLy8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlCgkJCXR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTsKCgkJCS8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGUKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CgoJCQkvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVycwoJCQloYW5kbGVPYmogPSBqUXVlcnkuZXh0ZW5kKCB7CgkJCQl0eXBlOiB0eXBlLAoJCQkJb3JpZ1R5cGU6IG9yaWdUeXBlLAoJCQkJZGF0YTogZGF0YSwKCQkJCWhhbmRsZXI6IGhhbmRsZXIsCgkJCQlndWlkOiBoYW5kbGVyLmd1aWQsCgkJCQlzZWxlY3Rvcjogc2VsZWN0b3IsCgkJCQluZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLAoJCQkJbmFtZXNwYWNlOiBuYW1lc3BhY2VzLmpvaW4oICIuIiApCgkJCX0sIGhhbmRsZU9iakluICk7CgoJCQkvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdAoJCQlpZiAoICEoIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gKSApIHsKCQkJCWhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsKCQkJCWhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwOwoKCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQoJCQkJaWYgKCAhc3BlY2lhbC5zZXR1cCB8fAoJCQkJCXNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7CgoJCQkJCWlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkgewoJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlpZiAoIHNwZWNpYWwuYWRkICkgewoJCQkJc3BlY2lhbC5hZGQuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7CgoJCQkJaWYgKCAhaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCApIHsKCQkJCQloYW5kbGVPYmouaGFuZGxlci5ndWlkID0gaGFuZGxlci5ndWlkOwoJCQkJfQoJCQl9CgoJCQkvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udAoJCQlpZiAoIHNlbGVjdG9yICkgewoJCQkJaGFuZGxlcnMuc3BsaWNlKCBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50KyssIDAsIGhhbmRsZU9iaiApOwoJCQl9IGVsc2UgewoJCQkJaGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgkJCX0KCgkJCS8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb24KCQkJalF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTsKCQl9CgoJfSwKCgkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7CgoJCXZhciBqLCBvcmlnQ291bnQsIHRtcCwKCQkJZXZlbnRzLCB0LCBoYW5kbGVPYmosCgkJCXNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSwKCQkJZWxlbURhdGEgPSBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICkgJiYgZGF0YVByaXYuZ2V0KCBlbGVtICk7CgoJCWlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBPbmNlIGZvciBlYWNoIHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0eXBlIG1heSBiZSBvbWl0dGVkCgkJdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgkJdCA9IHR5cGVzLmxlbmd0aDsKCQl3aGlsZSAoIHQtLSApIHsKCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdOwoJCQl0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTsKCQkJbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwoKCQkJLy8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50CgkJCWlmICggIXR5cGUgKSB7CgkJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTsKCQkJCX0KCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCQkJdHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlOwoJCQloYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdOwoJCQl0bXAgPSB0bXBbIDIgXSAmJgoJCQkJbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCAiXFwuKD86LipcXC58KSIgKSArICIoXFwufCQpIiApOwoKCQkJLy8gUmVtb3ZlIG1hdGNoaW5nIGV2ZW50cwoJCQlvcmlnQ291bnQgPSBqID0gaGFuZGxlcnMubGVuZ3RoOwoJCQl3aGlsZSAoIGotLSApIHsKCQkJCWhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07CgoJCQkJaWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJgoJCQkJCSggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYmCgkJCQkJKCAhdG1wIHx8IHRtcC50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJgoJCQkJCSggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHwKCQkJCQkJc2VsZWN0b3IgPT09ICIqKiIgJiYgaGFuZGxlT2JqLnNlbGVjdG9yICkgKSB7CgkJCQkJaGFuZGxlcnMuc3BsaWNlKCBqLCAxICk7CgoJCQkJCWlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkgewoJCQkJCQloYW5kbGVycy5kZWxlZ2F0ZUNvdW50LS07CgkJCQkJfQoJCQkJCWlmICggc3BlY2lhbC5yZW1vdmUgKSB7CgkJCQkJCXNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdAoJCQkvLyAoYXZvaWRzIHBvdGVudGlhbCBmb3IgZW5kbGVzcyByZWN1cnNpb24gZHVyaW5nIHJlbW92YWwgb2Ygc3BlY2lhbCBldmVudCBoYW5kbGVycykKCQkJaWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHsKCQkJCWlmICggIXNwZWNpYWwudGVhcmRvd24gfHwKCQkJCQlzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHsKCgkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTsKCQkJCX0KCgkJCQlkZWxldGUgZXZlbnRzWyB0eXBlIF07CgkJCX0KCQl9CgoJCS8vIFJlbW92ZSBkYXRhIGFuZCB0aGUgZXhwYW5kbyBpZiBpdCdzIG5vIGxvbmdlciB1c2VkCgkJaWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZlbnRzICkgKSB7CgkJCWRhdGFQcml2LnJlbW92ZSggZWxlbSwgImhhbmRsZSBldmVudHMiICk7CgkJfQoJfSwKCglkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkgewoKCQkvLyBNYWtlIGEgd3JpdGFibGUgalF1ZXJ5LkV2ZW50IGZyb20gdGhlIG5hdGl2ZSBldmVudCBvYmplY3QKCQl2YXIgZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBuYXRpdmVFdmVudCApOwoKCQl2YXIgaSwgaiwgcmV0LCBtYXRjaGVkLCBoYW5kbGVPYmosIGhhbmRsZXJRdWV1ZSwKCQkJYXJncyA9IG5ldyBBcnJheSggYXJndW1lbnRzLmxlbmd0aCApLAoJCQloYW5kbGVycyA9ICggZGF0YVByaXYuZ2V0KCB0aGlzLCAiZXZlbnRzIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSwKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyBldmVudC50eXBlIF0gfHwge307CgoJCS8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50CgkJYXJnc1sgMCBdID0gZXZlbnQ7CgoJCWZvciAoIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrICkgewoJCQlhcmdzWyBpIF0gPSBhcmd1bWVudHNbIGkgXTsKCQl9CgoJCWV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpczsKCgkJLy8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZAoJCWlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBEZXRlcm1pbmUgaGFuZGxlcnMKCQloYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7CgoJCS8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzCgkJaSA9IDA7CgkJd2hpbGUgKCAoIG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07CgoJCQlqID0gMDsKCQkJd2hpbGUgKCAoIGhhbmRsZU9iaiA9IG1hdGNoZWQuaGFuZGxlcnNbIGorKyBdICkgJiYKCQkJCSFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkgewoKCQkJCS8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IgMikgaGF2ZSBuYW1lc3BhY2UocykKCQkJCS8vIGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBib3VuZCBldmVudCAoYm90aCBjYW4gaGF2ZSBubyBuYW1lc3BhY2UpLgoJCQkJaWYgKCAhZXZlbnQucm5hbWVzcGFjZSB8fCBldmVudC5ybmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHsKCgkJCQkJZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqOwoJCQkJCWV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0YTsKCgkJCQkJcmV0ID0gKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSApLmhhbmRsZSB8fAoJCQkJCQloYW5kbGVPYmouaGFuZGxlciApLmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTsKCgkJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQkJaWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJldCApID09PSBmYWxzZSApIHsKCQkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZQoJCWlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7CgkJCXNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgloYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHsKCQl2YXIgaSwgaGFuZGxlT2JqLCBzZWwsIG1hdGNoZWRIYW5kbGVycywgbWF0Y2hlZFNlbGVjdG9ycywKCQkJaGFuZGxlclF1ZXVlID0gW10sCgkJCWRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LAoJCQljdXIgPSBldmVudC50YXJnZXQ7CgoJCS8vIEZpbmQgZGVsZWdhdGUgaGFuZGxlcnMKCQlpZiAoIGRlbGVnYXRlQ291bnQgJiYKCgkJCS8vIFN1cHBvcnQ6IElFIDw9OQoJCQkvLyBCbGFjay1ob2xlIFNWRyA8dXNlPiBpbnN0YW5jZSB0cmVlcyAodHJhYy0xMzE4MCkKCQkJY3VyLm5vZGVUeXBlICYmCgoJCQkvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDIKCQkJLy8gU3VwcHJlc3Mgc3BlYy12aW9sYXRpbmcgY2xpY2tzIGluZGljYXRpbmcgYSBub24tcHJpbWFyeSBwb2ludGVyIGJ1dHRvbiAodHJhYy0zODYxKQoJCQkvLyBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudC10eXBlLWNsaWNrCgkJCS8vIFN1cHBvcnQ6IElFIDExIG9ubHkKCQkJLy8gLi4uYnV0IG5vdCBhcnJvdyBrZXkgImNsaWNrcyIgb2YgcmFkaW8gaW5wdXRzLCB3aGljaCBjYW4gaGF2ZSBgYnV0dG9uYCAtMSAoZ2gtMjM0MykKCQkJISggZXZlbnQudHlwZSA9PT0gImNsaWNrIiAmJiBldmVudC5idXR0b24gPj0gMSApICkgewoKCQkJZm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7CgoJCQkJLy8gRG9uJ3QgY2hlY2sgbm9uLWVsZW1lbnRzICgjMTMyMDgpCgkJCQkvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NCkKCQkJCWlmICggY3VyLm5vZGVUeXBlID09PSAxICYmICEoIGV2ZW50LnR5cGUgPT09ICJjbGljayIgJiYgY3VyLmRpc2FibGVkID09PSB0cnVlICkgKSB7CgkJCQkJbWF0Y2hlZEhhbmRsZXJzID0gW107CgkJCQkJbWF0Y2hlZFNlbGVjdG9ycyA9IHt9OwoJCQkJCWZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkgewoJCQkJCQloYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdOwoKCQkJCQkJLy8gRG9uJ3QgY29uZmxpY3Qgd2l0aCBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKCMxMzIwMykKCQkJCQkJc2VsID0gaGFuZGxlT2JqLnNlbGVjdG9yICsgIiAiOwoKCQkJCQkJaWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkgewoJCQkJCQkJbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID8KCQkJCQkJCQlqUXVlcnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+IC0xIDoKCQkJCQkJCQlqUXVlcnkuZmluZCggc2VsLCB0aGlzLCBudWxsLCBbIGN1ciBdICkubGVuZ3RoOwoJCQkJCQl9CgkJCQkJCWlmICggbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gKSB7CgkJCQkJCQltYXRjaGVkSGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJaWYgKCBtYXRjaGVkSGFuZGxlcnMubGVuZ3RoICkgewoJCQkJCQloYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBtYXRjaGVkSGFuZGxlcnMgfSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVycwoJCWN1ciA9IHRoaXM7CgkJaWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkgewoJCQloYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0gKTsKCQl9CgoJCXJldHVybiBoYW5kbGVyUXVldWU7Cgl9LAoKCWFkZFByb3A6IGZ1bmN0aW9uKCBuYW1lLCBob29rICkgewoJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggalF1ZXJ5LkV2ZW50LnByb3RvdHlwZSwgbmFtZSwgewoJCQllbnVtZXJhYmxlOiB0cnVlLAoJCQljb25maWd1cmFibGU6IHRydWUsCgoJCQlnZXQ6IGlzRnVuY3Rpb24oIGhvb2sgKSA/CgkJCQlmdW5jdGlvbigpIHsKCQkJCQlpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHsKCQkJCQkJCXJldHVybiBob29rKCB0aGlzLm9yaWdpbmFsRXZlbnQgKTsKCQkJCQl9CgkJCQl9IDoKCQkJCWZ1bmN0aW9uKCkgewoJCQkJCWlmICggdGhpcy5vcmlnaW5hbEV2ZW50ICkgewoJCQkJCQkJcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFsgbmFtZSBdOwoJCQkJCX0KCQkJCX0sCgoJCQlzZXQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgbmFtZSwgewoJCQkJCWVudW1lcmFibGU6IHRydWUsCgkJCQkJY29uZmlndXJhYmxlOiB0cnVlLAoJCQkJCXdyaXRhYmxlOiB0cnVlLAoJCQkJCXZhbHVlOiB2YWx1ZQoJCQkJfSApOwoJCQl9CgkJfSApOwoJfSwKCglmaXg6IGZ1bmN0aW9uKCBvcmlnaW5hbEV2ZW50ICkgewoJCXJldHVybiBvcmlnaW5hbEV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID8KCQkJb3JpZ2luYWxFdmVudCA6CgkJCW5ldyBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTsKCX0sCgoJc3BlY2lhbDogewoJCWxvYWQ6IHsKCgkJCS8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWQKCQkJbm9CdWJibGU6IHRydWUKCQl9LAoJCWZvY3VzOiB7CgoJCQkvLyBGaXJlIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3QKCQkJdHJpZ2dlcjogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIHRoaXMgIT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5mb2N1cyApIHsKCQkJCQl0aGlzLmZvY3VzKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoJCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c2luIgoJCX0sCgkJYmx1cjogewoJCQl0cmlnZ2VyOiBmdW5jdGlvbigpIHsKCQkJCWlmICggdGhpcyA9PT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmJsdXIgKSB7CgkJCQkJdGhpcy5ibHVyKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoJCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c291dCIKCQl9LAoJCWNsaWNrOiB7CgoJCQkvLyBGb3IgY2hlY2tib3gsIGZpcmUgbmF0aXZlIGV2ZW50IHNvIGNoZWNrZWQgc3RhdGUgd2lsbCBiZSByaWdodAoJCQl0cmlnZ2VyOiBmdW5jdGlvbigpIHsKCQkJCWlmICggdGhpcy50eXBlID09PSAiY2hlY2tib3giICYmIHRoaXMuY2xpY2sgJiYgbm9kZU5hbWUoIHRoaXMsICJpbnB1dCIgKSApIHsKCQkJCQl0aGlzLmNsaWNrKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoKCQkJLy8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIGRvbid0IGZpcmUgbmF0aXZlIC5jbGljaygpIG9uIGxpbmtzCgkJCV9kZWZhdWx0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlyZXR1cm4gbm9kZU5hbWUoIGV2ZW50LnRhcmdldCwgImEiICk7CgkJCX0KCQl9LAoKCQliZWZvcmV1bmxvYWQ6IHsKCQkJcG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7CgoJCQkJLy8gU3VwcG9ydDogRmlyZWZveCAyMCsKCQkJCS8vIEZpcmVmb3ggZG9lc24ndCBhbGVydCBpZiB0aGUgcmV0dXJuVmFsdWUgZmllbGQgaXMgbm90IHNldC4KCQkJCWlmICggZXZlbnQucmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgZXZlbnQub3JpZ2luYWxFdmVudCApIHsKCQkJCQlldmVudC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZXZlbnQucmVzdWx0OwoJCQkJfQoJCQl9CgkJfQoJfQp9OwoKalF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHsKCgkvLyBUaGlzICJpZiIgaXMgbmVlZGVkIGZvciBwbGFpbiBvYmplY3RzCglpZiAoIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHsKCQllbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSApOwoJfQp9OwoKalF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7CgoJLy8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkCglpZiAoICEoIHRoaXMgaW5zdGFuY2VvZiBqUXVlcnkuRXZlbnQgKSApIHsKCQlyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApOwoJfQoKCS8vIEV2ZW50IG9iamVjdAoJaWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7CgkJdGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjOwoJCXRoaXMudHlwZSA9IHNyYy50eXBlOwoKCQkvLyBFdmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHByZXZlbnRlZAoJCS8vIGJ5IGEgaGFuZGxlciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLgoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHwKCQkJCXNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiYKCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHkKCQkJCXNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgPwoJCQlyZXR1cm5UcnVlIDoKCQkJcmV0dXJuRmFsc2U7CgoJCS8vIENyZWF0ZSB0YXJnZXQgcHJvcGVydGllcwoJCS8vIFN1cHBvcnQ6IFNhZmFyaSA8PTYgLSA3IG9ubHkKCQkvLyBUYXJnZXQgc2hvdWxkIG5vdCBiZSBhIHRleHQgbm9kZSAoIzUwNCwgIzEzMTQzKQoJCXRoaXMudGFyZ2V0ID0gKCBzcmMudGFyZ2V0ICYmIHNyYy50YXJnZXQubm9kZVR5cGUgPT09IDMgKSA/CgkJCXNyYy50YXJnZXQucGFyZW50Tm9kZSA6CgkJCXNyYy50YXJnZXQ7CgoJCXRoaXMuY3VycmVudFRhcmdldCA9IHNyYy5jdXJyZW50VGFyZ2V0OwoJCXRoaXMucmVsYXRlZFRhcmdldCA9IHNyYy5yZWxhdGVkVGFyZ2V0OwoKCS8vIEV2ZW50IHR5cGUKCX0gZWxzZSB7CgkJdGhpcy50eXBlID0gc3JjOwoJfQoKCS8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0CglpZiAoIHByb3BzICkgewoJCWpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7Cgl9CgoJLy8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmUKCXRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTsKCgkvLyBNYXJrIGl0IGFzIGZpeGVkCgl0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTsKfTsKCi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZwovLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sCmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7Cgljb25zdHJ1Y3RvcjogalF1ZXJ5LkV2ZW50LAoJaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKCWlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzU2ltdWxhdGVkOiBmYWxzZSwKCglwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKCgkJaWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkgewoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJfQoJfSwKCXN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQlpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CgkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJfQoJfSwKCXN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQlpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CgkJCWUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CgkJfQoKCQl0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwoJfQp9OwoKLy8gSW5jbHVkZXMgYWxsIGNvbW1vbiBldmVudCBwcm9wcyBpbmNsdWRpbmcgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnQgc3BlY2lmaWMgcHJvcHMKalF1ZXJ5LmVhY2goIHsKCWFsdEtleTogdHJ1ZSwKCWJ1YmJsZXM6IHRydWUsCgljYW5jZWxhYmxlOiB0cnVlLAoJY2hhbmdlZFRvdWNoZXM6IHRydWUsCgljdHJsS2V5OiB0cnVlLAoJZGV0YWlsOiB0cnVlLAoJZXZlbnRQaGFzZTogdHJ1ZSwKCW1ldGFLZXk6IHRydWUsCglwYWdlWDogdHJ1ZSwKCXBhZ2VZOiB0cnVlLAoJc2hpZnRLZXk6IHRydWUsCgl2aWV3OiB0cnVlLAoJImNoYXIiOiB0cnVlLAoJY2hhckNvZGU6IHRydWUsCglrZXk6IHRydWUsCglrZXlDb2RlOiB0cnVlLAoJYnV0dG9uOiB0cnVlLAoJYnV0dG9uczogdHJ1ZSwKCWNsaWVudFg6IHRydWUsCgljbGllbnRZOiB0cnVlLAoJb2Zmc2V0WDogdHJ1ZSwKCW9mZnNldFk6IHRydWUsCglwb2ludGVySWQ6IHRydWUsCglwb2ludGVyVHlwZTogdHJ1ZSwKCXNjcmVlblg6IHRydWUsCglzY3JlZW5ZOiB0cnVlLAoJdGFyZ2V0VG91Y2hlczogdHJ1ZSwKCXRvRWxlbWVudDogdHJ1ZSwKCXRvdWNoZXM6IHRydWUsCgoJd2hpY2g6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgYnV0dG9uID0gZXZlbnQuYnV0dG9uOwoKCQkvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHMKCQlpZiAoIGV2ZW50LndoaWNoID09IG51bGwgJiYgcmtleUV2ZW50LnRlc3QoIGV2ZW50LnR5cGUgKSApIHsKCQkJcmV0dXJuIGV2ZW50LmNoYXJDb2RlICE9IG51bGwgPyBldmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGU7CgkJfQoKCQkvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0CgkJaWYgKCAhZXZlbnQud2hpY2ggJiYgYnV0dG9uICE9PSB1bmRlZmluZWQgJiYgcm1vdXNlRXZlbnQudGVzdCggZXZlbnQudHlwZSApICkgewoJCQlpZiAoIGJ1dHRvbiAmIDEgKSB7CgkJCQlyZXR1cm4gMTsKCQkJfQoKCQkJaWYgKCBidXR0b24gJiAyICkgewoJCQkJcmV0dXJuIDM7CgkJCX0KCgkJCWlmICggYnV0dG9uICYgNCApIHsKCQkJCXJldHVybiAyOwoJCQl9CgoJCQlyZXR1cm4gMDsKCQl9CgoJCXJldHVybiBldmVudC53aGljaDsKCX0KfSwgalF1ZXJ5LmV2ZW50LmFkZFByb3AgKTsKCi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrcwovLyBzbyB0aGF0IGV2ZW50IGRlbGVnYXRpb24gd29ya3MgaW4galF1ZXJ5LgovLyBEbyB0aGUgc2FtZSBmb3IgcG9pbnRlcmVudGVyL3BvaW50ZXJsZWF2ZSBhbmQgcG9pbnRlcm92ZXIvcG9pbnRlcm91dAovLwovLyBTdXBwb3J0OiBTYWZhcmkgNyBvbmx5Ci8vIFNhZmFyaSBzZW5kcyBtb3VzZWVudGVyIHRvbyBvZnRlbjsgc2VlOgovLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NzAyNTgKLy8gZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYnVnIChpdCBleGlzdGVkIGluIG9sZGVyIENocm9tZSB2ZXJzaW9ucyBhcyB3ZWxsKS4KalF1ZXJ5LmVhY2goIHsKCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAoJbW91c2VsZWF2ZTogIm1vdXNlb3V0IiwKCXBvaW50ZXJlbnRlcjogInBvaW50ZXJvdmVyIiwKCXBvaW50ZXJsZWF2ZTogInBvaW50ZXJvdXQiCn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CglqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0gewoJCWRlbGVnYXRlVHlwZTogZml4LAoJCWJpbmRUeXBlOiBmaXgsCgoJCWhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQl2YXIgcmV0LAoJCQkJdGFyZ2V0ID0gdGhpcywKCQkJCXJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LAoJCQkJaGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqOwoKCQkJLy8gRm9yIG1vdXNlZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC4KCQkJLy8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3cKCQkJaWYgKCAhcmVsYXRlZCB8fCAoIHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSApICkgewoJCQkJZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmlnVHlwZTsKCQkJCXJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCWV2ZW50LnR5cGUgPSBmaXg7CgkJCX0KCQkJcmV0dXJuIHJldDsKCQl9Cgl9Owp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJb246IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkgewoJCXJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOwoJfSwKCW9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7CgkJcmV0dXJuIG9uKCB0aGlzLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCAxICk7Cgl9LAoJb2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHsKCQl2YXIgaGFuZGxlT2JqLCB0eXBlOwoJCWlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkgewoKCQkJLy8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudAoJCQloYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7CgkJCWpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoCgkJCQloYW5kbGVPYmoubmFtZXNwYWNlID8KCQkJCQloYW5kbGVPYmoub3JpZ1R5cGUgKyAiLiIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDoKCQkJCQloYW5kbGVPYmoub3JpZ1R5cGUsCgkJCQloYW5kbGVPYmouc2VsZWN0b3IsCgkJCQloYW5kbGVPYmouaGFuZGxlcgoJCQkpOwoJCQlyZXR1cm4gdGhpczsKCQl9CgkJaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICkgewoKCQkJLy8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdICkKCQkJZm9yICggdHlwZSBpbiB0eXBlcyApIHsKCQkJCXRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApOwoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0KCQlpZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgKSB7CgoJCQkvLyAoIHR5cGVzIFssIGZuXSApCgkJCWZuID0gc2VsZWN0b3I7CgkJCXNlbGVjdG9yID0gdW5kZWZpbmVkOwoJCX0KCQlpZiAoIGZuID09PSBmYWxzZSApIHsKCQkJZm4gPSByZXR1cm5GYWxzZTsKCQl9CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGVzLCBmbiwgc2VsZWN0b3IgKTsKCQl9ICk7Cgl9Cn0gKTsKCgp2YXIKCgkvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovCgoJLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2lzc3Vlcy8zMjI5CglyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksCgoJLyogZXNsaW50LWVuYWJsZSAqLwoKCS8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSwgRWRnZSAxMiAtIDEzIG9ubHkKCS8vIEluIElFL0VkZ2UgdXNpbmcgcmVnZXggZ3JvdXBzIGhlcmUgY2F1c2VzIHNldmVyZSBzbG93ZG93bnMuCgkvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyLwoJcm5vSW5uZXJodG1sID0gLzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksCgoJLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAoJcmNoZWNrZWQgPSAvY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSwKCXJjbGVhblNjcmlwdCA9IC9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZzsKCi8vIFByZWZlciBhIHRib2R5IG92ZXIgaXRzIHBhcmVudCB0YWJsZSBmb3IgY29udGFpbmluZyBuZXcgcm93cwpmdW5jdGlvbiBtYW5pcHVsYXRpb25UYXJnZXQoIGVsZW0sIGNvbnRlbnQgKSB7CglpZiAoIG5vZGVOYW1lKCBlbGVtLCAidGFibGUiICkgJiYKCQlub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEgPyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCAidHIiICkgKSB7CgoJCXJldHVybiBqUXVlcnkoIGVsZW0gKS5jaGlsZHJlbiggInRib2R5IiApWyAwIF0gfHwgZWxlbTsKCX0KCglyZXR1cm4gZWxlbTsKfQoKLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvbgpmdW5jdGlvbiBkaXNhYmxlU2NyaXB0KCBlbGVtICkgewoJZWxlbS50eXBlID0gKCBlbGVtLmdldEF0dHJpYnV0ZSggInR5cGUiICkgIT09IG51bGwgKSArICIvIiArIGVsZW0udHlwZTsKCXJldHVybiBlbGVtOwp9CmZ1bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7CglpZiAoICggZWxlbS50eXBlIHx8ICIiICkuc2xpY2UoIDAsIDUgKSA9PT0gInRydWUvIiApIHsKCQllbGVtLnR5cGUgPSBlbGVtLnR5cGUuc2xpY2UoIDUgKTsKCX0gZWxzZSB7CgkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoICJ0eXBlIiApOwoJfQoKCXJldHVybiBlbGVtOwp9CgpmdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkgewoJdmFyIGksIGwsIHR5cGUsIHBkYXRhT2xkLCBwZGF0YUN1ciwgdWRhdGFPbGQsIHVkYXRhQ3VyLCBldmVudHM7CgoJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkgewoJCXJldHVybjsKCX0KCgkvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLgoJaWYgKCBkYXRhUHJpdi5oYXNEYXRhKCBzcmMgKSApIHsKCQlwZGF0YU9sZCA9IGRhdGFQcml2LmFjY2Vzcyggc3JjICk7CgkJcGRhdGFDdXIgPSBkYXRhUHJpdi5zZXQoIGRlc3QsIHBkYXRhT2xkICk7CgkJZXZlbnRzID0gcGRhdGFPbGQuZXZlbnRzOwoKCQlpZiAoIGV2ZW50cyApIHsKCQkJZGVsZXRlIHBkYXRhQ3VyLmhhbmRsZTsKCQkJcGRhdGFDdXIuZXZlbnRzID0ge307CgoJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCWZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyAyLiBDb3B5IHVzZXIgZGF0YQoJaWYgKCBkYXRhVXNlci5oYXNEYXRhKCBzcmMgKSApIHsKCQl1ZGF0YU9sZCA9IGRhdGFVc2VyLmFjY2Vzcyggc3JjICk7CgkJdWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTsKCgkJZGF0YVVzZXIuc2V0KCBkZXN0LCB1ZGF0YUN1ciApOwoJfQp9CgovLyBGaXggSUUgYnVncywgc2VlIHN1cHBvcnQgdGVzdHMKZnVuY3Rpb24gZml4SW5wdXQoIHNyYywgZGVzdCApIHsKCXZhciBub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCgkvLyBGYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbi4KCWlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHsKCQlkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDsKCgkvLyBGYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZCBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9ucwoJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgfHwgbm9kZU5hbWUgPT09ICJ0ZXh0YXJlYSIgKSB7CgkJZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlOwoJfQp9CgpmdW5jdGlvbiBkb21NYW5pcCggY29sbGVjdGlvbiwgYXJncywgY2FsbGJhY2ssIGlnbm9yZWQgKSB7CgoJLy8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5cwoJYXJncyA9IGNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTsKCgl2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsCgkJaSA9IDAsCgkJbCA9IGNvbGxlY3Rpb24ubGVuZ3RoLAoJCWlOb0Nsb25lID0gbCAtIDEsCgkJdmFsdWUgPSBhcmdzWyAwIF0sCgkJdmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTsKCgkvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXQKCWlmICggdmFsdWVJc0Z1bmN0aW9uIHx8CgkJCSggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJgoJCQkJIXN1cHBvcnQuY2hlY2tDbG9uZSAmJiByY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgKSB7CgkJcmV0dXJuIGNvbGxlY3Rpb24uZWFjaCggZnVuY3Rpb24oIGluZGV4ICkgewoJCQl2YXIgc2VsZiA9IGNvbGxlY3Rpb24uZXEoIGluZGV4ICk7CgkJCWlmICggdmFsdWVJc0Z1bmN0aW9uICkgewoJCQkJYXJnc1sgMCBdID0gdmFsdWUuY2FsbCggdGhpcywgaW5kZXgsIHNlbGYuaHRtbCgpICk7CgkJCX0KCQkJZG9tTWFuaXAoIHNlbGYsIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICk7CgkJfSApOwoJfQoKCWlmICggbCApIHsKCQlmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApOwoJCWZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKCgkJaWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHsKCQkJZnJhZ21lbnQgPSBmaXJzdDsKCQl9CgoJCS8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFjawoJCWlmICggZmlyc3QgfHwgaWdub3JlZCApIHsKCQkJc2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdldEFsbCggZnJhZ21lbnQsICJzY3JpcHQiICksIGRpc2FibGVTY3JpcHQgKTsKCQkJaGFzU2NyaXB0cyA9IHNjcmlwdHMubGVuZ3RoOwoKCQkJLy8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbQoJCQkvLyBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXAKCQkJLy8gYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKCM4MDcwKS4KCQkJZm9yICggOyBpIDwgbDsgaSsrICkgewoJCQkJbm9kZSA9IGZyYWdtZW50OwoKCQkJCWlmICggaSAhPT0gaU5vQ2xvbmUgKSB7CgkJCQkJbm9kZSA9IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApOwoKCQkJCQkvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uCgkJCQkJaWYgKCBoYXNTY3JpcHRzICkgewoKCQkJCQkJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5CgkJCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCQkJalF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKCQkJCQl9CgkJCQl9CgoJCQkJY2FsbGJhY2suY2FsbCggY29sbGVjdGlvblsgaSBdLCBub2RlLCBpICk7CgkJCX0KCgkJCWlmICggaGFzU2NyaXB0cyApIHsKCQkJCWRvYyA9IHNjcmlwdHNbIHNjcmlwdHMubGVuZ3RoIC0gMSBdLm93bmVyRG9jdW1lbnQ7CgoJCQkJLy8gUmVlbmFibGUgc2NyaXB0cwoJCQkJalF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApOwoKCQkJCS8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb24KCQkJCWZvciAoIGkgPSAwOyBpIDwgaGFzU2NyaXB0czsgaSsrICkgewoJCQkJCW5vZGUgPSBzY3JpcHRzWyBpIF07CgkJCQkJaWYgKCByc2NyaXB0VHlwZS50ZXN0KCBub2RlLnR5cGUgfHwgIiIgKSAmJgoJCQkJCQkhZGF0YVByaXYuYWNjZXNzKCBub2RlLCAiZ2xvYmFsRXZhbCIgKSAmJgoJCQkJCQlqUXVlcnkuY29udGFpbnMoIGRvYywgbm9kZSApICkgewoKCQkJCQkJaWYgKCBub2RlLnNyYyAmJiAoIG5vZGUudHlwZSB8fCAiIiApLnRvTG93ZXJDYXNlKCkgICE9PSAibW9kdWxlIiApIHsKCgkJCQkJCQkvLyBPcHRpb25hbCBBSkFYIGRlcGVuZGVuY3ksIGJ1dCB3b24ndCBydW4gc2NyaXB0cyBpZiBub3QgcHJlc2VudAoJCQkJCQkJaWYgKCBqUXVlcnkuX2V2YWxVcmwgKSB7CgkJCQkJCQkJalF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYyApOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgewoJCQkJCQkJRE9NRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsICIiICksIGRvYywgbm9kZSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiBjb2xsZWN0aW9uOwp9CgpmdW5jdGlvbiByZW1vdmUoIGVsZW0sIHNlbGVjdG9yLCBrZWVwRGF0YSApIHsKCXZhciBub2RlLAoJCW5vZGVzID0gc2VsZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgZWxlbSApIDogZWxlbSwKCQlpID0gMDsKCglmb3IgKCA7ICggbm9kZSA9IG5vZGVzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7CgkJaWYgKCAha2VlcERhdGEgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBub2RlICkgKTsKCQl9CgoJCWlmICggbm9kZS5wYXJlbnROb2RlICkgewoJCQlpZiAoIGtlZXBEYXRhICYmIGpRdWVyeS5jb250YWlucyggbm9kZS5vd25lckRvY3VtZW50LCBub2RlICkgKSB7CgkJCQlzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKCQkJfQoJCQlub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG5vZGUgKTsKCQl9Cgl9CgoJcmV0dXJuIGVsZW07Cn0KCmpRdWVyeS5leHRlbmQoIHsKCWh0bWxQcmVmaWx0ZXI6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVybiBodG1sLnJlcGxhY2UoIHJ4aHRtbFRhZywgIjwkMT48LyQyPiIgKTsKCX0sCgoJY2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQl2YXIgaSwgbCwgc3JjRWxlbWVudHMsIGRlc3RFbGVtZW50cywKCQkJY2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLAoJCQlpblBhZ2UgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwoKCQkvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXMKCQlpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmCgkJCQkhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7CgoJCQkvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6IGh0dHBzOi8vanNwZXJmLmNvbS9nZXRhbGwtdnMtc2l6emxlLzIKCQkJZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApOwoJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOwoKCQkJZm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQlmaXhJbnB1dCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTsKCQkJfQoJCX0KCgkJLy8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZQoJCWlmICggZGF0YUFuZEV2ZW50cyApIHsKCQkJaWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQkJCXNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7CgkJCQlkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApOwoKCQkJCWZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJY2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7CgkJCX0KCQl9CgoJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKCQlkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCAic2NyaXB0IiApOwoJCWlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7CgkJCXNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sICJzY3JpcHQiICkgKTsKCQl9CgoJCS8vIFJldHVybiB0aGUgY2xvbmVkIHNldAoJCXJldHVybiBjbG9uZTsKCX0sCgoJY2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGRhdGEsIGVsZW0sIHR5cGUsCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCwKCQkJaSA9IDA7CgoJCWZvciAoIDsgKCBlbGVtID0gZWxlbXNbIGkgXSApICE9PSB1bmRlZmluZWQ7IGkrKyApIHsKCQkJaWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7CgkJCQlpZiAoICggZGF0YSA9IGVsZW1bIGRhdGFQcml2LmV4cGFuZG8gXSApICkgewoJCQkJCWlmICggZGF0YS5ldmVudHMgKSB7CgkJCQkJCWZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7CgkJCQkJCQlpZiAoIHNwZWNpYWxbIHR5cGUgXSApIHsKCQkJCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7CgoJCQkJCQkJLy8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZAoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQlqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrCgkJCQkJLy8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlCgkJCQkJZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQkJfQoJCQkJaWYgKCBlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gKSB7CgoJCQkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrCgkJCQkJLy8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlCgkJCQkJZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQkJfQoJCQl9CgkJfQoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CglkZXRhY2g6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciwgdHJ1ZSApOwoJfSwKCglyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciApOwoJfSwKCgl0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewoJCQlyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/CgkJCQlqUXVlcnkudGV4dCggdGhpcyApIDoKCQkJCXRoaXMuZW1wdHkoKS5lYWNoKCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCQkJdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwoJCQkJCX0KCQkJCX0gKTsKCQl9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApOwoJfSwKCglhcHBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7CgkJCQl2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7CgkJCQl0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTsKCQkJfQoJCX0gKTsKCX0sCgoJcHJlcGVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCXZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTsKCQkJCXRhcmdldC5pbnNlcnRCZWZvcmUoIGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7CgkJCX0KCQl9ICk7Cgl9LAoKCWJlZm9yZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlpZiAoIHRoaXMucGFyZW50Tm9kZSApIHsKCQkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKCQkJfQoJCX0gKTsKCX0sCgoJYWZ0ZXI6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7CgkJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CgkJCX0KCQl9ICk7Cgl9LAoKCWVtcHR5OiBmdW5jdGlvbigpIHsKCQl2YXIgZWxlbSwKCQkJaSA9IDA7CgoJCWZvciAoIDsgKCBlbGVtID0gdGhpc1sgaSBdICkgIT0gbnVsbDsgaSsrICkgewoJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgoJCQkJLy8gUHJldmVudCBtZW1vcnkgbGVha3MKCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApOwoKCQkJCS8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzCgkJCQllbGVtLnRleHRDb250ZW50ID0gIiI7CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgljbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkgewoJCWRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7CgkJZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzOwoKCQlyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApOwoJCX0gKTsKCX0sCgoJaHRtbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJdmFyIGVsZW0gPSB0aGlzWyAwIF0gfHwge30sCgkJCQlpID0gMCwKCQkJCWwgPSB0aGlzLmxlbmd0aDsKCgkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJcmV0dXJuIGVsZW0uaW5uZXJIVE1MOwoJCQl9CgoJCQkvLyBTZWUgaWYgd2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5uZXJIVE1MCgkJCWlmICggdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJiAhcm5vSW5uZXJodG1sLnRlc3QoIHZhbHVlICkgJiYKCQkJCSF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKSBdICkgewoKCQkJCXZhbHVlID0galF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIHZhbHVlICk7CgoJCQkJdHJ5IHsKCQkJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQkJCWVsZW0gPSB0aGlzWyBpIF0gfHwge307CgoJCQkJCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKCQkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7CgkJCQkJCQllbGVtLmlubmVySFRNTCA9IHZhbHVlOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQllbGVtID0gMDsKCgkJCQkvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QKCQkJCX0gY2F0Y2ggKCBlICkge30KCQkJfQoKCQkJaWYgKCBlbGVtICkgewoJCQkJdGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTsKCQkJfQoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7Cgl9LAoKCXJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHsKCQl2YXIgaWdub3JlZCA9IFtdOwoKCQkvLyBNYWtlIHRoZSBjaGFuZ2VzLCByZXBsYWNpbmcgZWFjaCBub24taWdub3JlZCBjb250ZXh0IGVsZW1lbnQgd2l0aCB0aGUgbmV3IGNvbnRlbnQKCQlyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CgoJCQlpZiAoIGpRdWVyeS5pbkFycmF5KCB0aGlzLCBpZ25vcmVkICkgPCAwICkgewoJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTsKCQkJCWlmICggcGFyZW50ICkgewoJCQkJCXBhcmVudC5yZXBsYWNlQ2hpbGQoIGVsZW0sIHRoaXMgKTsKCQkJCX0KCQkJfQoKCQkvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uCgkJfSwgaWdub3JlZCApOwoJfQp9ICk7CgpqUXVlcnkuZWFjaCggewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVuZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBlbGVtcywKCQkJcmV0ID0gW10sCgkJCWluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSwKCQkJbGFzdCA9IGluc2VydC5sZW5ndGggLSAxLAoJCQlpID0gMDsKCgkJZm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHsKCQkJZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUoIHRydWUgKTsKCQkJalF1ZXJ5KCBpbnNlcnRbIGkgXSApWyBvcmlnaW5hbCBdKCBlbGVtcyApOwoKCQkJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5CgkJCS8vIC5nZXQoKSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJcHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApOwoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTsKCX07Cn0gKTsKdmFyIHJudW1ub25weCA9IG5ldyBSZWdFeHAoICJeKCIgKyBwbnVtICsgIikoPyFweClbYS16JV0rJCIsICJpIiApOwoKdmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkgewoKCQkvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHksIEZpcmVmb3ggPD0zMCAoIzE1MDk4LCAjMTQxNTApCgkJLy8gSUUgdGhyb3dzIG9uIGVsZW1lbnRzIGNyZWF0ZWQgaW4gcG9wdXBzCgkJLy8gRkYgbWVhbndoaWxlIHRocm93cyBvbiBmcmFtZSBlbGVtZW50cyB0aHJvdWdoICJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlIgoJCXZhciB2aWV3ID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3OwoKCQlpZiAoICF2aWV3IHx8ICF2aWV3Lm9wZW5lciApIHsKCQkJdmlldyA9IHdpbmRvdzsKCQl9CgoJCXJldHVybiB2aWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0gKTsKCX07Cgp2YXIgcmJveFN0eWxlID0gbmV3IFJlZ0V4cCggY3NzRXhwYW5kLmpvaW4oICJ8IiApLCAiaSIgKTsKCgoKKCBmdW5jdGlvbigpIHsKCgkvLyBFeGVjdXRpbmcgYm90aCBwaXhlbFBvc2l0aW9uICYgYm94U2l6aW5nUmVsaWFibGUgdGVzdHMgcmVxdWlyZSBvbmx5IG9uZSBsYXlvdXQKCS8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uCglmdW5jdGlvbiBjb21wdXRlU3R5bGVUZXN0cygpIHsKCgkJLy8gVGhpcyBpcyBhIHNpbmdsZXRvbiwgd2UgbmVlZCB0byBleGVjdXRlIGl0IG9ubHkgb25jZQoJCWlmICggIWRpdiApIHsKCQkJcmV0dXJuOwoJCX0KCgkJY29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSAicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4OyIgKwoJCQkibWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIjsKCQlkaXYuc3R5bGUuY3NzVGV4dCA9CgkJCSJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7IiArCgkJCSJtYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4OyIgKwoJCQkid2lkdGg6NjAlO3RvcDoxJSI7CgkJZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKCBjb250YWluZXIgKS5hcHBlbmRDaGlsZCggZGl2ICk7CgoJCXZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYgKTsKCQlwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSAiMSUiOwoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBGaXJlZm94IDw9MyAtIDQ0CgkJcmVsaWFibGVNYXJnaW5MZWZ0VmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5tYXJnaW5MZWZ0ICkgPT09IDEyOwoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBTYWZhcmkgPD05LjEgLSAxMC4xLCBpT1MgPD03LjAgLSA5LjMKCQkvLyBTb21lIHN0eWxlcyBjb21lIGJhY2sgd2l0aCBwZXJjZW50YWdlIHZhbHVlcywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGRuJ3QKCQlkaXYuc3R5bGUucmlnaHQgPSAiNjAlIjsKCQlwaXhlbEJveFN0eWxlc1ZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUucmlnaHQgKSA9PT0gMzY7CgoJCS8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5CgkJLy8gRGV0ZWN0IG1pc3JlcG9ydGluZyBvZiBjb250ZW50IGRpbWVuc2lvbnMgZm9yIGJveC1zaXppbmc6Ym9yZGVyLWJveCBlbGVtZW50cwoJCWJveFNpemluZ1JlbGlhYmxlVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS53aWR0aCApID09PSAzNjsKCgkJLy8gU3VwcG9ydDogSUUgOSBvbmx5CgkJLy8gRGV0ZWN0IG92ZXJmbG93OnNjcm9sbCBzY3Jld2luZXNzIChnaC0zNjk5KQoJCWRpdi5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CgkJc2Nyb2xsYm94U2l6ZVZhbCA9IGRpdi5vZmZzZXRXaWR0aCA9PT0gMzYgfHwgImFic29sdXRlIjsKCgkJZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKCgkJLy8gTnVsbGlmeSB0aGUgZGl2IHNvIGl0IHdvdWxkbid0IGJlIHN0b3JlZCBpbiB0aGUgbWVtb3J5IGFuZAoJCS8vIGl0IHdpbGwgYWxzbyBiZSBhIHNpZ24gdGhhdCBjaGVja3MgYWxyZWFkeSBwZXJmb3JtZWQKCQlkaXYgPSBudWxsOwoJfQoKCWZ1bmN0aW9uIHJvdW5kUGl4ZWxNZWFzdXJlcyggbWVhc3VyZSApIHsKCQlyZXR1cm4gTWF0aC5yb3VuZCggcGFyc2VGbG9hdCggbWVhc3VyZSApICk7Cgl9CgoJdmFyIHBpeGVsUG9zaXRpb25WYWwsIGJveFNpemluZ1JlbGlhYmxlVmFsLCBzY3JvbGxib3hTaXplVmFsLCBwaXhlbEJveFN0eWxlc1ZhbCwKCQlyZWxpYWJsZU1hcmdpbkxlZnRWYWwsCgkJY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSwKCQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApOwoKCS8vIEZpbmlzaCBlYXJseSBpbiBsaW1pdGVkIChub24tYnJvd3NlcikgZW52aXJvbm1lbnRzCglpZiAoICFkaXYuc3R5bGUgKSB7CgkJcmV0dXJuOwoJfQoKCS8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHkKCS8vIFN0eWxlIG9mIGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOCkKCWRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICJjb250ZW50LWJveCI7CglkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSAiIjsKCXN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSAiY29udGVudC1ib3giOwoKCWpRdWVyeS5leHRlbmQoIHN1cHBvcnQsIHsKCQlib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7CgkJCWNvbXB1dGVTdHlsZVRlc3RzKCk7CgkJCXJldHVybiBib3hTaXppbmdSZWxpYWJsZVZhbDsKCQl9LAoJCXBpeGVsQm94U3R5bGVzOiBmdW5jdGlvbigpIHsKCQkJY29tcHV0ZVN0eWxlVGVzdHMoKTsKCQkJcmV0dXJuIHBpeGVsQm94U3R5bGVzVmFsOwoJCX0sCgkJcGl4ZWxQb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJCWNvbXB1dGVTdHlsZVRlc3RzKCk7CgkJCXJldHVybiBwaXhlbFBvc2l0aW9uVmFsOwoJCX0sCgkJcmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHsKCQkJY29tcHV0ZVN0eWxlVGVzdHMoKTsKCQkJcmV0dXJuIHJlbGlhYmxlTWFyZ2luTGVmdFZhbDsKCQl9LAoJCXNjcm9sbGJveFNpemU6IGZ1bmN0aW9uKCkgewoJCQljb21wdXRlU3R5bGVUZXN0cygpOwoJCQlyZXR1cm4gc2Nyb2xsYm94U2l6ZVZhbDsKCQl9Cgl9ICk7Cn0gKSgpOwoKCmZ1bmN0aW9uIGN1ckNTUyggZWxlbSwgbmFtZSwgY29tcHV0ZWQgKSB7Cgl2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LAoKCQkvLyBTdXBwb3J0OiBGaXJlZm94IDUxKwoJCS8vIFJldHJpZXZpbmcgc3R5bGUgYmVmb3JlIGNvbXB1dGVkIHNvbWVob3cKCQkvLyBmaXhlcyBhbiBpc3N1ZSB3aXRoIGdldHRpbmcgd3JvbmcgdmFsdWVzCgkJLy8gb24gZGV0YWNoZWQgZWxlbWVudHMKCQlzdHlsZSA9IGVsZW0uc3R5bGU7CgoJY29tcHV0ZWQgPSBjb21wdXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKTsKCgkvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG5lZWRlZCBmb3I6CgkvLyAgIC5jc3MoJ2ZpbHRlcicpIChJRSA5IG9ubHksICMxMjUzNykKCS8vICAgLmNzcygnLS1jdXN0b21Qcm9wZXJ0eSkgKCMzMTQ0KQoJaWYgKCBjb21wdXRlZCApIHsKCQlyZXQgPSBjb21wdXRlZC5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICkgfHwgY29tcHV0ZWRbIG5hbWUgXTsKCgkJaWYgKCByZXQgPT09ICIiICYmICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICkgewoJCQlyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTsKCQl9CgoJCS8vIEEgdHJpYnV0ZSB0byB0aGUgImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMiCgkJLy8gQW5kcm9pZCBCcm93c2VyIHJldHVybnMgcGVyY2VudGFnZSBmb3Igc29tZSB2YWx1ZXMsCgkJLy8gYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVscy4KCQkvLyBUaGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6CgkJLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXMKCQlpZiAoICFzdXBwb3J0LnBpeGVsQm94U3R5bGVzKCkgJiYgcm51bW5vbnB4LnRlc3QoIHJldCApICYmIHJib3hTdHlsZS50ZXN0KCBuYW1lICkgKSB7CgoJCQkvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzCgkJCXdpZHRoID0gc3R5bGUud2lkdGg7CgkJCW1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7CgkJCW1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7CgoJCQkvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0CgkJCXN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDsKCQkJcmV0ID0gY29tcHV0ZWQud2lkdGg7CgoJCQkvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzCgkJCXN0eWxlLndpZHRoID0gd2lkdGg7CgkJCXN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7CgkJCXN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7CgkJfQoJfQoKCXJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/CgoJCS8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHkKCQkvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLgoJCXJldCArICIiIDoKCQlyZXQ7Cn0KCgpmdW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7CgoJLy8gRGVmaW5lIHRoZSBob29rLCB3ZSdsbCBjaGVjayBvbiB0aGUgZmlyc3QgcnVuIGlmIGl0J3MgcmVhbGx5IG5lZWRlZC4KCXJldHVybiB7CgkJZ2V0OiBmdW5jdGlvbigpIHsKCQkJaWYgKCBjb25kaXRpb25GbigpICkgewoKCQkJCS8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIGl0IGR1ZQoJCQkJLy8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwgcmVtb3ZlIGl0LgoJCQkJZGVsZXRlIHRoaXMuZ2V0OwoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi4KCQkJcmV0dXJuICggdGhpcy5nZXQgPSBob29rRm4gKS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfQoJfTsKfQoKCnZhcgoKCS8vIFN3YXBwYWJsZSBpZiBkaXNwbGF5IGlzIG5vbmUgb3Igc3RhcnRzIHdpdGggdGFibGUKCS8vIGV4Y2VwdCAidGFibGUiLCAidGFibGUtY2VsbCIsIG9yICJ0YWJsZS1jYXB0aW9uIgoJLy8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5CglyZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sCglyY3VzdG9tUHJvcCA9IC9eLS0vLAoJY3NzU2hvdyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiAiYmxvY2siIH0sCgljc3NOb3JtYWxUcmFuc2Zvcm0gPSB7CgkJbGV0dGVyU3BhY2luZzogIjAiLAoJCWZvbnRXZWlnaHQ6ICI0MDAiCgl9LAoKCWNzc1ByZWZpeGVzID0gWyAiV2Via2l0IiwgIk1veiIsICJtcyIgXSwKCWVtcHR5U3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApLnN0eWxlOwoKLy8gUmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eQpmdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHsKCgkvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90IHZlbmRvciBwcmVmaXhlZAoJaWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7CgkJcmV0dXJuIG5hbWU7Cgl9CgoJLy8gQ2hlY2sgZm9yIHZlbmRvciBwcmVmaXhlZCBuYW1lcwoJdmFyIGNhcE5hbWUgPSBuYW1lWyAwIF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoIDEgKSwKCQlpID0gY3NzUHJlZml4ZXMubGVuZ3RoOwoKCXdoaWxlICggaS0tICkgewoJCW5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTsKCQlpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHsKCQkJcmV0dXJuIG5hbWU7CgkJfQoJfQp9CgovLyBSZXR1cm4gYSBwcm9wZXJ0eSBtYXBwZWQgYWxvbmcgd2hhdCBqUXVlcnkuY3NzUHJvcHMgc3VnZ2VzdHMgb3IgdG8KLy8gYSB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHkuCmZ1bmN0aW9uIGZpbmFsUHJvcE5hbWUoIG5hbWUgKSB7Cgl2YXIgcmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF07CglpZiAoICFyZXQgKSB7CgkJcmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHx8IG5hbWU7Cgl9CglyZXR1cm4gcmV0Owp9CgpmdW5jdGlvbiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkgewoKCS8vIEFueSByZWxhdGl2ZSAoKy8tKSB2YWx1ZXMgaGF2ZSBhbHJlYWR5IGJlZW4KCS8vIG5vcm1hbGl6ZWQgYXQgdGhpcyBwb2ludAoJdmFyIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICk7CglyZXR1cm4gbWF0Y2hlcyA/CgoJCS8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkICJzdWJ0cmFjdCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rcwoJCU1hdGgubWF4KCAwLCBtYXRjaGVzWyAyIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAzIF0gfHwgInB4IiApIDoKCQl2YWx1ZTsKfQoKZnVuY3Rpb24gYm94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIGJveCwgaXNCb3JkZXJCb3gsIHN0eWxlcywgY29tcHV0ZWRWYWwgKSB7Cgl2YXIgaSA9IGRpbWVuc2lvbiA9PT0gIndpZHRoIiA/IDEgOiAwLAoJCWV4dHJhID0gMCwKCQlkZWx0YSA9IDA7CgoJLy8gQWRqdXN0bWVudCBtYXkgbm90IGJlIG5lY2Vzc2FyeQoJaWYgKCBib3ggPT09ICggaXNCb3JkZXJCb3ggPyAiYm9yZGVyIiA6ICJjb250ZW50IiApICkgewoJCXJldHVybiAwOwoJfQoKCWZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHsKCgkJLy8gQm90aCBib3ggbW9kZWxzIGV4Y2x1ZGUgbWFyZ2luCgkJaWYgKCBib3ggPT09ICJtYXJnaW4iICkgewoJCQlkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBib3ggKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CgkJfQoKCQkvLyBJZiB3ZSBnZXQgaGVyZSB3aXRoIGEgY29udGVudC1ib3gsIHdlJ3JlIHNlZWtpbmcgInBhZGRpbmciIG9yICJib3JkZXIiIG9yICJtYXJnaW4iCgkJaWYgKCAhaXNCb3JkZXJCb3ggKSB7CgoJCQkvLyBBZGQgcGFkZGluZwoJCQlkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCAicGFkZGluZyIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CgoJCQkvLyBGb3IgImJvcmRlciIgb3IgIm1hcmdpbiIsIGFkZCBib3JkZXIKCQkJaWYgKCBib3ggIT09ICJwYWRkaW5nIiApIHsKCQkJCWRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sICJib3JkZXIiICsgY3NzRXhwYW5kWyBpIF0gKyAiV2lkdGgiLCB0cnVlLCBzdHlsZXMgKTsKCgkJCS8vIEJ1dCBzdGlsbCBrZWVwIHRyYWNrIG9mIGl0IG90aGVyd2lzZQoJCQl9IGVsc2UgewoJCQkJZXh0cmEgKz0galF1ZXJ5LmNzcyggZWxlbSwgImJvcmRlciIgKyBjc3NFeHBhbmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxlcyApOwoJCQl9CgoJCS8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBib3JkZXItYm94IChjb250ZW50ICsgcGFkZGluZyArIGJvcmRlciksIHdlJ3JlIHNlZWtpbmcgImNvbnRlbnQiIG9yCgkJLy8gInBhZGRpbmciIG9yICJtYXJnaW4iCgkJfSBlbHNlIHsKCgkJCS8vIEZvciAiY29udGVudCIsIHN1YnRyYWN0IHBhZGRpbmcKCQkJaWYgKCBib3ggPT09ICJjb250ZW50IiApIHsKCQkJCWRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sICJwYWRkaW5nIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTsKCQkJfQoKCQkJLy8gRm9yICJjb250ZW50IiBvciAicGFkZGluZyIsIHN1YnRyYWN0IGJvcmRlcgoJCQlpZiAoIGJveCAhPT0gIm1hcmdpbiIgKSB7CgkJCQlkZWx0YSAtPSBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIGNzc0V4cGFuZFsgaSBdICsgIldpZHRoIiwgdHJ1ZSwgc3R5bGVzICk7CgkJCX0KCQl9Cgl9CgoJLy8gQWNjb3VudCBmb3IgcG9zaXRpdmUgY29udGVudC1ib3ggc2Nyb2xsIGd1dHRlciB3aGVuIHJlcXVlc3RlZCBieSBwcm92aWRpbmcgY29tcHV0ZWRWYWwKCWlmICggIWlzQm9yZGVyQm94ICYmIGNvbXB1dGVkVmFsID49IDAgKSB7CgoJCS8vIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBpcyBhIHJvdW5kZWQgc3VtIG9mIGNvbnRlbnQsIHBhZGRpbmcsIHNjcm9sbCBndXR0ZXIsIGFuZCBib3JkZXIKCQkvLyBBc3N1bWluZyBpbnRlZ2VyIHNjcm9sbCBndXR0ZXIsIHN1YnRyYWN0IHRoZSByZXN0IGFuZCByb3VuZCBkb3duCgkJZGVsdGEgKz0gTWF0aC5tYXgoIDAsIE1hdGguY2VpbCgKCQkJZWxlbVsgIm9mZnNldCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtCgkJCWNvbXB1dGVkVmFsIC0KCQkJZGVsdGEgLQoJCQlleHRyYSAtCgkJCTAuNQoJCSkgKTsKCX0KCglyZXR1cm4gZGVsdGE7Cn0KCmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKSB7CgoJLy8gU3RhcnQgd2l0aCBjb21wdXRlZCBzdHlsZQoJdmFyIHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLAoJCXZhbCA9IGN1ckNTUyggZWxlbSwgZGltZW5zaW9uLCBzdHlsZXMgKSwKCQlpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IiwKCQl2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3g7CgoJLy8gU3VwcG9ydDogRmlyZWZveCA8PTU0CgkvLyBSZXR1cm4gYSBjb25mb3VuZGluZyBub24tcGl4ZWwgdmFsdWUgb3IgZmVpZ24gaWdub3JhbmNlLCBhcyBhcHByb3ByaWF0ZS4KCWlmICggcm51bW5vbnB4LnRlc3QoIHZhbCApICkgewoJCWlmICggIWV4dHJhICkgewoJCQlyZXR1cm4gdmFsOwoJCX0KCQl2YWwgPSAiYXV0byI7Cgl9CgoJLy8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXMKCS8vIGZvciBnZXRDb21wdXRlZFN0eWxlIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gdGhlIHJlbGlhYmxlIGVsZW0uc3R5bGUKCXZhbHVlSXNCb3JkZXJCb3ggPSB2YWx1ZUlzQm9yZGVyQm94ICYmCgkJKCBzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgfHwgdmFsID09PSBlbGVtLnN0eWxlWyBkaW1lbnNpb24gXSApOwoKCS8vIEZhbGwgYmFjayB0byBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgd2hlbiB2YWx1ZSBpcyAiYXV0byIKCS8vIFRoaXMgaGFwcGVucyBmb3IgaW5saW5lIGVsZW1lbnRzIHdpdGggbm8gZXhwbGljaXQgc2V0dGluZyAoZ2gtMzU3MSkKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgLSA0LjMgb25seQoJLy8gQWxzbyB1c2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciBtaXNyZXBvcnRlZCBpbmxpbmUgZGltZW5zaW9ucyAoZ2gtMzYwMikKCWlmICggdmFsID09PSAiYXV0byIgfHwKCQkhcGFyc2VGbG9hdCggdmFsICkgJiYgalF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiLCBmYWxzZSwgc3R5bGVzICkgPT09ICJpbmxpbmUiICkgewoKCQl2YWwgPSBlbGVtWyAib2Zmc2V0IiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKSBdOwoKCQkvLyBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgcHJvdmlkZSBib3JkZXItYm94IHZhbHVlcwoJCXZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlOwoJfQoKCS8vIE5vcm1hbGl6ZSAiIiBhbmQgYXV0bwoJdmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDsKCgkvLyBBZGp1c3QgZm9yIHRoZSBlbGVtZW50J3MgYm94IG1vZGVsCglyZXR1cm4gKCB2YWwgKwoJCWJveE1vZGVsQWRqdXN0bWVudCgKCQkJZWxlbSwKCQkJZGltZW5zaW9uLAoJCQlleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gImJvcmRlciIgOiAiY29udGVudCIgKSwKCQkJdmFsdWVJc0JvcmRlckJveCwKCQkJc3R5bGVzLAoKCQkJLy8gUHJvdmlkZSB0aGUgY3VycmVudCBjb21wdXRlZCBzaXplIHRvIHJlcXVlc3Qgc2Nyb2xsIGd1dHRlciBjYWxjdWxhdGlvbiAoZ2gtMzU4OSkKCQkJdmFsCgkJKQoJKSArICJweCI7Cn0KCmpRdWVyeS5leHRlbmQoIHsKCgkvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQKCS8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eQoJY3NzSG9va3M6IHsKCQlvcGFjaXR5OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkJaWYgKCBjb21wdXRlZCApIHsKCgkJCQkJLy8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKCQkJCQl2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCAib3BhY2l0eSIgKTsKCQkJCQlyZXR1cm4gcmV0ID09PSAiIiA/ICIxIiA6IHJldDsKCQkJCX0KCQkJfQoJCX0KCX0sCgoJLy8gRG9uJ3QgYXV0b21hdGljYWxseSBhZGQgInB4IiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzCgljc3NOdW1iZXI6IHsKCQkiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQiOiB0cnVlLAoJCSJjb2x1bW5Db3VudCI6IHRydWUsCgkJImZpbGxPcGFjaXR5IjogdHJ1ZSwKCQkiZmxleEdyb3ciOiB0cnVlLAoJCSJmbGV4U2hyaW5rIjogdHJ1ZSwKCQkiZm9udFdlaWdodCI6IHRydWUsCgkJImxpbmVIZWlnaHQiOiB0cnVlLAoJCSJvcGFjaXR5IjogdHJ1ZSwKCQkib3JkZXIiOiB0cnVlLAoJCSJvcnBoYW5zIjogdHJ1ZSwKCQkid2lkb3dzIjogdHJ1ZSwKCQkiekluZGV4IjogdHJ1ZSwKCQkiem9vbSI6IHRydWUKCX0sCgoJLy8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZQoJLy8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZQoJY3NzUHJvcHM6IHt9LAoKCS8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlCglzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHsKCgkJLy8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZQoJCXZhciByZXQsIHR5cGUsIGhvb2tzLAoJCQlvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLAoJCQlpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICksCgkJCXN0eWxlID0gZWxlbS5zdHlsZTsKCgkJLy8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndAoJCS8vIHdhbnQgdG8gcXVlcnkgdGhlIHZhbHVlIGlmIGl0IGlzIGEgQ1NTIGN1c3RvbSBwcm9wZXJ0eQoJCS8vIHNpbmNlIHRoZXkgYXJlIHVzZXItZGVmaW5lZC4KCQlpZiAoICFpc0N1c3RvbVByb3AgKSB7CgkJCW5hbWUgPSBmaW5hbFByb3BOYW1lKCBvcmlnTmFtZSApOwoJCX0KCgkJLy8gR2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbiwgdGhlbiB1bnByZWZpeGVkIHZlcnNpb24KCQlob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTsKCgkJLy8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlCgkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQl0eXBlID0gdHlwZW9mIHZhbHVlOwoKCQkJLy8gQ29udmVydCAiKz0iIG9yICItPSIgdG8gcmVsYXRpdmUgbnVtYmVycyAoIzczNDUpCgkJCWlmICggdHlwZSA9PT0gInN0cmluZyIgJiYgKCByZXQgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJiByZXRbIDEgXSApIHsKCQkJCXZhbHVlID0gYWRqdXN0Q1NTKCBlbGVtLCBuYW1lLCByZXQgKTsKCgkJCQkvLyBGaXhlcyBidWcgIzkyMzcKCQkJCXR5cGUgPSAibnVtYmVyIjsKCQkJfQoKCQkJLy8gTWFrZSBzdXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0ICgjNzExNikKCQkJaWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkIHRoZSB1bml0IChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpCgkJCWlmICggdHlwZSA9PT0gIm51bWJlciIgKSB7CgkJCQl2YWx1ZSArPSByZXQgJiYgcmV0WyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdID8gIiIgOiAicHgiICk7CgkJCX0KCgkJCS8vIGJhY2tncm91bmQtKiBwcm9wcyBhZmZlY3Qgb3JpZ2luYWwgY2xvbmUncyB2YWx1ZXMKCQkJaWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09ICIiICYmIG5hbWUuaW5kZXhPZiggImJhY2tncm91bmQiICkgPT09IDAgKSB7CgkJCQlzdHlsZVsgbmFtZSBdID0gImluaGVyaXQiOwoJCQl9CgoJCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWUKCQkJaWYgKCAhaG9va3MgfHwgISggInNldCIgaW4gaG9va3MgKSB8fAoJCQkJKCB2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCWlmICggaXNDdXN0b21Qcm9wICkgewoJCQkJCXN0eWxlLnNldFByb3BlcnR5KCBuYW1lLCB2YWx1ZSApOwoJCQkJfSBlbHNlIHsKCQkJCQlzdHlsZVsgbmFtZSBdID0gdmFsdWU7CgkJCQl9CgkJCX0KCgkJfSBlbHNlIHsKCgkJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZQoJCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmCgkJCQkoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCXJldHVybiByZXQ7CgkJCX0KCgkJCS8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0CgkJCXJldHVybiBzdHlsZVsgbmFtZSBdOwoJCX0KCX0sCgoJY3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHsKCQl2YXIgdmFsLCBudW0sIGhvb2tzLAoJCQlvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLAoJCQlpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICk7CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZS4gV2UgZG9uJ3QKCQkvLyB3YW50IHRvIG1vZGlmeSB0aGUgdmFsdWUgaWYgaXQgaXMgYSBDU1MgY3VzdG9tIHByb3BlcnR5CgkJLy8gc2luY2UgdGhleSBhcmUgdXNlci1kZWZpbmVkLgoJCWlmICggIWlzQ3VzdG9tUHJvcCApIHsKCQkJbmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7CgkJfQoKCQkvLyBUcnkgcHJlZml4ZWQgbmFtZSBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCBuYW1lCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CgoJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCgkJaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyApIHsKCQkJdmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRyYSApOwoJCX0KCgkJLy8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXQKCQlpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkgewoJCQl2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApOwoJCX0KCgkJLy8gQ29udmVydCAibm9ybWFsIiB0byBjb21wdXRlZCB2YWx1ZQoJCWlmICggdmFsID09PSAibm9ybWFsIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHsKCQkJdmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07CgkJfQoKCQkvLyBNYWtlIG51bWVyaWMgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVyIHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tzIG51bWVyaWMKCQlpZiAoIGV4dHJhID09PSAiIiB8fCBleHRyYSApIHsKCQkJbnVtID0gcGFyc2VGbG9hdCggdmFsICk7CgkJCXJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDsKCQl9CgoJCXJldHVybiB2YWw7Cgl9Cn0gKTsKCmpRdWVyeS5lYWNoKCBbICJoZWlnaHQiLCAid2lkdGgiIF0sIGZ1bmN0aW9uKCBpLCBkaW1lbnNpb24gKSB7CglqUXVlcnkuY3NzSG9va3NbIGRpbWVuc2lvbiBdID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHsKCQkJaWYgKCBjb21wdXRlZCApIHsKCgkJCQkvLyBDZXJ0YWluIGVsZW1lbnRzIGNhbiBoYXZlIGRpbWVuc2lvbiBpbmZvIGlmIHdlIGludmlzaWJseSBzaG93IHRoZW0KCQkJCS8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0CgkJCQlyZXR1cm4gcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApICkgJiYKCgkJCQkJLy8gU3VwcG9ydDogU2FmYXJpIDgrCgkJCQkJLy8gVGFibGUgY29sdW1ucyBpbiBTYWZhcmkgaGF2ZSBub24temVybyBvZmZzZXRXaWR0aCAmIHplcm8KCQkJCQkvLyBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCB1bmxlc3MgZGlzcGxheSBpcyBjaGFuZ2VkLgoJCQkJCS8vIFN1cHBvcnQ6IElFIDw9MTEgb25seQoJCQkJCS8vIFJ1bm5pbmcgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IG9uIGEgZGlzY29ubmVjdGVkIG5vZGUKCQkJCQkvLyBpbiBJRSB0aHJvd3MgYW4gZXJyb3IuCgkJCQkJKCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCB8fCAhZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCApID8KCQkJCQkJc3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7CgkJCQkJCQlyZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApOwoJCQkJCQl9ICkgOgoJCQkJCQlnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7CgkJCX0KCQl9LAoKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSB7CgkJCXZhciBtYXRjaGVzLAoJCQkJc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksCgkJCQlpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IiwKCQkJCXN1YnRyYWN0ID0gZXh0cmEgJiYgYm94TW9kZWxBZGp1c3RtZW50KAoJCQkJCWVsZW0sCgkJCQkJZGltZW5zaW9uLAoJCQkJCWV4dHJhLAoJCQkJCWlzQm9yZGVyQm94LAoJCQkJCXN0eWxlcwoJCQkJKTsKCgkJCS8vIEFjY291bnQgZm9yIHVucmVsaWFibGUgYm9yZGVyLWJveCBkaW1lbnNpb25zIGJ5IGNvbXBhcmluZyBvZmZzZXQqIHRvIGNvbXB1dGVkIGFuZAoJCQkvLyBmYWtpbmcgYSBjb250ZW50LWJveCB0byBnZXQgYm9yZGVyIGFuZCBwYWRkaW5nIChnaC0zNjk5KQoJCQlpZiAoIGlzQm9yZGVyQm94ICYmIHN1cHBvcnQuc2Nyb2xsYm94U2l6ZSgpID09PSBzdHlsZXMucG9zaXRpb24gKSB7CgkJCQlzdWJ0cmFjdCAtPSBNYXRoLmNlaWwoCgkJCQkJZWxlbVsgIm9mZnNldCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtCgkJCQkJcGFyc2VGbG9hdCggc3R5bGVzWyBkaW1lbnNpb24gXSApIC0KCQkJCQlib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgImJvcmRlciIsIGZhbHNlLCBzdHlsZXMgKSAtCgkJCQkJMC41CgkJCQkpOwoJCQl9CgoJCQkvLyBDb252ZXJ0IHRvIHBpeGVscyBpZiB2YWx1ZSBhZGp1c3RtZW50IGlzIG5lZWRlZAoJCQlpZiAoIHN1YnRyYWN0ICYmICggbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmCgkJCQkoIG1hdGNoZXNbIDMgXSB8fCAicHgiICkgIT09ICJweCIgKSB7CgoJCQkJZWxlbS5zdHlsZVsgZGltZW5zaW9uIF0gPSB2YWx1ZTsKCQkJCXZhbHVlID0galF1ZXJ5LmNzcyggZWxlbSwgZGltZW5zaW9uICk7CgkJCX0KCgkJCXJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICk7CgkJfQoJfTsKfSApOwoKalF1ZXJ5LmNzc0hvb2tzLm1hcmdpbkxlZnQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5MZWZ0LAoJZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCWlmICggY29tcHV0ZWQgKSB7CgkJCXJldHVybiAoIHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgIm1hcmdpbkxlZnQiICkgKSB8fAoJCQkJZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0KCQkJCQlzd2FwKCBlbGVtLCB7IG1hcmdpbkxlZnQ6IDAgfSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7CgkJCQkJfSApCgkJCQkpICsgInB4IjsKCQl9Cgl9Cik7CgovLyBUaGVzZSBob29rcyBhcmUgdXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzCmpRdWVyeS5lYWNoKCB7CgltYXJnaW46ICIiLAoJcGFkZGluZzogIiIsCglib3JkZXI6ICJXaWR0aCIKfSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkgewoJalF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHsKCQlleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJdmFyIGkgPSAwLAoJCQkJZXhwYW5kZWQgPSB7fSwKCgkJCQkvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmcKCQkJCXBhcnRzID0gdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiA/IHZhbHVlLnNwbGl0KCAiICIgKSA6IFsgdmFsdWUgXTsKCgkJCWZvciAoIDsgaSA8IDQ7IGkrKyApIHsKCQkJCWV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID0KCQkJCQlwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07CgkJCX0KCgkJCXJldHVybiBleHBhbmRlZDsKCQl9Cgl9OwoKCWlmICggcHJlZml4ICE9PSAibWFyZ2luIiApIHsKCQlqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyOwoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7Cgljc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CgkJCXZhciBzdHlsZXMsIGxlbiwKCQkJCW1hcCA9IHt9LAoJCQkJaSA9IDA7CgoJCQlpZiAoIEFycmF5LmlzQXJyYXkoIG5hbWUgKSApIHsKCQkJCXN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApOwoJCQkJbGVuID0gbmFtZS5sZW5ndGg7CgoJCQkJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJCQkJbWFwWyBuYW1lWyBpIF0gXSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWVbIGkgXSwgZmFsc2UsIHN0eWxlcyApOwoJCQkJfQoKCQkJCXJldHVybiBtYXA7CgkJCX0KCgkJCXJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8KCQkJCWpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6CgkJCQlqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICk7CgkJfSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Cgl9Cn0gKTsKCgpmdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7CglyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApOwp9CmpRdWVyeS5Ud2VlbiA9IFR3ZWVuOwoKVHdlZW4ucHJvdG90eXBlID0gewoJY29uc3RydWN0b3I6IFR3ZWVuLAoJaW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkgewoJCXRoaXMuZWxlbSA9IGVsZW07CgkJdGhpcy5wcm9wID0gcHJvcDsKCQl0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0OwoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkJdGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTsKCQl0aGlzLmVuZCA9IGVuZDsKCQl0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gIiIgOiAicHgiICk7Cgl9LAoJY3VyOiBmdW5jdGlvbigpIHsKCQl2YXIgaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdOwoKCQlyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID8KCQkJaG9va3MuZ2V0KCB0aGlzICkgOgoJCQlUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7Cgl9LAoJcnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHsKCQl2YXIgZWFzZWQsCgkJCWhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7CgkJCXRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKAoJCQkJcGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVyY2VudCwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uCgkJCSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5wb3MgPSBlYXNlZCA9IHBlcmNlbnQ7CgkJfQoJCXRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVhc2VkICsgdGhpcy5zdGFydDsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHsKCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOwoJCX0KCgkJaWYgKCBob29rcyAmJiBob29rcy5zZXQgKSB7CgkJCWhvb2tzLnNldCggdGhpcyApOwoJCX0gZWxzZSB7CgkJCVR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTsKCQl9CgkJcmV0dXJuIHRoaXM7Cgl9Cn07CgpUd2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7CgpUd2Vlbi5wcm9wSG9va3MgPSB7CglfZGVmYXVsdDogewoJCWdldDogZnVuY3Rpb24oIHR3ZWVuICkgewoJCQl2YXIgcmVzdWx0OwoKCQkJLy8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCwKCQkJLy8gb3Igd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyBzdHlsZSBwcm9wZXJ0eSB0aGF0IGV4aXN0cy4KCQkJaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICE9PSAxIHx8CgkJCQl0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gIT0gbnVsbCAmJiB0d2Vlbi5lbGVtLnN0eWxlWyB0d2Vlbi5wcm9wIF0gPT0gbnVsbCApIHsKCQkJCXJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07CgkJCX0KCgkJCS8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseQoJCQkvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzLgoJCQkvLyBTaW1wbGUgdmFsdWVzIHN1Y2ggYXMgIjEwcHgiIGFyZSBwYXJzZWQgdG8gRmxvYXQ7CgkJCS8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgInJvdGF0ZSgxcmFkKSIgYXJlIHJldHVybmVkIGFzLWlzLgoJCQlyZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCAiIiApOwoKCQkJLy8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCAiYXV0byIgYXJlIGNvbnZlcnRlZCB0byAwLgoJCQlyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09ICJhdXRvIiA/IDAgOiByZXN1bHQ7CgkJfSwKCQlzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsKCgkJCS8vIFVzZSBzdGVwIGhvb2sgZm9yIGJhY2sgY29tcGF0LgoJCQkvLyBVc2UgY3NzSG9vayBpZiBpdHMgdGhlcmUuCgkJCS8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuCgkJCWlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSApIHsKCQkJCWpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7CgkJCX0gZWxzZSBpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgPT09IDEgJiYKCQkJCSggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8CgkJCQkJalF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHsKCQkJCWpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApOwoJCQl9IGVsc2UgewoJCQkJdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93OwoJCQl9CgkJfQoJfQp9OwoKLy8gU3VwcG9ydDogSUUgPD05IG9ubHkKLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzClR3ZWVuLnByb3BIb29rcy5zY3JvbGxUb3AgPSBUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsTGVmdCA9IHsKCXNldDogZnVuY3Rpb24oIHR3ZWVuICkgewoJCWlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7CgkJCXR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdzsKCQl9Cgl9Cn07CgpqUXVlcnkuZWFzaW5nID0gewoJbGluZWFyOiBmdW5jdGlvbiggcCApIHsKCQlyZXR1cm4gcDsKCX0sCglzd2luZzogZnVuY3Rpb24oIHAgKSB7CgkJcmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjsKCX0sCglfZGVmYXVsdDogInN3aW5nIgp9OwoKalF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7CgovLyBCYWNrIGNvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludApqUXVlcnkuZnguc3RlcCA9IHt9OwoKCgoKdmFyCglmeE5vdywgaW5Qcm9ncmVzcywKCXJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLAoJcnJ1biA9IC9xdWV1ZUhvb2tzJC87CgpmdW5jdGlvbiBzY2hlZHVsZSgpIHsKCWlmICggaW5Qcm9ncmVzcyApIHsKCQlpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHsKCQkJd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSggc2NoZWR1bGUgKTsKCQl9IGVsc2UgewoJCQl3aW5kb3cuc2V0VGltZW91dCggc2NoZWR1bGUsIGpRdWVyeS5meC5pbnRlcnZhbCApOwoJCX0KCgkJalF1ZXJ5LmZ4LnRpY2soKTsKCX0KfQoKLy8gQW5pbWF0aW9ucyBjcmVhdGVkIHN5bmNocm9ub3VzbHkgd2lsbCBydW4gc3luY2hyb25vdXNseQpmdW5jdGlvbiBjcmVhdGVGeE5vdygpIHsKCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQlmeE5vdyA9IHVuZGVmaW5lZDsKCX0gKTsKCXJldHVybiAoIGZ4Tm93ID0gRGF0ZS5ub3coKSApOwp9CgovLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvbgpmdW5jdGlvbiBnZW5GeCggdHlwZSwgaW5jbHVkZVdpZHRoICkgewoJdmFyIHdoaWNoLAoJCWkgPSAwLAoJCWF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTsKCgkvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsCgkvLyBvdGhlcndpc2Ugc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodAoJaW5jbHVkZVdpZHRoID0gaW5jbHVkZVdpZHRoID8gMSA6IDA7Cglmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7CgkJd2hpY2ggPSBjc3NFeHBhbmRbIGkgXTsKCQlhdHRyc1sgIm1hcmdpbiIgKyB3aGljaCBdID0gYXR0cnNbICJwYWRkaW5nIiArIHdoaWNoIF0gPSB0eXBlOwoJfQoKCWlmICggaW5jbHVkZVdpZHRoICkgewoJCWF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7Cgl9CgoJcmV0dXJuIGF0dHJzOwp9CgpmdW5jdGlvbiBjcmVhdGVUd2VlbiggdmFsdWUsIHByb3AsIGFuaW1hdGlvbiApIHsKCXZhciB0d2VlbiwKCQljb2xsZWN0aW9uID0gKCBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggQW5pbWF0aW9uLnR3ZWVuZXJzWyAiKiIgXSApLAoJCWluZGV4ID0gMCwKCQlsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDsKCWZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJaWYgKCAoIHR3ZWVuID0gY29sbGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkgKSApIHsKCgkJCS8vIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5CgkJCXJldHVybiB0d2VlbjsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIGRlZmF1bHRQcmVmaWx0ZXIoIGVsZW0sIHByb3BzLCBvcHRzICkgewoJdmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LAoJCWlzQm94ID0gIndpZHRoIiBpbiBwcm9wcyB8fCAiaGVpZ2h0IiBpbiBwcm9wcywKCQlhbmltID0gdGhpcywKCQlvcmlnID0ge30sCgkJc3R5bGUgPSBlbGVtLnN0eWxlLAoJCWhpZGRlbiA9IGVsZW0ubm9kZVR5cGUgJiYgaXNIaWRkZW5XaXRoaW5UcmVlKCBlbGVtICksCgkJZGF0YVNob3cgPSBkYXRhUHJpdi5nZXQoIGVsZW0sICJmeHNob3ciICk7CgoJLy8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzCglpZiAoICFvcHRzLnF1ZXVlICkgewoJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCAiZngiICk7CgkJaWYgKCBob29rcy51bnF1ZXVlZCA9PSBudWxsICkgewoJCQlob29rcy51bnF1ZXVlZCA9IDA7CgkJCW9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlOwoJCQlob29rcy5lbXB0eS5maXJlID0gZnVuY3Rpb24oKSB7CgkJCQlpZiAoICFob29rcy51bnF1ZXVlZCApIHsKCQkJCQlvbGRmaXJlKCk7CgkJCQl9CgkJCX07CgkJfQoJCWhvb2tzLnVucXVldWVkKys7CgoJCWFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHsKCgkJCS8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzCgkJCWFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHsKCQkJCWhvb2tzLnVucXVldWVkLS07CgkJCQlpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sICJmeCIgKS5sZW5ndGggKSB7CgkJCQkJaG9va3MuZW1wdHkuZmlyZSgpOwoJCQkJfQoJCQl9ICk7CgkJfSApOwoJfQoKCS8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9ucwoJZm9yICggcHJvcCBpbiBwcm9wcyApIHsKCQl2YWx1ZSA9IHByb3BzWyBwcm9wIF07CgkJaWYgKCByZnh0eXBlcy50ZXN0KCB2YWx1ZSApICkgewoJCQlkZWxldGUgcHJvcHNbIHByb3AgXTsKCQkJdG9nZ2xlID0gdG9nZ2xlIHx8IHZhbHVlID09PSAidG9nZ2xlIjsKCQkJaWYgKCB2YWx1ZSA9PT0gKCBoaWRkZW4gPyAiaGlkZSIgOiAic2hvdyIgKSApIHsKCgkJCQkvLyBQcmV0ZW5kIHRvIGJlIGhpZGRlbiBpZiB0aGlzIGlzIGEgInNob3ciIGFuZAoJCQkJLy8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGUKCQkJCWlmICggdmFsdWUgPT09ICJzaG93IiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJaGlkZGVuID0gdHJ1ZTsKCgkJCQkvLyBJZ25vcmUgYWxsIG90aGVyIG5vLW9wIHNob3cvaGlkZSBkYXRhCgkJCQl9IGVsc2UgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQl9CgkJCW9yaWdbIHByb3AgXSA9IGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gfHwgalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wICk7CgkJfQoJfQoKCS8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpCglwcm9wVHdlZW4gPSAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3BzICk7CglpZiAoICFwcm9wVHdlZW4gJiYgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIG9yaWcgKSApIHsKCQlyZXR1cm47Cgl9CgoJLy8gUmVzdHJpY3QgIm92ZXJmbG93IiBhbmQgImRpc3BsYXkiIHN0eWxlcyBkdXJpbmcgYm94IGFuaW1hdGlvbnMKCWlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCgkJLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNQoJCS8vIFJlY29yZCBhbGwgMyBvdmVyZmxvdyBhdHRyaWJ1dGVzIGJlY2F1c2UgSUUgZG9lcyBub3QgaW5mZXIgdGhlIHNob3J0aGFuZAoJCS8vIGZyb20gaWRlbnRpY2FsbHktdmFsdWVkIG92ZXJmbG93WCBhbmQgb3ZlcmZsb3dZIGFuZCBFZGdlIGp1c3QgbWlycm9ycwoJCS8vIHRoZSBvdmVyZmxvd1ggdmFsdWUgdGhlcmUuCgkJb3B0cy5vdmVyZmxvdyA9IFsgc3R5bGUub3ZlcmZsb3csIHN0eWxlLm92ZXJmbG93WCwgc3R5bGUub3ZlcmZsb3dZIF07CgoJCS8vIElkZW50aWZ5IGEgZGlzcGxheSB0eXBlLCBwcmVmZXJyaW5nIG9sZCBzaG93L2hpZGUgZGF0YSBvdmVyIHRoZSBDU1MgY2FzY2FkZQoJCXJlc3RvcmVEaXNwbGF5ID0gZGF0YVNob3cgJiYgZGF0YVNob3cuZGlzcGxheTsKCQlpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7CgkJCXJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCAiZGlzcGxheSIgKTsKCQl9CgkJZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApOwoJCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCQlpZiAoIHJlc3RvcmVEaXNwbGF5ICkgewoJCQkJZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5OwoJCQl9IGVsc2UgewoKCQkJCS8vIEdldCBub25lbXB0eSB2YWx1ZShzKSBieSB0ZW1wb3JhcmlseSBmb3JjaW5nIHZpc2liaWxpdHkKCQkJCXNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApOwoJCQkJcmVzdG9yZURpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXkgfHwgcmVzdG9yZURpc3BsYXk7CgkJCQlkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICk7CgkJCQlzaG93SGlkZSggWyBlbGVtIF0gKTsKCQkJfQoJCX0KCgkJLy8gQW5pbWF0ZSBpbmxpbmUgZWxlbWVudHMgYXMgaW5saW5lLWJsb2NrCgkJaWYgKCBkaXNwbGF5ID09PSAiaW5saW5lIiB8fCBkaXNwbGF5ID09PSAiaW5saW5lLWJsb2NrIiAmJiByZXN0b3JlRGlzcGxheSAhPSBudWxsICkgewoJCQlpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJmbG9hdCIgKSA9PT0gIm5vbmUiICkgewoKCQkJCS8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGRpc3BsYXkgdmFsdWUgYXQgdGhlIGVuZCBvZiBwdXJlIHNob3cvaGlkZSBhbmltYXRpb25zCgkJCQlpZiAoICFwcm9wVHdlZW4gKSB7CgkJCQkJYW5pbS5kb25lKCBmdW5jdGlvbigpIHsKCQkJCQkJc3R5bGUuZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5OwoJCQkJCX0gKTsKCQkJCQlpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7CgkJCQkJCWRpc3BsYXkgPSBzdHlsZS5kaXNwbGF5OwoJCQkJCQlyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09ICJub25lIiA/ICIiIDogZGlzcGxheTsKCQkJCQl9CgkJCQl9CgkJCQlzdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CgkJCX0KCQl9Cgl9CgoJaWYgKCBvcHRzLm92ZXJmbG93ICkgewoJCXN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CgkJYW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkgewoJCQlzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTsKCQkJc3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdOwoJCQlzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07CgkJfSApOwoJfQoKCS8vIEltcGxlbWVudCBzaG93L2hpZGUgYW5pbWF0aW9ucwoJcHJvcFR3ZWVuID0gZmFsc2U7Cglmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgoJCS8vIEdlbmVyYWwgc2hvdy9oaWRlIHNldHVwIGZvciB0aGlzIGVsZW1lbnQgYW5pbWF0aW9uCgkJaWYgKCAhcHJvcFR3ZWVuICkgewoJCQlpZiAoIGRhdGFTaG93ICkgewoJCQkJaWYgKCAiaGlkZGVuIiBpbiBkYXRhU2hvdyApIHsKCQkJCQloaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlkYXRhU2hvdyA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgImZ4c2hvdyIsIHsgZGlzcGxheTogcmVzdG9yZURpc3BsYXkgfSApOwoJCQl9CgoJCQkvLyBTdG9yZSBoaWRkZW4vdmlzaWJsZSBmb3IgdG9nZ2xlIHNvIGAuc3RvcCgpLnRvZ2dsZSgpYCAicmV2ZXJzZXMiCgkJCWlmICggdG9nZ2xlICkgewoJCQkJZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjsKCQkJfQoKCQkJLy8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW0KCQkJaWYgKCBoaWRkZW4gKSB7CgkJCQlzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTsKCQkJfQoKCQkJLyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovCgoJCQlhbmltLmRvbmUoIGZ1bmN0aW9uKCkgewoKCQkJLyogZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMgKi8KCgkJCQkvLyBUaGUgZmluYWwgc3RlcCBvZiBhICJoaWRlIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50CgkJCQlpZiAoICFoaWRkZW4gKSB7CgkJCQkJc2hvd0hpZGUoIFsgZWxlbSBdICk7CgkJCQl9CgkJCQlkYXRhUHJpdi5yZW1vdmUoIGVsZW0sICJmeHNob3ciICk7CgkJCQlmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgkJCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTsKCQkJCX0KCQkJfSApOwoJCX0KCgkJLy8gUGVyLXByb3BlcnR5IHNldHVwCgkJcHJvcFR3ZWVuID0gY3JlYXRlVHdlZW4oIGhpZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwLCBwcm9wLCBhbmltICk7CgkJaWYgKCAhKCBwcm9wIGluIGRhdGFTaG93ICkgKSB7CgkJCWRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7CgkJCWlmICggaGlkZGVuICkgewoJCQkJcHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDsKCQkJCXByb3BUd2Vlbi5zdGFydCA9IDA7CgkJCX0KCQl9Cgl9Cn0KCmZ1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFzaW5nICkgewoJdmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rczsKCgkvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3MKCWZvciAoIGluZGV4IGluIHByb3BzICkgewoJCW5hbWUgPSBjYW1lbENhc2UoIGluZGV4ICk7CgkJZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdOwoJCXZhbHVlID0gcHJvcHNbIGluZGV4IF07CgkJaWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkgewoJCQllYXNpbmcgPSB2YWx1ZVsgMSBdOwoJCQl2YWx1ZSA9IHByb3BzWyBpbmRleCBdID0gdmFsdWVbIDAgXTsKCQl9CgoJCWlmICggaW5kZXggIT09IG5hbWUgKSB7CgkJCXByb3BzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJZGVsZXRlIHByb3BzWyBpbmRleCBdOwoJCX0KCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTsKCQlpZiAoIGhvb2tzICYmICJleHBhbmQiIGluIGhvb2tzICkgewoJCQl2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTsKCQkJZGVsZXRlIHByb3BzWyBuYW1lIF07CgoJCQkvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuCgkJCS8vIFJldXNpbmcgJ2luZGV4JyBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgIm5hbWUiCgkJCWZvciAoIGluZGV4IGluIHZhbHVlICkgewoJCQkJaWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkgewoJCQkJCXByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07CgkJCQkJc3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZzsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCXNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZzsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHsKCXZhciByZXN1bHQsCgkJc3RvcHBlZCwKCQlpbmRleCA9IDAsCgkJbGVuZ3RoID0gQW5pbWF0aW9uLnByZWZpbHRlcnMubGVuZ3RoLAoJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkuYWx3YXlzKCBmdW5jdGlvbigpIHsKCgkJCS8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvcgoJCQlkZWxldGUgdGljay5lbGVtOwoJCX0gKSwKCQl0aWNrID0gZnVuY3Rpb24oKSB7CgkJCWlmICggc3RvcHBlZCApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQl2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLAoJCQkJcmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLAoKCQkJCS8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHkKCQkJCS8vIEFyY2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFsbG93IHVzIHRvIHVzZSBgMSAtICggMC41IHx8IDAgKWAgKCMxMjQ5NykKCQkJCXRlbXAgPSByZW1haW5pbmcgLyBhbmltYXRpb24uZHVyYXRpb24gfHwgMCwKCQkJCXBlcmNlbnQgPSAxIC0gdGVtcCwKCQkJCWluZGV4ID0gMCwKCQkJCWxlbmd0aCA9IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoOwoKCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJCWFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7CgkJCX0KCgkJCWRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSApOwoKCQkJLy8gSWYgdGhlcmUncyBtb3JlIHRvIGRvLCB5aWVsZAoJCQlpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHsKCQkJCXJldHVybiByZW1haW5pbmc7CgkJCX0KCgkJCS8vIElmIHRoaXMgd2FzIGFuIGVtcHR5IGFuaW1hdGlvbiwgc3ludGhlc2l6ZSBhIGZpbmFsIHByb2dyZXNzIG5vdGlmaWNhdGlvbgoJCQlpZiAoICFsZW5ndGggKSB7CgkJCQlkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7CgkJCX0KCgkJCS8vIFJlc29sdmUgdGhlIGFuaW1hdGlvbiBhbmQgcmVwb3J0IGl0cyBjb25jbHVzaW9uCgkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiBdICk7CgkJCXJldHVybiBmYWxzZTsKCQl9LAoJCWFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHsKCQkJZWxlbTogZWxlbSwKCQkJcHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksCgkJCW9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHsKCQkJCXNwZWNpYWxFYXNpbmc6IHt9LAoJCQkJZWFzaW5nOiBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0CgkJCX0sIG9wdGlvbnMgKSwKCQkJb3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLAoJCQlvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsCgkJCXN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSwKCQkJZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sCgkJCXR3ZWVuczogW10sCgkJCWNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkgewoJCQkJdmFyIHR3ZWVuID0galF1ZXJ5LlR3ZWVuKCBlbGVtLCBhbmltYXRpb24ub3B0cywgcHJvcCwgZW5kLAoJCQkJCQlhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7CgkJCQlhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7CgkJCQlyZXR1cm4gdHdlZW47CgkJCX0sCgkJCXN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkgewoJCQkJdmFyIGluZGV4ID0gMCwKCgkJCQkJLy8gSWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdlZW5zCgkJCQkJLy8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0CgkJCQkJbGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDsKCQkJCWlmICggc3RvcHBlZCApIHsKCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCQkJCXN0b3BwZWQgPSB0cnVlOwoJCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJCQlhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApOwoJCQkJfQoKCQkJCS8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0CgkJCQlpZiAoIGdvdG9FbmQgKSB7CgkJCQkJZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApOwoJCQkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7CgkJCQl9IGVsc2UgewoJCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9CgkJfSApLAoJCXByb3BzID0gYW5pbWF0aW9uLnByb3BzOwoKCXByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7CgoJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQlyZXN1bHQgPSBBbmltYXRpb24ucHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApOwoJCWlmICggcmVzdWx0ICkgewoJCQlpZiAoIGlzRnVuY3Rpb24oIHJlc3VsdC5zdG9wICkgKSB7CgkJCQlqUXVlcnkuX3F1ZXVlSG9va3MoIGFuaW1hdGlvbi5lbGVtLCBhbmltYXRpb24ub3B0cy5xdWV1ZSApLnN0b3AgPQoJCQkJCXJlc3VsdC5zdG9wLmJpbmQoIHJlc3VsdCApOwoJCQl9CgkJCXJldHVybiByZXN1bHQ7CgkJfQoJfQoKCWpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7CgoJaWYgKCBpc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkgewoJCWFuaW1hdGlvbi5vcHRzLnN0YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApOwoJfQoKCS8vIEF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zCglhbmltYXRpb24KCQkucHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzICkKCQkuZG9uZSggYW5pbWF0aW9uLm9wdHMuZG9uZSwgYW5pbWF0aW9uLm9wdHMuY29tcGxldGUgKQoJCS5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsICkKCQkuYWx3YXlzKCBhbmltYXRpb24ub3B0cy5hbHdheXMgKTsKCglqUXVlcnkuZngudGltZXIoCgkJalF1ZXJ5LmV4dGVuZCggdGljaywgewoJCQllbGVtOiBlbGVtLAoJCQlhbmltOiBhbmltYXRpb24sCgkJCXF1ZXVlOiBhbmltYXRpb24ub3B0cy5xdWV1ZQoJCX0gKQoJKTsKCglyZXR1cm4gYW5pbWF0aW9uOwp9CgpqUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7CgoJdHdlZW5lcnM6IHsKCQkiKiI6IFsgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkgewoJCQl2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApOwoJCQlhZGp1c3RDU1MoIHR3ZWVuLmVsZW0sIHByb3AsIHJjc3NOdW0uZXhlYyggdmFsdWUgKSwgdHdlZW4gKTsKCQkJcmV0dXJuIHR3ZWVuOwoJCX0gXQoJfSwKCgl0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkgewoJCWlmICggaXNGdW5jdGlvbiggcHJvcHMgKSApIHsKCQkJY2FsbGJhY2sgPSBwcm9wczsKCQkJcHJvcHMgPSBbICIqIiBdOwoJCX0gZWxzZSB7CgkJCXByb3BzID0gcHJvcHMubWF0Y2goIHJub3RodG1sd2hpdGUgKTsKCQl9CgoJCXZhciBwcm9wLAoJCQlpbmRleCA9IDAsCgkJCWxlbmd0aCA9IHByb3BzLmxlbmd0aDsKCgkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJcHJvcCA9IHByb3BzWyBpbmRleCBdOwoJCQlBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSA9IEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdOwoJCQlBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXS51bnNoaWZ0KCBjYWxsYmFjayApOwoJCX0KCX0sCgoJcHJlZmlsdGVyczogWyBkZWZhdWx0UHJlZmlsdGVyIF0sCgoJcHJlZmlsdGVyOiBmdW5jdGlvbiggY2FsbGJhY2ssIHByZXBlbmQgKSB7CgkJaWYgKCBwcmVwZW5kICkgewoJCQlBbmltYXRpb24ucHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApOwoJCX0gZWxzZSB7CgkJCUFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7CgkJfQoJfQp9ICk7CgpqUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7Cgl2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDogewoJCWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CgkJCWlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsCgkJZHVyYXRpb246IHNwZWVkLAoJCWVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nCgl9OwoKCS8vIEdvIHRvIHRoZSBlbmQgc3RhdGUgaWYgZnggYXJlIG9mZgoJaWYgKCBqUXVlcnkuZngub2ZmICkgewoJCW9wdC5kdXJhdGlvbiA9IDA7CgoJfSBlbHNlIHsKCQlpZiAoIHR5cGVvZiBvcHQuZHVyYXRpb24gIT09ICJudW1iZXIiICkgewoJCQlpZiAoIG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzICkgewoJCQkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkc1sgb3B0LmR1cmF0aW9uIF07CgoJCQl9IGVsc2UgewoJCQkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKCQkJfQoJCX0KCX0KCgkvLyBOb3JtYWxpemUgb3B0LnF1ZXVlIC0gdHJ1ZS91bmRlZmluZWQvbnVsbCAtPiAiZngiCglpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHsKCQlvcHQucXVldWUgPSAiZngiOwoJfQoKCS8vIFF1ZXVlaW5nCglvcHQub2xkID0gb3B0LmNvbXBsZXRlOwoKCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewoJCWlmICggaXNGdW5jdGlvbiggb3B0Lm9sZCApICkgewoJCQlvcHQub2xkLmNhbGwoIHRoaXMgKTsKCQl9CgoJCWlmICggb3B0LnF1ZXVlICkgewoJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7CgkJfQoJfTsKCglyZXR1cm4gb3B0Owp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkgewoKCQkvLyBTaG93IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDAKCQlyZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuV2l0aGluVHJlZSApLmNzcyggIm9wYWNpdHkiLCAwICkuc2hvdygpCgoJCQkvLyBBbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQKCQkJLmVuZCgpLmFuaW1hdGUoIHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsKCX0sCglhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CgkJdmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSwKCQkJb3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLAoJCQlkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkgewoKCQkJCS8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0CgkJCQl2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7CgoJCQkJLy8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5CgkJCQlpZiAoIGVtcHR5IHx8IGRhdGFQcml2LmdldCggdGhpcywgImZpbmlzaCIgKSApIHsKCQkJCQlhbmltLnN0b3AoIHRydWUgKTsKCQkJCX0KCQkJfTsKCQkJZG9BbmltYXRpb24uZmluaXNoID0gZG9BbmltYXRpb247CgoJCXJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID8KCQkJdGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDoKCQkJdGhpcy5xdWV1ZSggb3B0YWxsLnF1ZXVlLCBkb0FuaW1hdGlvbiApOwoJfSwKCXN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkgewoJCXZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7CgkJCXZhciBzdG9wID0gaG9va3Muc3RvcDsKCQkJZGVsZXRlIGhvb2tzLnN0b3A7CgkJCXN0b3AoIGdvdG9FbmQgKTsKCQl9OwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZ290b0VuZCA9IGNsZWFyUXVldWU7CgkJCWNsZWFyUXVldWUgPSB0eXBlOwoJCQl0eXBlID0gdW5kZWZpbmVkOwoJCX0KCQlpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7CgkJCXRoaXMucXVldWUoIHR5cGUgfHwgImZ4IiwgW10gKTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQl2YXIgZGVxdWV1ZSA9IHRydWUsCgkJCQlpbmRleCA9IHR5cGUgIT0gbnVsbCAmJiB0eXBlICsgInF1ZXVlSG9va3MiLAoJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKTsKCgkJCWlmICggaW5kZXggKSB7CgkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICkgewoJCQkJCXN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZm9yICggaW5kZXggaW4gZGF0YSApIHsKCQkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHsKCQkJCQkJc3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgewoJCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJgoJCQkJCSggdHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkgewoKCQkJCQl0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7CgkJCQkJZGVxdWV1ZSA9IGZhbHNlOwoJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CgkJCQl9CgkJCX0KCgkJCS8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuCgkJCS8vIFRpbWVycyBjdXJyZW50bHkgd2lsbCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2gKCQkJLy8gd2lsbCBkZXF1ZXVlIGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kLgoJCQlpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7CgkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQl9CgkJfSApOwoJfSwKCWZpbmlzaDogZnVuY3Rpb24oIHR5cGUgKSB7CgkJaWYgKCB0eXBlICE9PSBmYWxzZSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCQl9CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCXZhciBpbmRleCwKCQkJCWRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKSwKCQkJCXF1ZXVlID0gZGF0YVsgdHlwZSArICJxdWV1ZSIgXSwKCQkJCWhvb2tzID0gZGF0YVsgdHlwZSArICJxdWV1ZUhvb2tzIiBdLAoJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDsKCgkJCS8vIEVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGEKCQkJZGF0YS5maW5pc2ggPSB0cnVlOwoKCQkJLy8gRW1wdHkgdGhlIHF1ZXVlIGZpcnN0CgkJCWpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTsKCgkJCWlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHsKCQkJCWhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApOwoJCQl9CgoJCQkvLyBMb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbQoJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgewoJCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7CgkJCQkJdGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApOwoJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CgkJCQl9CgkJCX0KCgkJCS8vIExvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtCgkJCWZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJCQlpZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHsKCQkJCQlxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApOwoJCQkJfQoJCQl9CgoJCQkvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZwoJCQlkZWxldGUgZGF0YS5maW5pc2g7CgkJfSApOwoJfQp9ICk7CgpqUXVlcnkuZWFjaCggWyAidG9nZ2xlIiwgInNob3ciLCAiaGlkZSIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Cgl2YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gImJvb2xlYW4iID8KCQkJY3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDoKCQkJdGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSApOwoKLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9ucwpqUXVlcnkuZWFjaCggewoJc2xpZGVEb3duOiBnZW5GeCggInNob3ciICksCglzbGlkZVVwOiBnZW5GeCggImhpZGUiICksCglzbGlkZVRvZ2dsZTogZ2VuRngoICJ0b2dnbGUiICksCglmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCglmYWRlT3V0OiB7IG9wYWNpdHk6ICJoaWRlIiB9LAoJZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiAidG9nZ2xlIiB9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSApOwoKalF1ZXJ5LnRpbWVycyA9IFtdOwpqUXVlcnkuZngudGljayA9IGZ1bmN0aW9uKCkgewoJdmFyIHRpbWVyLAoJCWkgPSAwLAoJCXRpbWVycyA9IGpRdWVyeS50aW1lcnM7CgoJZnhOb3cgPSBEYXRlLm5vdygpOwoKCWZvciAoIDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHsKCQl0aW1lciA9IHRpbWVyc1sgaSBdOwoKCQkvLyBSdW4gdGhlIHRpbWVyIGFuZCBzYWZlbHkgcmVtb3ZlIGl0IHdoZW4gZG9uZSAoYWxsb3dpbmcgZm9yIGV4dGVybmFsIHJlbW92YWwpCgkJaWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7CgkJCXRpbWVycy5zcGxpY2UoIGktLSwgMSApOwoJCX0KCX0KCglpZiAoICF0aW1lcnMubGVuZ3RoICkgewoJCWpRdWVyeS5meC5zdG9wKCk7Cgl9CglmeE5vdyA9IHVuZGVmaW5lZDsKfTsKCmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHsKCWpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKTsKCWpRdWVyeS5meC5zdGFydCgpOwp9OwoKalF1ZXJ5LmZ4LmludGVydmFsID0gMTM7CmpRdWVyeS5meC5zdGFydCA9IGZ1bmN0aW9uKCkgewoJaWYgKCBpblByb2dyZXNzICkgewoJCXJldHVybjsKCX0KCglpblByb2dyZXNzID0gdHJ1ZTsKCXNjaGVkdWxlKCk7Cn07CgpqUXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkgewoJaW5Qcm9ncmVzcyA9IG51bGw7Cn07CgpqUXVlcnkuZnguc3BlZWRzID0gewoJc2xvdzogNjAwLAoJZmFzdDogMjAwLAoKCS8vIERlZmF1bHQgc3BlZWQKCV9kZWZhdWx0OiA0MDAKfTsKCgovLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uCi8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEwMDMyNDAxNDc0Ny9odHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvCmpRdWVyeS5mbi5kZWxheSA9IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkgewoJdGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTsKCXR5cGUgPSB0eXBlIHx8ICJmeCI7CgoJcmV0dXJuIHRoaXMucXVldWUoIHR5cGUsIGZ1bmN0aW9uKCBuZXh0LCBob29rcyApIHsKCQl2YXIgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7CgkJaG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkgewoJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7CgkJfTsKCX0gKTsKfTsKCgooIGZ1bmN0aW9uKCkgewoJdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApLAoJCXNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzZWxlY3QiICksCgkJb3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAib3B0aW9uIiApICk7CgoJaW5wdXQudHlwZSA9ICJjaGVja2JveCI7CgoJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMyBvbmx5CgkvLyBEZWZhdWx0IHZhbHVlIGZvciBhIGNoZWNrYm94IHNob3VsZCBiZSAib24iCglzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAhPT0gIiI7CgoJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkvLyBNdXN0IGFjY2VzcyBzZWxlY3RlZEluZGV4IHRvIG1ha2UgZGVmYXVsdCBvcHRpb25zIHNlbGVjdAoJc3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDsKCgkvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHkKCS8vIEFuIGlucHV0IGxvc2VzIGl0cyB2YWx1ZSBhZnRlciBiZWNvbWluZyBhIHJhZGlvCglpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJpbnB1dCIgKTsKCWlucHV0LnZhbHVlID0gInQiOwoJaW5wdXQudHlwZSA9ICJyYWRpbyI7CglzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gInQiOwp9ICkoKTsKCgp2YXIgYm9vbEhvb2ssCglhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCWF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Cgl9LAoKCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApOwoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmV4dGVuZCggewoJYXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCXZhciByZXQsIGhvb2tzLAoJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgoJCS8vIERvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKCQlpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZAoJCWlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSAidW5kZWZpbmVkIiApIHsKCQkJcmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApOwoJCX0KCgkJLy8gQXR0cmlidXRlIGhvb2tzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBsb3dlcmNhc2UgdmVyc2lvbgoJCS8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWQKCQlpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKCQkJaG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fAoJCQkJKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSA/IGJvb2xIb29rIDogdW5kZWZpbmVkICk7CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmICggdmFsdWUgPT09IG51bGwgKSB7CgkJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCQkJcmV0dXJuOwoJCQl9CgoJCQlpZiAoIGhvb2tzICYmICJzZXQiIGluIGhvb2tzICYmCgkJCQkoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gcmV0OwoJCQl9CgoJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyAiIiApOwoJCQlyZXR1cm4gdmFsdWU7CgkJfQoKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTsKCgkJLy8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWQKCQlyZXR1cm4gcmV0ID09IG51bGwgPyB1bmRlZmluZWQgOiByZXQ7Cgl9LAoKCWF0dHJIb29rczogewoJCXR5cGU6IHsKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQlpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09ICJyYWRpbyIgJiYKCQkJCQlub2RlTmFtZSggZWxlbSwgImlucHV0IiApICkgewoJCQkJCXZhciB2YWwgPSBlbGVtLnZhbHVlOwoJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAidHlwZSIsIHZhbHVlICk7CgkJCQkJaWYgKCB2YWwgKSB7CgkJCQkJCWVsZW0udmFsdWUgPSB2YWw7CgkJCQkJfQoJCQkJCXJldHVybiB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0sCgoJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewoJCXZhciBuYW1lLAoJCQlpID0gMCwKCgkJCS8vIEF0dHJpYnV0ZSBuYW1lcyBjYW4gY29udGFpbiBub24tSFRNTCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMKCQkJLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjYXR0cmlidXRlcy0yCgkJCWF0dHJOYW1lcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICk7CgoJCWlmICggYXR0ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCXdoaWxlICggKCBuYW1lID0gYXR0ck5hbWVzWyBpKysgXSApICkgewoJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTsKCQkJfQoJCX0KCX0KfSApOwoKLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlcwpib29sSG9vayA9IHsKCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewoJCWlmICggdmFsdWUgPT09IGZhbHNlICkgewoKCQkJLy8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZQoJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCX0gZWxzZSB7CgkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lICk7CgkJfQoJCXJldHVybiBuYW1lOwoJfQp9OwoKalF1ZXJ5LmVhY2goIGpRdWVyeS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXHcrL2cgKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Cgl2YXIgZ2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7CgoJYXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewoJCXZhciByZXQsIGhhbmRsZSwKCQkJbG93ZXJjYXNlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKCgkJaWYgKCAhaXNYTUwgKSB7CgoJCQkvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJlbW92aW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyCgkJCWhhbmRsZSA9IGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXTsKCQkJYXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gcmV0OwoJCQlyZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVsbCA/CgkJCQlsb3dlcmNhc2VOYW1lIDoKCQkJCW51bGw7CgkJCWF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IGhhbmRsZTsKCQl9CgkJcmV0dXJuIHJldDsKCX07Cn0gKTsKCgoKCnZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKCXJjbGlja2FibGUgPSAvXig/OmF8YXJlYSkkL2k7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7Cglwcm9wOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOwoJfSwKCglyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJZGVsZXRlIHRoaXNbIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSBdOwoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmV4dGVuZCggewoJcHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCXZhciByZXQsIGhvb2tzLAoJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgoJCS8vIERvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKCQlpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKCgkJCS8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3MKCQkJbmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKCQkJaG9va3MgPSBqUXVlcnkucHJvcEhvb2tzWyBuYW1lIF07CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmICggaG9va3MgJiYgInNldCIgaW4gaG9va3MgJiYKCQkJCSggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHsKCQkJCXJldHVybiByZXQ7CgkJCX0KCgkJCXJldHVybiAoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7CgkJfQoKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXJldHVybiBlbGVtWyBuYW1lIF07Cgl9LAoKCXByb3BIb29rczogewoJCXRhYkluZGV4OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkJLy8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seQoJCQkJLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlCgkJCQkvLyBjb3JyZWN0IHZhbHVlIHdoZW4gaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXQKCQkJCS8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE0MTExNjIzMzM0Ny9odHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0LwoJCQkJLy8gVXNlIHByb3BlciBhdHRyaWJ1dGUgcmV0cmlldmFsKCMxMjA3MikKCQkJCXZhciB0YWJpbmRleCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ0YWJpbmRleCIgKTsKCgkJCQlpZiAoIHRhYmluZGV4ICkgewoJCQkJCXJldHVybiBwYXJzZUludCggdGFiaW5kZXgsIDEwICk7CgkJCQl9CgoJCQkJaWYgKAoJCQkJCXJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8CgkJCQkJcmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYKCQkJCQllbGVtLmhyZWYKCQkJCSkgewoJCQkJCXJldHVybiAwOwoJCQkJfQoKCQkJCXJldHVybiAtMTsKCQkJfQoJCX0KCX0sCgoJcHJvcEZpeDogewoJCSJmb3IiOiAiaHRtbEZvciIsCgkJImNsYXNzIjogImNsYXNzTmFtZSIKCX0KfSApOwoKLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5Ci8vIEFjY2Vzc2luZyB0aGUgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eQovLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkCi8vIG9uIHRoZSBvcHRpb24KLy8gVGhlIGdldHRlciBlbnN1cmVzIGEgZGVmYXVsdCBvcHRpb24gaXMgc2VsZWN0ZWQKLy8gd2hlbiBpbiBhbiBvcHRncm91cAovLyBlc2xpbnQgcnVsZSAibm8tdW51c2VkLWV4cHJlc3Npb25zIiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjb2RlCi8vIHNpbmNlIGl0IGNvbnNpZGVycyBzdWNoIGFjY2Vzc2lvbnMgbm9vcAppZiAoICFzdXBwb3J0Lm9wdFNlbGVjdGVkICkgewoJalF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoKCQkJLyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogIm9mZiIgKi8KCgkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CgkJCWlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJcGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJfQoJCQlyZXR1cm4gbnVsbDsKCQl9LAoJCXNldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkvKiBlc2xpbnQgbm8tdW51c2VkLWV4cHJlc3Npb25zOiAib2ZmIiAqLwoKCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQkJaWYgKCBwYXJlbnQgKSB7CgkJCQlwYXJlbnQuc2VsZWN0ZWRJbmRleDsKCgkJCQlpZiAoIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJCXBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CgkJCQl9CgkJCX0KCQl9Cgl9Owp9CgpqUXVlcnkuZWFjaCggWwoJInRhYkluZGV4IiwKCSJyZWFkT25seSIsCgkibWF4TGVuZ3RoIiwKCSJjZWxsU3BhY2luZyIsCgkiY2VsbFBhZGRpbmciLAoJInJvd1NwYW4iLAoJImNvbFNwYW4iLAoJInVzZU1hcCIsCgkiZnJhbWVCb3JkZXIiLAoJImNvbnRlbnRFZGl0YWJsZSIKXSwgZnVuY3Rpb24oKSB7CglqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzOwp9ICk7CgoKCgoJLy8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UgYWNjb3JkaW5nIHRvIEhUTUwgc3BlYwoJLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS1hc2NpaS13aGl0ZXNwYWNlCglmdW5jdGlvbiBzdHJpcEFuZENvbGxhcHNlKCB2YWx1ZSApIHsKCQl2YXIgdG9rZW5zID0gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTsKCQlyZXR1cm4gdG9rZW5zLmpvaW4oICIgIiApOwoJfQoKCmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkgewoJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlICYmIGVsZW0uZ2V0QXR0cmlidXRlKCAiY2xhc3MiICkgfHwgIiI7Cn0KCmZ1bmN0aW9uIGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApIHsKCWlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHsKCQlyZXR1cm4gdmFsdWU7Cgl9CglpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgKSB7CgkJcmV0dXJuIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107Cgl9CglyZXR1cm4gW107Cn0KCmpRdWVyeS5mbi5leHRlbmQoIHsKCWFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLAoJCQlpID0gMDsKCgkJaWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTsKCQkJfSApOwoJCX0KCgkJY2xhc3NlcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApOwoKCQlpZiAoIGNsYXNzZXMubGVuZ3RoICkgewoJCQl3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7CgkJCQljdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7CgkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggIiAiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArICIgIiApOwoKCQkJCWlmICggY3VyICkgewoJCQkJCWogPSAwOwoJCQkJCXdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7CgkJCQkJCWlmICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPCAwICkgewoJCQkJCQkJY3VyICs9IGNsYXp6ICsgIiAiOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLgoJCQkJCWZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTsKCQkJCQlpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkgewoJCQkJCQllbGVtLnNldEF0dHJpYnV0ZSggImNsYXNzIiwgZmluYWxWYWx1ZSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCXJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLAoJCQlpID0gMDsKCgkJaWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTsKCQkJfSApOwoJCX0KCgkJaWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJcmV0dXJuIHRoaXMuYXR0ciggImNsYXNzIiwgIiIgKTsKCQl9CgoJCWNsYXNzZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTsKCgkJaWYgKCBjbGFzc2VzLmxlbmd0aCApIHsKCQkJd2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkgewoJCQkJY3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApOwoKCQkJCS8vIFRoaXMgZXhwcmVzc2lvbiBpcyBoZXJlIGZvciBiZXR0ZXIgY29tcHJlc3NpYmlsaXR5IChzZWUgYWRkQ2xhc3MpCgkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggIiAiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArICIgIiApOwoKCQkJCWlmICggY3VyICkgewoJCQkJCWogPSAwOwoJCQkJCXdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7CgoJCQkJCQkvLyBSZW1vdmUgKmFsbCogaW5zdGFuY2VzCgkJCQkJCXdoaWxlICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPiAtMSApIHsKCQkJCQkJCWN1ciA9IGN1ci5yZXBsYWNlKCAiICIgKyBjbGF6eiArICIgIiwgIiAiICk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuCgkJCQkJZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApOwoJCQkJCWlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7CgkJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAiY2xhc3MiLCBmaW5hbFZhbHVlICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7CgkJdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWUsCgkJCWlzVmFsaWRWYWx1ZSA9IHR5cGUgPT09ICJzdHJpbmciIHx8IEFycmF5LmlzQXJyYXkoIHZhbHVlICk7CgoJCWlmICggdHlwZW9mIHN0YXRlVmFsID09PSAiYm9vbGVhbiIgJiYgaXNWYWxpZFZhbHVlICkgewoJCQlyZXR1cm4gc3RhdGVWYWwgPyB0aGlzLmFkZENsYXNzKCB2YWx1ZSApIDogdGhpcy5yZW1vdmVDbGFzcyggdmFsdWUgKTsKCQl9CgoJCWlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcygKCQkJCQl2YWx1ZS5jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLAoJCQkJCXN0YXRlVmFsCgkJCQkpOwoJCQl9ICk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJdmFyIGNsYXNzTmFtZSwgaSwgc2VsZiwgY2xhc3NOYW1lczsKCgkJCWlmICggaXNWYWxpZFZhbHVlICkgewoKCQkJCS8vIFRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzCgkJCQlpID0gMDsKCQkJCXNlbGYgPSBqUXVlcnkoIHRoaXMgKTsKCQkJCWNsYXNzTmFtZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTsKCgkJCQl3aGlsZSAoICggY2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSsrIF0gKSApIHsKCgkJCQkJLy8gQ2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0CgkJCQkJaWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHsKCQkJCQkJc2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJc2VsZi5hZGRDbGFzcyggY2xhc3NOYW1lICk7CgkJCQkJfQoJCQkJfQoKCQkJLy8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWUKCQkJfSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSAiYm9vbGVhbiIgKSB7CgkJCQljbGFzc05hbWUgPSBnZXRDbGFzcyggdGhpcyApOwoJCQkJaWYgKCBjbGFzc05hbWUgKSB7CgoJCQkJCS8vIFN0b3JlIGNsYXNzTmFtZSBpZiBzZXQKCQkJCQlkYXRhUHJpdi5zZXQoIHRoaXMsICJfX2NsYXNzTmFtZV9fIiwgY2xhc3NOYW1lICk7CgkJCQl9CgoJCQkJLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgY2xhc3MgbmFtZSBvciBpZiB3ZSdyZSBwYXNzZWQgYGZhbHNlYCwKCQkJCS8vIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdhcyBvbmUsIHRoZSBhYm92ZSBzYXZlZCBpdCkuCgkJCQkvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLAoJCQkJLy8gZmFsbGluZyBiYWNrIHRvIHRoZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgc3RvcmVkLgoJCQkJaWYgKCB0aGlzLnNldEF0dHJpYnV0ZSApIHsKCQkJCQl0aGlzLnNldEF0dHJpYnV0ZSggImNsYXNzIiwKCQkJCQkJY2xhc3NOYW1lIHx8IHZhbHVlID09PSBmYWxzZSA/CgkJCQkJCSIiIDoKCQkJCQkJZGF0YVByaXYuZ2V0KCB0aGlzLCAiX19jbGFzc05hbWVfXyIgKSB8fCAiIgoJCQkJCSk7CgkJCQl9CgkJCX0KCQl9ICk7Cgl9LAoKCWhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdmFyIGNsYXNzTmFtZSwgZWxlbSwKCQkJaSA9IDA7CgoJCWNsYXNzTmFtZSA9ICIgIiArIHNlbGVjdG9yICsgIiAiOwoJCXdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHsKCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmCgkJCQkoICIgIiArIHN0cmlwQW5kQ29sbGFwc2UoIGdldENsYXNzKCBlbGVtICkgKSArICIgIiApLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KfSApOwoKCgoKdmFyIHJyZXR1cm4gPSAvXHIvZzsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXZhciBob29rcywgcmV0LCB2YWx1ZUlzRnVuY3Rpb24sCgkJCWVsZW0gPSB0aGlzWyAwIF07CgoJCWlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCWlmICggZWxlbSApIHsKCQkJCWhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8fAoJCQkJCWpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQkJaWYgKCBob29rcyAmJgoJCQkJCSJnZXQiIGluIGhvb2tzICYmCgkJCQkJKCByZXQgPSBob29rcy5nZXQoIGVsZW0sICJ2YWx1ZSIgKSApICE9PSB1bmRlZmluZWQKCQkJCSkgewoJCQkJCXJldHVybiByZXQ7CgkJCQl9CgoJCQkJcmV0ID0gZWxlbS52YWx1ZTsKCgkJCQkvLyBIYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzCgkJCQlpZiAoIHR5cGVvZiByZXQgPT09ICJzdHJpbmciICkgewoJCQkJCXJldHVybiByZXQucmVwbGFjZSggcnJldHVybiwgIiIgKTsKCQkJCX0KCgkJCQkvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXIKCQkJCXJldHVybiByZXQgPT0gbnVsbCA/ICIiIDogcmV0OwoJCQl9CgoJCQlyZXR1cm47CgkJfQoKCQl2YWx1ZUlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCB2YWx1ZSApOwoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHsKCQkJdmFyIHZhbDsKCgkJCWlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCB2YWx1ZUlzRnVuY3Rpb24gKSB7CgkJCQl2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBqUXVlcnkoIHRoaXMgKS52YWwoKSApOwoJCQl9IGVsc2UgewoJCQkJdmFsID0gdmFsdWU7CgkJCX0KCgkJCS8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzICIiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nCgkJCWlmICggdmFsID09IG51bGwgKSB7CgkJCQl2YWwgPSAiIjsKCgkJCX0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09ICJudW1iZXIiICkgewoJCQkJdmFsICs9ICIiOwoKCQkJfSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7CgkJCQl2YWwgPSBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKyAiIjsKCQkJCX0gKTsKCQkJfQoKCQkJaG9va3MgPSBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQkvLyBJZiBzZXQgcmV0dXJucyB1bmRlZmluZWQsIGZhbGwgYmFjayB0byBub3JtYWwgc2V0dGluZwoJCQlpZiAoICFob29rcyB8fCAhKCAic2V0IiBpbiBob29rcyApIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCAidmFsdWUiICkgPT09IHVuZGVmaW5lZCApIHsKCQkJCXRoaXMudmFsdWUgPSB2YWw7CgkJCX0KCQl9ICk7Cgl9Cn0gKTsKCmpRdWVyeS5leHRlbmQoIHsKCXZhbEhvb2tzOiB7CgkJb3B0aW9uOiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkJdmFyIHZhbCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ2YWx1ZSIgKTsKCQkJCXJldHVybiB2YWwgIT0gbnVsbCA/CgkJCQkJdmFsIDoKCgkJCQkJLy8gU3VwcG9ydDogSUUgPD0xMCAtIDExIG9ubHkKCQkJCQkvLyBvcHRpb24udGV4dCB0aHJvd3MgZXhjZXB0aW9ucyAoIzE0Njg2LCAjMTQ4NTgpCgkJCQkJLy8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UKCQkJCQkvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNzdHJpcC1hbmQtY29sbGFwc2Utd2hpdGVzcGFjZQoJCQkJCXN0cmlwQW5kQ29sbGFwc2UoIGpRdWVyeS50ZXh0KCBlbGVtICkgKTsKCQkJfQoJCX0sCgkJc2VsZWN0OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgdmFsdWUsIG9wdGlvbiwgaSwKCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAoJCQkJCWluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAoJCQkJCW9uZSA9IGVsZW0udHlwZSA9PT0gInNlbGVjdC1vbmUiLAoJCQkJCXZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXSwKCQkJCQltYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aDsKCgkJCQlpZiAoIGluZGV4IDwgMCApIHsKCQkJCQlpID0gbWF4OwoKCQkJCX0gZWxzZSB7CgkJCQkJaSA9IG9uZSA/IGluZGV4IDogMDsKCQkJCX0KCgkJCQkvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCgkJCQlmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHsKCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCS8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5CgkJCQkJLy8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpCgkJCQkJaWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmCgoJCQkJCQkJLy8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cAoJCQkJCQkJIW9wdGlvbi5kaXNhYmxlZCAmJgoJCQkJCQkJKCAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHwKCQkJCQkJCQkhbm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAib3B0Z3JvdXAiICkgKSApIHsKCgkJCQkJCS8vIEdldCB0aGUgc3BlY2lmaWMgdmFsdWUgZm9yIHRoZSBvcHRpb24KCQkJCQkJdmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpOwoKCQkJCQkJLy8gV2UgZG9uJ3QgbmVlZCBhbiBhcnJheSBmb3Igb25lIHNlbGVjdHMKCQkJCQkJaWYgKCBvbmUgKSB7CgkJCQkJCQlyZXR1cm4gdmFsdWU7CgkJCQkJCX0KCgkJCQkJCS8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5CgkJCQkJCXZhbHVlcy5wdXNoKCB2YWx1ZSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdmFsdWVzOwoJCQl9LAoKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQl2YXIgb3B0aW9uU2V0LCBvcHRpb24sCgkJCQkJb3B0aW9ucyA9IGVsZW0ub3B0aW9ucywKCQkJCQl2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLAoJCQkJCWkgPSBvcHRpb25zLmxlbmd0aDsKCgkJCQl3aGlsZSAoIGktLSApIHsKCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCS8qIGVzbGludC1kaXNhYmxlIG5vLWNvbmQtYXNzaWduICovCgoJCQkJCWlmICggb3B0aW9uLnNlbGVjdGVkID0KCQkJCQkJalF1ZXJ5LmluQXJyYXkoIGpRdWVyeS52YWxIb29rcy5vcHRpb24uZ2V0KCBvcHRpb24gKSwgdmFsdWVzICkgPiAtMQoJCQkJCSkgewoJCQkJCQlvcHRpb25TZXQgPSB0cnVlOwoJCQkJCX0KCgkJCQkJLyogZXNsaW50LWVuYWJsZSBuby1jb25kLWFzc2lnbiAqLwoJCQkJfQoKCQkJCS8vIEZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0CgkJCQlpZiAoICFvcHRpb25TZXQgKSB7CgkJCQkJZWxlbS5zZWxlY3RlZEluZGV4ID0gLTE7CgkJCQl9CgkJCQlyZXR1cm4gdmFsdWVzOwoJCQl9CgkJfQoJfQp9ICk7CgovLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlcgpqUXVlcnkuZWFjaCggWyAicmFkaW8iLCAiY2hlY2tib3giIF0sIGZ1bmN0aW9uKCkgewoJalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7CgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCWlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHsKCQkJCXJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoIGVsZW0gKS52YWwoKSwgdmFsdWUgKSA+IC0xICk7CgkJCX0KCQl9Cgl9OwoJaWYgKCAhc3VwcG9ydC5jaGVja09uICkgewoJCWpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoICJ2YWx1ZSIgKSA9PT0gbnVsbCA/ICJvbiIgOiBlbGVtLnZhbHVlOwoJCX07Cgl9Cn0gKTsKCgoKCi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb24KCgpzdXBwb3J0LmZvY3VzaW4gPSAib25mb2N1c2luIiBpbiB3aW5kb3c7CgoKdmFyIHJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLAoJc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiggZSApIHsKCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJfTsKCmpRdWVyeS5leHRlbmQoIGpRdWVyeS5ldmVudCwgewoKCXRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkgewoKCQl2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLCBsYXN0RWxlbWVudCwKCQkJZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sCgkJCXR5cGUgPSBoYXNPd24uY2FsbCggZXZlbnQsICJ0eXBlIiApID8gZXZlbnQudHlwZSA6IGV2ZW50LAoJCQluYW1lc3BhY2VzID0gaGFzT3duLmNhbGwoIGV2ZW50LCAibmFtZXNwYWNlIiApID8gZXZlbnQubmFtZXNwYWNlLnNwbGl0KCAiLiIgKSA6IFtdOwoKCQljdXIgPSBsYXN0RWxlbWVudCA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50OwoKCQkvLyBEb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3cKCQlpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggdHlwZS5pbmRleE9mKCAiLiIgKSA+IC0xICkgewoKCQkJLy8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKQoJCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCggIi4iICk7CgkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgkJCW5hbWVzcGFjZXMuc29ydCgpOwoJCX0KCQlvbnR5cGUgPSB0eXBlLmluZGV4T2YoICI6IiApIDwgMCAmJiAib24iICsgdHlwZTsKCgkJLy8gQ2FsbGVyIGNhbiBwYXNzIGluIGEgalF1ZXJ5LkV2ZW50IG9iamVjdCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nCgkJZXZlbnQgPSBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/CgkJCWV2ZW50IDoKCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSwgdHlwZW9mIGV2ZW50ID09PSAib2JqZWN0IiAmJiBldmVudCApOwoKCQkvLyBUcmlnZ2VyIGJpdG1hc2s6ICYgMSBmb3IgbmF0aXZlIGhhbmRsZXJzOyAmIDIgZm9yIGpRdWVyeSAoYWx3YXlzIHRydWUpCgkJZXZlbnQuaXNUcmlnZ2VyID0gb25seUhhbmRsZXJzID8gMiA6IDM7CgkJZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCAiLiIgKTsKCQlldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID8KCQkJbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCAiXFwuKD86LipcXC58KSIgKSArICIoXFwufCQpIiApIDoKCQkJbnVsbDsKCgkJLy8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkCgkJZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkOwoJCWlmICggIWV2ZW50LnRhcmdldCApIHsKCQkJZXZlbnQudGFyZ2V0ID0gZWxlbTsKCQl9CgoJCS8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3QKCQlkYXRhID0gZGF0YSA9PSBudWxsID8KCQkJWyBldmVudCBdIDoKCQkJalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7CgoJCS8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXMKCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpCgkJLy8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNCkKCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7CgoJCQlidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTsKCQkJaWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHsKCQkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwoJCQl9CgkJCWZvciAoIDsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHsKCQkJCWV2ZW50UGF0aC5wdXNoKCBjdXIgKTsKCQkJCXRtcCA9IGN1cjsKCQkJfQoKCQkJLy8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5nLiwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pCgkJCWlmICggdG1wID09PSAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApICkgewoJCQkJZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApOwoJCQl9CgkJfQoKCQkvLyBGaXJlIGhhbmRsZXJzIG9uIHRoZSBldmVudCBwYXRoCgkJaSA9IDA7CgkJd2hpbGUgKCAoIGN1ciA9IGV2ZW50UGF0aFsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJbGFzdEVsZW1lbnQgPSBjdXI7CgkJCWV2ZW50LnR5cGUgPSBpID4gMSA/CgkJCQlidWJibGVUeXBlIDoKCQkJCXNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTsKCgkJCS8vIGpRdWVyeSBoYW5kbGVyCgkJCWhhbmRsZSA9ICggZGF0YVByaXYuZ2V0KCBjdXIsICJldmVudHMiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmCgkJCQlkYXRhUHJpdi5nZXQoIGN1ciwgImhhbmRsZSIgKTsKCQkJaWYgKCBoYW5kbGUgKSB7CgkJCQloYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApOwoJCQl9CgoJCQkvLyBOYXRpdmUgaGFuZGxlcgoJCQloYW5kbGUgPSBvbnR5cGUgJiYgY3VyWyBvbnR5cGUgXTsKCQkJaWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkgewoJCQkJZXZlbnQucmVzdWx0ID0gaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKCQkJCWlmICggZXZlbnQucmVzdWx0ID09PSBmYWxzZSApIHsKCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJfQoJCQl9CgkJfQoJCWV2ZW50LnR5cGUgPSB0eXBlOwoKCQkvLyBJZiBub2JvZHkgcHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwgZG8gaXQgbm93CgkJaWYgKCAhb25seUhhbmRsZXJzICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKCgkJCWlmICggKCAhc3BlY2lhbC5fZGVmYXVsdCB8fAoJCQkJc3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiYKCQkJCWFjY2VwdERhdGEoIGVsZW0gKSApIHsKCgkJCQkvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGV2ZW50LgoJCQkJLy8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKCM2MTcwKQoJCQkJaWYgKCBvbnR5cGUgJiYgaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7CgoJCQkJCS8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2QKCQkJCQl0bXAgPSBlbGVtWyBvbnR5cGUgXTsKCgkJCQkJaWYgKCB0bXAgKSB7CgkJCQkJCWVsZW1bIG9udHlwZSBdID0gbnVsbDsKCQkJCQl9CgoJCQkJCS8vIFByZXZlbnQgcmUtdHJpZ2dlcmluZyBvZiB0aGUgc2FtZSBldmVudCwgc2luY2Ugd2UgYWxyZWFkeSBidWJibGVkIGl0IGFib3ZlCgkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHR5cGU7CgoJCQkJCWlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJCQkJbGFzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTsKCQkJCQl9CgoJCQkJCWVsZW1bIHR5cGUgXSgpOwoKCQkJCQlpZiAoIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCQkJCWxhc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7CgkJCQkJfQoKCQkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdW5kZWZpbmVkOwoKCQkJCQlpZiAoIHRtcCApIHsKCQkJCQkJZWxlbVsgb250eXBlIF0gPSB0bXA7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgkvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUKCS8vIFVzZWQgb25seSBmb3IgYGZvY3VzKGluIHwgb3V0KWAgZXZlbnRzCglzaW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0sIGV2ZW50ICkgewoJCXZhciBlID0galF1ZXJ5LmV4dGVuZCgKCQkJbmV3IGpRdWVyeS5FdmVudCgpLAoJCQlldmVudCwKCQkJewoJCQkJdHlwZTogdHlwZSwKCQkJCWlzU2ltdWxhdGVkOiB0cnVlCgkJCX0KCQkpOwoKCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApOwoJfQoKfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoKCXRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApOwoJCX0gKTsKCX0sCgl0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7CgkJdmFyIGVsZW0gPSB0aGlzWyAwIF07CgkJaWYgKCBlbGVtICkgewoJCQlyZXR1cm4galF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIGVsZW0sIHRydWUgKTsKCQl9Cgl9Cn0gKTsKCgovLyBTdXBwb3J0OiBGaXJlZm94IDw9NDQKLy8gRmlyZWZveCBkb2Vzbid0IGhhdmUgZm9jdXMoaW4gfCBvdXQpIGV2ZW50cwovLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4NwovLwovLyBTdXBwb3J0OiBDaHJvbWUgPD00OCAtIDQ5LCBTYWZhcmkgPD05LjAgLSA5LjEKLy8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsCi8vIHdoaWNoIGlzIHNwZWMgdmlvbGF0aW9uIC0gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtZm9jdXNldmVudC1ldmVudC1vcmRlcgovLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0OTg1NwppZiAoICFzdXBwb3J0LmZvY3VzaW4gKSB7CglqUXVlcnkuZWFjaCggeyBmb2N1czogImZvY3VzaW4iLCBibHVyOiAiZm9jdXNvdXQiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CgoJCS8vIEF0dGFjaCBhIHNpbmdsZSBjYXB0dXJpbmcgaGFuZGxlciBvbiB0aGUgZG9jdW1lbnQgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0CgkJdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCWpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICkgKTsKCQl9OwoKCQlqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7CgkJCXNldHVwOiBmdW5jdGlvbigpIHsKCQkJCXZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKCQkJCQlhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTsKCgkJCQlpZiAoICFhdHRhY2hlcyApIHsKCQkJCQlkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwoJCQkJfQoJCQkJZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCwgKCBhdHRhY2hlcyB8fCAwICkgKyAxICk7CgkJCX0sCgkJCXRlYXJkb3duOiBmdW5jdGlvbigpIHsKCQkJCXZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKCQkJCQlhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKSAtIDE7CgoJCQkJaWYgKCAhYXR0YWNoZXMgKSB7CgkJCQkJZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsKCQkJCQlkYXRhUHJpdi5yZW1vdmUoIGRvYywgZml4ICk7CgoJCQkJfSBlbHNlIHsKCQkJCQlkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCBhdHRhY2hlcyApOwoJCQkJfQoJCQl9CgkJfTsKCX0gKTsKfQp2YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247Cgp2YXIgbm9uY2UgPSBEYXRlLm5vdygpOwoKdmFyIHJxdWVyeSA9ICggL1w/LyApOwoKCgovLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nCmpRdWVyeS5wYXJzZVhNTCA9IGZ1bmN0aW9uKCBkYXRhICkgewoJdmFyIHhtbDsKCWlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICJzdHJpbmciICkgewoJCXJldHVybiBudWxsOwoJfQoKCS8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5CgkvLyBJRSB0aHJvd3Mgb24gcGFyc2VGcm9tU3RyaW5nIHdpdGggaW52YWxpZCBpbnB1dC4KCXRyeSB7CgkJeG1sID0gKCBuZXcgd2luZG93LkRPTVBhcnNlcigpICkucGFyc2VGcm9tU3RyaW5nKCBkYXRhLCAidGV4dC94bWwiICk7Cgl9IGNhdGNoICggZSApIHsKCQl4bWwgPSB1bmRlZmluZWQ7Cgl9CgoJaWYgKCAheG1sIHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggInBhcnNlcmVycm9yIiApLmxlbmd0aCApIHsKCQlqUXVlcnkuZXJyb3IoICJJbnZhbGlkIFhNTDogIiArIGRhdGEgKTsKCX0KCXJldHVybiB4bWw7Cn07CgoKdmFyCglyYnJhY2tldCA9IC9cW1xdJC8sCglyQ1JMRiA9IC9ccj9cbi9nLAoJcnN1Ym1pdHRlclR5cGVzID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLAoJcnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pOwoKZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkgewoJdmFyIG5hbWU7CgoJaWYgKCBBcnJheS5pc0FycmF5KCBvYmogKSApIHsKCgkJLy8gU2VyaWFsaXplIGFycmF5IGl0ZW0uCgkJalF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7CgkJCWlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7CgoJCQkJLy8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLgoJCQkJYWRkKCBwcmVmaXgsIHYgKTsKCgkJCX0gZWxzZSB7CgoJCQkJLy8gSXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51bWVyaWMgaW5kZXguCgkJCQlidWlsZFBhcmFtcygKCQkJCQlwcmVmaXggKyAiWyIgKyAoIHR5cGVvZiB2ID09PSAib2JqZWN0IiAmJiB2ICE9IG51bGwgPyBpIDogIiIgKSArICJdIiwKCQkJCQl2LAoJCQkJCXRyYWRpdGlvbmFsLAoJCQkJCWFkZAoJCQkJKTsKCQkJfQoJCX0gKTsKCgl9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgdG9UeXBlKCBvYmogKSA9PT0gIm9iamVjdCIgKSB7CgoJCS8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4KCQlmb3IgKCBuYW1lIGluIG9iaiApIHsKCQkJYnVpbGRQYXJhbXMoIHByZWZpeCArICJbIiArIG5hbWUgKyAiXSIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJfQoKCX0gZWxzZSB7CgoJCS8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KCQlhZGQoIHByZWZpeCwgb2JqICk7Cgl9Cn0KCi8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mCi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZwpqUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7Cgl2YXIgcHJlZml4LAoJCXMgPSBbXSwKCQlhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7CgoJCQkvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHVzZSBpdHMgcmV0dXJuIHZhbHVlCgkJCXZhciB2YWx1ZSA9IGlzRnVuY3Rpb24oIHZhbHVlT3JGdW5jdGlvbiApID8KCQkJCXZhbHVlT3JGdW5jdGlvbigpIDoKCQkJCXZhbHVlT3JGdW5jdGlvbjsKCgkJCXNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgIj0iICsKCQkJCWVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKTsKCQl9OwoKCS8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuCglpZiAoIEFycmF5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7CgoJCS8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50cwoJCWpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHsKCQkJYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKCQl9ICk7CgoJfSBlbHNlIHsKCgkJLy8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgIm9sZCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyCgkJLy8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuCgkJZm9yICggcHJlZml4IGluIGEgKSB7CgkJCWJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJfQoJfQoKCS8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KCXJldHVybiBzLmpvaW4oICImIiApOwp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJc2VyaWFsaXplOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5LnBhcmFtKCB0aGlzLnNlcmlhbGl6ZUFycmF5KCkgKTsKCX0sCglzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHsKCgkJCS8vIENhbiBhZGQgcHJvcEhvb2sgZm9yICJlbGVtZW50cyIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzCgkJCXZhciBlbGVtZW50cyA9IGpRdWVyeS5wcm9wKCB0aGlzLCAiZWxlbWVudHMiICk7CgkJCXJldHVybiBlbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkoIGVsZW1lbnRzICkgOiB0aGlzOwoJCX0gKQoJCS5maWx0ZXIoIGZ1bmN0aW9uKCkgewoJCQl2YXIgdHlwZSA9IHRoaXMudHlwZTsKCgkJCS8vIFVzZSAuaXMoICI6ZGlzYWJsZWQiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3MKCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoICI6ZGlzYWJsZWQiICkgJiYKCQkJCXJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiYKCQkJCSggdGhpcy5jaGVja2VkIHx8ICFyY2hlY2thYmxlVHlwZS50ZXN0KCB0eXBlICkgKTsKCQl9ICkKCQkubWFwKCBmdW5jdGlvbiggaSwgZWxlbSApIHsKCQkJdmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpOwoKCQkJaWYgKCB2YWwgPT0gbnVsbCApIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgoJCQlpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkgewoJCQkJcmV0dXJuIGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApIHsKCQkJCQlyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsICJcclxuIiApIH07CgkJCQl9ICk7CgkJCX0KCgkJCXJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKCQl9ICkuZ2V0KCk7Cgl9Cn0gKTsKCgp2YXIKCXIyMCA9IC8lMjAvZywKCXJoYXNoID0gLyMuKiQvLAoJcmFudGlDYWNoZSA9IC8oWz8mXSlfPVteJl0qLywKCXJoZWFkZXJzID0gL14oLio/KTpbIFx0XSooW15cclxuXSopJC9tZywKCgkvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb24KCXJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sCglybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLywKCXJwcm90b2NvbCA9IC9eXC9cLy8sCgoJLyogUHJlZmlsdGVycwoJICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSkKCSAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6CgkgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0CgkgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCgkgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCgkgKi8KCXByZWZpbHRlcnMgPSB7fSwKCgkvKiBUcmFuc3BvcnRzIGJpbmRpbmdzCgkgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gIioiIGlmIG5lZWRlZAoJICovCgl0cmFuc3BvcnRzID0ge30sCgoJLy8gQXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAoIzEwMDk4KTsgbXVzdCBhcHBlYXNlIGxpbnQgYW5kIGV2YWRlIGNvbXByZXNzaW9uCglhbGxUeXBlcyA9ICIqLyIuY29uY2F0KCAiKiIgKSwKCgkvLyBBbmNob3IgdGFnIGZvciBwYXJzaW5nIHRoZSBkb2N1bWVudCBvcmlnaW4KCW9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOwoJb3JpZ2luQW5jaG9yLmhyZWYgPSBsb2NhdGlvbi5ocmVmOwoKLy8gQmFzZSAiY29uc3RydWN0b3IiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnQKZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7CgoJLy8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byAiKiIKCXJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgewoKCQlpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09ICJzdHJpbmciICkgewoJCQlmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uOwoJCQlkYXRhVHlwZUV4cHJlc3Npb24gPSAiKiI7CgkJfQoKCQl2YXIgZGF0YVR5cGUsCgkJCWkgPSAwLAoJCQlkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdOwoKCQlpZiAoIGlzRnVuY3Rpb24oIGZ1bmMgKSApIHsKCgkJCS8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb24KCQkJd2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkgewoKCQkJCS8vIFByZXBlbmQgaWYgcmVxdWVzdGVkCgkJCQlpZiAoIGRhdGFUeXBlWyAwIF0gPT09ICIrIiApIHsKCQkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlLnNsaWNlKCAxICkgfHwgIioiOwoJCQkJCSggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApOwoKCQkJCS8vIE90aGVyd2lzZSBhcHBlbmQKCQkJCX0gZWxzZSB7CgkJCQkJKCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10gKS5wdXNoKCBmdW5jICk7CgkJCQl9CgkJCX0KCQl9Cgl9Owp9CgovLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHsKCgl2YXIgaW5zcGVjdGVkID0ge30sCgkJc2Vla2luZ1RyYW5zcG9ydCA9ICggc3RydWN0dXJlID09PSB0cmFuc3BvcnRzICk7CgoJZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7CgkJdmFyIHNlbGVjdGVkOwoJCWluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7CgkJalF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHsKCQkJdmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTsKCQkJaWYgKCB0eXBlb2YgZGF0YVR5cGVPclRyYW5zcG9ydCA9PT0gInN0cmluZyIgJiYKCQkJCSFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHsKCgkJCQlvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCQlpbnNwZWN0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0gZWxzZSBpZiAoIHNlZWtpbmdUcmFuc3BvcnQgKSB7CgkJCQlyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCX0KCQl9ICk7CgkJcmV0dXJuIHNlbGVjdGVkOwoJfQoKCXJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgIioiIF0gJiYgaW5zcGVjdCggIioiICk7Cn0KCi8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXggb3B0aW9ucwovLyB0aGF0IHRha2VzICJmbGF0IiBvcHRpb25zIChub3QgdG8gYmUgZGVlcCBleHRlbmRlZCkKLy8gRml4ZXMgIzk4ODcKZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7Cgl2YXIga2V5LCBkZWVwLAoJCWZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTsKCglmb3IgKCBrZXkgaW4gc3JjICkgewoJCWlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgewoJCQkoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtleSBdOwoJCX0KCX0KCWlmICggZGVlcCApIHsKCQlqUXVlcnkuZXh0ZW5kKCB0cnVlLCB0YXJnZXQsIGRlZXAgKTsKCX0KCglyZXR1cm4gdGFyZ2V0Owp9CgovKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6CiAqIC0gZmluZHMgdGhlIHJpZ2h0IGRhdGFUeXBlIChtZWRpYXRlcyBiZXR3ZWVuIGNvbnRlbnQtdHlwZSBhbmQgZXhwZWN0ZWQgZGF0YVR5cGUpCiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZQogKi8KZnVuY3Rpb24gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIHsKCgl2YXIgY3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsCgkJY29udGVudHMgPSBzLmNvbnRlbnRzLAoJCWRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzOwoKCS8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGluIHRoZSBwcm9jZXNzCgl3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSAiKiIgKSB7CgkJZGF0YVR5cGVzLnNoaWZ0KCk7CgkJaWYgKCBjdCA9PT0gdW5kZWZpbmVkICkgewoJCQljdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJDb250ZW50LVR5cGUiICk7CgkJfQoJfQoKCS8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZQoJaWYgKCBjdCApIHsKCQlmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkgewoJCQlpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkgewoJCQkJZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZQoJaWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7CgkJZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdOwoJfSBlbHNlIHsKCgkJLy8gVHJ5IGNvbnZlcnRpYmxlIGRhdGFUeXBlcwoJCWZvciAoIHR5cGUgaW4gcmVzcG9uc2VzICkgewoJCQlpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyAiICIgKyBkYXRhVHlwZXNbIDAgXSBdICkgewoJCQkJZmluYWxEYXRhVHlwZSA9IHR5cGU7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoICFmaXJzdERhdGFUeXBlICkgewoJCQkJZmlyc3REYXRhVHlwZSA9IHR5cGU7CgkJCX0KCQl9CgoJCS8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZQoJCWZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7Cgl9CgoJLy8gSWYgd2UgZm91bmQgYSBkYXRhVHlwZQoJLy8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWQKCS8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKCWlmICggZmluYWxEYXRhVHlwZSApIHsKCQlpZiAoIGZpbmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkgewoJCQlkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApOwoJCX0KCQlyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07Cgl9Cn0KCi8qIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2UKICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlCiAqLwpmdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKSB7Cgl2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldiwKCQljb252ZXJ0ZXJzID0ge30sCgoJCS8vIFdvcmsgd2l0aCBhIGNvcHkgb2YgZGF0YVR5cGVzIGluIGNhc2Ugd2UgbmVlZCB0byBtb2RpZnkgaXQgZm9yIGNvbnZlcnNpb24KCQlkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcy5zbGljZSgpOwoKCS8vIENyZWF0ZSBjb252ZXJ0ZXJzIG1hcCB3aXRoIGxvd2VyY2FzZWQga2V5cwoJaWYgKCBkYXRhVHlwZXNbIDEgXSApIHsKCQlmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHsKCQkJY29udmVydGVyc1sgY29udi50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGNvbnYgXTsKCQl9Cgl9CgoJY3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpOwoKCS8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlCgl3aGlsZSAoIGN1cnJlbnQgKSB7CgoJCWlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkgewoJCQlqcVhIUlsgcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdIF0gPSByZXNwb25zZTsKCQl9CgoJCS8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkCgkJaWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkgewoJCQlyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTsKCQl9CgoJCXByZXYgPSBjdXJyZW50OwoJCWN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTsKCgkJaWYgKCBjdXJyZW50ICkgewoKCQkJLy8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0bwoJCQlpZiAoIGN1cnJlbnQgPT09ICIqIiApIHsKCgkJCQljdXJyZW50ID0gcHJldjsKCgkJCS8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1cnJlbnQKCQkJfSBlbHNlIGlmICggcHJldiAhPT0gIioiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7CgoJCQkJLy8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXIKCQkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgIiAiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbICIqICIgKyBjdXJyZW50IF07CgoJCQkJLy8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXIKCQkJCWlmICggIWNvbnYgKSB7CgkJCQkJZm9yICggY29udjIgaW4gY29udmVydGVycyApIHsKCgkJCQkJCS8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudAoJCQkJCQl0bXAgPSBjb252Mi5zcGxpdCggIiAiICk7CgkJCQkJCWlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7CgoJCQkJCQkJLy8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0CgkJCQkJCQljb252ID0gY29udmVydGVyc1sgcHJldiArICIgIiArIHRtcFsgMCBdIF0gfHwKCQkJCQkJCQljb252ZXJ0ZXJzWyAiKiAiICsgdG1wWyAwIF0gXTsKCQkJCQkJCWlmICggY29udiApIHsKCgkJCQkJCQkJLy8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVycwoJCQkJCQkJCWlmICggY29udiA9PT0gdHJ1ZSApIHsKCQkJCQkJCQkJY29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07CgoJCQkJCQkJCS8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGUKCQkJCQkJCQl9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkgewoJCQkJCQkJCQljdXJyZW50ID0gdG1wWyAwIF07CgkJCQkJCQkJCWRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApOwoJCQkJCQkJCX0KCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQkvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSkKCQkJCWlmICggY29udiAhPT0gdHJ1ZSApIHsKCgkJCQkJLy8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbQoJCQkJCWlmICggY29udiAmJiBzLnRocm93cyApIHsKCQkJCQkJcmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXRyeSB7CgkJCQkJCQlyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7CgkJCQkJCX0gY2F0Y2ggKCBlICkgewoJCQkJCQkJcmV0dXJuIHsKCQkJCQkJCQlzdGF0ZTogInBhcnNlcmVycm9yIiwKCQkJCQkJCQllcnJvcjogY29udiA/IGUgOiAiTm8gY29udmVyc2lvbiBmcm9tICIgKyBwcmV2ICsgIiB0byAiICsgY3VycmVudAoJCQkJCQkJfTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4geyBzdGF0ZTogInN1Y2Nlc3MiLCBkYXRhOiByZXNwb25zZSB9Owp9CgpqUXVlcnkuZXh0ZW5kKCB7CgoJLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzCglhY3RpdmU6IDAsCgoJLy8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdAoJbGFzdE1vZGlmaWVkOiB7fSwKCWV0YWc6IHt9LAoKCWFqYXhTZXR0aW5nczogewoJCXVybDogbG9jYXRpb24uaHJlZiwKCQl0eXBlOiAiR0VUIiwKCQlpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBsb2NhdGlvbi5wcm90b2NvbCApLAoJCWdsb2JhbDogdHJ1ZSwKCQlwcm9jZXNzRGF0YTogdHJ1ZSwKCQlhc3luYzogdHJ1ZSwKCQljb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsCgoJCS8qCgkJdGltZW91dDogMCwKCQlkYXRhOiBudWxsLAoJCWRhdGFUeXBlOiBudWxsLAoJCXVzZXJuYW1lOiBudWxsLAoJCXBhc3N3b3JkOiBudWxsLAoJCWNhY2hlOiBudWxsLAoJCXRocm93czogZmFsc2UsCgkJdHJhZGl0aW9uYWw6IGZhbHNlLAoJCWhlYWRlcnM6IHt9LAoJCSovCgoJCWFjY2VwdHM6IHsKCQkJIioiOiBhbGxUeXBlcywKCQkJdGV4dDogInRleHQvcGxhaW4iLAoJCQlodG1sOiAidGV4dC9odG1sIiwKCQkJeG1sOiAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsCgkJCWpzb246ICJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiCgkJfSwKCgkJY29udGVudHM6IHsKCQkJeG1sOiAvXGJ4bWxcYi8sCgkJCWh0bWw6IC9cYmh0bWwvLAoJCQlqc29uOiAvXGJqc29uXGIvCgkJfSwKCgkJcmVzcG9uc2VGaWVsZHM6IHsKCQkJeG1sOiAicmVzcG9uc2VYTUwiLAoJCQl0ZXh0OiAicmVzcG9uc2VUZXh0IiwKCQkJanNvbjogInJlc3BvbnNlSlNPTiIKCQl9LAoKCQkvLyBEYXRhIGNvbnZlcnRlcnMKCQkvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgIioiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZQoJCWNvbnZlcnRlcnM6IHsKCgkJCS8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dAoJCQkiKiB0ZXh0IjogU3RyaW5nLAoKCQkJLy8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pCgkJCSJ0ZXh0IGh0bWwiOiB0cnVlLAoKCQkJLy8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvbgoJCQkidGV4dCBqc29uIjogSlNPTi5wYXJzZSwKCgkJCS8vIFBhcnNlIHRleHQgYXMgeG1sCgkJCSJ0ZXh0IHhtbCI6IGpRdWVyeS5wYXJzZVhNTAoJCX0sCgoJCS8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6CgkJLy8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZgoJCS8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlCgkJLy8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpCgkJZmxhdE9wdGlvbnM6IHsKCQkJdXJsOiB0cnVlLAoJCQljb250ZXh0OiB0cnVlCgkJfQoJfSwKCgkvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldAoJLy8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLgoJLy8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy4KCWFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7CgkJcmV0dXJuIHNldHRpbmdzID8KCgkJCS8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0CgkJCWFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDoKCgkJCS8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3MKCQkJYWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7Cgl9LAoKCWFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLAoJYWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksCgoJLy8gTWFpbiBtZXRob2QKCWFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7CgoJCS8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlCgkJaWYgKCB0eXBlb2YgdXJsID09PSAib2JqZWN0IiApIHsKCQkJb3B0aW9ucyA9IHVybDsKCQkJdXJsID0gdW5kZWZpbmVkOwoJCX0KCgkJLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3QKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCgkJdmFyIHRyYW5zcG9ydCwKCgkJCS8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW0KCQkJY2FjaGVVUkwsCgoJCQkvLyBSZXNwb25zZSBoZWFkZXJzCgkJCXJlc3BvbnNlSGVhZGVyc1N0cmluZywKCQkJcmVzcG9uc2VIZWFkZXJzLAoKCQkJLy8gdGltZW91dCBoYW5kbGUKCQkJdGltZW91dFRpbWVyLAoKCQkJLy8gVXJsIGNsZWFudXAgdmFyCgkJCXVybEFuY2hvciwKCgkJCS8vIFJlcXVlc3Qgc3RhdGUgKGJlY29tZXMgZmFsc2UgdXBvbiBzZW5kIGFuZCB0cnVlIHVwb24gY29tcGxldGlvbikKCQkJY29tcGxldGVkLAoKCQkJLy8gVG8ga25vdyBpZiBnbG9iYWwgZXZlbnRzIGFyZSB0byBiZSBkaXNwYXRjaGVkCgkJCWZpcmVHbG9iYWxzLAoKCQkJLy8gTG9vcCB2YXJpYWJsZQoJCQlpLAoKCQkJLy8gdW5jYWNoZWQgcGFydCBvZiB0aGUgdXJsCgkJCXVuY2FjaGVkLAoKCQkJLy8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdAoJCQlzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSwKCgkJCS8vIENhbGxiYWNrcyBjb250ZXh0CgkJCWNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLAoKCQkJLy8gQ29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cyBpcyBjYWxsYmFja0NvbnRleHQgaWYgaXQgaXMgYSBET00gbm9kZSBvciBqUXVlcnkgY29sbGVjdGlvbgoJCQlnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiYKCQkJCSggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/CgkJCQkJalF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6CgkJCQkJalF1ZXJ5LmV2ZW50LAoKCQkJLy8gRGVmZXJyZWRzCgkJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksCgoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCQlzdGF0dXNDb2RlID0gcy5zdGF0dXNDb2RlIHx8IHt9LAoKCQkJLy8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSkKCQkJcmVxdWVzdEhlYWRlcnMgPSB7fSwKCQkJcmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LAoKCQkJLy8gRGVmYXVsdCBhYm9ydCBtZXNzYWdlCgkJCXN0ckFib3J0ID0gImNhbmNlbGVkIiwKCgkJCS8vIEZha2UgeGhyCgkJCWpxWEhSID0gewoJCQkJcmVhZHlTdGF0ZTogMCwKCgkJCQkvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkCgkJCQlnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24oIGtleSApIHsKCQkJCQl2YXIgbWF0Y2g7CgkJCQkJaWYgKCBjb21wbGV0ZWQgKSB7CgkJCQkJCWlmICggIXJlc3BvbnNlSGVhZGVycyApIHsKCQkJCQkJCXJlc3BvbnNlSGVhZGVycyA9IHt9OwoJCQkJCQkJd2hpbGUgKCAoIG1hdGNoID0gcmhlYWRlcnMuZXhlYyggcmVzcG9uc2VIZWFkZXJzU3RyaW5nICkgKSApIHsKCQkJCQkJCQlyZXNwb25zZUhlYWRlcnNbIG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQltYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTsKCQkJCQl9CgkJCQkJcmV0dXJuIG1hdGNoID09IG51bGwgPyBudWxsIDogbWF0Y2g7CgkJCQl9LAoKCQkJCS8vIFJhdyBzdHJpbmcKCQkJCWdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIGNvbXBsZXRlZCA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7CgkJCQl9LAoKCQkJCS8vIENhY2hlcyB0aGUgaGVhZGVyCgkJCQlzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJCQkJaWYgKCBjb21wbGV0ZWQgPT0gbnVsbCApIHsKCQkJCQkJbmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdID0KCQkJCQkJCXJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8IG5hbWU7CgkJCQkJCXJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyCgkJCQlvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkgewoJCQkJCQlzLm1pbWVUeXBlID0gdHlwZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCgkJCQlzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkgewoJCQkJCXZhciBjb2RlOwoJCQkJCWlmICggbWFwICkgewoJCQkJCQlpZiAoIGNvbXBsZXRlZCApIHsKCgkJCQkJCQkvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3MKCQkJCQkJCWpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApOwoJCQkJCQl9IGVsc2UgewoKCQkJCQkJCS8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzCgkJCQkJCQlmb3IgKCBjb2RlIGluIG1hcCApIHsKCQkJCQkJCQlzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0sCgoJCQkJLy8gQ2FuY2VsIHRoZSByZXF1ZXN0CgkJCQlhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7CgkJCQkJdmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7CgkJCQkJaWYgKCB0cmFuc3BvcnQgKSB7CgkJCQkJCXRyYW5zcG9ydC5hYm9ydCggZmluYWxUZXh0ICk7CgkJCQkJfQoJCQkJCWRvbmUoIDAsIGZpbmFsVGV4dCApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfQoJCQl9OwoKCQkvLyBBdHRhY2ggZGVmZXJyZWRzCgkJZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKTsKCgkJLy8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpCgkJLy8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSkKCQkvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGUKCQlzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgbG9jYXRpb24uaHJlZiApICsgIiIgKQoJCQkucmVwbGFjZSggcnByb3RvY29sLCBsb2NhdGlvbi5wcm90b2NvbCArICIvLyIgKTsKCgkJLy8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0CgkJcy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTsKCgkJLy8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdAoJCXMuZGF0YVR5cGVzID0gKCBzLmRhdGFUeXBlIHx8ICIqIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgoJCS8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB0aGUgb3JpZ2luIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgb3JpZ2luLgoJCWlmICggcy5jcm9zc0RvbWFpbiA9PSBudWxsICkgewoJCQl1cmxBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiYSIgKTsKCgkJCS8vIFN1cHBvcnQ6IElFIDw9OCAtIDExLCBFZGdlIDEyIC0gMTUKCQkJLy8gSUUgdGhyb3dzIGV4Y2VwdGlvbiBvbiBhY2Nlc3NpbmcgdGhlIGhyZWYgcHJvcGVydHkgaWYgdXJsIGlzIG1hbGZvcm1lZCwKCQkJLy8gZS5nLiBodHRwOi8vZXhhbXBsZS5jb206ODB4LwoJCQl0cnkgewoJCQkJdXJsQW5jaG9yLmhyZWYgPSBzLnVybDsKCgkJCQkvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSBvbmx5CgkJCQkvLyBBbmNob3IncyBob3N0IHByb3BlcnR5IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZQoJCQkJdXJsQW5jaG9yLmhyZWYgPSB1cmxBbmNob3IuaHJlZjsKCQkJCXMuY3Jvc3NEb21haW4gPSBvcmlnaW5BbmNob3IucHJvdG9jb2wgKyAiLy8iICsgb3JpZ2luQW5jaG9yLmhvc3QgIT09CgkJCQkJdXJsQW5jaG9yLnByb3RvY29sICsgIi8vIiArIHVybEFuY2hvci5ob3N0OwoJCQl9IGNhdGNoICggZSApIHsKCgkJCQkvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBpdCBpcyBjcm9zc0RvbWFpbiwKCQkJCS8vIGl0IGNhbiBiZSByZWplY3RlZCBieSB0aGUgdHJhbnNwb3J0IGlmIGl0IGlzIGludmFsaWQKCQkJCXMuY3Jvc3NEb21haW4gPSB0cnVlOwoJCQl9CgkJfQoKCQkvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmcKCQlpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09ICJzdHJpbmciICkgewoJCQlzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApOwoJCX0KCgkJLy8gQXBwbHkgcHJlZmlsdGVycwoJCWluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApOwoKCQkvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZQoJCWlmICggY29tcGxldGVkICkgewoJCQlyZXR1cm4ganFYSFI7CgkJfQoKCQkvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0bwoJCS8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICgjMTUxMTgpCgkJZmlyZUdsb2JhbHMgPSBqUXVlcnkuZXZlbnQgJiYgcy5nbG9iYWw7CgoJCS8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKCQlpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CgkJfQoKCQkvLyBVcHBlcmNhc2UgdGhlIHR5cGUKCQlzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTsKCgkJLy8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnQKCQlzLmhhc0NvbnRlbnQgPSAhcm5vQ29udGVudC50ZXN0KCBzLnR5cGUgKTsKCgkJLy8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlCgkJLy8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uCgkJLy8gUmVtb3ZlIGhhc2ggdG8gc2ltcGxpZnkgdXJsIG1hbmlwdWxhdGlvbgoJCWNhY2hlVVJMID0gcy51cmwucmVwbGFjZSggcmhhc2gsICIiICk7CgoJCS8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50CgkJaWYgKCAhcy5oYXNDb250ZW50ICkgewoKCQkJLy8gUmVtZW1iZXIgdGhlIGhhc2ggc28gd2UgY2FuIHB1dCBpdCBiYWNrCgkJCXVuY2FjaGVkID0gcy51cmwuc2xpY2UoIGNhY2hlVVJMLmxlbmd0aCApOwoKCQkJLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUgYW5kIHNob3VsZCBiZSBwcm9jZXNzZWQsIGFwcGVuZCBkYXRhIHRvIHVybAoJCQlpZiAoIHMuZGF0YSAmJiAoIHMucHJvY2Vzc0RhdGEgfHwgdHlwZW9mIHMuZGF0YSA9PT0gInN0cmluZyIgKSApIHsKCQkJCWNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyAiJiIgOiAiPyIgKSArIHMuZGF0YTsKCgkJCQkvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5CgkJCQlkZWxldGUgcy5kYXRhOwoJCQl9CgoJCQkvLyBBZGQgb3IgdXBkYXRlIGFudGktY2FjaGUgcGFyYW0gaWYgbmVlZGVkCgkJCWlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7CgkJCQljYWNoZVVSTCA9IGNhY2hlVVJMLnJlcGxhY2UoIHJhbnRpQ2FjaGUsICIkMSIgKTsKCQkJCXVuY2FjaGVkID0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/ICImIiA6ICI/IiApICsgIl89IiArICggbm9uY2UrKyApICsgdW5jYWNoZWQ7CgkJCX0KCgkJCS8vIFB1dCBoYXNoIGFuZCBhbnRpLWNhY2hlIG9uIHRoZSBVUkwgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZCAoZ2gtMTczMikKCQkJcy51cmwgPSBjYWNoZVVSTCArIHVuY2FjaGVkOwoKCQkvLyBDaGFuZ2UgJyUyMCcgdG8gJysnIGlmIHRoaXMgaXMgZW5jb2RlZCBmb3JtIGJvZHkgY29udGVudCAoZ2gtMjY1OCkKCQl9IGVsc2UgaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJgoJCQkoIHMuY29udGVudFR5cGUgfHwgIiIgKS5pbmRleE9mKCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiApID09PSAwICkgewoJCQlzLmRhdGEgPSBzLmRhdGEucmVwbGFjZSggcjIwLCAiKyIgKTsKCQl9CgoJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCgkJaWYgKCBzLmlmTW9kaWZpZWQgKSB7CgkJCWlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Nb2RpZmllZC1TaW5jZSIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKTsKCQkJfQoJCQlpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkgewoJCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIklmLU5vbmUtTWF0Y2giLCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKCQlpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHsKCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUgKTsKCQl9CgoJCS8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGUKCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKAoJCQkiQWNjZXB0IiwKCQkJcy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/CgkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSArCgkJCQkJKCBzLmRhdGFUeXBlc1sgMCBdICE9PSAiKiIgPyAiLCAiICsgYWxsVHlwZXMgKyAiOyBxPTAuMDEiIDogIiIgKSA6CgkJCQlzLmFjY2VwdHNbICIqIiBdCgkJKTsKCgkJLy8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uCgkJZm9yICggaSBpbiBzLmhlYWRlcnMgKSB7CgkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIGksIHMuaGVhZGVyc1sgaSBdICk7CgkJfQoKCQkvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0CgkJaWYgKCBzLmJlZm9yZVNlbmQgJiYKCQkJKCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBjb21wbGV0ZWQgKSApIHsKCgkJCS8vIEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkgYW5kIHJldHVybgoJCQlyZXR1cm4ganFYSFIuYWJvcnQoKTsKCQl9CgoJCS8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvbgoJCXN0ckFib3J0ID0gImFib3J0IjsKCgkJLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCgkJY29tcGxldGVEZWZlcnJlZC5hZGQoIHMuY29tcGxldGUgKTsKCQlqcVhIUi5kb25lKCBzLnN1Y2Nlc3MgKTsKCQlqcVhIUi5mYWlsKCBzLmVycm9yICk7CgoJCS8vIEdldCB0cmFuc3BvcnQKCQl0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKCgkJLy8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0CgkJaWYgKCAhdHJhbnNwb3J0ICkgewoJCQlkb25lKCAtMSwgIk5vIFRyYW5zcG9ydCIgKTsKCQl9IGVsc2UgewoJCQlqcVhIUi5yZWFkeVN0YXRlID0gMTsKCgkJCS8vIFNlbmQgZ2xvYmFsIGV2ZW50CgkJCWlmICggZmlyZUdsb2JhbHMgKSB7CgkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhTZW5kIiwgWyBqcVhIUiwgcyBdICk7CgkJCX0KCgkJCS8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGFqYXhTZW5kLCBzdG9wIHRoZXJlCgkJCWlmICggY29tcGxldGVkICkgewoJCQkJcmV0dXJuIGpxWEhSOwoJCQl9CgoJCQkvLyBUaW1lb3V0CgkJCWlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkgewoJCQkJdGltZW91dFRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJCWpxWEhSLmFib3J0KCAidGltZW91dCIgKTsKCQkJCX0sIHMudGltZW91dCApOwoJCQl9CgoJCQl0cnkgewoJCQkJY29tcGxldGVkID0gZmFsc2U7CgkJCQl0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTsKCQkJfSBjYXRjaCAoIGUgKSB7CgoJCQkJLy8gUmV0aHJvdyBwb3N0LWNvbXBsZXRpb24gZXhjZXB0aW9ucwoJCQkJaWYgKCBjb21wbGV0ZWQgKSB7CgkJCQkJdGhyb3cgZTsKCQkJCX0KCgkJCQkvLyBQcm9wYWdhdGUgb3RoZXJzIGFzIHJlc3VsdHMKCQkJCWRvbmUoIC0xLCBlICk7CgkJCX0KCQl9CgoJCS8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZQoJCWZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkgewoJCQl2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLAoJCQkJc3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7CgoJCQkvLyBJZ25vcmUgcmVwZWF0IGludm9jYXRpb25zCgkJCWlmICggY29tcGxldGVkICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQljb21wbGV0ZWQgPSB0cnVlOwoKCQkJLy8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHMKCQkJaWYgKCB0aW1lb3V0VGltZXIgKSB7CgkJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTsKCQkJfQoKCQkJLy8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb24KCQkJLy8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZCkKCQkJdHJhbnNwb3J0ID0gdW5kZWZpbmVkOwoKCQkJLy8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVycwoJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8ICIiOwoKCQkJLy8gU2V0IHJlYWR5U3RhdGUKCQkJanFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDsKCgkJCS8vIERldGVybWluZSBpZiBzdWNjZXNzZnVsCgkJCWlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0OwoKCQkJLy8gR2V0IHJlc3BvbnNlIGRhdGEKCQkJaWYgKCByZXNwb25zZXMgKSB7CgkJCQlyZXNwb25zZSA9IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTsKCQkJfQoKCQkJLy8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9uc2VYWFggZmllbGRzIGFyZSBhbHdheXMgc2V0KQoJCQlyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApOwoKCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmcKCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7CgoJCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KCQkJCWlmICggcy5pZk1vZGlmaWVkICkgewoJCQkJCW1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJMYXN0LU1vZGlmaWVkIiApOwoJCQkJCWlmICggbW9kaWZpZWQgKSB7CgkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKCQkJCQl9CgkJCQkJbW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggImV0YWciICk7CgkJCQkJaWYgKCBtb2RpZmllZCApIHsKCQkJCQkJalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gaWYgbm8gY29udGVudAoJCQkJaWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09ICJIRUFEIiApIHsKCQkJCQlzdGF0dXNUZXh0ID0gIm5vY29udGVudCI7CgoJCQkJLy8gaWYgbm90IG1vZGlmaWVkCgkJCQl9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHsKCQkJCQlzdGF0dXNUZXh0ID0gIm5vdG1vZGlmaWVkIjsKCgkJCQkvLyBJZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXQKCQkJCX0gZWxzZSB7CgkJCQkJc3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXRlOwoJCQkJCXN1Y2Nlc3MgPSByZXNwb25zZS5kYXRhOwoJCQkJCWVycm9yID0gcmVzcG9uc2UuZXJyb3I7CgkJCQkJaXNTdWNjZXNzID0gIWVycm9yOwoJCQkJfQoJCQl9IGVsc2UgewoKCQkJCS8vIEV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0IGFuZCBub3JtYWxpemUgZm9yIG5vbi1hYm9ydHMKCQkJCWVycm9yID0gc3RhdHVzVGV4dDsKCQkJCWlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkgewoJCQkJCXN0YXR1c1RleHQgPSAiZXJyb3IiOwoJCQkJCWlmICggc3RhdHVzIDwgMCApIHsKCQkJCQkJc3RhdHVzID0gMDsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIFNldCBkYXRhIGZvciB0aGUgZmFrZSB4aHIgb2JqZWN0CgkJCWpxWEhSLnN0YXR1cyA9IHN0YXR1czsKCQkJanFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyAiIjsKCgkJCS8vIFN1Y2Nlc3MvRXJyb3IKCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7CgkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhSIF0gKTsKCQkJfSBlbHNlIHsKCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApOwoJCQl9CgoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCQlqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7CgkJCXN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7CgoJCQlpZiAoIGZpcmVHbG9iYWxzICkgewoJCQkJZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/ICJhamF4U3VjY2VzcyIgOiAiYWpheEVycm9yIiwKCQkJCQlbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApOwoJCQl9CgoJCQkvLyBDb21wbGV0ZQoJCQljb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApOwoKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheENvbXBsZXRlIiwgWyBqcVhIUiwgcyBdICk7CgoJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJCQlpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkgewoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBqcVhIUjsKCX0sCgoJZ2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7CgkJcmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssICJqc29uIiApOwoJfSwKCglnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssICJzY3JpcHQiICk7Cgl9Cn0gKTsKCmpRdWVyeS5lYWNoKCBbICJnZXQiLCAicG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHsKCWpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCgkJLy8gU2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWQKCQlpZiAoIGlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9IHVuZGVmaW5lZDsKCQl9CgoJCS8vIFRoZSB1cmwgY2FuIGJlIGFuIG9wdGlvbnMgb2JqZWN0ICh3aGljaCB0aGVuIG11c3QgaGF2ZSAudXJsKQoJCXJldHVybiBqUXVlcnkuYWpheCggalF1ZXJ5LmV4dGVuZCggewoJCQl1cmw6IHVybCwKCQkJdHlwZTogbWV0aG9kLAoJCQlkYXRhVHlwZTogdHlwZSwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2sKCQl9LCBqUXVlcnkuaXNQbGFpbk9iamVjdCggdXJsICkgJiYgdXJsICkgKTsKCX07Cn0gKTsKCgpqUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsICkgewoJcmV0dXJuIGpRdWVyeS5hamF4KCB7CgkJdXJsOiB1cmwsCgoJCS8vIE1ha2UgdGhpcyBleHBsaWNpdCwgc2luY2UgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyB0aHJvdWdoIGFqYXhTZXR1cCAoIzExMjY0KQoJCXR5cGU6ICJHRVQiLAoJCWRhdGFUeXBlOiAic2NyaXB0IiwKCQljYWNoZTogdHJ1ZSwKCQlhc3luYzogZmFsc2UsCgkJZ2xvYmFsOiBmYWxzZSwKCQkidGhyb3dzIjogdHJ1ZQoJfSApOwp9OwoKCmpRdWVyeS5mbi5leHRlbmQoIHsKCXdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgewoJCXZhciB3cmFwOwoKCQlpZiAoIHRoaXNbIDAgXSApIHsKCQkJaWYgKCBpc0Z1bmN0aW9uKCBodG1sICkgKSB7CgkJCQlodG1sID0gaHRtbC5jYWxsKCB0aGlzWyAwIF0gKTsKCQkJfQoKCQkJLy8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmQKCQkJd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7CgoJCQlpZiAoIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgewoJCQkJd3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApOwoJCQl9CgoJCQl3cmFwLm1hcCggZnVuY3Rpb24oKSB7CgkJCQl2YXIgZWxlbSA9IHRoaXM7CgoJCQkJd2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkgewoJCQkJCWVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkOwoJCQkJfQoKCQkJCXJldHVybiBlbGVtOwoJCQl9ICkuYXBwZW5kKCB0aGlzICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJd3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHsKCQlpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwuY2FsbCggdGhpcywgaSApICk7CgkJCX0gKTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLAoJCQkJY29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7CgoJCQlpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHsKCQkJCWNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKCgkJCX0gZWxzZSB7CgkJCQlzZWxmLmFwcGVuZCggaHRtbCApOwoJCQl9CgkJfSApOwoJfSwKCgl3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsKCQl2YXIgaHRtbElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCBodG1sICk7CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkgewoJCQlqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBodG1sSXNGdW5jdGlvbiA/IGh0bWwuY2FsbCggdGhpcywgaSApIDogaHRtbCApOwoJCX0gKTsKCX0sCgoJdW53cmFwOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdGhpcy5wYXJlbnQoIHNlbGVjdG9yICkubm90KCAiYm9keSIgKS5lYWNoKCBmdW5jdGlvbigpIHsKCQkJalF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApOwoJCX0gKTsKCQlyZXR1cm4gdGhpczsKCX0KfSApOwoKCmpRdWVyeS5leHByLnBzZXVkb3MuaGlkZGVuID0gZnVuY3Rpb24oIGVsZW0gKSB7CglyZXR1cm4gIWpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSggZWxlbSApOwp9OwpqUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHsKCXJldHVybiAhISggZWxlbS5vZmZzZXRXaWR0aCB8fCBlbGVtLm9mZnNldEhlaWdodCB8fCBlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICk7Cn07CgoKCgpqUXVlcnkuYWpheFNldHRpbmdzLnhociA9IGZ1bmN0aW9uKCkgewoJdHJ5IHsKCQlyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpOwoJfSBjYXRjaCAoIGUgKSB7fQp9OwoKdmFyIHhoclN1Y2Nlc3NTdGF0dXMgPSB7CgoJCS8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwCgkJMDogMjAwLAoKCQkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJCS8vICMxNDUwOiBzb21ldGltZXMgSUUgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNAoJCTEyMjM6IDIwNAoJfSwKCXhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7CgpzdXBwb3J0LmNvcnMgPSAhIXhoclN1cHBvcnRlZCAmJiAoICJ3aXRoQ3JlZGVudGlhbHMiIGluIHhoclN1cHBvcnRlZCApOwpzdXBwb3J0LmFqYXggPSB4aHJTdXBwb3J0ZWQgPSAhIXhoclN1cHBvcnRlZDsKCmpRdWVyeS5hamF4VHJhbnNwb3J0KCBmdW5jdGlvbiggb3B0aW9ucyApIHsKCXZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjazsKCgkvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0CglpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJTdXBwb3J0ZWQgJiYgIW9wdGlvbnMuY3Jvc3NEb21haW4gKSB7CgkJcmV0dXJuIHsKCQkJc2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkgewoJCQkJdmFyIGksCgkJCQkJeGhyID0gb3B0aW9ucy54aHIoKTsKCgkJCQl4aHIub3BlbigKCQkJCQlvcHRpb25zLnR5cGUsCgkJCQkJb3B0aW9ucy51cmwsCgkJCQkJb3B0aW9ucy5hc3luYywKCQkJCQlvcHRpb25zLnVzZXJuYW1lLAoJCQkJCW9wdGlvbnMucGFzc3dvcmQKCQkJCSk7CgoJCQkJLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAoJCQkJaWYgKCBvcHRpb25zLnhockZpZWxkcyApIHsKCQkJCQlmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkgewoJCQkJCQl4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07CgkJCQkJfQoJCQkJfQoKCQkJCS8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWQKCQkJCWlmICggb3B0aW9ucy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHsKCQkJCQl4aHIub3ZlcnJpZGVNaW1lVHlwZSggb3B0aW9ucy5taW1lVHlwZSApOwoJCQkJfQoKCQkJCS8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyCgkJCQkvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlCgkJCQkvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLgoJCQkJLy8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApCgkJCQkvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC4KCQkJCWlmICggIW9wdGlvbnMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbICJYLVJlcXVlc3RlZC1XaXRoIiBdICkgewoJCQkJCWhlYWRlcnNbICJYLVJlcXVlc3RlZC1XaXRoIiBdID0gIlhNTEh0dHBSZXF1ZXN0IjsKCQkJCX0KCgkJCQkvLyBTZXQgaGVhZGVycwoJCQkJZm9yICggaSBpbiBoZWFkZXJzICkgewoJCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTsKCQkJCX0KCgkJCQkvLyBDYWxsYmFjawoJCQkJY2FsbGJhY2sgPSBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCQljYWxsYmFjayA9IGVycm9yQ2FsbGJhY2sgPSB4aHIub25sb2FkID0KCQkJCQkJCQl4aHIub25lcnJvciA9IHhoci5vbmFib3J0ID0geGhyLm9udGltZW91dCA9CgkJCQkJCQkJCXhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOwoKCQkJCQkJCWlmICggdHlwZSA9PT0gImFib3J0IiApIHsKCQkJCQkJCQl4aHIuYWJvcnQoKTsKCQkJCQkJCX0gZWxzZSBpZiAoIHR5cGUgPT09ICJlcnJvciIgKSB7CgoJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5CgkJCQkJCQkJLy8gT24gYSBtYW51YWwgbmF0aXZlIGFib3J0LCBJRTkgdGhyb3dzCgkJCQkJCQkJLy8gZXJyb3JzIG9uIGFueSBwcm9wZXJ0eSBhY2Nlc3MgdGhhdCBpcyBub3QgcmVhZHlTdGF0ZQoJCQkJCQkJCWlmICggdHlwZW9mIHhoci5zdGF0dXMgIT09ICJudW1iZXIiICkgewoJCQkJCQkJCQljb21wbGV0ZSggMCwgImVycm9yIiApOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCWNvbXBsZXRlKAoKCQkJCQkJCQkJCS8vIEZpbGU6IHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIDA7IHNlZSAjODYwNSwgIzE0MjA3CgkJCQkJCQkJCQl4aHIuc3RhdHVzLAoJCQkJCQkJCQkJeGhyLnN0YXR1c1RleHQKCQkJCQkJCQkJKTsKCQkJCQkJCQl9CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCWNvbXBsZXRlKAoJCQkJCQkJCQl4aHJTdWNjZXNzU3RhdHVzWyB4aHIuc3RhdHVzIF0gfHwgeGhyLnN0YXR1cywKCQkJCQkJCQkJeGhyLnN0YXR1c1RleHQsCgoJCQkJCQkJCQkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJCQkJCQkJCQkvLyBJRTkgaGFzIG5vIFhIUjIgYnV0IHRocm93cyBvbiBiaW5hcnkgKHRyYWMtMTE0MjYpCgkJCQkJCQkJCS8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpCgkJCQkJCQkJCSggeGhyLnJlc3BvbnNlVHlwZSB8fCAidGV4dCIgKSAhPT0gInRleHQiICB8fAoJCQkJCQkJCQl0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gInN0cmluZyIgPwoJCQkJCQkJCQkJeyBiaW5hcnk6IHhoci5yZXNwb25zZSB9IDoKCQkJCQkJCQkJCXsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LAoJCQkJCQkJCQl4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkKCQkJCQkJCQkpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfTsKCQkJCX07CgoJCQkJLy8gTGlzdGVuIHRvIGV2ZW50cwoJCQkJeGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7CgkJCQllcnJvckNhbGxiYWNrID0geGhyLm9uZXJyb3IgPSB4aHIub250aW1lb3V0ID0gY2FsbGJhY2soICJlcnJvciIgKTsKCgkJCQkvLyBTdXBwb3J0OiBJRSA5IG9ubHkKCQkJCS8vIFVzZSBvbnJlYWR5c3RhdGVjaGFuZ2UgdG8gcmVwbGFjZSBvbmFib3J0CgkJCQkvLyB0byBoYW5kbGUgdW5jYXVnaHQgYWJvcnRzCgkJCQlpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJeGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrOwoJCQkJfSBlbHNlIHsKCQkJCQl4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CgoJCQkJCQkvLyBDaGVjayByZWFkeVN0YXRlIGJlZm9yZSB0aW1lb3V0IGFzIGl0IGNoYW5nZXMKCQkJCQkJaWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHsKCgkJCQkJCQkvLyBBbGxvdyBvbmVycm9yIHRvIGJlIGNhbGxlZCBmaXJzdCwKCQkJCQkJCS8vIGJ1dCB0aGF0IHdpbGwgbm90IGhhbmRsZSBhIG5hdGl2ZSBhYm9ydAoJCQkJCQkJLy8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGUKCQkJCQkJCS8vIGFzIHhoci5vbmVycm9yIGNhbm5vdCBiZSBhY2Nlc3NlZAoJCQkJCQkJd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCQkJCWVycm9yQ2FsbGJhY2soKTsKCQkJCQkJCQl9CgkJCQkJCQl9ICk7CgkJCQkJCX0KCQkJCQl9OwoJCQkJfQoKCQkJCS8vIENyZWF0ZSB0aGUgYWJvcnQgY2FsbGJhY2sKCQkJCWNhbGxiYWNrID0gY2FsbGJhY2soICJhYm9ydCIgKTsKCgkJCQl0cnkgewoKCQkJCQkvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pCgkJCQkJeGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApOwoJCQkJfSBjYXRjaCAoIGUgKSB7CgoJCQkJCS8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0CgkJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQkJdGhyb3cgZTsKCQkJCQl9CgkJCQl9CgkJCX0sCgoJCQlhYm9ydDogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIGNhbGxiYWNrICkgewoJCQkJCWNhbGxiYWNrKCk7CgkJCQl9CgkJCX0KCQl9OwoJfQp9ICk7CgoKCgovLyBQcmV2ZW50IGF1dG8tZXhlY3V0aW9uIG9mIHNjcmlwdHMgd2hlbiBubyBleHBsaWNpdCBkYXRhVHlwZSB3YXMgcHJvdmlkZWQgKFNlZSBnaC0yNDMyKQpqUXVlcnkuYWpheFByZWZpbHRlciggZnVuY3Rpb24oIHMgKSB7CglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJcy5jb250ZW50cy5zY3JpcHQgPSBmYWxzZTsKCX0KfSApOwoKLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGUKalF1ZXJ5LmFqYXhTZXR1cCggewoJYWNjZXB0czogewoJCXNjcmlwdDogInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgIiArCgkJCSJhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiCgl9LAoJY29udGVudHM6IHsKCQlzY3JpcHQ6IC9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi8KCX0sCgljb252ZXJ0ZXJzOiB7CgkJInRleHQgc2NyaXB0IjogZnVuY3Rpb24oIHRleHQgKSB7CgkJCWpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0ICk7CgkJCXJldHVybiB0ZXh0OwoJCX0KCX0KfSApOwoKLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpbgpqUXVlcnkuYWpheFByZWZpbHRlciggInNjcmlwdCIsIGZ1bmN0aW9uKCBzICkgewoJaWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7CgkJcy5jYWNoZSA9IGZhbHNlOwoJfQoJaWYgKCBzLmNyb3NzRG9tYWluICkgewoJCXMudHlwZSA9ICJHRVQiOwoJfQp9ICk7CgovLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnQKalF1ZXJ5LmFqYXhUcmFuc3BvcnQoICJzY3JpcHQiLCBmdW5jdGlvbiggcyApIHsKCgkvLyBUaGlzIHRyYW5zcG9ydCBvbmx5IGRlYWxzIHdpdGggY3Jvc3MgZG9tYWluIHJlcXVlc3RzCglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJdmFyIHNjcmlwdCwgY2FsbGJhY2s7CgkJcmV0dXJuIHsKCQkJc2VuZDogZnVuY3Rpb24oIF8sIGNvbXBsZXRlICkgewoJCQkJc2NyaXB0ID0galF1ZXJ5KCAiPHNjcmlwdD4iICkucHJvcCggewoJCQkJCWNoYXJzZXQ6IHMuc2NyaXB0Q2hhcnNldCwKCQkJCQlzcmM6IHMudXJsCgkJCQl9ICkub24oCgkJCQkJImxvYWQgZXJyb3IiLAoJCQkJCWNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHsKCQkJCQkJc2NyaXB0LnJlbW92ZSgpOwoJCQkJCQljYWxsYmFjayA9IG51bGw7CgkJCQkJCWlmICggZXZ0ICkgewoJCQkJCQkJY29tcGxldGUoIGV2dC50eXBlID09PSAiZXJyb3IiID8gNDA0IDogMjAwLCBldnQudHlwZSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJKTsKCgkJCQkvLyBVc2UgbmF0aXZlIERPTSBtYW5pcHVsYXRpb24gdG8gYXZvaWQgb3VyIGRvbU1hbmlwIEFKQVggdHJpY2tlcnkKCQkJCWRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7CgkJCX0sCgkJCWFib3J0OiBmdW5jdGlvbigpIHsKCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJY2FsbGJhY2soKTsKCQkJCX0KCQkJfQoJCX07Cgl9Cn0gKTsKCgoKCnZhciBvbGRDYWxsYmFja3MgPSBbXSwKCXJqc29ucCA9IC8oPSlcPyg/PSZ8JCl8XD9cPy87CgovLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzCmpRdWVyeS5hamF4U2V0dXAoIHsKCWpzb25wOiAiY2FsbGJhY2siLAoJanNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7CgkJdmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyAiXyIgKyAoIG5vbmNlKysgKSApOwoJCXRoaXNbIGNhbGxiYWNrIF0gPSB0cnVlOwoJCXJldHVybiBjYWxsYmFjazsKCX0KfSApOwoKLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzCmpRdWVyeS5hamF4UHJlZmlsdGVyKCAianNvbiBqc29ucCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHsKCgl2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsCgkJanNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID8KCQkJInVybCIgOgoJCQl0eXBlb2Ygcy5kYXRhID09PSAic3RyaW5nIiAmJgoJCQkJKCBzLmNvbnRlbnRUeXBlIHx8ICIiICkKCQkJCQkuaW5kZXhPZiggImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIgKSA9PT0gMCAmJgoJCQkJcmpzb25wLnRlc3QoIHMuZGF0YSApICYmICJkYXRhIgoJCSk7CgoJLy8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzICJqc29ucCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXQKCWlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gImpzb25wIiApIHsKCgkJLy8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdAoJCWNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGlzRnVuY3Rpb24oIHMuanNvbnBDYWxsYmFjayApID8KCQkJcy5qc29ucENhbGxiYWNrKCkgOgoJCQlzLmpzb25wQ2FsbGJhY2s7CgoJCS8vIEluc2VydCBjYWxsYmFjayBpbnRvIHVybCBvciBmb3JtIGRhdGEKCQlpZiAoIGpzb25Qcm9wICkgewoJCQlzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsICIkMSIgKyBjYWxsYmFja05hbWUgKTsKCQl9IGVsc2UgaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHsKCQkJcy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/ICImIiA6ICI/IiApICsgcy5qc29ucCArICI9IiArIGNhbGxiYWNrTmFtZTsKCQl9CgoJCS8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb24KCQlzLmNvbnZlcnRlcnNbICJzY3JpcHQganNvbiIgXSA9IGZ1bmN0aW9uKCkgewoJCQlpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHsKCQkJCWpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgIiB3YXMgbm90IGNhbGxlZCIgKTsKCQkJfQoJCQlyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTsKCQl9OwoKCQkvLyBGb3JjZSBqc29uIGRhdGFUeXBlCgkJcy5kYXRhVHlwZXNbIDAgXSA9ICJqc29uIjsKCgkJLy8gSW5zdGFsbCBjYWxsYmFjawoJCW92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTsKCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7CgkJCXJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzOwoJCX07CgoJCS8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKQoJCWpxWEhSLmFsd2F5cyggZnVuY3Rpb24oKSB7CgoJCQkvLyBJZiBwcmV2aW91cyB2YWx1ZSBkaWRuJ3QgZXhpc3QgLSByZW1vdmUgaXQKCQkJaWYgKCBvdmVyd3JpdHRlbiA9PT0gdW5kZWZpbmVkICkgewoJCQkJalF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTsKCgkJCS8vIE90aGVyd2lzZSByZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlCgkJCX0gZWxzZSB7CgkJCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47CgkJCX0KCgkJCS8vIFNhdmUgYmFjayBhcyBmcmVlCgkJCWlmICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7CgoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kCgkJCQlzLmpzb25wQ2FsbGJhY2sgPSBvcmlnaW5hbFNldHRpbmdzLmpzb25wQ2FsbGJhY2s7CgoJCQkJLy8gU2F2ZSB0aGUgY2FsbGJhY2sgbmFtZSBmb3IgZnV0dXJlIHVzZQoJCQkJb2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApOwoJCQl9CgoJCQkvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2UKCQkJaWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBpc0Z1bmN0aW9uKCBvdmVyd3JpdHRlbiApICkgewoJCQkJb3ZlcndyaXR0ZW4oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTsKCQkJfQoKCQkJcmVzcG9uc2VDb250YWluZXIgPSBvdmVyd3JpdHRlbiA9IHVuZGVmaW5lZDsKCQl9ICk7CgoJCS8vIERlbGVnYXRlIHRvIHNjcmlwdAoJCXJldHVybiAic2NyaXB0IjsKCX0KfSApOwoKCgoKLy8gU3VwcG9ydDogU2FmYXJpIDggb25seQovLyBJbiBTYWZhcmkgOCBkb2N1bWVudHMgY3JlYXRlZCB2aWEgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50Ci8vIGNvbGxhcHNlIHNpYmxpbmcgZm9ybXM6IHRoZSBzZWNvbmQgb25lIGJlY29tZXMgYSBjaGlsZCBvZiB0aGUgZmlyc3Qgb25lLgovLyBCZWNhdXNlIG9mIHRoYXQsIHRoaXMgc2VjdXJpdHkgbWVhc3VyZSBoYXMgdG8gYmUgZGlzYWJsZWQgaW4gU2FmYXJpIDguCi8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzczMzcKc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgPSAoIGZ1bmN0aW9uKCkgewoJdmFyIGJvZHkgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoICIiICkuYm9keTsKCWJvZHkuaW5uZXJIVE1MID0gIjxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IjsKCXJldHVybiBib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09PSAyOwp9ICkoKTsKCgovLyBBcmd1bWVudCAiZGF0YSIgc2hvdWxkIGJlIHN0cmluZyBvZiBodG1sCi8vIGNvbnRleHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgY29udGV4dCwKLy8gZGVmYXVsdHMgdG8gZG9jdW1lbnQKLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZwpqUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIGtlZXBTY3JpcHRzICkgewoJaWYgKCB0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIgKSB7CgkJcmV0dXJuIFtdOwoJfQoJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gImJvb2xlYW4iICkgewoJCWtlZXBTY3JpcHRzID0gY29udGV4dDsKCQljb250ZXh0ID0gZmFsc2U7Cgl9CgoJdmFyIGJhc2UsIHBhcnNlZCwgc2NyaXB0czsKCglpZiAoICFjb250ZXh0ICkgewoKCQkvLyBTdG9wIHNjcmlwdHMgb3IgaW5saW5lIGV2ZW50IGhhbmRsZXJzIGZyb20gYmVpbmcgZXhlY3V0ZWQgaW1tZWRpYXRlbHkKCQkvLyBieSB1c2luZyBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbgoJCWlmICggc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgKSB7CgkJCWNvbnRleHQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoICIiICk7CgoJCQkvLyBTZXQgdGhlIGJhc2UgaHJlZiBmb3IgdGhlIGNyZWF0ZWQgZG9jdW1lbnQKCQkJLy8gc28gYW55IHBhcnNlZCBlbGVtZW50cyB3aXRoIFVSTHMKCQkJLy8gYXJlIGJhc2VkIG9uIHRoZSBkb2N1bWVudCdzIFVSTCAoZ2gtMjk2NSkKCQkJYmFzZSA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCggImJhc2UiICk7CgkJCWJhc2UuaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7CgkJCWNvbnRleHQuaGVhZC5hcHBlbmRDaGlsZCggYmFzZSApOwoJCX0gZWxzZSB7CgkJCWNvbnRleHQgPSBkb2N1bWVudDsKCQl9Cgl9CgoJcGFyc2VkID0gcnNpbmdsZVRhZy5leGVjKCBkYXRhICk7CglzY3JpcHRzID0gIWtlZXBTY3JpcHRzICYmIFtdOwoKCS8vIFNpbmdsZSB0YWcKCWlmICggcGFyc2VkICkgewoJCXJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdOwoJfQoKCXBhcnNlZCA9IGJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7CgoJaWYgKCBzY3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoICkgewoJCWpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpOwoJfQoKCXJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQuY2hpbGROb2RlcyApOwp9OwoKCi8qKgogKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlCiAqLwpqUXVlcnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7Cgl2YXIgc2VsZWN0b3IsIHR5cGUsIHJlc3BvbnNlLAoJCXNlbGYgPSB0aGlzLAoJCW9mZiA9IHVybC5pbmRleE9mKCAiICIgKTsKCglpZiAoIG9mZiA+IC0xICkgewoJCXNlbGVjdG9yID0gc3RyaXBBbmRDb2xsYXBzZSggdXJsLnNsaWNlKCBvZmYgKSApOwoJCXVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7Cgl9CgoJLy8gSWYgaXQncyBhIGZ1bmN0aW9uCglpZiAoIGlzRnVuY3Rpb24oIHBhcmFtcyApICkgewoKCQkvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFjawoJCWNhbGxiYWNrID0gcGFyYW1zOwoJCXBhcmFtcyA9IHVuZGVmaW5lZDsKCgkvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nCgl9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gIm9iamVjdCIgKSB7CgkJdHlwZSA9ICJQT1NUIjsKCX0KCgkvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlmeSwgbWFrZSB0aGUgcmVxdWVzdAoJaWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7CgkJalF1ZXJ5LmFqYXgoIHsKCQkJdXJsOiB1cmwsCgoJCQkvLyBJZiAidHlwZSIgdmFyaWFibGUgaXMgdW5kZWZpbmVkLCB0aGVuICJHRVQiIG1ldGhvZCB3aWxsIGJlIHVzZWQuCgkJCS8vIE1ha2UgdmFsdWUgb2YgdGhpcyBmaWVsZCBleHBsaWNpdCBzaW5jZQoJCQkvLyB1c2VyIGNhbiBvdmVycmlkZSBpdCB0aHJvdWdoIGFqYXhTZXR1cCBtZXRob2QKCQkJdHlwZTogdHlwZSB8fCAiR0VUIiwKCQkJZGF0YVR5cGU6ICJodG1sIiwKCQkJZGF0YTogcGFyYW1zCgkJfSApLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7CgoJCQkvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2sKCQkJcmVzcG9uc2UgPSBhcmd1bWVudHM7CgoJCQlzZWxmLmh0bWwoIHNlbGVjdG9yID8KCgkJCQkvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXYKCQkJCS8vIEV4Y2x1ZGUgc2NyaXB0cyB0byBhdm9pZCBJRSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9ycwoJCQkJalF1ZXJ5KCAiPGRpdj4iICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOgoKCQkJCS8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0CgkJCQlyZXNwb25zZVRleHQgKTsKCgkJLy8gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyAiZGF0YSIsICJzdGF0dXMiLCAianFYSFIiCgkJLy8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25zZSB3YXMgc2V0IGFib3ZlLgoJCS8vIElmIGl0IGZhaWxzLCB0aGlzIGZ1bmN0aW9uIGdldHMgImpxWEhSIiwgInN0YXR1cyIsICJlcnJvciIKCQl9ICkuYWx3YXlzKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHsKCQkJc2VsZi5lYWNoKCBmdW5jdGlvbigpIHsKCQkJCWNhbGxiYWNrLmFwcGx5KCB0aGlzLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7CgkJCX0gKTsKCQl9ICk7Cgl9CgoJcmV0dXJuIHRoaXM7Cn07CgoKCgovLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50cwpqUXVlcnkuZWFjaCggWwoJImFqYXhTdGFydCIsCgkiYWpheFN0b3AiLAoJImFqYXhDb21wbGV0ZSIsCgkiYWpheEVycm9yIiwKCSJhamF4U3VjY2VzcyIsCgkiYWpheFNlbmQiCl0sIGZ1bmN0aW9uKCBpLCB0eXBlICkgewoJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7CgkJcmV0dXJuIHRoaXMub24oIHR5cGUsIGZuICk7Cgl9Owp9ICk7CgoKCgpqUXVlcnkuZXhwci5wc2V1ZG9zLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7CglyZXR1cm4galF1ZXJ5LmdyZXAoIGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHsKCQlyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTsKCX0gKS5sZW5ndGg7Cn07CgoKCgpqUXVlcnkub2Zmc2V0ID0gewoJc2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHsKCQl2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLAoJCQlwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSwKCQkJY3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLAoJCQlwcm9wcyA9IHt9OwoKCQkvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtCgkJaWYgKCBwb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CgkJCWVsZW0uc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwoJCX0KCgkJY3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTsKCQljdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCAidG9wIiApOwoJCWN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCAibGVmdCIgKTsKCQljYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09ICJhYnNvbHV0ZSIgfHwgcG9zaXRpb24gPT09ICJmaXhlZCIgKSAmJgoJCQkoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKCAiYXV0byIgKSA+IC0xOwoKCQkvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlcgoJCS8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZAoJCWlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7CgkJCWN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpOwoJCQljdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7CgkJCWN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0OwoKCQl9IGVsc2UgewoJCQljdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwOwoJCQljdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7CgkJfQoKCQlpZiAoIGlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHsKCgkJCS8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KQoJCQlvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyT2Zmc2V0ICkgKTsKCQl9CgoJCWlmICggb3B0aW9ucy50b3AgIT0gbnVsbCApIHsKCQkJcHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDsKCQl9CgkJaWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHsKCQkJcHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7CgkJfQoKCQlpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyApIHsKCQkJb3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApOwoKCQl9IGVsc2UgewoJCQljdXJFbGVtLmNzcyggcHJvcHMgKTsKCQl9Cgl9Cn07CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJLy8gb2Zmc2V0KCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgYm9yZGVyIGJveCB0byB0aGUgZG9jdW1lbnQgb3JpZ2luCglvZmZzZXQ6IGZ1bmN0aW9uKCBvcHRpb25zICkgewoKCQkvLyBQcmVzZXJ2ZSBjaGFpbmluZyBmb3Igc2V0dGVyCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQlyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8KCQkJCXRoaXMgOgoJCQkJdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHsKCQkJCQlqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApOwoJCQkJfSApOwoJCX0KCgkJdmFyIHJlY3QsIHdpbiwKCQkJZWxlbSA9IHRoaXNbIDAgXTsKCgkJaWYgKCAhZWxlbSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gUmV0dXJuIHplcm9zIGZvciBkaXNjb25uZWN0ZWQgYW5kIGhpZGRlbiAoZGlzcGxheTogbm9uZSkgZWxlbWVudHMgKGdoLTIzMTApCgkJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkJLy8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYQoJCS8vIGRpc2Nvbm5lY3RlZCBub2RlIGluIElFIHRocm93cyBhbiBlcnJvcgoJCWlmICggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7CgkJCXJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9OwoJCX0KCgkJLy8gR2V0IGRvY3VtZW50LXJlbGF0aXZlIHBvc2l0aW9uIGJ5IGFkZGluZyB2aWV3cG9ydCBzY3JvbGwgdG8gdmlld3BvcnQtcmVsYXRpdmUgZ0JDUgoJCXJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoJCXdpbiA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldzsKCQlyZXR1cm4gewoJCQl0b3A6IHJlY3QudG9wICsgd2luLnBhZ2VZT2Zmc2V0LAoJCQlsZWZ0OiByZWN0LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXQKCQl9OwoJfSwKCgkvLyBwb3NpdGlvbigpIHJlbGF0ZXMgYW4gZWxlbWVudCdzIG1hcmdpbiBib3ggdG8gaXRzIG9mZnNldCBwYXJlbnQncyBwYWRkaW5nIGJveAoJLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYmVoYXZpb3Igb2YgQ1NTIGFic29sdXRlIHBvc2l0aW9uaW5nCglwb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJaWYgKCAhdGhpc1sgMCBdICkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsIGRvYywKCQkJZWxlbSA9IHRoaXNbIDAgXSwKCQkJcGFyZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfTsKCgkJLy8gcG9zaXRpb246Zml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHRoZSB2aWV3cG9ydCwgd2hpY2ggaXRzZWxmIGFsd2F5cyBoYXMgemVybyBvZmZzZXQKCQlpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSA9PT0gImZpeGVkIiApIHsKCgkJCS8vIEFzc3VtZSBwb3NpdGlvbjpmaXhlZCBpbXBsaWVzIGF2YWlsYWJpbGl0eSBvZiBnZXRCb3VuZGluZ0NsaWVudFJlY3QKCQkJb2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKCgkJfSBlbHNlIHsKCQkJb2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTsKCgkJCS8vIEFjY291bnQgZm9yIHRoZSAqcmVhbCogb2Zmc2V0IHBhcmVudCwgd2hpY2ggY2FuIGJlIHRoZSBkb2N1bWVudCBvciBpdHMgcm9vdCBlbGVtZW50CgkJCS8vIHdoZW4gYSBzdGF0aWNhbGx5IHBvc2l0aW9uZWQgZWxlbWVudCBpcyBpZGVudGlmaWVkCgkJCWRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDsKCQkJb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQgfHwgZG9jLmRvY3VtZW50RWxlbWVudDsKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYKCQkJCSggb2Zmc2V0UGFyZW50ID09PSBkb2MuYm9keSB8fCBvZmZzZXRQYXJlbnQgPT09IGRvYy5kb2N1bWVudEVsZW1lbnQgKSAmJgoJCQkJalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewoKCQkJCW9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5wYXJlbnROb2RlOwoJCQl9CgkJCWlmICggb2Zmc2V0UGFyZW50ICYmIG9mZnNldFBhcmVudCAhPT0gZWxlbSAmJiBvZmZzZXRQYXJlbnQubm9kZVR5cGUgPT09IDEgKSB7CgoJCQkJLy8gSW5jb3Jwb3JhdGUgYm9yZGVycyBpbnRvIGl0cyBvZmZzZXQsIHNpbmNlIHRoZXkgYXJlIG91dHNpZGUgaXRzIGNvbnRlbnQgb3JpZ2luCgkJCQlwYXJlbnRPZmZzZXQgPSBqUXVlcnkoIG9mZnNldFBhcmVudCApLm9mZnNldCgpOwoJCQkJcGFyZW50T2Zmc2V0LnRvcCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsICJib3JkZXJUb3BXaWR0aCIsIHRydWUgKTsKCQkJCXBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgImJvcmRlckxlZnRXaWR0aCIsIHRydWUgKTsKCQkJfQoJCX0KCgkJLy8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2lucwoJCXJldHVybiB7CgkJCXRvcDogb2Zmc2V0LnRvcCAtIHBhcmVudE9mZnNldC50b3AgLSBqUXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luVG9wIiwgdHJ1ZSApLAoJCQlsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0IC0galF1ZXJ5LmNzcyggZWxlbSwgIm1hcmdpbkxlZnQiLCB0cnVlICkKCQl9OwoJfSwKCgkvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBkb2N1bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczoKCS8vIDEpIEZvciB0aGUgZWxlbWVudCBpbnNpZGUgdGhlIGlmcmFtZSB3aXRob3V0IG9mZnNldFBhcmVudCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4KCS8vICAgIGRvY3VtZW50RWxlbWVudCBvZiB0aGUgcGFyZW50IHdpbmRvdwoJLy8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudAoJLy8gMykgRm9yIGJvZHkgb3IgaHRtbCBlbGVtZW50LCBpLmUuIGluIGNhc2Ugb2YgdGhlIGh0bWwgbm9kZSAtIGl0IHdpbGwgcmV0dXJuIGl0c2VsZgoJLy8KCS8vIGJ1dCB0aG9zZSBleGNlcHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlcwoJLy8gYW5kIG1pZ2h0IGJlIGNvbnNpZGVyZWQgYXMgbW9yZSBwcmVmZXJhYmxlIHJlc3VsdHMuCgkvLwoJLy8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUKCW9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHsKCQkJdmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50OwoKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewoJCQkJb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDsKCQkJfQoKCQkJcmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2N1bWVudEVsZW1lbnQ7CgkJfSApOwoJfQp9ICk7CgovLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHMKalF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogInBhZ2VYT2Zmc2V0Iiwgc2Nyb2xsVG9wOiAicGFnZVlPZmZzZXQiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7Cgl2YXIgdG9wID0gInBhZ2VZT2Zmc2V0IiA9PT0gcHJvcDsKCglqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbWV0aG9kLCB2YWwgKSB7CgoJCQkvLyBDb2FsZXNjZSBkb2N1bWVudHMgYW5kIHdpbmRvd3MKCQkJdmFyIHdpbjsKCQkJaWYgKCBpc1dpbmRvdyggZWxlbSApICkgewoJCQkJd2luID0gZWxlbTsKCQkJfSBlbHNlIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCXdpbiA9IGVsZW0uZGVmYXVsdFZpZXc7CgkJCX0KCgkJCWlmICggdmFsID09PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTsKCQkJfQoKCQkJaWYgKCB3aW4gKSB7CgkJCQl3aW4uc2Nyb2xsVG8oCgkJCQkJIXRvcCA/IHZhbCA6IHdpbi5wYWdlWE9mZnNldCwKCQkJCQl0b3AgPyB2YWwgOiB3aW4ucGFnZVlPZmZzZXQKCQkJCSk7CgoJCQl9IGVsc2UgewoJCQkJZWxlbVsgbWV0aG9kIF0gPSB2YWw7CgkJCX0KCQl9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCApOwoJfTsKfSApOwoKLy8gU3VwcG9ydDogU2FmYXJpIDw9NyAtIDkuMSwgQ2hyb21lIDw9MzcgLSA0OQovLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvbgovLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODQKLy8gQmxpbmsgYnVnOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD01ODkzNDcKLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDsKLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmUKalF1ZXJ5LmVhY2goIFsgInRvcCIsICJsZWZ0IiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHsKCWpRdWVyeS5jc3NIb29rc1sgcHJvcCBdID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnBpeGVsUG9zaXRpb24sCgkJZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQlpZiAoIGNvbXB1dGVkICkgewoJCQkJY29tcHV0ZWQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTsKCgkJCQkvLyBJZiBjdXJDU1MgcmV0dXJucyBwZXJjZW50YWdlLCBmYWxsYmFjayB0byBvZmZzZXQKCQkJCXJldHVybiBybnVtbm9ucHgudGVzdCggY29tcHV0ZWQgKSA/CgkJCQkJalF1ZXJ5KCBlbGVtICkucG9zaXRpb24oKVsgcHJvcCBdICsgInB4IiA6CgkJCQkJY29tcHV0ZWQ7CgkJCX0KCQl9CgkpOwp9ICk7CgoKLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzCmpRdWVyeS5lYWNoKCB7IEhlaWdodDogImhlaWdodCIsIFdpZHRoOiAid2lkdGgiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkgewoJalF1ZXJ5LmVhY2goIHsgcGFkZGluZzogImlubmVyIiArIG5hbWUsIGNvbnRlbnQ6IHR5cGUsICIiOiAib3V0ZXIiICsgbmFtZSB9LAoJCWZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkgewoKCQkvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGgKCQlqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHsKCQkJdmFyIGNoYWluYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKCBkZWZhdWx0RXh0cmEgfHwgdHlwZW9mIG1hcmdpbiAhPT0gImJvb2xlYW4iICksCgkJCQlleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/ICJtYXJnaW4iIDogImJvcmRlciIgKTsKCgkJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHsKCQkJCXZhciBkb2M7CgoJCQkJaWYgKCBpc1dpbmRvdyggZWxlbSApICkgewoKCQkJCQkvLyAkKCB3aW5kb3cgKS5vdXRlcldpZHRoL0hlaWdodCByZXR1cm4gdy9oIGluY2x1ZGluZyBzY3JvbGxiYXJzIChnaC0xNzI5KQoJCQkJCXJldHVybiBmdW5jTmFtZS5pbmRleE9mKCAib3V0ZXIiICkgPT09IDAgPwoJCQkJCQllbGVtWyAiaW5uZXIiICsgbmFtZSBdIDoKCQkJCQkJZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdOwoJCQkJfQoKCQkJCS8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHQKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCQlkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDsKCgkJCQkJLy8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLAoJCQkJCS8vIHdoaWNoZXZlciBpcyBncmVhdGVzdAoJCQkJCXJldHVybiBNYXRoLm1heCgKCQkJCQkJZWxlbS5ib2R5WyAic2Nyb2xsIiArIG5hbWUgXSwgZG9jWyAic2Nyb2xsIiArIG5hbWUgXSwKCQkJCQkJZWxlbS5ib2R5WyAib2Zmc2V0IiArIG5hbWUgXSwgZG9jWyAib2Zmc2V0IiArIG5hbWUgXSwKCQkJCQkJZG9jWyAiY2xpZW50IiArIG5hbWUgXQoJCQkJCSk7CgkJCQl9CgoJCQkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPwoKCQkJCQkvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBwYXJzZUZsb2F0CgkJCQkJalF1ZXJ5LmNzcyggZWxlbSwgdHlwZSwgZXh0cmEgKSA6CgoJCQkJCS8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQkJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApOwoJCQl9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSApOwoJCX07Cgl9ICk7Cn0gKTsKCgpqUXVlcnkuZWFjaCggKCAiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgIiArCgkibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgIiArCgkiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIgKS5zcGxpdCggIiAiICksCglmdW5jdGlvbiggaSwgbmFtZSApIHsKCgkvLyBIYW5kbGUgZXZlbnQgYmluZGluZwoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7CgkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID8KCQkJdGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6CgkJCXRoaXMudHJpZ2dlciggbmFtZSApOwoJfTsKfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJaG92ZXI6IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkgewoJCXJldHVybiB0aGlzLm1vdXNlZW50ZXIoIGZuT3ZlciApLm1vdXNlbGVhdmUoIGZuT3V0IHx8IGZuT3ZlciApOwoJfQp9ICk7CgoKCgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJYmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7Cgl9LAoJdW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkgewoJCXJldHVybiB0aGlzLm9mZiggdHlwZXMsIG51bGwsIGZuICk7Cgl9LAoKCWRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOwoJfSwKCXVuZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGZuICkgewoKCQkvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApCgkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPwoJCQl0aGlzLm9mZiggc2VsZWN0b3IsICIqKiIgKSA6CgkJCXRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgIioqIiwgZm4gKTsKCX0KfSApOwoKLy8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55Ci8vIGFyZ3VtZW50cy4KLy8galF1ZXJ5LnByb3h5IGlzIGRlcHJlY2F0ZWQgdG8gcHJvbW90ZSBzdGFuZGFyZHMgKHNwZWNpZmljYWxseSBGdW5jdGlvbiNiaW5kKQovLyBIb3dldmVyLCBpdCBpcyBub3Qgc2xhdGVkIGZvciByZW1vdmFsIGFueSB0aW1lIHNvb24KalF1ZXJ5LnByb3h5ID0gZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkgewoJdmFyIHRtcCwgYXJncywgcHJveHk7CgoJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gInN0cmluZyIgKSB7CgkJdG1wID0gZm5bIGNvbnRleHQgXTsKCQljb250ZXh0ID0gZm47CgkJZm4gPSB0bXA7Cgl9CgoJLy8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWMKCS8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuCglpZiAoICFpc0Z1bmN0aW9uKCBmbiApICkgewoJCXJldHVybiB1bmRlZmluZWQ7Cgl9CgoJLy8gU2ltdWxhdGVkIGJpbmQKCWFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTsKCXByb3h5ID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7Cgl9OwoKCS8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAoJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKys7CgoJcmV0dXJuIHByb3h5Owp9OwoKalF1ZXJ5LmhvbGRSZWFkeSA9IGZ1bmN0aW9uKCBob2xkICkgewoJaWYgKCBob2xkICkgewoJCWpRdWVyeS5yZWFkeVdhaXQrKzsKCX0gZWxzZSB7CgkJalF1ZXJ5LnJlYWR5KCB0cnVlICk7Cgl9Cn07CmpRdWVyeS5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTsKalF1ZXJ5LnBhcnNlSlNPTiA9IEpTT04ucGFyc2U7CmpRdWVyeS5ub2RlTmFtZSA9IG5vZGVOYW1lOwpqUXVlcnkuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247CmpRdWVyeS5pc1dpbmRvdyA9IGlzV2luZG93OwpqUXVlcnkuY2FtZWxDYXNlID0gY2FtZWxDYXNlOwpqUXVlcnkudHlwZSA9IHRvVHlwZTsKCmpRdWVyeS5ub3cgPSBEYXRlLm5vdzsKCmpRdWVyeS5pc051bWVyaWMgPSBmdW5jdGlvbiggb2JqICkgewoKCS8vIEFzIG9mIGpRdWVyeSAzLjAsIGlzTnVtZXJpYyBpcyBsaW1pdGVkIHRvCgkvLyBzdHJpbmdzIGFuZCBudW1iZXJzIChwcmltaXRpdmVzIG9yIG9iamVjdHMpCgkvLyB0aGF0IGNhbiBiZSBjb2VyY2VkIHRvIGZpbml0ZSBudW1iZXJzIChnaC0yNjYyKQoJdmFyIHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7CglyZXR1cm4gKCB0eXBlID09PSAibnVtYmVyIiB8fCB0eXBlID09PSAic3RyaW5nIiApICYmCgoJCS8vIHBhcnNlRmxvYXQgTmFOcyBudW1lcmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzICgiIikKCQkvLyAuLi5idXQgbWlzaW50ZXJwcmV0cyBsZWFkaW5nLW51bWJlciBzdHJpbmdzLCBwYXJ0aWN1bGFybHkgaGV4IGxpdGVyYWxzICgiMHguLi4iKQoJCS8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTgoJCSFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTsKfTsKCgoKCi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlcgovLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0Ci8vIHVuZGVyc3RhbmRzIGFub255bW91cyBBTUQgbW9kdWxlcy4gQSBuYW1lZCBBTUQgaXMgc2FmZXN0IGFuZCBtb3N0IHJvYnVzdAovLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlCi8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZQovLyBmaWxlIG5hbWUuIERvIHRoaXMgYWZ0ZXIgY3JlYXRpbmcgdGhlIGdsb2JhbCBzbyB0aGF0IGlmIGFuIEFNRCBtb2R1bGUgd2FudHMKLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLgoKLy8gTm90ZSB0aGF0IGZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LCBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IGpRdWVyeSBzaG91bGQKLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhbgovLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVyeSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQovLyBodHRwczovL2dpdGh1Yi5jb20vanJidXJrZS9yZXF1aXJlanMvd2lraS9VcGRhdGluZy1leGlzdGluZy1saWJyYXJpZXMjd2lraS1hbm9uCgppZiAoIHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCApIHsKCWRlZmluZSggImpxdWVyeSIsIFtdLCBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5OwoJfSApOwp9CgoKCgp2YXIKCgkvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGUKCV9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LAoKCS8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlCglfJCA9IHdpbmRvdy4kOwoKalF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHsKCWlmICggd2luZG93LiQgPT09IGpRdWVyeSApIHsKCQl3aW5kb3cuJCA9IF8kOwoJfQoKCWlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBqUXVlcnkgKSB7CgkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7Cgl9CgoJcmV0dXJuIGpRdWVyeTsKfTsKCi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1ECi8vICgjNzEwMiNjb21tZW50OjEwLCBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzU1NykKLy8gYW5kIENvbW1vbkpTIGZvciBicm93c2VyIGVtdWxhdG9ycyAoIzEzNTY2KQppZiAoICFub0dsb2JhbCApIHsKCXdpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeTsKfQoKCgoKcmV0dXJuIGpRdWVyeTsKfSApOwo=" >
		<script type="text/javascript" src="data:/text/plain;base64,LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuMy4xCiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiAyMDE4LTAxLTIwVDE3OjI0WgogKi8KKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkgewoKCSJ1c2Ugc3RyaWN0IjsKCglpZiAoIHR5cGVvZiBtb2R1bGUgPT09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gIm9iamVjdCIgKSB7CgoJCS8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgd2hlcmUgYSBwcm9wZXIgYHdpbmRvd2AKCQkvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LgoJCS8vIEZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIGB3aW5kb3dgIHdpdGggYSBgZG9jdW1lbnRgCgkJLy8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMuCgkJLy8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC4KCQkvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKCJqcXVlcnkiKSh3aW5kb3cpOwoJCS8vIFNlZSB0aWNrZXQgIzE0NTQ5IGZvciBtb3JlIGluZm8uCgkJbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuZG9jdW1lbnQgPwoJCQlmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6CgkJCWZ1bmN0aW9uKCB3ICkgewoJCQkJaWYgKCAhdy5kb2N1bWVudCApIHsKCQkJCQl0aHJvdyBuZXcgRXJyb3IoICJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50IiApOwoJCQkJfQoJCQkJcmV0dXJuIGZhY3RvcnkoIHcgKTsKCQkJfTsKCX0gZWxzZSB7CgkJZmFjdG9yeSggZ2xvYmFsICk7Cgl9CgovLyBQYXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldAp9ICkoIHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oIHdpbmRvdywgbm9HbG9iYWwgKSB7CgovLyBFZGdlIDw9IDEyIC0gMTMrLCBGaXJlZm94IDw9MTggLSA0NSssIElFIDEwIC0gMTEsIFNhZmFyaSA1LjEgLSA5KywgaU9TIDYgLSA5LjEKLy8gdGhyb3cgZXhjZXB0aW9ucyB3aGVuIG5vbi1zdHJpY3QgY29kZSAoZS5nLiwgQVNQLk5FVCA0LjUpIGFjY2Vzc2VzIHN0cmljdCBtb2RlCi8vIGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyICh0cmFjLTEzMzM1KS4gQnV0IGFzIG9mIGpRdWVyeSAzLjAgKDIwMTYpLCBzdHJpY3QgbW9kZSBzaG91bGQgYmUgY29tbW9uCi8vIGVub3VnaCB0aGF0IGFsbCBzdWNoIGF0dGVtcHRzIGFyZSBndWFyZGVkIGluIGEgdHJ5IGJsb2NrLgoidXNlIHN0cmljdCI7Cgp2YXIgYXJyID0gW107Cgp2YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7Cgp2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7Cgp2YXIgc2xpY2UgPSBhcnIuc2xpY2U7Cgp2YXIgY29uY2F0ID0gYXJyLmNvbmNhdDsKCnZhciBwdXNoID0gYXJyLnB1c2g7Cgp2YXIgaW5kZXhPZiA9IGFyci5pbmRleE9mOwoKdmFyIGNsYXNzMnR5cGUgPSB7fTsKCnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7Cgp2YXIgaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eTsKCnZhciBmblRvU3RyaW5nID0gaGFzT3duLnRvU3RyaW5nOwoKdmFyIE9iamVjdEZ1bmN0aW9uU3RyaW5nID0gZm5Ub1N0cmluZy5jYWxsKCBPYmplY3QgKTsKCnZhciBzdXBwb3J0ID0ge307Cgp2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24oIG9iaiApIHsKCiAgICAgIC8vIFN1cHBvcnQ6IENocm9tZSA8PTU3LCBGaXJlZm94IDw9NTIKICAgICAgLy8gSW4gc29tZSBicm93c2VycywgdHlwZW9mIHJldHVybnMgImZ1bmN0aW9uIiBmb3IgSFRNTCA8b2JqZWN0PiBlbGVtZW50cwogICAgICAvLyAoaS5lLiwgYHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAib2JqZWN0IiApID09PSAiZnVuY3Rpb24iYCkuCiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gY2xhc3NpZnkgKmFueSogRE9NIG5vZGUgYXMgYSBmdW5jdGlvbi4KICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIG9iai5ub2RlVHlwZSAhPT0gIm51bWJlciI7CiAgfTsKCgp2YXIgaXNXaW5kb3cgPSBmdW5jdGlvbiBpc1dpbmRvdyggb2JqICkgewoJCXJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7Cgl9OwoKCgoKCXZhciBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzID0gewoJCXR5cGU6IHRydWUsCgkJc3JjOiB0cnVlLAoJCW5vTW9kdWxlOiB0cnVlCgl9OwoKCWZ1bmN0aW9uIERPTUV2YWwoIGNvZGUsIGRvYywgbm9kZSApIHsKCQlkb2MgPSBkb2MgfHwgZG9jdW1lbnQ7CgoJCXZhciBpLAoJCQlzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudCggInNjcmlwdCIgKTsKCgkJc2NyaXB0LnRleHQgPSBjb2RlOwoJCWlmICggbm9kZSApIHsKCQkJZm9yICggaSBpbiBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzICkgewoJCQkJaWYgKCBub2RlWyBpIF0gKSB7CgkJCQkJc2NyaXB0WyBpIF0gPSBub2RlWyBpIF07CgkJCQl9CgkJCX0KCQl9CgkJZG9jLmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwoJfQoKCmZ1bmN0aW9uIHRvVHlwZSggb2JqICkgewoJaWYgKCBvYmogPT0gbnVsbCApIHsKCQlyZXR1cm4gb2JqICsgIiI7Cgl9CgoJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTIuMyBvbmx5IChmdW5jdGlvbmlzaCBSZWdFeHApCglyZXR1cm4gdHlwZW9mIG9iaiA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIG9iaiA9PT0gImZ1bmN0aW9uIiA/CgkJY2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbCggb2JqICkgXSB8fCAib2JqZWN0IiA6CgkJdHlwZW9mIG9iajsKfQovKiBnbG9iYWwgU3ltYm9sICovCi8vIERlZmluaW5nIHRoaXMgZ2xvYmFsIGluIC5lc2xpbnRyYy5qc29uIHdvdWxkIGNyZWF0ZSBhIGRhbmdlciBvZiB1c2luZyB0aGUgZ2xvYmFsCi8vIHVuZ3VhcmRlZCBpbiBhbm90aGVyIHBsYWNlLCBpdCBzZWVtcyBzYWZlciB0byBkZWZpbmUgZ2xvYmFsIG9ubHkgZm9yIHRoaXMgbW9kdWxlCgoKCnZhcgoJdmVyc2lvbiA9ICIzLjMuMSIsCgoJLy8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnkKCWpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKCgkJLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnCgkJLy8gTmVlZCBpbml0IGlmIGpRdWVyeSBpcyBjYWxsZWQgKGp1c3QgYWxsb3cgZXJyb3IgdG8gYmUgdGhyb3duIGlmIG5vdCBpbmNsdWRlZCkKCQlyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApOwoJfSwKCgkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHkKCS8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUAoJcnRyaW0gPSAvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7CgpqUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0gewoKCS8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKCWpxdWVyeTogdmVyc2lvbiwKCgljb25zdHJ1Y3RvcjogalF1ZXJ5LAoKCS8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMgMAoJbGVuZ3RoOiAwLAoKCXRvQXJyYXk6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7Cgl9LAoKCS8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1IKCS8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5CglnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7CgoJCS8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGluIGEgY2xlYW4gYXJyYXkKCQlpZiAoIG51bSA9PSBudWxsICkgewoJCQlyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApOwoJCX0KCgkJLy8gUmV0dXJuIGp1c3QgdGhlIG9uZSBlbGVtZW50IGZyb20gdGhlIHNldAoJCXJldHVybiBudW0gPCAwID8gdGhpc1sgbnVtICsgdGhpcy5sZW5ndGggXSA6IHRoaXNbIG51bSBdOwoJfSwKCgkvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrCgkvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldCkKCXB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkgewoKCQkvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldAoJCXZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTsKCgkJLy8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSkKCQlyZXQucHJldk9iamVjdCA9IHRoaXM7CgoJCS8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0CgkJcmV0dXJuIHJldDsKCX0sCgoJLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4KCWVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKCQlyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrICk7Cgl9LAoKCW1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCggdGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJCXJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CgkJfSApICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSApOwoJfSwKCglmaXJzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIDAgKTsKCX0sCgoJbGFzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIC0xICk7Cgl9LAoKCWVxOiBmdW5jdGlvbiggaSApIHsKCQl2YXIgbGVuID0gdGhpcy5sZW5ndGgsCgkJCWogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1sgaiBdIF0gOiBbXSApOwoJfSwKCgllbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcigpOwoJfSwKCgkvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCgkvLyBCZWhhdmVzIGxpa2UgYW4gQXJyYXkncyBtZXRob2QsIG5vdCBsaWtlIGEgalF1ZXJ5IG1ldGhvZC4KCXB1c2g6IHB1c2gsCglzb3J0OiBhcnIuc29ydCwKCXNwbGljZTogYXJyLnNwbGljZQp9OwoKalF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHsKCXZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSwKCQl0YXJnZXQgPSBhcmd1bWVudHNbIDAgXSB8fCB7fSwKCQlpID0gMSwKCQlsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLAoJCWRlZXAgPSBmYWxzZTsKCgkvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uCglpZiAoIHR5cGVvZiB0YXJnZXQgPT09ICJib29sZWFuIiApIHsKCQlkZWVwID0gdGFyZ2V0OwoKCQkvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0CgkJdGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307CgkJaSsrOwoJfQoKCS8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQoJaWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiAhaXNGdW5jdGlvbiggdGFyZ2V0ICkgKSB7CgkJdGFyZ2V0ID0ge307Cgl9CgoJLy8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGkgPT09IGxlbmd0aCApIHsKCQl0YXJnZXQgPSB0aGlzOwoJCWktLTsKCX0KCglmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCgkJLy8gT25seSBkZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlcwoJCWlmICggKCBvcHRpb25zID0gYXJndW1lbnRzWyBpIF0gKSAhPSBudWxsICkgewoKCQkJLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdAoJCQlmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CgkJCQlzcmMgPSB0YXJnZXRbIG5hbWUgXTsKCQkJCWNvcHkgPSBvcHRpb25zWyBuYW1lIF07CgoJCQkJLy8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcAoJCQkJaWYgKCB0YXJnZXQgPT09IGNvcHkgKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJLy8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzCgkJCQlpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb3B5ICkgfHwKCQkJCQkoIGNvcHlJc0FycmF5ID0gQXJyYXkuaXNBcnJheSggY29weSApICkgKSApIHsKCgkJCQkJaWYgKCBjb3B5SXNBcnJheSApIHsKCQkJCQkJY29weUlzQXJyYXkgPSBmYWxzZTsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgQXJyYXkuaXNBcnJheSggc3JjICkgPyBzcmMgOiBbXTsKCgkJCQkJfSBlbHNlIHsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHNyYyApID8gc3JjIDoge307CgkJCQkJfQoKCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CgoJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcwoJCQkJfSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXRhcmdldFsgbmFtZSBdID0gY29weTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAoJcmV0dXJuIHRhcmdldDsKfTsKCmpRdWVyeS5leHRlbmQoIHsKCgkvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2UKCWV4cGFuZG86ICJqUXVlcnkiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cRC9nLCAiIiApLAoKCS8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlCglpc1JlYWR5OiB0cnVlLAoKCWVycm9yOiBmdW5jdGlvbiggbXNnICkgewoJCXRocm93IG5ldyBFcnJvciggbXNnICk7Cgl9LAoKCW5vb3A6IGZ1bmN0aW9uKCkge30sCgoJaXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCQl2YXIgcHJvdG8sIEN0b3I7CgoJCS8vIERldGVjdCBvYnZpb3VzIG5lZ2F0aXZlcwoJCS8vIFVzZSB0b1N0cmluZyBpbnN0ZWFkIG9mIGpRdWVyeS50eXBlIHRvIGNhdGNoIGhvc3Qgb2JqZWN0cwoJCWlmICggIW9iaiB8fCB0b1N0cmluZy5jYWxsKCBvYmogKSAhPT0gIltvYmplY3QgT2JqZWN0XSIgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXByb3RvID0gZ2V0UHJvdG8oIG9iaiApOwoKCQkvLyBPYmplY3RzIHdpdGggbm8gcHJvdG90eXBlIChlLmcuLCBgT2JqZWN0LmNyZWF0ZSggbnVsbCApYCkgYXJlIHBsYWluCgkJaWYgKCAhcHJvdG8gKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCgkJLy8gT2JqZWN0cyB3aXRoIHByb3RvdHlwZSBhcmUgcGxhaW4gaWZmIHRoZXkgd2VyZSBjb25zdHJ1Y3RlZCBieSBhIGdsb2JhbCBPYmplY3QgZnVuY3Rpb24KCQlDdG9yID0gaGFzT3duLmNhbGwoIHByb3RvLCAiY29uc3RydWN0b3IiICkgJiYgcHJvdG8uY29uc3RydWN0b3I7CgkJcmV0dXJuIHR5cGVvZiBDdG9yID09PSAiZnVuY3Rpb24iICYmIGZuVG9TdHJpbmcuY2FsbCggQ3RvciApID09PSBPYmplY3RGdW5jdGlvblN0cmluZzsKCX0sCgoJaXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCgkJLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KCQkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvaXNzdWVzLzYxMjUKCQl2YXIgbmFtZTsKCgkJZm9yICggbmFtZSBpbiBvYmogKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuIHRydWU7Cgl9LAoKCS8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0CglnbG9iYWxFdmFsOiBmdW5jdGlvbiggY29kZSApIHsKCQlET01FdmFsKCBjb2RlICk7Cgl9LAoKCWVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkgewoJCXZhciBsZW5ndGgsIGkgPSAwOwoKCQlpZiAoIGlzQXJyYXlMaWtlKCBvYmogKSApIHsKCQkJbGVuZ3RoID0gb2JqLmxlbmd0aDsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQlpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCWZvciAoIGkgaW4gb2JqICkgewoJCQkJaWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBvYmo7Cgl9LAoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seQoJdHJpbTogZnVuY3Rpb24oIHRleHQgKSB7CgkJcmV0dXJuIHRleHQgPT0gbnVsbCA/CgkJCSIiIDoKCQkJKCB0ZXh0ICsgIiIgKS5yZXBsYWNlKCBydHJpbSwgIiIgKTsKCX0sCgoJLy8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQoJbWFrZUFycmF5OiBmdW5jdGlvbiggYXJyLCByZXN1bHRzICkgewoJCXZhciByZXQgPSByZXN1bHRzIHx8IFtdOwoKCQlpZiAoIGFyciAhPSBudWxsICkgewoJCQlpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7CgkJCQlqUXVlcnkubWVyZ2UoIHJldCwKCQkJCQl0eXBlb2YgYXJyID09PSAic3RyaW5nIiA/CgkJCQkJWyBhcnIgXSA6IGFycgoJCQkJKTsKCQkJfSBlbHNlIHsKCQkJCXB1c2guY2FsbCggcmV0LCBhcnIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJaW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHsKCQlyZXR1cm4gYXJyID09IG51bGwgPyAtMSA6IGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7Cgl9LAoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seQoJLy8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdAoJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgewoJCXZhciBsZW4gPSArc2Vjb25kLmxlbmd0aCwKCQkJaiA9IDAsCgkJCWkgPSBmaXJzdC5sZW5ndGg7CgoJCWZvciAoIDsgaiA8IGxlbjsgaisrICkgewoJCQlmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTsKCQl9CgoJCWZpcnN0Lmxlbmd0aCA9IGk7CgoJCXJldHVybiBmaXJzdDsKCX0sCgoJZ3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkgewoJCXZhciBjYWxsYmFja0ludmVyc2UsCgkJCW1hdGNoZXMgPSBbXSwKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aCwKCQkJY2FsbGJhY2tFeHBlY3QgPSAhaW52ZXJ0OwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zCgkJLy8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24KCQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJY2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CgkJCWlmICggY2FsbGJhY2tJbnZlcnNlICE9PSBjYWxsYmFja0V4cGVjdCApIHsKCQkJCW1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApOwoJCQl9CgkJfQoKCQlyZXR1cm4gbWF0Y2hlczsKCX0sCgoJLy8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CgltYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHsKCQl2YXIgbGVuZ3RoLCB2YWx1ZSwKCQkJaSA9IDAsCgkJCXJldCA9IFtdOwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlcwoJCWlmICggaXNBcnJheUxpa2UoIGVsZW1zICkgKSB7CgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aDsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQl2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTsKCgkJCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7CgkJCQkJcmV0LnB1c2goIHZhbHVlICk7CgkJCQl9CgkJCX0KCgkJLy8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCwKCQl9IGVsc2UgewoJCQlmb3IgKCBpIGluIGVsZW1zICkgewoJCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CgoJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewoJCQkJCXJldC5wdXNoKCB2YWx1ZSApOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzCgkJcmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApOwoJfSwKCgkvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHMKCWd1aWQ6IDEsCgoJLy8galF1ZXJ5LnN1cHBvcnQgaXMgbm90IHVzZWQgaW4gQ29yZSBidXQgb3RoZXIgcHJvamVjdHMgYXR0YWNoIHRoZWlyCgkvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LgoJc3VwcG9ydDogc3VwcG9ydAp9ICk7CgppZiAoIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgKSB7CglqUXVlcnkuZm5bIFN5bWJvbC5pdGVyYXRvciBdID0gYXJyWyBTeW1ib2wuaXRlcmF0b3IgXTsKfQoKLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwCmpRdWVyeS5lYWNoKCAiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCAiICIgKSwKZnVuY3Rpb24oIGksIG5hbWUgKSB7CgljbGFzczJ0eXBlWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpOwp9ICk7CgpmdW5jdGlvbiBpc0FycmF5TGlrZSggb2JqICkgewoKCS8vIFN1cHBvcnQ6IHJlYWwgaU9TIDguMiBvbmx5IChub3QgcmVwcm9kdWNpYmxlIGluIHNpbXVsYXRvcikKCS8vIGBpbmAgY2hlY2sgdXNlZCB0byBwcmV2ZW50IEpJVCBlcnJvciAoZ2gtMjE0NSkKCS8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlcwoJLy8gcmVnYXJkaW5nIE5vZGVsaXN0IGxlbmd0aCBpbiBJRQoJdmFyIGxlbmd0aCA9ICEhb2JqICYmICJsZW5ndGgiIGluIG9iaiAmJiBvYmoubGVuZ3RoLAoJCXR5cGUgPSB0b1R5cGUoIG9iaiApOwoKCWlmICggaXNGdW5jdGlvbiggb2JqICkgfHwgaXNXaW5kb3coIG9iaiApICkgewoJCXJldHVybiBmYWxzZTsKCX0KCglyZXR1cm4gdHlwZSA9PT0gImFycmF5IiB8fCBsZW5ndGggPT09IDAgfHwKCQl0eXBlb2YgbGVuZ3RoID09PSAibnVtYmVyIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajsKfQp2YXIgU2l6emxlID0KLyohCiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIHYyLjMuMwogKiBodHRwczovL3NpenpsZWpzLmNvbS8KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogRGF0ZTogMjAxNi0wOC0wOAogKi8KKGZ1bmN0aW9uKCB3aW5kb3cgKSB7Cgp2YXIgaSwKCXN1cHBvcnQsCglFeHByLAoJZ2V0VGV4dCwKCWlzWE1MLAoJdG9rZW5pemUsCgljb21waWxlLAoJc2VsZWN0LAoJb3V0ZXJtb3N0Q29udGV4dCwKCXNvcnRJbnB1dCwKCWhhc0R1cGxpY2F0ZSwKCgkvLyBMb2NhbCBkb2N1bWVudCB2YXJzCglzZXREb2N1bWVudCwKCWRvY3VtZW50LAoJZG9jRWxlbSwKCWRvY3VtZW50SXNIVE1MLAoJcmJ1Z2d5UVNBLAoJcmJ1Z2d5TWF0Y2hlcywKCW1hdGNoZXMsCgljb250YWlucywKCgkvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhCglleHBhbmRvID0gInNpenpsZSIgKyAxICogbmV3IERhdGUoKSwKCXByZWZlcnJlZERvYyA9IHdpbmRvdy5kb2N1bWVudCwKCWRpcnJ1bnMgPSAwLAoJZG9uZSA9IDAsCgljbGFzc0NhY2hlID0gY3JlYXRlQ2FjaGUoKSwKCXRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAoJY29tcGlsZXJDYWNoZSA9IGNyZWF0ZUNhY2hlKCksCglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlpZiAoIGEgPT09IGIgKSB7CgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CgkJfQoJCXJldHVybiAwOwoJfSwKCgkvLyBJbnN0YW5jZSBtZXRob2RzCgloYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LAoJYXJyID0gW10sCglwb3AgPSBhcnIucG9wLAoJcHVzaF9uYXRpdmUgPSBhcnIucHVzaCwKCXB1c2ggPSBhcnIucHVzaCwKCXNsaWNlID0gYXJyLnNsaWNlLAoJLy8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlCgkvLyBodHRwczovL2pzcGVyZi5jb20vdGhvci1pbmRleG9mLXZzLWZvci81CglpbmRleE9mID0gZnVuY3Rpb24oIGxpc3QsIGVsZW0gKSB7CgkJdmFyIGkgPSAwLAoJCQlsZW4gPSBsaXN0Lmxlbmd0aDsKCQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQkJaWYgKCBsaXN0W2ldID09PSBlbGVtICkgewoJCQkJcmV0dXJuIGk7CgkJCX0KCQl9CgkJcmV0dXJuIC0xOwoJfSwKCglib29sZWFucyA9ICJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsCgoJLy8gUmVndWxhciBleHByZXNzaW9ucwoKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyN3aGl0ZXNwYWNlCgl3aGl0ZXNwYWNlID0gIltcXHgyMFxcdFxcclxcblxcZl0iLAoKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllcgoJaWRlbnRpZmllciA9ICIoPzpcXFxcLnxbXFx3LV18W15cMC1cXHhhMF0pKyIsCgoJLy8gQXR0cmlidXRlIHNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzCglhdHRyaWJ1dGVzID0gIlxcWyIgKyB3aGl0ZXNwYWNlICsgIiooIiArIGlkZW50aWZpZXIgKyAiKSg/OiIgKyB3aGl0ZXNwYWNlICsKCQkvLyBPcGVyYXRvciAoY2FwdHVyZSAyKQoJCSIqKFsqXiR8IX5dPz0pIiArIHdoaXRlc3BhY2UgKwoJCS8vICJBdHRyaWJ1dGUgdmFsdWVzIG11c3QgYmUgQ1NTIGlkZW50aWZpZXJzIFtjYXB0dXJlIDVdIG9yIHN0cmluZ3MgW2NhcHR1cmUgMyBvciBjYXB0dXJlIDRdIgoJCSIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIgKyBpZGVudGlmaWVyICsgIikpfCkiICsgd2hpdGVzcGFjZSArCgkJIipcXF0iLAoKCXBzZXVkb3MgPSAiOigiICsgaWRlbnRpZmllciArICIpKD86XFwoKCIgKwoJCS8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6CgkJLy8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpCgkJIignKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8IiArCgkJLy8gMi4gc2ltcGxlIChjYXB0dXJlIDYpCgkJIigoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIgKyBhdHRyaWJ1dGVzICsgIikqKXwiICsKCQkvLyAzLiBhbnl0aGluZyBlbHNlIChjYXB0dXJlIDIpCgkJIi4qIiArCgkJIilcXCl8KSIsCgoJLy8gTGVhZGluZyBhbmQgbm9uLWVzY2FwZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgY2FwdHVyaW5nIHNvbWUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBwcmVjZWRpbmcgdGhlIGxhdHRlcgoJcndoaXRlc3BhY2UgPSBuZXcgUmVnRXhwKCB3aGl0ZXNwYWNlICsgIisiLCAiZyIgKSwKCXJ0cmltID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiICsgd2hpdGVzcGFjZSArICIrJCIsICJnIiApLAoKCXJjb21tYSA9IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKiwiICsgd2hpdGVzcGFjZSArICIqIiApLAoJcmNvbWJpbmF0b3JzID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqKFs+K35dfCIgKyB3aGl0ZXNwYWNlICsgIikiICsgd2hpdGVzcGFjZSArICIqIiApLAoKCXJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCAiPSIgKyB3aGl0ZXNwYWNlICsgIiooW15cXF0nXCJdKj8pIiArIHdoaXRlc3BhY2UgKyAiKlxcXSIsICJnIiApLAoKCXJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksCglyaWRlbnRpZmllciA9IG5ldyBSZWdFeHAoICJeIiArIGlkZW50aWZpZXIgKyAiJCIgKSwKCgltYXRjaEV4cHIgPSB7CgkJIklEIjogbmV3IFJlZ0V4cCggIl4jKCIgKyBpZGVudGlmaWVyICsgIikiICksCgkJIkNMQVNTIjogbmV3IFJlZ0V4cCggIl5cXC4oIiArIGlkZW50aWZpZXIgKyAiKSIgKSwKCQkiVEFHIjogbmV3IFJlZ0V4cCggIl4oIiArIGlkZW50aWZpZXIgKyAifFsqXSkiICksCgkJIkFUVFIiOiBuZXcgUmVnRXhwKCAiXiIgKyBhdHRyaWJ1dGVzICksCgkJIlBTRVVETyI6IG5ldyBSZWdFeHAoICJeIiArIHBzZXVkb3MgKSwKCQkiQ0hJTEQiOiBuZXcgUmVnRXhwKCAiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIiArIHdoaXRlc3BhY2UgKwoJCQkiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyB3aGl0ZXNwYWNlICsgIiooPzooWystXXwpIiArIHdoaXRlc3BhY2UgKwoJCQkiKihcXGQrKXwpKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSIsICJpIiApLAoJCSJib29sIjogbmV3IFJlZ0V4cCggIl4oPzoiICsgYm9vbGVhbnMgKyAiKSQiLCAiaSIgKSwKCQkvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKCkKCQkvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgCgkJIm5lZWRzQ29udGV4dCI6IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIiArCgkJCXdoaXRlc3BhY2UgKyAiKigoPzotXFxkKT9cXGQqKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSg/PVteLV18JCkiLCAiaSIgKQoJfSwKCglyaW5wdXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKCXJoZWFkZXIgPSAvXmhcZCQvaSwKCglybmF0aXZlID0gL15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLAoKCS8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9ycwoJcnF1aWNrRXhwciA9IC9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sCgoJcnNpYmxpbmcgPSAvWyt+XS8sCgoJLy8gQ1NTIGVzY2FwZXMKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnMKCXJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoICJcXFxcKFtcXGRhLWZdezEsNn0iICsgd2hpdGVzcGFjZSArICI/fCgiICsgd2hpdGVzcGFjZSArICIpfC4pIiwgImlnIiApLAoJZnVuZXNjYXBlID0gZnVuY3Rpb24oIF8sIGVzY2FwZWQsIGVzY2FwZWRXaGl0ZXNwYWNlICkgewoJCXZhciBoaWdoID0gIjB4IiArIGVzY2FwZWQgLSAweDEwMDAwOwoJCS8vIE5hTiBtZWFucyBub24tY29kZXBvaW50CgkJLy8gU3VwcG9ydDogRmlyZWZveDwyNAoJCS8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgKyIweCIKCQlyZXR1cm4gaGlnaCAhPT0gaGlnaCB8fCBlc2NhcGVkV2hpdGVzcGFjZSA/CgkJCWVzY2FwZWQgOgoJCQloaWdoIDwgMCA/CgkJCQkvLyBCTVAgY29kZXBvaW50CgkJCQlTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDoKCQkJCS8vIFN1cHBsZW1lbnRhbCBQbGFuZSBjb2RlcG9pbnQgKHN1cnJvZ2F0ZSBwYWlyKQoJCQkJU3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7Cgl9LAoKCS8vIENTUyBzdHJpbmcvaWRlbnRpZmllciBzZXJpYWxpemF0aW9uCgkvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI2NvbW1vbi1zZXJpYWxpemluZy1pZGlvbXMKCXJjc3Nlc2NhcGUgPSAvKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZywKCWZjc3Nlc2NhcGUgPSBmdW5jdGlvbiggY2gsIGFzQ29kZVBvaW50ICkgewoJCWlmICggYXNDb2RlUG9pbnQgKSB7CgoJCQkvLyBVKzAwMDAgTlVMTCBiZWNvbWVzIFUrRkZGRCBSRVBMQUNFTUVOVCBDSEFSQUNURVIKCQkJaWYgKCBjaCA9PT0gIlwwIiApIHsKCQkJCXJldHVybiAiXHVGRkZEIjsKCQkJfQoKCQkJLy8gQ29udHJvbCBjaGFyYWN0ZXJzIGFuZCAoZGVwZW5kZW50IHVwb24gcG9zaXRpb24pIG51bWJlcnMgZ2V0IGVzY2FwZWQgYXMgY29kZSBwb2ludHMKCQkJcmV0dXJuIGNoLnNsaWNlKCAwLCAtMSApICsgIlxcIiArIGNoLmNoYXJDb2RlQXQoIGNoLmxlbmd0aCAtIDEgKS50b1N0cmluZyggMTYgKSArICIgIjsKCQl9CgoJCS8vIE90aGVyIHBvdGVudGlhbGx5LXNwZWNpYWwgQVNDSUkgY2hhcmFjdGVycyBnZXQgYmFja3NsYXNoLWVzY2FwZWQKCQlyZXR1cm4gIlxcIiArIGNoOwoJfSwKCgkvLyBVc2VkIGZvciBpZnJhbWVzCgkvLyBTZWUgc2V0RG9jdW1lbnQoKQoJLy8gUmVtb3ZpbmcgdGhlIGZ1bmN0aW9uIHdyYXBwZXIgY2F1c2VzIGEgIlBlcm1pc3Npb24gRGVuaWVkIgoJLy8gZXJyb3IgaW4gSUUKCXVubG9hZEhhbmRsZXIgPSBmdW5jdGlvbigpIHsKCQlzZXREb2N1bWVudCgpOwoJfSwKCglkaXNhYmxlZEFuY2VzdG9yID0gYWRkQ29tYmluYXRvcigKCQlmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWUgJiYgKCJmb3JtIiBpbiBlbGVtIHx8ICJsYWJlbCIgaW4gZWxlbSk7CgkJfSwKCQl7IGRpcjogInBhcmVudE5vZGUiLCBuZXh0OiAibGVnZW5kIiB9CgkpOwoKLy8gT3B0aW1pemUgZm9yIHB1c2guYXBwbHkoIF8sIE5vZGVMaXN0ICkKdHJ5IHsKCXB1c2guYXBwbHkoCgkJKGFyciA9IHNsaWNlLmNhbGwoIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzICkpLAoJCXByZWZlcnJlZERvYy5jaGlsZE5vZGVzCgkpOwoJLy8gU3VwcG9ydDogQW5kcm9pZDw0LjAKCS8vIERldGVjdCBzaWxlbnRseSBmYWlsaW5nIHB1c2guYXBwbHkKCWFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7Cn0gY2F0Y2ggKCBlICkgewoJcHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggPwoKCQkvLyBMZXZlcmFnZSBzbGljZSBpZiBwb3NzaWJsZQoJCWZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHsKCQkJcHVzaF9uYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbChlbHMpICk7CgkJfSA6CgoJCS8vIFN1cHBvcnQ6IElFPDkKCQkvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5CgkJZnVuY3Rpb24oIHRhcmdldCwgZWxzICkgewoJCQl2YXIgaiA9IHRhcmdldC5sZW5ndGgsCgkJCQlpID0gMDsKCQkJLy8gQ2FuJ3QgdHJ1c3QgTm9kZUxpc3QubGVuZ3RoCgkJCXdoaWxlICggKHRhcmdldFtqKytdID0gZWxzW2krK10pICkge30KCQkJdGFyZ2V0Lmxlbmd0aCA9IGogLSAxOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7Cgl2YXIgbSwgaSwgZWxlbSwgbmlkLCBtYXRjaCwgZ3JvdXBzLCBuZXdTZWxlY3RvciwKCQluZXdDb250ZXh0ID0gY29udGV4dCAmJiBjb250ZXh0Lm93bmVyRG9jdW1lbnQsCgoJCS8vIG5vZGVUeXBlIGRlZmF1bHRzIHRvIDksIHNpbmNlIGNvbnRleHQgZGVmYXVsdHMgdG8gZG9jdW1lbnQKCQlub2RlVHlwZSA9IGNvbnRleHQgPyBjb250ZXh0Lm5vZGVUeXBlIDogOTsKCglyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTsKCgkvLyBSZXR1cm4gZWFybHkgZnJvbSBjYWxscyB3aXRoIGludmFsaWQgc2VsZWN0b3Igb3IgY29udGV4dAoJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciIHx8ICFzZWxlY3RvciB8fAoJCW5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHsKCgkJcmV0dXJuIHJlc3VsdHM7Cgl9CgoJLy8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50cwoJaWYgKCAhc2VlZCApIHsKCgkJaWYgKCAoIGNvbnRleHQgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IHByZWZlcnJlZERvYyApICE9PSBkb2N1bWVudCApIHsKCQkJc2V0RG9jdW1lbnQoIGNvbnRleHQgKTsKCQl9CgkJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CgoJCWlmICggZG9jdW1lbnRJc0hUTUwgKSB7CgoJCQkvLyBJZiB0aGUgc2VsZWN0b3IgaXMgc3VmZmljaWVudGx5IHNpbXBsZSwgdHJ5IHVzaW5nIGEgImdldCpCeSoiIERPTSBtZXRob2QKCQkJLy8gKGV4Y2VwdGluZyBEb2N1bWVudEZyYWdtZW50IGNvbnRleHQsIHdoZXJlIHRoZSBtZXRob2RzIGRvbid0IGV4aXN0KQoJCQlpZiAoIG5vZGVUeXBlICE9PSAxMSAmJiAobWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICkpICkgewoKCQkJCS8vIElEIHNlbGVjdG9yCgkJCQlpZiAoIChtID0gbWF0Y2hbMV0pICkgewoKCQkJCQkvLyBEb2N1bWVudCBjb250ZXh0CgkJCQkJaWYgKCBub2RlVHlwZSA9PT0gOSApIHsKCQkJCQkJaWYgKCAoZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgKSB7CgoJCQkJCQkJLy8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXQKCQkJCQkJCS8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zCgkJCQkJCQkvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElECgkJCQkJCQlpZiAoIGVsZW0uaWQgPT09IG0gKSB7CgkJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJCQkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQkJCQl9CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCQkJfQoKCQkJCQkvLyBFbGVtZW50IGNvbnRleHQKCQkJCQl9IGVsc2UgewoKCQkJCQkJLy8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXQKCQkJCQkJLy8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnMKCQkJCQkJLy8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRAoJCQkJCQlpZiAoIG5ld0NvbnRleHQgJiYgKGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICYmCgkJCQkJCQljb250YWlucyggY29udGV4dCwgZWxlbSApICYmCgkJCQkJCQllbGVtLmlkID09PSBtICkgewoKCQkJCQkJCXJlc3VsdHMucHVzaCggZWxlbSApOwoJCQkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQkJCX0KCQkJCQl9CgoJCQkJLy8gVHlwZSBzZWxlY3RvcgoJCQkJfSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7CgkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApOwoJCQkJCXJldHVybiByZXN1bHRzOwoKCQkJCS8vIENsYXNzIHNlbGVjdG9yCgkJCQl9IGVsc2UgaWYgKCAobSA9IG1hdGNoWzNdKSAmJiBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYKCQkJCQljb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7CgoJCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7CgkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQl9CgkJCX0KCgkJCS8vIFRha2UgYWR2YW50YWdlIG9mIHF1ZXJ5U2VsZWN0b3JBbGwKCQkJaWYgKCBzdXBwb3J0LnFzYSAmJgoJCQkJIWNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF0gJiYKCQkJCSghcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSkgKSB7CgoJCQkJaWYgKCBub2RlVHlwZSAhPT0gMSApIHsKCQkJCQluZXdDb250ZXh0ID0gY29udGV4dDsKCQkJCQluZXdTZWxlY3RvciA9IHNlbGVjdG9yOwoKCQkJCS8vIHFTQSBsb29rcyBvdXRzaWRlIEVsZW1lbnQgY29udGV4dCwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudAoJCQkJLy8gVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoaXMgd29ya2Fyb3VuZCB0ZWNobmlxdWUKCQkJCS8vIFN1cHBvcnQ6IElFIDw9OAoJCQkJLy8gRXhjbHVkZSBvYmplY3QgZWxlbWVudHMKCQkJCX0gZWxzZSBpZiAoIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gIm9iamVjdCIgKSB7CgoJCQkJCS8vIENhcHR1cmUgdGhlIGNvbnRleHQgSUQsIHNldHRpbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5CgkJCQkJaWYgKCAobmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoICJpZCIgKSkgKSB7CgkJCQkJCW5pZCA9IG5pZC5yZXBsYWNlKCByY3NzZXNjYXBlLCBmY3NzZXNjYXBlICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJY29udGV4dC5zZXRBdHRyaWJ1dGUoICJpZCIsIChuaWQgPSBleHBhbmRvKSApOwoJCQkJCX0KCgkJCQkJLy8gUHJlZml4IGV2ZXJ5IHNlbGVjdG9yIGluIHRoZSBsaXN0CgkJCQkJZ3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7CgkJCQkJaSA9IGdyb3Vwcy5sZW5ndGg7CgkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCWdyb3Vwc1tpXSA9ICIjIiArIG5pZCArICIgIiArIHRvU2VsZWN0b3IoIGdyb3Vwc1tpXSApOwoJCQkJCX0KCQkJCQluZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCAiLCIgKTsKCgkJCQkJLy8gRXhwYW5kIGNvbnRleHQgZm9yIHNpYmxpbmcgc2VsZWN0b3JzCgkJCQkJbmV3Q29udGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8CgkJCQkJCWNvbnRleHQ7CgkJCQl9CgoJCQkJaWYgKCBuZXdTZWxlY3RvciApIHsKCQkJCQl0cnkgewoJCQkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLAoJCQkJCQkJbmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApCgkJCQkJCSk7CgkJCQkJCXJldHVybiByZXN1bHRzOwoJCQkJCX0gY2F0Y2ggKCBxc2FFcnJvciApIHsKCQkJCQl9IGZpbmFsbHkgewoJCQkJCQlpZiAoIG5pZCA9PT0gZXhwYW5kbyApIHsKCQkJCQkJCWNvbnRleHQucmVtb3ZlQXR0cmlidXRlKCAiaWQiICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLy8gQWxsIG90aGVycwoJcmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sICIkMSIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApOwp9CgovKioKICogQ3JlYXRlIGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBzaXplCiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGgKICoJcHJvcGVydHkgbmFtZSB0aGUgKHNwYWNlLXN1ZmZpeGVkKSBzdHJpbmcgYW5kIChpZiB0aGUgY2FjaGUgaXMgbGFyZ2VyIHRoYW4gRXhwci5jYWNoZUxlbmd0aCkKICoJZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeQogKi8KZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7Cgl2YXIga2V5cyA9IFtdOwoKCWZ1bmN0aW9uIGNhY2hlKCBrZXksIHZhbHVlICkgewoJCS8vIFVzZSAoa2V5ICsgIiAiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KQoJCWlmICgga2V5cy5wdXNoKCBrZXkgKyAiICIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7CgkJCS8vIE9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgZW50cmllcwoJCQlkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdOwoJCX0KCQlyZXR1cm4gKGNhY2hlWyBrZXkgKyAiICIgXSA9IHZhbHVlKTsKCX0KCXJldHVybiBjYWNoZTsKfQoKLyoqCiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlCiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtYXJrCiAqLwpmdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkgewoJZm5bIGV4cGFuZG8gXSA9IHRydWU7CglyZXR1cm4gZm47Cn0KCi8qKgogKiBTdXBwb3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudAogKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0CiAqLwpmdW5jdGlvbiBhc3NlcnQoIGZuICkgewoJdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKTsKCgl0cnkgewoJCXJldHVybiAhIWZuKCBlbCApOwoJfSBjYXRjaCAoZSkgewoJCXJldHVybiBmYWxzZTsKCX0gZmluYWxseSB7CgkJLy8gUmVtb3ZlIGZyb20gaXRzIHBhcmVudCBieSBkZWZhdWx0CgkJaWYgKCBlbC5wYXJlbnROb2RlICkgewoJCQllbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbCApOwoJCX0KCQkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQoJCWVsID0gbnVsbDsKCX0KfQoKLyoqCiAqIEFkZHMgdGhlIHNhbWUgaGFuZGxlciBmb3IgYWxsIG9mIHRoZSBzcGVjaWZpZWQgYXR0cnMKICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlcwogKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGFwcGxpZWQKICovCmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7Cgl2YXIgYXJyID0gYXR0cnMuc3BsaXQoInwiKSwKCQlpID0gYXJyLmxlbmd0aDsKCgl3aGlsZSAoIGktLSApIHsKCQlFeHByLmF0dHJIYW5kbGVbIGFycltpXSBdID0gaGFuZGxlcjsKCX0KfQoKLyoqCiAqIENoZWNrcyBkb2N1bWVudCBvcmRlciBvZiB0d28gc2libGluZ3MKICogQHBhcmFtIHtFbGVtZW50fSBhCiAqIEBwYXJhbSB7RWxlbWVudH0gYgogKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIGxlc3MgdGhhbiAwIGlmIGEgcHJlY2VkZXMgYiwgZ3JlYXRlciB0aGFuIDAgaWYgYSBmb2xsb3dzIGIKICovCmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHsKCXZhciBjdXIgPSBiICYmIGEsCgkJZGlmZiA9IGN1ciAmJiBhLm5vZGVUeXBlID09PSAxICYmIGIubm9kZVR5cGUgPT09IDEgJiYKCQkJYS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7CgoJLy8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzCglpZiAoIGRpZmYgKSB7CgkJcmV0dXJuIGRpZmY7Cgl9CgoJLy8gQ2hlY2sgaWYgYiBmb2xsb3dzIGEKCWlmICggY3VyICkgewoJCXdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7CgkJCWlmICggY3VyID09PSBiICkgewoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJfQoJfQoKCXJldHVybiBhID8gMSA6IC0xOwp9CgovKioKICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlcwogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKi8KZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7CglyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJcmV0dXJuIG5hbWUgPT09ICJpbnB1dCIgJiYgZWxlbS50eXBlID09PSB0eXBlOwoJfTsKfQoKLyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgYnV0dG9ucwogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKi8KZnVuY3Rpb24gY3JlYXRlQnV0dG9uUHNldWRvKCB0eXBlICkgewoJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCXZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJCXJldHVybiAobmFtZSA9PT0gImlucHV0IiB8fCBuYW1lID09PSAiYnV0dG9uIikgJiYgZWxlbS50eXBlID09PSB0eXBlOwoJfTsKfQoKLyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgOmVuYWJsZWQvOmRpc2FibGVkCiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzYWJsZWQgdHJ1ZSBmb3IgOmRpc2FibGVkOyBmYWxzZSBmb3IgOmVuYWJsZWQKICovCmZ1bmN0aW9uIGNyZWF0ZURpc2FibGVkUHNldWRvKCBkaXNhYmxlZCApIHsKCgkvLyBLbm93biA6ZGlzYWJsZWQgZmFsc2UgcG9zaXRpdmVzOiBmaWVsZHNldFtkaXNhYmxlZF0gPiBsZWdlbmQ6bnRoLW9mLXR5cGUobisyKSA6Y2FuLWRpc2FibGUKCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gT25seSBjZXJ0YWluIGVsZW1lbnRzIGNhbiBtYXRjaCA6ZW5hYmxlZCBvciA6ZGlzYWJsZWQKCQkvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1lbmFibGVkCgkJLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjc2VsZWN0b3ItZGlzYWJsZWQKCQlpZiAoICJmb3JtIiBpbiBlbGVtICkgewoKCQkJLy8gQ2hlY2sgZm9yIGluaGVyaXRlZCBkaXNhYmxlZG5lc3Mgb24gcmVsZXZhbnQgbm9uLWRpc2FibGVkIGVsZW1lbnRzOgoJCQkvLyAqIGxpc3RlZCBmb3JtLWFzc29jaWF0ZWQgZWxlbWVudHMgaW4gYSBkaXNhYmxlZCBmaWVsZHNldAoJCQkvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY2F0ZWdvcnktbGlzdGVkCgkJCS8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjb25jZXB0LWZlLWRpc2FibGVkCgkJCS8vICogb3B0aW9uIGVsZW1lbnRzIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXAKCQkJLy8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NvbmNlcHQtb3B0aW9uLWRpc2FibGVkCgkJCS8vIEFsbCBzdWNoIGVsZW1lbnRzIGhhdmUgYSAiZm9ybSIgcHJvcGVydHkuCgkJCWlmICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlICkgewoKCQkJCS8vIE9wdGlvbiBlbGVtZW50cyBkZWZlciB0byBhIHBhcmVudCBvcHRncm91cCBpZiBwcmVzZW50CgkJCQlpZiAoICJsYWJlbCIgaW4gZWxlbSApIHsKCQkJCQlpZiAoICJsYWJlbCIgaW4gZWxlbS5wYXJlbnROb2RlICkgewoJCQkJCQlyZXR1cm4gZWxlbS5wYXJlbnROb2RlLmRpc2FibGVkID09PSBkaXNhYmxlZDsKCQkJCQl9IGVsc2UgewoJCQkJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFN1cHBvcnQ6IElFIDYgLSAxMQoJCQkJLy8gVXNlIHRoZSBpc0Rpc2FibGVkIHNob3J0Y3V0IHByb3BlcnR5IHRvIGNoZWNrIGZvciBkaXNhYmxlZCBmaWVsZHNldCBhbmNlc3RvcnMKCQkJCXJldHVybiBlbGVtLmlzRGlzYWJsZWQgPT09IGRpc2FibGVkIHx8CgoJCQkJCS8vIFdoZXJlIHRoZXJlIGlzIG5vIGlzRGlzYWJsZWQsIGNoZWNrIG1hbnVhbGx5CgkJCQkJLyoganNoaW50IC1XMDE4ICovCgkJCQkJZWxlbS5pc0Rpc2FibGVkICE9PSAhZGlzYWJsZWQgJiYKCQkJCQkJZGlzYWJsZWRBbmNlc3RvciggZWxlbSApID09PSBkaXNhYmxlZDsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGRpc2FibGVkOwoKCQkvLyBUcnkgdG8gd2lubm93IG91dCBlbGVtZW50cyB0aGF0IGNhbid0IGJlIGRpc2FibGVkIGJlZm9yZSB0cnVzdGluZyB0aGUgZGlzYWJsZWQgcHJvcGVydHkuCgkJLy8gU29tZSB2aWN0aW1zIGdldCBjYXVnaHQgaW4gb3VyIG5ldCAobGFiZWwsIGxlZ2VuZCwgbWVudSwgdHJhY2spLCBidXQgaXQgc2hvdWxkbid0CgkJLy8gZXZlbiBleGlzdCBvbiB0aGVtLCBsZXQgYWxvbmUgaGF2ZSBhIGJvb2xlYW4gdmFsdWUuCgkJfSBlbHNlIGlmICggImxhYmVsIiBpbiBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7CgkJfQoKCQkvLyBSZW1haW5pbmcgZWxlbWVudHMgYXJlIG5laXRoZXIgOmVuYWJsZWQgbm9yIDpkaXNhYmxlZAoJCXJldHVybiBmYWxzZTsKCX07Cn0KCi8qKgogKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzCiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuCiAqLwpmdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHsKCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGFyZ3VtZW50ICkgewoJCWFyZ3VtZW50ID0gK2FyZ3VtZW50OwoJCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7CgkJCXZhciBqLAoJCQkJbWF0Y2hJbmRleGVzID0gZm4oIFtdLCBzZWVkLmxlbmd0aCwgYXJndW1lbnQgKSwKCQkJCWkgPSBtYXRjaEluZGV4ZXMubGVuZ3RoOwoKCQkJLy8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzCgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHsKCQkJCQlzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7CgkJCQl9CgkJCX0KCQl9KTsKCX0pOwp9CgovKioKICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dAogKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0PX0gY29udGV4dAogKiBAcmV0dXJucyB7RWxlbWVudHxPYmplY3R8Qm9vbGVhbn0gVGhlIGlucHV0IG5vZGUgaWYgYWNjZXB0YWJsZSwgb3RoZXJ3aXNlIGEgZmFsc3kgdmFsdWUKICovCmZ1bmN0aW9uIHRlc3RDb250ZXh0KCBjb250ZXh0ICkgewoJcmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICYmIGNvbnRleHQ7Cn0KCi8vIEV4cG9zZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlCnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9OwoKLyoqCiAqIERldGVjdHMgWE1MIG5vZGVzCiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0gQW4gZWxlbWVudCBvciBhIGRvY3VtZW50CiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGUKICovCmlzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0CgkvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMykKCXZhciBkb2N1bWVudEVsZW1lbnQgPSBlbGVtICYmIChlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSkuZG9jdW1lbnRFbGVtZW50OwoJcmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIDogZmFsc2U7Cn07CgovKioKICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50CiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IFtkb2NdIEFuIGVsZW1lbnQgb3IgZG9jdW1lbnQgb2JqZWN0IHRvIHVzZSB0byBzZXQgdGhlIGRvY3VtZW50CiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGN1cnJlbnQgZG9jdW1lbnQKICovCnNldERvY3VtZW50ID0gU2l6emxlLnNldERvY3VtZW50ID0gZnVuY3Rpb24oIG5vZGUgKSB7Cgl2YXIgaGFzQ29tcGFyZSwgc3ViV2luZG93LAoJCWRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYzsKCgkvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZAoJaWYgKCBkb2MgPT09IGRvY3VtZW50IHx8IGRvYy5ub2RlVHlwZSAhPT0gOSB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCApIHsKCQlyZXR1cm4gZG9jdW1lbnQ7Cgl9CgoJLy8gVXBkYXRlIGdsb2JhbCB2YXJpYWJsZXMKCWRvY3VtZW50ID0gZG9jOwoJZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCWRvY3VtZW50SXNIVE1MID0gIWlzWE1MKCBkb2N1bWVudCApOwoKCS8vIFN1cHBvcnQ6IElFIDktMTEsIEVkZ2UKCS8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgInBlcm1pc3Npb24gZGVuaWVkIiBlcnJvcnMgKGpRdWVyeSAjMTM5MzYpCglpZiAoIHByZWZlcnJlZERvYyAhPT0gZG9jdW1lbnQgJiYKCQkoc3ViV2luZG93ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcpICYmIHN1YldpbmRvdy50b3AgIT09IHN1YldpbmRvdyApIHsKCgkJLy8gU3VwcG9ydDogSUUgMTEsIEVkZ2UKCQlpZiAoIHN1YldpbmRvdy5hZGRFdmVudExpc3RlbmVyICkgewoJCQlzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggInVubG9hZCIsIHVubG9hZEhhbmRsZXIsIGZhbHNlICk7CgoJCS8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5CgkJfSBlbHNlIGlmICggc3ViV2luZG93LmF0dGFjaEV2ZW50ICkgewoJCQlzdWJXaW5kb3cuYXR0YWNoRXZlbnQoICJvbnVubG9hZCIsIHVubG9hZEhhbmRsZXIgKTsKCQl9Cgl9CgoJLyogQXR0cmlidXRlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIFN1cHBvcnQ6IElFPDgKCS8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllcwoJLy8gKGV4Y2VwdGluZyBJRTggYm9vbGVhbnMpCglzdXBwb3J0LmF0dHJpYnV0ZXMgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJCWVsLmNsYXNzTmFtZSA9ICJpIjsKCQlyZXR1cm4gIWVsLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIik7Cgl9KTsKCgkvKiBnZXRFbGVtZW50KHMpQnkqCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSByZXR1cm5zIG9ubHkgZWxlbWVudHMKCXN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJCWVsLmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSApOwoJCXJldHVybiAhZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg7Cgl9KTsKCgkvLyBTdXBwb3J0OiBJRTw5CglzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTsKCgkvLyBTdXBwb3J0OiBJRTwxMAoJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudEJ5SWQgcmV0dXJucyBlbGVtZW50cyBieSBuYW1lCgkvLyBUaGUgYnJva2VuIGdldEVsZW1lbnRCeUlkIG1ldGhvZHMgZG9uJ3QgcGljayB1cCBwcm9ncmFtbWF0aWNhbGx5LXNldCBuYW1lcywKCS8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdAoJc3VwcG9ydC5nZXRCeUlkID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCQlkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlkID0gZXhwYW5kbzsKCQlyZXR1cm4gIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lIHx8ICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDsKCX0pOwoKCS8vIElEIGZpbHRlciBhbmQgZmluZAoJaWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7CgkJRXhwci5maWx0ZXJbIklEIl0gPSBmdW5jdGlvbiggaWQgKSB7CgkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09IGF0dHJJZDsKCQkJfTsKCQl9OwoJCUV4cHIuZmluZFsiSUQiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7CgkJCQl2YXIgZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7CgkJCQlyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107CgkJCX0KCQl9OwoJfSBlbHNlIHsKCQlFeHByLmZpbHRlclsiSUQiXSA9ICBmdW5jdGlvbiggaWQgKSB7CgkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmCgkJCQkJZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpOwoJCQkJcmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkOwoJCQl9OwoJCX07CgoJCS8vIFN1cHBvcnQ6IElFIDYgLSA3IG9ubHkKCQkvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0CgkJRXhwci5maW5kWyJJRCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkgewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudElzSFRNTCApIHsKCQkJCXZhciBub2RlLCBpLCBlbGVtcywKCQkJCQllbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTsKCgkJCQlpZiAoIGVsZW0gKSB7CgoJCQkJCS8vIFZlcmlmeSB0aGUgaWQgYXR0cmlidXRlCgkJCQkJbm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsKCQkJCQlpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7CgkJCQkJCXJldHVybiBbIGVsZW0gXTsKCQkJCQl9CgoJCQkJCS8vIEZhbGwgYmFjayBvbiBnZXRFbGVtZW50c0J5TmFtZQoJCQkJCWVsZW1zID0gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSggaWQgKTsKCQkJCQlpID0gMDsKCQkJCQl3aGlsZSAoIChlbGVtID0gZWxlbXNbaSsrXSkgKSB7CgkJCQkJCW5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7CgkJCQkJCWlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHsKCQkJCQkJCXJldHVybiBbIGVsZW0gXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gW107CgkJCX0KCQl9OwoJfQoKCS8vIFRhZwoJRXhwci5maW5kWyJUQUciXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPwoJCWZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7CgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOwoKCQkJLy8gRG9jdW1lbnRGcmFnbWVudCBub2RlcyBkb24ndCBoYXZlIGdFQlROCgkJCX0gZWxzZSBpZiAoIHN1cHBvcnQucXNhICkgewoJCQkJcmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnICk7CgkJCX0KCQl9IDoKCgkJZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHsKCQkJdmFyIGVsZW0sCgkJCQl0bXAgPSBbXSwKCQkJCWkgPSAwLAoJCQkJLy8gQnkgaGFwcHkgY29pbmNpZGVuY2UsIGEgKGJyb2tlbikgZ0VCVE4gYXBwZWFycyBvbiBEb2N1bWVudEZyYWdtZW50IG5vZGVzIHRvbwoJCQkJcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOwoKCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cwoJCQlpZiAoIHRhZyA9PT0gIioiICkgewoJCQkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQl0bXAucHVzaCggZWxlbSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdG1wOwoJCQl9CgkJCXJldHVybiByZXN1bHRzOwoJCX07CgoJLy8gQ2xhc3MKCUV4cHIuZmluZFsiQ0xBU1MiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0ICkgewoJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApOwoJCX0KCX07CgoJLyogUVNBL21hdGNoZXNTZWxlY3RvcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnQKCgkvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KQoJcmJ1Z2d5TWF0Y2hlcyA9IFtdOwoKCS8vIHFTYSg6Zm9jdXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpCgkvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3IKCS8vIHdoZW5ldmVyIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YCBpcyBhY2Nlc3NlZCBvbiBhbiBpZnJhbWUKCS8vIFNvLCB3ZSBhbGxvdyA6Zm9jdXMgdG8gcGFzcyB0aHJvdWdoIFFTQSBhbGwgdGhlIHRpbWUgdG8gYXZvaWQgdGhlIElFIGVycm9yCgkvLyBTZWUgaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4CglyYnVnZ3lRU0EgPSBbXTsKCglpZiAoIChzdXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApKSApIHsKCQkvLyBCdWlsZCBRU0EgcmVnZXgKCQkvLyBSZWdleCBzdHJhdGVneSBhZG9wdGVkIGZyb20gRGllZ28gUGVyaW5pCgkJYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCQkJLy8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZQoJCQkvLyBUaGlzIGlzIHRvIHRlc3QgSUUncyB0cmVhdG1lbnQgb2Ygbm90IGV4cGxpY2l0bHkKCQkJLy8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsCgkJCS8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoCgkJCS8vIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjM1OQoJCQlkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlubmVySFRNTCA9ICI8YSBpZD0nIiArIGV4cGFuZG8gKyAiJz48L2E+IiArCgkJCQkiPHNlbGVjdCBpZD0nIiArIGV4cGFuZG8gKyAiLVxyXFwnIG1zYWxsb3djYXB0dXJlPScnPiIgKwoJCQkJIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IjsKCgkJCS8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTYKCQkJLy8gTm90aGluZyBzaG91bGQgYmUgc2VsZWN0ZWQgd2hlbiBlbXB0eSBzdHJpbmdzIGZvbGxvdyBePSBvciAkPSBvciAqPQoJCQkvLyBUaGUgdGVzdCBhdHRyaWJ1dGUgbXVzdCBiZSB1bmtub3duIGluIE9wZXJhIGJ1dCAic2FmZSIgZm9yIFdpblJUCgkJCS8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvaGg0NjUzODguYXNweCNhdHRyaWJ1dGVfc2VjdGlvbgoJCQlpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIlttc2FsbG93Y2FwdHVyZV49JyddIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJbKl4kXT0iICsgd2hpdGVzcGFjZSArICIqKD86Jyd8XCJcIikiICk7CgkJCX0KCgkJCS8vIFN1cHBvcnQ6IElFOAoJCQkvLyBCb29sZWFuIGF0dHJpYnV0ZXMgYW5kICJ2YWx1ZSIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseQoJCQlpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJcXFsiICsgd2hpdGVzcGFjZSArICIqKD86dmFsdWV8IiArIGJvb2xlYW5zICsgIikiICk7CgkJCX0KCgkJCS8vIFN1cHBvcnQ6IENocm9tZTwyOSwgQW5kcm9pZDw0LjQsIFNhZmFyaTw3LjArLCBpT1M8Ny4wKywgUGhhbnRvbUpTPDEuOS44KwoJCQlpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCAiW2lkfj0iICsgZXhwYW5kbyArICItXSIgKS5sZW5ndGggKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCgifj0iKTsKCQkJfQoKCQkJLy8gV2Via2l0L09wZXJhIC0gOmNoZWNrZWQgc2hvdWxkIHJldHVybiBzZWxlY3RlZCBvcHRpb24gZWxlbWVudHMKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWQKCQkJLy8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHMKCQkJaWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGggKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCgiOmNoZWNrZWQiKTsKCQkJfQoKCQkJLy8gU3VwcG9ydDogU2FmYXJpIDgrLCBpT1MgOCsKCQkJLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MQoJCQkvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJsaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzCgkJCWlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoICJhIyIgKyBleHBhbmRvICsgIisqIiApLmxlbmd0aCApIHsKCQkJCXJidWdneVFTQS5wdXNoKCIuIy4rWyt+XSIpOwoJCQl9CgkJfSk7CgoJCWFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkJCWVsLmlubmVySFRNTCA9ICI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPiIgKwoJCQkJIjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iOwoKCQkJLy8gU3VwcG9ydDogV2luZG93cyA4IE5hdGl2ZSBBcHBzCgkJCS8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudAoJCQl2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwoJCQlpbnB1dC5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgImhpZGRlbiIgKTsKCQkJZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCAibmFtZSIsICJEIiApOwoKCQkJLy8gU3VwcG9ydDogSUU4CgkJCS8vIEVuZm9yY2UgY2FzZS1zZW5zaXRpdml0eSBvZiBuYW1lIGF0dHJpYnV0ZQoJCQlpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJuYW1lIiArIHdoaXRlc3BhY2UgKyAiKlsqXiR8IX5dPz0iICk7CgkJCX0KCgkJCS8vIEZGIDMuNSAtIDplbmFibGVkLzpkaXNhYmxlZCBhbmQgaGlkZGVuIGVsZW1lbnRzIChoaWRkZW4gZWxlbWVudHMgYXJlIHN0aWxsIGVuYWJsZWQpCgkJCS8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzCgkJCWlmICggZWwucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGggIT09IDIgKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCggIjplbmFibGVkIiwgIjpkaXNhYmxlZCIgKTsKCQkJfQoKCQkJLy8gU3VwcG9ydDogSUU5LTExKwoJCQkvLyBJRSdzIDpkaXNhYmxlZCBzZWxlY3RvciBkb2VzIG5vdCBwaWNrIHVwIHRoZSBjaGlsZHJlbiBvZiBkaXNhYmxlZCBmaWVsZHNldHMKCQkJZG9jRWxlbS5hcHBlbmRDaGlsZCggZWwgKS5kaXNhYmxlZCA9IHRydWU7CgkJCWlmICggZWwucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoICE9PSAyICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICI6ZW5hYmxlZCIsICI6ZGlzYWJsZWQiICk7CgkJCX0KCgkJCS8vIE9wZXJhIDEwLTExIGRvZXMgbm90IHRocm93IG9uIHBvc3QtY29tbWEgaW52YWxpZCBwc2V1ZG9zCgkJCWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKTsKCQkJcmJ1Z2d5UVNBLnB1c2goIiwuKjoiKTsKCQl9KTsKCX0KCglpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHwKCQlkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fAoJCWRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8CgkJZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8CgkJZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7CgoJCWFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkJCS8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvcgoJCQkvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KQoJCQlzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoID0gbWF0Y2hlcy5jYWxsKCBlbCwgIioiICk7CgoJCQkvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uCgkJCS8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWQKCQkJbWF0Y2hlcy5jYWxsKCBlbCwgIltzIT0nJ106eCIgKTsKCQkJcmJ1Z2d5TWF0Y2hlcy5wdXNoKCAiIT0iLCBwc2V1ZG9zICk7CgkJfSk7Cgl9CgoJcmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbigifCIpICk7CglyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKCJ8IikgKTsKCgkvKiBDb250YWlucwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJaGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApOwoKCS8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlcgoJLy8gUHVycG9zZWZ1bGx5IHNlbGYtZXhjbHVzaXZlCgkvLyBBcyBpbiwgYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZgoJY29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID8KCQlmdW5jdGlvbiggYSwgYiApIHsKCQkJdmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50IDogYSwKCQkJCWJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlOwoJCQlyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmICgKCQkJCWFkb3duLmNvbnRhaW5zID8KCQkJCQlhZG93bi5jb250YWlucyggYnVwICkgOgoJCQkJCWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNgoJCQkpKTsKCQl9IDoKCQlmdW5jdGlvbiggYSwgYiApIHsKCQkJaWYgKCBiICkgewoJCQkJd2hpbGUgKCAoYiA9IGIucGFyZW50Tm9kZSkgKSB7CgkJCQkJaWYgKCBiID09PSBhICkgewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX07CgoJLyogU29ydGluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmcKCXNvcnRPcmRlciA9IGhhc0NvbXBhcmUgPwoJZnVuY3Rpb24oIGEsIGIgKSB7CgoJCS8vIEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsCgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCS8vIFNvcnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb24KCQl2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247CgkJaWYgKCBjb21wYXJlICkgewoJCQlyZXR1cm4gY29tcGFyZTsKCQl9CgoJCS8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnQKCQljb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgPwoJCQlhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBiICkgOgoKCQkJLy8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkCgkJCTE7CgoJCS8vIERpc2Nvbm5lY3RlZCBub2RlcwoJCWlmICggY29tcGFyZSAmIDEgfHwKCQkJKCFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUpICkgewoKCQkJLy8gQ2hvb3NlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcmVsYXRlZCB0byBvdXIgcHJlZmVycmVkIGRvY3VtZW50CgkJCWlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHsKCQkJCXJldHVybiAtMTsKCQkJfQoJCQlpZiAoIGIgPT09IGRvY3VtZW50IHx8IGIub3duZXJEb2N1bWVudCA9PT0gcHJlZmVycmVkRG9jICYmIGNvbnRhaW5zKHByZWZlcnJlZERvYywgYikgKSB7CgkJCQlyZXR1cm4gMTsKCQkJfQoKCQkJLy8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXIKCQkJcmV0dXJuIHNvcnRJbnB1dCA/CgkJCQkoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6CgkJCQkwOwoJCX0KCgkJcmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxOwoJfSA6CglmdW5jdGlvbiggYSwgYiApIHsKCQkvLyBFeGl0IGVhcmx5IGlmIHRoZSBub2RlcyBhcmUgaWRlbnRpY2FsCgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCXZhciBjdXIsCgkJCWkgPSAwLAoJCQlhdXAgPSBhLnBhcmVudE5vZGUsCgkJCWJ1cCA9IGIucGFyZW50Tm9kZSwKCQkJYXAgPSBbIGEgXSwKCQkJYnAgPSBbIGIgXTsKCgkJLy8gUGFyZW50bGVzcyBub2RlcyBhcmUgZWl0aGVyIGRvY3VtZW50cyBvciBkaXNjb25uZWN0ZWQKCQlpZiAoICFhdXAgfHwgIWJ1cCApIHsKCQkJcmV0dXJuIGEgPT09IGRvY3VtZW50ID8gLTEgOgoJCQkJYiA9PT0gZG9jdW1lbnQgPyAxIDoKCQkJCWF1cCA/IC0xIDoKCQkJCWJ1cCA/IDEgOgoJCQkJc29ydElucHV0ID8KCQkJCSggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDoKCQkJCTA7CgoJCS8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrCgkJfSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7CgkJCXJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTsKCQl9CgoJCS8vIE90aGVyd2lzZSB3ZSBuZWVkIGZ1bGwgbGlzdHMgb2YgdGhlaXIgYW5jZXN0b3JzIGZvciBjb21wYXJpc29uCgkJY3VyID0gYTsKCQl3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7CgkJCWFwLnVuc2hpZnQoIGN1ciApOwoJCX0KCQljdXIgPSBiOwoJCXdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHsKCQkJYnAudW5zaGlmdCggY3VyICk7CgkJfQoKCQkvLyBXYWxrIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBkaXNjcmVwYW5jeQoJCXdoaWxlICggYXBbaV0gPT09IGJwW2ldICkgewoJCQlpKys7CgkJfQoKCQlyZXR1cm4gaSA/CgkJCS8vIERvIGEgc2libGluZyBjaGVjayBpZiB0aGUgbm9kZXMgaGF2ZSBhIGNvbW1vbiBhbmNlc3RvcgoJCQlzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDoKCgkJCS8vIE90aGVyd2lzZSBub2RlcyBpbiBvdXIgZG9jdW1lbnQgc29ydCBmaXJzdAoJCQlhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOgoJCQlicFtpXSA9PT0gcHJlZmVycmVkRG9jID8gMSA6CgkJCTA7Cgl9OwoKCXJldHVybiBkb2N1bWVudDsKfTsKClNpenpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1lbnRzICkgewoJcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTsKfTsKClNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHsKCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAoJaWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkgewoJCXNldERvY3VtZW50KCBlbGVtICk7Cgl9CgoJLy8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkCglleHByID0gZXhwci5yZXBsYWNlKCByYXR0cmlidXRlUXVvdGVzLCAiPSckMSddIiApOwoKCWlmICggc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgJiYgZG9jdW1lbnRJc0hUTUwgJiYKCQkhY29tcGlsZXJDYWNoZVsgZXhwciArICIgIiBdICYmCgkJKCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJgoJCSggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHsKCgkJdHJ5IHsKCQkJdmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApOwoKCQkJLy8gSUUgOSdzIG1hdGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5lY3RlZCBub2RlcwoJCQlpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8CgkJCQkJLy8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnQKCQkJCQkvLyBmcmFnbWVudCBpbiBJRSA5CgkJCQkJZWxlbS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5vZGVUeXBlICE9PSAxMSApIHsKCQkJCXJldHVybiByZXQ7CgkJCX0KCQl9IGNhdGNoIChlKSB7fQoJfQoKCXJldHVybiBTaXp6bGUoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBbIGVsZW0gXSApLmxlbmd0aCA+IDA7Cn07CgpTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggY29udGV4dCwgZWxlbSApIHsKCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAoJaWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkgewoJCXNldERvY3VtZW50KCBjb250ZXh0ICk7Cgl9CglyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTsKfTsKClNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWQKCWlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHsKCQlzZXREb2N1bWVudCggZWxlbSApOwoJfQoKCXZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sCgkJLy8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpCgkJdmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgPwoJCQlmbiggZWxlbSwgbmFtZSwgIWRvY3VtZW50SXNIVE1MICkgOgoJCQl1bmRlZmluZWQ7CgoJcmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID8KCQl2YWwgOgoJCXN1cHBvcnQuYXR0cmlidXRlcyB8fCAhZG9jdW1lbnRJc0hUTUwgPwoJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDoKCQkJKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSkgJiYgdmFsLnNwZWNpZmllZCA/CgkJCQl2YWwudmFsdWUgOgoJCQkJbnVsbDsKfTsKClNpenpsZS5lc2NhcGUgPSBmdW5jdGlvbiggc2VsICkgewoJcmV0dXJuIChzZWwgKyAiIikucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApOwp9OwoKU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHsKCXRocm93IG5ldyBFcnJvciggIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2cgKTsKfTsKCi8qKgogKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzCiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzCiAqLwpTaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkgewoJdmFyIGVsZW0sCgkJZHVwbGljYXRlcyA9IFtdLAoJCWogPSAwLAoJCWkgPSAwOwoKCS8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRldGVjdCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2UKCWhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7Cglzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHJlc3VsdHMuc2xpY2UoIDAgKTsKCXJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7CgoJaWYgKCBoYXNEdXBsaWNhdGUgKSB7CgkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CgkJCWlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSBdICkgewoJCQkJaiA9IGR1cGxpY2F0ZXMucHVzaCggaSApOwoJCQl9CgkJfQoJCXdoaWxlICggai0tICkgewoJCQlyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7CgkJfQoJfQoKCS8vIENsZWFyIGlucHV0IGFmdGVyIHNvcnRpbmcgdG8gcmVsZWFzZSBvYmplY3RzCgkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvcHVsbC8yMjUKCXNvcnRJbnB1dCA9IG51bGw7CgoJcmV0dXJuIHJlc3VsdHM7Cn07CgovKioKICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXMKICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtCiAqLwpnZXRUZXh0ID0gU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbSApIHsKCXZhciBub2RlLAoJCXJldCA9ICIiLAoJCWkgPSAwLAoJCW5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTsKCglpZiAoICFub2RlVHlwZSApIHsKCQkvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheQoJCXdoaWxlICggKG5vZGUgPSBlbGVtW2krK10pICkgewoJCQkvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2RlcwoJCQlyZXQgKz0gZ2V0VGV4dCggbm9kZSApOwoJCX0KCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHsKCQkvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzCgkJLy8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1MykKCQlpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7CgkJfSBlbHNlIHsKCQkJLy8gVHJhdmVyc2UgaXRzIGNoaWxkcmVuCgkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewoJCQkJcmV0ICs9IGdldFRleHQoIGVsZW0gKTsKCQkJfQoJCX0KCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkgewoJCXJldHVybiBlbGVtLm5vZGVWYWx1ZTsKCX0KCS8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2RlcwoKCXJldHVybiByZXQ7Cn07CgpFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsKCgkvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXIKCWNhY2hlTGVuZ3RoOiA1MCwKCgljcmVhdGVQc2V1ZG86IG1hcmtGdW5jdGlvbiwKCgltYXRjaDogbWF0Y2hFeHByLAoKCWF0dHJIYW5kbGU6IHt9LAoKCWZpbmQ6IHt9LAoKCXJlbGF0aXZlOiB7CgkJIj4iOiB7IGRpcjogInBhcmVudE5vZGUiLCBmaXJzdDogdHJ1ZSB9LAoJCSIgIjogeyBkaXI6ICJwYXJlbnROb2RlIiB9LAoJCSIrIjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciLCBmaXJzdDogdHJ1ZSB9LAoJCSJ+IjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciIH0KCX0sCgoJcHJlRmlsdGVyOiB7CgkJIkFUVFIiOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCW1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTsKCgkJCS8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkCgkJCW1hdGNoWzNdID0gKCBtYXRjaFszXSB8fCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgoJCQlpZiAoIG1hdGNoWzJdID09PSAifj0iICkgewoJCQkJbWF0Y2hbM10gPSAiICIgKyBtYXRjaFszXSArICIgIjsKCQkJfQoKCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCA0ICk7CgkJfSwKCgkJIkNISUxEIjogZnVuY3Rpb24oIG1hdGNoICkgewoJCQkvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByWyJDSElMRCJdCgkJCQkxIHR5cGUgKG9ubHl8bnRofC4uLikKCQkJCTIgd2hhdCAoY2hpbGR8b2YtdHlwZSkKCQkJCTMgYXJndW1lbnQgKGV2ZW58b2RkfFxkKnxcZCpuKFsrLV1cZCspP3wuLi4pCgkJCQk0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xkKm58KQoJCQkJNSBzaWduIG9mIHhuLWNvbXBvbmVudAoJCQkJNiB4IG9mIHhuLWNvbXBvbmVudAoJCQkJNyBzaWduIG9mIHktY29tcG9uZW50CgkJCQk4IHkgb2YgeS1jb21wb25lbnQKCQkJKi8KCQkJbWF0Y2hbMV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpOwoKCQkJaWYgKCBtYXRjaFsxXS5zbGljZSggMCwgMyApID09PSAibnRoIiApIHsKCQkJCS8vIG50aC0qIHJlcXVpcmVzIGFyZ3VtZW50CgkJCQlpZiAoICFtYXRjaFszXSApIHsKCQkJCQlTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7CgkJCQl9CgoJCQkJLy8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxECgkJCQkvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xCgkJCQltYXRjaFs0XSA9ICsoIG1hdGNoWzRdID8gbWF0Y2hbNV0gKyAobWF0Y2hbNl0gfHwgMSkgOiAyICogKCBtYXRjaFszXSA9PT0gImV2ZW4iIHx8IG1hdGNoWzNdID09PSAib2RkIiApICk7CgkJCQltYXRjaFs1XSA9ICsoICggbWF0Y2hbN10gKyBtYXRjaFs4XSApIHx8IG1hdGNoWzNdID09PSAib2RkIiApOwoKCQkJLy8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIG1hdGNoWzNdICkgewoJCQkJU2l6emxlLmVycm9yKCBtYXRjaFswXSApOwoJCQl9CgoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBtYXRjaCApIHsKCQkJdmFyIGV4Y2VzcywKCQkJCXVucXVvdGVkID0gIW1hdGNoWzZdICYmIG1hdGNoWzJdOwoKCQkJaWYgKCBtYXRjaEV4cHJbIkNISUxEIl0udGVzdCggbWF0Y2hbMF0gKSApIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgoJCQkvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pcwoJCQlpZiAoIG1hdGNoWzNdICkgewoJCQkJbWF0Y2hbMl0gPSBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIjsKCgkJCS8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIHVucXVvdGVkICYmIHJwc2V1ZG8udGVzdCggdW5xdW90ZWQgKSAmJgoJCQkJLy8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSkKCQkJCShleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiYKCQkJCS8vIGFkdmFuY2UgdG8gdGhlIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpcwoJCQkJKGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoICIpIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGgpICkgewoKCQkJCS8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4CgkJCQltYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKCAwLCBleGNlc3MgKTsKCQkJCW1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApOwoJCQl9CgoJCQkvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudCkKCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCAzICk7CgkJfQoJfSwKCglmaWx0ZXI6IHsKCgkJIlRBRyI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkgewoJCQl2YXIgbm9kZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIG5vZGVOYW1lU2VsZWN0b3IgPT09ICIqIiA/CgkJCQlmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOgoJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTsKCQkJCX07CgkJfSwKCgkJIkNMQVNTIjogZnVuY3Rpb24oIGNsYXNzTmFtZSApIHsKCQkJdmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyAiICIgXTsKCgkJCXJldHVybiBwYXR0ZXJuIHx8CgkJCQkocGF0dGVybiA9IG5ldyBSZWdFeHAoICIoXnwiICsgd2hpdGVzcGFjZSArICIpIiArIGNsYXNzTmFtZSArICIoIiArIHdoaXRlc3BhY2UgKyAifCQpIiApKSAmJgoJCQkJY2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJCQlyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09ICJzdHJpbmciICYmIGVsZW0uY2xhc3NOYW1lIHx8IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSAhPT0gInVuZGVmaW5lZCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiIgKTsKCQkJCX0pOwoJCX0sCgoJCSJBVFRSIjogZnVuY3Rpb24oIG5hbWUsIG9wZXJhdG9yLCBjaGVjayApIHsKCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJdmFyIHJlc3VsdCA9IFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICk7CgoJCQkJaWYgKCByZXN1bHQgPT0gbnVsbCApIHsKCQkJCQlyZXR1cm4gb3BlcmF0b3IgPT09ICIhPSI7CgkJCQl9CgkJCQlpZiAoICFvcGVyYXRvciApIHsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCgkJCQlyZXN1bHQgKz0gIiI7CgoJCQkJcmV0dXJuIG9wZXJhdG9yID09PSAiPSIgPyByZXN1bHQgPT09IGNoZWNrIDoKCQkJCQlvcGVyYXRvciA9PT0gIiE9IiA/IHJlc3VsdCAhPT0gY2hlY2sgOgoJCQkJCW9wZXJhdG9yID09PSAiXj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDAgOgoJCQkJCW9wZXJhdG9yID09PSAiKj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPiAtMSA6CgkJCQkJb3BlcmF0b3IgPT09ICIkPSIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOgoJCQkJCW9wZXJhdG9yID09PSAifj0iID8gKCAiICIgKyByZXN1bHQucmVwbGFjZSggcndoaXRlc3BhY2UsICIgIiApICsgIiAiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDoKCQkJCQlvcGVyYXRvciA9PT0gInw9IiA/IHJlc3VsdCA9PT0gY2hlY2sgfHwgcmVzdWx0LnNsaWNlKCAwLCBjaGVjay5sZW5ndGggKyAxICkgPT09IGNoZWNrICsgIi0iIDoKCQkJCQlmYWxzZTsKCQkJfTsKCQl9LAoKCQkiQ0hJTEQiOiBmdW5jdGlvbiggdHlwZSwgd2hhdCwgYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkgewoJCQl2YXIgc2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSAibnRoIiwKCQkJCWZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSAibGFzdCIsCgkJCQlvZlR5cGUgPSB3aGF0ID09PSAib2YtdHlwZSI7CgoJCQlyZXR1cm4gZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCA/CgoJCQkJLy8gU2hvcnRjdXQgZm9yIDpudGgtKihuKQoJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkJcmV0dXJuICEhZWxlbS5wYXJlbnROb2RlOwoJCQkJfSA6CgoJCQkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJCQl2YXIgY2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LAoJCQkJCQlkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyAibmV4dFNpYmxpbmciIDogInByZXZpb3VzU2libGluZyIsCgkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSwKCQkJCQkJbmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksCgkJCQkJCXVzZUNhY2hlID0gIXhtbCAmJiAhb2ZUeXBlLAoJCQkJCQlkaWZmID0gZmFsc2U7CgoJCQkJCWlmICggcGFyZW50ICkgewoKCQkJCQkJLy8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKQoJCQkJCQlpZiAoIHNpbXBsZSApIHsKCQkJCQkJCXdoaWxlICggZGlyICkgewoJCQkJCQkJCW5vZGUgPSBlbGVtOwoJCQkJCQkJCXdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7CgkJCQkJCQkJCWlmICggb2ZUeXBlID8KCQkJCQkJCQkJCW5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6CgkJCQkJCQkJCQlub2RlLm5vZGVUeXBlID09PSAxICkgewoKCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQkvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbykKCQkJCQkJCQlzdGFydCA9IGRpciA9IHR5cGUgPT09ICJvbmx5IiAmJiAhc3RhcnQgJiYgIm5leHRTaWJsaW5nIjsKCQkJCQkJCX0KCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQl9CgoJCQkJCQlzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdOwoKCQkJCQkJLy8gbm9uLXhtbCA6bnRoLWNoaWxkKC4uLikgc3RvcmVzIGNhY2hlIGRhdGEgb24gYHBhcmVudGAKCQkJCQkJaWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkgewoKCQkJCQkJCS8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleAoKCQkJCQkJCS8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXkKCQkJCQkJCW5vZGUgPSBwYXJlbnQ7CgkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJLy8gU3VwcG9ydDogSUUgPDkgb25seQoJCQkJCQkJLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpCgkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCShvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7CgoJCQkJCQkJY2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdOwoJCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdOwoJCQkJCQkJZGlmZiA9IG5vZGVJbmRleCAmJiBjYWNoZVsgMiBdOwoJCQkJCQkJbm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07CgoJCQkJCQkJd2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHwKCgkJCQkJCQkJLy8gRmFsbGJhY2sgdG8gc2Vla2luZyBgZWxlbWAgZnJvbSB0aGUgc3RhcnQKCQkJCQkJCQkoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHsKCgkJCQkJCQkJLy8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWsKCQkJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7CgkJCQkJCQkJCXVuaXF1ZUNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlCgkJCQkJCQlpZiAoIHVzZUNhY2hlICkgewoJCQkJCQkJCS8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXkKCQkJCQkJCQlub2RlID0gZWxlbTsKCQkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJCQkvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSkKCQkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCQkob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pOwoKCQkJCQkJCQljYWNoZSA9IHVuaXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107CgkJCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdOwoJCQkJCQkJCWRpZmYgPSBub2RlSW5kZXg7CgkJCQkJCQl9CgoJCQkJCQkJLy8geG1sIDpudGgtY2hpbGQoLi4uKQoJCQkJCQkJLy8gb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKQoJCQkJCQkJaWYgKCBkaWZmID09PSBmYWxzZSApIHsKCQkJCQkJCQkvLyBVc2UgdGhlIHNhbWUgbG9vcCBhcyBhYm92ZSB0byBzZWVrIGBlbGVtYCBmcm9tIHRoZSBzdGFydAoJCQkJCQkJCXdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8CgkJCQkJCQkJCShkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkgewoKCQkJCQkJCQkJaWYgKCAoIG9mVHlwZSA/CgkJCQkJCQkJCQlub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOgoJCQkJCQkJCQkJbm9kZS5ub2RlVHlwZSA9PT0gMSApICYmCgkJCQkJCQkJCQkrK2RpZmYgKSB7CgoJCQkJCQkJCQkJLy8gQ2FjaGUgdGhlIGluZGV4IG9mIGVhY2ggZW5jb3VudGVyZWQgZWxlbWVudAoJCQkJCQkJCQkJaWYgKCB1c2VDYWNoZSApIHsKCQkJCQkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJCQkJCQkvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSkKCQkJCQkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCQkJCQkob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pOwoKCQkJCQkJCQkJCQl1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07CgkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJaWYgKCBub2RlID09PSBlbGVtICkgewoJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQkvLyBJbmNvcnBvcmF0ZSB0aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZQoJCQkJCQlkaWZmIC09IGxhc3Q7CgkJCQkJCXJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOwoJCQkJCX0KCQkJCX07CgkJfSwKCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkgewoJCQkvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3NlcwoJCQkvLyBQcmlvcml0aXplIGJ5IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBlcmNhc2UgbGV0dGVycwoJCQkvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zCgkJCXZhciBhcmdzLAoJCQkJZm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fAoJCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIHBzZXVkbzogIiArIHBzZXVkbyApOwoKCQkJLy8gVGhlIHVzZXIgbWF5IHVzZSBjcmVhdGVQc2V1ZG8gdG8gaW5kaWNhdGUgdGhhdAoJCQkvLyBhcmd1bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvbgoJCQkvLyBqdXN0IGFzIFNpenpsZSBkb2VzCgkJCWlmICggZm5bIGV4cGFuZG8gXSApIHsKCQkJCXJldHVybiBmbiggYXJndW1lbnQgKTsKCQkJfQoKCQkJLy8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzCgkJCWlmICggZm4ubGVuZ3RoID4gMSApIHsKCQkJCWFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCAiIiwgYXJndW1lbnQgXTsKCQkJCXJldHVybiBFeHByLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgPwoJCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHsKCQkJCQkJdmFyIGlkeCwKCQkJCQkJCW1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSwKCQkJCQkJCWkgPSBtYXRjaGVkLmxlbmd0aDsKCQkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCQlpZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkW2ldICk7CgkJCQkJCQlzZWVkWyBpZHggXSA9ICEoIG1hdGNoZXNbIGlkeCBdID0gbWF0Y2hlZFtpXSApOwoJCQkJCQl9CgkJCQkJfSkgOgoJCQkJCWZ1bmN0aW9uKCBlbGVtICkgewoJCQkJCQlyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTsKCQkJCQl9OwoJCQl9CgoJCQlyZXR1cm4gZm47CgkJfQoJfSwKCglwc2V1ZG9zOiB7CgkJLy8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zCgkJIm5vdCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJCS8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlCgkJCS8vIHRvIGF2b2lkIHRyZWF0aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nCgkJCS8vIHNwYWNlcyBhcyBjb21iaW5hdG9ycwoJCQl2YXIgaW5wdXQgPSBbXSwKCQkJCXJlc3VsdHMgPSBbXSwKCQkJCW1hdGNoZXIgPSBjb21waWxlKCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgIiQxIiApICk7CgoJCQlyZXR1cm4gbWF0Y2hlclsgZXhwYW5kbyBdID8KCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkgewoJCQkJCXZhciBlbGVtLAoJCQkJCQl1bm1hdGNoZWQgPSBtYXRjaGVyKCBzZWVkLCBudWxsLCB4bWwsIFtdICksCgkJCQkJCWkgPSBzZWVkLmxlbmd0aDsKCgkJCQkJLy8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYAoJCQkJCXdoaWxlICggaS0tICkgewoJCQkJCQlpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHsKCQkJCQkJCXNlZWRbaV0gPSAhKG1hdGNoZXNbaV0gPSBlbGVtKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0pIDoKCQkJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CgkJCQkJaW5wdXRbMF0gPSBlbGVtOwoJCQkJCW1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTsKCQkJCQkvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KQoJCQkJCWlucHV0WzBdID0gbnVsbDsKCQkJCQlyZXR1cm4gIXJlc3VsdHMucG9wKCk7CgkJCQl9OwoJCX0pLAoKCQkiaGFzIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJcmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwOwoJCQl9OwoJCX0pLAoKCQkiY29udGFpbnMiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHRleHQgKSB7CgkJCXRleHQgPSB0ZXh0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgkJCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgZ2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7CgkJCX07CgkJfSksCgoJCS8vICJXaGV0aGVyIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9yCgkJLy8gaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUKCQkvLyBiZWluZyBlcXVhbCB0byB0aGUgaWRlbnRpZmllciBDLAoJCS8vIG9yIGJlZ2lubmluZyB3aXRoIHRoZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgIi0iLgoJCS8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LgoJCS8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuIgoJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG8KCQkibGFuZyI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7CgkJCS8vIGxhbmcgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXIKCQkJaWYgKCAhcmlkZW50aWZpZXIudGVzdChsYW5nIHx8ICIiKSApIHsKCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIGxhbmc6ICIgKyBsYW5nICk7CgkJCX0KCQkJbGFuZyA9IGxhbmcucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgZWxlbUxhbmc7CgkJCQlkbyB7CgkJCQkJaWYgKCAoZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/CgkJCQkJCWVsZW0ubGFuZyA6CgkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJsYW5nIikpICkgewoKCQkJCQkJZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpOwoJCQkJCQlyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArICItIiApID09PSAwOwoJCQkJCX0KCQkJCX0gd2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9OwoJCX0pLAoKCQkvLyBNaXNjZWxsYW5lb3VzCgkJInRhcmdldCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaGFzaDsKCQkJcmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkOwoJCX0sCgoJCSJyb290IjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtID09PSBkb2NFbGVtOwoJCX0sCgoJCSJmb2N1cyI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFiSW5kZXgpOwoJCX0sCgoJCS8vIEJvb2xlYW4gcHJvcGVydGllcwoJCSJlbmFibGVkIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGZhbHNlICksCgkJImRpc2FibGVkIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIHRydWUgKSwKCgkJImNoZWNrZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gSW4gQ1NTMywgOmNoZWNrZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzCgkJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkCgkJCXZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIChub2RlTmFtZSA9PT0gImlucHV0IiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwgKG5vZGVOYW1lID09PSAib3B0aW9uIiAmJiAhIWVsZW0uc2VsZWN0ZWQpOwoJCX0sCgoJCSJzZWxlY3RlZCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0CgkJCS8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHkKCQkJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7CgkJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7CgkJfSwKCgkJLy8gQ29udGVudHMKCQkiZW1wdHkiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG8KCQkJLy8gOmVtcHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAoMSkgb3IgY29udGVudCBub2RlcyAodGV4dDogMzsgY2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLAoJCQkvLyAgIGJ1dCBub3QgYnkgb3RoZXJzIChjb21tZW50OiA4OyBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiA3OyBldGMuKQoJCQkvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuCgkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJInBhcmVudCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gIUV4cHIucHNldWRvc1siZW1wdHkiXSggZWxlbSApOwoJCX0sCgoJCS8vIEVsZW1lbnQvaW5wdXQgdHlwZXMKCQkiaGVhZGVyIjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiByaGVhZGVyLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsKCQl9LAoKCQkiaW5wdXQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApOwoJCX0sCgoJCSJidXR0b24iOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJCXJldHVybiBuYW1lID09PSAiaW5wdXQiICYmIGVsZW0udHlwZSA9PT0gImJ1dHRvbiIgfHwgbmFtZSA9PT0gImJ1dHRvbiI7CgkJfSwKCgkJInRleHQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIGF0dHI7CgkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYKCQkJCWVsZW0udHlwZSA9PT0gInRleHQiICYmCgoJCQkJLy8gU3VwcG9ydDogSUU8OAoJCQkJLy8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sICJzZWFyY2giKSBhcHBlYXIgd2l0aCBlbGVtLnR5cGUgPT09ICJ0ZXh0IgoJCQkJKCAoYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSAidGV4dCIgKTsKCQl9LAoKCQkvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uCgkJImZpcnN0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbigpIHsKCQkJcmV0dXJuIFsgMCBdOwoJCX0pLAoKCQkibGFzdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgewoJCQlyZXR1cm4gWyBsZW5ndGggLSAxIF07CgkJfSksCgoJCSJlcSI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKCQkJcmV0dXJuIFsgYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudCBdOwoJCX0pLAoKCQkiZXZlbiI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgewoJCQl2YXIgaSA9IDA7CgkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkgewoJCQkJbWF0Y2hJbmRleGVzLnB1c2goIGkgKTsKCQkJfQoJCQlyZXR1cm4gbWF0Y2hJbmRleGVzOwoJCX0pLAoKCQkib2RkIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7CgkJCXZhciBpID0gMTsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7CgkJCQltYXRjaEluZGV4ZXMucHVzaCggaSApOwoJCQl9CgkJCXJldHVybiBtYXRjaEluZGV4ZXM7CgkJfSksCgoJCSJsdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKCQkJdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50OwoJCQlmb3IgKCA7IC0taSA+PSAwOyApIHsKCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKCQl9KSwKCgkJImd0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgewoJCQl2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7CgkJCWZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHsKCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKCQl9KQoJfQp9OwoKRXhwci5wc2V1ZG9zWyJudGgiXSA9IEV4cHIucHNldWRvc1siZXEiXTsKCi8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zCmZvciAoIGkgaW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1ZSB9ICkgewoJRXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApOwp9CmZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7CglFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApOwp9CgovLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNldEZpbHRlcnMKZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9CnNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zOwpFeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0RmlsdGVycygpOwoKdG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHsKCXZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0eXBlLAoJCXNvRmFyLCBncm91cHMsIHByZUZpbHRlcnMsCgkJY2FjaGVkID0gdG9rZW5DYWNoZVsgc2VsZWN0b3IgKyAiICIgXTsKCglpZiAoIGNhY2hlZCApIHsKCQlyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApOwoJfQoKCXNvRmFyID0gc2VsZWN0b3I7Cglncm91cHMgPSBbXTsKCXByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjsKCgl3aGlsZSAoIHNvRmFyICkgewoKCQkvLyBDb21tYSBhbmQgZmlyc3QgcnVuCgkJaWYgKCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7CgkJCWlmICggbWF0Y2ggKSB7CgkJCQkvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZAoJCQkJc29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICkgfHwgc29GYXI7CgkJCX0KCQkJZ3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTsKCQl9CgoJCW1hdGNoZWQgPSBmYWxzZTsKCgkJLy8gQ29tYmluYXRvcnMKCQlpZiAoIChtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApKSApIHsKCQkJbWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7CgkJCXRva2Vucy5wdXNoKHsKCQkJCXZhbHVlOiBtYXRjaGVkLAoJCQkJLy8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlCgkJCQl0eXBlOiBtYXRjaFswXS5yZXBsYWNlKCBydHJpbSwgIiAiICkKCQkJfSk7CgkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CgkJfQoKCQkvLyBGaWx0ZXJzCgkJZm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHsKCQkJaWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fAoJCQkJKG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7CgkJCQltYXRjaGVkID0gbWF0Y2guc2hpZnQoKTsKCQkJCXRva2Vucy5wdXNoKHsKCQkJCQl2YWx1ZTogbWF0Y2hlZCwKCQkJCQl0eXBlOiB0eXBlLAoJCQkJCW1hdGNoZXM6IG1hdGNoCgkJCQl9KTsKCQkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CgkJCX0KCQl9CgoJCWlmICggIW1hdGNoZWQgKSB7CgkJCWJyZWFrOwoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNlc3MKCS8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZwoJLy8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvciBvciByZXR1cm4gdG9rZW5zCglyZXR1cm4gcGFyc2VPbmx5ID8KCQlzb0Zhci5sZW5ndGggOgoJCXNvRmFyID8KCQkJU2l6emxlLmVycm9yKCBzZWxlY3RvciApIDoKCQkJLy8gQ2FjaGUgdGhlIHRva2VucwoJCQl0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTsKfTsKCmZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHsKCXZhciBpID0gMCwKCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAoJCXNlbGVjdG9yID0gIiI7Cglmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQlzZWxlY3RvciArPSB0b2tlbnNbaV0udmFsdWU7Cgl9CglyZXR1cm4gc2VsZWN0b3I7Cn0KCmZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7Cgl2YXIgZGlyID0gY29tYmluYXRvci5kaXIsCgkJc2tpcCA9IGNvbWJpbmF0b3IubmV4dCwKCQlrZXkgPSBza2lwIHx8IGRpciwKCQljaGVja05vbkVsZW1lbnRzID0gYmFzZSAmJiBrZXkgPT09ICJwYXJlbnROb2RlIiwKCQlkb25lTmFtZSA9IGRvbmUrKzsKCglyZXR1cm4gY29tYmluYXRvci5maXJzdCA/CgkJLy8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50CgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkgewoJCQkJCXJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfSA6CgoJCS8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50cwoJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CgkJCXZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsCgkJCQluZXdDYWNoZSA9IFsgZGlycnVucywgZG9uZU5hbWUgXTsKCgkJCS8vIFdlIGNhbid0IHNldCBhcmJpdHJhcnkgZGF0YSBvbiBYTUwgbm9kZXMsIHNvIHRoZXkgZG9uJ3QgYmVuZWZpdCBmcm9tIGNvbWJpbmF0b3IgY2FjaGluZwoJCQlpZiAoIHhtbCApIHsKCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CgkJCQkJCWlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7CgkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CgkJCQkJCW91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKGVsZW1bIGV4cGFuZG8gXSA9IHt9KTsKCgkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpCgkJCQkJCXVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7CgoJCQkJCQlpZiAoIHNraXAgJiYgc2tpcCA9PT0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICkgewoJCQkJCQkJZWxlbSA9IGVsZW1bIGRpciBdIHx8IGVsZW07CgkJCQkJCX0gZWxzZSBpZiAoIChvbGRDYWNoZSA9IHVuaXF1ZUNhY2hlWyBrZXkgXSkgJiYKCQkJCQkJCW9sZENhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgb2xkQ2FjaGVbIDEgXSA9PT0gZG9uZU5hbWUgKSB7CgoJCQkJCQkJLy8gQXNzaWduIHRvIG5ld0NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHMKCQkJCQkJCXJldHVybiAobmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50cwoJCQkJCQkJdW5pcXVlQ2FjaGVbIGtleSBdID0gbmV3Q2FjaGU7CgoJCQkJCQkJLy8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nCgkJCQkJCQlpZiAoIChuZXdDYWNoZVsgMiBdID0gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkpICkgewoJCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9Owp9CgpmdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7CglyZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/CgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJdmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7CgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCAhbWF0Y2hlcnNbaV0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkgewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gdHJ1ZTsKCQl9IDoKCQltYXRjaGVyc1swXTsKfQoKZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkgewoJdmFyIGkgPSAwLAoJCWxlbiA9IGNvbnRleHRzLmxlbmd0aDsKCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewoJCVNpenpsZSggc2VsZWN0b3IsIGNvbnRleHRzW2ldLCByZXN1bHRzICk7Cgl9CglyZXR1cm4gcmVzdWx0czsKfQoKZnVuY3Rpb24gY29uZGVuc2UoIHVubWF0Y2hlZCwgbWFwLCBmaWx0ZXIsIGNvbnRleHQsIHhtbCApIHsKCXZhciBlbGVtLAoJCW5ld1VubWF0Y2hlZCA9IFtdLAoJCWkgPSAwLAoJCWxlbiA9IHVubWF0Y2hlZC5sZW5ndGgsCgkJbWFwcGVkID0gbWFwICE9IG51bGw7CgoJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJaWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7CgkJCWlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkgewoJCQkJbmV3VW5tYXRjaGVkLnB1c2goIGVsZW0gKTsKCQkJCWlmICggbWFwcGVkICkgewoJCQkJCW1hcC5wdXNoKCBpICk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIG5ld1VubWF0Y2hlZDsKfQoKZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkgewoJaWYgKCBwb3N0RmlsdGVyICYmICFwb3N0RmlsdGVyWyBleHBhbmRvIF0gKSB7CgkJcG9zdEZpbHRlciA9IHNldE1hdGNoZXIoIHBvc3RGaWx0ZXIgKTsKCX0KCWlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkgewoJCXBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTsKCX0KCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHsKCQl2YXIgdGVtcCwgaSwgZWxlbSwKCQkJcHJlTWFwID0gW10sCgkJCXBvc3RNYXAgPSBbXSwKCQkJcHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCwKCgkJCS8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0CgkJCWVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCAiKiIsIGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksCgoJCQkvLyBQcmVmaWx0ZXIgdG8gZ2V0IG1hdGNoZXIgaW5wdXQsIHByZXNlcnZpbmcgYSBtYXAgZm9yIHNlZWQtcmVzdWx0cyBzeW5jaHJvbml6YXRpb24KCQkJbWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/CgkJCQljb25kZW5zZSggZWxlbXMsIHByZU1hcCwgcHJlRmlsdGVyLCBjb250ZXh0LCB4bWwgKSA6CgkJCQllbGVtcywKCgkJCW1hdGNoZXJPdXQgPSBtYXRjaGVyID8KCQkJCS8vIElmIHdlIGhhdmUgYSBwb3N0RmluZGVyLCBvciBmaWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyIG9yIHByZWV4aXN0aW5nIHJlc3VsdHMsCgkJCQlwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/CgoJCQkJCS8vIC4uLmludGVybWVkaWF0ZSBwcm9jZXNzaW5nIGlzIG5lY2Vzc2FyeQoJCQkJCVtdIDoKCgkJCQkJLy8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5CgkJCQkJcmVzdWx0cyA6CgkJCQltYXRjaGVySW47CgoJCS8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzCgkJaWYgKCBtYXRjaGVyICkgewoJCQltYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApOwoJCX0KCgkJLy8gQXBwbHkgcG9zdEZpbHRlcgoJCWlmICggcG9zdEZpbHRlciApIHsKCQkJdGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7CgkJCXBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTsKCgkJCS8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW4KCQkJaSA9IHRlbXAubGVuZ3RoOwoJCQl3aGlsZSAoIGktLSApIHsKCQkJCWlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHsKCQkJCQltYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7CgkJCQl9CgkJCX0KCQl9CgoJCWlmICggc2VlZCApIHsKCQkJaWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHsKCQkJCWlmICggcG9zdEZpbmRlciApIHsKCQkJCQkvLyBHZXQgdGhlIGZpbmFsIG1hdGNoZXJPdXQgYnkgY29uZGVuc2luZyB0aGlzIGludGVybWVkaWF0ZSBpbnRvIHBvc3RGaW5kZXIgY29udGV4dHMKCQkJCQl0ZW1wID0gW107CgkJCQkJaSA9IG1hdGNoZXJPdXQubGVuZ3RoOwoJCQkJCXdoaWxlICggaS0tICkgewoJCQkJCQlpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7CgkJCQkJCQkvLyBSZXN0b3JlIG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQgYSBmaW5hbCBtYXRjaAoJCQkJCQkJdGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlwb3N0RmluZGVyKCBudWxsLCAobWF0Y2hlck91dCA9IFtdKSwgdGVtcCwgeG1sICk7CgkJCQl9CgoJCQkJLy8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWQKCQkJCWkgPSBtYXRjaGVyT3V0Lmxlbmd0aDsKCQkJCXdoaWxlICggaS0tICkgewoJCQkJCWlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSAmJgoJCQkJCQkodGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mKCBzZWVkLCBlbGVtICkgOiBwcmVNYXBbaV0pID4gLTEgKSB7CgoJCQkJCQlzZWVkW3RlbXBdID0gIShyZXN1bHRzW3RlbXBdID0gZWxlbSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCS8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZAoJCX0gZWxzZSB7CgkJCW1hdGNoZXJPdXQgPSBjb25kZW5zZSgKCQkJCW1hdGNoZXJPdXQgPT09IHJlc3VsdHMgPwoJCQkJCW1hdGNoZXJPdXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6CgkJCQkJbWF0Y2hlck91dAoJCQkpOwoJCQlpZiAoIHBvc3RGaW5kZXIgKSB7CgkJCQlwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTsKCQkJfSBlbHNlIHsKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTsKCQkJfQoJCX0KCX0pOwp9CgpmdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkgewoJdmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaiwKCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAoJCWxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1swXS50eXBlIF0sCgkJaW1wbGljaXRSZWxhdGl2ZSA9IGxlYWRpbmdSZWxhdGl2ZSB8fCBFeHByLnJlbGF0aXZlWyIgIl0sCgkJaSA9IGxlYWRpbmdSZWxhdGl2ZSA/IDEgOiAwLAoKCQkvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKQoJCW1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0OwoJCX0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSwKCQltYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGluZGV4T2YoIGNoZWNrQ29udGV4dCwgZWxlbSApID4gLTE7CgkJfSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLAoJCW1hdGNoZXJzID0gWyBmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgewoJCQl2YXIgcmV0ID0gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8ICgKCQkJCShjaGVja0NvbnRleHQgPSBjb250ZXh0KS5ub2RlVHlwZSA/CgkJCQkJbWF0Y2hDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSA6CgkJCQkJbWF0Y2hBbnlDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSApOwoJCQkvLyBBdm9pZCBoYW5naW5nIG9udG8gZWxlbWVudCAoaXNzdWUgIzI5OSkKCQkJY2hlY2tDb250ZXh0ID0gbnVsbDsKCQkJcmV0dXJuIHJldDsKCQl9IF07CgoJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJaWYgKCAobWF0Y2hlciA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1tpXS50eXBlIF0pICkgewoJCQltYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlcikgXTsKCQl9IGVsc2UgewoJCQltYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7CgoJCQkvLyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlcgoJCQlpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHsKCQkJCS8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZwoJCQkJaiA9ICsraTsKCQkJCWZvciAoIDsgaiA8IGxlbjsgaisrICkgewoJCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJcmV0dXJuIHNldE1hdGNoZXIoCgkJCQkJaSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksCgkJCQkJaSA+IDEgJiYgdG9TZWxlY3RvcigKCQkJCQkJLy8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmAKCQkJCQkJdG9rZW5zLnNsaWNlKCAwLCBpIC0gMSApLmNvbmNhdCh7IHZhbHVlOiB0b2tlbnNbIGkgLSAyIF0udHlwZSA9PT0gIiAiID8gIioiIDogIiIgfSkKCQkJCQkpLnJlcGxhY2UoIHJ0cmltLCAiJDEiICksCgkJCQkJbWF0Y2hlciwKCQkJCQlpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSwKCQkJCQlqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksCgkJCQkJaiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKQoJCQkJKTsKCQkJfQoJCQltYXRjaGVycy5wdXNoKCBtYXRjaGVyICk7CgkJfQoJfQoKCXJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTsKfQoKZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgewoJdmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCwKCQlieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCwKCQlzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBvdXRlcm1vc3QgKSB7CgkJCXZhciBlbGVtLCBqLCBtYXRjaGVyLAoJCQkJbWF0Y2hlZENvdW50ID0gMCwKCQkJCWkgPSAiMCIsCgkJCQl1bm1hdGNoZWQgPSBzZWVkICYmIFtdLAoJCQkJc2V0TWF0Y2hlZCA9IFtdLAoJCQkJY29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsCgkJCQkvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0CgkJCQllbGVtcyA9IHNlZWQgfHwgYnlFbGVtZW50ICYmIEV4cHIuZmluZFsiVEFHIl0oICIqIiwgb3V0ZXJtb3N0ICksCgkJCQkvLyBVc2UgaW50ZWdlciBkaXJydW5zIGlmZiB0aGlzIGlzIHRoZSBvdXRlcm1vc3QgbWF0Y2hlcgoJCQkJZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksCgkJCQlsZW4gPSBlbGVtcy5sZW5ndGg7CgoJCQlpZiAoIG91dGVybW9zdCApIHsKCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDsKCQkJfQoKCQkJLy8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHMKCQkJLy8gU3VwcG9ydDogSUU8OSwgU2FmYXJpCgkJCS8vIFRvbGVyYXRlIE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiAibGVuZ3RoIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0Y2hpbmcgZWxlbWVudHMgYnkgaWQKCQkJZm9yICggOyBpICE9PSBsZW4gJiYgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBieUVsZW1lbnQgJiYgZWxlbSApIHsKCQkJCQlqID0gMDsKCQkJCQlpZiAoICFjb250ZXh0ICYmIGVsZW0ub3duZXJEb2N1bWVudCAhPT0gZG9jdW1lbnQgKSB7CgkJCQkJCXNldERvY3VtZW50KCBlbGVtICk7CgkJCQkJCXhtbCA9ICFkb2N1bWVudElzSFRNTDsKCQkJCQl9CgkJCQkJd2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHsKCQkJCQkJaWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0IHx8IGRvY3VtZW50LCB4bWwpICkgewoJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCQlpZiAoIG91dGVybW9zdCApIHsKCQkJCQkJZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnMKCQkJCWlmICggYnlTZXQgKSB7CgkJCQkJLy8gVGhleSB3aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVycwoJCQkJCWlmICggKGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtKSApIHsKCQkJCQkJbWF0Y2hlZENvdW50LS07CgkJCQkJfQoKCQkJCQkvLyBMZW5ndGhlbiB0aGUgYXJyYXkgZm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Igbm90CgkJCQkJaWYgKCBzZWVkICkgewoJCQkJCQl1bm1hdGNoZWQucHVzaCggZWxlbSApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gYGlgIGlzIG5vdyB0aGUgY291bnQgb2YgZWxlbWVudHMgdmlzaXRlZCBhYm92ZSwgYW5kIGFkZGluZyBpdCB0byBgbWF0Y2hlZENvdW50YAoJCQkvLyBtYWtlcyB0aGUgbGF0dGVyIG5vbm5lZ2F0aXZlLgoJCQltYXRjaGVkQ291bnQgKz0gaTsKCgkJCS8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50cwoJCQkvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgCgkJCS8vIGVxdWFscyBgaWApLCB1bmxlc3Mgd2UgZGlkbid0IHZpc2l0IF9hbnlfIGVsZW1lbnRzIGluIHRoZSBhYm92ZSBsb29wIGJlY2F1c2Ugd2UgaGF2ZQoJCQkvLyBubyBlbGVtZW50IG1hdGNoZXJzIGFuZCBubyBzZWVkLgoJCQkvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyAiMCIgYGlgIGFsbG93cyBgaWAgdG8gcmVtYWluIGEgc3RyaW5nIG9ubHkgaW4gdGhhdAoJCQkvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhICIwMCIgYG1hdGNoZWRDb3VudGAgdGhhdCBkaWZmZXJzIGZyb20gYGlgIGJ1dCBpcyBhbHNvCgkJCS8vIG51bWVyaWNhbGx5IHplcm8uCgkJCWlmICggYnlTZXQgJiYgaSAhPT0gbWF0Y2hlZENvdW50ICkgewoJCQkJaiA9IDA7CgkJCQl3aGlsZSAoIChtYXRjaGVyID0gc2V0TWF0Y2hlcnNbaisrXSkgKSB7CgkJCQkJbWF0Y2hlciggdW5tYXRjaGVkLCBzZXRNYXRjaGVkLCBjb250ZXh0LCB4bWwgKTsKCQkJCX0KCgkJCQlpZiAoIHNlZWQgKSB7CgkJCQkJLy8gUmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZwoJCQkJCWlmICggbWF0Y2hlZENvdW50ID4gMCApIHsKCQkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCQlpZiAoICEodW5tYXRjaGVkW2ldIHx8IHNldE1hdGNoZWRbaV0pICkgewoJCQkJCQkJCXNldE1hdGNoZWRbaV0gPSBwb3AuY2FsbCggcmVzdWx0cyApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBEaXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlcwoJCQkJCXNldE1hdGNoZWQgPSBjb25kZW5zZSggc2V0TWF0Y2hlZCApOwoJCQkJfQoKCQkJCS8vIEFkZCBtYXRjaGVzIHRvIHJlc3VsdHMKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTsKCgkJCQkvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmcKCQkJCWlmICggb3V0ZXJtb3N0ICYmICFzZWVkICYmIHNldE1hdGNoZWQubGVuZ3RoID4gMCAmJgoJCQkJCSggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAxICkgewoKCQkJCQlTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOwoJCQkJfQoJCQl9CgoJCQkvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnMKCQkJaWYgKCBvdXRlcm1vc3QgKSB7CgkJCQlkaXJydW5zID0gZGlycnVuc1VuaXF1ZTsKCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0QmFja3VwOwoJCQl9CgoJCQlyZXR1cm4gdW5tYXRjaGVkOwoJCX07CgoJcmV0dXJuIGJ5U2V0ID8KCQltYXJrRnVuY3Rpb24oIHN1cGVyTWF0Y2hlciApIDoKCQlzdXBlck1hdGNoZXI7Cn0KCmNvbXBpbGUgPSBTaXp6bGUuY29tcGlsZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgbWF0Y2ggLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7Cgl2YXIgaSwKCQlzZXRNYXRjaGVycyA9IFtdLAoJCWVsZW1lbnRNYXRjaGVycyA9IFtdLAoJCWNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF07CgoJaWYgKCAhY2FjaGVkICkgewoJCS8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudAoJCWlmICggIW1hdGNoICkgewoJCQltYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApOwoJCX0KCQlpID0gbWF0Y2gubGVuZ3RoOwoJCXdoaWxlICggaS0tICkgewoJCQljYWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggbWF0Y2hbaV0gKTsKCQkJaWYgKCBjYWNoZWRbIGV4cGFuZG8gXSApIHsKCQkJCXNldE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOwoJCQl9CgkJfQoKCQkvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24KCQljYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTsKCgkJLy8gU2F2ZSBzZWxlY3RvciBhbmQgdG9rZW5pemF0aW9uCgkJY2FjaGVkLnNlbGVjdG9yID0gc2VsZWN0b3I7Cgl9CglyZXR1cm4gY2FjaGVkOwp9OwoKLyoqCiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWQKICogIHNlbGVjdG9yIGZ1bmN0aW9ucwogKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc2VsZWN0b3IgQSBzZWxlY3RvciBvciBhIHByZS1jb21waWxlZAogKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZQogKiBAcGFyYW0ge0VsZW1lbnR9IGNvbnRleHQKICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdHNdCiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0CiAqLwpzZWxlY3QgPSBTaXp6bGUuc2VsZWN0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkgewoJdmFyIGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZpbmQsCgkJY29tcGlsZWQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgJiYgc2VsZWN0b3IsCgkJbWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7CgoJcmVzdWx0cyA9IHJlc3VsdHMgfHwgW107CgoJLy8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWQKCS8vICh0aGUgbGF0dGVyIG9mIHdoaWNoIGd1YXJhbnRlZXMgdXMgY29udGV4dCkKCWlmICggbWF0Y2gubGVuZ3RoID09PSAxICkgewoKCQkvLyBSZWR1Y2UgY29udGV4dCBpZiB0aGUgbGVhZGluZyBjb21wb3VuZCBzZWxlY3RvciBpcyBhbiBJRAoJCXRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTsKCQlpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gIklEIiAmJgoJCQkJY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJiBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkgewoKCQkJY29udGV4dCA9ICggRXhwci5maW5kWyJJRCJdKCB0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UocnVuZXNjYXBlLCBmdW5lc2NhcGUpLCBjb250ZXh0ICkgfHwgW10gKVswXTsKCQkJaWYgKCAhY29udGV4dCApIHsKCQkJCXJldHVybiByZXN1bHRzOwoKCQkJLy8gUHJlY29tcGlsZWQgbWF0Y2hlcnMgd2lsbCBzdGlsbCB2ZXJpZnkgYW5jZXN0cnksIHNvIHN0ZXAgdXAgYSBsZXZlbAoJCQl9IGVsc2UgaWYgKCBjb21waWxlZCApIHsKCQkJCWNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGU7CgkJCX0KCgkJCXNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApOwoJCX0KCgkJLy8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZwoJCWkgPSBtYXRjaEV4cHJbIm5lZWRzQ29udGV4dCJdLnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDsKCQl3aGlsZSAoIGktLSApIHsKCQkJdG9rZW4gPSB0b2tlbnNbaV07CgoJCQkvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yCgkJCWlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBdICkgewoJCQkJYnJlYWs7CgkJCX0KCQkJaWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHsKCQkJCS8vIFNlYXJjaCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBjb21iaW5hdG9ycwoJCQkJaWYgKCAoc2VlZCA9IGZpbmQoCgkJCQkJdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLAoJCQkJCXJzaWJsaW5nLnRlc3QoIHRva2Vuc1swXS50eXBlICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHQKCQkJCSkpICkgewoKCQkJCQkvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHkKCQkJCQl0b2tlbnMuc3BsaWNlKCBpLCAxICk7CgkJCQkJc2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTsKCQkJCQlpZiAoICFzZWxlY3RvciApIHsKCQkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgc2VlZCApOwoJCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCQl9CgoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoJfQoKCS8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRlZAoJLy8gUHJvdmlkZSBgbWF0Y2hgIHRvIGF2b2lkIHJldG9rZW5pemF0aW9uIGlmIHdlIG1vZGlmaWVkIHRoZSBzZWxlY3RvciBhYm92ZQoJKCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKAoJCXNlZWQsCgkJY29udGV4dCwKCQkhZG9jdW1lbnRJc0hUTUwsCgkJcmVzdWx0cywKCQkhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0CgkpOwoJcmV0dXJuIHJlc3VsdHM7Cn07CgovLyBPbmUtdGltZSBhc3NpZ25tZW50cwoKLy8gU29ydCBzdGFiaWxpdHkKc3VwcG9ydC5zb3J0U3RhYmxlID0gZXhwYW5kby5zcGxpdCgiIikuc29ydCggc29ydE9yZGVyICkuam9pbigiIikgPT09IGV4cGFuZG87CgovLyBTdXBwb3J0OiBDaHJvbWUgMTQtMzUrCi8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24Kc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gISFoYXNEdXBsaWNhdGU7CgovLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnQKc2V0RG9jdW1lbnQoKTsKCi8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBpbiBDaHJvbWUgMjcpCi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKgpzdXBwb3J0LnNvcnREZXRhY2hlZCA9IGFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZykKCXJldHVybiBlbC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSApICYgMTsKfSk7CgovLyBTdXBwb3J0OiBJRTw4Ci8vIFByZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5ICJpbnRlcnBvbGF0aW9uIgovLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM2NDI5JTI4VlMuODUlMjkuYXNweAppZiAoICFhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJZWwuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iOwoJcmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikgPT09ICIjIiA7Cn0pICkgewoJYWRkSGFuZGxlKCAidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHsKCQlpZiAoICFpc1hNTCApIHsKCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJ0eXBlIiA/IDEgOiAyICk7CgkJfQoJfSk7Cn0KCi8vIFN1cHBvcnQ6IElFPDkKLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoInZhbHVlIikKaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJZWwuaW5uZXJIVE1MID0gIjxpbnB1dC8+IjsKCWVsLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCAidmFsdWUiLCAiIiApOwoJcmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCAidmFsdWUiICkgPT09ICIiOwp9KSApIHsKCWFkZEhhbmRsZSggInZhbHVlIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewoJCWlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiApIHsKCQkJcmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlOwoJCX0KCX0pOwp9CgovLyBTdXBwb3J0OiBJRTw5Ci8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXMKaWYgKCAhYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCXJldHVybiBlbC5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT0gbnVsbDsKfSkgKSB7CglhZGRIYW5kbGUoIGJvb2xlYW5zLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7CgkJdmFyIHZhbDsKCQlpZiAoICFpc1hNTCApIHsKCQkJcmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6CgkJCQkJKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID8KCQkJCQl2YWwudmFsdWUgOgoJCQkJbnVsbDsKCQl9Cgl9KTsKfQoKcmV0dXJuIFNpenpsZTsKCn0pKCB3aW5kb3cgKTsKCgoKalF1ZXJ5LmZpbmQgPSBTaXp6bGU7CmpRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9yczsKCi8vIERlcHJlY2F0ZWQKalF1ZXJ5LmV4cHJbICI6IiBdID0galF1ZXJ5LmV4cHIucHNldWRvczsKalF1ZXJ5LnVuaXF1ZVNvcnQgPSBqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7CmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7CmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDsKalF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zOwpqUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBTaXp6bGUuZXNjYXBlOwoKCgoKdmFyIGRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkgewoJdmFyIG1hdGNoZWQgPSBbXSwKCQl0cnVuY2F0ZSA9IHVudGlsICE9PSB1bmRlZmluZWQ7CgoJd2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICYmIGVsZW0ubm9kZVR5cGUgIT09IDkgKSB7CgkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQlpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkgewoJCQkJYnJlYWs7CgkJCX0KCQkJbWF0Y2hlZC5wdXNoKCBlbGVtICk7CgkJfQoJfQoJcmV0dXJuIG1hdGNoZWQ7Cn07CgoKdmFyIHNpYmxpbmdzID0gZnVuY3Rpb24oIG4sIGVsZW0gKSB7Cgl2YXIgbWF0Y2hlZCA9IFtdOwoKCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7CgkJaWYgKCBuLm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7CgkJCW1hdGNoZWQucHVzaCggbiApOwoJCX0KCX0KCglyZXR1cm4gbWF0Y2hlZDsKfTsKCgp2YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDsKCgoKZnVuY3Rpb24gbm9kZU5hbWUoIGVsZW0sIG5hbWUgKSB7CgogIHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKfTsKdmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pICk7CgoKCi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90CmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwgbm90ICkgewoJaWYgKCBpc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHsKCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJcmV0dXJuICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKSAhPT0gbm90OwoJCX0gKTsKCX0KCgkvLyBTaW5nbGUgZWxlbWVudAoJaWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7CgkJfSApOwoJfQoKCS8vIEFycmF5bGlrZSBvZiBlbGVtZW50cyAoalF1ZXJ5LCBhcmd1bWVudHMsIEFycmF5KQoJaWYgKCB0eXBlb2YgcXVhbGlmaWVyICE9PSAic3RyaW5nIiApIHsKCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuICggaW5kZXhPZi5jYWxsKCBxdWFsaWZpZXIsIGVsZW0gKSA+IC0xICkgIT09IG5vdDsKCQl9ICk7Cgl9CgoJLy8gRmlsdGVyZWQgZGlyZWN0bHkgZm9yIGJvdGggc2ltcGxlIGFuZCBjb21wbGV4IHNlbGVjdG9ycwoJcmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApOwp9CgpqUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7Cgl2YXIgZWxlbSA9IGVsZW1zWyAwIF07CgoJaWYgKCBub3QgKSB7CgkJZXhwciA9ICI6bm90KCIgKyBleHByICsgIikiOwoJfQoKCWlmICggZWxlbXMubGVuZ3RoID09PSAxICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJcmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZWxlbSwgZXhwciApID8gWyBlbGVtIF0gOiBbXTsKCX0KCglyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTsKCX0gKSApOwp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBpLCByZXQsCgkJCWxlbiA9IHRoaXMubGVuZ3RoLAoJCQlzZWxmID0gdGhpczsKCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoIGZ1bmN0aW9uKCkgewoJCQkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKCQkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7CgkJCQkJCXJldHVybiB0cnVlOwoJCQkJCX0KCQkJCX0KCQkJfSApICk7CgkJfQoKCQlyZXQgPSB0aGlzLnB1c2hTdGFjayggW10gKTsKCgkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKCQkJalF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCBzZWxmWyBpIF0sIHJldCApOwoJCX0KCgkJcmV0dXJuIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggcmV0ICkgOiByZXQ7Cgl9LAoJZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSApICk7Cgl9LAoJbm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCB0cnVlICkgKTsKCX0sCglpczogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiAhIXdpbm5vdygKCQkJdGhpcywKCgkJCS8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXQKCQkJLy8gc28gJCgicDpmaXJzdCIpLmlzKCJwOmxhc3QiKSB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gInAiLgoJCQl0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICYmIHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/CgkJCQlqUXVlcnkoIHNlbGVjdG9yICkgOgoJCQkJc2VsZWN0b3IgfHwgW10sCgkJCWZhbHNlCgkJKS5sZW5ndGg7Cgl9Cn0gKTsKCgovLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdAoKCi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KQp2YXIgcm9vdGpRdWVyeSwKCgkvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5ncwoJLy8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKQoJLy8gU3RyaWN0IEhUTUwgcmVjb2duaXRpb24gKCMxMTI5MDogbXVzdCBzdGFydCB3aXRoIDwpCgkvLyBTaG9ydGN1dCBzaW1wbGUgI2lkIGNhc2UgZm9yIHNwZWVkCglycXVpY2tFeHByID0gL14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLywKCglpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7CgkJdmFyIG1hdGNoLCBlbGVtOwoKCQkvLyBIQU5ETEU6ICQoIiIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpCgkJaWYgKCAhc2VsZWN0b3IgKSB7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJLy8gTWV0aG9kIGluaXQoKSBhY2NlcHRzIGFuIGFsdGVybmF0ZSByb290alF1ZXJ5CgkJLy8gc28gbWlncmF0ZSBjYW4gc3VwcG9ydCBqUXVlcnkuc3ViIChnaC0yMTAxKQoJCXJvb3QgPSByb290IHx8IHJvb3RqUXVlcnk7CgoJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCWlmICggc2VsZWN0b3JbIDAgXSA9PT0gIjwiICYmCgkJCQlzZWxlY3Rvclsgc2VsZWN0b3IubGVuZ3RoIC0gMSBdID09PSAiPiIgJiYKCQkJCXNlbGVjdG9yLmxlbmd0aCA+PSAzICkgewoKCQkJCS8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrCgkJCQltYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTsKCgkJCX0gZWxzZSB7CgkJCQltYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTsKCQkJfQoKCQkJLy8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZAoJCQlpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkgewoKCQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQoJCQkJaWYgKCBtYXRjaFsgMSBdICkgewoJCQkJCWNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFsgMCBdIDogY29udGV4dDsKCgkJCQkJLy8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0CgkJCQkJLy8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnQKCQkJCQlqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoCgkJCQkJCW1hdGNoWyAxIF0sCgkJCQkJCWNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsCgkJCQkJCXRydWUKCQkJCQkpICk7CgoJCQkJCS8vIEhBTkRMRTogJChodG1sLCBwcm9wcykKCQkJCQlpZiAoIHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbIDEgXSApICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7CgkJCQkJCWZvciAoIG1hdGNoIGluIGNvbnRleHQgKSB7CgoJCQkJCQkJLy8gUHJvcGVydGllcyBvZiBjb250ZXh0IGFyZSBjYWxsZWQgYXMgbWV0aG9kcyBpZiBwb3NzaWJsZQoJCQkJCQkJaWYgKCBpc0Z1bmN0aW9uKCB0aGlzWyBtYXRjaCBdICkgKSB7CgkJCQkJCQkJdGhpc1sgbWF0Y2ggXSggY29udGV4dFsgbWF0Y2ggXSApOwoKCQkJCQkJCS8vIC4uLmFuZCBvdGhlcndpc2Ugc2V0IGFzIGF0dHJpYnV0ZXMKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJdGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQlyZXR1cm4gdGhpczsKCgkJCQkvLyBIQU5ETEU6ICQoI2lkKQoJCQkJfSBlbHNlIHsKCQkJCQllbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTsKCgkJCQkJaWYgKCBlbGVtICkgewoKCQkJCQkJLy8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKCQkJCQkJdGhpc1sgMCBdID0gZWxlbTsKCQkJCQkJdGhpcy5sZW5ndGggPSAxOwoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCgkJCS8vIEhBTkRMRTogJChleHByLCAkKC4uLikpCgkJCX0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1ZXJ5ICkgewoJCQkJcmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTsKCgkJCS8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KQoJCQkvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcikKCQkJfSBlbHNlIHsKCQkJCXJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTsKCQkJfQoKCQkvLyBIQU5ETEU6ICQoRE9NRWxlbWVudCkKCQl9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHsKCQkJdGhpc1sgMCBdID0gc2VsZWN0b3I7CgkJCXRoaXMubGVuZ3RoID0gMTsKCQkJcmV0dXJuIHRoaXM7CgoJCS8vIEhBTkRMRTogJChmdW5jdGlvbikKCQkvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHkKCQl9IGVsc2UgaWYgKCBpc0Z1bmN0aW9uKCBzZWxlY3RvciApICkgewoJCQlyZXR1cm4gcm9vdC5yZWFkeSAhPT0gdW5kZWZpbmVkID8KCQkJCXJvb3QucmVhZHkoIHNlbGVjdG9yICkgOgoKCQkJCS8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnQKCQkJCXNlbGVjdG9yKCBqUXVlcnkgKTsKCQl9CgoJCXJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApOwoJfTsKCi8vIEdpdmUgdGhlIGluaXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb24KaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CgovLyBJbml0aWFsaXplIGNlbnRyYWwgcmVmZXJlbmNlCnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7CgoKdmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLAoKCS8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0CglndWFyYW50ZWVkVW5pcXVlID0gewoJCWNoaWxkcmVuOiB0cnVlLAoJCWNvbnRlbnRzOiB0cnVlLAoJCW5leHQ6IHRydWUsCgkJcHJldjogdHJ1ZQoJfTsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCWhhczogZnVuY3Rpb24oIHRhcmdldCApIHsKCQl2YXIgdGFyZ2V0cyA9IGpRdWVyeSggdGFyZ2V0LCB0aGlzICksCgkJCWwgPSB0YXJnZXRzLmxlbmd0aDsKCgkJcmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHsKCQkJdmFyIGkgPSAwOwoJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1sgaSBdICkgKSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0KCQl9ICk7Cgl9LAoKCWNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7CgkJdmFyIGN1ciwKCQkJaSA9IDAsCgkJCWwgPSB0aGlzLmxlbmd0aCwKCQkJbWF0Y2hlZCA9IFtdLAoJCQl0YXJnZXRzID0gdHlwZW9mIHNlbGVjdG9ycyAhPT0gInN0cmluZyIgJiYgalF1ZXJ5KCBzZWxlY3RvcnMgKTsKCgkJLy8gUG9zaXRpb25hbCBzZWxlY3RvcnMgbmV2ZXIgbWF0Y2gsIHNpbmNlIHRoZXJlJ3Mgbm8gX3NlbGVjdGlvbl8gY29udGV4dAoJCWlmICggIXJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgKSB7CgkJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKCQkJCWZvciAoIGN1ciA9IHRoaXNbIGkgXTsgY3VyICYmIGN1ciAhPT0gY29udGV4dDsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7CgoJCQkJCS8vIEFsd2F5cyBza2lwIGRvY3VtZW50IGZyYWdtZW50cwoJCQkJCWlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKCB0YXJnZXRzID8KCQkJCQkJdGFyZ2V0cy5pbmRleCggY3VyICkgPiAtMSA6CgoJCQkJCQkvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGUKCQkJCQkJY3VyLm5vZGVUeXBlID09PSAxICYmCgkJCQkJCQlqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGN1ciwgc2VsZWN0b3JzICkgKSApIHsKCgkJCQkJCW1hdGNoZWQucHVzaCggY3VyICk7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApIDogbWF0Y2hlZCApOwoJfSwKCgkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBzZXQKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnQKCQlpZiAoICFlbGVtICkgewoJCQlyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7CgkJfQoKCQkvLyBJbmRleCBpbiBzZWxlY3RvcgoJCWlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gaW5kZXhPZi5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdGhpc1sgMCBdICk7CgkJfQoKCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4gaW5kZXhPZi5jYWxsKCB0aGlzLAoKCQkJLy8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkCgkJCWVsZW0uanF1ZXJ5ID8gZWxlbVsgMCBdIDogZWxlbQoJCSk7Cgl9LAoKCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjaygKCQkJalF1ZXJ5LnVuaXF1ZVNvcnQoCgkJCQlqUXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSApCgkJCSkKCQkpOwoJfSwKCglhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID8KCQkJdGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKQoJCSk7Cgl9Cn0gKTsKCmZ1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkgewoJd2hpbGUgKCAoIGN1ciA9IGN1clsgZGlyIF0gKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fQoJcmV0dXJuIGN1cjsKfQoKalF1ZXJ5LmVhY2goIHsKCXBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQlyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsOwoJfSwKCXBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJwYXJlbnROb2RlIiApOwoJfSwKCXBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJwYXJlbnROb2RlIiwgdW50aWwgKTsKCX0sCgluZXh0OiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gc2libGluZyggZWxlbSwgIm5leHRTaWJsaW5nIiApOwoJfSwKCXByZXY6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5nKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwoJfSwKCW5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJuZXh0U2libGluZyIgKTsKCX0sCglwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZGlyKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwoJfSwKCW5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJuZXh0U2libGluZyIsIHVudGlsICk7Cgl9LAoJcHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7CgkJcmV0dXJuIGRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIsIHVudGlsICk7Cgl9LAoJc2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5ncyggKCBlbGVtLnBhcmVudE5vZGUgfHwge30gKS5maXJzdENoaWxkLCBlbGVtICk7Cgl9LAoJY2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5ncyggZWxlbS5maXJzdENoaWxkICk7Cgl9LAoJY29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewogICAgICAgIGlmICggbm9kZU5hbWUoIGVsZW0sICJpZnJhbWUiICkgKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtLmNvbnRlbnREb2N1bWVudDsKICAgICAgICB9CgogICAgICAgIC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5LCBpT1MgNyBvbmx5LCBBbmRyb2lkIEJyb3dzZXIgPD00LjMgb25seQogICAgICAgIC8vIFRyZWF0IHRoZSB0ZW1wbGF0ZSBlbGVtZW50IGFzIGEgcmVndWxhciBvbmUgaW4gYnJvd3NlcnMgdGhhdAogICAgICAgIC8vIGRvbid0IHN1cHBvcnQgaXQuCiAgICAgICAgaWYgKCBub2RlTmFtZSggZWxlbSwgInRlbXBsYXRlIiApICkgewogICAgICAgICAgICBlbGVtID0gZWxlbS5jb250ZW50IHx8IGVsZW07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7Cgl9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHsKCQl2YXIgbWF0Y2hlZCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApOwoKCQlpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09ICJVbnRpbCIgKSB7CgkJCXNlbGVjdG9yID0gdW50aWw7CgkJfQoKCQlpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCW1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApOwoJCX0KCgkJaWYgKCB0aGlzLmxlbmd0aCA+IDEgKSB7CgoJCQkvLyBSZW1vdmUgZHVwbGljYXRlcwoJCQlpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7CgkJCQlqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApOwoJCQl9CgoJCQkvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlcwoJCQlpZiAoIHJwYXJlbnRzcHJldi50ZXN0KCBuYW1lICkgKSB7CgkJCQltYXRjaGVkLnJldmVyc2UoKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkICk7Cgl9Owp9ICk7CnZhciBybm90aHRtbHdoaXRlID0gKCAvW15ceDIwXHRcclxuXGZdKy9nICk7CgoKCi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzCmZ1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7Cgl2YXIgb2JqZWN0ID0ge307CglqUXVlcnkuZWFjaCggb3B0aW9ucy5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbiggXywgZmxhZyApIHsKCQlvYmplY3RbIGZsYWcgXSA9IHRydWU7Cgl9ICk7CglyZXR1cm4gb2JqZWN0Owp9CgovKgogKiBDcmVhdGUgYSBjYWxsYmFjayBsaXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKICoKICoJb3B0aW9uczogYW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvdwogKgkJCXRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3QKICoKICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmUKICogImZpcmVkIiBtdWx0aXBsZSB0aW1lcy4KICoKICogUG9zc2libGUgb3B0aW9uczoKICoKICoJb25jZToJCQl3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpCiAqCiAqCW1lbW9yeToJCQl3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkCiAqCQkJCQlhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCAibWVtb3JpemVkIgogKgkJCQkJdmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpCiAqCiAqCXVuaXF1ZToJCQl3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdCkKICoKICoJc3RvcE9uRmFsc2U6CWludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZQogKgogKi8KalF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoKCS8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWQKCS8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdCkKCW9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gInN0cmluZyIgPwoJCWNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSA6CgkJalF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTsKCgl2YXIgLy8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZwoJCWZpcmluZywKCgkJLy8gTGFzdCBmaXJlIHZhbHVlIGZvciBub24tZm9yZ2V0dGFibGUgbGlzdHMKCQltZW1vcnksCgoJCS8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkCgkJZmlyZWQsCgoJCS8vIEZsYWcgdG8gcHJldmVudCBmaXJpbmcKCQlsb2NrZWQsCgoJCS8vIEFjdHVhbCBjYWxsYmFjayBsaXN0CgkJbGlzdCA9IFtdLAoKCQkvLyBRdWV1ZSBvZiBleGVjdXRpb24gZGF0YSBmb3IgcmVwZWF0YWJsZSBsaXN0cwoJCXF1ZXVlID0gW10sCgoJCS8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IGFkZC9yZW1vdmUgYXMgbmVlZGVkKQoJCWZpcmluZ0luZGV4ID0gLTEsCgoJCS8vIEZpcmUgY2FsbGJhY2tzCgkJZmlyZSA9IGZ1bmN0aW9uKCkgewoKCQkJLy8gRW5mb3JjZSBzaW5nbGUtZmlyaW5nCgkJCWxvY2tlZCA9IGxvY2tlZCB8fCBvcHRpb25zLm9uY2U7CgoJCQkvLyBFeGVjdXRlIGNhbGxiYWNrcyBmb3IgYWxsIHBlbmRpbmcgZXhlY3V0aW9ucywKCQkJLy8gcmVzcGVjdGluZyBmaXJpbmdJbmRleCBvdmVycmlkZXMgYW5kIHJ1bnRpbWUgY2hhbmdlcwoJCQlmaXJlZCA9IGZpcmluZyA9IHRydWU7CgkJCWZvciAoIDsgcXVldWUubGVuZ3RoOyBmaXJpbmdJbmRleCA9IC0xICkgewoJCQkJbWVtb3J5ID0gcXVldWUuc2hpZnQoKTsKCQkJCXdoaWxlICggKytmaXJpbmdJbmRleCA8IGxpc3QubGVuZ3RoICkgewoKCQkJCQkvLyBSdW4gY2FsbGJhY2sgYW5kIGNoZWNrIGZvciBlYXJseSB0ZXJtaW5hdGlvbgoJCQkJCWlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggbWVtb3J5WyAwIF0sIG1lbW9yeVsgMSBdICkgPT09IGZhbHNlICYmCgkJCQkJCW9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7CgoJCQkJCQkvLyBKdW1wIHRvIGVuZCBhbmQgZm9yZ2V0IHRoZSBkYXRhIHNvIC5hZGQgZG9lc24ndCByZS1maXJlCgkJCQkJCWZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGg7CgkJCQkJCW1lbW9yeSA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gRm9yZ2V0IHRoZSBkYXRhIGlmIHdlJ3JlIGRvbmUgd2l0aCBpdAoJCQlpZiAoICFvcHRpb25zLm1lbW9yeSApIHsKCQkJCW1lbW9yeSA9IGZhbHNlOwoJCQl9CgoJCQlmaXJpbmcgPSBmYWxzZTsKCgkJCS8vIENsZWFuIHVwIGlmIHdlJ3JlIGRvbmUgZmlyaW5nIGZvciBnb29kCgkJCWlmICggbG9ja2VkICkgewoKCQkJCS8vIEtlZXAgYW4gZW1wdHkgbGlzdCBpZiB3ZSBoYXZlIGRhdGEgZm9yIGZ1dHVyZSBhZGQgY2FsbHMKCQkJCWlmICggbWVtb3J5ICkgewoJCQkJCWxpc3QgPSBbXTsKCgkJCQkvLyBPdGhlcndpc2UsIHRoaXMgb2JqZWN0IGlzIHNwZW50CgkJCQl9IGVsc2UgewoJCQkJCWxpc3QgPSAiIjsKCQkJCX0KCQkJfQoJCX0sCgoJCS8vIEFjdHVhbCBDYWxsYmFja3Mgb2JqZWN0CgkJc2VsZiA9IHsKCgkJCS8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3QKCQkJYWRkOiBmdW5jdGlvbigpIHsKCQkJCWlmICggbGlzdCApIHsKCgkJCQkJLy8gSWYgd2UgaGF2ZSBtZW1vcnkgZnJvbSBhIHBhc3QgcnVuLCB3ZSBzaG91bGQgZmlyZSBhZnRlciBhZGRpbmcKCQkJCQlpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkgewoJCQkJCQlmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoIC0gMTsKCQkJCQkJcXVldWUucHVzaCggbWVtb3J5ICk7CgkJCQkJfQoKCQkJCQkoIGZ1bmN0aW9uIGFkZCggYXJncyApIHsKCQkJCQkJalF1ZXJ5LmVhY2goIGFyZ3MsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7CgkJCQkJCQlpZiAoIGlzRnVuY3Rpb24oIGFyZyApICkgewoJCQkJCQkJCWlmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7CgkJCQkJCQkJCWxpc3QucHVzaCggYXJnICk7CgkJCQkJCQkJfQoJCQkJCQkJfSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgdG9UeXBlKCBhcmcgKSAhPT0gInN0cmluZyIgKSB7CgoJCQkJCQkJCS8vIEluc3BlY3QgcmVjdXJzaXZlbHkKCQkJCQkJCQlhZGQoIGFyZyApOwoJCQkJCQkJfQoJCQkJCQl9ICk7CgkJCQkJfSApKCBhcmd1bWVudHMgKTsKCgkJCQkJaWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHsKCQkJCQkJZmlyZSgpOwoJCQkJCX0KCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoKCQkJLy8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdAoJCQlyZW1vdmU6IGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHsKCQkJCQl2YXIgaW5kZXg7CgkJCQkJd2hpbGUgKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXkoIGFyZywgbGlzdCwgaW5kZXggKSApID4gLTEgKSB7CgkJCQkJCWxpc3Quc3BsaWNlKCBpbmRleCwgMSApOwoKCQkJCQkJLy8gSGFuZGxlIGZpcmluZyBpbmRleGVzCgkJCQkJCWlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7CgkJCQkJCQlmaXJpbmdJbmRleC0tOwoJCQkJCQl9CgkJCQkJfQoJCQkJfSApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgoJCQkvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LgoJCQkvLyBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IGxpc3QgaGFzIGNhbGxiYWNrcyBhdHRhY2hlZC4KCQkJaGFzOiBmdW5jdGlvbiggZm4gKSB7CgkJCQlyZXR1cm4gZm4gPwoJCQkJCWpRdWVyeS5pbkFycmF5KCBmbiwgbGlzdCApID4gLTEgOgoJCQkJCWxpc3QubGVuZ3RoID4gMDsKCQkJfSwKCgkJCS8vIFJlbW92ZSBhbGwgY2FsbGJhY2tzIGZyb20gdGhlIGxpc3QKCQkJZW1wdHk6IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBsaXN0ICkgewoJCQkJCWxpc3QgPSBbXTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoKCQkJLy8gRGlzYWJsZSAuZmlyZSBhbmQgLmFkZAoJCQkvLyBBYm9ydCBhbnkgY3VycmVudC9wZW5kaW5nIGV4ZWN1dGlvbnMKCQkJLy8gQ2xlYXIgYWxsIGNhbGxiYWNrcyBhbmQgdmFsdWVzCgkJCWRpc2FibGU6IGZ1bmN0aW9uKCkgewoJCQkJbG9ja2VkID0gcXVldWUgPSBbXTsKCQkJCWxpc3QgPSBtZW1vcnkgPSAiIjsKCQkJCXJldHVybiB0aGlzOwoJCQl9LAoJCQlkaXNhYmxlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gIWxpc3Q7CgkJCX0sCgoJCQkvLyBEaXNhYmxlIC5maXJlCgkJCS8vIEFsc28gZGlzYWJsZSAuYWRkIHVubGVzcyB3ZSBoYXZlIG1lbW9yeSAoc2luY2UgaXQgd291bGQgaGF2ZSBubyBlZmZlY3QpCgkJCS8vIEFib3J0IGFueSBwZW5kaW5nIGV4ZWN1dGlvbnMKCQkJbG9jazogZnVuY3Rpb24oKSB7CgkJCQlsb2NrZWQgPSBxdWV1ZSA9IFtdOwoJCQkJaWYgKCAhbWVtb3J5ICYmICFmaXJpbmcgKSB7CgkJCQkJbGlzdCA9IG1lbW9yeSA9ICIiOwoJCQkJfQoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgkJCWxvY2tlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gISFsb2NrZWQ7CgkJCX0sCgoJCQkvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzCgkJCWZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHsKCQkJCWlmICggIWxvY2tlZCApIHsKCQkJCQlhcmdzID0gYXJncyB8fCBbXTsKCQkJCQlhcmdzID0gWyBjb250ZXh0LCBhcmdzLnNsaWNlID8gYXJncy5zbGljZSgpIDogYXJncyBdOwoJCQkJCXF1ZXVlLnB1c2goIGFyZ3MgKTsKCQkJCQlpZiAoICFmaXJpbmcgKSB7CgkJCQkJCWZpcmUoKTsKCQkJCQl9CgkJCQl9CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCgkJCS8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzCgkJCWZpcmU6IGZ1bmN0aW9uKCkgewoJCQkJc2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCgkJCS8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZQoJCQlmaXJlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gISFmaXJlZDsKCQkJfQoJCX07CgoJcmV0dXJuIHNlbGY7Cn07CgoKZnVuY3Rpb24gSWRlbnRpdHkoIHYgKSB7CglyZXR1cm4gdjsKfQpmdW5jdGlvbiBUaHJvd2VyKCBleCApIHsKCXRocm93IGV4Owp9CgpmdW5jdGlvbiBhZG9wdFZhbHVlKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0LCBub1ZhbHVlICkgewoJdmFyIG1ldGhvZDsKCgl0cnkgewoKCQkvLyBDaGVjayBmb3IgcHJvbWlzZSBhc3BlY3QgZmlyc3QgdG8gcHJpdmlsZWdlIHN5bmNocm9ub3VzIGJlaGF2aW9yCgkJaWYgKCB2YWx1ZSAmJiBpc0Z1bmN0aW9uKCAoIG1ldGhvZCA9IHZhbHVlLnByb21pc2UgKSApICkgewoJCQltZXRob2QuY2FsbCggdmFsdWUgKS5kb25lKCByZXNvbHZlICkuZmFpbCggcmVqZWN0ICk7CgoJCS8vIE90aGVyIHRoZW5hYmxlcwoJCX0gZWxzZSBpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUudGhlbiApICkgKSB7CgkJCW1ldGhvZC5jYWxsKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0ICk7CgoJCS8vIE90aGVyIG5vbi10aGVuYWJsZXMKCQl9IGVsc2UgewoKCQkJLy8gQ29udHJvbCBgcmVzb2x2ZWAgYXJndW1lbnRzIGJ5IGxldHRpbmcgQXJyYXkjc2xpY2UgY2FzdCBib29sZWFuIGBub1ZhbHVlYCB0byBpbnRlZ2VyOgoJCQkvLyAqIGZhbHNlOiBbIHZhbHVlIF0uc2xpY2UoIDAgKSA9PiByZXNvbHZlKCB2YWx1ZSApCgkJCS8vICogdHJ1ZTogWyB2YWx1ZSBdLnNsaWNlKCAxICkgPT4gcmVzb2x2ZSgpCgkJCXJlc29sdmUuYXBwbHkoIHVuZGVmaW5lZCwgWyB2YWx1ZSBdLnNsaWNlKCBub1ZhbHVlICkgKTsKCQl9CgoJLy8gRm9yIFByb21pc2VzL0ErLCBjb252ZXJ0IGV4Y2VwdGlvbnMgaW50byByZWplY3Rpb25zCgkvLyBTaW5jZSBqUXVlcnkud2hlbiBkb2Vzbid0IHVud3JhcCB0aGVuYWJsZXMsIHdlIGNhbiBza2lwIHRoZSBleHRyYSBjaGVja3MgYXBwZWFyaW5nIGluCgkvLyBEZWZlcnJlZCN0aGVuIHRvIGNvbmRpdGlvbmFsbHkgc3VwcHJlc3MgcmVqZWN0aW9uLgoJfSBjYXRjaCAoIHZhbHVlICkgewoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCBvbmx5CgkJLy8gU3RyaWN0IG1vZGUgZnVuY3Rpb25zIGludm9rZWQgd2l0aG91dCAuY2FsbC8uYXBwbHkgZ2V0IGdsb2JhbC1vYmplY3QgY29udGV4dAoJCXJlamVjdC5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0gKTsKCX0KfQoKalF1ZXJ5LmV4dGVuZCggewoKCURlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHsKCQl2YXIgdHVwbGVzID0gWwoKCQkJCS8vIGFjdGlvbiwgYWRkIGxpc3RlbmVyLCBjYWxsYmFja3MsCgkJCQkvLyAuLi4gLnRoZW4gaGFuZGxlcnMsIGFyZ3VtZW50IGluZGV4LCBbZmluYWwgc3RhdGVdCgkJCQlbICJub3RpZnkiLCAicHJvZ3Jlc3MiLCBqUXVlcnkuQ2FsbGJhY2tzKCAibWVtb3J5IiApLAoJCQkJCWpRdWVyeS5DYWxsYmFja3MoICJtZW1vcnkiICksIDIgXSwKCQkJCVsgInJlc29sdmUiLCAiZG9uZSIsIGpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKSwKCQkJCQlqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksIDAsICJyZXNvbHZlZCIgXSwKCQkJCVsgInJlamVjdCIsICJmYWlsIiwgalF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5IiApLAoJCQkJCWpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKSwgMSwgInJlamVjdGVkIiBdCgkJCV0sCgkJCXN0YXRlID0gInBlbmRpbmciLAoJCQlwcm9taXNlID0gewoJCQkJc3RhdGU6IGZ1bmN0aW9uKCkgewoJCQkJCXJldHVybiBzdGF0ZTsKCQkJCX0sCgkJCQlhbHdheXM6IGZ1bmN0aW9uKCkgewoJCQkJCWRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfSwKCQkJCSJjYXRjaCI6IGZ1bmN0aW9uKCBmbiApIHsKCQkJCQlyZXR1cm4gcHJvbWlzZS50aGVuKCBudWxsLCBmbiApOwoJCQkJfSwKCgkJCQkvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0CgkJCQlwaXBlOiBmdW5jdGlvbiggLyogZm5Eb25lLCBmbkZhaWwsIGZuUHJvZ3Jlc3MgKi8gKSB7CgkJCQkJdmFyIGZucyA9IGFyZ3VtZW50czsKCgkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkgewoJCQkJCQlqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7CgoJCQkJCQkJLy8gTWFwIHR1cGxlcyAocHJvZ3Jlc3MsIGRvbmUsIGZhaWwpIHRvIGFyZ3VtZW50cyAoZG9uZSwgZmFpbCwgcHJvZ3Jlc3MpCgkJCQkJCQl2YXIgZm4gPSBpc0Z1bmN0aW9uKCBmbnNbIHR1cGxlWyA0IF0gXSApICYmIGZuc1sgdHVwbGVbIDQgXSBdOwoKCQkJCQkJCS8vIGRlZmVycmVkLnByb2dyZXNzKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLm5vdGlmeSB9KQoJCQkJCQkJLy8gZGVmZXJyZWQuZG9uZShmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5yZXNvbHZlIH0pCgkJCQkJCQkvLyBkZWZlcnJlZC5mYWlsKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlamVjdCB9KQoJCQkJCQkJZGVmZXJyZWRbIHR1cGxlWyAxIF0gXSggZnVuY3Rpb24oKSB7CgkJCQkJCQkJdmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJCQkJCWlmICggcmV0dXJuZWQgJiYgaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkgewoJCQkJCQkJCQlyZXR1cm5lZC5wcm9taXNlKCkKCQkJCQkJCQkJCS5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5ICkKCQkJCQkJCQkJCS5kb25lKCBuZXdEZWZlci5yZXNvbHZlICkKCQkJCQkJCQkJCS5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTsKCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQluZXdEZWZlclsgdHVwbGVbIDAgXSArICJXaXRoIiBdKAoJCQkJCQkJCQkJdGhpcywKCQkJCQkJCQkJCWZuID8gWyByZXR1cm5lZCBdIDogYXJndW1lbnRzCgkJCQkJCQkJCSk7CgkJCQkJCQkJfQoJCQkJCQkJfSApOwoJCQkJCQl9ICk7CgkJCQkJCWZucyA9IG51bGw7CgkJCQkJfSApLnByb21pc2UoKTsKCQkJCX0sCgkJCQl0aGVuOiBmdW5jdGlvbiggb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIG9uUHJvZ3Jlc3MgKSB7CgkJCQkJdmFyIG1heERlcHRoID0gMDsKCQkJCQlmdW5jdGlvbiByZXNvbHZlKCBkZXB0aCwgZGVmZXJyZWQsIGhhbmRsZXIsIHNwZWNpYWwgKSB7CgkJCQkJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJCQkJCXZhciB0aGF0ID0gdGhpcywKCQkJCQkJCQlhcmdzID0gYXJndW1lbnRzLAoJCQkJCQkJCW1pZ2h0VGhyb3cgPSBmdW5jdGlvbigpIHsKCQkJCQkJCQkJdmFyIHJldHVybmVkLCB0aGVuOwoKCQkJCQkJCQkJLy8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjMKCQkJCQkJCQkJLy8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTkKCQkJCQkJCQkJLy8gSWdub3JlIGRvdWJsZS1yZXNvbHV0aW9uIGF0dGVtcHRzCgkJCQkJCQkJCWlmICggZGVwdGggPCBtYXhEZXB0aCApIHsKCQkJCQkJCQkJCXJldHVybjsKCQkJCQkJCQkJfQoKCQkJCQkJCQkJcmV0dXJuZWQgPSBoYW5kbGVyLmFwcGx5KCB0aGF0LCBhcmdzICk7CgoJCQkJCQkJCQkvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4xCgkJCQkJCQkJCS8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTQ4CgkJCQkJCQkJCWlmICggcmV0dXJuZWQgPT09IGRlZmVycmVkLnByb21pc2UoKSApIHsKCQkJCQkJCQkJCXRocm93IG5ldyBUeXBlRXJyb3IoICJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iICk7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb25zIDIuMy4zLjEsIDMuNQoJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01NAoJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC03NQoJCQkJCQkJCQkvLyBSZXRyaWV2ZSBgdGhlbmAgb25seSBvbmNlCgkJCQkJCQkJCXRoZW4gPSByZXR1cm5lZCAmJgoKCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjQKCQkJCQkJCQkJCS8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTY0CgkJCQkJCQkJCQkvLyBPbmx5IGNoZWNrIG9iamVjdHMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlbmFiaWxpdHkKCQkJCQkJCQkJCSggdHlwZW9mIHJldHVybmVkID09PSAib2JqZWN0IiB8fAoJCQkJCQkJCQkJCXR5cGVvZiByZXR1cm5lZCA9PT0gImZ1bmN0aW9uIiApICYmCgkJCQkJCQkJCQlyZXR1cm5lZC50aGVuOwoKCQkJCQkJCQkJLy8gSGFuZGxlIGEgcmV0dXJuZWQgdGhlbmFibGUKCQkJCQkJCQkJaWYgKCBpc0Z1bmN0aW9uKCB0aGVuICkgKSB7CgoJCQkJCQkJCQkJLy8gU3BlY2lhbCBwcm9jZXNzb3JzIChub3RpZnkpIGp1c3Qgd2FpdCBmb3IgcmVzb2x1dGlvbgoJCQkJCQkJCQkJaWYgKCBzcGVjaWFsICkgewoJCQkJCQkJCQkJCXRoZW4uY2FsbCgKCQkJCQkJCQkJCQkJcmV0dXJuZWQsCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSwKCQkJCQkJCQkJCQkJcmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICkKCQkJCQkJCQkJCQkpOwoKCQkJCQkJCQkJCS8vIE5vcm1hbCBwcm9jZXNzb3JzIChyZXNvbHZlKSBhbHNvIGhvb2sgaW50byBwcm9ncmVzcwoJCQkJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJCQkJLy8gLi4uYW5kIGRpc3JlZ2FyZCBvbGRlciByZXNvbHV0aW9uIHZhbHVlcwoJCQkJCQkJCQkJCW1heERlcHRoKys7CgoJCQkJCQkJCQkJCXRoZW4uY2FsbCgKCQkJCQkJCQkJCQkJcmV0dXJuZWQsCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSwKCQkJCQkJCQkJCQkJcmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICksCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksCgkJCQkJCQkJCQkJCQlkZWZlcnJlZC5ub3RpZnlXaXRoICkKCQkJCQkJCQkJCQkpOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJLy8gSGFuZGxlIGFsbCBvdGhlciByZXR1cm5lZCB2YWx1ZXMKCQkJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJCQkvLyBPbmx5IHN1YnN0aXR1dGUgaGFuZGxlcnMgcGFzcyBvbiBjb250ZXh0CgkJCQkJCQkJCQkvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcikKCQkJCQkJCQkJCWlmICggaGFuZGxlciAhPT0gSWRlbnRpdHkgKSB7CgkJCQkJCQkJCQkJdGhhdCA9IHVuZGVmaW5lZDsKCQkJCQkJCQkJCQlhcmdzID0gWyByZXR1cm5lZCBdOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCS8vIFByb2Nlc3MgdGhlIHZhbHVlKHMpCgkJCQkJCQkJCQkvLyBEZWZhdWx0IHByb2Nlc3MgaXMgcmVzb2x2ZQoJCQkJCQkJCQkJKCBzcGVjaWFsIHx8IGRlZmVycmVkLnJlc29sdmVXaXRoICkoIHRoYXQsIGFyZ3MgKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0sCgoJCQkJCQkJCS8vIE9ubHkgbm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGNhdGNoIGFuZCByZWplY3QgZXhjZXB0aW9ucwoJCQkJCQkJCXByb2Nlc3MgPSBzcGVjaWFsID8KCQkJCQkJCQkJbWlnaHRUaHJvdyA6CgkJCQkJCQkJCWZ1bmN0aW9uKCkgewoJCQkJCQkJCQkJdHJ5IHsKCQkJCQkJCQkJCQltaWdodFRocm93KCk7CgkJCQkJCQkJCQl9IGNhdGNoICggZSApIHsKCgkJCQkJCQkJCQkJaWYgKCBqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayApIHsKCQkJCQkJCQkJCQkJalF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soIGUsCgkJCQkJCQkJCQkJCQlwcm9jZXNzLnN0YWNrVHJhY2UgKTsKCQkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy40LjEKCQkJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC02MQoJCQkJCQkJCQkJCS8vIElnbm9yZSBwb3N0LXJlc29sdXRpb24gZXhjZXB0aW9ucwoJCQkJCQkJCQkJCWlmICggZGVwdGggKyAxID49IG1heERlcHRoICkgewoKCQkJCQkJCQkJCQkJLy8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dAoJCQkJCQkJCQkJCQkvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcikKCQkJCQkJCQkJCQkJaWYgKCBoYW5kbGVyICE9PSBUaHJvd2VyICkgewoJCQkJCQkJCQkJCQkJdGhhdCA9IHVuZGVmaW5lZDsKCQkJCQkJCQkJCQkJCWFyZ3MgPSBbIGUgXTsKCQkJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCQkJZGVmZXJyZWQucmVqZWN0V2l0aCggdGhhdCwgYXJncyApOwoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCX0KCQkJCQkJCQkJfTsKCgkJCQkJCQkvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuMQoJCQkJCQkJLy8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTcKCQkJCQkJCS8vIFJlLXJlc29sdmUgcHJvbWlzZXMgaW1tZWRpYXRlbHkgdG8gZG9kZ2UgZmFsc2UgcmVqZWN0aW9uIGZyb20KCQkJCQkJCS8vIHN1YnNlcXVlbnQgZXJyb3JzCgkJCQkJCQlpZiAoIGRlcHRoICkgewoJCQkJCQkJCXByb2Nlc3MoKTsKCQkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJCS8vIENhbGwgYW4gb3B0aW9uYWwgaG9vayB0byByZWNvcmQgdGhlIHN0YWNrLCBpbiBjYXNlIG9mIGV4Y2VwdGlvbgoJCQkJCQkJCS8vIHNpbmNlIGl0J3Mgb3RoZXJ3aXNlIGxvc3Qgd2hlbiBleGVjdXRpb24gZ29lcyBhc3luYwoJCQkJCQkJCWlmICggalF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vayApIHsKCQkJCQkJCQkJcHJvY2Vzcy5zdGFja1RyYWNlID0galF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vaygpOwoJCQkJCQkJCX0KCQkJCQkJCQl3aW5kb3cuc2V0VGltZW91dCggcHJvY2VzcyApOwoJCQkJCQkJfQoJCQkJCQl9OwoJCQkJCX0KCgkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkgewoKCQkJCQkJLy8gcHJvZ3Jlc3NfaGFuZGxlcnMuYWRkKCAuLi4gKQoJCQkJCQl0dXBsZXNbIDAgXVsgMyBdLmFkZCgKCQkJCQkJCXJlc29sdmUoCgkJCQkJCQkJMCwKCQkJCQkJCQluZXdEZWZlciwKCQkJCQkJCQlpc0Z1bmN0aW9uKCBvblByb2dyZXNzICkgPwoJCQkJCQkJCQlvblByb2dyZXNzIDoKCQkJCQkJCQkJSWRlbnRpdHksCgkJCQkJCQkJbmV3RGVmZXIubm90aWZ5V2l0aAoJCQkJCQkJKQoJCQkJCQkpOwoKCQkJCQkJLy8gZnVsZmlsbGVkX2hhbmRsZXJzLmFkZCggLi4uICkKCQkJCQkJdHVwbGVzWyAxIF1bIDMgXS5hZGQoCgkJCQkJCQlyZXNvbHZlKAoJCQkJCQkJCTAsCgkJCQkJCQkJbmV3RGVmZXIsCgkJCQkJCQkJaXNGdW5jdGlvbiggb25GdWxmaWxsZWQgKSA/CgkJCQkJCQkJCW9uRnVsZmlsbGVkIDoKCQkJCQkJCQkJSWRlbnRpdHkKCQkJCQkJCSkKCQkJCQkJKTsKCgkJCQkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmFkZCggLi4uICkKCQkJCQkJdHVwbGVzWyAyIF1bIDMgXS5hZGQoCgkJCQkJCQlyZXNvbHZlKAoJCQkJCQkJCTAsCgkJCQkJCQkJbmV3RGVmZXIsCgkJCQkJCQkJaXNGdW5jdGlvbiggb25SZWplY3RlZCApID8KCQkJCQkJCQkJb25SZWplY3RlZCA6CgkJCQkJCQkJCVRocm93ZXIKCQkJCQkJCSkKCQkJCQkJKTsKCQkJCQl9ICkucHJvbWlzZSgpOwoJCQkJfSwKCgkJCQkvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkCgkJCQkvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0CgkJCQlwcm9taXNlOiBmdW5jdGlvbiggb2JqICkgewoJCQkJCXJldHVybiBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQoIG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTsKCQkJCX0KCQkJfSwKCQkJZGVmZXJyZWQgPSB7fTsKCgkJLy8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kcwoJCWpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHsKCQkJdmFyIGxpc3QgPSB0dXBsZVsgMiBdLAoJCQkJc3RhdGVTdHJpbmcgPSB0dXBsZVsgNSBdOwoKCQkJLy8gcHJvbWlzZS5wcm9ncmVzcyA9IGxpc3QuYWRkCgkJCS8vIHByb21pc2UuZG9uZSA9IGxpc3QuYWRkCgkJCS8vIHByb21pc2UuZmFpbCA9IGxpc3QuYWRkCgkJCXByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRkOwoKCQkJLy8gSGFuZGxlIHN0YXRlCgkJCWlmICggc3RhdGVTdHJpbmcgKSB7CgkJCQlsaXN0LmFkZCgKCQkJCQlmdW5jdGlvbigpIHsKCgkJCQkJCS8vIHN0YXRlID0gInJlc29sdmVkIiAoaS5lLiwgZnVsZmlsbGVkKQoJCQkJCQkvLyBzdGF0ZSA9ICJyZWplY3RlZCIKCQkJCQkJc3RhdGUgPSBzdGF0ZVN0cmluZzsKCQkJCQl9LAoKCQkJCQkvLyByZWplY3RlZF9jYWxsYmFja3MuZGlzYWJsZQoJCQkJCS8vIGZ1bGZpbGxlZF9jYWxsYmFja3MuZGlzYWJsZQoJCQkJCXR1cGxlc1sgMyAtIGkgXVsgMiBdLmRpc2FibGUsCgoJCQkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmRpc2FibGUKCQkJCQkvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZGlzYWJsZQoJCQkJCXR1cGxlc1sgMyAtIGkgXVsgMyBdLmRpc2FibGUsCgoJCQkJCS8vIHByb2dyZXNzX2NhbGxiYWNrcy5sb2NrCgkJCQkJdHVwbGVzWyAwIF1bIDIgXS5sb2NrLAoKCQkJCQkvLyBwcm9ncmVzc19oYW5kbGVycy5sb2NrCgkJCQkJdHVwbGVzWyAwIF1bIDMgXS5sb2NrCgkJCQkpOwoJCQl9CgoJCQkvLyBwcm9ncmVzc19oYW5kbGVycy5maXJlCgkJCS8vIGZ1bGZpbGxlZF9oYW5kbGVycy5maXJlCgkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmZpcmUKCQkJbGlzdC5hZGQoIHR1cGxlWyAzIF0uZmlyZSApOwoKCQkJLy8gZGVmZXJyZWQubm90aWZ5ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLm5vdGlmeVdpdGgoLi4uKSB9CgkJCS8vIGRlZmVycmVkLnJlc29sdmUgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZVdpdGgoLi4uKSB9CgkJCS8vIGRlZmVycmVkLnJlamVjdCA9IGZ1bmN0aW9uKCkgeyBkZWZlcnJlZC5yZWplY3RXaXRoKC4uLikgfQoJCQlkZWZlcnJlZFsgdHVwbGVbIDAgXSBdID0gZnVuY3Rpb24oKSB7CgkJCQlkZWZlcnJlZFsgdHVwbGVbIDAgXSArICJXaXRoIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHVuZGVmaW5lZCA6IHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX07CgoJCQkvLyBkZWZlcnJlZC5ub3RpZnlXaXRoID0gbGlzdC5maXJlV2l0aAoJCQkvLyBkZWZlcnJlZC5yZXNvbHZlV2l0aCA9IGxpc3QuZmlyZVdpdGgKCQkJLy8gZGVmZXJyZWQucmVqZWN0V2l0aCA9IGxpc3QuZmlyZVdpdGgKCQkJZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyAiV2l0aCIgXSA9IGxpc3QuZmlyZVdpdGg7CgkJfSApOwoKCQkvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2UKCQlwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7CgoJCS8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnkKCQlpZiAoIGZ1bmMgKSB7CgkJCWZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7CgkJfQoKCQkvLyBBbGwgZG9uZSEKCQlyZXR1cm4gZGVmZXJyZWQ7Cgl9LAoKCS8vIERlZmVycmVkIGhlbHBlcgoJd2hlbjogZnVuY3Rpb24oIHNpbmdsZVZhbHVlICkgewoJCXZhcgoKCQkJLy8gY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzCgkJCXJlbWFpbmluZyA9IGFyZ3VtZW50cy5sZW5ndGgsCgoJCQkvLyBjb3VudCBvZiB1bnByb2Nlc3NlZCBhcmd1bWVudHMKCQkJaSA9IHJlbWFpbmluZywKCgkJCS8vIHN1Ym9yZGluYXRlIGZ1bGZpbGxtZW50IGRhdGEKCQkJcmVzb2x2ZUNvbnRleHRzID0gQXJyYXkoIGkgKSwKCQkJcmVzb2x2ZVZhbHVlcyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLAoKCQkJLy8gdGhlIG1hc3RlciBEZWZlcnJlZAoJCQltYXN0ZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSwKCgkJCS8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3RvcnkKCQkJdXBkYXRlRnVuYyA9IGZ1bmN0aW9uKCBpICkgewoJCQkJcmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCQlyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7CgkJCQkJcmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlOwoJCQkJCWlmICggISggLS1yZW1haW5pbmcgKSApIHsKCQkJCQkJbWFzdGVyLnJlc29sdmVXaXRoKCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKTsKCQkJCQl9CgkJCQl9OwoJCQl9OwoKCQkvLyBTaW5nbGUtIGFuZCBlbXB0eSBhcmd1bWVudHMgYXJlIGFkb3B0ZWQgbGlrZSBQcm9taXNlLnJlc29sdmUKCQlpZiAoIHJlbWFpbmluZyA8PSAxICkgewoJCQlhZG9wdFZhbHVlKCBzaW5nbGVWYWx1ZSwgbWFzdGVyLmRvbmUoIHVwZGF0ZUZ1bmMoIGkgKSApLnJlc29sdmUsIG1hc3Rlci5yZWplY3QsCgkJCQkhcmVtYWluaW5nICk7CgoJCQkvLyBVc2UgLnRoZW4oKSB0byB1bndyYXAgc2Vjb25kYXJ5IHRoZW5hYmxlcyAoY2YuIGdoLTMwMDApCgkJCWlmICggbWFzdGVyLnN0YXRlKCkgPT09ICJwZW5kaW5nIiB8fAoJCQkJaXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIHJlc29sdmVWYWx1ZXNbIGkgXS50aGVuICkgKSB7CgoJCQkJcmV0dXJuIG1hc3Rlci50aGVuKCk7CgkJCX0KCQl9CgoJCS8vIE11bHRpcGxlIGFyZ3VtZW50cyBhcmUgYWdncmVnYXRlZCBsaWtlIFByb21pc2UuYWxsIGFycmF5IGVsZW1lbnRzCgkJd2hpbGUgKCBpLS0gKSB7CgkJCWFkb3B0VmFsdWUoIHJlc29sdmVWYWx1ZXNbIGkgXSwgdXBkYXRlRnVuYyggaSApLCBtYXN0ZXIucmVqZWN0ICk7CgkJfQoKCQlyZXR1cm4gbWFzdGVyLnByb21pc2UoKTsKCX0KfSApOwoKCi8vIFRoZXNlIHVzdWFsbHkgaW5kaWNhdGUgYSBwcm9ncmFtbWVyIG1pc3Rha2UgZHVyaW5nIGRldmVsb3BtZW50LAovLyB3YXJuIGFib3V0IHRoZW0gQVNBUCByYXRoZXIgdGhhbiBzd2FsbG93aW5nIHRoZW0gYnkgZGVmYXVsdC4KdmFyIHJlcnJvck5hbWVzID0gL14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87CgpqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayA9IGZ1bmN0aW9uKCBlcnJvciwgc3RhY2sgKSB7CgoJLy8gU3VwcG9ydDogSUUgOCAtIDkgb25seQoJLy8gQ29uc29sZSBleGlzdHMgd2hlbiBkZXYgdG9vbHMgYXJlIG9wZW4sIHdoaWNoIGNhbiBoYXBwZW4gYXQgYW55IHRpbWUKCWlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUud2FybiAmJiBlcnJvciAmJiByZXJyb3JOYW1lcy50ZXN0KCBlcnJvci5uYW1lICkgKSB7CgkJd2luZG93LmNvbnNvbGUud2FybiggImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIgKyBlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjaywgc3RhY2sgKTsKCX0KfTsKCgoKCmpRdWVyeS5yZWFkeUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKCBlcnJvciApIHsKCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQl0aHJvdyBlcnJvcjsKCX0gKTsKfTsKCgoKCi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeQp2YXIgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7CgpqUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7CgoJcmVhZHlMaXN0CgkJLnRoZW4oIGZuICkKCgkJLy8gV3JhcCBqUXVlcnkucmVhZHlFeGNlcHRpb24gaW4gYSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBsb29rdXAKCQkvLyBoYXBwZW5zIGF0IHRoZSB0aW1lIG9mIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgY2FsbGJhY2sKCQkvLyByZWdpc3RyYXRpb24uCgkJLmNhdGNoKCBmdW5jdGlvbiggZXJyb3IgKSB7CgkJCWpRdWVyeS5yZWFkeUV4Y2VwdGlvbiggZXJyb3IgKTsKCQl9ICk7CgoJcmV0dXJuIHRoaXM7Cn07CgpqUXVlcnkuZXh0ZW5kKCB7CgoJLy8gSXMgdGhlIERPTSByZWFkeSB0byBiZSB1c2VkPyBTZXQgdG8gdHJ1ZSBvbmNlIGl0IG9jY3Vycy4KCWlzUmVhZHk6IGZhbHNlLAoKCS8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmUKCS8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxCglyZWFkeVdhaXQ6IDEsCgoJLy8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeQoJcmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkgewoKCQkvLyBBYm9ydCBpZiB0aGVyZSBhcmUgcGVuZGluZyBob2xkcyBvciB3ZSdyZSBhbHJlYWR5IHJlYWR5CgkJaWYgKCB3YWl0ID09PSB0cnVlID8gLS1qUXVlcnkucmVhZHlXYWl0IDogalF1ZXJ5LmlzUmVhZHkgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQoJCWpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTsKCgkJLy8gSWYgYSBub3JtYWwgRE9NIFJlYWR5IGV2ZW50IGZpcmVkLCBkZWNyZW1lbnQsIGFuZCB3YWl0IGlmIG5lZWQgYmUKCQlpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQoJCXJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTsKCX0KfSApOwoKalF1ZXJ5LnJlYWR5LnRoZW4gPSByZWFkeUxpc3QudGhlbjsKCi8vIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kCmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHsKCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgY29tcGxldGVkICk7Cgl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQgKTsKCWpRdWVyeS5yZWFkeSgpOwp9CgovLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZAovLyBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KLy8gU3VwcG9ydDogSUUgPD05IC0gMTAgb25seQovLyBPbGRlciBJRSBzb21ldGltZXMgc2lnbmFscyAiaW50ZXJhY3RpdmUiIHRvbyBzb29uCmlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fAoJKCBkb2N1bWVudC5yZWFkeVN0YXRlICE9PSAibG9hZGluZyIgJiYgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCApICkgewoKCS8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQoJd2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApOwoKfSBlbHNlIHsKCgkvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrCglkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGNvbXBsZXRlZCApOwoKCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCgl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQgKTsKfQoKCgoKLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uCi8vIFRoZSB2YWx1ZS9zIGNhbiBvcHRpb25hbGx5IGJlIGV4ZWN1dGVkIGlmIGl0J3MgYSBmdW5jdGlvbgp2YXIgYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkgewoJdmFyIGkgPSAwLAoJCWxlbiA9IGVsZW1zLmxlbmd0aCwKCQlidWxrID0ga2V5ID09IG51bGw7CgoJLy8gU2V0cyBtYW55IHZhbHVlcwoJaWYgKCB0b1R5cGUoIGtleSApID09PSAib2JqZWN0IiApIHsKCQljaGFpbmFibGUgPSB0cnVlOwoJCWZvciAoIGkgaW4ga2V5ICkgewoJCQlhY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5WyBpIF0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTsKCQl9CgoJLy8gU2V0cyBvbmUgdmFsdWUKCX0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJY2hhaW5hYmxlID0gdHJ1ZTsKCgkJaWYgKCAhaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmF3ID0gdHJ1ZTsKCQl9CgoJCWlmICggYnVsayApIHsKCgkJCS8vIEJ1bGsgb3BlcmF0aW9ucyBydW4gYWdhaW5zdCB0aGUgZW50aXJlIHNldAoJCQlpZiAoIHJhdyApIHsKCQkJCWZuLmNhbGwoIGVsZW1zLCB2YWx1ZSApOwoJCQkJZm4gPSBudWxsOwoKCQkJLy8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlcwoJCQl9IGVsc2UgewoJCQkJYnVsayA9IGZuOwoJCQkJZm4gPSBmdW5jdGlvbiggZWxlbSwga2V5LCB2YWx1ZSApIHsKCQkJCQlyZXR1cm4gYnVsay5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTsKCQkJCX07CgkJCX0KCQl9CgoJCWlmICggZm4gKSB7CgkJCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewoJCQkJZm4oCgkJCQkJZWxlbXNbIGkgXSwga2V5LCByYXcgPwoJCQkJCXZhbHVlIDoKCQkJCQl2YWx1ZS5jYWxsKCBlbGVtc1sgaSBdLCBpLCBmbiggZWxlbXNbIGkgXSwga2V5ICkgKQoJCQkJKTsKCQkJfQoJCX0KCX0KCglpZiAoIGNoYWluYWJsZSApIHsKCQlyZXR1cm4gZWxlbXM7Cgl9CgoJLy8gR2V0cwoJaWYgKCBidWxrICkgewoJCXJldHVybiBmbi5jYWxsKCBlbGVtcyApOwoJfQoKCXJldHVybiBsZW4gPyBmbiggZWxlbXNbIDAgXSwga2V5ICkgOiBlbXB0eUdldDsKfTsKCgovLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmcKdmFyIHJtc1ByZWZpeCA9IC9eLW1zLS8sCglyZGFzaEFscGhhID0gLy0oW2Etel0pL2c7CgovLyBVc2VkIGJ5IGNhbWVsQ2FzZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKCkKZnVuY3Rpb24gZmNhbWVsQ2FzZSggYWxsLCBsZXR0ZXIgKSB7CglyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7Cn0KCi8vIENvbnZlcnQgZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFuZCBkYXRhIG1vZHVsZXMKLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNQovLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpCmZ1bmN0aW9uIGNhbWVsQ2FzZSggc3RyaW5nICkgewoJcmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsICJtcy0iICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApOwp9CnZhciBhY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkgewoKCS8vIEFjY2VwdHMgb25seToKCS8vICAtIE5vZGUKCS8vICAgIC0gTm9kZS5FTEVNRU5UX05PREUKCS8vICAgIC0gTm9kZS5ET0NVTUVOVF9OT0RFCgkvLyAgLSBPYmplY3QKCS8vICAgIC0gQW55CglyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7Cn07CgoKCgpmdW5jdGlvbiBEYXRhKCkgewoJdGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrOwp9CgpEYXRhLnVpZCA9IDE7CgpEYXRhLnByb3RvdHlwZSA9IHsKCgljYWNoZTogZnVuY3Rpb24oIG93bmVyICkgewoKCQkvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGUKCQl2YXIgdmFsdWUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07CgoJCS8vIElmIG5vdCwgY3JlYXRlIG9uZQoJCWlmICggIXZhbHVlICkgewoJCQl2YWx1ZSA9IHt9OwoKCQkJLy8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsCgkJCS8vIGJ1dCB3ZSBzaG91bGQgbm90LCBzZWUgIzgzMzUuCgkJCS8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LgoJCQlpZiAoIGFjY2VwdERhdGEoIG93bmVyICkgKSB7CgoJCQkJLy8gSWYgaXQgaXMgYSBub2RlIHVubGlrZWx5IHRvIGJlIHN0cmluZ2lmeS1lZCBvciBsb29wZWQgb3ZlcgoJCQkJLy8gdXNlIHBsYWluIGFzc2lnbm1lbnQKCQkJCWlmICggb3duZXIubm9kZVR5cGUgKSB7CgkJCQkJb3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdmFsdWU7CgoJCQkJLy8gT3RoZXJ3aXNlIHNlY3VyZSBpdCBpbiBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5CgkJCQkvLyBjb25maWd1cmFibGUgbXVzdCBiZSB0cnVlIHRvIGFsbG93IHRoZSBwcm9wZXJ0eSB0byBiZQoJCQkJLy8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3ZlZAoJCQkJfSBlbHNlIHsKCQkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoIG93bmVyLCB0aGlzLmV4cGFuZG8sIHsKCQkJCQkJdmFsdWU6IHZhbHVlLAoJCQkJCQljb25maWd1cmFibGU6IHRydWUKCQkJCQl9ICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiB2YWx1ZTsKCX0sCglzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7CgkJdmFyIHByb3AsCgkJCWNhY2hlID0gdGhpcy5jYWNoZSggb3duZXIgKTsKCgkJLy8gSGFuZGxlOiBbIG93bmVyLCBrZXksIHZhbHVlIF0gYXJncwoJCS8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1NykKCQlpZiAoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApIHsKCQkJY2FjaGVbIGNhbWVsQ2FzZSggZGF0YSApIF0gPSB2YWx1ZTsKCgkJLy8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3MKCQl9IGVsc2UgewoKCQkJLy8gQ29weSB0aGUgcHJvcGVydGllcyBvbmUtYnktb25lIHRvIHRoZSBjYWNoZSBvYmplY3QKCQkJZm9yICggcHJvcCBpbiBkYXRhICkgewoJCQkJY2FjaGVbIGNhbWVsQ2FzZSggcHJvcCApIF0gPSBkYXRhWyBwcm9wIF07CgkJCX0KCQl9CgkJcmV0dXJuIGNhY2hlOwoJfSwKCWdldDogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7CgkJcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8KCQkJdGhpcy5jYWNoZSggb3duZXIgKSA6CgoJCQkvLyBBbHdheXMgdXNlIGNhbWVsQ2FzZSBrZXkgKGdoLTIyNTcpCgkJCW93bmVyWyB0aGlzLmV4cGFuZG8gXSAmJiBvd25lclsgdGhpcy5leHBhbmRvIF1bIGNhbWVsQ2FzZSgga2V5ICkgXTsKCX0sCglhY2Nlc3M6IGZ1bmN0aW9uKCBvd25lciwga2V5LCB2YWx1ZSApIHsKCgkJLy8gSW4gY2FzZXMgd2hlcmUgZWl0aGVyOgoJCS8vCgkJLy8gICAxLiBObyBrZXkgd2FzIHNwZWNpZmllZAoJCS8vICAgMi4gQSBzdHJpbmcga2V5IHdhcyBzcGVjaWZpZWQsIGJ1dCBubyB2YWx1ZSBwcm92aWRlZAoJCS8vCgkJLy8gVGFrZSB0aGUgInJlYWQiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZQoJCS8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjoKCQkvLwoJCS8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3QKCQkvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5CgkJLy8KCQlpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8CgkJCQkoICgga2V5ICYmIHR5cGVvZiBrZXkgPT09ICJzdHJpbmciICkgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApICkgewoKCQkJcmV0dXJuIHRoaXMuZ2V0KCBvd25lciwga2V5ICk7CgkJfQoKCQkvLyBXaGVuIHRoZSBrZXkgaXMgbm90IGEgc3RyaW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1ZQoJCS8vIGFyZSBzcGVjaWZpZWQsIHNldCBvciBleHRlbmQgKGV4aXN0aW5nIG9iamVjdHMpIHdpdGggZWl0aGVyOgoJCS8vCgkJLy8gICAxLiBBbiBvYmplY3Qgb2YgcHJvcGVydGllcwoJCS8vICAgMi4gQSBrZXkgYW5kIHZhbHVlCgkJLy8KCQl0aGlzLnNldCggb3duZXIsIGtleSwgdmFsdWUgKTsKCgkJLy8gU2luY2UgdGhlICJzZXQiIHBhdGggY2FuIGhhdmUgdHdvIHBvc3NpYmxlIGVudHJ5IHBvaW50cwoJCS8vIHJldHVybiB0aGUgZXhwZWN0ZWQgZGF0YSBiYXNlZCBvbiB3aGljaCBwYXRoIHdhcyB0YWtlblsqXQoJCXJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrZXk7Cgl9LAoJcmVtb3ZlOiBmdW5jdGlvbiggb3duZXIsIGtleSApIHsKCQl2YXIgaSwKCQkJY2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07CgoJCWlmICggY2FjaGUgPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBrZXkgIT09IHVuZGVmaW5lZCApIHsKCgkJCS8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBrZXlzCgkJCWlmICggQXJyYXkuaXNBcnJheSgga2V5ICkgKSB7CgoJCQkJLy8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi4KCQkJCS8vIFdlIGFsd2F5cyBzZXQgY2FtZWxDYXNlIGtleXMsIHNvIHJlbW92ZSB0aGF0LgoJCQkJa2V5ID0ga2V5Lm1hcCggY2FtZWxDYXNlICk7CgkJCX0gZWxzZSB7CgkJCQlrZXkgPSBjYW1lbENhc2UoIGtleSApOwoKCQkJCS8vIElmIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMsIHVzZSBpdC4KCQkJCS8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlCgkJCQlrZXkgPSBrZXkgaW4gY2FjaGUgPwoJCQkJCVsga2V5IF0gOgoJCQkJCSgga2V5Lm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10gKTsKCQkJfQoKCQkJaSA9IGtleS5sZW5ndGg7CgoJCQl3aGlsZSAoIGktLSApIHsKCQkJCWRlbGV0ZSBjYWNoZVsga2V5WyBpIF0gXTsKCQkJfQoJCX0KCgkJLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIHRoZXJlJ3Mgbm8gbW9yZSBkYXRhCgkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKSApIHsKCgkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUKCQkJLy8gV2Via2l0ICYgQmxpbmsgcGVyZm9ybWFuY2Ugc3VmZmVycyB3aGVuIGRlbGV0aW5nIHByb3BlcnRpZXMKCQkJLy8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZAoJCQkvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNzg2MDcgKGJ1ZyByZXN0cmljdGVkKQoJCQlpZiAoIG93bmVyLm5vZGVUeXBlICkgewoJCQkJb3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQl9IGVsc2UgewoJCQkJZGVsZXRlIG93bmVyWyB0aGlzLmV4cGFuZG8gXTsKCQkJfQoJCX0KCX0sCgloYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7CgkJdmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdOwoJCXJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTsKCX0KfTsKdmFyIGRhdGFQcml2ID0gbmV3IERhdGEoKTsKCnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7CgoKCi8vCUltcGxlbWVudGF0aW9uIFN1bW1hcnkKLy8KLy8JMS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRoIDEuOS54IGJyYW5jaAovLwkyLiBJbXByb3ZlIHRoZSBtb2R1bGUncyBtYWludGFpbmFiaWxpdHkgYnkgcmVkdWNpbmcgdGhlIHN0b3JhZ2UKLy8JCXBhdGhzIHRvIGEgc2luZ2xlIG1lY2hhbmlzbS4KLy8JMy4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCAicHJpdmF0ZSIgYW5kICJ1c2VyIiBkYXRhLgovLwk0LiBfTmV2ZXJfIGV4cG9zZSAicHJpdmF0ZSIgZGF0YSB0byB1c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKQovLwk1LiBBdm9pZCBleHBvc2luZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9uIHVzZXIgb2JqZWN0cyAoZWcuIGV4cGFuZG8gcHJvcGVydGllcykKLy8JNi4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0Cgp2YXIgcmJyYWNlID0gL14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLywKCXJtdWx0aURhc2ggPSAvW0EtWl0vZzsKCmZ1bmN0aW9uIGdldERhdGEoIGRhdGEgKSB7CglpZiAoIGRhdGEgPT09ICJ0cnVlIiApIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCglpZiAoIGRhdGEgPT09ICJmYWxzZSIgKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWlmICggZGF0YSA9PT0gIm51bGwiICkgewoJCXJldHVybiBudWxsOwoJfQoKCS8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nCglpZiAoIGRhdGEgPT09ICtkYXRhICsgIiIgKSB7CgkJcmV0dXJuICtkYXRhOwoJfQoKCWlmICggcmJyYWNlLnRlc3QoIGRhdGEgKSApIHsKCQlyZXR1cm4gSlNPTi5wYXJzZSggZGF0YSApOwoJfQoKCXJldHVybiBkYXRhOwp9CgpmdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkgewoJdmFyIG5hbWU7CgoJLy8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueQoJLy8gZGF0YSBmcm9tIHRoZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlCglpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCW5hbWUgPSAiZGF0YS0iICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsICItJCYiICkudG9Mb3dlckNhc2UoKTsKCQlkYXRhID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKCgkJaWYgKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKSB7CgkJCXRyeSB7CgkJCQlkYXRhID0gZ2V0RGF0YSggZGF0YSApOwoJCQl9IGNhdGNoICggZSApIHt9CgoJCQkvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXIKCQkJZGF0YVVzZXIuc2V0KCBlbGVtLCBrZXksIGRhdGEgKTsKCQl9IGVsc2UgewoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0KCX0KCXJldHVybiBkYXRhOwp9CgpqUXVlcnkuZXh0ZW5kKCB7CgloYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTsKCX0sCgoJZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7CgkJcmV0dXJuIGRhdGFVc2VyLmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQlkYXRhVXNlci5yZW1vdmUoIGVsZW0sIG5hbWUgKTsKCX0sCgoJLy8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWQKCS8vIHdpdGggZGlyZWN0IGNhbGxzIHRvIGRhdGFQcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLgoJX2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgewoJCXJldHVybiBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTsKCX0sCgoJX3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCWRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApOwoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CglkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgaSwgbmFtZSwgZGF0YSwKCQkJZWxlbSA9IHRoaXNbIDAgXSwKCQkJYXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlczsKCgkJLy8gR2V0cyBhbGwgdmFsdWVzCgkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHsKCQkJaWYgKCB0aGlzLmxlbmd0aCApIHsKCQkJCWRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0gKTsKCgkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWRhdGFQcml2LmdldCggZWxlbSwgImhhc0RhdGFBdHRycyIgKSApIHsKCQkJCQlpID0gYXR0cnMubGVuZ3RoOwoJCQkJCXdoaWxlICggaS0tICkgewoKCQkJCQkJLy8gU3VwcG9ydDogSUUgMTEgb25seQoJCQkJCQkvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKCMxNDg5NCkKCQkJCQkJaWYgKCBhdHRyc1sgaSBdICkgewoJCQkJCQkJbmFtZSA9IGF0dHJzWyBpIF0ubmFtZTsKCQkJCQkJCWlmICggbmFtZS5pbmRleE9mKCAiZGF0YS0iICkgPT09IDAgKSB7CgkJCQkJCQkJbmFtZSA9IGNhbWVsQ2FzZSggbmFtZS5zbGljZSggNSApICk7CgkJCQkJCQkJZGF0YUF0dHIoIGVsZW0sIG5hbWUsIGRhdGFbIG5hbWUgXSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJCWRhdGFQcml2LnNldCggZWxlbSwgImhhc0RhdGFBdHRycyIsIHRydWUgKTsKCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGRhdGE7CgkJfQoKCQkvLyBTZXRzIG11bHRpcGxlIHZhbHVlcwoJCWlmICggdHlwZW9mIGtleSA9PT0gIm9iamVjdCIgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQkJZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXkgKTsKCQkJfSApOwoJCX0KCgkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewoJCQl2YXIgZGF0YTsKCgkJCS8vIFRoZSBjYWxsaW5nIGpRdWVyeSBvYmplY3QgKGVsZW1lbnQgbWF0Y2hlcykgaXMgbm90IGVtcHR5CgkJCS8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlCgkJCS8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0CgkJCS8vIHdpbGwgcmVzdWx0IGluIGB1bmRlZmluZWRgIGZvciBlbGVtID0gdGhpc1sgMCBdIHdoaWNoIHdpbGwKCQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS4KCQkJaWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgoJCQkJLy8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZQoJCQkJLy8gVGhlIGtleSB3aWxsIGFsd2F5cyBiZSBjYW1lbENhc2VkIGluIERhdGEKCQkJCWRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0sIGtleSApOwoJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIGRhdGE7CgkJCQl9CgoJCQkJLy8gQXR0ZW1wdCB0byAiZGlzY292ZXIiIHRoZSBkYXRhIGluCgkJCQkvLyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzCgkJCQlkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGtleSApOwoJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIGRhdGE7CgkJCQl9CgoJCQkJLy8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LgoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBTZXQgdGhlIGRhdGEuLi4KCQkJdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCgkJCQkvLyBXZSBhbHdheXMgc3RvcmUgdGhlIGNhbWVsQ2FzZWQga2V5CgkJCQlkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTsKCQkJfSApOwoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgdHJ1ZSApOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlkYXRhVXNlci5yZW1vdmUoIHRoaXMsIGtleSApOwoJCX0gKTsKCX0KfSApOwoKCmpRdWVyeS5leHRlbmQoIHsKCXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHsKCQl2YXIgcXVldWU7CgoJCWlmICggZWxlbSApIHsKCQkJdHlwZSA9ICggdHlwZSB8fCAiZngiICkgKyAicXVldWUiOwoJCQlxdWV1ZSA9IGRhdGFQcml2LmdldCggZWxlbSwgdHlwZSApOwoKCQkJLy8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cAoJCQlpZiAoIGRhdGEgKSB7CgkJCQlpZiAoICFxdWV1ZSB8fCBBcnJheS5pc0FycmF5KCBkYXRhICkgKSB7CgkJCQkJcXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApOwoJCQkJfSBlbHNlIHsKCQkJCQlxdWV1ZS5wdXNoKCBkYXRhICk7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHF1ZXVlIHx8IFtdOwoJCX0KCX0sCgoJZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7CgkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCgkJdmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksCgkJCXN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLAoJCQlmbiA9IHF1ZXVlLnNoaWZ0KCksCgkJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCB0eXBlICksCgkJCW5leHQgPSBmdW5jdGlvbigpIHsKCQkJCWpRdWVyeS5kZXF1ZXVlKCBlbGVtLCB0eXBlICk7CgkJCX07CgoJCS8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWwKCQlpZiAoIGZuID09PSAiaW5wcm9ncmVzcyIgKSB7CgkJCWZuID0gcXVldWUuc2hpZnQoKTsKCQkJc3RhcnRMZW5ndGgtLTsKCQl9CgoJCWlmICggZm4gKSB7CgoJCQkvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nCgkJCS8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWQKCQkJaWYgKCB0eXBlID09PSAiZngiICkgewoJCQkJcXVldWUudW5zaGlmdCggImlucHJvZ3Jlc3MiICk7CgkJCX0KCgkJCS8vIENsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb24KCQkJZGVsZXRlIGhvb2tzLnN0b3A7CgkJCWZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7CgkJfQoKCQlpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHsKCQkJaG9va3MuZW1wdHkuZmlyZSgpOwoJCX0KCX0sCgoJLy8gTm90IHB1YmxpYyAtIGdlbmVyYXRlIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybiB0aGUgY3VycmVudCBvbmUKCV9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKCQl2YXIga2V5ID0gdHlwZSArICJxdWV1ZUhvb2tzIjsKCQlyZXR1cm4gZGF0YVByaXYuZ2V0KCBlbGVtLCBrZXkgKSB8fCBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIGtleSwgewoJCQllbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5IiApLmFkZCggZnVuY3Rpb24oKSB7CgkJCQlkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArICJxdWV1ZSIsIGtleSBdICk7CgkJCX0gKQoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJcXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXZhciBzZXR0ZXIgPSAyOwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZGF0YSA9IHR5cGU7CgkJCXR5cGUgPSAiZngiOwoJCQlzZXR0ZXItLTsKCQl9CgoJCWlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHsKCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7CgkJfQoKCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID8KCQkJdGhpcyA6CgkJCXRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsKCgkJCQkvLyBFbnN1cmUgYSBob29rcyBmb3IgdGhpcyBxdWV1ZQoJCQkJalF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7CgoJCQkJaWYgKCB0eXBlID09PSAiZngiICYmIHF1ZXVlWyAwIF0gIT09ICJpbnByb2dyZXNzIiApIHsKCQkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQkJfQoJCQl9ICk7Cgl9LAoJZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CgkJfSApOwoJfSwKCWNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewoJCXJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7Cgl9LAoKCS8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGUKCS8vIGFyZSBlbXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KQoJcHJvbWlzZTogZnVuY3Rpb24oIHR5cGUsIG9iaiApIHsKCQl2YXIgdG1wLAoJCQljb3VudCA9IDEsCgkJCWRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWVsZW1lbnRzID0gdGhpcywKCQkJaSA9IHRoaXMubGVuZ3RoLAoJCQlyZXNvbHZlID0gZnVuY3Rpb24oKSB7CgkJCQlpZiAoICEoIC0tY291bnQgKSApIHsKCQkJCQlkZWZlci5yZXNvbHZlV2l0aCggZWxlbWVudHMsIFsgZWxlbWVudHMgXSApOwoJCQkJfQoJCQl9OwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJb2JqID0gdHlwZTsKCQkJdHlwZSA9IHVuZGVmaW5lZDsKCQl9CgkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCgkJd2hpbGUgKCBpLS0gKSB7CgkJCXRtcCA9IGRhdGFQcml2LmdldCggZWxlbWVudHNbIGkgXSwgdHlwZSArICJxdWV1ZUhvb2tzIiApOwoJCQlpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7CgkJCQljb3VudCsrOwoJCQkJdG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApOwoJCQl9CgkJfQoJCXJlc29sdmUoKTsKCQlyZXR1cm4gZGVmZXIucHJvbWlzZSggb2JqICk7Cgl9Cn0gKTsKdmFyIHBudW0gPSAoIC9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8gKS5zb3VyY2U7Cgp2YXIgcmNzc051bSA9IG5ldyBSZWdFeHAoICJeKD86KFsrLV0pPXwpKCIgKyBwbnVtICsgIikoW2EteiVdKikkIiwgImkiICk7CgoKdmFyIGNzc0V4cGFuZCA9IFsgIlRvcCIsICJSaWdodCIsICJCb3R0b20iLCAiTGVmdCIgXTsKCnZhciBpc0hpZGRlbldpdGhpblRyZWUgPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7CgoJCS8vIGlzSGlkZGVuV2l0aGluVHJlZSBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uOwoJCS8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudAoJCWVsZW0gPSBlbCB8fCBlbGVtOwoKCQkvLyBJbmxpbmUgc3R5bGUgdHJ1bXBzIGFsbAoJCXJldHVybiBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICJub25lIiB8fAoJCQllbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmCgoJCQkvLyBPdGhlcndpc2UsIGNoZWNrIGNvbXB1dGVkIHN0eWxlCgkJCS8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MyAtIDQ1CgkJCS8vIERpc2Nvbm5lY3RlZCBlbGVtZW50cyBjYW4gaGF2ZSBjb21wdXRlZCBkaXNwbGF5OiBub25lLCBzbyBmaXJzdCBjb25maXJtIHRoYXQgZWxlbSBpcwoJCQkvLyBpbiB0aGUgZG9jdW1lbnQuCgkJCWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgJiYKCgkJCWpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApID09PSAibm9uZSI7Cgl9OwoKdmFyIHN3YXAgPSBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2ssIGFyZ3MgKSB7Cgl2YXIgcmV0LCBuYW1lLAoJCW9sZCA9IHt9OwoKCS8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lcwoJZm9yICggbmFtZSBpbiBvcHRpb25zICkgewoJCW9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdOwoJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTsKCX0KCglyZXQgPSBjYWxsYmFjay5hcHBseSggZWxlbSwgYXJncyB8fCBbXSApOwoKCS8vIFJldmVydCB0aGUgb2xkIHZhbHVlcwoJZm9yICggbmFtZSBpbiBvcHRpb25zICkgewoJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOwoJfQoKCXJldHVybiByZXQ7Cn07CgoKCgpmdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0sIHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkgewoJdmFyIGFkanVzdGVkLCBzY2FsZSwKCQltYXhJdGVyYXRpb25zID0gMjAsCgkJY3VycmVudFZhbHVlID0gdHdlZW4gPwoJCQlmdW5jdGlvbigpIHsKCQkJCXJldHVybiB0d2Vlbi5jdXIoKTsKCQkJfSA6CgkJCWZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AsICIiICk7CgkJCX0sCgkJaW5pdGlhbCA9IGN1cnJlbnRWYWx1ZSgpLAoJCXVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/ICIiIDogInB4IiApLAoKCQkvLyBTdGFydGluZyB2YWx1ZSBjb21wdXRhdGlvbiBpcyByZXF1aXJlZCBmb3IgcG90ZW50aWFsIHVuaXQgbWlzbWF0Y2hlcwoJCWluaXRpYWxJblVuaXQgPSAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0ICE9PSAicHgiICYmICtpbml0aWFsICkgJiYKCQkJcmNzc051bS5leGVjKCBqUXVlcnkuY3NzKCBlbGVtLCBwcm9wICkgKTsKCglpZiAoIGluaXRpYWxJblVuaXQgJiYgaW5pdGlhbEluVW5pdFsgMyBdICE9PSB1bml0ICkgewoKCQkvLyBTdXBwb3J0OiBGaXJlZm94IDw9NTQKCQkvLyBIYWx2ZSB0aGUgaXRlcmF0aW9uIHRhcmdldCB2YWx1ZSB0byBwcmV2ZW50IGludGVyZmVyZW5jZSBmcm9tIENTUyB1cHBlciBib3VuZHMgKGdoLTIxNDQpCgkJaW5pdGlhbCA9IGluaXRpYWwgLyAyOwoKCQkvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzCgkJdW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdOwoKCQkvLyBJdGVyYXRpdmVseSBhcHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFydGluZyBwb2ludAoJCWluaXRpYWxJblVuaXQgPSAraW5pdGlhbCB8fCAxOwoKCQl3aGlsZSAoIG1heEl0ZXJhdGlvbnMtLSApIHsKCgkJCS8vIEV2YWx1YXRlIGFuZCB1cGRhdGUgb3VyIGJlc3QgZ3Vlc3MgKGRvdWJsaW5nIGd1ZXNzZXMgdGhhdCB6ZXJvIG91dCkuCgkJCS8vIEZpbmlzaCBpZiB0aGUgc2NhbGUgZXF1YWxzIG9yIGNyb3NzZXMgMSAobWFraW5nIHRoZSBvbGQqbmV3IHByb2R1Y3Qgbm9uLXBvc2l0aXZlKS4KCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApOwoJCQlpZiAoICggMSAtIHNjYWxlICkgKiAoIDEgLSAoIHNjYWxlID0gY3VycmVudFZhbHVlKCkgLyBpbml0aWFsIHx8IDAuNSApICkgPD0gMCApIHsKCQkJCW1heEl0ZXJhdGlvbnMgPSAwOwoJCQl9CgkJCWluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7CgoJCX0KCgkJaW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgKiAyOwoJCWpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgaW5pdGlhbEluVW5pdCArIHVuaXQgKTsKCgkJLy8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvbgoJCXZhbHVlUGFydHMgPSB2YWx1ZVBhcnRzIHx8IFtdOwoJfQoKCWlmICggdmFsdWVQYXJ0cyApIHsKCQlpbml0aWFsSW5Vbml0ID0gK2luaXRpYWxJblVuaXQgfHwgK2luaXRpYWwgfHwgMDsKCgkJLy8gQXBwbHkgcmVsYXRpdmUgb2Zmc2V0ICgrPS8tPSkgaWYgc3BlY2lmaWVkCgkJYWRqdXN0ZWQgPSB2YWx1ZVBhcnRzWyAxIF0gPwoJCQlpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOgoJCQkrdmFsdWVQYXJ0c1sgMiBdOwoJCWlmICggdHdlZW4gKSB7CgkJCXR3ZWVuLnVuaXQgPSB1bml0OwoJCQl0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7CgkJCXR3ZWVuLmVuZCA9IGFkanVzdGVkOwoJCX0KCX0KCXJldHVybiBhZGp1c3RlZDsKfQoKCnZhciBkZWZhdWx0RGlzcGxheU1hcCA9IHt9OwoKZnVuY3Rpb24gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKSB7Cgl2YXIgdGVtcCwKCQlkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsCgkJbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLAoJCWRpc3BsYXkgPSBkZWZhdWx0RGlzcGxheU1hcFsgbm9kZU5hbWUgXTsKCglpZiAoIGRpc3BsYXkgKSB7CgkJcmV0dXJuIGRpc3BsYXk7Cgl9CgoJdGVtcCA9IGRvYy5ib2R5LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKSApOwoJZGlzcGxheSA9IGpRdWVyeS5jc3MoIHRlbXAsICJkaXNwbGF5IiApOwoKCXRlbXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGVtcCApOwoKCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCWRpc3BsYXkgPSAiYmxvY2siOwoJfQoJZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF0gPSBkaXNwbGF5OwoKCXJldHVybiBkaXNwbGF5Owp9CgpmdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7Cgl2YXIgZGlzcGxheSwgZWxlbSwKCQl2YWx1ZXMgPSBbXSwKCQlpbmRleCA9IDAsCgkJbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOwoKCS8vIERldGVybWluZSBuZXcgZGlzcGxheSB2YWx1ZSBmb3IgZWxlbWVudHMgdGhhdCBuZWVkIHRvIGNoYW5nZQoJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQllbGVtID0gZWxlbWVudHNbIGluZGV4IF07CgkJaWYgKCAhZWxlbS5zdHlsZSApIHsKCQkJY29udGludWU7CgkJfQoKCQlkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5OwoJCWlmICggc2hvdyApIHsKCgkJCS8vIFNpbmNlIHdlIGZvcmNlIHZpc2liaWxpdHkgdXBvbiBjYXNjYWRlLWhpZGRlbiBlbGVtZW50cywgYW4gaW1tZWRpYXRlIChhbmQgc2xvdykKCQkJLy8gY2hlY2sgaXMgcmVxdWlyZWQgaW4gdGhpcyBmaXJzdCBsb29wIHVubGVzcyB3ZSBoYXZlIGEgbm9uZW1wdHkgZGlzcGxheSB2YWx1ZSAoZWl0aGVyCgkJCS8vIGlubGluZSBvciBhYm91dC10by1iZS1yZXN0b3JlZCkKCQkJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgKSB7CgkJCQl2YWx1ZXNbIGluZGV4IF0gPSBkYXRhUHJpdi5nZXQoIGVsZW0sICJkaXNwbGF5IiApIHx8IG51bGw7CgkJCQlpZiAoICF2YWx1ZXNbIGluZGV4IF0gKSB7CgkJCQkJZWxlbS5zdHlsZS5kaXNwbGF5ID0gIiI7CgkJCQl9CgkJCX0KCQkJaWYgKCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApICkgewoJCQkJdmFsdWVzWyBpbmRleCBdID0gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKTsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmICggZGlzcGxheSAhPT0gIm5vbmUiICkgewoJCQkJdmFsdWVzWyBpbmRleCBdID0gIm5vbmUiOwoKCQkJCS8vIFJlbWVtYmVyIHdoYXQgd2UncmUgb3ZlcndyaXRpbmcKCQkJCWRhdGFQcml2LnNldCggZWxlbSwgImRpc3BsYXkiLCBkaXNwbGF5ICk7CgkJCX0KCQl9Cgl9CgoJLy8gU2V0IHRoZSBkaXNwbGF5IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wIHRvIGF2b2lkIGNvbnN0YW50IHJlZmxvdwoJZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQlpZiAoIHZhbHVlc1sgaW5kZXggXSAhPSBudWxsICkgewoJCQllbGVtZW50c1sgaW5kZXggXS5zdHlsZS5kaXNwbGF5ID0gdmFsdWVzWyBpbmRleCBdOwoJCX0KCX0KCglyZXR1cm4gZWxlbWVudHM7Cn0KCmpRdWVyeS5mbi5leHRlbmQoIHsKCXNob3c6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApOwoJfSwKCWhpZGU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzaG93SGlkZSggdGhpcyApOwoJfSwKCXRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkgewoJCWlmICggdHlwZW9mIHN0YXRlID09PSAiYm9vbGVhbiIgKSB7CgkJCXJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJaWYgKCBpc0hpZGRlbldpdGhpblRyZWUoIHRoaXMgKSApIHsKCQkJCWpRdWVyeSggdGhpcyApLnNob3coKTsKCQkJfSBlbHNlIHsKCQkJCWpRdWVyeSggdGhpcyApLmhpZGUoKTsKCQkJfQoJCX0gKTsKCX0KfSApOwp2YXIgcmNoZWNrYWJsZVR5cGUgPSAoIC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pICk7Cgp2YXIgcnRhZ05hbWUgPSAoIC88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0rKS9pICk7Cgp2YXIgcnNjcmlwdFR5cGUgPSAoIC9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSApOwoKCgovLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKQp2YXIgd3JhcE1hcCA9IHsKCgkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJb3B0aW9uOiBbIDEsICI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwgIjwvc2VsZWN0PiIgXSwKCgkvLyBYSFRNTCBwYXJzZXJzIGRvIG5vdCBtYWdpY2FsbHkgaW5zZXJ0IGVsZW1lbnRzIGluIHRoZQoJLy8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlbgoJLy8gdGhpcyBieSBvbWl0dGluZyA8dGJvZHk+IG9yIG90aGVyIHJlcXVpcmVkIGVsZW1lbnRzLgoJdGhlYWQ6IFsgMSwgIjx0YWJsZT4iLCAiPC90YWJsZT4iIF0sCgljb2w6IFsgMiwgIjx0YWJsZT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sCgl0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKCXRkOiBbIDMsICI8dGFibGU+PHRib2R5Pjx0cj4iLCAiPC90cj48L3Rib2R5PjwvdGFibGU+IiBdLAoKCV9kZWZhdWx0OiBbIDAsICIiLCAiIiBdCn07CgovLyBTdXBwb3J0OiBJRSA8PTkgb25seQp3cmFwTWFwLm9wdGdyb3VwID0gd3JhcE1hcC5vcHRpb247Cgp3cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkOwp3cmFwTWFwLnRoID0gd3JhcE1hcC50ZDsKCgpmdW5jdGlvbiBnZXRBbGwoIGNvbnRleHQsIHRhZyApIHsKCgkvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5CgkvLyBVc2UgdHlwZW9mIHRvIGF2b2lkIHplcm8tYXJndW1lbnQgbWV0aG9kIGludm9jYXRpb24gb24gaG9zdCBvYmplY3RzICgjMTUxNTEpCgl2YXIgcmV0OwoKCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCXJldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCAiKiIgKTsKCgl9IGVsc2UgaWYgKCB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSAidW5kZWZpbmVkIiApIHsKCQlyZXQgPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyB8fCAiKiIgKTsKCgl9IGVsc2UgewoJCXJldCA9IFtdOwoJfQoKCWlmICggdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIG5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSApIHsKCQlyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICk7Cgl9CgoJcmV0dXJuIHJldDsKfQoKCi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZApmdW5jdGlvbiBzZXRHbG9iYWxFdmFsKCBlbGVtcywgcmVmRWxlbWVudHMgKSB7Cgl2YXIgaSA9IDAsCgkJbCA9IGVsZW1zLmxlbmd0aDsKCglmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJZGF0YVByaXYuc2V0KAoJCQllbGVtc1sgaSBdLAoJCQkiZ2xvYmFsRXZhbCIsCgkJCSFyZWZFbGVtZW50cyB8fCBkYXRhUHJpdi5nZXQoIHJlZkVsZW1lbnRzWyBpIF0sICJnbG9iYWxFdmFsIiApCgkJKTsKCX0KfQoKCnZhciByaHRtbCA9IC88fCYjP1x3KzsvOwoKZnVuY3Rpb24gYnVpbGRGcmFnbWVudCggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiwgaWdub3JlZCApIHsKCXZhciBlbGVtLCB0bXAsIHRhZywgd3JhcCwgY29udGFpbnMsIGosCgkJZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKCQlub2RlcyA9IFtdLAoJCWkgPSAwLAoJCWwgPSBlbGVtcy5sZW5ndGg7CgoJZm9yICggOyBpIDwgbDsgaSsrICkgewoJCWVsZW0gPSBlbGVtc1sgaSBdOwoKCQlpZiAoIGVsZW0gfHwgZWxlbSA9PT0gMCApIHsKCgkJCS8vIEFkZCBub2RlcyBkaXJlY3RseQoJCQlpZiAoIHRvVHlwZSggZWxlbSApID09PSAib2JqZWN0IiApIHsKCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHkKCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTsKCgkJCS8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZQoJCQl9IGVsc2UgaWYgKCAhcmh0bWwudGVzdCggZWxlbSApICkgewoJCQkJbm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7CgoJCQkvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXMKCQkJfSBlbHNlIHsKCQkJCXRtcCA9IHRtcCB8fCBmcmFnbWVudC5hcHBlbmRDaGlsZCggY29udGV4dC5jcmVhdGVFbGVtZW50KCAiZGl2IiApICk7CgoJCQkJLy8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvbgoJCQkJdGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTsKCQkJCXdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0OwoJCQkJdG1wLmlubmVySFRNTCA9IHdyYXBbIDEgXSArIGpRdWVyeS5odG1sUHJlZmlsdGVyKCBlbGVtICkgKyB3cmFwWyAyIF07CgoJCQkJLy8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50CgkJCQlqID0gd3JhcFsgMCBdOwoJCQkJd2hpbGUgKCBqLS0gKSB7CgkJCQkJdG1wID0gdG1wLmxhc3RDaGlsZDsKCQkJCX0KCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHkKCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7CgoJCQkJLy8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXIKCQkJCXRtcCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7CgoJCQkJLy8gRW5zdXJlIHRoZSBjcmVhdGVkIG5vZGVzIGFyZSBvcnBoYW5lZCAoIzEyMzkyKQoJCQkJdG1wLnRleHRDb250ZW50ID0gIiI7CgkJCX0KCQl9Cgl9CgoJLy8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudAoJZnJhZ21lbnQudGV4dENvbnRlbnQgPSAiIjsKCglpID0gMDsKCXdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7CgoJCS8vIFNraXAgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgY29udGV4dCBjb2xsZWN0aW9uICh0cmFjLTQwODcpCgkJaWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApID4gLTEgKSB7CgkJCWlmICggaWdub3JlZCApIHsKCQkJCWlnbm9yZWQucHVzaCggZWxlbSApOwoJCQl9CgkJCWNvbnRpbnVlOwoJCX0KCgkJY29udGFpbnMgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwoKCQkvLyBBcHBlbmQgdG8gZnJhZ21lbnQKCQl0bXAgPSBnZXRBbGwoIGZyYWdtZW50LmFwcGVuZENoaWxkKCBlbGVtICksICJzY3JpcHQiICk7CgoJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKCQlpZiAoIGNvbnRhaW5zICkgewoJCQlzZXRHbG9iYWxFdmFsKCB0bXAgKTsKCQl9CgoJCS8vIENhcHR1cmUgZXhlY3V0YWJsZXMKCQlpZiAoIHNjcmlwdHMgKSB7CgkJCWogPSAwOwoJCQl3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHsKCQkJCWlmICggcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlIHx8ICIiICkgKSB7CgkJCQkJc2NyaXB0cy5wdXNoKCBlbGVtICk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIGZyYWdtZW50Owp9CgoKKCBmdW5jdGlvbigpIHsKCXZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKCQlkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSApLAoJCWlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApOwoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHkKCS8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpCgkvLyBTdXBwb3J0OiBXaW5kb3dzIFdlYiBBcHBzIChXV0EpCgkvLyBgbmFtZWAgYW5kIGB0eXBlYCBtdXN0IHVzZSAuc2V0QXR0cmlidXRlIGZvciBXV0EgKCMxNDkwMSkKCWlucHV0LnNldEF0dHJpYnV0ZSggInR5cGUiLCAicmFkaW8iICk7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgImNoZWNrZWQiICk7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJuYW1lIiwgInQiICk7CgoJZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApOwoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgb25seQoJLy8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzCglzdXBwb3J0LmNoZWNrQ2xvbmUgPSBkaXYuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7CgoJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkvLyBNYWtlIHN1cmUgdGV4dGFyZWEgKGFuZCBjaGVja2JveCkgZGVmYXVsdFZhbHVlIGlzIHByb3Blcmx5IGNsb25lZAoJZGl2LmlubmVySFRNTCA9ICI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IjsKCXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgPSAhIWRpdi5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlOwp9ICkoKTsKdmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCgoKdmFyCglya2V5RXZlbnQgPSAvXmtleS8sCglybW91c2VFdmVudCA9IC9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLywKCXJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XC4oLispfCkvOwoKZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKCXJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiByZXR1cm5GYWxzZSgpIHsKCXJldHVybiBmYWxzZTsKfQoKLy8gU3VwcG9ydDogSUUgPD05IG9ubHkKLy8gU2VlICMxMzM5MyBmb3IgbW9yZSBpbmZvCmZ1bmN0aW9uIHNhZmVBY3RpdmVFbGVtZW50KCkgewoJdHJ5IHsKCQlyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKCX0gY2F0Y2ggKCBlcnIgKSB7IH0KfQoKZnVuY3Rpb24gb24oIGVsZW0sIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIG9uZSApIHsKCXZhciBvcmlnRm4sIHR5cGU7CgoJLy8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzCglpZiAoIHR5cGVvZiB0eXBlcyA9PT0gIm9iamVjdCIgKSB7CgoJCS8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoKCQkJLy8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKQoJCQlkYXRhID0gZGF0YSB8fCBzZWxlY3RvcjsKCQkJc2VsZWN0b3IgPSB1bmRlZmluZWQ7CgkJfQoJCWZvciAoIHR5cGUgaW4gdHlwZXMgKSB7CgkJCW9uKCBlbGVtLCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7CgkJfQoJCXJldHVybiBlbGVtOwoJfQoKCWlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7CgoJCS8vICggdHlwZXMsIGZuICkKCQlmbiA9IHNlbGVjdG9yOwoJCWRhdGEgPSBzZWxlY3RvciA9IHVuZGVmaW5lZDsKCX0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7CgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgewoKCQkJLy8gKCB0eXBlcywgc2VsZWN0b3IsIGZuICkKCQkJZm4gPSBkYXRhOwoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0gZWxzZSB7CgoJCQkvLyAoIHR5cGVzLCBkYXRhLCBmbiApCgkJCWZuID0gZGF0YTsKCQkJZGF0YSA9IHNlbGVjdG9yOwoJCQlzZWxlY3RvciA9IHVuZGVmaW5lZDsKCQl9Cgl9CglpZiAoIGZuID09PSBmYWxzZSApIHsKCQlmbiA9IHJldHVybkZhbHNlOwoJfSBlbHNlIGlmICggIWZuICkgewoJCXJldHVybiBlbGVtOwoJfQoKCWlmICggb25lID09PSAxICkgewoJCW9yaWdGbiA9IGZuOwoJCWZuID0gZnVuY3Rpb24oIGV2ZW50ICkgewoKCQkJLy8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvCgkJCWpRdWVyeSgpLm9mZiggZXZlbnQgKTsKCQkJcmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfTsKCgkJLy8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm4KCQlmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTsKCX0KCXJldHVybiBlbGVtLmVhY2goIGZ1bmN0aW9uKCkgewoJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTsKCX0gKTsKfQoKLyoKICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgogKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLgogKi8KalF1ZXJ5LmV2ZW50ID0gewoKCWdsb2JhbDoge30sCgoJYWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkgewoKCQl2YXIgaGFuZGxlT2JqSW4sIGV2ZW50SGFuZGxlLCB0bXAsCgkJCWV2ZW50cywgdCwgaGFuZGxlT2JqLAoJCQlzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsCgkJCWVsZW1EYXRhID0gZGF0YVByaXYuZ2V0KCBlbGVtICk7CgoJCS8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpCgkJaWYgKCAhZWxlbURhdGEgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBvYmplY3Qgb2YgY3VzdG9tIGRhdGEgaW4gbGlldSBvZiB0aGUgaGFuZGxlcgoJCWlmICggaGFuZGxlci5oYW5kbGVyICkgewoJCQloYW5kbGVPYmpJbiA9IGhhbmRsZXI7CgkJCWhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyOwoJCQlzZWxlY3RvciA9IGhhbmRsZU9iakluLnNlbGVjdG9yOwoJCX0KCgkJLy8gRW5zdXJlIHRoYXQgaW52YWxpZCBzZWxlY3RvcnMgdGhyb3cgZXhjZXB0aW9ucyBhdCBhdHRhY2ggdGltZQoJCS8vIEV2YWx1YXRlIGFnYWluc3QgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgZWxlbSBpcyBhIG5vbi1lbGVtZW50IG5vZGUgKGUuZy4sIGRvY3VtZW50KQoJCWlmICggc2VsZWN0b3IgKSB7CgkJCWpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZG9jdW1lbnRFbGVtZW50LCBzZWxlY3RvciApOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyCgkJaWYgKCAhaGFuZGxlci5ndWlkICkgewoJCQloYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrOwoJCX0KCgkJLy8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBmaXJzdAoJCWlmICggISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7CgkJCWV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyA9IHt9OwoJCX0KCQlpZiAoICEoIGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlICkgKSB7CgkJCWV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7CgoJCQkJLy8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmQKCQkJCS8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQKCQkJCXJldHVybiB0eXBlb2YgalF1ZXJ5ICE9PSAidW5kZWZpbmVkIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgPwoJCQkJCWpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7CgkJCX07CgkJfQoKCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlCgkJdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgkJdCA9IHR5cGVzLmxlbmd0aDsKCQl3aGlsZSAoIHQtLSApIHsKCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdOwoJCQl0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTsKCQkJbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwoKCQkJLy8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx5IGhhbmRsZXJzCgkJCWlmICggIXR5cGUgKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwoKCQkJLy8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlCgkJCXR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTsKCgkJCS8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGUKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CgoJCQkvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVycwoJCQloYW5kbGVPYmogPSBqUXVlcnkuZXh0ZW5kKCB7CgkJCQl0eXBlOiB0eXBlLAoJCQkJb3JpZ1R5cGU6IG9yaWdUeXBlLAoJCQkJZGF0YTogZGF0YSwKCQkJCWhhbmRsZXI6IGhhbmRsZXIsCgkJCQlndWlkOiBoYW5kbGVyLmd1aWQsCgkJCQlzZWxlY3Rvcjogc2VsZWN0b3IsCgkJCQluZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLAoJCQkJbmFtZXNwYWNlOiBuYW1lc3BhY2VzLmpvaW4oICIuIiApCgkJCX0sIGhhbmRsZU9iakluICk7CgoJCQkvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdAoJCQlpZiAoICEoIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gKSApIHsKCQkJCWhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsKCQkJCWhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwOwoKCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQoJCQkJaWYgKCAhc3BlY2lhbC5zZXR1cCB8fAoJCQkJCXNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7CgoJCQkJCWlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkgewoJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlpZiAoIHNwZWNpYWwuYWRkICkgewoJCQkJc3BlY2lhbC5hZGQuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7CgoJCQkJaWYgKCAhaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCApIHsKCQkJCQloYW5kbGVPYmouaGFuZGxlci5ndWlkID0gaGFuZGxlci5ndWlkOwoJCQkJfQoJCQl9CgoJCQkvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udAoJCQlpZiAoIHNlbGVjdG9yICkgewoJCQkJaGFuZGxlcnMuc3BsaWNlKCBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50KyssIDAsIGhhbmRsZU9iaiApOwoJCQl9IGVsc2UgewoJCQkJaGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgkJCX0KCgkJCS8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb24KCQkJalF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTsKCQl9CgoJfSwKCgkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7CgoJCXZhciBqLCBvcmlnQ291bnQsIHRtcCwKCQkJZXZlbnRzLCB0LCBoYW5kbGVPYmosCgkJCXNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSwKCQkJZWxlbURhdGEgPSBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICkgJiYgZGF0YVByaXYuZ2V0KCBlbGVtICk7CgoJCWlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBPbmNlIGZvciBlYWNoIHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0eXBlIG1heSBiZSBvbWl0dGVkCgkJdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgkJdCA9IHR5cGVzLmxlbmd0aDsKCQl3aGlsZSAoIHQtLSApIHsKCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdOwoJCQl0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTsKCQkJbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwoKCQkJLy8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50CgkJCWlmICggIXR5cGUgKSB7CgkJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTsKCQkJCX0KCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCQkJdHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlOwoJCQloYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdOwoJCQl0bXAgPSB0bXBbIDIgXSAmJgoJCQkJbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCAiXFwuKD86LipcXC58KSIgKSArICIoXFwufCQpIiApOwoKCQkJLy8gUmVtb3ZlIG1hdGNoaW5nIGV2ZW50cwoJCQlvcmlnQ291bnQgPSBqID0gaGFuZGxlcnMubGVuZ3RoOwoJCQl3aGlsZSAoIGotLSApIHsKCQkJCWhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07CgoJCQkJaWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJgoJCQkJCSggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYmCgkJCQkJKCAhdG1wIHx8IHRtcC50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJgoJCQkJCSggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHwKCQkJCQkJc2VsZWN0b3IgPT09ICIqKiIgJiYgaGFuZGxlT2JqLnNlbGVjdG9yICkgKSB7CgkJCQkJaGFuZGxlcnMuc3BsaWNlKCBqLCAxICk7CgoJCQkJCWlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkgewoJCQkJCQloYW5kbGVycy5kZWxlZ2F0ZUNvdW50LS07CgkJCQkJfQoJCQkJCWlmICggc3BlY2lhbC5yZW1vdmUgKSB7CgkJCQkJCXNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdAoJCQkvLyAoYXZvaWRzIHBvdGVudGlhbCBmb3IgZW5kbGVzcyByZWN1cnNpb24gZHVyaW5nIHJlbW92YWwgb2Ygc3BlY2lhbCBldmVudCBoYW5kbGVycykKCQkJaWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHsKCQkJCWlmICggIXNwZWNpYWwudGVhcmRvd24gfHwKCQkJCQlzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHsKCgkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTsKCQkJCX0KCgkJCQlkZWxldGUgZXZlbnRzWyB0eXBlIF07CgkJCX0KCQl9CgoJCS8vIFJlbW92ZSBkYXRhIGFuZCB0aGUgZXhwYW5kbyBpZiBpdCdzIG5vIGxvbmdlciB1c2VkCgkJaWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZlbnRzICkgKSB7CgkJCWRhdGFQcml2LnJlbW92ZSggZWxlbSwgImhhbmRsZSBldmVudHMiICk7CgkJfQoJfSwKCglkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkgewoKCQkvLyBNYWtlIGEgd3JpdGFibGUgalF1ZXJ5LkV2ZW50IGZyb20gdGhlIG5hdGl2ZSBldmVudCBvYmplY3QKCQl2YXIgZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBuYXRpdmVFdmVudCApOwoKCQl2YXIgaSwgaiwgcmV0LCBtYXRjaGVkLCBoYW5kbGVPYmosIGhhbmRsZXJRdWV1ZSwKCQkJYXJncyA9IG5ldyBBcnJheSggYXJndW1lbnRzLmxlbmd0aCApLAoJCQloYW5kbGVycyA9ICggZGF0YVByaXYuZ2V0KCB0aGlzLCAiZXZlbnRzIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSwKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyBldmVudC50eXBlIF0gfHwge307CgoJCS8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50CgkJYXJnc1sgMCBdID0gZXZlbnQ7CgoJCWZvciAoIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrICkgewoJCQlhcmdzWyBpIF0gPSBhcmd1bWVudHNbIGkgXTsKCQl9CgoJCWV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpczsKCgkJLy8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZAoJCWlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBEZXRlcm1pbmUgaGFuZGxlcnMKCQloYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7CgoJCS8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzCgkJaSA9IDA7CgkJd2hpbGUgKCAoIG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07CgoJCQlqID0gMDsKCQkJd2hpbGUgKCAoIGhhbmRsZU9iaiA9IG1hdGNoZWQuaGFuZGxlcnNbIGorKyBdICkgJiYKCQkJCSFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkgewoKCQkJCS8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IgMikgaGF2ZSBuYW1lc3BhY2UocykKCQkJCS8vIGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBib3VuZCBldmVudCAoYm90aCBjYW4gaGF2ZSBubyBuYW1lc3BhY2UpLgoJCQkJaWYgKCAhZXZlbnQucm5hbWVzcGFjZSB8fCBldmVudC5ybmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHsKCgkJCQkJZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqOwoJCQkJCWV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0YTsKCgkJCQkJcmV0ID0gKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSApLmhhbmRsZSB8fAoJCQkJCQloYW5kbGVPYmouaGFuZGxlciApLmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTsKCgkJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQkJaWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJldCApID09PSBmYWxzZSApIHsKCQkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZQoJCWlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7CgkJCXNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgloYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHsKCQl2YXIgaSwgaGFuZGxlT2JqLCBzZWwsIG1hdGNoZWRIYW5kbGVycywgbWF0Y2hlZFNlbGVjdG9ycywKCQkJaGFuZGxlclF1ZXVlID0gW10sCgkJCWRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LAoJCQljdXIgPSBldmVudC50YXJnZXQ7CgoJCS8vIEZpbmQgZGVsZWdhdGUgaGFuZGxlcnMKCQlpZiAoIGRlbGVnYXRlQ291bnQgJiYKCgkJCS8vIFN1cHBvcnQ6IElFIDw9OQoJCQkvLyBCbGFjay1ob2xlIFNWRyA8dXNlPiBpbnN0YW5jZSB0cmVlcyAodHJhYy0xMzE4MCkKCQkJY3VyLm5vZGVUeXBlICYmCgoJCQkvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDIKCQkJLy8gU3VwcHJlc3Mgc3BlYy12aW9sYXRpbmcgY2xpY2tzIGluZGljYXRpbmcgYSBub24tcHJpbWFyeSBwb2ludGVyIGJ1dHRvbiAodHJhYy0zODYxKQoJCQkvLyBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudC10eXBlLWNsaWNrCgkJCS8vIFN1cHBvcnQ6IElFIDExIG9ubHkKCQkJLy8gLi4uYnV0IG5vdCBhcnJvdyBrZXkgImNsaWNrcyIgb2YgcmFkaW8gaW5wdXRzLCB3aGljaCBjYW4gaGF2ZSBgYnV0dG9uYCAtMSAoZ2gtMjM0MykKCQkJISggZXZlbnQudHlwZSA9PT0gImNsaWNrIiAmJiBldmVudC5idXR0b24gPj0gMSApICkgewoKCQkJZm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7CgoJCQkJLy8gRG9uJ3QgY2hlY2sgbm9uLWVsZW1lbnRzICgjMTMyMDgpCgkJCQkvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NCkKCQkJCWlmICggY3VyLm5vZGVUeXBlID09PSAxICYmICEoIGV2ZW50LnR5cGUgPT09ICJjbGljayIgJiYgY3VyLmRpc2FibGVkID09PSB0cnVlICkgKSB7CgkJCQkJbWF0Y2hlZEhhbmRsZXJzID0gW107CgkJCQkJbWF0Y2hlZFNlbGVjdG9ycyA9IHt9OwoJCQkJCWZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkgewoJCQkJCQloYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdOwoKCQkJCQkJLy8gRG9uJ3QgY29uZmxpY3Qgd2l0aCBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKCMxMzIwMykKCQkJCQkJc2VsID0gaGFuZGxlT2JqLnNlbGVjdG9yICsgIiAiOwoKCQkJCQkJaWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkgewoJCQkJCQkJbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID8KCQkJCQkJCQlqUXVlcnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+IC0xIDoKCQkJCQkJCQlqUXVlcnkuZmluZCggc2VsLCB0aGlzLCBudWxsLCBbIGN1ciBdICkubGVuZ3RoOwoJCQkJCQl9CgkJCQkJCWlmICggbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gKSB7CgkJCQkJCQltYXRjaGVkSGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJaWYgKCBtYXRjaGVkSGFuZGxlcnMubGVuZ3RoICkgewoJCQkJCQloYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBtYXRjaGVkSGFuZGxlcnMgfSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVycwoJCWN1ciA9IHRoaXM7CgkJaWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkgewoJCQloYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0gKTsKCQl9CgoJCXJldHVybiBoYW5kbGVyUXVldWU7Cgl9LAoKCWFkZFByb3A6IGZ1bmN0aW9uKCBuYW1lLCBob29rICkgewoJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggalF1ZXJ5LkV2ZW50LnByb3RvdHlwZSwgbmFtZSwgewoJCQllbnVtZXJhYmxlOiB0cnVlLAoJCQljb25maWd1cmFibGU6IHRydWUsCgoJCQlnZXQ6IGlzRnVuY3Rpb24oIGhvb2sgKSA/CgkJCQlmdW5jdGlvbigpIHsKCQkJCQlpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHsKCQkJCQkJCXJldHVybiBob29rKCB0aGlzLm9yaWdpbmFsRXZlbnQgKTsKCQkJCQl9CgkJCQl9IDoKCQkJCWZ1bmN0aW9uKCkgewoJCQkJCWlmICggdGhpcy5vcmlnaW5hbEV2ZW50ICkgewoJCQkJCQkJcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFsgbmFtZSBdOwoJCQkJCX0KCQkJCX0sCgoJCQlzZXQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgbmFtZSwgewoJCQkJCWVudW1lcmFibGU6IHRydWUsCgkJCQkJY29uZmlndXJhYmxlOiB0cnVlLAoJCQkJCXdyaXRhYmxlOiB0cnVlLAoJCQkJCXZhbHVlOiB2YWx1ZQoJCQkJfSApOwoJCQl9CgkJfSApOwoJfSwKCglmaXg6IGZ1bmN0aW9uKCBvcmlnaW5hbEV2ZW50ICkgewoJCXJldHVybiBvcmlnaW5hbEV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID8KCQkJb3JpZ2luYWxFdmVudCA6CgkJCW5ldyBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTsKCX0sCgoJc3BlY2lhbDogewoJCWxvYWQ6IHsKCgkJCS8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWQKCQkJbm9CdWJibGU6IHRydWUKCQl9LAoJCWZvY3VzOiB7CgoJCQkvLyBGaXJlIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3QKCQkJdHJpZ2dlcjogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIHRoaXMgIT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5mb2N1cyApIHsKCQkJCQl0aGlzLmZvY3VzKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoJCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c2luIgoJCX0sCgkJYmx1cjogewoJCQl0cmlnZ2VyOiBmdW5jdGlvbigpIHsKCQkJCWlmICggdGhpcyA9PT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmJsdXIgKSB7CgkJCQkJdGhpcy5ibHVyKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoJCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c291dCIKCQl9LAoJCWNsaWNrOiB7CgoJCQkvLyBGb3IgY2hlY2tib3gsIGZpcmUgbmF0aXZlIGV2ZW50IHNvIGNoZWNrZWQgc3RhdGUgd2lsbCBiZSByaWdodAoJCQl0cmlnZ2VyOiBmdW5jdGlvbigpIHsKCQkJCWlmICggdGhpcy50eXBlID09PSAiY2hlY2tib3giICYmIHRoaXMuY2xpY2sgJiYgbm9kZU5hbWUoIHRoaXMsICJpbnB1dCIgKSApIHsKCQkJCQl0aGlzLmNsaWNrKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoKCQkJLy8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIGRvbid0IGZpcmUgbmF0aXZlIC5jbGljaygpIG9uIGxpbmtzCgkJCV9kZWZhdWx0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlyZXR1cm4gbm9kZU5hbWUoIGV2ZW50LnRhcmdldCwgImEiICk7CgkJCX0KCQl9LAoKCQliZWZvcmV1bmxvYWQ6IHsKCQkJcG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7CgoJCQkJLy8gU3VwcG9ydDogRmlyZWZveCAyMCsKCQkJCS8vIEZpcmVmb3ggZG9lc24ndCBhbGVydCBpZiB0aGUgcmV0dXJuVmFsdWUgZmllbGQgaXMgbm90IHNldC4KCQkJCWlmICggZXZlbnQucmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgZXZlbnQub3JpZ2luYWxFdmVudCApIHsKCQkJCQlldmVudC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZXZlbnQucmVzdWx0OwoJCQkJfQoJCQl9CgkJfQoJfQp9OwoKalF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHsKCgkvLyBUaGlzICJpZiIgaXMgbmVlZGVkIGZvciBwbGFpbiBvYmplY3RzCglpZiAoIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHsKCQllbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSApOwoJfQp9OwoKalF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7CgoJLy8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkCglpZiAoICEoIHRoaXMgaW5zdGFuY2VvZiBqUXVlcnkuRXZlbnQgKSApIHsKCQlyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApOwoJfQoKCS8vIEV2ZW50IG9iamVjdAoJaWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7CgkJdGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjOwoJCXRoaXMudHlwZSA9IHNyYy50eXBlOwoKCQkvLyBFdmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHByZXZlbnRlZAoJCS8vIGJ5IGEgaGFuZGxlciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLgoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHwKCQkJCXNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiYKCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHkKCQkJCXNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgPwoJCQlyZXR1cm5UcnVlIDoKCQkJcmV0dXJuRmFsc2U7CgoJCS8vIENyZWF0ZSB0YXJnZXQgcHJvcGVydGllcwoJCS8vIFN1cHBvcnQ6IFNhZmFyaSA8PTYgLSA3IG9ubHkKCQkvLyBUYXJnZXQgc2hvdWxkIG5vdCBiZSBhIHRleHQgbm9kZSAoIzUwNCwgIzEzMTQzKQoJCXRoaXMudGFyZ2V0ID0gKCBzcmMudGFyZ2V0ICYmIHNyYy50YXJnZXQubm9kZVR5cGUgPT09IDMgKSA/CgkJCXNyYy50YXJnZXQucGFyZW50Tm9kZSA6CgkJCXNyYy50YXJnZXQ7CgoJCXRoaXMuY3VycmVudFRhcmdldCA9IHNyYy5jdXJyZW50VGFyZ2V0OwoJCXRoaXMucmVsYXRlZFRhcmdldCA9IHNyYy5yZWxhdGVkVGFyZ2V0OwoKCS8vIEV2ZW50IHR5cGUKCX0gZWxzZSB7CgkJdGhpcy50eXBlID0gc3JjOwoJfQoKCS8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0CglpZiAoIHByb3BzICkgewoJCWpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7Cgl9CgoJLy8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmUKCXRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTsKCgkvLyBNYXJrIGl0IGFzIGZpeGVkCgl0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTsKfTsKCi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZwovLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sCmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7Cgljb25zdHJ1Y3RvcjogalF1ZXJ5LkV2ZW50LAoJaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKCWlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzU2ltdWxhdGVkOiBmYWxzZSwKCglwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKCgkJaWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkgewoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJfQoJfSwKCXN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQlpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CgkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJfQoJfSwKCXN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQlpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CgkJCWUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CgkJfQoKCQl0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwoJfQp9OwoKLy8gSW5jbHVkZXMgYWxsIGNvbW1vbiBldmVudCBwcm9wcyBpbmNsdWRpbmcgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnQgc3BlY2lmaWMgcHJvcHMKalF1ZXJ5LmVhY2goIHsKCWFsdEtleTogdHJ1ZSwKCWJ1YmJsZXM6IHRydWUsCgljYW5jZWxhYmxlOiB0cnVlLAoJY2hhbmdlZFRvdWNoZXM6IHRydWUsCgljdHJsS2V5OiB0cnVlLAoJZGV0YWlsOiB0cnVlLAoJZXZlbnRQaGFzZTogdHJ1ZSwKCW1ldGFLZXk6IHRydWUsCglwYWdlWDogdHJ1ZSwKCXBhZ2VZOiB0cnVlLAoJc2hpZnRLZXk6IHRydWUsCgl2aWV3OiB0cnVlLAoJImNoYXIiOiB0cnVlLAoJY2hhckNvZGU6IHRydWUsCglrZXk6IHRydWUsCglrZXlDb2RlOiB0cnVlLAoJYnV0dG9uOiB0cnVlLAoJYnV0dG9uczogdHJ1ZSwKCWNsaWVudFg6IHRydWUsCgljbGllbnRZOiB0cnVlLAoJb2Zmc2V0WDogdHJ1ZSwKCW9mZnNldFk6IHRydWUsCglwb2ludGVySWQ6IHRydWUsCglwb2ludGVyVHlwZTogdHJ1ZSwKCXNjcmVlblg6IHRydWUsCglzY3JlZW5ZOiB0cnVlLAoJdGFyZ2V0VG91Y2hlczogdHJ1ZSwKCXRvRWxlbWVudDogdHJ1ZSwKCXRvdWNoZXM6IHRydWUsCgoJd2hpY2g6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgYnV0dG9uID0gZXZlbnQuYnV0dG9uOwoKCQkvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHMKCQlpZiAoIGV2ZW50LndoaWNoID09IG51bGwgJiYgcmtleUV2ZW50LnRlc3QoIGV2ZW50LnR5cGUgKSApIHsKCQkJcmV0dXJuIGV2ZW50LmNoYXJDb2RlICE9IG51bGwgPyBldmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGU7CgkJfQoKCQkvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0CgkJaWYgKCAhZXZlbnQud2hpY2ggJiYgYnV0dG9uICE9PSB1bmRlZmluZWQgJiYgcm1vdXNlRXZlbnQudGVzdCggZXZlbnQudHlwZSApICkgewoJCQlpZiAoIGJ1dHRvbiAmIDEgKSB7CgkJCQlyZXR1cm4gMTsKCQkJfQoKCQkJaWYgKCBidXR0b24gJiAyICkgewoJCQkJcmV0dXJuIDM7CgkJCX0KCgkJCWlmICggYnV0dG9uICYgNCApIHsKCQkJCXJldHVybiAyOwoJCQl9CgoJCQlyZXR1cm4gMDsKCQl9CgoJCXJldHVybiBldmVudC53aGljaDsKCX0KfSwgalF1ZXJ5LmV2ZW50LmFkZFByb3AgKTsKCi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrcwovLyBzbyB0aGF0IGV2ZW50IGRlbGVnYXRpb24gd29ya3MgaW4galF1ZXJ5LgovLyBEbyB0aGUgc2FtZSBmb3IgcG9pbnRlcmVudGVyL3BvaW50ZXJsZWF2ZSBhbmQgcG9pbnRlcm92ZXIvcG9pbnRlcm91dAovLwovLyBTdXBwb3J0OiBTYWZhcmkgNyBvbmx5Ci8vIFNhZmFyaSBzZW5kcyBtb3VzZWVudGVyIHRvbyBvZnRlbjsgc2VlOgovLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NzAyNTgKLy8gZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYnVnIChpdCBleGlzdGVkIGluIG9sZGVyIENocm9tZSB2ZXJzaW9ucyBhcyB3ZWxsKS4KalF1ZXJ5LmVhY2goIHsKCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAoJbW91c2VsZWF2ZTogIm1vdXNlb3V0IiwKCXBvaW50ZXJlbnRlcjogInBvaW50ZXJvdmVyIiwKCXBvaW50ZXJsZWF2ZTogInBvaW50ZXJvdXQiCn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CglqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0gewoJCWRlbGVnYXRlVHlwZTogZml4LAoJCWJpbmRUeXBlOiBmaXgsCgoJCWhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQl2YXIgcmV0LAoJCQkJdGFyZ2V0ID0gdGhpcywKCQkJCXJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LAoJCQkJaGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqOwoKCQkJLy8gRm9yIG1vdXNlZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC4KCQkJLy8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3cKCQkJaWYgKCAhcmVsYXRlZCB8fCAoIHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSApICkgewoJCQkJZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmlnVHlwZTsKCQkJCXJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCWV2ZW50LnR5cGUgPSBmaXg7CgkJCX0KCQkJcmV0dXJuIHJldDsKCQl9Cgl9Owp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJb246IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkgewoJCXJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOwoJfSwKCW9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7CgkJcmV0dXJuIG9uKCB0aGlzLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCAxICk7Cgl9LAoJb2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHsKCQl2YXIgaGFuZGxlT2JqLCB0eXBlOwoJCWlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkgewoKCQkJLy8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudAoJCQloYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7CgkJCWpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoCgkJCQloYW5kbGVPYmoubmFtZXNwYWNlID8KCQkJCQloYW5kbGVPYmoub3JpZ1R5cGUgKyAiLiIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDoKCQkJCQloYW5kbGVPYmoub3JpZ1R5cGUsCgkJCQloYW5kbGVPYmouc2VsZWN0b3IsCgkJCQloYW5kbGVPYmouaGFuZGxlcgoJCQkpOwoJCQlyZXR1cm4gdGhpczsKCQl9CgkJaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICkgewoKCQkJLy8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdICkKCQkJZm9yICggdHlwZSBpbiB0eXBlcyApIHsKCQkJCXRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApOwoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0KCQlpZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgKSB7CgoJCQkvLyAoIHR5cGVzIFssIGZuXSApCgkJCWZuID0gc2VsZWN0b3I7CgkJCXNlbGVjdG9yID0gdW5kZWZpbmVkOwoJCX0KCQlpZiAoIGZuID09PSBmYWxzZSApIHsKCQkJZm4gPSByZXR1cm5GYWxzZTsKCQl9CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGVzLCBmbiwgc2VsZWN0b3IgKTsKCQl9ICk7Cgl9Cn0gKTsKCgp2YXIKCgkvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovCgoJLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2lzc3Vlcy8zMjI5CglyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksCgoJLyogZXNsaW50LWVuYWJsZSAqLwoKCS8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSwgRWRnZSAxMiAtIDEzIG9ubHkKCS8vIEluIElFL0VkZ2UgdXNpbmcgcmVnZXggZ3JvdXBzIGhlcmUgY2F1c2VzIHNldmVyZSBzbG93ZG93bnMuCgkvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyLwoJcm5vSW5uZXJodG1sID0gLzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksCgoJLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAoJcmNoZWNrZWQgPSAvY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSwKCXJjbGVhblNjcmlwdCA9IC9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZzsKCi8vIFByZWZlciBhIHRib2R5IG92ZXIgaXRzIHBhcmVudCB0YWJsZSBmb3IgY29udGFpbmluZyBuZXcgcm93cwpmdW5jdGlvbiBtYW5pcHVsYXRpb25UYXJnZXQoIGVsZW0sIGNvbnRlbnQgKSB7CglpZiAoIG5vZGVOYW1lKCBlbGVtLCAidGFibGUiICkgJiYKCQlub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEgPyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCAidHIiICkgKSB7CgoJCXJldHVybiBqUXVlcnkoIGVsZW0gKS5jaGlsZHJlbiggInRib2R5IiApWyAwIF0gfHwgZWxlbTsKCX0KCglyZXR1cm4gZWxlbTsKfQoKLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvbgpmdW5jdGlvbiBkaXNhYmxlU2NyaXB0KCBlbGVtICkgewoJZWxlbS50eXBlID0gKCBlbGVtLmdldEF0dHJpYnV0ZSggInR5cGUiICkgIT09IG51bGwgKSArICIvIiArIGVsZW0udHlwZTsKCXJldHVybiBlbGVtOwp9CmZ1bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7CglpZiAoICggZWxlbS50eXBlIHx8ICIiICkuc2xpY2UoIDAsIDUgKSA9PT0gInRydWUvIiApIHsKCQllbGVtLnR5cGUgPSBlbGVtLnR5cGUuc2xpY2UoIDUgKTsKCX0gZWxzZSB7CgkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoICJ0eXBlIiApOwoJfQoKCXJldHVybiBlbGVtOwp9CgpmdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkgewoJdmFyIGksIGwsIHR5cGUsIHBkYXRhT2xkLCBwZGF0YUN1ciwgdWRhdGFPbGQsIHVkYXRhQ3VyLCBldmVudHM7CgoJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkgewoJCXJldHVybjsKCX0KCgkvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLgoJaWYgKCBkYXRhUHJpdi5oYXNEYXRhKCBzcmMgKSApIHsKCQlwZGF0YU9sZCA9IGRhdGFQcml2LmFjY2Vzcyggc3JjICk7CgkJcGRhdGFDdXIgPSBkYXRhUHJpdi5zZXQoIGRlc3QsIHBkYXRhT2xkICk7CgkJZXZlbnRzID0gcGRhdGFPbGQuZXZlbnRzOwoKCQlpZiAoIGV2ZW50cyApIHsKCQkJZGVsZXRlIHBkYXRhQ3VyLmhhbmRsZTsKCQkJcGRhdGFDdXIuZXZlbnRzID0ge307CgoJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCWZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyAyLiBDb3B5IHVzZXIgZGF0YQoJaWYgKCBkYXRhVXNlci5oYXNEYXRhKCBzcmMgKSApIHsKCQl1ZGF0YU9sZCA9IGRhdGFVc2VyLmFjY2Vzcyggc3JjICk7CgkJdWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTsKCgkJZGF0YVVzZXIuc2V0KCBkZXN0LCB1ZGF0YUN1ciApOwoJfQp9CgovLyBGaXggSUUgYnVncywgc2VlIHN1cHBvcnQgdGVzdHMKZnVuY3Rpb24gZml4SW5wdXQoIHNyYywgZGVzdCApIHsKCXZhciBub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCgkvLyBGYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbi4KCWlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHsKCQlkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDsKCgkvLyBGYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZCBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9ucwoJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgfHwgbm9kZU5hbWUgPT09ICJ0ZXh0YXJlYSIgKSB7CgkJZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlOwoJfQp9CgpmdW5jdGlvbiBkb21NYW5pcCggY29sbGVjdGlvbiwgYXJncywgY2FsbGJhY2ssIGlnbm9yZWQgKSB7CgoJLy8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5cwoJYXJncyA9IGNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTsKCgl2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsCgkJaSA9IDAsCgkJbCA9IGNvbGxlY3Rpb24ubGVuZ3RoLAoJCWlOb0Nsb25lID0gbCAtIDEsCgkJdmFsdWUgPSBhcmdzWyAwIF0sCgkJdmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTsKCgkvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXQKCWlmICggdmFsdWVJc0Z1bmN0aW9uIHx8CgkJCSggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJgoJCQkJIXN1cHBvcnQuY2hlY2tDbG9uZSAmJiByY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgKSB7CgkJcmV0dXJuIGNvbGxlY3Rpb24uZWFjaCggZnVuY3Rpb24oIGluZGV4ICkgewoJCQl2YXIgc2VsZiA9IGNvbGxlY3Rpb24uZXEoIGluZGV4ICk7CgkJCWlmICggdmFsdWVJc0Z1bmN0aW9uICkgewoJCQkJYXJnc1sgMCBdID0gdmFsdWUuY2FsbCggdGhpcywgaW5kZXgsIHNlbGYuaHRtbCgpICk7CgkJCX0KCQkJZG9tTWFuaXAoIHNlbGYsIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICk7CgkJfSApOwoJfQoKCWlmICggbCApIHsKCQlmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApOwoJCWZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKCgkJaWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHsKCQkJZnJhZ21lbnQgPSBmaXJzdDsKCQl9CgoJCS8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFjawoJCWlmICggZmlyc3QgfHwgaWdub3JlZCApIHsKCQkJc2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdldEFsbCggZnJhZ21lbnQsICJzY3JpcHQiICksIGRpc2FibGVTY3JpcHQgKTsKCQkJaGFzU2NyaXB0cyA9IHNjcmlwdHMubGVuZ3RoOwoKCQkJLy8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbQoJCQkvLyBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXAKCQkJLy8gYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKCM4MDcwKS4KCQkJZm9yICggOyBpIDwgbDsgaSsrICkgewoJCQkJbm9kZSA9IGZyYWdtZW50OwoKCQkJCWlmICggaSAhPT0gaU5vQ2xvbmUgKSB7CgkJCQkJbm9kZSA9IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApOwoKCQkJCQkvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uCgkJCQkJaWYgKCBoYXNTY3JpcHRzICkgewoKCQkJCQkJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5CgkJCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCQkJalF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKCQkJCQl9CgkJCQl9CgoJCQkJY2FsbGJhY2suY2FsbCggY29sbGVjdGlvblsgaSBdLCBub2RlLCBpICk7CgkJCX0KCgkJCWlmICggaGFzU2NyaXB0cyApIHsKCQkJCWRvYyA9IHNjcmlwdHNbIHNjcmlwdHMubGVuZ3RoIC0gMSBdLm93bmVyRG9jdW1lbnQ7CgoJCQkJLy8gUmVlbmFibGUgc2NyaXB0cwoJCQkJalF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApOwoKCQkJCS8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb24KCQkJCWZvciAoIGkgPSAwOyBpIDwgaGFzU2NyaXB0czsgaSsrICkgewoJCQkJCW5vZGUgPSBzY3JpcHRzWyBpIF07CgkJCQkJaWYgKCByc2NyaXB0VHlwZS50ZXN0KCBub2RlLnR5cGUgfHwgIiIgKSAmJgoJCQkJCQkhZGF0YVByaXYuYWNjZXNzKCBub2RlLCAiZ2xvYmFsRXZhbCIgKSAmJgoJCQkJCQlqUXVlcnkuY29udGFpbnMoIGRvYywgbm9kZSApICkgewoKCQkJCQkJaWYgKCBub2RlLnNyYyAmJiAoIG5vZGUudHlwZSB8fCAiIiApLnRvTG93ZXJDYXNlKCkgICE9PSAibW9kdWxlIiApIHsKCgkJCQkJCQkvLyBPcHRpb25hbCBBSkFYIGRlcGVuZGVuY3ksIGJ1dCB3b24ndCBydW4gc2NyaXB0cyBpZiBub3QgcHJlc2VudAoJCQkJCQkJaWYgKCBqUXVlcnkuX2V2YWxVcmwgKSB7CgkJCQkJCQkJalF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYyApOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgewoJCQkJCQkJRE9NRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsICIiICksIGRvYywgbm9kZSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiBjb2xsZWN0aW9uOwp9CgpmdW5jdGlvbiByZW1vdmUoIGVsZW0sIHNlbGVjdG9yLCBrZWVwRGF0YSApIHsKCXZhciBub2RlLAoJCW5vZGVzID0gc2VsZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgZWxlbSApIDogZWxlbSwKCQlpID0gMDsKCglmb3IgKCA7ICggbm9kZSA9IG5vZGVzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7CgkJaWYgKCAha2VlcERhdGEgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBub2RlICkgKTsKCQl9CgoJCWlmICggbm9kZS5wYXJlbnROb2RlICkgewoJCQlpZiAoIGtlZXBEYXRhICYmIGpRdWVyeS5jb250YWlucyggbm9kZS5vd25lckRvY3VtZW50LCBub2RlICkgKSB7CgkJCQlzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKCQkJfQoJCQlub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG5vZGUgKTsKCQl9Cgl9CgoJcmV0dXJuIGVsZW07Cn0KCmpRdWVyeS5leHRlbmQoIHsKCWh0bWxQcmVmaWx0ZXI6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVybiBodG1sLnJlcGxhY2UoIHJ4aHRtbFRhZywgIjwkMT48LyQyPiIgKTsKCX0sCgoJY2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQl2YXIgaSwgbCwgc3JjRWxlbWVudHMsIGRlc3RFbGVtZW50cywKCQkJY2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLAoJCQlpblBhZ2UgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwoKCQkvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXMKCQlpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmCgkJCQkhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7CgoJCQkvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6IGh0dHBzOi8vanNwZXJmLmNvbS9nZXRhbGwtdnMtc2l6emxlLzIKCQkJZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApOwoJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOwoKCQkJZm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQlmaXhJbnB1dCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTsKCQkJfQoJCX0KCgkJLy8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZQoJCWlmICggZGF0YUFuZEV2ZW50cyApIHsKCQkJaWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQkJCXNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7CgkJCQlkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApOwoKCQkJCWZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJY2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7CgkJCX0KCQl9CgoJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKCQlkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCAic2NyaXB0IiApOwoJCWlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7CgkJCXNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sICJzY3JpcHQiICkgKTsKCQl9CgoJCS8vIFJldHVybiB0aGUgY2xvbmVkIHNldAoJCXJldHVybiBjbG9uZTsKCX0sCgoJY2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGRhdGEsIGVsZW0sIHR5cGUsCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCwKCQkJaSA9IDA7CgoJCWZvciAoIDsgKCBlbGVtID0gZWxlbXNbIGkgXSApICE9PSB1bmRlZmluZWQ7IGkrKyApIHsKCQkJaWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7CgkJCQlpZiAoICggZGF0YSA9IGVsZW1bIGRhdGFQcml2LmV4cGFuZG8gXSApICkgewoJCQkJCWlmICggZGF0YS5ldmVudHMgKSB7CgkJCQkJCWZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7CgkJCQkJCQlpZiAoIHNwZWNpYWxbIHR5cGUgXSApIHsKCQkJCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7CgoJCQkJCQkJLy8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZAoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQlqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrCgkJCQkJLy8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlCgkJCQkJZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQkJfQoJCQkJaWYgKCBlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gKSB7CgoJCQkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrCgkJCQkJLy8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlCgkJCQkJZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQkJfQoJCQl9CgkJfQoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CglkZXRhY2g6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciwgdHJ1ZSApOwoJfSwKCglyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciApOwoJfSwKCgl0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewoJCQlyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/CgkJCQlqUXVlcnkudGV4dCggdGhpcyApIDoKCQkJCXRoaXMuZW1wdHkoKS5lYWNoKCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCQkJdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwoJCQkJCX0KCQkJCX0gKTsKCQl9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApOwoJfSwKCglhcHBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7CgkJCQl2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7CgkJCQl0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTsKCQkJfQoJCX0gKTsKCX0sCgoJcHJlcGVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCXZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTsKCQkJCXRhcmdldC5pbnNlcnRCZWZvcmUoIGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7CgkJCX0KCQl9ICk7Cgl9LAoKCWJlZm9yZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlpZiAoIHRoaXMucGFyZW50Tm9kZSApIHsKCQkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKCQkJfQoJCX0gKTsKCX0sCgoJYWZ0ZXI6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7CgkJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CgkJCX0KCQl9ICk7Cgl9LAoKCWVtcHR5OiBmdW5jdGlvbigpIHsKCQl2YXIgZWxlbSwKCQkJaSA9IDA7CgoJCWZvciAoIDsgKCBlbGVtID0gdGhpc1sgaSBdICkgIT0gbnVsbDsgaSsrICkgewoJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgoJCQkJLy8gUHJldmVudCBtZW1vcnkgbGVha3MKCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApOwoKCQkJCS8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzCgkJCQllbGVtLnRleHRDb250ZW50ID0gIiI7CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgljbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkgewoJCWRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7CgkJZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzOwoKCQlyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApOwoJCX0gKTsKCX0sCgoJaHRtbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJdmFyIGVsZW0gPSB0aGlzWyAwIF0gfHwge30sCgkJCQlpID0gMCwKCQkJCWwgPSB0aGlzLmxlbmd0aDsKCgkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJcmV0dXJuIGVsZW0uaW5uZXJIVE1MOwoJCQl9CgoJCQkvLyBTZWUgaWYgd2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5uZXJIVE1MCgkJCWlmICggdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJiAhcm5vSW5uZXJodG1sLnRlc3QoIHZhbHVlICkgJiYKCQkJCSF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKSBdICkgewoKCQkJCXZhbHVlID0galF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIHZhbHVlICk7CgoJCQkJdHJ5IHsKCQkJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQkJCWVsZW0gPSB0aGlzWyBpIF0gfHwge307CgoJCQkJCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKCQkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7CgkJCQkJCQllbGVtLmlubmVySFRNTCA9IHZhbHVlOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQllbGVtID0gMDsKCgkJCQkvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QKCQkJCX0gY2F0Y2ggKCBlICkge30KCQkJfQoKCQkJaWYgKCBlbGVtICkgewoJCQkJdGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTsKCQkJfQoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7Cgl9LAoKCXJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHsKCQl2YXIgaWdub3JlZCA9IFtdOwoKCQkvLyBNYWtlIHRoZSBjaGFuZ2VzLCByZXBsYWNpbmcgZWFjaCBub24taWdub3JlZCBjb250ZXh0IGVsZW1lbnQgd2l0aCB0aGUgbmV3IGNvbnRlbnQKCQlyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CgoJCQlpZiAoIGpRdWVyeS5pbkFycmF5KCB0aGlzLCBpZ25vcmVkICkgPCAwICkgewoJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTsKCQkJCWlmICggcGFyZW50ICkgewoJCQkJCXBhcmVudC5yZXBsYWNlQ2hpbGQoIGVsZW0sIHRoaXMgKTsKCQkJCX0KCQkJfQoKCQkvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uCgkJfSwgaWdub3JlZCApOwoJfQp9ICk7CgpqUXVlcnkuZWFjaCggewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVuZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBlbGVtcywKCQkJcmV0ID0gW10sCgkJCWluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSwKCQkJbGFzdCA9IGluc2VydC5sZW5ndGggLSAxLAoJCQlpID0gMDsKCgkJZm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHsKCQkJZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUoIHRydWUgKTsKCQkJalF1ZXJ5KCBpbnNlcnRbIGkgXSApWyBvcmlnaW5hbCBdKCBlbGVtcyApOwoKCQkJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5CgkJCS8vIC5nZXQoKSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJcHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApOwoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTsKCX07Cn0gKTsKdmFyIHJudW1ub25weCA9IG5ldyBSZWdFeHAoICJeKCIgKyBwbnVtICsgIikoPyFweClbYS16JV0rJCIsICJpIiApOwoKdmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkgewoKCQkvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHksIEZpcmVmb3ggPD0zMCAoIzE1MDk4LCAjMTQxNTApCgkJLy8gSUUgdGhyb3dzIG9uIGVsZW1lbnRzIGNyZWF0ZWQgaW4gcG9wdXBzCgkJLy8gRkYgbWVhbndoaWxlIHRocm93cyBvbiBmcmFtZSBlbGVtZW50cyB0aHJvdWdoICJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlIgoJCXZhciB2aWV3ID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3OwoKCQlpZiAoICF2aWV3IHx8ICF2aWV3Lm9wZW5lciApIHsKCQkJdmlldyA9IHdpbmRvdzsKCQl9CgoJCXJldHVybiB2aWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0gKTsKCX07Cgp2YXIgcmJveFN0eWxlID0gbmV3IFJlZ0V4cCggY3NzRXhwYW5kLmpvaW4oICJ8IiApLCAiaSIgKTsKCgoKKCBmdW5jdGlvbigpIHsKCgkvLyBFeGVjdXRpbmcgYm90aCBwaXhlbFBvc2l0aW9uICYgYm94U2l6aW5nUmVsaWFibGUgdGVzdHMgcmVxdWlyZSBvbmx5IG9uZSBsYXlvdXQKCS8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uCglmdW5jdGlvbiBjb21wdXRlU3R5bGVUZXN0cygpIHsKCgkJLy8gVGhpcyBpcyBhIHNpbmdsZXRvbiwgd2UgbmVlZCB0byBleGVjdXRlIGl0IG9ubHkgb25jZQoJCWlmICggIWRpdiApIHsKCQkJcmV0dXJuOwoJCX0KCgkJY29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSAicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4OyIgKwoJCQkibWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIjsKCQlkaXYuc3R5bGUuY3NzVGV4dCA9CgkJCSJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7IiArCgkJCSJtYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4OyIgKwoJCQkid2lkdGg6NjAlO3RvcDoxJSI7CgkJZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKCBjb250YWluZXIgKS5hcHBlbmRDaGlsZCggZGl2ICk7CgoJCXZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYgKTsKCQlwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSAiMSUiOwoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBGaXJlZm94IDw9MyAtIDQ0CgkJcmVsaWFibGVNYXJnaW5MZWZ0VmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5tYXJnaW5MZWZ0ICkgPT09IDEyOwoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBTYWZhcmkgPD05LjEgLSAxMC4xLCBpT1MgPD03LjAgLSA5LjMKCQkvLyBTb21lIHN0eWxlcyBjb21lIGJhY2sgd2l0aCBwZXJjZW50YWdlIHZhbHVlcywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGRuJ3QKCQlkaXYuc3R5bGUucmlnaHQgPSAiNjAlIjsKCQlwaXhlbEJveFN0eWxlc1ZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUucmlnaHQgKSA9PT0gMzY7CgoJCS8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5CgkJLy8gRGV0ZWN0IG1pc3JlcG9ydGluZyBvZiBjb250ZW50IGRpbWVuc2lvbnMgZm9yIGJveC1zaXppbmc6Ym9yZGVyLWJveCBlbGVtZW50cwoJCWJveFNpemluZ1JlbGlhYmxlVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS53aWR0aCApID09PSAzNjsKCgkJLy8gU3VwcG9ydDogSUUgOSBvbmx5CgkJLy8gRGV0ZWN0IG92ZXJmbG93OnNjcm9sbCBzY3Jld2luZXNzIChnaC0zNjk5KQoJCWRpdi5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CgkJc2Nyb2xsYm94U2l6ZVZhbCA9IGRpdi5vZmZzZXRXaWR0aCA9PT0gMzYgfHwgImFic29sdXRlIjsKCgkJZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKCgkJLy8gTnVsbGlmeSB0aGUgZGl2IHNvIGl0IHdvdWxkbid0IGJlIHN0b3JlZCBpbiB0aGUgbWVtb3J5IGFuZAoJCS8vIGl0IHdpbGwgYWxzbyBiZSBhIHNpZ24gdGhhdCBjaGVja3MgYWxyZWFkeSBwZXJmb3JtZWQKCQlkaXYgPSBudWxsOwoJfQoKCWZ1bmN0aW9uIHJvdW5kUGl4ZWxNZWFzdXJlcyggbWVhc3VyZSApIHsKCQlyZXR1cm4gTWF0aC5yb3VuZCggcGFyc2VGbG9hdCggbWVhc3VyZSApICk7Cgl9CgoJdmFyIHBpeGVsUG9zaXRpb25WYWwsIGJveFNpemluZ1JlbGlhYmxlVmFsLCBzY3JvbGxib3hTaXplVmFsLCBwaXhlbEJveFN0eWxlc1ZhbCwKCQlyZWxpYWJsZU1hcmdpbkxlZnRWYWwsCgkJY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSwKCQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApOwoKCS8vIEZpbmlzaCBlYXJseSBpbiBsaW1pdGVkIChub24tYnJvd3NlcikgZW52aXJvbm1lbnRzCglpZiAoICFkaXYuc3R5bGUgKSB7CgkJcmV0dXJuOwoJfQoKCS8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHkKCS8vIFN0eWxlIG9mIGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOCkKCWRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICJjb250ZW50LWJveCI7CglkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSAiIjsKCXN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSAiY29udGVudC1ib3giOwoKCWpRdWVyeS5leHRlbmQoIHN1cHBvcnQsIHsKCQlib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7CgkJCWNvbXB1dGVTdHlsZVRlc3RzKCk7CgkJCXJldHVybiBib3hTaXppbmdSZWxpYWJsZVZhbDsKCQl9LAoJCXBpeGVsQm94U3R5bGVzOiBmdW5jdGlvbigpIHsKCQkJY29tcHV0ZVN0eWxlVGVzdHMoKTsKCQkJcmV0dXJuIHBpeGVsQm94U3R5bGVzVmFsOwoJCX0sCgkJcGl4ZWxQb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJCWNvbXB1dGVTdHlsZVRlc3RzKCk7CgkJCXJldHVybiBwaXhlbFBvc2l0aW9uVmFsOwoJCX0sCgkJcmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHsKCQkJY29tcHV0ZVN0eWxlVGVzdHMoKTsKCQkJcmV0dXJuIHJlbGlhYmxlTWFyZ2luTGVmdFZhbDsKCQl9LAoJCXNjcm9sbGJveFNpemU6IGZ1bmN0aW9uKCkgewoJCQljb21wdXRlU3R5bGVUZXN0cygpOwoJCQlyZXR1cm4gc2Nyb2xsYm94U2l6ZVZhbDsKCQl9Cgl9ICk7Cn0gKSgpOwoKCmZ1bmN0aW9uIGN1ckNTUyggZWxlbSwgbmFtZSwgY29tcHV0ZWQgKSB7Cgl2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LAoKCQkvLyBTdXBwb3J0OiBGaXJlZm94IDUxKwoJCS8vIFJldHJpZXZpbmcgc3R5bGUgYmVmb3JlIGNvbXB1dGVkIHNvbWVob3cKCQkvLyBmaXhlcyBhbiBpc3N1ZSB3aXRoIGdldHRpbmcgd3JvbmcgdmFsdWVzCgkJLy8gb24gZGV0YWNoZWQgZWxlbWVudHMKCQlzdHlsZSA9IGVsZW0uc3R5bGU7CgoJY29tcHV0ZWQgPSBjb21wdXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKTsKCgkvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG5lZWRlZCBmb3I6CgkvLyAgIC5jc3MoJ2ZpbHRlcicpIChJRSA5IG9ubHksICMxMjUzNykKCS8vICAgLmNzcygnLS1jdXN0b21Qcm9wZXJ0eSkgKCMzMTQ0KQoJaWYgKCBjb21wdXRlZCApIHsKCQlyZXQgPSBjb21wdXRlZC5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICkgfHwgY29tcHV0ZWRbIG5hbWUgXTsKCgkJaWYgKCByZXQgPT09ICIiICYmICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICkgewoJCQlyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTsKCQl9CgoJCS8vIEEgdHJpYnV0ZSB0byB0aGUgImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMiCgkJLy8gQW5kcm9pZCBCcm93c2VyIHJldHVybnMgcGVyY2VudGFnZSBmb3Igc29tZSB2YWx1ZXMsCgkJLy8gYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVscy4KCQkvLyBUaGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6CgkJLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXMKCQlpZiAoICFzdXBwb3J0LnBpeGVsQm94U3R5bGVzKCkgJiYgcm51bW5vbnB4LnRlc3QoIHJldCApICYmIHJib3hTdHlsZS50ZXN0KCBuYW1lICkgKSB7CgoJCQkvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzCgkJCXdpZHRoID0gc3R5bGUud2lkdGg7CgkJCW1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7CgkJCW1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7CgoJCQkvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0CgkJCXN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDsKCQkJcmV0ID0gY29tcHV0ZWQud2lkdGg7CgoJCQkvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzCgkJCXN0eWxlLndpZHRoID0gd2lkdGg7CgkJCXN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7CgkJCXN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7CgkJfQoJfQoKCXJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/CgoJCS8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHkKCQkvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLgoJCXJldCArICIiIDoKCQlyZXQ7Cn0KCgpmdW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7CgoJLy8gRGVmaW5lIHRoZSBob29rLCB3ZSdsbCBjaGVjayBvbiB0aGUgZmlyc3QgcnVuIGlmIGl0J3MgcmVhbGx5IG5lZWRlZC4KCXJldHVybiB7CgkJZ2V0OiBmdW5jdGlvbigpIHsKCQkJaWYgKCBjb25kaXRpb25GbigpICkgewoKCQkJCS8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIGl0IGR1ZQoJCQkJLy8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwgcmVtb3ZlIGl0LgoJCQkJZGVsZXRlIHRoaXMuZ2V0OwoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi4KCQkJcmV0dXJuICggdGhpcy5nZXQgPSBob29rRm4gKS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfQoJfTsKfQoKCnZhcgoKCS8vIFN3YXBwYWJsZSBpZiBkaXNwbGF5IGlzIG5vbmUgb3Igc3RhcnRzIHdpdGggdGFibGUKCS8vIGV4Y2VwdCAidGFibGUiLCAidGFibGUtY2VsbCIsIG9yICJ0YWJsZS1jYXB0aW9uIgoJLy8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5CglyZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sCglyY3VzdG9tUHJvcCA9IC9eLS0vLAoJY3NzU2hvdyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiAiYmxvY2siIH0sCgljc3NOb3JtYWxUcmFuc2Zvcm0gPSB7CgkJbGV0dGVyU3BhY2luZzogIjAiLAoJCWZvbnRXZWlnaHQ6ICI0MDAiCgl9LAoKCWNzc1ByZWZpeGVzID0gWyAiV2Via2l0IiwgIk1veiIsICJtcyIgXSwKCWVtcHR5U3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApLnN0eWxlOwoKLy8gUmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eQpmdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHsKCgkvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90IHZlbmRvciBwcmVmaXhlZAoJaWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7CgkJcmV0dXJuIG5hbWU7Cgl9CgoJLy8gQ2hlY2sgZm9yIHZlbmRvciBwcmVmaXhlZCBuYW1lcwoJdmFyIGNhcE5hbWUgPSBuYW1lWyAwIF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoIDEgKSwKCQlpID0gY3NzUHJlZml4ZXMubGVuZ3RoOwoKCXdoaWxlICggaS0tICkgewoJCW5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTsKCQlpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHsKCQkJcmV0dXJuIG5hbWU7CgkJfQoJfQp9CgovLyBSZXR1cm4gYSBwcm9wZXJ0eSBtYXBwZWQgYWxvbmcgd2hhdCBqUXVlcnkuY3NzUHJvcHMgc3VnZ2VzdHMgb3IgdG8KLy8gYSB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHkuCmZ1bmN0aW9uIGZpbmFsUHJvcE5hbWUoIG5hbWUgKSB7Cgl2YXIgcmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF07CglpZiAoICFyZXQgKSB7CgkJcmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHx8IG5hbWU7Cgl9CglyZXR1cm4gcmV0Owp9CgpmdW5jdGlvbiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkgewoKCS8vIEFueSByZWxhdGl2ZSAoKy8tKSB2YWx1ZXMgaGF2ZSBhbHJlYWR5IGJlZW4KCS8vIG5vcm1hbGl6ZWQgYXQgdGhpcyBwb2ludAoJdmFyIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICk7CglyZXR1cm4gbWF0Y2hlcyA/CgoJCS8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkICJzdWJ0cmFjdCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rcwoJCU1hdGgubWF4KCAwLCBtYXRjaGVzWyAyIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAzIF0gfHwgInB4IiApIDoKCQl2YWx1ZTsKfQoKZnVuY3Rpb24gYm94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIGJveCwgaXNCb3JkZXJCb3gsIHN0eWxlcywgY29tcHV0ZWRWYWwgKSB7Cgl2YXIgaSA9IGRpbWVuc2lvbiA9PT0gIndpZHRoIiA/IDEgOiAwLAoJCWV4dHJhID0gMCwKCQlkZWx0YSA9IDA7CgoJLy8gQWRqdXN0bWVudCBtYXkgbm90IGJlIG5lY2Vzc2FyeQoJaWYgKCBib3ggPT09ICggaXNCb3JkZXJCb3ggPyAiYm9yZGVyIiA6ICJjb250ZW50IiApICkgewoJCXJldHVybiAwOwoJfQoKCWZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHsKCgkJLy8gQm90aCBib3ggbW9kZWxzIGV4Y2x1ZGUgbWFyZ2luCgkJaWYgKCBib3ggPT09ICJtYXJnaW4iICkgewoJCQlkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBib3ggKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CgkJfQoKCQkvLyBJZiB3ZSBnZXQgaGVyZSB3aXRoIGEgY29udGVudC1ib3gsIHdlJ3JlIHNlZWtpbmcgInBhZGRpbmciIG9yICJib3JkZXIiIG9yICJtYXJnaW4iCgkJaWYgKCAhaXNCb3JkZXJCb3ggKSB7CgoJCQkvLyBBZGQgcGFkZGluZwoJCQlkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCAicGFkZGluZyIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CgoJCQkvLyBGb3IgImJvcmRlciIgb3IgIm1hcmdpbiIsIGFkZCBib3JkZXIKCQkJaWYgKCBib3ggIT09ICJwYWRkaW5nIiApIHsKCQkJCWRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sICJib3JkZXIiICsgY3NzRXhwYW5kWyBpIF0gKyAiV2lkdGgiLCB0cnVlLCBzdHlsZXMgKTsKCgkJCS8vIEJ1dCBzdGlsbCBrZWVwIHRyYWNrIG9mIGl0IG90aGVyd2lzZQoJCQl9IGVsc2UgewoJCQkJZXh0cmEgKz0galF1ZXJ5LmNzcyggZWxlbSwgImJvcmRlciIgKyBjc3NFeHBhbmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxlcyApOwoJCQl9CgoJCS8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBib3JkZXItYm94IChjb250ZW50ICsgcGFkZGluZyArIGJvcmRlciksIHdlJ3JlIHNlZWtpbmcgImNvbnRlbnQiIG9yCgkJLy8gInBhZGRpbmciIG9yICJtYXJnaW4iCgkJfSBlbHNlIHsKCgkJCS8vIEZvciAiY29udGVudCIsIHN1YnRyYWN0IHBhZGRpbmcKCQkJaWYgKCBib3ggPT09ICJjb250ZW50IiApIHsKCQkJCWRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sICJwYWRkaW5nIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTsKCQkJfQoKCQkJLy8gRm9yICJjb250ZW50IiBvciAicGFkZGluZyIsIHN1YnRyYWN0IGJvcmRlcgoJCQlpZiAoIGJveCAhPT0gIm1hcmdpbiIgKSB7CgkJCQlkZWx0YSAtPSBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIGNzc0V4cGFuZFsgaSBdICsgIldpZHRoIiwgdHJ1ZSwgc3R5bGVzICk7CgkJCX0KCQl9Cgl9CgoJLy8gQWNjb3VudCBmb3IgcG9zaXRpdmUgY29udGVudC1ib3ggc2Nyb2xsIGd1dHRlciB3aGVuIHJlcXVlc3RlZCBieSBwcm92aWRpbmcgY29tcHV0ZWRWYWwKCWlmICggIWlzQm9yZGVyQm94ICYmIGNvbXB1dGVkVmFsID49IDAgKSB7CgoJCS8vIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBpcyBhIHJvdW5kZWQgc3VtIG9mIGNvbnRlbnQsIHBhZGRpbmcsIHNjcm9sbCBndXR0ZXIsIGFuZCBib3JkZXIKCQkvLyBBc3N1bWluZyBpbnRlZ2VyIHNjcm9sbCBndXR0ZXIsIHN1YnRyYWN0IHRoZSByZXN0IGFuZCByb3VuZCBkb3duCgkJZGVsdGEgKz0gTWF0aC5tYXgoIDAsIE1hdGguY2VpbCgKCQkJZWxlbVsgIm9mZnNldCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtCgkJCWNvbXB1dGVkVmFsIC0KCQkJZGVsdGEgLQoJCQlleHRyYSAtCgkJCTAuNQoJCSkgKTsKCX0KCglyZXR1cm4gZGVsdGE7Cn0KCmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKSB7CgoJLy8gU3RhcnQgd2l0aCBjb21wdXRlZCBzdHlsZQoJdmFyIHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLAoJCXZhbCA9IGN1ckNTUyggZWxlbSwgZGltZW5zaW9uLCBzdHlsZXMgKSwKCQlpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IiwKCQl2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3g7CgoJLy8gU3VwcG9ydDogRmlyZWZveCA8PTU0CgkvLyBSZXR1cm4gYSBjb25mb3VuZGluZyBub24tcGl4ZWwgdmFsdWUgb3IgZmVpZ24gaWdub3JhbmNlLCBhcyBhcHByb3ByaWF0ZS4KCWlmICggcm51bW5vbnB4LnRlc3QoIHZhbCApICkgewoJCWlmICggIWV4dHJhICkgewoJCQlyZXR1cm4gdmFsOwoJCX0KCQl2YWwgPSAiYXV0byI7Cgl9CgoJLy8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXMKCS8vIGZvciBnZXRDb21wdXRlZFN0eWxlIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gdGhlIHJlbGlhYmxlIGVsZW0uc3R5bGUKCXZhbHVlSXNCb3JkZXJCb3ggPSB2YWx1ZUlzQm9yZGVyQm94ICYmCgkJKCBzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgfHwgdmFsID09PSBlbGVtLnN0eWxlWyBkaW1lbnNpb24gXSApOwoKCS8vIEZhbGwgYmFjayB0byBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgd2hlbiB2YWx1ZSBpcyAiYXV0byIKCS8vIFRoaXMgaGFwcGVucyBmb3IgaW5saW5lIGVsZW1lbnRzIHdpdGggbm8gZXhwbGljaXQgc2V0dGluZyAoZ2gtMzU3MSkKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgLSA0LjMgb25seQoJLy8gQWxzbyB1c2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciBtaXNyZXBvcnRlZCBpbmxpbmUgZGltZW5zaW9ucyAoZ2gtMzYwMikKCWlmICggdmFsID09PSAiYXV0byIgfHwKCQkhcGFyc2VGbG9hdCggdmFsICkgJiYgalF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiLCBmYWxzZSwgc3R5bGVzICkgPT09ICJpbmxpbmUiICkgewoKCQl2YWwgPSBlbGVtWyAib2Zmc2V0IiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKSBdOwoKCQkvLyBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgcHJvdmlkZSBib3JkZXItYm94IHZhbHVlcwoJCXZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlOwoJfQoKCS8vIE5vcm1hbGl6ZSAiIiBhbmQgYXV0bwoJdmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDsKCgkvLyBBZGp1c3QgZm9yIHRoZSBlbGVtZW50J3MgYm94IG1vZGVsCglyZXR1cm4gKCB2YWwgKwoJCWJveE1vZGVsQWRqdXN0bWVudCgKCQkJZWxlbSwKCQkJZGltZW5zaW9uLAoJCQlleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gImJvcmRlciIgOiAiY29udGVudCIgKSwKCQkJdmFsdWVJc0JvcmRlckJveCwKCQkJc3R5bGVzLAoKCQkJLy8gUHJvdmlkZSB0aGUgY3VycmVudCBjb21wdXRlZCBzaXplIHRvIHJlcXVlc3Qgc2Nyb2xsIGd1dHRlciBjYWxjdWxhdGlvbiAoZ2gtMzU4OSkKCQkJdmFsCgkJKQoJKSArICJweCI7Cn0KCmpRdWVyeS5leHRlbmQoIHsKCgkvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQKCS8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eQoJY3NzSG9va3M6IHsKCQlvcGFjaXR5OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkJaWYgKCBjb21wdXRlZCApIHsKCgkJCQkJLy8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKCQkJCQl2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCAib3BhY2l0eSIgKTsKCQkJCQlyZXR1cm4gcmV0ID09PSAiIiA/ICIxIiA6IHJldDsKCQkJCX0KCQkJfQoJCX0KCX0sCgoJLy8gRG9uJ3QgYXV0b21hdGljYWxseSBhZGQgInB4IiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzCgljc3NOdW1iZXI6IHsKCQkiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQiOiB0cnVlLAoJCSJjb2x1bW5Db3VudCI6IHRydWUsCgkJImZpbGxPcGFjaXR5IjogdHJ1ZSwKCQkiZmxleEdyb3ciOiB0cnVlLAoJCSJmbGV4U2hyaW5rIjogdHJ1ZSwKCQkiZm9udFdlaWdodCI6IHRydWUsCgkJImxpbmVIZWlnaHQiOiB0cnVlLAoJCSJvcGFjaXR5IjogdHJ1ZSwKCQkib3JkZXIiOiB0cnVlLAoJCSJvcnBoYW5zIjogdHJ1ZSwKCQkid2lkb3dzIjogdHJ1ZSwKCQkiekluZGV4IjogdHJ1ZSwKCQkiem9vbSI6IHRydWUKCX0sCgoJLy8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZQoJLy8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZQoJY3NzUHJvcHM6IHt9LAoKCS8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlCglzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHsKCgkJLy8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZQoJCXZhciByZXQsIHR5cGUsIGhvb2tzLAoJCQlvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLAoJCQlpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICksCgkJCXN0eWxlID0gZWxlbS5zdHlsZTsKCgkJLy8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndAoJCS8vIHdhbnQgdG8gcXVlcnkgdGhlIHZhbHVlIGlmIGl0IGlzIGEgQ1NTIGN1c3RvbSBwcm9wZXJ0eQoJCS8vIHNpbmNlIHRoZXkgYXJlIHVzZXItZGVmaW5lZC4KCQlpZiAoICFpc0N1c3RvbVByb3AgKSB7CgkJCW5hbWUgPSBmaW5hbFByb3BOYW1lKCBvcmlnTmFtZSApOwoJCX0KCgkJLy8gR2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbiwgdGhlbiB1bnByZWZpeGVkIHZlcnNpb24KCQlob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTsKCgkJLy8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlCgkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQl0eXBlID0gdHlwZW9mIHZhbHVlOwoKCQkJLy8gQ29udmVydCAiKz0iIG9yICItPSIgdG8gcmVsYXRpdmUgbnVtYmVycyAoIzczNDUpCgkJCWlmICggdHlwZSA9PT0gInN0cmluZyIgJiYgKCByZXQgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJiByZXRbIDEgXSApIHsKCQkJCXZhbHVlID0gYWRqdXN0Q1NTKCBlbGVtLCBuYW1lLCByZXQgKTsKCgkJCQkvLyBGaXhlcyBidWcgIzkyMzcKCQkJCXR5cGUgPSAibnVtYmVyIjsKCQkJfQoKCQkJLy8gTWFrZSBzdXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0ICgjNzExNikKCQkJaWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkIHRoZSB1bml0IChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpCgkJCWlmICggdHlwZSA9PT0gIm51bWJlciIgKSB7CgkJCQl2YWx1ZSArPSByZXQgJiYgcmV0WyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdID8gIiIgOiAicHgiICk7CgkJCX0KCgkJCS8vIGJhY2tncm91bmQtKiBwcm9wcyBhZmZlY3Qgb3JpZ2luYWwgY2xvbmUncyB2YWx1ZXMKCQkJaWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09ICIiICYmIG5hbWUuaW5kZXhPZiggImJhY2tncm91bmQiICkgPT09IDAgKSB7CgkJCQlzdHlsZVsgbmFtZSBdID0gImluaGVyaXQiOwoJCQl9CgoJCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWUKCQkJaWYgKCAhaG9va3MgfHwgISggInNldCIgaW4gaG9va3MgKSB8fAoJCQkJKCB2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCWlmICggaXNDdXN0b21Qcm9wICkgewoJCQkJCXN0eWxlLnNldFByb3BlcnR5KCBuYW1lLCB2YWx1ZSApOwoJCQkJfSBlbHNlIHsKCQkJCQlzdHlsZVsgbmFtZSBdID0gdmFsdWU7CgkJCQl9CgkJCX0KCgkJfSBlbHNlIHsKCgkJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZQoJCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmCgkJCQkoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCXJldHVybiByZXQ7CgkJCX0KCgkJCS8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0CgkJCXJldHVybiBzdHlsZVsgbmFtZSBdOwoJCX0KCX0sCgoJY3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHsKCQl2YXIgdmFsLCBudW0sIGhvb2tzLAoJCQlvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLAoJCQlpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICk7CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZS4gV2UgZG9uJ3QKCQkvLyB3YW50IHRvIG1vZGlmeSB0aGUgdmFsdWUgaWYgaXQgaXMgYSBDU1MgY3VzdG9tIHByb3BlcnR5CgkJLy8gc2luY2UgdGhleSBhcmUgdXNlci1kZWZpbmVkLgoJCWlmICggIWlzQ3VzdG9tUHJvcCApIHsKCQkJbmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7CgkJfQoKCQkvLyBUcnkgcHJlZml4ZWQgbmFtZSBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCBuYW1lCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CgoJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCgkJaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyApIHsKCQkJdmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRyYSApOwoJCX0KCgkJLy8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXQKCQlpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkgewoJCQl2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApOwoJCX0KCgkJLy8gQ29udmVydCAibm9ybWFsIiB0byBjb21wdXRlZCB2YWx1ZQoJCWlmICggdmFsID09PSAibm9ybWFsIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHsKCQkJdmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07CgkJfQoKCQkvLyBNYWtlIG51bWVyaWMgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVyIHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tzIG51bWVyaWMKCQlpZiAoIGV4dHJhID09PSAiIiB8fCBleHRyYSApIHsKCQkJbnVtID0gcGFyc2VGbG9hdCggdmFsICk7CgkJCXJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDsKCQl9CgoJCXJldHVybiB2YWw7Cgl9Cn0gKTsKCmpRdWVyeS5lYWNoKCBbICJoZWlnaHQiLCAid2lkdGgiIF0sIGZ1bmN0aW9uKCBpLCBkaW1lbnNpb24gKSB7CglqUXVlcnkuY3NzSG9va3NbIGRpbWVuc2lvbiBdID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHsKCQkJaWYgKCBjb21wdXRlZCApIHsKCgkJCQkvLyBDZXJ0YWluIGVsZW1lbnRzIGNhbiBoYXZlIGRpbWVuc2lvbiBpbmZvIGlmIHdlIGludmlzaWJseSBzaG93IHRoZW0KCQkJCS8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0CgkJCQlyZXR1cm4gcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApICkgJiYKCgkJCQkJLy8gU3VwcG9ydDogU2FmYXJpIDgrCgkJCQkJLy8gVGFibGUgY29sdW1ucyBpbiBTYWZhcmkgaGF2ZSBub24temVybyBvZmZzZXRXaWR0aCAmIHplcm8KCQkJCQkvLyBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCB1bmxlc3MgZGlzcGxheSBpcyBjaGFuZ2VkLgoJCQkJCS8vIFN1cHBvcnQ6IElFIDw9MTEgb25seQoJCQkJCS8vIFJ1bm5pbmcgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IG9uIGEgZGlzY29ubmVjdGVkIG5vZGUKCQkJCQkvLyBpbiBJRSB0aHJvd3MgYW4gZXJyb3IuCgkJCQkJKCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCB8fCAhZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCApID8KCQkJCQkJc3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7CgkJCQkJCQlyZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApOwoJCQkJCQl9ICkgOgoJCQkJCQlnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7CgkJCX0KCQl9LAoKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSB7CgkJCXZhciBtYXRjaGVzLAoJCQkJc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksCgkJCQlpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IiwKCQkJCXN1YnRyYWN0ID0gZXh0cmEgJiYgYm94TW9kZWxBZGp1c3RtZW50KAoJCQkJCWVsZW0sCgkJCQkJZGltZW5zaW9uLAoJCQkJCWV4dHJhLAoJCQkJCWlzQm9yZGVyQm94LAoJCQkJCXN0eWxlcwoJCQkJKTsKCgkJCS8vIEFjY291bnQgZm9yIHVucmVsaWFibGUgYm9yZGVyLWJveCBkaW1lbnNpb25zIGJ5IGNvbXBhcmluZyBvZmZzZXQqIHRvIGNvbXB1dGVkIGFuZAoJCQkvLyBmYWtpbmcgYSBjb250ZW50LWJveCB0byBnZXQgYm9yZGVyIGFuZCBwYWRkaW5nIChnaC0zNjk5KQoJCQlpZiAoIGlzQm9yZGVyQm94ICYmIHN1cHBvcnQuc2Nyb2xsYm94U2l6ZSgpID09PSBzdHlsZXMucG9zaXRpb24gKSB7CgkJCQlzdWJ0cmFjdCAtPSBNYXRoLmNlaWwoCgkJCQkJZWxlbVsgIm9mZnNldCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtCgkJCQkJcGFyc2VGbG9hdCggc3R5bGVzWyBkaW1lbnNpb24gXSApIC0KCQkJCQlib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgImJvcmRlciIsIGZhbHNlLCBzdHlsZXMgKSAtCgkJCQkJMC41CgkJCQkpOwoJCQl9CgoJCQkvLyBDb252ZXJ0IHRvIHBpeGVscyBpZiB2YWx1ZSBhZGp1c3RtZW50IGlzIG5lZWRlZAoJCQlpZiAoIHN1YnRyYWN0ICYmICggbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmCgkJCQkoIG1hdGNoZXNbIDMgXSB8fCAicHgiICkgIT09ICJweCIgKSB7CgoJCQkJZWxlbS5zdHlsZVsgZGltZW5zaW9uIF0gPSB2YWx1ZTsKCQkJCXZhbHVlID0galF1ZXJ5LmNzcyggZWxlbSwgZGltZW5zaW9uICk7CgkJCX0KCgkJCXJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICk7CgkJfQoJfTsKfSApOwoKalF1ZXJ5LmNzc0hvb2tzLm1hcmdpbkxlZnQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5MZWZ0LAoJZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCWlmICggY29tcHV0ZWQgKSB7CgkJCXJldHVybiAoIHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgIm1hcmdpbkxlZnQiICkgKSB8fAoJCQkJZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0KCQkJCQlzd2FwKCBlbGVtLCB7IG1hcmdpbkxlZnQ6IDAgfSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7CgkJCQkJfSApCgkJCQkpICsgInB4IjsKCQl9Cgl9Cik7CgovLyBUaGVzZSBob29rcyBhcmUgdXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzCmpRdWVyeS5lYWNoKCB7CgltYXJnaW46ICIiLAoJcGFkZGluZzogIiIsCglib3JkZXI6ICJXaWR0aCIKfSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkgewoJalF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHsKCQlleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJdmFyIGkgPSAwLAoJCQkJZXhwYW5kZWQgPSB7fSwKCgkJCQkvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmcKCQkJCXBhcnRzID0gdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiA/IHZhbHVlLnNwbGl0KCAiICIgKSA6IFsgdmFsdWUgXTsKCgkJCWZvciAoIDsgaSA8IDQ7IGkrKyApIHsKCQkJCWV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID0KCQkJCQlwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07CgkJCX0KCgkJCXJldHVybiBleHBhbmRlZDsKCQl9Cgl9OwoKCWlmICggcHJlZml4ICE9PSAibWFyZ2luIiApIHsKCQlqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyOwoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7Cgljc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CgkJCXZhciBzdHlsZXMsIGxlbiwKCQkJCW1hcCA9IHt9LAoJCQkJaSA9IDA7CgoJCQlpZiAoIEFycmF5LmlzQXJyYXkoIG5hbWUgKSApIHsKCQkJCXN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApOwoJCQkJbGVuID0gbmFtZS5sZW5ndGg7CgoJCQkJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJCQkJbWFwWyBuYW1lWyBpIF0gXSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWVbIGkgXSwgZmFsc2UsIHN0eWxlcyApOwoJCQkJfQoKCQkJCXJldHVybiBtYXA7CgkJCX0KCgkJCXJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8KCQkJCWpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6CgkJCQlqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICk7CgkJfSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Cgl9Cn0gKTsKCgpmdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7CglyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApOwp9CmpRdWVyeS5Ud2VlbiA9IFR3ZWVuOwoKVHdlZW4ucHJvdG90eXBlID0gewoJY29uc3RydWN0b3I6IFR3ZWVuLAoJaW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkgewoJCXRoaXMuZWxlbSA9IGVsZW07CgkJdGhpcy5wcm9wID0gcHJvcDsKCQl0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0OwoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkJdGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTsKCQl0aGlzLmVuZCA9IGVuZDsKCQl0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gIiIgOiAicHgiICk7Cgl9LAoJY3VyOiBmdW5jdGlvbigpIHsKCQl2YXIgaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdOwoKCQlyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID8KCQkJaG9va3MuZ2V0KCB0aGlzICkgOgoJCQlUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7Cgl9LAoJcnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHsKCQl2YXIgZWFzZWQsCgkJCWhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7CgkJCXRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKAoJCQkJcGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVyY2VudCwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uCgkJCSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5wb3MgPSBlYXNlZCA9IHBlcmNlbnQ7CgkJfQoJCXRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVhc2VkICsgdGhpcy5zdGFydDsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHsKCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOwoJCX0KCgkJaWYgKCBob29rcyAmJiBob29rcy5zZXQgKSB7CgkJCWhvb2tzLnNldCggdGhpcyApOwoJCX0gZWxzZSB7CgkJCVR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTsKCQl9CgkJcmV0dXJuIHRoaXM7Cgl9Cn07CgpUd2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7CgpUd2Vlbi5wcm9wSG9va3MgPSB7CglfZGVmYXVsdDogewoJCWdldDogZnVuY3Rpb24oIHR3ZWVuICkgewoJCQl2YXIgcmVzdWx0OwoKCQkJLy8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCwKCQkJLy8gb3Igd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyBzdHlsZSBwcm9wZXJ0eSB0aGF0IGV4aXN0cy4KCQkJaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICE9PSAxIHx8CgkJCQl0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gIT0gbnVsbCAmJiB0d2Vlbi5lbGVtLnN0eWxlWyB0d2Vlbi5wcm9wIF0gPT0gbnVsbCApIHsKCQkJCXJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07CgkJCX0KCgkJCS8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseQoJCQkvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzLgoJCQkvLyBTaW1wbGUgdmFsdWVzIHN1Y2ggYXMgIjEwcHgiIGFyZSBwYXJzZWQgdG8gRmxvYXQ7CgkJCS8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgInJvdGF0ZSgxcmFkKSIgYXJlIHJldHVybmVkIGFzLWlzLgoJCQlyZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCAiIiApOwoKCQkJLy8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCAiYXV0byIgYXJlIGNvbnZlcnRlZCB0byAwLgoJCQlyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09ICJhdXRvIiA/IDAgOiByZXN1bHQ7CgkJfSwKCQlzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsKCgkJCS8vIFVzZSBzdGVwIGhvb2sgZm9yIGJhY2sgY29tcGF0LgoJCQkvLyBVc2UgY3NzSG9vayBpZiBpdHMgdGhlcmUuCgkJCS8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuCgkJCWlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSApIHsKCQkJCWpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7CgkJCX0gZWxzZSBpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgPT09IDEgJiYKCQkJCSggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8CgkJCQkJalF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHsKCQkJCWpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApOwoJCQl9IGVsc2UgewoJCQkJdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93OwoJCQl9CgkJfQoJfQp9OwoKLy8gU3VwcG9ydDogSUUgPD05IG9ubHkKLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzClR3ZWVuLnByb3BIb29rcy5zY3JvbGxUb3AgPSBUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsTGVmdCA9IHsKCXNldDogZnVuY3Rpb24oIHR3ZWVuICkgewoJCWlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7CgkJCXR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdzsKCQl9Cgl9Cn07CgpqUXVlcnkuZWFzaW5nID0gewoJbGluZWFyOiBmdW5jdGlvbiggcCApIHsKCQlyZXR1cm4gcDsKCX0sCglzd2luZzogZnVuY3Rpb24oIHAgKSB7CgkJcmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjsKCX0sCglfZGVmYXVsdDogInN3aW5nIgp9OwoKalF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7CgovLyBCYWNrIGNvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludApqUXVlcnkuZnguc3RlcCA9IHt9OwoKCgoKdmFyCglmeE5vdywgaW5Qcm9ncmVzcywKCXJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLAoJcnJ1biA9IC9xdWV1ZUhvb2tzJC87CgpmdW5jdGlvbiBzY2hlZHVsZSgpIHsKCWlmICggaW5Qcm9ncmVzcyApIHsKCQlpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHsKCQkJd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSggc2NoZWR1bGUgKTsKCQl9IGVsc2UgewoJCQl3aW5kb3cuc2V0VGltZW91dCggc2NoZWR1bGUsIGpRdWVyeS5meC5pbnRlcnZhbCApOwoJCX0KCgkJalF1ZXJ5LmZ4LnRpY2soKTsKCX0KfQoKLy8gQW5pbWF0aW9ucyBjcmVhdGVkIHN5bmNocm9ub3VzbHkgd2lsbCBydW4gc3luY2hyb25vdXNseQpmdW5jdGlvbiBjcmVhdGVGeE5vdygpIHsKCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQlmeE5vdyA9IHVuZGVmaW5lZDsKCX0gKTsKCXJldHVybiAoIGZ4Tm93ID0gRGF0ZS5ub3coKSApOwp9CgovLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvbgpmdW5jdGlvbiBnZW5GeCggdHlwZSwgaW5jbHVkZVdpZHRoICkgewoJdmFyIHdoaWNoLAoJCWkgPSAwLAoJCWF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTsKCgkvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsCgkvLyBvdGhlcndpc2Ugc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodAoJaW5jbHVkZVdpZHRoID0gaW5jbHVkZVdpZHRoID8gMSA6IDA7Cglmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7CgkJd2hpY2ggPSBjc3NFeHBhbmRbIGkgXTsKCQlhdHRyc1sgIm1hcmdpbiIgKyB3aGljaCBdID0gYXR0cnNbICJwYWRkaW5nIiArIHdoaWNoIF0gPSB0eXBlOwoJfQoKCWlmICggaW5jbHVkZVdpZHRoICkgewoJCWF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7Cgl9CgoJcmV0dXJuIGF0dHJzOwp9CgpmdW5jdGlvbiBjcmVhdGVUd2VlbiggdmFsdWUsIHByb3AsIGFuaW1hdGlvbiApIHsKCXZhciB0d2VlbiwKCQljb2xsZWN0aW9uID0gKCBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggQW5pbWF0aW9uLnR3ZWVuZXJzWyAiKiIgXSApLAoJCWluZGV4ID0gMCwKCQlsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDsKCWZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJaWYgKCAoIHR3ZWVuID0gY29sbGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkgKSApIHsKCgkJCS8vIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5CgkJCXJldHVybiB0d2VlbjsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIGRlZmF1bHRQcmVmaWx0ZXIoIGVsZW0sIHByb3BzLCBvcHRzICkgewoJdmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LAoJCWlzQm94ID0gIndpZHRoIiBpbiBwcm9wcyB8fCAiaGVpZ2h0IiBpbiBwcm9wcywKCQlhbmltID0gdGhpcywKCQlvcmlnID0ge30sCgkJc3R5bGUgPSBlbGVtLnN0eWxlLAoJCWhpZGRlbiA9IGVsZW0ubm9kZVR5cGUgJiYgaXNIaWRkZW5XaXRoaW5UcmVlKCBlbGVtICksCgkJZGF0YVNob3cgPSBkYXRhUHJpdi5nZXQoIGVsZW0sICJmeHNob3ciICk7CgoJLy8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzCglpZiAoICFvcHRzLnF1ZXVlICkgewoJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCAiZngiICk7CgkJaWYgKCBob29rcy51bnF1ZXVlZCA9PSBudWxsICkgewoJCQlob29rcy51bnF1ZXVlZCA9IDA7CgkJCW9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlOwoJCQlob29rcy5lbXB0eS5maXJlID0gZnVuY3Rpb24oKSB7CgkJCQlpZiAoICFob29rcy51bnF1ZXVlZCApIHsKCQkJCQlvbGRmaXJlKCk7CgkJCQl9CgkJCX07CgkJfQoJCWhvb2tzLnVucXVldWVkKys7CgoJCWFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHsKCgkJCS8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzCgkJCWFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHsKCQkJCWhvb2tzLnVucXVldWVkLS07CgkJCQlpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sICJmeCIgKS5sZW5ndGggKSB7CgkJCQkJaG9va3MuZW1wdHkuZmlyZSgpOwoJCQkJfQoJCQl9ICk7CgkJfSApOwoJfQoKCS8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9ucwoJZm9yICggcHJvcCBpbiBwcm9wcyApIHsKCQl2YWx1ZSA9IHByb3BzWyBwcm9wIF07CgkJaWYgKCByZnh0eXBlcy50ZXN0KCB2YWx1ZSApICkgewoJCQlkZWxldGUgcHJvcHNbIHByb3AgXTsKCQkJdG9nZ2xlID0gdG9nZ2xlIHx8IHZhbHVlID09PSAidG9nZ2xlIjsKCQkJaWYgKCB2YWx1ZSA9PT0gKCBoaWRkZW4gPyAiaGlkZSIgOiAic2hvdyIgKSApIHsKCgkJCQkvLyBQcmV0ZW5kIHRvIGJlIGhpZGRlbiBpZiB0aGlzIGlzIGEgInNob3ciIGFuZAoJCQkJLy8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGUKCQkJCWlmICggdmFsdWUgPT09ICJzaG93IiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJaGlkZGVuID0gdHJ1ZTsKCgkJCQkvLyBJZ25vcmUgYWxsIG90aGVyIG5vLW9wIHNob3cvaGlkZSBkYXRhCgkJCQl9IGVsc2UgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQl9CgkJCW9yaWdbIHByb3AgXSA9IGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gfHwgalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wICk7CgkJfQoJfQoKCS8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpCglwcm9wVHdlZW4gPSAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3BzICk7CglpZiAoICFwcm9wVHdlZW4gJiYgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIG9yaWcgKSApIHsKCQlyZXR1cm47Cgl9CgoJLy8gUmVzdHJpY3QgIm92ZXJmbG93IiBhbmQgImRpc3BsYXkiIHN0eWxlcyBkdXJpbmcgYm94IGFuaW1hdGlvbnMKCWlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCgkJLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNQoJCS8vIFJlY29yZCBhbGwgMyBvdmVyZmxvdyBhdHRyaWJ1dGVzIGJlY2F1c2UgSUUgZG9lcyBub3QgaW5mZXIgdGhlIHNob3J0aGFuZAoJCS8vIGZyb20gaWRlbnRpY2FsbHktdmFsdWVkIG92ZXJmbG93WCBhbmQgb3ZlcmZsb3dZIGFuZCBFZGdlIGp1c3QgbWlycm9ycwoJCS8vIHRoZSBvdmVyZmxvd1ggdmFsdWUgdGhlcmUuCgkJb3B0cy5vdmVyZmxvdyA9IFsgc3R5bGUub3ZlcmZsb3csIHN0eWxlLm92ZXJmbG93WCwgc3R5bGUub3ZlcmZsb3dZIF07CgoJCS8vIElkZW50aWZ5IGEgZGlzcGxheSB0eXBlLCBwcmVmZXJyaW5nIG9sZCBzaG93L2hpZGUgZGF0YSBvdmVyIHRoZSBDU1MgY2FzY2FkZQoJCXJlc3RvcmVEaXNwbGF5ID0gZGF0YVNob3cgJiYgZGF0YVNob3cuZGlzcGxheTsKCQlpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7CgkJCXJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCAiZGlzcGxheSIgKTsKCQl9CgkJZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApOwoJCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCQlpZiAoIHJlc3RvcmVEaXNwbGF5ICkgewoJCQkJZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5OwoJCQl9IGVsc2UgewoKCQkJCS8vIEdldCBub25lbXB0eSB2YWx1ZShzKSBieSB0ZW1wb3JhcmlseSBmb3JjaW5nIHZpc2liaWxpdHkKCQkJCXNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApOwoJCQkJcmVzdG9yZURpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXkgfHwgcmVzdG9yZURpc3BsYXk7CgkJCQlkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICk7CgkJCQlzaG93SGlkZSggWyBlbGVtIF0gKTsKCQkJfQoJCX0KCgkJLy8gQW5pbWF0ZSBpbmxpbmUgZWxlbWVudHMgYXMgaW5saW5lLWJsb2NrCgkJaWYgKCBkaXNwbGF5ID09PSAiaW5saW5lIiB8fCBkaXNwbGF5ID09PSAiaW5saW5lLWJsb2NrIiAmJiByZXN0b3JlRGlzcGxheSAhPSBudWxsICkgewoJCQlpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJmbG9hdCIgKSA9PT0gIm5vbmUiICkgewoKCQkJCS8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGRpc3BsYXkgdmFsdWUgYXQgdGhlIGVuZCBvZiBwdXJlIHNob3cvaGlkZSBhbmltYXRpb25zCgkJCQlpZiAoICFwcm9wVHdlZW4gKSB7CgkJCQkJYW5pbS5kb25lKCBmdW5jdGlvbigpIHsKCQkJCQkJc3R5bGUuZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5OwoJCQkJCX0gKTsKCQkJCQlpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7CgkJCQkJCWRpc3BsYXkgPSBzdHlsZS5kaXNwbGF5OwoJCQkJCQlyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09ICJub25lIiA/ICIiIDogZGlzcGxheTsKCQkJCQl9CgkJCQl9CgkJCQlzdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CgkJCX0KCQl9Cgl9CgoJaWYgKCBvcHRzLm92ZXJmbG93ICkgewoJCXN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CgkJYW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkgewoJCQlzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTsKCQkJc3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdOwoJCQlzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07CgkJfSApOwoJfQoKCS8vIEltcGxlbWVudCBzaG93L2hpZGUgYW5pbWF0aW9ucwoJcHJvcFR3ZWVuID0gZmFsc2U7Cglmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgoJCS8vIEdlbmVyYWwgc2hvdy9oaWRlIHNldHVwIGZvciB0aGlzIGVsZW1lbnQgYW5pbWF0aW9uCgkJaWYgKCAhcHJvcFR3ZWVuICkgewoJCQlpZiAoIGRhdGFTaG93ICkgewoJCQkJaWYgKCAiaGlkZGVuIiBpbiBkYXRhU2hvdyApIHsKCQkJCQloaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlkYXRhU2hvdyA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgImZ4c2hvdyIsIHsgZGlzcGxheTogcmVzdG9yZURpc3BsYXkgfSApOwoJCQl9CgoJCQkvLyBTdG9yZSBoaWRkZW4vdmlzaWJsZSBmb3IgdG9nZ2xlIHNvIGAuc3RvcCgpLnRvZ2dsZSgpYCAicmV2ZXJzZXMiCgkJCWlmICggdG9nZ2xlICkgewoJCQkJZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjsKCQkJfQoKCQkJLy8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW0KCQkJaWYgKCBoaWRkZW4gKSB7CgkJCQlzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTsKCQkJfQoKCQkJLyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovCgoJCQlhbmltLmRvbmUoIGZ1bmN0aW9uKCkgewoKCQkJLyogZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMgKi8KCgkJCQkvLyBUaGUgZmluYWwgc3RlcCBvZiBhICJoaWRlIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50CgkJCQlpZiAoICFoaWRkZW4gKSB7CgkJCQkJc2hvd0hpZGUoIFsgZWxlbSBdICk7CgkJCQl9CgkJCQlkYXRhUHJpdi5yZW1vdmUoIGVsZW0sICJmeHNob3ciICk7CgkJCQlmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgkJCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTsKCQkJCX0KCQkJfSApOwoJCX0KCgkJLy8gUGVyLXByb3BlcnR5IHNldHVwCgkJcHJvcFR3ZWVuID0gY3JlYXRlVHdlZW4oIGhpZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwLCBwcm9wLCBhbmltICk7CgkJaWYgKCAhKCBwcm9wIGluIGRhdGFTaG93ICkgKSB7CgkJCWRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7CgkJCWlmICggaGlkZGVuICkgewoJCQkJcHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDsKCQkJCXByb3BUd2Vlbi5zdGFydCA9IDA7CgkJCX0KCQl9Cgl9Cn0KCmZ1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFzaW5nICkgewoJdmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rczsKCgkvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3MKCWZvciAoIGluZGV4IGluIHByb3BzICkgewoJCW5hbWUgPSBjYW1lbENhc2UoIGluZGV4ICk7CgkJZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdOwoJCXZhbHVlID0gcHJvcHNbIGluZGV4IF07CgkJaWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkgewoJCQllYXNpbmcgPSB2YWx1ZVsgMSBdOwoJCQl2YWx1ZSA9IHByb3BzWyBpbmRleCBdID0gdmFsdWVbIDAgXTsKCQl9CgoJCWlmICggaW5kZXggIT09IG5hbWUgKSB7CgkJCXByb3BzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJZGVsZXRlIHByb3BzWyBpbmRleCBdOwoJCX0KCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTsKCQlpZiAoIGhvb2tzICYmICJleHBhbmQiIGluIGhvb2tzICkgewoJCQl2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTsKCQkJZGVsZXRlIHByb3BzWyBuYW1lIF07CgoJCQkvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuCgkJCS8vIFJldXNpbmcgJ2luZGV4JyBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgIm5hbWUiCgkJCWZvciAoIGluZGV4IGluIHZhbHVlICkgewoJCQkJaWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkgewoJCQkJCXByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07CgkJCQkJc3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZzsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCXNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZzsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHsKCXZhciByZXN1bHQsCgkJc3RvcHBlZCwKCQlpbmRleCA9IDAsCgkJbGVuZ3RoID0gQW5pbWF0aW9uLnByZWZpbHRlcnMubGVuZ3RoLAoJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkuYWx3YXlzKCBmdW5jdGlvbigpIHsKCgkJCS8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvcgoJCQlkZWxldGUgdGljay5lbGVtOwoJCX0gKSwKCQl0aWNrID0gZnVuY3Rpb24oKSB7CgkJCWlmICggc3RvcHBlZCApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQl2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLAoJCQkJcmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLAoKCQkJCS8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHkKCQkJCS8vIEFyY2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFsbG93IHVzIHRvIHVzZSBgMSAtICggMC41IHx8IDAgKWAgKCMxMjQ5NykKCQkJCXRlbXAgPSByZW1haW5pbmcgLyBhbmltYXRpb24uZHVyYXRpb24gfHwgMCwKCQkJCXBlcmNlbnQgPSAxIC0gdGVtcCwKCQkJCWluZGV4ID0gMCwKCQkJCWxlbmd0aCA9IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoOwoKCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJCWFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7CgkJCX0KCgkJCWRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSApOwoKCQkJLy8gSWYgdGhlcmUncyBtb3JlIHRvIGRvLCB5aWVsZAoJCQlpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHsKCQkJCXJldHVybiByZW1haW5pbmc7CgkJCX0KCgkJCS8vIElmIHRoaXMgd2FzIGFuIGVtcHR5IGFuaW1hdGlvbiwgc3ludGhlc2l6ZSBhIGZpbmFsIHByb2dyZXNzIG5vdGlmaWNhdGlvbgoJCQlpZiAoICFsZW5ndGggKSB7CgkJCQlkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7CgkJCX0KCgkJCS8vIFJlc29sdmUgdGhlIGFuaW1hdGlvbiBhbmQgcmVwb3J0IGl0cyBjb25jbHVzaW9uCgkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiBdICk7CgkJCXJldHVybiBmYWxzZTsKCQl9LAoJCWFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHsKCQkJZWxlbTogZWxlbSwKCQkJcHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksCgkJCW9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHsKCQkJCXNwZWNpYWxFYXNpbmc6IHt9LAoJCQkJZWFzaW5nOiBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0CgkJCX0sIG9wdGlvbnMgKSwKCQkJb3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLAoJCQlvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsCgkJCXN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSwKCQkJZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sCgkJCXR3ZWVuczogW10sCgkJCWNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkgewoJCQkJdmFyIHR3ZWVuID0galF1ZXJ5LlR3ZWVuKCBlbGVtLCBhbmltYXRpb24ub3B0cywgcHJvcCwgZW5kLAoJCQkJCQlhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7CgkJCQlhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7CgkJCQlyZXR1cm4gdHdlZW47CgkJCX0sCgkJCXN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkgewoJCQkJdmFyIGluZGV4ID0gMCwKCgkJCQkJLy8gSWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdlZW5zCgkJCQkJLy8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0CgkJCQkJbGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDsKCQkJCWlmICggc3RvcHBlZCApIHsKCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCQkJCXN0b3BwZWQgPSB0cnVlOwoJCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJCQlhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApOwoJCQkJfQoKCQkJCS8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0CgkJCQlpZiAoIGdvdG9FbmQgKSB7CgkJCQkJZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApOwoJCQkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7CgkJCQl9IGVsc2UgewoJCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9CgkJfSApLAoJCXByb3BzID0gYW5pbWF0aW9uLnByb3BzOwoKCXByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7CgoJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQlyZXN1bHQgPSBBbmltYXRpb24ucHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApOwoJCWlmICggcmVzdWx0ICkgewoJCQlpZiAoIGlzRnVuY3Rpb24oIHJlc3VsdC5zdG9wICkgKSB7CgkJCQlqUXVlcnkuX3F1ZXVlSG9va3MoIGFuaW1hdGlvbi5lbGVtLCBhbmltYXRpb24ub3B0cy5xdWV1ZSApLnN0b3AgPQoJCQkJCXJlc3VsdC5zdG9wLmJpbmQoIHJlc3VsdCApOwoJCQl9CgkJCXJldHVybiByZXN1bHQ7CgkJfQoJfQoKCWpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7CgoJaWYgKCBpc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkgewoJCWFuaW1hdGlvbi5vcHRzLnN0YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApOwoJfQoKCS8vIEF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zCglhbmltYXRpb24KCQkucHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzICkKCQkuZG9uZSggYW5pbWF0aW9uLm9wdHMuZG9uZSwgYW5pbWF0aW9uLm9wdHMuY29tcGxldGUgKQoJCS5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsICkKCQkuYWx3YXlzKCBhbmltYXRpb24ub3B0cy5hbHdheXMgKTsKCglqUXVlcnkuZngudGltZXIoCgkJalF1ZXJ5LmV4dGVuZCggdGljaywgewoJCQllbGVtOiBlbGVtLAoJCQlhbmltOiBhbmltYXRpb24sCgkJCXF1ZXVlOiBhbmltYXRpb24ub3B0cy5xdWV1ZQoJCX0gKQoJKTsKCglyZXR1cm4gYW5pbWF0aW9uOwp9CgpqUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7CgoJdHdlZW5lcnM6IHsKCQkiKiI6IFsgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkgewoJCQl2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApOwoJCQlhZGp1c3RDU1MoIHR3ZWVuLmVsZW0sIHByb3AsIHJjc3NOdW0uZXhlYyggdmFsdWUgKSwgdHdlZW4gKTsKCQkJcmV0dXJuIHR3ZWVuOwoJCX0gXQoJfSwKCgl0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkgewoJCWlmICggaXNGdW5jdGlvbiggcHJvcHMgKSApIHsKCQkJY2FsbGJhY2sgPSBwcm9wczsKCQkJcHJvcHMgPSBbICIqIiBdOwoJCX0gZWxzZSB7CgkJCXByb3BzID0gcHJvcHMubWF0Y2goIHJub3RodG1sd2hpdGUgKTsKCQl9CgoJCXZhciBwcm9wLAoJCQlpbmRleCA9IDAsCgkJCWxlbmd0aCA9IHByb3BzLmxlbmd0aDsKCgkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJcHJvcCA9IHByb3BzWyBpbmRleCBdOwoJCQlBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSA9IEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdOwoJCQlBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXS51bnNoaWZ0KCBjYWxsYmFjayApOwoJCX0KCX0sCgoJcHJlZmlsdGVyczogWyBkZWZhdWx0UHJlZmlsdGVyIF0sCgoJcHJlZmlsdGVyOiBmdW5jdGlvbiggY2FsbGJhY2ssIHByZXBlbmQgKSB7CgkJaWYgKCBwcmVwZW5kICkgewoJCQlBbmltYXRpb24ucHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApOwoJCX0gZWxzZSB7CgkJCUFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7CgkJfQoJfQp9ICk7CgpqUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7Cgl2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDogewoJCWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CgkJCWlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsCgkJZHVyYXRpb246IHNwZWVkLAoJCWVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nCgl9OwoKCS8vIEdvIHRvIHRoZSBlbmQgc3RhdGUgaWYgZnggYXJlIG9mZgoJaWYgKCBqUXVlcnkuZngub2ZmICkgewoJCW9wdC5kdXJhdGlvbiA9IDA7CgoJfSBlbHNlIHsKCQlpZiAoIHR5cGVvZiBvcHQuZHVyYXRpb24gIT09ICJudW1iZXIiICkgewoJCQlpZiAoIG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzICkgewoJCQkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkc1sgb3B0LmR1cmF0aW9uIF07CgoJCQl9IGVsc2UgewoJCQkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKCQkJfQoJCX0KCX0KCgkvLyBOb3JtYWxpemUgb3B0LnF1ZXVlIC0gdHJ1ZS91bmRlZmluZWQvbnVsbCAtPiAiZngiCglpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHsKCQlvcHQucXVldWUgPSAiZngiOwoJfQoKCS8vIFF1ZXVlaW5nCglvcHQub2xkID0gb3B0LmNvbXBsZXRlOwoKCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewoJCWlmICggaXNGdW5jdGlvbiggb3B0Lm9sZCApICkgewoJCQlvcHQub2xkLmNhbGwoIHRoaXMgKTsKCQl9CgoJCWlmICggb3B0LnF1ZXVlICkgewoJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7CgkJfQoJfTsKCglyZXR1cm4gb3B0Owp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkgewoKCQkvLyBTaG93IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDAKCQlyZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuV2l0aGluVHJlZSApLmNzcyggIm9wYWNpdHkiLCAwICkuc2hvdygpCgoJCQkvLyBBbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQKCQkJLmVuZCgpLmFuaW1hdGUoIHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsKCX0sCglhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CgkJdmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSwKCQkJb3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLAoJCQlkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkgewoKCQkJCS8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0CgkJCQl2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7CgoJCQkJLy8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5CgkJCQlpZiAoIGVtcHR5IHx8IGRhdGFQcml2LmdldCggdGhpcywgImZpbmlzaCIgKSApIHsKCQkJCQlhbmltLnN0b3AoIHRydWUgKTsKCQkJCX0KCQkJfTsKCQkJZG9BbmltYXRpb24uZmluaXNoID0gZG9BbmltYXRpb247CgoJCXJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID8KCQkJdGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDoKCQkJdGhpcy5xdWV1ZSggb3B0YWxsLnF1ZXVlLCBkb0FuaW1hdGlvbiApOwoJfSwKCXN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkgewoJCXZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7CgkJCXZhciBzdG9wID0gaG9va3Muc3RvcDsKCQkJZGVsZXRlIGhvb2tzLnN0b3A7CgkJCXN0b3AoIGdvdG9FbmQgKTsKCQl9OwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZ290b0VuZCA9IGNsZWFyUXVldWU7CgkJCWNsZWFyUXVldWUgPSB0eXBlOwoJCQl0eXBlID0gdW5kZWZpbmVkOwoJCX0KCQlpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7CgkJCXRoaXMucXVldWUoIHR5cGUgfHwgImZ4IiwgW10gKTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQl2YXIgZGVxdWV1ZSA9IHRydWUsCgkJCQlpbmRleCA9IHR5cGUgIT0gbnVsbCAmJiB0eXBlICsgInF1ZXVlSG9va3MiLAoJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKTsKCgkJCWlmICggaW5kZXggKSB7CgkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICkgewoJCQkJCXN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZm9yICggaW5kZXggaW4gZGF0YSApIHsKCQkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHsKCQkJCQkJc3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgewoJCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJgoJCQkJCSggdHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkgewoKCQkJCQl0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7CgkJCQkJZGVxdWV1ZSA9IGZhbHNlOwoJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CgkJCQl9CgkJCX0KCgkJCS8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuCgkJCS8vIFRpbWVycyBjdXJyZW50bHkgd2lsbCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2gKCQkJLy8gd2lsbCBkZXF1ZXVlIGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kLgoJCQlpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7CgkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQl9CgkJfSApOwoJfSwKCWZpbmlzaDogZnVuY3Rpb24oIHR5cGUgKSB7CgkJaWYgKCB0eXBlICE9PSBmYWxzZSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCQl9CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCXZhciBpbmRleCwKCQkJCWRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKSwKCQkJCXF1ZXVlID0gZGF0YVsgdHlwZSArICJxdWV1ZSIgXSwKCQkJCWhvb2tzID0gZGF0YVsgdHlwZSArICJxdWV1ZUhvb2tzIiBdLAoJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDsKCgkJCS8vIEVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGEKCQkJZGF0YS5maW5pc2ggPSB0cnVlOwoKCQkJLy8gRW1wdHkgdGhlIHF1ZXVlIGZpcnN0CgkJCWpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTsKCgkJCWlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHsKCQkJCWhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApOwoJCQl9CgoJCQkvLyBMb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbQoJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgewoJCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7CgkJCQkJdGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApOwoJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CgkJCQl9CgkJCX0KCgkJCS8vIExvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtCgkJCWZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJCQlpZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHsKCQkJCQlxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApOwoJCQkJfQoJCQl9CgoJCQkvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZwoJCQlkZWxldGUgZGF0YS5maW5pc2g7CgkJfSApOwoJfQp9ICk7CgpqUXVlcnkuZWFjaCggWyAidG9nZ2xlIiwgInNob3ciLCAiaGlkZSIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Cgl2YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gImJvb2xlYW4iID8KCQkJY3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDoKCQkJdGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSApOwoKLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9ucwpqUXVlcnkuZWFjaCggewoJc2xpZGVEb3duOiBnZW5GeCggInNob3ciICksCglzbGlkZVVwOiBnZW5GeCggImhpZGUiICksCglzbGlkZVRvZ2dsZTogZ2VuRngoICJ0b2dnbGUiICksCglmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCglmYWRlT3V0OiB7IG9wYWNpdHk6ICJoaWRlIiB9LAoJZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiAidG9nZ2xlIiB9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSApOwoKalF1ZXJ5LnRpbWVycyA9IFtdOwpqUXVlcnkuZngudGljayA9IGZ1bmN0aW9uKCkgewoJdmFyIHRpbWVyLAoJCWkgPSAwLAoJCXRpbWVycyA9IGpRdWVyeS50aW1lcnM7CgoJZnhOb3cgPSBEYXRlLm5vdygpOwoKCWZvciAoIDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHsKCQl0aW1lciA9IHRpbWVyc1sgaSBdOwoKCQkvLyBSdW4gdGhlIHRpbWVyIGFuZCBzYWZlbHkgcmVtb3ZlIGl0IHdoZW4gZG9uZSAoYWxsb3dpbmcgZm9yIGV4dGVybmFsIHJlbW92YWwpCgkJaWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7CgkJCXRpbWVycy5zcGxpY2UoIGktLSwgMSApOwoJCX0KCX0KCglpZiAoICF0aW1lcnMubGVuZ3RoICkgewoJCWpRdWVyeS5meC5zdG9wKCk7Cgl9CglmeE5vdyA9IHVuZGVmaW5lZDsKfTsKCmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHsKCWpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKTsKCWpRdWVyeS5meC5zdGFydCgpOwp9OwoKalF1ZXJ5LmZ4LmludGVydmFsID0gMTM7CmpRdWVyeS5meC5zdGFydCA9IGZ1bmN0aW9uKCkgewoJaWYgKCBpblByb2dyZXNzICkgewoJCXJldHVybjsKCX0KCglpblByb2dyZXNzID0gdHJ1ZTsKCXNjaGVkdWxlKCk7Cn07CgpqUXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkgewoJaW5Qcm9ncmVzcyA9IG51bGw7Cn07CgpqUXVlcnkuZnguc3BlZWRzID0gewoJc2xvdzogNjAwLAoJZmFzdDogMjAwLAoKCS8vIERlZmF1bHQgc3BlZWQKCV9kZWZhdWx0OiA0MDAKfTsKCgovLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uCi8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEwMDMyNDAxNDc0Ny9odHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvCmpRdWVyeS5mbi5kZWxheSA9IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkgewoJdGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTsKCXR5cGUgPSB0eXBlIHx8ICJmeCI7CgoJcmV0dXJuIHRoaXMucXVldWUoIHR5cGUsIGZ1bmN0aW9uKCBuZXh0LCBob29rcyApIHsKCQl2YXIgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7CgkJaG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkgewoJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7CgkJfTsKCX0gKTsKfTsKCgooIGZ1bmN0aW9uKCkgewoJdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApLAoJCXNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzZWxlY3QiICksCgkJb3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAib3B0aW9uIiApICk7CgoJaW5wdXQudHlwZSA9ICJjaGVja2JveCI7CgoJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMyBvbmx5CgkvLyBEZWZhdWx0IHZhbHVlIGZvciBhIGNoZWNrYm94IHNob3VsZCBiZSAib24iCglzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAhPT0gIiI7CgoJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkvLyBNdXN0IGFjY2VzcyBzZWxlY3RlZEluZGV4IHRvIG1ha2UgZGVmYXVsdCBvcHRpb25zIHNlbGVjdAoJc3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDsKCgkvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHkKCS8vIEFuIGlucHV0IGxvc2VzIGl0cyB2YWx1ZSBhZnRlciBiZWNvbWluZyBhIHJhZGlvCglpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJpbnB1dCIgKTsKCWlucHV0LnZhbHVlID0gInQiOwoJaW5wdXQudHlwZSA9ICJyYWRpbyI7CglzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gInQiOwp9ICkoKTsKCgp2YXIgYm9vbEhvb2ssCglhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCWF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Cgl9LAoKCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApOwoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmV4dGVuZCggewoJYXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCXZhciByZXQsIGhvb2tzLAoJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgoJCS8vIERvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKCQlpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZAoJCWlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSAidW5kZWZpbmVkIiApIHsKCQkJcmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApOwoJCX0KCgkJLy8gQXR0cmlidXRlIGhvb2tzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBsb3dlcmNhc2UgdmVyc2lvbgoJCS8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWQKCQlpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKCQkJaG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fAoJCQkJKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSA/IGJvb2xIb29rIDogdW5kZWZpbmVkICk7CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmICggdmFsdWUgPT09IG51bGwgKSB7CgkJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCQkJcmV0dXJuOwoJCQl9CgoJCQlpZiAoIGhvb2tzICYmICJzZXQiIGluIGhvb2tzICYmCgkJCQkoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gcmV0OwoJCQl9CgoJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyAiIiApOwoJCQlyZXR1cm4gdmFsdWU7CgkJfQoKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTsKCgkJLy8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWQKCQlyZXR1cm4gcmV0ID09IG51bGwgPyB1bmRlZmluZWQgOiByZXQ7Cgl9LAoKCWF0dHJIb29rczogewoJCXR5cGU6IHsKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQlpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09ICJyYWRpbyIgJiYKCQkJCQlub2RlTmFtZSggZWxlbSwgImlucHV0IiApICkgewoJCQkJCXZhciB2YWwgPSBlbGVtLnZhbHVlOwoJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAidHlwZSIsIHZhbHVlICk7CgkJCQkJaWYgKCB2YWwgKSB7CgkJCQkJCWVsZW0udmFsdWUgPSB2YWw7CgkJCQkJfQoJCQkJCXJldHVybiB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0sCgoJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewoJCXZhciBuYW1lLAoJCQlpID0gMCwKCgkJCS8vIEF0dHJpYnV0ZSBuYW1lcyBjYW4gY29udGFpbiBub24tSFRNTCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMKCQkJLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjYXR0cmlidXRlcy0yCgkJCWF0dHJOYW1lcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICk7CgoJCWlmICggYXR0ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCXdoaWxlICggKCBuYW1lID0gYXR0ck5hbWVzWyBpKysgXSApICkgewoJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTsKCQkJfQoJCX0KCX0KfSApOwoKLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlcwpib29sSG9vayA9IHsKCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewoJCWlmICggdmFsdWUgPT09IGZhbHNlICkgewoKCQkJLy8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZQoJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCX0gZWxzZSB7CgkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lICk7CgkJfQoJCXJldHVybiBuYW1lOwoJfQp9OwoKalF1ZXJ5LmVhY2goIGpRdWVyeS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXHcrL2cgKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Cgl2YXIgZ2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7CgoJYXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewoJCXZhciByZXQsIGhhbmRsZSwKCQkJbG93ZXJjYXNlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKCgkJaWYgKCAhaXNYTUwgKSB7CgoJCQkvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJlbW92aW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyCgkJCWhhbmRsZSA9IGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXTsKCQkJYXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gcmV0OwoJCQlyZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVsbCA/CgkJCQlsb3dlcmNhc2VOYW1lIDoKCQkJCW51bGw7CgkJCWF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IGhhbmRsZTsKCQl9CgkJcmV0dXJuIHJldDsKCX07Cn0gKTsKCgoKCnZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKCXJjbGlja2FibGUgPSAvXig/OmF8YXJlYSkkL2k7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7Cglwcm9wOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOwoJfSwKCglyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJZGVsZXRlIHRoaXNbIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSBdOwoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmV4dGVuZCggewoJcHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCXZhciByZXQsIGhvb2tzLAoJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgoJCS8vIERvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKCQlpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKCgkJCS8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3MKCQkJbmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKCQkJaG9va3MgPSBqUXVlcnkucHJvcEhvb2tzWyBuYW1lIF07CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmICggaG9va3MgJiYgInNldCIgaW4gaG9va3MgJiYKCQkJCSggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHsKCQkJCXJldHVybiByZXQ7CgkJCX0KCgkJCXJldHVybiAoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7CgkJfQoKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXJldHVybiBlbGVtWyBuYW1lIF07Cgl9LAoKCXByb3BIb29rczogewoJCXRhYkluZGV4OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkJLy8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seQoJCQkJLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlCgkJCQkvLyBjb3JyZWN0IHZhbHVlIHdoZW4gaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXQKCQkJCS8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE0MTExNjIzMzM0Ny9odHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0LwoJCQkJLy8gVXNlIHByb3BlciBhdHRyaWJ1dGUgcmV0cmlldmFsKCMxMjA3MikKCQkJCXZhciB0YWJpbmRleCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ0YWJpbmRleCIgKTsKCgkJCQlpZiAoIHRhYmluZGV4ICkgewoJCQkJCXJldHVybiBwYXJzZUludCggdGFiaW5kZXgsIDEwICk7CgkJCQl9CgoJCQkJaWYgKAoJCQkJCXJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8CgkJCQkJcmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYKCQkJCQllbGVtLmhyZWYKCQkJCSkgewoJCQkJCXJldHVybiAwOwoJCQkJfQoKCQkJCXJldHVybiAtMTsKCQkJfQoJCX0KCX0sCgoJcHJvcEZpeDogewoJCSJmb3IiOiAiaHRtbEZvciIsCgkJImNsYXNzIjogImNsYXNzTmFtZSIKCX0KfSApOwoKLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5Ci8vIEFjY2Vzc2luZyB0aGUgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eQovLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkCi8vIG9uIHRoZSBvcHRpb24KLy8gVGhlIGdldHRlciBlbnN1cmVzIGEgZGVmYXVsdCBvcHRpb24gaXMgc2VsZWN0ZWQKLy8gd2hlbiBpbiBhbiBvcHRncm91cAovLyBlc2xpbnQgcnVsZSAibm8tdW51c2VkLWV4cHJlc3Npb25zIiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjb2RlCi8vIHNpbmNlIGl0IGNvbnNpZGVycyBzdWNoIGFjY2Vzc2lvbnMgbm9vcAppZiAoICFzdXBwb3J0Lm9wdFNlbGVjdGVkICkgewoJalF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoKCQkJLyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogIm9mZiIgKi8KCgkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CgkJCWlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJcGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJfQoJCQlyZXR1cm4gbnVsbDsKCQl9LAoJCXNldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkvKiBlc2xpbnQgbm8tdW51c2VkLWV4cHJlc3Npb25zOiAib2ZmIiAqLwoKCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQkJaWYgKCBwYXJlbnQgKSB7CgkJCQlwYXJlbnQuc2VsZWN0ZWRJbmRleDsKCgkJCQlpZiAoIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJCXBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CgkJCQl9CgkJCX0KCQl9Cgl9Owp9CgpqUXVlcnkuZWFjaCggWwoJInRhYkluZGV4IiwKCSJyZWFkT25seSIsCgkibWF4TGVuZ3RoIiwKCSJjZWxsU3BhY2luZyIsCgkiY2VsbFBhZGRpbmciLAoJInJvd1NwYW4iLAoJImNvbFNwYW4iLAoJInVzZU1hcCIsCgkiZnJhbWVCb3JkZXIiLAoJImNvbnRlbnRFZGl0YWJsZSIKXSwgZnVuY3Rpb24oKSB7CglqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzOwp9ICk7CgoKCgoJLy8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UgYWNjb3JkaW5nIHRvIEhUTUwgc3BlYwoJLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS1hc2NpaS13aGl0ZXNwYWNlCglmdW5jdGlvbiBzdHJpcEFuZENvbGxhcHNlKCB2YWx1ZSApIHsKCQl2YXIgdG9rZW5zID0gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTsKCQlyZXR1cm4gdG9rZW5zLmpvaW4oICIgIiApOwoJfQoKCmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkgewoJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlICYmIGVsZW0uZ2V0QXR0cmlidXRlKCAiY2xhc3MiICkgfHwgIiI7Cn0KCmZ1bmN0aW9uIGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApIHsKCWlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHsKCQlyZXR1cm4gdmFsdWU7Cgl9CglpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgKSB7CgkJcmV0dXJuIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107Cgl9CglyZXR1cm4gW107Cn0KCmpRdWVyeS5mbi5leHRlbmQoIHsKCWFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLAoJCQlpID0gMDsKCgkJaWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTsKCQkJfSApOwoJCX0KCgkJY2xhc3NlcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApOwoKCQlpZiAoIGNsYXNzZXMubGVuZ3RoICkgewoJCQl3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7CgkJCQljdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7CgkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggIiAiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArICIgIiApOwoKCQkJCWlmICggY3VyICkgewoJCQkJCWogPSAwOwoJCQkJCXdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7CgkJCQkJCWlmICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPCAwICkgewoJCQkJCQkJY3VyICs9IGNsYXp6ICsgIiAiOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLgoJCQkJCWZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTsKCQkJCQlpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkgewoJCQkJCQllbGVtLnNldEF0dHJpYnV0ZSggImNsYXNzIiwgZmluYWxWYWx1ZSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCXJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLAoJCQlpID0gMDsKCgkJaWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTsKCQkJfSApOwoJCX0KCgkJaWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJcmV0dXJuIHRoaXMuYXR0ciggImNsYXNzIiwgIiIgKTsKCQl9CgoJCWNsYXNzZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTsKCgkJaWYgKCBjbGFzc2VzLmxlbmd0aCApIHsKCQkJd2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkgewoJCQkJY3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApOwoKCQkJCS8vIFRoaXMgZXhwcmVzc2lvbiBpcyBoZXJlIGZvciBiZXR0ZXIgY29tcHJlc3NpYmlsaXR5IChzZWUgYWRkQ2xhc3MpCgkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggIiAiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArICIgIiApOwoKCQkJCWlmICggY3VyICkgewoJCQkJCWogPSAwOwoJCQkJCXdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7CgoJCQkJCQkvLyBSZW1vdmUgKmFsbCogaW5zdGFuY2VzCgkJCQkJCXdoaWxlICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPiAtMSApIHsKCQkJCQkJCWN1ciA9IGN1ci5yZXBsYWNlKCAiICIgKyBjbGF6eiArICIgIiwgIiAiICk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuCgkJCQkJZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApOwoJCQkJCWlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7CgkJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAiY2xhc3MiLCBmaW5hbFZhbHVlICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7CgkJdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWUsCgkJCWlzVmFsaWRWYWx1ZSA9IHR5cGUgPT09ICJzdHJpbmciIHx8IEFycmF5LmlzQXJyYXkoIHZhbHVlICk7CgoJCWlmICggdHlwZW9mIHN0YXRlVmFsID09PSAiYm9vbGVhbiIgJiYgaXNWYWxpZFZhbHVlICkgewoJCQlyZXR1cm4gc3RhdGVWYWwgPyB0aGlzLmFkZENsYXNzKCB2YWx1ZSApIDogdGhpcy5yZW1vdmVDbGFzcyggdmFsdWUgKTsKCQl9CgoJCWlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcygKCQkJCQl2YWx1ZS5jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLAoJCQkJCXN0YXRlVmFsCgkJCQkpOwoJCQl9ICk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJdmFyIGNsYXNzTmFtZSwgaSwgc2VsZiwgY2xhc3NOYW1lczsKCgkJCWlmICggaXNWYWxpZFZhbHVlICkgewoKCQkJCS8vIFRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzCgkJCQlpID0gMDsKCQkJCXNlbGYgPSBqUXVlcnkoIHRoaXMgKTsKCQkJCWNsYXNzTmFtZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTsKCgkJCQl3aGlsZSAoICggY2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSsrIF0gKSApIHsKCgkJCQkJLy8gQ2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0CgkJCQkJaWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHsKCQkJCQkJc2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJc2VsZi5hZGRDbGFzcyggY2xhc3NOYW1lICk7CgkJCQkJfQoJCQkJfQoKCQkJLy8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWUKCQkJfSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSAiYm9vbGVhbiIgKSB7CgkJCQljbGFzc05hbWUgPSBnZXRDbGFzcyggdGhpcyApOwoJCQkJaWYgKCBjbGFzc05hbWUgKSB7CgoJCQkJCS8vIFN0b3JlIGNsYXNzTmFtZSBpZiBzZXQKCQkJCQlkYXRhUHJpdi5zZXQoIHRoaXMsICJfX2NsYXNzTmFtZV9fIiwgY2xhc3NOYW1lICk7CgkJCQl9CgoJCQkJLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgY2xhc3MgbmFtZSBvciBpZiB3ZSdyZSBwYXNzZWQgYGZhbHNlYCwKCQkJCS8vIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdhcyBvbmUsIHRoZSBhYm92ZSBzYXZlZCBpdCkuCgkJCQkvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLAoJCQkJLy8gZmFsbGluZyBiYWNrIHRvIHRoZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgc3RvcmVkLgoJCQkJaWYgKCB0aGlzLnNldEF0dHJpYnV0ZSApIHsKCQkJCQl0aGlzLnNldEF0dHJpYnV0ZSggImNsYXNzIiwKCQkJCQkJY2xhc3NOYW1lIHx8IHZhbHVlID09PSBmYWxzZSA/CgkJCQkJCSIiIDoKCQkJCQkJZGF0YVByaXYuZ2V0KCB0aGlzLCAiX19jbGFzc05hbWVfXyIgKSB8fCAiIgoJCQkJCSk7CgkJCQl9CgkJCX0KCQl9ICk7Cgl9LAoKCWhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdmFyIGNsYXNzTmFtZSwgZWxlbSwKCQkJaSA9IDA7CgoJCWNsYXNzTmFtZSA9ICIgIiArIHNlbGVjdG9yICsgIiAiOwoJCXdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHsKCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmCgkJCQkoICIgIiArIHN0cmlwQW5kQ29sbGFwc2UoIGdldENsYXNzKCBlbGVtICkgKSArICIgIiApLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KfSApOwoKCgoKdmFyIHJyZXR1cm4gPSAvXHIvZzsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXZhciBob29rcywgcmV0LCB2YWx1ZUlzRnVuY3Rpb24sCgkJCWVsZW0gPSB0aGlzWyAwIF07CgoJCWlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCWlmICggZWxlbSApIHsKCQkJCWhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8fAoJCQkJCWpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQkJaWYgKCBob29rcyAmJgoJCQkJCSJnZXQiIGluIGhvb2tzICYmCgkJCQkJKCByZXQgPSBob29rcy5nZXQoIGVsZW0sICJ2YWx1ZSIgKSApICE9PSB1bmRlZmluZWQKCQkJCSkgewoJCQkJCXJldHVybiByZXQ7CgkJCQl9CgoJCQkJcmV0ID0gZWxlbS52YWx1ZTsKCgkJCQkvLyBIYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzCgkJCQlpZiAoIHR5cGVvZiByZXQgPT09ICJzdHJpbmciICkgewoJCQkJCXJldHVybiByZXQucmVwbGFjZSggcnJldHVybiwgIiIgKTsKCQkJCX0KCgkJCQkvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXIKCQkJCXJldHVybiByZXQgPT0gbnVsbCA/ICIiIDogcmV0OwoJCQl9CgoJCQlyZXR1cm47CgkJfQoKCQl2YWx1ZUlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCB2YWx1ZSApOwoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHsKCQkJdmFyIHZhbDsKCgkJCWlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCB2YWx1ZUlzRnVuY3Rpb24gKSB7CgkJCQl2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBqUXVlcnkoIHRoaXMgKS52YWwoKSApOwoJCQl9IGVsc2UgewoJCQkJdmFsID0gdmFsdWU7CgkJCX0KCgkJCS8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzICIiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nCgkJCWlmICggdmFsID09IG51bGwgKSB7CgkJCQl2YWwgPSAiIjsKCgkJCX0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09ICJudW1iZXIiICkgewoJCQkJdmFsICs9ICIiOwoKCQkJfSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7CgkJCQl2YWwgPSBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKyAiIjsKCQkJCX0gKTsKCQkJfQoKCQkJaG9va3MgPSBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQkvLyBJZiBzZXQgcmV0dXJucyB1bmRlZmluZWQsIGZhbGwgYmFjayB0byBub3JtYWwgc2V0dGluZwoJCQlpZiAoICFob29rcyB8fCAhKCAic2V0IiBpbiBob29rcyApIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCAidmFsdWUiICkgPT09IHVuZGVmaW5lZCApIHsKCQkJCXRoaXMudmFsdWUgPSB2YWw7CgkJCX0KCQl9ICk7Cgl9Cn0gKTsKCmpRdWVyeS5leHRlbmQoIHsKCXZhbEhvb2tzOiB7CgkJb3B0aW9uOiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkJdmFyIHZhbCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ2YWx1ZSIgKTsKCQkJCXJldHVybiB2YWwgIT0gbnVsbCA/CgkJCQkJdmFsIDoKCgkJCQkJLy8gU3VwcG9ydDogSUUgPD0xMCAtIDExIG9ubHkKCQkJCQkvLyBvcHRpb24udGV4dCB0aHJvd3MgZXhjZXB0aW9ucyAoIzE0Njg2LCAjMTQ4NTgpCgkJCQkJLy8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UKCQkJCQkvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNzdHJpcC1hbmQtY29sbGFwc2Utd2hpdGVzcGFjZQoJCQkJCXN0cmlwQW5kQ29sbGFwc2UoIGpRdWVyeS50ZXh0KCBlbGVtICkgKTsKCQkJfQoJCX0sCgkJc2VsZWN0OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgdmFsdWUsIG9wdGlvbiwgaSwKCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAoJCQkJCWluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAoJCQkJCW9uZSA9IGVsZW0udHlwZSA9PT0gInNlbGVjdC1vbmUiLAoJCQkJCXZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXSwKCQkJCQltYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aDsKCgkJCQlpZiAoIGluZGV4IDwgMCApIHsKCQkJCQlpID0gbWF4OwoKCQkJCX0gZWxzZSB7CgkJCQkJaSA9IG9uZSA/IGluZGV4IDogMDsKCQkJCX0KCgkJCQkvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCgkJCQlmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHsKCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCS8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5CgkJCQkJLy8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpCgkJCQkJaWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmCgoJCQkJCQkJLy8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cAoJCQkJCQkJIW9wdGlvbi5kaXNhYmxlZCAmJgoJCQkJCQkJKCAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHwKCQkJCQkJCQkhbm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAib3B0Z3JvdXAiICkgKSApIHsKCgkJCQkJCS8vIEdldCB0aGUgc3BlY2lmaWMgdmFsdWUgZm9yIHRoZSBvcHRpb24KCQkJCQkJdmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpOwoKCQkJCQkJLy8gV2UgZG9uJ3QgbmVlZCBhbiBhcnJheSBmb3Igb25lIHNlbGVjdHMKCQkJCQkJaWYgKCBvbmUgKSB7CgkJCQkJCQlyZXR1cm4gdmFsdWU7CgkJCQkJCX0KCgkJCQkJCS8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5CgkJCQkJCXZhbHVlcy5wdXNoKCB2YWx1ZSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdmFsdWVzOwoJCQl9LAoKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQl2YXIgb3B0aW9uU2V0LCBvcHRpb24sCgkJCQkJb3B0aW9ucyA9IGVsZW0ub3B0aW9ucywKCQkJCQl2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLAoJCQkJCWkgPSBvcHRpb25zLmxlbmd0aDsKCgkJCQl3aGlsZSAoIGktLSApIHsKCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCS8qIGVzbGludC1kaXNhYmxlIG5vLWNvbmQtYXNzaWduICovCgoJCQkJCWlmICggb3B0aW9uLnNlbGVjdGVkID0KCQkJCQkJalF1ZXJ5LmluQXJyYXkoIGpRdWVyeS52YWxIb29rcy5vcHRpb24uZ2V0KCBvcHRpb24gKSwgdmFsdWVzICkgPiAtMQoJCQkJCSkgewoJCQkJCQlvcHRpb25TZXQgPSB0cnVlOwoJCQkJCX0KCgkJCQkJLyogZXNsaW50LWVuYWJsZSBuby1jb25kLWFzc2lnbiAqLwoJCQkJfQoKCQkJCS8vIEZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0CgkJCQlpZiAoICFvcHRpb25TZXQgKSB7CgkJCQkJZWxlbS5zZWxlY3RlZEluZGV4ID0gLTE7CgkJCQl9CgkJCQlyZXR1cm4gdmFsdWVzOwoJCQl9CgkJfQoJfQp9ICk7CgovLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlcgpqUXVlcnkuZWFjaCggWyAicmFkaW8iLCAiY2hlY2tib3giIF0sIGZ1bmN0aW9uKCkgewoJalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7CgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCWlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHsKCQkJCXJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoIGVsZW0gKS52YWwoKSwgdmFsdWUgKSA+IC0xICk7CgkJCX0KCQl9Cgl9OwoJaWYgKCAhc3VwcG9ydC5jaGVja09uICkgewoJCWpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoICJ2YWx1ZSIgKSA9PT0gbnVsbCA/ICJvbiIgOiBlbGVtLnZhbHVlOwoJCX07Cgl9Cn0gKTsKCgoKCi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb24KCgpzdXBwb3J0LmZvY3VzaW4gPSAib25mb2N1c2luIiBpbiB3aW5kb3c7CgoKdmFyIHJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLAoJc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiggZSApIHsKCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJfTsKCmpRdWVyeS5leHRlbmQoIGpRdWVyeS5ldmVudCwgewoKCXRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkgewoKCQl2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLCBsYXN0RWxlbWVudCwKCQkJZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sCgkJCXR5cGUgPSBoYXNPd24uY2FsbCggZXZlbnQsICJ0eXBlIiApID8gZXZlbnQudHlwZSA6IGV2ZW50LAoJCQluYW1lc3BhY2VzID0gaGFzT3duLmNhbGwoIGV2ZW50LCAibmFtZXNwYWNlIiApID8gZXZlbnQubmFtZXNwYWNlLnNwbGl0KCAiLiIgKSA6IFtdOwoKCQljdXIgPSBsYXN0RWxlbWVudCA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50OwoKCQkvLyBEb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3cKCQlpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggdHlwZS5pbmRleE9mKCAiLiIgKSA+IC0xICkgewoKCQkJLy8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKQoJCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCggIi4iICk7CgkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgkJCW5hbWVzcGFjZXMuc29ydCgpOwoJCX0KCQlvbnR5cGUgPSB0eXBlLmluZGV4T2YoICI6IiApIDwgMCAmJiAib24iICsgdHlwZTsKCgkJLy8gQ2FsbGVyIGNhbiBwYXNzIGluIGEgalF1ZXJ5LkV2ZW50IG9iamVjdCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nCgkJZXZlbnQgPSBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/CgkJCWV2ZW50IDoKCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSwgdHlwZW9mIGV2ZW50ID09PSAib2JqZWN0IiAmJiBldmVudCApOwoKCQkvLyBUcmlnZ2VyIGJpdG1hc2s6ICYgMSBmb3IgbmF0aXZlIGhhbmRsZXJzOyAmIDIgZm9yIGpRdWVyeSAoYWx3YXlzIHRydWUpCgkJZXZlbnQuaXNUcmlnZ2VyID0gb25seUhhbmRsZXJzID8gMiA6IDM7CgkJZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCAiLiIgKTsKCQlldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID8KCQkJbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCAiXFwuKD86LipcXC58KSIgKSArICIoXFwufCQpIiApIDoKCQkJbnVsbDsKCgkJLy8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkCgkJZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkOwoJCWlmICggIWV2ZW50LnRhcmdldCApIHsKCQkJZXZlbnQudGFyZ2V0ID0gZWxlbTsKCQl9CgoJCS8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3QKCQlkYXRhID0gZGF0YSA9PSBudWxsID8KCQkJWyBldmVudCBdIDoKCQkJalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7CgoJCS8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXMKCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpCgkJLy8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNCkKCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7CgoJCQlidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTsKCQkJaWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHsKCQkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwoJCQl9CgkJCWZvciAoIDsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHsKCQkJCWV2ZW50UGF0aC5wdXNoKCBjdXIgKTsKCQkJCXRtcCA9IGN1cjsKCQkJfQoKCQkJLy8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5nLiwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pCgkJCWlmICggdG1wID09PSAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApICkgewoJCQkJZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApOwoJCQl9CgkJfQoKCQkvLyBGaXJlIGhhbmRsZXJzIG9uIHRoZSBldmVudCBwYXRoCgkJaSA9IDA7CgkJd2hpbGUgKCAoIGN1ciA9IGV2ZW50UGF0aFsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJbGFzdEVsZW1lbnQgPSBjdXI7CgkJCWV2ZW50LnR5cGUgPSBpID4gMSA/CgkJCQlidWJibGVUeXBlIDoKCQkJCXNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTsKCgkJCS8vIGpRdWVyeSBoYW5kbGVyCgkJCWhhbmRsZSA9ICggZGF0YVByaXYuZ2V0KCBjdXIsICJldmVudHMiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmCgkJCQlkYXRhUHJpdi5nZXQoIGN1ciwgImhhbmRsZSIgKTsKCQkJaWYgKCBoYW5kbGUgKSB7CgkJCQloYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApOwoJCQl9CgoJCQkvLyBOYXRpdmUgaGFuZGxlcgoJCQloYW5kbGUgPSBvbnR5cGUgJiYgY3VyWyBvbnR5cGUgXTsKCQkJaWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkgewoJCQkJZXZlbnQucmVzdWx0ID0gaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKCQkJCWlmICggZXZlbnQucmVzdWx0ID09PSBmYWxzZSApIHsKCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJfQoJCQl9CgkJfQoJCWV2ZW50LnR5cGUgPSB0eXBlOwoKCQkvLyBJZiBub2JvZHkgcHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwgZG8gaXQgbm93CgkJaWYgKCAhb25seUhhbmRsZXJzICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKCgkJCWlmICggKCAhc3BlY2lhbC5fZGVmYXVsdCB8fAoJCQkJc3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiYKCQkJCWFjY2VwdERhdGEoIGVsZW0gKSApIHsKCgkJCQkvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGV2ZW50LgoJCQkJLy8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKCM2MTcwKQoJCQkJaWYgKCBvbnR5cGUgJiYgaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7CgoJCQkJCS8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2QKCQkJCQl0bXAgPSBlbGVtWyBvbnR5cGUgXTsKCgkJCQkJaWYgKCB0bXAgKSB7CgkJCQkJCWVsZW1bIG9udHlwZSBdID0gbnVsbDsKCQkJCQl9CgoJCQkJCS8vIFByZXZlbnQgcmUtdHJpZ2dlcmluZyBvZiB0aGUgc2FtZSBldmVudCwgc2luY2Ugd2UgYWxyZWFkeSBidWJibGVkIGl0IGFib3ZlCgkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHR5cGU7CgoJCQkJCWlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJCQkJbGFzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTsKCQkJCQl9CgoJCQkJCWVsZW1bIHR5cGUgXSgpOwoKCQkJCQlpZiAoIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCQkJCWxhc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7CgkJCQkJfQoKCQkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdW5kZWZpbmVkOwoKCQkJCQlpZiAoIHRtcCApIHsKCQkJCQkJZWxlbVsgb250eXBlIF0gPSB0bXA7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgkvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUKCS8vIFVzZWQgb25seSBmb3IgYGZvY3VzKGluIHwgb3V0KWAgZXZlbnRzCglzaW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0sIGV2ZW50ICkgewoJCXZhciBlID0galF1ZXJ5LmV4dGVuZCgKCQkJbmV3IGpRdWVyeS5FdmVudCgpLAoJCQlldmVudCwKCQkJewoJCQkJdHlwZTogdHlwZSwKCQkJCWlzU2ltdWxhdGVkOiB0cnVlCgkJCX0KCQkpOwoKCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApOwoJfQoKfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoKCXRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApOwoJCX0gKTsKCX0sCgl0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7CgkJdmFyIGVsZW0gPSB0aGlzWyAwIF07CgkJaWYgKCBlbGVtICkgewoJCQlyZXR1cm4galF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIGVsZW0sIHRydWUgKTsKCQl9Cgl9Cn0gKTsKCgovLyBTdXBwb3J0OiBGaXJlZm94IDw9NDQKLy8gRmlyZWZveCBkb2Vzbid0IGhhdmUgZm9jdXMoaW4gfCBvdXQpIGV2ZW50cwovLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4NwovLwovLyBTdXBwb3J0OiBDaHJvbWUgPD00OCAtIDQ5LCBTYWZhcmkgPD05LjAgLSA5LjEKLy8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsCi8vIHdoaWNoIGlzIHNwZWMgdmlvbGF0aW9uIC0gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtZm9jdXNldmVudC1ldmVudC1vcmRlcgovLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0OTg1NwppZiAoICFzdXBwb3J0LmZvY3VzaW4gKSB7CglqUXVlcnkuZWFjaCggeyBmb2N1czogImZvY3VzaW4iLCBibHVyOiAiZm9jdXNvdXQiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CgoJCS8vIEF0dGFjaCBhIHNpbmdsZSBjYXB0dXJpbmcgaGFuZGxlciBvbiB0aGUgZG9jdW1lbnQgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0CgkJdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCWpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICkgKTsKCQl9OwoKCQlqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7CgkJCXNldHVwOiBmdW5jdGlvbigpIHsKCQkJCXZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKCQkJCQlhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTsKCgkJCQlpZiAoICFhdHRhY2hlcyApIHsKCQkJCQlkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwoJCQkJfQoJCQkJZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCwgKCBhdHRhY2hlcyB8fCAwICkgKyAxICk7CgkJCX0sCgkJCXRlYXJkb3duOiBmdW5jdGlvbigpIHsKCQkJCXZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKCQkJCQlhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKSAtIDE7CgoJCQkJaWYgKCAhYXR0YWNoZXMgKSB7CgkJCQkJZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsKCQkJCQlkYXRhUHJpdi5yZW1vdmUoIGRvYywgZml4ICk7CgoJCQkJfSBlbHNlIHsKCQkJCQlkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCBhdHRhY2hlcyApOwoJCQkJfQoJCQl9CgkJfTsKCX0gKTsKfQp2YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247Cgp2YXIgbm9uY2UgPSBEYXRlLm5vdygpOwoKdmFyIHJxdWVyeSA9ICggL1w/LyApOwoKCgovLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nCmpRdWVyeS5wYXJzZVhNTCA9IGZ1bmN0aW9uKCBkYXRhICkgewoJdmFyIHhtbDsKCWlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICJzdHJpbmciICkgewoJCXJldHVybiBudWxsOwoJfQoKCS8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5CgkvLyBJRSB0aHJvd3Mgb24gcGFyc2VGcm9tU3RyaW5nIHdpdGggaW52YWxpZCBpbnB1dC4KCXRyeSB7CgkJeG1sID0gKCBuZXcgd2luZG93LkRPTVBhcnNlcigpICkucGFyc2VGcm9tU3RyaW5nKCBkYXRhLCAidGV4dC94bWwiICk7Cgl9IGNhdGNoICggZSApIHsKCQl4bWwgPSB1bmRlZmluZWQ7Cgl9CgoJaWYgKCAheG1sIHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggInBhcnNlcmVycm9yIiApLmxlbmd0aCApIHsKCQlqUXVlcnkuZXJyb3IoICJJbnZhbGlkIFhNTDogIiArIGRhdGEgKTsKCX0KCXJldHVybiB4bWw7Cn07CgoKdmFyCglyYnJhY2tldCA9IC9cW1xdJC8sCglyQ1JMRiA9IC9ccj9cbi9nLAoJcnN1Ym1pdHRlclR5cGVzID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLAoJcnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pOwoKZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkgewoJdmFyIG5hbWU7CgoJaWYgKCBBcnJheS5pc0FycmF5KCBvYmogKSApIHsKCgkJLy8gU2VyaWFsaXplIGFycmF5IGl0ZW0uCgkJalF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7CgkJCWlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7CgoJCQkJLy8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLgoJCQkJYWRkKCBwcmVmaXgsIHYgKTsKCgkJCX0gZWxzZSB7CgoJCQkJLy8gSXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51bWVyaWMgaW5kZXguCgkJCQlidWlsZFBhcmFtcygKCQkJCQlwcmVmaXggKyAiWyIgKyAoIHR5cGVvZiB2ID09PSAib2JqZWN0IiAmJiB2ICE9IG51bGwgPyBpIDogIiIgKSArICJdIiwKCQkJCQl2LAoJCQkJCXRyYWRpdGlvbmFsLAoJCQkJCWFkZAoJCQkJKTsKCQkJfQoJCX0gKTsKCgl9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgdG9UeXBlKCBvYmogKSA9PT0gIm9iamVjdCIgKSB7CgoJCS8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4KCQlmb3IgKCBuYW1lIGluIG9iaiApIHsKCQkJYnVpbGRQYXJhbXMoIHByZWZpeCArICJbIiArIG5hbWUgKyAiXSIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJfQoKCX0gZWxzZSB7CgoJCS8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KCQlhZGQoIHByZWZpeCwgb2JqICk7Cgl9Cn0KCi8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mCi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZwpqUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7Cgl2YXIgcHJlZml4LAoJCXMgPSBbXSwKCQlhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7CgoJCQkvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHVzZSBpdHMgcmV0dXJuIHZhbHVlCgkJCXZhciB2YWx1ZSA9IGlzRnVuY3Rpb24oIHZhbHVlT3JGdW5jdGlvbiApID8KCQkJCXZhbHVlT3JGdW5jdGlvbigpIDoKCQkJCXZhbHVlT3JGdW5jdGlvbjsKCgkJCXNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgIj0iICsKCQkJCWVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKTsKCQl9OwoKCS8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuCglpZiAoIEFycmF5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7CgoJCS8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50cwoJCWpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHsKCQkJYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKCQl9ICk7CgoJfSBlbHNlIHsKCgkJLy8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgIm9sZCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyCgkJLy8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuCgkJZm9yICggcHJlZml4IGluIGEgKSB7CgkJCWJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJfQoJfQoKCS8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KCXJldHVybiBzLmpvaW4oICImIiApOwp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJc2VyaWFsaXplOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5LnBhcmFtKCB0aGlzLnNlcmlhbGl6ZUFycmF5KCkgKTsKCX0sCglzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHsKCgkJCS8vIENhbiBhZGQgcHJvcEhvb2sgZm9yICJlbGVtZW50cyIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzCgkJCXZhciBlbGVtZW50cyA9IGpRdWVyeS5wcm9wKCB0aGlzLCAiZWxlbWVudHMiICk7CgkJCXJldHVybiBlbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkoIGVsZW1lbnRzICkgOiB0aGlzOwoJCX0gKQoJCS5maWx0ZXIoIGZ1bmN0aW9uKCkgewoJCQl2YXIgdHlwZSA9IHRoaXMudHlwZTsKCgkJCS8vIFVzZSAuaXMoICI6ZGlzYWJsZWQiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3MKCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoICI6ZGlzYWJsZWQiICkgJiYKCQkJCXJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiYKCQkJCSggdGhpcy5jaGVja2VkIHx8ICFyY2hlY2thYmxlVHlwZS50ZXN0KCB0eXBlICkgKTsKCQl9ICkKCQkubWFwKCBmdW5jdGlvbiggaSwgZWxlbSApIHsKCQkJdmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpOwoKCQkJaWYgKCB2YWwgPT0gbnVsbCApIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgoJCQlpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkgewoJCQkJcmV0dXJuIGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApIHsKCQkJCQlyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsICJcclxuIiApIH07CgkJCQl9ICk7CgkJCX0KCgkJCXJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKCQl9ICkuZ2V0KCk7Cgl9Cn0gKTsKCgp2YXIKCXIyMCA9IC8lMjAvZywKCXJoYXNoID0gLyMuKiQvLAoJcmFudGlDYWNoZSA9IC8oWz8mXSlfPVteJl0qLywKCXJoZWFkZXJzID0gL14oLio/KTpbIFx0XSooW15cclxuXSopJC9tZywKCgkvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb24KCXJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sCglybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLywKCXJwcm90b2NvbCA9IC9eXC9cLy8sCgoJLyogUHJlZmlsdGVycwoJICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSkKCSAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6CgkgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0CgkgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCgkgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCgkgKi8KCXByZWZpbHRlcnMgPSB7fSwKCgkvKiBUcmFuc3BvcnRzIGJpbmRpbmdzCgkgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gIioiIGlmIG5lZWRlZAoJICovCgl0cmFuc3BvcnRzID0ge30sCgoJLy8gQXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAoIzEwMDk4KTsgbXVzdCBhcHBlYXNlIGxpbnQgYW5kIGV2YWRlIGNvbXByZXNzaW9uCglhbGxUeXBlcyA9ICIqLyIuY29uY2F0KCAiKiIgKSwKCgkvLyBBbmNob3IgdGFnIGZvciBwYXJzaW5nIHRoZSBkb2N1bWVudCBvcmlnaW4KCW9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOwoJb3JpZ2luQW5jaG9yLmhyZWYgPSBsb2NhdGlvbi5ocmVmOwoKLy8gQmFzZSAiY29uc3RydWN0b3IiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnQKZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7CgoJLy8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byAiKiIKCXJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgewoKCQlpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09ICJzdHJpbmciICkgewoJCQlmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uOwoJCQlkYXRhVHlwZUV4cHJlc3Npb24gPSAiKiI7CgkJfQoKCQl2YXIgZGF0YVR5cGUsCgkJCWkgPSAwLAoJCQlkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdOwoKCQlpZiAoIGlzRnVuY3Rpb24oIGZ1bmMgKSApIHsKCgkJCS8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb24KCQkJd2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkgewoKCQkJCS8vIFByZXBlbmQgaWYgcmVxdWVzdGVkCgkJCQlpZiAoIGRhdGFUeXBlWyAwIF0gPT09ICIrIiApIHsKCQkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlLnNsaWNlKCAxICkgfHwgIioiOwoJCQkJCSggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApOwoKCQkJCS8vIE90aGVyd2lzZSBhcHBlbmQKCQkJCX0gZWxzZSB7CgkJCQkJKCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10gKS5wdXNoKCBmdW5jICk7CgkJCQl9CgkJCX0KCQl9Cgl9Owp9CgovLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHsKCgl2YXIgaW5zcGVjdGVkID0ge30sCgkJc2Vla2luZ1RyYW5zcG9ydCA9ICggc3RydWN0dXJlID09PSB0cmFuc3BvcnRzICk7CgoJZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7CgkJdmFyIHNlbGVjdGVkOwoJCWluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7CgkJalF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHsKCQkJdmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTsKCQkJaWYgKCB0eXBlb2YgZGF0YVR5cGVPclRyYW5zcG9ydCA9PT0gInN0cmluZyIgJiYKCQkJCSFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHsKCgkJCQlvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCQlpbnNwZWN0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0gZWxzZSBpZiAoIHNlZWtpbmdUcmFuc3BvcnQgKSB7CgkJCQlyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCX0KCQl9ICk7CgkJcmV0dXJuIHNlbGVjdGVkOwoJfQoKCXJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgIioiIF0gJiYgaW5zcGVjdCggIioiICk7Cn0KCi8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXggb3B0aW9ucwovLyB0aGF0IHRha2VzICJmbGF0IiBvcHRpb25zIChub3QgdG8gYmUgZGVlcCBleHRlbmRlZCkKLy8gRml4ZXMgIzk4ODcKZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7Cgl2YXIga2V5LCBkZWVwLAoJCWZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTsKCglmb3IgKCBrZXkgaW4gc3JjICkgewoJCWlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgewoJCQkoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtleSBdOwoJCX0KCX0KCWlmICggZGVlcCApIHsKCQlqUXVlcnkuZXh0ZW5kKCB0cnVlLCB0YXJnZXQsIGRlZXAgKTsKCX0KCglyZXR1cm4gdGFyZ2V0Owp9CgovKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6CiAqIC0gZmluZHMgdGhlIHJpZ2h0IGRhdGFUeXBlIChtZWRpYXRlcyBiZXR3ZWVuIGNvbnRlbnQtdHlwZSBhbmQgZXhwZWN0ZWQgZGF0YVR5cGUpCiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZQogKi8KZnVuY3Rpb24gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIHsKCgl2YXIgY3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsCgkJY29udGVudHMgPSBzLmNvbnRlbnRzLAoJCWRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzOwoKCS8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGluIHRoZSBwcm9jZXNzCgl3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSAiKiIgKSB7CgkJZGF0YVR5cGVzLnNoaWZ0KCk7CgkJaWYgKCBjdCA9PT0gdW5kZWZpbmVkICkgewoJCQljdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJDb250ZW50LVR5cGUiICk7CgkJfQoJfQoKCS8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZQoJaWYgKCBjdCApIHsKCQlmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkgewoJCQlpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkgewoJCQkJZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZQoJaWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7CgkJZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdOwoJfSBlbHNlIHsKCgkJLy8gVHJ5IGNvbnZlcnRpYmxlIGRhdGFUeXBlcwoJCWZvciAoIHR5cGUgaW4gcmVzcG9uc2VzICkgewoJCQlpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyAiICIgKyBkYXRhVHlwZXNbIDAgXSBdICkgewoJCQkJZmluYWxEYXRhVHlwZSA9IHR5cGU7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoICFmaXJzdERhdGFUeXBlICkgewoJCQkJZmlyc3REYXRhVHlwZSA9IHR5cGU7CgkJCX0KCQl9CgoJCS8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZQoJCWZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7Cgl9CgoJLy8gSWYgd2UgZm91bmQgYSBkYXRhVHlwZQoJLy8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWQKCS8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKCWlmICggZmluYWxEYXRhVHlwZSApIHsKCQlpZiAoIGZpbmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkgewoJCQlkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApOwoJCX0KCQlyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07Cgl9Cn0KCi8qIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2UKICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlCiAqLwpmdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKSB7Cgl2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldiwKCQljb252ZXJ0ZXJzID0ge30sCgoJCS8vIFdvcmsgd2l0aCBhIGNvcHkgb2YgZGF0YVR5cGVzIGluIGNhc2Ugd2UgbmVlZCB0byBtb2RpZnkgaXQgZm9yIGNvbnZlcnNpb24KCQlkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcy5zbGljZSgpOwoKCS8vIENyZWF0ZSBjb252ZXJ0ZXJzIG1hcCB3aXRoIGxvd2VyY2FzZWQga2V5cwoJaWYgKCBkYXRhVHlwZXNbIDEgXSApIHsKCQlmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHsKCQkJY29udmVydGVyc1sgY29udi50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGNvbnYgXTsKCQl9Cgl9CgoJY3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpOwoKCS8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlCgl3aGlsZSAoIGN1cnJlbnQgKSB7CgoJCWlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkgewoJCQlqcVhIUlsgcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdIF0gPSByZXNwb25zZTsKCQl9CgoJCS8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkCgkJaWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkgewoJCQlyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTsKCQl9CgoJCXByZXYgPSBjdXJyZW50OwoJCWN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTsKCgkJaWYgKCBjdXJyZW50ICkgewoKCQkJLy8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0bwoJCQlpZiAoIGN1cnJlbnQgPT09ICIqIiApIHsKCgkJCQljdXJyZW50ID0gcHJldjsKCgkJCS8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1cnJlbnQKCQkJfSBlbHNlIGlmICggcHJldiAhPT0gIioiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7CgoJCQkJLy8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXIKCQkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgIiAiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbICIqICIgKyBjdXJyZW50IF07CgoJCQkJLy8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXIKCQkJCWlmICggIWNvbnYgKSB7CgkJCQkJZm9yICggY29udjIgaW4gY29udmVydGVycyApIHsKCgkJCQkJCS8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudAoJCQkJCQl0bXAgPSBjb252Mi5zcGxpdCggIiAiICk7CgkJCQkJCWlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7CgoJCQkJCQkJLy8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0CgkJCQkJCQljb252ID0gY29udmVydGVyc1sgcHJldiArICIgIiArIHRtcFsgMCBdIF0gfHwKCQkJCQkJCQljb252ZXJ0ZXJzWyAiKiAiICsgdG1wWyAwIF0gXTsKCQkJCQkJCWlmICggY29udiApIHsKCgkJCQkJCQkJLy8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVycwoJCQkJCQkJCWlmICggY29udiA9PT0gdHJ1ZSApIHsKCQkJCQkJCQkJY29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07CgoJCQkJCQkJCS8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGUKCQkJCQkJCQl9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkgewoJCQkJCQkJCQljdXJyZW50ID0gdG1wWyAwIF07CgkJCQkJCQkJCWRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApOwoJCQkJCQkJCX0KCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQkvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSkKCQkJCWlmICggY29udiAhPT0gdHJ1ZSApIHsKCgkJCQkJLy8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbQoJCQkJCWlmICggY29udiAmJiBzLnRocm93cyApIHsKCQkJCQkJcmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXRyeSB7CgkJCQkJCQlyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7CgkJCQkJCX0gY2F0Y2ggKCBlICkgewoJCQkJCQkJcmV0dXJuIHsKCQkJCQkJCQlzdGF0ZTogInBhcnNlcmVycm9yIiwKCQkJCQkJCQllcnJvcjogY29udiA/IGUgOiAiTm8gY29udmVyc2lvbiBmcm9tICIgKyBwcmV2ICsgIiB0byAiICsgY3VycmVudAoJCQkJCQkJfTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4geyBzdGF0ZTogInN1Y2Nlc3MiLCBkYXRhOiByZXNwb25zZSB9Owp9CgpqUXVlcnkuZXh0ZW5kKCB7CgoJLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzCglhY3RpdmU6IDAsCgoJLy8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdAoJbGFzdE1vZGlmaWVkOiB7fSwKCWV0YWc6IHt9LAoKCWFqYXhTZXR0aW5nczogewoJCXVybDogbG9jYXRpb24uaHJlZiwKCQl0eXBlOiAiR0VUIiwKCQlpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBsb2NhdGlvbi5wcm90b2NvbCApLAoJCWdsb2JhbDogdHJ1ZSwKCQlwcm9jZXNzRGF0YTogdHJ1ZSwKCQlhc3luYzogdHJ1ZSwKCQljb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsCgoJCS8qCgkJdGltZW91dDogMCwKCQlkYXRhOiBudWxsLAoJCWRhdGFUeXBlOiBudWxsLAoJCXVzZXJuYW1lOiBudWxsLAoJCXBhc3N3b3JkOiBudWxsLAoJCWNhY2hlOiBudWxsLAoJCXRocm93czogZmFsc2UsCgkJdHJhZGl0aW9uYWw6IGZhbHNlLAoJCWhlYWRlcnM6IHt9LAoJCSovCgoJCWFjY2VwdHM6IHsKCQkJIioiOiBhbGxUeXBlcywKCQkJdGV4dDogInRleHQvcGxhaW4iLAoJCQlodG1sOiAidGV4dC9odG1sIiwKCQkJeG1sOiAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsCgkJCWpzb246ICJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiCgkJfSwKCgkJY29udGVudHM6IHsKCQkJeG1sOiAvXGJ4bWxcYi8sCgkJCWh0bWw6IC9cYmh0bWwvLAoJCQlqc29uOiAvXGJqc29uXGIvCgkJfSwKCgkJcmVzcG9uc2VGaWVsZHM6IHsKCQkJeG1sOiAicmVzcG9uc2VYTUwiLAoJCQl0ZXh0OiAicmVzcG9uc2VUZXh0IiwKCQkJanNvbjogInJlc3BvbnNlSlNPTiIKCQl9LAoKCQkvLyBEYXRhIGNvbnZlcnRlcnMKCQkvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgIioiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZQoJCWNvbnZlcnRlcnM6IHsKCgkJCS8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dAoJCQkiKiB0ZXh0IjogU3RyaW5nLAoKCQkJLy8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pCgkJCSJ0ZXh0IGh0bWwiOiB0cnVlLAoKCQkJLy8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvbgoJCQkidGV4dCBqc29uIjogSlNPTi5wYXJzZSwKCgkJCS8vIFBhcnNlIHRleHQgYXMgeG1sCgkJCSJ0ZXh0IHhtbCI6IGpRdWVyeS5wYXJzZVhNTAoJCX0sCgoJCS8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6CgkJLy8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZgoJCS8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlCgkJLy8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpCgkJZmxhdE9wdGlvbnM6IHsKCQkJdXJsOiB0cnVlLAoJCQljb250ZXh0OiB0cnVlCgkJfQoJfSwKCgkvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldAoJLy8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLgoJLy8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy4KCWFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7CgkJcmV0dXJuIHNldHRpbmdzID8KCgkJCS8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0CgkJCWFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDoKCgkJCS8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3MKCQkJYWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7Cgl9LAoKCWFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLAoJYWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksCgoJLy8gTWFpbiBtZXRob2QKCWFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7CgoJCS8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlCgkJaWYgKCB0eXBlb2YgdXJsID09PSAib2JqZWN0IiApIHsKCQkJb3B0aW9ucyA9IHVybDsKCQkJdXJsID0gdW5kZWZpbmVkOwoJCX0KCgkJLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3QKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCgkJdmFyIHRyYW5zcG9ydCwKCgkJCS8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW0KCQkJY2FjaGVVUkwsCgoJCQkvLyBSZXNwb25zZSBoZWFkZXJzCgkJCXJlc3BvbnNlSGVhZGVyc1N0cmluZywKCQkJcmVzcG9uc2VIZWFkZXJzLAoKCQkJLy8gdGltZW91dCBoYW5kbGUKCQkJdGltZW91dFRpbWVyLAoKCQkJLy8gVXJsIGNsZWFudXAgdmFyCgkJCXVybEFuY2hvciwKCgkJCS8vIFJlcXVlc3Qgc3RhdGUgKGJlY29tZXMgZmFsc2UgdXBvbiBzZW5kIGFuZCB0cnVlIHVwb24gY29tcGxldGlvbikKCQkJY29tcGxldGVkLAoKCQkJLy8gVG8ga25vdyBpZiBnbG9iYWwgZXZlbnRzIGFyZSB0byBiZSBkaXNwYXRjaGVkCgkJCWZpcmVHbG9iYWxzLAoKCQkJLy8gTG9vcCB2YXJpYWJsZQoJCQlpLAoKCQkJLy8gdW5jYWNoZWQgcGFydCBvZiB0aGUgdXJsCgkJCXVuY2FjaGVkLAoKCQkJLy8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdAoJCQlzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSwKCgkJCS8vIENhbGxiYWNrcyBjb250ZXh0CgkJCWNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLAoKCQkJLy8gQ29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cyBpcyBjYWxsYmFja0NvbnRleHQgaWYgaXQgaXMgYSBET00gbm9kZSBvciBqUXVlcnkgY29sbGVjdGlvbgoJCQlnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiYKCQkJCSggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/CgkJCQkJalF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6CgkJCQkJalF1ZXJ5LmV2ZW50LAoKCQkJLy8gRGVmZXJyZWRzCgkJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksCgoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCQlzdGF0dXNDb2RlID0gcy5zdGF0dXNDb2RlIHx8IHt9LAoKCQkJLy8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSkKCQkJcmVxdWVzdEhlYWRlcnMgPSB7fSwKCQkJcmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LAoKCQkJLy8gRGVmYXVsdCBhYm9ydCBtZXNzYWdlCgkJCXN0ckFib3J0ID0gImNhbmNlbGVkIiwKCgkJCS8vIEZha2UgeGhyCgkJCWpxWEhSID0gewoJCQkJcmVhZHlTdGF0ZTogMCwKCgkJCQkvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkCgkJCQlnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24oIGtleSApIHsKCQkJCQl2YXIgbWF0Y2g7CgkJCQkJaWYgKCBjb21wbGV0ZWQgKSB7CgkJCQkJCWlmICggIXJlc3BvbnNlSGVhZGVycyApIHsKCQkJCQkJCXJlc3BvbnNlSGVhZGVycyA9IHt9OwoJCQkJCQkJd2hpbGUgKCAoIG1hdGNoID0gcmhlYWRlcnMuZXhlYyggcmVzcG9uc2VIZWFkZXJzU3RyaW5nICkgKSApIHsKCQkJCQkJCQlyZXNwb25zZUhlYWRlcnNbIG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQltYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTsKCQkJCQl9CgkJCQkJcmV0dXJuIG1hdGNoID09IG51bGwgPyBudWxsIDogbWF0Y2g7CgkJCQl9LAoKCQkJCS8vIFJhdyBzdHJpbmcKCQkJCWdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIGNvbXBsZXRlZCA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7CgkJCQl9LAoKCQkJCS8vIENhY2hlcyB0aGUgaGVhZGVyCgkJCQlzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJCQkJaWYgKCBjb21wbGV0ZWQgPT0gbnVsbCApIHsKCQkJCQkJbmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdID0KCQkJCQkJCXJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8IG5hbWU7CgkJCQkJCXJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyCgkJCQlvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkgewoJCQkJCQlzLm1pbWVUeXBlID0gdHlwZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCgkJCQlzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkgewoJCQkJCXZhciBjb2RlOwoJCQkJCWlmICggbWFwICkgewoJCQkJCQlpZiAoIGNvbXBsZXRlZCApIHsKCgkJCQkJCQkvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3MKCQkJCQkJCWpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApOwoJCQkJCQl9IGVsc2UgewoKCQkJCQkJCS8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzCgkJCQkJCQlmb3IgKCBjb2RlIGluIG1hcCApIHsKCQkJCQkJCQlzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0sCgoJCQkJLy8gQ2FuY2VsIHRoZSByZXF1ZXN0CgkJCQlhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7CgkJCQkJdmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7CgkJCQkJaWYgKCB0cmFuc3BvcnQgKSB7CgkJCQkJCXRyYW5zcG9ydC5hYm9ydCggZmluYWxUZXh0ICk7CgkJCQkJfQoJCQkJCWRvbmUoIDAsIGZpbmFsVGV4dCApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfQoJCQl9OwoKCQkvLyBBdHRhY2ggZGVmZXJyZWRzCgkJZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKTsKCgkJLy8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpCgkJLy8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSkKCQkvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGUKCQlzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgbG9jYXRpb24uaHJlZiApICsgIiIgKQoJCQkucmVwbGFjZSggcnByb3RvY29sLCBsb2NhdGlvbi5wcm90b2NvbCArICIvLyIgKTsKCgkJLy8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0CgkJcy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTsKCgkJLy8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdAoJCXMuZGF0YVR5cGVzID0gKCBzLmRhdGFUeXBlIHx8ICIqIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgoJCS8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB0aGUgb3JpZ2luIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgb3JpZ2luLgoJCWlmICggcy5jcm9zc0RvbWFpbiA9PSBudWxsICkgewoJCQl1cmxBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiYSIgKTsKCgkJCS8vIFN1cHBvcnQ6IElFIDw9OCAtIDExLCBFZGdlIDEyIC0gMTUKCQkJLy8gSUUgdGhyb3dzIGV4Y2VwdGlvbiBvbiBhY2Nlc3NpbmcgdGhlIGhyZWYgcHJvcGVydHkgaWYgdXJsIGlzIG1hbGZvcm1lZCwKCQkJLy8gZS5nLiBodHRwOi8vZXhhbXBsZS5jb206ODB4LwoJCQl0cnkgewoJCQkJdXJsQW5jaG9yLmhyZWYgPSBzLnVybDsKCgkJCQkvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSBvbmx5CgkJCQkvLyBBbmNob3IncyBob3N0IHByb3BlcnR5IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZQoJCQkJdXJsQW5jaG9yLmhyZWYgPSB1cmxBbmNob3IuaHJlZjsKCQkJCXMuY3Jvc3NEb21haW4gPSBvcmlnaW5BbmNob3IucHJvdG9jb2wgKyAiLy8iICsgb3JpZ2luQW5jaG9yLmhvc3QgIT09CgkJCQkJdXJsQW5jaG9yLnByb3RvY29sICsgIi8vIiArIHVybEFuY2hvci5ob3N0OwoJCQl9IGNhdGNoICggZSApIHsKCgkJCQkvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBpdCBpcyBjcm9zc0RvbWFpbiwKCQkJCS8vIGl0IGNhbiBiZSByZWplY3RlZCBieSB0aGUgdHJhbnNwb3J0IGlmIGl0IGlzIGludmFsaWQKCQkJCXMuY3Jvc3NEb21haW4gPSB0cnVlOwoJCQl9CgkJfQoKCQkvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmcKCQlpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09ICJzdHJpbmciICkgewoJCQlzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApOwoJCX0KCgkJLy8gQXBwbHkgcHJlZmlsdGVycwoJCWluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApOwoKCQkvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZQoJCWlmICggY29tcGxldGVkICkgewoJCQlyZXR1cm4ganFYSFI7CgkJfQoKCQkvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0bwoJCS8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICgjMTUxMTgpCgkJZmlyZUdsb2JhbHMgPSBqUXVlcnkuZXZlbnQgJiYgcy5nbG9iYWw7CgoJCS8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKCQlpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CgkJfQoKCQkvLyBVcHBlcmNhc2UgdGhlIHR5cGUKCQlzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTsKCgkJLy8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnQKCQlzLmhhc0NvbnRlbnQgPSAhcm5vQ29udGVudC50ZXN0KCBzLnR5cGUgKTsKCgkJLy8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlCgkJLy8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uCgkJLy8gUmVtb3ZlIGhhc2ggdG8gc2ltcGxpZnkgdXJsIG1hbmlwdWxhdGlvbgoJCWNhY2hlVVJMID0gcy51cmwucmVwbGFjZSggcmhhc2gsICIiICk7CgoJCS8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50CgkJaWYgKCAhcy5oYXNDb250ZW50ICkgewoKCQkJLy8gUmVtZW1iZXIgdGhlIGhhc2ggc28gd2UgY2FuIHB1dCBpdCBiYWNrCgkJCXVuY2FjaGVkID0gcy51cmwuc2xpY2UoIGNhY2hlVVJMLmxlbmd0aCApOwoKCQkJLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUgYW5kIHNob3VsZCBiZSBwcm9jZXNzZWQsIGFwcGVuZCBkYXRhIHRvIHVybAoJCQlpZiAoIHMuZGF0YSAmJiAoIHMucHJvY2Vzc0RhdGEgfHwgdHlwZW9mIHMuZGF0YSA9PT0gInN0cmluZyIgKSApIHsKCQkJCWNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyAiJiIgOiAiPyIgKSArIHMuZGF0YTsKCgkJCQkvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5CgkJCQlkZWxldGUgcy5kYXRhOwoJCQl9CgoJCQkvLyBBZGQgb3IgdXBkYXRlIGFudGktY2FjaGUgcGFyYW0gaWYgbmVlZGVkCgkJCWlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7CgkJCQljYWNoZVVSTCA9IGNhY2hlVVJMLnJlcGxhY2UoIHJhbnRpQ2FjaGUsICIkMSIgKTsKCQkJCXVuY2FjaGVkID0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/ICImIiA6ICI/IiApICsgIl89IiArICggbm9uY2UrKyApICsgdW5jYWNoZWQ7CgkJCX0KCgkJCS8vIFB1dCBoYXNoIGFuZCBhbnRpLWNhY2hlIG9uIHRoZSBVUkwgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZCAoZ2gtMTczMikKCQkJcy51cmwgPSBjYWNoZVVSTCArIHVuY2FjaGVkOwoKCQkvLyBDaGFuZ2UgJyUyMCcgdG8gJysnIGlmIHRoaXMgaXMgZW5jb2RlZCBmb3JtIGJvZHkgY29udGVudCAoZ2gtMjY1OCkKCQl9IGVsc2UgaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJgoJCQkoIHMuY29udGVudFR5cGUgfHwgIiIgKS5pbmRleE9mKCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiApID09PSAwICkgewoJCQlzLmRhdGEgPSBzLmRhdGEucmVwbGFjZSggcjIwLCAiKyIgKTsKCQl9CgoJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCgkJaWYgKCBzLmlmTW9kaWZpZWQgKSB7CgkJCWlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Nb2RpZmllZC1TaW5jZSIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKTsKCQkJfQoJCQlpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkgewoJCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIklmLU5vbmUtTWF0Y2giLCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKCQlpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHsKCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUgKTsKCQl9CgoJCS8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGUKCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKAoJCQkiQWNjZXB0IiwKCQkJcy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/CgkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSArCgkJCQkJKCBzLmRhdGFUeXBlc1sgMCBdICE9PSAiKiIgPyAiLCAiICsgYWxsVHlwZXMgKyAiOyBxPTAuMDEiIDogIiIgKSA6CgkJCQlzLmFjY2VwdHNbICIqIiBdCgkJKTsKCgkJLy8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uCgkJZm9yICggaSBpbiBzLmhlYWRlcnMgKSB7CgkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIGksIHMuaGVhZGVyc1sgaSBdICk7CgkJfQoKCQkvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0CgkJaWYgKCBzLmJlZm9yZVNlbmQgJiYKCQkJKCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBjb21wbGV0ZWQgKSApIHsKCgkJCS8vIEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkgYW5kIHJldHVybgoJCQlyZXR1cm4ganFYSFIuYWJvcnQoKTsKCQl9CgoJCS8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvbgoJCXN0ckFib3J0ID0gImFib3J0IjsKCgkJLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCgkJY29tcGxldGVEZWZlcnJlZC5hZGQoIHMuY29tcGxldGUgKTsKCQlqcVhIUi5kb25lKCBzLnN1Y2Nlc3MgKTsKCQlqcVhIUi5mYWlsKCBzLmVycm9yICk7CgoJCS8vIEdldCB0cmFuc3BvcnQKCQl0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKCgkJLy8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0CgkJaWYgKCAhdHJhbnNwb3J0ICkgewoJCQlkb25lKCAtMSwgIk5vIFRyYW5zcG9ydCIgKTsKCQl9IGVsc2UgewoJCQlqcVhIUi5yZWFkeVN0YXRlID0gMTsKCgkJCS8vIFNlbmQgZ2xvYmFsIGV2ZW50CgkJCWlmICggZmlyZUdsb2JhbHMgKSB7CgkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhTZW5kIiwgWyBqcVhIUiwgcyBdICk7CgkJCX0KCgkJCS8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGFqYXhTZW5kLCBzdG9wIHRoZXJlCgkJCWlmICggY29tcGxldGVkICkgewoJCQkJcmV0dXJuIGpxWEhSOwoJCQl9CgoJCQkvLyBUaW1lb3V0CgkJCWlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkgewoJCQkJdGltZW91dFRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJCWpxWEhSLmFib3J0KCAidGltZW91dCIgKTsKCQkJCX0sIHMudGltZW91dCApOwoJCQl9CgoJCQl0cnkgewoJCQkJY29tcGxldGVkID0gZmFsc2U7CgkJCQl0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTsKCQkJfSBjYXRjaCAoIGUgKSB7CgoJCQkJLy8gUmV0aHJvdyBwb3N0LWNvbXBsZXRpb24gZXhjZXB0aW9ucwoJCQkJaWYgKCBjb21wbGV0ZWQgKSB7CgkJCQkJdGhyb3cgZTsKCQkJCX0KCgkJCQkvLyBQcm9wYWdhdGUgb3RoZXJzIGFzIHJlc3VsdHMKCQkJCWRvbmUoIC0xLCBlICk7CgkJCX0KCQl9CgoJCS8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZQoJCWZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkgewoJCQl2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLAoJCQkJc3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7CgoJCQkvLyBJZ25vcmUgcmVwZWF0IGludm9jYXRpb25zCgkJCWlmICggY29tcGxldGVkICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQljb21wbGV0ZWQgPSB0cnVlOwoKCQkJLy8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHMKCQkJaWYgKCB0aW1lb3V0VGltZXIgKSB7CgkJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTsKCQkJfQoKCQkJLy8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb24KCQkJLy8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZCkKCQkJdHJhbnNwb3J0ID0gdW5kZWZpbmVkOwoKCQkJLy8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVycwoJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8ICIiOwoKCQkJLy8gU2V0IHJlYWR5U3RhdGUKCQkJanFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDsKCgkJCS8vIERldGVybWluZSBpZiBzdWNjZXNzZnVsCgkJCWlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0OwoKCQkJLy8gR2V0IHJlc3BvbnNlIGRhdGEKCQkJaWYgKCByZXNwb25zZXMgKSB7CgkJCQlyZXNwb25zZSA9IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTsKCQkJfQoKCQkJLy8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9uc2VYWFggZmllbGRzIGFyZSBhbHdheXMgc2V0KQoJCQlyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApOwoKCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmcKCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7CgoJCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KCQkJCWlmICggcy5pZk1vZGlmaWVkICkgewoJCQkJCW1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJMYXN0LU1vZGlmaWVkIiApOwoJCQkJCWlmICggbW9kaWZpZWQgKSB7CgkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKCQkJCQl9CgkJCQkJbW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggImV0YWciICk7CgkJCQkJaWYgKCBtb2RpZmllZCApIHsKCQkJCQkJalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gaWYgbm8gY29udGVudAoJCQkJaWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09ICJIRUFEIiApIHsKCQkJCQlzdGF0dXNUZXh0ID0gIm5vY29udGVudCI7CgoJCQkJLy8gaWYgbm90IG1vZGlmaWVkCgkJCQl9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHsKCQkJCQlzdGF0dXNUZXh0ID0gIm5vdG1vZGlmaWVkIjsKCgkJCQkvLyBJZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXQKCQkJCX0gZWxzZSB7CgkJCQkJc3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXRlOwoJCQkJCXN1Y2Nlc3MgPSByZXNwb25zZS5kYXRhOwoJCQkJCWVycm9yID0gcmVzcG9uc2UuZXJyb3I7CgkJCQkJaXNTdWNjZXNzID0gIWVycm9yOwoJCQkJfQoJCQl9IGVsc2UgewoKCQkJCS8vIEV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0IGFuZCBub3JtYWxpemUgZm9yIG5vbi1hYm9ydHMKCQkJCWVycm9yID0gc3RhdHVzVGV4dDsKCQkJCWlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkgewoJCQkJCXN0YXR1c1RleHQgPSAiZXJyb3IiOwoJCQkJCWlmICggc3RhdHVzIDwgMCApIHsKCQkJCQkJc3RhdHVzID0gMDsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIFNldCBkYXRhIGZvciB0aGUgZmFrZSB4aHIgb2JqZWN0CgkJCWpxWEhSLnN0YXR1cyA9IHN0YXR1czsKCQkJanFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyAiIjsKCgkJCS8vIFN1Y2Nlc3MvRXJyb3IKCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7CgkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhSIF0gKTsKCQkJfSBlbHNlIHsKCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApOwoJCQl9CgoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCQlqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7CgkJCXN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7CgoJCQlpZiAoIGZpcmVHbG9iYWxzICkgewoJCQkJZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/ICJhamF4U3VjY2VzcyIgOiAiYWpheEVycm9yIiwKCQkJCQlbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApOwoJCQl9CgoJCQkvLyBDb21wbGV0ZQoJCQljb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApOwoKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheENvbXBsZXRlIiwgWyBqcVhIUiwgcyBdICk7CgoJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJCQlpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkgewoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBqcVhIUjsKCX0sCgoJZ2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7CgkJcmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssICJqc29uIiApOwoJfSwKCglnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssICJzY3JpcHQiICk7Cgl9Cn0gKTsKCmpRdWVyeS5lYWNoKCBbICJnZXQiLCAicG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHsKCWpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCgkJLy8gU2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWQKCQlpZiAoIGlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9IHVuZGVmaW5lZDsKCQl9CgoJCS8vIFRoZSB1cmwgY2FuIGJlIGFuIG9wdGlvbnMgb2JqZWN0ICh3aGljaCB0aGVuIG11c3QgaGF2ZSAudXJsKQoJCXJldHVybiBqUXVlcnkuYWpheCggalF1ZXJ5LmV4dGVuZCggewoJCQl1cmw6IHVybCwKCQkJdHlwZTogbWV0aG9kLAoJCQlkYXRhVHlwZTogdHlwZSwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2sKCQl9LCBqUXVlcnkuaXNQbGFpbk9iamVjdCggdXJsICkgJiYgdXJsICkgKTsKCX07Cn0gKTsKCgpqUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsICkgewoJcmV0dXJuIGpRdWVyeS5hamF4KCB7CgkJdXJsOiB1cmwsCgoJCS8vIE1ha2UgdGhpcyBleHBsaWNpdCwgc2luY2UgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyB0aHJvdWdoIGFqYXhTZXR1cCAoIzExMjY0KQoJCXR5cGU6ICJHRVQiLAoJCWRhdGFUeXBlOiAic2NyaXB0IiwKCQljYWNoZTogdHJ1ZSwKCQlhc3luYzogZmFsc2UsCgkJZ2xvYmFsOiBmYWxzZSwKCQkidGhyb3dzIjogdHJ1ZQoJfSApOwp9OwoKCmpRdWVyeS5mbi5leHRlbmQoIHsKCXdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgewoJCXZhciB3cmFwOwoKCQlpZiAoIHRoaXNbIDAgXSApIHsKCQkJaWYgKCBpc0Z1bmN0aW9uKCBodG1sICkgKSB7CgkJCQlodG1sID0gaHRtbC5jYWxsKCB0aGlzWyAwIF0gKTsKCQkJfQoKCQkJLy8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmQKCQkJd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7CgoJCQlpZiAoIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgewoJCQkJd3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApOwoJCQl9CgoJCQl3cmFwLm1hcCggZnVuY3Rpb24oKSB7CgkJCQl2YXIgZWxlbSA9IHRoaXM7CgoJCQkJd2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkgewoJCQkJCWVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkOwoJCQkJfQoKCQkJCXJldHVybiBlbGVtOwoJCQl9ICkuYXBwZW5kKCB0aGlzICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJd3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHsKCQlpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwuY2FsbCggdGhpcywgaSApICk7CgkJCX0gKTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLAoJCQkJY29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7CgoJCQlpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHsKCQkJCWNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKCgkJCX0gZWxzZSB7CgkJCQlzZWxmLmFwcGVuZCggaHRtbCApOwoJCQl9CgkJfSApOwoJfSwKCgl3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsKCQl2YXIgaHRtbElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCBodG1sICk7CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkgewoJCQlqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBodG1sSXNGdW5jdGlvbiA/IGh0bWwuY2FsbCggdGhpcywgaSApIDogaHRtbCApOwoJCX0gKTsKCX0sCgoJdW53cmFwOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdGhpcy5wYXJlbnQoIHNlbGVjdG9yICkubm90KCAiYm9keSIgKS5lYWNoKCBmdW5jdGlvbigpIHsKCQkJalF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApOwoJCX0gKTsKCQlyZXR1cm4gdGhpczsKCX0KfSApOwoKCmpRdWVyeS5leHByLnBzZXVkb3MuaGlkZGVuID0gZnVuY3Rpb24oIGVsZW0gKSB7CglyZXR1cm4gIWpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSggZWxlbSApOwp9OwpqUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHsKCXJldHVybiAhISggZWxlbS5vZmZzZXRXaWR0aCB8fCBlbGVtLm9mZnNldEhlaWdodCB8fCBlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICk7Cn07CgoKCgpqUXVlcnkuYWpheFNldHRpbmdzLnhociA9IGZ1bmN0aW9uKCkgewoJdHJ5IHsKCQlyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpOwoJfSBjYXRjaCAoIGUgKSB7fQp9OwoKdmFyIHhoclN1Y2Nlc3NTdGF0dXMgPSB7CgoJCS8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwCgkJMDogMjAwLAoKCQkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJCS8vICMxNDUwOiBzb21ldGltZXMgSUUgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNAoJCTEyMjM6IDIwNAoJfSwKCXhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7CgpzdXBwb3J0LmNvcnMgPSAhIXhoclN1cHBvcnRlZCAmJiAoICJ3aXRoQ3JlZGVudGlhbHMiIGluIHhoclN1cHBvcnRlZCApOwpzdXBwb3J0LmFqYXggPSB4aHJTdXBwb3J0ZWQgPSAhIXhoclN1cHBvcnRlZDsKCmpRdWVyeS5hamF4VHJhbnNwb3J0KCBmdW5jdGlvbiggb3B0aW9ucyApIHsKCXZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjazsKCgkvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0CglpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJTdXBwb3J0ZWQgJiYgIW9wdGlvbnMuY3Jvc3NEb21haW4gKSB7CgkJcmV0dXJuIHsKCQkJc2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkgewoJCQkJdmFyIGksCgkJCQkJeGhyID0gb3B0aW9ucy54aHIoKTsKCgkJCQl4aHIub3BlbigKCQkJCQlvcHRpb25zLnR5cGUsCgkJCQkJb3B0aW9ucy51cmwsCgkJCQkJb3B0aW9ucy5hc3luYywKCQkJCQlvcHRpb25zLnVzZXJuYW1lLAoJCQkJCW9wdGlvbnMucGFzc3dvcmQKCQkJCSk7CgoJCQkJLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAoJCQkJaWYgKCBvcHRpb25zLnhockZpZWxkcyApIHsKCQkJCQlmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkgewoJCQkJCQl4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07CgkJCQkJfQoJCQkJfQoKCQkJCS8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWQKCQkJCWlmICggb3B0aW9ucy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHsKCQkJCQl4aHIub3ZlcnJpZGVNaW1lVHlwZSggb3B0aW9ucy5taW1lVHlwZSApOwoJCQkJfQoKCQkJCS8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyCgkJCQkvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlCgkJCQkvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLgoJCQkJLy8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApCgkJCQkvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC4KCQkJCWlmICggIW9wdGlvbnMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbICJYLVJlcXVlc3RlZC1XaXRoIiBdICkgewoJCQkJCWhlYWRlcnNbICJYLVJlcXVlc3RlZC1XaXRoIiBdID0gIlhNTEh0dHBSZXF1ZXN0IjsKCQkJCX0KCgkJCQkvLyBTZXQgaGVhZGVycwoJCQkJZm9yICggaSBpbiBoZWFkZXJzICkgewoJCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTsKCQkJCX0KCgkJCQkvLyBDYWxsYmFjawoJCQkJY2FsbGJhY2sgPSBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCQljYWxsYmFjayA9IGVycm9yQ2FsbGJhY2sgPSB4aHIub25sb2FkID0KCQkJCQkJCQl4aHIub25lcnJvciA9IHhoci5vbmFib3J0ID0geGhyLm9udGltZW91dCA9CgkJCQkJCQkJCXhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOwoKCQkJCQkJCWlmICggdHlwZSA9PT0gImFib3J0IiApIHsKCQkJCQkJCQl4aHIuYWJvcnQoKTsKCQkJCQkJCX0gZWxzZSBpZiAoIHR5cGUgPT09ICJlcnJvciIgKSB7CgoJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5CgkJCQkJCQkJLy8gT24gYSBtYW51YWwgbmF0aXZlIGFib3J0LCBJRTkgdGhyb3dzCgkJCQkJCQkJLy8gZXJyb3JzIG9uIGFueSBwcm9wZXJ0eSBhY2Nlc3MgdGhhdCBpcyBub3QgcmVhZHlTdGF0ZQoJCQkJCQkJCWlmICggdHlwZW9mIHhoci5zdGF0dXMgIT09ICJudW1iZXIiICkgewoJCQkJCQkJCQljb21wbGV0ZSggMCwgImVycm9yIiApOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCWNvbXBsZXRlKAoKCQkJCQkJCQkJCS8vIEZpbGU6IHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIDA7IHNlZSAjODYwNSwgIzE0MjA3CgkJCQkJCQkJCQl4aHIuc3RhdHVzLAoJCQkJCQkJCQkJeGhyLnN0YXR1c1RleHQKCQkJCQkJCQkJKTsKCQkJCQkJCQl9CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCWNvbXBsZXRlKAoJCQkJCQkJCQl4aHJTdWNjZXNzU3RhdHVzWyB4aHIuc3RhdHVzIF0gfHwgeGhyLnN0YXR1cywKCQkJCQkJCQkJeGhyLnN0YXR1c1RleHQsCgoJCQkJCQkJCQkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJCQkJCQkJCQkvLyBJRTkgaGFzIG5vIFhIUjIgYnV0IHRocm93cyBvbiBiaW5hcnkgKHRyYWMtMTE0MjYpCgkJCQkJCQkJCS8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpCgkJCQkJCQkJCSggeGhyLnJlc3BvbnNlVHlwZSB8fCAidGV4dCIgKSAhPT0gInRleHQiICB8fAoJCQkJCQkJCQl0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gInN0cmluZyIgPwoJCQkJCQkJCQkJeyBiaW5hcnk6IHhoci5yZXNwb25zZSB9IDoKCQkJCQkJCQkJCXsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LAoJCQkJCQkJCQl4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkKCQkJCQkJCQkpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfTsKCQkJCX07CgoJCQkJLy8gTGlzdGVuIHRvIGV2ZW50cwoJCQkJeGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7CgkJCQllcnJvckNhbGxiYWNrID0geGhyLm9uZXJyb3IgPSB4aHIub250aW1lb3V0ID0gY2FsbGJhY2soICJlcnJvciIgKTsKCgkJCQkvLyBTdXBwb3J0OiBJRSA5IG9ubHkKCQkJCS8vIFVzZSBvbnJlYWR5c3RhdGVjaGFuZ2UgdG8gcmVwbGFjZSBvbmFib3J0CgkJCQkvLyB0byBoYW5kbGUgdW5jYXVnaHQgYWJvcnRzCgkJCQlpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJeGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrOwoJCQkJfSBlbHNlIHsKCQkJCQl4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CgoJCQkJCQkvLyBDaGVjayByZWFkeVN0YXRlIGJlZm9yZSB0aW1lb3V0IGFzIGl0IGNoYW5nZXMKCQkJCQkJaWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHsKCgkJCQkJCQkvLyBBbGxvdyBvbmVycm9yIHRvIGJlIGNhbGxlZCBmaXJzdCwKCQkJCQkJCS8vIGJ1dCB0aGF0IHdpbGwgbm90IGhhbmRsZSBhIG5hdGl2ZSBhYm9ydAoJCQkJCQkJLy8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGUKCQkJCQkJCS8vIGFzIHhoci5vbmVycm9yIGNhbm5vdCBiZSBhY2Nlc3NlZAoJCQkJCQkJd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCQkJCWVycm9yQ2FsbGJhY2soKTsKCQkJCQkJCQl9CgkJCQkJCQl9ICk7CgkJCQkJCX0KCQkJCQl9OwoJCQkJfQoKCQkJCS8vIENyZWF0ZSB0aGUgYWJvcnQgY2FsbGJhY2sKCQkJCWNhbGxiYWNrID0gY2FsbGJhY2soICJhYm9ydCIgKTsKCgkJCQl0cnkgewoKCQkJCQkvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pCgkJCQkJeGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApOwoJCQkJfSBjYXRjaCAoIGUgKSB7CgoJCQkJCS8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0CgkJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQkJdGhyb3cgZTsKCQkJCQl9CgkJCQl9CgkJCX0sCgoJCQlhYm9ydDogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIGNhbGxiYWNrICkgewoJCQkJCWNhbGxiYWNrKCk7CgkJCQl9CgkJCX0KCQl9OwoJfQp9ICk7CgoKCgovLyBQcmV2ZW50IGF1dG8tZXhlY3V0aW9uIG9mIHNjcmlwdHMgd2hlbiBubyBleHBsaWNpdCBkYXRhVHlwZSB3YXMgcHJvdmlkZWQgKFNlZSBnaC0yNDMyKQpqUXVlcnkuYWpheFByZWZpbHRlciggZnVuY3Rpb24oIHMgKSB7CglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJcy5jb250ZW50cy5zY3JpcHQgPSBmYWxzZTsKCX0KfSApOwoKLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGUKalF1ZXJ5LmFqYXhTZXR1cCggewoJYWNjZXB0czogewoJCXNjcmlwdDogInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgIiArCgkJCSJhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiCgl9LAoJY29udGVudHM6IHsKCQlzY3JpcHQ6IC9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi8KCX0sCgljb252ZXJ0ZXJzOiB7CgkJInRleHQgc2NyaXB0IjogZnVuY3Rpb24oIHRleHQgKSB7CgkJCWpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0ICk7CgkJCXJldHVybiB0ZXh0OwoJCX0KCX0KfSApOwoKLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpbgpqUXVlcnkuYWpheFByZWZpbHRlciggInNjcmlwdCIsIGZ1bmN0aW9uKCBzICkgewoJaWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7CgkJcy5jYWNoZSA9IGZhbHNlOwoJfQoJaWYgKCBzLmNyb3NzRG9tYWluICkgewoJCXMudHlwZSA9ICJHRVQiOwoJfQp9ICk7CgovLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnQKalF1ZXJ5LmFqYXhUcmFuc3BvcnQoICJzY3JpcHQiLCBmdW5jdGlvbiggcyApIHsKCgkvLyBUaGlzIHRyYW5zcG9ydCBvbmx5IGRlYWxzIHdpdGggY3Jvc3MgZG9tYWluIHJlcXVlc3RzCglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJdmFyIHNjcmlwdCwgY2FsbGJhY2s7CgkJcmV0dXJuIHsKCQkJc2VuZDogZnVuY3Rpb24oIF8sIGNvbXBsZXRlICkgewoJCQkJc2NyaXB0ID0galF1ZXJ5KCAiPHNjcmlwdD4iICkucHJvcCggewoJCQkJCWNoYXJzZXQ6IHMuc2NyaXB0Q2hhcnNldCwKCQkJCQlzcmM6IHMudXJsCgkJCQl9ICkub24oCgkJCQkJImxvYWQgZXJyb3IiLAoJCQkJCWNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHsKCQkJCQkJc2NyaXB0LnJlbW92ZSgpOwoJCQkJCQljYWxsYmFjayA9IG51bGw7CgkJCQkJCWlmICggZXZ0ICkgewoJCQkJCQkJY29tcGxldGUoIGV2dC50eXBlID09PSAiZXJyb3IiID8gNDA0IDogMjAwLCBldnQudHlwZSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJKTsKCgkJCQkvLyBVc2UgbmF0aXZlIERPTSBtYW5pcHVsYXRpb24gdG8gYXZvaWQgb3VyIGRvbU1hbmlwIEFKQVggdHJpY2tlcnkKCQkJCWRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7CgkJCX0sCgkJCWFib3J0OiBmdW5jdGlvbigpIHsKCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJY2FsbGJhY2soKTsKCQkJCX0KCQkJfQoJCX07Cgl9Cn0gKTsKCgoKCnZhciBvbGRDYWxsYmFja3MgPSBbXSwKCXJqc29ucCA9IC8oPSlcPyg/PSZ8JCl8XD9cPy87CgovLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzCmpRdWVyeS5hamF4U2V0dXAoIHsKCWpzb25wOiAiY2FsbGJhY2siLAoJanNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7CgkJdmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyAiXyIgKyAoIG5vbmNlKysgKSApOwoJCXRoaXNbIGNhbGxiYWNrIF0gPSB0cnVlOwoJCXJldHVybiBjYWxsYmFjazsKCX0KfSApOwoKLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzCmpRdWVyeS5hamF4UHJlZmlsdGVyKCAianNvbiBqc29ucCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHsKCgl2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsCgkJanNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID8KCQkJInVybCIgOgoJCQl0eXBlb2Ygcy5kYXRhID09PSAic3RyaW5nIiAmJgoJCQkJKCBzLmNvbnRlbnRUeXBlIHx8ICIiICkKCQkJCQkuaW5kZXhPZiggImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIgKSA9PT0gMCAmJgoJCQkJcmpzb25wLnRlc3QoIHMuZGF0YSApICYmICJkYXRhIgoJCSk7CgoJLy8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzICJqc29ucCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXQKCWlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gImpzb25wIiApIHsKCgkJLy8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdAoJCWNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGlzRnVuY3Rpb24oIHMuanNvbnBDYWxsYmFjayApID8KCQkJcy5qc29ucENhbGxiYWNrKCkgOgoJCQlzLmpzb25wQ2FsbGJhY2s7CgoJCS8vIEluc2VydCBjYWxsYmFjayBpbnRvIHVybCBvciBmb3JtIGRhdGEKCQlpZiAoIGpzb25Qcm9wICkgewoJCQlzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsICIkMSIgKyBjYWxsYmFja05hbWUgKTsKCQl9IGVsc2UgaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHsKCQkJcy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/ICImIiA6ICI/IiApICsgcy5qc29ucCArICI9IiArIGNhbGxiYWNrTmFtZTsKCQl9CgoJCS8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb24KCQlzLmNvbnZlcnRlcnNbICJzY3JpcHQganNvbiIgXSA9IGZ1bmN0aW9uKCkgewoJCQlpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHsKCQkJCWpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgIiB3YXMgbm90IGNhbGxlZCIgKTsKCQkJfQoJCQlyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTsKCQl9OwoKCQkvLyBGb3JjZSBqc29uIGRhdGFUeXBlCgkJcy5kYXRhVHlwZXNbIDAgXSA9ICJqc29uIjsKCgkJLy8gSW5zdGFsbCBjYWxsYmFjawoJCW92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTsKCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7CgkJCXJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzOwoJCX07CgoJCS8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKQoJCWpxWEhSLmFsd2F5cyggZnVuY3Rpb24oKSB7CgoJCQkvLyBJZiBwcmV2aW91cyB2YWx1ZSBkaWRuJ3QgZXhpc3QgLSByZW1vdmUgaXQKCQkJaWYgKCBvdmVyd3JpdHRlbiA9PT0gdW5kZWZpbmVkICkgewoJCQkJalF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTsKCgkJCS8vIE90aGVyd2lzZSByZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlCgkJCX0gZWxzZSB7CgkJCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47CgkJCX0KCgkJCS8vIFNhdmUgYmFjayBhcyBmcmVlCgkJCWlmICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7CgoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kCgkJCQlzLmpzb25wQ2FsbGJhY2sgPSBvcmlnaW5hbFNldHRpbmdzLmpzb25wQ2FsbGJhY2s7CgoJCQkJLy8gU2F2ZSB0aGUgY2FsbGJhY2sgbmFtZSBmb3IgZnV0dXJlIHVzZQoJCQkJb2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApOwoJCQl9CgoJCQkvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2UKCQkJaWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBpc0Z1bmN0aW9uKCBvdmVyd3JpdHRlbiApICkgewoJCQkJb3ZlcndyaXR0ZW4oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTsKCQkJfQoKCQkJcmVzcG9uc2VDb250YWluZXIgPSBvdmVyd3JpdHRlbiA9IHVuZGVmaW5lZDsKCQl9ICk7CgoJCS8vIERlbGVnYXRlIHRvIHNjcmlwdAoJCXJldHVybiAic2NyaXB0IjsKCX0KfSApOwoKCgoKLy8gU3VwcG9ydDogU2FmYXJpIDggb25seQovLyBJbiBTYWZhcmkgOCBkb2N1bWVudHMgY3JlYXRlZCB2aWEgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50Ci8vIGNvbGxhcHNlIHNpYmxpbmcgZm9ybXM6IHRoZSBzZWNvbmQgb25lIGJlY29tZXMgYSBjaGlsZCBvZiB0aGUgZmlyc3Qgb25lLgovLyBCZWNhdXNlIG9mIHRoYXQsIHRoaXMgc2VjdXJpdHkgbWVhc3VyZSBoYXMgdG8gYmUgZGlzYWJsZWQgaW4gU2FmYXJpIDguCi8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzczMzcKc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgPSAoIGZ1bmN0aW9uKCkgewoJdmFyIGJvZHkgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoICIiICkuYm9keTsKCWJvZHkuaW5uZXJIVE1MID0gIjxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IjsKCXJldHVybiBib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09PSAyOwp9ICkoKTsKCgovLyBBcmd1bWVudCAiZGF0YSIgc2hvdWxkIGJlIHN0cmluZyBvZiBodG1sCi8vIGNvbnRleHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgY29udGV4dCwKLy8gZGVmYXVsdHMgdG8gZG9jdW1lbnQKLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZwpqUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIGtlZXBTY3JpcHRzICkgewoJaWYgKCB0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIgKSB7CgkJcmV0dXJuIFtdOwoJfQoJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gImJvb2xlYW4iICkgewoJCWtlZXBTY3JpcHRzID0gY29udGV4dDsKCQljb250ZXh0ID0gZmFsc2U7Cgl9CgoJdmFyIGJhc2UsIHBhcnNlZCwgc2NyaXB0czsKCglpZiAoICFjb250ZXh0ICkgewoKCQkvLyBTdG9wIHNjcmlwdHMgb3IgaW5saW5lIGV2ZW50IGhhbmRsZXJzIGZyb20gYmVpbmcgZXhlY3V0ZWQgaW1tZWRpYXRlbHkKCQkvLyBieSB1c2luZyBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbgoJCWlmICggc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgKSB7CgkJCWNvbnRleHQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoICIiICk7CgoJCQkvLyBTZXQgdGhlIGJhc2UgaHJlZiBmb3IgdGhlIGNyZWF0ZWQgZG9jdW1lbnQKCQkJLy8gc28gYW55IHBhcnNlZCBlbGVtZW50cyB3aXRoIFVSTHMKCQkJLy8gYXJlIGJhc2VkIG9uIHRoZSBkb2N1bWVudCdzIFVSTCAoZ2gtMjk2NSkKCQkJYmFzZSA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCggImJhc2UiICk7CgkJCWJhc2UuaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7CgkJCWNvbnRleHQuaGVhZC5hcHBlbmRDaGlsZCggYmFzZSApOwoJCX0gZWxzZSB7CgkJCWNvbnRleHQgPSBkb2N1bWVudDsKCQl9Cgl9CgoJcGFyc2VkID0gcnNpbmdsZVRhZy5leGVjKCBkYXRhICk7CglzY3JpcHRzID0gIWtlZXBTY3JpcHRzICYmIFtdOwoKCS8vIFNpbmdsZSB0YWcKCWlmICggcGFyc2VkICkgewoJCXJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdOwoJfQoKCXBhcnNlZCA9IGJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7CgoJaWYgKCBzY3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoICkgewoJCWpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpOwoJfQoKCXJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQuY2hpbGROb2RlcyApOwp9OwoKCi8qKgogKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlCiAqLwpqUXVlcnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7Cgl2YXIgc2VsZWN0b3IsIHR5cGUsIHJlc3BvbnNlLAoJCXNlbGYgPSB0aGlzLAoJCW9mZiA9IHVybC5pbmRleE9mKCAiICIgKTsKCglpZiAoIG9mZiA+IC0xICkgewoJCXNlbGVjdG9yID0gc3RyaXBBbmRDb2xsYXBzZSggdXJsLnNsaWNlKCBvZmYgKSApOwoJCXVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7Cgl9CgoJLy8gSWYgaXQncyBhIGZ1bmN0aW9uCglpZiAoIGlzRnVuY3Rpb24oIHBhcmFtcyApICkgewoKCQkvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFjawoJCWNhbGxiYWNrID0gcGFyYW1zOwoJCXBhcmFtcyA9IHVuZGVmaW5lZDsKCgkvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nCgl9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gIm9iamVjdCIgKSB7CgkJdHlwZSA9ICJQT1NUIjsKCX0KCgkvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlmeSwgbWFrZSB0aGUgcmVxdWVzdAoJaWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7CgkJalF1ZXJ5LmFqYXgoIHsKCQkJdXJsOiB1cmwsCgoJCQkvLyBJZiAidHlwZSIgdmFyaWFibGUgaXMgdW5kZWZpbmVkLCB0aGVuICJHRVQiIG1ldGhvZCB3aWxsIGJlIHVzZWQuCgkJCS8vIE1ha2UgdmFsdWUgb2YgdGhpcyBmaWVsZCBleHBsaWNpdCBzaW5jZQoJCQkvLyB1c2VyIGNhbiBvdmVycmlkZSBpdCB0aHJvdWdoIGFqYXhTZXR1cCBtZXRob2QKCQkJdHlwZTogdHlwZSB8fCAiR0VUIiwKCQkJZGF0YVR5cGU6ICJodG1sIiwKCQkJZGF0YTogcGFyYW1zCgkJfSApLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7CgoJCQkvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2sKCQkJcmVzcG9uc2UgPSBhcmd1bWVudHM7CgoJCQlzZWxmLmh0bWwoIHNlbGVjdG9yID8KCgkJCQkvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXYKCQkJCS8vIEV4Y2x1ZGUgc2NyaXB0cyB0byBhdm9pZCBJRSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9ycwoJCQkJalF1ZXJ5KCAiPGRpdj4iICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOgoKCQkJCS8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0CgkJCQlyZXNwb25zZVRleHQgKTsKCgkJLy8gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyAiZGF0YSIsICJzdGF0dXMiLCAianFYSFIiCgkJLy8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25zZSB3YXMgc2V0IGFib3ZlLgoJCS8vIElmIGl0IGZhaWxzLCB0aGlzIGZ1bmN0aW9uIGdldHMgImpxWEhSIiwgInN0YXR1cyIsICJlcnJvciIKCQl9ICkuYWx3YXlzKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHsKCQkJc2VsZi5lYWNoKCBmdW5jdGlvbigpIHsKCQkJCWNhbGxiYWNrLmFwcGx5KCB0aGlzLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7CgkJCX0gKTsKCQl9ICk7Cgl9CgoJcmV0dXJuIHRoaXM7Cn07CgoKCgovLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50cwpqUXVlcnkuZWFjaCggWwoJImFqYXhTdGFydCIsCgkiYWpheFN0b3AiLAoJImFqYXhDb21wbGV0ZSIsCgkiYWpheEVycm9yIiwKCSJhamF4U3VjY2VzcyIsCgkiYWpheFNlbmQiCl0sIGZ1bmN0aW9uKCBpLCB0eXBlICkgewoJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7CgkJcmV0dXJuIHRoaXMub24oIHR5cGUsIGZuICk7Cgl9Owp9ICk7CgoKCgpqUXVlcnkuZXhwci5wc2V1ZG9zLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7CglyZXR1cm4galF1ZXJ5LmdyZXAoIGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHsKCQlyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTsKCX0gKS5sZW5ndGg7Cn07CgoKCgpqUXVlcnkub2Zmc2V0ID0gewoJc2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHsKCQl2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLAoJCQlwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSwKCQkJY3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLAoJCQlwcm9wcyA9IHt9OwoKCQkvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtCgkJaWYgKCBwb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CgkJCWVsZW0uc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwoJCX0KCgkJY3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTsKCQljdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCAidG9wIiApOwoJCWN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCAibGVmdCIgKTsKCQljYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09ICJhYnNvbHV0ZSIgfHwgcG9zaXRpb24gPT09ICJmaXhlZCIgKSAmJgoJCQkoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKCAiYXV0byIgKSA+IC0xOwoKCQkvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlcgoJCS8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZAoJCWlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7CgkJCWN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpOwoJCQljdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7CgkJCWN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0OwoKCQl9IGVsc2UgewoJCQljdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwOwoJCQljdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7CgkJfQoKCQlpZiAoIGlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHsKCgkJCS8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KQoJCQlvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyT2Zmc2V0ICkgKTsKCQl9CgoJCWlmICggb3B0aW9ucy50b3AgIT0gbnVsbCApIHsKCQkJcHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDsKCQl9CgkJaWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHsKCQkJcHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7CgkJfQoKCQlpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyApIHsKCQkJb3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApOwoKCQl9IGVsc2UgewoJCQljdXJFbGVtLmNzcyggcHJvcHMgKTsKCQl9Cgl9Cn07CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJLy8gb2Zmc2V0KCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgYm9yZGVyIGJveCB0byB0aGUgZG9jdW1lbnQgb3JpZ2luCglvZmZzZXQ6IGZ1bmN0aW9uKCBvcHRpb25zICkgewoKCQkvLyBQcmVzZXJ2ZSBjaGFpbmluZyBmb3Igc2V0dGVyCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQlyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8KCQkJCXRoaXMgOgoJCQkJdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHsKCQkJCQlqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApOwoJCQkJfSApOwoJCX0KCgkJdmFyIHJlY3QsIHdpbiwKCQkJZWxlbSA9IHRoaXNbIDAgXTsKCgkJaWYgKCAhZWxlbSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gUmV0dXJuIHplcm9zIGZvciBkaXNjb25uZWN0ZWQgYW5kIGhpZGRlbiAoZGlzcGxheTogbm9uZSkgZWxlbWVudHMgKGdoLTIzMTApCgkJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkJLy8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYQoJCS8vIGRpc2Nvbm5lY3RlZCBub2RlIGluIElFIHRocm93cyBhbiBlcnJvcgoJCWlmICggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7CgkJCXJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9OwoJCX0KCgkJLy8gR2V0IGRvY3VtZW50LXJlbGF0aXZlIHBvc2l0aW9uIGJ5IGFkZGluZyB2aWV3cG9ydCBzY3JvbGwgdG8gdmlld3BvcnQtcmVsYXRpdmUgZ0JDUgoJCXJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoJCXdpbiA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldzsKCQlyZXR1cm4gewoJCQl0b3A6IHJlY3QudG9wICsgd2luLnBhZ2VZT2Zmc2V0LAoJCQlsZWZ0OiByZWN0LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXQKCQl9OwoJfSwKCgkvLyBwb3NpdGlvbigpIHJlbGF0ZXMgYW4gZWxlbWVudCdzIG1hcmdpbiBib3ggdG8gaXRzIG9mZnNldCBwYXJlbnQncyBwYWRkaW5nIGJveAoJLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYmVoYXZpb3Igb2YgQ1NTIGFic29sdXRlIHBvc2l0aW9uaW5nCglwb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJaWYgKCAhdGhpc1sgMCBdICkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsIGRvYywKCQkJZWxlbSA9IHRoaXNbIDAgXSwKCQkJcGFyZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfTsKCgkJLy8gcG9zaXRpb246Zml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHRoZSB2aWV3cG9ydCwgd2hpY2ggaXRzZWxmIGFsd2F5cyBoYXMgemVybyBvZmZzZXQKCQlpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSA9PT0gImZpeGVkIiApIHsKCgkJCS8vIEFzc3VtZSBwb3NpdGlvbjpmaXhlZCBpbXBsaWVzIGF2YWlsYWJpbGl0eSBvZiBnZXRCb3VuZGluZ0NsaWVudFJlY3QKCQkJb2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKCgkJfSBlbHNlIHsKCQkJb2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTsKCgkJCS8vIEFjY291bnQgZm9yIHRoZSAqcmVhbCogb2Zmc2V0IHBhcmVudCwgd2hpY2ggY2FuIGJlIHRoZSBkb2N1bWVudCBvciBpdHMgcm9vdCBlbGVtZW50CgkJCS8vIHdoZW4gYSBzdGF0aWNhbGx5IHBvc2l0aW9uZWQgZWxlbWVudCBpcyBpZGVudGlmaWVkCgkJCWRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDsKCQkJb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQgfHwgZG9jLmRvY3VtZW50RWxlbWVudDsKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYKCQkJCSggb2Zmc2V0UGFyZW50ID09PSBkb2MuYm9keSB8fCBvZmZzZXRQYXJlbnQgPT09IGRvYy5kb2N1bWVudEVsZW1lbnQgKSAmJgoJCQkJalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewoKCQkJCW9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5wYXJlbnROb2RlOwoJCQl9CgkJCWlmICggb2Zmc2V0UGFyZW50ICYmIG9mZnNldFBhcmVudCAhPT0gZWxlbSAmJiBvZmZzZXRQYXJlbnQubm9kZVR5cGUgPT09IDEgKSB7CgoJCQkJLy8gSW5jb3Jwb3JhdGUgYm9yZGVycyBpbnRvIGl0cyBvZmZzZXQsIHNpbmNlIHRoZXkgYXJlIG91dHNpZGUgaXRzIGNvbnRlbnQgb3JpZ2luCgkJCQlwYXJlbnRPZmZzZXQgPSBqUXVlcnkoIG9mZnNldFBhcmVudCApLm9mZnNldCgpOwoJCQkJcGFyZW50T2Zmc2V0LnRvcCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsICJib3JkZXJUb3BXaWR0aCIsIHRydWUgKTsKCQkJCXBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgImJvcmRlckxlZnRXaWR0aCIsIHRydWUgKTsKCQkJfQoJCX0KCgkJLy8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2lucwoJCXJldHVybiB7CgkJCXRvcDogb2Zmc2V0LnRvcCAtIHBhcmVudE9mZnNldC50b3AgLSBqUXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luVG9wIiwgdHJ1ZSApLAoJCQlsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0IC0galF1ZXJ5LmNzcyggZWxlbSwgIm1hcmdpbkxlZnQiLCB0cnVlICkKCQl9OwoJfSwKCgkvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBkb2N1bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczoKCS8vIDEpIEZvciB0aGUgZWxlbWVudCBpbnNpZGUgdGhlIGlmcmFtZSB3aXRob3V0IG9mZnNldFBhcmVudCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4KCS8vICAgIGRvY3VtZW50RWxlbWVudCBvZiB0aGUgcGFyZW50IHdpbmRvdwoJLy8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudAoJLy8gMykgRm9yIGJvZHkgb3IgaHRtbCBlbGVtZW50LCBpLmUuIGluIGNhc2Ugb2YgdGhlIGh0bWwgbm9kZSAtIGl0IHdpbGwgcmV0dXJuIGl0c2VsZgoJLy8KCS8vIGJ1dCB0aG9zZSBleGNlcHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlcwoJLy8gYW5kIG1pZ2h0IGJlIGNvbnNpZGVyZWQgYXMgbW9yZSBwcmVmZXJhYmxlIHJlc3VsdHMuCgkvLwoJLy8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUKCW9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHsKCQkJdmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50OwoKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewoJCQkJb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDsKCQkJfQoKCQkJcmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2N1bWVudEVsZW1lbnQ7CgkJfSApOwoJfQp9ICk7CgovLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHMKalF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogInBhZ2VYT2Zmc2V0Iiwgc2Nyb2xsVG9wOiAicGFnZVlPZmZzZXQiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7Cgl2YXIgdG9wID0gInBhZ2VZT2Zmc2V0IiA9PT0gcHJvcDsKCglqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbWV0aG9kLCB2YWwgKSB7CgoJCQkvLyBDb2FsZXNjZSBkb2N1bWVudHMgYW5kIHdpbmRvd3MKCQkJdmFyIHdpbjsKCQkJaWYgKCBpc1dpbmRvdyggZWxlbSApICkgewoJCQkJd2luID0gZWxlbTsKCQkJfSBlbHNlIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCXdpbiA9IGVsZW0uZGVmYXVsdFZpZXc7CgkJCX0KCgkJCWlmICggdmFsID09PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTsKCQkJfQoKCQkJaWYgKCB3aW4gKSB7CgkJCQl3aW4uc2Nyb2xsVG8oCgkJCQkJIXRvcCA/IHZhbCA6IHdpbi5wYWdlWE9mZnNldCwKCQkJCQl0b3AgPyB2YWwgOiB3aW4ucGFnZVlPZmZzZXQKCQkJCSk7CgoJCQl9IGVsc2UgewoJCQkJZWxlbVsgbWV0aG9kIF0gPSB2YWw7CgkJCX0KCQl9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCApOwoJfTsKfSApOwoKLy8gU3VwcG9ydDogU2FmYXJpIDw9NyAtIDkuMSwgQ2hyb21lIDw9MzcgLSA0OQovLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvbgovLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODQKLy8gQmxpbmsgYnVnOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD01ODkzNDcKLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDsKLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmUKalF1ZXJ5LmVhY2goIFsgInRvcCIsICJsZWZ0IiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHsKCWpRdWVyeS5jc3NIb29rc1sgcHJvcCBdID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnBpeGVsUG9zaXRpb24sCgkJZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQlpZiAoIGNvbXB1dGVkICkgewoJCQkJY29tcHV0ZWQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTsKCgkJCQkvLyBJZiBjdXJDU1MgcmV0dXJucyBwZXJjZW50YWdlLCBmYWxsYmFjayB0byBvZmZzZXQKCQkJCXJldHVybiBybnVtbm9ucHgudGVzdCggY29tcHV0ZWQgKSA/CgkJCQkJalF1ZXJ5KCBlbGVtICkucG9zaXRpb24oKVsgcHJvcCBdICsgInB4IiA6CgkJCQkJY29tcHV0ZWQ7CgkJCX0KCQl9CgkpOwp9ICk7CgoKLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzCmpRdWVyeS5lYWNoKCB7IEhlaWdodDogImhlaWdodCIsIFdpZHRoOiAid2lkdGgiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkgewoJalF1ZXJ5LmVhY2goIHsgcGFkZGluZzogImlubmVyIiArIG5hbWUsIGNvbnRlbnQ6IHR5cGUsICIiOiAib3V0ZXIiICsgbmFtZSB9LAoJCWZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkgewoKCQkvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGgKCQlqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHsKCQkJdmFyIGNoYWluYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKCBkZWZhdWx0RXh0cmEgfHwgdHlwZW9mIG1hcmdpbiAhPT0gImJvb2xlYW4iICksCgkJCQlleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/ICJtYXJnaW4iIDogImJvcmRlciIgKTsKCgkJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHsKCQkJCXZhciBkb2M7CgoJCQkJaWYgKCBpc1dpbmRvdyggZWxlbSApICkgewoKCQkJCQkvLyAkKCB3aW5kb3cgKS5vdXRlcldpZHRoL0hlaWdodCByZXR1cm4gdy9oIGluY2x1ZGluZyBzY3JvbGxiYXJzIChnaC0xNzI5KQoJCQkJCXJldHVybiBmdW5jTmFtZS5pbmRleE9mKCAib3V0ZXIiICkgPT09IDAgPwoJCQkJCQllbGVtWyAiaW5uZXIiICsgbmFtZSBdIDoKCQkJCQkJZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdOwoJCQkJfQoKCQkJCS8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHQKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCQlkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDsKCgkJCQkJLy8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLAoJCQkJCS8vIHdoaWNoZXZlciBpcyBncmVhdGVzdAoJCQkJCXJldHVybiBNYXRoLm1heCgKCQkJCQkJZWxlbS5ib2R5WyAic2Nyb2xsIiArIG5hbWUgXSwgZG9jWyAic2Nyb2xsIiArIG5hbWUgXSwKCQkJCQkJZWxlbS5ib2R5WyAib2Zmc2V0IiArIG5hbWUgXSwgZG9jWyAib2Zmc2V0IiArIG5hbWUgXSwKCQkJCQkJZG9jWyAiY2xpZW50IiArIG5hbWUgXQoJCQkJCSk7CgkJCQl9CgoJCQkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPwoKCQkJCQkvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBwYXJzZUZsb2F0CgkJCQkJalF1ZXJ5LmNzcyggZWxlbSwgdHlwZSwgZXh0cmEgKSA6CgoJCQkJCS8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQkJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApOwoJCQl9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSApOwoJCX07Cgl9ICk7Cn0gKTsKCgpqUXVlcnkuZWFjaCggKCAiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgIiArCgkibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgIiArCgkiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIgKS5zcGxpdCggIiAiICksCglmdW5jdGlvbiggaSwgbmFtZSApIHsKCgkvLyBIYW5kbGUgZXZlbnQgYmluZGluZwoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7CgkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID8KCQkJdGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6CgkJCXRoaXMudHJpZ2dlciggbmFtZSApOwoJfTsKfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJaG92ZXI6IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkgewoJCXJldHVybiB0aGlzLm1vdXNlZW50ZXIoIGZuT3ZlciApLm1vdXNlbGVhdmUoIGZuT3V0IHx8IGZuT3ZlciApOwoJfQp9ICk7CgoKCgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJYmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7Cgl9LAoJdW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkgewoJCXJldHVybiB0aGlzLm9mZiggdHlwZXMsIG51bGwsIGZuICk7Cgl9LAoKCWRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOwoJfSwKCXVuZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGZuICkgewoKCQkvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApCgkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPwoJCQl0aGlzLm9mZiggc2VsZWN0b3IsICIqKiIgKSA6CgkJCXRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgIioqIiwgZm4gKTsKCX0KfSApOwoKLy8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55Ci8vIGFyZ3VtZW50cy4KLy8galF1ZXJ5LnByb3h5IGlzIGRlcHJlY2F0ZWQgdG8gcHJvbW90ZSBzdGFuZGFyZHMgKHNwZWNpZmljYWxseSBGdW5jdGlvbiNiaW5kKQovLyBIb3dldmVyLCBpdCBpcyBub3Qgc2xhdGVkIGZvciByZW1vdmFsIGFueSB0aW1lIHNvb24KalF1ZXJ5LnByb3h5ID0gZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkgewoJdmFyIHRtcCwgYXJncywgcHJveHk7CgoJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gInN0cmluZyIgKSB7CgkJdG1wID0gZm5bIGNvbnRleHQgXTsKCQljb250ZXh0ID0gZm47CgkJZm4gPSB0bXA7Cgl9CgoJLy8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWMKCS8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuCglpZiAoICFpc0Z1bmN0aW9uKCBmbiApICkgewoJCXJldHVybiB1bmRlZmluZWQ7Cgl9CgoJLy8gU2ltdWxhdGVkIGJpbmQKCWFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTsKCXByb3h5ID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7Cgl9OwoKCS8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAoJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKys7CgoJcmV0dXJuIHByb3h5Owp9OwoKalF1ZXJ5LmhvbGRSZWFkeSA9IGZ1bmN0aW9uKCBob2xkICkgewoJaWYgKCBob2xkICkgewoJCWpRdWVyeS5yZWFkeVdhaXQrKzsKCX0gZWxzZSB7CgkJalF1ZXJ5LnJlYWR5KCB0cnVlICk7Cgl9Cn07CmpRdWVyeS5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTsKalF1ZXJ5LnBhcnNlSlNPTiA9IEpTT04ucGFyc2U7CmpRdWVyeS5ub2RlTmFtZSA9IG5vZGVOYW1lOwpqUXVlcnkuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247CmpRdWVyeS5pc1dpbmRvdyA9IGlzV2luZG93OwpqUXVlcnkuY2FtZWxDYXNlID0gY2FtZWxDYXNlOwpqUXVlcnkudHlwZSA9IHRvVHlwZTsKCmpRdWVyeS5ub3cgPSBEYXRlLm5vdzsKCmpRdWVyeS5pc051bWVyaWMgPSBmdW5jdGlvbiggb2JqICkgewoKCS8vIEFzIG9mIGpRdWVyeSAzLjAsIGlzTnVtZXJpYyBpcyBsaW1pdGVkIHRvCgkvLyBzdHJpbmdzIGFuZCBudW1iZXJzIChwcmltaXRpdmVzIG9yIG9iamVjdHMpCgkvLyB0aGF0IGNhbiBiZSBjb2VyY2VkIHRvIGZpbml0ZSBudW1iZXJzIChnaC0yNjYyKQoJdmFyIHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7CglyZXR1cm4gKCB0eXBlID09PSAibnVtYmVyIiB8fCB0eXBlID09PSAic3RyaW5nIiApICYmCgoJCS8vIHBhcnNlRmxvYXQgTmFOcyBudW1lcmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzICgiIikKCQkvLyAuLi5idXQgbWlzaW50ZXJwcmV0cyBsZWFkaW5nLW51bWJlciBzdHJpbmdzLCBwYXJ0aWN1bGFybHkgaGV4IGxpdGVyYWxzICgiMHguLi4iKQoJCS8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTgoJCSFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTsKfTsKCgoKCi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlcgovLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0Ci8vIHVuZGVyc3RhbmRzIGFub255bW91cyBBTUQgbW9kdWxlcy4gQSBuYW1lZCBBTUQgaXMgc2FmZXN0IGFuZCBtb3N0IHJvYnVzdAovLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlCi8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZQovLyBmaWxlIG5hbWUuIERvIHRoaXMgYWZ0ZXIgY3JlYXRpbmcgdGhlIGdsb2JhbCBzbyB0aGF0IGlmIGFuIEFNRCBtb2R1bGUgd2FudHMKLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLgoKLy8gTm90ZSB0aGF0IGZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LCBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IGpRdWVyeSBzaG91bGQKLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhbgovLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVyeSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQovLyBodHRwczovL2dpdGh1Yi5jb20vanJidXJrZS9yZXF1aXJlanMvd2lraS9VcGRhdGluZy1leGlzdGluZy1saWJyYXJpZXMjd2lraS1hbm9uCgppZiAoIHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCApIHsKCWRlZmluZSggImpxdWVyeSIsIFtdLCBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5OwoJfSApOwp9CgoKCgp2YXIKCgkvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGUKCV9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LAoKCS8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlCglfJCA9IHdpbmRvdy4kOwoKalF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHsKCWlmICggd2luZG93LiQgPT09IGpRdWVyeSApIHsKCQl3aW5kb3cuJCA9IF8kOwoJfQoKCWlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBqUXVlcnkgKSB7CgkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7Cgl9CgoJcmV0dXJuIGpRdWVyeTsKfTsKCi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1ECi8vICgjNzEwMiNjb21tZW50OjEwLCBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzU1NykKLy8gYW5kIENvbW1vbkpTIGZvciBicm93c2VyIGVtdWxhdG9ycyAoIzEzNTY2KQppZiAoICFub0dsb2JhbCApIHsKCXdpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeTsKfQoKCgoKcmV0dXJuIGpRdWVyeTsKfSApOwo=" >


			</script>
			</script>


<!--		<script type="text/javascript" src="js/custom.js"></script> -->
<!--		<script type="text/javascript" src="js/custom.js"></script> -->
<!--		<script type="text/javascript" src="js/custom.js"></script> -->
<!--		<script type="text/javascript" src="js/custom.js"></script> -->




		<script id="script_file" type="text/javascript">
		<script id="script_file" type="text/javascript">
			$(function() {
			$(function() {
// grab the file input and bind a change event onto it
// grab the file input and bind a change event onto it
				$('#file').bind("change", function() {
				$('#file').bind("change", function() {
// new html5 formdata object.
// new html5 formdata object.
					var formData = new FormData();
					var formData = new FormData();
// for each entry, add to formdata to later access via $_FILES["file" + i]
// for each entry, add to formdata to later access via $_FILES["file" + i]
					for (var i = 0, len = document.getElementById('file').files.length; i < len; i++) {
					for (var i = 0, len = document.getElementById('file').files.length; i < len; i++) {
						formData.append("file" + i, document.getElementById('file').files[i]);
						formData.append("file" + i, document.getElementById('file').files[i]);
						}
						}
 
 
//send formdata to server-side
//send formdata to server-side
					$.ajax({
					$.ajax({
//						url: "file-upload.php", // our php file
//						url: "file-upload.php", // our php file
//						url: "ka1_fileupload.php", // our php file
//						url: "ka1_fileupload.php", // our php file
//						nurl: "http://ka1/ka1.php?q=up", // our php file
//						nurl: "http://ka1/ka1.php?q=up", // our php file
//						url: "/kup.php", // our php file
//						url: "/kup.php", // our php file
//						url: "/ka1_up.php", // our php file
//						url: "/ka1_up.php", // our php file
//						url: "/ka1.php?q=kup", // our php file
//						url: "/ka1.php?q=kup", // our php file
//						url: "/ko0.php?q=kup", // our php file
//						url: "/ko0.php?q=kup", // our php file
//						url: "/ko1.php?q=kup", // our php file
//						url: "/ko1.php?q=kup", // our php file
						url: "/ko2.php?q=kup", // our php file
						url: "/ko2.php?q=kup", // our php file
// bugs						url: "10.0.0.112:/ka1.php?q=up", // our php file
// bugs						url: "10.0.0.112:/ka1.php?q=up", // our php file
						type: 'post',
						type: 'post',
						data: formData,
						data: formData,
						dataType: 'html', // we return html from our php file
						dataType: 'html', // we return html from our php file
						async: true,
						async: true,
						processData: false,  // tell jQuery not to process the data
						processData: false,  // tell jQuery not to process the data
						contentType: false,   // tell jQuery not to set contentType
						contentType: false,   // tell jQuery not to set contentType
						success : function(data) {
						success : function(data) {
							$('#upload-result').append('<div class="alert alert-success"><p>File(s) uploaded successfully!</p><br />');
							$('#upload-result').append('<div class="alert alert-success"><p>File(s) uploaded successfully!</p><br />');
							$('#upload-result .alert').append(data);
							$('#upload-result .alert').append(data);
							},
							},
						error : function(request) {
						error : function(request) {
							console.log(request.responseText);
							console.log(request.responseText);
							}
							}
						});
						});
					});
					});
				});
				});
			</script id="script_file" >
			</script id="script_file" >


	<hr color=white>
	<hr color=white>
	<hr color=black>
	<hr color=black>
	<div id='editableDiv' contenteditable='true'>paste
	<div id='editableDiv' contenteditable='true'>paste
		</div id="editableDiv" >
		</div id="editableDiv" >
	<hr color=black>
	<hr color=black>
	<hr color=white>
	<hr color=white>
	<hr color=black>
	<hr color=black>
	<div id="div_ffpaste" contenteditable='true'>ffpaste
	<div id="div_ffpaste" contenteditable='true'>ffpaste
		</div id="div_ffpaste">
		</div id="div_ffpaste">
	<hr color=black>
	<hr color=black>
	<hr color=white>
	<hr color=white>


	<script id="script_clipboard" >
	<script id="script_clipboard" >
		function handlePaste (e) {
		function handlePaste (e) {
			var clipboardData, pastedData;
			var clipboardData, pastedData;


// Stop data actually being pasted into div
// Stop data actually being pasted into div
			e.stopPropagation();
			e.stopPropagation();
			e.preventDefault();
			e.preventDefault();


// Get pasted data via clipboard API
// Get pasted data via clipboard API
			clipboardData = e.clipboardData || window.clipboardData;
			clipboardData = e.clipboardData || window.clipboardData;
			pastedData = clipboardData.getData('Text');
			pastedData = clipboardData.getData('Text');


// Do whatever with pasteddata
// Do whatever with pasteddata
			alert(pastedData);
			alert(pastedData);
			}
			}


		document.getElementById('editableDiv').addEventListener('paste', handlePaste);
		document.getElementById('editableDiv').addEventListener('paste', handlePaste);
		</script id="script_clipboard" >
		</script id="script_clipboard" >




	<script id="script_clipboard_ff" >
	<script id="script_clipboard_ff" >
		function handlepaste_ff (e) {
		function handlepaste_ff (e) {
			var types, pastedData, savedContent;
			var types, pastedData, savedContent;


// Browsers that support the 'text/html' type in the Clipboard API (Chrome, Firefox 22+)
// Browsers that support the 'text/html' type in the Clipboard API (Chrome, Firefox 22+)
			if (e && e.clipboardData && e.clipboardData.types && e.clipboardData.getData) {
			if (e && e.clipboardData && e.clipboardData.types && e.clipboardData.getData) {


// Check for 'text/html' in types list. See abligh's answer below for deatils on
// Check for 'text/html' in types list. See abligh's answer below for deatils on
// why the DOMStringList bit is needed. We cannot fall back to 'text/plain' as
// why the DOMStringList bit is needed. We cannot fall back to 'text/plain' as
// Safari/Edge don't advertise HTML data even if it is available
// Safari/Edge don't advertise HTML data even if it is available
				types = e.clipboardData.types;
				types = e.clipboardData.types;
				if (((types instanceof DOMStringList) && types.contains("text/html")) || (types.indexOf && types.indexOf('text/html') !== -1)) {
				if (((types instanceof DOMStringList) && types.contains("text/html")) || (types.indexOf && types.indexOf('text/html') !== -1)) {


// Extract data and pass it to callback
// Extract data and pass it to callback
					pastedData = e.clipboardData.getData('text/html');
					pastedData = e.clipboardData.getData('text/html');
//					processPaste(editableDiv, pastedData);
//					processPaste(editableDiv, pastedData);
					processPaste_ff(editableDiv, pastedData);
					processPaste_ff(editableDiv, pastedData);


// Stop the data from actually being pasted
// Stop the data from actually being pasted
					e.stopPropagation();
					e.stopPropagation();
					e.preventDefault();
					e.preventDefault();
					return false;
					return false;
					}
					}
				}
				}


// Everything else: Move existing element contents to a DocumentFragment for safekeeping
// Everything else: Move existing element contents to a DocumentFragment for safekeeping
			savedContent = document.createDocumentFragment();
			savedContent = document.createDocumentFragment();
			while(editableDiv.childNodes.length > 0) {
			while(editableDiv.childNodes.length > 0) {
				savedContent.appendChild(editableDiv.childNodes[0]);
				savedContent.appendChild(editableDiv.childNodes[0]);
				}
				}


// Then wait for browser to paste content into it and cleanup
// Then wait for browser to paste content into it and cleanup
			waitForPastedData(editableDiv, savedContent);
			waitForPastedData(editableDiv, savedContent);
			return true;
			return true;
			}
			}


		function waitForPastedData (elem, savedContent) {
		function waitForPastedData (elem, savedContent) {


// If data has been processes by browser, process it
// If data has been processes by browser, process it
			if (elem.childNodes && elem.childNodes.length > 0) {
			if (elem.childNodes && elem.childNodes.length > 0) {


// Retrieve pasted content via innerHTML
// Retrieve pasted content via innerHTML
// (Alternatively loop through elem.childNodes or elem.getElementsByTagName here)
// (Alternatively loop through elem.childNodes or elem.getElementsByTagName here)
				var pastedData = elem.innerHTML;
				var pastedData = elem.innerHTML;


// Restore saved content
// Restore saved content
				elem.innerHTML = "";
				elem.innerHTML = "";
				elem.appendChild(savedContent);
				elem.appendChild(savedContent);


// Call callback
// Call callback
				processPaste_ff(elem, pastedData);
				processPaste_ff(elem, pastedData);
				}
				}


// Else wait 20ms and try again
// Else wait 20ms and try again
			else {
			else {
				setTimeout(function () {
				setTimeout(function () {
					waitForPastedData(elem, savedContent)
					waitForPastedData(elem, savedContent)
					}, 20);
					}, 20);
				}
				}
			}
			}


		function processPaste_ff (elem, pastedData) {
		function processPaste_ff (elem, pastedData) {
// Do whatever with gathered data;
// Do whatever with gathered data;
			alert(pastedData);
			alert(pastedData);
			elem.focus();
			elem.focus();
			}
			}


// Modern browsers. Note: 3rd argument is required for Firefox <= 6
// Modern browsers. Note: 3rd argument is required for Firefox <= 6
		if (editableDiv.addEventListener) {
		if (editableDiv.addEventListener) {
			editableDiv.addEventListener('paste', handlepaste, false);
			editableDiv.addEventListener('paste', handlepaste, false);
			}
			}
// IE <= 8
// IE <= 8
		else {
		else {
			editableDiv.attachEvent('onpaste', handlepaste);
			editableDiv.attachEvent('onpaste', handlepaste);
			}
			}


		$(document).on('paste','[contenteditable]',function(e) {
		$(document).on('paste','[contenteditable]',function(e) {
			e.preventDefault();
			e.preventDefault();
			var text = (e.originalEvent || e).clipboardData.getData('text/plain');
			var text = (e.originalEvent || e).clipboardData.getData('text/plain');
			window.document.execCommand('insertText', false, text);
			window.document.execCommand('insertText', false, text);
			});
			});
		</script id="script_clipboard_ff" >
		</script id="script_clipboard_ff" >


	<script id="script_clipboard_jskit" >
	<script id="script_clipboard_jskit" >
		function getSelectionText(){
		function getSelectionText(){
			var selectedText = ""
			var selectedText = ""
			if (window.getSelection){ // all modern browsers and IE9+
			if (window.getSelection){ // all modern browsers and IE9+
				selectedText = window.getSelection().toString()
				selectedText = window.getSelection().toString()
				}
				}
			return selectedText
			return selectedText
			}
			}




		document.addEventListener('mouseup', function(){
		document.addEventListener('mouseup', function(){
			var thetext = getSelectionText()
			var thetext = getSelectionText()
			if (thetext.length > 0){ // check there's some text selected
			if (thetext.length > 0){ // check there's some text selected
				console.log(thetext) // logs whatever textual content the user has selected on the page
				console.log(thetext) // logs whatever textual content the user has selected on the page
				}
				}
			}, false)
			}, false)


		function copySelectionText(){
		function copySelectionText(){
			var copysuccess // var to check whether execCommand successfully executed
			var copysuccess // var to check whether execCommand successfully executed
			try{
			try{
				copysuccess = document.execCommand("copy") // run command to copy selected text to clipboard
				copysuccess = document.execCommand("copy") // run command to copy selected text to clipboard
    				} 
    				} 
			catch(e){
			catch(e){
				copysuccess = false
				copysuccess = false
				}
				}
			return copysuccess
			return copysuccess
			}
			}


		</script id="script_clipboard_jskit" >
		</script id="script_clipboard_jskit" >


<!--
<!--
	<div name="div_dd" id="div_dd" hidden>
	<div name="div_dd" id="div_dd" hidden>
		<div id="drop">
		<div id="drop">
			<span id="sw"><h1>drop jtfinc</h2></span>
			<span id="sw"><h1>drop jtfinc</h2></span>
			<a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
			<a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
				<img height=200 width=300
				<img height=200 width=300
				src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
				src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
				</a>
				</a>
			</div>
			</div>


		<div id="drag"> jtfdc:<br />
		<div id="drag"> jtfdc:<br />
			<img src="/imgs/jtf/jtf_takes/jtf29_eagle_north.png" alt="jtf29_eagle_north" width="50" class="drg"/>
			<img src="/imgs/jtf/jtf_takes/jtf29_eagle_north.png" alt="jtf29_eagle_north" width="50" class="drg"/>
	
	
			<div class="drg"><h1>konet llc </h1>
			<div class="drg"><h1>konet llc </h1>
				<pre>timejask jkwii</pre>
				<pre>timejask jkwii</pre>
				<img class="drg" src="/imgs/btn/ko.png" alt="ko.png" width="50" >
				<img class="drg" src="/imgs/btn/ko.png" alt="ko.png" width="50" >
				<img class="drg" src="/imgs/btn/ok.png" alt="ok.png" width="50" >
				<img class="drg" src="/imgs/btn/ok.png" alt="ok.png" width="50" >
				<pre>timesak skwii</pre>
				<pre>timesak skwii</pre>
				</div>
				</div>
	
	
			<div class="drg"><h1>jtf29 </h1>
			<div class="drg"><h1>jtf29 </h1>
				<a href=./ko_jtf/zm/jtf_parcels/jtf29.html target=_blank>
				<a href=./ko_jtf/zm/jtf_parcels/jtf29.html target=_blank>
					<img height=200 width=100 src="/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.png" border=0 >
					<img height=200 width=100 src="/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.png" border=0 >
					</a>
					</a>
				</div>
				</div>
	
	
	
	
			<div class="drg"><h1>dogheads</h1>
			<div class="drg"><h1>dogheads</h1>
				<div id="div_jtf_vid5">
				<div id="div_jtf_vid5">
					<video controls="controls_jtf5" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index4_mp4.png">
					<video controls="controls_jtf5" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index4_mp4.png">
					<source src="/kb/v/doghead_video.mp4" type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">
					<source src="/kb/v/doghead_video.mp4" type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">
					</video>
					</video>
					</div>
					</div>
				</div>
				</div>
	
	
			<div class="drg"><h1>jtfdc night court lights action 3720</h1>
			<div class="drg"><h1>jtfdc night court lights action 3720</h1>
				<div id="div_vid">
				<div id="div_vid">
					<video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index_mp4.png">
					<video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index_mp4.png">
						<source src="index_avril.mp4" type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">
						<source src="index_avril.mp4" type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">
						<source src="index_avril.webm" type="video/webm;codecs=&quot;vp8, vorbis&quot;">
						<source src="index_avril.webm" type="video/webm;codecs=&quot;vp8, vorbis&quot;">
						</video>
						</video>
					</div>
					</div>
				</div>
				</div>
			</div>
			</div>
		</div>
		</div>
	-->
	-->


	<script id="script_ytlist_load" >
	<script id="script_ytlist_load" >
		function ytlist_load() {
		function ytlist_load() {
			j=0;;
			j=0;;
			
			
			ytlist[j++] = 'ko0|ko0|ko0.us|';
			ytlist[j++] = 'ko0|ko0|ko0.us|';
			ytlist[j++] = 'ko2|ko2|ko2.us|';
			ytlist[j++] = 'ko2|ko2|ko2.us|';
			ytlist[j++] = '|duckduck_go|https://duckduckgo.com/';
			ytlist[j++] = '|duckduck_go|https://duckduckgo.com/';
			ytlist[j++] = '|jpl_curiosity|https://mars.jpl.nasa.gov/msl/multimedia/raw/?s=#/?slide=2287';
			ytlist[j++] = '|jpl_curiosity|https://mars.jpl.nasa.gov/msl/multimedia/raw/?s=#/?slide=2287';
			ytlist[j++] = '|jpl_insight|https://mars.nasa.gov/insight/';
			ytlist[j++] = '|jpl_insight|https://mars.nasa.gov/insight/';
			ytlist[j++] = '|jpl_bennu|http://pluto.jhuapl.edu/';
			ytlist[j++] = '|jpl_bennu|http://pluto.jhuapl.edu/';
			ytlist[j++] = '|jpl_osirisrex_thule|https://www.asteroidmission.org/';
			ytlist[j++] = '|jpl_osirisrex_thule|https://www.asteroidmission.org/';
			ytlist[j++] = '|whatsitmean|http://whatdoesitmean.com/|';
			ytlist[j++] = '|whatsitmean|http://whatdoesitmean.com/|';
			ytlist[j++] = '|dailymail|https://www.dailymail.co.uk/ushome/index.html';
			ytlist[j++] = '|dailymail|https://www.dailymail.co.uk/ushome/index.html';
			ytlist[j++] = '|zerohedge|http://zerohedge.com/';
			ytlist[j++] = '|zerohedge|http://zerohedge.com/';
			ytlist[j++] = 'bluehost|http://bluehost.com/track/konet/ko2.us|';
			ytlist[j++] = 'bluehost|http://bluehost.com/track/konet/ko2.us|';
			ytlist[j++] = '|webb|webb_george|https://www.youtube.com/results?search_query=webb_george';
			ytlist[j++] = '|webb|webb_george|https://www.youtube.com/results?search_query=webb_george';
			ytlist[j++] = '|preppy|preppy_kitty|https://www.youtube.com/results?search_query=prepper+kitty';
			ytlist[j++] = '|preppy|preppy_kitty|https://www.youtube.com/results?search_query=prepper+kitty';
			ytlist[j++] = '|quinn|quinn_micheals||https://www.youtube.com/user/quinnmichaels';
			ytlist[j++] = '|quinn|quinn_micheals||https://www.youtube.com/user/quinnmichaels';
			ytlist[j++] = '|kennedy|kennedy|https://www.youtube.com/channel/UCl609oqTRx-zBZ4vPfN2mqA';
			ytlist[j++] = '|kennedy|kennedy|https://www.youtube.com/channel/UCl609oqTRx-zBZ4vPfN2mqA';
			ytlist[j++] = '|stropyme|stroppy_me|https://www.youtube.com/results?search_query=stroppy+me|';
			ytlist[j++] = '|stropyme|stroppy_me|https://www.youtube.com/results?search_query=stroppy+me|';
			ytlist[j++] = '|outerlite|outer_light|https://www.youtube.com/results?search_query=outer+light|';
			ytlist[j++] = '|outerlite|outer_light|https://www.youtube.com/results?search_query=outer+light|';
			ytlist[j++] = '|munder|munder|https://www.youtube.com/user/1Munder1|';
			ytlist[j++] = '|munder|munder|https://www.youtube.com/user/1Munder1|';
			ytlist[j++] = '|dahboo77|dahboo77|https://www.youtube.com/results?search_query=dahboo77';
			ytlist[j++] = '|dahboo77|dahboo77|https://www.youtube.com/results?search_query=dahboo77';
			ytlist[j++] = '|secureteam|secureteam10|https://www.youtube.com/results?search_query=secureteam10';
			ytlist[j++] = '|secureteam|secureteam10|https://www.youtube.com/results?search_query=secureteam10';
			ytlist[j++] = '|vlad96|vlad9t|https://www.youtube.com/results?search_query=vlad9t';
			ytlist[j++] = '|vlad96|vlad9t|https://www.youtube.com/results?search_query=vlad9t';
			ytlist[j++] = '|newearth|newearth|https://www.youtube.com/results?search_query=new+earth';
			ytlist[j++] = '|newearth|newearth|https://www.youtube.com/results?search_query=new+earth';
			ytlist[j++] = '|forester|forester_brian|https://www.youtube.com/results?search_query=brian+forrester';
			ytlist[j++] = '|forester|forester_brian|https://www.youtube.com/results?search_query=brian+forrester';
			ytlist[j++] = '|hoagland|hoagland|https://www.youtube.com/results?search_query=hoagland+richard';
			ytlist[j++] = '|hoagland|hoagland|https://www.youtube.com/results?search_query=hoagland+richard';
			ytlist[j++] = '|levenda||levenda|https://www.youtube.com/results?search_query=levenda+peter|';
			ytlist[j++] = '|levenda||levenda|https://www.youtube.com/results?search_query=levenda+peter|';
			ytlist[j++] = 'borealus|borealus_forum|https://www.youtube.com/results?search_query=borealis+forum';
			ytlist[j++] = 'borealus|borealus_forum|https://www.youtube.com/results?search_query=borealis+forum';
			ytlist[j++] = '|earthfiles|howe_linda_moultan|https://www.youtube.com/results?search_query=howe+linda';
			ytlist[j++] = '|earthfiles|howe_linda_moultan|https://www.youtube.com/results?search_query=howe+linda';
			ytlist[j++] = '|newsbud|https://www.youtube.com/results?search_query=newsbud|';
			ytlist[j++] = '|newsbud|https://www.youtube.com/results?search_query=newsbud|';
			ytlist[j++] = '|lional|lional_nation|https://www.youtube.com/results?search_query=lionel+nation|';
			ytlist[j++] = '|lional|lional_nation|https://www.youtube.com/results?search_query=lionel+nation|';
			ytlist[j++] = '|gooman|jason_goodman|https://www.youtube.com/channel/UC8Cl9QaRtuW9CNjP7pP4BBQ|';
			ytlist[j++] = '|gooman|jason_goodman|https://www.youtube.com/channel/UC8Cl9QaRtuW9CNjP7pP4BBQ|';
			ytlist[j++] = '|cernovich|cernovich|https://www.youtube.com/results?search_query=cernovich|';
			ytlist[j++] = '|cernovich|cernovich|https://www.youtube.com/results?search_query=cernovich|';
			ytlist[j++] = '|conte|conte_marcus|https://www.youtube.com/results?search_query=conte+marcus|';
			ytlist[j++] = '|conte|conte_marcus|https://www.youtube.com/results?search_query=conte+marcus|';
			ytlist[j++] = '|fulford|fulford_benjamin|https://www.youtube.com/results?search_query=fulford+benjamin';
			ytlist[j++] = '|fulford|fulford_benjamin|https://www.youtube.com/results?search_query=fulford+benjamin';
			ytlist[j++] = '||Julijana Sarac I Put A Spell On You|https://www.youtube.com/watch?v=jGhA2_ZcRVY&list=RDjGhA2_ZcRVY&start_radio=1';
			ytlist[j++] = '||Julijana Sarac I Put A Spell On You|https://www.youtube.com/watch?v=jGhA2_ZcRVY&list=RDjGhA2_ZcRVY&start_radio=1';


			ytlist[j++] = 'redding|dreams_to_remeber|pn://www.youtube.com/watch?v=8UOf6kngJGw&list=RD8UOf6kngJGw&start_radio=1';
			ytlist[j++] = 'redding|dreams_to_remeber|pn://www.youtube.com/watch?v=8UOf6kngJGw&list=RD8UOf6kngJGw&start_radio=1';


			ytlist[j++] = '|haggard|A place to fall apart Merle Haggard Janie Fricke|https://www.youtube.com/watch?v=iXPdB1ykWHE&list=RDiXPdB1ykWHE&start_radio=1|';
			ytlist[j++] = '|haggard|A place to fall apart Merle Haggard Janie Fricke|https://www.youtube.com/watch?v=iXPdB1ykWHE&list=RDiXPdB1ykWHE&start_radio=1|';


			ytlist[j++] = '|dreamers|Freddie & The Dreamers ~ I Understand/Auld Lang Syne|http://www.youtube.com/watch?v=Hy0AGS13dqc';
			ytlist[j++] = '|dreamers|Freddie & The Dreamers ~ I Understand/Auld Lang Syne|http://www.youtube.com/watch?v=Hy0AGS13dqc';


			ytlist[j++] = '|dreamers|telln_you_now_dreamers|https://www.youtube.com/watch?v=Qu3Yk_0oRy0&start_radio=1&list=RDQu3Yk_0oRy0';
			ytlist[j++] = '|dreamers|telln_you_now_dreamers|https://www.youtube.com/watch?v=Qu3Yk_0oRy0&start_radio=1&list=RDQu3Yk_0oRy0';


			ytlist[j++] = '|drezmers|hog4u|https://www.youtube.com/watch?v=911rMO4l0sA';
			ytlist[j++] = '|drezmers|hog4u|https://www.youtube.com/watch?v=911rMO4l0sA';


			ytlist[j++] = '|cher|sony_cher-gotubabe|https://www.youtube.com/watch?v=Vp2Du8j2_L0';
			ytlist[j++] = '|cher|sony_cher-gotubabe|https://www.youtube.com/watch?v=Vp2Du8j2_L0';


			ytlist[j++] = '|remR|Everybody Hurts (Live at Glastonbury 2003) HQ|http://www.youtube.com/watch?v=NLlOeGeVih4';
			ytlist[j++] = '|remR|Everybody Hurts (Live at Glastonbury 2003) HQ|http://www.youtube.com/watch?v=NLlOeGeVih4';


			ytlist[j++] = '|once|once_upontime_west|https://www.youtube.com/watch?v=kOy6M_X2MO8';
			ytlist[j++] = '|once|once_upontime_west|https://www.youtube.com/watch?v=kOy6M_X2MO8';


			ytlist[j++] = '|pale|procol_harme_litershade_denmark|https://www.youtube.com/watch?v=St6jyEFe5WM';
			ytlist[j++] = '|pale|procol_harme_litershade_denmark|https://www.youtube.com/watch?v=St6jyEFe5WM';


			ytlist[j++] = '|pale|Procol Harum Whiter Shade of Pale 2verses|http://www.youtube.com/watch?v=vIWCSrG1d-Y';
			ytlist[j++] = '|pale|Procol Harum Whiter Shade of Pale 2verses|http://www.youtube.com/watch?v=vIWCSrG1d-Y';


			ytlist[j++] = 'deadsouth| - In Hell I'll Be In Good Company|https://www.youtube.com/watch?v=B9FzVhw8_bY|';
			ytlist[j++] = 'deadsouth| - In Hell I'll Be In Good Company|https://www.youtube.com/watch?v=B9FzVhw8_bY|';
			ytlist[j++] = '|pale|shadofpale_ships|https://www.youtube.com/watch?v=PYBqv3NIqho';
			ytlist[j++] = '|pale|shadofpale_ships|https://www.youtube.com/watch?v=PYBqv3NIqho';


			ytlist[j++] = '|caro| nightlikethis|https://www.youtube.com/watch?v=Fc6izYdLhNE';
			ytlist[j++] = '|caro| nightlikethis|https://www.youtube.com/watch?v=Fc6izYdLhNE';


			ytlist[j++] = '|waits|time_cover_guitar|http://www.youtube.com/watch?v=uja4SHnfogo';
			ytlist[j++] = '|waits|time_cover_guitar|http://www.youtube.com/watch?v=uja4SHnfogo';


			ytlist[j++] = 'morrison|4seasons_back_on_top|https://www.youtube.com/watch?v=7fjTY_ABMj0&list=PL5A2209DE63BA79B8';
			ytlist[j++] = 'morrison|4seasons_back_on_top|https://www.youtube.com/watch?v=7fjTY_ABMj0&list=PL5A2209DE63BA79B8';


			ytlist[j++] = 'gurumal|delta_Delta Bayini|https://www.youtube.com/watch?v=oi6zbPjtO6I';
			ytlist[j++] = 'gurumal|delta_Delta Bayini|https://www.youtube.com/watch?v=oi6zbPjtO6I';


			ytlist[j++] = '|cohen|youb_you_got_me_singin|https://www.youtube.com/watch?v=3sFsT9vT6Fo';
			ytlist[j++] = '|cohen|youb_you_got_me_singin|https://www.youtube.com/watch?v=3sFsT9vT6Fo';


			ytlist[j++] = 'dreamers|iunderst|https://www.youtube.com/watch?v=yo-1Des8i5M&list=PL9DF20D3DD3895F1C&index=4';
			ytlist[j++] = 'dreamers|iunderst|https://www.youtube.com/watch?v=yo-1Des8i5M&list=PL9DF20D3DD3895F1C&index=4';


			ytlist[j++] = 'sledge|dark_end_of_the_street|https://www.youtube.com/watch?v=Gj3UdRmhgvM';
			ytlist[j++] = 'sledge|dark_end_of_the_street|https://www.youtube.com/watch?v=Gj3UdRmhgvM';


			ytlist[j++] = 'oesch|bavaria_yodl| https://www.youtube.com/watch?v=hVjNxV7qM90';
			ytlist[j++] = 'oesch|bavaria_yodl| https://www.youtube.com/watch?v=hVjNxV7qM90';


			ytlist[j++] = 'hagardlife_isgone2hellhttps://www.youtube.com/watch?v=iXPdB1ykWHE&start_radio=1&list=RDMMiXPdB1ykWHE';
			ytlist[j++] = 'hagardlife_isgone2hellhttps://www.youtube.com/watch?v=iXPdB1ykWHE&start_radio=1&list=RDMMiXPdB1ykWHE';


			ytlist[j++] = 'claypton|xmas| https://www.youtube.com/watch?v=R7iKUCWTNWc&list=RDR7iKUCWTNWc&start_radio=1';
			ytlist[j++] = 'claypton|xmas| https://www.youtube.com/watch?v=R7iKUCWTNWc&list=RDR7iKUCWTNWc&start_radio=1';


			ytlist[j++] = 'Guadalupe Pineda|Historia De Un Amor|https://www.youtube.com/watch?v=HzjE33U_gy8';
			ytlist[j++] = 'Guadalupe Pineda|Historia De Un Amor|https://www.youtube.com/watch?v=HzjE33U_gy8';


			ytlist[j++] = 'deadsouth|In Hell I'll Be In Good Company|https://www.youtube.com/watch?v=B9FzVhw8_bY';
			ytlist[j++] = 'deadsouth|In Hell I'll Be In Good Company|https://www.youtube.com/watch?v=B9FzVhw8_bY';


			ytlist[j++] = 'morisson|4seasons|https://www.youtube.com/watch?v=zbxUXAMUeGk&list=PLFCFB9B1A93E89756&index=10';
			ytlist[j++] = 'morisson|4seasons|https://www.youtube.com/watch?v=zbxUXAMUeGk&list=PLFCFB9B1A93E89756&index=10';


			ytlist[j++] = 'morisan|playhousedown|https://www.youtube.com/watch?v=b0jqe40gmH4&list=PLFCFB9B1A93E89756&index=5';
			ytlist[j++] = 'morisan|playhousedown|https://www.youtube.com/watch?v=b0jqe40gmH4&list=PLFCFB9B1A93E89756&index=5';


			ytlist[j++] = '|van_morison|end_ofthe_land|https://www.youtube.com/watch?v=dui7_N0g_VY&index=6&list=PLFCFB9B1A93E89756';
			ytlist[j++] = '|van_morison|end_ofthe_land|https://www.youtube.com/watch?v=dui7_N0g_VY&index=6&list=PLFCFB9B1A93E89756';


			ytlist[j++] = '|vanloss|stariway|https://www.youtube.com/watch?v=gCE0MapWKJ8&index=7&list=PLFCFB9B1A93E89756';
			ytlist[j++] = '|vanloss|stariway|https://www.youtube.com/watch?v=gCE0MapWKJ8&index=7&list=PLFCFB9B1A93E89756';


			ytlist[j++] = 'fureys|last lovesong| https://www.youtube.com/watch?v=yNFiD1ZQZLU';
			ytlist[j++] = 'fureys|last lovesong| https://www.youtube.com/watch?v=yNFiD1ZQZLU';


			ytlist[j++] = '|rush|cirlce_game|https://www.youtube.com/watch?v=q_C_rOOdXxs';
			ytlist[j++] = '|rush|cirlce_game|https://www.youtube.com/watch?v=q_C_rOOdXxs';


			ytlist[j++] = '|rush|circlgam2|https://www.youtube.com/watch?v=9yN-6PbqAPM';
			ytlist[j++] = '|rush|circlgam2|https://www.youtube.com/watch?v=9yN-6PbqAPM';


			ytlist[j++] = 'rush|remberbergame| https://www.youtube.com/watch?v=xMFtm02rgF0';
			ytlist[j++] = 'rush|remberbergame| https://www.youtube.com/watch?v=xMFtm02rgF0';


			ytlist[j++] = 'lucinda_williams|broken_butterflies|https://www.youtube.com/watch?v=gLQ23LLtKJk';
			ytlist[j++] = 'lucinda_williams|broken_butterflies|https://www.youtube.com/watch?v=gLQ23LLtKJk';




			ytlist[j++] = 'kou|python|https://www.youtube.com/watch?v=rfscVS0vtbw';
			ytlist[j++] = 'kou|python|https://www.youtube.com/watch?v=rfscVS0vtbw';


			ytlist[j++] = 'kou|blender28|https://www.youtube.com/watch?v=jBqYTgaFDxU';
			ytlist[j++] = 'kou|blender28|https://www.youtube.com/watch?v=jBqYTgaFDxU';


			ytlist[j++] = 'kou|html|https://www.youtube.com/watch?v=pQN-pnXPaVg';
			ytlist[j++] = 'kou|html|https://www.youtube.com/watch?v=pQN-pnXPaVg';


			ytlist[j++] = 'kou|sqlite3|https://www.youtube.com/watch?v=2eDKoXaJhPs';
			ytlist[j++] = 'kou|sqlite3|https://www.youtube.com/watch?v=2eDKoXaJhPs';




			ytlist[j++] = 'kou|visual_studio|https://www.youtube.com/watch?v=fnPhJHN0jTE';
			ytlist[j++] = 'kou|visual_studio|https://www.youtube.com/watch?v=fnPhJHN0jTE';


			ytlist[j++] = 'kou|visual_studio_py|https://www.youtube.com/watch?v=72Alzsz8RyI';
			ytlist[j++] = 'kou|visual_studio_py|https://www.youtube.com/watch?v=72Alzsz8RyI';




			ytlist[j++] = 'kou|php|https://www.youtube.com/watch?v=OK_JCtrrv-c';
			ytlist[j++] = 'kou|php|https://www.youtube.com/watch?v=OK_JCtrrv-c';


			ytlist[j++] = 'kou|tensor|https://www.youtube.com/watch?v=tYYVSEHq-io';
			ytlist[j++] = 'kou|tensor|https://www.youtube.com/watch?v=tYYVSEHq-io';


			ytlist[j++] = 'kou|go|https://www.youtube.com/watch?v=5PTXdR8hLlQ';
			ytlist[j++] = 'kou|go|https://www.youtube.com/watch?v=5PTXdR8hLlQ';


			ytlist[j++] = 'kou|vi|https://www.youtube.com/watch?v=HMpB28l1sLc';
			ytlist[j++] = 'kou|vi|https://www.youtube.com/watch?v=HMpB28l1sLc';


			ytlist[j++] = 'kou|tech_ingredients_speakers|https://www.youtube.com/watch?v=zdkyGDqU7xA';
			ytlist[j++] = 'kou|tech_ingredients_speakers|https://www.youtube.com/watch?v=zdkyGDqU7xA';


			ytlist[j++] = 'kou|tech_ingredients_labshop|https://www.youtube.com/watch?v=nZefdoHmtJo';
			ytlist[j++] = 'kou|tech_ingredients_labshop|https://www.youtube.com/watch?v=nZefdoHmtJo';


			ytlist[j++] = 'kou|tech_ingredients_magnetics|https://www.youtube.com/watch?v=LS3GQk9ETRU';
			ytlist[j++] = 'kou|tech_ingredients_magnetics|https://www.youtube.com/watch?v=LS3GQk9ETRU';


			ytlist[j++] = 'kou|3dprint|https://www.youtube.com/watch?v=3LBTkLsjHGQ';
			ytlist[j++] = 'kou|3dprint|https://www.youtube.com/watch?v=3LBTkLsjHGQ';


			ytlist[j++] = 'kou|concrete_canvas|https://www.youtube.com/watch?v=2eDKoXaJhPs';
			ytlist[j++] = 'kou|concrete_canvas|https://www.youtube.com/watch?v=2eDKoXaJhPs';


			ytlist[j++] = 'kou|concrete_canvas|https://www.youtube.com/watch?v=2eDKoXaJhPs';
			ytlist[j++] = 'kou|concrete_canvas|https://www.youtube.com/watch?v=2eDKoXaJhPs';


			alert( "BUGS_4715 ytlist len="+j );
			alert( "BUGS_4715 ytlist len="+j );
			}
			}


			</script id="script_ytlist_load" >
			</script id="script_ytlist_load" >




<!---
<!---
		<script id="script_dragable" type="text/javascript">
		<script id="script_dragable" type="text/javascript">


			$(document).ready(function() {
			$(document).ready(function() {
// sets the draggable
// sets the draggable
			$('#drag .drg').draggable({
			$('#drag .drg').draggable({
			    cursor: 'move',          // sets the cursor apperance
			    cursor: 'move',          // sets the cursor apperance
			    revert: 'valid'
			    revert: 'valid'
			  });
			  });




// sets droppable
// sets droppable
// after the draggable is droped, hides it with a hide() effect
// after the draggable is droped, hides it with a hide() effect
			  $('#drop').droppable({
			  $('#drop').droppable({
			    drop: function(event, ui) {
			    drop: function(event, ui) {
			      ui.draggable.hide(1000);
			      ui.draggable.hide(1000);


			    }
			    }
			  });
			  });


// after the draggable is droped, hides it with a hide() effect
// after the draggable is droped, hides it with a hide() effect
			  $('#drop1').droppable({
			  $('#drop1').droppable({
			    drop: function(event, ui) {
			    drop: function(event, ui) {
			      ui.draggable.hide(1000);
			      ui.draggable.hide(1000);
			    }
			    }
			  });
			  });


			  $('#drop2').droppable({
			  $('#drop2').droppable({
			    drop: function(event, ui) {
			    drop: function(event, ui) {
// after the draggable is droped, hides it with a hide() effect
// after the draggable is droped, hides it with a hide() effect
			      ui.draggable.hide(1000);
			      ui.draggable.hide(1000);
			    }
			    }
			  });
			  });


// when the "#sw" element (inside the "#drop") is clicked
// when the "#sw" element (inside the "#drop") is clicked
// show the items with class "drg", contained in "#drag"
// show the items with class "drg", contained in "#drag"
//   $('#drag .drg').slideDown(1000);
//   $('#drag .drg').slideDown(1000);
			  $('#drop #sw').click(function(){
			  $('#drop #sw').click(function(){
			   var url = "https://ka6//ko_center/ko_center.php?q=jqui/dragdrop1/"
			   var url = "https://ka6//ko_center/ko_center.php?q=jqui/dragdrop1/"
			   $(location).attr('href',url);
			   $(location).attr('href',url);
			  });
			  });
			});
			});
			</script>
			</script>
	-->
	-->
<!--
<!--


		<style type="text/css">
		<style type="text/css">
			#drop {
			#drop {
			 width:200px;
			 width:200px;
			 height:150px;
			 height:150px;
			 margin:3px auto;
			 margin:3px auto;
			 background:#eddaa8;
			 background:#eddaa8;
			 font-size:16px;
			 font-size:16px;
			}
			}
			#drop #sw { text-decoration:underline; cursor:pointer; }
			#drop #sw { text-decoration:underline; cursor:pointer; }
			#drag {
			#drag {
//			 width:450px;
//			 width:450px;
//			 height:180px;
//			 height:180px;
			 width:50px;
			 width:50px;
			 height:50px;
			 height:50px;


			 margin:12px auto;
			 margin:12px auto;
			 border:1px solid darkslategrey;
			 border:1px solid darkslategrey;
//			 border:1px solid silver;
//			 border:1px solid silver;
			 font-size:16px;
			 font-size:16px;
			}
			}
			#drag .drg { margin:10px 12px; }
			#drag .drg { margin:10px 12px; }
			#drag div.drg {
			#drag div.drg {
			 width:150px;
			 width:150px;
			 height:50px;
			 height:50px;
			 background:#07da08;
			 background:#07da08;
			 border:2px solid lightblue;
			 border:2px solid lightblue;
			}
			}
			</style>
			</style>
	-->
	-->






<!--
<!--
	<div name="div_dd" id="div_dd" hidden>
	<div name="div_dd" id="div_dd" hidden>
		<div id="drop">
		<div id="drop">
			<span id="sw"><h1>drop jtfinc</h2></span>
			<span id="sw"><h1>drop jtfinc</h2></span>
			<a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
			<a href=./ko_jtf/zm/jtf_parcels/jtfdc_theater.html target=_blank>
				<img height=200 width=300
				<img height=200 width=300
				src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
				src="/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.png" border=0 >
				</a>
				</a>
			</div>
			</div>
	-->
	-->
<!--
<!--
		<div id="drag" name="div_drag_jtfdc" > jtfdc:<br />
		<div id="drag" name="div_drag_jtfdc" > jtfdc:<br />
			<img src="/imgs/jtf/jtf_takes/jtf29_eagle_north.png" alt="jtf29_eagle_north" width="50" class="drg"/>
			<img src="/imgs/jtf/jtf_takes/jtf29_eagle_north.png" alt="jtf29_eagle_north" width="50" class="drg"/>
	
	
			<div class="drg"><h1>konet llc </h1>
			<div class="drg"><h1>konet llc </h1>
				<pre>timejask jkwii</pre>
				<pre>timejask jkwii</pre>
				<img class="drg" src="/imgs/btn/ko.png" alt="ko.png" width="50" >
				<img class="drg" src="/imgs/btn/ko.png" alt="ko.png" width="50" >
				<img class="drg" src="/imgs/btn/ok.png" alt="ok.png" width="50" >
				<img class="drg" src="/imgs/btn/ok.png" alt="ok.png" width="50" >
				<pre>timesak skwii</pre>
				<pre>timesak skwii</pre>
				</div>
				</div>
	
	
			<div class="drg"><h1>jtf29 </h1>
			<div class="drg"><h1>jtf29 </h1>
				<a href=./ko_jtf/zm/jtf_parcels/jtf29.html target=_blank>
				<a href=./ko_jtf/zm/jtf_parcels/jtf29.html target=_blank>
					<img height=200 width=100 src="/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.png" border=0 >
					<img height=200 width=100 src="/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.png" border=0 >
					</a>
					</a>
				</div>
				</div>
	
	
	
	
			<div class="drg"><h1>dogheads</h1>
			<div class="drg"><h1>dogheads</h1>
				<div id="div_jtf_vid5">
				<div id="div_jtf_vid5">
					<video controls="controls_jtf5" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index4_mp4.png">
					<video controls="controls_jtf5" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index4_mp4.png">
					<source src="/kb/v/doghead_video.mp4" type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">
					<source src="/kb/v/doghead_video.mp4" type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">
					</video>
					</video>
					</div>
					</div>
				</div>
				</div>
	
	
			<div class="drg"><h1>jtfdc night court lights action 3720</h1>
			<div class="drg"><h1>jtfdc night court lights action 3720</h1>
				<div id="div_vid">
				<div id="div_vid">
					<video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index_mp4.png">
					<video controls="controls" defaultmuted="" muted="true" style="width:320px;height:180px;" poster="index_mp4.png">
						<source src="index_avril.mp4" type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">
						<source src="index_avril.mp4" type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">
						<source src="index_avril.webm" type="video/webm;codecs=&quot;vp8, vorbis&quot;">
						<source src="index_avril.webm" type="video/webm;codecs=&quot;vp8, vorbis&quot;">
						</video>
						</video>
					</div>
					</div>
				</div>
				</div>
			</div id="drag" name="div_drag_jtfdc" > jtfdc:<br />
			</div id="drag" name="div_drag_jtfdc" > jtfdc:<br />
		</div>
		</div>
	-->
	-->


	<div id="myCanvas_jkwii" ></div> 
	<div id="myCanvas_jkwii" ></div> 


<!--
<!--
	<script id="script_js_bb_onload" type='text/javascript'>
	<script id="script_js_bb_onload" type='text/javascript'>
		window.onload = function() {
		window.onload = function() {
//			startup();
//			startup();
			var myCanvas = document.getElementById('myCanvas_jkwii');
			var myCanvas = document.getElementById('myCanvas_jkwii');
			var ctx = myCanvas.getContext('2d');
			var ctx = myCanvas.getContext('2d');


			myCanvas.width = window.innerWidth; myCanvas.height = window.innerHeight;
			myCanvas.width = window.innerWidth; myCanvas.height = window.innerHeight;
			myCanvas.width = window.innerWidth / 2; myCanvas.height = window.innerHeight / 2 ;
			myCanvas.width = window.innerWidth / 2; myCanvas.height = window.innerHeight / 2 ;
			ctx.fillStyle='black'
			ctx.fillStyle='black'
			ctx.fillStyle='white'
			ctx.fillStyle='white'
			ctx.fillStyle='blue'
			ctx.fillStyle='blue'
			ctx.fillRect(0, 0, myCanvas.width, myCanvas.height);
			ctx.fillRect(0, 0, myCanvas.width, myCanvas.height);
			}		
			}		
		</script id="script_js_bb_onload" >
		</script id="script_js_bb_onload" >


	<script id="script_js_bb_mouse" >
	<script id="script_js_bb_mouse" >
// Mouse Event Handlers
// Mouse Event Handlers
		if(myCanvas){
		if(myCanvas){
			var isDown = false;
			var isDown = false;
			var canvasX, canvasY;
			var canvasX, canvasY;
			ctx.lineWidth = 5;
			ctx.lineWidth = 5;
			
			
		
		
		$(myCanvas)
		$(myCanvas)
		.mousedown(function(e){
		.mousedown(function(e){
			isDown = true;
			isDown = true;
			ctx.beginPath();
			ctx.beginPath();
			canvasX = e.pageX - myCanvas.offsetLeft;
			canvasX = e.pageX - myCanvas.offsetLeft;
			canvasY = e.pageY - myCanvas.offsetTop;
			canvasY = e.pageY - myCanvas.offsetTop;
			ctx.moveTo(canvasX, canvasY);
			ctx.moveTo(canvasX, canvasY);
		})
		})
		.mousemove(function(e){
		.mousemove(function(e){
			if(isDown !== false) {
			if(isDown !== false) {
				canvasX = e.pageX - myCanvas.offsetLeft;
				canvasX = e.pageX - myCanvas.offsetLeft;
				canvasY = e.pageY - myCanvas.offsetTop;
				canvasY = e.pageY - myCanvas.offsetTop;
				ctx.lineTo(canvasX, canvasY);
				ctx.lineTo(canvasX, canvasY);
//				ctx.strokeStyle = '#000';
//				ctx.strokeStyle = '#000';
				ctx.strokeStyle = '#fff';
				ctx.strokeStyle = '#fff';


				ctx.stroke();
				ctx.stroke();
			}
			}
		})
		})
		.mouseup(function(e){
		.mouseup(function(e){
			isDown = false;
			isDown = false;
			ctx.closePath();
			ctx.closePath();
		});
		});
	}
	}
	
	
// Touch Events Handlers
// Touch Events Handlers
	draw = {
	draw = {
		started: false,
		started: false,
		start: function(evt) {
		start: function(evt) {
			
			
			ctx.beginPath();
			ctx.beginPath();
			ctx.moveTo(
			ctx.moveTo(
				evt.touches[0].pageX,
				evt.touches[0].pageX,
				evt.touches[0].pageY
				evt.touches[0].pageY
			);
			);
			
			
			this.started = true;
			this.started = true;


		},
		},
		move: function(evt) {
		move: function(evt) {
			
			
			if (this.started) {
			if (this.started) {
				ctx.lineTo(
				ctx.lineTo(
					evt.touches[0].pageX,
					evt.touches[0].pageX,
					evt.touches[0].pageY
					evt.touches[0].pageY
				);
				);
				
				
				ctx.strokeStyle = '#000';
				ctx.strokeStyle = '#000';
				ctx.lineWidth = 5;
				ctx.lineWidth = 5;
				ctx.stroke();
				ctx.stroke();
			}
			}
			
			
			},
			},
		end: function(evt) {
		end: function(evt) {
			this.started = false;
			this.started = false;
		}
		}
	};
	};
	
	
// Touch Events
// Touch Events
		myCanvas.addEventListener('touchstart', draw.start, false);
		myCanvas.addEventListener('touchstart', draw.start, false);
		myCanvas.addEventListener('touchend', draw.end, false);
		myCanvas.addEventListener('touchend', draw.end, false);
		myCanvas.addEventListener('touchmove', draw.move, false);
		myCanvas.addEventListener('touchmove', draw.move, false);
	
	
// Disable Page Move
// Disable Page Move
		document.body.addEventListener('touchmove',function(evt){
		document.body.addEventListener('touchmove',function(evt){
			evt.preventDefault();
			evt.preventDefault();
			},false);
			},false);
		};
		};
		</script id="script_js_bb_mouse" >
		</script id="script_js_bb_mouse" >


	<script id="script_js_bb">
	<script id="script_js_bb">
//		var c5 = document.getElementById("c5");
//		var c5 = document.getElementById("c5");
//		var c5_context = c5.getContext("2d");
//		var c5_context = c5.getContext("2d");
		var c5 = document.getElementById("myCanvas");
		var c5 = document.getElementById("myCanvas");
		var c5_context = c5.getContext("2d");
		var c5_context = c5.getContext("2d");
  
  
		var dragon = new Image();
		var dragon = new Image();
		dragon.src = 'dragon.png';
		dragon.src = 'dragon.png';
		var img = new Image();
		var img = new Image();
		img.src = 'dragon.png';
		img.src = 'dragon.png';
  
  
		function draw_img() {
		function draw_img() {
			c5_context.drawImage(img, 100, 5);
			c5_context.drawImage(img, 100, 5);
			}
			}
		</script id="script_js_bb">
		</script id="script_js_bb">




	<script id=script_mycanvas_write >
	<script id=script_mycanvas_write >
//		mycanvas_write( context, x, y, font, fontsize, fillstyle, text );
//		mycanvas_write( context, x, y, font, fontsize, fillstyle, text );
		function mycanvas_write( ctx, x, y, font, fontsize, fillstyle, text ) {
		function mycanvas_write( ctx, x, y, font, fontsize, fillstyle, text ) {
//			ctx.font = 'italic bold 30px sans-serif';
//			ctx.font = 'italic bold 30px sans-serif';
			ctx.fillStyle = 'white';
			ctx.fillStyle = 'white';
			ctx.fillStyle = 'black';
			ctx.fillStyle = 'black';
			ctx.fillStyle = "'" + fillstyle + "'";
			ctx.fillStyle = "'" + fillstyle + "'";
			ctx.fillStyle = fillstyle;
			ctx.fillStyle = fillstyle;
			ctx.font = 'italic bold 30px roman';
			ctx.font = 'italic bold 30px roman';
			ctx.font = 'italic bold 30px arial';
			ctx.font = 'italic bold 30px arial';
			ctx.font = 'italic bold 30px monospace';
			ctx.font = 'italic bold 30px monospace';
			ctx.font = 'italic bold 30px cursive';
			ctx.font = 'italic bold 30px cursive';
			ctx.font = 'italic bold 30px fantasy';
			ctx.font = 'italic bold 30px fantasy';
			ctx.font = 'italic bold 30px yokkmokkOT';
			ctx.font = 'italic bold 30px yokkmokkOT';
			ctx.font = 'bold 30px sans-serif';
			ctx.font = 'bold 30px sans-serif';
//			ctx.font = 'italic bold ' + fontsize + " " + font;
//			ctx.font = 'italic bold ' + fontsize + " " + font;
			ctx.font = '' + fontsize + " " + font;
			ctx.font = '' + fontsize + " " + font;
			ctx.textBaseline = 'bottom';
			ctx.textBaseline = 'bottom';
			ctx.fillText( text, x, y);
			ctx.fillText( text, x, y);
			}
			}


		function mycanvas_write0( ctx0, text, fillstyle, x, y ) {
		function mycanvas_write0( ctx0, text, fillstyle, x, y ) {
			ctx0.fillStyle = 'white';
			ctx0.fillStyle = 'white';
			ctx0.fillStyle = fillstyle;
			ctx0.fillStyle = fillstyle;
			ctx0.font = 'italic bold 30px yokkmokkOT';
			ctx0.font = 'italic bold 30px yokkmokkOT';
			ctx0.textBaseline = 'bottom';
			ctx0.textBaseline = 'bottom';
//			ctx0.fillText('timejak-0: jkwii', x, y);
//			ctx0.fillText('timejak-0: jkwii', x, y);
			ctx0.fillText( text, x, y);
			ctx0.fillText( text, x, y);
			}
			}
		</script id=script_mycanvas_write >
		</script id=script_mycanvas_write >
	-->
	-->


	<img src="/imgs/btn/koeye.png" onclick="script_ajax()">
	<img src="/imgs/btn/koeye.png" onclick="script_ajax()">
	<script id="script_ajax">
	<script id="script_ajax">
		php="index_ko.php";
		php="index_ko.php";
                db3="index_ko.db3";
                db3="index_ko.db3";
                sql="select * from list limit 5";
                sql="select * from list limit 5";
		script_ajax(php,db3,sql)
		script_ajax(php,db3,sql)
                function script_ajax(php, db3,sql) {
                function script_ajax(php, db3,sql) {
			alert( "BUGS_4895" )
			alert( "BUGS_4895" )
                        $("button").click(function(){
                        $("button").click(function(){
                                $.post( php, {
                                $.post( php, {
                                        db3: db3,
                                        db3: db3,
                                        sql: "select * from list limit 10"
                                        sql: "select * from list limit 10"
                                        },
                                        },
                                function(data, status){
                                function(data, status){
                                        line = data.split("\n");
                                        line = data.split("\n");
                                        htmout="";
                                        htmout="";
                                        for( z=0; z<line.length; z++ ) {
                                        for( z=0; z<line.length; z++ ) {
                                                htmout += "<a href="+line+" target=_blank>";
                                                htmout += "<a href="+line+" target=_blank>";
                                                htmout += "     <img src="+line+" border=0>";
                                                htmout += "     <img src="+line+" border=0>";
                                                htmout += "     </a>";
                                                htmout += "     </a>";
                                                }
                                                }
					getelementbyID('div_ajaxdb");
					getelementbyID('div_ajaxdb");
//                                      alert("BUGS_290 linelen=" + line.length + "\nStatus: " + status);
//                                      alert("BUGS_290 linelen=" + line.length + "\nStatus: " + status);
                                        document.write( htmout );
                                        document.write( htmout );
                                        });
                                        });
                              });
                              });
                        }
                        }
		</script id="script_ajax">
		</script id="script_ajax">


	<script id="script_kolines">
	<script id="script_kolines">
		function kolines(color,count,position) {
		function kolines(color,count,position) {
			var htmout = "";
			var htmout = "";
			img="/imgs/btn/kob.png";
			img="/imgs/btn/kob.png";
			if( color=="w" ) { img="/imgs/btn/kow.png"; }
			if( color=="w" ) { img="/imgs/btn/kow.png"; }
//			alert( "BUGS_kolines_beg color="+color+" count="+count+" img="+img );
//			alert( "BUGS_kolines_beg color="+color+" count="+count+" img="+img );


			for( j=1; j<=count; j++ ) {
			for( j=1; j<=count; j++ ) {
//				alert( "BUGS_kolines_loop color="+color+" count="+count+" img="+img );
//				alert( "BUGS_kolines_loop color="+color+" count="+count+" img="+img );
				htmout += '<img class="drg" height=20 src="'+img+'">';
				htmout += '<img class="drg" height=20 src="'+img+'">';
//				alert( "BUGS_kolines_loop j="+j+" color="+color+" count="+count+" htmout="+htmout );
//				alert( "BUGS_kolines_loop j="+j+" color="+color+" count="+count+" htmout="+htmout );
				}
				}


//			alert( "BUGS_kolines_end j="+j+" color="+color+" count="+count+" htmout="+htmout );
//			alert( "BUGS_kolines_end j="+j+" color="+color+" count="+count+" htmout="+htmout );
//			htmout += '<img src="/imgs/btn/kop34.png">';
//			htmout += '<img src="/imgs/btn/kop34.png">';


			if( color == 'b' ) {  
			if( color == 'b' ) {  
//				div_kolineb = document.getElementById('div_kolineb');
//				div_kolineb = document.getElementById('div_kolineb');
//				if( position == "bb" ) div_kolineb.insertAdjacentHTML('beforebegin', htmout);
//				if( position == "bb" ) div_kolineb.insertAdjacentHTML('beforebegin', htmout);
//				if( position == "ab" ) div_kolineb.insertAdjacentHTML('afterbegin', htmout);
//				if( position == "ab" ) div_kolineb.insertAdjacentHTML('afterbegin', htmout);
//				if( position == "be" ) div_kolineb.insertAdjacentHTML('beforeend', htmout);
//				if( position == "be" ) div_kolineb.insertAdjacentHTML('beforeend', htmout);
//				if( position == "ae" ) div_kolineb.insertAdjacentHTML('afterend', htmout);
//				if( position == "ae" ) div_kolineb.insertAdjacentHTML('afterend', htmout);
//				if( position == "ih" ) div_kolineb.innerHTML( htmout);
//				if( position == "ih" ) div_kolineb.innerHTML( htmout);


`j				if( position == "be" ) img_kolineb.insertAdjacentHTML('beforeend', htmout);
`j				if( position == "be" ) img_kolineb.insertAdjacentHTML('beforeend', htmout);
				if( position == "ae" ) img_kolineb.insertAdjacentHTML('afterend', htmout);
				if( position == "ae" ) img_kolineb.insertAdjacentHTML('afterend', htmout);
//				if( position == "ae" ) img_kolineb.insertAdjacentElement('afterend', htmout);
//				if( position == "ae" ) img_kolineb.insertAdjacentElement('afterend', htmout);
				}
				}
			if( color == 'w' ) {
			if( color == 'w' ) {
//				div_kolinew = document.getElementById('div_kolinew');
//				div_kolinew = document.getElementById('div_kolinew');
//				if( position == "bb" ) div_kolineb.insertAdjacentHTML('beforebegin', htmout);
//				if( position == "bb" ) div_kolineb.insertAdjacentHTML('beforebegin', htmout);
//				if( position == "ab" ) div_kolineb.insertAdjacentHTML('afterbegin', htmout);
//				if( position == "ab" ) div_kolineb.insertAdjacentHTML('afterbegin', htmout);
//				if( position == "be" ) div_kolineb.insertAdjacentHTML('beforeend', htmout);
//				if( position == "be" ) div_kolineb.insertAdjacentHTML('beforeend', htmout);
//				if( position == "ae" ) div_kolineb.insertAdjacentHTML('afterend', htmout);
//				if( position == "ae" ) div_kolineb.insertAdjacentHTML('afterend', htmout);
//				if( position == "ih" ) div_kolineb.innerHTML( htmout);
//				if( position == "ih" ) div_kolineb.innerHTML( htmout);


				img_kolinew = document.getElementById('img_kolinew' );
				img_kolinew = document.getElementById('img_kolinew' );
				if( position == "bb" ) img_kolineb.insertAdjacentHTML('beforebegin', htmout);
				if( position == "bb" ) img_kolineb.insertAdjacentHTML('beforebegin', htmout);
				if( position == "ab" ) img_kolineb.insertAdjacentHTML('afterbegin', htmout);
				if( position == "ab" ) img_kolineb.insertAdjacentHTML('afterbegin', htmout);
				if( position == "be" ) img_kolineb.insertAdjacentHTML('beforeend', htmout);
				if( position == "be" ) img_kolineb.insertAdjacentHTML('beforeend', htmout);
				if( position == "ae" ) img_kolineb.insertAdjacentHTML('afterend', htmout);
				if( position == "ae" ) img_kolineb.insertAdjacentHTML('afterend', htmout);
				}
				}
			}
			}
		</script id="script_kolines">
		</script id="script_kolines">






	<hr color=white>
	<hr color=white>
	<hr color=black>
	<hr color=black>


	<div id="drag" name="div_drag_2>
	<div id="drag" name="div_drag_2>
<!--
<!--
		<img src="/imgs/btn/kob.png" onclick="kolines('b','1','bb' )" >
		<img src="/imgs/btn/kob.png" onclick="kolines('b','1','bb' )" >
		<img src="/imgs/btn/kob.png" onclick="kolines('b','1','ab' )" >
		<img src="/imgs/btn/kob.png" onclick="kolines('b','1','ab' )" >
		<img src="/imgs/btn/kob.png" onclick="kolines('b','1','ih' )" >
		<img src="/imgs/btn/kob.png" onclick="kolines('b','1','ih' )" >
		<img src="/imgs/btn/kop12.png" onclick="kolines('b','3','ae" )" >
		<img src="/imgs/btn/kop12.png" onclick="kolines('b','3','ae" )" >
		<img src="/imgs/btn/kop34.png" onclick="kolines('b','3','bb" )" >
		<img src="/imgs/btn/kop34.png" onclick="kolines('b','3','bb" )" >
	-->
	-->


		<img  height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','256','bb' )" >
		<img  height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','256','bb' )" >
		<img  height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','16','bb' )" >
		<img  height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','16','bb' )" >
		<img  height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','8','bb' )" >
		<img  height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','8','bb' )" >
		<img  height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','4','bb' )" >
		<img  height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','4','bb' )" >
		<img  height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','2','bb' )" >
		<img  height=25 src="/imgs/btn/kop34.png" onclick="kolines('b','2','bb' )" >
		<img  height=25 src="/imgs/btn/kob.png" onclick="kolines('b','1','bb' )" >
		<img  height=25 src="/imgs/btn/kob.png" onclick="kolines('b','1','bb' )" >
		<img  height=25 src="/imgs/btn/kob.png" onclick="kolines('b','1','ae' )" >
		<img  height=25 src="/imgs/btn/kob.png" onclick="kolines('b','1','ae' )" >
		<img  height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','2','ae' )" >
		<img  height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','2','ae' )" >
		<img  height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','4','ae' )" >
		<img  height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','4','ae' )" >
		<img  height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','8','ae' )" >
		<img  height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','8','ae' )" >
		<img  height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','16','ae' )" >
		<img  height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','16','ae' )" >
		<img  height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','256','ae' )" >
		<img  height=25 src="/imgs/btn/kop12.png" onclick="kolines('b','256','ae' )" >
		</div id="drag" name="div_drag_2>
		</div id="drag" name="div_drag_2>


		<hr color=black>
		<hr color=black>
		<div id="div_kolineb">
		<div id="div_kolineb">
			<img id="img_kolineb" height=30 class="drg" src="/imgs/btn/kop12.png">
			<img id="img_kolineb" height=30 class="drg" src="/imgs/btn/kop12.png">
			</div id="div_kolineb">
			</div id="div_kolineb">
		<div id="div_kolinew">
		<div id="div_kolinew">
			<img id="img_kolinew" height=30 class="drg" src="/imgs/btn/kop34.png">
			<img id="img_kolinew" height=30 class="drg" src="/imgs/btn/kop34.png">
			</div id="div_kolinew">
			</div id="div_kolinew">
		<hr color=white>
		<hr color=white>


		<img  height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','2','bb' )" >
		<img  height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','2','bb' )" >
		<img  height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','4','bb' )" >
		<img  height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','4','bb' )" >
		<img  height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','8','bb' )" >
		<img  height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','8','bb' )" >
		<img  height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','16','bb' )" >
		<img  height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','16','bb' )" >
		<img  height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','256','bb' )" >
		<img  height=25 src="/imgs/btn/kop34.png" onclick="kolines('w','256','bb' )" >


		<img  height=25 src="/imgs/btn/kow.png" onclick="kolines('w','1','bb' )" >
		<img  height=25 src="/imgs/btn/kow.png" onclick="kolines('w','1','bb' )" >
		<img  height=25 src="/imgs/btn/kow.png" onclick="kolines('w','1','ae' )" >
		<img  height=25 src="/imgs/btn/kow.png" onclick="kolines('w','1','ae' )" >


		<img  height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','2','ae' )" >
		<img  height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','2','ae' )" >
		<img  height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','4','ae' )" >
		<img  height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','4','ae' )" >
		<img  height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','8','ae' )" >
		<img  height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','8','ae' )" >
		<img  height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','16','ae' )" >
		<img  height=25 src="/imgs/btn/kop12.png" onclick="kolines('w','16','ae' )" >
		<img height=25  src="/imgs/btn/kop12.png" onclick="kolines('w','256','ae' )" >
		<img height=25  src="/imgs/btn/kop12.png" onclick="kolines('w','256','ae' )" >
<!--
<!--
		<img src="/imgs/btn/kow.png" onclick="kolines('w','1','be' )" >
		<img src="/imgs/btn/kow.png" onclick="kolines('w','1','be' )" >
		<img src="/imgs/btn/kow.png" onclick="kolines('w','1','ab' )" >
		<img src="/imgs/btn/kow.png" onclick="kolines('w','1','ab' )" >
		<img src="/imgs/btn/kow.png" onclick="kolines('w','1','ih' )" >
		<img src="/imgs/btn/kow.png" onclick="kolines('w','1','ih' )" >
	-->
	-->
		</div>
		</div>
<br><br><br><br>
<br><br><br><br>


	<hr color=black>
	<hr color=black>
	<hr color=white>
	<hr color=white>


	<div id="div_sllist" >
	<div id="div_sllist" >
		<h3>div_sllist</h3>
		<h3>div_sllist</h3>
		</div id="div_sllist" >
		</div id="div_sllist" >




	<script id="script_bugs" >
	<script id="script_bugs" >
		function script_bugs(bugid) {
		function script_bugs(bugid) {
			alert( "BUGS_5033 script_bugs="+bugid );
			alert( "BUGS_5033 script_bugs="+bugid );
			}
			}
		</script id="script_bugs" >
		</script id="script_bugs" >




<!--
<!--
	<img src="/imgs/btn/koeye_handhither.gif" onclick="script_bugs('')">
	<img src="/imgs/btn/koeye_handhither.gif" onclick="script_bugs('')">
	<img src="/imgs/btn/koeyew.png" onclick="script_bugs('aaaaaaaaaaa' )" >
	<img src="/imgs/btn/koeyew.png" onclick="script_bugs('aaaaaaaaaaa' )" >
	<img src="/imgs/btn/koeyeb.png" onclick="script_bugs('bbbbbbbbbbbbb' )" >
	<img src="/imgs/btn/koeyeb.png" onclick="script_bugs('bbbbbbbbbbbbb' )" >
	<img src="/imgs/btn/koeye.png" onclick="script_bugs('ccccccccccccc')" >
	<img src="/imgs/btn/koeye.png" onclick="script_bugs('ccccccccccccc')" >
	<img src="/imgs/btn/koeyew.png" onclick="script_slist_show()" >
	<img src="/imgs/btn/koeyew.png" onclick="script_slist_show()" >
	-->
	-->






	<script id="script_sllist_load">
	<script id="script_sllist_load">
		function script_sllist_load() {
		function script_sllist_load() {
			alert( "BUGS_5107 script_sllist_load" );
			alert( "BUGS_5107 script_sllist_load" );
			sllist = new Array();
			sllist = new Array();
			z = 0;
			z = 0;
			sllist[z++] = 'sllist1';
			sllist[z++] = 'sllist1';
			sllist[z++] = 'sllist2';
			sllist[z++] = 'sllist2';
			sllist[z++] = 'sllist3';
			sllist[z++] = 'sllist3';
			sllist[z++] = 'sllist4';
			sllist[z++] = 'sllist4';
			sllist[z++] = 'sllist5';
			sllist[z++] = 'sllist5';
			sllist[z++] = 'sllist6';
			sllist[z++] = 'sllist6';
			sllist[z++] = 'sllist7';
			sllist[z++] = 'sllist7';
			sllist[z++] = 'sllist8';
			sllist[z++] = 'sllist8';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  2185047 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_mishramtt.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  2185047 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_mishramtt.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  217386 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_CV-QIWEI_GAN13.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  217386 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_CV-QIWEI_GAN13.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  155421 Jan 25 22:28 kb/pdf/pdf_20190126/kou_20190125_2400_Quantum4Computing_Objectives.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  155421 Jan 25 22:28 kb/pdf/pdf_20190126/kou_20190125_2400_Quantum4Computing_Objectives.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  2431124 Jan 25 22:16 kb/pdf/pdf_20190126/kou_20190125_2400_Understand TensorFlow by mimicking its API from scratch.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  2431124 Jan 25 22:16 kb/pdf/pdf_20190126/kou_20190125_2400_Understand TensorFlow by mimicking its API from scratch.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  87940 Jan 25 22:13 kb/pdf/pdf_20190126/kou_20190125_2400_QiweisWebHome.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  87940 Jan 25 22:13 kb/pdf/pdf_20190126/kou_20190125_2400_QiweisWebHome.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  664332 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_eaav2761.full.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  664332 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_eaav2761.full.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  639706 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_12-Yu-L-14344.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  639706 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_12-Yu-L-14344.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  5532791 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_1808.02893.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  5532791 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_1808.02893.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  271394 Jan 25 22:11 kb/pdf/pdf_20190126/kou_20190125_2400_Qgan-com.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  271394 Jan 25 22:11 kb/pdf/pdf_20190126/kou_20190125_2400_Qgan-com.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  2760245 Jan 25 22:10 kb/pdf/pdf_20190126/kou_20190125_2400_qgan.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  2760245 Jan 25 22:10 kb/pdf/pdf_20190126/kou_20190125_2400_qgan.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  1568055 Jan 25 21:01 kb/pdf/pdf_20190126/dmo_20190125_2400_Couple_reveal_how_van_life_isnt_always_glamorous.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  1568055 Jan 25 21:01 kb/pdf/pdf_20190126/dmo_20190125_2400_Couple_reveal_how_van_life_isnt_always_glamorous.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  2540304 Jan 25 20:58 kb/pdf/pdf_20190126/dmo_20190125_2400_Hubble_lostlight_ image-deepest_ever_view_universe.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  2540304 Jan 25 20:58 kb/pdf/pdf_20190126/dmo_20190125_2400_Hubble_lostlight_ image-deepest_ever_view_universe.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  2275653 Jan 25 20:49 kb/pdf/pdf_20190126/dmo_20190125_2400_Google_AI_beats_professional_players_at_deepmind_ StarCraftII.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  2275653 Jan 25 20:49 kb/pdf/pdf_20190126/dmo_20190125_2400_Google_AI_beats_professional_players_at_deepmind_ StarCraftII.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  233994 Jan 25 20:42 kb/pdf/pdf_20190126/dmo_20190125_2400_Cuban_ghosttown_chocolate_baron_Milton_Hershey .pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  233994 Jan 25 20:42 kb/pdf/pdf_20190126/dmo_20190125_2400_Cuban_ghosttown_chocolate_baron_Milton_Hershey .pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  246402 Jun  9  2018 kb/pdf/pdf_20190126/wiki_rocksoup.pdf';
			sllist[z++] = '-rw-r--r--@ 1 konet  staff  246402 Jun  9  2018 kb/pdf/pdf_20190126/wiki_rocksoup.pdf';
			sllist[z++] = '-rw-r--r--  1 konet  staff  208180 Apr  8  2015 kb/books/Atlas_1931/IMG_3851.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  208180 Apr  8  2015 kb/books/Atlas_1931/IMG_3851.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  208180 Apr  8  2015 kb/books/Atlas_1931/IMG_3851.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  208180 Apr  8  2015 kb/books/Atlas_1931/IMG_3851.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  180223 Apr  8  2015 kb/books/Atlas_1931/IMG_3852.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  180223 Apr  8  2015 kb/books/Atlas_1931/IMG_3852.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  170251 Apr  8  2015 kb/books/Atlas_1931/IMG_3853.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  170251 Apr  8  2015 kb/books/Atlas_1931/IMG_3853.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  157741 Apr  8  2015 kb/books/Atlas_1931/IMG_3854.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  157741 Apr  8  2015 kb/books/Atlas_1931/IMG_3854.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  231492 Apr  8  2015 kb/books/Atlas_1931/IMG_3855.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  231492 Apr  8  2015 kb/books/Atlas_1931/IMG_3855.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  225773 Apr  8  2015 kb/books/Atlas_1931/IMG_3856.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  225773 Apr  8  2015 kb/books/Atlas_1931/IMG_3856.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  285875 Apr  8  2015 kb/books/Atlas_1931/IMG_3857.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  285875 Apr  8  2015 kb/books/Atlas_1931/IMG_3857.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  303677 Apr  8  2015 kb/books/Atlas_1931/IMG_3858.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  303677 Apr  8  2015 kb/books/Atlas_1931/IMG_3858.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  286921 Apr  8  2015 kb/books/Atlas_1931/IMG_3859.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  286921 Apr  8  2015 kb/books/Atlas_1931/IMG_3859.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  327242 Apr  8  2015 kb/books/Atlas_1931/IMG_3860.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  327242 Apr  8  2015 kb/books/Atlas_1931/IMG_3860.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  305251 Apr  8  2015 kb/books/Atlas_1931/IMG_3861.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  305251 Apr  8  2015 kb/books/Atlas_1931/IMG_3861.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  275734 Apr  8  2015 kb/books/Atlas_1931/IMG_3862.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  275734 Apr  8  2015 kb/books/Atlas_1931/IMG_3862.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  306566 Apr  8  2015 kb/books/Atlas_1931/IMG_3863.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  306566 Apr  8  2015 kb/books/Atlas_1931/IMG_3863.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  295127 Apr  8  2015 kb/books/Atlas_1931/IMG_3864.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  295127 Apr  8  2015 kb/books/Atlas_1931/IMG_3864.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  346338 Apr  8  2015 kb/books/Atlas_1931/IMG_3865.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  346338 Apr  8  2015 kb/books/Atlas_1931/IMG_3865.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  307752 Apr  8  2015 kb/books/Atlas_1931/IMG_3866.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  307752 Apr  8  2015 kb/books/Atlas_1931/IMG_3866.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  268685 Apr  8  2015 kb/books/Atlas_1931/IMG_3867.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  268685 Apr  8  2015 kb/books/Atlas_1931/IMG_3867.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  276633 Apr  8  2015 kb/books/Atlas_1931/IMG_3868.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  276633 Apr  8  2015 kb/books/Atlas_1931/IMG_3868.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  278776 Apr  8  2015 kb/books/Atlas_1931/IMG_3869.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  278776 Apr  8  2015 kb/books/Atlas_1931/IMG_3869.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  312322 Apr  8  2015 kb/books/Atlas_1931/IMG_3870.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  312322 Apr  8  2015 kb/books/Atlas_1931/IMG_3870.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  293924 Apr  8  2015 kb/books/Atlas_1931/IMG_3871.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  293924 Apr  8  2015 kb/books/Atlas_1931/IMG_3871.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  314761 Apr  8  2015 kb/books/Atlas_1931/IMG_3872.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  314761 Apr  8  2015 kb/books/Atlas_1931/IMG_3872.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  319755 Apr  8  2015 kb/books/Atlas_1931/IMG_3873.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  319755 Apr  8  2015 kb/books/Atlas_1931/IMG_3873.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  260878 Apr  8  2015 kb/books/Atlas_1931/IMG_3874.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  260878 Apr  8  2015 kb/books/Atlas_1931/IMG_3874.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  282075 Apr  8  2015 kb/books/Atlas_1931/IMG_3875.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  282075 Apr  8  2015 kb/books/Atlas_1931/IMG_3875.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  347889 Apr  8  2015 kb/books/Atlas_1931/IMG_3876.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  347889 Apr  8  2015 kb/books/Atlas_1931/IMG_3876.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  187358 Mar 31  2015 kb/books/music/Theory/IMG_7247.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  187358 Mar 31  2015 kb/books/music/Theory/IMG_7247.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  233375 Mar 31  2015 kb/books/music/Theory/IMG_7248.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  233375 Mar 31  2015 kb/books/music/Theory/IMG_7248.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  216447 Mar 31  2015 kb/books/music/Theory/IMG_7249.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  216447 Mar 31  2015 kb/books/music/Theory/IMG_7249.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  216059 Mar 31  2015 kb/books/music/Theory/IMG_7250.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  216059 Mar 31  2015 kb/books/music/Theory/IMG_7250.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  222009 Mar 31  2015 kb/books/music/Theory/IMG_7251.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  222009 Mar 31  2015 kb/books/music/Theory/IMG_7251.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  213330 Mar 31  2015 kb/books/music/Theory/IMG_7252.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  213330 Mar 31  2015 kb/books/music/Theory/IMG_7252.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  199485 Mar 31  2015 kb/books/music/Theory/IMG_7253.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  199485 Mar 31  2015 kb/books/music/Theory/IMG_7253.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  239114 Mar 31  2015 kb/books/music/Theory/IMG_7254.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  239114 Mar 31  2015 kb/books/music/Theory/IMG_7254.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  162254 Mar 31  2015 kb/books/music/Theory/IMG_7255.JPG';
			sllist[z++] = '-rw-r--r--  1 konet  staff  162254 Mar 31  2015 kb/books/music/Theory/IMG_7255.JPG';
//			alert( "BUGS_10895 script_sllist_load len="+sllist.length );
//			alert( "BUGS_10895 script_sllist_load len="+sllist.length );
			return( sllist );
			return( sllist );
			}
			}
		</script id="script_sllist_load">
		</script id="script_sllist_load">


	<script id="script_pdflist_load">
	<script id="script_pdflist_load">
		function script_pdflist_load() {
		function script_pdflist_load() {
			pdflist = new Array();
			pdflist = new Array();
			z = 0;
			z = 0;
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  2185047 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_mishramtt.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  2185047 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_mishramtt.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  217386 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_CV-QIWEI_GAN13.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  217386 Jan 25 22:32 kb/pdf/pdf_20190126/kou_20190125_2400_CV-QIWEI_GAN13.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  155421 Jan 25 22:28 kb/pdf/pdf_20190126/kou_20190125_2400_Quantum4Computing_Objectives.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  155421 Jan 25 22:28 kb/pdf/pdf_20190126/kou_20190125_2400_Quantum4Computing_Objectives.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  2431124 Jan 25 22:16 kb/pdf/pdf_20190126/kou_20190125_2400_Understand TensorFlow by mimicking its API from scratch.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  2431124 Jan 25 22:16 kb/pdf/pdf_20190126/kou_20190125_2400_Understand TensorFlow by mimicking its API from scratch.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  87940 Jan 25 22:13 kb/pdf/pdf_20190126/kou_20190125_2400_QiweisWebHome.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  87940 Jan 25 22:13 kb/pdf/pdf_20190126/kou_20190125_2400_QiweisWebHome.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  664332 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_eaav2761.full.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  664332 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_eaav2761.full.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  639706 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_12-Yu-L-14344.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  639706 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_2400_12-Yu-L-14344.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  5532791 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_1808.02893.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  5532791 Jan 25 22:12 kb/pdf/pdf_20190126/kou_20190125_1808.02893.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  271394 Jan 25 22:11 kb/pdf/pdf_20190126/kou_20190125_2400_Qgan-com.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  271394 Jan 25 22:11 kb/pdf/pdf_20190126/kou_20190125_2400_Qgan-com.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  2760245 Jan 25 22:10 kb/pdf/pdf_20190126/kou_20190125_2400_qgan.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  2760245 Jan 25 22:10 kb/pdf/pdf_20190126/kou_20190125_2400_qgan.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  1568055 Jan 25 21:01 kb/pdf/pdf_20190126/dmo_20190125_2400_Couple_reveal_how_van_life_isnt_always_glamorous.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  1568055 Jan 25 21:01 kb/pdf/pdf_20190126/dmo_20190125_2400_Couple_reveal_how_van_life_isnt_always_glamorous.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  2540304 Jan 25 20:58 kb/pdf/pdf_20190126/dmo_20190125_2400_Hubble_lostlight_ image-deepest_ever_view_universe.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  2540304 Jan 25 20:58 kb/pdf/pdf_20190126/dmo_20190125_2400_Hubble_lostlight_ image-deepest_ever_view_universe.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  2275653 Jan 25 20:49 kb/pdf/pdf_20190126/dmo_20190125_2400_Google_AI_beats_professional_players_at_deepmind_ StarCraftII.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  2275653 Jan 25 20:49 kb/pdf/pdf_20190126/dmo_20190125_2400_Google_AI_beats_professional_players_at_deepmind_ StarCraftII.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  233994 Jan 25 20:42 kb/pdf/pdf_20190126/dmo_20190125_2400_Cuban_ghosttown_chocolate_baron_Milton_Hershey .pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  233994 Jan 25 20:42 kb/pdf/pdf_20190126/dmo_20190125_2400_Cuban_ghosttown_chocolate_baron_Milton_Hershey .pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  246402 Jun  9  2018 kb/pdf/pdf_20190126/wiki_rocksoup.pdf';
			pdflist[z++] = '-rw-r--r--@ 1 konet  staff  246402 Jun  9  2018 kb/pdf/pdf_20190126/wiki_rocksoup.pdf';
//			alert( "BUGS_10925 script_pdflist_load len="+pdflist.length );
//			alert( "BUGS_10925 script_pdflist_load len="+pdflist.length );
			return( pdflist );
			return( pdflist );
			}
			}
		</script id="script_pdflist_load">
		</script id="script_pdflist_load">


<!--
<!--
	<script id="script_startup2" >
	<script id="script_startup2" >
		function startup2( url ) {
		function startup2( url ) {
//			url="index.html";
//			url="index.html";
			alert( "BUGS_10930_startup" );
			alert( "BUGS_10930_startup" );
			htmout="htmout";
			htmout="htmout";
			img="/imgs/btn/koeye.gif";
			img="/imgs/btn/koeye.gif";
			imgurl="/imgs/btn/koeye_handhither.gif"; 
			imgurl="/imgs/btn/koeye_handhither.gif"; 
			if( urlexists(url)) { img=imgurl; }
			if( urlexists(url)) { img=imgurl; }


			htmout += '<a href="'+url+'" target=_blank class="drag" id="drg">
			htmout += '<a href="'+url+'" target=_blank class="drag" id="drg">
			htmout += '	<img src="'+img+'" border=0>";
			htmout += '	<img src="'+img+'" border=0>";
			htmout += '	<span><img src="'+img+'" border=0></span>';
			htmout += '	<span><img src="'+img+'" border=0></span>';
			htmout += '	</a>';
			htmout += '	</a>';
			document.write( htmout );
			document.write( htmout );
			alert("BUGS_10934_startup isurl="+isurl(url) );
			alert("BUGS_10934_startup isurl="+isurl(url) );
			}
			}
		</script>
		</script>
	-->
	-->


	<script id="script_isurl">
	<script id="script_isurl">
		function isurl(url) {
		function isurl(url) {
			$.get(url).done(function() { 
			$.get(url).done(function() { 
					return("ok");
					return("ok");
				}).fail(function() { 
				}).fail(function() { 
					return("ko");
					return("ko");
				})
				})
			}
			}
		</script id="script_isurl">
		</script id="script_isurl">


	<script id="script_urlexists">
	<script id="script_urlexists">
		function urlexists(url) {
		function urlexists(url) {
			var http = new XMLHttpRequest();
			var http = new XMLHttpRequest();
			http.open('HEAD', url, false);
			http.open('HEAD', url, false);
			http.send();
			http.send();
			return http.status!=404;
			return http.status!=404;
			}
			}
		</script id="script_urlexists">
		</script id="script_urlexists">


	<script id="script_mth2mm">
	<script id="script_mth2mm">
		function mth2mm(mth) {
		function mth2mm(mth) {
			if( mth == "Jan" ) return("01");
			if( mth == "Jan" ) return("01");
			if( mth == "Feb" ) return("02");
			if( mth == "Feb" ) return("02");
			if( mth == "Mar" ) return("03");
			if( mth == "Mar" ) return("03");
			if( mth == "Apr" ) return("04");
			if( mth == "Apr" ) return("04");
			if( mth == "May" ) return("05");
			if( mth == "May" ) return("05");
			if( mth == "Jun" ) return("06");
			if( mth == "Jun" ) return("06");
			if( mth == "Jul" ) return("07");
			if( mth == "Jul" ) return("07");
			if( mth == "Aug" ) return("08");
			if( mth == "Aug" ) return("08");
			if( mth == "Sep" ) return("09");
			if( mth == "Sep" ) return("09");
			if( mth == "Oct" ) return("10");
			if( mth == "Oct" ) return("10");
			if( mth == "Nov" ) return("11");
			if( mth == "Nov" ) return("11");
			if( mth == "Dec" ) return("12");
			if( mth == "Dec" ) return("12");
			return( "00" );
			return( "00" );
			}
			}
		</script id="script_mth2mm">
		</script id="script_mth2mm">
		
		
	<script id="script_unique">
	<script id="script_unique">
		function unique() {
		function unique() {
			alert( "BUGS_11334 unique" );
			alert( "BUGS_11334 unique" );
			}
			}
		function uniquelist(list) {
		function uniquelist(list) {
			alert( "BUGS_11336 uniquelist" );
			alert( "BUGS_11336 uniquelist" );
			for (i = 0; i<list.length; i++) {
			for (i = 0; i<list.length; i++) {
				for (j=i+1; j<list.length; j++) {
				for (j=i+1; j<list.length; j++) {
					if (list[i] == list[j]) {
					if (list[i] == list[j]) {
						list.splice(j, 1);
						list.splice(j, 1);
						j--;
						j--;
						}
						}
					}
					}
				}
				}
			}
			}
		</script id="script_unique">
		</script id="script_unique">


	<script id="script_file2array" >
	<script id="script_file2array" >
			script_file2array(url) {
			script_file2array(url) {
				if( urlexists(url) ) {
				if( urlexists(url) ) {
					alert( BUGS_11350 FOUND urlexists="+url );
					alert( BUGS_11350 FOUND urlexists="+url );
					}
					}
				else {
				else {
					alert( BUGS_11351 NOTFOUND urlexists="+url );
					alert( BUGS_11351 NOTFOUND urlexists="+url );
					}
					}
//				$.ajax({
//				$.ajax({
////					url: "/kb/csv/sl.csv",
////					url: "/kb/csv/sl.csv",
////					url: "/kb/csv/sl.csv",
////					url: "/kb/csv/sl.csv",
////					url: "sl.csv",
////					url: "sl.csv",
//					url: url,
//					url: url,
//					async: false,
//					async: false,
//					success: function(csvd) {
//					success: function(csvd) {
//						kolist = $.csv.toArrays(csvd);
//						kolist = $.csv.toArrays(csvd);
//						},
//						},
//
//
//					dataType: "text",
//					dataType: "text",
//// call a function on complete 
//// call a function on complete 
//					complete: function () {
//					complete: function () {
//						alert( "BUGS_11363 ajax rul="+url+" kolist="+kolist );
//						alert( "BUGS_11363 ajax rul="+url+" kolist="+kolist );
////						script_kolist_load(kolist);
////						script_kolist_load(kolist);
//						script_kolist_show(kolist);
//						script_kolist_show(kolist);
//						}
//						}
//					});
//					});
				}
				}
		</script id="script_file2array" >
		</script id="script_file2array" >


<!--	<script id="script_async_sljs" src="sl.js" async></script> -->
<!--	<script id="script_async_sljs" src="sl.js" async></script> -->
	<script id="script_requestcsv" >
	<script id="script_requestcsv" >
		function callback() {
		function callback() {
			alert( "BUGS_11480 callback" );
			alert( "BUGS_11480 callback" );
			}
			}
//		var foo = requestCSV("sl.csv",drawlines(lines)); 
//		var foo = requestCSV("sl.csv",drawlines(lines)); 
//		var foo = requestCSV("sl.csv",script_kolist(kolist)); 
//		var foo = requestCSV("sl.csv",script_kolist(kolist)); 
////		function requestCSV(f,c){return new csvajax(f,c);};
////		function requestCSV(f,c){return new csvajax(f,c);};
		filecsv="sl.csv";
		filecsv="sl.csv";
		function csvajax(filecsv,callback) {
		function csvajax(filecsv,callback) {
			alert( "BUGS_11383 script_requestcsv filepath="+filepath+" callback="+callback );
			alert( "BUGS_11383 script_requestcsv filepath="+filepath+" callback="+callback );
//			this.request = new XMLHttpRequest();
//			this.request = new XMLHttpRequest();
//			this.request.timeout = 10000;
//			this.request.timeout = 10000;
//			this.request.open("GET", filepath, true);
//			this.request.open("GET", filepath, true);
//			this.request.parent = this;
//			this.request.parent = this;
//			this.callback = callback;
//			this.callback = callback;
//			this.request.onload = function() {
//			this.request.onload = function() {
//				var d = this.response.split('\n'); /*1st separator*/
//				var d = this.response.split('\n'); /*1st separator*/
//				var i = d.length;
//				var i = d.length;
//				while(i--) {
//				while(i--) {
//					if(d[i] !== "")
//					if(d[i] !== "")
//						d[i] = d[i].split(','); /*2nd separator*/
//						d[i] = d[i].split(','); /*2nd separator*/
//					else
//					else
//						d.splice(i,1);
//						d.splice(i,1);
//					}
//					}
//					this.parent.response = d;
//					this.parent.response = d;
//					if(typeof this.parent.callback !== "undefined")
//					if(typeof this.parent.callback !== "undefined")
//						this.parent.callback(d);
//						this.parent.callback(d);
//						};
//						};
//					this.request.send();
//					this.request.send();
					};
					};
		</script id="script_requestcsv" >
		</script id="script_requestcsv" >


<!--
<!--
	<script id="script_db32array" >
	<script id="script_db32array" >
////		function script_db2array("sl.db3", "select * from kolist where koid='koid'" ) {
////		function script_db2array("sl.db3", "select * from kolist where koid='koid'" ) {
////		function script_db2array("/kb/db3/sl.db3", "/kb/sql/sl.sql" ) {
////		function script_db2array("/kb/db3/sl.db3", "/kb/sql/sl.sql" ) {
//		function script_db2array( db3, sql ) {
//		function script_db2array( db3, sql ) {
//			var dblist = new Array();
//			var dblist = new Array();
//			alert( "BUGS_11400 script_db2array db3="+db3+" sql="+sql+" dblist="+dblist );
//			alert( "BUGS_11400 script_db2array db3="+db3+" sql="+sql+" dblist="+dblist );
//			return( dblist );
//			return( dblist );
//			}
//			}


//		filedb3="sl.db3";
//		filedb3="sl.db3";
//		filepsv="sl.psv";
//		filepsv="sl.psv";
//		tblnam="sl";
//		tblnam="sl";
//		$rr=exec("sqlite3 filedb3 \".separator '|'\" ");
//		$rr=exec("sqlite3 filedb3 \".separator '|'\" ");
//		$rr=exec("sqlite3 filedb3 \".import filepsv tblnam\" ");
//		$rr=exec("sqlite3 filedb3 \".import filepsv tblnam\" ");
//		$rr= exec ("sqlite3 filedb3 \"pragma encoding = 'utf-8'\" ");
//		$rr= exec ("sqlite3 filedb3 \"pragma encoding = 'utf-8'\" ");
//		$rr=exec("sqlite3 filedb3 \".separator '|'\" && sqlite3 fildb3 \"pragma encoding = 'utf-8'\"   && sqlite3 filedb3 \".import filepsv tablename\" ");
//		$rr=exec("sqlite3 filedb3 \".separator '|'\" && sqlite3 fildb3 \"pragma encoding = 'utf-8'\"   && sqlite3 filedb3 \".import filepsv tablename\" ");
		</script>
		</script>
	-->
	-->


<!-- Create the database -->
<!-- Create the database -->
<!--
<!--
	<script id="script_sqljs_include" src='js/sql.js'></script>
	<script id="script_sqljs_include" src='js/sql.js'></script>
	<script id="script_sqljs">
	<script id="script_sqljs">
		function script_sqljs() {
		function script_sqljs() {
			var db = new SQL.Database();
			var db = new SQL.Database();


// Run a query without reading the results
// Run a query without reading the results
			db.run("CREATE TABLE test (col1, col2);");
			db.run("CREATE TABLE test (col1, col2);");


// Insert two rows: (1,111) and (2,222)
// Insert two rows: (1,111) and (2,222)
			db.run("INSERT INTO test VALUES (?,?), (?,?)", [1,111,2,222]);
			db.run("INSERT INTO test VALUES (?,?), (?,?)", [1,111,2,222]);


// Prepare a statement
// Prepare a statement
			var stmt = db.prepare("SELECT * FROM test WHERE a BETWEEN $start AND $end");
			var stmt = db.prepare("SELECT * FROM test WHERE a BETWEEN $start AND $end");
			stmt.getAsObject({$start:1, $end:1}); // {col1:1, col2:111}
			stmt.getAsObject({$start:1, $end:1}); // {col1:1, col2:111}


// Bind new values
// Bind new values
			stmt.bind({$start:1, $end:2});
			stmt.bind({$start:1, $end:2});
			while(stmt.step()) { //
			while(stmt.step()) { //
				var row = stmt.getAsObject();
				var row = stmt.getAsObject();
// [...] do something with the row of result
// [...] do something with the row of result
				}
				}
			}
			}
		</script>
		</script>
	-->
	-->
	<a href=+ class="popover" >
	<a href=+ class="popover" >
		<img src="/imgs/btn/kb.png" onclick="script_startup('timejak_startup')">
		<img src="/imgs/btn/kb.png" onclick="script_startup('timejak_startup')">
		<span><img src="/imgs/btn/kw.png" onclick="script_startup('timejak_startup')"></span>
		<span><img src="/imgs/btn/kw.png" onclick="script_startup('timejak_startup')"></span>
		</a>
		</a>
	<script id="script_startup" >
	<script id="script_startup" >
		function script_startup( msg ) {
		function script_startup( msg ) {
			alert( "BUGS_6200 script_startup msg="+msg );
			alert( "BUGS_6200 script_startup msg="+msg );


			}
			}
		</script id="script_startup" >
		</script id="script_startup" >


<!--	<div id="div_balls_n_cubes_btn"> -->
<!--	<div id="div_balls_n_cubes_btn"> -->


	<div id="div_kobuttonset" >
	<div id="div_kobuttonset" >
	<a href=+ class="popover" >
	<a href=+ class="popover" >
		<img  height=50 src="/imgs/btn/koeye.png" onclick="script_koeye_b('5400')">
		<img  height=50 src="/imgs/btn/koeye.png" onclick="script_koeye_b('5400')">
		<span><img height=50 src="/imgs/btn/koeyeb.png" onclick="script_koeye_b('5400')"></span>
		<span><img height=50 src="/imgs/btn/koeyeb.png" onclick="script_koeye_b('5400')"></span>
		</a>
		</a>


	<a href=+ class="popover" >
	<a href=+ class="popover" >
		<img  height=50 src="/imgs/btn/koeyeb.png" onclick="script_koeyeb_w('5400')">
		<img  height=50 src="/imgs/btn/koeyeb.png" onclick="script_koeyeb_w('5400')">
		<span><img height=50 src="/imgs/btn/koeyew.png" onclick="script_koeye_bw('5400')"></span>
		<span><img height=50 src="/imgs/btn/koeyew.png" onclick="script_koeye_bw('5400')"></span>
		</a>
		</a>




	<a href=+ class="popover" >
	<a href=+ class="popover" >
		<img  height=50 src="/imgs/btn/kobubble_b1.png" onclick="script_bubble('5400')">
		<img  height=50 src="/imgs/btn/kobubble_b1.png" onclick="script_bubble('5400')">
		<span><img height=50 src="/imgs/btn/kobubblew.png" onclick="script_bubble('5400')"></span>
		<span><img height=50 src="/imgs/btn/kobubblew.png" onclick="script_bubble('5400')"></span>
		</a>
		</a>




	<a href=+ class="popover" >
	<a href=+ class="popover" >
		<img  height=50 src="/imgs/btn/koeyew.png" onclick="script_koeyew_b('5500')">
		<img  height=50 src="/imgs/btn/koeyew.png" onclick="script_koeyew_b('5500')">
		<span><img height=50 src="/imgs/btn/koeyeb.png" onclick="script_koeyew_b('5400')"></span>
		<span><img height=50 src="/imgs/btn/koeyeb.png" onclick="script_koeyew_b('5400')"></span>
		</a>
		</a>




	<a href=+ class="popover" >
	<a href=+ class="popover" >
		<img  height=50 src="/imgs/btn/koeye.png" onclick="script_koeye_w('5400')">
		<img  height=50 src="/imgs/btn/koeye.png" onclick="script_koeye_w('5400')">
		<span><img height=50 src="/imgs/btn/koeyew.png" onclick="script_koeye_w('5400')"></span>
		<span><img height=50 src="/imgs/btn/koeyew.png" onclick="script_koeye_w('5400')"></span>
		</a>
		</a>




	<a href=+ class="popover" >
	<a href=+ class="popover" >
		<img src="/imgs/btn/kw.png" onclick="script_kw('timejak_shutdown')">
		<img src="/imgs/btn/kw.png" onclick="script_kw('timejak_shutdown')">
		<span><img src="/imgs/btn/kb.png" onclick="script_kw('timejak_shutdown')"></span>
		<span><img src="/imgs/btn/kb.png" onclick="script_kw('timejak_shutdown')"></span>
		</a>
		</a>
		</div id="div_kobuttonset" >
		</div id="div_kobuttonset" >






	<div id="div_ajax2php_form" class="drg" >
	<div id="div_ajax2php_form" class="drg" >
		<form id="comment">
		<form id="comment">
			<input type="text" id="userInput" name="comment" placeholder="needdb3data4me" /></input>
			<input type="text" id="userInput" name="comment" placeholder="needdb3data4me" /></input>
			<input type="submit" value="Submit" /></input>
			<input type="submit" value="Submit" /></input>
			</form>
			</form>
		</div id="div_ajax2php_form" >
		</div id="div_ajax2php_form" >




<!--
<!--
	<button onclice="script_ajax2php">script_ajax2php</button>
	<button onclice="script_ajax2php">script_ajax2php</button>
	-->
	-->


<script id="script_ajax2php">
<script id="script_ajax2php">
	function script_ajax2php () {
	function script_ajax2php () {
		alert( "BUGS_5396 script_ajax2php" );
		alert( "BUGS_5396 script_ajax2php" );


// Stop the form from being submitted the standard way
// Stop the form from being submitted the standard way
		$("#comment").on('submit', function(e) {
		$("#comment").on('submit', function(e) {
			e.preventDefault();
			e.preventDefault();


// Put the user's input into a variable
// Put the user's input into a variable
			var userInput = $('#userInput').val();
			var userInput = $('#userInput').val();


// Do some validation of the data if needed
// Do some validation of the data if needed
// ...
// ...




// Perform AJAX request (a.k.a send the data to the server)
// Perform AJAX request (a.k.a send the data to the server)
// There are many parameters one can use here
// There are many parameters one can use here
// Browse the documentation to get familiar with the most useful ones
// Browse the documentation to get familiar with the most useful ones
			$.ajax({
			$.ajax({
				url: 'index_zm.php',  		// The PHP script that will handle the request
				url: 'index_zm.php',  		// The PHP script that will handle the request
				db3 = "index_zm.db3",
				db3 = "index_zm.db3",
				sql: "select * from list",
				sql: "select * from list",
				type: 'POST',         		// This can be set to GET, but in this case we'd use POST
				type: 'POST',         		// This can be set to GET, but in this case we'd use POST
				data: { 
				data: { 
					db3: sql,
					db3: sql,
					sql: sql,
					sql: sql,
					 }, 	// "comment" will result in $_POST['comment'], and userInput is the value of it
					 }, 	// "comment" will result in $_POST['comment'], and userInput is the value of it


// If the script returns a 200 status (meaning the request was successful)
// If the script returns a 200 status (meaning the request was successful)
// The data variable will be the response from the PHP script
// The data variable will be the response from the PHP script
// Depending on what you are going to do with the data returned,
// Depending on what you are going to do with the data returned,
// you may want to ensure it is returned as valid JSON
// you may want to ensure it is returned as valid JSON
				success: function(data) {
				success: function(data) {
					alert( "BUGS ajaxphp MSG data="+data );
					alert( "BUGS ajaxphp MSG data="+data );
					},
					},


// The request failed - So something here
// The request failed - So something here
				error: function() {
				error: function() {
					alert( "BUGS ajaxphp ERR data="+data );
					alert( "BUGS ajaxphp ERR data="+data );
					}
					}
				});
				});


			});
			});
		}
		}
		</script id="script_ajax2php">
		</script id="script_ajax2php">




		<button type="button" onclick="balls_n_cubes('/imgs/btn/ok.png')">balls_n_cubes</button> 
		<button type="button" onclick="balls_n_cubes('/imgs/btn/ok.png')">balls_n_cubes</button> 


		<button onclick="showFillText();return true;">filltxt</button>
		<button onclick="showFillText();return true;">filltxt</button>
		<button onclick="showStrokeText();return true;">stroketxt</button>
		<button onclick="showStrokeText();return true;">stroketxt</button>
		<button onclick="Clear_text();return true;">cleartxt</button>
		<button onclick="Clear_text();return true;">cleartxt</button>


		<button onclick="draw_dragon();return true;">dragon</button>
		<button onclick="draw_dragon();return true;">dragon</button>
		<button onclick="draw_smaller_dragon();return true;">dragonette</button>
		<button onclick="draw_smaller_dragon();return true;">dragonette</button>
		<button onclick="draw_dragon_head();return true;">draghead</button>
		<button onclick="draw_dragon_head();return true;">draghead</button>
		<button onclick="Clear_image();return true;">clearimg</button>
		<button onclick="Clear_image();return true;">clearimg</button>
<!-- orphan div		</div>  -->
<!-- orphan div		</div>  -->






	<div id="div_canvas_balls" style="background:tan; position:relative; width:800px; height:120px">
	<div id="div_canvas_balls" style="background:tan; position:relative; width:800px; height:120px">
		<canvas id="layer1"
		<canvas id="layer1"
			style="z-index: 1;
			style="z-index: 1;
			position:absolute;
			position:absolute;
			left:0px;
			left:0px;
			top:0px;
			top:0px;
			" height="100px" width="800">
			" height="100px" width="800">
			unauthorized access logged
			unauthorized access logged
			</canvas>
			</canvas>
		<canvas id="layer2"
		<canvas id="layer2"
			style="z-index: 2;
			style="z-index: 2;
			position:absolute;
			position:absolute;
			left:0px;
			left:0px;
			top:0px;
			top:0px;
			" height="100px" width="800">
			" height="100px" width="800">
			unauthorized access logged
			unauthorized access logged
			</canvas>
			</canvas>
		<canvas id="layer3"
		<canvas id="layer3"
			style="z-index: 3;
			style="z-index: 3;
			position:absolute;
			position:absolute;
			left:0px;
			left:0px;
			top:0px;
			top:0px;
			" height="100px" width="800">
			" height="100px" width="800">
			unauthorized access logged
			unauthorized access logged
			</canvas>
			</canvas>


		<canvas id="layer4"
		<canvas id="layer4"
			style="z-index: 4;
			style="z-index: 4;
			position:absolute;
			position:absolute;
			left:0px;
			left:0px;
			top:0px;
			top:0px;
			" height="100px" width="800">
			" height="100px" width="800">
			unauthorized access logged b
			unauthorized access logged b
			</canvas>
			</canvas>
		<canvas id="layer5"
		<canvas id="layer5"
			style="z-index: 5;
			style="z-index: 5;
			position:absolute;
			position:absolute;
			left:0px;
			left:0px;
			top:0px;
			top:0px;
			" height="100px" width="800">
			" height="100px" width="800">
			unauthorized access logged
			unauthorized access logged
			</canvas>
			</canvas>
		<canvas id="layer6"
		<canvas id="layer6"
			style="z-index: 6;
			style="z-index: 6;
			position:absolute;
			position:absolute;
			left:0px;
			left:0px;
			top:0px;
			top:0px;
			" height="100px" width="800">
			" height="100px" width="800">
			unauthorized access logged
			unauthorized access logged
			</canvas>
			</canvas>
		<canvas id="layer7"
		<canvas id="layer7"
			style="z-index: 7;
			style="z-index: 7;
			position:absolute;
			position:absolute;
			left:0px;
			left:0px;
			top:0px;
			top:0px;
			" height="100px" width="800">
			" height="100px" width="800">
			unauthorized access logged
			unauthorized access logged
			</canvas>
			</canvas>
			</div>
			</div>
		</div id="div_canvas_balls" >
		</div id="div_canvas_balls" >








	<script id="script_canvas_balls_n_cubes_w" type="text/javascript">
	<script id="script_canvas_balls_n_cubes_w" type="text/javascript">
		var layer1; var layer2; var layer3;
		var layer1; var layer2; var layer3;
		var layer4; var layer5; var layer6; var layer7; 
		var layer4; var layer5; var layer6; var layer7; 
		var layer_b; var layer_w; var layer_i; var layer_t; 
		var layer_b; var layer_w; var layer_i; var layer_t; 


		var ctx1; var ctx2; var ctx3;
		var ctx1; var ctx2; var ctx3;
		var ctx_b; var ctx_w; var ctx_i; var ctx_t;
		var ctx_b; var ctx_w; var ctx_i; var ctx_t;
		var x = 800; var y = 100; var dx = 2; var dy = 4;
		var x = 800; var y = 100; var dx = 2; var dy = 4;
		var b_x = 800; var b_y = 100; var b_dx = 2; var b_dy = 4;
		var b_x = 800; var b_y = 100; var b_dx = 2; var b_dy = 4;
		var w_x = 800; var w_y = 100; var w_dx = 2; var w_dy = 4;
		var w_x = 800; var w_y = 100; var w_dx = 2; var w_dy = 4;
		var i_x = 800; var i_y = 100; var i_dx = 2; var i_dy = 4;
		var i_x = 800; var i_y = 100; var i_dx = 2; var i_dy = 4;
		var t_x = 800; var t_y = 100; var t_dx = 2; var t_dy = 4;
		var t_x = 800; var t_y = 100; var t_dx = 2; var t_dy = 4;


		var WIDTH = 800;
		var WIDTH = 800;
		var HEIGHT = 100;
		var HEIGHT = 100;


		var city = new Image();
		var city = new Image();
		var city_b = new Image();
		var city_b = new Image();
		var city_w = new Image();
		var city_w = new Image();
		var img_b = new Image();
		var img_b = new Image();
		var img_w = new Image();
		var img_w = new Image();
		var gif = new Image();
		var gif = new Image();
		var img = new Image();
		var img = new Image();
		var txt = new Image();
		var txt = new Image();
		img_new = new Image();
		img_new = new Image();


		img_mask = new Image();
		img_mask = new Image();
		img_mask_w = new Image();
		img_mask_w = new Image();
		img_mask_b = new Image();
		img_mask_b = new Image();
		img_mask_ko = new Image();
		img_mask_ko = new Image();
		img_mask_kow = new Image();
		img_mask_kow = new Image();
		img_mask_kob = new Image();
		img_mask_kob = new Image();
		img_mask_koeye = new Image();
		img_mask_koeye = new Image();
		img_mask_koeyew = new Image();
		img_mask_koeyew = new Image();
		img_mask_koeyeb = new Image();
		img_mask_koeyeb = new Image();


		myimg="";
		myimg="";
		myimg="/imgs/btn/koeye_handhi.gif";		
		myimg="/imgs/btn/koeye_handhi.gif";		
		myimg="/imgs/btn/koeye_handhither.gif";		
		myimg="/imgs/btn/koeye_handhither.gif";		
		balls_n_cubes( myimg );
		balls_n_cubes( myimg );


	function showFillText() {
	function showFillText() {
		ctx_t.fillStyle = '#f00';
		ctx_t.fillStyle = '#f00';
		ctx_t.fillStyle = 'yellow';
		ctx_t.fillStyle = 'yellow';
//		ctx_t.font = 'italic bold 30px sans-serif';
//		ctx_t.font = 'italic bold 30px sans-serif';
		ctx_t.font = 'italic bold 40px yokkmokkOT';
		ctx_t.font = 'italic bold 40px yokkmokkOT';
  		ctx_t.textBaseline = 'bottom';
  		ctx_t.textBaseline = 'bottom';
  		ctx_t.fillText('timejaks: jkwii is here', 50, 100);
  		ctx_t.fillText('timejaks: jkwii is here', 50, 100);
		}
		}
  
  
	function showStrokeText() {
	function showStrokeText() {
		ctx_t.strokeStyle = "#003300";
		ctx_t.strokeStyle = "#003300";
		ctx_t.font = '40px san-serif';
		ctx_t.font = '40px san-serif';
		ctx_t.textBaseline = 'bottom';
		ctx_t.textBaseline = 'bottom';
		ctx_t.strokeText('timejaks jkwii is us', 300, 100);
		ctx_t.strokeText('timejaks jkwii is us', 300, 100);
		}
		}
  
  
// textBaseline top,hanging,middle,alphabetic,ideographic,bottom default: alphabetic
// textBaseline top,hanging,middle,alphabetic,ideographic,bottom default: alphabetic
	function Clear_text() {
	function Clear_text() {
		ctx_t.textBaseline = "top";
		ctx_t.textBaseline = "top";
		ctx_t.fillText('Top', 5, 100); 
		ctx_t.fillText('Top', 5, 100); 
		ctx_t.textBaseline = "bottom"; 
		ctx_t.textBaseline = "bottom"; 
		ctx_t.fillText('Bottom', 80, 100); 
		ctx_t.fillText('Bottom', 80, 100); 
		ctx_t.textBaseline = "middle"; 
		ctx_t.textBaseline = "middle"; 
		ctx_t.fillText('Middle', 200, 100); 
		ctx_t.fillText('Middle', 200, 100); 
		ctx_t.textBaseline = "alphabetic"; 
		ctx_t.textBaseline = "alphabetic"; 
		ctx_t.fillText('Alphabetic', 300, 100); 
		ctx_t.fillText('Alphabetic', 300, 100); 
		ctx_t.textBaseline = "hanging"; 
		ctx_t.textBaseline = "hanging"; 
		ctx_t.fillText('Hanging', 400, 100); 
		ctx_t.fillText('Hanging', 400, 100); 
		ctx_t.clearRect(1, 1, 600, 300);
		ctx_t.clearRect(1, 1, 600, 300);
		} 
		} 


//		var c5 = document.getElementById("c5");
//		var c5 = document.getElementById("c5");
//		var c5_context = c5.getContext("2d");
//		var c5_context = c5.getContext("2d");
  
  
		var dragon = new Image();
		var dragon = new Image();
		dragon.src = '/imgs/btn/dragon.png';
		dragon.src = '/imgs/btn/dragon.png';
  
  
		function draw_dragon() {
		function draw_dragon() {
			ctx_i.drawImage(dragon, 100, 5);
			ctx_i.drawImage(dragon, 100, 5);
			}
			}
  
  
		function draw_smaller_dragon() {
		function draw_smaller_dragon() {
			ctx_i.drawImage(dragon, 10, 5, 58, 100);
			ctx_i.drawImage(dragon, 10, 5, 58, 100);
			}
			}
  
  
		function draw_dragon_head() {
		function draw_dragon_head() {
			ctx_i.drawImage(dragon, 0, 19, 69, 97, 300, 100, 103, 145);
			ctx_i.drawImage(dragon, 0, 19, 69, 97, 300, 100, 103, 145);
			}
			}
  
  
		function Clear_image() {
		function Clear_image() {
			ctx_i.clearRect(1, 1, 600, 300);
			ctx_i.clearRect(1, 1, 600, 300);
			} 
			} 








	function balls_n_cubes(myimg) {
	function balls_n_cubes(myimg) {
//		alert( "BUGS_5780 myimg="+myimg );		
//		alert( "BUGS_5780 myimg="+myimg );		
		imgs_new = new Array(); z=0;
		imgs_new = new Array(); z=0;
		imgs_new[z++] = "/imgs/btn/koeye_handhi.gif";
		imgs_new[z++] = "/imgs/btn/koeye_handhi.gif";
		imgs_new[z++] = "/imgs/btn/ko.png";
		imgs_new[z++] = "/imgs/btn/ko.png";
		imgs_new[z++] = "/imgs/btn/ok.png";
		imgs_new[z++] = "/imgs/btn/ok.png";
		imgs_new[z++] = "/imgs/btn/koeyew.png";
		imgs_new[z++] = "/imgs/btn/koeyew.png";
		imgs_new[z++] = "/imgs/btn/koeyeb.png";
		imgs_new[z++] = "/imgs/btn/koeyeb.png";
		imgs_new[z++] = "/imgs/btn/koeye.png";
		imgs_new[z++] = "/imgs/btn/koeye.png";
		imgs_new[z++] = "/imgs/btn/koeye_handhither.gif";
		imgs_new[z++] = "/imgs/btn/koeye_handhither.gif";
//		alert( "BUGS_5790 myimg="+myimg );		
//		alert( "BUGS_5790 myimg="+myimg );		
		if( myimg == "" ) {
		if( myimg == "" ) {
//			alert( "BUGS_5791 OLD myimg="+myimg );		
//			alert( "BUGS_5791 OLD myimg="+myimg );		
//			img_new.src = myimg;
//			img_new.src = myimg;
//			img_new.src = "/imgs/btn/ko.png";
//			img_new.src = "/imgs/btn/ko.png";
			img_new.src = "/imgs/btn/koeye_handhither.gif";
			img_new.src = "/imgs/btn/koeye_handhither.gif";
			img_new.src = "/imgs/btn/koeye_handhi.gif";
			img_new.src = "/imgs/btn/koeye_handhi.gif";
			}
			}
		else {
		else {
//			alert( "BUGS_5792 NEW myimg="+myimg );		
//			alert( "BUGS_5792 NEW myimg="+myimg );		
//			img_new.src = "/imgs/btn/ok.png";
//			img_new.src = "/imgs/btn/ok.png";
			img_new.src = "/imgs/btn/koeye_handhither.gif";
			img_new.src = "/imgs/btn/koeye_handhither.gif";
			img_new.src = myimg;
			img_new.src = myimg;
			}
			}
		return( img_new );
		return( img_new );
		}
		}


//	function init() {
//	function init() {
//	myimg = "/imgs/btn/ko.png";
//	myimg = "/imgs/btn/ko.png";
//	myimg = "";
//	myimg = "";
	function init_balls_n_cubes(myimg) {
	function init_balls_n_cubes(myimg) {
//		alert( "BUGS_5810 balls_n_cubes myimg="+myimg );
//		alert( "BUGS_5810 balls_n_cubes myimg="+myimg );
		city.src ="/imgs/btn/koeye.png";
		city.src ="/imgs/btn/koeye.png";
		city_b.src ="/imgs/btn/koeyeb.png";
		city_b.src ="/imgs/btn/koeyeb.png";
		city_w.src ="/imgs/btn/koeyew.png";
		city_w.src ="/imgs/btn/koeyew.png";


		img.src ="/imgs/btn/kob.png";
		img.src ="/imgs/btn/kob.png";
		txt.src ="/imgs/btn/kow.png";
		txt.src ="/imgs/btn/kow.png";
		img_b.src ="/imgs/btn/koeyeb.png";
		img_b.src ="/imgs/btn/koeyeb.png";
		img_w.src ="/imgs/btn/koeyew.png";
		img_w.src ="/imgs/btn/koeyew.png";


		img_mask.src ="/imgs/btn/kob.png";
		img_mask.src ="/imgs/btn/kob.png";
		img_mask_w.src ="/imgs/btn/kob.png";
		img_mask_w.src ="/imgs/btn/kob.png";
		img_mask_b.src ="/imgs/btn/kob.png";
		img_mask_b.src ="/imgs/btn/kob.png";
		img_mask_koeye.src = "/imgs/btn/koeye_mask.png";
		img_mask_koeye.src = "/imgs/btn/koeye_mask.png";
		img_mask_koeyew.src = "/imgs/btn/koeyew_mask.png";
		img_mask_koeyew.src = "/imgs/btn/koeyew_mask.png";
		img_mask_koeyeb.src = "/imgs/btn/koeyeb_mask.png";
		img_mask_koeyeb.src = "/imgs/btn/koeyeb_mask.png";
		img_mask_ko.src = "/imgs/btn/ko_mask.png";
		img_mask_ko.src = "/imgs/btn/ko_mask.png";
		img_mask_kow.src = "/imgs/btn/kow_mask.png";
		img_mask_kow.src = "/imgs/btn/kow_mask.png";
		img_mask_kob.src = "/imgs/btn/kob_mask.png";
		img_mask_kob.src = "/imgs/btn/kob_mask.png";




		gif.src = "/imgs/btn/koeye_handhither.gif";
		gif.src = "/imgs/btn/koeye_handhither.gif";
//		gif.src = "/imgs/btn/ok.png";
//		gif.src = "/imgs/btn/ok.png";
//		img_new = balls_n_cubes('');
//		img_new = balls_n_cubes('');
//		img_new = balls_n_cubes(myimg);
//		img_new = balls_n_cubes(myimg);
		gif.src = img_new.src;
		gif.src = img_new.src;


		layer1 = document.getElementById("layer1");
		layer1 = document.getElementById("layer1");
		ctx1 = layer1.getContext("2d");
		ctx1 = layer1.getContext("2d");
		layer2 = document.getElementById("layer2");
		layer2 = document.getElementById("layer2");
		ctx2 = layer2.getContext("2d");
		ctx2 = layer2.getContext("2d");
		layer3 = document.getElementById("layer3");
		layer3 = document.getElementById("layer3");
		ctx3 = layer3.getContext("2d");
		ctx3 = layer3.getContext("2d");


		layer4 = document.getElementById("layer4");
		layer4 = document.getElementById("layer4");
		ctx_b = layer4.getContext("2d");
		ctx_b = layer4.getContext("2d");
		layer5 = document.getElementById("layer5");
		layer5 = document.getElementById("layer5");
		ctx_w = layer5.getContext("2d");
		ctx_w = layer5.getContext("2d");
		layer6 = document.getElementById("layer6");
		layer6 = document.getElementById("layer6");
		ctx_i = layer6.getContext("2d");
		ctx_i = layer6.getContext("2d");
		layer7 = document.getElementById("layer7");
		layer7 = document.getElementById("layer7");
		ctx_t = layer7.getContext("2d");
		ctx_t = layer7.getContext("2d");


		setInterval(drawAll, 20);
		setInterval(drawAll, 20);
		}
		}


	function draw1() {
	function draw1() {
		ctx1.clearRect(0, 0, WIDTH, HEIGHT);
		ctx1.clearRect(0, 0, WIDTH, HEIGHT);
		ctx1.fillStyle = "#FAF7F8";
		ctx1.fillStyle = "#FAF7F8";
		ctx1.fillStyle = "darkslaegrey";
		ctx1.fillStyle = "darkslaegrey";
		ctx1.beginPath();
		ctx1.beginPath();
		ctx1.rect(0,0,WIDTH,HEIGHT);
		ctx1.rect(0,0,WIDTH,HEIGHT);
		ctx1.closePath();
		ctx1.closePath();
		ctx1.fill();
		ctx1.fill();
		ctx1.fillStyle = "#444444";
		ctx1.fillStyle = "#444444";
//		ctx1.fillStyle = "yellow";
//		ctx1.fillStyle = "yellow";
		ctx1.beginPath();
		ctx1.beginPath();
		ctx1.arc(x, y, 10, 0, Math.PI*2, true);
		ctx1.arc(x, y, 10, 0, Math.PI*2, true);
		ctx1.closePath();
		ctx1.closePath();
		ctx1.fill();
		ctx1.fill();
		
		
		if (x + dx > WIDTH || x + dx < 0) dx = -dx;
		if (x + dx > WIDTH || x + dx < 0) dx = -dx;
		if (y + dy > HEIGHT || y + dy < 0) dy = -dy;
		if (y + dy > HEIGHT || y + dy < 0) dy = -dy;
		
		
		x += dx;
		x += dx;
		y += dy;
		y += dy;
		}
		}






	function draw_b() {
	function draw_b() {
		ctx_b.clearRect(0, 0, WIDTH, HEIGHT);
		ctx_b.clearRect(0, 0, WIDTH, HEIGHT);
		ctx_b.fillStyle = "#FAF7F8";
		ctx_b.fillStyle = "#FAF7F8";
		ctx_b.fillStyle = "darkslaegrey";
		ctx_b.fillStyle = "darkslaegrey";
		ctx_b.beginPath();
		ctx_b.beginPath();
		ctx_b.rect(0,0,WIDTH,HEIGHT);
		ctx_b.rect(0,0,WIDTH,HEIGHT);
		ctx_b.closePath();
		ctx_b.closePath();
		ctx_b.fill();
		ctx_b.fill();
//		ctx_b.fillStyle = "#444444";
//		ctx_b.fillStyle = "#444444";
		ctx_b.fillStyle = "red";
		ctx_b.fillStyle = "red";
		ctx_b.beginPath();
		ctx_b.beginPath();
		ctx_b.arc(b_x, b_y, 10, 0, Math.PI*2, true);
		ctx_b.arc(b_x, b_y, 10, 0, Math.PI*2, true);
		ctx_b.closePath();
		ctx_b.closePath();
		ctx_b.fill();
		ctx_b.fill();
		
		
		if (b_x + b_dx > WIDTH || b_x + b_dx < 0) b_dx = -b_dx;
		if (b_x + b_dx > WIDTH || b_x + b_dx < 0) b_dx = -b_dx;
		if (b_y + b_dy > HEIGHT || b_y + b_dy < 0) b_dy = -b_dy;
		if (b_y + b_dy > HEIGHT || b_y + b_dy < 0) b_dy = -b_dy;
		
		
		b_x += b_dx;
		b_x += b_dx;
		b_y += b_dy;
		b_y += b_dy;
		}
		}
		
		
	function draw_w() {
	function draw_w() {
		ctx_w.clearRect(0, 0, WIDTH, HEIGHT);
		ctx_w.clearRect(0, 0, WIDTH, HEIGHT);
//		ctx_w.fillStyle = "#FAF7F8";
//		ctx_w.fillStyle = "#FAF7F8";
		ctx_w.fillStyle = "darkslaegrey";
		ctx_w.fillStyle = "darkslaegrey";
		ctx_w.beginPath();
		ctx_w.beginPath();
		ctx_w.rect(0,0,WIDTH,HEIGHT);
		ctx_w.rect(0,0,WIDTH,HEIGHT);
		ctx_w.closePath();
		ctx_w.closePath();
		ctx_w.fill();
		ctx_w.fill();
		ctx_w.fillStyle = "#444444";
		ctx_w.fillStyle = "#444444";
		ctx_w.fillStyle = "yellow";
		ctx_w.fillStyle = "yellow";
		ctx_w.fillStyle = "darkslategrey";
		ctx_w.fillStyle = "darkslategrey";
		ctx_w.beginPath();
		ctx_w.beginPath();
		ctx_w.arc(w_x, w_y, 10, 0, Math.PI*2, true);
		ctx_w.arc(w_x, w_y, 10, 0, Math.PI*2, true);
		ctx_w.closePath();
		ctx_w.closePath();
		ctx_w.fill();
		ctx_w.fill();
		
		
		if (w_x + w_dx > WIDTH || w_x + w_dx < 0) w_dx = -w_dx;
		if (w_x + w_dx > WIDTH || w_x + w_dx < 0) w_dx = -w_dx;
		if (w_y + w_dy > HEIGHT || w_y + w_dy < 0) w_dy = -w_dy;
		if (w_y + w_dy > HEIGHT || w_y + w_dy < 0) w_dy = -w_dy;
		
		
		w_x += w_dx; w_y += w_dy;
		w_x += w_dx; w_y += w_dy;
		}
		}
		
		








	function draw2() {
	function draw2() {
		ctx2.clearRect(0, 0, WIDTH, HEIGHT);
		ctx2.clearRect(0, 0, WIDTH, HEIGHT);
		ctx2.drawImage(city, WIDTH/2-100, 10 );
		ctx2.drawImage(city, WIDTH/2-100, 10 );
		ctx2.drawImage(city_w, WIDTH/2-100, 10 );
		ctx2.drawImage(city_w, WIDTH/2-100, 10 );
		ctx2.drawImage(city_b, WIDTH/2-100, 10 );
		ctx2.drawImage(city_b, WIDTH/2-100, 10 );
		ctx2.drawImage(gif, WIDTH/2-100, 10 );
		ctx2.drawImage(gif, WIDTH/2-100, 10 );




//		ctx2.drawImage(img_mask, 0, 0);
//		ctx2.drawImage(img_mask, 0, 0);
//		ctx2.globalCompositeOperation = 'source-in';
//		ctx2.globalCompositeOperation = 'source-in';
//		ctx2.drawImage(city_w, 10 , 10); 
//		ctx2.drawImage(city_w, 10 , 10); 
//		ctx2.drawImage(img_mask, 0, 0);
//		ctx2.drawImage(img_mask, 0, 0);
		}
		}


	function draw_i() {
	function draw_i() {
//		img_mask="/imgs/btn/koeye_mask.png";
//		img_mask="/imgs/btn/koeye_mask.png";
//		ctx_i.drawImage(img_mask, 0, 0);
//		ctx_i.drawImage(img_mask, 0, 0);
//		ctx_i.globalCompositeOperation = 'source-in';
//		ctx_i.globalCompositeOperation = 'source-in';
//		ctx_i.drawImage(img_w, 0 , 0); 
//		ctx_i.drawImage(img_w, 0 , 0); 






		ctx_i.clearRect(0, 0, WIDTH, HEIGHT);
		ctx_i.clearRect(0, 0, WIDTH, HEIGHT);
		ctx_i.drawImage(img, WIDTH/2-100, 10 );
		ctx_i.drawImage(img, WIDTH/2-100, 10 );
//		ctx_i.drawImage(img_i, WIDTH/2-100, 10 );
//		ctx_i.drawImage(img_i, WIDTH/2-100, 10 );
		}
		}
		
		
	function draw_t() {
	function draw_t() {
		txt="timejaks: jkwii";
		txt="timejaks: jkwii";
//		ctx_t.drawImage(txt, 0, 0);
//		ctx_t.drawImage(txt, 0, 0);
//		ctx_t.drawImage(img_t, WIDTH/2-100, 10 );
//		ctx_t.drawImage(img_t, WIDTH/2-100, 10 );
//		ctx_t.fillStyle = '#f00';
//		ctx_t.fillStyle = '#f00';
//		ctx_t.font = 'italic bold 30px sans-serif';
//		ctx_t.font = 'italic bold 30px sans-serif';
//		ctx_t.fillText(txt, 50, 100);
//		ctx_t.fillText(txt, 50, 100);
//		ctx_t.fillText("timejaks:  jkwii is me", 0, 0);
//		ctx_t.fillText("timejaks:  jkwii is me", 0, 0);
//		ctx_t.fillText("timejaks:  jkwii is he", x, y);
//		ctx_t.fillText("timejaks:  jkwii is he", x, y);


		ctx_t.clearRect(0, 0, WIDTH, HEIGHT);
		ctx_t.clearRect(0, 0, WIDTH, HEIGHT);
		ctx_t.fillStyle = 'black';
		ctx_t.fillStyle = 'black';
		ctx_t.fillStyle = 'goldenrod';
		ctx_t.fillStyle = 'goldenrod';
		ctx_t.fillStyle = 'darkslategrey';
		ctx_t.fillStyle = 'darkslategrey';
		ctx_t.font = '50px yokkmokkOT';
		ctx_t.font = '50px yokkmokkOT';
		ctx_t.textBaseline = 'bottom';
		ctx_t.textBaseline = 'bottom';
		ctx_t.fillText("timejaks:  jkwii is where", x, y);
		ctx_t.fillText("timejaks:  jkwii is where", x, y);


//		alert( "BUGS_5900 drat_t txt="+txt );
//		alert( "BUGS_5900 drat_t txt="+txt );
		}
		}
		
		






		
		
	function draw3() {
	function draw3() {
		ctx3.clearRect(0, 0, WIDTH, HEIGHT);
		ctx3.clearRect(0, 0, WIDTH, HEIGHT);
		ctx3.fillStyle = "#444444";
		ctx3.fillStyle = "#444444";
//		ctx3.fillStyle = "darkslategrey";
//		ctx3.fillStyle = "darkslategrey";
//		ctx3.translate(100,100);
//		ctx3.translate(100,100);
//		ctx3.fillRect(-15, -15, 50, 50);
//		ctx3.fillRect(-15, -15, 50, 50);
		ctx3.save();
		ctx3.save();
		ctx3.translate(400,50);
		ctx3.translate(400,50);
		ctx3.rotate(x/20);
		ctx3.rotate(x/20);
		ctx3.fillRect(10, 0, 25, 25);
		ctx3.fillRect(10, 0, 25, 25);
		ctx3.restore();
		ctx3.restore();
		}
		}
		
		








		
		
	function drawAll() {
	function drawAll() {
		draw_b();
		draw_b();
		draw_w();
		draw_w();
		draw_i();
		draw_i();
		draw_t();
		draw_t();


		draw1();
		draw1();
		draw2();
		draw2();
		draw3();
		draw3();
		}
		}
	
	












//	init(img_new);
//	init(img_new);
	init_balls_n_cubes(myimg);
	init_balls_n_cubes(myimg);
		</script id="script_canvas_balls_n_cubes_w" >
		</script id="script_canvas_balls_n_cubes_w" >
		
		
	<script id="script_load_urlbtn">
	<script id="script_load_urlbtn">
		function load_urlbtn(btnid) {
		function load_urlbtn(btnid) {
			img_dragon: url("/imgs/links/tn/tn_dragon.png" );
			img_dragon: url("/imgs/links/tn/tn_dragon.png" );
			img_ko: url("/imgs/btn/ko.png");
			img_ko: url("/imgs/btn/ko.png");
			img_ok: url("/imgs/btn/ok.png");
			img_ok: url("/imgs/btn/ok.png");
			img_kb: url("/imgs/btn/kb.png");
			img_kb: url("/imgs/btn/kb.png");
			img_kw: url("/imgs/btn/kw.png");
			img_kw: url("/imgs/btn/kw.png");
			img_ki: url("/imgs/btn/ki.png");
			img_ki: url("/imgs/btn/ki.png");


			img_kob: url("/imgs/btn/kob.png");
			img_kob: url("/imgs/btn/kob.png");
			img_kow: url("/imgs/btn/kow.png");
			img_kow: url("/imgs/btn/kow.png");
			img_kib: url("/imgs/btn/kib.png");
			img_kib: url("/imgs/btn/kib.png");
			img_kiw: url("/imgs/btn/kiw.png");
			img_kiw: url("/imgs/btn/kiw.png");
	
	
			img_koeye: url("/imgs/btn/koeye.png");
			img_koeye: url("/imgs/btn/koeye.png");
			img_koeyeb: url("/imgs/btn/koeyeb.png");
			img_koeyeb: url("/imgs/btn/koeyeb.png");
			img_koeyew: url("/imgs/btn/koeyew.png");
			img_koeyew: url("/imgs/btn/koeyew.png");
			img_koeye_handhither: url("/imgs/btn/koeye_handhither.gif");
			img_koeye_handhither: url("/imgs/btn/koeye_handhither.gif");
			img_koeye_handhi: url("/imgs/btn/koeye_handhi.gif");
			img_koeye_handhi: url("/imgs/btn/koeye_handhi.gif");
	
	
			img_kop1: url("/imgs/btn/kop1.png");
			img_kop1: url("/imgs/btn/kop1.png");
			img_kop2: url("/imgs/btn/kop2.png");
			img_kop2: url("/imgs/btn/kop2.png");
			img_kop3: url("/imgs/btn/kop3.png");
			img_kop3: url("/imgs/btn/kop3.png");
			img_kop4: url("/imgs/btn/kop4.png");
			img_kop4: url("/imgs/btn/kop4.png");
	
	
			img_kop12: url("/imgs/btn/kop12.png");
			img_kop12: url("/imgs/btn/kop12.png");
			img_kop23: url("/imgs/btn/ko23.png");
			img_kop23: url("/imgs/btn/ko23.png");
			img_kop34: url("/imgs/btn/kop34.png");
			img_kop34: url("/imgs/btn/kop34.png");
			img_kop14: url("/imgs/btn/kop14.png");
			img_kop14: url("/imgs/btn/kop14.png");
	
	
			img_btn: url("/imgs/btn/btn.png");
			img_btn: url("/imgs/btn/btn.png");
			img_btn_n: url("/imgs/btn/btn_n.png");
			img_btn_n: url("/imgs/btn/btn_n.png");
			img_btn_s: url("/imgs/btn/btn_s.png");
			img_btn_s: url("/imgs/btn/btn_s.png");
			img_btn_e: url("/imgs/btn/btn_e.png");
			img_btn_e: url("/imgs/btn/btn_e.png");
			img_btn_w: url("/imgs/btn/btn_w.png");
			img_btn_w: url("/imgs/btn/btn_w.png");
			return(img);
			return(img);
			}
			}
		</script id="script_load_urlbtn">
		</script id="script_load_urlbtn">




	<script id="script_load_b64btn" >
	<script id="script_load_b64btn" >
		function load_b64btn(btnid) {
		function load_b64btn(btnid) {
			ko_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAE1FJREFUeNq0m09sI9d5wH/fG1I7FEXJWi4trow0cpKDgSBA4FzUS9tL29W5h0WSNg0QA/WaVNEI9tWHRZGitSEXEendAknhokWBHHr1Oj0VPRQC2hpt3AB7KBDFi11zJVFckZI4FGfe18ObIWck6t/aJRbickgO3+99f9/3vSfK1R/bQYWOT4MaNF8LcPeQBffUQgFRcpH7uKKegEaCAFrlqXrFe6/9cAOGsAYbQfGw0gcgYJ4d/8WrDkmuzrHX+I5IVYlQAdj1whwQ3nS3CslJC0ATDjT3H98qtwkFQaHiSUv/63fxRHmqOYBp78AP3tpYZSOgOLWt/1gvXA3mihx7eyILUU5FeZqM0aIS5cPrnYqheKW7HWJ3UJ2b6a2Orq2vueeNnl4vFP5fOHrbVRgTAEqOSKKXnkjhQOWl6StK9vY9P3rv+28BrANgjTUAOJi/bb1Y+sI5tiwLjkBFIQcMRbDT/ZsHxW6vFAhF/7h8RR0NV1kHbPayscaxbByYpS+UY+vFlqNQcgzBmeyc8CxXfvLiERxjEcoBlasIBNZHECvu6cEIxrmAme2lL4zj7h+qOIYhIIi+eNykTqEXlMMjgCDyDFiE4qVJbsN6DLHyiTqn4XzdUSdBWYMfyVe+II6tSBLvqSY0M6ZZv/PLTX6wMTvgCPCfffwqonz8KiBl3nv7ShQr/EJJj0PAfOPBygMAswY/8pa+CI6735U4BACl5lvf/yWfHHauBXP0PMAP/u1VkMT0ReUyIrkdU6wA/62MZBHfSDDfcCpmWLsEyGU4/ldywxyUoV2c2Z1nmc39ta//mR75AeDzjOxcqpS5yM/cHlPwScSpUQiYo2VnLYY1/nLp83P82gplgGhY/+kym+yv/U2e4/jdyOhUW1IeRwCKpnxJYWwyrXYSiJijZWf3hjX+6sufk+PXwxxlCHxg+FubLP+c2Z1ZQnIufB8DzOT3HMnHiYqVg8p5GGOKIuikQaiIHC7HHsys8ZPS5+Lo7UoZAvfC61sTvfi4iO9yIR+68ec++OGeBWPh429xPojDWAE2i7FR6ImBiIqT7OFYtxqVz8HRa5eBAIPFADb/rByl3o8xKjuVfn4PrAFsbPPFyvkYThYxyVizZPwscMhyIpHzQC7g2Dl0wrhXiy9YYlm4Ryf1/w++JxYMI5LJEslg6Egep+18ROKsxLD2s7MHai7AIAgCjKlBk2YTwA/Gj84ZdzOiKG2/PemmCUaxqIoqqPtjrWr8d3QNVYqfJDN4e+/5OHYOy0UwBprNJlADQ2C4D/e5D3wwMzPzwUylQqUy80ENC8ZawGIEtN27O8HhJhgkFKiOBh//te4NVFHY3GRlBbvOnbvPo1e9djkwQDN+XWvWxm9a7r8uPeOyKiDwd+MUD0xsJyBTi5MxPgGNtWrkrTRtHzL+JxyyHNvIz56DY8cPjDVNoA406o1aE0RrwPtvAJ38yB4wcboXJ942EbQunQ5/K7FppDF0knmkQEbG/rMr61XbD8A0qddfw7FIHZSmvN9UoONZwFob0xgwxp64reycuKtlBWIMVcbGkA0eirus7nPFzSQf3ruyPHoBpkk9jh1+5r2m1rxOokanZ2TojV/93dtZrRrZRiKM0Qi2AFhKy0QkJZHzBHIexzFN6gHzYw/rB34QE5lnSXkB9ONXE5AwF+ayM1tOxeHHTqsmYGxlvrSUiiCSAXmTd37jShztqWOa9WCeHYBrMI5+PjS+/i33xTgPUVFRzDB/6j72RumEOEYYMcwpijFJAiIgztbPEsiZHDuGZr3ADvgZI4wAn+MDL1lKO/sWZ6zRKRBlLJDHlpgjcak6mSIFkhHI2SBn2fldaNYLOzu+74OISLySxfMgsAd5gwFCQqwxxqjqfyJ41g7TwrBWYWe8cmKFTadKF2DEVzUV8YubPDi1kr9AHnvRPeoHPqyykclBFYimDrNmkLyyzvBN2jthRhbyGLsCm0UdOas0xivu6WFGIs7WY2NPNOu9xcty7GmzzoHPKhmMeGqCEOKsPZ6e9MjN6HIcC5HZ62O1clqlIxPfylCkQZbSPisTDe9dv6ReabNeOPBXV9fZGK4Oh8Ph6nC4moSmg9CVDSffxIC1KiIiFjDGmNi+bsPKymaiJhmMV8YYKaLx5KlTLDZdEGk8uZQ8+kfNemHnLdbX1kfX8sO8c0b5PcbSOOmbkmwkPQaTuKyUOFyIG2Nk7vLwhDzGAklMvaDThUvI46hZL+ywkRT5XGRjyHAVZjwhlwMYWmtdOB+HQmtP2qGIxewmr1ZIjDztb09I4JU0hoi45Nl9cRPAHjSPPv2nizmadcCPLeMWt7iVZNz5ou56Ocipag4Ra0WcW4rvZjDm9JLCtGNv5cZx4v0EYzAYBMFgMBi8kgnrKCKxWy8CKysIzeLvfNo7l2OnfReC7jWGQ+AWH/IhH3ILyBv1oqdeNgnKZkZhDCOJ3sQ2P5VkVsvFdIq7lcFAxBgRkcErKaXKeBiKbiLqNCkcf7p3DoehRgBCHuAjazAYPoLD49l5L6dRGIYgompS3zEWCEMIIcRi4pgS//4usG6ATU4k6aNHIIiIiBjMIPHyoC5dIFkAFzcdSQ1jC42z7HwHDBLgCQwzdEUVTxSBluYgzGU9rDXWEAqaC3OJJ8s5p6tgmCnz2OUkcZaLZsURGOLakadgdVRrGC9EUkHE5PKKBTNYHP3YOKNy+beAhwr5BCWfPyyhkot1tdoizOXCHMYaLMb9w4RyU4VWLsyFiIq6ypB18zTlfmJz0lI8lgbYXwG8bEBQN2lxKUWcbASV4mEsgEYNa/NtcbHEBHtPtvt323fbbWuM4X0hiFVzCPm8PzWdv3Y9n8+PgathzvG7BYcxGAijm1UEqiEg1ZsAEoax5dvdPdaA5eJ4dZExcgFxGPzKjvL1tHFoWncsAXUwxlht321/evuxtP40KSbF5dS1DUr9Rs3mgjzsz+3fzJqaAJ/lhnmnPzlCJ4CqCtCqwg5RFWhRpeWFTgetzv32z22SIupptRpIggFLRhipJON0McY9XObBm39OgT4FgP6inLv+aHcNIVIde7/x+vmzZLZUlByEsgACg06Vz+AmKrSq0NJcKKjYxeg3f25HSckEDvjVOLEyQtxG0CxIsg5Z+Z+To82dUy4ZijDCiDyAyAMVrY6E3rrZiryQBQFUrlVHrkWqQJWWVFs3aXEYL2gnP4KMFm29LLG70lSCGpt9ttdzqbqPSLUau/vkhuPo0XJhuaoL1TAn4ko2KOIWDO4TSrVKVbUKvzATfv1UfBj9sri1gmRzLOBw8tfPk8f1a8kNRmvByEusbiHuMnuRJ0nLOZGDc/rVUQlHVTg6Tx5+AEtbqURXEbfETC0ZzpHG+fLojCbJ8/BEibLvR5G7UL05mjgRVB87AHWPMAyjSP3OZHk8zNZ0U/mhjGQ0Dp0qz1FPjKrpQiuAF42K0+KEFHl47O/vw1MREWkp0uVJXBmMoigexZPhl86Rx8OHgCylq1eiKQc9cjCisHxFDvtCaz9uQ3TB6+4/edLxPOh2u3S7+yI5DzzkcRegVW3RgiqqsyyOl/JRiILO3OMM+3j48OFDN+AYZAljAOHsSo750mlbHpyVCGzNdbNJfg8BZuBAXdusJ4uubTArrWp64iIvAg/XLhPQXq7K40z8GDleYGlraetlAN1yXldS63JAjAhwWHCae7j8wKz9OK/WjwhyAKHvSTvIld6pNWtuL0GTeoAXLyeHfgDMPi4dqDBzoOMWS6HvRl2C2e5st1/NKHJnFrwIL+boQv+FSpxfTaMoNsWxdLLtIZLkxCpgvvnAV1jFLbEVIvxGLa69NmvNt3qhP90fuwSXXr2v9cADgcLA49o+9GRCcyLJEkQpMdeqtqrj6YscQwLWg/4Nvc5jy8omRR3XGE5xSBzxkjoEQu6z/DA/dCtS1jZAiXwaNSwGuT7BPsoVg7Vv1BpECAyPww7Mzc2W9HQFWV1dyVWWYoxkQqPRn1gbgUH8g8vJQGOCJZaS0uF4tuJIpJDf+aNvM4zT1SE4DBoq1mIG5euT7bx8D4CfECnkhflOC2T2pWRlQKk0KsOMm18HScx31hV5XtxsS6Jnv6/FUSEl3WhiaSurVJopLeR2v836emYSVwF+UuMNuFdePNNfvV0x1tU9lSE+1SqqRItCoQDIwUHmroVCAVikNcpeTgToJAmrDIEv2ZTDigNkGkMgVXTT3G6bdeAW9pa9ZW8BDDcg8mliTb9+rt+dqnAH/NkB+dBLl0IpAIXCOFEoxFcKHa2mUwsPmO0mi2oRoOTU6s04rZBMazlucjjdMu4LFrPTXnPq9JE1H5qPzEdAPq/BrA81+lO56xfWfdrNehD64Om0OqOlA/2Cx5x2D5yrisHoF2A+jr3ROP/qMOs21kiXvpZyFYBHJAvCCQ0PRJM5UmTYA2L7Hj/WNghyfqN2+O+/V7pEHJyuNfxKsLraDJUnGiXy8Pw5mHtpvuAkMYbpdFANE/vu0Ol0XLLa7fa69LXkV5LfepBuNZ3cvjA2je92Ywd1suodVPxGbXr+D0qXiefhoNboV97h9YBocVRcmZ+7pqCIN+8wjvqJZGajKNRQgW63Q2cWYNvr9ph1yhaXDb4EsHw4LqJPajUD5tmPnZbk88N8njzkyefJr20ElX6jJk9Kl6xT94barFPoecbrzkPk/M/8k8X45x4XgD5QYLY7KW+Y7TL/5MUe0FeI1Qp4lOoaoOn1xcjSUdn2RqkFSUNluLaxuhHM0Ljj9b586Xp7770796gfVPZ7MJPJcuefLD5Z7B7EmtWnwBkozHccBSV/ftTHedeFQueXJrU2FXqBN86REn+7AQEzDe7c+87XrtA36L13xzTrhTAMOFjsxGOmQJ/FTmrkfThzR2c/XvWWmBnpwSOyXbXTO0qUv3gt8RaZJWBApd+o0TwD46z1eS8wNOscXwvoScH5pUmjPoukP/LEKXE4gcQuK7WqkKTIo8i+BNl1JwgEVOg3aky1l662/jg2U9QaBJFPSY+OjvToqJ8ZZ7/fB/qFiVts+ymMzIrzXRdDXM1gvPSSJC2RfcH3fYiiKCKKgMEgKAWVSqffqDF1fOV9Mr3jqWOataHGGVIyNQX6iZWfoVP9TEgv5W+k33ycanSOG1yjsLjfrDdrySYpP5jvuGZxB79BzUL3q1fel9EjwNCbGdIbf6rUk9T4XQGpD4WklHSqclDyw8yen0dvvpsFyeRV+7yv9ROFFNcgbtTAHrJ09X1Ld2u9ogFPg5FAUgWssSz651VAShReyF58ZOxKZsdSCqVjoDmuL9Sz79rDol96jv1XO6ZXNJboWtBLu0ZNu5fTY09twlVKZLVqrFkOJOm7u690jNu30qw1a7yvoglJgxoWn/YSz8FBr13mmCEpkDSKpDJaJlQyTvqqrM+imJKHAjyz3H8D4k04TWrJNiNqYPHb+jLPxdG2h+UA9m9o0Cv1TmYPaSOVyWW1ErmJO/EexXtMUrah7MH914H7rydbCJu1JrWkNeG3y7vPyUEvOCwH0J3zcCJxSiCZwYpOAnEYM2fo86N4q6g7ZuFG4LbO3X99HA+aNaBZizGIvspzctALDm5A0J1j6NyvxOtyOaFHijDqV8Rp02kbT4M4kuVNXJpyPEi96xGAiTetxRQXYFywz3LH370BbF+PPOe2JGWZGcHIaWmcjQGPgJUH8QZey1GUwYgYmqSPbX2gTfg1PgcHO/6ulGH7+uBaEIvk/Pslxlvyc+fuG7797qgRvTmtvXTEyM1se9YUIuJt57RVLpDGJfbv7g09KadBJhj86YhW8uWFC3759rpNUP4l3qwSksPLdfn9TZb/NY/b6NzWSLgI40KO9jNPrFDevjmA4ESSMna4ozwv1ikpXnwg6HZyhmVm1FuZYvgn63Mss/mDhtuu1lZMWL342NXF+9u3QnfcwM5HXgKSNCHHhjK+TQl8GV7qLIsjmUnSj2n561+uz7G8SefGweELHm0I8yEXn/641HmDrUgU9dB594O98TfldCe8hD8YfJnLPW4D9wM/AKIS+/5gHjpvfvDOnUMot5VIEL0MxqXOTWxFgoJ6C4PBtQCydpKB6JWQw0sfMgN2cgHANH2z+tPiN75+r1GzB9YgaCQgXA7jcueKejvxYk2qCclElBJ+xLUrULA7BJjOHQaVPg1qU3uRy4TzYWx/c5c7AXfJ82pblafxobuFp/ORx2mWEuBHYbB0BQo6BExvL7bDf6jrPoA3hHwYO5GFp9Xty97u0ucHR8cHq8rT+UHOA6fYSYuPKDxYuIos4DN6pYO5Ay0cGVTzyeY0AaqthaeYy0/KFc5z9rarkQdPYQGeTs3LUbySjoDwhSd85UoQ7HZUZuY+W3yMsanuXbXFAkTerl5FtFc7X7u3b+WGN0q0orhruAtQja52vPbQeoO93BAjmBBxAG4f566al682J89z3vnuHxOx8HQBGUTAzGc3Ap9//mZ8bDuwPgSGZj1YnKyggK2Cits5NEoMFkBaePbv3+bqj+fgoN9vUGPKRVvRG+0yx4fwwffx4UgtGCkDT3Pl4F79YOiFAmiuHJjm96J4G3BorCxs32gTGirbgth5uMIB5xOP/xsAiRFu+XN4xaIAAAAASUVORK5CYII=");
			ko_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAE1FJREFUeNq0m09sI9d5wH/fG1I7FEXJWi4trow0cpKDgSBA4FzUS9tL29W5h0WSNg0QA/WaVNEI9tWHRZGitSEXEendAknhokWBHHr1Oj0VPRQC2hpt3AB7KBDFi11zJVFckZI4FGfe18ObIWck6t/aJRbickgO3+99f9/3vSfK1R/bQYWOT4MaNF8LcPeQBffUQgFRcpH7uKKegEaCAFrlqXrFe6/9cAOGsAYbQfGw0gcgYJ4d/8WrDkmuzrHX+I5IVYlQAdj1whwQ3nS3CslJC0ATDjT3H98qtwkFQaHiSUv/63fxRHmqOYBp78AP3tpYZSOgOLWt/1gvXA3mihx7eyILUU5FeZqM0aIS5cPrnYqheKW7HWJ3UJ2b6a2Orq2vueeNnl4vFP5fOHrbVRgTAEqOSKKXnkjhQOWl6StK9vY9P3rv+28BrANgjTUAOJi/bb1Y+sI5tiwLjkBFIQcMRbDT/ZsHxW6vFAhF/7h8RR0NV1kHbPayscaxbByYpS+UY+vFlqNQcgzBmeyc8CxXfvLiERxjEcoBlasIBNZHECvu6cEIxrmAme2lL4zj7h+qOIYhIIi+eNykTqEXlMMjgCDyDFiE4qVJbsN6DLHyiTqn4XzdUSdBWYMfyVe+II6tSBLvqSY0M6ZZv/PLTX6wMTvgCPCfffwqonz8KiBl3nv7ShQr/EJJj0PAfOPBygMAswY/8pa+CI6735U4BACl5lvf/yWfHHauBXP0PMAP/u1VkMT0ReUyIrkdU6wA/62MZBHfSDDfcCpmWLsEyGU4/ldywxyUoV2c2Z1nmc39ta//mR75AeDzjOxcqpS5yM/cHlPwScSpUQiYo2VnLYY1/nLp83P82gplgGhY/+kym+yv/U2e4/jdyOhUW1IeRwCKpnxJYWwyrXYSiJijZWf3hjX+6sufk+PXwxxlCHxg+FubLP+c2Z1ZQnIufB8DzOT3HMnHiYqVg8p5GGOKIuikQaiIHC7HHsys8ZPS5+Lo7UoZAvfC61sTvfi4iO9yIR+68ec++OGeBWPh429xPojDWAE2i7FR6ImBiIqT7OFYtxqVz8HRa5eBAIPFADb/rByl3o8xKjuVfn4PrAFsbPPFyvkYThYxyVizZPwscMhyIpHzQC7g2Dl0wrhXiy9YYlm4Ryf1/w++JxYMI5LJEslg6Egep+18ROKsxLD2s7MHai7AIAgCjKlBk2YTwA/Gj84ZdzOiKG2/PemmCUaxqIoqqPtjrWr8d3QNVYqfJDN4e+/5OHYOy0UwBprNJlADQ2C4D/e5D3wwMzPzwUylQqUy80ENC8ZawGIEtN27O8HhJhgkFKiOBh//te4NVFHY3GRlBbvOnbvPo1e9djkwQDN+XWvWxm9a7r8uPeOyKiDwd+MUD0xsJyBTi5MxPgGNtWrkrTRtHzL+JxyyHNvIz56DY8cPjDVNoA406o1aE0RrwPtvAJ38yB4wcboXJ942EbQunQ5/K7FppDF0knmkQEbG/rMr61XbD8A0qddfw7FIHZSmvN9UoONZwFob0xgwxp64reycuKtlBWIMVcbGkA0eirus7nPFzSQf3ruyPHoBpkk9jh1+5r2m1rxOokanZ2TojV/93dtZrRrZRiKM0Qi2AFhKy0QkJZHzBHIexzFN6gHzYw/rB34QE5lnSXkB9ONXE5AwF+ayM1tOxeHHTqsmYGxlvrSUiiCSAXmTd37jShztqWOa9WCeHYBrMI5+PjS+/i33xTgPUVFRzDB/6j72RumEOEYYMcwpijFJAiIgztbPEsiZHDuGZr3ADvgZI4wAn+MDL1lKO/sWZ6zRKRBlLJDHlpgjcak6mSIFkhHI2SBn2fldaNYLOzu+74OISLySxfMgsAd5gwFCQqwxxqjqfyJ41g7TwrBWYWe8cmKFTadKF2DEVzUV8YubPDi1kr9AHnvRPeoHPqyykclBFYimDrNmkLyyzvBN2jthRhbyGLsCm0UdOas0xivu6WFGIs7WY2NPNOu9xcty7GmzzoHPKhmMeGqCEOKsPZ6e9MjN6HIcC5HZ62O1clqlIxPfylCkQZbSPisTDe9dv6ReabNeOPBXV9fZGK4Oh8Ph6nC4moSmg9CVDSffxIC1KiIiFjDGmNi+bsPKymaiJhmMV8YYKaLx5KlTLDZdEGk8uZQ8+kfNemHnLdbX1kfX8sO8c0b5PcbSOOmbkmwkPQaTuKyUOFyIG2Nk7vLwhDzGAklMvaDThUvI46hZL+ywkRT5XGRjyHAVZjwhlwMYWmtdOB+HQmtP2qGIxewmr1ZIjDztb09I4JU0hoi45Nl9cRPAHjSPPv2nizmadcCPLeMWt7iVZNz5ou56Ocipag4Ra0WcW4rvZjDm9JLCtGNv5cZx4v0EYzAYBMFgMBi8kgnrKCKxWy8CKysIzeLvfNo7l2OnfReC7jWGQ+AWH/IhH3ILyBv1oqdeNgnKZkZhDCOJ3sQ2P5VkVsvFdIq7lcFAxBgRkcErKaXKeBiKbiLqNCkcf7p3DoehRgBCHuAjazAYPoLD49l5L6dRGIYgompS3zEWCEMIIcRi4pgS//4usG6ATU4k6aNHIIiIiBjMIPHyoC5dIFkAFzcdSQ1jC42z7HwHDBLgCQwzdEUVTxSBluYgzGU9rDXWEAqaC3OJJ8s5p6tgmCnz2OUkcZaLZsURGOLakadgdVRrGC9EUkHE5PKKBTNYHP3YOKNy+beAhwr5BCWfPyyhkot1tdoizOXCHMYaLMb9w4RyU4VWLsyFiIq6ypB18zTlfmJz0lI8lgbYXwG8bEBQN2lxKUWcbASV4mEsgEYNa/NtcbHEBHtPtvt323fbbWuM4X0hiFVzCPm8PzWdv3Y9n8+PgathzvG7BYcxGAijm1UEqiEg1ZsAEoax5dvdPdaA5eJ4dZExcgFxGPzKjvL1tHFoWncsAXUwxlht321/evuxtP40KSbF5dS1DUr9Rs3mgjzsz+3fzJqaAJ/lhnmnPzlCJ4CqCtCqwg5RFWhRpeWFTgetzv32z22SIupptRpIggFLRhipJON0McY9XObBm39OgT4FgP6inLv+aHcNIVIde7/x+vmzZLZUlByEsgACg06Vz+AmKrSq0NJcKKjYxeg3f25HSckEDvjVOLEyQtxG0CxIsg5Z+Z+To82dUy4ZijDCiDyAyAMVrY6E3rrZiryQBQFUrlVHrkWqQJWWVFs3aXEYL2gnP4KMFm29LLG70lSCGpt9ttdzqbqPSLUau/vkhuPo0XJhuaoL1TAn4ko2KOIWDO4TSrVKVbUKvzATfv1UfBj9sri1gmRzLOBw8tfPk8f1a8kNRmvByEusbiHuMnuRJ0nLOZGDc/rVUQlHVTg6Tx5+AEtbqURXEbfETC0ZzpHG+fLojCbJ8/BEibLvR5G7UL05mjgRVB87AHWPMAyjSP3OZHk8zNZ0U/mhjGQ0Dp0qz1FPjKrpQiuAF42K0+KEFHl47O/vw1MREWkp0uVJXBmMoigexZPhl86Rx8OHgCylq1eiKQc9cjCisHxFDvtCaz9uQ3TB6+4/edLxPOh2u3S7+yI5DzzkcRegVW3RgiqqsyyOl/JRiILO3OMM+3j48OFDN+AYZAljAOHsSo750mlbHpyVCGzNdbNJfg8BZuBAXdusJ4uubTArrWp64iIvAg/XLhPQXq7K40z8GDleYGlraetlAN1yXldS63JAjAhwWHCae7j8wKz9OK/WjwhyAKHvSTvIld6pNWtuL0GTeoAXLyeHfgDMPi4dqDBzoOMWS6HvRl2C2e5st1/NKHJnFrwIL+boQv+FSpxfTaMoNsWxdLLtIZLkxCpgvvnAV1jFLbEVIvxGLa69NmvNt3qhP90fuwSXXr2v9cADgcLA49o+9GRCcyLJEkQpMdeqtqrj6YscQwLWg/4Nvc5jy8omRR3XGE5xSBzxkjoEQu6z/DA/dCtS1jZAiXwaNSwGuT7BPsoVg7Vv1BpECAyPww7Mzc2W9HQFWV1dyVWWYoxkQqPRn1gbgUH8g8vJQGOCJZaS0uF4tuJIpJDf+aNvM4zT1SE4DBoq1mIG5euT7bx8D4CfECnkhflOC2T2pWRlQKk0KsOMm18HScx31hV5XtxsS6Jnv6/FUSEl3WhiaSurVJopLeR2v836emYSVwF+UuMNuFdePNNfvV0x1tU9lSE+1SqqRItCoQDIwUHmroVCAVikNcpeTgToJAmrDIEv2ZTDigNkGkMgVXTT3G6bdeAW9pa9ZW8BDDcg8mliTb9+rt+dqnAH/NkB+dBLl0IpAIXCOFEoxFcKHa2mUwsPmO0mi2oRoOTU6s04rZBMazlucjjdMu4LFrPTXnPq9JE1H5qPzEdAPq/BrA81+lO56xfWfdrNehD64Om0OqOlA/2Cx5x2D5yrisHoF2A+jr3ROP/qMOs21kiXvpZyFYBHJAvCCQ0PRJM5UmTYA2L7Hj/WNghyfqN2+O+/V7pEHJyuNfxKsLraDJUnGiXy8Pw5mHtpvuAkMYbpdFANE/vu0Ol0XLLa7fa69LXkV5LfepBuNZ3cvjA2je92Ywd1suodVPxGbXr+D0qXiefhoNboV97h9YBocVRcmZ+7pqCIN+8wjvqJZGajKNRQgW63Q2cWYNvr9ph1yhaXDb4EsHw4LqJPajUD5tmPnZbk88N8njzkyefJr20ElX6jJk9Kl6xT94barFPoecbrzkPk/M/8k8X45x4XgD5QYLY7KW+Y7TL/5MUe0FeI1Qp4lOoaoOn1xcjSUdn2RqkFSUNluLaxuhHM0Ljj9b586Xp7770796gfVPZ7MJPJcuefLD5Z7B7EmtWnwBkozHccBSV/ftTHedeFQueXJrU2FXqBN86REn+7AQEzDe7c+87XrtA36L13xzTrhTAMOFjsxGOmQJ/FTmrkfThzR2c/XvWWmBnpwSOyXbXTO0qUv3gt8RaZJWBApd+o0TwD46z1eS8wNOscXwvoScH5pUmjPoukP/LEKXE4gcQuK7WqkKTIo8i+BNl1JwgEVOg3aky1l662/jg2U9QaBJFPSY+OjvToqJ8ZZ7/fB/qFiVts+ymMzIrzXRdDXM1gvPSSJC2RfcH3fYiiKCKKgMEgKAWVSqffqDF1fOV9Mr3jqWOataHGGVIyNQX6iZWfoVP9TEgv5W+k33ycanSOG1yjsLjfrDdrySYpP5jvuGZxB79BzUL3q1fel9EjwNCbGdIbf6rUk9T4XQGpD4WklHSqclDyw8yen0dvvpsFyeRV+7yv9ROFFNcgbtTAHrJ09X1Ld2u9ogFPg5FAUgWssSz651VAShReyF58ZOxKZsdSCqVjoDmuL9Sz79rDol96jv1XO6ZXNJboWtBLu0ZNu5fTY09twlVKZLVqrFkOJOm7u690jNu30qw1a7yvoglJgxoWn/YSz8FBr13mmCEpkDSKpDJaJlQyTvqqrM+imJKHAjyz3H8D4k04TWrJNiNqYPHb+jLPxdG2h+UA9m9o0Cv1TmYPaSOVyWW1ErmJO/EexXtMUrah7MH914H7rydbCJu1JrWkNeG3y7vPyUEvOCwH0J3zcCJxSiCZwYpOAnEYM2fo86N4q6g7ZuFG4LbO3X99HA+aNaBZizGIvspzctALDm5A0J1j6NyvxOtyOaFHijDqV8Rp02kbT4M4kuVNXJpyPEi96xGAiTetxRQXYFywz3LH370BbF+PPOe2JGWZGcHIaWmcjQGPgJUH8QZey1GUwYgYmqSPbX2gTfg1PgcHO/6ulGH7+uBaEIvk/Pslxlvyc+fuG7797qgRvTmtvXTEyM1se9YUIuJt57RVLpDGJfbv7g09KadBJhj86YhW8uWFC3759rpNUP4l3qwSksPLdfn9TZb/NY/b6NzWSLgI40KO9jNPrFDevjmA4ESSMna4ozwv1ikpXnwg6HZyhmVm1FuZYvgn63Mss/mDhtuu1lZMWL342NXF+9u3QnfcwM5HXgKSNCHHhjK+TQl8GV7qLIsjmUnSj2n561+uz7G8SefGweELHm0I8yEXn/641HmDrUgU9dB594O98TfldCe8hD8YfJnLPW4D9wM/AKIS+/5gHjpvfvDOnUMot5VIEL0MxqXOTWxFgoJ6C4PBtQCydpKB6JWQw0sfMgN2cgHANH2z+tPiN75+r1GzB9YgaCQgXA7jcueKejvxYk2qCclElBJ+xLUrULA7BJjOHQaVPg1qU3uRy4TzYWx/c5c7AXfJ82pblafxobuFp/ORx2mWEuBHYbB0BQo6BExvL7bDf6jrPoA3hHwYO5GFp9Xty97u0ucHR8cHq8rT+UHOA6fYSYuPKDxYuIos4DN6pYO5Ay0cGVTzyeY0AaqthaeYy0/KFc5z9rarkQdPYQGeTs3LUbySjoDwhSd85UoQ7HZUZuY+W3yMsanuXbXFAkTerl5FtFc7X7u3b+WGN0q0orhruAtQja52vPbQeoO93BAjmBBxAG4f566al682J89z3vnuHxOx8HQBGUTAzGc3Ap9//mZ8bDuwPgSGZj1YnKyggK2Cits5NEoMFkBaePbv3+bqj+fgoN9vUGPKRVvRG+0yx4fwwffx4UgtGCkDT3Pl4F79YOiFAmiuHJjm96J4G3BorCxs32gTGirbgth5uMIB5xOP/xsAiRFu+XN4xaIAAAAASUVORK5CYII=");
			ok_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAD9/f0bIQwZHgowLzEoKCohISIvMDU1NjoqLDOCg4S1trQUGQemqZ54e28fIxE0NiyFiXaSlYZNTkkuMCNZWlRvcGonKRo9PzEKCgUREQtBQUDU1NMZGBQfHhp9fHozLiv8/Pz5+fn39/f09PTv7+/n5+fe3t4AAADXRk1jAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAIABJREFUeNoBSD+3wAD/////////////////////////////////////////////////////////////////6eH29uXl7e3t7e3t9uHs4elWVlbk5OTp6elW5YHq39zd9PTc3d3d3dzc297f39/e29zc3d3d3d3d3eDc3N3c3Nzc3d319PT09PT03dzc3Nzc3N3d5YHs7OyBge3t5fb24en/////////////////////////////////////////////////////////////////////AP//////////////////////////////////////////////////////////6eH27YHb3PLs4eHpVlbpVuHp4e3q4ODg4ODc3fT09fTx8azc3fX08dzc3N3d3Nzb39/y36zg3N3d3d3d3d3d4Nzd3d3d3fX08PD09PT09PT13ODg4ODc4N3x8fHx8fDx8fT09d3c24Ht//////////////////////////////////////////////////////////////////8A////////////////////////////////////////////////////////9u3b3OlWVlZWVlZW5FZWVlZWVlZWVlbp9urb3N3d8vT0//////////////////////////////////////////////////////////////T08t3u3ODb3t3e3uDc3d3d3d3d3fT09fT18fTd3Nvt/////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////8tz0VlZWVlZW5OTk5OTk4uTi5OTk5OTkVlZWVlbhgfL17Vb////////////////////////////////////////////////////////////////12tna5t3c9tve3eDg3Nzd3d3d3d3d3d3d9PT19PT03PL/////////////////////////////////////////////////////////AP//////////////////////////////////////////////////393pVlZWVuTk5OLk4uLi4uLi4uLi4uLi4uLi5OTk5FZW6e3//////////////////////////////////////////////////////////////+zy6t/f3ubZ5vTp9dzl293d3Nvg4ODg3Nzc3dzd3d3d3d303d3f//////////////////////////////////////////////////////8A////////////////////////////////////////////////3/XpVlZW5OTk4uLi4uLi4uLiKysrKysrK+Li4uLi4uLk5ORWVlb//////////////////////////////////////////////////////////+rq8t/f3t7g4Obm5vDa9OHd7e3s3d3d3dzc29vb4ODc3N3d3d3d9N313////////////////////////////////////////////////////wD//////////////////////////////////////////////93cVlZW5OTi4uLi4uLi8/38/Pz8/f39/f39/P3+K+Li4uLi4uTkVlZW/////////////////////////////////////////////////////+rq39/e3uDg4N7b3ubm5ubm8PTh6fbt7YGB7PLc3dzc29vb2+Dc3N3d3d3c3YH/////////////////////////////////////////////////AP///////////////////////////////////////////9/cVlZW5OLi4uLiK+Ir/vz8/Pv7+/v7+/v7+/v7+/z8/Ssr4uLi4uLk5FZWVv///////////////////////////////////////////////4Hy8t/e3t7erN7e397erN7u5ubm5vDw9+lW8/MrVu2B7Ore3ODe39/e29zc3d3d3N////////////////////////////////////////////////8A///////////////////////////////////////////f3FZW5OTi4uLi4isr/vz8+/v7+/v7+vr6+vr7+/v7+/v7/CsrKyvi4uLi5ORWVv/////////////////////////////////////////////q6t/e397f39/f39/f397e3qzm7ubm5ubj8PDh6eLz/isrVvaB7N/f39/f397b3Nzd3IH//////////////////////////////////////////////wD/////////////////////////////////////////31ZW5OTi4uLiKysr8/37+/v6+vr6+vr6+vr6+vr6+vr6+vv7/isrKysr4uLi4uTkVv//////////////////////////////////////////8vLf3t/f397e3t7e3t7e3t7e3t7u7ubm5ubu5vDxgVbk8ysr8/Pi9urf8vLy39/f2+Dc2///////////////////////////////////////////////AP///////////////////////////////////////+BWVuTk4uLiKysrK/P9+/r6+fn5+fn5+fn5+fn5+fn5+fn6+vz98/MrKysr4uLi4uTkVlb/////////////////////////////////////7Orf39/f397e3t7e3t7e3t7g4N/y7O3r7u7u7u7u7u709O9W5PPzKyvzVurv8vLy8vLf397g//////////////////////////////////////////////8A///////////////////////////////////////yVlbk4uLiKysrKyvz/v38+/z8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/f7+/vPzKysrK+Li4uLkVlb//////////////////////////////////+ry39/f39/e3t6s3t7e3t7g4PLt4eHh4eHn6+vr6+vr5+fr693y5OQr8/Mr7fLy8vLq8vLy39/b4P///////////////////////////////////////////wD/////////////////////////////////////6lbk5OLi4uIrKyvz/v7+/f39/fz9/Pz8/Pz8/Pz8/Pz8/P38/P39/f39/v7+8ysrKyvi4uLkVlb////////////////////////////////q8t/f39/f36ze3t7g3t7e4PKB4eHh4eHh4eHv7+/n7+/v7+/v5+fc9+Hk4uTt6urq6urq6vLy8t/e8v//////////////////////////////////////////AP///////////////////////////////////+pWVuTi4uIrKyvz8/7+/v39/fz8/Pz8/Pz8+/v7+/v7+/v7/Pz8/Pz8/f39/v7+8/MrKyvi4uLkVlb/////////////////////////////6t/f39/f39/e4ODg4N7g4ODy7fbh9uHh4eHh4eHv7+/v7+/v7+/v7+/y3+/q7Ozs7Orq7Ozq6vLy8vLf8v////////////////////////////////////////8A////////////////////////////////////VuTk4uIrKysr8/7+/v39/fz8/Pz8+/v7+/v7+/v7+/v7+/v7+/v8/Pz8/P39/f7+8/MrKyvi4uLkVlb//////////////////////////+ry39/f39/e4ODg4ODe3t7g34Hh4eHh4eHh4eHh4eHy8vLy8vLy8vLy8vLq6urs7Ozs7Ozs7IHq6ury8vLf6v///////////////////////////////////////wD/////////////////////////////////7VZW5OLi4isrK/7+/v39/fz8/Pz7+/v7+/r6+vn5+vr6+vn5+vr7+/v7+/z8/Pz9/f3+/vMrKyvi4uLkVv/////////////////////////s8t/f3t/e4ODg4ODg4N7e4ODfgeHh4eHh4eHh4eHh4eHq6urq6urq6urq6vLq6uzsgYHsgezs7Ozs6urq6t/f6v//////////////////////////////////////AP///////////////////////////////4FWVuTi4isrK/Pz/v79/fz8/Pz7+/v7+vn6+fn5+fn5+fn5+fn5+fr5+vr7+/v8/Pz8/f3+/vMrKyvi4uLkVv//////////////////////gd/f3t/e4ODg3uDg4N7e4N7g3t/sge329uH29u2B7e3tgerq6oLqgurqgurs6urs7OzsgeyBgYGB7Ozs7Orq6vLf6v////////////////////////////////////8A////////////////////////////////Vlbk4uLiKyvz8/7+/f38/Pz7+/v6+vr5+fn5+fn4+Pj4+Pj4+fn5+fn5+fn6+/v7/Pz8/f3+/v4rKyvi4uLkVv///////////////////+Xf3t7e4ODg4N7g4N7e3uDe3t7e3t7y6vLy8vLf397e4ODe6+qC6urs7Ozs7Ozs7Ozs7IHsgYGBgYGBgYHs7Ozs6vLf8v///////////////////////////////////wD//////////////////////////////1ZW5OLi4isrK/P+/v39/Pz8+/v7+vn5+fn5+Pj4+Pj4+Pj4+Pj4+Pj4+fn5+fn6+/v7/Pz8/f3+/vPzKyvi4uTkVv//////////////////3+Dg4ODg4ODe3uDg4ODg3uDe3t7e3uDg4N7e4ODg4ODe3t7g2+zs7OyC7Ozs7IGCgYGB7IHtge3t7e2BgYGB7Ors6vLq////////////////////////////////////AP/////////////////////////////tVlbk4uIrKyvz/v39/fz8+/v7+vr5+fn5+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5+fn6+vv7+/z8/f3+/vMrKyvi4uRW/////////////////+rg4ODg4ODg4N7g4ODg4ODe3uDg3t7g4ODg4N7g3t7e3t7e3t7e2+zs7IGBgu2BgYGBge3tge3t7e3t7eXt7YGB7Ozq6vLs//////////////////////////////////8A/////////////////////////////1ZW5OLi4isr8/7+/f38/Pz7+/r5+fn5+Pj4+Pj4+Pj42NjY2NjY+Pj4+Pj4+Pj4+fn5+vv7+/z8/f3+/vMrKyvi4uRW//////////////+B4ODg4ODg4ODg4N7b4ODg4ODg4ODg4ODg3t7e3t7e3t7e4N7e3t7e7+yBgu3t7e3t7e3t7e3t7e3t5eXl5eXl7e2Bgezq6vL//////////////////////////////////wD////////////////////////////hVlbi4uIrK/P+/v39/Pz8+/r6+fn5+Pj4+Pj4+NjY2NjY2NjY2NjY2NjY+Pj4+Pj4+fn5+vv7+/z8/f3+/vMrK+Li5OT///////////////Lf4ODg4ODg4ODg4ODg4ODc4Nzg4ODg4N7e3t6s3t/f397e3t7e3t/f7+3t7e3t7eXl7eXt5eXl5eX29vb29vbl5e2Bgezs8v//////////////////////////////////AP///////////////////////////1ZW5OLiKyvz8/79/f38/Pv6+vn5+fj4+Pj4+NjY2NjY2NjY2NjY2NjY2NjY2Pj4+Pj4+Pn5+vr7+/z8/f3+/vMrK+Li5Fb/////////////8t7g4ODg4ODg4ODg4ODg4ODg4ODb4N7e397f3t/f397e3qze3t7e3t7frIHt7e3l5eXl5eXl5eXl6Ojo4eHh4eH29uXtgezs8uz///////////////////////////////8A//////////////////////////9WVuTi4isrK/P+/v39/Pz8+/r6+fn4+Pj4+PjY2NjY2NjY2NjY2NjY2NjY2NjY2Nj4+Pj4+Pn5+vr7/Pz8/f7+8ysr4uLi5P////////////Lf3+Dg4ODg4ODg4ODg4ODg4ODg297e39/f39/e3t7e3uDg4ODg4ODe4N7b5+3t5eXl5ejo6Ojo6Ojo6Ojo6Onp4eHh9vbtgezs6v///////////////////////////////wD//////////////////////////1ZW4uLi4ivz/v79/f38/Pv7+vn5+Pj4+Pj42NjY2NjY2NjY2NjY2NjY2NjY2NjY2Nj4+Pj4+Pn5+vr7/Pz9/f7z8ysr4uLkVv/////////q8t/e3t7e4ODg4ODg4ODg4ODb3t7e3t/frN7e3uDg4ODc4Nzg3ODg4ODg4ODb6+Xl5ejo6Ojo6Ono6ejp6enp6enp6enh4fbtgezqgf//////////////////////////////AP/////////////////////////lVuTi4isr8/P+/v39/fz8+/r5+fn5+Pj4+NjY2NjY2NjY2NgAAAAAAAAA2NjY2NjY2Nj4+Pj4+Pn5+vv7/Pz9/f7zKysr4uTk//////////Lf4N7e3uDg4ODg4ODg4ODg3t7g3t7e3uDg4ODg3ODc4ODg4ODg4ODg4ODc4Nzg6+Xo6Ojo6ejp6enp6enp6enp6elWVunp6eHtgYHq7f////////////////////////////8A////////////////////////7Vbk4uLiKyvz8/7+/f38/Pv7+vn5+fn4+Pj42NjY2NjY2NjYAAAAAAAAAAAAANjY2NjY2Nj4+Pj4+fn5+vv7/Pz9/v7zK+Li4uT////////t397e3t7g4ODg3t7e3t7g4ODg4N7g4ODg4ODg4ODg4N7e3t7e3uDg4ODg4ODc3Nzc4Ojo6Ojo6enp6enp6enp6enp6elWVlbp6eHt7YHs7f///////////////////////////wD//////////////////////+WBVuTi4isr8/P+/v39/fz7+/r6+fn5+fj4+PjY2NjY2NjY2AAAAAAAAAAAAAAAAADY2NjY2Nj4+Pj4+fn5+vv8/P39/vPzKyvi5Fb//////+zf4ODg4ODg4N7f39/f39/e3uDg4ODg4ODg4ODg4ODg4N7e3t7e4ODg4ODg3Nzc3Nzc3Ojo6enp6enpVuTkVuTk5ORW5OlW5FZW6eH27YHs////////////////////////////AP/////////////////////27O3k4uIrKyvz/v7+/f38/Pv7+vn5+fn5+Pj4+NjY2NjY2NjYAAAAAAAAAAAAAAAAAADY2NjY2Nj4+Pj4+fn6+/z8/P3+/vMr4uLi5P//////8t7g4N7e39/f39/f39/f39/e3t7g4ODg3uDg4ODg4ODg4ODg4ODg4ODg4ODg4ODc3Nzc3O7p6enp6eTp5Onk5OTk5OTk5OTkVuRWVuH27YHs9v////////////////////////8A//////////////////+s4eyB4eLi4isr8/P+/v39/fz7+/r7+/r6+vn5+Pj4+NjY2NjY2AAAAAAAAAAAAAAAAAAAAADY2NjY2Nj4+Pj5+fn6+/z8/f3+8ysr4uLk///////e4ODe39/f39/f39/f39/f397e3t7g3t7g4ODg4ODg4ODe3t7e3uDg3t7e2+Dg4Nzg4Nzd8fXp6Vbk5OTk5OTk5OTk5OTk5OTk5Fbp4eH27YHs/////////////////////////wD////////////////y4ezsgYHi4isrKyvz/v79/f39/Pz8+/v6+vr6+fn4+Pj4+NjY2NgA+fn5+fj4+fn5AAAAAAAAAADY2NjY2Pj4+Pj5+fr7+/z9/f7z8yvi4uRW////7ODg4N7f39/f39/f3t/f39/e3t7g4ODg4ODg4ODg4N7e3t7e3t/f3t7f397f39/f4ODg4ODd9PTu5OTk5OTk5OQs5CzkLOTk5OTk6enp4fbt7YH/////////////////////////AP/////////////t4ezq7IGB7eLiKysr8/7+/v39/fz8/Pz7+/r6+vr5+fj5+Pj4+NjYAPn6+vr6+vr6+vn5AAAAAAAAAADY2NjY2Pj4+Pn5+fr7/Pz9/v4rKyvi4lb////y4ODe3t/f39/f397e3t7e4N7g4ODg4ODc4ODg4ODg3t7e3t7e3t7e3t7e3t/f39/g4ODg4ODd8fHj5unk5OQs5OLk4uTi5Czk5OTk5Ono6OXtgYHs6v////////////////////8A/////////////4Hq6uzs7IHt4uIr8/P+/v79/f38/Pz8+/v7+/r6+fn5+fj4+Pj42Nj5+/r8+/v7+/v7+fr4AAAAAAAAANjY2NjY+Pj4+Pn5+vv8/P39/vMrK+Lk5P///97g4N7e3t/f3t7e4ODg4ODg3ODc4ODc4Nzc3ODg4N7g3uDe3t7e3t7e3t7g3t7g4ODg3Nzc3dz19PT049nk5OTk5OTk5OTi5OTk5OTp6eno5eWB7Ozs/////////////////////wD//////////+Xs6urq7Ozt6OTiKyvz8/7+/f39/Pz8/Pv7+/r6+vn5+fn5+Pn4+Pj4+fv7+/z5+fn5+fv7+vr4AAAAAAAAANjY2NjY+Pj4+fn6+/v8/f3+8ysr4uLk///s4ODe3t7f3t7e3uDg3Nzc3Nzc3Nzg3ODc3d3c4ODe4N7g3t7e3t7g4ODg4N7g4ODc4ODg3N319fX09PX08fDx5uTk5OTk5OTk5OTk5OTp6eno5eXt7Ozq6ur/////////////////AP///////+3s6urq7OyB7e3o5OIrK/P+/v39/fz8/Pz7+/v6+vn5+fn5+fn5+fj5+Pn6+/v7+djY2NjY+fv6+vn4AAAAAAAA2NjY2Nj4+Pj5+fr7+/z8/f7z8yvi4uT///Lg4N7e3t7e4ODg3Nzc3N3c3dzc4Nzg3fX19PXd3ODg4ODe4N7e4N7e4ODe4ODg3ODg3ODd9fX09PT09fX18fDw8OPu6eTk5OTk5Onp6enp6Ojo5e3t7Ozs6urq7P////////////8A5Fbh7IHs7Ors7Ozs7O3t5eji4isr8/7+/f38/fz8+/v7+vr6+fn5+fn5+fn5+fn5+vr7+/nY2NjY2NjY+fv6+fkAAAAAAAAA2NjY2Pj4+Pn5+fr7/Pz9/v4rK+LiVv/t3t7g4ODe4ODg3Nzd3Nzc3fX13dzg3Nz19fX19fX13dzg4ODg4ODe4ODg4ODg4ODg4ODg3PX19fT09PT19fX19fX19fXu7urs6enk6eTp6enp6Ojl5e3tguzs7Ozq7OyB7IH26eXt9wD19fX19Nrj4+Pj49ra4+Pa2lbiKyvz/v39/fz8/Pz7+/r6+fn5+fn5+fn5+vn5+fn7+/v6+NjY2NjY2NjY+fv6+QAAAAAAAADY2NjY2Pj4+Pn5+vv8/P3+/vMrK+LkK+zd3uDg3ODg4Nzg3fX13d319fX13eDg9fX13fX19fX09d3c3ODc4Nzg4Nzc3Nzg3ODb4Nz19fX19PT09PT19fX19fX19fX13Ovc6+vr5u7q7IHt9unpVuTi4uLi4isrKysr4uLi5FboAP//////////////////////K+IrK/P+/v39/Pz8+/v6+vn5+fn5+fn5+vr6+vr5+vv7+vjY2NjY2NjY2NjY+fn5AAAAAAAAANjY2NjY+Pj4+fn6+/z8/f7+8yvi4uQr8vXb3dzd3dzg3N319fXd9fX09fXc3Nz19d3u9fX19PT03dzg4ODc3N3c3d3d3d3d3dzc9fX19PT09PT09PX09PX19fX19fX13dzc4ODe7P////////////////////////////////8A///////////////////////i4isr8/7+/f38/Pv7+vr5+fn5+fn5+fn5+vr5+vn6+/v52NjY2NjY2NjY2Nj6+vn4AAAAAAAA2NjY2Nj4+Pj5+fr7/Pz9/v7zKyvi4ivn9d319d313d319fX19fX19PT09Nzc3PT19fX19PX19fX03Nzg3d313fX19fX19fX19fT09fT09PTx9PT09fTx9PX19fX19fX13d3c297s/////////////////////////////////wD//////////////////////+LiKyvz8/79/fz8+/r6+fn5+fn5+fn5+vr6+/r7+vv8/PnY2NjY2NjY2NjY2Pn6+fgAAAAAAADY2NjY2Pj4+Pn5+vv8/P3+/vMr4uLk/ef19fT09fX19fX09fXd9fX09PT13dzd9fX09fX09PT09PXd4Nz19PT19PT09fX13fX19PT19PT09PT09PT19PH09PT09fX09fX19d3c3uz/////////////////////////////////AP//////////////////////4uLiK/Pz/v39/Pz7+vn5+fn5+fn5+fn6+vv6+/r7+/v8+fjY2NjY2NjY2Nj4+fn4AAAAAAAAANjY2NjY+Pj4+fn6+/z8/f7+8ysr4uLz5/X09PX19fX19fX19fX19fX09PT19fX19PT09PT09PT09PXc3fTx9PH09PT09PT09PT09PT09PT08fT09PX08fHx8fT09PT09fX19e7e7P////////////+GchQ3AAAfU0lEQVT///////////////////8A///////////////////////i4uIr8/P+/vz8+/v6+fn5+fn4+fn5+fr6+vr7+/v7/Pz5+PjY2NjY2NjY2Pj5+fkAAAAAAADY2NjY2Nj4+Pj5+fr7/Pz9/v7zK+Li5OLv9PHx8fHx9PT09PT09PX19fX09Nr09PX19fT09PT09PX19fX19PH08fTx8fH09PT09PT09PT09PTx9PH09PX08fT09PT09PT19fT13d7s/////////////////////////////////wD//////////////////////+Li4isr8/79/fz8+/r5+fn5+Pj5+fn5+fn6+vv7+vz8/Pr4+NjY2NjY2Nj4+fn5+djYAAAAANjY2NjY2Pj4+Pn5+vv8/P3+/vMrK+Li/+ra8fHx8fD09PHx8fT09PT09PTa2ub19fTd9fX19fXd9fXm5ub09PT08fHx8fH09PX09Ob09PT09PHx9PT09fTx9PX09PT09fX19PX12+z/////////////////////////////////AP///////////////////////+TiKyvz/v39/Pz7+vn5+fn4+Pn5+fn5+fr6+vv7/Pz8/Pr4+NjY2NjY+Pn5+fj42NjY2NjY2NjY2NjY+Pj4+fn6+/z8/f7+8yvi4uT/gebw8fHw8PDx8fHx8fT09PT09PTa9PT09PX19d313fXd9ebm5ubZ9fT08fH09fX15ubm5ubm5vT09PTj2trm5vT09eb19fX09fX05t3r6v////////////////////////////////8A8u/n6+vr6+vn7+/y6uzt6Fbk4ivz/v38/Pz8/PP+/v7+/fz6+fn5+fn5+fn6+vr7+/z8+/r42NjY2Pj5+fn5+dj42PjY2NjY2NjY2Pj4+Pn5+fr7/Pz9/v7zKyvi5P//5+Pw8fHx8PDw8PHx9PTx8fH08fT09PT09PT19fX19fXd9fTm5ubm5ub02tnm5ubm5tnZ2ubm5tra2trZ2ebm5ubm5ubm5ubm5ubm3evc/Pv7+/r6+vn5+fn5+Pn4+Pj4+fv7+/z5+QDu9+3l6faB7IHs7Orq7Ozs7IHt5eXo6Ojp6enpVlZWVunp6eriK/v5+fn4+fn6+/v7/Pz8+/r5+fn5+fn5+fj4+Pj4+Pj42NjY2NjY+Pj4+fn5+/v8/P398ysr4uLk///q2uPj4/Hw8PDw8fH08fH08fHx4/T09PT09PT19fX19fX13eb05vTm5ubZ2dra2tra49ra2drZ2dnZ2dnZ2uba2tna5tn05ubm5u7m6+rp6enp6Ojl5e2Bgezs6uzq7OyB7IH26eXtAP/////////////t7Ozq6uzsge3t5ejo6enpVuTk6eTk5OTk6eTp5P35+fj4+Pn6+vv7/Pz8+/v6+vr6+fn5+Pj4+Pj4+PjY2NjY2Nj4+Pj5+fr7+/z8/f7z8yvi4uT//+3u2uPj4/Dw8PDx8fHx8fH08fH08fT09PT09PT09fX13fXd9ebm2dna2dnZ2drZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tnm5ub17u7r8unp6ejo6OXtgYLs7Orq6uz///////////8A////////////////5ezq6uqC7IHl5ejo6enp5OTk5OTk5OTk5OTkVlbk/fj4+Pn6+/v7+/v7+/r6+vr5+fj5+fj4+Pj4+Pj42PjY+Pj4+Pn5+vv8/P39/vMrK+Li5P///+fa4+Pj4/Dw8PHx8fHx8fHx8fTx8fT09PT09PX19fX13fXd9eba2dra2tra2trZ2tna2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ5vT19fXu3efs5Onp6ejl5YHs7Orq6uz//////////////wD//////////////////4Hq6uzs7IHl6OjpVunk5OTk5OTk5OTk5OTk5ORW5Pz4+Pr6+/v7+/v7+vr6+fn5+Pn5+fj4+Pj4+Pj42Pj4+Pj5+fn7+/z8/f7+8ysr4uTi////8tna2uPj8PDw8PDw8fHx8fHj9PT08fT09PT19PX19fXd9fX12tra2tra2tra2tra2tra2tra2dnm5tna2tra2trZ2vT09fX13d3u5+3p6eno5eWBgezs6uqB////////////////AP//////////////////7eHs6uyBge3l6Onp5OTk5OQs4iziLOLkLOTk5OTk6eT8+fr6+/v7+/r6+vn5+fn5+fn5+fj4+Pj4+Pj4+fj4+Pn5+vv7/Pz9/v7zK+Li4v/////t7tna4+Pw8PDx8PDw8fHx8eP09PTx9PT09PX09fX19fX13fX02tra4+Pj2tra2tra2tra2trZ2dra2tra2uPj2tr08fT09PX19e7v7eTp6Ojl7YGB7Ors//////////////////8A////////////////////5fLh7OyB7e324ejp6eTk5OTk5OTi5OLk5OTk5OTkVunk/Pr5+/v7+/v6+/r6+fn5+fn5+fj4+fn5+fn4+Pj4+fn6+/v8/f3+8/Mr4uJW///////n5trj4/Hx8PHx8fHx8PHj8fT09PT09PT09PT19fX19fX19OPj4+Pj4+Pj2uPa2tra2tra2tra4+Pa2trj4+Pa2vHx9PT09fX17vLp6enh9u3tgers//L//////////////////wD///////////////////////Ks4eyB7eXh6elW5OTk5OTk5OTk5OTk5OTk6eTp6enp9vv6+vv7+/v7+/v6+fr5+fn5+fn5+fn5+fn5+fn5+fr7/Pz9/f7zKyvi4uL//////+rm2drj4/Hw8fHx8fDx4+P09PT09PT08fHx8fT09fX19PT04+Pj2uPj4+Pj2tra2tra2trj2ub09ebm49rj4+P09PHx9PH09PXr7Onp6eHl7YHs////////////////////////AP/////////////////////////y9uyB7fbh6Vbk5OTk5OTk5OTk5OTk6eTk6enp6enoVvn6+vv7+/v7+/r6+vr5+fn5+fn5+fn5+fn5+fn6+/v8/P3+/vMr4uLk4v///////+7m2drj4+Pj4/Dx8fDj4+Pj4/Tj9PHx8fHx8fTx9PT04+Pj4+Pj4+Pj4+Pa2tra49rj4/T19fT19e7m4+Pj4/Tx8fHx8Nr09OeBVlbh9u2B7Pb///////////////////////8A///////////////////////////c7eyB7fbh6Vbp5Onp5Onk5Onk6enk6enp6enp6Ono6fz6+/v7+/v7+/r6+vn5+fn5+fn5+fn5+fn5+vv7/Pz9/f7zKyvi4uT/////////5+bZ2ePj4/Hj4+P02uPj4+Px4+Pj4+Px8fHw8PDw8fHx4+Pj4+Pj49ra2dra2trj4/Tm9fX09PX09fX04+Pj9PHx8fHj9PH03+lW4fbtgezl8v///////////////////////wD////////////////////////////g7eqB7e3h6VbpVuTp6enp6enp5Onp6enp6ejp6Ojo5fv6+/v7+/v6+vr6+fn5+fn5+fn5+fr6+fr7+/z8/P3+/vMrK+Li///////////q5tnZ2drj4+Pj8Nr04+Px4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj8ePj2tra2uPj4+Pa9fX09PT09PTa9OPj4+Pj8fH09PTj8e7s6fbt7YHs7fL/////////////////////////AP/////////////////////////////bgeqBge3h4enp6Vbp6enp6enp6enp6eno6ejo6Ojl7fr6+vv7+/v7+vr6+vr6+vr6+vr6+vr6+/v8/Pz9/f7z8yvi4lb////////////u5tnZ2dna4+Pj9OPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Px4+Pj2trj4+Pj4+Pa2ub02vTa9OPj4+Pj4+Pj4+Pj4+bm2tra5/bh7YGB6oHy//////////////////////////8A///////////////////////////////bgezsge324eHp6enp6enp6eno6ejp6Ojo6Ojo5eXlgfr6+/v7+/r7+vr6+vr6+vr6+vr6+vv7+/z8/f3+/vMrK+Li4v////////////Lm5tnZ2tna2tra4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj49ra2uPj4+Pj4+Pj8ePj4/Ta2uPj2tra4+Pj4+Pj9Nrm5u7y9u2B7OqB8v///////////////////////////wD////////////////////////////////f8uzsge329uHh6enp6Ojo6Ojo6Ojo6Ojo5eXl5eXt7Pv6+vv7+/v6+vv6+/r6+/v7+/v7+/v8/Pz9/f7zKyvi4lb//////////////+7m2dnZ2tra2tra2uPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj49ra2uPj4+Pj4+Pj4+Pj4+Pj4+Pj2tra4+Pj2uPj49rZ5ubu5+3tgezs6vL/////////////////////////////AP///////////////////////////////9/s8uzsge3l9vbh9uHh4ejo6OXl6OXl5eXl5e3t7e3t7Pv6+/v7+vv7+/v7+/v7+/v7+/v8/Pz8/f3+8/MrK+JW4v//////////////8ubm2dnZ2tra2tra2trj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj2uPj49ra2trj4+Pj4+Pj4+Pa2tra2dnZ2dnZ2ebm7uvf7YHs7PLs7P////////////////////////////8A/////////////////////////////////9zq6ursgYHt5eX29vb29uXl9uXt5eXl5eXl5e3tgu2B7Pv6+/v7+/v7+/v7+/v8+/z8/Pz8/P39/v7zKyvi4uT/////////////////6+bZ2dna2tra2tra2tra2uPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pa2tra2uPj4+Pa4+Pa2tnZ2dnZ2dnZ2dnZ5ubm5+yB7Ozy7PL//////////////////////////////wD//////////////////////////////////9/f6uzs7IHt7eXl5eXl5e3t7e3t7e3t7e3t7e3tgYLs7Pv7+/v7+/v7/Pz8/Pz8/Pz8/Pz9/f7+8ysr4uJW4v/////////////////q7ubZ2dnZ2tra2tra2tra2tra2trj4+Pj49ra49ra2uPj4+Pa2uPj4+Pj4+Pj2tra2tnm2dnZ2dnZ2drZ2dnm5uvf7Ozq6vLy////////////////////////////////AP//////////////////////////////////8urf6uzs7Ozt7e3t7e3t7e3t7YGBgYGBgoGCgYKB7Ozs6vv7+/v8/Pz8/Pz8/Pz8/Pz9/f3+/vPzKyvi5OL////////////////////v5ubZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2uPj4+Pj4+Pj49ra2trZ2dnZ2dnZ2tnZ2dnZ2dnZ5ubu7+zs7Orf7IH///////////////////////////////8A////////////////////////////////////3/Ly6urs7IGB7e3t7e3t7YGBgoGC7OyB7IHs7OyC7Ozs6vv7/Pz8/Pz8/fz9/P39/f39/v7z8ysr4uLk///////////////////////r5ubZ2drZ2dnZ2tra2tra2dra2tra2tra2tra2tra2tra2tra2tna2dnZ2dnZ2dra2trZ2dnZ2dnZ2dnm7ufq6uzq3+zq/////////////////////////////////wD/////////////////////////////////////3t/y6urs7OyBgYGBgYGBgYHsgYHs7OyC7Ozs7Ozsgurq7Pz8/Pz8/f39/f39/f39/v7+8/MrK+LiVv/////////////////////////u5tnZ2dra2tra2tra2tra2tra2tra2dra2tra2tra2tnZ2dra2dnZ2dnZ2tra2tnZ2dnZ2dnZ2dnZ5u7n5+zs8vLf8v//////////////////////////////////AP/////////////////////////////////////e8t/y6urq6uzs7OzsgYHsgezs7Ozq6uzs6oLq6urqgurq6vz8/f39/f39/v7+/v7+/vMrKyvi4v///////////////////////////+rm5tnZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2drZ2tra2tra2tra2trZ2dnZ2dnZ2dnm2ebu79vq6ury3+rs//////////////////////////////////8A///////////////////////////////////////c39/y6urq6uzsgezs7OyB7Ozs6urq6urq6uqC6urq6urq/f39/f39/v7+/v7z8/MrKysr4uL///////////////////////////////Lm5tnZ2dna2tra2tra2tra2tra2tra2tnZ2dna2dnZ2dra2tra2tra2trZ2dna2drZ2dnZ2ebu7uvc6urq8t/q8v///////////////////////////////////wD////////////////////////////////////////c39/f8urq6urs7Ozs7OyB7Orq6vLy7+/v7+/v7+/v7+/v9vz8/f3+8/PzK/MrKysr4uLi/////////////////////////////////+/m5tnZ2dnZ2trZ2tra2tra2dna2tnZ2tra2tra2tra2tra2tna2tnZ2drZ2dna2dnZ2ebm5uvr3Ory8vLe6vL/////////////////////////////////////AP/////////////////////////////////////////b39/y8vLy6uzs7Ors7Ozs7Orv7/Ly7+/v7+/v7+/v7+/v8vz8/vPzKysrK+Ir4uLi4v///////////////////////////////////+/m5tnZ2dna2tra2tra2tra2tra2dna2tra2tra2tra2dnZ2dnZ2drZ2tna2tnZ2dnm5u7r7tzy8vLy3vLq//////////////////////////////////////8A///////////////////////////////////////////c397f8vLy6urq6vLq6u3k4uTh9+vn5+/v7+/v7+/v7+/v/P3zKysrK+Li4uLi4lb///////////////////////////////////////Lu5tnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnm5ubu5+7c8vLy397y6v///////////////////////////////////////wD////////////////////////////////////////////c3Nve3/Ly8ury8vLy7Svz8yvk5PLu6+vn5+vr6+vr6+frKysr4uLi4uLi5Fb//////////////////////////////////////////+/u5tnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ5ubm7ufu3PLy397b4PL/////////////////////////////////////////AP/////////////////////////////////////////////03ODe3t/y8vLy8vLqVvMrK/Pz5Fbv9PTu7uvu7u7u7uvu4uLi4uTk5FZW//////////////////////////////////////////////Ln5ubZ2dnZ2trZ2dra2trZ2dra2tra2dra2tra2tnZ2dnZ2dnZ2dnZ5ubm7u7u9dzy39/e4N/c7P////////////////////////////////////////8A///////////////////////////////////////////////f3Nzg29/f3/Ly79/q9uLz8yvz8+RWgfHw5ubm5ubm7u7u4uTk5FZW/////////////////////////////////////////////////+rv7ubm5tnZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2tra2trZ2drZ2dnZ2ebm5u7r7t3f39/b4Nzb3////////////////////////////////////////////wD////////////////////////////////////////////////f3N3c3Nve3t/y39/f6oH2VuLz8/Pi6eHw8OPm5ubm7ubuVlZWVv/////////////////////////////////////////////////////g5+7m5tnZ2dnZ2dnZ2dnZ2dnZ2tra2trZ2dna2dnZ2dnZ2ebm5ubu7u7d3t7b3Nzd3N//////////////////////////////////////////////AP/////////////////////////////////////////////////f3N3d3Nzc297f397e3N7q7IHtViv+81bp5/Dw5ubm5ubu6v/////////////////////////////////////////////////////////y3Ofm5tnm2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ5ubm5ubu5+713tvc3Nzd3dzf//////////////////////////////////////////////8A///////////////////////////////////////////////////s3d3d3d3d3Nzg29vb29zc3eDy7IGB7e324en08Obm5ubm6///////////////////////////////////////////////////////////8uvr7ubm2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnm5ubm5ubu5+713dzc3d3d3dzd8v///////////////////////////////////////////////wD/////////////////////////////////////////////////////3/Xd9N3d3d3c3Nzc4Nvb2+Dd3d3d3eztgd3h9Nrw5ubu7v///////////////////////////////////////////////////////////9/n6+7m5ubm2dnZ2dnZ2dnZ2dnZ5ubm5ubm7u7r7t303d3d3d3d9N303///////////////////////////////////////////////////AP///////////////////////////////////////////////////////9/d3fTd9d3d3d3c3Nzc3Nzg4ODb3N3d2+Xc3ena5tnm5v/////////////////////////////////////////////////////////////y2+fr7u7m5ubm5ubm5ubm5u7m7u7u6+fu3fT09d3d3d3d9N3d3/////////////////////////////////////////////////////8A///////////////////////////////////////////////////////////f4PTx9PT03d313d3d3d3d3Nzc3Nzb3dvb9tz15trZ2uv//////////////////////////////////////////////////////////////93d9+fr6+vr7u7u6+vr6+v19OPd9PT03d3d9PT08fTc8v///////////////////////////////////////////////////////wD////////////////////////////////////////////////////////////////e3N3x9PT09PX03d313d3d3Nzg3t7d29vg3O718vT///////////////////////////////////////////////////////////T08vXd3d3d3fH08fHx8fHx9PX09PT19PT09PHd3N7t////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////+B3uDd3fX09PTd3d3d3d3d3dzc4ODg3N319PX19d3f39/f/////////////////////////////+Xtgezs6vLy8urs9PT09PT03dys8vLq8t736+vr6+719PTd9N3d4OCB//////////////////////////////////////////////////////////////////8A////////////////////////////////////////////////////////////////////////////9u3t7dze3d3c8t3d29/f8t703dze3ODd3d3d3dzc34Hs6vLf29zc3Nzb39zh7YHq8t/b8vLy8t/e3Nzc3t/p6enh4YHh4eHs8vLf8t7f3t7f8vLy8uzsgYHt9v///////////////////////////////////////////////////////////////////5cpK5EsZ8r3AAAAAElFTkSuQmCC");
			ok_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAD9/f0bIQwZHgowLzEoKCohISIvMDU1NjoqLDOCg4S1trQUGQemqZ54e28fIxE0NiyFiXaSlYZNTkkuMCNZWlRvcGonKRo9PzEKCgUREQtBQUDU1NMZGBQfHhp9fHozLiv8/Pz5+fn39/f09PTv7+/n5+fe3t4AAADXRk1jAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAIABJREFUeNoBSD+3wAD/////////////////////////////////////////////////////////////////6eH29uXl7e3t7e3t9uHs4elWVlbk5OTp6elW5YHq39zd9PTc3d3d3dzc297f39/e29zc3d3d3d3d3eDc3N3c3Nzc3d319PT09PT03dzc3Nzc3N3d5YHs7OyBge3t5fb24en/////////////////////////////////////////////////////////////////////AP//////////////////////////////////////////////////////////6eH27YHb3PLs4eHpVlbpVuHp4e3q4ODg4ODc3fT09fTx8azc3fX08dzc3N3d3Nzb39/y36zg3N3d3d3d3d3d4Nzd3d3d3fX08PD09PT09PT13ODg4ODc4N3x8fHx8fDx8fT09d3c24Ht//////////////////////////////////////////////////////////////////8A////////////////////////////////////////////////////////9u3b3OlWVlZWVlZW5FZWVlZWVlZWVlbp9urb3N3d8vT0//////////////////////////////////////////////////////////////T08t3u3ODb3t3e3uDc3d3d3d3d3fT09fT18fTd3Nvt/////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////8tz0VlZWVlZW5OTk5OTk4uTi5OTk5OTkVlZWVlbhgfL17Vb////////////////////////////////////////////////////////////////12tna5t3c9tve3eDg3Nzd3d3d3d3d3d3d9PT19PT03PL/////////////////////////////////////////////////////////AP//////////////////////////////////////////////////393pVlZWVuTk5OLk4uLi4uLi4uLi4uLi4uLi5OTk5FZW6e3//////////////////////////////////////////////////////////////+zy6t/f3ubZ5vTp9dzl293d3Nvg4ODg3Nzc3dzd3d3d3d303d3f//////////////////////////////////////////////////////8A////////////////////////////////////////////////3/XpVlZW5OTk4uLi4uLi4uLiKysrKysrK+Li4uLi4uLk5ORWVlb//////////////////////////////////////////////////////////+rq8t/f3t7g4Obm5vDa9OHd7e3s3d3d3dzc29vb4ODc3N3d3d3d9N313////////////////////////////////////////////////////wD//////////////////////////////////////////////93cVlZW5OTi4uLi4uLi8/38/Pz8/f39/f39/P3+K+Li4uLi4uTkVlZW/////////////////////////////////////////////////////+rq39/e3uDg4N7b3ubm5ubm8PTh6fbt7YGB7PLc3dzc29vb2+Dc3N3d3d3c3YH/////////////////////////////////////////////////AP///////////////////////////////////////////9/cVlZW5OLi4uLiK+Ir/vz8/Pv7+/v7+/v7+/v7+/z8/Ssr4uLi4uLk5FZWVv///////////////////////////////////////////////4Hy8t/e3t7erN7e397erN7u5ubm5vDw9+lW8/MrVu2B7Ore3ODe39/e29zc3d3d3N////////////////////////////////////////////////8A///////////////////////////////////////////f3FZW5OTi4uLi4isr/vz8+/v7+/v7+vr6+vr7+/v7+/v7/CsrKyvi4uLi5ORWVv/////////////////////////////////////////////q6t/e397f39/f39/f397e3qzm7ubm5ubj8PDh6eLz/isrVvaB7N/f39/f397b3Nzd3IH//////////////////////////////////////////////wD/////////////////////////////////////////31ZW5OTi4uLiKysr8/37+/v6+vr6+vr6+vr6+vr6+vr6+vv7/isrKysr4uLi4uTkVv//////////////////////////////////////////8vLf3t/f397e3t7e3t7e3t7e3t7u7ubm5ubu5vDxgVbk8ysr8/Pi9urf8vLy39/f2+Dc2///////////////////////////////////////////////AP///////////////////////////////////////+BWVuTk4uLiKysrK/P9+/r6+fn5+fn5+fn5+fn5+fn5+fn6+vz98/MrKysr4uLi4uTkVlb/////////////////////////////////////7Orf39/f397e3t7e3t7e3t7g4N/y7O3r7u7u7u7u7u709O9W5PPzKyvzVurv8vLy8vLf397g//////////////////////////////////////////////8A///////////////////////////////////////yVlbk4uLiKysrKyvz/v38+/z8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/f7+/vPzKysrK+Li4uLkVlb//////////////////////////////////+ry39/f39/e3t6s3t7e3t7g4PLt4eHh4eHn6+vr6+vr5+fr693y5OQr8/Mr7fLy8vLq8vLy39/b4P///////////////////////////////////////////wD/////////////////////////////////////6lbk5OLi4uIrKyvz/v7+/f39/fz9/Pz8/Pz8/Pz8/Pz8/P38/P39/f39/v7+8ysrKyvi4uLkVlb////////////////////////////////q8t/f39/f36ze3t7g3t7e4PKB4eHh4eHh4eHv7+/n7+/v7+/v5+fc9+Hk4uTt6urq6urq6vLy8t/e8v//////////////////////////////////////////AP///////////////////////////////////+pWVuTi4uIrKyvz8/7+/v39/fz8/Pz8/Pz8+/v7+/v7+/v7/Pz8/Pz8/f39/v7+8/MrKyvi4uLkVlb/////////////////////////////6t/f39/f39/e4ODg4N7g4ODy7fbh9uHh4eHh4eHv7+/v7+/v7+/v7+/y3+/q7Ozs7Orq7Ozq6vLy8vLf8v////////////////////////////////////////8A////////////////////////////////////VuTk4uIrKysr8/7+/v39/fz8/Pz8+/v7+/v7+/v7+/v7+/v7+/v8/Pz8/P39/f7+8/MrKyvi4uLkVlb//////////////////////////+ry39/f39/e4ODg4ODe3t7g34Hh4eHh4eHh4eHh4eHy8vLy8vLy8vLy8vLq6urs7Ozs7Ozs7IHq6ury8vLf6v///////////////////////////////////////wD/////////////////////////////////7VZW5OLi4isrK/7+/v39/fz8/Pz7+/v7+/r6+vn5+vr6+vn5+vr7+/v7+/z8/Pz9/f3+/vMrKyvi4uLkVv/////////////////////////s8t/f3t/e4ODg4ODg4N7e4ODfgeHh4eHh4eHh4eHh4eHq6urq6urq6urq6vLq6uzsgYHsgezs7Ozs6urq6t/f6v//////////////////////////////////////AP///////////////////////////////4FWVuTi4isrK/Pz/v79/fz8/Pz7+/v7+vn6+fn5+fn5+fn5+fn5+fr5+vr7+/v8/Pz8/f3+/vMrKyvi4uLkVv//////////////////////gd/f3t/e4ODg3uDg4N7e4N7g3t/sge329uH29u2B7e3tgerq6oLqgurqgurs6urs7OzsgeyBgYGB7Ozs7Orq6vLf6v////////////////////////////////////8A////////////////////////////////Vlbk4uLiKyvz8/7+/f38/Pz7+/v6+vr5+fn5+fn4+Pj4+Pj4+fn5+fn5+fn6+/v7/Pz8/f3+/v4rKyvi4uLkVv///////////////////+Xf3t7e4ODg4N7g4N7e3uDe3t7e3t7y6vLy8vLf397e4ODe6+qC6urs7Ozs7Ozs7Ozs7IHsgYGBgYGBgYHs7Ozs6vLf8v///////////////////////////////////wD//////////////////////////////1ZW5OLi4isrK/P+/v39/Pz8+/v7+vn5+fn5+Pj4+Pj4+Pj4+Pj4+Pj4+fn5+fn6+/v7/Pz8/f3+/vPzKyvi4uTkVv//////////////////3+Dg4ODg4ODe3uDg4ODg3uDe3t7e3uDg4N7e4ODg4ODe3t7g2+zs7OyC7Ozs7IGCgYGB7IHtge3t7e2BgYGB7Ors6vLq////////////////////////////////////AP/////////////////////////////tVlbk4uIrKyvz/v39/fz8+/v7+vr5+fn5+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5+fn6+vv7+/z8/f3+/vMrKyvi4uRW/////////////////+rg4ODg4ODg4N7g4ODg4ODe3uDg3t7g4ODg4N7g3t7e3t7e3t7e2+zs7IGBgu2BgYGBge3tge3t7e3t7eXt7YGB7Ozq6vLs//////////////////////////////////8A/////////////////////////////1ZW5OLi4isr8/7+/f38/Pz7+/r5+fn5+Pj4+Pj4+Pj42NjY2NjY+Pj4+Pj4+Pj4+fn5+vv7+/z8/f3+/vMrKyvi4uRW//////////////+B4ODg4ODg4ODg4N7b4ODg4ODg4ODg4ODg3t7e3t7e3t7e4N7e3t7e7+yBgu3t7e3t7e3t7e3t7e3t5eXl5eXl7e2Bgezq6vL//////////////////////////////////wD////////////////////////////hVlbi4uIrK/P+/v39/Pz8+/r6+fn5+Pj4+Pj4+NjY2NjY2NjY2NjY2NjY+Pj4+Pj4+fn5+vv7+/z8/f3+/vMrK+Li5OT///////////////Lf4ODg4ODg4ODg4ODg4ODc4Nzg4ODg4N7e3t6s3t/f397e3t7e3t/f7+3t7e3t7eXl7eXt5eXl5eX29vb29vbl5e2Bgezs8v//////////////////////////////////AP///////////////////////////1ZW5OLiKyvz8/79/f38/Pv6+vn5+fj4+Pj4+NjY2NjY2NjY2NjY2NjY2NjY2Pj4+Pj4+Pn5+vr7+/z8/f3+/vMrK+Li5Fb/////////////8t7g4ODg4ODg4ODg4ODg4ODg4ODb4N7e397f3t/f397e3qze3t7e3t7frIHt7e3l5eXl5eXl5eXl6Ojo4eHh4eH29uXtgezs8uz///////////////////////////////8A//////////////////////////9WVuTi4isrK/P+/v39/Pz8+/r6+fn4+Pj4+PjY2NjY2NjY2NjY2NjY2NjY2NjY2Nj4+Pj4+Pn5+vr7/Pz8/f7+8ysr4uLi5P////////////Lf3+Dg4ODg4ODg4ODg4ODg4ODg297e39/f39/e3t7e3uDg4ODg4ODe4N7b5+3t5eXl5ejo6Ojo6Ojo6Ojo6Onp4eHh9vbtgezs6v///////////////////////////////wD//////////////////////////1ZW4uLi4ivz/v79/f38/Pv7+vn5+Pj4+Pj42NjY2NjY2NjY2NjY2NjY2NjY2NjY2Nj4+Pj4+Pn5+vr7/Pz9/f7z8ysr4uLkVv/////////q8t/e3t7e4ODg4ODg4ODg4ODb3t7e3t/frN7e3uDg4ODc4Nzg3ODg4ODg4ODb6+Xl5ejo6Ojo6Ono6ejp6enp6enp6enh4fbtgezqgf//////////////////////////////AP/////////////////////////lVuTi4isr8/P+/v39/fz8+/r5+fn5+Pj4+NjY2NjY2NjY2NgAAAAAAAAA2NjY2NjY2Nj4+Pj4+Pn5+vv7/Pz9/f7zKysr4uTk//////////Lf4N7e3uDg4ODg4ODg4ODg3t7g3t7e3uDg4ODg3ODc4ODg4ODg4ODg4ODc4Nzg6+Xo6Ojo6ejp6enp6enp6enp6elWVunp6eHtgYHq7f////////////////////////////8A////////////////////////7Vbk4uLiKyvz8/7+/f38/Pv7+vn5+fn4+Pj42NjY2NjY2NjYAAAAAAAAAAAAANjY2NjY2Nj4+Pj4+fn5+vv7/Pz9/v7zK+Li4uT////////t397e3t7g4ODg3t7e3t7g4ODg4N7g4ODg4ODg4ODg4N7e3t7e3uDg4ODg4ODc3Nzc4Ojo6Ojo6enp6enp6enp6enp6elWVlbp6eHt7YHs7f///////////////////////////wD//////////////////////+WBVuTi4isr8/P+/v39/fz7+/r6+fn5+fj4+PjY2NjY2NjY2AAAAAAAAAAAAAAAAADY2NjY2Nj4+Pj4+fn5+vv8/P39/vPzKyvi5Fb//////+zf4ODg4ODg4N7f39/f39/e3uDg4ODg4ODg4ODg4ODg4N7e3t7e4ODg4ODg3Nzc3Nzc3Ojo6enp6enpVuTkVuTk5ORW5OlW5FZW6eH27YHs////////////////////////////AP/////////////////////27O3k4uIrKyvz/v7+/f38/Pv7+vn5+fn5+Pj4+NjY2NjY2NjYAAAAAAAAAAAAAAAAAADY2NjY2Nj4+Pj4+fn6+/z8/P3+/vMr4uLi5P//////8t7g4N7e39/f39/f39/f39/e3t7g4ODg3uDg4ODg4ODg4ODg4ODg4ODg4ODg4ODc3Nzc3O7p6enp6eTp5Onk5OTk5OTk5OTkVuRWVuH27YHs9v////////////////////////8A//////////////////+s4eyB4eLi4isr8/P+/v39/fz7+/r7+/r6+vn5+Pj4+NjY2NjY2AAAAAAAAAAAAAAAAAAAAADY2NjY2Nj4+Pj5+fn6+/z8/f3+8ysr4uLk///////e4ODe39/f39/f39/f39/f397e3t7g3t7g4ODg4ODg4ODe3t7e3uDg3t7e2+Dg4Nzg4Nzd8fXp6Vbk5OTk5OTk5OTk5OTk5OTk5Fbp4eH27YHs/////////////////////////wD////////////////y4ezsgYHi4isrKyvz/v79/f39/Pz8+/v6+vr6+fn4+Pj4+NjY2NgA+fn5+fj4+fn5AAAAAAAAAADY2NjY2Pj4+Pj5+fr7+/z9/f7z8yvi4uRW////7ODg4N7f39/f39/f3t/f39/e3t7g4ODg4ODg4ODg4N7e3t7e3t/f3t7f397f39/f4ODg4ODd9PTu5OTk5OTk5OQs5CzkLOTk5OTk6enp4fbt7YH/////////////////////////AP/////////////t4ezq7IGB7eLiKysr8/7+/v39/fz8/Pz7+/r6+vr5+fj5+Pj4+NjYAPn6+vr6+vr6+vn5AAAAAAAAAADY2NjY2Pj4+Pn5+fr7/Pz9/v4rKyvi4lb////y4ODe3t/f39/f397e3t7e4N7g4ODg4ODc4ODg4ODg3t7e3t7e3t7e3t7e3t/f39/g4ODg4ODd8fHj5unk5OQs5OLk4uTi5Czk5OTk5Ono6OXtgYHs6v////////////////////8A/////////////4Hq6uzs7IHt4uIr8/P+/v79/f38/Pz8+/v7+/r6+fn5+fj4+Pj42Nj5+/r8+/v7+/v7+fr4AAAAAAAAANjY2NjY+Pj4+Pn5+vv8/P39/vMrK+Lk5P///97g4N7e3t/f3t7e4ODg4ODg3ODc4ODc4Nzc3ODg4N7g3uDe3t7e3t7e3t7g3t7g4ODg3Nzc3dz19PT049nk5OTk5OTk5OTi5OTk5OTp6eno5eWB7Ozs/////////////////////wD//////////+Xs6urq7Ozt6OTiKyvz8/7+/f39/Pz8/Pv7+/r6+vn5+fn5+Pn4+Pj4+fv7+/z5+fn5+fv7+vr4AAAAAAAAANjY2NjY+Pj4+fn6+/v8/f3+8ysr4uLk///s4ODe3t7f3t7e3uDg3Nzc3Nzc3Nzg3ODc3d3c4ODe4N7g3t7e3t7g4ODg4N7g4ODc4ODg3N319fX09PX08fDx5uTk5OTk5OTk5OTk5OTp6eno5eXt7Ozq6ur/////////////////AP///////+3s6urq7OyB7e3o5OIrK/P+/v39/fz8/Pz7+/v6+vn5+fn5+fn5+fj5+Pn6+/v7+djY2NjY+fv6+vn4AAAAAAAA2NjY2Nj4+Pj5+fr7+/z8/f7z8yvi4uT///Lg4N7e3t7e4ODg3Nzc3N3c3dzc4Nzg3fX19PXd3ODg4ODe4N7e4N7e4ODe4ODg3ODg3ODd9fX09PT09fX18fDw8OPu6eTk5OTk5Onp6enp6Ojo5e3t7Ozs6urq7P////////////8A5Fbh7IHs7Ors7Ozs7O3t5eji4isr8/7+/f38/fz8+/v7+vr6+fn5+fn5+fn5+fn5+vr7+/nY2NjY2NjY+fv6+fkAAAAAAAAA2NjY2Pj4+Pn5+fr7/Pz9/v4rK+LiVv/t3t7g4ODe4ODg3Nzd3Nzc3fX13dzg3Nz19fX19fX13dzg4ODg4ODe4ODg4ODg4ODg4ODg3PX19fT09PT19fX19fX19fXu7urs6enk6eTp6enp6Ojl5e3tguzs7Ozq7OyB7IH26eXt9wD19fX19Nrj4+Pj49ra4+Pa2lbiKyvz/v39/fz8/Pz7+/r6+fn5+fn5+fn5+vn5+fn7+/v6+NjY2NjY2NjY+fv6+QAAAAAAAADY2NjY2Pj4+Pn5+vv8/P3+/vMrK+LkK+zd3uDg3ODg4Nzg3fX13d319fX13eDg9fX13fX19fX09d3c3ODc4Nzg4Nzc3Nzg3ODb4Nz19fX19PT09PT19fX19fX19fX13Ovc6+vr5u7q7IHt9unpVuTi4uLi4isrKysr4uLi5FboAP//////////////////////K+IrK/P+/v39/Pz8+/v6+vn5+fn5+fn5+vr6+vr5+vv7+vjY2NjY2NjY2NjY+fn5AAAAAAAAANjY2NjY+Pj4+fn6+/z8/f7+8yvi4uQr8vXb3dzd3dzg3N319fXd9fX09fXc3Nz19d3u9fX19PT03dzg4ODc3N3c3d3d3d3d3dzc9fX19PT09PT09PX09PX19fX19fX13dzc4ODe7P////////////////////////////////8A///////////////////////i4isr8/7+/f38/Pv7+vr5+fn5+fn5+fn5+vr5+vn6+/v52NjY2NjY2NjY2Nj6+vn4AAAAAAAA2NjY2Nj4+Pj5+fr7/Pz9/v7zKyvi4ivn9d319d313d319fX19fX19PT09Nzc3PT19fX19PX19fX03Nzg3d313fX19fX19fX19fT09fT09PTx9PT09fTx9PX19fX19fX13d3c297s/////////////////////////////////wD//////////////////////+LiKyvz8/79/fz8+/r6+fn5+fn5+fn5+vr6+/r7+vv8/PnY2NjY2NjY2NjY2Pn6+fgAAAAAAADY2NjY2Pj4+Pn5+vv8/P3+/vMr4uLk/ef19fT09fX19fX09fXd9fX09PT13dzd9fX09fX09PT09PXd4Nz19PT19PT09fX13fX19PT19PT09PT09PT19PH09PT09fX09fX19d3c3uz/////////////////////////////////AP//////////////////////4uLiK/Pz/v39/Pz7+vn5+fn5+fn5+fn6+vv6+/r7+/v8+fjY2NjY2NjY2Nj4+fn4AAAAAAAAANjY2NjY+Pj4+fn6+/z8/f7+8ysr4uLz5/X09PX19fX19fX19fX19fX09PT19fX19PT09PT09PT09PXc3fTx9PH09PT09PT09PT09PT09PT08fT09PX08fHx8fT09PT09fX19e7e7P////////////+GchQ3AAAfU0lEQVT///////////////////8A///////////////////////i4uIr8/P+/vz8+/v6+fn5+fn4+fn5+fr6+vr7+/v7/Pz5+PjY2NjY2NjY2Pj5+fkAAAAAAADY2NjY2Nj4+Pj5+fr7/Pz9/v7zK+Li5OLv9PHx8fHx9PT09PT09PX19fX09Nr09PX19fT09PT09PX19fX19PH08fTx8fH09PT09PT09PT09PTx9PH09PX08fT09PT09PT19fT13d7s/////////////////////////////////wD//////////////////////+Li4isr8/79/fz8+/r5+fn5+Pj5+fn5+fn6+vv7+vz8/Pr4+NjY2NjY2Nj4+fn5+djYAAAAANjY2NjY2Pj4+Pn5+vv8/P3+/vMrK+Li/+ra8fHx8fD09PHx8fT09PT09PTa2ub19fTd9fX19fXd9fXm5ub09PT08fHx8fH09PX09Ob09PT09PHx9PT09fTx9PX09PT09fX19PX12+z/////////////////////////////////AP///////////////////////+TiKyvz/v39/Pz7+vn5+fn4+Pn5+fn5+fr6+vv7/Pz8/Pr4+NjY2NjY+Pn5+fj42NjY2NjY2NjY2NjY+Pj4+fn6+/z8/f7+8yvi4uT/gebw8fHw8PDx8fHx8fT09PT09PTa9PT09PX19d313fXd9ebm5ubZ9fT08fH09fX15ubm5ubm5vT09PTj2trm5vT09eb19fX09fX05t3r6v////////////////////////////////8A8u/n6+vr6+vn7+/y6uzt6Fbk4ivz/v38/Pz8/PP+/v7+/fz6+fn5+fn5+fn6+vr7+/z8+/r42NjY2Pj5+fn5+dj42PjY2NjY2NjY2Pj4+Pn5+fr7/Pz9/v7zKyvi5P//5+Pw8fHx8PDw8PHx9PTx8fH08fT09PT09PT19fX19fXd9fTm5ubm5ub02tnm5ubm5tnZ2ubm5tra2trZ2ebm5ubm5ubm5ubm5ubm3evc/Pv7+/r6+vn5+fn5+Pn4+Pj4+fv7+/z5+QDu9+3l6faB7IHs7Orq7Ozs7IHt5eXo6Ojp6enpVlZWVunp6eriK/v5+fn4+fn6+/v7/Pz8+/r5+fn5+fn5+fj4+Pj4+Pj42NjY2NjY+Pj4+fn5+/v8/P398ysr4uLk///q2uPj4/Hw8PDw8fH08fH08fHx4/T09PT09PT19fX19fX13eb05vTm5ubZ2dra2tra49ra2drZ2dnZ2dnZ2uba2tna5tn05ubm5u7m6+rp6enp6Ojl5e2Bgezs6uzq7OyB7IH26eXtAP/////////////t7Ozq6uzsge3t5ejo6enpVuTk6eTk5OTk6eTp5P35+fj4+Pn6+vv7/Pz8+/v6+vr6+fn5+Pj4+Pj4+PjY2NjY2Nj4+Pj5+fr7+/z8/f7z8yvi4uT//+3u2uPj4/Dw8PDx8fHx8fH08fH08fT09PT09PT09fX13fXd9ebm2dna2dnZ2drZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tnm5ub17u7r8unp6ejo6OXtgYLs7Orq6uz///////////8A////////////////5ezq6uqC7IHl5ejo6enp5OTk5OTk5OTk5OTkVlbk/fj4+Pn6+/v7+/v7+/r6+vr5+fj5+fj4+Pj4+Pj42PjY+Pj4+Pn5+vv8/P39/vMrK+Li5P///+fa4+Pj4/Dw8PHx8fHx8fHx8fTx8fT09PT09PX19fX13fXd9eba2dra2tra2trZ2tna2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ5vT19fXu3efs5Onp6ejl5YHs7Orq6uz//////////////wD//////////////////4Hq6uzs7IHl6OjpVunk5OTk5OTk5OTk5OTk5ORW5Pz4+Pr6+/v7+/v7+vr6+fn5+Pn5+fj4+Pj4+Pj42Pj4+Pj5+fn7+/z8/f7+8ysr4uTi////8tna2uPj8PDw8PDw8fHx8fHj9PT08fT09PT19PX19fXd9fX12tra2tra2tra2tra2tra2tra2dnm5tna2tra2trZ2vT09fX13d3u5+3p6eno5eWBgezs6uqB////////////////AP//////////////////7eHs6uyBge3l6Onp5OTk5OQs4iziLOLkLOTk5OTk6eT8+fr6+/v7+/r6+vn5+fn5+fn5+fj4+Pj4+Pj4+fj4+Pn5+vv7/Pz9/v7zK+Li4v/////t7tna4+Pw8PDx8PDw8fHx8eP09PTx9PT09PX09fX19fX13fX02tra4+Pj2tra2tra2tra2trZ2dra2tra2uPj2tr08fT09PX19e7v7eTp6Ojl7YGB7Ors//////////////////8A////////////////////5fLh7OyB7e324ejp6eTk5OTk5OTi5OLk5OTk5OTkVunk/Pr5+/v7+/v6+/r6+fn5+fn5+fj4+fn5+fn4+Pj4+fn6+/v8/f3+8/Mr4uJW///////n5trj4/Hx8PHx8fHx8PHj8fT09PT09PT09PT19fX19fX19OPj4+Pj4+Pj2uPa2tra2tra2tra4+Pa2trj4+Pa2vHx9PT09fX17vLp6enh9u3tgers//L//////////////////wD///////////////////////Ks4eyB7eXh6elW5OTk5OTk5OTk5OTk5OTk6eTp6enp9vv6+vv7+/v7+/v6+fr5+fn5+fn5+fn5+fn5+fn5+fr7/Pz9/f7zKyvi4uL//////+rm2drj4/Hw8fHx8fDx4+P09PT09PT08fHx8fT09fX19PT04+Pj2uPj4+Pj2tra2tra2trj2ub09ebm49rj4+P09PHx9PH09PXr7Onp6eHl7YHs////////////////////////AP/////////////////////////y9uyB7fbh6Vbk5OTk5OTk5OTk5OTk6eTk6enp6enoVvn6+vv7+/v7+/r6+vr5+fn5+fn5+fn5+fn5+fn6+/v8/P3+/vMr4uLk4v///////+7m2drj4+Pj4/Dx8fDj4+Pj4/Tj9PHx8fHx8fTx9PT04+Pj4+Pj4+Pj4+Pa2tra49rj4/T19fT19e7m4+Pj4/Tx8fHx8Nr09OeBVlbh9u2B7Pb///////////////////////8A///////////////////////////c7eyB7fbh6Vbp5Onp5Onk5Onk6enk6enp6enp6Ono6fz6+/v7+/v7+/r6+vn5+fn5+fn5+fn5+fn5+vv7/Pz9/f7zKyvi4uT/////////5+bZ2ePj4/Hj4+P02uPj4+Px4+Pj4+Px8fHw8PDw8fHx4+Pj4+Pj49ra2dra2trj4/Tm9fX09PX09fX04+Pj9PHx8fHj9PH03+lW4fbtgezl8v///////////////////////wD////////////////////////////g7eqB7e3h6VbpVuTp6enp6enp5Onp6enp6ejp6Ojo5fv6+/v7+/v6+vr6+fn5+fn5+fn5+fr6+fr7+/z8/P3+/vMrK+Li///////////q5tnZ2drj4+Pj8Nr04+Px4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj8ePj2tra2uPj4+Pa9fX09PT09PTa9OPj4+Pj8fH09PTj8e7s6fbt7YHs7fL/////////////////////////AP/////////////////////////////bgeqBge3h4enp6Vbp6enp6enp6enp6eno6ejo6Ojl7fr6+vv7+/v7+vr6+vr6+vr6+vr6+vr6+/v8/Pz9/f7z8yvi4lb////////////u5tnZ2dna4+Pj9OPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Px4+Pj2trj4+Pj4+Pa2ub02vTa9OPj4+Pj4+Pj4+Pj4+bm2tra5/bh7YGB6oHy//////////////////////////8A///////////////////////////////bgezsge324eHp6enp6enp6eno6ejp6Ojo6Ojo5eXlgfr6+/v7+/r7+vr6+vr6+vr6+vr6+vv7+/z8/f3+/vMrK+Li4v////////////Lm5tnZ2tna2tra4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj49ra2uPj4+Pj4+Pj8ePj4/Ta2uPj2tra4+Pj4+Pj9Nrm5u7y9u2B7OqB8v///////////////////////////wD////////////////////////////////f8uzsge329uHh6enp6Ojo6Ojo6Ojo6Ojo5eXl5eXt7Pv6+vv7+/v6+vv6+/r6+/v7+/v7+/v8/Pz9/f7zKyvi4lb//////////////+7m2dnZ2tra2tra2uPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj49ra2uPj4+Pj4+Pj4+Pj4+Pj4+Pj2tra4+Pj2uPj49rZ5ubu5+3tgezs6vL/////////////////////////////AP///////////////////////////////9/s8uzsge3l9vbh9uHh4ejo6OXl6OXl5eXl5e3t7e3t7Pv6+/v7+vv7+/v7+/v7+/v7+/v8/Pz8/f3+8/MrK+JW4v//////////////8ubm2dnZ2tra2tra2trj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj2uPj49ra2trj4+Pj4+Pj4+Pa2tra2dnZ2dnZ2ebm7uvf7YHs7PLs7P////////////////////////////8A/////////////////////////////////9zq6ursgYHt5eX29vb29uXl9uXt5eXl5eXl5e3tgu2B7Pv6+/v7+/v7+/v7+/v8+/z8/Pz8/P39/v7zKyvi4uT/////////////////6+bZ2dna2tra2tra2tra2uPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pa2tra2uPj4+Pa4+Pa2tnZ2dnZ2dnZ2dnZ5ubm5+yB7Ozy7PL//////////////////////////////wD//////////////////////////////////9/f6uzs7IHt7eXl5eXl5e3t7e3t7e3t7e3t7e3tgYLs7Pv7+/v7+/v7/Pz8/Pz8/Pz8/Pz9/f7+8ysr4uJW4v/////////////////q7ubZ2dnZ2tra2tra2tra2tra2trj4+Pj49ra49ra2uPj4+Pa2uPj4+Pj4+Pj2tra2tnm2dnZ2dnZ2drZ2dnm5uvf7Ozq6vLy////////////////////////////////AP//////////////////////////////////8urf6uzs7Ozt7e3t7e3t7e3t7YGBgYGBgoGCgYKB7Ozs6vv7+/v8/Pz8/Pz8/Pz8/Pz9/f3+/vPzKyvi5OL////////////////////v5ubZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2uPj4+Pj4+Pj49ra2trZ2dnZ2dnZ2tnZ2dnZ2dnZ5ubu7+zs7Orf7IH///////////////////////////////8A////////////////////////////////////3/Ly6urs7IGB7e3t7e3t7YGBgoGC7OyB7IHs7OyC7Ozs6vv7/Pz8/Pz8/fz9/P39/f39/v7z8ysr4uLk///////////////////////r5ubZ2drZ2dnZ2tra2tra2dra2tra2tra2tra2tra2tra2tra2tna2dnZ2dnZ2dra2trZ2dnZ2dnZ2dnm7ufq6uzq3+zq/////////////////////////////////wD/////////////////////////////////////3t/y6urs7OyBgYGBgYGBgYHsgYHs7OyC7Ozs7Ozsgurq7Pz8/Pz8/f39/f39/f39/v7+8/MrK+LiVv/////////////////////////u5tnZ2dra2tra2tra2tra2tra2tra2dra2tra2tra2tnZ2dra2dnZ2dnZ2tra2tnZ2dnZ2dnZ2dnZ5u7n5+zs8vLf8v//////////////////////////////////AP/////////////////////////////////////e8t/y6urq6uzs7OzsgYHsgezs7Ozq6uzs6oLq6urqgurq6vz8/f39/f39/v7+/v7+/vMrKyvi4v///////////////////////////+rm5tnZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2drZ2tra2tra2tra2trZ2dnZ2dnZ2dnm2ebu79vq6ury3+rs//////////////////////////////////8A///////////////////////////////////////c39/y6urq6uzsgezs7OyB7Ozs6urq6urq6uqC6urq6urq/f39/f39/v7+/v7z8/MrKysr4uL///////////////////////////////Lm5tnZ2dna2tra2tra2tra2tra2tra2tnZ2dna2dnZ2dra2tra2tra2trZ2dna2drZ2dnZ2ebu7uvc6urq8t/q8v///////////////////////////////////wD////////////////////////////////////////c39/f8urq6urs7Ozs7OyB7Orq6vLy7+/v7+/v7+/v7+/v9vz8/f3+8/PzK/MrKysr4uLi/////////////////////////////////+/m5tnZ2dnZ2trZ2tra2tra2dna2tnZ2tra2tra2tra2tra2tna2tnZ2drZ2dna2dnZ2ebm5uvr3Ory8vLe6vL/////////////////////////////////////AP/////////////////////////////////////////b39/y8vLy6uzs7Ors7Ozs7Orv7/Ly7+/v7+/v7+/v7+/v8vz8/vPzKysrK+Ir4uLi4v///////////////////////////////////+/m5tnZ2dna2tra2tra2tra2tra2dna2tra2tra2tra2dnZ2dnZ2drZ2tna2tnZ2dnm5u7r7tzy8vLy3vLq//////////////////////////////////////8A///////////////////////////////////////////c397f8vLy6urq6vLq6u3k4uTh9+vn5+/v7+/v7+/v7+/v/P3zKysrK+Li4uLi4lb///////////////////////////////////////Lu5tnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnm5ubu5+7c8vLy397y6v///////////////////////////////////////wD////////////////////////////////////////////c3Nve3/Ly8ury8vLy7Svz8yvk5PLu6+vn5+vr6+vr6+frKysr4uLi4uLi5Fb//////////////////////////////////////////+/u5tnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ5ubm7ufu3PLy397b4PL/////////////////////////////////////////AP/////////////////////////////////////////////03ODe3t/y8vLy8vLqVvMrK/Pz5Fbv9PTu7uvu7u7u7uvu4uLi4uTk5FZW//////////////////////////////////////////////Ln5ubZ2dnZ2trZ2dra2trZ2dra2tra2dra2tra2tnZ2dnZ2dnZ2dnZ5ubm7u7u9dzy39/e4N/c7P////////////////////////////////////////8A///////////////////////////////////////////////f3Nzg29/f3/Ly79/q9uLz8yvz8+RWgfHw5ubm5ubm7u7u4uTk5FZW/////////////////////////////////////////////////+rv7ubm5tnZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2tra2trZ2drZ2dnZ2ebm5u7r7t3f39/b4Nzb3////////////////////////////////////////////wD////////////////////////////////////////////////f3N3c3Nve3t/y39/f6oH2VuLz8/Pi6eHw8OPm5ubm7ubuVlZWVv/////////////////////////////////////////////////////g5+7m5tnZ2dnZ2dnZ2dnZ2dnZ2tra2trZ2dna2dnZ2dnZ2ebm5ubu7u7d3t7b3Nzd3N//////////////////////////////////////////////AP/////////////////////////////////////////////////f3N3d3Nzc297f397e3N7q7IHtViv+81bp5/Dw5ubm5ubu6v/////////////////////////////////////////////////////////y3Ofm5tnm2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ5ubm5ubu5+713tvc3Nzd3dzf//////////////////////////////////////////////8A///////////////////////////////////////////////////s3d3d3d3d3Nzg29vb29zc3eDy7IGB7e324en08Obm5ubm6///////////////////////////////////////////////////////////8uvr7ubm2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnm5ubm5ubu5+713dzc3d3d3dzd8v///////////////////////////////////////////////wD/////////////////////////////////////////////////////3/Xd9N3d3d3c3Nzc4Nvb2+Dd3d3d3eztgd3h9Nrw5ubu7v///////////////////////////////////////////////////////////9/n6+7m5ubm2dnZ2dnZ2dnZ2dnZ5ubm5ubm7u7r7t303d3d3d3d9N303///////////////////////////////////////////////////AP///////////////////////////////////////////////////////9/d3fTd9d3d3d3c3Nzc3Nzg4ODb3N3d2+Xc3ena5tnm5v/////////////////////////////////////////////////////////////y2+fr7u7m5ubm5ubm5ubm5u7m7u7u6+fu3fT09d3d3d3d9N3d3/////////////////////////////////////////////////////8A///////////////////////////////////////////////////////////f4PTx9PT03d313d3d3d3d3Nzc3Nzb3dvb9tz15trZ2uv//////////////////////////////////////////////////////////////93d9+fr6+vr7u7u6+vr6+v19OPd9PT03d3d9PT08fTc8v///////////////////////////////////////////////////////wD////////////////////////////////////////////////////////////////e3N3x9PT09PX03d313d3d3Nzg3t7d29vg3O718vT///////////////////////////////////////////////////////////T08vXd3d3d3fH08fHx8fHx9PX09PT19PT09PHd3N7t////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////+B3uDd3fX09PTd3d3d3d3d3dzc4ODg3N319PX19d3f39/f/////////////////////////////+Xtgezs6vLy8urs9PT09PT03dys8vLq8t736+vr6+719PTd9N3d4OCB//////////////////////////////////////////////////////////////////8A////////////////////////////////////////////////////////////////////////////9u3t7dze3d3c8t3d29/f8t703dze3ODd3d3d3dzc34Hs6vLf29zc3Nzb39zh7YHq8t/b8vLy8t/e3Nzc3t/p6enh4YHh4eHs8vLf8t7f3t7f8vLy8uzsgYHt9v///////////////////////////////////////////////////////////////////5cpK5EsZ8r3AAAAAElFTkSuQmCC");
			kb_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFQAAABRCAMAAAB7eHFAAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAAyMjc2NjpCQkZJSUxUVFc8PD6Dg4YmJywrLDEtLjMvMDUpLDQsLzd9f4UoKi9wcnclKzcjJCYvMik1OC8jKBYUGQYSFgYYHQkZHgoVGQkQEwcbIA0eIxAqLSEYGg8KCgYPDwoiIh8bGhUUEw8gHxseHBgYFhMAAAD3jX3ZAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAGvBJREFUeNoB5Roa5QD///////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////d/d2ebh4eDg////////////////////////////////////////////////////AP////////////////////////////////////////ys29rd2dis2KzZ2dnd2trd2Nna/////////////////////////////////////////////wD////////////////////////////////////qrNrZ4N/f39/f5ubm5ubm4ODg4djZ3dvZ2v////////////////////////////////////////8A/////////////////////////////////9zb2ODp39/f3+Dg5ubm5ubm5ubg4ODg4OHi2Nnb2dv/////////////////////////////////////AP//////////////////////////////6qys5uDm4ODg4ODg4ODg4ODm5ubm4ODg4ODg4OHi2Nnd293//////////////////////////////////wD////////////////////////////q6tnh4eHh4eDh4eDg4OHh4eHh4eHg4eHh4ODh4eDg4ODh2Njd293///////////////////////////////8A/////////////////////////+vq3eLh4uHh4eLi4uLi4uLi4tji4uLi4uLi4eLi4tjY4uLi4uLi4tnd3dz/////////////////////////////AP///////////////////////+rbrOHh4ODg4eLY2NjY2NjY2NjY2NjY2OLi4uLi4tjY2NjY2NjY2NjY2dnb2v///////////////////////////wD//////////////////////+rd4eDg4ODi2NjY2NnZ2NjY2NjZ3d3d3djk4uLi4uLi4eLi4tjY2NjY2NjY2d3a//////////////////////////8A/////////////////////9nY4Obg4OLY2NnZ2dnZ2dnY2Nvn3t7e3uXe5efc2tjj4+Ph4eLi4uLi4uLZ2djZ2dvb////////////////////////AP///////////////////9vh5ubh4tjZ2dnZ3d3d3dnZ2oHe3t7e3t7e3uXl5eXl59ro5OLi4uHh4uLi4tnZ2dnZ2tr//////////////////////wD//////////////////93m5uDi2NnZ2NjZ2d3d2dnZ3OXe3t7e3t7e5d7l5eXl5eXlgdno4eHg4OHh4uLY2dnZ2dnd3f////////////////////8A/////////////////93g4OHY2dnZ2d3d2d3Z2d3d2ufe3t7e3t7e3t7e3uXl5eXl5eXn2ujj4+Pg4+Dh4tjZ2djZ2d3a////////////////////AP///////////////93i2NjZ2d3d3d3d3d3d3d3d3drn3t7e3t7e3t7e5d7l5eXl5eXl5YHk6OHh4eDj4+Pj5NjZ2NnZ3dr//////////////////wD//////////////9vZ2dnd3d3d3d3d3d3d3d3d3d3d3OXe3t7e3uXe3uXl5eXl5eXl5eWB2ePh4eHg4+Pj6Ojj5NjY2Nnd3P////////////////8A/////////////9/d3dnd3d3d3d3d3d3d3d3d3d3Z2d3b3NzcgYGBgeeB5+fn5eXl5+eB3OTk4eHh4ePg4+Pk4+Po5Njk2Nnb////////////////AP/////////////d3d3d3d3Z2dnZ2d3d3d3d2dnZ2azY4uHh4Obj5OHj5OHY3dra2tra2uTY4uHh4eDh4eHg4eHk4+jk5OTk2Nv//////////////wD////////////a3d3d3dnZ2NjYrNis2dnYrNjYrOLh4ODg4ODg4eHh4eDg4ODg4OHg4ODh4uHh4eHg4ODg4ODh4ePj6Ojo6Ojk3P////////////8A///////////b3d3Z2dnY4uHg4ODg4eHg4ODm4ODg4ODg4eHh4eLi4uHh4eHh4eHg4ODg4OHh4ODg4eDg4ODg4OPg4+Pj5Ojo6Nn/////////////AP//////////3dnY2Nji4Obf39/f39/f39/m4ODg4eHi2NjY4uHh4eDh4eLi4eLi4uHg4ODg4ODg5uDm5uPg4OHg4+Pm4+Pj6Ojk2v///////////wD/////////2tji4eDm39/f3+bg4ODg4OHirNji4uLY2NnZ2dji4uLi4uLY2Nji4uLh4eHg4ODm5ubm5ubm4+Pg4OPj4+Pj6Ojo5N3///////////8A/////////djg5t/f3+bg4eLYrKysrKzZ2Nji4uLY2KzYrOLi4uLh4uLi4tjY2Nji2NjY4eHg4ODm5ubm4+bj4+Pj6Ojo6Ojo5OTZ2v//////////AP///////93g39/f5uDY2ays4Pn9/fz54OLh4eHi4uLi4eHg4ODg4Obm4ODg4eLi4tjYrNnY4uHg4ODg4+Pj4+Pm5uPj6Ojk6OTY2d3//////////wD////////h39/f4OLY2OHf/Pr6+vr+/vng4ODh4eHg4ODm5ubg4Obm5ubm5ubm5uDg4eLi2Nji4uHh4eDg4+bj4+Pj4+Pj5OTk5Njd2/////////8A///////a5t/f5uDh4N/9+v7++v7++/796ebg4ODg5ubm5ubj4+jj4+Pg4ODg5ubf3+bm4OHh4eHh4eHh4OPj4+Pj4+Pj4+Ph5OTk2N3/////////AP//////2Obm4ODg3/n6+v7+/f77/v7++vrp39/f39/f3+bj4+Pj6OTk4uLk4uTj4+Pj5ubm5ubg4ODg4OPg4eTi5OTj4+Pj4+Hk5OTZ2////////wD//////ODf39/f3/n6/v7++vr7/v7+/v7++unf39/f39/m5uPj4+Pj5OTk5OTk4+Po6Ojo4+bm5ubg4ODh4djZ2dnZ2OTk4+Pk5OPk2Nr///////8A/////93f39/f6fn9+v7+/v7+/v7+/v77+/7p39/f39/f5uDg4+Pj4+Dj4+Pj4+Pj4+jo4+Pk4+Pj4+Hi4tjZ2dnZ2dnZ2NjY5OTk4+TZ////////AP/////Y3+np6en9/fr+/v7++/7+/v7+/vv76d/f3+bm4ODh4eHi4eDj4eTk5OTj4+Pk4+Pg4eHj4+Dh4uLY2djZ2NjZ2dnZ2djY5OPj2N3//////wD////65unp6en8/fr+/v7++/v7+/j7+/v7+ebm4Obg2dnZ2djY2OLi2Nji4uHk4eHg4+bm5ubg4ODg4OHh4tjY2NjY2NnZ2dnZ2OTj4+Pa//////8A////2t/p6en8+v36/v76/vv4+Pj4+Pj76eDg5ubg4NjZ2OLi4uLi4uLi4uLh4eHh4OPm5ubm5ubm5ubm4ODh4eHh4eLY2NjZ2dni5Obj2f//////AP///9nf6fnp/v7+/vv+/vv39/f4+/7+/N/53+bm5uDm4ODh4eHh4eHg4eLi4eHh4ODg5ubm39/f5ubf39/m5ubm4ODg4eLi2NnY2OTj5uTa/////wD////Y3+np6fr7/vv7+/j31/f7+v39+vr9/fnf5ubm5ubm4ODg4ODg4ODh4uLh4ODg4ODm3/z83+bm39/f39/f39/f5uDh4eLi2OLi4ePj3f////8A////4t/p6d/6+/v4+/j49/f7/f39+v76+v386ebm5ubm5uDg4ODg4ODg4ODg4ODg4Obf+f39/fzp5ubf3+np6enf39/f5uDg4eHi5OHj49jc////AP///+Hm5t/f6en8/Pr6/fz9/f39+vr+/vr9/f3f5uDg4Obg4ODg4ODg4ODg5ubm5t/5/fz9/fz8/enm39/5/Pz539/p+d/m5uDg4OPj4+Hg3P///wD///ng4ODm39/p/P39/fz9/fr9/f7+/v7++v39/Ong4Obm5t/f39/m5ubm5ubm3+n9+vz8/Pz5/P3839/p/f36/fzp+fz53+bm5ubm5ubh+d3///8A///f4eDg5t/5/Pz8/f39/fr++v3+/v7+/v76/f396d/5/On5/Pz56fnp6d/m5t/8+vr6/f38+fz8/d/f6fr6+vr9/P39/fnf39/p+en54Pms3P//AP//5uLg3/n8/f39/P38/fr++/79/v7++/v+/v39+vr9/Pz8/Pz9/f38+fzp5ubp/fr9/f36/fz9/frp5un6+v76+v38/P39/Pn5/fz9/fz99dz//wD//+Di6fz8/P36+vr6+vv++/v+/f7+/vv+/v7++vr6/fz8/f36+vr6+vr++t/f6fr6/v76+v39/f36+d/5+v7++v38/Pz9+vr9/fz8+vr6/PX///8A///f4vn9+v39+vr6+v77+/v7+vr+/vv7/v7+/v7+/vr6+vr6/v77+/v7+/7p6fn6/v7+/v76+v76/f38/fr6+v39/f39/f39+vr9+vr7/v31////AP//rKz5/fr9/fr6+vr+/vv7+/r6/v77+/7+/v7++v7++vv++/v7+/v7+/v+/fz6+vr6+v76/vr6+vr69vb29vr9+v36+v7++vr++Pv7+/j+9f///wD//93h/P3++v36+vr6+vr++/b9+vb7+/v+/vr6+vr6+vr6/vv4+Pv7/v729vr0+v38/P38/P39/P36+vb29vr++vr6/v77+Pv++/f4+Pj49vX///8A///f9fn99vr9+vr6/fT6+vb0+u/29vv79vb6+vPz8/P9/f36+/Ly+vb6+vr09P38/Pz8/Pz9+vr6+v729vb++/77+v77+Pj4+Pf3+Pj48vT1////AP///vXs9PT09PT09PTz8/Pz+vPz8PD29vbz9PPz8/P29PP69PP29vT69PT0+v38/Pz8/Pz9/fr+/v7+/vb7+/v7+/77+Pj39/f3+PLy8vbs/////wD///f17Pz0/fT0+vPz8/Pz8/Pz8/Pz8/Pz8/Pz8O/v8PDw8PPz8/P09PPz8/38/Pn8/fz9/fr+/v7+/vv2+/j7+/j4+/j49/f39/Ly8vHw9f////8A///+9ez8/PT98/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Dw8PPw8PDw8PPz8/Pz8/r8/Pn8/f39+vr6/v7+/vv7+/L4+/v7+Pj4+Pf39/jx7vL29PX/////AP//9+r5+fz9/frz8/Dw8PDw8PPz8/Pz8/Pw8/Pw8PDw8PDw8PDw8PDw8PP9/Pz8/P39/fr6/v7+/vv7+/7y+Pv4+Pj4+Pj39/fy8fHx8PX//////wD////r+fn5/f36+vbw8PDv7+/w8PPz8/Pz8PDv8O/v7+/v7+/v7+/v8PD2/fz5/Pz8/f39/f7+/v77/v728vj7+/j4+Pf39/f37vHx8fPr//////8A////6vn8/P36+v779u/v8fHx7+/v8PDw8PDw7+/v7+/v7+/t7e3t7e3v9vr8/Pz8/fz6+v36/v7++/76+u7y+Pj4+Pf3+Pf39+7x8fPs9f//////AP////31/Pr6/v7++/v28e3t8e/v8PHx8e/w8O/v7+/x7+3v7e3t7e3t8fH6/fz9/f39/fr+/v7+/v7++vr78vL3+Pj4+Pj39/Lu8e/09f///////wD////39f36+/v++/v79vHt8e/x8/39+v3x8fHv7+/w7+/v8fHt7e3t7e3x9vr6/fz6+v77+Pv7+/7+/v7+8e7y8vLy8vLy9/Lu8fHz9Ov///////8A/////+r++/b3+Pv4+/bx8e7x+vn9/fr9/fbx7fHx7+/v7/Hx7e3t7e3t7vHx+/77+/v4+Pj4+/v79vHx7vLu7vLy8vLy8u7u7fHz8+z1////////AP/////q+vvx8vj4+Pv77vHx9v39+v36+vr9+vHx8fHx7/bz7+/t7u7u7e3u8vLy9/f39/Ly8vLy7u7y7u7u7vH2/vLy7u7u7fHw8/T1/////////wD/////9/ny+/b6+/Ly7u7u8fHx9vH29vr69v399u7u7fHv7+/v8e7y7u7u7u7u8vHx8e7u7u7t7e7t7u7u8u7x+/by8u7u8e/z8/P06/////////8A///////q9vD28/rx7vHt7vLu7u7u7vH29vb29vbv7+3u7u7u8fb28e7u7u7t8fHx8fHt7fHu7u7x7e3t7fHx7u728fHx7/Dz8/Pz9f//////////AP//////+/X08/D28e7u8e3t7+/v8fH29vHt7u7u7u7t8fHx7fHv8PDv8e3t7e3t7u3t7u7u7u3t7e3u7e3t7e3x7+/v7/Dw8PDz9Ov//////////wD////////q7Oz08/Px8fHv8e3x7+/v7fHx7e3t7e7u7u3t8fHx8fHt7e3t7e3t7fHu7u3t7e3t7e7u7u7u7e3x7+/v7+/w8PPz9Oz8//////////8A////////+/Xs9PTz8/Pz8/Pw7+/v8e3t7e3t7e3t8fHv7+/x8fHx8e3t7e3t7fHx7u3t7e7u7u7u7u3t7fHv7+/v7/Dw8PPz8/Tr////////////AP/////////q7PT08/Pz8/Pz8/Pz8/Pv7/Ht7e3t7e3v9vDx7/Hx8fHx7e3t7e3t7u7u7e3t7e3t7e3v7/Dw8PDw8O/w8PDz8/T1/////////////wD/////////9/X09PPz8PDz8/Pz8/Pz8/Pw8PDv7e3t7e7t7fHv7/Ht7fHv8e3t7e3t7e3t7e3v7+/v7+/v8PDw7+/v8PPz8/Ts6/////////////8A///////////r7PT08/Pw8/Pz8/Pw8PDz8/Pz8O/w7/Hx8e3t7u3t7e3v7+/v7+/x7+3t7e3v7+/v7/Dw7/Dw8PDw8PDz8/T06v//////////////AP///////////+rs9PPz8/Pw8PPz8/Dv7/Dz8/Pz8/Pw8PDw8O/v7+/v7+/v7/Dw8PDw8O/w7+/w8O/v8O/w8/Pz8PDw8/P09f///////////////wD/////////////6uz08/Pw8PPz9vPz8/P27+/w8/Pz8/Dz8PPz8/Dw8O/w7+/w8PDw8PDw8O/v7+/v7+/v7/Dw8PDz8/P07Pn///////////////8A///////////////r7PTz9PPz8/Pz8/Pz8/bx8e/w8PDz8PDz8PDz8/Dz8/Pw8O/v8PDv8PDv7+/v7+/w7+/w8PDw8/P07Ov/////////////////AP//////////////9+r19PPz8/Dw8PDw8PDz8+/v7/Dv7/Dw7+/w8PDw8PDw8PDw8PDw8PDv7+/v7+/v7+/w8PDw8PPz9Or//////////////////wD////////////////39fXs9PTz8/Dw8PDw8+/w8PDv7/Dv7+/v7+/v7+/v7+/w8PDw8PDw8O/v7+/w8PDw8PDz8/Pz9Or///////////////////8A//////////////////f19ez08/Pz8PDv7/Dw8PDw8PDz8PDw8O/v7+/v8O/v7/Dw7+/v7+/v7+/v8O/v8PDz8PP07Or/////////////////////AP//////////////////1/nq7Oz09PPz8PDw7+/v8PDv7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7/Dw8PPz8PP07Ov//////////////////////wD/////////////////////+ers9PT08/Pw8/Pz8/Dw8PDw7+/v7+/v7+/v8O/v7/Dv7+/w8O/v7+/v8PPw8/P09er///////////////////////8A///////////////////////+9fXs9PTz8/Pz8/Pz8/Dw8/Pw8PDw7/Dw8PDv7+/w8O/w8O/w8O/v8PDw8/Ts6t//////////////////////////AP////////////////////////j86uz09PPz8PPz8O/w8O/w7+/v8PPw8PDw8O/v8PDw8PDw8PDw8PP09PT16+b//////////////////////////wD///////////////////////////ns9fT09PTz8/Pz8/Pw8PDw8PDv7+/w8PDw8PDw8PDw8PDz8/P09Ozq6eH///////////////////////////8A////////////////////////////+/nq7PT08/P08/Pz8/Dw8/Dz8PDw8/Pz8PDw8PDw8/Pz8/P07Orp6f//////////////////////////////AP/////////////////////////////4+/nq9ez09PTz9PPz8/Pw8PDw8PDz8/Dz8PDz8/Dz8/Ts9fXp/////////////////////////////////wD////////////////////////////////4+/ns6vXs9PT09PTz8/Pz8/Pz8/Pz8/Pz8/T09Oz16+D///////////////////////////////////8A//////////////////////////////////////787Or19ezs7PT09PT09PT09PT09Ozs6urf3///////////////////////////////////////AP////////////////////////////////////////j+/Pb7/PX19fX19fX19fX16urq6f37/////////////////////////////////////////wD/////////////////////////////////////////////+vr78vj4+/v7+/v9/Pnp/Pr///////////////////////////////////////////8A//////////////////////////////////////////////////X19fX19azd3Nz/////////////////////////////////////////////////AP////////////////////////////////////////////////////f39+np+fn8//////////////////////////////////////////////////1fE+3PNdRKAAAAAElFTkSuQmCC");
			kb_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFQAAABRCAMAAAB7eHFAAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAAyMjc2NjpCQkZJSUxUVFc8PD6Dg4YmJywrLDEtLjMvMDUpLDQsLzd9f4UoKi9wcnclKzcjJCYvMik1OC8jKBYUGQYSFgYYHQkZHgoVGQkQEwcbIA0eIxAqLSEYGg8KCgYPDwoiIh8bGhUUEw8gHxseHBgYFhMAAAD3jX3ZAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAGvBJREFUeNoB5Roa5QD///////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////d/d2ebh4eDg////////////////////////////////////////////////////AP////////////////////////////////////////ys29rd2dis2KzZ2dnd2trd2Nna/////////////////////////////////////////////wD////////////////////////////////////qrNrZ4N/f39/f5ubm5ubm4ODg4djZ3dvZ2v////////////////////////////////////////8A/////////////////////////////////9zb2ODp39/f3+Dg5ubm5ubm5ubg4ODg4OHi2Nnb2dv/////////////////////////////////////AP//////////////////////////////6qys5uDm4ODg4ODg4ODg4ODm5ubm4ODg4ODg4OHi2Nnd293//////////////////////////////////wD////////////////////////////q6tnh4eHh4eDh4eDg4OHh4eHh4eHg4eHh4ODh4eDg4ODh2Njd293///////////////////////////////8A/////////////////////////+vq3eLh4uHh4eLi4uLi4uLi4tji4uLi4uLi4eLi4tjY4uLi4uLi4tnd3dz/////////////////////////////AP///////////////////////+rbrOHh4ODg4eLY2NjY2NjY2NjY2NjY2OLi4uLi4tjY2NjY2NjY2NjY2dnb2v///////////////////////////wD//////////////////////+rd4eDg4ODi2NjY2NnZ2NjY2NjZ3d3d3djk4uLi4uLi4eLi4tjY2NjY2NjY2d3a//////////////////////////8A/////////////////////9nY4Obg4OLY2NnZ2dnZ2dnY2Nvn3t7e3uXe5efc2tjj4+Ph4eLi4uLi4uLZ2djZ2dvb////////////////////////AP///////////////////9vh5ubh4tjZ2dnZ3d3d3dnZ2oHe3t7e3t7e3uXl5eXl59ro5OLi4uHh4uLi4tnZ2dnZ2tr//////////////////////wD//////////////////93m5uDi2NnZ2NjZ2d3d2dnZ3OXe3t7e3t7e5d7l5eXl5eXlgdno4eHg4OHh4uLY2dnZ2dnd3f////////////////////8A/////////////////93g4OHY2dnZ2d3d2d3Z2d3d2ufe3t7e3t7e3t7e3uXl5eXl5eXn2ujj4+Pg4+Dh4tjZ2djZ2d3a////////////////////AP///////////////93i2NjZ2d3d3d3d3d3d3d3d3drn3t7e3t7e3t7e5d7l5eXl5eXl5YHk6OHh4eDj4+Pj5NjZ2NnZ3dr//////////////////wD//////////////9vZ2dnd3d3d3d3d3d3d3d3d3d3d3OXe3t7e3uXe3uXl5eXl5eXl5eWB2ePh4eHg4+Pj6Ojj5NjY2Nnd3P////////////////8A/////////////9/d3dnd3d3d3d3d3d3d3d3d3d3Z2d3b3NzcgYGBgeeB5+fn5eXl5+eB3OTk4eHh4ePg4+Pk4+Po5Njk2Nnb////////////////AP/////////////d3d3d3d3Z2dnZ2d3d3d3d2dnZ2azY4uHh4Obj5OHj5OHY3dra2tra2uTY4uHh4eDh4eHg4eHk4+jk5OTk2Nv//////////////wD////////////a3d3d3dnZ2NjYrNis2dnYrNjYrOLh4ODg4ODg4eHh4eDg4ODg4OHg4ODh4uHh4eHg4ODg4ODh4ePj6Ojo6Ojk3P////////////8A///////////b3d3Z2dnY4uHg4ODg4eHg4ODm4ODg4ODg4eHh4eLi4uHh4eHh4eHg4ODg4OHh4ODg4eDg4ODg4OPg4+Pj5Ojo6Nn/////////////AP//////////3dnY2Nji4Obf39/f39/f39/m4ODg4eHi2NjY4uHh4eDh4eLi4eLi4uHg4ODg4ODg5uDm5uPg4OHg4+Pm4+Pj6Ojk2v///////////wD/////////2tji4eDm39/f3+bg4ODg4OHirNji4uLY2NnZ2dji4uLi4uLY2Nji4uLh4eHg4ODm5ubm5ubm4+Pg4OPj4+Pj6Ojo5N3///////////8A/////////djg5t/f3+bg4eLYrKysrKzZ2Nji4uLY2KzYrOLi4uLh4uLi4tjY2Nji2NjY4eHg4ODm5ubm4+bj4+Pj6Ojo6Ojo5OTZ2v//////////AP///////93g39/f5uDY2ays4Pn9/fz54OLh4eHi4uLi4eHg4ODg4Obm4ODg4eLi4tjYrNnY4uHg4ODg4+Pj4+Pm5uPj6Ojk6OTY2d3//////////wD////////h39/f4OLY2OHf/Pr6+vr+/vng4ODh4eHg4ODm5ubg4Obm5ubm5ubm5uDg4eLi2Nji4uHh4eDg4+bj4+Pj4+Pj5OTk5Njd2/////////8A///////a5t/f5uDh4N/9+v7++v7++/796ebg4ODg5ubm5ubj4+jj4+Pg4ODg5ubf3+bm4OHh4eHh4eHh4OPj4+Pj4+Pj4+Ph5OTk2N3/////////AP//////2Obm4ODg3/n6+v7+/f77/v7++vrp39/f39/f3+bj4+Pj6OTk4uLk4uTj4+Pj5ubm5ubg4ODg4OPg4eTi5OTj4+Pj4+Hk5OTZ2////////wD//////ODf39/f3/n6/v7++vr7/v7+/v7++unf39/f39/m5uPj4+Pj5OTk5OTk4+Po6Ojo4+bm5ubg4ODh4djZ2dnZ2OTk4+Pk5OPk2Nr///////8A/////93f39/f6fn9+v7+/v7+/v7+/v77+/7p39/f39/f5uDg4+Pj4+Dj4+Pj4+Pj4+jo4+Pk4+Pj4+Hi4tjZ2dnZ2dnZ2NjY5OTk4+TZ////////AP/////Y3+np6en9/fr+/v7++/7+/v7+/vv76d/f3+bm4ODh4eHi4eDj4eTk5OTj4+Pk4+Pg4eHj4+Dh4uLY2djZ2NjZ2dnZ2djY5OPj2N3//////wD////65unp6en8/fr+/v7++/v7+/j7+/v7+ebm4Obg2dnZ2djY2OLi2Nji4uHk4eHg4+bm5ubg4ODg4OHh4tjY2NjY2NnZ2dnZ2OTj4+Pa//////8A////2t/p6en8+v36/v76/vv4+Pj4+Pj76eDg5ubg4NjZ2OLi4uLi4uLi4uLh4eHh4OPm5ubm5ubm5ubm4ODh4eHh4eLY2NjZ2dni5Obj2f//////AP///9nf6fnp/v7+/vv+/vv39/f4+/7+/N/53+bm5uDm4ODh4eHh4eHg4eLi4eHh4ODg5ubm39/f5ubf39/m5ubm4ODg4eLi2NnY2OTj5uTa/////wD////Y3+np6fr7/vv7+/j31/f7+v39+vr9/fnf5ubm5ubm4ODg4ODg4ODh4uLh4ODg4ODm3/z83+bm39/f39/f39/f5uDh4eLi2OLi4ePj3f////8A////4t/p6d/6+/v4+/j49/f7/f39+v76+v386ebm5ubm5uDg4ODg4ODg4ODg4ODg4Obf+f39/fzp5ubf3+np6enf39/f5uDg4eHi5OHj49jc////AP///+Hm5t/f6en8/Pr6/fz9/f39+vr+/vr9/f3f5uDg4Obg4ODg4ODg4ODg5ubm5t/5/fz9/fz8/enm39/5/Pz539/p+d/m5uDg4OPj4+Hg3P///wD///ng4ODm39/p/P39/fz9/fr9/f7+/v7++v39/Ong4Obm5t/f39/m5ubm5ubm3+n9+vz8/Pz5/P3839/p/f36/fzp+fz53+bm5ubm5ubh+d3///8A///f4eDg5t/5/Pz8/f39/fr++v3+/v7+/v76/f396d/5/On5/Pz56fnp6d/m5t/8+vr6/f38+fz8/d/f6fr6+vr9/P39/fnf39/p+en54Pms3P//AP//5uLg3/n8/f39/P38/fr++/79/v7++/v+/v39+vr9/Pz8/Pz9/f38+fzp5ubp/fr9/f36/fz9/frp5un6+v76+v38/P39/Pn5/fz9/fz99dz//wD//+Di6fz8/P36+vr6+vv++/v+/f7+/vv+/v7++vr6/fz8/f36+vr6+vr++t/f6fr6/v76+v39/f36+d/5+v7++v38/Pz9+vr9/fz8+vr6/PX///8A///f4vn9+v39+vr6+v77+/v7+vr+/vv7/v7+/v7+/vr6+vr6/v77+/v7+/7p6fn6/v7+/v76+v76/f38/fr6+v39/f39/f39+vr9+vr7/v31////AP//rKz5/fr9/fr6+vr+/vv7+/r6/v77+/7+/v7++v7++vv++/v7+/v7+/v+/fz6+vr6+v76/vr6+vr69vb29vr9+v36+v7++vr++Pv7+/j+9f///wD//93h/P3++v36+vr6+vr++/b9+vb7+/v+/vr6+vr6+vr6/vv4+Pv7/v729vr0+v38/P38/P39/P36+vb29vr++vr6/v77+Pv++/f4+Pj49vX///8A///f9fn99vr9+vr6/fT6+vb0+u/29vv79vb6+vPz8/P9/f36+/Ly+vb6+vr09P38/Pz8/Pz9+vr6+v729vb++/77+v77+Pj4+Pf3+Pj48vT1////AP///vXs9PT09PT09PTz8/Pz+vPz8PD29vbz9PPz8/P29PP69PP29vT69PT0+v38/Pz8/Pz9/fr+/v7+/vb7+/v7+/77+Pj39/f3+PLy8vbs/////wD///f17Pz0/fT0+vPz8/Pz8/Pz8/Pz8/Pz8/Pz8O/v8PDw8PPz8/P09PPz8/38/Pn8/fz9/fr+/v7+/vv2+/j7+/j4+/j49/f39/Ly8vHw9f////8A///+9ez8/PT98/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Dw8PPw8PDw8PPz8/Pz8/r8/Pn8/f39+vr6/v7+/vv7+/L4+/v7+Pj4+Pf39/jx7vL29PX/////AP//9+r5+fz9/frz8/Dw8PDw8PPz8/Pz8/Pw8/Pw8PDw8PDw8PDw8PDw8PP9/Pz8/P39/fr6/v7+/vv7+/7y+Pv4+Pj4+Pj39/fy8fHx8PX//////wD////r+fn5/f36+vbw8PDv7+/w8PPz8/Pz8PDv8O/v7+/v7+/v7+/v8PD2/fz5/Pz8/f39/f7+/v77/v728vj7+/j4+Pf39/f37vHx8fPr//////8A////6vn8/P36+v779u/v8fHx7+/v8PDw8PDw7+/v7+/v7+/t7e3t7e3v9vr8/Pz8/fz6+v36/v7++/76+u7y+Pj4+Pf3+Pf39+7x8fPs9f//////AP////31/Pr6/v7++/v28e3t8e/v8PHx8e/w8O/v7+/x7+3v7e3t7e3t8fH6/fz9/f39/fr+/v7+/v7++vr78vL3+Pj4+Pj39/Lu8e/09f///////wD////39f36+/v++/v79vHt8e/x8/39+v3x8fHv7+/w7+/v8fHt7e3t7e3x9vr6/fz6+v77+Pv7+/7+/v7+8e7y8vLy8vLy9/Lu8fHz9Ov///////8A/////+r++/b3+Pv4+/bx8e7x+vn9/fr9/fbx7fHx7+/v7/Hx7e3t7e3t7vHx+/77+/v4+Pj4+/v79vHx7vLu7vLy8vLy8u7u7fHz8+z1////////AP/////q+vvx8vj4+Pv77vHx9v39+v36+vr9+vHx8fHx7/bz7+/t7u7u7e3u8vLy9/f39/Ly8vLy7u7y7u7u7vH2/vLy7u7u7fHw8/T1/////////wD/////9/ny+/b6+/Ly7u7u8fHx9vH29vr69v399u7u7fHv7+/v8e7y7u7u7u7u8vHx8e7u7u7t7e7t7u7u8u7x+/by8u7u8e/z8/P06/////////8A///////q9vD28/rx7vHt7vLu7u7u7vH29vb29vbv7+3u7u7u8fb28e7u7u7t8fHx8fHt7fHu7u7x7e3t7fHx7u728fHx7/Dz8/Pz9f//////////AP//////+/X08/D28e7u8e3t7+/v8fH29vHt7u7u7u7t8fHx7fHv8PDv8e3t7e3t7u3t7u7u7u3t7e3u7e3t7e3x7+/v7/Dw8PDz9Ov//////////wD////////q7Oz08/Px8fHv8e3x7+/v7fHx7e3t7e7u7u3t8fHx8fHt7e3t7e3t7fHu7u3t7e3t7e7u7u7u7e3x7+/v7+/w8PPz9Oz8//////////8A////////+/Xs9PTz8/Pz8/Pw7+/v8e3t7e3t7e3t8fHv7+/x8fHx8e3t7e3t7fHx7u3t7e7u7u7u7u3t7fHv7+/v7/Dw8PPz8/Tr////////////AP/////////q7PT08/Pz8/Pz8/Pz8/Pv7/Ht7e3t7e3v9vDx7/Hx8fHx7e3t7e3t7u7u7e3t7e3t7e3v7/Dw8PDw8O/w8PDz8/T1/////////////wD/////////9/X09PPz8PDz8/Pz8/Pz8/Pw8PDv7e3t7e7t7fHv7/Ht7fHv8e3t7e3t7e3t7e3v7+/v7+/v8PDw7+/v8PPz8/Ts6/////////////8A///////////r7PT08/Pw8/Pz8/Pw8PDz8/Pz8O/w7/Hx8e3t7u3t7e3v7+/v7+/x7+3t7e3v7+/v7/Dw7/Dw8PDw8PDz8/T06v//////////////AP///////////+rs9PPz8/Pw8PPz8/Dv7/Dz8/Pz8/Pw8PDw8O/v7+/v7+/v7/Dw8PDw8O/w7+/w8O/v8O/w8/Pz8PDw8/P09f///////////////wD/////////////6uz08/Pw8PPz9vPz8/P27+/w8/Pz8/Dz8PPz8/Dw8O/w7+/w8PDw8PDw8O/v7+/v7+/v7/Dw8PDz8/P07Pn///////////////8A///////////////r7PTz9PPz8/Pz8/Pz8/bx8e/w8PDz8PDz8PDz8/Dz8/Pw8O/v8PDv8PDv7+/v7+/w7+/w8PDw8/P07Ov/////////////////AP//////////////9+r19PPz8/Dw8PDw8PDz8+/v7/Dv7/Dw7+/w8PDw8PDw8PDw8PDw8PDv7+/v7+/v7+/w8PDw8PPz9Or//////////////////wD////////////////39fXs9PTz8/Dw8PDw8+/w8PDv7/Dv7+/v7+/v7+/v7+/w8PDw8PDw8O/v7+/w8PDw8PDz8/Pz9Or///////////////////8A//////////////////f19ez08/Pz8PDv7/Dw8PDw8PDz8PDw8O/v7+/v8O/v7/Dw7+/v7+/v7+/v8O/v8PDz8PP07Or/////////////////////AP//////////////////1/nq7Oz09PPz8PDw7+/v8PDv7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7/Dw8PPz8PP07Ov//////////////////////wD/////////////////////+ers9PT08/Pw8/Pz8/Dw8PDw7+/v7+/v7+/v8O/v7/Dv7+/w8O/v7+/v8PPw8/P09er///////////////////////8A///////////////////////+9fXs9PTz8/Pz8/Pz8/Dw8/Pw8PDw7/Dw8PDv7+/w8O/w8O/w8O/v8PDw8/Ts6t//////////////////////////AP////////////////////////j86uz09PPz8PPz8O/w8O/w7+/v8PPw8PDw8O/v8PDw8PDw8PDw8PP09PT16+b//////////////////////////wD///////////////////////////ns9fT09PTz8/Pz8/Pw8PDw8PDv7+/w8PDw8PDw8PDw8PDz8/P09Ozq6eH///////////////////////////8A////////////////////////////+/nq7PT08/P08/Pz8/Dw8/Dz8PDw8/Pz8PDw8PDw8/Pz8/P07Orp6f//////////////////////////////AP/////////////////////////////4+/nq9ez09PTz9PPz8/Pw8PDw8PDz8/Dz8PDz8/Dz8/Ts9fXp/////////////////////////////////wD////////////////////////////////4+/ns6vXs9PT09PTz8/Pz8/Pz8/Pz8/Pz8/T09Oz16+D///////////////////////////////////8A//////////////////////////////////////787Or19ezs7PT09PT09PT09PT09Ozs6urf3///////////////////////////////////////AP////////////////////////////////////////j+/Pb7/PX19fX19fX19fX16urq6f37/////////////////////////////////////////wD/////////////////////////////////////////////+vr78vj4+/v7+/v9/Pnp/Pr///////////////////////////////////////////8A//////////////////////////////////////////////////X19fX19azd3Nz/////////////////////////////////////////////////AP////////////////////////////////////////////////////f39+np+fn8//////////////////////////////////////////////////1fE+3PNdRKAAAAAElFTkSuQmCC");
			kw_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFIAAABRCAMAAAB2ZgEHAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAD+/v79/f38/Pz7+/v6+vr5+fn4+Pj39/f29vb19fX09PTz8/P8+/z5+vl/f379/fz6+vn39/b29vX19fT09PN0c3P6+fn49/f29fX5+fny8vLw8PDv7+/t7e3p6enj4+Pc3NzU1NTAwMC1tbWoqKiVlZWQkJAAAABtqN+JAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAGk5JREFUeNoBQxq85QD/////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////7+/v7+/v7+/v7+/v////////////////////////////////////////////////8A/////////////////////////////////////////v79/f1WVlZWVlZWVlZWVlb9/f7+/////////////////////////////////////////wD///////////////////////////////////7+/VZWVvxW/Pz8/Pz8/Pz8/Pz8VvxWVlZW/f7/////////////////////////////////////AP/////////////////////////////////9/VZW/Pz8/Pz7/Pv7+/v7+/v7/Pv8/Pz8/PxWVlb9/v////////////////////////////////8A///////////////////////////////9Vlb8/Pz8+/v7+/v7+vor+iv6+vr6+/v7+/v8/Pz8VlZW/f7//////////////////////////////wD////////////////////////////9Vlb8/Pz7+/v7+/r49fX19fX19fT09fX19iv6+/r7+/v7/PxWVv3/////////////////////////////AP/////////////////////////9Vlb8/Pz7+/v6+iv28/Lj4+Pj4uLi4uLj4+Py9PX4K/r6+/v7/Pz8Vlb9//////////////////////////8A/////////////////////////Vb8/Pz7+/r6+isr9ePi4uHh4eHg4ODg4OHh4eHi4vL1+Cv6+vr7+/z8/FZW/////////////////////////wD//////////////////////1ZW/Pz7+/r6+isrK/fi4eDg39/f39/f39/f39/f4ODg4eHy9vgr+vr6+/v8/FZW/f//////////////////////AP////////////////////1W/Pz7+/v6+isr+fn49/Lg3t7e3d3d3d3d3d3d3d7e3t7e3+Dy9vkrK/r6+vv7/PxW/f////////////////////8A///////////////////9Vvz8+/v6+isr+fn4+Pj39vX19fX19PT09PT09PT09fX09PPy8vP2+Pn5Kyv6+vv7/PxW/f///////////////////wD//////////////////Vb8/Pv7+isr+fn4+Pf39/b29vX19fX09PT08/T09PT09fX19fb29vf3+Pj5+Ssr+vr7/PxWVv//////////////////AP////////////////1W/Pz7+vorK/n5+Pj39/b29fX19PPy8vLy4+Pj4/Ly8vLy8/T09fX29vf3+Pj4+Ssr+vr7+/xWVv////////////////8A///////////////9Vvz8+/r6Kyv5+Pj39/b29fT08vLy4+Li4eHh4eHh4eHi4uLj8vLz9PT19vb39/j4+fkr+vr7+/xW/f3//////////////wD//////////////1b8/Pv6+iv5+fj49/b29fTz8vLj4uHh4ODe3t/f39/e3t/g4OHh4uPy8vP09fb29/j4+fkr+vr7+/xW/eb/////////////AP////////////9W/Pz7+vor+fn49/f29vX08vLi4eDg3t/e3t3d3d3d3d3d3d7e397g4eHi8vL09fX29/f4+Pkr+vr7/PxW/f////////////8A////////////Vvz8+/r6K/n5+Pf39vX08/Lj4d/e3t7d3dzc3Nvb29vb29vc3Nzd3d7f39/h4/Lz9fX29vf4+fkr+vr7/PxWVub//////////wD//////////1ZW/Pv6+isr+Pj39vb19PLj4uHf3t3d3Nzb29vb29ra2trb29vb29vc3N3e3t/h4uPy9PX29/f4+Pkr+vr7/PxWVv//////////AP//////////Vvz7+/or+fn49/b29fTy4+Hg397d3Nvb29ra2tra2tra2tra2tra29vb3Nzd3t/g4ePy9PX29vf4+fkr+vv7/Fb97f////////8A/////////1b8/Pv6Kyv5+Pf39vXz8uLh397d3Nvb29ra2tra2tnZ2dnZ2dra2tra2trb29zc3d7f4ePy9PX29/f4+Ssr+vv7/FZW/////////wD/////////Vvz7+vor+fj39/b18/Li4N/e3dzb29ra2trZ2dnZ2dnZ2dnZ2dnZ2dra2trb29vc3d7f4OLy9PX29/j4+Ssr+vv8/P3t////////AP///////1b8+/v6K/n4+Pf29fTy4uDf3dzb29ra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29vc3d3f4OPz9fb29/j4Kyv6+/v8Vlb///////8A/////////Pz7+isr+fj39vX08uLg393c29va2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29vc3uDg4vL09fb39/j5Kyv6+/z8Vu3//////wD//////1b8+/v6K/n49/b29fLj4N/d3Nvb2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29vc3eDi8vP19vb3+Pj5K/r6+/z8Vv//////AP//////Vvz7+isr+Pj39vXz4+Hf3dzb29ra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dna2tvb3Nzd3t/i8/X29/f3+PkrK/r7+/xW5v////8A///////8+/v6K/n49/b19PLi397c3Nva2trZ2dnZ2dnZ2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra29vc3N3e3+Hi8/X29/f4+fkrK/r7/Pz8/////wD/////Vvz7+isr+Pj39vXy4+De3dzb2tra2dnZ2dnZ2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2trb29zc3N3f4OHy9Pb29/j4+fkr+vr7/Fb/////AP/////8/Pv6K/n49/b19PLh393c29va2tnZ2dnZ2djY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2trb3Nzc3d7f4ePy9Pb39/j4+Ssr+vv7/P////8A//////z7+/or+fj39vXy4uDe3dzb2trZ2dnZ2dnY2NjY2NjYAAAAAAAAAADY2dnZ2dnZ2trb29zd3+Dg4eHg4uP09vb39/j4+Ssr+vv8/v///wD///9W/Pv6Kyv4+Pf29fLh393c29va2tnZ2dnZ2NjY2NjY2ADc3Nzb29zc3N3Y2dnZ2dra2tvb3d3f4ODg4uPy9PX29vb3+Pj5+Sv6+vv7////AP///1b8+/or+fj39vXz4+De3dzb2trZ2dnZ2djY2NjY2NgA3N7p39/f3+Dq39zY2dna2tra3Nvd3d/f4ODh4/Lz9PX29vf39/j5+Sv6+vv///8A/////Pz7+iv5+Pf29fLi4N7c29va2tnZ2dnZ2NjY2NjYANvg3uPs7Ozs4/Lf4dzZ2dra29rb3Nze3t/g4eLj8vL09PX19vf3+Pj5+Sv6+////wD////8+/srK/n49/b08uHf3dzb2trZ2dnZ2djY2NjY2ADb6eDh8t3d3d3d8uPr4dza2trb3Nvd3N3e3t/f4OHi8vL09fX29vf3+Pj5K/r7+v//AP////z7+isr+Pj29fTy4d/d3Nva2tnZ2dnZ2NjY2NjY293f4OLd2dnZ2dne4uLi39zb3Nvd3Nzd3d3d3t7f4OHj8vP09fX29vf4+fkr+vv6//8A/////Pv7Kyv49/b18+Pg3t3c29ra2dnZ2djY2NjY2Nje3uDh3NnZ2dnZ2dne4uLg39zd3N7e3t3e3t3e3t/g4OHi8vP09fb29vf4+Sv6+vv//wD////8+/or+fj39/Xz4+De3dvb2tnZ2dnZ2NjY2NjY2N3p8NzZ2dnZ2dnZ2drf4+zh3t3e3t/e3t7e3d3d3d7f4OHj8vP09fb29/j5Kyv6+///AP////z7+isr+Pf29fPi4N7c29va2dnZ2dnY2NjY2NgA3N3e2dnZ2dnZ2dnZ2dvf4+Lf3t/g39/f3t7d3t7e3d7f4OHj8vT19vf3+Pkr+vr7//8A/////Pv6K/n49/b18uLg3tzb2trZ2dnZ2djY2NjY2Nve3+/Z2dnZ2dnZ2dnZ2dzi4uDe397f4N7e3t3d3d3e3d7f4OLj8vT29/j4+Sv6+/v//wD////8+/or+fj39vXy4uDe3Nva2tnZ2dnZ2NjY2NjY297f3tnZ2dnZ2dnZ2dnZ3PLy4uDh3+Lg39/e3d3c3N3d3d3f4OLy9Pb39/j5K/r7/P//AP////z7+iv5+Pf29fLi4N7c29ra2dnZ2dnY2NjY2NjY29zd2tnZ2dnZ2dnZ2drc8vLy4+Dh4OHf4N7d3Nzc3N3d3d3f4fL09vf4+Csr+vv8//8A/////Pv6K/n49/b18uLg3tzb2trZ2dnZ2dnY2NjY2Njc3d3b2dnZ2dnZ2dna2tzy8vLi4eHg4N/f3t3c3Nvc3Nzd3eDi8vT19/j5Kyv7+/z//wD////8+/or+fj39vXy4uDe3Nva2tnZ2dnZ2djY2NjZ2dzd3d3b2dnZ2dnZ2dra4PTz8uDh4eDf3t7d3dzc29vc3Nzd4OLy9fb39/kr+vr8/P//AP////z7+iv5+Pf29fPi4N7d29va2dnZ2dnZ2dnZ2dnZ29vl3dzb2dnZ2dna2uDy9PLz4eHg39/e3dzd3dzb29zc3N7g4vL19vf4+Sv6+/z///8A/////Pv6K/n49/b19OPg3t3c29ra2dnZ2dnZ2dna2drZ3N3o7tzb2dnZ2eTg8vPz8uLg4N/e3d3c3Nzc3Nzb3N3c3uHy8/T29/j5K/r7/P///wD////8+/r6+fj49vXz4+He3dzb2trZ2dnZ2dna2tra2trb293d3d7c6N3e6fLy9PLi4eHf3t3b3Nzc3Nzd3d3c3d7e4fLz9fb3+Pkr+vv7////AP////z7+ysr+Pj39fTy4d/d3Nva2tnZ2dnZ2dra2trb29vb3N3d39/p6uLi8/Pz4+Lg393b29vc29zc3N3e3d3e3t/j8vT19/f4+fr6+vz///8A////Vvz6+iv5+Pf29PLh397c29va2tna2dra2tra29vb3Nzb3N7f39/g4ezy8uPi4eDd29va3Nzc3Nzd3d3e3t7f4OPy9PX3+Pgr+iv7/P///wD//////Pv6K/n49/b18uLh3t3c29ra2tna2tra2tvb293d3Nvd3t7f4ODh4eLi4+Hg39va2tvb3Nzc3N3d3t/f4ODh4/P19vf4+Sv6+vv/////AP/////8+/or+fj39vXz4+Hf3dzb2tvc29vb2tvb29vd3d3c3N3e3t7f3+Di4uLh4N/c2dna2tvb3Nzd3d7e3t/g4OPy9PX29/j5Kyv6+/////8A//////77+isr+Pj39vTy4d/e3Nvb29vc3Nzc3Nvb3N3d3d3c3t/g4eDi4uLi4d7f3NnZ2dra2tvc3d3e3t/g4ODi4/P09vf4+fn5K/v8/////wD/////Vvv7+iv5+Pf29fPj4N7d3Nzc3Nzc3Nzc3Nzd3d3d397f4eHh4+Li4eDf4tzn2tra2dra29zd3t7f3+Dh4ePy9PX29/j5+Sv6+///////AP/////t/Pv6K/n49/b29PLh4N7e3dzd3Nzc3N3c3d3e3t/f3+Dh4uLj4uPg397Z2dra2tva2tvc3N3e3t/g4eHi8vP19vf4+Pkr+vv8//////8A//////9W+/orK/j49/b18+Ph397d3d3d3d3d3d7d3t7e3+Dg4eHj4+Pi4d/f2tnZ2tra29vb3Nzd3t7f3+Hi4/L09Pb29/j4+Sv6+/z//////wD//////4H7+/or+fj39vX08uPh397f397e3t3e3t7e3t7f4ODg4uLi4uHf39vZ2dnZ2tvb29vc3N3e3t/h4ePy8/X19/f4+Csr+vv8////////AP///////1b7+isr+Pj39vX08uLh3+Df39/f39/f39/f39/g4eHi4eLg4Nzb2tna2dra2tvb3Nzd3d7f4OHj8vT09fb3+Pj5K/r7+/z///////8A////////7fv7+iv5+Pf39vX08uLh4ODg4ODg4N/g4ODg4OHg4eLh4eDc3Nrb2dra2tvb29zc3d7e3+Dh4/Lz9fX39/j4+Sv6+vv8/////////wD/////////Vvv6Kyv5+Pf29fTz8uPi4uHh4eHg4OHg4eDg4eHi4uDg4Nza2tra2tva29zd3N3e3t/g4uLy8/X29vf4+Pkr+vr7/Fb/////////AP/////////t/fv6K/n4+Pf29fTz8vLj4+Pi4uLi4uHh4eHg4eHh4N/e29va2tvb29vc3N3e39/g4eHj8vT19vb3+PgrKyv6+/z8//////////8A//////////9W+/r6K/n49/f29fT08/Ly8vLy8uPj4uLi4eLi4eDg3dzb2trb3Nzc3N3e3t/f4OLi4/L09fb29/j4+Sv6+vv8/Fb//////////wD//////////+ZW+/orK/n49/f29fX09PPz8/Pz8/Ly4+Pj4+Hh4N3c3Nvb29vc3d3e3t/f3+Di4/Lz9PX29/f4+CsrK/r7/PxW////////////AP////////////9W+/or+fn49/f29vX19PT09fT09PPz8vLj4uHg3Nzc3Nzd3d7e3+Df4eHi4/Ly9PT19vb3+Pn5K/r6+/v8Vv////////////8A/////////////+b7+vor+fj49/f39vb19vX29fX19fTz8vLj4t7e3d7e3t7e3uDh4eLi4/Ly8/T19vb3+Pj5+Sv6+vv8/Fb//////////////wD///////////////37+vorK/n4+Pf39/b39vb29vb19fT08vLg4N/f3+Dg4OHh4uLj8vLy9PT19fb29/j4+Ssr+vr7/PxW/f//////////////AP/////////////////7+vorK/n4+Pj49/f39/f39vb29fX08+Ph4eHh4eLi4/Ly8vP09PX19vb39/j4+fkrK/r6+/z8Vlb///////////////8A///////////////////7+vorKyv5+fj5+Pj4+Pf39vb29vXz8vLy8vLy8/Pz9PX19fX29vb39/f4+Pn5Kyv6+/v8/FZW/////////////////wD////////////////////7+/r6KysrK/n5+fn49/b19fX19PT08/Pz9PT09PT09fX19fX29/j4+Pn5Kyv6+vv7/PxW/f//////////////////AP/////////////////////8+/v7+vr6Kysr+fn39fTy4+Df39/e3d3e3t3d3d3d3t7e4PT3+Pn5Kyv6+vv7+/z8Vv3///////////////////8A///////////////////////9/Pv7+/r6+vorK/n39PLi4eHg39/f39/f39/f39/f4ODh4vcrKyv6+vr7+/z8Vlb//////////////////////wD/////////////////////////Vvz8/Pv7+/r6+iv49fPj4uHh4eHg4ODg4OHh4eHi4uP1+Sv6+vr7+/z8/Fb9////////////////////////AP///////////////////////////Vb8/Pz7+/v6+vor+PX08uPj4+Li4uLi4+Pj4/L09iv6+vv7+/z8/Fb9/f////////////////////////8A//////////////////////////////1WVvz8/Pv7+/r6+iv29fX19fX19fX19fX19/r7+/v7+/z8/FZW/f///////////////////////////wD///////////////////////////////79Vlb8/Pz8+/v7+/v7+vorKysrK/r6+/v7+/v7/Pz8VlZW/f//////////////////////////////AP/////////////////////////////////+/f1WVvz8/Pz8+/v7+/z7+/z7+/v7/Pz8/Pz8VlZW/f////////////////////////////////8A//////////////////////////////////////79VlZWVvxW/Pz8/Pz8/Pz8/Pz8/PxWVlb9/v7//////////////////////////////////wD//////////////////////////////////////////v5W/VZWVlZWVlZWVlZW/f39/v7+////////////////////////////////////////AP////////////////////////////////////////////////7+/v7+/f7+/v7+/v7///////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////8kfX8xueSoCAAAAAElFTkSuQmCC");
			kw_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFIAAABRCAMAAAB2ZgEHAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAD+/v79/f38/Pz7+/v6+vr5+fn4+Pj39/f29vb19fX09PTz8/P8+/z5+vl/f379/fz6+vn39/b29vX19fT09PN0c3P6+fn49/f29fX5+fny8vLw8PDv7+/t7e3p6enj4+Pc3NzU1NTAwMC1tbWoqKiVlZWQkJAAAABtqN+JAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAGk5JREFUeNoBQxq85QD/////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////7+/v7+/v7+/v7+/v////////////////////////////////////////////////8A/////////////////////////////////////////v79/f1WVlZWVlZWVlZWVlb9/f7+/////////////////////////////////////////wD///////////////////////////////////7+/VZWVvxW/Pz8/Pz8/Pz8/Pz8VvxWVlZW/f7/////////////////////////////////////AP/////////////////////////////////9/VZW/Pz8/Pz7/Pv7+/v7+/v7/Pv8/Pz8/PxWVlb9/v////////////////////////////////8A///////////////////////////////9Vlb8/Pz8+/v7+/v7+vor+iv6+vr6+/v7+/v8/Pz8VlZW/f7//////////////////////////////wD////////////////////////////9Vlb8/Pz7+/v7+/r49fX19fX19fT09fX19iv6+/r7+/v7/PxWVv3/////////////////////////////AP/////////////////////////9Vlb8/Pz7+/v6+iv28/Lj4+Pj4uLi4uLj4+Py9PX4K/r6+/v7/Pz8Vlb9//////////////////////////8A/////////////////////////Vb8/Pz7+/r6+isr9ePi4uHh4eHg4ODg4OHh4eHi4vL1+Cv6+vr7+/z8/FZW/////////////////////////wD//////////////////////1ZW/Pz7+/r6+isrK/fi4eDg39/f39/f39/f39/f4ODg4eHy9vgr+vr6+/v8/FZW/f//////////////////////AP////////////////////1W/Pz7+/v6+isr+fn49/Lg3t7e3d3d3d3d3d3d3d7e3t7e3+Dy9vkrK/r6+vv7/PxW/f////////////////////8A///////////////////9Vvz8+/v6+isr+fn4+Pj39vX19fX19PT09PT09PT09fX09PPy8vP2+Pn5Kyv6+vv7/PxW/f///////////////////wD//////////////////Vb8/Pv7+isr+fn4+Pf39/b29vX19fX09PT08/T09PT09fX19fb29vf3+Pj5+Ssr+vr7/PxWVv//////////////////AP////////////////1W/Pz7+vorK/n5+Pj39/b29fX19PPy8vLy4+Pj4/Ly8vLy8/T09fX29vf3+Pj4+Ssr+vr7+/xWVv////////////////8A///////////////9Vvz8+/r6Kyv5+Pj39/b29fT08vLy4+Li4eHh4eHh4eHi4uLj8vLz9PT19vb39/j4+fkr+vr7+/xW/f3//////////////wD//////////////1b8/Pv6+iv5+fj49/b29fTz8vLj4uHh4ODe3t/f39/e3t/g4OHh4uPy8vP09fb29/j4+fkr+vr7+/xW/eb/////////////AP////////////9W/Pz7+vor+fn49/f29vX08vLi4eDg3t/e3t3d3d3d3d3d3d7e397g4eHi8vL09fX29/f4+Pkr+vr7/PxW/f////////////8A////////////Vvz8+/r6K/n5+Pf39vX08/Lj4d/e3t7d3dzc3Nvb29vb29vc3Nzd3d7f39/h4/Lz9fX29vf4+fkr+vr7/PxWVub//////////wD//////////1ZW/Pv6+isr+Pj39vb19PLj4uHf3t3d3Nzb29vb29ra2trb29vb29vc3N3e3t/h4uPy9PX29/f4+Pkr+vr7/PxWVv//////////AP//////////Vvz7+/or+fn49/b29fTy4+Hg397d3Nvb29ra2tra2tra2tra2tra29vb3Nzd3t/g4ePy9PX29vf4+fkr+vv7/Fb97f////////8A/////////1b8/Pv6Kyv5+Pf39vXz8uLh397d3Nvb29ra2tra2tnZ2dnZ2dra2tra2trb29zc3d7f4ePy9PX29/f4+Ssr+vv7/FZW/////////wD/////////Vvz7+vor+fj39/b18/Li4N/e3dzb29ra2trZ2dnZ2dnZ2dnZ2dnZ2dra2trb29vc3d7f4OLy9PX29/j4+Ssr+vv8/P3t////////AP///////1b8+/v6K/n4+Pf29fTy4uDf3dzb29ra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29vc3d3f4OPz9fb29/j4Kyv6+/v8Vlb///////8A/////////Pz7+isr+fj39vX08uLg393c29va2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29vc3uDg4vL09fb39/j5Kyv6+/z8Vu3//////wD//////1b8+/v6K/n49/b29fLj4N/d3Nvb2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29vc3eDi8vP19vb3+Pj5K/r6+/z8Vv//////AP//////Vvz7+isr+Pj39vXz4+Hf3dzb29ra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dna2tvb3Nzd3t/i8/X29/f3+PkrK/r7+/xW5v////8A///////8+/v6K/n49/b19PLi397c3Nva2trZ2dnZ2dnZ2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra29vc3N3e3+Hi8/X29/f4+fkrK/r7/Pz8/////wD/////Vvz7+isr+Pj39vXy4+De3dzb2tra2dnZ2dnZ2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2trb29zc3N3f4OHy9Pb29/j4+fkr+vr7/Fb/////AP/////8/Pv6K/n49/b19PLh393c29va2tnZ2dnZ2djY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2trb3Nzc3d7f4ePy9Pb39/j4+Ssr+vv7/P////8A//////z7+/or+fj39vXy4uDe3dzb2trZ2dnZ2dnY2NjY2NjYAAAAAAAAAADY2dnZ2dnZ2trb29zd3+Dg4eHg4uP09vb39/j4+Ssr+vv8/v///wD///9W/Pv6Kyv4+Pf29fLh393c29va2tnZ2dnZ2NjY2NjY2ADc3Nzb29zc3N3Y2dnZ2dra2tvb3d3f4ODg4uPy9PX29vb3+Pj5+Sv6+vv7////AP///1b8+/or+fj39vXz4+De3dzb2trZ2dnZ2djY2NjY2NgA3N7p39/f3+Dq39zY2dna2tra3Nvd3d/f4ODh4/Lz9PX29vf39/j5+Sv6+vv///8A/////Pz7+iv5+Pf29fLi4N7c29va2tnZ2dnZ2NjY2NjYANvg3uPs7Ozs4/Lf4dzZ2dra29rb3Nze3t/g4eLj8vL09PX19vf3+Pj5+Sv6+////wD////8+/srK/n49/b08uHf3dzb2trZ2dnZ2djY2NjY2ADb6eDh8t3d3d3d8uPr4dza2trb3Nvd3N3e3t/f4OHi8vL09fX29vf3+Pj5K/r7+v//AP////z7+isr+Pj29fTy4d/d3Nva2tnZ2dnZ2NjY2NjY293f4OLd2dnZ2dne4uLi39zb3Nvd3Nzd3d3d3t7f4OHj8vP09fX29vf4+fkr+vv6//8A/////Pv7Kyv49/b18+Pg3t3c29ra2dnZ2djY2NjY2Nje3uDh3NnZ2dnZ2dne4uLg39zd3N7e3t3e3t3e3t/g4OHi8vP09fb29vf4+Sv6+vv//wD////8+/or+fj39/Xz4+De3dvb2tnZ2dnZ2NjY2NjY2N3p8NzZ2dnZ2dnZ2drf4+zh3t3e3t/e3t7e3d3d3d7f4OHj8vP09fb29/j5Kyv6+///AP////z7+isr+Pf29fPi4N7c29va2dnZ2dnY2NjY2NgA3N3e2dnZ2dnZ2dnZ2dvf4+Lf3t/g39/f3t7d3t7e3d7f4OHj8vT19vf3+Pkr+vr7//8A/////Pv6K/n49/b18uLg3tzb2trZ2dnZ2djY2NjY2Nve3+/Z2dnZ2dnZ2dnZ2dzi4uDe397f4N7e3t3d3d3e3d7f4OLj8vT29/j4+Sv6+/v//wD////8+/or+fj39vXy4uDe3Nva2tnZ2dnZ2NjY2NjY297f3tnZ2dnZ2dnZ2dnZ3PLy4uDh3+Lg39/e3d3c3N3d3d3f4OLy9Pb39/j5K/r7/P//AP////z7+iv5+Pf29fLi4N7c29ra2dnZ2dnY2NjY2NjY29zd2tnZ2dnZ2dnZ2drc8vLy4+Dh4OHf4N7d3Nzc3N3d3d3f4fL09vf4+Csr+vv8//8A/////Pv6K/n49/b18uLg3tzb2trZ2dnZ2dnY2NjY2Njc3d3b2dnZ2dnZ2dna2tzy8vLi4eHg4N/f3t3c3Nvc3Nzd3eDi8vT19/j5Kyv7+/z//wD////8+/or+fj39vXy4uDe3Nva2tnZ2dnZ2djY2NjZ2dzd3d3b2dnZ2dnZ2dra4PTz8uDh4eDf3t7d3dzc29vc3Nzd4OLy9fb39/kr+vr8/P//AP////z7+iv5+Pf29fPi4N7d29va2dnZ2dnZ2dnZ2dnZ29vl3dzb2dnZ2dna2uDy9PLz4eHg39/e3dzd3dzb29zc3N7g4vL19vf4+Sv6+/z///8A/////Pv6K/n49/b19OPg3t3c29ra2dnZ2dnZ2dna2drZ3N3o7tzb2dnZ2eTg8vPz8uLg4N/e3d3c3Nzc3Nzb3N3c3uHy8/T29/j5K/r7/P///wD////8+/r6+fj49vXz4+He3dzb2trZ2dnZ2dna2tra2trb293d3d7c6N3e6fLy9PLi4eHf3t3b3Nzc3Nzd3d3c3d7e4fLz9fb3+Pkr+vv7////AP////z7+ysr+Pj39fTy4d/d3Nva2tnZ2dnZ2dra2trb29vb3N3d39/p6uLi8/Pz4+Lg393b29vc29zc3N3e3d3e3t/j8vT19/f4+fr6+vz///8A////Vvz6+iv5+Pf29PLh397c29va2tna2dra2tra29vb3Nzb3N7f39/g4ezy8uPi4eDd29va3Nzc3Nzd3d3e3t7f4OPy9PX3+Pgr+iv7/P///wD//////Pv6K/n49/b18uLh3t3c29ra2tna2tra2tvb293d3Nvd3t7f4ODh4eLi4+Hg39va2tvb3Nzc3N3d3t/f4ODh4/P19vf4+Sv6+vv/////AP/////8+/or+fj39vXz4+Hf3dzb2tvc29vb2tvb29vd3d3c3N3e3t7f3+Di4uLh4N/c2dna2tvb3Nzd3d7e3t/g4OPy9PX29/j5Kyv6+/////8A//////77+isr+Pj39vTy4d/e3Nvb29vc3Nzc3Nvb3N3d3d3c3t/g4eDi4uLi4d7f3NnZ2dra2tvc3d3e3t/g4ODi4/P09vf4+fn5K/v8/////wD/////Vvv7+iv5+Pf29fPj4N7d3Nzc3Nzc3Nzc3Nzd3d3d397f4eHh4+Li4eDf4tzn2tra2dra29zd3t7f3+Dh4ePy9PX29/j5+Sv6+///////AP/////t/Pv6K/n49/b29PLh4N7e3dzd3Nzc3N3c3d3e3t/f3+Dh4uLj4uPg397Z2dra2tva2tvc3N3e3t/g4eHi8vP19vf4+Pkr+vv8//////8A//////9W+/orK/j49/b18+Ph397d3d3d3d3d3d7d3t7e3+Dg4eHj4+Pi4d/f2tnZ2tra29vb3Nzd3t7f3+Hi4/L09Pb29/j4+Sv6+/z//////wD//////4H7+/or+fj39vX08uPh397f397e3t3e3t7e3t7f4ODg4uLi4uHf39vZ2dnZ2tvb29vc3N3e3t/h4ePy8/X19/f4+Csr+vv8////////AP///////1b7+isr+Pj39vX08uLh3+Df39/f39/f39/f39/g4eHi4eLg4Nzb2tna2dra2tvb3Nzd3d7f4OHj8vT09fb3+Pj5K/r7+/z///////8A////////7fv7+iv5+Pf39vX08uLh4ODg4ODg4N/g4ODg4OHg4eLh4eDc3Nrb2dra2tvb29zc3d7e3+Dh4/Lz9fX39/j4+Sv6+vv8/////////wD/////////Vvv6Kyv5+Pf29fTz8uPi4uHh4eHg4OHg4eDg4eHi4uDg4Nza2tra2tva29zd3N3e3t/g4uLy8/X29vf4+Pkr+vr7/Fb/////////AP/////////t/fv6K/n4+Pf29fTz8vLj4+Pi4uLi4uHh4eHg4eHh4N/e29va2tvb29vc3N3e39/g4eHj8vT19vb3+PgrKyv6+/z8//////////8A//////////9W+/r6K/n49/f29fT08/Ly8vLy8uPj4uLi4eLi4eDg3dzb2trb3Nzc3N3e3t/f4OLi4/L09fb29/j4+Sv6+vv8/Fb//////////wD//////////+ZW+/orK/n49/f29fX09PPz8/Pz8/Ly4+Pj4+Hh4N3c3Nvb29vc3d3e3t/f3+Di4/Lz9PX29/f4+CsrK/r7/PxW////////////AP////////////9W+/or+fn49/f29vX19PT09fT09PPz8vLj4uHg3Nzc3Nzd3d7e3+Df4eHi4/Ly9PT19vb3+Pn5K/r6+/v8Vv////////////8A/////////////+b7+vor+fj49/f39vb19vX29fX19fTz8vLj4t7e3d7e3t7e3uDh4eLi4/Ly8/T19vb3+Pj5+Sv6+vv8/Fb//////////////wD///////////////37+vorK/n4+Pf39/b39vb29vb19fT08vLg4N/f3+Dg4OHh4uLj8vLy9PT19fb29/j4+Ssr+vr7/PxW/f//////////////AP/////////////////7+vorK/n4+Pj49/f39/f39vb29fX08+Ph4eHh4eLi4/Ly8vP09PX19vb39/j4+fkrK/r6+/z8Vlb///////////////8A///////////////////7+vorKyv5+fj5+Pj4+Pf39vb29vXz8vLy8vLy8/Pz9PX19fX29vb39/f4+Pn5Kyv6+/v8/FZW/////////////////wD////////////////////7+/r6KysrK/n5+fn49/b19fX19PT08/Pz9PT09PT09fX19fX29/j4+Pn5Kyv6+vv7/PxW/f//////////////////AP/////////////////////8+/v7+vr6Kysr+fn39fTy4+Df39/e3d3e3t3d3d3d3t7e4PT3+Pn5Kyv6+vv7+/z8Vv3///////////////////8A///////////////////////9/Pv7+/r6+vorK/n39PLi4eHg39/f39/f39/f39/f4ODh4vcrKyv6+vr7+/z8Vlb//////////////////////wD/////////////////////////Vvz8/Pv7+/r6+iv49fPj4uHh4eHg4ODg4OHh4eHi4uP1+Sv6+vr7+/z8/Fb9////////////////////////AP///////////////////////////Vb8/Pz7+/v6+vor+PX08uPj4+Li4uLi4+Pj4/L09iv6+vv7+/z8/Fb9/f////////////////////////8A//////////////////////////////1WVvz8/Pv7+/r6+iv29fX19fX19fX19fX19/r7+/v7+/z8/FZW/f///////////////////////////wD///////////////////////////////79Vlb8/Pz8+/v7+/v7+vorKysrK/r6+/v7+/v7/Pz8VlZW/f//////////////////////////////AP/////////////////////////////////+/f1WVvz8/Pz8+/v7+/z7+/z7+/v7/Pz8/Pz8VlZW/f////////////////////////////////8A//////////////////////////////////////79VlZWVvxW/Pz8/Pz8/Pz8/Pz8/PxWVlb9/v7//////////////////////////////////wD//////////////////////////////////////////v5W/VZWVlZWVlZWVlZW/f39/v7+////////////////////////////////////////AP////////////////////////////////////////////////7+/v7+/f7+/v7+/v7///////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////8kfX8xueSoCAAAAAElFTkSuQmCC");
			ki_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAADOBJREFUeNrsm01oHFeewH/vVZerqrvUdrdabvkjtmwvE8PEin1a3XaYgQHPZcllw7BxGJLNMrBgnxwxMzgLG0zoGAbs05BdD8smLGxgGdhDAjksOfo0VuQ5OMkolh1LltQttdRfVaXqem8P1S21Yn211G3PQv6HplWlevV+/b7+n0LTrdSR3LjihhZM50rZA8H8i523vwTyc1s/fgagfqjjgbx141KuNAKBWbt5FcVf32HsT911SnTP8SA3s6FPDxAA+vQUQP4QEDK1JcbUGeowD5z5Jn6QU9DxwA+EWg2NVF85HgQAw/MARmSAEjD58hej6NNTQ5JDu25pmfmh9Dei9TASIiMi5gKsE0bfOO63ENpvUIBAfDGaT1IB5KFu3rwMCtLTh+cnX9ZoQAItnPwccLYvHPfXGBTQmksSfXxmZNFSkO12fi6jABlUOfZYoER7LCRAzHK25xz3GZ43IgPVJkACZ1b51vSHBqp7wABYAgaqMqi+wIEpQMWNoyUQdUOyO477DM+3FgOTo2ipz6wG2KgF20pVYY8YMQgM1APSEh/rwJRQIn4HEqL83C5B5K4whkXJUFrfm5yc5Nzk8ImhEz+PDOP15U+OllUVyO4Rg6xEQVWVy4+XXzeM6Ocnhk4MT+rRycl797RWoiSW7we9Go/7wlCCSc7DxPnT7179xe81iJrjUFcAKsc+ZKn1g6aYtV0N4o1/v3Htm4nzMMEoWkb643d6w/GlEEyeRwBiuJRh7M7YJ1f/sxpPKBT7woAl1ZoVAzT+8cbP7ozdoZyb04BmglGt9ZGDPeH4msnzghGmh6N/uD3GHZau/t1L+Wb79j4xoLT2LcHir29kGePOm/9mzI0wjZ5gVDTP9oDjz3ryvGCIFBA2NWOfXH3vRHX9foZ9S6njzBt49Ksb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");
			ki_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAADOBJREFUeNrsm01oHFeewH/vVZerqrvUdrdabvkjtmwvE8PEin1a3XaYgQHPZcllw7BxGJLNMrBgnxwxMzgLG0zoGAbs05BdD8smLGxgGdhDAjksOfo0VuQ5OMkolh1LltQttdRfVaXqem8P1S21Yn211G3PQv6HplWlevV+/b7+n0LTrdSR3LjihhZM50rZA8H8i523vwTyc1s/fgagfqjjgbx141KuNAKBWbt5FcVf32HsT911SnTP8SA3s6FPDxAA+vQUQP4QEDK1JcbUGeowD5z5Jn6QU9DxwA+EWg2NVF85HgQAw/MARmSAEjD58hej6NNTQ5JDu25pmfmh9Dei9TASIiMi5gKsE0bfOO63ENpvUIBAfDGaT1IB5KFu3rwMCtLTh+cnX9ZoQAItnPwccLYvHPfXGBTQmksSfXxmZNFSkO12fi6jABlUOfZYoER7LCRAzHK25xz3GZ43IgPVJkACZ1b51vSHBqp7wABYAgaqMqi+wIEpQMWNoyUQdUOyO477DM+3FgOTo2ipz6wG2KgF20pVYY8YMQgM1APSEh/rwJRQIn4HEqL83C5B5K4whkXJUFrfm5yc5Nzk8ImhEz+PDOP15U+OllUVyO4Rg6xEQVWVy4+XXzeM6Ocnhk4MT+rRycl797RWoiSW7we9Go/7wlCCSc7DxPnT7179xe81iJrjUFcAKsc+ZKn1g6aYtV0N4o1/v3Htm4nzMMEoWkb643d6w/GlEEyeRwBiuJRh7M7YJ1f/sxpPKBT7woAl1ZoVAzT+8cbP7ozdoZyb04BmglGt9ZGDPeH4msnzghGmh6N/uD3GHZau/t1L+Wb79j4xoLT2LcHir29kGePOm/9mzI0wjZ5gVDTP9oDjz3ryvGCIFBA2NWOfXH3vRHX9foZ9S6njzBt49Ksb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");
			kob_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAACgxJREFUeNrcm0tvJNd1gL9zz62q7iJnTIG0ARGhIujh1SiGgcSL/BID3vtHGd4GQXbZee+FFwaMIDA3yUgDWQtrQcXSZMiu1z33eHGrujlKwhnZmO6eNIaD6nqxPp73ObfE+X/xkb+CI3+R06MJ52/fVg771x+5Jr9+cv0JREMnkY/fNo6bX/+dNw7QADCCdBJzPiTKd+b4zG213gBCPe8aAUQ2EnL46O3guPk1/zjW425HvXAUkpjDB8fPccPXKwAXHKTsdAFHcEA6qsOQfAeOr/xF5bIDgE27Q9kwf+ki/uERc9w8//d/wEFk89L+8vj39gnBPz5ajpsX0YFQTNwBJALTab4nk/mm0T4+Uo7/9FU9EjZbq0BPO6AZmnCX8wnk5VCHC4H9eq7weqd9unpcT6HvRIgxRgj/oh3AAHl98ih2lQq4A2sEsj89Qnk8WzOGjeAIkQS6HsqRZijBkF/+9HsDjiBsBCDywbFxPFOkEyCSYiJij7rd0RkkvHg8gamJbAQX9mokr6NXz6q+76XoUyTGlw4226zxn1OVs5gGOTlxcZI+PSqOT1Mn1ctPr3fNFmILwt00b1Tx5AT3pJ8dkV59nkkvi4BEzAL/BPz8Fz+HDIFf/GyFAcEUcap0e3ore8u3Xs3xbH50IC5bv3/SOl6bWBDrKisB8bb1OU0R1KsE3OpHR8LxVIGEw/WT60/w6ydc/8R9jtzg29uI+O47gQog9R8eBcengQTeui9xfM52pfz4EhaXw/MN1bQE/Oc/PAo7D2lyX69idnfP2b0eQST0XSe4ZxBBJAglCtZe1wpiiuITnOzHacVXaFVu3euBgWauln7zpIUNUrLdklS1W1lBDQoGGFSAHoFe5aereoBmFNlcA3zitLDh+sn1T+bkkA3QbmA9k2BqFAZI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");
			kob_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAACgxJREFUeNrcm0tvJNd1gL9zz62q7iJnTIG0ARGhIujh1SiGgcSL/BID3vtHGd4GQXbZee+FFwaMIDA3yUgDWQtrQcXSZMiu1z33eHGrujlKwhnZmO6eNIaD6nqxPp73ObfE+X/xkb+CI3+R06MJ52/fVg771x+5Jr9+cv0JREMnkY/fNo6bX/+dNw7QADCCdBJzPiTKd+b4zG213gBCPe8aAUQ2EnL46O3guPk1/zjW425HvXAUkpjDB8fPccPXKwAXHKTsdAFHcEA6qsOQfAeOr/xF5bIDgE27Q9kwf+ki/uERc9w8//d/wEFk89L+8vj39gnBPz5ajpsX0YFQTNwBJALTab4nk/mm0T4+Uo7/9FU9EjZbq0BPO6AZmnCX8wnk5VCHC4H9eq7weqd9unpcT6HvRIgxRgj/oh3AAHl98ih2lQq4A2sEsj89Qnk8WzOGjeAIkQS6HsqRZijBkF/+9HsDjiBsBCDywbFxPFOkEyCSYiJij7rd0RkkvHg8gamJbAQX9mokr6NXz6q+76XoUyTGlw4226zxn1OVs5gGOTlxcZI+PSqOT1Mn1ctPr3fNFmILwt00b1Tx5AT3pJ8dkV59nkkvi4BEzAL/BPz8Fz+HDIFf/GyFAcEUcap0e3ore8u3Xs3xbH50IC5bv3/SOl6bWBDrKisB8bb1OU0R1KsE3OpHR8LxVIGEw/WT60/w6ydc/8R9jtzg29uI+O47gQog9R8eBcengQTeui9xfM52pfz4EhaXw/MN1bQE/Oc/PAo7D2lyX69idnfP2b0eQST0XSe4ZxBBJAglCtZe1wpiiuITnOzHacVXaFVu3euBgWauln7zpIUNUrLdklS1W1lBDQoGGFSAHoFe5aereoBmFNlcA3zitLDh+sn1T+bkkA3QbmA9k2BqFAZI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");
			kow_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAB8VJREFUeNrsm02OG8cZhp+3mjIEy6OmBvEiNxCQVVPxWcZDnSC7nCBn8C4nCAe6Spx0bwMoeyNQMCaRSHIsdr1ZVFV3z4QzGi3Cpg1T0A+bGqAefv9ffZ/Mz+KlE+GYHkM/VQ5juJw8uEKfSDM7h/ElbNabybP1Zg1cST8djsglGwAPJ5HT+defgjIvR0wQzpJpuqYr9qFPI5mTI1EYwLEvaibQV10SilhzFU6bY6Awzbe9d0UugjqoetEhEA8kmY0jXm6yo2r487XxhAOxrKoXHcltrXl1shwXbAoFf3lj3w4g4tkiFJIHiGQejni5yRpFi/3hOk4jYbJznS+qFYXkYyCzcCSMTAG2b4R0YWxUBbGiexDIHBwZI1E423r+rdFEECKT6GNGMgNHvNzgIgxnFBvYAXVSKsovlEVyP8jxOUaMTGEi7EZLF6hGGmlWCeSKcEIcFwmjTQi2zc7GRJQCoRBSjVRgCsg/fn0yHCNGEkZkaxPlqZ3LQWhJKEJZJRu529iPzXEDw7Z3MZrB3ofoIUEItQJCShIRa765QyLhyBgk23B6xe02RtvR0UXJSO+jHeN22+cnbYPNht9zEhxsDE2bxRF3MWOkF5AIE4tjjLuYP2kbMFxdn4JeXWywG9pE4W0iGBP3SVWbjF0h1CGZ+4ruHu97bHnYjBgx5i8fijiGf2Xzif02JtSWxrC5QyCL44rD0LT52Nvo6Emie6PYFUYGh7hbljdgXR4WyFHlsQE3+SuPI4Z9uH9ibKlYP1kgXM/NcYGB1jbE3YhxZyPIuU7MOVgLNpvfnYB9uEkHPIAx8VkFRAhiv805MCSf9d3M/qo3btocOHpHRld1u/oYPBaSgp6FlKGs6CSoZpXHxSAO4i4WPzV4sUOdxfRRcmrJRLBZzyuPHg/i+D4mrfKBo2uS94oSRELKs+iEqnn97nDcuC0hYvr8ef70b5oEwiCEvXuGZbldNZ1ytTUTx8VmUCtuWHTB+HvpXn3QtBmHQ6iDcq3YrjD9Ym5/1WI77qbiGDDCWbVYVIunYeGhtB18bvoJm7Y56KiPx7G5kZvcjn3PXy/48ezs7Kx6zKNF7jbIcjISj+lK28ycl5gm/50D9EQcz18/fV/Vb9KRHr8jAsGyZSxtlzFAAhPw4dHMdu6DSQi8Du+kN3uAfy7eq8KysIoO7WqTIDR//aHMsrsZtQEqST/uAfiwB1WSFAK52+64HS2EQ/4qHFUe7RAdbuVVfrL8kDvu7Ht9EQIh30nZMdrejS6umT2/WjHpu02t3P++7gem/f69JGVpSHJycsWFdbNztKMq+aZ5hGeTDldvBDElG7aVOxKehpUZ66j7Xt9P3yzZolhFDT1Thxi40Tidt669I/Xq+4ntClhWDlFo0MLofDuyOon6/JAPKw3dG4+sSYjxEA7zJdVpykMCwniURRBxbDkMjkHC0B1wu3NwKCezhUECx8co5I8/OyfV5WCPfaDJD1cnwTFcb4yFX9QPT84TyOefnct879SKyyQCLe+rlY7qrzoj45sKntq59tu3CvrirR49RXFrRTtm5ySn71uHS8aj5yXNCoTq/7HUYsOVzhb/kbzDMfZxuMGVUInvHfPax1ruBnXS2EYoFawtePfOn9tbmxhJWaGwVBItsaLRrHr1qldp4Cr0wsMkiSCkFqIEb98h29HDoImGzgkIupn7JVMtSucPuZ1DKNmwbUG0+5jbEMqtq1Dr7izxqBwBWCFJNYPCKGjwxAqVqgDu3feTVpyCyPc5okUzx8GvUZeOrJAOVdQmhUEFUYFjXPRPpFELQVKd//fqoFodk+OPY+irFVJHZ+zv5AtaZPt9/y+YGLdQnblX3eFBpiNynK+zYiEF5VtAJZVJUpEgmv0Q6cvdbViGj8xhHdPOf1MUC9UhSCHdNA0lYqqX2JsbsTIUaYgXq06HuonH5fjDy8HSQ63kqxTyEVMSGN3vXXxUNg1CHcpEQHeXVI56P3j9NDXcsZ17o2NpZMl4T1TUePmcmZO/WnXcIY7jxo/zl8AqabqWIYRxYiHJwzCE8VAsKYsuY6xPQB5cL6ObNl9hmh1jL84C2302DRUzD3UOli+gk6jmt3M4v4RulQKCguq6Xi6XyT6CSElViixJBkEDhug6iTWnwME3L5U0q5xV0rJeSkGG3uXKI3myoOUyFE8FEutXp2DnABd/8jAkk3LFVIfvbO/HuOiAVJONZJj4uXME6+gc331pmjbfk+WOOml4aV8qi+Rmbw8u3SONWebI4jBEVobB0/TV9dAOEarJjVEpT8TdP6N4/Lw9LETHSuXbzn8EVQohKITwbLlchlApKChIA8Z9h51lXnRvGmizOPJoRhzGZCaNiDxomYZ4T2s+EWCfL3VaJnMxlPZtGeAVPHjwdaZ56j4du4GWGB13fWlWldnw8KtKheJE53cp7do0atHGPm5vXVQJ6cvfMoxTf3TCfb59g4uybUDz1364UR/7jeeL1TCo//GNgxn3P/LGQSZx3E046hC+GhYnrh7gVWfdx5msgNB8Oz1JqEpH6IGLLPPuFdm3FosAutFrrXngOs7se172sOiVTqPhGvATKE5if9C+5PbmXd7xevgS4Wnsc5qvryZ7kFd3XjudOAdFsYZe+qfupuqXPeFfOP4f1cDPA4P/DgAwWJQLXj/G2gAAAABJRU5ErkJggg==");
			kow_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAB8VJREFUeNrsm02OG8cZhp+3mjIEy6OmBvEiNxCQVVPxWcZDnSC7nCBn8C4nCAe6Spx0bwMoeyNQMCaRSHIsdr1ZVFV3z4QzGi3Cpg1T0A+bGqAefv9ffZ/Mz+KlE+GYHkM/VQ5juJw8uEKfSDM7h/ElbNabybP1Zg1cST8djsglGwAPJ5HT+defgjIvR0wQzpJpuqYr9qFPI5mTI1EYwLEvaibQV10SilhzFU6bY6Awzbe9d0UugjqoetEhEA8kmY0jXm6yo2r487XxhAOxrKoXHcltrXl1shwXbAoFf3lj3w4g4tkiFJIHiGQejni5yRpFi/3hOk4jYbJznS+qFYXkYyCzcCSMTAG2b4R0YWxUBbGiexDIHBwZI1E423r+rdFEECKT6GNGMgNHvNzgIgxnFBvYAXVSKsovlEVyP8jxOUaMTGEi7EZLF6hGGmlWCeSKcEIcFwmjTQi2zc7GRJQCoRBSjVRgCsg/fn0yHCNGEkZkaxPlqZ3LQWhJKEJZJRu529iPzXEDw7Z3MZrB3ofoIUEItQJCShIRa765QyLhyBgk23B6xe02RtvR0UXJSO+jHeN22+cnbYPNht9zEhxsDE2bxRF3MWOkF5AIE4tjjLuYP2kbMFxdn4JeXWywG9pE4W0iGBP3SVWbjF0h1CGZ+4ruHu97bHnYjBgx5i8fijiGf2Xzif02JtSWxrC5QyCL44rD0LT52Nvo6Emie6PYFUYGh7hbljdgXR4WyFHlsQE3+SuPI4Z9uH9ibKlYP1kgXM/NcYGB1jbE3YhxZyPIuU7MOVgLNpvfnYB9uEkHPIAx8VkFRAhiv805MCSf9d3M/qo3btocOHpHRld1u/oYPBaSgp6FlKGs6CSoZpXHxSAO4i4WPzV4sUOdxfRRcmrJRLBZzyuPHg/i+D4mrfKBo2uS94oSRELKs+iEqnn97nDcuC0hYvr8ef70b5oEwiCEvXuGZbldNZ1ytTUTx8VmUCtuWHTB+HvpXn3QtBmHQ6iDcq3YrjD9Ym5/1WI77qbiGDDCWbVYVIunYeGhtB18bvoJm7Y56KiPx7G5kZvcjn3PXy/48ezs7Kx6zKNF7jbIcjISj+lK28ycl5gm/50D9EQcz18/fV/Vb9KRHr8jAsGyZSxtlzFAAhPw4dHMdu6DSQi8Du+kN3uAfy7eq8KysIoO7WqTIDR//aHMsrsZtQEqST/uAfiwB1WSFAK52+64HS2EQ/4qHFUe7RAdbuVVfrL8kDvu7Ht9EQIh30nZMdrejS6umT2/WjHpu02t3P++7gem/f69JGVpSHJycsWFdbNztKMq+aZ5hGeTDldvBDElG7aVOxKehpUZ66j7Xt9P3yzZolhFDT1Thxi40Tidt669I/Xq+4ntClhWDlFo0MLofDuyOon6/JAPKw3dG4+sSYjxEA7zJdVpykMCwniURRBxbDkMjkHC0B1wu3NwKCezhUECx8co5I8/OyfV5WCPfaDJD1cnwTFcb4yFX9QPT84TyOefnct879SKyyQCLe+rlY7qrzoj45sKntq59tu3CvrirR49RXFrRTtm5ySn71uHS8aj5yXNCoTq/7HUYsOVzhb/kbzDMfZxuMGVUInvHfPax1ruBnXS2EYoFawtePfOn9tbmxhJWaGwVBItsaLRrHr1qldp4Cr0wsMkiSCkFqIEb98h29HDoImGzgkIupn7JVMtSucPuZ1DKNmwbUG0+5jbEMqtq1Dr7izxqBwBWCFJNYPCKGjwxAqVqgDu3feTVpyCyPc5okUzx8GvUZeOrJAOVdQmhUEFUYFjXPRPpFELQVKd//fqoFodk+OPY+irFVJHZ+zv5AtaZPt9/y+YGLdQnblX3eFBpiNynK+zYiEF5VtAJZVJUpEgmv0Q6cvdbViGj8xhHdPOf1MUC9UhSCHdNA0lYqqX2JsbsTIUaYgXq06HuonH5fjDy8HSQ63kqxTyEVMSGN3vXXxUNg1CHcpEQHeXVI56P3j9NDXcsZ17o2NpZMl4T1TUePmcmZO/WnXcIY7jxo/zl8AqabqWIYRxYiHJwzCE8VAsKYsuY6xPQB5cL6ObNl9hmh1jL84C2302DRUzD3UOli+gk6jmt3M4v4RulQKCguq6Xi6XyT6CSElViixJBkEDhug6iTWnwME3L5U0q5xV0rJeSkGG3uXKI3myoOUyFE8FEutXp2DnABd/8jAkk3LFVIfvbO/HuOiAVJONZJj4uXME6+gc331pmjbfk+WOOml4aV8qi+Rmbw8u3SONWebI4jBEVobB0/TV9dAOEarJjVEpT8TdP6N4/Lw9LETHSuXbzn8EVQohKITwbLlchlApKChIA8Z9h51lXnRvGmizOPJoRhzGZCaNiDxomYZ4T2s+EWCfL3VaJnMxlPZtGeAVPHjwdaZ56j4du4GWGB13fWlWldnw8KtKheJE53cp7do0atHGPm5vXVQJ6cvfMoxTf3TCfb59g4uybUDz1364UR/7jeeL1TCo//GNgxn3P/LGQSZx3E046hC+GhYnrh7gVWfdx5msgNB8Oz1JqEpH6IGLLPPuFdm3FosAutFrrXngOs7se172sOiVTqPhGvATKE5if9C+5PbmXd7xevgS4Wnsc5qvryZ7kFd3XjudOAdFsYZe+qfupuqXPeFfOP4f1cDPA4P/DgAwWJQLXj/G2gAAAABJRU5ErkJggg==");
			kib_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAFQlJREFUeNq8m1FsHNd1hr87d2Z2R7vmUivRlJa2KUqxZMAVoMgN2pe0KYIEaN0ibh9iN4GdoFaRGDBfSFcwWiBBFSAN3EgFug9KAblIYyBGDBQNigRtEARpkYc+OFKMugJkRRJFW7sSRYvkrHa1uzNz5/bhzuzMLimRlJIQgrg7M7z3/HPOueec/9wrNNv9+a3/2MmpeXyoIoiCW+mNGtCsoaAs4MI9hpgG3aztyC5oOqeOwwpQOckcq3/IOY7+39aFEtvH0eNqTh64VtBohKhZAPShUWtG5n5jumF1rfgg7w2jgMZkWQNxU2sBoi+mGlMspo/sQ2l+99eHo3cVmC5yMfluUdA6ENoVoqYlWIMnw39/WjQ0CiQCak3NI4WR0WJQopkO0IfYXD9IbxHYp0q/FhwXgEMpBAsogCZw2H195lYIUyJ9svXjP74mrYHNAOhAilpjBIqmAc6uhb0fErqIfqGfwAM4+B7wxK8cxwWDIZEfNGirj1P5cKY13nSYHDzZrDZskSEQ2kyiCZBTjaliHkj7DoTsGFvY+2FIIRYgEuOMgYO8t0UkW8VxgUMGRAGNBqsPUPLqf75rvLmrRQaj9ePDRSO30EKL4fcfIEWtuT9/bQkYu1VbfPQ23Q5AITbqNlgObg2JtTUUFw6Ji5blFVwnjrUIQ+vh0pu13W+Orb18wFt2WnIAo9VafsqNtdZaCy00Wmud/K+1Fq4ro4buXcmNPQmy5TT3WHptbPebtTdLk1YYWnEcO27Bs6yL4tCFXxWOC4fEJcsrOG+//fOzwjr7cOnNh77w6VedL7/8oz1eswVydwLjX1sf3pABAEGgAx0EQRAQ9IGAIAj6AYGrVIMrzRyQUEnptJZv7vmRPu+8+ukXHnqzNnnW4uzP337bKXjWJaEvrP4q7OrCoUsF4rMcASW9M3MvnuccSyV/UujbgGR3qgz3h0+B0ASbjCiZEnmPX5Io4CHBjUpnEo4++fqpY10l4Z3DrkX/I++99ZUHx/GeRxxIAVCLVic5yrnnefIVbksUkgzGhxbCuDOgAKQAItzkiQyfFFMjQMxYpegfznMezrG0s9UDNO88JcTey5sA2QqO9+NACqZoTIdfeOMo51h65buCFpEdgc148thlZIYCUHIqWjYfx7u7Ft1swEACTJFbuT60icCObMbQn/umeVn/4ixO0UArV0xdeuIBcfzSCaSYQgs74s7Hz3H0Sb6r28avYgvG0hB5Q4jYgBCAZuq15/PjjO+4oQlwCdwAJPAIOZWsWcl4wA7xOc6fO8rPdgBaNNDvPBWKjzwQjl86SjDFrSrQcr78TUo//dSPP5Hd35X87i9p+khQEoEGrz861Bufl2bCBAeC3ArcCgcf/4tPEXV45VseQrNSFQ20DNUTD4Djl//70SnQK1BdgQrS+f4zAG2IsIlSGFcsoc8eAQRaaART4fLQQN954TsvvHF8CS2SOAJqyEluODaRHdlQBhZ/8Uyo8LGj5F01InEvIJvgeL9nT2mhUfhQwaeKgN7gfiXVxiIyCcXJzygOgO+I5wo6NbtAAnkgrdDOHi2iWaECPlT8qtCi8YuP3XniPnG8//ZHa8BKBd9I7GOPtbL7D6e+0RgGAVoU++vHe+PziT0lSJQUxVp22yf9m7HWWCsavCUfqtC8F5B74ni/N61XqitmvJPzZsBWZI/iaPYYSUDQiNoKlZPm29zJ+eUJwvqxrhxMK6APkly+dUsNPkb22EqmbnyqK1WxWLwrkHvh0It79QpUSKSZB3wqfsWHSienjn5jkBUO8kMFuGYdBuwp0ILFQSQRGgQ6AB7LgPh9oJTMYd5eOrMPVXF9ulPePo7LorYClZMwC/XZOvPZvVNznag2gKEFGhTvcoR3jrxzGHBTP0ixGf928ymw0WG/nJnWTSJen8vJcHK2PgvUmfeh2tThE9vGcVnUVqhwctZ8rc/WYZYsnKVFTrOHJimXMukSDAG4w8JnwFJbjA5kk978p7khDPVkdurz+FQb3AXIPXD869MrVE7O4pj6zlx0A8zLHsBYXdUKKOQcROs0x3KHJxvxoFSf07l4eLPESHqWzl+f96n+8M/EdnH0VjjDrJNVqjghTpjA2Tl47H1cROoXGgLePcy7hzFZXuAmYrkDJKNz9u18QXLTcQM3QeKE+enrHKOaT2a2gqPXLHKGOViGcruMB9D16HohwADGiedcIUBrAvkOAEfSVefdw0AmVOY0IzCQQ+Xu114GcLpe1wOgC22ACcL6MXbp4rZwXClyZtZZNrEuWw/xQifMwaB/Q4DWZ4+8w6eW9iG4FriJX2RCD3IRhbseSV+KoQrxay8DDt3BhXZZ4gMTYf0Yvf3bwdHxKydnnWWz+Cmz6qsUSQ7GiRcs0P13D7vWXvNU3NCpM5hFSQuN0KAJ3j1s7EvktQHYtaGX3Akir5tWKvkwORHW5/1Kaes4ThxXJ2fXqPASp3OXEyQTOfO7CVojxF5s47nR1UIaSfSwj+vclYGmhA5wA3v4Ja863VEQvHQafMbr8/K1r2wVx4njrzG7VnkJTnldrwupraLAy4WihdjRgKhZCCK7XRJodbWQZ3x0zsaEThcqDUEWYgI5VVwHRBoz6Hpdr4vX9V4CTvvjdY5vAGRDHKvdM7POcuUlTg1d9gyQnDZohoamOYBA0ymbN3y5MFh/M/ZnJG0JTM3oGgmC6RGObjUCCV2vm786B9+YCOvHvJ1bwdFunZl1ll9lBIZBUh120SWgzz4pyKVYlwo5Am5gQNmvfNEI4AqtDoy+y2g9DJjjtD8R1o/1ZzbHsVA4M+ssV+gSW/EIseINwzjxXLEP7EOSUVXt8qWCAaEhcMUgGzH1VcJDJLW9UYrQox4C123ZJUcvAlZs4eFPnOJYf493b95ngZkzeQJ28DEGpoZhcKzQB2IkaEGbdrfdbpeVq7UmiiIVBAT9fmAioRAghBAIXBelQBkuggDhrnudeydcL503lSF5r3OcKYiF7j1x7G12wOmW6eZRmNJoavThqgDixxPrl12JlFwy2a8yYrpDuYkw7i6E67qu66KUAone0L7LVXdEwBi6lAHOrOwdQrIOxwowC3LEMC3r0XUoeFYAMUIKEO2eEHhesVgIhABRsI2oAyDauIcwP5YQQhRcDBRQG5RdTEy5WNbwa+/KLrPMs7JSEwt38Y8eragS4HQldDO7spjaOMp83unDvl65TbkroLFfYUdwtZCS7IlzBy4ILRB0DzRzJZdOIj2uQO3fOCKv6m4mSGzhgfLC+rxPFQbZ1gBHT4BPVIGAiARHYk93yyRPPFekX3gU2hIEUZGEgbvqmiRdI1KbEYCoaeCqC6Kf0PZ6QMoHB++asa7qvHV4CrwQlw5UEvIfEX6d5wuT3//4oKYIcLpGnu69MAB0lgWCPvF+iQKpkAiNgut6/ZIr+vvM96sF6M9ctgr0KaDNA1o4tXtMdaPcNabuAcrgwDcVthxf6otVK4ZyF6QC2ig7sin5dgSPbNqdWtICQX/GSC1VUkspuK61EGkYNLFyn1QILdCiST/eD2JhRotmshTrUO7fAmV+vdyBUiexyjLtigKv3bqP/mAuCl5HCNLXjERJI7mCq4UaCzPAgumZiO7joEyedZ3+ASVRQnPFKkB/plm79si1fQ8gyoPh+MFvi1oatqVol5QUtMsQIVHp2AIWCjrYJxPTU/JyoX8gMUC4cgBT8HbGH0AUiwf5OSxqWiOllNIWbSnSLMpOWV4ppbQseQCBRMqEh0+SCiUEyP1aX9Hm1gP82A/257VUnaINSsvMr4VMlNEGyn1mjEkZJDULtEr4Icn+jcrE3yAOTbI8gC51pMovUFroBEO73GafsIzHG2aFJjWVrAsaQoW8S939m7GrfL1dViUF7fYgdGNMrl0GzS2UipWKlIqVolkDWyKFaHc7oiMe1KoezM+f/btqWdtaSSVN7rocUjFBaBmoguxIVQKWzR4OLdBIELpZMwtbRw6EuF14ED8XftwaK3dHL/sVeGjz9aob5SiI0ElILofQCVPaqbaMwWQaCkihyQxODkjHlr17s+luk9Ll+ejebo1ZazXxtzxfmFwz0pisxOkOormH8sp3H7i5o7xWWamu5K+FDhBiR3aUY9GqSe1hGoa0y+2lSaTp+YD2KftjY3eVX5hY7nU90pwEEwr52TNL/Tf464FdmfSKEgFEIHPpFZ7YeRd99INxbVJko4HQSTQR5unA0KFqSvK0R9JG0pxMe3Batcu+cxezGsqtPFAeIS6+neVWw/7RQ2haUYXA6SYw4sFSsDGUzn9+BjRyOdxkdVaJ9SQ42mW6qKVawvquAao8flcQcbYkeQovdPHtMcQQIZetV8ViEyJ8CD2Fl1VicRzH3TuN9e2lAQ87kWV4juPkV3XbtoHmoJlgYkYZ7ZudHCJJIYWj1g+/3LjTjeN8QegZotkngmbxbuvujL5erUI9YUaGCrGYYD2S+jMkC1AF28gchiFgm692gqUik1iTrq+aMlKagl2AIFq/8i43giEMRi2eV3ehWr2uZ+6x7na5UeAMs8ay4tFI47nDTt9ZqpaQAtrlhmHhIhuIsKMkwJrKo1RSaQ6mE0K70zYrj7I1vojWeUc76A7zA1ix5aG8kPox+ntGX/VwHPS6e3b2j5EQw/mK0rKAbrB8Pf94qdhCdtq0ZXsKRISY3PWwwLYj246iKCVHdRspuSKl3el22hnLmVCGPhFy2KyuLwfdEfGs2JqDNtSP9Xfu6XqbxMFnv6H2DNNXsZW3TmXvHHL0P+0gUdJjCS0ejjVS0esAkdFJkvKWKLfTYpFymzZQ8SsGjIgcuXsddzVYMVMBUhJu7IZ89Xubx/Nnv93biE40zKiSQ0Ce/a7oJDx6W5T8SaSSKORNE47AToav+BUTB/2Kn+YxidYREcNmtRoZZqu7IQXnFb/4va3kV9/7YvHM8Xo47p9mbg7PGKKX+r4iyu0herIXQ6eokG00stfrSJCSXZHWGtsepF8+vh/5a76PP9Blp1SpACoC+dAIJaoU4Hlmdg+PuTlO+xOn6sfPbAhjw/zq2W//fUq381KebkcBHmGmkZWf/g44E5nVI3i441O7mZiUotIe8Lt5mkpoyh2IAIe8OlYduqQkdcq1cxqf8TrHX/urDWFsnCeueHG+/YGSoBJX9AhxBx2IVa/XJ7TRlNuCyIaSnwiOoXwj7GGiN5tRDSK+vSvX+xh0cAb7hsCHibA+L5W1MYy75LsLge0ZICPdKDxCJw9k4dzvowhtiOyUmNIbtDXXM4YiMjmYE+a9oxOM9KJA4kPZC+vH6IXuzHby9g86+3LtQSjnQmMI0K1lColUkl+ZsKHXgdD5nnN2NzKbYBxy6rjp5JLLrDc4QdIbvLrd/QwX9olbVE7OOqa7SSpq2n0O070MC4+togiTuUNTYWqhRTQoNkenEMYtBlaVqeOm4xJgmsKOSZ3N7GF93r8XjLviaO/4t6dXqJxMGs/hSBUInYdThQTd9L4TJjLYCQUiorTbxmDfRmSnKBJ1yJ1ys955HdM775S3W9eWLx5pVvHnqYehyZmo4+K6rusGp+BUycQIdl4vFMjtFQhN5FAIIUBKjUjkFkIIAUSpMpLfIg/jlOum9DZ1CMMwDBMYjSPvle+jrr3gDG0vIb+7BL/SiUqVpGHy2KpKbM5JC8JMgXbqBwMNjLxvL62f/D6U4NRcbl8Gs9TZbG/JvfmSR0qLzdoK/jwn67lMpMSpF+3o9S9h902ROUNHSMxeB1NHEQ4QmaA+kN58GdSKAIUdORicmuu8yKm5ZLOPy2wdzBGNpjXduT+e4cKO3rSGlfwuKOwkpzUrolln2qf+5nY/sSsndEJsoo1fWpT8y9QhRbJWDe29IoKK2fKV7L1qRsU7T9wf7/PVO8XFJlSrvp9dHBsbqLCQfiqfX7IKktC4RwhRZG+o5wg7sm3s9K4DKQzsrEatpqX6POD71SrVpi7e+er98j4L/R2hmDKknw8V8O0x0Sv2cn+ezNgsx5EaXtbMax/1CJucUWWBvJUTo9grarOpz+xNBNGIincKM/fNX7WvSW0zhV5JBKpIZ82fNvWJKZnch1LqxApMHBk1pcQS08oqGlhWzqhuOKnBlgHWxkOFT7UVwS5oEAn1SPkBeLjVJWm27+qVqtBEL36TaFf8k0+QhYsxhoAYJIkuErnT/azJ/5lvDALH0N7dT/7kDzq88roNsLILs3d3cueD8KI73xKhjHQDURX0RXh+cvJP/vL2MxXpOI7jIB2HtZQT+cdYIJNIYmSNIrPmRhGRHSUfMxiF/05hrOE40owpP/PMl976vcnJ86FwhGAXDR3JULy18wF50QscaOp0e3v0Qm57e5Q6QFrKdVRMpMy6laUwRjepHuxkGXaQ7tpjyRN32dseNabSve2bH2XZlN898dkD17UODPFXHEuPG/xzq3Jbmg1NanAU58pjdzLbGkTB9T8OFFR7Ovm2JJPkvKT1X3D+3NFzLO20nUVAK1eIvZe3cCBnc576xGfN8Y/Dct3xjzXLdNMGQDq3xtKtxLmAPoLFAemuxfsyGAqIx9ed/VCYsx9bOVe0tXMsFy0KxGfhcEH0pm+dmf3y+XM8f/qnf8QtB4kKH8mpJO6PpsfrUfQfT75ec6QCxgijl97g6JPfcv1di0XdfxeesugTH9wSjK31DS5w6CIHFgpoDYgAd8+tM8DccmW8f8tBquyYV/N/PmnFxk0IN4Ih7dYABUtIFGOFNX8irMOxXTeCAlqffUoI+jOXt3rKa6v9j84H2XE1iLPjajzUMsfV8sfuuruw4qSjEA76CEYV2D95KuvLJmfV1sa+PpudVauuiu2dVdtOH6fZGjk+iM6OD95xhoBAs7yjbRFHZHU9EmyLtbefLg7BCHeMLez2Qwo6Ozq4zbOD2+tHdT4gO85pJRkWcbjBcU6A/lLN6nhtrNzWkDUey5fsDZgUC3s/DIRjJRsuEybUnMfdOopt9tU68iowXbx4cHA49W7Ha5O80OoZBpGLB5rxUJ9/k7O128FwX/3Bjl+9mn6ehsbUtYJGC20lx511BI0pnbZfW7EV04rVIz/4WBDxBO8b09mHRHEdtKAfH7x4EC6mkswUfjN9zg/S4+dU4bW5Ehfh0ICHvTK9OL3I9OJUA+0A/fgx3n8ckZzcHtjeQehRvAgH6TWjg1wq2OnZ80fvA8f/DwDTUKemLuRV3gAAAABJRU5ErkJggg==");
			kib_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAFQlJREFUeNq8m1FsHNd1hr87d2Z2R7vmUivRlJa2KUqxZMAVoMgN2pe0KYIEaN0ibh9iN4GdoFaRGDBfSFcwWiBBFSAN3EgFug9KAblIYyBGDBQNigRtEARpkYc+OFKMugJkRRJFW7sSRYvkrHa1uzNz5/bhzuzMLimRlJIQgrg7M7z3/HPOueec/9wrNNv9+a3/2MmpeXyoIoiCW+mNGtCsoaAs4MI9hpgG3aztyC5oOqeOwwpQOckcq3/IOY7+39aFEtvH0eNqTh64VtBohKhZAPShUWtG5n5jumF1rfgg7w2jgMZkWQNxU2sBoi+mGlMspo/sQ2l+99eHo3cVmC5yMfluUdA6ENoVoqYlWIMnw39/WjQ0CiQCak3NI4WR0WJQopkO0IfYXD9IbxHYp0q/FhwXgEMpBAsogCZw2H195lYIUyJ9svXjP74mrYHNAOhAilpjBIqmAc6uhb0fErqIfqGfwAM4+B7wxK8cxwWDIZEfNGirj1P5cKY13nSYHDzZrDZskSEQ2kyiCZBTjaliHkj7DoTsGFvY+2FIIRYgEuOMgYO8t0UkW8VxgUMGRAGNBqsPUPLqf75rvLmrRQaj9ePDRSO30EKL4fcfIEWtuT9/bQkYu1VbfPQ23Q5AITbqNlgObg2JtTUUFw6Ji5blFVwnjrUIQ+vh0pu13W+Orb18wFt2WnIAo9VafsqNtdZaCy00Wmud/K+1Fq4ro4buXcmNPQmy5TT3WHptbPebtTdLk1YYWnEcO27Bs6yL4tCFXxWOC4fEJcsrOG+//fOzwjr7cOnNh77w6VedL7/8oz1eswVydwLjX1sf3pABAEGgAx0EQRAQ9IGAIAj6AYGrVIMrzRyQUEnptJZv7vmRPu+8+ukXHnqzNnnW4uzP337bKXjWJaEvrP4q7OrC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");
			kiw_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAAACXBIWXMAAAsSAAALEgHS3X78AAAKTWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQWaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28AAgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaOWJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHiwmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryMAgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0lYqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHiNLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYAQH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6cwR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBiewhi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1cQPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqOY4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hMWEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgohJZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSUEko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/pdLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Yb1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7OUndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsbdi97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxrPGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H08PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+Hvqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsGLww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjgR2yIuB9pGZkX+X0UKSoyqi7qUbRTdHF09yzWrORZ+2e9jvGPqYy5O9tqtnJ2Z6xqbFJsY+ybuIC4qriBeIf4RfGXEnQTJAntieTE2MQ9ieNzAudsmjOc5JpUlnRjruXcorkX5unOy553PFk1WZB8OIWYEpeyP+WDIEJQLxhP5aduTR0T8oSbhU9FvqKNolGxt7hKPJLmnVaV9jjdO31D+miGT0Z1xjMJT1IreZEZkrkj801WRNberM/ZcdktOZSclJyjUg1plrQr1zC3KLdPZisrkw3keeZtyhuTh8r35CP5c/PbFWyFTNGjtFKuUA4WTC+oK3hbGFt4uEi9SFrUM99m/ur5IwuCFny9kLBQuLCz2Lh4WfHgIr9FuxYji1MXdy4xXVK6ZHhp8NJ9y2jLspb9UOJYUlXyannc8o5Sg9KlpUMrglc0lamUycturvRauWMVYZVkVe9ql9VbVn8qF5VfrHCsqK74sEa45uJXTl/VfPV5bdra3kq3yu3rSOuk626s91m/r0q9akHV0IbwDa0b8Y3lG19tSt50oXpq9Y7NtM3KzQM1YTXtW8y2rNvyoTaj9nqdf13LVv2tq7e+2Sba1r/dd3vzDoMdFTve75TsvLUreFdrvUV99W7S7oLdjxpiG7q/5n7duEd3T8Wej3ulewf2Re/ranRvbNyvv7+yCW1SNo0eSDpw5ZuAb9qb7Zp3tXBaKg7CQeXBJ9+mfHvjUOihzsPcw83fmX+39QjrSHkr0jq/dawto22gPaG97+iMo50dXh1Hvrf/fu8x42N1xzWPV56gnSg98fnkgpPjp2Snnp1OPz3Umdx590z8mWtdUV29Z0PPnj8XdO5Mt1/3yfPe549d8Lxw9CL3Ytslt0utPa49R35w/eFIr1tv62X3y+1XPK509E3rO9Hv03/6asDVc9f41y5dn3m978bsG7duJt0cuCW69fh29u0XdwruTNxdeo94r/y+2v3qB/oP6n+0/rFlwG3g+GDAYM/DWQ/vDgmHnv6U/9OH4dJHzEfVI0YjjY+dHx8bDRq98mTOk+GnsqcTz8p+Vv9563Or59/94vtLz1j82PAL+YvPv655qfNy76uprzrHI8cfvM55PfGm/K3O233vuO+638e9H5ko/ED+UPPR+mPHp9BP9z7nfP78L/eE8/sl0p8zAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAD9/f38/Pz6+vr5+fk9PD0iISMoJykuLS8bGh2ys7CTl4mgpZFPU0FdYU9qbl2JjH6pq6E3OilCRTV+gXAfIhArLhtzdGtSUk9ISEf9/fz6+vkXFg9bWlZiYV19fHkKCQf39/f09PTx8fHs7Ozj4+PX19e/v7////8FWx1+AAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAEjNJREFUeNrEm01sW9l1gL9D8pFPlmLKJv07puwu2goIyNGMswhQpJsR0KLdjxMgwMzGwSwqZWE6iy5SNCi6iKlFpU1Qb1IgQGYCdNkAASbooru2nmioBlACZDIWPeM/ciR69PMeH8nTxb3vj6RkyXaQ5x9R5ON793vn3Ht+7jminPTQ1jlvra4EIJDrTdHP9XP9nP24DzADm0dc4hpAfyZ+434pqz1BwUEaS+7TSrVJ7f+OPyg5OceOPEwN6HMRANVsqQMlw/PpkZe4Zng7pQ5DARS9nPrWJc37rit/MI7uQ4ArHfvrAES498avrqOanSkwc6Kr3S/hd+MLAFnzQekBwCXn1B+EYzOBMAAQEIYZLjykWPBHKR4FAPVGvQGVyVfcBb/gd7n0+N4bGRSVUZj5V86xyZUODLIDjLgFUCVT3FHnjA+l1Nkt6qMXaEyg2cUHCtsBZ7pDRMCORw1N6cExSY7LYSlAEBVQFDira98+NUNuL4VhGVaXV+P3lleXARrjKB1gus928JMl+QIQ84RClmOSHI9jkysdBgjCvesoKmdzgr92uxucye1BCuMGsAr4qUsU/AIsT0Ixmvr0yrZT9NbqaH97KMi96/ZhZUsP5l8Rx+aVzgBB7gHX9aPFnPjvva98q/HfX73W9ydRGIYKVIENaBkWYHmcZNec/RQ3W/8p8s0fFbT/4Zv2bijZ0oOfff8VcGxeeWIgFljnrdXb776vII+Z/fSKGUEpSWEgKjBMXlpe36BVaWGE8sFEkVB4cG2HC0pt45s/vrPcWV9g3aCcfy7IcTjuD4V7C2bEhad/06zBL3uloVEokLOjFBWofjwkmrQAIvK6EUxhAkknHMd0P9PJv9WsNWs/P+f/cgFY5zqaOZg79dIcn4YUlL/z0xpNni6//Vf0AFQg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");
			kiw_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAEjNJREFUeNrEm01sW9l1gL9D8pFPlmLKJv07puwu2goIyNGMswhQpJsR0KLdjxMgwMzGwSwqZWE6iy5SNCi6iKlFpU1Qb1IgQGYCdNkAASbooru2nmioBlACZDIWPeM/ciR69PMeH8nTxb3vj6RkyXaQ5x9R5ON793vn3Ht+7jminPTQ1jlvra4EIJDrTdHP9XP9nP24DzADm0dc4hpAfyZ+434pqz1BwUEaS+7TSrVJ7f+OPyg5OceOPEwN6HMRANVsqQMlw/PpkZe4Zng7pQ5DARS9nPrWJc37rit/MI7uQ4ArHfvrAES498avrqOanSkwc6Kr3S/hd+MLAFnzQekBwCXn1B+EYzOBMAAQEIYZLjykWPBHKR4FAPVGvQGVyVfcBb/gd7n0+N4bGRSVUZj5V86xyZUODLIDjLgFUCVT3FHnjA+l1Nkt6qMXaEyg2cUHCtsBZ7pDRMCORw1N6cExSY7LYSlAEBVQFDira98+NUNuL4VhGVaXV+P3lleXARrjKB1gus928JMl+QIQ84RClmOSHI9jkysdBgjCvesoKmdzgr92uxucye1BCuMGsAr4qUsU/AIsT0Ixmvr0yrZT9NbqaH97KMi96/ZhZUsP5l8Rx+aVzgBB7gHX9aPFnPjvva98q/HfX73W9ydRGIYKVIENaBkWYHmcZNec/RQ3W/8p8s0fFbT/4Zv2bijZ0oOfff8VcGxeeWIgFljnrdXb776vII+Z/fSKGUEpSWEgKjBMXlpe36BVaWGE8sFEkVB4cG2HC0pt45s/vrPcWV9g3aCcfy7IcTjuD4V7C2bEhad/06zBL3uloVEokLOjFBWofjwkmrQAIvK6EUxhAkknHMd0P9PJv9WsNWs/P+f/cgFY5zqaOZg79dIcn4YUlL/z0xpNni6//Vf0AFQg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");
			koeye_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAADOBJREFUeNrsm01oHFeewH/vVZerqrvUdrdabvkjtmwvE8PEin1a3XaYgQHPZcllw7BxGJLNMrBgnxwxMzgLG0zoGAbs05BdD8smLGxgGdhDAjksOfo0VuQ5OMkolh1LltQttdRfVaXqem8P1S21Yn211G3PQv6HplWlevV+/b7+n0LTrdSR3LjihhZM50rZA8H8i523vwTyc1s/fgagfqjjgbx141KuNAKBWbt5FcVf32HsT911SnTP8SA3s6FPDxAA+vQUQP4QEDK1JcbUGeowD5z5Jn6QU9DxwA+EWg2NVF85HgQAw/MARmSAEjD58hej6NNTQ5JDu25pmfmh9Dei9TASIiMi5gKsE0bfOO63ENpvUIBAfDGaT1IB5KFu3rwMCtLTh+cnX9ZoQAItnPwccLYvHPfXGBTQmksSfXxmZNFSkO12fi6jABlUOfZYoER7LCRAzHK25xz3GZ43IgPVJkACZ1b51vSHBqp7wABYAgaqMqi+wIEpQMWNoyUQdUOyO477DM+3FgOTo2ipz6wG2KgF20pVYY8YMQgM1APSEh/rwJRQIn4HEqL83C5B5K4whkXJUFrfm5yc5Nzk8ImhEz+PDOP15U+OllUVyO4Rg6xEQVWVy4+XXzeM6Ocnhk4MT+rRycl797RWoiSW7we9Go/7wlCCSc7DxPnT7179xe81iJrjUFcAKsc+ZKn1g6aYtV0N4o1/v3Htm4nzMMEoWkb643d6w/GlEEyeRwBiuJRh7M7YJ1f/sxpPKBT7woAl1ZoVAzT+8cbP7ozdoZyb04BmglGt9ZGDPeH4msnzghGmh6N/uD3GHZau/t1L+Wb79j4xoLT2LcHir29kGePOm/9mzI0wjZ5gVDTP9oDjz3ryvGCIFBA2NWOfXH3vRHX9foZ9S6njzBt49Ksb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");
			koeye_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAAACXBIWXMAAAsSAAALEgHS3X78AAAKTWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQWaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28AAgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaOWJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHiwmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryMAgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0lYqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHiNLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYAQH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6cwR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBiewhi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1cQPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqOY4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hMWEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgohJZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSUEko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/pdLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Yb1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7OUndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsbdi97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxrPGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H08PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+Hvqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsGLww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjgR2yIuB9pGZkX+X0UKSoyqi7qUbRTdHF09yzWrORZ+2e9jvGPqYy5O9tqtnJ2Z6xqbFJsY+ybuIC4qriBeIf4RfGXEnQTJAntieTE2MQ9ieNzAudsmjOc5JpUlnRjruXcorkX5unOy553PFk1WZB8OIWYEpeyP+WDIEJQLxhP5aduTR0T8oSbhU9FvqKNolGxt7hKPJLmnVaV9jjdO31D+miGT0Z1xjMJT1IreZEZkrkj801WRNberM/ZcdktOZSclJyjUg1plrQr1zC3KLdPZisrkw3keeZtyhuTh8r35CP5c/PbFWyFTNGjtFKuUA4WTC+oK3hbGFt4uEi9SFrUM99m/ur5IwuCFny9kLBQuLCz2Lh4WfHgIr9FuxYji1MXdy4xXVK6ZHhp8NJ9y2jLspb9UOJYUlXyannc8o5Sg9KlpUMrglc0lamUycturvRauWMVYZVkVe9ql9VbVn8qF5VfrHCsqK74sEa45uJXTl/VfPV5bdra3kq3yu3rSOuk626s91m/r0q9akHV0IbwDa0b8Y3lG19tSt50oXpq9Y7NtM3KzQM1YTXtW8y2rNvyoTaj9nqdf13LVv2tq7e+2Sba1r/dd3vzDoMdFTve75TsvLUreFdrvUV99W7S7oLdjxpiG7q/5n7duEd3T8Wej3ulewf2Re/ranRvbNyvv7+yCW1SNo0eSDpw5ZuAb9qb7Zp3tXBaKg7CQeXBJ9+mfHvjUOihzsPcw83fmX+39QjrSHkr0jq/dawto22gPaG97+iMo50dXh1Hvrf/fu8x42N1xzWPV56gnSg98fnkgpPjp2Snnp1OPz3Umdx590z8mWtdUV29Z0PPnj8XdO5Mt1/3yfPe549d8Lxw9CL3Ytslt0utPa49R35w/eFIr1tv62X3y+1XPK509E3rO9Hv03/6asDVc9f41y5dn3m978bsG7duJt0cuCW69fh29u0XdwruTNxdeo94r/y+2v3qB/oP6n+0/rFlwG3g+GDAYM/DWQ/vDgmHnv6U/9OH4dJHzEfVI0YjjY+dHx8bDRq98mTOk+GnsqcTz8p+Vv9563Or59/94vtLz1j82PAL+YvPv655qfNy76uprzrHI8cfvM55PfGm/K3O233vuO+638e9H5ko/ED+UPPR+mPHp9BP9z7nfP78L/eE8/sl0p8zAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAAaGRonJigsKy8gICM3Nzo8PD5NTU+doo6IjHymq5iwtaJFSTdNUUBWWkhqblx0eGaSlYdfYlF/gnEoKxc7PiwfIRAxMiMWFg5jY1+AgH1ISEfV1dS+vr0/PTV4d3NZWFVvbmtRT0oJCAYkIh5fXVpDQkFTUlL///8AI/DJAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAADOBJREFUeNrsm01oHFeewH/vVZerqrvUdrdabvkjtmwvE8PEin1a3XaYgQHPZcllw7BxGJLNMrBgnxwxMzgLG0zoGAbs05BdD8smLGxgGdhDAjksOfo0VuQ5OMkolh1LltQttdRfVaXqem8P1S21Yn211G3PQv6HplWlevV+/b7+n0LTrdSR3LjihhZM50rZA8H8i523vwTyc1s/fgagfqjjgbx141KuNAKBWbt5FcVf32HsT911SnTP8SA3s6FPDxAA+vQUQP4QEDK1JcbUGeowD5z5Jn6QU9DxwA+EWg2NVF85HgQAw/MARmSAEjD58hej6NNTQ5JDu25pmfmh9Dei9TASIiMi5gKsE0bfOO63ENpvUIBAfDGaT1IB5KFu3rwMCtLTh+cnX9ZoQAItnPwccLYvHPfXGBTQmksSfXxmZNFSkO12fi6jABlUOfZYoER7LCRAzHK25xz3GZ43IgPVJkACZ1b51vSHBqp7wABYAgaqMqi+wIEpQMWNoyUQdUOyO477DM+3FgOTo2ipz6wG2KgF20pVYY8YMQgM1APSEh/rwJRQIn4HEqL83C5B5K4whkXJUFrfm5yc5Nzk8ImhEz+PDOP15U+OllUVyO4Rg6xEQVWVy4+XXzeM6Ocnhk4MT+rRycl797RWoiSW7we9Go/7wlCCSc7DxPnT7179xe81iJrjUFcAKsc+ZKn1g6aYtV0N4o1/v3Htm4nzMMEoWkb643d6w/GlEEyeRwBiuJRh7M7YJ1f/sxpPKBT7woAl1ZoVAzT+8cbP7ozdoZyb04BmglGt9ZGDPeH4msnzghGmh6N/uD3GHZau/t1L+Wb79j4xoLT2LcHir29kGePOm/9mzI0wjZ5gVDTP9oDjz3ryvGCIFBA2NWOfXH3vRHX9foZ9S6njzBt49Ksb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");
			koeyew_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAEjNJREFUeNrEm01sW9l1gL9D8pFPlmLKJv07puwu2goIyNGMswhQpJsR0KLdjxMgwMzGwSwqZWE6iy5SNCi6iKlFpU1Qb1IgQGYCdNkAASbooru2nmioBlACZDIWPeM/ciR69PMeH8nTxb3vj6RkyXaQ5x9R5ON793vn3Ht+7jminPTQ1jlvra4EIJDrTdHP9XP9nP24DzADm0dc4hpAfyZ+434pqz1BwUEaS+7TSrVJ7f+OPyg5OceOPEwN6HMRANVsqQMlw/PpkZe4Zng7pQ5DARS9nPrWJc37rit/MI7uQ4ArHfvrAES498avrqOanSkwc6Kr3S/hd+MLAFnzQekBwCXn1B+EYzOBMAAQEIYZLjykWPBHKR4FAPVGvQGVyVfcBb/gd7n0+N4bGRSVUZj5V86xyZUODLIDjLgFUCVT3FHnjA+l1Nkt6qMXaEyg2cUHCtsBZ7pDRMCORw1N6cExSY7LYSlAEBVQFDira98+NUNuL4VhGVaXV+P3lleXARrjKB1gus928JMl+QIQ84RClmOSHI9jkysdBgjCvesoKmdzgr92uxucye1BCuMGsAr4qUsU/AIsT0Ixmvr0yrZT9NbqaH97KMi96/ZhZUsP5l8Rx+aVzgBB7gHX9aPFnPjvva98q/HfX73W9ydRGIYKVIENaBkWYHmcZNec/RQ3W/8p8s0fFbT/4Zv2bijZ0oOfff8VcGxeeWIgFljnrdXb776vII+Z/fSKGUEpSWEgKjBMXlpe36BVaWGE8sFEkVB4cG2HC0pt45s/vrPcWV9g3aCcfy7IcTjuD4V7C2bEhad/06zBL3uloVEokLOjFBWofjwkmrQAIvK6EUxhAkknHMd0P9PJv9WsNWs/P+f/cgFY5zqaOZg79dIcn4YUlL/z0xpNni6//Vf0AFQg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");
			koeyew_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAEjNJREFUeNrEm01sW9l1gL9D8pFPlmLKJv07puwu2goIyNGMswhQpJsR0KLdjxMgwMzGwSwqZWE6iy5SNCi6iKlFpU1Qb1IgQGYCdNkAASbooru2nmioBlACZDIWPeM/ciR69PMeH8nTxb3vj6RkyXaQ5x9R5ON793vn3Ht+7jminPTQ1jlvra4EIJDrTdHP9XP9nP24DzADm0dc4hpAfyZ+434pqz1BwUEaS+7TSrVJ7f+OPyg5OceOPEwN6HMRANVsqQMlw/PpkZe4Zng7pQ5DARS9nPrWJc37rit/MI7uQ4ArHfvrAES498avrqOanSkwc6Kr3S/hd+MLAFnzQekBwCXn1B+EYzOBMAAQEIYZLjykWPBHKR4FAPVGvQGVyVfcBb/gd7n0+N4bGRSVUZj5V86xyZUODLIDjLgFUCVT3FHnjA+l1Nkt6qMXaEyg2cUHCtsBZ7pDRMCORw1N6cExSY7LYSlAEBVQFDira98+NUNuL4VhGVaXV+P3lleXARrjKB1gus928JMl+QIQ84RClmOSHI9jkysdBgjCvesoKmdzgr92uxucye1BCuMGsAr4qUsU/AIsT0Ixmvr0yrZT9NbqaH97KMi96/ZhZUsP5l8Rx+aVzgBB7gHX9aPFnPjvva98q/HfX73W9ydRGIYKVIENaBkWYHmcZNec/RQ3W/8p8s0fFbT/4Zv2bijZ0oOfff8VcGxeeWIgFljnrdXb776vII+Z/fSKGUEpSWEgKjBMXlpe36BVaWGE8sFEkVB4cG2HC0pt45s/vrPcWV9g3aCcfy7IcTjuD4V7C2bEhad/06zBL3uloVEokLOjFBWofjwkmrQAIvK6EUxhAkknHMd0P9PJv9WsNWs/P+f/cgFY5zqaOZg79dIcn4YUlL/z0xpNni6//Vf0AFQghWEpWB/adUcUu8BlSJKMgZiLQZ5f/Gz1HDX46r+2wZLIwfxLcnySuccCZaBHblap/XL5n2X22SlyQD/XPx9jRBR8PEBHbyRIRmqWZEwkX4SuTZ+94vbfr/x1E9nJ9J6Voc0614eX3Zfi+CRzb4GyeViqPVDvdD/x+fmYAt9QNEGHw9bYpSpIJlODDUsyChK9/K9v7H30F+IX8hlAEdqs80Zv/iU4PvmVoXAC9qYdCDrrC8Dp8PNzIxhVmmZejF1X7SyxIGO6tbsfuVP65eln6wvlHASAEwhtWD8S5Dkcv/9ooQyoQ+AgSrA3YybGOIahoBnaMJLzXCLdQghJRkC+GCR/y6M40C0GDoEA7fU3/fkX5DAYiiPanVVRAmR3Zjf6/LVRjARFeGGVJIuAQG0iCE+jZzSzO7M7jYOg3SIEyHNAjuT4/UcLZQUc2Zk1jzdwdqb3GOVIY4yCxBhC+C8CSZE8CaKX03vT4Bj2nVkNADkKJHMExq4slBWcvCDdBg2Qfab3RWTahByhOGIMVRRUUVVUt7ZU7f+oqvkBSrNZrVbwV+EguWbkzRyaFtkX9h2EBt2uNCTvOGh5Qa4cvIA8/n2hrDjS4KbL2s27N4vAzuxO9PnlUKsMRigMNT9bldSKVWlVJBSKgNRgY1y1PiOa7LNGB/w1brre3ToaIO31r86fmON3lNVBGkv2d8/+LHaNzhyKoWiL1Kplxl4xzqxYn7ZmVevHU0kQq3vFrn3jrr39Wl0JpE0wf1K9Wi+rIyv+EuACuK6xRF1zp8sJxzDGMLrTAtWhajTXVYeqrVYrPAFVqFKBVd5N3vQ1a/67AC6uG95+yV/B0fL6lRPPj0V1pLGE67ouA4Pguq6lkcvReXd8qJpJYVFa6FBHBa2qSis6C21SpeID2ykQo1nmRg4MGLh7ruvC0oo4ujg4oV512yVHfFygSzGxRmUHWQ8ukdSqKk0ijBYxgyash42RKkL4pzZpivC5gOs58crFdBeK4FHQoFMunkge7ZIjvuvS7bah2+/36ZuUzgDPcS+lpnACQ2MMjfQqemVFEq7NTaoVWE0LhMuKE2H06fb7XaDbxXX9FafUPpFe7ZecFd+l2w6C6Ip9+n0AJzhDQhwV8+Ct1rfUxB2jehWR0AqtiwJUfHgvfeplsg5A3zw9AIIg6HZxl8Qp7Z+A4wdBfmXJ7bYD6jiBOeIsW0Iaq0CVphmZnQATKGId06SZbFIFf1QgXPLAPrMgunn9u0G76/or+d7+sefHD5ZXWXLb1KGRfN8BcpRJi6PaDHUqwjhkMtqIqiLR+lvboFVgeTRAfOj0c33jJkZHHWg4hbV6b/X7x+PYltUlt/tdoBH7oKIW5CJpjipNq1M6gjEf571iEDPXJeQwUz1lQwAeCgZDIv9M5RY0nKK3tqxnjsNx4K8uubwLKxMUI50jeByJQ1FtadKxmk8l8EY4sCDWrHNh7FkODlJLnTlu0SjjrS0Xpp4/Px75q0vQbjRWcKLDKMQoxo0QUEG1lfQP5xN2d37seURPr9mEikkIpY8zrmPuSDQKHFagjcuq/8h7DscBF1fB7ToIZvHz7bWAymjuyYdqM5KVJjCODGtahB4lUKXir46fM3NxKr4xPmBBYIlV1zvwjuTo7e3Xl9gjsBj+Iov+IhBwZcwnWDWWPBLHYRjzCbWSubnKnIQyUbtmtSbQliuuEgCLvv+3vr+I8eS7AHmn5ydJxubHjiNdd9APORY/BAicgAmOTWqW20muSYzfmvAa+dPNUNczVEj6iyomFpk7xBx74ASRcQ9AHXJZr6gBwkG05uTSzgi6j7gDs1QEOHxoXl6YfBcfaFpDnRBHhCGhHv72zzaNNNKPTUWhSXWj0jpEA8ts7wYEVsUDJ4DAYeB2tRjAVLc4Ko9uL9/rMb2P4A76drPJHFcOU/PHnKfatGHTuDh+c7VlnrIM5f4wjGuFCslIxLjwrbkjptO2308uEg45ApRTezP08oYk98lPuO131r8OPUIMwAlQBK0cNV2X74wavTQGc3If4Kpw9b4aY6DQqiiigvkL1JJh/ITjDOwGfoAQ2jBcT3RfdqG3i/NlqSCfyOkuxfyYxhR4/ubS43B6GOOhKY7fZCrI1gAgOwe6paIZtVKuhDMksuocbxNt1wwtPnJ9eDLbzf1JIrGZXPVOuPeprdHFKQNy32RHB1tzMLclycGqqNlIsW8dqVipcc1MePNshpc8mhPNG0AlxIChYjyRUE1brTCcMl+svuwwXppjPOcWbU9vDaPX9xUqVCqxJU2ACGz80TlqOlmzfyNJ469boR1vkQJ5VcdLcfhAUw4dTcomiEhFKmIEompBou+2/pgcBZjgk5rjz4dbiQ+MR6LWCbfjb4XfrcXX+qPJY3xmbIYCGA2gSG4r66vTKYDcpwp6nhdaegv+oTHMJkAm3iKcC01dK8peJyzf8ab57qQ3nwiIau584/Zw7xdfJ58w5yai3BYUp3DmmOtVTLNpTUrGGmCEqxkIf1NJgwvQKlw4YvwpW54j69klIt/DmZnO7Nz9djG8ZJceKfcqoRW5w1ge+xUbDIbpHo130TQjFx6bhI9czdjJ3YpWaRGVORsW1jYO50j6VmjCt2Im9K2S/m6RHckbK2tsvQqhk9nv7+nMYWKpNcfnuvXI9TEievExFbs/pi1T3oMg8XKtrzNaNBBB7EqY3ghzDjmygXERo02kUd1+NIWSDj8Sbv9UeZI8qI77V9EIRaJgw6Tgh9GelDH4Rh61jcluSfsgNQiCQ2KP0fXqYiEvAkUvG0Uli/6ij8/QcfJeayyTtzyyHtn4KFydJLEmKRgMYozoi9XqBPPRbnl5xwF/0fcXI3Hlst5dEMkXLh6RL/FQn1WW3G4sEL+w+KGNYMZkskUljD/YsuG5RE9INWM3CwzJ/ThlEspJEJPDmpsgi1CxrYcboA5Fb63eoyC4R9kP96m43jJ4RZPLM8YuxICDkTRF0hBW0lYjE65EUSC+FQZa0fIbnjzmJXqPDohHQMG8vEVQ9KDnufLUPdoOVt7ZmS0srwH1W7firGRAYJ2J3e1Rxaqlhq8iInGgV6nMmc+2iLxGsYkXscH7pOkd3i4xAjvh15YLszvvVJ5nzz+4+I7o8ppX/HGDW+ndC8Ch76dzsa2N5LQWCVOfAlRsAhRU57YuSGw3KhiVssAjUe2233ecMC0Wp+Bu2VyivHPxg+PkRW/82w+X8w2T3l3R8fRuEKept3vnk+nEMHtq3Kh4HiutQeybCGGELjYYTGdLHjomGx4kRii3aFD21uq91e+988Ex89Q3/nGul28sud10ntgJDU4C5MadVHo3raORpJT7GlUDJjBsZjRtBR860M/1CZz49vUGZooH//L2P3xw7P2o1rlhz1lZcrsQkFzCzXqc9SKQ7S+pROl2tFVJOOCRPBSTZIg5IgyTK0mK46E7iPYnYuvlUMRbuxXkM08rJ9hXO3jSLzniu3a/0cTzOfo5IOu5nl6eIJDxuEjChYrQY4/Ekd44uJDYVIu21Pq5fq4fuRt4BQ06ufNTJ/Hbnx6UO4EW7ngUi0XI5XI5clYcnuMhn4dn/gg24ocrk57RVsx0DAw8gqwVfo5crggUi3heQYNO+WDqRPHH3PzDsgRaX/M8KBanpyGbzZLNZgPcAJDPwtTS7ZZZeu3YomXXLrzWWTEUmSQGEcZyevfcdQdZezANxWIRz1sraCDlhyeuLzl48r923xncvWxUCOB6YRxkizIO3r0TzpDRjImpj20Nk5u1pKc4Gy1icXyWlKi1dK4HrFHXQD782mFadXg8OHWw0JZAbxXWwMsCnueZbQXrgYcSmQI2apHfJLERMYaupZFpSWOIwIbZd05II34OnrmjB6zVb2kgbQ7VqqPqMjZ/bcpLaMCSdxfqqeoSFedcLBC78ZwYhw0z7BaVxAZFov/snlq4jj4NEhHiLNCAm3eX1nhebcnRHAeDXyyUFQehcZO73Cyq7JiyDzXBWd4GADfej7dskxQa5nsktiYSSSQsXYoweiZkFLM+dYvSvQs379ZRAqSdLWenXoSDzcJHC2UVdUiWX5Gov3JMXH/w1BYtpXIOCmrXKozJSJb7jGEcXntFANJev+4dtceVO/yj6b03P1ooqwQ4xR1mVYBgJo728z2rBlO371Q2quaZSDJel2GF5KKbEElcSMZY8khmdqftphKzGtbCedNH5QiOqr96tFOYUJ7YPp04JWtz3FuJor5IsXSkPvGIwr7R2sTdaRPLJmoTZy++KAcH9/O/WoAy6gR70zhI0F7/y2enn50OAyY9NZMAsXtTouNpa0nsO48XWu4eRKn3Z6ef8ZUvy44SsDcd1oq+6V+d4oU52H6czwyAsiKwe6rnF9Q7/Z/fSOjl2Tg0NPFQM8x7hkAJx968rI0VviZqd9k//cwVv5DfnwFF2kB22LvwnPTTc+pef/C9zzP3FqAMvWflYVhOLWLKqeknQcL+ApphISItiF3HSiZjVWqkxtLWUvdhX/Urf7f6VrO2sfPFafK0gfXrw8s/fNl+g02mlHssmE3H7/wamjxdXjsVl7drKd69xbI0TaXSmNuYfd12UaSqkBO17f5gafUcNZrfsrXtrF9HDp7fyvLcuvD9ralUu8GVGs1aqt0gAuFG2G1A9eOo5CqhWJkFJhTqx70GDDv5czWatZ+f8zuWQskcHKOPJfe8E0797O0rT+RN4R4L6/DWP/3Pu8I5HuSZpe8DSicE+eAGq0aXNqh+bFQrTgkJC3GRfgLDoBZy7HDhNWob3/TfPv1zWFiH62+qnn/wqvqKTDuOELXjrCy9977yGQPvmhFKIcppJxtZqh+nOlkyphQ23f4R9uJce5Tltcm9OMdq9DpeX1HcHmXMgpzNrdT9tdtdZqx6lRIgUWNRpWXXsERnUUoWthFnur9L8c5SAe1/ofFdyL7qfrX9LduuFiYDjfKfVbZtu1qit6hVZ1KjF7anKFlV2QGm9wq7+2eQL+L8kZ6sV+34HLDXMi2Qg9CamX4QMsWd0/tnRnq9rFCSfXdR412y8qkDFLaHg7B3MHIvyXIiipP0Qe5vEbVzDmLrfFg7Z6s+fol0o9oufsGne+nxvTcy8SJtQrYT9XKejAPYD0bba4WoO7Y4oQKiBfVGnUa9AU7aP0r31qJRO6oJ1U7CcGIOgP3eSLvzQ+vkZih1Sp3SY4AyxFss3qcA1z4F5vm9MSpZSh0YgiiahRKdqPPgUvEF9gdfoG97K2o/RzQvgw5wFdidAfgdlGlTjq+be5ByZSPVIffpFEAp9x9fK3UGnA17z+degOP/BwB+WCFVGo0c5wAAAABJRU5ErkJggg==");
			koeyeb_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAFQlJREFUeNq8m1FsHNd1hr87d2Z2R7vmUivRlJa2KUqxZMAVoMgN2pe0KYIEaN0ibh9iN4GdoFaRGDBfSFcwWiBBFSAN3EgFug9KAblIYyBGDBQNigRtEARpkYc+OFKMugJkRRJFW7sSRYvkrHa1uzNz5/bhzuzMLimRlJIQgrg7M7z3/HPOueec/9wrNNv9+a3/2MmpeXyoIoiCW+mNGtCsoaAs4MI9hpgG3aztyC5oOqeOwwpQOckcq3/IOY7+39aFEtvH0eNqTh64VtBohKhZAPShUWtG5n5jumF1rfgg7w2jgMZkWQNxU2sBoi+mGlMspo/sQ2l+99eHo3cVmC5yMfluUdA6ENoVoqYlWIMnw39/WjQ0CiQCak3NI4WR0WJQopkO0IfYXD9IbxHYp0q/FhwXgEMpBAsogCZw2H195lYIUyJ9svXjP74mrYHNAOhAilpjBIqmAc6uhb0fErqIfqGfwAM4+B7wxK8cxwWDIZEfNGirj1P5cKY13nSYHDzZrDZskSEQ2kyiCZBTjaliHkj7DoTsGFvY+2FIIRYgEuOMgYO8t0UkW8VxgUMGRAGNBqsPUPLqf75rvLmrRQaj9ePDRSO30EKL4fcfIEWtuT9/bQkYu1VbfPQ23Q5AITbqNlgObg2JtTUUFw6Ji5blFVwnjrUIQ+vh0pu13W+Orb18wFt2WnIAo9VafsqNtdZaCy00Wmud/K+1Fq4ro4buXcmNPQmy5TT3WHptbPebtTdLk1YYWnEcO27Bs6yL4tCFXxWOC4fEJcsrOG+//fOzwjr7cOnNh77w6VedL7/8oz1eswVydwLjX1sf3pABAEGgAx0EQRAQ9IGAIAj6AYGrVIMrzRyQUEnptJZv7vmRPu+8+ukXHnqzNnnW4uzP337bKXjWJaEvrP4q7OrC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");
			koeyeb_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAFQlJREFUeNq8m1FsHNd1hr87d2Z2R7vmUivRlJa2KUqxZMAVoMgN2pe0KYIEaN0ibh9iN4GdoFaRGDBfSFcwWiBBFSAN3EgFug9KAblIYyBGDBQNigRtEARpkYc+OFKMugJkRRJFW7sSRYvkrHa1uzNz5/bhzuzMLimRlJIQgrg7M7z3/HPOueec/9wrNNv9+a3/2MmpeXyoIoiCW+mNGtCsoaAs4MI9hpgG3aztyC5oOqeOwwpQOckcq3/IOY7+39aFEtvH0eNqTh64VtBohKhZAPShUWtG5n5jumF1rfgg7w2jgMZkWQNxU2sBoi+mGlMspo/sQ2l+99eHo3cVmC5yMfluUdA6ENoVoqYlWIMnw39/WjQ0CiQCak3NI4WR0WJQopkO0IfYXD9IbxHYp0q/FhwXgEMpBAsogCZw2H195lYIUyJ9svXjP74mrYHNAOhAilpjBIqmAc6uhb0fErqIfqGfwAM4+B7wxK8cxwWDIZEfNGirj1P5cKY13nSYHDzZrDZskSEQ2kyiCZBTjaliHkj7DoTsGFvY+2FIIRYgEuOMgYO8t0UkW8VxgUMGRAGNBqsPUPLqf75rvLmrRQaj9ePDRSO30EKL4fcfIEWtuT9/bQkYu1VbfPQ23Q5AITbqNlgObg2JtTUUFw6Ji5blFVwnjrUIQ+vh0pu13W+Orb18wFt2WnIAo9VafsqNtdZaCy00Wmud/K+1Fq4ro4buXcmNPQmy5TT3WHptbPebtTdLk1YYWnEcO27Bs6yL4tCFXxWOC4fEJcsrOG+//fOzwjr7cOnNh77w6VedL7/8oz1eswVydwLjX1sf3pABAEGgAx0EQRAQ9IGAIAj6AYGrVIMrzRyQUEnptJZv7vmRPu+8+ukXHnqzNnnW4uzP337bKXjWJaEvrP4q7OrC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");
			kop1_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAAACXBIWXMAAAsSAAALEgHS3X78AAAKTWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQWaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28AAgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaOWJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHiwmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryMAgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0lYqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHiNLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYAQH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6cwR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBiewhi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1cQPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqOY4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hMWEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgohJZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSUEko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/pdLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Yb1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7OUndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsbdi97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxrPGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H08PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+Hvqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsGLww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjgR2yIuB9pGZkX+X0UKSoyqi7qUbRTdHF09yzWrORZ+2e9jvGPqYy5O9tqtnJ2Z6xqbFJsY+ybuIC4qriBeIf4RfGXEnQTJAntieTE2MQ9ieNzAudsmjOc5JpUlnRjruXcorkX5unOy553PFk1WZB8OIWYEpeyP+WDIEJQLxhP5aduTR0T8oSbhU9FvqKNolGxt7hKPJLmnVaV9jjdO31D+miGT0Z1xjMJT1IreZEZkrkj801WRNberM/ZcdktOZSclJyjUg1plrQr1zC3KLdPZisrkw3keeZtyhuTh8r35CP5c/PbFWyFTNGjtFKuUA4WTC+oK3hbGFt4uEi9SFrUM99m/ur5IwuCFny9kLBQuLCz2Lh4WfHgIr9FuxYji1MXdy4xXVK6ZHhp8NJ9y2jLspb9UOJYUlXyannc8o5Sg9KlpUMrglc0lamUycturvRauWMVYZVkVe9ql9VbVn8qF5VfrHCsqK74sEa45uJXTl/VfPV5bdra3kq3yu3rSOuk626s91m/r0q9akHV0IbwDa0b8Y3lG19tSt50oXpq9Y7NtM3KzQM1YTXtW8y2rNvyoTaj9nqdf13LVv2tq7e+2Sba1r/dd3vzDoMdFTve75TsvLUreFdrvUV99W7S7oLdjxpiG7q/5n7duEd3T8Wej3ulewf2Re/ranRvbNyvv7+yCW1SNo0eSDpw5ZuAb9qb7Zp3tXBaKg7CQeXBJ9+mfHvjUOihzsPcw83fmX+39QjrSHkr0jq/dawto22gPaG97+iMo50dXh1Hvrf/fu8x42N1xzWPV56gnSg98fnkgpPjp2Snnp1OPz3Umdx590z8mWtdUV29Z0PPnj8XdO5Mt1/3yfPe549d8Lxw9CL3Ytslt0utPa49R35w/eFIr1tv62X3y+1XPK509E3rO9Hv03/6asDVc9f41y5dn3m978bsG7duJt0cuCW69fh29u0XdwruTNxdeo94r/y+2v3qB/oP6n+0/rFlwG3g+GDAYM/DWQ/vDgmHnv6U/9OH4dJHzEfVI0YjjY+dHx8bDRq98mTOk+GnsqcTz8p+Vv9563Or59/94vtLz1j82PAL+YvPv655qfNy76uprzrHI8cfvM55PfGm/K3O233vuO+638e9H5ko/ED+UPPR+mPHp9BP9z7nfP78L/eE8/sl0p8zAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAAoJygjIiUrKi0uLTAwMDM/P0AcHSAHCAWdoo+IjHywtaJMUD5aXkxqblx0eGZ+gnCnq5iSlYcvMiE4Oyo/QjEnKhZRU0cfIRBFRjsWFg1eXld4eHRJSUjV1dS+vr0zMSmBgHxjYl9wb2wlIh5UU1IaGBc6OTn///+GcmWRAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAA7JJREFUeNrs2b9vG2Ucx/H39/zjHjvJ1aQJhlCI6khZUZYwds0IGZhYCl3ToQKBxYYUZHWAISsSHVnIf8AAIxM/guQmSFFU1NYiOGrOPt8P3z0Mjt2UpK7DQO7Q851Oz9c6+aXP8zz3+Cyai1aPmC8+CcqAD4UwmbZOtxMAi/+45OKO+CAcXiqAUEAgLi5yKQQA8hf7ePcBoJaBAwAdIZIjzmmdLHUuDXHBPJrA8gBAVIgAbSG5RL9+UOuAhQPpdzRZmD4AiEBjAUIshaT6sNZWCVS4zJrU0RwkEaGtwWoQgKWEP3LXOu3KZTMmdDRZPoBIW4igdSKSm7cRgrZS7QpcOmMyR3Phrwhtyc/Am/HOmorlvXuam1vOYypAMgsZcDSXf9fk5Kd12F5PNu98cE+DuFceMZuQDsZEG+XynuR3lmor7PN29+GH1m961b2ZU48qlQRI0sCYKI89kdo+wHXv/a9X+RH39rvvdPrDx+I8mXDsWlLbhyp9KPc1q9/d/iY+YgZ3cIM5MuHYzdX2oap8AN0Ni3J85Ycb398Y9tPBeKFj99f1fa7mFRzjeOU4Km+vXG/Ptof9q2TCcT8v1cEhtowHlI+Lw3XRz/fz/bQwXnBOvL+zUoXQ8cADKAN5jkb9a2lhjM9j75eVqvIVHmBDAGWOR0ffVDnGPT+OZaWqUF5sf+m6DRo2eI8d76SmpqbSwxjrmLGqCmK7cVifB7mFbduO5ziD47nnvZQexrh5pfEUnt2oA4dz/PnVrWeavEY2HN+uKWKEAMCdOxx8+xOG6FQxxs2rNUXckCCAQqczE8wAMiiQdKUxJo9ua9GzJYACLaocwXTnZEZp0SyQEYdOPFuCAi0UPkAxLIbFk6XBq2TEEeY8WxJaavCWalRFQKeP8TxHGBWQpKXYYGs06A8lr5ARx2efxkLyhA3YAnqUeqURpZhCxvmOyNqsB221AXdPD5cGjjfIiKNT2qwH7Y/grvJRvhqtkBLwMmTEEeQ360GhpXrqmWEfoJRSxllHYBMKQeEJPQXh6X3KZ5G01pnfH/183OBOJ1Q99VQBYRE/vYpz8og9XJFQ0eNpHkXSrfhnHl1Cz3FFgN5oOoGfcsTpPLp9cKfwHFeQEEUPUL5K9ao45Yg+5+O8tf0WMIWH4yJCCAp6Kd6fzjiaiw9Ilrzzeg7ZqX/x/6BxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxTFDW/4PB3wMA+/KA0gruu+gAAAAASUVORK5CYII=");
			kop1_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAA7JJREFUeNrs2b9vG2Ucx/H39/zjHjvJ1aQJhlCI6khZUZYwds0IGZhYCl3ToQKBxYYUZHWAISsSHVnIf8AAIxM/guQmSFFU1NYiOGrOPt8P3z0Mjt2UpK7DQO7Q851Oz9c6+aXP8zz3+Cyai1aPmC8+CcqAD4UwmbZOtxMAi/+45OKO+CAcXiqAUEAgLi5yKQQA8hf7ePcBoJaBAwAdIZIjzmmdLHUuDXHBPJrA8gBAVIgAbSG5RL9+UOuAhQPpdzRZmD4AiEBjAUIshaT6sNZWCVS4zJrU0RwkEaGtwWoQgKWEP3LXOu3KZTMmdDRZPoBIW4igdSKSm7cRgrZS7QpcOmMyR3Phrwhtyc/Am/HOmorlvXuam1vOYypAMgsZcDSXf9fk5Kd12F5PNu98cE+DuFceMZuQDsZEG+XynuR3lmor7PN29+GH1m961b2ZU48qlQRI0sCYKI89kdo+wHXv/a9X+RH39rvvdPrDx+I8mXDsWlLbhyp9KPc1q9/d/iY+YgZ3cIM5MuHYzdX2oap8AN0Ni3J85Ycb398Y9tPBeKFj99f1fa7mFRzjeOU4Km+vXG/Ptof9q2TCcT8v1cEhtowHlI+Lw3XRz/fz/bQwXnBOvL+zUoXQ8cADKAN5jkb9a2lhjM9j75eVqvIVHmBDAGWOR0ffVDnGPT+OZaWqUF5sf+m6DRo2eI8d76SmpqbSwxjrmLGqCmK7cVifB7mFbduO5ziD47nnvZQexrh5pfEUnt2oA4dz/PnVrWeavEY2HN+uKWKEAMCdOxx8+xOG6FQxxs2rNUXckCCAQqczE8wAMiiQdKUxJo9ua9GzJYACLaocwXTnZEZp0SyQEYdOPFuCAi0UPkAxLIbFk6XBq2TEEeY8WxJaavCWalRFQKeP8TxHGBWQpKXYYGs06A8lr5ARx2efxkLyhA3YAnqUeqURpZhCxvmOyNqsB221AXdPD5cGjjfIiKNT2qwH7Y/grvJRvhqtkBLwMmTEEeQ360GhpXrqmWEfoJRSxllHYBMKQeEJPQXh6X3KZ5G01pnfH/183OBOJ1Q99VQBYRE/vYpz8og9XJFQ0eNpHkXSrfhnHl1Cz3FFgN5oOoGfcsTpPLp9cKfwHFeQEEUPUL5K9ao45Yg+5+O8tf0WMIWH4yJCCAp6Kd6fzjiaiw9Ilrzzeg7ZqX/x/6BxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxGIdxTFDW/4PB3wMA+/KA0gruu+gAAAAASUVORK5CYII=");
			kop2_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABARJREFUeNrs2b9vm0Ucx/H397nH9pPYjZ2koSnUzQ+IitRWRN0y8T+whAEhho6VqFRERqSqEnIFgoEFESSGLDDwH8DarVClQ7o4Vt02bUOaOLWb+LHv+TI8sZNKQXRB9aE7T36e8yO/9Lk73/csyv+iiXd4h3d4h3d4h3c43wJ8Hj4Pn4d3eId3eId3eId3eId3eId3+DrK5+Ed3uEd3uEd3uEd3uEdA+m4pzBhjrtVdMkRTua2Sw+LewCSvoQAgdY2kFd72qlxpRY2EEEECRBa6U1RGHbAcjg/qjNA56mICIHQQvqdlHz3tDvzfC9ifTq2DZFAaAlE6fV9QIkmXalrh7p71KDwgyYKfQZRFEUi7c3Hzqy7HTqPp5s5rDSPBpJGgubtpBsONkt0c82cFZqtdH5E+9H+wSSBvOaKTjhY/CnsRDeWrHwCFQRUDgyQB6yedsIBiytJ5saSleYVKkev5w88g7kIH7MvWVz58qOTOZImV6iQp9VTgEJC8qYj+6vFlb2/Tn29lNB86XLaM2EgIcfuEzdL8dCezVmBZu/79xCg6OBBjj0XnehG60OmbRQKBeRET5EEoAry0JF9+5Ptc7WpOM5h091JA0Ya0htdCskZR+qPtXNobEOwwO5IajkyUQYN8k/n7WeTXyVruhUMMNKg0QA0baAqdUfqwbUMsxoTf7sEPBujwuWXl66k7EIevNuhJtls9lq7ssVYZWuJQqFQPJrIfSccnJ3u1ITAmGvL7a3Ly22MMTvjSl8S7LhxzrAmdy8pZ8IYu1OyGDDZOOApoOnHhk46kAdf6IXbMvNAgsCUdp4bgG5A5i1VRQHVFy6MK36e0gu3a2fJEDCuxgAhmbrVE72hxc62E+dXL+6Hd+aDMkbjbJcwxmZe/HZpNL3ZDYFupuiAg/Z6mJiAsllnhgen9HG0P7w98Tvv93uYURccXP90M1mdD5jGUi/bjrJw/mZ3dPONw5+SMRccrGGU1XkCyvXR4ofLC9zi2effn+hvU2QwIP96vrv7yCTC6jxBEiQy+XyYhVtc/i6nw7vpA9DxwV6v0jbyi30n0Av2z9sk/LEx8Y05LwvLUZDthiMhoCpbLuQBrM1VBYusAhf17gftOPfxj8o+2zPsAqJh0QUHa8xVkV4xophkrn3zag4rzezB8Bp3wUGrzlwVBEvfAsx2uF/Kdkd2Xz/kVf/H2a8xRxWQtLQCUVFDMlXXUvD6E3n1/6NadTiwHIRijUWCOxfPPNIxCAvGCQfQehKTYmarqcYirL535yIBoyUwbjgAdgtyr//mbaCapqPBLAC1KeqUzfpsv1Nj47A4GxwHNAO+umpMFmqw8lmOKswB1gCsQxkwh899vnG0zPyPHH8PAM6XwR7zuxV1AAAAAElFTkSuQmCC");
			kop2_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABARJREFUeNrs2b9vm0Ucx/H397nH9pPYjZ2koSnUzQ+IitRWRN0y8T+whAEhho6VqFRERqSqEnIFgoEFESSGLDDwH8DarVClQ7o4Vt02bUOaOLWb+LHv+TI8sZNKQXRB9aE7T36e8yO/9Lk73/csyv+iiXd4h3d4h3d4h3c43wJ8Hj4Pn4d3eId3eId3eId3eId3eId3+DrK5+Ed3uEd3uEd3uEd3uEdA+m4pzBhjrtVdMkRTua2Sw+LewCSvoQAgdY2kFd72qlxpRY2EEEECRBa6U1RGHbAcjg/qjNA56mICIHQQvqdlHz3tDvzfC9ifTq2DZFAaAlE6fV9QIkmXalrh7p71KDwgyYKfQZRFEUi7c3Hzqy7HTqPp5s5rDSPBpJGgubtpBsONkt0c82cFZqtdH5E+9H+wSSBvOaKTjhY/CnsRDeWrHwCFQRUDgyQB6yedsIBiytJ5saSleYVKkev5w88g7kIH7MvWVz58qOTOZImV6iQp9VTgEJC8qYj+6vFlb2/Tn29lNB86XLaM2EgIcfuEzdL8dCezVmBZu/79xCg6OBBjj0XnehG60OmbRQKBeRET5EEoAry0JF9+5Ptc7WpOM5h091JA0Ya0htdCskZR+qPtXNobEOwwO5IajkyUQYN8k/n7WeTXyVruhUMMNKg0QA0baAqdUfqwbUMsxoTf7sEPBujwuWXl66k7EIevNuhJtls9lq7ssVYZWuJQqFQPJrIfSccnJ3u1ITAmGvL7a3Ly22MMTvjSl8S7LhxzrAmdy8pZ8IYu1OyGDDZOOApoOnHhk46kAdf6IXbMvNAgsCUdp4bgG5A5i1VRQHVFy6MK36e0gu3a2fJEDCuxgAhmbrVE72hxc62E+dXL+6Hd+aDMkbjbJcwxmZe/HZpNL3ZDYFupuiAg/Z6mJiAsllnhgen9HG0P7w98Tvv93uYURccXP90M1mdD5jGUi/bjrJw/mZ3dPONw5+SMRccrGGU1XkCyvXR4ofLC9zi2effn+hvU2QwIP96vrv7yCTC6jxBEiQy+XyYhVtc/i6nw7vpA9DxwV6v0jbyi30n0Av2z9sk/LEx8Y05LwvLUZDthiMhoCpbLuQBrM1VBYusAhf17gftOPfxj8o+2zPsAqJh0QUHa8xVkV4xophkrn3zag4rzezB8Bp3wUGrzlwVBEvfAsx2uF/Kdkd2Xz/kVf/H2a8xRxWQtLQCUVFDMlXXUvD6E3n1/6NadTiwHIRijUWCOxfPPNIxCAvGCQfQehKTYmarqcYirL535yIBoyUwbjgAdgtyr//mbaCapqPBLAC1KeqUzfpsv1Nj47A4GxwHNAO+umpMFmqw8lmOKswB1gCsQxkwh899vnG0zPyPHH8PAM6XwR7zuxV1AAAAAElFTkSuQmCC");
			kop3_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAA/xJREFUeNrs2c9vG0UUwPHv2x3ba+IoKXXqCsVKFaQSCVqJU/8Fjpw5tCoSHHqKUPghlCMCCYnABd+olFvpgb+CSw9VL1wqIMk2UkPiTXBqQ3azOzMc1kmhpGlSiXoXzZzWI+9oPnrz3ozHYvlfNHEO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53CO/6Sp0sy0f1RnfQXa67O/lsDRl54RAAseNSRlbKCwAD++3Zj6gk+hVfB1FcUWz3iAAYtHTUjHBgpbhTMlyY/oT/EAsnzRGKxXQ1KLmgKkJPnRjT0fMoAsn6cFJB0LFJBVypHn3djzckTeMgV4NenwCUJmaqWoV929fEX9Y572XFQHFJmhVoa62981gsFDDdeVAjDnaCUxi9pgg3+94xWxRhksYAyglFIK4IMFooTOojb2alCG/TyKwTxZjxZgOZqMO4s741e/L8W5ZEOR5NvFkGLFygLL+MkSi599fDSjcI4NRVJLwHjmsO/DZcDf7cyP92tPYRTN8Wg/n0/yuKsJRK0krgZqUDsiw4uY5w/3yQSgdlhZm0SR30riTqBs1wtKcW5/KFDJ922osweTbLYgIa4G6sHM/bmnvlqkeGwNS5SIiEhMvU6PVpIk8VI1UHIco0jx2AoGh7U2Pz3lqyjuMB8o+eGN2UoZHJv6iU3jYNad+QAlhp/nyvC79ve9w8fGoAF8A9ygwzyBQsL2sYzC5MdO6is1PEkNIAhgnvfSKvNBQyFh+st0Ge4ZfpO/LakmZMT5c6AACY0kx4ajKPGogR22qanuMMmDQRCoSETCu1lyoQT3PrsasWIPIjLZZRKIzmf0poDw7iXTmC6+o/9H9eBxYndivY3XD1BRk0wJIe3QZK9WKL5j93GpYmK/uq1RtbOARULahCZrNp81RgHyY5t63iYmHjWr7++81WyeodfrhfIgpB2umNbtZzIKEI9tdXCdUNXj73zZ5Ap33r1l1gHaoVYmZY7iO3ra1z5Aff/rj67dvMIdorMv2fX2eptQq9RP504yzKgdvRzhV+k2jQW5/t3Sog1nIESr1NP2RIwRO/pa+0AdI9duIte/rQaV1Uz8e2/eu6xSD8lOyBhtnvc0PtQ3u1YPXtdfqVv9rbU1LejLckm0Lzo9KWOk8egB9T2/oj6/8fIKgBFQkOIhZFjmTjzWCB09wK+otfMbghEFkIKXH95Ppxiho4/2dQO75lujSPM/B/KTSYaFUylG5rgPrcZKJfONh6CHggy4sHpqw4t3rJICnmSA0hUgzT+g0uFXXpPnGvnF1iutPd/385lOz+wbs2/19E8++PbixdnZV25PT+8938h/DQAMRqY09QFaLwAAAABJRU5ErkJggg==");
			kop3_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAA/xJREFUeNrs2c9vG0UUwPHv2x3ba+IoKXXqCsVKFaQSCVqJU/8Fjpw5tCoSHHqKUPghlCMCCYnABd+olFvpgb+CSw9VL1wqIMk2UkPiTXBqQ3azOzMc1kmhpGlSiXoXzZzWI+9oPnrz3ozHYvlfNHEO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53AO53CO/6Sp0sy0f1RnfQXa67O/lsDRl54RAAseNSRlbKCwAD++3Zj6gk+hVfB1FcUWz3iAAYtHTUjHBgpbhTMlyY/oT/EAsnzRGKxXQ1KLmgKkJPnRjT0fMoAsn6cFJB0LFJBVypHn3djzckTeMgV4NenwCUJmaqWoV929fEX9Y572XFQHFJmhVoa62981gsFDDdeVAjDnaCUxi9pgg3+94xWxRhksYAyglFIK4IMFooTOojb2alCG/TyKwTxZjxZgOZqMO4s741e/L8W5ZEOR5NvFkGLFygLL+MkSi599fDSjcI4NRVJLwHjmsO/DZcDf7cyP92tPYRTN8Wg/n0/yuKsJRK0krgZqUDsiw4uY5w/3yQSgdlhZm0SR30riTqBs1wtKcW5/KFDJ922osweTbLYgIa4G6sHM/bmnvlqkeGwNS5SIiEhMvU6PVpIk8VI1UHIco0jx2AoGh7U2Pz3lqyjuMB8o+eGN2UoZHJv6iU3jYNad+QAlhp/nyvC79ve9w8fGoAF8A9ygwzyBQsL2sYzC5MdO6is1PEkNIAhgnvfSKvNBQyFh+st0Ge4ZfpO/LakmZMT5c6AACY0kx4ajKPGogR22qanuMMmDQRCoSETCu1lyoQT3PrsasWIPIjLZZRKIzmf0poDw7iXTmC6+o/9H9eBxYndivY3XD1BRk0wJIe3QZK9WKL5j93GpYmK/uq1RtbOARULahCZrNp81RgHyY5t63iYmHjWr7++81WyeodfrhfIgpB2umNbtZzIKEI9tdXCdUNXj73zZ5Ap33r1l1gHaoVYmZY7iO3ra1z5Aff/rj67dvMIdorMv2fX2eptQq9RP504yzKgdvRzhV+k2jQW5/t3Sog1nIESr1NP2RIwRO/pa+0AdI9duIte/rQaV1Uz8e2/eu6xSD8lOyBhtnvc0PtQ3u1YPXtdfqVv9rbU1LejLckm0Lzo9KWOk8egB9T2/oj6/8fIKgBFQkOIhZFjmTjzWCB09wK+otfMbghEFkIKXH95Ppxiho4/2dQO75lujSPM/B/KTSYaFUylG5rgPrcZKJfONh6CHggy4sHpqw4t3rJICnmSA0hUgzT+g0uFXXpPnGvnF1iutPd/385lOz+wbs2/19E8++PbixdnZV25PT+8938h/DQAMRqY09QFaLwAAAABJRU5ErkJggg==");
			kop4_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAA/tJREFUeNrs2b1vHEUYwOHfzO5yu3c+nz/OCXEIkWMjuYA4pVuQoKCipKLgS8hSRGkKKwVCikxEYSG5cERFgcSfEDoqd7GRkSLZYCw5duy7893lvtbZnZ0Ud2efFIGdAnyDZqrd2ZV2nn3fmXm1KzT/Qnv095emgBj80x5F3d8bLV2H0EsWv2SQt1aZ3Xi5J4r/2DG1NUWM1wZsO4BCTsQubHVvGS+Nh25a9IPjHE1BJbvtsH7ztxmUhPZAJkFvAanXPDMcqBrKUdmd8X20QMlEghZdzSYwbYQDVVPg8KyiXy1oknaOAZ3YTLL5EpILdAAlIFen+uynuZE/gLYGBVIDk+eXXKyDigLIiVJrKFqeR8WHOqFjkWgmN88JkRfKYMgBqNZGrhaS36Mo+Gzo9WtX1hXr6xsbItHiT6kefW1APDq5BTgD8UEw1oDMhytLC9trt2CNGYW8sfnzHRMcXQjkYvERPzC7SnnwSAPotRmUSCZSJjgoCdDZ+kAdmX36xb0RZln95L5ygYJemyFJpo1wcKSczlLsFCaOP733/iqZUgo0goJem9HXfCMcHKnT41/fPvIkOvdK9HSwxKigoLVW00Y4KpF7elIee3Br3I3wj0mFfl1A4eHNsyD94eBINE5me5VBvFToEQFeTATFh2/qaRMcsAvdEjeLB9qDIuQj/zgC8eAMSN84Cs86wxHDZT2iwSMBWcwT+cdPyJ8BkX3CYCwtEAIhqCDLVD1YpFy6nySe0tfR7zlvVE2IB+zK09QCRiivwOduvDIvI5+6OIymjXDwWLZHJIbLAKzMgRcBy/My8utF/Q+QfnLwWJ4EpLMOe5EHRGRl5Nd/+cDp//kBcFULwHVdt83wPBQueF7trhMOvNswI6+APQkuPbv7ABTzxBBlld/Qg4Y42PdAOQoI/dAPAQJa5ImjrHT+umGKg33ZVvR0BUAGWlnpKM+E+QFwRSsIQyDoNrjNxw2C2l21e2xKPOCJIOxEgWa6CWm4DXyfaS3P7/14xxQHxUZX0ds7D98ORcsLtZwReQXkM34ANJvtAUopJZJFCNxg7pts1ZR4QHgQNF94yQlpMvESC62Ua4gDDkSzXaV0OzQkaTIxSyzsXHpBIvuTweVLQZL01o1CIJsUQyC6fNhsxGbEA+CgxWkJrIEkTct34tHI3xnFyZjigGLS7MmYBNItHyfWejiC0oQxDqDY0MhEQgKkaeE7xBqt0eSy5jiAStwIaO+HtPBxYjS6/eNn9Z2U/o6vjHCceHpP/E4dmd6GscKESQ4jvpdYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3V0mvx/MHg+AP4/vJxNJjIqAAAAAElFTkSuQmCC");
			kop4_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAA/tJREFUeNrs2b1vHEUYwOHfzO5yu3c+nz/OCXEIkWMjuYA4pVuQoKCipKLgS8hSRGkKKwVCikxEYSG5cERFgcSfEDoqd7GRkSLZYCw5duy7893lvtbZnZ0Ud2efFIGdAnyDZqrd2ZV2nn3fmXm1KzT/Qnv095emgBj80x5F3d8bLV2H0EsWv2SQt1aZ3Xi5J4r/2DG1NUWM1wZsO4BCTsQubHVvGS+Nh25a9IPjHE1BJbvtsH7ztxmUhPZAJkFvAanXPDMcqBrKUdmd8X20QMlEghZdzSYwbYQDVVPg8KyiXy1oknaOAZ3YTLL5EpILdAAlIFen+uynuZE/gLYGBVIDk+eXXKyDigLIiVJrKFqeR8WHOqFjkWgmN88JkRfKYMgBqNZGrhaS36Mo+Gzo9WtX1hXr6xsbItHiT6kefW1APDq5BTgD8UEw1oDMhytLC9trt2CNGYW8sfnzHRMcXQjkYvERPzC7SnnwSAPotRmUSCZSJjgoCdDZ+kAdmX36xb0RZln95L5ygYJemyFJpo1wcKSczlLsFCaOP733/iqZUgo0goJem9HXfCMcHKnT41/fPvIkOvdK9HSwxKigoLVW00Y4KpF7elIee3Br3I3wj0mFfl1A4eHNsyD94eBINE5me5VBvFToEQFeTATFh2/qaRMcsAvdEjeLB9qDIuQj/zgC8eAMSN84Cs86wxHDZT2iwSMBWcwT+cdPyJ8BkX3CYCwtEAIhqCDLVD1YpFy6nySe0tfR7zlvVE2IB+zK09QCRiivwOduvDIvI5+6OIymjXDwWLZHJIbLAKzMgRcBy/My8utF/Q+QfnLwWJ4EpLMOe5EHRGRl5Nd/+cDp//kBcFULwHVdt83wPBQueF7trhMOvNswI6+APQkuPbv7ABTzxBBlld/Qg4Y42PdAOQoI/dAPAQJa5ImjrHT+umGKg33ZVvR0BUAGWlnpKM+E+QFwRSsIQyDoNrjNxw2C2l21e2xKPOCJIOxEgWa6CWm4DXyfaS3P7/14xxQHxUZX0ds7D98ORcsLtZwReQXkM34ANJvtAUopJZJFCNxg7pts1ZR4QHgQNF94yQlpMvESC62Ua4gDDkSzXaV0OzQkaTIxSyzsXHpBIvuTweVLQZL01o1CIJsUQyC6fNhsxGbEA+CgxWkJrIEkTct34tHI3xnFyZjigGLS7MmYBNItHyfWejiC0oQxDqDY0MhEQgKkaeE7xBqt0eSy5jiAStwIaO+HtPBxYjS6/eNn9Z2U/o6vjHCceHpP/E4dmd6GscKESQ4jvpdYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3VYh3V0mvx/MHg+AP4/vJxNJjIqAAAAAElFTkSuQmCC");
			kop12_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABqpJREFUeNrs209MHNcdwPHvb3aX2Rl2vdiw65iNsaGyFCmJipAacU2q5t5TLlZkiUo9xdwsEalVVVd1zaESOfVQoirqpZHaa2/u1afILhywYhvbsCCz2Ga9uzO7O8z79bB/WGLjQKuWmYp3QDBvBumj937z3pv3fqIctdQJ+GLWtlKwmi8P60DpUn+1V6K4/8r/osjRHVrd6P0+DqyFAqAWxVKxVHQ5jnJEx8MWMB6WOg9DiLD0QwOaGMLleBBHdKwAY3sEgFCwDBOPJp673jEqjuJYaRsECLsSTWAK2xNN9WCE4yyHdbQVnY7UFgA/2OVxUb1s9bgZh3SsMFZCegYS4ajt41K30ScjcOyMwzlWxkpCiCwB7+vyx7bvXv5SSbBmiITicI6VsY0QWWIKvpm6eP3qz79UECsVEnpEg3Eox7cGWZoygKVnmoNM356+lW2lEtXOvxg+fgbWYQY+WU5NmnyeMyNzyR9Pc9t7t76e8msigkgkGIdoj/tmacpQQAGnpUzf+uy349+OCO0n5QyxcNw3KUNeyuTZGTUvlFNrmv/Hh73nosH4Xsf9u5PkkUyQMlgBZkO++ai//jSxcNxbniyAS8B2AQMpPBR2uvVjxMJxb3myUM67hMaikgUrZTaGdnrhr5FhvPl9dW/5J1ImEwamWikPNLEINkddEQEB6U4Wo94e3vpbkiHANKktMrswa1ez1pbd7LXH2/FwrBoZJzBNd6vA1uLcVgZavcomRIjxJseqKWQC/IU5oJxna3GmfX2gBQNAnng4/vpxJjDzc9QBvHwZ6N08EDHGmxzVTOAvzNWBTNkBPADX63CKxMNR1Wzgu3XIwPZIGRz8dngDGjXGwY4HE82mW8+wnYNKb8Do9q1RYuJo2M2mK2zn6DH6WiNyjIPGwcpGc96VIMhx5enTRqd0vy5I9BgHtMevLw+7SMAV5nXfXWlAzxETR5C8Pldv5K4wz/4ulW6k4S1i4tjJXZ+rN2Zh3vFxfAf6XlUXISaO3cT1uXomYMvZd9kH0IgyXnXsJqm41DPBU3H6BnAE8C9AXBwP3zbzXPWlIQ79dRJlxWscGphnItJA2GsPIdqK7zqquJt2S1y/6+iGRrQR/Y6qsiOITUsQoYEAju/EAQFI+Bs+N/VbHwCMbtq0EEHoDN6RfT+94liR4W0uNV5X5xKf8m/sD544ThwnjhPHieM/cdxT/g+GD5JnXTGVWx+gArJvOBdQ0umhWPWrg6ZXPmCb0RjFh67maU93hf3TXXx0YDQ+cb77JF8e7y0/9q0+8Bk4F2VH//erZNFhFTJ/dDQNfm85qKrqOK3Hm7F57zZJPBl/+eryXFTAR+1z8XDgWyQSL916JmCrHSAqKnufS9Kn7ej3K8D51IThqRuDtQrXrvm+Dw3Ex/d9QJXG841YOPiL82m4+4sbg+kKXAPfx/c7baGQTou1EYd+BfDJVzf3f94V7d6VBsUU4+Hgk69uXh6dn5MAuHKzezXdSAMokYS8dp7oW/r67Q9t/9Bi5OOjHe2JtYe27WltJFWBXA+h0g4TKcfDwbOwULUdb7BWS6dSKUZUVdNoZzxRba3Hw3H2nZLUUo73xSC1GiM1HMfxVFW1O1VZj0N8ALutv/dvn7c3nffuHaBxPh7rwRV7/3EGbsz0KSBikIPXtSt253jJwkyBGzOLzNJ3vqQJZiwWjp2B9YSMm9A0F2ZrLDIzDNUcvfM+KoOn4+BgRZYnhQuEmGq2id20ra1Cgk26JwIYPBPx9xUAF/S9O5p/7CVSVrbasrGhmNjwNKfaOQ5Qi057JH51YFVq6PnZf2YLBEnLOC8zooiQ0PROtnuSDOO50e9XsHs/eXdqmL7joqmXmgz77tC0GwMHwYPk3vFdXPNCJbumy3y4BxmOfHwAqa/PW8Edq7yVz+sLrTM46P5o6Jcf/bS8TWd0l2dxaA9YIaEsTRny5XyY/NniNLfxPvuD3VlbCehIHBxUNhNG6KQbXKw0B5m+jdefbhAJyPfmG+S+Ds9b+l5w545l8bcXhd/vvivTbph8mchm3fakazsO7cGB6Tgzf1q7QLtRXDcOjlfTo8w5+3ezLvVGTjvdKxb5UTQeddLVQr6TrpZottPV4pGvBq2HB6QPjj9upw/GJH8QGo/opXN2szlBLMOExXGncx5tX62xsS+9FoFQwLr7PnrpuXucW1hH3h+snKqVen+MA2tGhU66M8VSchhAyhO9m7wnvV/fiY4D6nvp5/DnqwMl4BLQnvs+aB98l8xeaK32PfzfkvxrALevHeCpERZIAAAAAElFTkSuQmCC");
			kop12_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABqpJREFUeNrs209MHNcdwPHvb3aX2Rl2vdiw65iNsaGyFCmJipAacU2q5t5TLlZkiUo9xdwsEalVVVd1zaESOfVQoirqpZHaa2/u1afILhywYhvbsCCz2Ga9uzO7O8z79bB/WGLjQKuWmYp3QDBvBumj937z3pv3fqIctdQJ+GLWtlKwmi8P60DpUn+1V6K4/8r/osjRHVrd6P0+DqyFAqAWxVKxVHQ5jnJEx8MWMB6WOg9DiLD0QwOaGMLleBBHdKwAY3sEgFCwDBOPJp673jEqjuJYaRsECLsSTWAK2xNN9WCE4yyHdbQVnY7UFgA/2OVxUb1s9bgZh3SsMFZCegYS4ajt41K30ScjcOyMwzlWxkpCiCwB7+vyx7bvXv5SSbBmiITicI6VsY0QWWIKvpm6eP3qz79UECsVEnpEg3Eox7cGWZoygKVnmoNM356+lW2lEtXOvxg+fgbWYQY+WU5NmnyeMyNzyR9Pc9t7t76e8msigkgkGIdoj/tmacpQQAGnpUzf+uy349+OCO0n5QyxcNw3KUNeyuTZGTUvlFNrmv/Hh73nosH4Xsf9u5PkkUyQMlgBZkO++ai//jSxcNxbniyAS8B2AQMpPBR2uvVjxMJxb3myUM67hMaikgUrZTaGdnrhr5FhvPl9dW/5J1ImEwamWikPNLEINkddEQEB6U4Wo94e3vpbkiHANKktMrswa1ez1pbd7LXH2/FwrBoZJzBNd6vA1uLcVgZavcomRIjxJseqKWQC/IU5oJxna3GmfX2gBQNAnng4/vpxJjDzc9QBvHwZ6N08EDHGmxzVTOAvzNWBTNkBPADX63CKxMNR1Wzgu3XIwPZIGRz8dngDGjXGwY4HE82mW8+wnYNKb8Do9q1RYuJo2M2mK2zn6DH6WiNyjIPGwcpGc96VIMhx5enTRqd0vy5I9BgHtMevLw+7SMAV5nXfXWlAzxETR5C8Pldv5K4wz/4ulW6k4S1i4tjJXZ+rN2Zh3vFxfAf6XlUXISaO3cT1uXomYMvZd9kH0IgyXnXsJqm41DPBU3H6BnAE8C9AXBwP3zbzXPWlIQ79dRJlxWscGphnItJA2GsPIdqK7zqquJt2S1y/6+iGRrQR/Y6qsiOITUsQoYEAju/EAQFI+Bs+N/VbHwCMbtq0EEHoDN6RfT+94liR4W0uNV5X5xKf8m/sD544ThwnjhPHieM/cdxT/g+GD5JnXTGVWx+gArJvOBdQ0umhWPWrg6ZXPmCb0RjFh67maU93hf3TXXx0YDQ+cb77JF8e7y0/9q0+8Bk4F2VH//erZNFhFTJ/dDQNfm85qKrqOK3Hm7F57zZJPBl/+eryXFTAR+1z8XDgWyQSL916JmCrHSAqKnufS9Kn7ej3K8D51IThqRuDtQrXrvm+Dw3Ex/d9QJXG841YOPiL82m4+4sbg+kKXAPfx/c7baGQTou1EYd+BfDJVzf3f94V7d6VBsUU4+Hgk69uXh6dn5MAuHKzezXdSAMokYS8dp7oW/r67Q9t/9Bi5OOjHe2JtYe27WltJFWBXA+h0g4TKcfDwbOwULUdb7BWS6dSKUZUVdNoZzxRba3Hw3H2nZLUUo73xSC1GiM1HMfxVFW1O1VZj0N8ALutv/dvn7c3nffuHaBxPh7rwRV7/3EGbsz0KSBikIPXtSt253jJwkyBGzOLzNJ3vqQJZiwWjp2B9YSMm9A0F2ZrLDIzDNUcvfM+KoOn4+BgRZYnhQuEmGq2id20ra1Cgk26JwIYPBPx9xUAF/S9O5p/7CVSVrbasrGhmNjwNKfaOQ5Qi057JH51YFVq6PnZf2YLBEnLOC8zooiQ0PROtnuSDOO50e9XsHs/eXdqmL7joqmXmgz77tC0GwMHwYPk3vFdXPNCJbumy3y4BxmOfHwAqa/PW8Edq7yVz+sLrTM46P5o6Jcf/bS8TWd0l2dxaA9YIaEsTRny5XyY/NniNLfxPvuD3VlbCehIHBxUNhNG6KQbXKw0B5m+jdefbhAJyPfmG+S+Ds9b+l5w545l8bcXhd/vvivTbph8mchm3fakazsO7cGB6Tgzf1q7QLtRXDcOjlfTo8w5+3ezLvVGTjvdKxb5UTQeddLVQr6TrpZottPV4pGvBq2HB6QPjj9upw/GJH8QGo/opXN2szlBLMOExXGncx5tX62xsS+9FoFQwLr7PnrpuXucW1hH3h+snKqVen+MA2tGhU66M8VSchhAyhO9m7wnvV/fiY4D6nvp5/DnqwMl4BLQnvs+aB98l8xeaK32PfzfkvxrALevHeCpERZIAAAAAElFTkSuQmCC");
			kop23_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAAoJyglIyYrKi0uLTAhICQaGh0wMDM/P0Cdoo6IjHywtaJaXkxqblx0eGd+gnGnq5iSlYdMTz4nKhY5PCpAQzFFRztRU0ZdXlcfIRAwMiEJCQZiYl7V1dS+vr0XFg8zMSl4d3OBgHxvbmsjIR06OTlTUlJJSEgAAAA68G0oAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAIABJREFUeNoBSD+3wAD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9SmnbfAAAfU0lEQVT///////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A2PfY2PH79vb29vb29vb29vb29vb29vbw9vb2////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9vb29vb29vb29vb29vb29vb29vb2+9jx2PfY+wD7gfr5/fys6enp6e7u4+Pv5OTl5ubh4eHo6Ojg4ODo////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9uXh6Ojg4ODo6Ojo4eHm5uXk5O/j4+7u6enp6az8/fn6gdn7AP///////////u3t7enu4+Pv5OXl5uHh6Ojg4ODg4Ofn5+Dg///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////l4eDg4ODn5+fg4ODg6Ojh4ebl5eTv4+7u6e3t7f////////////8A//////////////////7+7uPv5OXm5uHo4ODg5+fn5+fn5+fn5+D//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Xo4ODn5+fn5+fn5+fn4ODg6OHm5uXk8+Pu/v7+/v///////////////wD//////////////////////e/v5OXm4ejo4ODn5+fi4uLi4uLn5+fn4P///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+bg4Ofn5+Li4uLi4uLn5+fn4Ojo4ebl8/P9/f3+/vn/////////////////AP/////////////////////+/fOBgfjm4ejg5+fi4uLi4uLi4uLi4uLn5+D//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+bg4Ofn4uLi4uLi4uLi4uLi5+fg6OHm+PqB8/3+/vny//////////////////8A//////////////////////n//4H6+vn54ejg5+fn4uLi4uLi4uLi5+fn5+fg/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+bo4ODn5+fn4uLi4uLi4uLi5+fn4Ojo+fn6gYH9/fny/////////////////////wD////////////////////////5/YH6+Pno6ODn5+fn5+fn5+fn4ufn5+Dg4ODg6P////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Lh6ODg4ODn5+fn5+fn5+fn5+fn5+Dg6Oj5+PqB/fny////////////////////////AP/////////////////////////4/YH6+OFWVlbg5+Dn4Ofn5+fg4ODg4ODg6Ojo6P/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////l5ujo6ODg4ODg4ODn5+fn5+fg4ODgVlbo4fj6gf34//////////////////////////8A///////////////////////////6/YH6+PnoVlZW4ODg4ODg4ODg4ODg4Ojo6Ojh4eH/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5eHh4eHo6Ojo4ODg4ODg4ODg4ODg4FZWVuH4+oH9+P///////////////////////////wD///////////////////////////+B/YGB+Pno6FZWVujo6Ojg4Ojg6Ojo6Ojh4eHm4eb//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Tm5uHh4eHo6Ojo6ODo4Ojg6OjoVlZWVuj5+vrz/YH/////////////////////////////AP////////////////////////////+B/vOB+vnh6OjoVujo6Ojo6Ojo6Ojh4eHh4eHm5ub////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////k5ubm4eHh4eHo6Ojo6Ojo6Ojo6FboVujh+fqB8/6B//////////////////////////////8A///////////////////////////////z/e/z+vn54ejo6Ojh4eHh4eHh4eHh4eHm5ubm5eX/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5OXl5ubm5uHh4eHh4eHh4eHh4ejo6Oj5+fn68+/98////////////////////////////////wD////////////////////////////////8/e/z+vj5+fnh6Ojh4eHh4ebh5uHm5ubm5eXl5eX//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Pl5eXl5ebm5ubh5uHm4eHh4eHo6OHh+fn4+vPv/fz/////////////////////////////////AP////////////////////////////////7f/e/z+vj4+fn5+eH55vnm5vjm5ubm5ubl5eTl5OT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////j5OTk5eXl5ubm5ubm+Obm5vn5+eH5+fn4+Prz7/3f/v////////////////////////////////8A///////////////////////////////////+/e/zgfr4+Pj5+ebm+Pj45eXl5eXl5eXl5eTk5OT/////////////////////////////////////////////////////////////////////////////////////////////////////////////////4+Tk5OTl5eXl5eXl5eXl+Pj45ub5+Pn4+PqB8+/9/v7//////////////////////////////////wD//////////////////////////////////6z+/f3zgfr6+Pj4+Pjl5eXl5frk5OTk5OTk5OTj5OP//////////////////////////////////////////////////////////////////////////////////////////////////////////////+7k4+Tk5OTk5OTk5OX65eX65fjl+Pj4+Pr6ge/v/f6s9v//////////////////////////////////AP///////////////////////////////////Pz+/f3v84H6+vr65fr6+oHk5OTk5OTk5OTk5OTj4+P////////////////////////////////////////////////////////////////////////////////////////////////////////////p4+Pj7+Tk5OTk5OTk5OTkgeT6+vrl+vr6gfPv/f3+/PzX//////////////////////////////////8A/////////////////////////////////////N/+/f3v8/P65Pr6geT65PPz8/Pv7+/v7+Pj4+Pj4+P/////////////////////////////////////////////////////////////////////////////////////////////////////////7ePu4+Pj4+Pv7+/v7/Pz8/Pk+oH6+vqB+vPz/f39/t/81////////////////////////////////////wD////////////////////////////////////229/+/f397/PzgeTkgfOB8+/v7/3j4+Pj4+Pj4+7u7u7//////////////////////////////////////////////////////////////////////////////////////////////////////+zu7u7j4+Pj4+Pj4+Pj7+/v84HzgeTk8/Pz7/39/f7f2/b4////////////////////////////////////AP/////////////////////////////////////arN/+/f79/e/v7/Pz8/Pz7/394+7u7u7u7u7u7u7p6en////////////////////////////////////////////////////////////////////////////////////////////////////r6enp7u7u7u7u7u7u7v394+/v8/Pz7+/v7/397v3+36za1/////////////////////////////////////8A///////////////////////////////////////YrN/+/v7u/e/v7+/v7/Pv7/397v7+6enp6enp6enp6f///////////////////////////////////////////////////////////////////////////////////////////////////+3p6enp6enp6enp6f7+7v3v7/Pv7+/v7+/97v7+/t+s2Nf//////////////////////////////////////wD////////////////////////////////////////Y3t/+/v7+7u/v/f3v7+/v/e7+7e3t7e3t7e3s7ezt7P////////////////////////////////////////////////////////////////////////////////////////////////Hs7O3s7ezt7e3t7e3t7f7u/f3v7+/j/e/v7v7+/v7frNjX////////////////////////////////////////AP/////////////////////////////////////////ZrPzf3+3+/f397u794/3z/vys3/zs/Ozs7Ozs7Ozs7P/////////////////////////////////////////////////////////////////////////////////////////////26+zs7Ozs7Ozs/Oz8/N+s/P7z7+P97u79/f3+39/f/KzZ1/////////////////////////////////////////8A///////////////////////////////////////////c3vzf39/+/f3+/v7++Ofi5+jb8ffr6+vr6+vr6+vr6/////////////////////////////////////////////////////////////////////////////////////////////Hr6+vr6+vr6+vr6/f39+Hi4uf4/v7p/v79/t/f/Pzb2df//////////////////////////////////////////wD////////////////////////////////////////////Z297839/f/v7t7e369fT0K+dW3/vY9/fx8fHx8fHx6//////////////////////////////////////////////////////////////////////////////////////////q6/Hx8fHx8ff38dj731bnK/T09frt7d/+/v7f3/ys29ny////////////////////////////////////////////AP//////////////////////////////////////////////2t7e/N/f39/f/P5W9Csr9PTnVvz29vHq6urq6urq6v//////////////////////////////////////////////////////////////////////////////////////6vHq6urq6urq6vbd/Fbn9PQrK/RW/vzf39/f/Pze3tr71/////////////////////////////////////////////8A///////////////////////////////////////////////d2NrerPz83/zf/P344vT0K/Qr51bz8vLw8PDw8PDq6v////////////////////////////////////////////////////////////////////////////////////Dq6vDw8PDw8PLy8+jnK/Qr9PTi+P38/N/f/Pze3trY3dfz/////////////////////////////////////////////wD//////////////////////////////////////////////9f23Nja296s/Pz8rPz9gfhW9fT09PXo4fLy9vDw8PDw6v/////////////////////////////////////////////////////////////////////////////////w6vDw8PDw9vLy4ej19PT09Vb4gf38rPz8/Kze29rY3PbXgf//////////////////////////////////////////////AP///////////////////////////////////////////////9f23dzZ2NrbrKysrNvY3v7v8/pW9fT0Vujb8tfw8PDw6v/////////////////////////////////////////////////////////////////////////////28Orw8PDw8tfb6Fb09PVW+vPv/qzY26ysrKzb2tnZ3N321/r///////////////////////////////////////////////8A/////////////////////////////////////////////////9fX9t3d3NnY2trb3t7b2tnc2v7v8/P6+vjh6Pby8PDw8PD/////////////////////////////////////////////////////////////////////////8PDw8PDw8vbh6Pj6+vPz7/7a2dna29ve29ra2Nzc3N321////////////////////////////////////////////////////wD////////////////////////////////////////////////////X1/bd3d3c3NnY2tra29vb2Nnc3Nzc/fr63OH28Nfw8PD///////////////////////////////////////////////////////////////////////Dw8PDy9vbh3Pr6/dzc3NzZ2Nvb29ra2tjZ3Nzd3d3219f/////////////////////////////////////////////////////AP//////////////////////////////////////////////////////19f23d3d3N3c3NnZ2Nra2tra29vY3Nzb+Nz76Pbw8PD/////////////////////////////////////////////////////////////////9vbw8PDw9uj72fjb3NzY29ra2tra2NjY2dzc3N3d3d3219f///////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////9fX19f23d3d3dzd3dzc3NnZ2dna2tvc3tv52fvw8PD29v////////////////////////////////////////////////////////////b29vDw8Pvc+dve3Nva2tnZ2dnc3Nzc3d3d3d3d9tfX19f//////////////////////////////////////////////////////////wD//////////////////////////////////////////////////////////////tfX19fX9t3d3d3d3d3d3NzZ2tre3tze29rY+93w9vb////////////////////////////////////////////////////////d9vbw+9ja3t7c3t7a2tnc3Nzd3d3d3d3d9tfX19fX/u//////////////////////////////////////////////////////////////AP///////////////////////////////////////////////////////////////////f7X19fX19fX19fy8vLy8tnY2trb29vY+9323fbd9v/////y8tfX19fX19fX19fX19fX19fX19fX19fX19fy1/Ly8vb29t323fvY29vb2trY2fLy8vLy19fX19fX19fX/v3z+Pn1//////////////////////////////////////////////////////////////8A///////////////////////////////////////////////////////////////////19fj4gfPv7/39/f7+/oH49t3/////////////////9t3w3fbX19fX19fX19fX19fX19fX19fX19fX19fX19fy8vLy8vb//////////////932+IH+/v79/f3v7/OB+Pj19Sv09Cv//////////////////////////////////////////////////////////////62tvpqb3Y+CAAAAAElFTkSuQmCC");
			kop23_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABRCAMAAABR5EKqAAADAFBMVEX//////8z//5n//2b//zP//wD/zP//zMz/zJn/zGb/zDP/zAD/mf//mcz/mZn/mWb/mTP/mQD/Zv//Zsz/Zpn/Zmb/ZjP/ZgD/M///M8z/M5n/M2b/MzP/MwD/AP//AMz/AJn/AGb/ADP/AADM///M/8zM/5nM/2bM/zPM/wDMzP/MzMzMzJnMzGbMzDPMzADMmf/MmczMmZnMmWbMmTPMmQDMZv/MZszMZpnMZmbMZjPMZgDMM//MM8zMM5nMM2bMMzPMMwDMAP/MAMzMAJnMAGbMADPMAACZ//+Z/8yZ/5mZ/2aZ/zOZ/wCZzP+ZzMyZzJmZzGaZzDOZzACZmf+ZmcyZmZmZmWaZmTOZmQCZZv+ZZsyZZpmZZmaZZjOZZgCZM/+ZM8yZM5mZM2aZMzOZMwCZAP+ZAMyZAJmZAGaZADOZAABm//9m/8xm/5lm/2Zm/zNm/wBmzP9mzMxmzJlmzGZmzDNmzABmmf9mmcxmmZlmmWZmmTNmmQBmZv9mZsxmZplmZmZmZjNmZgBmM/9mM8xmM5lmM2ZmMzNmMwBmAP9mAMxmAJlmAGZmADNmAAAz//8z/8wz/5kz/2Yz/zMz/wAzzP8zzMwzzJkzzGYzzDMzzAAzmf8zmcwzmZkzmWYzmTMzmQAzZv8zZswzZpkzZmYzZjMzZgAzM/8zM8wzM5kzM2YzMzMzMwAzAP8zAMwzAJkzAGYzADMzAAAA//8A/8wA/5kA/2YA/zMA/wAAzP8AzMwAzJkAzGYAzDMAzAAAmf8AmcwAmZkAmWYAmTMAmQAAZv8AZswAZpkAZmYAZjMAZgAAM/8AM8wAM5kAM2YAMzMAMwAAAP8AAMwAAJkAAGYAADMAAAAoJyglIyYrKi0uLTAhICQaGh0wMDM/P0Cdoo6IjHywtaJaXkxqblx0eGd+gnGnq5iSlYdMTz4nKhY5PCpAQzFFRztRU0ZdXlcfIRAwMiEJCQZiYl7V1dS+vr0XFg8zMSl4d3OBgHxvbmsjIR06OTlTUlJJSEgAAAA68G0oAAABAHRSTlP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD///////////////////////////////////////////////////8AbsYGhwAAAAlwSFlzAAALEwAACxMBAJqcGAAAIABJREFUeNoBSD+3wAD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9SmnbfAAAfU0lEQVT///////////////////8A/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A2PfY2PH79vb29vb29vb29vb29vb29vbw9vb2////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9vb29vb29vb29vb29vb29vb29vb2+9jx2PfY+wD7gfr5/fys6enp6e7u4+Pv5OTl5ubh4eHo6Ojg4ODo////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9uXh6Ojg4ODo6Ojo4eHm5uXk5O/j4+7u6enp6az8/fn6gdn7AP///////////u3t7enu4+Pv5OXl5uHh6Ojg4ODg4Ofn5+Dg///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////l4eDg4ODn5+fg4ODg6Ojh4ebl5eTv4+7u6e3t7f////////////8A//////////////////7+7uPv5OXm5uHo4ODg5+fn5+fn5+fn5+D//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Xo4ODn5+fn5+fn5+fn4ODg6OHm5uXk8+Pu/v7+/v///////////////wD//////////////////////e/v5OXm4ejo4ODn5+fi4uLi4uLn5+fn4P///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+bg4Ofn5+Li4uLi4uLn5+fn4Ojo4ebl8/P9/f3+/vn/////////////////AP/////////////////////+/fOBgfjm4ejg5+fi4uLi4uLi4uLi4uLn5+D//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+bg4Ofn4uLi4uLi4uLi4uLi5+fg6OHm+PqB8/3+/vny//////////////////8A//////////////////////n//4H6+vn54ejg5+fn4uLi4uLi4uLi5+fn5+fg/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+bo4ODn5+fn4uLi4uLi4uLi5+fn4Ojo+fn6gYH9/fny/////////////////////wD////////////////////////5/YH6+Pno6ODn5+fn5+fn5+fn4ufn5+Dg4ODg6P////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Lh6ODg4ODn5+fn5+fn5+fn5+fn5+Dg6Oj5+PqB/fny////////////////////////AP/////////////////////////4/YH6+OFWVlbg5+Dn4Ofn5+fg4ODg4ODg6Ojo6P/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////l5ujo6ODg4ODg4ODn5+fn5+fg4ODgVlbo4fj6gf34//////////////////////////8A///////////////////////////6/YH6+PnoVlZW4ODg4ODg4ODg4ODg4Ojo6Ojh4eH/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5eHh4eHo6Ojo4ODg4ODg4ODg4ODg4FZWVuH4+oH9+P///////////////////////////wD///////////////////////////+B/YGB+Pno6FZWVujo6Ojg4Ojg6Ojo6Ojh4eHm4eb//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Tm5uHh4eHo6Ojo6ODo4Ojg6OjoVlZWVuj5+vrz/YH/////////////////////////////AP////////////////////////////+B/vOB+vnh6OjoVujo6Ojo6Ojo6Ojh4eHh4eHm5ub////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////k5ubm4eHh4eHo6Ojo6Ojo6Ojo6FboVujh+fqB8/6B//////////////////////////////8A///////////////////////////////z/e/z+vn54ejo6Ojh4eHh4eHh4eHh4eHm5ubm5eX/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5OXl5ubm5uHh4eHh4eHh4eHh4ejo6Oj5+fn68+/98////////////////////////////////wD////////////////////////////////8/e/z+vj5+fnh6Ojh4eHh4ebh5uHm5ubm5eXl5eX//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Pl5eXl5ebm5ubh5uHm4eHh4eHo6OHh+fn4+vPv/fz/////////////////////////////////AP////////////////////////////////7f/e/z+vj4+fn5+eH55vnm5vjm5ubm5ubl5eTl5OT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////j5OTk5eXl5ubm5ubm+Obm5vn5+eH5+fn4+Prz7/3f/v////////////////////////////////8A///////////////////////////////////+/e/zgfr4+Pj5+ebm+Pj45eXl5eXl5eXl5eTk5OT/////////////////////////////////////////////////////////////////////////////////////////////////////////////////4+Tk5OTl5eXl5eXl5eXl+Pj45ub5+Pn4+PqB8+/9/v7//////////////////////////////////wD//////////////////////////////////6z+/f3zgfr6+Pj4+Pjl5eXl5frk5OTk5OTk5OTj5OP//////////////////////////////////////////////////////////////////////////////////////////////////////////////+7k4+Tk5OTk5OTk5OX65eX65fjl+Pj4+Pr6ge/v/f6s9v//////////////////////////////////AP///////////////////////////////////Pz+/f3v84H6+vr65fr6+oHk5OTk5OTk5OTk5OTj4+P////////////////////////////////////////////////////////////////////////////////////////////////////////////p4+Pj7+Tk5OTk5OTk5OTkgeT6+vrl+vr6gfPv/f3+/PzX//////////////////////////////////8A/////////////////////////////////////N/+/f3v8/P65Pr6geT65PPz8/Pv7+/v7+Pj4+Pj4+P/////////////////////////////////////////////////////////////////////////////////////////////////////////7ePu4+Pj4+Pv7+/v7/Pz8/Pk+oH6+vqB+vPz/f39/t/81////////////////////////////////////wD////////////////////////////////////229/+/f397/PzgeTkgfOB8+/v7/3j4+Pj4+Pj4+7u7u7//////////////////////////////////////////////////////////////////////////////////////////////////////+zu7u7j4+Pj4+Pj4+Pj7+/v84HzgeTk8/Pz7/39/f7f2/b4////////////////////////////////////AP/////////////////////////////////////arN/+/f79/e/v7/Pz8/Pz7/394+7u7u7u7u7u7u7p6en////////////////////////////////////////////////////////////////////////////////////////////////////r6enp7u7u7u7u7u7u7v394+/v8/Pz7+/v7/397v3+36za1/////////////////////////////////////8A///////////////////////////////////////YrN/+/v7u/e/v7+/v7/Pv7/397v7+6enp6enp6enp6f///////////////////////////////////////////////////////////////////////////////////////////////////+3p6enp6enp6enp6f7+7v3v7/Pv7+/v7+/97v7+/t+s2Nf//////////////////////////////////////wD////////////////////////////////////////Y3t/+/v7+7u/v/f3v7+/v/e7+7e3t7e3t7e3s7ezt7P////////////////////////////////////////////////////////////////////////////////////////////////Hs7O3s7ezt7e3t7e3t7f7u/f3v7+/j/e/v7v7+/v7frNjX////////////////////////////////////////AP/////////////////////////////////////////ZrPzf3+3+/f397u794/3z/vys3/zs/Ozs7Ozs7Ozs7P/////////////////////////////////////////////////////////////////////////////////////////////26+zs7Ozs7Ozs/Oz8/N+s/P7z7+P97u79/f3+39/f/KzZ1/////////////////////////////////////////8A///////////////////////////////////////////c3vzf39/+/f3+/v7++Ofi5+jb8ffr6+vr6+vr6+vr6/////////////////////////////////////////////////////////////////////////////////////////////Hr6+vr6+vr6+vr6/f39+Hi4uf4/v7p/v79/t/f/Pzb2df//////////////////////////////////////////wD////////////////////////////////////////////Z297839/f/v7t7e369fT0K+dW3/vY9/fx8fHx8fHx6//////////////////////////////////////////////////////////////////////////////////////////q6/Hx8fHx8ff38dj731bnK/T09frt7d/+/v7f3/ys29ny////////////////////////////////////////////AP//////////////////////////////////////////////2t7e/N/f39/f/P5W9Csr9PTnVvz29vHq6urq6urq6v//////////////////////////////////////////////////////////////////////////////////////6vHq6urq6urq6vbd/Fbn9PQrK/RW/vzf39/f/Pze3tr71/////////////////////////////////////////////8A///////////////////////////////////////////////d2NrerPz83/zf/P344vT0K/Qr51bz8vLw8PDw8PDq6v////////////////////////////////////////////////////////////////////////////////////Dq6vDw8PDw8PLy8+jnK/Qr9PTi+P38/N/f/Pze3trY3dfz/////////////////////////////////////////////wD//////////////////////////////////////////////9f23Nja296s/Pz8rPz9gfhW9fT09PXo4fLy9vDw8PDw6v/////////////////////////////////////////////////////////////////////////////////w6vDw8PDw9vLy4ej19PT09Vb4gf38rPz8/Kze29rY3PbXgf//////////////////////////////////////////////AP///////////////////////////////////////////////9f23dzZ2NrbrKysrNvY3v7v8/pW9fT0Vujb8tfw8PDw6v/////////////////////////////////////////////////////////////////////////////28Orw8PDw8tfb6Fb09PVW+vPv/qzY26ysrKzb2tnZ3N321/r///////////////////////////////////////////////8A/////////////////////////////////////////////////9fX9t3d3NnY2trb3t7b2tnc2v7v8/P6+vjh6Pby8PDw8PD/////////////////////////////////////////////////////////////////////////8PDw8PDw8vbh6Pj6+vPz7/7a2dna29ve29ra2Nzc3N321////////////////////////////////////////////////////wD////////////////////////////////////////////////////X1/bd3d3c3NnY2tra29vb2Nnc3Nzc/fr63OH28Nfw8PD///////////////////////////////////////////////////////////////////////Dw8PDy9vbh3Pr6/dzc3NzZ2Nvb29ra2tjZ3Nzd3d3219f/////////////////////////////////////////////////////AP//////////////////////////////////////////////////////19f23d3d3N3c3NnZ2Nra2tra29vY3Nzb+Nz76Pbw8PD/////////////////////////////////////////////////////////////////9vbw8PDw9uj72fjb3NzY29ra2tra2NjY2dzc3N3d3d3219f///////////////////////////////////////////////////////8A/////////////////////////////////////////////////////////9fX19f23d3d3dzd3dzc3NnZ2dna2tvc3tv52fvw8PD29v////////////////////////////////////////////////////////////b29vDw8Pvc+dve3Nva2tnZ2dnc3Nzc3d3d3d3d9tfX19f//////////////////////////////////////////////////////////wD//////////////////////////////////////////////////////////////tfX19fX9t3d3d3d3d3d3NzZ2tre3tze29rY+93w9vb////////////////////////////////////////////////////////d9vbw+9ja3t7c3t7a2tnc3Nzd3d3d3d3d9tfX19fX/u//////////////////////////////////////////////////////////////AP///////////////////////////////////////////////////////////////////f7X19fX19fX19fy8vLy8tnY2trb29vY+9323fbd9v/////y8tfX19fX19fX19fX19fX19fX19fX19fX19fy1/Ly8vb29t323fvY29vb2trY2fLy8vLy19fX19fX19fX/v3z+Pn1//////////////////////////////////////////////////////////////8A///////////////////////////////////////////////////////////////////19fj4gfPv7/39/f7+/oH49t3/////////////////9t3w3fbX19fX19fX19fX19fX19fX19fX19fX19fX19fy8vLy8vb//////////////932+IH+/v79/f3v7/OB+Pj19Sv09Cv//////////////////////////////////////////////////////////////62tvpqb3Y+CAAAAAElFTkSuQmCC");
			kop34_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABrFJREFUeNrs201vG8cZwPH/DHep5ctKZCwZUhPKTQzDApK2QHUu0PYDBPCtBZq0gFFAMNBLUl4iJAVSpEAt5VjCtwIuCjQ+xB8ih16kAkZTIC5qJ6LUWJYoS/KulxRndqaHJSXasiPaRc3dwnNaragVf5wZztvzCMv/oHzxDb97BcD6RzduUlt+Hwx0kEu/xuH7q8x//nT/UTxnR6LgawDXOKDBzgBs9F9y3nStlPk0OIYoN2G6dFs61khirAQBKMACnI9K2XAQYKSh9GVtkzinsYAk0aCwwFwmHAQYQOrd+OWtmDivAQwCpOhZ5rLgAPaBXCz17jjVrwzS2DxoMEIiQA0vGa2DfQBy/y6Wx5apY4q3LMIBNEZIgbJDQuRIGUxINMTT1btbv/qHlO5PKq986+xql9UbN/7uWh07+ZtffJiB+gD2tQMgBbvlkgXx1h+XF8X1C7CG6JLT9toHWXCwr3GS5mWdzsJV5ldpVccErNdYE9o43TOFLDjY7zi9qxbnfvrxFPOsvv0Xuw5QWxNadufS3j+STuLopIxXXtv+c/z2Nqv8aSesVmdnWZezN6QbZKI+4K44vPzsTdiUWO8UYJBNaqwZNZcJR9Dutywqe5X1lQuiY/ACfJBNqF3/bjyXBQd3XRzt6L7Gx3QAjw5qAmiufMfMZcFBMgPulZl9nw5IA+Ahh4CkxrGlodirjQD/3ksdmcy38ADZXPmensuCg3uyN28HoAhyqb4HFTAeyKY9qBWz4OBrdxAB8KDBJWjUyYNsrrw+lwlHAtFHP7uNS8lFo248pOWfc5lwsKeOFG6/ZoCIxrt48tM3zmfDwV77UNBT3K9ggKhRN55EZMTBtsZV7lGtVPYqbE9hICoZb2NWZMTBtnbRjgaUq1wFUCZkChOVjCdkVhzcSWpDDdwqAwUIS8brFlI8332ozChAKaDcL7DAz9uUH3zc9T7MSn3AHYHq1ULgB4APC8CVQtio5z/6ICsOWu2e4qG7dVg+FTUWD4qZaFfAZMEtQxAk709KKSWSJSjvFC99NBZlpT4g2CsHxz9l41MwyywqXc6IAzbHAgkcjXy252CZRY5LZDoZTFfzxgwwEAIZsH0f6HbGSp0wG/UBsNlFHlIsYPBD11HjHkgOvKw4oJULBlqMwSd0cVQldCcG21zqHUCrbZFGggF8QlwHNR65RGUYz44DCA7aZXoDYoiLo6iELkSAM2nVZd7LhOPQ87ibhdvw6pevZcmRif2SF44XjheOF44TivN/MXrcyoAjyO0ki5Gj0Xw8wo0A/nrhrLrMezCd8nbValtAGjk4u6qEbsRDs6t0949HZ7v4oYujHI7NdtPcPza7SImworf6kMYHHDWOB4+sPtLr2OySbOcmH7vAAqHrNKjnJQfH1rXpbFePX52HnIoo5VGachb2fYL1sQBjAGstFmuTD7s8BY28amt1fL8khY7WgzK+DyahYDEY826d0NBYVHr3YpUMOFptFYbgA5ikYOr1JQqnouXFXX2x9kkW5iUDu7sQgB/4BHWuUDDLvP/bdy5+kon51R3B4bFHvyxwhXAqbNS9JzLS5nj86Uc41Tv9iFX1CX+Yrv6x7eI4gOsOMMJCjyGazpMY6XJsa6VUMjS7bsF1XXeKQmEKYy6XjLchrJeJ9UfvtLYfLZOc1oLpn9bezEYcwBNOzyMa1I0nP33jjJcFx6PRDIfn6ENEM6TIcf/g6LoogSXgEg3qGO+k6JL0OO7JqPhotM/SL4eN9kmNY0tTjA7faBJFBhhpkugrE+tvjodLyfeuBxFRFEVRNDExASCNCUOMF0gpm0bp32Rg3+euS8cbiE7cxwWilwaiE7/tpd8RtJ3+oKEn94KVH1UjPAh8kMEutTUdn8RIxbo2Err/jfvZm61Xf/ygbb0kJE42YcWYePIkRhr6xw42KdXq3g9zxZ/9YGryNEEQ+HKjSc3M69PXJk98yOjb1c5hv8gb/7HR7cMks4zcsd8PP85Z5xccZRus1+hlGwyVySJHz8ABmcvt7uWuXkW8Hv9+2mtC7fpaM1bCDscYcX0ERjtAbuNsuHAV8dYfSqb4lcrbv8G8tkgxdF7RSB297CirGVuGuineEsbmAY3JIbKS55Vkq20WZ37H4m0kz56tNlLHPiC1T3dLYfMaSAJjEsRTZQ+O0BFgpCmhN63JaSP4r7I5R+YYyK4VuteOkm2Slzee2vD8Hf8ygJBCAW4sAJMTCsDt9l5yXjzTk5/v+CFyuZyTS97p6ZlYxrHVpz93wInPnavVzlybnVXP9uT/DADjuRVfTGbbYQAAAABJRU5ErkJggg== ");
			kop34_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABrFJREFUeNrs201vG8cZwPH/DHep5ctKZCwZUhPKTQzDApK2QHUu0PYDBPCtBZq0gFFAMNBLUl4iJAVSpEAt5VjCtwIuCjQ+xB8ih16kAkZTIC5qJ6LUWJYoS/KulxRndqaHJSXasiPaRc3dwnNaragVf5wZztvzCMv/oHzxDb97BcD6RzduUlt+Hwx0kEu/xuH7q8x//nT/UTxnR6LgawDXOKDBzgBs9F9y3nStlPk0OIYoN2G6dFs61khirAQBKMACnI9K2XAQYKSh9GVtkzinsYAk0aCwwFwmHAQYQOrd+OWtmDivAQwCpOhZ5rLgAPaBXCz17jjVrwzS2DxoMEIiQA0vGa2DfQBy/y6Wx5apY4q3LMIBNEZIgbJDQuRIGUxINMTT1btbv/qHlO5PKq986+xql9UbN/7uWh07+ZtffJiB+gD2tQMgBbvlkgXx1h+XF8X1C7CG6JLT9toHWXCwr3GS5mWdzsJV5ldpVccErNdYE9o43TOFLDjY7zi9qxbnfvrxFPOsvv0Xuw5QWxNadufS3j+STuLopIxXXtv+c/z2Nqv8aSesVmdnWZezN6QbZKI+4K44vPzsTdiUWO8UYJBNaqwZNZcJR9Dutywqe5X1lQuiY/ACfJBNqF3/bjyXBQd3XRzt6L7Gx3QAjw5qAmiufMfMZcFBMgPulZl9nw5IA+Ahh4CkxrGlodirjQD/3ksdmcy38ADZXPmensuCg3uyN28HoAhyqb4HFTAeyKY9qBWz4OBrdxAB8KDBJWjUyYNsrrw+lwlHAtFHP7uNS8lFo248pOWfc5lwsKeOFG6/ZoCIxrt48tM3zmfDwV77UNBT3K9ggKhRN55EZMTBtsZV7lGtVPYqbE9hICoZb2NWZMTBtnbRjgaUq1wFUCZkChOVjCdkVhzcSWpDDdwqAwUIS8brFlI8332ozChAKaDcL7DAz9uUH3zc9T7MSn3AHYHq1ULgB4APC8CVQtio5z/6ICsOWu2e4qG7dVg+FTUWD4qZaFfAZMEtQxAk709KKSWSJSjvFC99NBZlpT4g2CsHxz9l41MwyywqXc6IAzbHAgkcjXy252CZRY5LZDoZTFfzxgwwEAIZsH0f6HbGSp0wG/UBsNlFHlIsYPBD11HjHkgOvKw4oJULBlqMwSd0cVQldCcG21zqHUCrbZFGggF8QlwHNR65RGUYz44DCA7aZXoDYoiLo6iELkSAM2nVZd7LhOPQ87ibhdvw6pevZcmRif2SF44XjheOF44TivN/MXrcyoAjyO0ki5Gj0Xw8wo0A/nrhrLrMezCd8nbValtAGjk4u6qEbsRDs6t0949HZ7v4oYujHI7NdtPcPza7SImworf6kMYHHDWOB4+sPtLr2OySbOcmH7vAAqHrNKjnJQfH1rXpbFePX52HnIoo5VGachb2fYL1sQBjAGstFmuTD7s8BY28amt1fL8khY7WgzK+DyahYDEY826d0NBYVHr3YpUMOFptFYbgA5ikYOr1JQqnouXFXX2x9kkW5iUDu7sQgB/4BHWuUDDLvP/bdy5+kon51R3B4bFHvyxwhXAqbNS9JzLS5nj86Uc41Tv9iFX1CX+Yrv6x7eI4gOsOMMJCjyGazpMY6XJsa6VUMjS7bsF1XXeKQmEKYy6XjLchrJeJ9UfvtLYfLZOc1oLpn9bezEYcwBNOzyMa1I0nP33jjJcFx6PRDIfn6ENEM6TIcf/g6LoogSXgEg3qGO+k6JL0OO7JqPhotM/SL4eN9kmNY0tTjA7faBJFBhhpkugrE+tvjodLyfeuBxFRFEVRNDExASCNCUOMF0gpm0bp32Rg3+euS8cbiE7cxwWilwaiE7/tpd8RtJ3+oKEn94KVH1UjPAh8kMEutTUdn8RIxbo2Err/jfvZm61Xf/ygbb0kJE42YcWYePIkRhr6xw42KdXq3g9zxZ/9YGryNEEQ+HKjSc3M69PXJk98yOjb1c5hv8gb/7HR7cMks4zcsd8PP85Z5xccZRus1+hlGwyVySJHz8ABmcvt7uWuXkW8Hv9+2mtC7fpaM1bCDscYcX0ERjtAbuNsuHAV8dYfSqb4lcrbv8G8tkgxdF7RSB297CirGVuGuineEsbmAY3JIbKS55Vkq20WZ37H4m0kz56tNlLHPiC1T3dLYfMaSAJjEsRTZQ+O0BFgpCmhN63JaSP4r7I5R+YYyK4VuteOkm2Slzee2vD8Hf8ygJBCAW4sAJMTCsDt9l5yXjzTk5/v+CFyuZyTS97p6ZlYxrHVpz93wInPnavVzlybnVXP9uT/DADjuRVfTGbbYQAAAABJRU5ErkJggg== ");
			kop14_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABtVJREFUeNrs2c1vG8cZx/Hv7Ctt0qRkhrIpW9zENhADKVqgBqpTb7mkJ6MnB0gLFL4rgIFGEODm4AoVnAICqrvRoscCLfwH5NZehCJB7fogJ7VdipaoWJUorkSK+/r0sKREN3EiSpQSFPs7kTvk7Hz4zA5nSSUMmjY6d2+F5EHBr6fj+qX+5t16caNcffXbLwAYp/YPPC1rd38FAi7G/DQRP1pk8tFgg1KDO2L1+KUx1UVDQXR5uVwv18ungG1WXslYuQAG1Mv1yhMdhFiVgf13vCltU4Wnj9UhjwGceu8pkcIg1iKJLy8XLU4duKenZfzsE80g1ggRHVTSkNTyzebIsTmWegRRCESAQiktqvz7UgsGUQC74EO2OrGsxyIIoNPTlKvA1WNxLOHUQZQQIRqAIjKQiefORt6HwqDzcxcfsNziU6emCHUBiEF1a1OuDiA5qKOrIBINFERKB96IWDZLfr18CAZAE9AM1oMK+jMgEh0EYqWjBpIczLGEU0ci0VA6kYgeX2ka2MRf2PkwhkMyEghoxro9ouERFv4lKIUeCbEBqlw9IEQ7EMOxVsMg1h49fPgg8vUrY+dev2Ep9d5mbbThx+AXDsmgYOFD7I82apvvKWXdeH187MqDKHrw8OEjiaNw1dpdCoZVjyVnNdSU/ul1uH9dzU7//PcCatsbxfAB/BJHSNO3AKyQhn1GQP3ij3dvy/3rcP+HkcTGePVPHw7H8TTQjE+vU5uoTajgxVkmFyc/fv+eEAPgcyQGNH2s7txQLXl7cXKRzTFTqDHBMmFs+hdzQ5lXkWVUrtVq1Ca0d8N3Jlncfqv0B106vu/7/pEZFLCTnjodvVV6a3uRyXfCdzWgVqtUDCu68nwY9fhM0ys1cGjAmUCY/Pj9uxefOPhJs/8aR866Sgpi4dcvP5/+3duLKHMb14EqE/d/EJfPHNnxRKvUwBEU4DcCU22PWTv77UNggOvvP87BC4U5arFeQlSVCZ7F8dUjzqvP/lGpkXcEtrZkxcxdLP3NyLZGVS9DYWDS629Umeba38cv5nZXxNwSxKFWe+Of2tLR6vHYUg6wpcjjAvnmSKO3t1KipMhw4gYoUdLdYjG6VcCFnXEXGQGqn3xPrh7B8fjRNQe2Ci4ARkie5gjre+1jDC2b4f7jElsFFyM5km+OHADytY7PH15zRAkuGABhntXsXmswVMd/YjD71rDVHAaEQJ5mQVU/+X509ZDXx6665gjito2FVnOeeXDd8VY3YJpDZPCabpr0Om+tujmMeeZbLcNouwXEuaYc75AOy3AEt23YzZmxezftmxiG4eZyuRxAq9UaZZgpSqu7YOVyuZxhGNy0GRuz522jDeIY1rPDzasITXCN+RlgvQRzN/tvqOAiQ84LH3Kt/ef3bo51z3wrzKNiPr96GMeffyq052eS7ccGQOkF+4vV0BnQaO+tWKjSOqX14kYR0JibIq/+8pNTh3GIuMb8TAyKDc52Kb1iJLfmw85ztXdHCFCETYqiBG3uVphXfU0Hdki14hp2jALWzm8UNzi72UWIkuNhJBDVo5zdhCKsnQdB88L8sqMGdkTKNexYwZqNB2AGZmB2i8E4x5Tn3TtmCMzADABsPM4jmhfmRR/UsXPaNWxhzQa8l3YQIMfHgJVk9vTfPNnAKCgvzLdzg627d7LtBVvWGjZTYHcDEASgjpHBBVHJWfZOa8MUP2usib3Qzt4ZqB53bs8yrRpMwQLQIdPJkFTGDMwyx5oVjaBbBTqZTqaTgSlgYVThnZ798OCOQJ+diVVjCj7qP5xJJBWOOathl9HpP/oB/PacNnc7sA/q8MzZmfiLX8JHtmd7fVdIBjjH8WdVaXuIZNQe8AEL3ishX+HwjdmZWDXo7L8+MLuWzEkwYLthd/YMex8vGUZFm7sdeme++Tr3sWZnUN0SBEkIwLZtnJNhcKYSZxJG0EtXpWDWyPrb3+gw4x3m4o01u2Mny8beJt0773BiKZ+z8PqX3yDA7rC2Ec/Qxsz9r+RL8yp2aSkV2HSwe/2YgHeCiG7q/v4QkjFk8EzJcxoUgfVqh7DVyrWUIrA7/dPzW0AkF7ze6R8FZDwTkcJWduSljVifQxoQmi1yLYUKsJP1wgaPbwnRW4SlNw7I4GEKkt3JEhhwdt8R/GZGDLn/Y8CkRa6FUiRXVefE1qevz24jtOn0vr9MRMjukCUA/npdhWruxiW15FQpn/7Sb8G+xWB/y5yE5yt/MnpSrjvVy4f4f/A7mdSROlJH6kgdqSN1pI7UkTpSR+pIHakjdaSO1JE6UkfqSB2pI3WkjtSROlJH6kgdqSN1pI7vWrT/Dwb/HQCWcg5gw1gsvgAAAABJRU5ErkJggg== "); 
			kop14_png  = url("data:/img/png;base64,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//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABtVJREFUeNrs2c1vG8cZx/Hv7Ctt0qRkhrIpW9zENhADKVqgBqpTb7mkJ6MnB0gLFL4rgIFGEODm4AoVnAICqrvRoscCLfwH5NZehCJB7fogJ7VdipaoWJUorkSK+/r0sKREN3EiSpQSFPs7kTvk7Hz4zA5nSSUMmjY6d2+F5EHBr6fj+qX+5t16caNcffXbLwAYp/YPPC1rd38FAi7G/DQRP1pk8tFgg1KDO2L1+KUx1UVDQXR5uVwv18ungG1WXslYuQAG1Mv1yhMdhFiVgf13vCltU4Wnj9UhjwGceu8pkcIg1iKJLy8XLU4duKenZfzsE80g1ggRHVTSkNTyzebIsTmWegRRCESAQiktqvz7UgsGUQC74EO2OrGsxyIIoNPTlKvA1WNxLOHUQZQQIRqAIjKQiefORt6HwqDzcxcfsNziU6emCHUBiEF1a1OuDiA5qKOrIBINFERKB96IWDZLfr18CAZAE9AM1oMK+jMgEh0EYqWjBpIczLGEU0ci0VA6kYgeX2ka2MRf2PkwhkMyEghoxro9ouERFv4lKIUeCbEBqlw9IEQ7EMOxVsMg1h49fPgg8vUrY+dev2Ep9d5mbbThx+AXDsmgYOFD7I82apvvKWXdeH187MqDKHrw8OEjiaNw1dpdCoZVjyVnNdSU/ul1uH9dzU7//PcCatsbxfAB/BJHSNO3AKyQhn1GQP3ij3dvy/3rcP+HkcTGePVPHw7H8TTQjE+vU5uoTajgxVkmFyc/fv+eEAPgcyQGNH2s7txQLXl7cXKRzTFTqDHBMmFs+hdzQ5lXkWVUrtVq1Ca0d8N3Jlncfqv0B106vu/7/pEZFLCTnjodvVV6a3uRyXfCdzWgVqtUDCu68nwY9fhM0ys1cGjAmUCY/Pj9uxefOPhJs/8aR866Sgpi4dcvP5/+3duLKHMb14EqE/d/EJfPHNnxRKvUwBEU4DcCU22PWTv77UNggOvvP87BC4U5arFeQlSVCZ7F8dUjzqvP/lGpkXcEtrZkxcxdLP3NyLZGVS9DYWDS629Umeba38cv5nZXxNwSxKFWe+Of2tLR6vHYUg6wpcjjAvnmSKO3t1KipMhw4gYoUdLdYjG6VcCFnXEXGQGqn3xPrh7B8fjRNQe2Ci4ARkie5gjre+1jDC2b4f7jElsFFyM5km+OHADytY7PH15zRAkuGABhntXsXmswVMd/YjD71rDVHAaEQJ5mQVU/+X509ZDXx6665gjito2FVnOeeXDd8VY3YJpDZPCabpr0Om+tujmMeeZbLcNouwXEuaYc75AOy3AEt23YzZmxezftmxiG4eZyuRxAq9UaZZgpSqu7YOVyuZxhGNy0GRuz522jDeIY1rPDzasITXCN+RlgvQRzN/tvqOAiQ84LH3Kt/ef3bo51z3wrzKNiPr96GMeffyq052eS7ccGQOkF+4vV0BnQaO+tWKjSOqX14kYR0JibIq/+8pNTh3GIuMb8TAyKDc52Kb1iJLfmw85ztXdHCFCETYqiBG3uVphXfU0Hdki14hp2jALWzm8UNzi72UWIkuNhJBDVo5zdhCKsnQdB88L8sqMGdkTKNexYwZqNB2AGZmB2i8E4x5Tn3TtmCMzADABsPM4jmhfmRR/UsXPaNWxhzQa8l3YQIMfHgJVk9vTfPNnAKCgvzLdzg627d7LtBVvWGjZTYHcDEASgjpHBBVHJWfZOa8MUP2usib3Qzt4ZqB53bs8yrRpMwQLQIdPJkFTGDMwyx5oVjaBbBTqZTqaTgSlgYVThnZ798OCOQJ+diVVjCj7qP5xJJBWOOathl9HpP/oB/PacNnc7sA/q8MzZmfiLX8JHtmd7fVdIBjjH8WdVaXuIZNQe8AEL3ishX+HwjdmZWDXo7L8+MLuWzEkwYLthd/YMex8vGUZFm7sdeme++Tr3sWZnUN0SBEkIwLZtnJNhcKYSZxJG0EtXpWDWyPrb3+gw4x3m4o01u2Mny8beJt0773BiKZ+z8PqX3yDA7rC2Ec/Qxsz9r+RL8yp2aSkV2HSwe/2YgHeCiG7q/v4QkjFk8EzJcxoUgfVqh7DVyrWUIrA7/dPzW0AkF7ze6R8FZDwTkcJWduSljVifQxoQmi1yLYUKsJP1wgaPbwnRW4SlNw7I4GEKkt3JEhhwdt8R/GZGDLn/Y8CkRa6FUiRXVefE1qevz24jtOn0vr9MRMjukCUA/npdhWruxiW15FQpn/7Sb8G+xWB/y5yE5yt/MnpSrjvVy4f4f/A7mdSROlJH6kgdqSN1pI7UkTpSR+pIHakjdaSO1JE6UkfqSB2pI3WkjtSROlJH6kgdqSN1pI7vWrT/Dwb/HQCWcg5gw1gsvgAAAABJRU5ErkJggg== "); 
			btn_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAAA+CAMAAABtGKfxAAACT1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgID///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAABAgID///+AAAD/AP+lmdfcAAAAwHRSTlM8ODQwLCgkIBwYFBAMCAQAQERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+PxTzsGTAAAAAWJLR0TEFAwb4QAAARNJREFUeJxjOEwLwHD4ABzY29naWFtZWpibmZoYGxka6Ovp6mhraWqoq6mqKCspKsjLycpIS0lKiIuJiggLCQowMDIxs7CysXNwcnHz8PLxw8GoqaOmjpo6auqoqaOm0szUg3BQX1dbU11VWVFeVlpSXFRYkJ+Xm5OdlZmRnpaakpyUmBAfFxsTHRUZER4WGhIcFBjg7+fr4+3l6eHu5uri7OToAAejpo6aOmrqqKmjpo6aSjNTD8HB/n179+zetXPH9m1bt2zetHHD+nVr16xetXLF8mVLlyxetHDB/Hlz58yeNXPG9GlTp0yeNHFCf19vT3dXZ0d7W2tLc1NjAxyMmjpq6qipo6aOmjpqKs1MpQUAAIrvy8PKBZ9nAAAAAElFTkSuQmCC");
			btn_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAAA+CAMAAABtGKfxAAACT1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgIBAgID///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAABAgID///+AAAD/AP+lmdfcAAAAwHRSTlM8ODQwLCgkIBwYFBAMCAQAQERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj8AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+PxTzsGTAAAAAWJLR0TEFAwb4QAAARNJREFUeJxjOEwLwHD4ABzY29naWFtZWpibmZoYGxka6Ovp6mhraWqoq6mqKCspKsjLycpIS0lKiIuJiggLCQowMDIxs7CysXNwcnHz8PLxw8GoqaOmjpo6auqoqaOm0szUg3BQX1dbU11VWVFeVlpSXFRYkJ+Xm5OdlZmRnpaakpyUmBAfFxsTHRUZER4WGhIcFBjg7+fr4+3l6eHu5uri7OToAAejpo6aOmrqqKmjpo6aSjNTD8HB/n179+zetXPH9m1bt2zetHHD+nVr16xetXLF8mVLlyxetHDB/Hlz58yeNXPG9GlTp0yeNHFCf19vT3dXZ0d7W2tLc1NjAxyMmjpq6qipo6aOmjpqKs1MpQUAAIrvy8PKBZ9nAAAAAElFTkSuQmCC");
			btn_n_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABVCAMAAAAmLKfvAAAAB3RJTUUH3wMGFB0CRzonygAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAHGSURBVHja7ctVowgGAAbQK6ab6e7e1HR3LLRhuiaG6Y4xTBvTOb0xMd3uH/P9gPPkvt7zfgoKi6SgsCoMgp1Q3Iv75/UqMBh2QXplGAK7Ib0SDIXfIL0iDIM9kF4BhsNeSC8PI+B3SC8HI2EfpJeFUbAf0svAaDgA6V/AGPgD0kvDWDgI6aVgHByC9JLwLRyG9BLwHRyB9AL4Ho5CejX4AY5BenUYD8chvQZMgBOQXhMmwp+QXgsmwUlI/xImwylIrw1T4C9IrwNT4TSk14VpcAbS68GPcBbS68N0OAfpDWAGnIf0hjATLkB6I/gJLkJ6Y5gFlyC9CcyGy5DeFObAFUhvBnPhKqQ3h3lwDdJbwHz4G9JbwgK4DumtYCHcgPTWsAhuQnobWAy3IL0tLIHbkN4OfoY7kN4elsJdSO8Ay+AfSO8Iy+FfSO8EK+AepHeGX+A+pH8FK+E/SP8aVsEDSO8Cq+EhpHeFX+ERpHeDNfAY0rvDWvgf0nvAOngC6d/AengK6T1hAzyD9F6wEZ5Dem/YBC8gvQ9shpeQ3he2wCtI7wdb4TWk94dt8AbSB8B2eAvpA2EHvIP09/ABPkJxL+6f14vkEzs8y8O5aXg1AAAAAElFTkSuQmCC");
			btn_n_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABVCAMAAAAmLKfvAAAAB3RJTUUH3wMGFB0CRzonygAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAHGSURBVHja7ctVowgGAAbQK6ab6e7e1HR3LLRhuiaG6Y4xTBvTOb0xMd3uH/P9gPPkvt7zfgoKi6SgsCoMgp1Q3Iv75/UqMBh2QXplGAK7Ib0SDIXfIL0iDIM9kF4BhsNeSC8PI+B3SC8HI2EfpJeFUbAf0svAaDgA6V/AGPgD0kvDWDgI6aVgHByC9JLwLRyG9BLwHRyB9AL4Ho5CejX4AY5BenUYD8chvQZMgBOQXhMmwp+QXgsmwUlI/xImwylIrw1T4C9IrwNT4TSk14VpcAbS68GPcBbS68N0OAfpDWAGnIf0hjATLkB6I/gJLkJ6Y5gFlyC9CcyGy5DeFObAFUhvBnPhKqQ3h3lwDdJbwHz4G9JbwgK4DumtYCHcgPTWsAhuQnobWAy3IL0tLIHbkN4OfoY7kN4elsJdSO8Ay+AfSO8Iy+FfSO8EK+AepHeGX+A+pH8FK+E/SP8aVsEDSO8Cq+EhpHeFX+ERpHeDNfAY0rvDWvgf0nvAOngC6d/AengK6T1hAzyD9F6wEZ5Dem/YBC8gvQ9shpeQ3he2wCtI7wdb4TWk94dt8AbSB8B2eAvpA2EHvIP09/ABPkJxL+6f14vkEzs8y8O5aXg1AAAAAElFTkSuQmCC");
			btn_s_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABVCAMAAAAmLKfvAAAAB3RJTUUH3wMGFB0Us+6SmwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAHGSURBVHja7ctVowgGAAbQK6ab6e7e1HR3LLRhuiaG6Y4xTBvTOb0xMd3uH/P9gPPkvt7zfgoKi6Sg8D18gI9Q3Iv75/WBsAPeQfoA2A5vIb0/bIM3kN4PtsJrSO8LW+AVpPeBzfAS0nvDJngB6b1gIzyH9J6wAZ5B+jewHp5Ceg9YB08gvTushf8hvRusgceQ3hV+hUeQ3gVWw0NI/xpWwQNI/wpWwn+Q3hl+gfuQ3glWwD1I7wjL4V9I7wDL4B9Ibw9L4S6kt4Of4Q6kt4UlcBvS28BiuAXprWER3IT0VrAQbkB6S1gA1yG9BcyHvyG9OcyDa5DeDObCVUhvCnPgCqQ3gdlwGdIbwyy4BOmN4Ce4COkNYSZcgPQGMAPOQ3p9mA7nIL0e/AhnIb0uTIMzkF4HpsJpSK8NU+AvSP8SJsMpSK8Fk+AkpNeEifAnpNeACXAC0qvDeDgO6dXgBzgG6QXwPRyF9BLwHRyB9JLwLRyG9FIwDg5BemkYCwch/QsYA39AehkYDQcgvSyMgv2QXg5Gwj5ILw8j4HdIrwDDYS+kV4RhsAfSK8FQ+A3SK8MQ2A3pVWAw7IL0qjAIdkJxL+6f14vkE2w6y8NwNQP6AAAAAElFTkSuQmCC");
			btn_s_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABVCAMAAAAmLKfvAAAAB3RJTUUH3wMGFB0Us+6SmwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAHGSURBVHja7ctVowgGAAbQK6ab6e7e1HR3LLRhuiaG6Y4xTBvTOb0xMd3uH/P9gPPkvt7zfgoKi6Sg8D18gI9Q3Iv75/WBsAPeQfoA2A5vIb0/bIM3kN4PtsJrSO8LW+AVpPeBzfAS0nvDJngB6b1gIzyH9J6wAZ5B+jewHp5Ceg9YB08gvTushf8hvRusgceQ3hV+hUeQ3gVWw0NI/xpWwQNI/wpWwn+Q3hl+gfuQ3glWwD1I7wjL4V9I7wDL4B9Ibw9L4S6kt4Of4Q6kt4UlcBvS28BiuAXprWER3IT0VrAQbkB6S1gA1yG9BcyHvyG9OcyDa5DeDObCVUhvCnPgCqQ3gdlwGdIbwyy4BOmN4Ce4COkNYSZcgPQGMAPOQ3p9mA7nIL0e/AhnIb0uTIMzkF4HpsJpSK8NU+AvSP8SJsMpSK8Fk+AkpNeEifAnpNeACXAC0qvDeDgO6dXgBzgG6QXwPRyF9BLwHRyB9JLwLRyG9FIwDg5BemkYCwch/QsYA39AehkYDQcgvSyMgv2QXg5Gwj5ILw8j4HdIrwDDYS+kV4RhsAfSK8FQ+A3SK8MQ2A3pVWAw7IL0qjAIdkJxL+6f14vkE2w6y8NwNQP6AAAAAElFTkSuQmCC");
			btn_e_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAAA+CAMAAABtGKfxAAAAB3RJTUUH3wMGFBwh/EZn+QAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAETSURBVHjaYzhMC8Bw+AAc2NvZ2lhbWVqYm5maGBsZGujr6epoa2lqqKupqigrKSrIy8nKSEtJSoiLiYoICwkKMDAyMbOwsrFzcHJx8/Dy8cPBqKmjpo6aOmrqqKmjptLM1INwUF9XW1NdVVlRXlZaUlxUWJCfl5uTnZWZkZ6WmpKclJgQHxcbEx0VGREeFhoSHBQY4O/n6+Pt5enh7ubq4uzk6AAHo6aOmjpq6qipo6aOmkozUw/Bwf59e/fs3rVzx/ZtW7ds3rRxw/p1a9esXrVyxfJlS5csXrRwwfx5c+fMnjVzxvRpU6dMnjRxQn9fb093V2dHe1trS3NTYwMcjJo6auqoqaOmjpo6airNTKUFAACK78vDr8GZlgAAAABJRU5ErkJggg==");
			btn_e_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAAA+CAMAAABtGKfxAAAAB3RJTUUH3wMGFBwh/EZn+QAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAETSURBVHjaYzhMC8Bw+AAc2NvZ2lhbWVqYm5maGBsZGujr6epoa2lqqKupqigrKSrIy8nKSEtJSoiLiYoICwkKMDAyMbOwsrFzcHJx8/Dy8cPBqKmjpo6aOmrqqKmjptLM1INwUF9XW1NdVVlRXlZaUlxUWJCfl5uTnZWZkZ6WmpKclJgQHxcbEx0VGREeFhoSHBQY4O/n6+Pt5enh7ubq4uzk6AAHo6aOmjpq6qipo6aOmkozUw/Bwf59e/fs3rVzx/ZtW7ds3rRxw/p1a9esXrVyxfJlS5csXrRwwfx5c+fMnjVzxvRpU6dMnjRxQn9fb093V2dHe1trS3NTYwMcjJo6auqoqaOmjpo6airNTKUFAACK78vDr8GZlgAAAABJRU5ErkJggg==");
			btn_w_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAAA+CAMAAABtGKfxAAAAB3RJTUUH3wMGFBwV3fKTTAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAETSURBVHjaYzhMC8BwmB8O+Hh5uLk4OdjZWFmYmRgZBASFhEVExcQlJKWkZWTl5BUUlZRVVNXUNTS1tHV09fQNDI2MTUzNzC0sraxtbO3sD8DBqKmjpo6aOmrqqKmjptLMVAc4cHRydnF1c/fw9PL28fXzDwgMCg4JDQuPiIyKjomNi09ITEpOSU1Lz8jMys7JzcsvKCwqLiktK6+orKquqa2rPwgHo6aOmjpq6qipo6aOmkozUxvgoLGpuaW1rb2js6u7p7evf8LESZOnTJ02fcbMWbPnzJ03f8HCRYuXLF22fMXKVavXrF23fsPGTZu3bN22fcfOXbv37N23/xAcjJo6auqoqaOmjpo6airNTKUFAACeeMvDg3itZwAAAABJRU5ErkJggg==");
			btn_w_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFUAAAA+CAMAAABtGKfxAAAAB3RJTUUH3wMGFBwV3fKTTAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICAQICA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAQICA////gAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiIMFwAAABB0Uk5T////////////////////AOAjXRkAAAETSURBVHjaYzhMC8BwmB8O+Hh5uLk4OdjZWFmYmRgZBASFhEVExcQlJKWkZWTl5BUUlZRVVNXUNTS1tHV09fQNDI2MTUzNzC0sraxtbO3sD8DBqKmjpo6aOmrqqKmjptLMVAc4cHRydnF1c/fw9PL28fXzDwgMCg4JDQuPiIyKjomNi09ITEpOSU1Lz8jMys7JzcsvKCwqLiktK6+orKquqa2rPwgHo6aOmjpq6qipo6aOmkozUxvgoLGpuaW1rb2js6u7p7evf8LESZOnTJ02fcbMWbPnzJ03f8HCRYuXLF22fMXKVavXrF23fsPGTZu3bN22fcfOXbv37N23/xAcjJo6auqoqaOmjpo6airNTKUFAACeeMvDg3itZwAAAABJRU5ErkJggg==");
			dragon_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAV0AAAH+CAMAAAAI3i3FAAAAB3RJTUUH4wIIEhsKtTHtmQAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFsCIdvScaqS0xtiwvyQ4SxCUgwDEbwjAu1QkO0hQR0B4S0hwezi0U1i0U0ioh0ist3gAI3ggI5wAI4wER3gwM5BUI4goU4xIX4SIL5ykI3ikQ5C4N3hwY4i0U5CQZ4Sco8wAE9wAI7wgI7xAI9wgI9xAI/wAA/wAI/wgI/xAI7wAQ7wgQ7wAY7wgY7xAQ7xAc7xgI9xgI/xgI7yEI7ykI9yUI7zUI9zkI7xwQ/yEI/y0I/zkI7xwY8SsQ7yMi6zEku0MezkUY2j8W2U8VxWEd0WQa3l4U2GwZ6jwQ60YQ6VIK7EoV61oI61QU614Q52wU9z0M+UQK904M/0oI/1II91IQ91oI/1oI814Q92MI92MQ/2MI72sI82cQ8XEQ/28InUY3mE5OsUktsUlCmGJJk2dXsGY0rGlKxUgsx0tA40oo3k0/yWQ7xnVE5Ggy330+jWtommpklntnkntzjH5+l358kIiKlJCStGlitH1rrYx6q5CP1Gdh035u0ZFr046KnJyUpZyUnJycoJygpaWcnKWlpZylpaWlrZ6OuZ2KraCcu6SUrZylramlt56evamcpaWtpa2traWttaWltampra2tra21rbW1uampva2lubWpu6+xtbW1tbW9tb29vbe3yqCE0KSG2qN52aSGxqSYz6GW26SP3LCUzKWj1qKi2qae46efyrKn0bao4bOi376jxq21xrW1vb29vcHGzre11rm1yMC9zsa53rKv27215bax67u42sex2sq96cay6867xr3GxsbGxsbOxs7OzsbGzsbOzs7Gzs7O1sbG1srK3sbGzs7W09DT1tbO1tbW1tbe3sbO3tDI4s7K6c7I4tbS597O4djY597W887I79bO99bO79bW797G897O797W99bW1t7e3t7e3t7n4uLi5+Li797e7+fW7+fe5+fn7+fn7+/n5+fv5+/v7+fv7+/v7+/37/f3997W997e997n9+fW9+fe9+fn9+/n9+/v9/fv9/f39/f/9/////f3///3/////ZWRgQAAAQB0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AFP3ByUAAINoSURBVHja7Jz/a9v2uscTyUJ2BbGPFOxfzOz8qq3rP1Daf8U6wgzhXywU23Isozbh3NyO02yjS7fRrP0lGXG7Xu7SpqTJLzdbIKkJGScJaYOhLCSm9j0Hc+BC8dW9Yff5SP4i+Vv8ra7p3QMdi2M70kuP3s+Xz6PPyO9/2Luzkfd9AB+0/UH3XdofdN+lDR1dLf8yq73vg+iXDRtd7Wzn1mL2fR9Fv2zY6BbTS7Kc/lCcd9joZlMyr6zmPhC8w0Y3owpOYXG78L6Poz82ZHS1A8Vpd8bnTz4M5x0uulr+UYihKe7GbuF/3vex9MOGi24+nfSxE24uuvX3D8J5h4tuNqVcmZhgApFnH0ZcGy66ENM+Abq8dO/DEN7hovsq6WSBLiZ+u9dl1qAV85nMq1fHmXzx/H2fzdDRVSiD7p0uczItn15Wk4qSVNcOi+/7bIaUbkD868/N6Z5rxUZ+ibz2+GBNVQSn0ynISzv59302w0Z3Q7DrdMMt6J4XzvYb+WV+/zF4bch35ROWZUj+1tYfdK2mbYSY1nTPi9mDjUdqKmPxXng1c7COvJZCn5+gHbiceHBSKBTz+SxYpmLwQz6fLxQHFDOHia6WXwu5/Iiu9NfGuntezKSQf4ZSRybvPS8cptSS18LHJxgCEyOx25t7hy9W11KppSUVWTIJ/1lKpZ6u7vztZWEweIeJbvFQ9dETOt3bjeiCi6ZTitPDME51q5wQw4vHGz+A27qR1yLHZYhAcDIaTcwtL6EAByZUDP0EmFPps4HgHSa6b5YVD+LDcI3pFg9TyZAPVJXiEw/2jGoOeTP47TVw2xJcO86FAW4kLgtO37UrYJcvfwLGwr/L6Mdr13whdXUgqjxEdLWDJKoldN/9ereO7vnbA3BcXZdJOXF3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");
			dragon_png  = url("data:/img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAV0AAAH+CAMAAAAI3i3FAAAAB3RJTUUH4wIIEhsKtTHtmQAAAAlwSFlzAAALEgAACxIB0t1+/AAAAwBQTFRFsCIdvScaqS0xtiwvyQ4SxCUgwDEbwjAu1QkO0hQR0B4S0hwezi0U1i0U0ioh0ist3gAI3ggI5wAI4wER3gwM5BUI4goU4xIX4SIL5ykI3ikQ5C4N3hwY4i0U5CQZ4Sco8wAE9wAI7wgI7xAI9wgI9xAI/wAA/wAI/wgI/xAI7wAQ7wgQ7wAY7wgY7xAQ7xAc7xgI9xgI/xgI7yEI7ykI9yUI7zUI9zkI7xwQ/yEI/y0I/zkI7xwY8SsQ7yMi6zEku0MezkUY2j8W2U8VxWEd0WQa3l4U2GwZ6jwQ60YQ6VIK7EoV61oI61QU614Q52wU9z0M+UQK904M/0oI/1II91IQ91oI/1oI814Q92MI92MQ/2MI72sI82cQ8XEQ/28InUY3mE5OsUktsUlCmGJJk2dXsGY0rGlKxUgsx0tA40oo3k0/yWQ7xnVE5Ggy330+jWtommpklntnkntzjH5+l358kIiKlJCStGlitH1rrYx6q5CP1Gdh035u0ZFr046KnJyUpZyUnJycoJygpaWcnKWlpZylpaWlrZ6OuZ2KraCcu6SUrZylramlt56evamcpaWtpa2traWttaWltampra2tra21rbW1uampva2lubWpu6+xtbW1tbW9tb29vbe3yqCE0KSG2qN52aSGxqSYz6GW26SP3LCUzKWj1qKi2qae46efyrKn0bao4bOi376jxq21xrW1vb29vcHGzre11rm1yMC9zsa53rKv27215bax67u42sex2sq96cay6867xr3GxsbGxsbOxs7OzsbGzsbOzs7Gzs7O1sbG1srK3sbGzs7W09DT1tbO1tbW1tbe3sbO3tDI4s7K6c7I4tbS597O4djY597W887I79bO99bO79bW797G897O797W99bW1t7e3t7e3t7n4uLi5+Li797e7+fW7+fe5+fn7+fn7+/n5+fv5+/v7+fv7+/v7+/37/f3997W997e997n9+fW9+fe9+fn9+/n9+/v9/fv9/f39/f/9/////f3///3/////ZWRgQAAAQB0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AFP3ByUAAINoSURBVHja7Jz/a9v2uscTyUJ2BbGPFOxfzOz8qq3rP1Daf8U6wgzhXywU23Isozbh3NyO02yjS7fRrP0lGXG7Xu7SpqTJLzdbIKkJGScJaYOhLCSm9j0Hc+BC8dW9Yff5SP4i+Vv8ra7p3QMdi2M70kuP3s+Xz6PPyO9/2Luzkfd9AB+0/UH3XdofdN+lDR1dLf8yq73vg+iXDRtd7Wzn1mL2fR9Fv2zY6BbTS7Kc/lCcd9joZlMyr6zmPhC8w0Y3owpOYXG78L6Poz82ZHS1A8Vpd8bnTz4M5x0uulr+UYihKe7GbuF/3vex9MOGi24+nfSxE24uuvX3D8J5h4tuNqVcmZhgApFnH0ZcGy66ENM+Abq8dO/DEN7hovsq6WSBLiZ+u9dl1qAV85nMq1fHmXzx/H2fzdDRVSiD7p0uczItn15Wk4qSVNcOi+/7bIaUbkD868/N6Z5rxUZ+ibz2+GBNVQSn0ynISzv59302w0Z3Q7DrdMMt6J4XzvYb+WV+/zF4bch35ROWZUj+1tYfdK2mbYSY1nTPi9mDjUdqKmPxXng1c7COvJZCn5+gHbiceHBSKBTz+SxYpmLwQz6fLxQHFDOHia6WXwu5/Iiu9NfGuntezKSQf4ZSRybvPS8cptSS18LHJxgCEyOx25t7hy9W11KppSUVWTIJ/1lKpZ6u7vztZWEweIeJbvFQ9dETOt3bjeiCi6ZTitPDME51q5wQw4vHGz+A27qR1yLHZYhAcDIaTcwtL6EAByZUDP0EmFPps4HgHSa6b5YVD+LDcI3pFg9TyZAPVJXiEw/2jGoOeTP47TVw2xJcO86FAW4kLgtO37UrYJcvfwLGwr/L6Mdr13whdXUgqjxEdLWDJKoldN/9ereO7vnbA3BcXZdJOXF3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");
			koeye_handhither_gif = url("data:/img/png;base64,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
			koeye_handhither_gif = url("data:/img/png;base64,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
");
");
			koeye_handhi_gif  = url("data:/img/png;base64,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
			koeye_handhi_gif  = url("data:/img/png;base64,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
");
");


			return(img);
			return(img);
			}
			}
		</script id="script_load_b64btn" >
		</script id="script_load_b64btn" >


	<script id="script_pdflist_show">
	<script id="script_pdflist_show">
		function script_pdflist_show() {
		function script_pdflist_show() {
			var z = 0; var pdfout=""; var len=pdflist.length;
			var z = 0; var pdfout=""; var len=pdflist.length;
			var pdfid = ""; var pdfurl = ""; 
			var pdfid = ""; var pdfurl = ""; 
			img_pdfid="/imgs/links/tn/tn_dragons_koo.png";		
			img_pdfid="/imgs/links/tn/tn_dragons_koo.png";		
			tn_pdfid="/imgs/links/tn/tn_dragons_oko.png";
			tn_pdfid="/imgs/links/tn/tn_dragons_oko.png";
			for( z=0; z< pdflist.length; z++ ) {
			for( z=0; z< pdflist.length; z++ ) {
				pdfid = pdflist[z].split(" " )[10];
				pdfid = pdflist[z].split(" " )[10];
//				alert( 'BUGS_1000 script_pdflist_show z="+z+" pdfid="+pdfid+" pdflist="+pdflist[z] );
//				alert( 'BUGS_1000 script_pdflist_show z="+z+" pdfid="+pdfid+" pdflist="+pdflist[z] );
				pdfid_code = pdflist[z].replace('.json','' );
				pdfid_code = pdflist[z].replace('.json','' );
//				img_pdfid = pdflist[z].replace('.json','.jpg' );
//				img_pdfid = pdflist[z].replace('.json','.jpg' );
//				tn_pdfid = pdflist[z].replace('.json','.png' );
//				tn_pdfid = pdflist[z].replace('.json','.png' );
//				pdfout += "<h1><b>pdflist_"+z+"</b><h1>";
//				pdfout += "<h1><b>pdflist_"+z+"</b><h1>";
				pdfurl = pdfid;
				pdfurl = pdfid;


// http://ka12/kb/pdf/pdf_20190126/kou_20190125_2400_Understand
// http://ka12/kb/pdf/pdf_20190126/kou_20190125_2400_Understand
//				pdfout += "<a href='./index_vu.html?pdfid="+pdfid+"' class='thumbnail' target=_blank>";
//				pdfout += "<a href='./index_vu.html?pdfid="+pdfid+"' class='thumbnail' target=_blank>";
//				pdfout += "<a href='?pdfid="+pdfid+"' class='thumbnail' target=_blank>";
//				pdfout += "<a href='?pdfid="+pdfid+"' class='thumbnail' target=_blank>";
				pdfout += '<a href='+pdfurl+' class="popover" target=_blank>';
				pdfout += '<a href='+pdfurl+' class="popover" target=_blank>';
				pdfout += "	<img name='img_" + pdfid + "' height=100 src='"+tn_pdfid+"' border=0 height=100 >\n";
				pdfout += "	<img name='img_" + pdfid + "' height=100 src='"+tn_pdfid+"' border=0 height=100 >\n";
				pdfout += "	<span><img name='img_" + pdfid + "' height=100 src='"+img_pdfid+"' border=0 height=100 ></span>\n";
				pdfout += "	<span><img name='img_" + pdfid + "' height=100 src='"+img_pdfid+"' border=0 height=100 ></span>\n";
				pdfout += "	</a>";
				pdfout += "	</a>";
//				alert( "bugs_196 pdfid=" + pdfid + " tn_pdfid=" + tn_pdfid );
//				alert( "bugs_196 pdfid=" + pdfid + " tn_pdfid=" + tn_pdfid );
				}
				}
//			document.write( "bugs_198 pdfout=" + pdfout );
//			document.write( "bugs_198 pdfout=" + pdfout );


//			alert( "BUGS432_show pdflist("+len+")="+pdflist[z] + " len="+pdflist.length );
//			alert( "BUGS432_show pdflist("+len+")="+pdflist[z] + " len="+pdflist.length );
// 			document.getElementById('div_tllist').innerHTML += pdfout;
// 			document.getElementById('div_tllist').innerHTML += pdfout;
			var parent = document.getElementById('div_pdflist');
			var parent = document.getElementById('div_pdflist');
			parent.insertAdjacentHTML('beforeend', pdfout);
			parent.insertAdjacentHTML('beforeend', pdfout);
			}
			}
		</script id="script_pdflist_show">
		</script id="script_pdflist_show">


	<div id="div_pdflist">
	<div id="div_pdflist">
		<h1>div_pdflist</h1>
		<h1>div_pdflist</h1>
		</div id="div_pdflist">
		</div id="div_pdflist">


	<hr color=yellow>
	<hr color=yellow>










	<a href=# class="popover" alt="script_bugs">
	<a href=# class="popover" alt="script_bugs">
		<img height=150	src="/imgs/links/tn/tn_dragon_b2.png" onclick="script_bugs('5400')">
		<img height=150	src="/imgs/links/tn/tn_dragon_b2.png" onclick="script_bugs('5400')">
		<span><img height=150 src="/imgs/links/tn/tn_dragon_w1.png" onclick="script_bugs('5400')"></span>
		<span><img height=150 src="/imgs/links/tn/tn_dragon_w1.png" onclick="script_bugs('5400')"></span>
		</a>
		</a>


	<script id="script_kob" >
	<script id="script_kob" >
		function script_kob(kobid) {
		function script_kob(kobid) {
			alert( "BUGS_kob_6500 script_kob="+kobid );
			alert( "BUGS_kob_6500 script_kob="+kobid );
			}
			}
		</script id="script_kob" >
		</script id="script_kob" >


	<script id="script_kow" >
	<script id="script_kow" >
		function script_kow(kowid) {
		function script_kow(kowid) {
			alert( "BUGS_kow_6500 script_kow="+kowid );
			alert( "BUGS_kow_6500 script_kow="+kowid );
			}
			}
		</script id="script_kow" >
		</script id="script_kow" >




	<button onclick="script_ajax2php">ajax2php</button>
	<button onclick="script_ajax2php">ajax2php</button>
	<button onclick="script_sllist">sllist</button>
	<button onclick="script_sllist">sllist</button>
	<button onclick="script_pdflist">pdflist</button>
	<button onclick="script_pdflist">pdflist</button>


	<button id="btn_sllist" onclick="script_sllist()">-= slflist =-</button>
	<button id="btn_sllist" onclick="script_sllist()">-= slflist =-</button>
	<a href=# class="popover" alt="script_slist()">
	<a href=# class="popover" alt="script_slist()">
		<img height=100 src="/imgs/links/tn/tn_dragons_oko.png" onclick="script_sllist();" >
		<img height=100 src="/imgs/links/tn/tn_dragons_oko.png" onclick="script_sllist();" >
		<span><img height=100 src="/imgs/links/tn/tn_dragons_koo.png" onclick="script_sllist();" ></span>
		<span><img height=100 src="/imgs/links/tn/tn_dragons_koo.png" onclick="script_sllist();" ></span>
		</a>
		</a>




	<button id="btn_pdflist" onclick="script_pdflist()">-= pdflist =-</button>
	<button id="btn_pdflist" onclick="script_pdflist()">-= pdflist =-</button>
	<a href=# class="popover" alt="script_pdflist()">
	<a href=# class="popover" alt="script_pdflist()">
		<img height=100 src="imgs/links/tn/tn_dragons_oko.png" onclick="script_pdflist();" >
		<img height=100 src="imgs/links/tn/tn_dragons_oko.png" onclick="script_pdflist();" >
		<span><img height=100 src="/imgs/links/tn/tn_dragons_koo.png" onclick="script_pdflist();" ></span>
		<span><img height=100 src="/imgs/links/tn/tn_dragons_koo.png" onclick="script_pdflist();" ></span>
		</a>
		</a>


	<script id="script_pdflist">
	<script id="script_pdflist">
		function script_pdflist() {
		function script_pdflist() {
			script_pdflist_load();
			script_pdflist_load();
			script_pdflist_show();
			script_pdflist_show();
			}
			}
		</script id="script_pdflist">
		</script id="script_pdflist">


	<script id="script_sllist">
	<script id="script_sllist">
		function script_sllist() {
		function script_sllist() {
			script_sllist_load();
			script_sllist_load();
			script_sllist_show();
			script_sllist_show();
			}
			}
		</script id="script_sllist">
		</script id="script_sllist">




	<a href="/?js=script_shutdown" class="popover" alt="script_shutdown">
	<a href="/?js=script_shutdown" class="popover" alt="script_shutdown">
		<img  height=150 src="/imgs/links/tn/tn_dragon_w2.png" onclick="script_shutdown('5600')">
		<img  height=150 src="/imgs/links/tn/tn_dragon_w2.png" onclick="script_shutdown('5600')">
		<span><img height=150 src="/imgs/links/tn/tn_dragon_b1.png" onclick="script_shutdown('5600')"></span>
		<span><img height=150 src="/imgs/links/tn/tn_dragon_b1.png" onclick="script_shutdown('5600')"></span>
		</a>
		</a>




	<br><br><br><br><br><br><br>
	<br><br><br><br><br><br><br>
	<div id="txtName"><h1>txtName</h1>
	<div id="txtName"><h1>txtName</h1>
		</div id="txtName">
		</div id="txtName">




	<script id="script_ajaxdb3">
	<script id="script_ajaxdb3">
// exit function if nothing has been typed in the textbox
// exit function if nothing has been typed in the textbox
		function showName(str){
		function showName(str){
    			if (str.length == 0){ 
    			if (str.length == 0){ 
				document.getElementById("txtName").innerHTML=""; //clear previous results
				document.getElementById("txtName").innerHTML=""; //clear previous results
				return;
				return;
				}
				}


// code for IE7+, Firefox, Chrome, Opera, Safari
// code for IE7+, Firefox, Chrome, Opera, Safari
// code for IE6, IE5
// code for IE6, IE5
		if (window.XMLHttpRequest) {
		if (window.XMLHttpRequest) {
			xmlhttp=new XMLHttpRequest();
			xmlhttp=new XMLHttpRequest();
			} 
			} 
		else {
		else {
			xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
			xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    			}
    			}
		xmlhttp.onreadystatechange=function() {
		xmlhttp.onreadystatechange=function() {
			if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
			if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
				document.getElementById("txtName").innerHTML=xmlhttp.responseText;
				document.getElementById("txtName").innerHTML=xmlhttp.responseText;
			        }
			        }
    			}
    			}
//		xmlhttp.open("POST","idx.php?name="+str,true);
//		xmlhttp.open("POST","idx.php?name="+str,true);
		xmlhttp.open("GET","ajaxdb_page.php?name="+str,true);
		xmlhttp.open("GET","ajaxdb_page.php?name="+str,true);
		xmlhttp.send();
		xmlhttp.send();
		</script id="script_ajaxdb3">
		</script id="script_ajaxdb3">




	<br><br><br><br><br>
	<br><br><br><br><br>
	<div id="div_kogrids_b"></div>
	<div id="div_kogrids_b"></div>




	<script id="script_gethint_ajax">
	<script id="script_gethint_ajax">
		function showHint(str) {
		function showHint(str) {
			if (str.length == 0) {
			if (str.length == 0) {
				document.getElementById("txtHint").innerHTML = "";
				document.getElementById("txtHint").innerHTML = "";
				return;
				return;
				} 
				} 
			else {
			else {
				var xmlhttp = new XMLHttpRequest();
				var xmlhttp = new XMLHttpRequest();
				xmlhttp.onreadystatechange = function() {
				xmlhttp.onreadystatechange = function() {
					if (this.readyState == 4 && this.status == 200) {
					if (this.readyState == 4 && this.status == 200) {
						document.getElementById("txtHint").innerHTML = this.responseText;
						document.getElementById("txtHint").innerHTML = this.responseText;
						}
						}
					};
					};
				xmlhttp.open("GET", "gethint.php?q=" + str, true);
				xmlhttp.open("GET", "gethint.php?q=" + str, true);
				xmlhttp.send();
				xmlhttp.send();
				}
				}
			}
			}
		</script id="script_gethint_ajax">
		</script id="script_gethint_ajax">


	<script id="script_ajaxjs" >
	<script id="script_ajaxjs" >




function js_ajax() {
function js_ajax() {
	$(document).ready(function(){
	$(document).ready(function(){
		$.ajax({
		$.ajax({
        		url: 'idx.php',
        		url: 'idx.php',
       			 type: 'get',
       			 type: 'get',
      			  dataType: 'JSON',
      			  dataType: 'JSON',
    			   success: function(response){
    			   success: function(response){
				var len = response.length;
				var len = response.length;
				for(var i=0; i<len; i++){
				for(var i=0; i<len; i++){
					var id = response[i].id;
					var id = response[i].id;
					var username = response[i].username;
					var username = response[i].username;
					var name = response[i].name;
					var name = response[i].name;
					var email = response[i].email;
					var email = response[i].email;


        	        var tr_str = "<tr>" +
        	        var tr_str = "<tr>" +
        	            "<td align='center'>" + (i+1) + "</td>" +
        	            "<td align='center'>" + (i+1) + "</td>" +
        	            "<td align='center'>" + username + "</td>" +
        	            "<td align='center'>" + username + "</td>" +
        	            "<td align='center'>" + name + "</td>" +
        	            "<td align='center'>" + name + "</td>" +
        	            "<td align='center'>" + email + "</td>" +
        	            "<td align='center'>" + email + "</td>" +
        	            "</tr>";
        	            "</tr>";
        		        $("#userTable tbody").append(tr_str);
        		        $("#userTable tbody").append(tr_str);
		            	}
		            	}


	        	}
	        	}
		    });
		    });
		});
		});
	return( $ajaxjs );
	return( $ajaxjs );
	}
	}


		</script id="script_ajaxjs" >
		</script id="script_ajaxjs" >




	<h1>gethint_ajax</h1>
	<h1>gethint_ajax</h1>
		<script id="script_gethint_ajax">
		<script id="script_gethint_ajax">
			function showHint(str) {
			function showHint(str) {
				if (str.length == 0) {
				if (str.length == 0) {
					document.getElementById("txtHint").innerHTML = "";
					document.getElementById("txtHint").innerHTML = "";
					return;
					return;
					} 
					} 
				else {
				else {
					var xmlhttp = new XMLHttpRequest();
					var xmlhttp = new XMLHttpRequest();
					xmlhttp.onreadystatechange = function() {
					xmlhttp.onreadystatechange = function() {
						if (this.readyState == 4 && this.status == 200) {
						if (this.readyState == 4 && this.status == 200) {
							document.getElementById("txtHint").innerHTML = this.responseText;
							document.getElementById("txtHint").innerHTML = this.responseText;
							}
							}
						};
						};
					xmlhttp.open("POST", "idx.php?hint=" + str, true);
					xmlhttp.open("POST", "idx.php?hint=" + str, true);
					xmlhttp.send();
					xmlhttp.send();
					}
					}
				}
				}
			</script id="script_gethint_ajax">
			</script id="script_gethint_ajax">


	</body>
	</body>
	</html> 
	</html> 
<!--
<!--
elise legrow - who do you love:https://www.youtube.com/watch?v=4BYzRmiBwRE
elise legrow - who do you love:https://www.youtube.com/watch?v=4BYzRmiBwRE
	-->
	-->
//


koh5_pano



Your browser does not support the HTML5 canvas element.


Drag mouse to navigate.

Navigation





17.Aug.2010, Martin Wengenmayer