Pixel Art Converter

[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]PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgICA8dGl0bGU+UGl4ZWwgUGVyZmVjdCBDb252ZXJ0ZXI8L3RpdGxlPgoJPHN0eWxlPgoJLyogQmFzZSBTdHlsZXMgKi8KKiB7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKfQoKYm9keSB7CiAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBSb2JvdG8sIE94eWdlbiwgVWJ1bnR1LCBDYW50YXJlbGwsICdPcGVuIFNhbnMnLCAnSGVsdmV0aWNhIE5ldWUnLCBzYW5zLXNlcmlmOwogICAgbGluZS1oZWlnaHQ6IDEuNjsKICAgIGNvbG9yOiAjMzMzOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgIzY2N2VlYSAwJSwgIzc2NGJhMiAxMDAlKTsKICAgIG1pbi1oZWlnaHQ6IDEwMHZoOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwoJbWF4LXdpZHRoOiAxMDAlOwoJbWFyZ2luOiAwIGF1dG87Cn0KCi5jb250YWluZXIgewogICAgd2lkdGg6IDEwMCU7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgIGJvcmRlci1yYWRpdXM6IDE2cHg7CiAgICBib3gtc2hhZG93OiAKICAgICAgICAwIDI1cHggNTBweCAtMTJweCByZ2JhKDAsIDAsIDAsIDAuMjUpLAogICAgICAgIDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuMDUpOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIG1hcmdpbjogMjBweCAwOwp9CgovKiBIZWFkZXIgU3R5bGVzICovCmhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjNGE5YmZmIDAlLCAjM2E3YmRlIDEwMCUpOwogICAgY29sb3I6IHdoaXRlOwogICAgcGFkZGluZzogMzBweCA0MHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4wNSk7Cn0KCmhlYWRlciBoMSB7CiAgICBmb250LXNpemU6IDIuNXJlbTsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgbGV0dGVyLXNwYWNpbmc6IC0wLjVweDsKICAgIHRleHQtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEpOwp9Cgouc3VidGl0bGUgewogICAgZm9udC1zaXplOiAxLjFyZW07CiAgICBvcGFjaXR5OiAwLjk7CiAgICBmb250LXdlaWdodDogNDAwOwp9CgovKiBNYWluIEFwcGxpY2F0aW9uIENvbnRhaW5lciAqLwouYXBwLWNvbnRhaW5lciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgZ2FwOiAzMHB4OwogICAgcGFkZGluZzogMzBweDsKfQoKLyogQ29udHJvbHMgU2VjdGlvbiAqLwouY29udHJvbHMgewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMzAwcHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMjVweDsKfQoKLmNvbnRyb2wtZ3JvdXAgewogICAgYmFja2dyb3VuZDogI2Y4ZjlmYTsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBwYWRkaW5nOiAyMHB4OwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOwp9CgouY29udHJvbC1ncm91cDpob3ZlciB7CiAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4wOCk7Cn0KCi5jb250cm9sLWdyb3VwIGgzIHsKICAgIGZvbnQtc2l6ZTogMS4ycmVtOwogICAgbWFyZ2luLWJvdHRvbTogMTVweDsKICAgIGNvbG9yOiAjMmMzZTUwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKfQoKLmNvbnRyb2wtZ3JvdXAgaDMgaSB7CiAgICBmb250LXNpemU6IDEuMXJlbTsKfQoKLyogSW5wdXQgU3R5bGVzICovCmlucHV0W3R5cGU9InJhbmdlIl0gewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIGJhY2tncm91bmQ6ICNlOWVjZWY7CiAgICBvdXRsaW5lOiBub25lOwogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgbWFyZ2luOiAxMHB4IDA7Cn0KCmlucHV0W3R5cGU9InJhbmdlIl06Oi13ZWJraXQtc2xpZGVyLXRodW1iIHsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIHdpZHRoOiAyMHB4OwogICAgaGVpZ2h0OiAyMHB4OwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgYmFja2dyb3VuZDogIzRhOWJmZjsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwp9CgppbnB1dFt0eXBlPSJyYW5nZSJdOjotd2Via2l0LXNsaWRlci10aHVtYjpob3ZlciB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMik7CiAgICBiYWNrZ3JvdW5kOiAjM2E3YmRlOwp9CgppbnB1dFt0eXBlPSJjaGVja2JveCJdIHsKICAgIHdpZHRoOiAxOHB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgpsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBjb2xvcjogIzJjM2U1MDsKfQoKLyogQnV0dG9uIFN0eWxlcyAqLwpidXR0b24gewogICAgcGFkZGluZzogMTRweCAyMHB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgIzRhOWJmZiAwJSwgIzNhN2JkZSAxMDAlKTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGNvbG9yOiB3aGl0ZTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGZvbnQtc2l6ZTogMXJlbTsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOwogICAgYm94LXNoYWRvdzogMCA0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xKTsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgd2lkdGg6IDEwMCU7CiAgICBtYXJnaW46IDEwcHggMDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKYnV0dG9uOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMnB4KTsKICAgIGJveC1zaGFkb3c6IDAgNnB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjE1KTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICMzYTdiZGUgMCUsICMyYTViYmQgMTAwJSk7Cn0KCmJ1dHRvbjpkaXNhYmxlZCB7CiAgICBiYWNrZ3JvdW5kOiAjZTllY2VmOwogICAgY29sb3I6ICM2Yzc1N2Q7CiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgdHJhbnNmb3JtOiBub25lOwogICAgYm94LXNoYWRvdzogbm9uZTsKfQoKYnV0dG9uOmFjdGl2ZTpub3QoOmRpc2FibGVkKSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7Cn0KCi8qIFByZXZpZXcgU2VjdGlvbiAqLwoucHJldmlldyB7CiAgICBmbGV4OiAyOwogICAgbWluLXdpZHRoOiA0MDBweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAyNXB4Owp9CgoucHJldmlldyBoMiB7CiAgICBmb250LXNpemU6IDEuNXJlbTsKICAgIGNvbG9yOiAjMmMzZTUwOwogICAgbWFyZ2luLWJvdHRvbTogMTVweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4Owp9CgouY2FudmFzLWNvbnRhaW5lciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBiYWNrZ3JvdW5kOiAjZjhmOWZhOwogICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4wOCk7CiAgICBwYWRkaW5nOiAxNXB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouY2FudmFzLWxhYmVsIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGJvdHRvbTogMTVweDsKICAgIGxlZnQ6IDUwJTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC43KTsKICAgIGNvbG9yOiB3aGl0ZTsKICAgIHBhZGRpbmc6IDhweCAxNXB4OwogICAgYm9yZGVyLXJhZGl1czogMjBweDsKICAgIGZvbnQtc2l6ZTogMC45cmVtOwogICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigycHgpOwogICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTsKfQoKLmNhbnZhcy1jb250YWluZXI6aG92ZXIgLmNhbnZhcy1sYWJlbCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODUpOwp9CgovKiBDYW52YXMgU3R5bGVzICovCmNhbnZhcyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IGF1dG87CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG1hcmdpbjogMCBhdXRvOwogICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEpOwp9CgovKiBTdGF0dXMgTWVzc2FnZSAqLwojc3RhdHVzTWVzc2FnZSB7CiAgICBwYWRkaW5nOiAxMnB4OwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgbWFyZ2luOiAxNXB4IDA7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBmb250LXdlaWdodDogNTAwOwogICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTsKfQoKI3N0YXR1c01lc3NhZ2Uuc3VjY2VzcyB7CiAgICBiYWNrZ3JvdW5kOiAjZDRlZGRhOwogICAgY29sb3I6ICMxNTU3MjQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjYzNlNmNiOwp9Cgojc3RhdHVzTWVzc2FnZS5lcnJvciB7CiAgICBiYWNrZ3JvdW5kOiAjZjhkN2RhOwogICAgY29sb3I6ICM3MjFjMjQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjZjVjNmNiOwp9Cgojc3RhdHVzTWVzc2FnZS5pbmZvIHsKICAgIGJhY2tncm91bmQ6ICNkMWVjZjE7CiAgICBjb2xvcjogIzBjNTQ2MDsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNiZWU1ZWI7Cn0KCi8qIEluc3RydWN0aW9ucyBTZWN0aW9uICovCi5pbnN0cnVjdGlvbnMgewogICAgcGFkZGluZzogMzBweDsKICAgIGJhY2tncm91bmQ6ICNmOGY5ZmE7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjA1KTsKfQoKLmluc3RydWN0aW9ucyBoMiB7CiAgICBmb250LXNpemU6IDEuOHJlbTsKICAgIGNvbG9yOiAjMmMzZTUwOwogICAgbWFyZ2luLWJvdHRvbTogMjBweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLmluc3RydWN0aW9ucyBvbCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgzMDBweCwgMWZyKSk7CiAgICBnYXA6IDE1cHg7CiAgICBsaXN0LXN0eWxlLXR5cGU6IGRlY2ltYWw7CiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7Cn0KCi5pbnN0cnVjdGlvbnMgbGkgewogICAgcGFkZGluZzogMTVweDsKICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlOwp9CgouaW5zdHJ1Y3Rpb25zIGxpOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg1cHgpOwogICAgYm94LXNoYWRvdzogMCA0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTsKfQoKLyogUmVzcG9uc2l2ZSBEZXNpZ24gKi8KQG1lZGlhIChtYXgtd2lkdGg6IDkwMHB4KSB7CiAgICAuYXBwLWNvbnRhaW5lciB7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIH0KICAgIAogICAgLmNvbnRyb2xzIHsKICAgICAgICBtaW4td2lkdGg6IDEwMCU7CiAgICB9CiAgICAKICAgIC5wcmV2aWV3IHsKICAgICAgICBtaW4td2lkdGg6IDEwMCU7CiAgICB9CiAgICAKICAgIGhlYWRlciBoMSB7CiAgICAgICAgZm9udC1zaXplOiAycmVtOwogICAgfQogICAgCiAgICAuY29udGFpbmVyIHsKICAgICAgICBtYXJnaW46IDEwcHg7CiAgICB9Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweCkgewogICAgLmNvbnRyb2wtZ3JvdXAgewogICAgICAgIHBhZGRpbmc6IDE1cHg7CiAgICB9CiAgICAKICAgIGhlYWRlciB7CiAgICAgICAgcGFkZGluZzogMjBweDsKICAgIH0KICAgIAogICAgaGVhZGVyIGgxIHsKICAgICAgICBmb250LXNpemU6IDEuOHJlbTsKICAgIH0KICAgIAogICAgLmluc3RydWN0aW9ucyBvbCB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICB9CiAgICAKICAgIC5jYW52YXMtY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgfQp9CgovKiBBbmltYXRpb24gKi8KQGtleWZyYW1lcyBmYWRlSW4gewogICAgZnJvbSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMjBweCk7CiAgICB9CiAgICB0byB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICB9Cn0KCi5jb250cm9sLWdyb3VwIHsKICAgIGFuaW1hdGlvbjogZmFkZUluIDAuNnMgZWFzZS1vdXQ7Cn0KCi8qIEZvY3VzIFN0YXRlcyAqLwpidXR0b246Zm9jdXMsCmlucHV0OmZvY3VzLApzZWxlY3Q6Zm9jdXMgewogICAgb3V0bGluZTogMnB4IHNvbGlkICM0YTliZmY7CiAgICBvdXRsaW5lLW9mZnNldDogMnB4Owp9CgovKiBVdGlsaXR5IENsYXNzZXMgKi8KLnRleHQtY2VudGVyIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLm1iLTIwIHsKICAgIG1hcmdpbi1ib3R0b206IDIwcHg7Cn0KCi5tdC0yMCB7CiAgICBtYXJnaW4tdG9wOiAyMHB4Owp9CgovKiBTY3JvbGxiYXIgU3R5bGluZyAqLwo6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiA4cHg7CiAgICBoZWlnaHQ6IDhweDsKfQoKOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7CiAgICBiYWNrZ3JvdW5kOiAjZjFmMWYxOwogICAgYm9yZGVyLXJhZGl1czogNHB4Owp9Cgo6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6ICM0YTliZmY7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7Cn0KCjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgewogICAgYmFja2dyb3VuZDogIzNhN2JkZTsKfQoKLyogTG9hZGluZyBTdGF0ZSAqLwoubG9hZGluZyB7CiAgICBvcGFjaXR5OiAwLjc7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLyogUHJvZ3Jlc3MgQmFyICovCi5wcm9ncmVzcy1jb250YWluZXIgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDhweDsKICAgIGJhY2tncm91bmQ6ICNlOWVjZWY7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBtYXJnaW46IDEwcHggMDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5wcm9ncmVzcy1iYXIgewogICAgaGVpZ2h0OiAxMDAlOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCAjNGE5YmZmLCAjM2E3YmRlKTsKICAgIHdpZHRoOiAwJTsKICAgIHRyYW5zaXRpb246IHdpZHRoIDAuM3MgZWFzZTsKfQo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICA8aGVhZGVyPgogICAgICAgICAgICA8aDE+UGl4ZWwgUGVyZmVjdCBDb252ZXJ0ZXI8L2gxPgogICAgICAgICAgICA8cCBjbGFzcz0ic3VidGl0bGUiPlRyYW5zZm9ybSB5b3VyIGltYWdlcyBpbnRvIGNyaXNwIHBpeGVsIGFydCB3aXRoIGFkanVzdGFibGUgYmxvY2sgc2l6ZXM8L3A+CiAgICAgICAgPC9oZWFkZXI+CiAgICAgICAgCiAgICAgICAgPGRpdiBjbGFzcz0iYXBwLWNvbnRhaW5lciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xzIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImZpbGVJbnB1dCI+Q2hvb3NlIGFuIGltYWdlIHRvIHVwbG9hZDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iYnJvd3NlQnRuIj5Ccm93c2U8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgaWQ9ImZpbGVJbnB1dCIgYWNjZXB0PSJpbWFnZS8qIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJzdGF0dXNNZXNzYWdlIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9ncmVzcy1jb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9ncmVzcy1iYXIiIGlkPSJwcm9ncmVzc0JhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWdyb3VwIj4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJwaXhlbFNpemUiPkJsb2NrIFNpemU6IDxzcGFuIGlkPSJwaXhlbFNpemVWYWx1ZSI+MTA8L3NwYW4+PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFuZ2UiIGlkPSJwaXhlbFNpemUiIG1pbj0iMiIgbWF4PSI1MCIgdmFsdWU9IjEwIj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImNvbG9yUHJlY2lzaW9uIj5Db2xvciBQcmVjaXNpb246IDxzcGFuIGlkPSJwcmVjaXNpb25WYWx1ZSI+Mjwvc3Bhbj48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYW5nZSIgaWQ9ImNvbG9yUHJlY2lzaW9uIiBtaW49IjAiIG1heD0iNSIgdmFsdWU9IjIiPgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0icHJlc2VydmVUcmFuc3BhcmVuY3kiPlByZXNlcnZlIFRyYW5zcGFyZW5jeTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0icHJlc2VydmVUcmFuc3BhcmVuY3kiPgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0idXNlQWxwaGEiPlVzZSBBbHBoYSAoVHJhbnNwYXJlbmN5KTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0idXNlQWxwaGEiPgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iY29udmVydEJ0biI+Q29udmVydCB0byBQaXhlbCBBcnQ8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImRvd25sb2FkQnRuIiBkaXNhYmxlZD5Eb3dubG9hZCBQaXhlbCBBcnQ8L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcmV2aWV3Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgIDxoMj5QcmV2aWV3PC9oMj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYW52YXMtY29udGFpbmVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcyBpZD0ib3JpZ2luYWxDYW52YXMiPjwvY2FudmFzPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYW52YXMtbGFiZWwiPk9yaWdpbmFsIEltYWdlPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FudmFzLWNvbnRhaW5lciIgc3R5bGU9Im1hcmdpbi10b3A6IDIwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcyBpZD0icGl4ZWxDYW52YXMiPjwvY2FudmFzPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYW52YXMtbGFiZWwiPlBpeGVsIEFydCBSZXN1bHQ8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxzY3JpcHQ+CiAgICAgICAgLy8gRE9NIEVsZW1lbnRzCiAgICAgICAgY29uc3QgZmlsZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGVJbnB1dCcpOwogICAgICAgIGNvbnN0IGJyb3dzZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdicm93c2VCdG4nKTsKICAgICAgICBjb25zdCBwaXhlbFNpemVTbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGl4ZWxTaXplJyk7CiAgICAgICAgY29uc3QgcGl4ZWxTaXplVmFsdWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGl4ZWxTaXplVmFsdWUnKTsKICAgICAgICBjb25zdCBjb2xvclByZWNpc2lvblNsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xvclByZWNpc2lvbicpOwogICAgICAgIGNvbnN0IHByZWNpc2lvblZhbHVlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZWNpc2lvblZhbHVlJyk7CiAgICAgICAgY29uc3QgcHJlc2VydmVUcmFuc3BhcmVuY3kgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJlc2VydmVUcmFuc3BhcmVuY3knKTsKICAgICAgICBjb25zdCB1c2VBbHBoYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1c2VBbHBoYScpOwogICAgICAgIGNvbnN0IGNvbnZlcnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udmVydEJ0bicpOwogICAgICAgIGNvbnN0IGRvd25sb2FkQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rvd25sb2FkQnRuJyk7CiAgICAgICAgY29uc3Qgc3RhdHVzTWVzc2FnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0dXNNZXNzYWdlJyk7CiAgICAgICAgY29uc3Qgb3JpZ2luYWxDYW52YXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3JpZ2luYWxDYW52YXMnKTsKICAgICAgICBjb25zdCBwaXhlbENhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaXhlbENhbnZhcycpOwogICAgICAgIGNvbnN0IHByb2dyZXNzQmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb2dyZXNzQmFyJyk7CgogICAgICAgIC8vIENhbnZhcyBjb250ZXh0cwogICAgICAgIGNvbnN0IG9yaWdpbmFsQ3R4ID0gb3JpZ2luYWxDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTsKICAgICAgICBjb25zdCBwaXhlbEN0eCA9IHBpeGVsQ2FudmFzLmdldENvbnRleHQoJzJkJyk7CgogICAgICAgIC8vIFN0YXRlIHZhcmlhYmxlcwogICAgICAgIGxldCBvcmlnaW5hbEltYWdlID0gbnVsbDsKICAgICAgICBsZXQgb3JpZ2luYWxXaWR0aCA9IDA7CiAgICAgICAgbGV0IG9yaWdpbmFsSGVpZ2h0ID0gMDsKICAgICAgICBsZXQgaXNDb252ZXJ0aW5nID0gZmFsc2U7CiAgICAgICAgbGV0IGlzRHJhZ2dpbmcgPSBmYWxzZTsKCiAgICAgICAgLy8gRXZlbnQgTGlzdGVuZXJzCiAgICAgICAgYnJvd3NlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gZmlsZUlucHV0LmNsaWNrKCkpOwogICAgICAgIGZpbGVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBoYW5kbGVGaWxlU2VsZWN0KTsKICAgICAgICBwaXhlbFNpemVTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7CiAgICAgICAgICAgIHBpeGVsU2l6ZVZhbHVlLnRleHRDb250ZW50ID0gcGl4ZWxTaXplU2xpZGVyLnZhbHVlOwogICAgICAgIH0pOwogICAgICAgIGNvbG9yUHJlY2lzaW9uU2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4gewogICAgICAgICAgICBwcmVjaXNpb25WYWx1ZS50ZXh0Q29udGVudCA9IGNvbG9yUHJlY2lzaW9uU2xpZGVyLnZhbHVlOwogICAgICAgIH0pOwogICAgICAgIGNvbnZlcnRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjb252ZXJ0SW1hZ2UpOwogICAgICAgIGRvd25sb2FkQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZG93bmxvYWRJbWFnZSk7CgogICAgICAgIC8vIERyYWcgYW5kIGRyb3AgZnVuY3Rpb25hbGl0eQogICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb250YWluZXInKTsKICAgICAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCAoZSkgPT4gewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIGlzRHJhZ2dpbmcgPSB0cnVlOwogICAgICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZHJhZy1vdmVyJyk7CiAgICAgICAgfSk7CgogICAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCAoKSA9PiB7CiAgICAgICAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTsKICAgICAgICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWctb3ZlcicpOwogICAgICAgIH0pOwoKICAgICAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIChlKSA9PiB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgaXNEcmFnZ2luZyA9IGZhbHNlOwogICAgICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZy1vdmVyJyk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoZS5kYXRhVHJhbnNmZXIuZmlsZXMgJiYgZS5kYXRhVHJhbnNmZXIuZmlsZXNbMF0pIHsKICAgICAgICAgICAgICAgIGZpbGVJbnB1dC5maWxlcyA9IGUuZGF0YVRyYW5zZmVyLmZpbGVzOwogICAgICAgICAgICAgICAgaGFuZGxlRmlsZVNlbGVjdCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIC8vIEluaXRpYWxpemUgY2FudmFzIHNpemVzCiAgICAgICAgZnVuY3Rpb24gaW5pdENhbnZhc2VzKCkgewogICAgICAgICAgICBvcmlnaW5hbENhbnZhcy53aWR0aCA9IDQwMDsKICAgICAgICAgICAgb3JpZ2luYWxDYW52YXMuaGVpZ2h0ID0gMzAwOwogICAgICAgICAgICBwaXhlbENhbnZhcy53aWR0aCA9IDQwMDsKICAgICAgICAgICAgcGl4ZWxDYW52YXMuaGVpZ2h0ID0gMzAwOwogICAgICAgIH0KCiAgICAgICAgLy8gSGFuZGxlIGZpbGUgc2VsZWN0aW9uCiAgICAgICAgZnVuY3Rpb24gaGFuZGxlRmlsZVNlbGVjdCgpIHsKICAgICAgICAgICAgaWYgKGZpbGVJbnB1dC5maWxlcyAmJiBmaWxlSW5wdXQuZmlsZXNbMF0pIHsKICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBmaWxlSW5wdXQuZmlsZXNbMF07CgogICAgICAgICAgICAgICAgaWYgKCFmaWxlLnR5cGUubWF0Y2goJ2ltYWdlLionKSkgewogICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCdQbGVhc2Ugc2VsZWN0IGFuIGltYWdlIGZpbGUnLCAnZXJyb3InKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKCiAgICAgICAgICAgICAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEltYWdlID0gbmV3IEltYWdlKCk7CiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxJbWFnZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIG9yaWdpbmFsIGltYWdlIGRpbWVuc2lvbnMKICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxXaWR0aCA9IG9yaWdpbmFsSW1hZ2Uud2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsSGVpZ2h0ID0gb3JpZ2luYWxJbWFnZS5oZWlnaHQ7CgogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhXaWR0aCA9IDQwMDsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gMzAwOwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgeyB3aWR0aCwgaGVpZ2h0IH0gPSBvcmlnaW5hbEltYWdlOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoID4gbWF4V2lkdGggfHwgaGVpZ2h0ID4gbWF4SGVpZ2h0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYXRpbyA9IE1hdGgubWluKG1heFdpZHRoIC8gd2lkdGgsIG1heEhlaWdodCAvIGhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IE1hdGguZmxvb3Iod2lkdGggKiByYXRpbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBNYXRoLmZsb29yKGhlaWdodCAqIHJhdGlvKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGJvdGggY2FudmFzZXMgdG8gdGhlIHJlc2l6ZWQgc2l6ZSAoZm9yIHByZXZpZXcpCiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsQ2FudmFzLndpZHRoID0gd2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsQ2FudmFzLmhlaWdodCA9IGhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxDYW52YXMud2lkdGggPSB3aWR0aDsKICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxDYW52YXMuaGVpZ2h0ID0gaGVpZ2h0OwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgYW5kIGRyYXcgdGhlIG9yaWdpbmFsIGltYWdlIG9udG8gdGhlIG9yaWdpbmFsIGNhbnZhcwogICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEN0eC5jbGVhclJlY3QoMCwgMCwgb3JpZ2luYWxDYW52YXMud2lkdGgsIG9yaWdpbmFsQ2FudmFzLmhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsQ3R4LmRyYXdJbWFnZShvcmlnaW5hbEltYWdlLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCdJbWFnZSBsb2FkZWQgc3VjY2Vzc2Z1bGx5LiBSZWFkeSB0byBjb252ZXJ0LicsICdzdWNjZXNzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkQnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEltYWdlLnNyYyA9IGUudGFyZ2V0LnJlc3VsdDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFNob3cgc3RhdHVzIG1lc3NhZ2UKICAgICAgICBmdW5jdGlvbiBzaG93TWVzc2FnZSh0ZXh0LCB0eXBlID0gJ2luZm8nKSB7CiAgICAgICAgICAgIHN0YXR1c01lc3NhZ2UudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgICAgICAgICBzdGF0dXNNZXNzYWdlLmNsYXNzTmFtZSA9IGBzdGF0dXNNZXNzYWdlICR7dHlwZX1gOwogICAgICAgIH0KCiAgICAgICAgLy8gQ29udmVydCBpbWFnZSB0byBwaXhlbCBhcnQKICAgICAgICBmdW5jdGlvbiBjb252ZXJ0SW1hZ2UoKSB7CiAgICAgICAgICAgIGlmICghb3JpZ2luYWxJbWFnZSkgewogICAgICAgICAgICAgICAgc2hvd01lc3NhZ2UoJ1BsZWFzZSB1cGxvYWQgYW4gaW1hZ2UgZmlyc3QnLCAnZXJyb3InKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGlzQ29udmVydGluZykgcmV0dXJuOwoKICAgICAgICAgICAgaXNDb252ZXJ0aW5nID0gdHJ1ZTsKICAgICAgICAgICAgY29udmVydEJ0bi5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICAgIGNvbnZlcnRCdG4udGV4dENvbnRlbnQgPSAnUHJvY2Vzc2luZy4uLic7CiAgICAgICAgICAgIHNob3dNZXNzYWdlKCdQcm9jZXNzaW5nIGltYWdlLi4uJywgJ2luZm8nKTsKICAgICAgICAgICAgcHJvZ3Jlc3NCYXIuc3R5bGUud2lkdGggPSAnMCUnOwoKICAgICAgICAgICAgLy8gU2ltdWxhdGUgcHJvZ3Jlc3MKICAgICAgICAgICAgbGV0IHByb2dyZXNzID0gMDsKICAgICAgICAgICAgY29uc3QgcHJvZ3Jlc3NJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHsKICAgICAgICAgICAgICAgIHByb2dyZXNzICs9IDU7CiAgICAgICAgICAgICAgICBwcm9ncmVzc0Jhci5zdHlsZS53aWR0aCA9IGAke3Byb2dyZXNzfSVgOwogICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzID49IDEwMCkgewogICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NJbnRlcnZhbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIDUwKTsKCiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9ja1NpemUgPSBwYXJzZUludChwaXhlbFNpemVTbGlkZXIudmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZWNpc2lvbiA9IHBhcnNlSW50KGNvbG9yUHJlY2lzaW9uU2xpZGVyLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmVzZXJ2ZVRyYW5zcGFyZW5jeUZsYWcgPSBwcmVzZXJ2ZVRyYW5zcGFyZW5jeS5jaGVja2VkOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZUFscGhhRmxhZyA9IHVzZUFscGhhLmNoZWNrZWQ7CgogICAgICAgICAgICAgICAgICAgIHByb2Nlc3NJbWFnZShibG9ja1NpemUsIHByZWNpc2lvbiwgcHJlc2VydmVUcmFuc3BhcmVuY3lGbGFnLCB1c2VBbHBoYUZsYWcpOwogICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCdDb252ZXJzaW9uIGNvbXBsZXRlISBEb3dubG9hZCB5b3VyIHBpeGVsIGFydC4nLCAnc3VjY2VzcycpOwogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkQnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCdFcnJvciBkdXJpbmcgY29udmVyc2lvbjogJyArIGVycm9yLm1lc3NhZ2UsICdlcnJvcicpOwogICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICBpc0NvbnZlcnRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBjb252ZXJ0QnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgY29udmVydEJ0bi50ZXh0Q29udGVudCA9ICdDb252ZXJ0IHRvIFBpeGVsIEFydCc7CiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXIuc3R5bGUud2lkdGggPSAnMCUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KCiAgICAgICAgLy8gUHJvY2VzcyBpbWFnZSB0byBwaXhlbCBhcnQKICAgICAgICBmdW5jdGlvbiBwcm9jZXNzSW1hZ2UoYmxvY2tTaXplLCBwcmVjaXNpb24sIHByZXNlcnZlVHJhbnNwYXJlbmN5RmxhZywgdXNlQWxwaGFGbGFnKSB7CiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gcGl4ZWxDYW52YXMud2lkdGg7CiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHBpeGVsQ2FudmFzLmhlaWdodDsKICAgICAgICAgICAgY29uc3QgaW1hZ2VEYXRhID0gb3JpZ2luYWxDdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwogICAgICAgICAgICBjb25zdCBkYXRhID0gaW1hZ2VEYXRhLmRhdGE7CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdERhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoZGF0YS5sZW5ndGgpOwoKICAgICAgICAgICAgLy8gUHJvY2VzcyBhbGwgYmxvY2tzIHN5bmNocm9ub3VzbHkgZm9yIHNpbXBsaWNpdHkKICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gYmxvY2tTaXplKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IGJsb2NrU2l6ZSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvbWluYW50Q29sb3IgPSBnZXREb21pbmFudENvbG9ySW5CbG9jayhkYXRhLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBibG9ja1NpemUsIHVzZUFscGhhRmxhZyk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYnkgPSAwOyBieSA8IGJsb2NrU2l6ZSAmJiAoeSArIGJ5KSA8IGhlaWdodDsgYnkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBieCA9IDA7IGJ4IDwgYmxvY2tTaXplICYmICh4ICsgYngpIDwgd2lkdGg7IGJ4KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9ICgoeSArIGJ5KSAqIHdpZHRoICsgKHggKyBieCkpICogNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZVRyYW5zcGFyZW5jeUZsYWcgJiYgZG9taW5hbnRDb2xvci5hID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RGF0YVtpZHhdID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHREYXRhW2lkeCArIDFdID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHREYXRhW2lkeCArIDJdID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHREYXRhW2lkeCArIDNdID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RGF0YVtpZHhdID0gZG9taW5hbnRDb2xvci5yICogMjU1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdERhdGFbaWR4ICsgMV0gPSBkb21pbmFudENvbG9yLmcgKiAyNTU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RGF0YVtpZHggKyAyXSA9IGRvbWluYW50Q29sb3IuYiAqIDI1NTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHREYXRhW2lkeCArIDNdID0gZG9taW5hbnRDb2xvci5hICogMjU1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBEcmF3IHRoZSByZXN1bHQgdG8gdGhlIHBpeGVsIGNhbnZhcwogICAgICAgICAgICBjb25zdCBuZXdJbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKHJlc3VsdERhdGEsIHdpZHRoLCBoZWlnaHQpOwogICAgICAgICAgICBwaXhlbEN0eC5wdXRJbWFnZURhdGEobmV3SW1hZ2VEYXRhLCAwLCAwKTsKICAgICAgICB9CgogICAgICAgIC8vIEdldCB0aGUgZG9taW5hbnQgY29sb3IgaW4gYSBibG9jawogICAgICAgIGZ1bmN0aW9uIGdldERvbWluYW50Q29sb3JJbkJsb2NrKGRhdGEsIHN0YXJ0WCwgc3RhcnRZLCB3aWR0aCwgaGVpZ2h0LCBibG9ja1NpemUsIHVzZUFscGhhRmxhZykgewogICAgICAgICAgICBsZXQgY29sb3JDb3VudCA9IHt9OwogICAgICAgICAgICBsZXQgdG90YWxQaXhlbHMgPSAwOwoKICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBibG9ja1NpemUgJiYgc3RhcnRZICsgeSA8IGhlaWdodDsgeSsrKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGJsb2NrU2l6ZSAmJiBzdGFydFggKyB4IDwgd2lkdGg7IHgrKykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9ICgoc3RhcnRZICsgeSkgKiB3aWR0aCArIChzdGFydFggKyB4KSkgKiA0OwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBkYXRhW2lkeF0gLyAyNTU7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZyA9IGRhdGFbaWR4ICsgMV0gLyAyNTU7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IGRhdGFbaWR4ICsgMl0gLyAyNTU7CiAgICAgICAgICAgICAgICAgICAgbGV0IGEgPSBkYXRhW2lkeCArIDNdIC8gMjU1OwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXVzZUFscGhhRmxhZykgYSA9IDE7CgogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbG9yID0gcm91bmRDb2xvcih7IHIsIGcsIGIsIGEgfSk7CgogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbG9yS2V5ID0gYCR7Y29sb3Iucn0sJHtjb2xvci5nfSwke2NvbG9yLmJ9LCR7Y29sb3IuYX1gOwogICAgICAgICAgICAgICAgICAgIGlmIChjb2xvckNvdW50W2NvbG9yS2V5XSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvckNvdW50W2NvbG9yS2V5XSsrOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yQ291bnRbY29sb3JLZXldID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdG90YWxQaXhlbHMrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgZG9taW5hbnRDb2xvcktleSA9IE9iamVjdC5rZXlzKGNvbG9yQ291bnQpLnJlZHVjZSgoYSwgYikgPT4gY29sb3JDb3VudFthXSA+IGNvbG9yQ291bnRbYl0gPyBhIDogYik7CiAgICAgICAgICAgIGNvbnN0IFtyLCBnLCBiLCBhXSA9IGRvbWluYW50Q29sb3JLZXkuc3BsaXQoJywnKS5tYXAoTnVtYmVyKTsKCiAgICAgICAgICAgIHJldHVybiB7IHIsIGcsIGIsIGEgfTsKICAgICAgICB9CgogICAgICAgIC8vIFJvdW5kIGNvbG9yIHZhbHVlcwogICAgICAgIGZ1bmN0aW9uIHJvdW5kQ29sb3IoY29sb3IsIHByZWNpc2lvbiA9IDQpIHsKICAgICAgICAgICAgY29uc3QgZmFjdG9yID0gTWF0aC5wb3coMTAsIHByZWNpc2lvbik7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICByOiBNYXRoLnJvdW5kKGNvbG9yLnIgKiBmYWN0b3IpIC8gZmFjdG9yLAogICAgICAgICAgICAgICAgZzogTWF0aC5yb3VuZChjb2xvci5nICogZmFjdG9yKSAvIGZhY3RvciwKICAgICAgICAgICAgICAgIGI6IE1hdGgucm91bmQoY29sb3IuYiAqIGZhY3RvcikgLyBmYWN0b3IsCiAgICAgICAgICAgICAgICBhOiBNYXRoLnJvdW5kKGNvbG9yLmEgKiBmYWN0b3IpIC8gZmFjdG9yCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAvLyBEb3dubG9hZCB0aGUgcmVzdWx0IHdpdGggb3JpZ2luYWwgaW1hZ2UgZGltZW5zaW9ucwogICAgICAgIGZ1bmN0aW9uIGRvd25sb2FkSW1hZ2UoKSB7CiAgICAgICAgICAgIGlmICghb3JpZ2luYWxJbWFnZSkgcmV0dXJuOwogICAgICAgICAgICAKICAgICAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgICAgICAgbGluay5kb3dubG9hZCA9ICdwaXhlbC1hcnQucG5nJzsKCiAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBjYW52YXMgdG8gdXNlIHRoZSBvcmlnaW5hbCBzaXplIGZvciBkb3dubG9hZGluZwogICAgICAgICAgICBjb25zdCBkb3dubG9hZENhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOwogICAgICAgICAgICBkb3dubG9hZENhbnZhcy53aWR0aCA9IG9yaWdpbmFsV2lkdGg7CiAgICAgICAgICAgIGRvd25sb2FkQ2FudmFzLmhlaWdodCA9IG9yaWdpbmFsSGVpZ2h0OwogICAgICAgICAgICBjb25zdCBkb3dubG9hZEN0eCA9IGRvd25sb2FkQ2FudmFzLmdldENvbnRleHQoJzJkJyk7CgogICAgICAgICAgICAvLyBEcmF3IHRoZSBwaXhlbCBhcnQgaW1hZ2Ugb24gdGhlIG5ldyBjYW52YXMgYXQgb3JpZ2luYWwgZGltZW5zaW9ucwogICAgICAgICAgICBkb3dubG9hZEN0eC5kcmF3SW1hZ2UocGl4ZWxDYW52YXMsIDAsIDAsIG9yaWdpbmFsV2lkdGgsIG9yaWdpbmFsSGVpZ2h0KTsKCiAgICAgICAgICAgIC8vIERvd25sb2FkIHRoZSBpbWFnZSBhcyBQTkcKICAgICAgICAgICAgbGluay5ocmVmID0gZG93bmxvYWRDYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTsKICAgICAgICAgICAgbGluay5jbGljaygpOwogICAgICAgICAgICBzaG93TWVzc2FnZSgnRG93bmxvYWQgc3RhcnRlZCEnLCAnc3VjY2VzcycpOwogICAgICAgIH0KCiAgICAgICAgLy8gSW5pdGlhbGl6ZQogICAgICAgIGluaXRDYW52YXNlcygpOwogICAgPC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPg==[/fusion_code][/fusion_builder_column][/fusion_builder_row][/fusion_builder_container]