Seamless Texture Maker

[fusion_builder_container type=”flex” hundred_percent=”no” hundred_percent_height=”no” min_height_medium=”” min_height_small=”” min_height=”” hundred_percent_height_scroll=”no” align_content=”stretch” flex_align_items=”flex-start” flex_justify_content=”flex-start” flex_wrap_medium=”” flex_wrap_small=”” flex_wrap=”wrap” flex_column_spacing=”” hundred_percent_height_center_content=”yes” equal_height_columns=”no” container_tag=”div” menu_anchor=”” hide_on_mobile=”small-visibility,medium-visibility,large-visibility” status=”published” publish_date=”” class=”” id=”” spacing_medium=”” margin_top_medium=”” margin_bottom_medium=”” spacing_small=”” margin_top_small=”” margin_bottom_small=”” margin_top=”” margin_bottom=”” padding_dimensions_medium=”” padding_top_medium=”” padding_right_medium=”” padding_bottom_medium=”” padding_left_medium=”” padding_dimensions_small=”” padding_top_small=”” padding_right_small=”” padding_bottom_small=”” padding_left_small=”” padding_top=”” padding_right=”” padding_bottom=”” padding_left=”” link_hover_color=”” link_color=”” border_sizes=”” border_sizes_top=”” border_sizes_right=”” border_sizes_bottom=”” border_sizes_left=”” border_color=”” border_style=”solid” border_radius_top_left=”” border_radius_top_right=”” border_radius_bottom_right=”” border_radius_bottom_left=”” box_shadow=”no” box_shadow_vertical=”” box_shadow_horizontal=”” box_shadow_blur=”0″ box_shadow_spread=”0″ box_shadow_color=”” box_shadow_style=”” z_index=”” overflow=”” background_color_medium=”” background_color_small=”” background_color=”” gradient_start_color=”” gradient_end_color=”” gradient_start_position=”0″ gradient_end_position=”100″ gradient_type=”linear” radial_direction=”center center” linear_angle=”180″ background_image_medium=”” background_image_small=”” background_image=”” skip_lazy_load=”” background_position_medium=”” background_position_small=”” background_position=”center center” background_repeat_medium=”” background_repeat_small=”” background_repeat=”no-repeat” background_size_medium=”” background_size_small=”” background_size=”” background_custom_size=”” background_custom_size_medium=”” background_custom_size_small=”” fade=”no” background_parallax=”none” enable_mobile=”no” parallax_speed=”0.3″ background_blend_mode_medium=”” background_blend_mode_small=”” background_blend_mode=”none” background_slider_images=”” background_slider_position=”” background_slider_skip_lazy_loading=”no” background_slider_loop=”yes” background_slider_pause_on_hover=”no” background_slider_slideshow_speed=”5000″ background_slider_animation=”fade” background_slider_direction=”up” background_slider_animation_speed=”800″ background_slider_blend_mode=”” video_mp4=”” video_webm=”” video_ogv=”” video_url=”” video_aspect_ratio=”16:9″ video_loop=”yes” video_mute=”yes” video_preview_image=”” pattern_bg=”none” pattern_custom_bg=”” pattern_bg_color=”” pattern_bg_style=”default” pattern_bg_opacity=”100″ pattern_bg_size=”” pattern_bg_blend_mode=”normal” mask_bg=”none” mask_custom_bg=”” mask_bg_color=”” mask_bg_accent_color=”” mask_bg_style=”default” mask_bg_opacity=”100″ mask_bg_transform=”left” mask_bg_blend_mode=”normal” render_logics=”” logics=”” absolute=”off” absolute_devices=”small,medium,large” sticky=”off” sticky_devices=”small-visibility,medium-visibility,large-visibility” sticky_background_color=”” sticky_height=”” sticky_offset=”” sticky_transition_offset=”0″ scroll_offset=”0″ animation_type=”” animation_direction=”left” animation_color=”” animation_speed=”0.3″ animation_delay=”0″ animation_offset=”” filter_hue=”0″ filter_saturation=”100″ filter_brightness=”100″ filter_contrast=”100″ filter_invert=”0″ filter_sepia=”0″ filter_opacity=”100″ filter_blur=”0″ filter_hue_hover=”0″ filter_saturation_hover=”100″ filter_brightness_hover=”100″ filter_contrast_hover=”100″ filter_invert_hover=”0″ filter_sepia_hover=”0″ filter_opacity_hover=”100″ filter_blur_hover=”0″][fusion_builder_row][fusion_builder_column type=”1_1″ layout=”1_1″ align_self=”auto” content_layout=”column” align_content=”flex-start” valign_content=”flex-start” content_wrap=”wrap” spacing=”” center_content=”no” column_tag=”div” link=”” target=”_self” link_description=”” min_height=”” hide_on_mobile=”small-visibility,medium-visibility,large-visibility” sticky_display=”normal,sticky” class=”” id=”” type_medium=”” type_small=”” flex_grow_medium=”” flex_grow_small=”” flex_grow=”” flex_shrink_medium=”” flex_shrink_small=”” flex_shrink=”” order_medium=”0″ order_small=”0″ dimension_spacing_medium=”” dimension_spacing_small=”” dimension_spacing=”” dimension_margin_medium=”” dimension_margin_small=”” margin_top=”” margin_bottom=”” padding_medium=”” padding_small=”” padding_top=”” padding_right=”” padding_bottom=”” padding_left=”” hover_type=”none” border_sizes=”” border_color_hover=”” border_color=”” border_style=”solid” border_radius=”” box_shadow=”no” dimension_box_shadow=”” box_shadow_blur=”0″ box_shadow_spread=”0″ box_shadow_color=”” box_shadow_style=”” z_index_hover=”” z_index=”” overflow=”” background_type=”single” background_color_medium=”” background_color_small=”” background_color_medium_hover=”” background_color_small_hover=”” background_color_hover=”” background_color=”” gradient_start_color=”” gradient_end_color=”” gradient_start_position=”0″ gradient_end_position=”100″ gradient_type=”linear” radial_direction=”center center” linear_angle=”180″ background_image_medium=”” background_image_small=”” background_image=”” background_image_id_medium=”” background_image_id_small=”” background_image_id=”” lazy_load=”avada” skip_lazy_load=”” background_position_medium=”” background_position_small=”” background_position=”left top” background_repeat_medium=”” background_repeat_small=”” background_repeat=”no-repeat” background_size_medium=”” background_size_small=”” background_size=”” background_custom_size=”” background_custom_size_medium=”” background_custom_size_small=”” background_blend_mode_medium=”” background_blend_mode_small=”” background_blend_mode=”none” background_slider_images=”” background_slider_position=”” background_slider_skip_lazy_loading=”no” background_slider_loop=”yes” background_slider_pause_on_hover=”no” background_slider_slideshow_speed=”5000″ background_slider_animation=”fade” background_slider_direction=”up” background_slider_animation_speed=”800″ background_slider_blend_mode=”” render_logics=”” sticky=”off” sticky_devices=”small-visibility,medium-visibility,large-visibility” sticky_offset=”” absolute=”off” absolute_props=”” filter_type=”regular” filter_hover_element=”self” filter_hue=”0″ filter_saturation=”100″ filter_brightness=”100″ filter_contrast=”100″ filter_invert=”0″ filter_sepia=”0″ filter_opacity=”100″ filter_blur=”0″ filter_hue_hover=”0″ filter_saturation_hover=”100″ filter_brightness_hover=”100″ filter_contrast_hover=”100″ filter_invert_hover=”0″ filter_sepia_hover=”0″ filter_opacity_hover=”100″ filter_blur_hover=”0″ transform_type=”regular” transform_hover_element=”self” transform_scale_x=”1″ transform_scale_y=”1″ transform_translate_x=”0″ transform_translate_y=”0″ transform_rotate=”0″ transform_skew_x=”0″ transform_skew_y=”0″ transform_scale_x_hover=”1″ transform_scale_y_hover=”1″ transform_translate_x_hover=”0″ transform_translate_y_hover=”0″ transform_rotate_hover=”0″ transform_skew_x_hover=”0″ transform_skew_y_hover=”0″ transform_origin=”” transition_duration=”300″ transition_easing=”ease” transition_custom_easing=”” motion_effects=”” scroll_motion_devices=”small-visibility,medium-visibility,large-visibility” animation_type=”” animation_direction=”left” animation_color=”” animation_speed=”0.3″ animation_delay=”0″ animation_offset=”” last=”true” border_position=”all” first=”true”][fusion_code]PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgPG1ldGEgY2hhcnNldD0idXRmLTgiIC8+CiAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCxpbml0aWFsLXNjYWxlPTEiIC8+CiAgPHRpdGxlPlNlYW1sZXNzIFRleHR1cmUgR2VuZXJhdG9yIOKAlCBGaXhlZDwvdGl0bGU+CiAgPHN0eWxlPgogICAgOnJvb3R7LS1iZzojMGIxMjIwOy0tcGFuZWw6IzA3MTAxOTstLW11dGVkOiM5YWE1YjE7LS1hY2NlbnQ6IzZlZTdiN30KICAgIGh0bWwsYm9keXtoZWlnaHQ6MTAwJTttYXJnaW46MDtmb250LWZhbWlseTpJbnRlcixzeXN0ZW0tdWksU2Vnb2UgVUksUm9ib3RvLEhlbHZldGljYSxBcmlhbDtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgxODBkZWcsIzA0MTAxOCwjMDcxMDE5KTtjb2xvcjojZTZlZWY2fQogICAgLndyYXB7bWF4LXdpZHRoOjExMDBweDttYXJnaW46MjhweCBhdXRvO3BhZGRpbmc6MThweDtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjMyMHB4IDFmcjtnYXA6MThweH0KICAgIC5wYW5lbHtiYWNrZ3JvdW5kOnZhcigtLXBhbmVsKTtib3JkZXItcmFkaXVzOjEycHg7cGFkZGluZzoxNHB4O2JveC1zaGFkb3c6MCA2cHggMzBweCByZ2JhKDAsMCwwLDAuNil9CiAgICBoMXttYXJnaW46MCAwIDEwcHggMDtmb250LXNpemU6MThweH0KICAgIC5jb250cm9sc3tkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDoxMHB4fQogICAgbGFiZWx7Zm9udC1zaXplOjEzcHg7Y29sb3I6dmFyKC0tbXV0ZWQpfQogICAgLnJvd3tkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczpjZW50ZXJ9CiAgICAuc2xpZGVye3dpZHRoOjEwMCV9CiAgICBidXR0b24sc2VsZWN0LGlucHV0e2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMDYpO3BhZGRpbmc6OHB4O2JvcmRlci1yYWRpdXM6OHB4O2NvbG9yOnZhcigtLW11dGVkKTtjdXJzb3I6cG9pbnRlcn0KICAgIC5wcmV2aWV3e2JhY2tncm91bmQ6IzA2MTAxODtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjEwcHg7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtoZWlnaHQ6NjQwcHh9CiAgICAuY2FudmFzLXdyYXB7ZmxleDoxO2JvcmRlci1yYWRpdXM6OHB4O292ZXJmbG93OmhpZGRlbjtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4wMyk7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDE4MGRlZywjMGIxNzIyLCMwNjEwMTQpfQogICAgY2FudmFze21heC13aWR0aDoxMDAlO2hlaWdodDphdXRvO2Rpc3BsYXk6YmxvY2t9CiAgICAudG9vbC1mb290e2Rpc3BsYXk6ZmxleDtnYXA6OHB4O21hcmdpbi10b3A6MTBweDthbGlnbi1pdGVtczpjZW50ZXJ9CiAgICAubXV0ZWR7Y29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtc2l6ZToxM3B4fQogICAgLnRodW1ic3tkaXNwbGF5OmZsZXg7Z2FwOjhweDtmbGV4LXdyYXA6d3JhcDttYXJnaW4tdG9wOjhweH0KICAgIC50aHVtYnMgY2FudmFze3dpZHRoOjgwcHg7aGVpZ2h0OjgwcHg7Ym9yZGVyLXJhZGl1czo2cHg7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMDMpfQogICAgLm9wdGlvbnN7Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjA1KTtwYWRkaW5nLXRvcDo4cHg7bWFyZ2luLXRvcDo2cHg7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6NnB4fQogICAgZm9vdGVye21hcmdpbi10b3A6MTBweDtjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjEycHh9CiAgICBAbWVkaWEgKG1heC13aWR0aDo5ODBweCl7LndyYXB7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmcjttYXgtd2lkdGg6NzIwcHh9fQogIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+CiAgPGRpdiBjbGFzcz0id3JhcCI+CiAgICA8ZGl2IGNsYXNzPSJwYW5lbCI+CiAgICAgIDxoMT5TZWFtbGVzcyBUZXh0dXJlIEdlbmVyYXRvciDigJQgRml4ZWQ8L2gxPgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9scyI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxsYWJlbCBjbGFzcz0ic21hbGwiPlNvdXJjZSBpbWFnZTwvbGFiZWw+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tdG9wOjhweCI+CiAgICAgICAgICAgIDxpbnB1dCBpZD0iZmlsZSIgdHlwZT0iZmlsZSIgYWNjZXB0PSJpbWFnZS8qIj4KICAgICAgICAgICAgPGJ1dHRvbiBpZD0iZHJvcFRlc3QiIGNsYXNzPSJzbWFsbCI+UGFzdGUvVVJMPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdj4KICAgICAgICAgIDxsYWJlbCBjbGFzcz0ic21hbGwiPk1vZGU8L2xhYmVsPgogICAgICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDo4cHgiPjxzZWxlY3QgaWQ9Im1vZGUiPjxvcHRpb24gdmFsdWU9IndyYXAiPldyYXAgLyBUaWxlPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibWlycm9yIj5NaXJyb3I8L29wdGlvbj48L3NlbGVjdD48L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdj4KICAgICAgICAgIDxsYWJlbCBjbGFzcz0ic21hbGwiPlNlYW0gRmVhdGhlciAocHgpPC9sYWJlbD4KICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+PGlucHV0IGlkPSJmZWF0aGVyIiBjbGFzcz0ic2xpZGVyIiB0eXBlPSJyYW5nZSIgbWluPSIwIiBtYXg9IjIwMCIgdmFsdWU9IjMyIj48ZGl2IGNsYXNzPSJtdXRlZCIgaWQ9ImZlYXRoVmFsIj4zMjwvZGl2PjwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2PgogICAgICAgICAgPGxhYmVsIGNsYXNzPSJzbWFsbCI+Qmx1ciBTdHJlbmd0aCAocHgpPC9sYWJlbD4KICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+PGlucHV0IGlkPSJibHVyIiBjbGFzcz0ic2xpZGVyIiB0eXBlPSJyYW5nZSIgbWluPSIwIiBtYXg9IjQwIiB2YWx1ZT0iNiI+PGRpdiBjbGFzcz0ibXV0ZWQiIGlkPSJibHVyVmFsIj42PC9kaXY+PC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXY+CiAgICAgICAgICA8bGFiZWwgY2xhc3M9InNtYWxsIj5QcmV2aWV3IFRpbGVzPC9sYWJlbD4KICAgICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi10b3A6OHB4IiBjbGFzcz0icm93Ij48aW5wdXQgaWQ9InRpbGVzIiB0eXBlPSJjaGVja2JveCIgY2hlY2tlZD48ZGl2IGNsYXNzPSJtdXRlZCI+M8OXMyBwcmV2aWV3PC9kaXY+PC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9Im9wdGlvbnMiPgogICAgICAgICAgPGxhYmVsIGNsYXNzPSJzbWFsbCI+QWR2YW5jZWQgT3B0aW9uczwvbGFiZWw+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3cgc21hbGwiPjxpbnB1dCBpZD0ibGl2ZSIgdHlwZT0iY2hlY2tib3giIGNoZWNrZWQ+PGRpdiBjbGFzcz0ibXV0ZWQiPkxpdmUgUHJldmlldzwvZGl2PjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0icm93IHNtYWxsIj48aW5wdXQgaWQ9InNtYXJ0QmxlbmQiIHR5cGU9ImNoZWNrYm94Ij48ZGl2IGNsYXNzPSJtdXRlZCI+U21hcnQgQmxlbmQgKGVkZ2UgYXZlcmFnaW5nKTwvZGl2PjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0icm93IHNtYWxsIj48aW5wdXQgaWQ9ImVkZ2VNYXRjaCIgdHlwZT0iY2hlY2tib3giPjxkaXYgY2xhc3M9Im11dGVkIj5FZGdlIEJyaWdodG5lc3MgTWF0Y2g8L2Rpdj48L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyBzbWFsbCI+PGlucHV0IGlkPSJyYWRpYWwiIHR5cGU9ImNoZWNrYm94Ij48ZGl2IGNsYXNzPSJtdXRlZCI+UmFkaWFsIENyb3NzZmFkZTwvZGl2PjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0icm93IHNtYWxsIj48aW5wdXQgaWQ9ImhxYmx1ciIgdHlwZT0iY2hlY2tib3giPjxkaXYgY2xhc3M9Im11dGVkIj5IaWdoLXF1YWxpdHkgR2F1c3NpYW4gQmx1cjwvZGl2PjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0icm93IHNtYWxsIj48aW5wdXQgaWQ9ImF1dG9Qb3cyIiB0eXBlPSJjaGVja2JveCIgY2hlY2tlZD48ZGl2IGNsYXNzPSJtdXRlZCI+QXV0byBQb3dlci1vZi1Ud28gUmVzaXplPC9kaXY+PC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXY+CiAgICAgICAgICA8bGFiZWwgY2xhc3M9InNtYWxsIj5FeHBvcnQgU2NhbGU8L2xhYmVsPgogICAgICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDo4cHgiIGNsYXNzPSJyb3ciPjxzZWxlY3QgaWQ9InNjYWxlIj48b3B0aW9uIHZhbHVlPSIxIj4xw5c8L29wdGlvbj48b3B0aW9uIHZhbHVlPSIyIj4yw5c8L29wdGlvbj48b3B0aW9uIHZhbHVlPSI0Ij40w5c8L29wdGlvbj48L3NlbGVjdD48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDphdXRvIiBjbGFzcz0ibXV0ZWQgc21hbGwiPlBORzwvZGl2PjwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJ0b29sLWZvb3QiPgogICAgICAgICAgPGJ1dHRvbiBpZD0iZ2VuZXJhdGUiPkdlbmVyYXRlPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGlkPSJkb3dubG9hZCI+RG93bmxvYWQgUE5HPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGlkPSJyZXNldCI+UmVzZXQ8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJwYW5lbCBwcmV2aWV3Ij4KICAgICAgPGRpdiBjbGFzcz0idG9wYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzbWFsbCIgaWQ9ImluZm8iPk5vIGltYWdlIGxvYWRlZDwvZGl2PgogICAgICAgIDxkaXY+CiAgICAgICAgICA8YnV0dG9uIGlkPSJjb3B5RGF0YSIgY2xhc3M9InNtYWxsIj5Db3B5IEpTT048L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gaWQ9Im9wZW5OZXciIGNsYXNzPSJzbWFsbCI+T3BlbiBpbiBOZXcgVGFiPC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iY2FudmFzLXdyYXAiIGlkPSJjYW52YXNXcmFwIj4KICAgICAgICA8Y2FudmFzIGlkPSJyZXN1bHQiIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIj48L2NhbnZhcz4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJ0aHVtYnMiIGlkPSJ0aHVtYnMiPjwvZGl2PgogICAgICA8Zm9vdGVyPlNlYW1sZXNzIGdlbmVyYXRpb24gcGlwZWxpbmUg4oCUIHNtYXJ0IGJsZW5kLCByYWRpYWwgY3Jvc3NmYWRlLCBlZGdlIG1hdGNoLCBoaWdoLXF1YWxpdHkgYmx1ci48L2Zvb3Rlcj4KICAgIDwvZGl2PgogIDwvZGl2PgoKICA8c2NyaXB0PgogIC8vIC0tLSBlbGVtZW50IHJlZnMKICBjb25zdCBmaWxlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZScpOwogIGNvbnN0IGRyb3BCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHJvcFRlc3QnKTsKICBjb25zdCBtb2RlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZScpOwogIGNvbnN0IGZlYXRoZXJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmZWF0aGVyJyk7CiAgY29uc3QgZmVhdGhWYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmVhdGhWYWwnKTsKICBjb25zdCBibHVyRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmx1cicpOwogIGNvbnN0IGJsdXJWYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmx1clZhbCcpOwogIGNvbnN0IHRpbGVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGlsZXMnKTsKICBjb25zdCBsaXZlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGl2ZScpOwogIGNvbnN0IHNtYXJ0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnRCbGVuZCcpOwogIGNvbnN0IGVkZ2VNYXRjaEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkZ2VNYXRjaCcpOwogIGNvbnN0IHJhZGlhbEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JhZGlhbCcpOwogIGNvbnN0IGhxYmx1ckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hxYmx1cicpOwogIGNvbnN0IGF1dG9Qb3cyRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0b1BvdzInKTsKICBjb25zdCBzY2FsZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NjYWxlJyk7CiAgY29uc3QgZ2VuZXJhdGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2VuZXJhdGUnKTsKICBjb25zdCBkb3dubG9hZEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb3dubG9hZCcpOwogIGNvbnN0IHJlc2V0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc2V0Jyk7CiAgY29uc3QgaW5mbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbmZvJyk7CiAgY29uc3QgdGh1bWJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RodW1icycpOwogIGNvbnN0IGNvcHlEYXRhQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvcHlEYXRhJyk7CiAgY29uc3Qgb3Blbk5ld0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGVuTmV3Jyk7CiAgY29uc3QgcmVzdWx0Q2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdCcpOwogIGNvbnN0IGNhbnZhc1dyYXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FudmFzV3JhcCcpOwoKICBsZXQgc3JjSW1hZ2UgPSBuZXcgSW1hZ2UoKTsKICBzcmNJbWFnZS5jcm9zc09yaWdpbiA9ICdhbm9ueW1vdXMnOwogIGxldCBzcmNDYW52YXMgPSBudWxsLCBzcmNDdHggPSBudWxsOwoKICBmdW5jdGlvbiByZXNldEFsbCgpewogICAgc3JjSW1hZ2UgPSBuZXcgSW1hZ2UoKTsKICAgIHNyY0ltYWdlLmNyb3NzT3JpZ2luID0gJ2Fub255bW91cyc7CiAgICByZXN1bHRDYW52YXMud2lkdGggPSA1MTI7IHJlc3VsdENhbnZhcy5oZWlnaHQgPSA1MTI7CiAgICB0aHVtYnMuaW5uZXJIVE1MID0gJyc7CiAgICBpbmZvLnRleHRDb250ZW50ID0gJ05vIGltYWdlIGxvYWRlZCc7CiAgfQogIHJlc2V0QWxsKCk7CgogIC8vIC0tLSBoZWxwZXJzCiAgZnVuY3Rpb24gcG93MlJvdW5kKG4pewogICAgcmV0dXJuIE1hdGgucG93KDIsIE1hdGgucm91bmQoTWF0aC5sb2cyKE1hdGgubWF4KDEsIG4pKSkpOwogIH0KCiAgZnVuY3Rpb24gbG9hZEZyb21VUkwodXJsKXsKICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpOwogICAgaW1nLmNyb3NzT3JpZ2luID0gJ2Fub255bW91cyc7CiAgICBpbWcub25sb2FkID0gKCk9PnsKICAgICAgLy8gb3B0aW9uYWwgcG93MiByZXNpemUKICAgICAgbGV0IHcgPSBpbWcud2lkdGgsIGggPSBpbWcuaGVpZ2h0OwogICAgICBpZihhdXRvUG93MkVsLmNoZWNrZWQpewogICAgICAgIHcgPSBwb3cyUm91bmQodyk7CiAgICAgICAgaCA9IHBvdzJSb3VuZChoKTsKICAgICAgfQogICAgICBjb25zdCBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7CiAgICAgIGMud2lkdGggPSB3OyBjLmhlaWdodCA9IGg7CiAgICAgIGMuZ2V0Q29udGV4dCgnMmQnKS5kcmF3SW1hZ2UoaW1nLCAwLCAwLCB3LCBoKTsKICAgICAgc3JjQ2FudmFzID0gYzsKICAgICAgc3JjQ3R4ID0gc3JjQ2FudmFzLmdldENvbnRleHQoJzJkJyk7CiAgICAgIGluZm8udGV4dENvbnRlbnQgPSBgTG9hZGVkICR7d33DlyR7aH1gOwogICAgICBpZihsaXZlRWwuY2hlY2tlZCkgZ2VuZXJhdGUoKTsKICAgIH07CiAgICBpbWcub25lcnJvciA9ICgpPT4gYWxlcnQoJ0ZhaWxlZCB0byBsb2FkIGltYWdlIChDT1JTIG9yIGludmFsaWQgVVJMKScpOwogICAgaW1nLnNyYyA9IHVybDsKICB9CgogIGZpbGVFbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSk9PnsKICAgIGNvbnN0IGYgPSBlLnRhcmdldC5maWxlc1swXTsKICAgIGlmKCFmKSByZXR1cm47CiAgICBsb2FkRnJvbVVSTChVUkwuY3JlYXRlT2JqZWN0VVJMKGYpKTsKICB9KTsKCiAgZHJvcEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpPT57CiAgICBjb25zdCB1cmwgPSBwcm9tcHQoJ1Bhc3RlIGFuIGltYWdlIFVSTCBvciBkYXRhIFVSTCcpOwogICAgaWYodXJsKSBsb2FkRnJvbVVSTCh1cmwpOwogIH0pOwoKICAvLyBkcmFnICYgZHJvcAogIGNhbnZhc1dyYXAuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCBlID0+IHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBjYW52YXNXcmFwLnN0eWxlLm91dGxpbmUgPSAnMnB4IGRhc2hlZCByZ2JhKDExMCwyMzEsMTgzLDAuMiknOyB9KTsKICBjYW52YXNXcmFwLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsICgpPT4geyBjYW52YXNXcmFwLnN0eWxlLm91dGxpbmUgPSAnbm9uZSc7IH0pOwogIGNhbnZhc1dyYXAuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIGUgPT4gewogICAgZS5wcmV2ZW50RGVmYXVsdCgpOyBjYW52YXNXcmFwLnN0eWxlLm91dGxpbmUgPSAnbm9uZSc7CiAgICBjb25zdCBmID0gZS5kYXRhVHJhbnNmZXIuZmlsZXMgJiYgZS5kYXRhVHJhbnNmZXIuZmlsZXNbMF07CiAgICBpZihmKSBsb2FkRnJvbVVSTChVUkwuY3JlYXRlT2JqZWN0VVJMKGYpKTsKICAgIGVsc2UgewogICAgICBjb25zdCB1cmwgPSBlLmRhdGFUcmFuc2Zlci5nZXREYXRhKCd0ZXh0L3VyaS1saXN0JykgfHwgZS5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgndGV4dC9wbGFpbicpOwogICAgICBpZih1cmwpIGxvYWRGcm9tVVJMKHVybCk7CiAgICB9CiAgfSk7CgogIC8vIHBhc3RlIHN1cHBvcnQKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncGFzdGUnLCAoZSk9PnsKICAgIGNvbnN0IGl0ZW1zID0gZS5jbGlwYm9hcmREYXRhLml0ZW1zOwogICAgZm9yKGxldCBpPTA7aTxpdGVtcy5sZW5ndGg7aSsrKXsKICAgICAgY29uc3QgaXQgPSBpdGVtc1tpXTsKICAgICAgaWYoaXQua2luZCA9PT0gJ2ZpbGUnKXsKICAgICAgICBjb25zdCBmID0gaXQuZ2V0QXNGaWxlKCk7CiAgICAgICAgbG9hZEZyb21VUkwoVVJMLmNyZWF0ZU9iamVjdFVSTChmKSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmKGl0LmtpbmQgPT09ICdzdHJpbmcnKXsKICAgICAgICBpdC5nZXRBc1N0cmluZyhzID0+IHsgaWYocy5zdGFydHNXaXRoKCdodHRwJykgfHwgcy5zdGFydHNXaXRoKCdkYXRhOicpKSBsb2FkRnJvbVVSTChzKTsgfSk7CiAgICAgIH0KICAgIH0KICB9KTsKCiAgLy8gLS0tIGRpc3BsYXkgdXBkYXRlcwogIGZlYXRoZXJFbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpPT57IGZlYXRoVmFsLnRleHRDb250ZW50ID0gZmVhdGhlckVsLnZhbHVlOyBpZihsaXZlRWwuY2hlY2tlZCkgZ2VuZXJhdGUoKTsgfSk7CiAgYmx1ckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCk9PnsgYmx1clZhbC50ZXh0Q29udGVudCA9IGJsdXJFbC52YWx1ZTsgaWYobGl2ZUVsLmNoZWNrZWQpIGdlbmVyYXRlKCk7IH0pOwogIFttb2RlRWwsIHRpbGVzRWwsIGxpdmVFbCwgc21hcnRFbCwgZWRnZU1hdGNoRWwsIHJhZGlhbEVsLCBocWJsdXJFbCwgYXV0b1BvdzJFbCwgc2NhbGVFbF0KICAgIC5mb3JFYWNoKGVsID0+IGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpPT57IGlmKGxpdmVFbC5jaGVja2VkKSBnZW5lcmF0ZSgpOyB9KSk7CgogIC8vIC0tLSBtYWluIHBpcGVsaW5lIHV0aWxpdGllcwoKICAvLyBlZGdlLWF2ZXJhZ2UgKHNtYXJ0IGJsZW5kKSAtIGF2ZXJhZ2VzIGEgYmFuZCBvZiB3aWR0aCAnZmVhdGhlcicgZnJvbSBsZWZ0L3JpZ2h0IGFuZCB0b3AvYm90dG9tCiAgZnVuY3Rpb24gc21hcnRCbGVuZEF2ZXJhZ2UoY2FudmFzLCBmZWF0aGVyKXsKICAgIGlmKCFmZWF0aGVyIHx8IGZlYXRoZXIgPD0gMCkgcmV0dXJuOwogICAgY29uc3QgdyA9IGNhbnZhcy53aWR0aCwgaCA9IGNhbnZhcy5oZWlnaHQ7CiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTsKICAgIGNvbnN0IGltZyA9IGN0eC5nZXRJbWFnZURhdGEoMCwwLHcsaCk7CiAgICBjb25zdCBkID0gaW1nLmRhdGE7CiAgICAvLyBob3Jpem9udGFsOiBsZWZ0PC0+cmlnaHQKICAgIGZvcihsZXQgeT0wO3k8aDt5KyspewogICAgICBmb3IobGV0IHg9MDt4PGZlYXRoZXI7eCsrKXsKICAgICAgICBjb25zdCBhSWR4ID0gKHkqdyArIHgpKjQ7CiAgICAgICAgY29uc3QgYklkeCA9ICh5KncgKyAodyAtIGZlYXRoZXIgKyB4KSkqNDsKICAgICAgICBjb25zdCB0ID0geCAvIChmZWF0aGVyIHx8IDEpOwogICAgICAgIGZvcihsZXQgYz0wO2M8MztjKyspewogICAgICAgICAgY29uc3QgYSA9IGRbYUlkeCArIGNdLCBiID0gZFtiSWR4ICsgY107CiAgICAgICAgICBkW2FJZHggKyBjXSA9IGEqKDEtdCkgKyBiKnQ7CiAgICAgICAgICBkW2JJZHggKyBjXSA9IGIqKDEtdCkgKyBhKnQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvLyB2ZXJ0aWNhbDogdG9wPC0+Ym90dG9tCiAgICBmb3IobGV0IHg9MDt4PHc7eCsrKXsKICAgICAgZm9yKGxldCB5PTA7eTxmZWF0aGVyO3krKyl7CiAgICAgICAgY29uc3QgYUlkeCA9ICh5KncgKyB4KSo0OwogICAgICAgIGNvbnN0IGJJZHggPSAoKGggLSBmZWF0aGVyICsgeSkqdyArIHgpKjQ7CiAgICAgICAgY29uc3QgdCA9IHkgLyAoZmVhdGhlciB8fCAxKTsKICAgICAgICBmb3IobGV0IGM9MDtjPDM7YysrKXsKICAgICAgICAgIGNvbnN0IGEgPSBkW2FJZHggKyBjXSwgYiA9IGRbYklkeCArIGNdOwogICAgICAgICAgZFthSWR4ICsgY10gPSBhKigxLXQpICsgYip0OwogICAgICAgICAgZFtiSWR4ICsgY10gPSBiKigxLXQpICsgYSp0OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgY3R4LnB1dEltYWdlRGF0YShpbWcsMCwwKTsKICB9CgogIC8vIGVkZ2UgYnJpZ2h0bmVzcyBtYXRjaCBhZGp1c3RzIGx1bWluYW5jZSBvZiBsZWZ0L3JpZ2h0IGFuZCB0b3AvYm90dG9tIGJhbmRzIHRvIG1hdGNoIGF2ZXJhZ2VzCiAgZnVuY3Rpb24gZWRnZUJyaWdodG5lc3NNYXRjaChjYW52YXMsIGJhbmQ9OCl7CiAgICBjb25zdCB3ID0gY2FudmFzLndpZHRoLCBoID0gY2FudmFzLmhlaWdodDsKICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpOwoKICAgIC8vIHNhbXBsZSBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20gYmFuZHMgKGF2ZXJhZ2UgbHVtaW5hbmNlKQogICAgZnVuY3Rpb24gc2FtcGxlQXZnKHgseSx3UyxoUyl7CiAgICAgIGNvbnN0IGltZyA9IGN0eC5nZXRJbWFnZURhdGEoeCx5LHdTLGhTKS5kYXRhOwogICAgICBsZXQgc3VtID0gMCwgbiA9IDA7CiAgICAgIGZvcihsZXQgaT0wO2k8aW1nLmxlbmd0aDtpKz00KXsgLy8gbHVtaW5hbmNlIGZvcm11bGEKICAgICAgICBjb25zdCByID0gaW1nW2ldLCBnID0gaW1nW2krMV0sIGIgPSBpbWdbaSsyXTsKICAgICAgICBjb25zdCBsdW0gPSAwLjIxMjYqciArIDAuNzE1MipnICsgMC4wNzIyKmI7CiAgICAgICAgc3VtICs9IGx1bTsgbisrOwogICAgICB9CiAgICAgIHJldHVybiBuID8gc3VtIC8gbiA6IDA7CiAgICB9CiAgICBjb25zdCBsZWZ0QXZnID0gc2FtcGxlQXZnKDAsMCxNYXRoLm1pbihiYW5kLHcpLGgpOwogICAgY29uc3QgcmlnaHRBdmcgPSBzYW1wbGVBdmcoTWF0aC5tYXgoMCx3LWJhbmQpLDAsTWF0aC5taW4oYmFuZCx3KSxoKTsKICAgIGNvbnN0IHRvcEF2ZyA9IHNhbXBsZUF2ZygwLDAsdyxNYXRoLm1pbihiYW5kLGgpKTsKICAgIGNvbnN0IGJvdEF2ZyA9IHNhbXBsZUF2ZygwLE1hdGgubWF4KDAsaC1iYW5kKSx3LE1hdGgubWluKGJhbmQsaCkpOwoKICAgIGNvbnN0IGxyVGFyZ2V0ID0gKGxlZnRBdmcgKyByaWdodEF2ZykgLyAyOwogICAgY29uc3QgdGJUYXJnZXQgPSAodG9wQXZnICsgYm90QXZnKSAvIDI7CgogICAgLy8gYXBwbHkgbWlsZCBnYWluIGFkanVzdG1lbnRzIHRvd2FyZCB0YXJnZXRzIChub3QgYnJ1dGUgZm9yY2UpCiAgICBjb25zdCBpbWcgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsMCx3LGgpOwogICAgY29uc3QgZCA9IGltZy5kYXRhOwogICAgY29uc3QgbGVmdEdhaW4gPSAobHJUYXJnZXQgLyAobGVmdEF2ZyB8fCAxKSk7CiAgICBjb25zdCByaWdodEdhaW4gPSAobHJUYXJnZXQgLyAocmlnaHRBdmcgfHwgMSkpOwogICAgY29uc3QgdG9wR2FpbiA9ICh0YlRhcmdldCAvICh0b3BBdmcgfHwgMSkpOwogICAgY29uc3QgYm90R2FpbiA9ICh0YlRhcmdldCAvIChib3RBdmcgfHwgMSkpOwoKICAgIC8vIGFwcGx5IHBlci1waXhlbCB3ZWlnaHRlZCBnYWluczogcGl4ZWxzIG5lYXIgZWRnZXMgZ2V0IHN0cm9uZ2VyIHdlaWdodGluZwogICAgZm9yKGxldCB5PTA7eTxoO3krKyl7CiAgICAgIGZvcihsZXQgeD0wO3g8dzt4KyspewogICAgICAgIGNvbnN0IGlkeCA9ICh5KncgKyB4KSo0OwogICAgICAgIC8vIGhvcml6b250YWwgd2VpZ2h0aW5nCiAgICAgICAgY29uc3Qgd3ggPSBNYXRoLm1pbigxLCB4IC8gYmFuZCwgKHctMS14KSAvIGJhbmQpOwogICAgICAgIC8vIHZlcnRpY2FsIHdlaWdodGluZwogICAgICAgIGNvbnN0IHd5ID0gTWF0aC5taW4oMSwgeSAvIGJhbmQsIChoLTEteSkgLyBiYW5kKTsKICAgICAgICAvLyBjb21wdXRlIGluZmx1ZW5jZSBmYWN0b3JzIChjbG9zZXIgdG8gZWRnZSA9PiBsYXJnZXIgaW5mbHVlbmNlKQogICAgICAgIGNvbnN0IGluZmx1ZW5jZUwgPSAxIC0gTWF0aC5taW4oMSwgeCAvIGJhbmQpOwogICAgICAgIGNvbnN0IGluZmx1ZW5jZVIgPSAxIC0gTWF0aC5taW4oMSwgKHctMS14KSAvIGJhbmQpOwogICAgICAgIGNvbnN0IGluZmx1ZW5jZVQgPSAxIC0gTWF0aC5taW4oMSwgeSAvIGJhbmQpOwogICAgICAgIGNvbnN0IGluZmx1ZW5jZUIgPSAxIC0gTWF0aC5taW4oMSwgKGgtMS15KSAvIGJhbmQpOwoKICAgICAgICAvLyBjb21iaW5lIGhvcml6b250YWwgZ2FpbnMKICAgICAgICBsZXQgciA9IGRbaWR4XSwgZyA9IGRbaWR4KzFdLCBiID0gZFtpZHgrMl07CgogICAgICAgIC8vIGhvcml6b250YWxseSBhZGp1c3QgaWYgbmVhciBsZWZ0IG9yIHJpZ2h0CiAgICAgICAgaWYoaW5mbHVlbmNlTCA+IDAuMDAxKXsKICAgICAgICAgIHIgPSByICogKDEgLSAwLjYqaW5mbHVlbmNlTCkgKyByICogbGVmdEdhaW4gKiAoMC42KmluZmx1ZW5jZUwpOwogICAgICAgICAgZyA9IGcgKiAoMSAtIDAuNippbmZsdWVuY2VMKSArIGcgKiBsZWZ0R2FpbiAqICgwLjYqaW5mbHVlbmNlTCk7CiAgICAgICAgICBiID0gYiAqICgxIC0gMC42KmluZmx1ZW5jZUwpICsgYiAqIGxlZnRHYWluICogKDAuNippbmZsdWVuY2VMKTsKICAgICAgICB9CiAgICAgICAgaWYoaW5mbHVlbmNlUiA+IDAuMDAxKXsKICAgICAgICAgIHIgPSByICogKDEgLSAwLjYqaW5mbHVlbmNlUikgKyByICogcmlnaHRHYWluICogKDAuNippbmZsdWVuY2VSKTsKICAgICAgICAgIGcgPSBnICogKDEgLSAwLjYqaW5mbHVlbmNlUikgKyBnICogcmlnaHRHYWluICogKDAuNippbmZsdWVuY2VSKTsKICAgICAgICAgIGIgPSBiICogKDEgLSAwLjYqaW5mbHVlbmNlUikgKyBiICogcmlnaHRHYWluICogKDAuNippbmZsdWVuY2VSKTsKICAgICAgICB9CgogICAgICAgIC8vIHZlcnRpY2FsbHkgYWRqdXN0IGlmIG5lYXIgdG9wIG9yIGJvdHRvbQogICAgICAgIGlmKGluZmx1ZW5jZVQgPiAwLjAwMSl7CiAgICAgICAgICByID0gciAqICgxIC0gMC42KmluZmx1ZW5jZVQpICsgciAqIHRvcEdhaW4gKiAoMC42KmluZmx1ZW5jZVQpOwogICAgICAgICAgZyA9IGcgKiAoMSAtIDAuNippbmZsdWVuY2VUKSArIGcgKiB0b3BHYWluICogKDAuNippbmZsdWVuY2VUKTsKICAgICAgICAgIGIgPSBiICogKDEgLSAwLjYqaW5mbHVlbmNlVCkgKyBiICogdG9wR2FpbiAqICgwLjYqaW5mbHVlbmNlVCk7CiAgICAgICAgfQogICAgICAgIGlmKGluZmx1ZW5jZUIgPiAwLjAwMSl7CiAgICAgICAgICByID0gciAqICgxIC0gMC42KmluZmx1ZW5jZUIpICsgciAqIGJvdEdhaW4gKiAoMC42KmluZmx1ZW5jZUIpOwogICAgICAgICAgZyA9IGcgKiAoMSAtIDAuNippbmZsdWVuY2VCKSArIGcgKiBib3RHYWluICogKDAuNippbmZsdWVuY2VCKTsKICAgICAgICAgIGIgPSBiICogKDEgLSAwLjYqaW5mbHVlbmNlQikgKyBiICogYm90R2FpbiAqICgwLjYqaW5mbHVlbmNlQik7CiAgICAgICAgfQoKICAgICAgICBkW2lkeF0gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIHIpKTsKICAgICAgICBkW2lkeCsxXSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgZykpOwogICAgICAgIGRbaWR4KzJdID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBiKSk7CiAgICAgIH0KICAgIH0KICAgIGN0eC5wdXRJbWFnZURhdGEoaW1nLDAsMCk7CiAgfQoKICAvLyBzZXBhcmFibGUgZ2F1c3NpYW4gYmx1ciAodHdvIHBhc3NlcykKICBmdW5jdGlvbiBzZXBhcmFibGVHYXVzc2lhbkJsdXIoY2FudmFzLCByYWRpdXMpewogICAgaWYoIXJhZGl1cyB8fCByYWRpdXMgPD0gMCkgcmV0dXJuOwogICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7CiAgICBsZXQgaW1nID0gY3R4LmdldEltYWdlRGF0YSgwLDAsY2FudmFzLndpZHRoLGNhbnZhcy5oZWlnaHQpOwogICAgY29uc3QgdyA9IGNhbnZhcy53aWR0aCwgaCA9IGNhbnZhcy5oZWlnaHQ7CiAgICBjb25zdCBkYXRhID0gaW1nLmRhdGE7CiAgICAvLyBrZXJuZWwKICAgIGNvbnN0IHNpZ21hID0gTWF0aC5tYXgoMC4xLCByYWRpdXMgLyAzKTsKICAgIGNvbnN0IGtzaXplID0gTWF0aC5jZWlsKHNpZ21hICogMyk7CiAgICBjb25zdCBrZXJuZWwgPSBbXTsKICAgIGxldCBzdW0gPSAwOwogICAgZm9yKGxldCBpPS1rc2l6ZTtpPD1rc2l6ZTtpKyspewogICAgICBjb25zdCB2ID0gTWF0aC5leHAoLShpKmkpLygyKnNpZ21hKnNpZ21hKSk7CiAgICAgIGtlcm5lbC5wdXNoKHYpOyBzdW0gKz0gdjsKICAgIH0KICAgIGZvcihsZXQgaT0wO2k8a2VybmVsLmxlbmd0aDtpKyspIGtlcm5lbFtpXSAvPSBzdW07CgogICAgLy8gaG9yaXpvbnRhbCBwYXNzCiAgICBjb25zdCB0bXAgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoZGF0YS5sZW5ndGgpOwogICAgZm9yKGxldCB5PTA7eTxoO3krKyl7CiAgICAgIGZvcihsZXQgeD0wO3g8dzt4KyspewogICAgICAgIGNvbnN0IGlkeCA9ICh5KncgKyB4KSo0OwogICAgICAgIGxldCByPTAsZz0wLGI9MCxhPTA7CiAgICAgICAgZm9yKGxldCBrPS1rc2l6ZTtrPD1rc2l6ZTtrKyspewogICAgICAgICAgY29uc3Qgc3ggPSBNYXRoLm1pbih3LTEsIE1hdGgubWF4KDAsIHggKyBrKSk7CiAgICAgICAgICBjb25zdCBzaWR4ID0gKHkqdyArIHN4KSo0OwogICAgICAgICAgY29uc3Qgd2d0ID0ga2VybmVsW2sra3NpemVdOwogICAgICAgICAgciArPSBkYXRhW3NpZHhdICogd2d0OwogICAgICAgICAgZyArPSBkYXRhW3NpZHgrMV0gKiB3Z3Q7CiAgICAgICAgICBiICs9IGRhdGFbc2lkeCsyXSAqIHdndDsKICAgICAgICAgIGEgKz0gZGF0YVtzaWR4KzNdICogd2d0OwogICAgICAgIH0KICAgICAgICB0bXBbaWR4XT1yOyB0bXBbaWR4KzFdPWc7IHRtcFtpZHgrMl09YjsgdG1wW2lkeCszXT1hOwogICAgICB9CiAgICB9CgogICAgLy8gdmVydGljYWwgcGFzcyBpbnRvIGRhdGEKICAgIGNvbnN0IG91dCA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkYXRhLmxlbmd0aCk7CiAgICBmb3IobGV0IHk9MDt5PGg7eSsrKXsKICAgICAgZm9yKGxldCB4PTA7eDx3O3grKyl7CiAgICAgICAgY29uc3QgaWR4ID0gKHkqdyArIHgpKjQ7CiAgICAgICAgbGV0IHI9MCxnPTAsYj0wLGE9MDsKICAgICAgICBmb3IobGV0IGs9LWtzaXplO2s8PWtzaXplO2srKyl7CiAgICAgICAgICBjb25zdCBzeSA9IE1hdGgubWluKGgtMSwgTWF0aC5tYXgoMCwgeSArIGspKTsKICAgICAgICAgIGNvbnN0IHNpZHggPSAoc3kqdyArIHgpKjQ7CiAgICAgICAgICBjb25zdCB3Z3QgPSBrZXJuZWxbaytrc2l6ZV07CiAgICAgICAgICByICs9IHRtcFtzaWR4XSAqIHdndDsKICAgICAgICAgIGcgKz0gdG1wW3NpZHgrMV0gKiB3Z3Q7CiAgICAgICAgICBiICs9IHRtcFtzaWR4KzJdICogd2d0OwogICAgICAgICAgYSArPSB0bXBbc2lkeCszXSAqIHdndDsKICAgICAgICB9CiAgICAgICAgb3V0W2lkeF09cjsgb3V0W2lkeCsxXT1nOyBvdXRbaWR4KzJdPWI7IG91dFtpZHgrM109YTsKICAgICAgfQogICAgfQoKICAgIC8vIGNvbW1pdAogICAgZm9yKGxldCBpPTA7aTxkYXRhLmxlbmd0aDtpKyspIGRhdGFbaV0gPSBvdXRbaV07CiAgICBjdHgucHV0SW1hZ2VEYXRhKGltZywwLDApOwogIH0KCiAgLy8gY3JlYXRlIHRpbGVkIG9mZnNldCBpbWFnZSBhbmQgYXBwbHkgYmxlbmRpbmcgc3RlcHMKICBmdW5jdGlvbiBtYWtlVGlsZWRPZmZzZXRJbWFnZShzcmNDYW52YXNMb2NhbCwgb3B0aW9ucyl7CiAgICBjb25zdCB3ID0gc3JjQ2FudmFzTG9jYWwud2lkdGgsIGggPSBzcmNDYW52YXNMb2NhbC5oZWlnaHQ7CiAgICAvLyBjcmVhdGUgYmlnIDN4MyBjYW52YXMKICAgIGNvbnN0IGJpZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOyBiaWcud2lkdGggPSB3KjM7IGJpZy5oZWlnaHQgPSBoKjM7CiAgICBjb25zdCBiY3R4ID0gYmlnLmdldENvbnRleHQoJzJkJyk7CgogICAgLy8gZmlsbCAzeDMgd2l0aCBlaXRoZXIgbm9ybWFsIG9yIG1pcnJvcmVkIHRpbGVzCiAgICBmb3IobGV0IGl4PS0xOyBpeDw9MTsgaXgrKyl7CiAgICAgIGZvcihsZXQgaXk9LTE7IGl5PD0xOyBpeSsrKXsKICAgICAgICBjb25zdCB4ID0gKGl4KzEpKncsIHkgPSAoaXkrMSkqaDsKICAgICAgICBiY3R4LnNhdmUoKTsKICAgICAgICBpZihvcHRpb25zLm1vZGUgPT09ICdtaXJyb3InKXsKICAgICAgICAgIGNvbnN0IGZsaXBYID0gaXggJSAyICE9PSAwOwogICAgICAgICAgY29uc3QgZmxpcFkgPSBpeSAlIDIgIT09IDA7CiAgICAgICAgICBiY3R4LnRyYW5zbGF0ZSh4ICsgKGZsaXBYID8gdyA6IDApLCB5ICsgKGZsaXBZID8gaCA6IDApKTsKICAgICAgICAgIGJjdHguc2NhbGUoZmxpcFggPyAtMSA6IDEsIGZsaXBZID8gLTEgOiAxKTsKICAgICAgICAgIGJjdHguZHJhd0ltYWdlKHNyY0NhbnZhc0xvY2FsLCAwLCAwLCB3LCBoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYmN0eC5kcmF3SW1hZ2Uoc3JjQ2FudmFzTG9jYWwsIHgsIHksIHcsIGgpOwogICAgICAgIH0KICAgICAgICBiY3R4LnJlc3RvcmUoKTsKICAgICAgfQogICAgfQoKICAgIC8vIGNyb3AgdGhlIGNlbnRlciBvZmZzZXQgcmVnaW9uIChjZW50ZXJlZCArIGhhbGYgb2Zmc2V0KQogICAgY29uc3Qgc3ggPSB3ICsgdy8yIC0gdy8yOyAvLyBlcXVhbHMgdwogICAgY29uc3Qgc3kgPSBoICsgaC8yIC0gaC8yOyAvLyBlcXVhbHMgaAogICAgY29uc3Qgb3V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IG91dC53aWR0aCA9IHc7IG91dC5oZWlnaHQgPSBoOwogICAgY29uc3Qgb2N0eCA9IG91dC5nZXRDb250ZXh0KCcyZCcpOwogICAgb2N0eC5kcmF3SW1hZ2UoYmlnLCB3LCBoLCB3LCBoLCAwLCAwLCB3LCBoKTsKCiAgICAvLyBvcHRpb25hbCBzbWFydCBibGVuZCAocHJlLWF2ZXJhZ2UgZWRnZXMpCiAgICBpZihvcHRpb25zLnNtYXJ0QmxlbmQgJiYgb3B0aW9ucy5mZWF0aGVyID4gMCl7CiAgICAgIHNtYXJ0QmxlbmRBdmVyYWdlKG91dCwgTWF0aC5taW4ob3B0aW9ucy5mZWF0aGVyLCBNYXRoLmZsb29yKE1hdGgubWluKHcsaCkvMikpKTsKICAgIH0KCiAgICAvLyBvcHRpb25hbCBlZGdlIGJyaWdodG5lc3MgbWF0Y2gKICAgIGlmKG9wdGlvbnMuZWRnZU1hdGNoKXsKICAgICAgZWRnZUJyaWdodG5lc3NNYXRjaChvdXQsIE1hdGgubWF4KDgsIE1hdGguZmxvb3IoTWF0aC5taW4odyxoKSAqIDAuMDIpKSk7CiAgICB9CgogICAgLy8gb3B0aW9uYWwgcmFkaWFsIGNyb3NzZmFkZSAoYXBwbGllZCBhcyBhIHN1YnRsZSBtYXNrIGJsZW5kIHRvIHNvZnRlbiBjZW50ZXIgY3Jvc3MpCiAgICBpZihvcHRpb25zLnJhZGlhbCAmJiBvcHRpb25zLmZlYXRoZXIgPiAwKXsKICAgICAgY29uc3QgbWFzayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOyBtYXNrLndpZHRoID0gdzsgbWFzay5oZWlnaHQgPSBoOwogICAgICBjb25zdCBtY3R4ID0gbWFzay5nZXRDb250ZXh0KCcyZCcpOwogICAgICBjb25zdCBjeCA9IHcvMiwgY3kgPSBoLzI7CiAgICAgIGNvbnN0IHIgPSBvcHRpb25zLmZlYXRoZXIgKiAxLjU7CiAgICAgIGNvbnN0IGdyYWQgPSBtY3R4LmNyZWF0ZVJhZGlhbEdyYWRpZW50KGN4LCBjeSwgMCwgY3gsIGN5LCByKTsKICAgICAgZ3JhZC5hZGRDb2xvclN0b3AoMCwgJ3JnYmEoMjU1LDI1NSwyNTUsMSknKTsKICAgICAgZ3JhZC5hZGRDb2xvclN0b3AoMSwgJ3JnYmEoMjU1LDI1NSwyNTUsMCknKTsKICAgICAgbWN0eC5maWxsU3R5bGUgPSBncmFkOwogICAgICBtY3R4LmZpbGxSZWN0KDAsMCx3LGgpOwoKICAgICAgLy8gY29tcG9zaXRlOiBibHVycmVkIHZlcnNpb24gd2lsbCBiZSBibGVuZGVkIHdpdGggb3JpZ2luYWwgdmlhIG1hc2sgd2hlcmUgbWFzayBhbHBoYSA+IDAKICAgICAgY29uc3QgYmFzZSA9IG9jdHguZ2V0SW1hZ2VEYXRhKDAsMCx3LGgpOwogICAgICAvLyBwcm9kdWNlIGJsdXJyZWQgdmVyc2lvbiBmb3IgbWFzayBibGVuZGluZyAocXVpY2sgYmx1ciB2aWEgY3R4LmZpbHRlciBvciBIUSkKICAgICAgY29uc3QgYmx1cnJlZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOyBibHVycmVkLndpZHRoPXc7IGJsdXJyZWQuaGVpZ2h0PWg7CiAgICAgIGNvbnN0IGJjdHgyID0gYmx1cnJlZC5nZXRDb250ZXh0KCcyZCcpOwogICAgICBiY3R4Mi5kcmF3SW1hZ2Uob3V0LDAsMCk7CiAgICAgIGlmKG9wdGlvbnMuYmx1ciA+IDApewogICAgICAgIGlmKG9wdGlvbnMuaHFCbHVyKSBzZXBhcmFibGVHYXVzc2lhbkJsdXIoYmx1cnJlZCwgb3B0aW9ucy5ibHVyKTsKICAgICAgICBlbHNlIHsgYmN0eDIuZmlsdGVyID0gYGJsdXIoJHtvcHRpb25zLmJsdXJ9cHgpYDsgYmN0eDIuZHJhd0ltYWdlKGJsdXJyZWQsMCwwKTsgYmN0eDIuZmlsdGVyID0gJ25vbmUnOyB9CiAgICAgIH0KCiAgICAgIGNvbnN0IGJsdXJJbWcgPSBiY3R4Mi5nZXRJbWFnZURhdGEoMCwwLHcsaCk7CiAgICAgIGNvbnN0IG1hc2tJbWcgPSBtY3R4LmdldEltYWdlRGF0YSgwLDAsdyxoKTsKCiAgICAgIGZvcihsZXQgaT0wO2k8YmFzZS5kYXRhLmxlbmd0aDtpKz00KXsKICAgICAgICBjb25zdCBhID0gbWFza0ltZy5kYXRhW2krM10gLyAyNTU7CiAgICAgICAgLy8gYmFzZSA9IGJhc2UqKDEtYSkgKyBibHVyKmEKICAgICAgICBiYXNlLmRhdGFbaV0gICA9IGJhc2UuZGF0YVtpXSooMS1hKSArIGJsdXJJbWcuZGF0YVtpXSphOwogICAgICAgIGJhc2UuZGF0YVtpKzFdID0gYmFzZS5kYXRhW2krMV0qKDEtYSkgKyBibHVySW1nLmRhdGFbaSsxXSphOwogICAgICAgIGJhc2UuZGF0YVtpKzJdID0gYmFzZS5kYXRhW2krMl0qKDEtYSkgKyBibHVySW1nLmRhdGFbaSsyXSphOwogICAgICAgIGJhc2UuZGF0YVtpKzNdID0gMjU1OwogICAgICB9CiAgICAgIG9jdHgucHV0SW1hZ2VEYXRhKGJhc2UsMCwwKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIG90aGVyd2lzZSBzaW1wbGUgYmx1ciBpZiByZXF1ZXN0ZWQKICAgICAgaWYob3B0aW9ucy5ibHVyID4gMCl7CiAgICAgICAgaWYob3B0aW9ucy5ocUJsdXIpIHNlcGFyYWJsZUdhdXNzaWFuQmx1cihvdXQsIG9wdGlvbnMuYmx1cik7CiAgICAgICAgZWxzZSB7IG9jdHguZmlsdGVyID0gYGJsdXIoJHtvcHRpb25zLmJsdXJ9cHgpYDsgb2N0eC5kcmF3SW1hZ2Uob3V0LDAsMCk7IG9jdHguZmlsdGVyID0gJ25vbmUnOyB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gb3V0OwogIH0KCiAgLy8gLS0tIG1haW4gZ2VuZXJhdGUKICBmdW5jdGlvbiBnZW5lcmF0ZSgpewogICAgaWYoIXNyY0NhbnZhcykgcmV0dXJuOwogICAgY29uc3Qgb3B0aW9ucyA9IHsKICAgICAgbW9kZTogbW9kZUVsLnZhbHVlLAogICAgICBmZWF0aGVyOiBwYXJzZUludChmZWF0aGVyRWwudmFsdWUsIDEwKSwKICAgICAgYmx1cjogcGFyc2VJbnQoYmx1ckVsLnZhbHVlLCAxMCksCiAgICAgIHNtYXJ0QmxlbmQ6IHNtYXJ0RWwuY2hlY2tlZCwKICAgICAgZWRnZU1hdGNoOiBlZGdlTWF0Y2hFbC5jaGVja2VkLAogICAgICByYWRpYWw6IHJhZGlhbEVsLmNoZWNrZWQsCiAgICAgIGhxQmx1cjogaHFibHVyRWwuY2hlY2tlZAogICAgfTsKCiAgICBjb25zdCBvdXQgPSBtYWtlVGlsZWRPZmZzZXRJbWFnZShzcmNDYW52YXMsIG9wdGlvbnMpOwogICAgLy8gZHJhdyB0byByZXN1bHQgY2FudmFzCiAgICByZXN1bHRDYW52YXMud2lkdGggPSBvdXQud2lkdGg7CiAgICByZXN1bHRDYW52YXMuaGVpZ2h0ID0gb3V0LmhlaWdodDsKICAgIGNvbnN0IHJjdHggPSByZXN1bHRDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTsKICAgIHJjdHguY2xlYXJSZWN0KDAsMCxvdXQud2lkdGgsb3V0LmhlaWdodCk7CiAgICByY3R4LmRyYXdJbWFnZShvdXQsMCwwKTsKCiAgICAvLyB0aHVtYnMgKDN4MykgaWYgcmVxdWVzdGVkCiAgICB0aHVtYnMuaW5uZXJIVE1MID0gJyc7CiAgICBpZih0aWxlc0VsLmNoZWNrZWQpewogICAgICBjb25zdCB0aWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IHRpbGUud2lkdGggPSBvdXQud2lkdGgqMzsgdGlsZS5oZWlnaHQgPSBvdXQuaGVpZ2h0KjM7CiAgICAgIGNvbnN0IHRjdHggPSB0aWxlLmdldENvbnRleHQoJzJkJyk7CiAgICAgIGZvcihsZXQgaT0wO2k8MztpKyspIGZvcihsZXQgaj0wO2o8MztqKyspIHRjdHguZHJhd0ltYWdlKG91dCwgaSpvdXQud2lkdGgsIGoqb3V0LmhlaWdodCk7CiAgICAgIGNvbnN0IHRodW1iID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IHRodW1iLndpZHRoID0gMjQwOyB0aHVtYi5oZWlnaHQgPSAyNDA7CiAgICAgIHRodW1iLmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKHRpbGUsMCwwLHRpbGUud2lkdGgsdGlsZS5oZWlnaHQsMCwwLDI0MCwyNDApOwogICAgICB0aHVtYnMuYXBwZW5kQ2hpbGQodGh1bWIpOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgdGh1bWIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgdGh1bWIud2lkdGggPSBvdXQud2lkdGg7IHRodW1iLmhlaWdodCA9IG91dC5oZWlnaHQ7CiAgICAgIHRodW1iLmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKG91dCwwLDApOwogICAgICB0aHVtYnMuYXBwZW5kQ2hpbGQodGh1bWIpOwogICAgfQoKICAgIGluZm8udGV4dENvbnRlbnQgPSBgUmVzdWx0OiAke291dC53aWR0aH3DlyR7b3V0LmhlaWdodH0g4oCUIG1vZGU6JHtvcHRpb25zLm1vZGV9IGZlYXRoOiR7b3B0aW9ucy5mZWF0aGVyfXB4IGJsdXI6JHtvcHRpb25zLmJsdXJ9cHhgOwogIH0KCiAgLy8gbWF5YmUgZ2VuZXJhdGUgaWYgbGl2ZSBlbmFibGVkCiAgZnVuY3Rpb24gbWF5YmVHZW5lcmF0ZSgpeyBpZihsaXZlRWwuY2hlY2tlZCkgZ2VuZXJhdGUoKTsgfQoKICAvLyB3aXJlIGV2ZW50cwogIGdlbmVyYXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZ2VuZXJhdGUpOwogIHJlc2V0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVzZXRBbGwpOwogIGRvd25sb2FkQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCk9PnsKICAgIGNvbnN0IHNjYWxlID0gcGFyc2VJbnQoc2NhbGVFbC52YWx1ZSwxMCkgfHwgMTsKICAgIGNvbnN0IHcgPSByZXN1bHRDYW52YXMud2lkdGggKiBzY2FsZSwgaCA9IHJlc3VsdENhbnZhcy5oZWlnaHQgKiBzY2FsZTsKICAgIGNvbnN0IGV4ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IGV4LndpZHRoID0gdzsgZXguaGVpZ2h0ID0gaDsKICAgIGV4LmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKHJlc3VsdENhbnZhcywgMCwgMCwgdywgaCk7CiAgICBleC50b0Jsb2IoYmxvYj0+ewogICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOyBhLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOyBhLmRvd25sb2FkID0gJ3NlYW1sZXNzLnBuZyc7IGEuY2xpY2soKTsKICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpOwogICAgfSwgJ2ltYWdlL3BuZycpOwogIH0pOwoKICBjb3B5RGF0YUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpPT57CiAgICBjb25zdCBtZXRhID0gewogICAgICBtb2RlOiBtb2RlRWwudmFsdWUsIGZlYXRoZXI6IHBhcnNlSW50KGZlYXRoZXJFbC52YWx1ZSwxMCksIGJsdXI6IHBhcnNlSW50KGJsdXJFbC52YWx1ZSwxMCksCiAgICAgIHNtYXJ0QmxlbmQ6IHNtYXJ0RWwuY2hlY2tlZCwgZWRnZU1hdGNoOiBlZGdlTWF0Y2hFbC5jaGVja2VkLCByYWRpYWw6IHJhZGlhbEVsLmNoZWNrZWQsCiAgICAgIGhxQmx1cjogaHFibHVyRWwuY2hlY2tlZCwgYXV0b1BvdzI6IGF1dG9Qb3cyRWwuY2hlY2tlZAogICAgfTsKICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KEpTT04uc3RyaW5naWZ5KG1ldGEpKS50aGVuKCgpPT5hbGVydCgnQ29waWVkIHNldHRpbmdzIEpTT04nKSk7CiAgfSk7CgogIG9wZW5OZXdCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKT0+IHsKICAgIHRyeSB7IHdpbmRvdy5vcGVuKHJlc3VsdENhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL3BuZycpLCAnX2JsYW5rJyk7IH0gY2F0Y2goZSkgeyBhbGVydCgnVW5hYmxlIHRvIG9wZW4gaW1hZ2UnKTsgfQogIH0pOwoKICAvLyBhdHRhY2ggbGl2ZSBjaGFuZ2UgbGlzdGVuZXJzIGZvciBjb250cm9scwogIGNvbnN0IGxpdmVDb250cm9scyA9IFtmZWF0aGVyRWwsIGJsdXJFbCwgbW9kZUVsLCB0aWxlc0VsLCBsaXZlRWwsIHNtYXJ0RWwsIGVkZ2VNYXRjaEVsLCByYWRpYWxFbCwgaHFibHVyRWwsIGF1dG9Qb3cyRWxdOwogIGxpdmVDb250cm9scy5mb3JFYWNoKGVsID0+IGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgbWF5YmVHZW5lcmF0ZSkpOwogIC8vIGFsc28gaGFuZGxlIGNoYW5nZSBldmVudCBmb3Igc2VsZWN0cy9jaGVja2JveGVzCiAgbGl2ZUNvbnRyb2xzLmZvckVhY2goZWwgPT4gZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgbWF5YmVHZW5lcmF0ZSkpOwoKICAvLyBpbml0aWFsIGRlbW8KICAoZnVuY3Rpb24gcHJlZmlsbERlbW8oKXsKICAgIGNvbnN0IGRlbW8gPSAnZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsJyArIGVuY29kZVVSSUNvbXBvbmVudCgnPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIj48cmVjdCB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgZmlsbD0iIzdhYTdhOCIvPjxjaXJjbGUgY3g9IjI1NiIgY3k9IjI1NiIgcj0iMTQwIiBmaWxsPSIjNWQ4ZjhmIi8+PHJlY3QgeD0iNzAiIHk9IjcwIiB3aWR0aD0iMTIwIiBoZWlnaHQ9IjEyMCIgZmlsbD0iIzZmOWVhMCIvPjwvc3ZnPicpOwogICAgbG9hZEZyb21VUkwoZGVtbyk7CiAgfSkoKTsKCiAgPC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPgo=[/fusion_code][/fusion_builder_column][/fusion_builder_row][/fusion_builder_container]