← All changes
|
includes/page-availability/_out/availability_page.js
+141
-195
10.1.3
→
11.9
View file →
| @@ -1,13 +1,11 @@ | ||
| 1 | 1 | "use strict"; |
| 2 | + | |
| 2 | 3 | /** |
| 3 | 4 | * Request Object |
| 4 | 5 | * Here we can define Search parameters and Update it later, when some parameter was changed |
| 5 | 6 | * |
| 6 | 7 | */ |
| 7 | - | |
| 8 | -function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } | |
| 9 | - | |
| 10 | 8 | var wpbc_ajx_availability = function (obj, $) { |
| 11 | 9 | // Secure parameters for Ajax ------------------------------------------------------------------------------------ |
| 12 | 10 | var p_secure = obj.security_obj = obj.security_obj || { |
| 13 | 11 | user_id: 0, |
| @@ -13,19 +11,18 @@ | ||
| 13 | 11 | user_id: 0, |
| 14 | 12 | nonce: '', |
| 15 | 13 | locale: '' |
| 16 | 14 | }; |
| 17 | - | |
| 18 | 15 | obj.set_secure_param = function (param_key, param_val) { |
| 19 | 16 | p_secure[param_key] = param_val; |
| 20 | 17 | }; |
| 21 | - | |
| 22 | 18 | obj.get_secure_param = function (param_key) { |
| 23 | 19 | return p_secure[param_key]; |
| 24 | - }; // Listing Search parameters ------------------------------------------------------------------------------------ | |
| 20 | + }; | |
| 25 | 21 | |
| 26 | - | |
| 27 | - var p_listing = obj.search_request_obj = obj.search_request_obj || {// sort : "booking_id", | |
| 22 | + // Listing Search parameters ------------------------------------------------------------------------------------ | |
| 23 | + var p_listing = obj.search_request_obj = obj.search_request_obj || { | |
| 24 | + // sort : "booking_id", | |
| 28 | 25 | // sort_type : "DESC", |
| 29 | 26 | // page_num : 1, |
| 30 | 27 | // page_items_count: 10, |
| 31 | 28 | // create_date : "", |
| @@ -31,21 +28,17 @@ | ||
| 31 | 28 | // create_date : "", |
| 32 | 29 | // keyword : "", |
| 33 | 30 | // source : "" |
| 34 | 31 | }; |
| 35 | - | |
| 36 | 32 | obj.search_set_all_params = function (request_param_obj) { |
| 37 | 33 | p_listing = request_param_obj; |
| 38 | 34 | }; |
| 39 | - | |
| 40 | 35 | obj.search_get_all_params = function () { |
| 41 | 36 | return p_listing; |
| 42 | 37 | }; |
| 43 | - | |
| 44 | 38 | obj.search_get_param = function (param_key) { |
| 45 | 39 | return p_listing[param_key]; |
| 46 | 40 | }; |
| 47 | - | |
| 48 | 41 | obj.search_set_param = function (param_key, param_val) { |
| 49 | 42 | // if ( Array.isArray( param_val ) ){ |
| 50 | 43 | // param_val = JSON.stringify( param_val ); |
| 51 | 44 | // } |
| @@ -50,31 +43,27 @@ | ||
| 50 | 43 | // param_val = JSON.stringify( param_val ); |
| 51 | 44 | // } |
| 52 | 45 | p_listing[param_key] = param_val; |
| 53 | 46 | }; |
| 54 | - | |
| 55 | 47 | obj.search_set_params_arr = function (params_arr) { |
| 56 | 48 | _.each(params_arr, function (p_val, p_key, p_data) { |
| 57 | 49 | // Define different Search parameters for request |
| 58 | 50 | this.search_set_param(p_key, p_val); |
| 59 | 51 | }); |
| 60 | - }; // Other parameters ------------------------------------------------------------------------------------ | |
| 52 | + }; | |
| 61 | 53 | |
| 62 | - | |
| 54 | + // Other parameters ------------------------------------------------------------------------------------ | |
| 63 | 55 | var p_other = obj.other_obj = obj.other_obj || {}; |
| 64 | - | |
| 65 | 56 | obj.set_other_param = function (param_key, param_val) { |
| 66 | 57 | p_other[param_key] = param_val; |
| 67 | 58 | }; |
| 68 | - | |
| 69 | 59 | obj.get_other_param = function (param_key) { |
| 70 | 60 | return p_other[param_key]; |
| 71 | 61 | }; |
| 72 | - | |
| 73 | 62 | return obj; |
| 74 | 63 | }(wpbc_ajx_availability || {}, jQuery); |
| 64 | +var wpbc_ajx_bookings = []; | |
| 75 | 65 | |
| 76 | -var wpbc_ajx_bookings = []; | |
| 77 | 66 | /** |
| 78 | 67 | * Show Content ---------------------------------------------------------------------------------------------- */ |
| 79 | 68 | |
| 80 | 69 | /** |
| @@ -83,12 +72,12 @@ | ||
| 83 | 72 | * @param ajx_data_arr |
| 84 | 73 | * @param ajx_search_params |
| 85 | 74 | * @param ajx_cleaned_params |
| 86 | 75 | */ |
| 87 | - | |
| 88 | 76 | function wpbc_ajx_availability__page_content__show(ajx_data_arr, ajx_search_params, ajx_cleaned_params) { |
| 89 | - var template__availability_main_page_content = wp.template('wpbc_ajx_availability_main_page_content'); // Content | |
| 77 | + var template__availability_main_page_content = wp.template('wpbc_ajx_availability_main_page_content'); | |
| 90 | 78 | |
| 79 | + // Content | |
| 91 | 80 | jQuery(wpbc_ajx_availability.get_other_param('listing_container')).html(template__availability_main_page_content({ |
| 92 | 81 | 'ajx_data': ajx_data_arr, |
| 93 | 82 | 'ajx_search_params': ajx_search_params, |
| 94 | 83 | // $_REQUEST[ 'search_params' ] |
| @@ -93,10 +82,10 @@ | ||
| 93 | 82 | 'ajx_search_params': ajx_search_params, |
| 94 | 83 | // $_REQUEST[ 'search_params' ] |
| 95 | 84 | 'ajx_cleaned_params': ajx_cleaned_params |
| 96 | 85 | })); |
| 97 | - jQuery('.wpbc_processing.wpbc_spin').parent().parent().parent().parent('[id^="wpbc_notice_"]').hide(); // Load calendar | |
| 98 | - | |
| 86 | + jQuery('.wpbc_processing.wpbc_spin').parent().parent().parent().parent('[id^="wpbc_notice_"]').hide(); | |
| 87 | + // Load calendar | |
| 99 | 88 | wpbc_ajx_availability__calendar__show({ |
| 100 | 89 | 'resource_id': ajx_cleaned_params.resource_id, |
| 101 | 90 | 'ajx_nonce_calendar': ajx_data_arr.ajx_nonce_calendar, |
| 102 | 91 | 'ajx_data_arr': ajx_data_arr, |
| @@ -101,16 +90,17 @@ | ||
| 101 | 90 | 'ajx_nonce_calendar': ajx_data_arr.ajx_nonce_calendar, |
| 102 | 91 | 'ajx_data_arr': ajx_data_arr, |
| 103 | 92 | 'ajx_cleaned_params': ajx_cleaned_params |
| 104 | 93 | }); |
| 94 | + | |
| 105 | 95 | /** |
| 106 | 96 | * Trigger for dates selection in the booking form |
| 107 | 97 | * |
| 108 | 98 | * jQuery( wpbc_ajx_availability.get_other_param( 'listing_container' ) ).on('wpbc_page_content_loaded', function(event, ajx_data_arr, ajx_search_params , ajx_cleaned_params) { ... } ); |
| 109 | 99 | */ |
| 110 | - | |
| 111 | 100 | jQuery(wpbc_ajx_availability.get_other_param('listing_container')).trigger('wpbc_page_content_loaded', [ajx_data_arr, ajx_search_params, ajx_cleaned_params]); |
| 112 | 101 | } |
| 102 | + | |
| 113 | 103 | /** |
| 114 | 104 | * Show inline month view calendar with all predefined CSS (sizes and check in/out, times containers) |
| 115 | 105 | * @param {obj} calendar_params_arr |
| 116 | 106 | { |
| @@ -119,9 +109,8 @@ | ||
| 119 | 109 | 'ajx_data_arr' : ajx_data_arr = { ajx_booking_resources:[], booked_dates: {}, resource_unavailable_dates:[], season_availability:{},.... } |
| 120 | 110 | 'ajx_cleaned_params' : { |
| 121 | 111 | calendar__days_selection_mode: "dynamic" |
| 122 | 112 | calendar__start_week_day: "0" |
| 123 | - calendar__timeslot_day_bg_as_available: "" | |
| 124 | 113 | calendar__view__cell_height: "" |
| 125 | 114 | calendar__view__months_in_row: 4 |
| 126 | 115 | calendar__view__visible_months: 12 |
| 127 | 116 | calendar__view__width: "100%" |
| @@ -134,27 +123,25 @@ | ||
| 134 | 123 | ui_usr__availability_selected_toolbar: "info" |
| 135 | 124 | } |
| 136 | 125 | } |
| 137 | 126 | */ |
| 138 | - | |
| 139 | - | |
| 140 | 127 | function wpbc_ajx_availability__calendar__show(calendar_params_arr) { |
| 141 | 128 | // Update nonce |
| 142 | - jQuery('#ajx_nonce_calendar_section').html(calendar_params_arr.ajx_nonce_calendar); //------------------------------------------------------------------------------------------------------------------ | |
| 129 | + jQuery('#ajx_nonce_calendar_section').html(calendar_params_arr.ajx_nonce_calendar); | |
| 130 | + | |
| 131 | + //------------------------------------------------------------------------------------------------------------------ | |
| 143 | 132 | // Update bookings |
| 144 | - | |
| 145 | 133 | if ('undefined' == typeof wpbc_ajx_bookings[calendar_params_arr.resource_id]) { |
| 146 | 134 | wpbc_ajx_bookings[calendar_params_arr.resource_id] = []; |
| 147 | 135 | } |
| 136 | + wpbc_ajx_bookings[calendar_params_arr.resource_id] = calendar_params_arr['ajx_data_arr']['booked_dates']; | |
| 148 | 137 | |
| 149 | - wpbc_ajx_bookings[calendar_params_arr.resource_id] = calendar_params_arr['ajx_data_arr']['booked_dates']; //------------------------------------------------------------------------------------------------------------------ | |
| 150 | - | |
| 138 | + //------------------------------------------------------------------------------------------------------------------ | |
| 151 | 139 | /** |
| 152 | 140 | * Define showing mouse over tooltip on unavailable dates |
| 153 | 141 | * It's defined, when calendar REFRESHED (change months or days selection) loaded in jquery.datepick.wpbc.9.0.js : |
| 154 | - * $( 'body' ).trigger( 'wpbc_datepick_inline_calendar_refresh', ... //FixIn: 9.4.4.13 | |
| 142 | + * $( 'body' ).trigger( 'wpbc_datepick_inline_calendar_refresh', ... // FixIn: 9.4.4.13. | |
| 155 | 143 | */ |
| 156 | - | |
| 157 | 144 | jQuery('body').on('wpbc_datepick_inline_calendar_refresh', function (event, resource_id, inst) { |
| 158 | 145 | // inst.dpDiv it's: <div class="datepick-inline datepick-multi" style="width: 17712px;">....</div> |
| 159 | 146 | inst.dpDiv.find('.season_unavailable,.before_after_unavailable,.weekdays_unavailable').on('mouseover', function (this_event) { |
| 160 | 147 | // also available these vars: resource_id, jCalContainer, inst |
| @@ -160,33 +147,35 @@ | ||
| 160 | 147 | // also available these vars: resource_id, jCalContainer, inst |
| 161 | 148 | var jCell = jQuery(this_event.currentTarget); |
| 162 | 149 | wpbc_avy__show_tooltip__for_element(jCell, calendar_params_arr['ajx_data_arr']['popover_hints']); |
| 163 | 150 | }); |
| 164 | - }); //------------------------------------------------------------------------------------------------------------------ | |
| 151 | + }); | |
| 165 | 152 | |
| 153 | + //------------------------------------------------------------------------------------------------------------------ | |
| 166 | 154 | /** |
| 167 | 155 | * Define height of the calendar cells, and mouse over tooltips at some unavailable dates |
| 168 | 156 | * It's defined, when calendar loaded in jquery.datepick.wpbc.9.0.js : |
| 169 | - * $( 'body' ).trigger( 'wpbc_datepick_inline_calendar_loaded', ... //FixIn: 9.4.4.12 | |
| 157 | + * $( 'body' ).trigger( 'wpbc_datepick_inline_calendar_loaded', ... // FixIn: 9.4.4.12. | |
| 170 | 158 | */ |
| 171 | - | |
| 172 | 159 | jQuery('body').on('wpbc_datepick_inline_calendar_loaded', function (event, resource_id, jCalContainer, inst) { |
| 173 | 160 | // Remove highlight day for today date |
| 174 | - jQuery('.datepick-days-cell.datepick-today.datepick-days-cell-over').removeClass('datepick-days-cell-over'); // Set height of calendar cells if defined this option | |
| 161 | + jQuery('.datepick-days-cell.datepick-today.datepick-days-cell-over').removeClass('datepick-days-cell-over'); | |
| 175 | 162 | |
| 163 | + // Set height of calendar cells if defined this option // FixIn: 10.12.4.2. | |
| 176 | 164 | if ('' !== calendar_params_arr.ajx_cleaned_params.calendar__view__cell_height) { |
| 177 | - jQuery('head').append('<style type="text/css">' + '.hasDatepick .datepick-inline .datepick-title-row th, ' + '.hasDatepick .datepick-inline .datepick-days-cell {' + 'height: ' + calendar_params_arr.ajx_cleaned_params.calendar__view__cell_height + ' !important;' + '}' + '</style>'); | |
| 178 | - } // Define showing mouse over tooltip on unavailable dates | |
| 165 | + jQuery('head').append('<style type="text/css">' + '.hasDatepick .datepick-inline .datepick-title-row th, ' + '.hasDatepick .datepick-inline .datepick-days-cell {' + 'max-height: ' + calendar_params_arr.ajx_cleaned_params.calendar__view__cell_height + ' !important;' + '}' + '</style>'); | |
| 166 | + } | |
| 179 | 167 | |
| 180 | - | |
| 168 | + // Define showing mouse over tooltip on unavailable dates | |
| 181 | 169 | jCalContainer.find('.season_unavailable,.before_after_unavailable,.weekdays_unavailable').on('mouseover', function (this_event) { |
| 182 | 170 | // also available these vars: resource_id, jCalContainer, inst |
| 183 | 171 | var jCell = jQuery(this_event.currentTarget); |
| 184 | 172 | wpbc_avy__show_tooltip__for_element(jCell, calendar_params_arr['ajx_data_arr']['popover_hints']); |
| 185 | 173 | }); |
| 186 | - }); //------------------------------------------------------------------------------------------------------------------ | |
| 174 | + }); | |
| 175 | + | |
| 176 | + //------------------------------------------------------------------------------------------------------------------ | |
| 187 | 177 | // Define width of entire calendar |
| 188 | - | |
| 189 | 178 | var width = 'width:' + calendar_params_arr.ajx_cleaned_params.calendar__view__width + ';'; // var width = 'width:100%;max-width:100%;'; |
| 190 | 179 | |
| 191 | 180 | if (undefined != calendar_params_arr.ajx_cleaned_params.calendar__view__max_width && '' != calendar_params_arr.ajx_cleaned_params.calendar__view__max_width) { |
| 192 | 181 | width += 'max-width:' + calendar_params_arr.ajx_cleaned_params.calendar__view__max_width + ';'; |
| @@ -191,15 +180,15 @@ | ||
| 191 | 180 | if (undefined != calendar_params_arr.ajx_cleaned_params.calendar__view__max_width && '' != calendar_params_arr.ajx_cleaned_params.calendar__view__max_width) { |
| 192 | 181 | width += 'max-width:' + calendar_params_arr.ajx_cleaned_params.calendar__view__max_width + ';'; |
| 193 | 182 | } else { |
| 194 | 183 | width += 'max-width:' + calendar_params_arr.ajx_cleaned_params.calendar__view__months_in_row * 341 + 'px;'; |
| 195 | - } //------------------------------------------------------------------------------------------------------------------ | |
| 184 | + } | |
| 185 | + | |
| 186 | + //------------------------------------------------------------------------------------------------------------------ | |
| 196 | 187 | // Add calendar container: "Calendar is loading..." and textarea |
| 188 | + jQuery('.wpbc_ajx_avy__calendar').html('<div class="' + ' bk_calendar_frame' + ' months_num_in_row_' + calendar_params_arr.ajx_cleaned_params.calendar__view__months_in_row + ' cal_month_num_' + calendar_params_arr.ajx_cleaned_params.calendar__view__visible_months + '" ' + 'style="' + width + '">' + '<div id="calendar_booking' + calendar_params_arr.resource_id + '">' + 'Calendar is loading...' + '</div>' + '</div>' + '<textarea id="date_booking' + calendar_params_arr.resource_id + '"' + ' name="date_booking' + calendar_params_arr.resource_id + '"' + ' autocomplete="off"' + ' style="display:none;width:100%;height:10em;margin:2em 0 0;"></textarea>'); | |
| 197 | 189 | |
| 198 | - | |
| 199 | - jQuery('.wpbc_ajx_avy__calendar').html('<div class="' + ' bk_calendar_frame' + ' months_num_in_row_' + calendar_params_arr.ajx_cleaned_params.calendar__view__months_in_row + ' cal_month_num_' + calendar_params_arr.ajx_cleaned_params.calendar__view__visible_months + ' ' + calendar_params_arr.ajx_cleaned_params.calendar__timeslot_day_bg_as_available // 'wpbc_timeslot_day_bg_as_available' || '' | |
| 200 | - + '" ' + 'style="' + width + '">' + '<div id="calendar_booking' + calendar_params_arr.resource_id + '">' + 'Calendar is loading...' + '</div>' + '</div>' + '<textarea id="date_booking' + calendar_params_arr.resource_id + '"' + ' name="date_booking' + calendar_params_arr.resource_id + '"' + ' autocomplete="off"' + ' style="display:none;width:100%;height:10em;margin:2em 0 0;"></textarea>'); //------------------------------------------------------------------------------------------------------------------ | |
| 201 | - | |
| 190 | + //------------------------------------------------------------------------------------------------------------------ | |
| 202 | 191 | var cal_param_arr = { |
| 203 | 192 | 'html_id': 'calendar_booking' + calendar_params_arr.ajx_cleaned_params.resource_id, |
| 204 | 193 | 'text_id': 'date_booking' + calendar_params_arr.ajx_cleaned_params.resource_id, |
| 205 | 194 | 'calendar__start_week_day': calendar_params_arr.ajx_cleaned_params.calendar__start_week_day, |
| @@ -210,22 +199,23 @@ | ||
| 210 | 199 | 'booked_dates': calendar_params_arr.ajx_data_arr.booked_dates, |
| 211 | 200 | 'season_availability': calendar_params_arr.ajx_data_arr.season_availability, |
| 212 | 201 | 'resource_unavailable_dates': calendar_params_arr.ajx_data_arr.resource_unavailable_dates, |
| 213 | 202 | 'popover_hints': calendar_params_arr['ajx_data_arr']['popover_hints'] // {'season_unavailable':'...','weekdays_unavailable':'...','before_after_unavailable':'...',} |
| 214 | - | |
| 215 | 203 | }; |
| 216 | - wpbc_show_inline_booking_calendar(cal_param_arr); //------------------------------------------------------------------------------------------------------------------ | |
| 204 | + wpbc_show_inline_booking_calendar(cal_param_arr); | |
| 217 | 205 | |
| 206 | + //------------------------------------------------------------------------------------------------------------------ | |
| 218 | 207 | /** |
| 219 | 208 | * On click AVAILABLE | UNAVAILABLE button in widget - need to change help dates text |
| 220 | 209 | */ |
| 221 | - | |
| 222 | 210 | jQuery('.wpbc_radio__set_days_availability').on('change', function (event, resource_id, inst) { |
| 223 | 211 | wpbc__inline_booking_calendar__on_days_select(jQuery('#' + cal_param_arr.text_id).val(), cal_param_arr); |
| 224 | - }); // Show 'Select days in calendar then select Available / Unavailable status and click Apply availability button.' | |
| 212 | + }); | |
| 225 | 213 | |
| 214 | + // Show 'Select days in calendar then select Available / Unavailable status and click Apply availability button.' | |
| 226 | 215 | jQuery('#wpbc_toolbar_dates_hint').html('<div class="ui_element"><span class="wpbc_ui_control wpbc_ui_addon wpbc_help_text" >' + cal_param_arr.popover_hints.toolbar_text + '</span></div>'); |
| 227 | 216 | } |
| 217 | + | |
| 228 | 218 | /** |
| 229 | 219 | * Load Datepick Inline calendar |
| 230 | 220 | * |
| 231 | 221 | * @param calendar_params_arr example:{ |
| @@ -244,31 +234,30 @@ | ||
| 244 | 234 | 'resource_unavailable_dates' : calendar_params_arr.ajx_data_arr.resource_unavailable_dates |
| 245 | 235 | } |
| 246 | 236 | * @returns {boolean} |
| 247 | 237 | */ |
| 248 | - | |
| 249 | - | |
| 250 | 238 | function wpbc_show_inline_booking_calendar(calendar_params_arr) { |
| 251 | 239 | if (0 === jQuery('#' + calendar_params_arr.html_id).length // If calendar DOM element not exist then exist |
| 252 | 240 | || true === jQuery('#' + calendar_params_arr.html_id).hasClass('hasDatepick') // If the calendar with the same Booking resource already has been activated, then exist. |
| 253 | 241 | ) { |
| 254 | 242 | return false; |
| 255 | - } //------------------------------------------------------------------------------------------------------------------ | |
| 243 | + } | |
| 244 | + | |
| 245 | + //------------------------------------------------------------------------------------------------------------------ | |
| 256 | 246 | // Configure and show calendar |
| 257 | - | |
| 258 | - | |
| 259 | 247 | jQuery('#' + calendar_params_arr.html_id).text(''); |
| 260 | 248 | jQuery('#' + calendar_params_arr.html_id).datepick({ |
| 261 | - beforeShowDay: function beforeShowDay(date) { | |
| 249 | + beforeShowDay: function (date) { | |
| 262 | 250 | return wpbc__inline_booking_calendar__apply_css_to_days(date, calendar_params_arr, this); |
| 263 | 251 | }, |
| 264 | - onSelect: function onSelect(date) { | |
| 265 | - jQuery('#' + calendar_params_arr.text_id).val(date); //wpbc_blink_element('.wpbc_widget_available_unavailable', 3, 220); | |
| 266 | - | |
| 252 | + onSelect: function (date) { | |
| 253 | + jQuery('#' + calendar_params_arr.text_id).val(date); | |
| 254 | + //wpbc_blink_element('.wpbc_widget_available_unavailable', 3, 220); | |
| 267 | 255 | return wpbc__inline_booking_calendar__on_days_select(date, calendar_params_arr, this); |
| 268 | 256 | }, |
| 269 | - onHover: function onHover(value, date) { | |
| 257 | + onHover: function (value, date) { | |
| 270 | 258 | //wpbc_avy__prepare_tooltip__in_calendar( value, date, calendar_params_arr, this ); |
| 259 | + | |
| 271 | 260 | return wpbc__inline_booking_calendar__on_days_hover(value, date, calendar_params_arr, this); |
| 272 | 261 | }, |
| 273 | 262 | onChangeMonthYear: null, |
| 274 | 263 | showOn: 'both', |
| @@ -273,10 +262,12 @@ | ||
| 273 | 262 | onChangeMonthYear: null, |
| 274 | 263 | showOn: 'both', |
| 275 | 264 | numberOfMonths: calendar_params_arr.calendar__view__visible_months, |
| 276 | 265 | stepMonths: 1, |
| 277 | - prevText: '«', | |
| 278 | - nextText: '»', | |
| 266 | + // prevText: '«', | |
| 267 | + // nextText: '»', | |
| 268 | + prevText: '‹', | |
| 269 | + nextText: '›', | |
| 279 | 270 | dateFormat: 'yy-mm-dd', |
| 280 | 271 | // 'dd.mm.yy', |
| 281 | 272 | changeMonth: false, |
| 282 | 273 | changeYear: false, |
| @@ -299,8 +290,9 @@ | ||
| 299 | 290 | useThemeRoller: false |
| 300 | 291 | }); |
| 301 | 292 | return true; |
| 302 | 293 | } |
| 294 | + | |
| 303 | 295 | /** |
| 304 | 296 | * Apply CSS to calendar date cells |
| 305 | 297 | * |
| 306 | 298 | * @param date - JavaScript Date Obj: Mon Dec 11 2023 00:00:00 GMT+0200 (Eastern European Standard Time) |
| @@ -330,98 +322,96 @@ | ||
| 330 | 322 | * @param datepick_this - this of datepick Obj |
| 331 | 323 | * |
| 332 | 324 | * @returns [boolean,string] - [ {true -available | false - unavailable}, 'CSS classes for calendar day cell' ] |
| 333 | 325 | */ |
| 334 | - | |
| 335 | - | |
| 336 | 326 | function wpbc__inline_booking_calendar__apply_css_to_days(date, calendar_params_arr, datepick_this) { |
| 337 | 327 | var today_date = new Date(_wpbc.get_other_param('today_arr')[0], parseInt(_wpbc.get_other_param('today_arr')[1]) - 1, _wpbc.get_other_param('today_arr')[2], 0, 0, 0); |
| 328 | + var real_today_date = new Date(_wpbc.get_other_param('time_local_arr')[0], parseInt(_wpbc.get_other_param('time_local_arr')[1]) - 1, _wpbc.get_other_param('time_local_arr')[2], 0, 0, 0); | |
| 338 | 329 | var class_day = date.getMonth() + 1 + '-' + date.getDate() + '-' + date.getFullYear(); // '1-9-2023' |
| 339 | - | |
| 340 | 330 | var sql_class_day = wpbc__get__sql_class_date(date); // '2023-01-09' |
| 341 | 331 | |
| 342 | 332 | var css_date__standard = 'cal4date-' + class_day; |
| 343 | - var css_date__additional = ' wpbc_weekday_' + date.getDay() + ' '; //-------------------------------------------------------------------------------------------------------------- | |
| 333 | + var css_date__additional = ' wpbc_weekday_' + date.getDay() + ' '; | |
| 334 | + | |
| 335 | + //-------------------------------------------------------------------------------------------------------------- | |
| 336 | + | |
| 344 | 337 | // WEEKDAYS :: Set unavailable week days from - Settings General page in "Availability" section |
| 345 | - | |
| 346 | 338 | for (var i = 0; i < _wpbc.get_other_param('availability__week_days_unavailable').length; i++) { |
| 347 | 339 | if (date.getDay() == _wpbc.get_other_param('availability__week_days_unavailable')[i]) { |
| 348 | 340 | return [!!false, css_date__standard + ' date_user_unavailable' + ' weekdays_unavailable']; |
| 349 | 341 | } |
| 350 | - } // BEFORE_AFTER :: Set unavailable days Before / After the Today date | |
| 342 | + } | |
| 343 | + // 10.9.6.3. | |
| 344 | + var date_midnight = new Date(parseInt(date.getFullYear()), parseInt(date.getMonth()) - 0, parseInt(date.getDate()), 0, 0, 0); | |
| 345 | + // BEFORE_AFTER :: Set unavailable days Before / After the Today date. | |
| 346 | + //if ( ((wpbc_dates__days_between( date, real_today_date )) < parseInt( _wpbc.get_other_param( 'availability__unavailable_from_today' ) )) | |
| 347 | + if (today_date.getTime() - date_midnight.getTime() > 0 || parseInt('0' + parseInt(_wpbc.get_other_param('availability__available_from_today'))) > 0 && wpbc_dates__days_between(date_midnight, real_today_date) >= parseInt('0' + parseInt(_wpbc.get_other_param('availability__available_from_today')))) { | |
| 348 | + return [false, css_date__standard + ' date_user_unavailable' + ' before_after_unavailable']; | |
| 349 | + } | |
| 351 | 350 | |
| 352 | - | |
| 353 | - if (wpbc_dates__days_between(date, today_date) < parseInt(_wpbc.get_other_param('availability__unavailable_from_today')) || parseInt('0' + parseInt(_wpbc.get_other_param('availability__available_from_today'))) > 0 && wpbc_dates__days_between(date, today_date) > parseInt('0' + parseInt(_wpbc.get_other_param('availability__available_from_today')))) { | |
| 354 | - return [!!false, css_date__standard + ' date_user_unavailable' + ' before_after_unavailable']; | |
| 355 | - } // SEASONS :: Booking > Resources > Availability page | |
| 356 | - | |
| 357 | - | |
| 351 | + // SEASONS :: Booking > Resources > Availability page | |
| 358 | 352 | var is_date_available = calendar_params_arr.season_availability[sql_class_day]; |
| 359 | - | |
| 360 | 353 | if (false === is_date_available) { |
| 361 | - //FixIn: 9.5.4.4 | |
| 354 | + // FixIn: 9.5.4.4. | |
| 362 | 355 | return [!!false, css_date__standard + ' date_user_unavailable' + ' season_unavailable']; |
| 363 | - } // RESOURCE_UNAVAILABLE :: Booking > Availability page | |
| 356 | + } | |
| 364 | 357 | |
| 365 | - | |
| 366 | - if (wpdev_in_array(calendar_params_arr.resource_unavailable_dates, sql_class_day)) { | |
| 358 | + // RESOURCE_UNAVAILABLE :: Booking > Availability page | |
| 359 | + if (wpbc_in_array(calendar_params_arr.resource_unavailable_dates, sql_class_day)) { | |
| 367 | 360 | is_date_available = false; |
| 368 | 361 | } |
| 369 | - | |
| 370 | 362 | if (false === is_date_available) { |
| 371 | - //FixIn: 9.5.4.4 | |
| 363 | + // FixIn: 9.5.4.4. | |
| 372 | 364 | return [!false, css_date__standard + ' date_user_unavailable' + ' resource_unavailable']; |
| 373 | - } //-------------------------------------------------------------------------------------------------------------- | |
| 365 | + } | |
| 366 | + | |
| 374 | 367 | //-------------------------------------------------------------------------------------------------------------- |
| 375 | - // Is any bookings in this date ? | |
| 376 | 368 | |
| 369 | + //-------------------------------------------------------------------------------------------------------------- | |
| 377 | 370 | |
| 371 | + // Is any bookings in this date ? | |
| 378 | 372 | if ('undefined' !== typeof calendar_params_arr.booked_dates[class_day]) { |
| 379 | 373 | var bookings_in_date = calendar_params_arr.booked_dates[class_day]; |
| 380 | - | |
| 381 | 374 | if ('undefined' !== typeof bookings_in_date['sec_0']) { |
| 382 | 375 | // "Full day" booking -> (seconds == 0) |
| 376 | + | |
| 383 | 377 | css_date__additional += '0' === bookings_in_date['sec_0'].approved ? ' date2approve ' : ' date_approved '; // Pending = '0' | Approved = '1' |
| 384 | - | |
| 385 | 378 | css_date__additional += ' full_day_booking'; |
| 386 | 379 | return [!false, css_date__standard + css_date__additional]; |
| 387 | 380 | } else if (Object.keys(bookings_in_date).length > 0) { |
| 388 | 381 | // "Time slots" Bookings |
| 382 | + | |
| 389 | 383 | var is_approved = true; |
| 390 | - | |
| 391 | 384 | _.each(bookings_in_date, function (p_val, p_key, p_data) { |
| 392 | 385 | if (!parseInt(p_val.approved)) { |
| 393 | 386 | is_approved = false; |
| 394 | 387 | } |
| 395 | - | |
| 396 | 388 | var ts = p_val.booking_date.substring(p_val.booking_date.length - 1); |
| 397 | - | |
| 398 | 389 | if (true === _wpbc.get_other_param('is_enabled_change_over')) { |
| 399 | 390 | if (ts == '1') { |
| 400 | 391 | css_date__additional += ' check_in_time' + (parseInt(p_val.approved) ? ' check_in_time_date_approved' : ' check_in_time_date2approve'); |
| 401 | 392 | } |
| 402 | - | |
| 403 | 393 | if (ts == '2') { |
| 404 | 394 | css_date__additional += ' check_out_time' + (parseInt(p_val.approved) ? ' check_out_time_date_approved' : ' check_out_time_date2approve'); |
| 405 | 395 | } |
| 406 | 396 | } |
| 407 | 397 | }); |
| 408 | - | |
| 409 | 398 | if (!is_approved) { |
| 410 | 399 | css_date__additional += ' date2approve timespartly'; |
| 411 | 400 | } else { |
| 412 | 401 | css_date__additional += ' date_approved timespartly'; |
| 413 | 402 | } |
| 414 | - | |
| 415 | 403 | if (!_wpbc.get_other_param('is_enabled_change_over')) { |
| 416 | 404 | css_date__additional += ' times_clock'; |
| 417 | 405 | } |
| 418 | 406 | } |
| 419 | - } //-------------------------------------------------------------------------------------------------------------- | |
| 407 | + } | |
| 420 | 408 | |
| 409 | + //-------------------------------------------------------------------------------------------------------------- | |
| 421 | 410 | |
| 422 | 411 | return [true, css_date__standard + css_date__additional + ' date_available']; |
| 423 | 412 | } |
| 413 | + | |
| 424 | 414 | /** |
| 425 | 415 | * Apply some CSS classes, when we mouse over specific dates in calendar |
| 426 | 416 | * @param value |
| 427 | 417 | * @param date - JavaScript Date Obj: Mon Dec 11 2023 00:00:00 GMT+0200 (Eastern European Standard Time) |
| @@ -451,19 +441,14 @@ | ||
| 451 | 441 | * @param datepick_this - this of datepick Obj |
| 452 | 442 | * |
| 453 | 443 | * @returns {boolean} |
| 454 | 444 | */ |
| 455 | - | |
| 456 | - | |
| 457 | 445 | function wpbc__inline_booking_calendar__on_days_hover(value, date, calendar_params_arr, datepick_this) { |
| 458 | 446 | if (null === date) { |
| 459 | 447 | jQuery('.datepick-days-cell-over').removeClass('datepick-days-cell-over'); // clear all highlight days selections |
| 460 | - | |
| 461 | 448 | return false; |
| 462 | 449 | } |
| 463 | - | |
| 464 | 450 | var inst = jQuery.datepick._getInst(document.getElementById('calendar_booking' + calendar_params_arr.resource_id)); |
| 465 | - | |
| 466 | 451 | if (1 == inst.dates.length // If we have one selected date |
| 467 | 452 | && 'dynamic' === calendar_params_arr.calendar__days_selection_mode // while have range days selection mode |
| 468 | 453 | ) { |
| 469 | 454 | var td_class; |
| @@ -478,23 +463,21 @@ | ||
| 478 | 463 | |
| 479 | 464 | if (date.getMonth() == selceted_first_day.getMonth() && date.getDate() == selceted_first_day.getDate() && date.getFullYear() == selceted_first_day.getFullYear() || selceted_first_day > date) { |
| 480 | 465 | is_check = false; |
| 481 | 466 | } |
| 482 | - | |
| 483 | 467 | selceted_first_day.setFullYear(selceted_first_day.getFullYear(), selceted_first_day.getMonth(), selceted_first_day.getDate() + 1); |
| 484 | - } // Highlight Days | |
| 468 | + } | |
| 485 | 469 | |
| 486 | - | |
| 470 | + // Highlight Days | |
| 487 | 471 | for (var i = 0; i < td_overs.length; i++) { |
| 488 | 472 | // add class to all elements |
| 489 | 473 | jQuery(td_overs[i]).addClass('datepick-days-cell-over'); |
| 490 | 474 | } |
| 491 | - | |
| 492 | 475 | return true; |
| 493 | 476 | } |
| 494 | - | |
| 495 | 477 | return true; |
| 496 | 478 | } |
| 479 | + | |
| 497 | 480 | /** |
| 498 | 481 | * On DAYs selection in calendar |
| 499 | 482 | * |
| 500 | 483 | * @param dates_selection - string: '2023-03-07 ~ 2023-03-07' or '2023-04-10, 2023-04-12, 2023-04-02, 2023-04-04' |
| @@ -524,24 +507,19 @@ | ||
| 524 | 507 | * @param datepick_this - this of datepick Obj |
| 525 | 508 | * |
| 526 | 509 | * @returns boolean |
| 527 | 510 | */ |
| 528 | - | |
| 529 | - | |
| 530 | -function wpbc__inline_booking_calendar__on_days_select(dates_selection, calendar_params_arr) { | |
| 531 | - var datepick_this = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; | |
| 532 | - | |
| 511 | +function wpbc__inline_booking_calendar__on_days_select(dates_selection, calendar_params_arr, datepick_this = null) { | |
| 533 | 512 | var inst = jQuery.datepick._getInst(document.getElementById('calendar_booking' + calendar_params_arr.resource_id)); |
| 534 | - | |
| 535 | 513 | var dates_arr = []; // [ "2023-04-09", "2023-04-10", "2023-04-11" ] |
| 536 | 514 | |
| 537 | 515 | if (-1 !== dates_selection.indexOf('~')) { |
| 538 | 516 | // Range Days |
| 517 | + | |
| 539 | 518 | dates_arr = wpbc_get_dates_arr__from_dates_range_js({ |
| 540 | 519 | 'dates_separator': ' ~ ', |
| 541 | 520 | // ' ~ ' |
| 542 | 521 | 'dates': dates_selection // '2023-04-04 ~ 2023-04-07' |
| 543 | - | |
| 544 | 522 | }); |
| 545 | 523 | } else { |
| 546 | 524 | // Multiple Days |
| 547 | 525 | dates_arr = wpbc_get_dates_arr__from_dates_comma_separated_js({ |
| @@ -547,12 +525,10 @@ | ||
| 547 | 525 | dates_arr = wpbc_get_dates_arr__from_dates_comma_separated_js({ |
| 548 | 526 | 'dates_separator': ', ', |
| 549 | 527 | // ', ' |
| 550 | 528 | 'dates': dates_selection // '2023-04-10, 2023-04-12, 2023-04-02, 2023-04-04' |
| 551 | - | |
| 552 | 529 | }); |
| 553 | 530 | } |
| 554 | - | |
| 555 | 531 | wpbc_avy_after_days_selection__show_help_info({ |
| 556 | 532 | 'calendar__days_selection_mode': calendar_params_arr.calendar__days_selection_mode, |
| 557 | 533 | 'dates_arr': dates_arr, |
| 558 | 534 | 'dates_click_num': inst.dates.length, |
| @@ -559,8 +535,9 @@ | ||
| 559 | 535 | 'popover_hints': calendar_params_arr.popover_hints |
| 560 | 536 | }); |
| 561 | 537 | return true; |
| 562 | 538 | } |
| 539 | + | |
| 563 | 540 | /** |
| 564 | 541 | * Show help info at the top toolbar about selected dates and future actions |
| 565 | 542 | * |
| 566 | 543 | * @param params |
| @@ -576,30 +553,24 @@ | ||
| 576 | 553 | dates_click_num: 2 |
| 577 | 554 | 'popover_hints' : calendar_params_arr.popover_hints |
| 578 | 555 | } |
| 579 | 556 | */ |
| 580 | - | |
| 581 | - | |
| 582 | 557 | function wpbc_avy_after_days_selection__show_help_info(params) { |
| 583 | 558 | // console.log( params ); // [ "2023-04-09", "2023-04-10", "2023-04-11" ] |
| 559 | + | |
| 584 | 560 | var message, color; |
| 585 | - | |
| 586 | 561 | if (jQuery('#ui_btn_avy__set_days_availability__available').is(':checked')) { |
| 587 | 562 | message = params.popover_hints.toolbar_text_available; //'Set dates _DATES_ as _HTML_ available.'; |
| 588 | - | |
| 589 | 563 | color = '#11be4c'; |
| 590 | 564 | } else { |
| 591 | 565 | message = params.popover_hints.toolbar_text_unavailable; //'Set dates _DATES_ as _HTML_ unavailable.'; |
| 592 | - | |
| 593 | 566 | color = '#e43939'; |
| 594 | 567 | } |
| 595 | - | |
| 596 | 568 | message = '<span>' + message + '</span>'; |
| 597 | 569 | var first_date = params['dates_arr'][0]; |
| 598 | 570 | var last_date = 'dynamic' == params.calendar__days_selection_mode ? params['dates_arr'][params['dates_arr'].length - 1] : params['dates_arr'].length > 1 ? params['dates_arr'][1] : ''; |
| 599 | 571 | first_date = jQuery.datepick.formatDate('dd M, yy', new Date(first_date + 'T00:00:00')); |
| 600 | 572 | last_date = jQuery.datepick.formatDate('dd M, yy', new Date(last_date + 'T00:00:00')); |
| 601 | - | |
| 602 | 573 | if ('dynamic' == params.calendar__days_selection_mode) { |
| 603 | 574 | if (1 == params.dates_click_num) { |
| 604 | 575 | last_date = '___________'; |
| 605 | 576 | } else { |
| @@ -607,10 +578,10 @@ | ||
| 607 | 578 | jQuery('.wpbc_ajx_availability_container').attr('wpbc_loaded', 'done'); |
| 608 | 579 | wpbc_blink_element('.wpbc_widget_available_unavailable', 3, 220); |
| 609 | 580 | } |
| 610 | 581 | } |
| 611 | - | |
| 612 | - message = message.replace('_DATES_', '</span>' //+ '<div>' + 'from' + '</div>' | |
| 582 | + message = message.replace('_DATES_', '</span>' | |
| 583 | + //+ '<div>' + 'from' + '</div>' | |
| 613 | 584 | + '<span class="wpbc_big_date">' + first_date + '</span>' + '<span>' + '-' + '</span>' + '<span class="wpbc_big_date">' + last_date + '</span>' + '<span>'); |
| 614 | 585 | } else { |
| 615 | 586 | // if ( params[ 'dates_arr' ].length > 1 ){ |
| 616 | 587 | // last_date = ', ' + last_date; |
| @@ -618,22 +589,22 @@ | ||
| 618 | 589 | // } else { |
| 619 | 590 | // last_date=''; |
| 620 | 591 | // } |
| 621 | 592 | var dates_arr = []; |
| 622 | - | |
| 623 | 593 | for (var i = 0; i < params['dates_arr'].length; i++) { |
| 624 | 594 | dates_arr.push(jQuery.datepick.formatDate('dd M yy', new Date(params['dates_arr'][i] + 'T00:00:00'))); |
| 625 | 595 | } |
| 626 | - | |
| 627 | 596 | first_date = dates_arr.join(', '); |
| 628 | 597 | message = message.replace('_DATES_', '</span>' + '<span class="wpbc_big_date">' + first_date + '</span>' + '<span>'); |
| 629 | 598 | } |
| 599 | + message = message.replace('_HTML_', '</span><span class="wpbc_big_text" style="color:' + color + ';">') + '<span>'; | |
| 630 | 600 | |
| 631 | - message = message.replace('_HTML_', '</span><span class="wpbc_big_text" style="color:' + color + ';">') + '<span>'; //message += ' <div style="margin-left: 1em;">' + ' Click on Apply button to apply availability.' + '</div>'; | |
| 601 | + //message += ' <div style="margin-left: 1em;">' + ' Click on Apply button to apply availability.' + '</div>'; | |
| 632 | 602 | |
| 633 | 603 | message = '<div class="wpbc_toolbar_dates_hints">' + message + '</div>'; |
| 634 | 604 | jQuery('.wpbc_help_text').html(message); |
| 635 | 605 | } |
| 606 | + | |
| 636 | 607 | /** |
| 637 | 608 | * Parse dates ------------------------------------------------------------------------------------------- */ |
| 638 | 609 | |
| 639 | 610 | /** |
| @@ -652,20 +623,17 @@ | ||
| 652 | 623 | ] |
| 653 | 624 | * |
| 654 | 625 | * Example #1: wpbc_get_dates_arr__from_dates_comma_separated_js( { 'dates_separator' : ', ', 'dates' : '2023-04-04, 2023-04-07, 2023-04-05' } ); |
| 655 | 626 | */ |
| 656 | - | |
| 657 | - | |
| 658 | 627 | function wpbc_get_dates_arr__from_dates_comma_separated_js(params) { |
| 659 | 628 | var dates_arr = []; |
| 660 | - | |
| 661 | 629 | if ('' !== params['dates']) { |
| 662 | 630 | dates_arr = params['dates'].split(params['dates_separator']); |
| 663 | 631 | dates_arr.sort(); |
| 664 | 632 | } |
| 665 | - | |
| 666 | 633 | return dates_arr; |
| 667 | 634 | } |
| 635 | + | |
| 668 | 636 | /** |
| 669 | 637 | * Get dates array, from range days selection |
| 670 | 638 | * |
| 671 | 639 | * @param params = { |
| @@ -682,25 +650,21 @@ | ||
| 682 | 650 | * |
| 683 | 651 | * Example #1: wpbc_get_dates_arr__from_dates_range_js( { 'dates_separator' : ' ~ ', 'dates' : '2023-04-04 ~ 2023-04-07' } ); |
| 684 | 652 | * Example #2: wpbc_get_dates_arr__from_dates_range_js( { 'dates_separator' : ' - ', 'dates' : '2023-04-04 - 2023-04-07' } ); |
| 685 | 653 | */ |
| 686 | - | |
| 687 | - | |
| 688 | 654 | function wpbc_get_dates_arr__from_dates_range_js(params) { |
| 689 | 655 | var dates_arr = []; |
| 690 | - | |
| 691 | 656 | if ('' !== params['dates']) { |
| 692 | 657 | dates_arr = params['dates'].split(params['dates_separator']); |
| 693 | 658 | var check_in_date_ymd = dates_arr[0]; |
| 694 | 659 | var check_out_date_ymd = dates_arr[1]; |
| 695 | - | |
| 696 | 660 | if ('' !== check_in_date_ymd && '' !== check_out_date_ymd) { |
| 697 | 661 | dates_arr = wpbc_get_dates_array_from_start_end_days_js(check_in_date_ymd, check_out_date_ymd); |
| 698 | 662 | } |
| 699 | 663 | } |
| 700 | - | |
| 701 | 664 | return dates_arr; |
| 702 | 665 | } |
| 666 | + | |
| 703 | 667 | /** |
| 704 | 668 | * Get dates array based on start and end dates. |
| 705 | 669 | * |
| 706 | 670 | * @param string sStartDate - start date: 2023-04-09 |
| @@ -706,35 +670,36 @@ | ||
| 706 | 670 | * @param string sStartDate - start date: 2023-04-09 |
| 707 | 671 | * @param string sEndDate - end date: 2023-04-11 |
| 708 | 672 | * @return array - [ "2023-04-09", "2023-04-10", "2023-04-11" ] |
| 709 | 673 | */ |
| 710 | - | |
| 711 | - | |
| 712 | 674 | function wpbc_get_dates_array_from_start_end_days_js(sStartDate, sEndDate) { |
| 713 | 675 | sStartDate = new Date(sStartDate + 'T00:00:00'); |
| 714 | 676 | sEndDate = new Date(sEndDate + 'T00:00:00'); |
| 715 | - var aDays = []; // Start the variable off with the start date | |
| 677 | + var aDays = []; | |
| 716 | 678 | |
| 717 | - aDays.push(sStartDate.getTime()); // Set a 'temp' variable, sCurrentDate, with the start date - before beginning the loop | |
| 679 | + // Start the variable off with the start date | |
| 680 | + aDays.push(sStartDate.getTime()); | |
| 718 | 681 | |
| 682 | + // Set a 'temp' variable, sCurrentDate, with the start date - before beginning the loop | |
| 719 | 683 | var sCurrentDate = new Date(sStartDate.getTime()); |
| 720 | - var one_day_duration = 24 * 60 * 60 * 1000; // While the current date is less than the end date | |
| 684 | + var one_day_duration = 24 * 60 * 60 * 1000; | |
| 721 | 685 | |
| 686 | + // While the current date is less than the end date | |
| 722 | 687 | while (sCurrentDate < sEndDate) { |
| 723 | 688 | // Add a day to the current date "+1 day" |
| 724 | - sCurrentDate.setTime(sCurrentDate.getTime() + one_day_duration); // Add this new day to the aDays array | |
| 689 | + sCurrentDate.setTime(sCurrentDate.getTime() + one_day_duration); | |
| 725 | 690 | |
| 691 | + // Add this new day to the aDays array | |
| 726 | 692 | aDays.push(sCurrentDate.getTime()); |
| 727 | 693 | } |
| 728 | - | |
| 729 | - for (var i = 0; i < aDays.length; i++) { | |
| 694 | + for (let i = 0; i < aDays.length; i++) { | |
| 730 | 695 | aDays[i] = new Date(aDays[i]); |
| 731 | 696 | aDays[i] = aDays[i].getFullYear() + '-' + (aDays[i].getMonth() + 1 < 10 ? '0' : '') + (aDays[i].getMonth() + 1) + '-' + (aDays[i].getDate() < 10 ? '0' : '') + aDays[i].getDate(); |
| 732 | - } // Once the loop has finished, return the array of days. | |
| 733 | - | |
| 734 | - | |
| 697 | + } | |
| 698 | + // Once the loop has finished, return the array of days. | |
| 735 | 699 | return aDays; |
| 736 | 700 | } |
| 701 | + | |
| 737 | 702 | /** |
| 738 | 703 | * Tooltips ---------------------------------------------------------------------------------------------- */ |
| 739 | 704 | |
| 740 | 705 | /** |
| @@ -746,20 +711,18 @@ | ||
| 746 | 711 | * @param calendar_params_arr |
| 747 | 712 | * @param datepick_this |
| 748 | 713 | * @returns {boolean} |
| 749 | 714 | */ |
| 750 | - | |
| 751 | - | |
| 752 | 715 | function wpbc_avy__prepare_tooltip__in_calendar(value, date, calendar_params_arr, datepick_this) { |
| 753 | 716 | if (null == date) { |
| 754 | 717 | return false; |
| 755 | 718 | } |
| 756 | - | |
| 757 | 719 | var td_class = date.getMonth() + 1 + '-' + date.getDate() + '-' + date.getFullYear(); |
| 758 | 720 | var jCell = jQuery('#calendar_booking' + calendar_params_arr.resource_id + ' td.cal4date-' + td_class); |
| 759 | 721 | wpbc_avy__show_tooltip__for_element(jCell, calendar_params_arr['popover_hints']); |
| 760 | 722 | return true; |
| 761 | 723 | } |
| 724 | + | |
| 762 | 725 | /** |
| 763 | 726 | * Define tooltip for showing on UNAVAILABLE days (season, weekday, today_depends unavailable) |
| 764 | 727 | * |
| 765 | 728 | * @param jCell jQuery of specific day cell |
| @@ -764,13 +727,10 @@ | ||
| 764 | 727 | * |
| 765 | 728 | * @param jCell jQuery of specific day cell |
| 766 | 729 | * @param popover_hints Array with tooltip hint texts : {'season_unavailable':'...','weekdays_unavailable':'...','before_after_unavailable':'...',} |
| 767 | 730 | */ |
| 768 | - | |
| 769 | - | |
| 770 | 731 | function wpbc_avy__show_tooltip__for_element(jCell, popover_hints) { |
| 771 | 732 | var tooltip_time = ''; |
| 772 | - | |
| 773 | 733 | if (jCell.hasClass('season_unavailable')) { |
| 774 | 734 | tooltip_time = popover_hints['season_unavailable']; |
| 775 | 735 | } else if (jCell.hasClass('weekdays_unavailable')) { |
| 776 | 736 | tooltip_time = popover_hints['weekdays_unavailable']; |
| @@ -776,15 +736,14 @@ | ||
| 776 | 736 | tooltip_time = popover_hints['weekdays_unavailable']; |
| 777 | 737 | } else if (jCell.hasClass('before_after_unavailable')) { |
| 778 | 738 | tooltip_time = popover_hints['before_after_unavailable']; |
| 779 | 739 | } else if (jCell.hasClass('date2approve')) {} else if (jCell.hasClass('date_approved')) {} else {} |
| 780 | - | |
| 781 | 740 | jCell.attr('data-content', tooltip_time); |
| 782 | 741 | var td_el = jCell.get(0); //jQuery( '#calendar_booking' + calendar_params_arr.resource_id + ' td.cal4date-' + td_class ).get(0); |
| 783 | 742 | |
| 784 | 743 | if (undefined == td_el._tippy && '' != tooltip_time) { |
| 785 | 744 | wpbc_tippy(td_el, { |
| 786 | - content: function content(reference) { | |
| 745 | + content(reference) { | |
| 787 | 746 | var popover_content = reference.getAttribute('data-content'); |
| 788 | 747 | return '<div class="popover popover_tippy">' + '<div class="popover-content">' + popover_content + '</div>' + '</div>'; |
| 789 | 748 | }, |
| 790 | 749 | allowHTML: true, |
| @@ -795,18 +754,17 @@ | ||
| 795 | 754 | maxWidth: 550, |
| 796 | 755 | theme: 'wpbc-tippy-times', |
| 797 | 756 | placement: 'top', |
| 798 | 757 | delay: [400, 0], |
| 799 | - //FixIn: 9.4.2.2 | |
| 758 | + // FixIn: 9.4.2.2. | |
| 800 | 759 | ignoreAttributes: true, |
| 801 | 760 | touch: true, |
| 802 | - //['hold', 500], // 500ms delay //FixIn: 9.2.1.5 | |
| 803 | - appendTo: function appendTo() { | |
| 804 | - return document.body; | |
| 805 | - } | |
| 761 | + //['hold', 500], // 500ms delay // FixIn: 9.2.1.5. | |
| 762 | + appendTo: () => document.body | |
| 806 | 763 | }); |
| 807 | 764 | } |
| 808 | 765 | } |
| 766 | + | |
| 809 | 767 | /** |
| 810 | 768 | * Ajax ------------------------------------------------------------------------------------------------------ */ |
| 811 | 769 | |
| 812 | 770 | /** |
| @@ -811,15 +769,14 @@ | ||
| 811 | 769 | |
| 812 | 770 | /** |
| 813 | 771 | * Send Ajax show request |
| 814 | 772 | */ |
| 815 | - | |
| 816 | - | |
| 817 | 773 | function wpbc_ajx_availability__ajax_request() { |
| 818 | 774 | console.groupCollapsed('WPBC_AJX_AVAILABILITY'); |
| 819 | 775 | console.log(' == Before Ajax Send - search_get_all_params() == ', wpbc_ajx_availability.search_get_all_params()); |
| 820 | - wpbc_availability_reload_button__spin_start(); // Start Ajax | |
| 776 | + wpbc_availability_reload_button__spin_start(); | |
| 821 | 777 | |
| 778 | + // Start Ajax | |
| 822 | 779 | jQuery.post(wpbc_url_ajax, { |
| 823 | 780 | action: 'WPBC_AJX_AVAILABILITY', |
| 824 | 781 | wpbc_ajx_user_id: wpbc_ajx_availability.get_secure_param('user_id'), |
| 825 | 782 | nonce: wpbc_ajx_availability.get_secure_param('nonce'), |
| @@ -834,30 +791,31 @@ | ||
| 834 | 791 | * @param jqXHR - Object |
| 835 | 792 | */ |
| 836 | 793 | function (response_data, textStatus, jqXHR) { |
| 837 | 794 | console.log(' == Response WPBC_AJX_AVAILABILITY == ', response_data); |
| 838 | - console.groupEnd(); // Probably Error | |
| 795 | + console.groupEnd(); | |
| 839 | 796 | |
| 840 | - if (_typeof(response_data) !== 'object' || response_data === null) { | |
| 797 | + // Probably Error | |
| 798 | + if (typeof response_data !== 'object' || response_data === null) { | |
| 841 | 799 | wpbc_ajx_availability__show_message(response_data); |
| 842 | 800 | return; |
| 843 | - } // Reload page, after filter toolbar has been reset | |
| 801 | + } | |
| 844 | 802 | |
| 845 | - | |
| 803 | + // Reload page, after filter toolbar has been reset | |
| 846 | 804 | if (undefined != response_data['ajx_cleaned_params'] && 'reset_done' === response_data['ajx_cleaned_params']['do_action']) { |
| 847 | 805 | location.reload(); |
| 848 | 806 | return; |
| 849 | - } // Show listing | |
| 807 | + } | |
| 850 | 808 | |
| 809 | + // Show listing | |
| 810 | + wpbc_ajx_availability__page_content__show(response_data['ajx_data'], response_data['ajx_search_params'], response_data['ajx_cleaned_params']); | |
| 851 | 811 | |
| 852 | - wpbc_ajx_availability__page_content__show(response_data['ajx_data'], response_data['ajx_search_params'], response_data['ajx_cleaned_params']); //wpbc_ajx_availability__define_ui_hooks(); // Redefine Hooks, because we show new DOM elements | |
| 853 | - | |
| 812 | + //wpbc_ajx_availability__define_ui_hooks(); // Redefine Hooks, because we show new DOM elements | |
| 854 | 813 | if ('' != response_data['ajx_data']['ajx_after_action_message'].replace(/\n/g, "<br />")) { |
| 855 | 814 | wpbc_admin_show_message(response_data['ajx_data']['ajx_after_action_message'].replace(/\n/g, "<br />"), '1' == response_data['ajx_data']['ajx_after_action_result'] ? 'success' : 'error', 10000); |
| 856 | 815 | } |
| 857 | - | |
| 858 | - wpbc_availability_reload_button__spin_pause(); // Remove spin icon from button and Enable this button. | |
| 859 | - | |
| 816 | + wpbc_availability_reload_button__spin_pause(); | |
| 817 | + // Remove spin icon from button and Enable this button. | |
| 860 | 818 | wpbc_button__remove_spin(response_data['ajx_cleaned_params']['ui_clicked_element_id']); |
| 861 | 819 | jQuery('#ajax_respond').html(response_data); // For ability to show response, add such DIV element to page |
| 862 | 820 | }).fail(function (jqXHR, textStatus, errorThrown) { |
| 863 | 821 | if (window.console && window.console.log) { |
| @@ -862,29 +820,26 @@ | ||
| 862 | 820 | }).fail(function (jqXHR, textStatus, errorThrown) { |
| 863 | 821 | if (window.console && window.console.log) { |
| 864 | 822 | console.log('Ajax_Error', jqXHR, textStatus, errorThrown); |
| 865 | 823 | } |
| 866 | - | |
| 867 | 824 | var error_message = '<strong>' + 'Error!' + '</strong> ' + errorThrown; |
| 868 | - | |
| 869 | 825 | if (jqXHR.status) { |
| 870 | 826 | error_message += ' (<b>' + jqXHR.status + '</b>)'; |
| 871 | - | |
| 872 | 827 | if (403 == jqXHR.status) { |
| 873 | 828 | error_message += ' Probably nonce for this page has been expired. Please <a href="javascript:void(0)" onclick="javascript:location.reload();">reload the page</a>.'; |
| 874 | 829 | } |
| 875 | 830 | } |
| 876 | - | |
| 877 | 831 | if (jqXHR.responseText) { |
| 878 | 832 | error_message += ' ' + jqXHR.responseText; |
| 879 | 833 | } |
| 880 | - | |
| 881 | 834 | error_message = error_message.replace(/\n/g, "<br />"); |
| 882 | 835 | wpbc_ajx_availability__show_message(error_message); |
| 883 | - }) // .done( function ( data, textStatus, jqXHR ) { if ( window.console && window.console.log ){ console.log( 'second success', data, textStatus, jqXHR ); } }) | |
| 836 | + }) | |
| 837 | + // .done( function ( data, textStatus, jqXHR ) { if ( window.console && window.console.log ){ console.log( 'second success', data, textStatus, jqXHR ); } }) | |
| 884 | 838 | // .always( function ( data_jqXHR, textStatus, jqXHR_errorThrown ) { if ( window.console && window.console.log ){ console.log( 'always finished', data_jqXHR, textStatus, jqXHR_errorThrown ); } }) |
| 885 | 839 | ; // End Ajax |
| 886 | 840 | } |
| 841 | + | |
| 887 | 842 | /** |
| 888 | 843 | * H o o k s - its Action/Times when need to re-Render Views ----------------------------------------------- */ |
| 889 | 844 | |
| 890 | 845 | /** |
| @@ -891,31 +846,29 @@ | ||
| 891 | 846 | * Send Ajax Search Request after Updating search request parameters |
| 892 | 847 | * |
| 893 | 848 | * @param params_arr |
| 894 | 849 | */ |
| 895 | - | |
| 896 | - | |
| 897 | 850 | function wpbc_ajx_availability__send_request_with_params(params_arr) { |
| 898 | 851 | // Define different Search parameters for request |
| 899 | 852 | _.each(params_arr, function (p_val, p_key, p_data) { |
| 900 | 853 | //console.log( 'Request for: ', p_key, p_val ); |
| 901 | 854 | wpbc_ajx_availability.search_set_param(p_key, p_val); |
| 902 | - }); // Send Ajax Request | |
| 855 | + }); | |
| 903 | 856 | |
| 904 | - | |
| 857 | + // Send Ajax Request | |
| 905 | 858 | wpbc_ajx_availability__ajax_request(); |
| 906 | 859 | } |
| 860 | + | |
| 907 | 861 | /** |
| 908 | 862 | * Search request for "Page Number" |
| 909 | 863 | * @param page_number int |
| 910 | 864 | */ |
| 911 | - | |
| 912 | - | |
| 913 | 865 | function wpbc_ajx_availability__pagination_click(page_number) { |
| 914 | 866 | wpbc_ajx_availability__send_request_with_params({ |
| 915 | 867 | 'page_num': page_number |
| 916 | 868 | }); |
| 917 | 869 | } |
| 870 | + | |
| 918 | 871 | /** |
| 919 | 872 | * Show / Hide Content --------------------------------------------------------------------------------------- */ |
| 920 | 873 | |
| 921 | 874 | /** |
| @@ -920,21 +873,19 @@ | ||
| 920 | 873 | |
| 921 | 874 | /** |
| 922 | 875 | * Show Listing Content - Sending Ajax Request - with parameters that we early defined |
| 923 | 876 | */ |
| 924 | - | |
| 925 | - | |
| 926 | 877 | function wpbc_ajx_availability__actual_content__show() { |
| 927 | 878 | wpbc_ajx_availability__ajax_request(); // Send Ajax Request - with parameters that we early defined in "wpbc_ajx_booking_listing" Obj. |
| 928 | 879 | } |
| 880 | + | |
| 929 | 881 | /** |
| 930 | 882 | * Hide Listing Content |
| 931 | 883 | */ |
| 932 | - | |
| 933 | - | |
| 934 | 884 | function wpbc_ajx_availability__actual_content__hide() { |
| 935 | 885 | jQuery(wpbc_ajx_availability.get_other_param('listing_container')).html(''); |
| 936 | 886 | } |
| 887 | + | |
| 937 | 888 | /** |
| 938 | 889 | * M e s s a g e --------------------------------------------------------------------------------------------- */ |
| 939 | 890 | |
| 940 | 891 | /** |
| @@ -939,14 +890,13 @@ | ||
| 939 | 890 | |
| 940 | 891 | /** |
| 941 | 892 | * Show just message instead of content |
| 942 | 893 | */ |
| 943 | - | |
| 944 | - | |
| 945 | 894 | function wpbc_ajx_availability__show_message(message) { |
| 946 | 895 | wpbc_ajx_availability__actual_content__hide(); |
| 947 | 896 | jQuery(wpbc_ajx_availability.get_other_param('listing_container')).html('<div class="wpbc-settings-notice notice-warning" style="text-align:left">' + message + '</div>'); |
| 948 | 897 | } |
| 898 | + | |
| 949 | 899 | /** |
| 950 | 900 | * Support Functions - Spin Icon in Buttons ------------------------------------------------------------------ */ |
| 951 | 901 | |
| 952 | 902 | /** |
| @@ -951,28 +901,24 @@ | ||
| 951 | 901 | |
| 952 | 902 | /** |
| 953 | 903 | * Spin button in Filter toolbar - Start |
| 954 | 904 | */ |
| 955 | - | |
| 956 | - | |
| 957 | 905 | function wpbc_availability_reload_button__spin_start() { |
| 958 | 906 | jQuery('#wpbc_availability_reload_button .menu_icon.wpbc_spin').removeClass('wpbc_animation_pause'); |
| 959 | 907 | } |
| 908 | + | |
| 960 | 909 | /** |
| 961 | 910 | * Spin button in Filter toolbar - Pause |
| 962 | 911 | */ |
| 963 | - | |
| 964 | - | |
| 965 | 912 | function wpbc_availability_reload_button__spin_pause() { |
| 966 | 913 | jQuery('#wpbc_availability_reload_button .menu_icon.wpbc_spin').addClass('wpbc_animation_pause'); |
| 967 | 914 | } |
| 915 | + | |
| 968 | 916 | /** |
| 969 | 917 | * Spin button in Filter toolbar - is Spinning ? |
| 970 | 918 | * |
| 971 | 919 | * @returns {boolean} |
| 972 | 920 | */ |
| 973 | - | |
| 974 | - | |
| 975 | 921 | function wpbc_availability_reload_button__is_spin() { |
| 976 | 922 | if (jQuery('#wpbc_availability_reload_button .menu_icon.wpbc_spin').hasClass('wpbc_animation_pause')) { |
| 977 | 923 | return true; |
| 978 | 924 | } else { |
| @@ -978,5 +924,5 @@ | ||
| 978 | 924 | } else { |
| 979 | 925 | return false; |
| 980 | 926 | } |
| 981 | 927 | } |
| 982 | -//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluY2x1ZGVzL3BhZ2UtYXZhaWxhYmlsaXR5L19zcmMvYXZhaWxhYmlsaXR5X3BhZ2UuanMiXSwibmFtZXMiOlsid3BiY19hanhfYXZhaWxhYmlsaXR5Iiwib2JqIiwiJCIsInBfc2VjdXJlIiwic2VjdXJpdHlfb2JqIiwidXNlcl9pZCIsIm5vbmNlIiwibG9jYWxlIiwic2V0X3NlY3VyZV9wYXJhbSIsInBhcmFtX2tleSIsInBhcmFtX3ZhbCIsImdldF9zZWN1cmVfcGFyYW0iLCJwX2xpc3RpbmciLCJzZWFyY2hfcmVxdWVzdF9vYmoiLCJzZWFyY2hfc2V0X2FsbF9wYXJhbXMiLCJyZXF1ZXN0X3BhcmFtX29iaiIsInNlYXJjaF9nZXRfYWxsX3BhcmFtcyIsInNlYXJjaF9nZXRfcGFyYW0iLCJzZWFyY2hfc2V0X3BhcmFtIiwic2VhcmNoX3NldF9wYXJhbXNfYXJyIiwicGFyYW1zX2FyciIsIl8iLCJlYWNoIiwicF92YWwiLCJwX2tleSIsInBfZGF0YSIsInBfb3RoZXIiLCJvdGhlcl9vYmoiLCJzZXRfb3RoZXJfcGFyYW0iLCJnZXRfb3RoZXJfcGFyYW0iLCJqUXVlcnkiLCJ3cGJjX2FqeF9ib29raW5ncyIsIndwYmNfYWp4X2F2YWlsYWJpbGl0eV9fcGFnZV9jb250ZW50X19zaG93IiwiYWp4X2RhdGFfYXJyIiwiYWp4X3NlYXJjaF9wYXJhbXMiLCJhanhfY2xlYW5lZF9wYXJhbXMiLCJ0ZW1wbGF0ZV9fYXZhaWxhYmlsaXR5X21haW5fcGFnZV9jb250ZW50Iiwid3AiLCJ0ZW1wbGF0ZSIsImh0bWwiLCJwYXJlbnQiLCJoaWRlIiwid3BiY19hanhfYXZhaWxhYmlsaXR5X19jYWxlbmRhcl9fc2hvdyIsInJlc291cmNlX2lkIiwiYWp4X25vbmNlX2NhbGVuZGFyIiwidHJpZ2dlciIsImNhbGVuZGFyX3BhcmFtc19hcnIiLCJvbiIsImV2ZW50IiwiaW5zdCIsImRwRGl2IiwiZmluZCIsInRoaXNfZXZlbnQiLCJqQ2VsbCIsImN1cnJlbnRUYXJnZXQiLCJ3cGJjX2F2eV9fc2hvd190b29sdGlwX19mb3JfZWxlbWVudCIsImpDYWxDb250YWluZXIiLCJyZW1vdmVDbGFzcyIsImNhbGVuZGFyX192aWV3X19jZWxsX2hlaWdodCIsImFwcGVuZCIsIndpZHRoIiwiY2FsZW5kYXJfX3ZpZXdfX3dpZHRoIiwidW5kZWZpbmVkIiwiY2FsZW5kYXJfX3ZpZXdfX21heF93aWR0aCIsImNhbGVuZGFyX192aWV3X19tb250aHNfaW5fcm93IiwiY2FsZW5kYXJfX3ZpZXdfX3Zpc2libGVfbW9udGhzIiwiY2FsZW5kYXJfX3RpbWVzbG90X2RheV9iZ19hc19hdmFpbGFibGUiLCJjYWxfcGFyYW1fYXJyIiwiY2FsZW5kYXJfX3N0YXJ0X3dlZWtfZGF5IiwiY2FsZW5kYXJfX2RheXNfc2VsZWN0aW9uX21vZGUiLCJib29rZWRfZGF0ZXMiLCJzZWFzb25fYXZhaWxhYmlsaXR5IiwicmVzb3VyY2VfdW5hdmFpbGFibGVfZGF0ZXMiLCJ3cGJjX3Nob3dfaW5saW5lX2Jvb2tpbmdfY2FsZW5kYXIiLCJ3cGJjX19pbmxpbmVfYm9va2luZ19jYWxlbmRhcl9fb25fZGF5c19zZWxlY3QiLCJ0ZXh0X2lkIiwidmFsIiwicG9wb3Zlcl9oaW50cyIsInRvb2xiYXJfdGV4dCIsImh0bWxfaWQiLCJsZW5ndGgiLCJoYXNDbGFzcyIsInRleHQiLCJkYXRlcGljayIsImJlZm9yZVNob3dEYXkiLCJkYXRlIiwid3BiY19faW5saW5lX2Jvb2tpbmdfY2FsZW5kYXJfX2FwcGx5X2Nzc190b19kYXlzIiwib25TZWxlY3QiLCJvbkhvdmVyIiwidmFsdWUiLCJ3cGJjX19pbmxpbmVfYm9va2luZ19jYWxlbmRhcl9fb25fZGF5c19ob3ZlciIsIm9uQ2hhbmdlTW9udGhZZWFyIiwic2hvd09uIiwibnVtYmVyT2ZNb250aHMiLCJzdGVwTW9udGhzIiwicHJldlRleHQiLCJuZXh0VGV4dCIsImRhdGVGb3JtYXQiLCJjaGFuZ2VNb250aCIsImNoYW5nZVllYXIiLCJtaW5EYXRlIiwibWF4RGF0ZSIsInNob3dTdGF0dXMiLCJjbG9zZUF0VG9wIiwiZmlyc3REYXkiLCJnb3RvQ3VycmVudCIsImhpZGVJZk5vUHJldk5leHQiLCJtdWx0aVNlcGFyYXRvciIsIm11bHRpU2VsZWN0IiwicmFuZ2VTZWxlY3QiLCJyYW5nZVNlcGFyYXRvciIsInVzZVRoZW1lUm9sbGVyIiwiZGF0ZXBpY2tfdGhpcyIsInRvZGF5X2RhdGUiLCJEYXRlIiwiX3dwYmMiLCJwYXJzZUludCIsImNsYXNzX2RheSIsImdldE1vbnRoIiwiZ2V0RGF0ZSIsImdldEZ1bGxZZWFyIiwic3FsX2NsYXNzX2RheSIsIndwYmNfX2dldF9fc3FsX2NsYXNzX2RhdGUiLCJjc3NfZGF0ZV9fc3RhbmRhcmQiLCJjc3NfZGF0ZV9fYWRkaXRpb25hbCIsImdldERheSIsImkiLCJ3cGJjX2RhdGVzX19kYXlzX2JldHdlZW4iLCJpc19kYXRlX2F2YWlsYWJsZSIsIndwZGV2X2luX2FycmF5IiwiYm9va2luZ3NfaW5fZGF0ZSIsImFwcHJvdmVkIiwiT2JqZWN0Iiwia2V5cyIsImlzX2FwcHJvdmVkIiwidHMiLCJib29raW5nX2RhdGUiLCJzdWJzdHJpbmciLCJfZ2V0SW5zdCIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJkYXRlcyIsInRkX2NsYXNzIiwidGRfb3ZlcnMiLCJpc19jaGVjayIsInNlbGNldGVkX2ZpcnN0X2RheSIsInNldEZ1bGxZZWFyIiwiYWRkQ2xhc3MiLCJkYXRlc19zZWxlY3Rpb24iLCJkYXRlc19hcnIiLCJpbmRleE9mIiwid3BiY19nZXRfZGF0ZXNfYXJyX19mcm9tX2RhdGVzX3JhbmdlX2pzIiwid3BiY19nZXRfZGF0ZXNfYXJyX19mcm9tX2RhdGVzX2NvbW1hX3NlcGFyYXRlZF9qcyIsIndwYmNfYXZ5X2FmdGVyX2RheXNfc2VsZWN0aW9uX19zaG93X2hlbHBfaW5mbyIsInBhcmFtcyIsIm1lc3NhZ2UiLCJjb2xvciIsImlzIiwidG9vbGJhcl90ZXh0X2F2YWlsYWJsZSIsInRvb2xiYXJfdGV4dF91bmF2YWlsYWJsZSIsImZpcnN0X2RhdGUiLCJsYXN0X2RhdGUiLCJmb3JtYXREYXRlIiwiZGF0ZXNfY2xpY2tfbnVtIiwiYXR0ciIsIndwYmNfYmxpbmtfZWxlbWVudCIsInJlcGxhY2UiLCJwdXNoIiwiam9pbiIsInNwbGl0Iiwic29ydCIsImNoZWNrX2luX2RhdGVfeW1kIiwiY2hlY2tfb3V0X2RhdGVfeW1kIiwid3BiY19nZXRfZGF0ZXNfYXJyYXlfZnJvbV9zdGFydF9lbmRfZGF5c19qcyIsInNTdGFydERhdGUiLCJzRW5kRGF0ZSIsImFEYXlzIiwiZ2V0VGltZSIsInNDdXJyZW50RGF0ZSIsIm9uZV9kYXlfZHVyYXRpb24iLCJzZXRUaW1lIiwid3BiY19hdnlfX3ByZXBhcmVfdG9vbHRpcF9faW5fY2FsZW5kYXIiLCJ0b29sdGlwX3RpbWUiLCJ0ZF9lbCIsImdldCIsIl90aXBweSIsIndwYmNfdGlwcHkiLCJjb250ZW50IiwicmVmZXJlbmNlIiwicG9wb3Zlcl9jb250ZW50IiwiZ2V0QXR0cmlidXRlIiwiYWxsb3dIVE1MIiwiaW50ZXJhY3RpdmUiLCJoaWRlT25DbGljayIsImludGVyYWN0aXZlQm9yZGVyIiwibWF4V2lkdGgiLCJ0aGVtZSIsInBsYWNlbWVudCIsImRlbGF5IiwiaWdub3JlQXR0cmlidXRlcyIsInRvdWNoIiwiYXBwZW5kVG8iLCJib2R5Iiwid3BiY19hanhfYXZhaWxhYmlsaXR5X19hamF4X3JlcXVlc3QiLCJjb25zb2xlIiwiZ3JvdXBDb2xsYXBzZWQiLCJsb2ciLCJ3cGJjX2F2YWlsYWJpbGl0eV9yZWxvYWRfYnV0dG9uX19zcGluX3N0YXJ0IiwicG9zdCIsIndwYmNfdXJsX2FqYXgiLCJhY3Rpb24iLCJ3cGJjX2FqeF91c2VyX2lkIiwid3BiY19hanhfbG9jYWxlIiwic2VhcmNoX3BhcmFtcyIsInJlc3BvbnNlX2RhdGEiLCJ0ZXh0U3RhdHVzIiwianFYSFIiLCJncm91cEVuZCIsIndwYmNfYWp4X2F2YWlsYWJpbGl0eV9fc2hvd19tZXNzYWdlIiwibG9jYXRpb24iLCJyZWxvYWQiLCJ3cGJjX2FkbWluX3Nob3dfbWVzc2FnZSIsIndwYmNfYXZhaWxhYmlsaXR5X3JlbG9hZF9idXR0b25fX3NwaW5fcGF1c2UiLCJ3cGJjX2J1dHRvbl9fcmVtb3ZlX3NwaW4iLCJmYWlsIiwiZXJyb3JUaHJvd24iLCJ3aW5kb3ciLCJlcnJvcl9tZXNzYWdlIiwic3RhdHVzIiwicmVzcG9uc2VUZXh0Iiwid3BiY19hanhfYXZhaWxhYmlsaXR5X19zZW5kX3JlcXVlc3Rfd2l0aF9wYXJhbXMiLCJ3cGJjX2FqeF9hdmFpbGFiaWxpdHlfX3BhZ2luYXRpb25fY2xpY2siLCJwYWdlX251bWJlciIsIndwYmNfYWp4X2F2YWlsYWJpbGl0eV9fYWN0dWFsX2NvbnRlbnRfX3Nob3ciLCJ3cGJjX2FqeF9hdmFpbGFiaWxpdHlfX2FjdHVhbF9jb250ZW50X19oaWRlIiwid3BiY19hdmFpbGFiaWxpdHlfcmVsb2FkX2J1dHRvbl9faXNfc3BpbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBRUEsSUFBSUEscUJBQXFCLEdBQUksVUFBV0MsR0FBWCxFQUFnQkMsQ0FBaEIsRUFBbUI7QUFFL0M7QUFDQSxNQUFJQyxRQUFRLEdBQUdGLEdBQUcsQ0FBQ0csWUFBSixHQUFtQkgsR0FBRyxDQUFDRyxZQUFKLElBQW9CO0FBQ3hDQyxJQUFBQSxPQUFPLEVBQUUsQ0FEK0I7QUFFeENDLElBQUFBLEtBQUssRUFBSSxFQUYrQjtBQUd4Q0MsSUFBQUEsTUFBTSxFQUFHO0FBSCtCLEdBQXREOztBQU1BTixFQUFBQSxHQUFHLENBQUNPLGdCQUFKLEdBQXVCLFVBQVdDLFNBQVgsRUFBc0JDLFNBQXRCLEVBQWtDO0FBQ3hEUCxJQUFBQSxRQUFRLENBQUVNLFNBQUYsQ0FBUixHQUF3QkMsU0FBeEI7QUFDQSxHQUZEOztBQUlBVCxFQUFBQSxHQUFHLENBQUNVLGdCQUFKLEdBQXVCLFVBQVdGLFNBQVgsRUFBdUI7QUFDN0MsV0FBT04sUUFBUSxDQUFFTSxTQUFGLENBQWY7QUFDQSxHQUZELENBYitDLENBa0IvQzs7O0FB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cXVlc3QgT2JqZWN0XHJcbiAqIEhlcmUgd2UgY2FuICBkZWZpbmUgU2VhcmNoIHBhcmFtZXRlcnMgYW5kIFVwZGF0ZSBpdCBsYXRlciwgIHdoZW4gIHNvbWUgcGFyYW1ldGVyIHdhcyBjaGFuZ2VkXHJcbiAqXHJcbiAqL1xyXG5cclxudmFyIHdwYmNfYWp4X2F2YWlsYWJpbGl0eSA9IChmdW5jdGlvbiAoIG9iaiwgJCkge1xyXG5cclxuXHQvLyBTZWN1cmUgcGFyYW1ldGVycyBmb3IgQWpheFx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0dmFyIHBfc2VjdXJlID0gb2JqLnNlY3VyaXR5X29iaiA9IG9iai5zZWN1cml0eV9vYmogfHwge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1c2VyX2lkOiAwLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRub25jZSAgOiAnJyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bG9jYWxlIDogJydcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgfTtcclxuXHJcblx0b2JqLnNldF9zZWN1cmVfcGFyYW0gPSBmdW5jdGlvbiAoIHBhcmFtX2tleSwgcGFyYW1fdmFsICkge1xyXG5cdFx0cF9zZWN1cmVbIHBhcmFtX2tleSBdID0gcGFyYW1fdmFsO1xyXG5cdH07XHJcblxyXG5cdG9iai5nZXRfc2VjdXJlX3BhcmFtID0gZnVuY3Rpb24gKCBwYXJhbV9rZXkgKSB7XHJcblx0XHRyZXR1cm4gcF9zZWN1cmVbIHBhcmFtX2tleSBdO1xyXG5cdH07XHJcblxyXG5cclxuXHQvLyBMaXN0aW5nIFNlYXJjaCBwYXJhbWV0ZXJzXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHR2YXIgcF9saXN0aW5nID0gb2JqLnNlYXJjaF9yZXF1ZXN0X29iaiA9IG9iai5zZWFyY2hfcmVxdWVzdF9vYmogfHwge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBzb3J0ICAgICAgICAgICAgOiBcImJvb2tpbmdfaWRcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gc29ydF90eXBlICAgICAgIDogXCJERVNDXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHBhZ2VfbnVtICAgICAgICA6IDEsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHBhZ2VfaXRlbXNfY291bnQ6IDEwLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBjcmVhdGVfZGF0ZSAgICAgOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBrZXl3b3JkICAgICAgICAgOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBzb3VyY2UgICAgICAgICAgOiBcIlwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9O1xyXG5cclxuXHRvYmouc2VhcmNoX3NldF9hbGxfcGFyYW1zID0gZnVuY3Rpb24gKCByZXF1ZXN0X3BhcmFtX29iaiApIHtcclxuXHRcdHBfbGlzdGluZyA9IHJlcXVlc3RfcGFyYW1fb2JqO1xyXG5cdH07XHJcblxyXG5cdG9iai5zZWFyY2hfZ2V0X2FsbF9wYXJhbXMgPSBmdW5jdGlvbiAoKSB7XHJcblx0XHRyZXR1cm4gcF9saXN0aW5nO1xyXG5cdH07XHJcblxyXG5cdG9iai5zZWFyY2hfZ2V0X3BhcmFtID0gZnVuY3Rpb24gKCBwYXJhbV9rZXkgKSB7XHJcblx0XHRyZXR1cm4gcF9saXN0aW5nWyBwYXJhbV9rZXkgXTtcclxuXHR9O1xyXG5cclxuXHRvYmouc2VhcmNoX3NldF9wYXJhbSA9IGZ1bmN0aW9uICggcGFyYW1fa2V5LCBwYXJhbV92YWwgKSB7XHJcblx0XHQvLyBpZiAoIEFycmF5LmlzQXJyYXkoIHBhcmFtX3ZhbCApICl7XHJcblx0XHQvLyBcdHBhcmFtX3ZhbCA9IEpTT04uc3RyaW5naWZ5KCBwYXJhbV92YWwgKTtcclxuXHRcdC8vIH1cclxuXHRcdHBfbGlzdGluZ1sgcGFyYW1fa2V5IF0gPSBwYXJhbV92YWw7XHJcblx0fTtcclxuXHJcblx0b2JqLnNlYXJjaF9zZXRfcGFyYW1zX2FyciA9IGZ1bmN0aW9uKCBwYXJhbXNfYXJyICl7XHJcblx0XHRfLmVhY2goIHBhcmFtc19hcnIsIGZ1bmN0aW9uICggcF92YWwsIHBfa2V5LCBwX2RhdGEgKXtcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBEZWZpbmUgZGlmZmVyZW50IFNlYXJjaCAgcGFyYW1ldGVycyBmb3IgcmVxdWVzdFxyXG5cdFx0XHR0aGlzLnNlYXJjaF9zZXRfcGFyYW0oIHBfa2V5LCBwX3ZhbCApO1xyXG5cdFx0fSApO1xyXG5cdH1cclxuXHJcblxyXG5cdC8vIE90aGVyIHBhcmFtZXRlcnMgXHRcdFx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0dmFyIHBfb3RoZXIgPSBvYmoub3RoZXJfb2JqID0gb2JqLm90aGVyX29iaiB8fCB7IH07XHJcblxyXG5cdG9iai5zZXRfb3RoZXJfcGFyYW0gPSBmdW5jdGlvbiAoIHBhcmFtX2tleSwgcGFyYW1fdmFsICkge1xyXG5cdFx0cF9vdGhlclsgcGFyYW1fa2V5IF0gPSBwYXJhbV92YWw7XHJcblx0fTtcclxuXHJcblx0b2JqLmdldF9vdGhlcl9wYXJhbSA9IGZ1bmN0aW9uICggcGFyYW1fa2V5ICkge1xyXG5cdFx0cmV0dXJuIHBfb3RoZXJbIHBhcmFtX2tleSBdO1xyXG5cdH07XHJcblxyXG5cclxuXHRyZXR1cm4gb2JqO1xyXG59KCB3cGJjX2FqeF9hdmFpbGFiaWxpdHkgfHwge30sIGpRdWVyeSApKTtcclxuXHJcbnZhciB3cGJjX2FqeF9ib29raW5ncyA9IFtdO1xyXG5cclxuLyoqXHJcbiAqICAgU2hvdyBDb250ZW50ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXHJcblxyXG4vKipcclxuICogU2hvdyBDb250ZW50IC0gQ2FsZW5kYXIgYW5kIFVJIGVsZW1lbnRzXHJcbiAqXHJcbiAqIEBwYXJhbSBhanhfZGF0YV9hcnJcclxuICogQHBhcmFtIGFqeF9zZWFyY2hfcGFyYW1zXHJcbiAqIEBwYXJhbSBhanhfY2xlYW5lZF9wYXJhbXNcclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfYWp4X2F2YWlsYWJpbGl0eV9fcGFnZV9jb250ZW50X19zaG93KCBhanhfZGF0YV9hcnIsIGFqeF9zZWFyY2hfcGFyYW1zICwgYWp4X2NsZWFuZWRfcGFyYW1zICl7XHJcblxyXG5cdHZhciB0ZW1wbGF0ZV9fYXZhaWxhYmlsaXR5X21haW5fcGFnZV9jb250ZW50ID0gd3AudGVtcGxhdGUoICd3cGJjX2FqeF9hdmFpbGFiaWxpdHlfbWFpbl9wYWdlX2NvbnRlbnQnICk7XHJcblxyXG5cdC8vIENvbnRlbnRcclxuXHRqUXVlcnkoIHdwYmNfYWp4X2F2YWlsYWJpbGl0eS5nZXRfb3RoZXJfcGFyYW0oICdsaXN0aW5nX2NvbnRhaW5lcicgKSApLmh0bWwoIHRlbXBsYXRlX19hdmFpbGFiaWxpdHlfbWFpbl9wYWdlX2NvbnRlbnQoIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnYWp4X2RhdGEnICAgICAgICAgICAgICA6IGFqeF9kYXRhX2FycixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnYWp4X3NlYXJjaF9wYXJhbXMnICAgICA6IGFqeF9zZWFyY2hfcGFyYW1zLFx0XHRcdFx0XHRcdFx0XHQvLyAkX1JFUVVFU1RbICdzZWFyY2hfcGFyYW1zJyBdXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2FqeF9jbGVhbmVkX3BhcmFtcycgICAgOiBhanhfY2xlYW5lZF9wYXJhbXNcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSApICk7XHJcblxyXG5cdGpRdWVyeSggJy53cGJjX3Byb2Nlc3Npbmcud3BiY19zcGluJykucGFyZW50KCkucGFyZW50KCkucGFyZW50KCkucGFyZW50KCAnW2lkXj1cIndwYmNfbm90aWNlX1wiXScgKS5oaWRlKCk7XHJcblx0Ly8gTG9hZCBjYWxlbmRhclxyXG5cdHdwYmNfYWp4X2F2YWlsYWJpbGl0eV9fY2FsZW5kYXJfX3Nob3coIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdyZXNvdXJjZV9pZCcgICAgICAgOiBhanhfY2xlYW5lZF9wYXJhbXMucmVzb3VyY2VfaWQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnYWp4X25vbmNlX2NhbGVuZGFyJzogYWp4X2RhdGFfYXJyLmFqeF9ub25jZV9jYWxlbmRhcixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdhanhfZGF0YV9hcnInICAgICAgICAgIDogYWp4X2RhdGFfYXJyLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2FqeF9jbGVhbmVkX3BhcmFtcycgICAgOiBhanhfY2xlYW5lZF9wYXJhbXNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9ICk7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBUcmlnZ2VyIGZvciBkYXRlcyBzZWxlY3Rpb24gaW4gdGhlIGJvb2tpbmcgZm9ybVxyXG5cdCAqXHJcblx0ICogalF1ZXJ5KCB3cGJjX2FqeF9hdmFpbGFiaWxpdHkuZ2V0X290aGVyX3BhcmFtKCAnbGlzdGluZ19jb250YWluZXInICkgKS5vbignd3BiY19wYWdlX2NvbnRlbnRfbG9hZGVkJywgZnVuY3Rpb24oZXZlbnQsIGFqeF9kYXRhX2FyciwgYWp4X3NlYXJjaF9wYXJhbXMgLCBhanhfY2xlYW5lZF9wYXJhbXMpIHsgLi4uIH0gKTtcclxuXHQgKi9cclxuXHRqUXVlcnkoIHdwYmNfYWp4X2F2YWlsYWJpbGl0eS5nZXRfb3RoZXJfcGFyYW0oICdsaXN0aW5nX2NvbnRhaW5lcicgKSApLnRyaWdnZXIoICd3cGJjX3BhZ2VfY29udGVudF9sb2FkZWQnLCBbIGFqeF9kYXRhX2FyciwgYWp4X3NlYXJjaF9wYXJhbXMgLCBhanhfY2xlYW5lZF9wYXJhbXMgXSApO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIFNob3cgaW5saW5lIG1vbnRoIHZpZXcgY2FsZW5kYXIgICAgICAgICAgICAgIHdpdGggYWxsIHByZWRlZmluZWQgQ1NTIChzaXplcyBhbmQgY2hlY2sgaW4vb3V0LCAgdGltZXMgY29udGFpbmVycylcclxuICogQHBhcmFtIHtvYmp9IGNhbGVuZGFyX3BhcmFtc19hcnJcclxuXHRcdFx0e1xyXG5cdFx0XHRcdCdyZXNvdXJjZV9pZCcgICAgICAgXHQ6IGFqeF9jbGVhbmVkX3BhcmFtcy5yZXNvdXJjZV9pZCxcclxuXHRcdFx0XHQnYWp4X25vbmNlX2NhbGVuZGFyJ1x0OiBhanhfZGF0YV9hcnIuYWp4X25vbmNlX2NhbGVuZGFyLFxyXG5cdFx0XHRcdCdhanhfZGF0YV9hcnInICAgICAgICAgIDogYWp4X2RhdGFfYXJyID0geyBhanhfYm9va2luZ19yZXNvdXJjZXM6W10sIGJvb2tlZF9kYXRlczoge30sIHJlc291cmNlX3VuYXZhaWxhYmxlX2RhdGVzOltdLCBzZWFzb25fYXZhaWxhYmlsaXR5Ont9LC4uLi4gfVxyXG5cdFx0XHRcdCdhanhfY2xlYW5lZF9wYXJhbXMnICAgIDoge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FsZW5kYXJfX2RheXNfc2VsZWN0aW9uX21vZGU6IFwiZHluYW1pY1wiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjYWxlbmRhcl9fc3RhcnRfd2Vla19kYXk6IFwiMFwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjYWxlbmRhcl9fdGltZXNsb3RfZGF5X2JnX2FzX2F2YWlsYWJsZTogXCJcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FsZW5kYXJfX3ZpZXdfX2NlbGxfaGVpZ2h0OiBcIlwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjYWxlbmRhcl9fdmlld19fbW9udGhzX2luX3JvdzogNFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FsZW5kYXJfX3ZpZXdfX3Zpc2libGVfbW9udGhzOiAxMlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FsZW5kYXJfX3ZpZXdfX3dpZHRoOiBcIjEwMCVcIlxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGVzX2F2YWlsYWJpbGl0eTogXCJ1bmF2YWlsYWJsZVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRlc19zZWxlY3Rpb246IFwiMjAyMy0wMy0xNCB+IDIwMjMtMDMtMTZcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZG9fYWN0aW9uOiBcInNldF9hdmFpbGFiaWxpdHlcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb3VyY2VfaWQ6IDFcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVpX2NsaWNrZWRfZWxlbWVudF9pZDogXCJ3cGJjX2F2YWlsYWJpbGl0eV9hcHBseV9idG5cIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dWlfdXNyX19hdmFpbGFiaWxpdHlfc2VsZWN0ZWRfdG9vbGJhcjogXCJpbmZvXCJcclxuXHRcdFx0XHRcdFx0XHRcdCAgXHRcdCB9XHJcblx0XHRcdH1cclxuKi9cclxuZnVuY3Rpb24gd3BiY19hanhfYXZhaWxhYmlsaXR5X19jYWxlbmRhcl9fc2hvdyggY2FsZW5kYXJfcGFyYW1zX2FyciApe1xyXG5cclxuXHQvLyBVcGRhdGUgbm9uY2VcclxuXHRqUXVlcnkoICcjYWp4X25vbmNlX2NhbGVuZGFyX3NlY3Rpb24nICkuaHRtbCggY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfbm9uY2VfY2FsZW5kYXIgKTtcclxuXHJcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvLyBVcGRhdGUgYm9va2luZ3NcclxuXHRpZiAoICd1bmRlZmluZWQnID09IHR5cGVvZiAod3BiY19hanhfYm9va2luZ3NbIGNhbGVuZGFyX3BhcmFtc19hcnIucmVzb3VyY2VfaWQgXSkgKXsgd3BiY19hanhfYm9va2luZ3NbIGNhbGVuZGFyX3BhcmFtc19hcnIucmVzb3VyY2VfaWQgXSA9IFtdOyB9XHJcblx0d3BiY19hanhfYm9va2luZ3NbIGNhbGVuZGFyX3BhcmFtc19hcnIucmVzb3VyY2VfaWQgXSA9IGNhbGVuZGFyX3BhcmFtc19hcnJbICdhanhfZGF0YV9hcnInIF1bICdib29rZWRfZGF0ZXMnIF07XHJcblxyXG5cclxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8qKlxyXG5cdCAqIERlZmluZSBzaG93aW5nIG1vdXNlIG92ZXIgdG9vbHRpcCBvbiB1bmF2YWlsYWJsZSBkYXRlc1xyXG5cdCAqIEl0J3MgZGVmaW5lZCwgd2hlbiBjYWxlbmRhciBSRUZSRVNIRUQgKGNoYW5nZSBtb250aHMgb3IgZGF5cyBzZWxlY3Rpb24pIGxvYWRlZCBpbiBqcXVlcnkuZGF0ZXBpY2sud3BiYy45LjAuanMgOlxyXG5cdCAqIFx0XHQkKCAnYm9keScgKS50cmlnZ2VyKCAnd3BiY19kYXRlcGlja19pbmxpbmVfY2FsZW5kYXJfcmVmcmVzaCcsIC4uLlx0XHQvL0ZpeEluOiA5LjQuNC4xM1xyXG5cdCAqL1xyXG5cdGpRdWVyeSggJ2JvZHknICkub24oICd3cGJjX2RhdGVwaWNrX2lubGluZV9jYWxlbmRhcl9yZWZyZXNoJywgZnVuY3Rpb24gKCBldmVudCwgcmVzb3VyY2VfaWQsIGluc3QgKXtcclxuXHRcdC8vIGluc3QuZHBEaXYgIGl0J3M6ICA8ZGl2IGNsYXNzPVwiZGF0ZXBpY2staW5saW5lIGRhdGVwaWNrLW11bHRpXCIgc3R5bGU9XCJ3aWR0aDogMTc3MTJweDtcIj4uLi4uPC9kaXY+XHJcblx0XHRpbnN0LmRwRGl2LmZpbmQoICcuc2Vhc29uX3VuYXZhaWxhYmxlLC5iZWZvcmVfYWZ0ZXJfdW5hdmFpbGFibGUsLndlZWtkYXlzX3VuYXZhaWxhYmxlJyApLm9uKCAnbW91c2VvdmVyJywgZnVuY3Rpb24gKCB0aGlzX2V2ZW50ICl7XHJcblx0XHRcdC8vIGFsc28gYXZhaWxhYmxlIHRoZXNlIHZhcnM6IFx0cmVzb3VyY2VfaWQsIGpDYWxDb250YWluZXIsIGluc3RcclxuXHRcdFx0dmFyIGpDZWxsID0galF1ZXJ5KCB0aGlzX2V2ZW50LmN1cnJlbnRUYXJnZXQgKTtcclxuXHRcdFx0d3BiY19hdnlfX3Nob3dfdG9vbHRpcF9fZm9yX2VsZW1lbnQoIGpDZWxsLCBjYWxlbmRhcl9wYXJhbXNfYXJyWyAnYWp4X2RhdGFfYXJyJyBdWydwb3BvdmVyX2hpbnRzJ10gKTtcclxuXHRcdH0pO1xyXG5cclxuXHR9XHQpO1xyXG5cclxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8qKlxyXG5cdCAqIERlZmluZSBoZWlnaHQgb2YgdGhlIGNhbGVuZGFyICBjZWxscywgXHRhbmQgIG1vdXNlIG92ZXIgdG9vbHRpcHMgYXQgIHNvbWUgdW5hdmFpbGFibGUgZGF0ZXNcclxuXHQgKiBJdCdzIGRlZmluZWQsIHdoZW4gY2FsZW5kYXIgbG9hZGVkIGluIGpxdWVyeS5kYXRlcGljay53cGJjLjkuMC5qcyA6XHJcblx0ICogXHRcdCQoICdib2R5JyApLnRyaWdnZXIoICd3cGJjX2RhdGVwaWNrX2lubGluZV9jYWxlbmRhcl9sb2FkZWQnLCAuLi5cdFx0Ly9GaXhJbjogOS40LjQuMTJcclxuXHQgKi9cclxuXHRqUXVlcnkoICdib2R5JyApLm9uKCAnd3BiY19kYXRlcGlja19pbmxpbmVfY2FsZW5kYXJfbG9hZGVkJywgZnVuY3Rpb24gKCBldmVudCwgcmVzb3VyY2VfaWQsIGpDYWxDb250YWluZXIsIGluc3QgKXtcclxuXHJcblx0XHQvLyBSZW1vdmUgaGlnaGxpZ2h0IGRheSBmb3IgdG9kYXkgIGRhdGVcclxuXHRcdGpRdWVyeSggJy5kYXRlcGljay1kYXlzLWNlbGwuZGF0ZXBpY2stdG9kYXkuZGF0ZXBpY2stZGF5cy1jZWxsLW92ZXInICkucmVtb3ZlQ2xhc3MoICdkYXRlcGljay1kYXlzLWNlbGwtb3ZlcicgKTtcclxuXHJcblx0XHQvLyBTZXQgaGVpZ2h0IG9mIGNhbGVuZGFyICBjZWxscyBpZiBkZWZpbmVkIHRoaXMgb3B0aW9uXHJcblx0XHRpZiAoICcnICE9PSBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9jbGVhbmVkX3BhcmFtcy5jYWxlbmRhcl9fdmlld19fY2VsbF9oZWlnaHQgKXtcclxuXHRcdFx0alF1ZXJ5KCAnaGVhZCcgKS5hcHBlbmQoICc8c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsgJy5oYXNEYXRlcGljayAuZGF0ZXBpY2staW5saW5lIC5kYXRlcGljay10aXRsZS1yb3cgdGgsICdcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQrICcuaGFzRGF0ZXBpY2sgLmRhdGVwaWNrLWlubGluZSAuZGF0ZXBpY2stZGF5cy1jZWxsIHsnXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQrICdoZWlnaHQ6ICcgKyBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9jbGVhbmVkX3BhcmFtcy5jYWxlbmRhcl9fdmlld19fY2VsbF9oZWlnaHQgKyAnICFpbXBvcnRhbnQ7J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsgJ30nXHJcblx0XHRcdFx0XHRcdFx0XHRcdCsnPC9zdHlsZT4nICk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRGVmaW5lIHNob3dpbmcgbW91c2Ugb3ZlciB0b29sdGlwIG9uIHVuYXZhaWxhYmxlIGRhdGVzXHJcblx0XHRqQ2FsQ29udGFpbmVyLmZpbmQoICcuc2Vhc29uX3VuYXZhaWxhYmxlLC5iZWZvcmVfYWZ0ZXJfdW5hdmFpbGFibGUsLndlZWtkYXlzX3VuYXZhaWxhYmxlJyApLm9uKCAnbW91c2VvdmVyJywgZnVuY3Rpb24gKCB0aGlzX2V2ZW50ICl7XHJcblx0XHRcdC8vIGFsc28gYXZhaWxhYmxlIHRoZXNlIHZhcnM6IFx0cmVzb3VyY2VfaWQsIGpDYWxDb250YWluZXIsIGluc3RcclxuXHRcdFx0dmFyIGpDZWxsID0galF1ZXJ5KCB0aGlzX2V2ZW50LmN1cnJlbnRUYXJnZXQgKTtcclxuXHRcdFx0d3BiY19hdnlfX3Nob3dfdG9vbHRpcF9fZm9yX2VsZW1lbnQoIGpDZWxsLCBjYWxlbmRhcl9wYXJhbXNfYXJyWyAnYWp4X2RhdGFfYXJyJyBdWydwb3BvdmVyX2hpbnRzJ10gKTtcclxuXHRcdH0pO1xyXG5cdH0gKTtcclxuXHJcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvLyBEZWZpbmUgd2lkdGggb2YgZW50aXJlIGNhbGVuZGFyXHJcblx0dmFyIHdpZHRoID0gICAnd2lkdGg6J1x0XHQrICAgY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfY2xlYW5lZF9wYXJhbXMuY2FsZW5kYXJfX3ZpZXdfX3dpZHRoICsgJzsnO1x0XHRcdFx0XHQvLyB2YXIgd2lkdGggPSAnd2lkdGg6MTAwJTttYXgtd2lkdGg6MTAwJTsnO1xyXG5cclxuXHRpZiAoICAgKCB1bmRlZmluZWQgIT0gY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfY2xlYW5lZF9wYXJhbXMuY2FsZW5kYXJfX3ZpZXdfX21heF93aWR0aCApXHJcblx0XHQmJiAoICcnICE9IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLmNhbGVuZGFyX192aWV3X19tYXhfd2lkdGggKVxyXG5cdCl7XHJcblx0XHR3aWR0aCArPSAnbWF4LXdpZHRoOicgXHQrIGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLmNhbGVuZGFyX192aWV3X19tYXhfd2lkdGggKyAnOyc7XHJcblx0fSBlbHNlIHtcclxuXHRcdHdpZHRoICs9ICdtYXgtd2lkdGg6JyBcdCsgKCBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9jbGVhbmVkX3BhcmFtcy5jYWxlbmRhcl9fdmlld19fbW9udGhzX2luX3JvdyAqIDM0MSApICsgJ3B4Oyc7XHJcblx0fVxyXG5cclxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8vIEFkZCBjYWxlbmRhciBjb250YWluZXI6IFwiQ2FsZW5kYXIgaXMgbG9hZGluZy4uLlwiICBhbmQgdGV4dGFyZWFcclxuXHRqUXVlcnkoICcud3BiY19hanhfYXZ5X19jYWxlbmRhcicgKS5odG1sKFxyXG5cclxuXHRcdCc8ZGl2IGNsYXNzPVwiJ1x0KyAnIGJrX2NhbGVuZGFyX2ZyYW1lJ1xyXG5cdFx0XHRcdFx0XHQrICcgbW9udGhzX251bV9pbl9yb3dfJyArIGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLmNhbGVuZGFyX192aWV3X19tb250aHNfaW5fcm93XHJcblx0XHRcdFx0XHRcdCsgJyBjYWxfbW9udGhfbnVtXycgXHQrIGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLmNhbGVuZGFyX192aWV3X192aXNpYmxlX21vbnRoc1xyXG5cdFx0XHRcdFx0XHQrICcgJyBcdFx0XHRcdFx0KyBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9jbGVhbmVkX3BhcmFtcy5jYWxlbmRhcl9fdGltZXNsb3RfZGF5X2JnX2FzX2F2YWlsYWJsZSBcdFx0XHRcdC8vICd3cGJjX3RpbWVzbG90X2RheV9iZ19hc19hdmFpbGFibGUnIHx8ICcnXHJcblx0XHRcdFx0KyAnXCIgJ1xyXG5cdFx0XHQrICdzdHlsZT1cIicgKyB3aWR0aCArICdcIj4nXHJcblxyXG5cdFx0XHRcdCsgJzxkaXYgaWQ9XCJjYWxlbmRhcl9ib29raW5nJyArIGNhbGVuZGFyX3BhcmFtc19hcnIucmVzb3VyY2VfaWQgKyAnXCI+JyArICdDYWxlbmRhciBpcyBsb2FkaW5nLi4uJyArICc8L2Rpdj4nXHJcblxyXG5cdFx0KyAnPC9kaXY+J1xyXG5cclxuXHRcdCsgJzx0ZXh0YXJlYSAgICAgIGlkPVwiZGF0ZV9ib29raW5nJyArIGNhbGVuZGFyX3BhcmFtc19hcnIucmVzb3VyY2VfaWQgKyAnXCInXHJcblx0XHRcdFx0XHQrICcgbmFtZT1cImRhdGVfYm9va2luZycgKyBjYWxlbmRhcl9wYXJhbXNfYXJyLnJlc291cmNlX2lkICsgJ1wiJ1xyXG5cdFx0XHRcdFx0KyAnIGF1dG9jb21wbGV0ZT1cIm9mZlwiJ1xyXG5cdFx0XHRcdFx0KyAnIHN0eWxlPVwiZGlzcGxheTpub25lO3dpZHRoOjEwMCU7aGVpZ2h0OjEwZW07bWFyZ2luOjJlbSAwIDA7XCI+PC90ZXh0YXJlYT4nXHJcblx0KTtcclxuXHJcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHR2YXIgY2FsX3BhcmFtX2FyciA9IHtcclxuXHRcdFx0XHRcdFx0XHQnaHRtbF9pZCcgICAgICAgICAgIDogJ2NhbGVuZGFyX2Jvb2tpbmcnICsgY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfY2xlYW5lZF9wYXJhbXMucmVzb3VyY2VfaWQsXHJcblx0XHRcdFx0XHRcdFx0J3RleHRfaWQnICAgICAgICAgICA6ICdkYXRlX2Jvb2tpbmcnICsgY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfY2xlYW5lZF9wYXJhbXMucmVzb3VyY2VfaWQsXHJcblxyXG5cdFx0XHRcdFx0XHRcdCdjYWxlbmRhcl9fc3RhcnRfd2Vla19kYXknOiBcdCAgY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfY2xlYW5lZF9wYXJhbXMuY2FsZW5kYXJfX3N0YXJ0X3dlZWtfZGF5LFxyXG5cdFx0XHRcdFx0XHRcdCdjYWxlbmRhcl9fdmlld19fdmlzaWJsZV9tb250aHMnOiBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9jbGVhbmVkX3BhcmFtcy5jYWxlbmRhcl9fdmlld19fdmlzaWJsZV9tb250aHMsXHJcblx0XHRcdFx0XHRcdFx0J2NhbGVuZGFyX19kYXlzX3NlbGVjdGlvbl9tb2RlJzogIGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLmNhbGVuZGFyX19kYXlzX3NlbGVjdGlvbl9tb2RlLFxyXG5cclxuXHRcdFx0XHRcdFx0XHQncmVzb3VyY2VfaWQnICAgICAgICA6IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLnJlc291cmNlX2lkLFxyXG5cdFx0XHRcdFx0XHRcdCdhanhfbm9uY2VfY2FsZW5kYXInIDogY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfZGF0YV9hcnIuYWp4X25vbmNlX2NhbGVuZGFyLFxyXG5cdFx0XHRcdFx0XHRcdCdib29rZWRfZGF0ZXMnICAgICAgIDogY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfZGF0YV9hcnIuYm9va2VkX2RhdGVzLFxyXG5cdFx0XHRcdFx0XHRcdCdzZWFzb25fYXZhaWxhYmlsaXR5JzogY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfZGF0YV9hcnIuc2Vhc29uX2F2YWlsYWJpbGl0eSxcclxuXHJcblx0XHRcdFx0XHRcdFx0J3Jlc291cmNlX3VuYXZhaWxhYmxlX2RhdGVzJyA6IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2RhdGFfYXJyLnJlc291cmNlX3VuYXZhaWxhYmxlX2RhdGVzLFxyXG5cclxuXHRcdFx0XHRcdFx0XHQncG9wb3Zlcl9oaW50cyc6IGNhbGVuZGFyX3BhcmFtc19hcnJbICdhanhfZGF0YV9hcnInIF1bJ3BvcG92ZXJfaGludHMnXVx0XHQvLyB7J3NlYXNvbl91bmF2YWlsYWJsZSc6Jy4uLicsJ3dlZWtkYXlzX3VuYXZhaWxhYmxlJzonLi4uJywnYmVmb3JlX2FmdGVyX3VuYXZhaWxhYmxlJzonLi4uJyx9XHJcblx0XHRcdFx0XHRcdH07XHJcblx0d3BiY19zaG93X2lubGluZV9ib29raW5nX2NhbGVuZGFyKCBjYWxfcGFyYW1fYXJyICk7XHJcblxyXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0LyoqXHJcblx0ICogT24gY2xpY2sgQVZBSUxBQkxFIHwgIFVOQVZBSUxBQkxFIGJ1dHRvbiAgaW4gd2lkZ2V0XHQtXHRuZWVkIHRvICBjaGFuZ2UgaGVscCBkYXRlcyB0ZXh0XHJcblx0ICovXHJcblx0alF1ZXJ5KCAnLndwYmNfcmFkaW9fX3NldF9kYXlzX2F2YWlsYWJpbGl0eScgKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKCBldmVudCwgcmVzb3VyY2VfaWQsIGluc3QgKXtcclxuXHRcdHdwYmNfX2lubGluZV9ib29raW5nX2NhbGVuZGFyX19vbl9kYXlzX3NlbGVjdCggalF1ZXJ5KCAnIycgKyBjYWxfcGFyYW1fYXJyLnRleHRfaWQgKS52YWwoKSAsIGNhbF9wYXJhbV9hcnIgKTtcclxuXHR9KTtcclxuXHJcblx0Ly8gU2hvdyBcdCdTZWxlY3QgZGF5cyAgaW4gY2FsZW5kYXIgdGhlbiBzZWxlY3QgQXZhaWxhYmxlICAvICBVbmF2YWlsYWJsZSBzdGF0dXMgYW5kIGNsaWNrIEFwcGx5IGF2YWlsYWJpbGl0eSBidXR0b24uJ1xyXG5cdGpRdWVyeSggJyN3cGJjX3Rvb2xiYXJfZGF0ZXNfaGludCcpLmh0bWwoICAgICAnPGRpdiBjbGFzcz1cInVpX2VsZW1lbnRcIj48c3BhbiBjbGFzcz1cIndwYmNfdWlfY29udHJvbCB3cGJjX3VpX2FkZG9uIHdwYmNfaGVscF90ZXh0XCIgPidcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQrIGNhbF9wYXJhbV9hcnIucG9wb3Zlcl9oaW50cy50b29sYmFyX3RleHRcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KyAnPC9zcGFuPjwvZGl2PidcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogXHRMb2FkIERhdGVwaWNrIElubGluZSBjYWxlbmRhclxyXG4gKlxyXG4gKiBAcGFyYW0gY2FsZW5kYXJfcGFyYW1zX2Fyclx0XHRleGFtcGxlOntcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdodG1sX2lkJyAgICAgICAgICAgOiAnY2FsZW5kYXJfYm9va2luZycgKyBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9jbGVhbmVkX3BhcmFtcy5yZXNvdXJjZV9pZCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCd0ZXh0X2lkJyAgICAgICAgICAgOiAnZGF0ZV9ib29raW5nJyArIGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLnJlc291cmNlX2lkLFxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdjYWxlbmRhcl9fc3RhcnRfd2Vla19kYXknOiBcdCAgY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfY2xlYW5lZF9wYXJhbXMuY2FsZW5kYXJfX3N0YXJ0X3dlZWtfZGF5LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2NhbGVuZGFyX192aWV3X192aXNpYmxlX21vbnRocyc6IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLmNhbGVuZGFyX192aWV3X192aXNpYmxlX21vbnRocyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdjYWxlbmRhcl9fZGF5c19zZWxlY3Rpb25fbW9kZSc6ICBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9jbGVhbmVkX3BhcmFtcy5jYWxlbmRhcl9fZGF5c19zZWxlY3Rpb25fbW9kZSxcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQncmVzb3VyY2VfaWQnICAgICAgICA6IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLnJlc291cmNlX2lkLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2FqeF9ub25jZV9jYWxlbmRhcicgOiBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9kYXRhX2Fyci5hanhfbm9uY2VfY2FsZW5kYXIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnYm9va2VkX2RhdGVzJyAgICAgICA6IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2RhdGFfYXJyLmJvb2tlZF9kYXRlcyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdzZWFzb25fYXZhaWxhYmlsaXR5JzogY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfZGF0YV9hcnIuc2Vhc29uX2F2YWlsYWJpbGl0eSxcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQncmVzb3VyY2VfdW5hdmFpbGFibGVfZGF0ZXMnIDogY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfZGF0YV9hcnIucmVzb3VyY2VfdW5hdmFpbGFibGVfZGF0ZXNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19zaG93X2lubGluZV9ib29raW5nX2NhbGVuZGFyKCBjYWxlbmRhcl9wYXJhbXNfYXJyICl7XHJcblxyXG5cdGlmIChcclxuXHRcdCAgICggMCA9PT0galF1ZXJ5KCAnIycgKyBjYWxlbmRhcl9wYXJhbXNfYXJyLmh0bWxfaWQgKS5sZW5ndGggKVx0XHRcdFx0XHRcdFx0Ly8gSWYgY2FsZW5kYXIgRE9NIGVsZW1lbnQgbm90IGV4aXN0IHRoZW4gZXhpc3RcclxuXHRcdHx8ICggdHJ1ZSA9PT0galF1ZXJ5KCAnIycgKyBjYWxlbmRhcl9wYXJhbXNfYXJyLmh0bWxfaWQgKS5oYXNDbGFzcyggJ2hhc0RhdGVwaWNrJyApIClcdC8vIElmIHRoZSBjYWxlbmRhciB3aXRoIHRoZSBzYW1lIEJvb2tpbmcgcmVzb3VyY2UgYWxyZWFkeSAgaGFzIGJlZW4gYWN0aXZhdGVkLCB0aGVuIGV4aXN0LlxyXG5cdCl7XHJcblx0ICAgcmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvLyBDb25maWd1cmUgYW5kIHNob3cgY2FsZW5kYXJcclxuXHRqUXVlcnkoICcjJyArIGNhbGVuZGFyX3BhcmFtc19hcnIuaHRtbF9pZCApLnRleHQoICcnICk7XHJcblx0alF1ZXJ5KCAnIycgKyBjYWxlbmRhcl9wYXJhbXNfYXJyLmh0bWxfaWQgKS5kYXRlcGljayh7XHJcblx0XHRcdFx0XHRiZWZvcmVTaG93RGF5OiBcdGZ1bmN0aW9uICggZGF0ZSApe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB3cGJjX19pbmxpbmVfYm9va2luZ19jYWxlbmRhcl9fYXBwbHlfY3NzX3RvX2RheXMoIGRhdGUsIGNhbGVuZGFyX3BhcmFtc19hcnIsIHRoaXMgKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSxcclxuICAgICAgICAgICAgICAgICAgICBvblNlbGVjdDogXHQgIFx0ZnVuY3Rpb24gKCBkYXRlICl7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0alF1ZXJ5KCAnIycgKyBjYWxlbmRhcl9wYXJhbXNfYXJyLnRleHRfaWQgKS52YWwoIGRhdGUgKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvL3dwYmNfYmxpbmtfZWxlbWVudCgnLndwYmNfd2lkZ2V0X2F2YWlsYWJsZV91bmF2YWlsYWJsZScsIDMsIDIyMCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHdwYmNfX2lubGluZV9ib29raW5nX2NhbGVuZGFyX19vbl9kYXlzX3NlbGVjdCggZGF0ZSwgY2FsZW5kYXJfcGFyYW1zX2FyciwgdGhpcyApO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9LFxyXG4gICAgICAgICAgICAgICAgICAgIG9uSG92ZXI6IFx0XHRmdW5jdGlvbiAoIHZhbHVlLCBkYXRlICl7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vd3BiY19hdnlfX3ByZXBhcmVfdG9vbHRpcF9faW5fY2FsZW5kYXIoIHZhbHVlLCBkYXRlLCBjYWxlbmRhcl9wYXJhbXNfYXJyLCB0aGlzICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB3cGJjX19pbmxpbmVfYm9va2luZ19jYWxlbmRhcl9fb25fZGF5c19ob3ZlciggdmFsdWUsIGRhdGUsIGNhbGVuZGFyX3BhcmFtc19hcnIsIHRoaXMgKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSxcclxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZU1vbnRoWWVhcjpcdG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgc2hvd09uOiBcdFx0XHQnYm90aCcsXHJcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZNb250aHM6IFx0Y2FsZW5kYXJfcGFyYW1zX2Fyci5jYWxlbmRhcl9fdmlld19fdmlzaWJsZV9tb250aHMsXHJcbiAgICAgICAgICAgICAgICAgICAgc3RlcE1vbnRoczpcdFx0XHQxLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZXZUZXh0OiBcdFx0XHQnJmxhcXVvOycsXHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dFRleHQ6IFx0XHRcdCcmcmFxdW87JyxcclxuICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0OiBcdFx0J3l5LW1tLWRkJywvLyAnZGQubW0ueXknLFxyXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZU1vbnRoOiBcdFx0ZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlWWVhcjogXHRcdGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIG1pbkRhdGU6IFx0XHRcdFx0XHQgMCxcdFx0Ly9udWxsLCAgLy9TY3JvbGwgYXMgbG9uZyBhcyB5b3UgbmVlZFxyXG5cdFx0XHRcdFx0bWF4RGF0ZTogXHRcdFx0XHRcdCcxMHknLFx0Ly8gbWluRGF0ZTogbmV3IERhdGUoMjAyMCwgMiwgMSksIG1heERhdGU6IG5ldyBEYXRlKDIwMjAsIDksIDMxKSwgXHQvLyBBYmlsaXR5IHRvIHNldCBhbnkgIHN0YXJ0IGFuZCBlbmQgZGF0ZSBpbiBjYWxlbmRhclxyXG4gICAgICAgICAgICAgICAgICAgIHNob3dTdGF0dXM6IFx0XHRmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBjbG9zZUF0VG9wOiBcdFx0ZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3REYXk6XHRcdFx0Y2FsZW5kYXJfcGFyYW1zX2Fyci5jYWxlbmRhcl9fc3RhcnRfd2Vla19kYXksXHJcbiAgICAgICAgICAgICAgICAgICAgZ290b0N1cnJlbnQ6IFx0XHRmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBoaWRlSWZOb1ByZXZOZXh0Olx0dHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBtdWx0aVNlcGFyYXRvcjogXHQnLCAnLFxyXG5cdFx0XHRcdFx0bXVsdGlTZWxlY3Q6ICgoJ2R5bmFtaWMnID09IGNhbGVuZGFyX3BhcmFtc19hcnIuY2FsZW5kYXJfX2RheXNfc2VsZWN0aW9uX21vZGUpID8gMCA6IDM2NSksXHRcdFx0Ly8gTWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0YWJsZSBkYXRlczpcdCBTaW5nbGUgZGF5ID0gMCwgIG11bHRpIGRheXMgPSAzNjVcclxuXHRcdFx0XHRcdHJhbmdlU2VsZWN0OiAgKCdkeW5hbWljJyA9PSBjYWxlbmRhcl9wYXJhbXNfYXJyLmNhbGVuZGFyX19kYXlzX3NlbGVjdGlvbl9tb2RlKSxcclxuXHRcdFx0XHRcdHJhbmdlU2VwYXJhdG9yOiBcdCcgfiAnLFx0XHRcdFx0XHQvLycgLSAnLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHNob3dXZWVrczogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICB1c2VUaGVtZVJvbGxlcjpcdFx0ZmFsc2VcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG5cclxuXHRyZXR1cm4gIHRydWU7XHJcbn1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGx5IENTUyB0byBjYWxlbmRhciBkYXRlIGNlbGxzXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gZGF0ZVx0XHRcdFx0XHQtICBKYXZhU2NyaXB0IERhdGUgT2JqOiAgXHRcdE1vbiBEZWMgMTEgMjAyMyAwMDowMDowMCBHTVQrMDIwMCAoRWFzdGVybiBFdXJvcGVhbiBTdGFuZGFyZCBUaW1lKVxyXG5cdCAqIEBwYXJhbSBjYWxlbmRhcl9wYXJhbXNfYXJyXHQtICBDYWxlbmRhciBTZXR0aW5ncyBPYmplY3Q6ICBcdHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgXCJodG1sX2lkXCI6IFwiY2FsZW5kYXJfYm9va2luZzRcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgXCJ0ZXh0X2lkXCI6IFwiZGF0ZV9ib29raW5nNFwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcImNhbGVuZGFyX19zdGFydF93ZWVrX2RheVwiOiAxLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcImNhbGVuZGFyX192aWV3X192aXNpYmxlX21vbnRoc1wiOiAxMixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgXCJyZXNvdXJjZV9pZFwiOiA0LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcImFqeF9ub25jZV9jYWxlbmRhclwiOiBcIjxpbnB1dCB0eXBlPVxcXCJoaWRkZW5cXFwiIC4uLiAvPlwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcImJvb2tlZF9kYXRlc1wiOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiMTItMjgtMjAyMlwiOiBbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiYm9va2luZ19kYXRlXCI6IFwiMjAyMi0xMi0yOCAwMDowMDowMFwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiYXBwcm92ZWRcIjogXCIxXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJib29raW5nX2lkXCI6IFwiMjZcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XSwgLi4uXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3NlYXNvbl9hdmFpbGFiaWxpdHknOntcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjIwMjMtMDEtMDlcIjogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjIwMjMtMDEtMTBcIjogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjIwMjMtMDEtMTFcIjogdHJ1ZSwgLi4uXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgfVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdCAqIEBwYXJhbSBkYXRlcGlja190aGlzXHRcdFx0LSB0aGlzIG9mIGRhdGVwaWNrIE9ialxyXG5cdCAqXHJcblx0ICogQHJldHVybnMgW2Jvb2xlYW4sc3RyaW5nXVx0LSBbIHt0cnVlIC1hdmFpbGFibGUgfCBmYWxzZSAtIHVuYXZhaWxhYmxlfSwgJ0NTUyBjbGFzc2VzIGZvciBjYWxlbmRhciBkYXkgY2VsbCcgXVxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfX2lubGluZV9ib29raW5nX2NhbGVuZGFyX19hcHBseV9jc3NfdG9fZGF5cyggZGF0ZSwgY2FsZW5kYXJfcGFyYW1zX2FyciwgZGF0ZXBpY2tfdGhpcyApe1xyXG5cclxuXHRcdHZhciB0b2RheV9kYXRlID0gbmV3IERhdGUoIF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ3RvZGF5X2FycicgKVsgMCBdLCAocGFyc2VJbnQoIF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ3RvZGF5X2FycicgKVsgMSBdICkgLSAxKSwgX3dwYmMuZ2V0X290aGVyX3BhcmFtKCAndG9kYXlfYXJyJyApWyAyIF0sIDAsIDAsIDAgKTtcclxuXHJcblx0XHR2YXIgY2xhc3NfZGF5ICA9ICggZGF0ZS5nZXRNb250aCgpICsgMSApICsgJy0nICsgZGF0ZS5nZXREYXRlKCkgKyAnLScgKyBkYXRlLmdldEZ1bGxZZWFyKCk7XHRcdFx0XHRcdFx0Ly8gJzEtOS0yMDIzJ1xyXG5cdFx0dmFyIHNxbF9jbGFzc19kYXkgPSB3cGJjX19nZXRfX3NxbF9jbGFzc19kYXRlKCBkYXRlICk7XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyAnMjAyMy0wMS0wOSdcclxuXHJcblx0XHR2YXIgY3NzX2RhdGVfX3N0YW5kYXJkICAgPSAgJ2NhbDRkYXRlLScgKyBjbGFzc19kYXk7XHJcblx0XHR2YXIgY3NzX2RhdGVfX2FkZGl0aW9uYWwgPSAnIHdwYmNfd2Vla2RheV8nICsgZGF0ZS5nZXREYXkoKSArICcgJztcclxuXHJcblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdFx0Ly8gV0VFS0RBWVMgOjogU2V0IHVuYXZhaWxhYmxlIHdlZWsgZGF5cyBmcm9tIC0gU2V0dGluZ3MgR2VuZXJhbCBwYWdlIGluIFwiQXZhaWxhYmlsaXR5XCIgc2VjdGlvblxyXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgX3dwYmMuZ2V0X290aGVyX3BhcmFtKCAnYXZhaWxhYmlsaXR5X193ZWVrX2RheXNfdW5hdmFpbGFibGUnICkubGVuZ3RoOyBpKysgKXtcclxuXHRcdFx0aWYgKCBkYXRlLmdldERheSgpID09IF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ2F2YWlsYWJpbGl0eV9fd2Vla19kYXlzX3VuYXZhaWxhYmxlJyApWyBpIF0gKSB7XHJcblx0XHRcdFx0cmV0dXJuIFsgISFmYWxzZSwgY3NzX2RhdGVfX3N0YW5kYXJkICsgJyBkYXRlX3VzZXJfdW5hdmFpbGFibGUnIFx0KyAnIHdlZWtkYXlzX3VuYXZhaWxhYmxlJyBdO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQkVGT1JFX0FGVEVSIDo6IFNldCB1bmF2YWlsYWJsZSBkYXlzIEJlZm9yZSAvIEFmdGVyIHRoZSBUb2RheSBkYXRlXHJcblx0XHRpZiAoIFx0KCAod3BiY19kYXRlc19fZGF5c19iZXR3ZWVuKCBkYXRlLCB0b2RheV9kYXRlICkpIDwgcGFyc2VJbnQoX3dwYmMuZ2V0X290aGVyX3BhcmFtKCAnYXZhaWxhYmlsaXR5X191bmF2YWlsYWJsZV9mcm9tX3RvZGF5JyApKSApXHJcblx0XHRcdCB8fCAoXHJcblx0XHRcdFx0ICAgKCBwYXJzZUludCggJzAnICsgcGFyc2VJbnQoIF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ2F2YWlsYWJpbGl0eV9fYXZhaWxhYmxlX2Zyb21fdG9kYXknICkgKSApID4gMCApXHJcblx0XHRcdFx0JiYgKCB3cGJjX2RhdGVzX19kYXlzX2JldHdlZW4oIGRhdGUsIHRvZGF5X2RhdGUgKSA+IHBhcnNlSW50KCAnMCcgKyBwYXJzZUludCggX3dwYmMuZ2V0X290aGVyX3BhcmFtKCAnYXZhaWxhYmlsaXR5X19hdmFpbGFibGVfZnJvbV90b2RheScgKSApICkgKVxyXG5cdFx0XHRcdClcclxuXHRcdCl7XHJcblx0XHRcdHJldHVybiBbICEhZmFsc2UsIGNzc19kYXRlX19zdGFuZGFyZCArICcgZGF0ZV91c2VyX3VuYXZhaWxhYmxlJyBcdFx0KyAnIGJlZm9yZV9hZnRlcl91bmF2YWlsYWJsZScgXTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBTRUFTT05TIDo6ICBcdFx0XHRcdFx0Qm9va2luZyA+IFJlc291cmNlcyA+IEF2YWlsYWJpbGl0eSBwYWdlXHJcblx0XHR2YXIgICAgaXNfZGF0ZV9hdmFpbGFibGUgPSBjYWxlbmRhcl9wYXJhbXNfYXJyLnNlYXNvbl9hdmFpbGFiaWxpdHlbIHNxbF9jbGFzc19kYXkgXTtcclxuXHRcdGlmICggZmFsc2UgPT09IGlzX2RhdGVfYXZhaWxhYmxlICl7XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vRml4SW46IDkuNS40LjRcclxuXHRcdFx0cmV0dXJuIFsgISFmYWxzZSwgY3NzX2RhdGVfX3N0YW5kYXJkICsgJyBkYXRlX3VzZXJfdW5hdmFpbGFibGUnXHRcdCsgJyBzZWFzb25fdW5hdmFpbGFibGUnIF07XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gUkVTT1VSQ0VfVU5BVkFJTEFCTEUgOjogICBcdEJvb2tpbmcgPiBBdmFpbGFiaWxpdHkgcGFnZVxyXG5cdFx0aWYgKCB3cGRldl9pbl9hcnJheShjYWxlbmRhcl9wYXJhbXNfYXJyLnJlc291cmNlX3VuYXZhaWxhYmxlX2RhdGVzLCBzcWxfY2xhc3NfZGF5ICkgKXtcclxuXHRcdFx0aXNfZGF0ZV9hdmFpbGFibGUgPSBmYWxzZTtcclxuXHRcdH1cclxuXHRcdGlmICggIGZhbHNlID09PSBpc19kYXRlX2F2YWlsYWJsZSApe1x0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly9GaXhJbjogOS41LjQuNFxyXG5cdFx0XHRyZXR1cm4gWyAhZmFsc2UsIGNzc19kYXRlX19zdGFuZGFyZCArICcgZGF0ZV91c2VyX3VuYXZhaWxhYmxlJ1x0XHQrICcgcmVzb3VyY2VfdW5hdmFpbGFibGUnIF07XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblxyXG5cdFx0Ly8gSXMgYW55IGJvb2tpbmdzIGluIHRoaXMgZGF0ZSA/XHJcblx0XHRpZiAoICd1bmRlZmluZWQnICE9PSB0eXBlb2YoIGNhbGVuZGFyX3BhcmFtc19hcnIuYm9va2VkX2RhdGVzWyBjbGFzc19kYXkgXSApICkge1xyXG5cclxuXHRcdFx0dmFyIGJvb2tpbmdzX2luX2RhdGUgPSBjYWxlbmRhcl9wYXJhbXNfYXJyLmJvb2tlZF9kYXRlc1sgY2xhc3NfZGF5IF07XHJcblxyXG5cclxuXHRcdFx0aWYgKCAndW5kZWZpbmVkJyAhPT0gdHlwZW9mKCBib29raW5nc19pbl9kYXRlWyAnc2VjXzAnIF0gKSApIHtcdFx0XHQvLyBcIkZ1bGwgZGF5XCIgYm9va2luZyAgLT4gKHNlY29uZHMgPT0gMClcclxuXHJcblx0XHRcdFx0Y3NzX2RhdGVfX2FkZGl0aW9uYWwgKz0gKCAnMCcgPT09IGJvb2tpbmdzX2luX2RhdGVbICdzZWNfMCcgXS5hcHByb3ZlZCApID8gJyBkYXRlMmFwcHJvdmUgJyA6ICcgZGF0ZV9hcHByb3ZlZCAnO1x0XHRcdFx0Ly8gUGVuZGluZyA9ICcwJyB8ICBBcHByb3ZlZCA9ICcxJ1xyXG5cdFx0XHRcdGNzc19kYXRlX19hZGRpdGlvbmFsICs9ICcgZnVsbF9kYXlfYm9va2luZyc7XHJcblxyXG5cdFx0XHRcdHJldHVybiBbICFmYWxzZSwgY3NzX2RhdGVfX3N0YW5kYXJkICsgY3NzX2RhdGVfX2FkZGl0aW9uYWwgXTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIE9iamVjdC5rZXlzKCBib29raW5nc19pbl9kYXRlICkubGVuZ3RoID4gMCApe1x0XHRcdFx0Ly8gXCJUaW1lIHNsb3RzXCIgQm9va2luZ3NcclxuXHJcblx0XHRcdFx0dmFyIGlzX2FwcHJvdmVkID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0Xy5lYWNoKCBib29raW5nc19pbl9kYXRlLCBmdW5jdGlvbiAoIHBfdmFsLCBwX2tleSwgcF9kYXRhICkge1xyXG5cdFx0XHRcdFx0aWYgKCAhcGFyc2VJbnQoIHBfdmFsLmFwcHJvdmVkICkgKXtcclxuXHRcdFx0XHRcdFx0aXNfYXBwcm92ZWQgPSBmYWxzZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHZhciB0cyA9IHBfdmFsLmJvb2tpbmdfZGF0ZS5zdWJzdHJpbmcoIHBfdmFsLmJvb2tpbmdfZGF0ZS5sZW5ndGggLSAxICk7XHJcblx0XHRcdFx0XHRpZiAoIHRydWUgPT09IF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ2lzX2VuYWJsZWRfY2hhbmdlX292ZXInICkgKXtcclxuXHRcdFx0XHRcdFx0aWYgKCB0cyA9PSAnMScgKSB7IGNzc19kYXRlX19hZGRpdGlvbmFsICs9ICcgY2hlY2tfaW5fdGltZScgKyAoKHBhcnNlSW50KHBfdmFsLmFwcHJvdmVkKSkgPyAnIGNoZWNrX2luX3RpbWVfZGF0ZV9hcHByb3ZlZCcgOiAnIGNoZWNrX2luX3RpbWVfZGF0ZTJhcHByb3ZlJyk7IH1cclxuXHRcdFx0XHRcdFx0aWYgKCB0cyA9PSAnMicgKSB7IGNzc19kYXRlX19hZGRpdGlvbmFsICs9ICcgY2hlY2tfb3V0X3RpbWUnICsgKChwYXJzZUludChwX3ZhbC5hcHByb3ZlZCkpID8gJyBjaGVja19vdXRfdGltZV9kYXRlX2FwcHJvdmVkJyA6ICcgY2hlY2tfb3V0X3RpbWVfZGF0ZTJhcHByb3ZlJyk7IH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdGlmICggISBpc19hcHByb3ZlZCApe1xyXG5cdFx0XHRcdFx0Y3NzX2RhdGVfX2FkZGl0aW9uYWwgKz0gJyBkYXRlMmFwcHJvdmUgdGltZXNwYXJ0bHknXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGNzc19kYXRlX19hZGRpdGlvbmFsICs9ICcgZGF0ZV9hcHByb3ZlZCB0aW1lc3BhcnRseSdcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggISBfd3BiYy5nZXRfb3RoZXJfcGFyYW0oICdpc19lbmFibGVkX2NoYW5nZV9vdmVyJyApICl7XHJcblx0XHRcdFx0XHRjc3NfZGF0ZV9fYWRkaXRpb25hbCArPSAnIHRpbWVzX2Nsb2NrJ1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHRcdHJldHVybiBbIHRydWUsIGNzc19kYXRlX19zdGFuZGFyZCArIGNzc19kYXRlX19hZGRpdGlvbmFsICsgJyBkYXRlX2F2YWlsYWJsZScgXTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBseSBzb21lIENTUyBjbGFzc2VzLCB3aGVuIHdlIG1vdXNlIG92ZXIgc3BlY2lmaWMgZGF0ZXMgaW4gY2FsZW5kYXJcclxuXHQgKiBAcGFyYW0gdmFsdWVcclxuXHQgKiBAcGFyYW0gZGF0ZVx0XHRcdFx0XHQtICBKYXZhU2NyaXB0IERhdGUgT2JqOiAgXHRcdE1vbiBEZWMgMTEgMjAyMyAwMDowMDowMCBHTVQrMDIwMCAoRWFzdGVybiBFdXJvcGVhbiBTdGFuZGFyZCBUaW1lKVxyXG5cdCAqIEBwYXJhbSBjYWxlbmRhcl9wYXJhbXNfYXJyXHQtICBDYWxlbmRhciBTZXR0aW5ncyBPYmplY3Q6ICBcdHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgXCJodG1sX2lkXCI6IFwiY2FsZW5kYXJfYm9va2luZzRcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgXCJ0ZXh0X2lkXCI6IFwiZGF0ZV9ib29raW5nNFwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcImNhbGVuZGFyX19zdGFydF93ZWVrX2RheVwiOiAxLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcImNhbGVuZGFyX192aWV3X192aXNpYmxlX21vbnRoc1wiOiAxMixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgXCJyZXNvdXJjZV9pZFwiOiA0LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcImFqeF9ub25jZV9jYWxlbmRhclwiOiBcIjxpbnB1dCB0eXBlPVxcXCJoaWRkZW5cXFwiIC4uLiAvPlwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcImJvb2tlZF9kYXRlc1wiOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiMTItMjgtMjAyMlwiOiBbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiYm9va2luZ19kYXRlXCI6IFwiMjAyMi0xMi0yOCAwMDowMDowMFwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiYXBwcm92ZWRcIjogXCIxXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJib29raW5nX2lkXCI6IFwiMjZcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XSwgLi4uXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3NlYXNvbl9hdmFpbGFiaWxpdHknOntcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjIwMjMtMDEtMDlcIjogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjIwMjMtMDEtMTBcIjogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjIwMjMtMDEtMTFcIjogdHJ1ZSwgLi4uXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgfVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdCAqIEBwYXJhbSBkYXRlcGlja190aGlzXHRcdFx0LSB0aGlzIG9mIGRhdGVwaWNrIE9ialxyXG5cdCAqXHJcblx0ICogQHJldHVybnMge2Jvb2xlYW59XHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19faW5saW5lX2Jvb2tpbmdfY2FsZW5kYXJfX29uX2RheXNfaG92ZXIoIHZhbHVlLCBkYXRlLCBjYWxlbmRhcl9wYXJhbXNfYXJyLCBkYXRlcGlja190aGlzICl7XHJcblxyXG5cdFx0aWYgKCBudWxsID09PSBkYXRlICl7XHJcblx0XHRcdGpRdWVyeSggJy5kYXRlcGljay1kYXlzLWNlbGwtb3ZlcicgKS5yZW1vdmVDbGFzcyggJ2RhdGVwaWNrLWRheXMtY2VsbC1vdmVyJyApOyAgIFx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgYWxsIGhpZ2hsaWdodCBkYXlzIHNlbGVjdGlvbnNcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBpbnN0ID0galF1ZXJ5LmRhdGVwaWNrLl9nZXRJbnN0KCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ2NhbGVuZGFyX2Jvb2tpbmcnICsgY2FsZW5kYXJfcGFyYW1zX2Fyci5yZXNvdXJjZV9pZCApICk7XHJcblxyXG5cdFx0aWYgKFxyXG5cdFx0XHQgICAoIDEgPT0gaW5zdC5kYXRlcy5sZW5ndGgpXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBvbmUgc2VsZWN0ZWQgZGF0ZVxyXG5cdFx0XHQmJiAoJ2R5bmFtaWMnID09PSBjYWxlbmRhcl9wYXJhbXNfYXJyLmNhbGVuZGFyX19kYXlzX3NlbGVjdGlvbl9tb2RlKSBcdFx0XHRcdFx0Ly8gd2hpbGUgaGF2ZSByYW5nZSBkYXlzIHNlbGVjdGlvbiBtb2RlXHJcblx0XHQpe1xyXG5cclxuXHRcdFx0dmFyIHRkX2NsYXNzO1xyXG5cdFx0XHR2YXIgdGRfb3ZlcnMgPSBbXTtcclxuXHRcdFx0dmFyIGlzX2NoZWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgdmFyIHNlbGNldGVkX2ZpcnN0X2RheSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgIHNlbGNldGVkX2ZpcnN0X2RheS5zZXRGdWxsWWVhcihpbnN0LmRhdGVzWzBdLmdldEZ1bGxZZWFyKCksKGluc3QuZGF0ZXNbMF0uZ2V0TW9udGgoKSksIChpbnN0LmRhdGVzWzBdLmdldERhdGUoKSApICk7IC8vR2V0IGZpcnN0IERhdGVcclxuXHJcbiAgICAgICAgICAgIHdoaWxlKCAgaXNfY2hlY2sgKXtcclxuXHJcblx0XHRcdFx0dGRfY2xhc3MgPSAoc2VsY2V0ZWRfZmlyc3RfZGF5LmdldE1vbnRoKCkgKyAxKSArICctJyArIHNlbGNldGVkX2ZpcnN0X2RheS5nZXREYXRlKCkgKyAnLScgKyBzZWxjZXRlZF9maXJzdF9kYXkuZ2V0RnVsbFllYXIoKTtcclxuXHJcblx0XHRcdFx0dGRfb3ZlcnNbIHRkX292ZXJzLmxlbmd0aCBdID0gJyNjYWxlbmRhcl9ib29raW5nJyArIGNhbGVuZGFyX3BhcmFtc19hcnIucmVzb3VyY2VfaWQgKyAnIC5jYWw0ZGF0ZS0nICsgdGRfY2xhc3M7ICAgICAgICAgICAgICAvLyBhZGQgdG8gYXJyYXkgZm9yIGxhdGVyIG1ha2Ugc2VsZWN0aW9uIGJ5IGNsYXNzXHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG5cdFx0XHRcdFx0KCAgKCBkYXRlLmdldE1vbnRoKCkgPT0gc2VsY2V0ZWRfZmlyc3RfZGF5LmdldE1vbnRoKCkgKSAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAoIGRhdGUuZ2V0RGF0ZSgpID09IHNlbGNldGVkX2ZpcnN0X2RheS5nZXREYXRlKCkgKSAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAoIGRhdGUuZ2V0RnVsbFllYXIoKSA9PSBzZWxjZXRlZF9maXJzdF9kYXkuZ2V0RnVsbFllYXIoKSApXHJcblx0XHRcdFx0XHQpIHx8ICggc2VsY2V0ZWRfZmlyc3RfZGF5ID4gZGF0ZSApXHJcblx0XHRcdFx0KXtcclxuXHRcdFx0XHRcdGlzX2NoZWNrID0gIGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0c2VsY2V0ZWRfZmlyc3RfZGF5LnNldEZ1bGxZZWFyKCBzZWxjZXRlZF9maXJzdF9kYXkuZ2V0RnVsbFllYXIoKSwgKHNlbGNldGVkX2ZpcnN0X2RheS5nZXRNb250aCgpKSwgKHNlbGNldGVkX2ZpcnN0X2RheS5nZXREYXRlKCkgKyAxKSApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBIaWdobGlnaHQgRGF5c1xyXG5cdFx0XHRmb3IgKCB2YXIgaT0wOyBpIDwgdGRfb3ZlcnMubGVuZ3RoIDsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBjbGFzcyB0byBhbGwgZWxlbWVudHNcclxuXHRcdFx0XHRqUXVlcnkoIHRkX292ZXJzW2ldICkuYWRkQ2xhc3MoJ2RhdGVwaWNrLWRheXMtY2VsbC1vdmVyJyk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHQgICAgcmV0dXJuIHRydWU7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogT24gREFZcyBzZWxlY3Rpb24gaW4gY2FsZW5kYXJcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBkYXRlc19zZWxlY3Rpb25cdFx0LSAgc3RyaW5nOlx0XHRcdCAnMjAyMy0wMy0wNyB+IDIwMjMtMDMtMDcnIG9yICcyMDIzLTA0LTEwLCAyMDIzLTA0LTEyLCAyMDIzLTA0LTAyLCAyMDIzLTA0LTA0J1xyXG5cdCAqIEBwYXJhbSBjYWxlbmRhcl9wYXJhbXNfYXJyXHQtICBDYWxlbmRhciBTZXR0aW5ncyBPYmplY3Q6ICBcdHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgXCJodG1sX2lkXCI6IFwiY2FsZW5kYXJfYm9va2luZzRcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgXCJ0ZXh0X2lkXCI6IFwiZGF0ZV9ib29raW5nNFwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcImNhbGVuZGFyX19zdGFydF93ZWVrX2RheVwiOiAxLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcImNhbGVuZGFyX192aWV3X192aXNpYmxlX21vbnRoc1wiOiAxMixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgXCJyZXNvdXJjZV9pZFwiOiA0LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcImFqeF9ub25jZV9jYWxlbmRhclwiOiBcIjxpbnB1dCB0eXBlPVxcXCJoaWRkZW5cXFwiIC4uLiAvPlwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcImJvb2tlZF9kYXRlc1wiOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiMTItMjgtMjAyMlwiOiBbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiYm9va2luZ19kYXRlXCI6IFwiMjAyMi0xMi0yOCAwMDowMDowMFwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiYXBwcm92ZWRcIjogXCIxXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJib29raW5nX2lkXCI6IFwiMjZcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XSwgLi4uXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3NlYXNvbl9hdmFpbGFiaWxpdHknOntcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjIwMjMtMDEtMDlcIjogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjIwMjMtMDEtMTBcIjogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjIwMjMtMDEtMTFcIjogdHJ1ZSwgLi4uXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgfVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdCAqIEBwYXJhbSBkYXRlcGlja190aGlzXHRcdFx0LSB0aGlzIG9mIGRhdGVwaWNrIE9ialxyXG5cdCAqXHJcblx0ICogQHJldHVybnMgYm9vbGVhblxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfX2lubGluZV9ib29raW5nX2NhbGVuZGFyX19vbl9kYXlzX3NlbGVjdCggZGF0ZXNfc2VsZWN0aW9uLCBjYWxlbmRhcl9wYXJhbXNfYXJyLCBkYXRlcGlja190aGlzID0gbnVsbCApe1xyXG5cclxuXHRcdHZhciBpbnN0ID0galF1ZXJ5LmRhdGVwaWNrLl9nZXRJbnN0KCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ2NhbGVuZGFyX2Jvb2tpbmcnICsgY2FsZW5kYXJfcGFyYW1zX2Fyci5yZXNvdXJjZV9pZCApICk7XHJcblxyXG5cdFx0dmFyIGRhdGVzX2FyciA9IFtdO1x0Ly8gIFsgXCIyMDIzLTA0LTA5XCIsIFwiMjAyMy0wNC0xMFwiLCBcIjIwMjMtMDQtMTFcIiBdXHJcblxyXG5cdFx0aWYgKCAtMSAhPT0gZGF0ZXNfc2VsZWN0aW9uLmluZGV4T2YoICd+JyApICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSYW5nZSBEYXlzXHJcblxyXG5cdFx0XHRkYXRlc19hcnIgPSB3cGJjX2dldF9kYXRlc19hcnJfX2Zyb21fZGF0ZXNfcmFuZ2VfanMoIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdkYXRlc19zZXBhcmF0b3InIDogJyB+ICcsICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAnIH4gJ1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2RhdGVzJyAgICAgICAgICAgOiBkYXRlc19zZWxlY3Rpb24sICAgIFx0XHQgICAvLyAnMjAyMy0wNC0wNCB+IDIwMjMtMDQtMDcnXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSApO1xyXG5cclxuXHRcdH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNdWx0aXBsZSBEYXlzXHJcblx0XHRcdGRhdGVzX2FyciA9IHdwYmNfZ2V0X2RhdGVzX2Fycl9fZnJvbV9kYXRlc19jb21tYV9zZXBhcmF0ZWRfanMoIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdkYXRlc19zZXBhcmF0b3InIDogJywgJywgICAgICAgICAgICAgICAgICAgICAgICAgXHQvLyAgJywgJ1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2RhdGVzJyAgICAgICAgICAgOiBkYXRlc19zZWxlY3Rpb24sICAgIFx0XHRcdC8vICcyMDIzLTA0LTEwLCAyMDIzLTA0LTEyLCAyMDIzLTA0LTAyLCAyMDIzLTA0LTA0J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gKTtcclxuXHRcdH1cclxuXHJcblx0XHR3cGJjX2F2eV9hZnRlcl9kYXlzX3NlbGVjdGlvbl9fc2hvd19oZWxwX2luZm8oe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2NhbGVuZGFyX19kYXlzX3NlbGVjdGlvbl9tb2RlJzogY2FsZW5kYXJfcGFyYW1zX2Fyci5jYWxlbmRhcl9fZGF5c19zZWxlY3Rpb25fbW9kZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdkYXRlc19hcnInICAgICAgICAgICAgICAgICAgICA6IGRhdGVzX2FycixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdkYXRlc19jbGlja19udW0nICAgICAgICAgICAgICA6IGluc3QuZGF0ZXMubGVuZ3RoLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3BvcG92ZXJfaGludHMnXHRcdFx0XHRcdDogY2FsZW5kYXJfcGFyYW1zX2Fyci5wb3BvdmVyX2hpbnRzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSApO1xyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2hvdyBoZWxwIGluZm8gYXQgdGhlIHRvcCAgdG9vbGJhciBhYm91dCBzZWxlY3RlZCBkYXRlcyBhbmQgZnV0dXJlIGFjdGlvbnNcclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0gcGFyYW1zXHJcblx0XHQgKiBcdFx0XHRcdFx0RXhhbXBsZSAxOiAge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FsZW5kYXJfX2RheXNfc2VsZWN0aW9uX21vZGU6IFwiZHluYW1pY1wiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0ZXNfYXJyOiAgWyBcIjIwMjMtMDQtMDNcIiBdLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0ZXNfY2xpY2tfbnVtOiAxXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQncG9wb3Zlcl9oaW50cydcdFx0XHRcdFx0OiBjYWxlbmRhcl9wYXJhbXNfYXJyLnBvcG92ZXJfaGludHNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHQgKiBcdFx0XHRcdFx0RXhhbXBsZSAyOiAge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FsZW5kYXJfX2RheXNfc2VsZWN0aW9uX21vZGU6IFwiZHluYW1pY1wiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRlc19hcnI6IEFycmF5KDEwKSBbIFwiMjAyMy0wNC0wM1wiLCBcIjIwMjMtMDQtMDRcIiwgXCIyMDIzLTA0LTA1XCIsIOKApiBdXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRlc19jbGlja19udW06IDJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdwb3BvdmVyX2hpbnRzJ1x0XHRcdFx0XHQ6IGNhbGVuZGFyX3BhcmFtc19hcnIucG9wb3Zlcl9oaW50c1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdCAqL1xyXG5cdFx0ZnVuY3Rpb24gd3BiY19hdnlfYWZ0ZXJfZGF5c19zZWxlY3Rpb25fX3Nob3dfaGVscF9pbmZvKCBwYXJhbXMgKXtcclxuLy8gY29uc29sZS5sb2coIHBhcmFtcyApO1x0Ly9cdFx0WyBcIjIwMjMtMDQtMDlcIiwgXCIyMDIzLTA0LTEwXCIsIFwiMjAyMy0wNC0xMVwiIF1cclxuXHJcblx0XHRcdHZhciBtZXNzYWdlLCBjb2xvcjtcclxuXHRcdFx0aWYgKGpRdWVyeSggJyN1aV9idG5fYXZ5X19zZXRfZGF5c19hdmFpbGFiaWxpdHlfX2F2YWlsYWJsZScpLmlzKCc6Y2hlY2tlZCcpKXtcclxuXHRcdFx0XHQgbWVzc2FnZSA9IHBhcmFtcy5wb3BvdmVyX2hpbnRzLnRvb2xiYXJfdGV4dF9hdmFpbGFibGU7Ly8nU2V0IGRhdGVzIF9EQVRFU18gYXMgX0hUTUxfIGF2YWlsYWJsZS4nO1xyXG5cdFx0XHRcdCBjb2xvciA9ICcjMTFiZTRjJztcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRtZXNzYWdlID0gcGFyYW1zLnBvcG92ZXJfaGludHMudG9vbGJhcl90ZXh0X3VuYXZhaWxhYmxlOy8vJ1NldCBkYXRlcyBfREFURVNfIGFzIF9IVE1MXyB1bmF2YWlsYWJsZS4nO1xyXG5cdFx0XHRcdGNvbG9yID0gJyNlNDM5MzknO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRtZXNzYWdlID0gJzxzcGFuPicgKyBtZXNzYWdlICsgJzwvc3Bhbj4nO1xyXG5cclxuXHRcdFx0dmFyIGZpcnN0X2RhdGUgPSBwYXJhbXNbICdkYXRlc19hcnInIF1bIDAgXTtcclxuXHRcdFx0dmFyIGxhc3RfZGF0ZSAgPSAoICdkeW5hbWljJyA9PSBwYXJhbXMuY2FsZW5kYXJfX2RheXNfc2VsZWN0aW9uX21vZGUgKVxyXG5cdFx0XHRcdFx0XHRcdD8gcGFyYW1zWyAnZGF0ZXNfYXJyJyBdWyAocGFyYW1zWyAnZGF0ZXNfYXJyJyBdLmxlbmd0aCAtIDEpIF1cclxuXHRcdFx0XHRcdFx0XHQ6ICggcGFyYW1zWyAnZGF0ZXNfYXJyJyBdLmxlbmd0aCA+IDEgKSA/IHBhcmFtc1sgJ2RhdGVzX2FycicgXVsgMSBdIDogJyc7XHJcblxyXG5cdFx0XHRmaXJzdF9kYXRlID0galF1ZXJ5LmRhdGVwaWNrLmZvcm1hdERhdGUoICdkZCBNLCB5eScsIG5ldyBEYXRlKCBmaXJzdF9kYXRlICsgJ1QwMDowMDowMCcgKSApO1xyXG5cdFx0XHRsYXN0X2RhdGUgPSBqUXVlcnkuZGF0ZXBpY2suZm9ybWF0RGF0ZSggJ2RkIE0sIHl5JywgIG5ldyBEYXRlKCBsYXN0X2RhdGUgKyAnVDAwOjAwOjAwJyApICk7XHJcblxyXG5cclxuXHRcdFx0aWYgKCAnZHluYW1pYycgPT0gcGFyYW1zLmNhbGVuZGFyX19kYXlzX3NlbGVjdGlvbl9tb2RlICl7XHJcblx0XHRcdFx0aWYgKCAxID09IHBhcmFtcy5kYXRlc19jbGlja19udW0gKXtcclxuXHRcdFx0XHRcdGxhc3RfZGF0ZSA9ICdfX19fX19fX19fXydcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0aWYgKCAnZmlyc3RfdGltZScgPT0galF1ZXJ5KCAnLndwYmNfYWp4X2F2YWlsYWJpbGl0eV9jb250YWluZXInICkuYXR0ciggJ3dwYmNfbG9hZGVkJyApICl7XHJcblx0XHRcdFx0XHRcdGpRdWVyeSggJy53cGJjX2FqeF9hdmFpbGFiaWxpdHlfY29udGFpbmVyJyApLmF0dHIoICd3cGJjX2xvYWRlZCcsICdkb25lJyApXHJcblx0XHRcdFx0XHRcdHdwYmNfYmxpbmtfZWxlbWVudCggJy53cGJjX3dpZGdldF9hdmFpbGFibGVfdW5hdmFpbGFibGUnLCAzLCAyMjAgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0bWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSggJ19EQVRFU18nLCAgICAnPC9zcGFuPidcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vKyAnPGRpdj4nICsgJ2Zyb20nICsgJzwvZGl2PidcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCsgJzxzcGFuIGNsYXNzPVwid3BiY19iaWdfZGF0ZVwiPicgKyBmaXJzdF9kYXRlICsgJzwvc3Bhbj4nXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQrICc8c3Bhbj4nICsgJy0nICsgJzwvc3Bhbj4nXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQrICc8c3BhbiBjbGFzcz1cIndwYmNfYmlnX2RhdGVcIj4nICsgbGFzdF9kYXRlICsgJzwvc3Bhbj4nXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQrICc8c3Bhbj4nICk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gaWYgKCBwYXJhbXNbICdkYXRlc19hcnInIF0ubGVuZ3RoID4gMSApe1xyXG5cdFx0XHRcdC8vIFx0bGFzdF9kYXRlID0gJywgJyArIGxhc3RfZGF0ZTtcclxuXHRcdFx0XHQvLyBcdGxhc3RfZGF0ZSArPSAoIHBhcmFtc1sgJ2RhdGVzX2FycicgXS5sZW5ndGggPiAyICkgPyAnLCAuLi4nIDogJyc7XHJcblx0XHRcdFx0Ly8gfSBlbHNlIHtcclxuXHRcdFx0XHQvLyBcdGxhc3RfZGF0ZT0nJztcclxuXHRcdFx0XHQvLyB9XHJcblx0XHRcdFx0dmFyIGRhdGVzX2FyciA9IFtdO1xyXG5cdFx0XHRcdGZvciggdmFyIGkgPSAwOyBpIDwgcGFyYW1zWyAnZGF0ZXNfYXJyJyBdLmxlbmd0aDsgaSsrICl7XHJcblx0XHRcdFx0XHRkYXRlc19hcnIucHVzaCggIGpRdWVyeS5kYXRlcGljay5mb3JtYXREYXRlKCAnZGQgTSB5eScsICBuZXcgRGF0ZSggcGFyYW1zWyAnZGF0ZXNfYXJyJyBdWyBpIF0gKyAnVDAwOjAwOjAwJyApICkgICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGZpcnN0X2RhdGUgPSBkYXRlc19hcnIuam9pbiggJywgJyApO1xyXG5cdFx0XHRcdG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoICdfREFURVNfJywgICAgJzwvc3Bhbj4nXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQrICc8c3BhbiBjbGFzcz1cIndwYmNfYmlnX2RhdGVcIj4nICsgZmlyc3RfZGF0ZSArICc8L3NwYW4+J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KyAnPHNwYW4+JyApO1xyXG5cdFx0XHR9XHJcblx0XHRcdG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoICdfSFRNTF8nICwgJzwvc3Bhbj48c3BhbiBjbGFzcz1cIndwYmNfYmlnX3RleHRcIiBzdHlsZT1cImNvbG9yOicrY29sb3IrJztcIj4nKSArICc8c3Bhbj4nO1xyXG5cclxuXHRcdFx0Ly9tZXNzYWdlICs9ICcgPGRpdiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAxZW07XCI+JyArICcgQ2xpY2sgb24gQXBwbHkgYnV0dG9uIHRvIGFwcGx5IGF2YWlsYWJpbGl0eS4nICsgJzwvZGl2Pic7XHJcblxyXG5cdFx0XHRtZXNzYWdlID0gJzxkaXYgY2xhc3M9XCJ3cGJjX3Rvb2xiYXJfZGF0ZXNfaGludHNcIj4nICsgbWVzc2FnZSArICc8L2Rpdj4nO1xyXG5cclxuXHRcdFx0alF1ZXJ5KCAnLndwYmNfaGVscF90ZXh0JyApLmh0bWwoXHRtZXNzYWdlICk7XHJcblx0XHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqICAgUGFyc2UgZGF0ZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEdldCBkYXRlcyBhcnJheSwgIGZyb20gY29tbWEgc2VwYXJhdGVkIGRhdGVzXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHBhcmFtcyAgICAgICA9IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCogJ2RhdGVzX3NlcGFyYXRvcicgPT4gJywgJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGF0ZXMgc2VwYXJhdG9yXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQqICdkYXRlcycgICAgICAgICAgID0+ICcyMDIzLTA0LTA0LCAyMDIzLTA0LTA3LCAyMDIzLTA0LTA1JyAgICAgICAgIC8vIERhdGVzIGluICdZLW0tZCcgZm9ybWF0OiAnMjAyMy0wMS0zMSdcclxuXHRcdFx0XHRcdFx0XHRcdCB9XHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybiBhcnJheSAgICAgID0gW1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KiBbMF0gPT4gMjAyMy0wNC0wNFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KiBbMV0gPT4gMjAyMy0wNC0wNVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KiBbMl0gPT4gMjAyMy0wNC0wNlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KiBbM10gPT4gMjAyMy0wNC0wN1xyXG5cdFx0XHRcdFx0XHRcdFx0XVxyXG5cdFx0ICpcclxuXHRcdCAqIEV4YW1wbGUgIzE6ICB3cGJjX2dldF9kYXRlc19hcnJfX2Zyb21fZGF0ZXNfY29tbWFfc2VwYXJhdGVkX2pzKCAgeyAgJ2RhdGVzX3NlcGFyYXRvcicgOiAnLCAnLCAnZGF0ZXMnIDogJzIwMjMtMDQtMDQsIDIwMjMtMDQtMDcsIDIwMjMtMDQtMDUnICB9ICApO1xyXG5cdFx0ICovXHJcblx0XHRmdW5jdGlvbiB3cGJjX2dldF9kYXRlc19hcnJfX2Zyb21fZGF0ZXNfY29tbWFfc2VwYXJhdGVkX2pzKCBwYXJhbXMgKXtcclxuXHJcblx0XHRcdHZhciBkYXRlc19hcnIgPSBbXTtcclxuXHJcblx0XHRcdGlmICggJycgIT09IHBhcmFtc1sgJ2RhdGVzJyBdICl7XHJcblxyXG5cdFx0XHRcdGRhdGVzX2FyciA9IHBhcmFtc1sgJ2RhdGVzJyBdLnNwbGl0KCBwYXJhbXNbICdkYXRlc19zZXBhcmF0b3InIF0gKTtcclxuXHJcblx0XHRcdFx0ZGF0ZXNfYXJyLnNvcnQoKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gZGF0ZXNfYXJyO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogR2V0IGRhdGVzIGFycmF5LCAgZnJvbSByYW5nZSBkYXlzIHNlbGVjdGlvblxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSBwYXJhbXMgICAgICAgPSAge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KiAnZGF0ZXNfc2VwYXJhdG9yJyA9PiAnIH4gJywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGF0ZXMgc2VwYXJhdG9yXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQqICdkYXRlcycgICAgICAgICAgID0+ICcyMDIzLTA0LTA0IH4gMjAyMy0wNC0wNycgICAgICAvLyBEYXRlcyBpbiAnWS1tLWQnIGZvcm1hdDogJzIwMjMtMDEtMzEnXHJcblx0XHRcdFx0XHRcdFx0XHQgIH1cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIGFycmF5ICAgICAgICA9IFtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCogWzBdID0+IDIwMjMtMDQtMDRcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCogWzFdID0+IDIwMjMtMDQtMDVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCogWzJdID0+IDIwMjMtMDQtMDZcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCogWzNdID0+IDIwMjMtMDQtMDdcclxuXHRcdFx0XHRcdFx0XHRcdCAgXVxyXG5cdFx0ICpcclxuXHRcdCAqIEV4YW1wbGUgIzE6ICB3cGJjX2dldF9kYXRlc19hcnJfX2Zyb21fZGF0ZXNfcmFuZ2VfanMoICB7ICAnZGF0ZXNfc2VwYXJhdG9yJyA6ICcgfiAnLCAnZGF0ZXMnIDogJzIwMjMtMDQtMDQgfiAyMDIzLTA0LTA3JyAgfSAgKTtcclxuXHRcdCAqIEV4YW1wbGUgIzI6ICB3cGJjX2dldF9kYXRlc19hcnJfX2Zyb21fZGF0ZXNfcmFuZ2VfanMoICB7ICAnZGF0ZXNfc2VwYXJhdG9yJyA6ICcgLSAnLCAnZGF0ZXMnIDogJzIwMjMtMDQtMDQgLSAyMDIzLTA0LTA3JyAgfSAgKTtcclxuXHRcdCAqL1xyXG5cdFx0ZnVuY3Rpb24gd3BiY19nZXRfZGF0ZXNfYXJyX19mcm9tX2RhdGVzX3JhbmdlX2pzKCBwYXJhbXMgKXtcclxuXHJcblx0XHRcdHZhciBkYXRlc19hcnIgPSBbXTtcclxuXHJcblx0XHRcdGlmICggJycgIT09IHBhcmFtc1snZGF0ZXMnXSApIHtcclxuXHJcblx0XHRcdFx0ZGF0ZXNfYXJyID0gcGFyYW1zWyAnZGF0ZXMnIF0uc3BsaXQoIHBhcmFtc1sgJ2RhdGVzX3NlcGFyYXRvcicgXSApO1xyXG5cdFx0XHRcdHZhciBjaGVja19pbl9kYXRlX3ltZCAgPSBkYXRlc19hcnJbMF07XHJcblx0XHRcdFx0dmFyIGNoZWNrX291dF9kYXRlX3ltZCA9IGRhdGVzX2FyclsxXTtcclxuXHJcblx0XHRcdFx0aWYgKCAoJycgIT09IGNoZWNrX2luX2RhdGVfeW1kKSAmJiAoJycgIT09IGNoZWNrX291dF9kYXRlX3ltZCkgKXtcclxuXHJcblx0XHRcdFx0XHRkYXRlc19hcnIgPSB3cGJjX2dldF9kYXRlc19hcnJheV9mcm9tX3N0YXJ0X2VuZF9kYXlzX2pzKCBjaGVja19pbl9kYXRlX3ltZCwgY2hlY2tfb3V0X2RhdGVfeW1kICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBkYXRlc19hcnI7XHJcblx0XHR9XHJcblxyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogR2V0IGRhdGVzIGFycmF5IGJhc2VkIG9uIHN0YXJ0IGFuZCBlbmQgZGF0ZXMuXHJcblx0XHRcdCAqXHJcblx0XHRcdCAqIEBwYXJhbSBzdHJpbmcgc1N0YXJ0RGF0ZSAtIHN0YXJ0IGRhdGU6IDIwMjMtMDQtMDlcclxuXHRcdFx0ICogQHBhcmFtIHN0cmluZyBzRW5kRGF0ZSAgIC0gZW5kIGRhdGU6ICAgMjAyMy0wNC0xMVxyXG5cdFx0XHQgKiBAcmV0dXJuIGFycmF5ICAgICAgICAgICAgIC0gWyBcIjIwMjMtMDQtMDlcIiwgXCIyMDIzLTA0LTEwXCIsIFwiMjAyMy0wNC0xMVwiIF1cclxuXHRcdFx0ICovXHJcblx0XHRcdGZ1bmN0aW9uIHdwYmNfZ2V0X2RhdGVzX2FycmF5X2Zyb21fc3RhcnRfZW5kX2RheXNfanMoIHNTdGFydERhdGUsIHNFbmREYXRlICl7XHJcblxyXG5cdFx0XHRcdHNTdGFydERhdGUgPSBuZXcgRGF0ZSggc1N0YXJ0RGF0ZSArICdUMDA6MDA6MDAnICk7XHJcblx0XHRcdFx0c0VuZERhdGUgPSBuZXcgRGF0ZSggc0VuZERhdGUgKyAnVDAwOjAwOjAwJyApO1xyXG5cclxuXHRcdFx0XHR2YXIgYURheXM9W107XHJcblxyXG5cdFx0XHRcdC8vIFN0YXJ0IHRoZSB2YXJpYWJsZSBvZmYgd2l0aCB0aGUgc3RhcnQgZGF0ZVxyXG5cdFx0XHRcdGFEYXlzLnB1c2goIHNTdGFydERhdGUuZ2V0VGltZSgpICk7XHJcblxyXG5cdFx0XHRcdC8vIFNldCBhICd0ZW1wJyB2YXJpYWJsZSwgc0N1cnJlbnREYXRlLCB3aXRoIHRoZSBzdGFydCBkYXRlIC0gYmVmb3JlIGJlZ2lubmluZyB0aGUgbG9vcFxyXG5cdFx0XHRcdHZhciBzQ3VycmVudERhdGUgPSBuZXcgRGF0ZSggc1N0YXJ0RGF0ZS5nZXRUaW1lKCkgKTtcclxuXHRcdFx0XHR2YXIgb25lX2RheV9kdXJhdGlvbiA9IDI0KjYwKjYwKjEwMDA7XHJcblxyXG5cdFx0XHRcdC8vIFdoaWxlIHRoZSBjdXJyZW50IGRhdGUgaXMgbGVzcyB0aGFuIHRoZSBlbmQgZGF0ZVxyXG5cdFx0XHRcdHdoaWxlKHNDdXJyZW50RGF0ZSA8IHNFbmREYXRlKXtcclxuXHRcdFx0XHRcdC8vIEFkZCBhIGRheSB0byB0aGUgY3VycmVudCBkYXRlIFwiKzEgZGF5XCJcclxuXHRcdFx0XHRcdHNDdXJyZW50RGF0ZS5zZXRUaW1lKCBzQ3VycmVudERhdGUuZ2V0VGltZSgpICsgb25lX2RheV9kdXJhdGlvbiApO1xyXG5cclxuXHRcdFx0XHRcdC8vIEFkZCB0aGlzIG5ldyBkYXkgdG8gdGhlIGFEYXlzIGFycmF5XHJcblx0XHRcdFx0XHRhRGF5cy5wdXNoKCBzQ3VycmVudERhdGUuZ2V0VGltZSgpICk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFEYXlzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRhRGF5c1sgaSBdID0gbmV3IERhdGUoIGFEYXlzW2ldICk7XHJcblx0XHRcdFx0XHRhRGF5c1sgaSBdID0gYURheXNbIGkgXS5nZXRGdWxsWWVhcigpXHJcblx0XHRcdFx0XHRcdFx0XHQrICctJyArICgoIChhRGF5c1sgaSBdLmdldE1vbnRoKCkgKyAxKSA8IDEwKSA/ICcwJyA6ICcnKSArIChhRGF5c1sgaSBdLmdldE1vbnRoKCkgKyAxKVxyXG5cdFx0XHRcdFx0XHRcdFx0KyAnLScgKyAoKCAgICAgICAgYURheXNbIGkgXS5nZXREYXRlKCkgPCAxMCkgPyAnMCcgOiAnJykgKyAgYURheXNbIGkgXS5nZXREYXRlKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIE9uY2UgdGhlIGxvb3AgaGFzIGZpbmlzaGVkLCByZXR1cm4gdGhlIGFycmF5IG9mIGRheXMuXHJcblx0XHRcdFx0cmV0dXJuIGFEYXlzO1xyXG5cdFx0XHR9XHJcblxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogICBUb29sdGlwcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmUgc2hvd2luZyB0b29sdGlwLCAgd2hlbiAgbW91c2Ugb3ZlciBvbiAgU0VMRUNUQUJMRSAoYXZhaWxhYmxlLCBwZW5kaW5nLCBhcHByb3ZlZCwgcmVzb3VyY2UgdW5hdmFpbGFibGUpLCAgZGF5c1xyXG5cdCAqIENhbiBiZSBjYWxsZWQgZGlyZWN0bHkgIGZyb20gIGRhdGVwaWNrIGluaXQgZnVuY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gdmFsdWVcclxuXHQgKiBAcGFyYW0gZGF0ZVxyXG5cdCAqIEBwYXJhbSBjYWxlbmRhcl9wYXJhbXNfYXJyXHJcblx0ICogQHBhcmFtIGRhdGVwaWNrX3RoaXNcclxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2F2eV9fcHJlcGFyZV90b29sdGlwX19pbl9jYWxlbmRhciggdmFsdWUsIGRhdGUsIGNhbGVuZGFyX3BhcmFtc19hcnIsIGRhdGVwaWNrX3RoaXMgKXtcclxuXHJcblx0XHRpZiAoIG51bGwgPT0gZGF0ZSApeyAgcmV0dXJuIGZhbHNlOyAgfVxyXG5cclxuXHRcdHZhciB0ZF9jbGFzcyA9ICggZGF0ZS5nZXRNb250aCgpICsgMSApICsgJy0nICsgZGF0ZS5nZXREYXRlKCkgKyAnLScgKyBkYXRlLmdldEZ1bGxZZWFyKCk7XHJcblxyXG5cdFx0dmFyIGpDZWxsID0galF1ZXJ5KCAnI2NhbGVuZGFyX2Jvb2tpbmcnICsgY2FsZW5kYXJfcGFyYW1zX2Fyci5yZXNvdXJjZV9pZCArICcgdGQuY2FsNGRhdGUtJyArIHRkX2NsYXNzICk7XHJcblxyXG5cdFx0d3BiY19hdnlfX3Nob3dfdG9vbHRpcF9fZm9yX2VsZW1lbnQoIGpDZWxsLCBjYWxlbmRhcl9wYXJhbXNfYXJyWyAncG9wb3Zlcl9oaW50cycgXSApO1xyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lIHRvb2x0aXAgIGZvciBzaG93aW5nIG9uIFVOQVZBSUxBQkxFIGRheXMgKHNlYXNvbiwgd2Vla2RheSwgdG9kYXlfZGVwZW5kcyB1bmF2YWlsYWJsZSlcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBqQ2VsbFx0XHRcdFx0XHRqUXVlcnkgb2Ygc3BlY2lmaWMgZGF5IGNlbGxcclxuXHQgKiBAcGFyYW0gcG9wb3Zlcl9oaW50c1x0XHQgICAgQXJyYXkgd2l0aCB0b29sdGlwIGhpbnQgdGV4dHNcdCA6IHsnc2Vhc29uX3VuYXZhaWxhYmxlJzonLi4uJywnd2Vla2RheXNfdW5hdmFpbGFibGUnOicuLi4nLCdiZWZvcmVfYWZ0ZXJfdW5hdmFpbGFibGUnOicuLi4nLH1cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2F2eV9fc2hvd190b29sdGlwX19mb3JfZWxlbWVudCggakNlbGwsIHBvcG92ZXJfaGludHMgKXtcclxuXHJcblx0XHR2YXIgdG9vbHRpcF90aW1lID0gJyc7XHJcblxyXG5cdFx0aWYgKCBqQ2VsbC5oYXNDbGFzcyggJ3NlYXNvbl91bmF2YWlsYWJsZScgKSApe1xyXG5cdFx0XHR0b29sdGlwX3RpbWUgPSBwb3BvdmVyX2hpbnRzWyAnc2Vhc29uX3VuYXZhaWxhYmxlJyBdO1xyXG5cdFx0fSBlbHNlIGlmICggakNlbGwuaGFzQ2xhc3MoICd3ZWVrZGF5c191bmF2YWlsYWJsZScgKSApe1xyXG5cdFx0XHR0b29sdGlwX3RpbWUgPSBwb3BvdmVyX2hpbnRzWyAnd2Vla2RheXNfdW5hdmFpbGFibGUnIF07XHJcblx0XHR9IGVsc2UgaWYgKCBqQ2VsbC5oYXNDbGFzcyggJ2JlZm9yZV9hZnRlcl91bmF2YWlsYWJsZScgKSApe1xyXG5cdFx0XHR0b29sdGlwX3RpbWUgPSBwb3BvdmVyX2hpbnRzWyAnYmVmb3JlX2FmdGVyX3VuYXZhaWxhYmxlJyBdO1xyXG5cdFx0fSBlbHNlIGlmICggakNlbGwuaGFzQ2xhc3MoICdkYXRlMmFwcHJvdmUnICkgKXtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBqQ2VsbC5oYXNDbGFzcyggJ2RhdGVfYXBwcm92ZWQnICkgKXtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRqQ2VsbC5hdHRyKCAnZGF0YS1jb250ZW50JywgdG9vbHRpcF90aW1lICk7XHJcblxyXG5cdFx0dmFyIHRkX2VsID0gakNlbGwuZ2V0KDApO1x0Ly9qUXVlcnkoICcjY2FsZW5kYXJfYm9va2luZycgKyBjYWxlbmRhcl9wYXJhbXNfYXJyLnJlc291cmNlX2lkICsgJyB0ZC5jYWw0ZGF0ZS0nICsgdGRfY2xhc3MgKS5nZXQoMCk7XHJcblxyXG5cdFx0aWYgKCAoIHVuZGVmaW5lZCA9PSB0ZF9lbC5fdGlwcHkgKSAmJiAoICcnICE9IHRvb2x0aXBfdGltZSApICl7XHJcblxyXG5cdFx0XHRcdHdwYmNfdGlwcHkoIHRkX2VsICwge1xyXG5cdFx0XHRcdFx0Y29udGVudCggcmVmZXJlbmNlICl7XHJcblxyXG5cdFx0XHRcdFx0XHR2YXIgcG9wb3Zlcl9jb250ZW50ID0gcmVmZXJlbmNlLmdldEF0dHJpYnV0ZSggJ2RhdGEtY29udGVudCcgKTtcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiAnPGRpdiBjbGFzcz1cInBvcG92ZXIgcG9wb3Zlcl90aXBweVwiPidcclxuXHRcdFx0XHRcdFx0XHRcdFx0KyAnPGRpdiBjbGFzcz1cInBvcG92ZXItY29udGVudFwiPidcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQrIHBvcG92ZXJfY29udGVudFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQrICc8L2Rpdj4nXHJcblx0XHRcdFx0XHRcdFx0ICsgJzwvZGl2Pic7XHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0YWxsb3dIVE1MICAgICAgICA6IHRydWUsXHJcblx0XHRcdFx0XHR0cmlnZ2VyXHRcdFx0IDogJ21vdXNlZW50ZXIgZm9jdXMnLFxyXG5cdFx0XHRcdFx0aW50ZXJhY3RpdmUgICAgICA6ICEgdHJ1ZSxcclxuXHRcdFx0XHRcdGhpZGVPbkNsaWNrICAgICAgOiB0cnVlLFxyXG5cdFx0XHRcdFx0aW50ZXJhY3RpdmVCb3JkZXI6IDEwLFxyXG5cdFx0XHRcdFx0bWF4V2lkdGggICAgICAgICA6IDU1MCxcclxuXHRcdFx0XHRcdHRoZW1lICAgICAgICAgICAgOiAnd3BiYy10aXBweS10aW1lcycsXHJcblx0XHRcdFx0XHRwbGFjZW1lbnQgICAgICAgIDogJ3RvcCcsXHJcblx0XHRcdFx0XHRkZWxheVx0XHRcdCA6IFs0MDAsIDBdLFx0XHRcdC8vRml4SW46IDkuNC4yLjJcclxuXHRcdFx0XHRcdGlnbm9yZUF0dHJpYnV0ZXMgOiB0cnVlLFxyXG5cdFx0XHRcdFx0dG91Y2hcdFx0XHQgOiB0cnVlLFx0XHRcdFx0Ly9bJ2hvbGQnLCA1MDBdLCAvLyA1MDBtcyBkZWxheVx0XHRcdC8vRml4SW46IDkuMi4xLjVcclxuXHRcdFx0XHRcdGFwcGVuZFRvOiAoKSA9PiBkb2N1bWVudC5ib2R5LFxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblxyXG5cclxuXHJcblxyXG4vKipcclxuICogICBBamF4ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cclxuXHJcbi8qKlxyXG4gKiBTZW5kIEFqYXggc2hvdyByZXF1ZXN0XHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2FqeF9hdmFpbGFiaWxpdHlfX2FqYXhfcmVxdWVzdCgpe1xyXG5cclxuY29uc29sZS5ncm91cENvbGxhcHNlZCggJ1dQQkNfQUpYX0FWQUlMQUJJTElUWScgKTsgY29uc29sZS5sb2coICcgPT0gQmVmb3JlIEFqYXggU2VuZCAtIHNlYXJjaF9nZXRfYWxsX3BhcmFtcygpID09ICcgLCB3cGJjX2FqeF9hdmFpbGFiaWxpdHkuc2VhcmNoX2dldF9hbGxfcGFyYW1zKCkgKTtcclxuXHJcblx0d3BiY19hdmFpbGFiaWxpdHlfcmVsb2FkX2J1dHRvbl9fc3Bpbl9zdGFydCgpO1xyXG5cclxuXHQvLyBTdGFydCBBamF4XHJcblx0alF1ZXJ5LnBvc3QoIHdwYmNfdXJsX2FqYXgsXHJcblx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0YWN0aW9uICAgICAgICAgIDogJ1dQQkNfQUpYX0FWQUlMQUJJTElUWScsXHJcblx0XHRcdFx0XHR3cGJjX2FqeF91c2VyX2lkOiB3cGJjX2FqeF9hdmFpbGFiaWxpdHkuZ2V0X3NlY3VyZV9wYXJhbSggJ3VzZXJfaWQnICksXHJcblx0XHRcdFx0XHRub25jZSAgICAgICAgICAgOiB3cGJjX2FqeF9hdmFpbGFiaWxpdHkuZ2V0X3NlY3VyZV9wYXJhbSggJ25vbmNlJyApLFxyXG5cdFx0XHRcdFx0d3BiY19hanhfbG9jYWxlIDogd3BiY19hanhfYXZhaWxhYmlsaXR5LmdldF9zZWN1cmVfcGFyYW0oICdsb2NhbGUnICksXHJcblxyXG5cdFx0XHRcdFx0c2VhcmNoX3BhcmFtc1x0OiB3cGJjX2FqeF9hdmFpbGFiaWxpdHkuc2VhcmNoX2dldF9hbGxfcGFyYW1zKClcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdC8qKlxyXG5cdFx0XHRcdCAqIFMgdSBjIGMgZSBzIHNcclxuXHRcdFx0XHQgKlxyXG5cdFx0XHRcdCAqIEBwYXJhbSByZXNwb25zZV9kYXRhXHRcdC1cdGl0cyBvYmplY3QgcmV0dXJuZWQgZnJvbSAgQWpheCAtIGNsYXNzLWxpdmUtc2VhcmNnLnBocFxyXG5cdFx0XHRcdCAqIEBwYXJhbSB0ZXh0U3RhdHVzXHRcdC1cdCdzdWNjZXNzJ1xyXG5cdFx0XHRcdCAqIEBwYXJhbSBqcVhIUlx0XHRcdFx0LVx0T2JqZWN0XHJcblx0XHRcdFx0ICovXHJcblx0XHRcdFx0ZnVuY3Rpb24gKCByZXNwb25zZV9kYXRhLCB0ZXh0U3RhdHVzLCBqcVhIUiApIHtcclxuXHJcbmNvbnNvbGUubG9nKCAnID09IFJlc3BvbnNlIFdQQkNfQUpYX0FWQUlMQUJJTElUWSA9PSAnLCByZXNwb25zZV9kYXRhICk7IGNvbnNvbGUuZ3JvdXBFbmQoKTtcclxuXHJcblx0XHRcdFx0XHQvLyBQcm9iYWJseSBFcnJvclxyXG5cdFx0XHRcdFx0aWYgKCAodHlwZW9mIHJlc3BvbnNlX2RhdGEgIT09ICdvYmplY3QnKSB8fCAocmVzcG9uc2VfZGF0YSA9PT0gbnVsbCkgKXtcclxuXHJcblx0XHRcdFx0XHRcdHdwYmNfYWp4X2F2YWlsYWJpbGl0eV9fc2hvd19tZXNzYWdlKCByZXNwb25zZV9kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gUmVsb2FkIHBhZ2UsIGFmdGVyIGZpbHRlciB0b29sYmFyIGhhcyBiZWVuIHJlc2V0XHJcblx0XHRcdFx0XHRpZiAoICAgICAgICggICAgIHVuZGVmaW5lZCAhPSByZXNwb25zZV9kYXRhWyAnYWp4X2NsZWFuZWRfcGFyYW1zJyBdKVxyXG5cdFx0XHRcdFx0XHRcdCYmICggJ3Jlc2V0X2RvbmUnID09PSByZXNwb25zZV9kYXRhWyAnYWp4X2NsZWFuZWRfcGFyYW1zJyBdWyAnZG9fYWN0aW9uJyBdKVxyXG5cdFx0XHRcdFx0KXtcclxuXHRcdFx0XHRcdFx0bG9jYXRpb24ucmVsb2FkKCk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBTaG93IGxpc3RpbmdcclxuXHRcdFx0XHRcdHdwYmNfYWp4X2F2YWlsYWJpbGl0eV9fcGFnZV9jb250ZW50X19zaG93KCByZXNwb25zZV9kYXRhWyAnYWp4X2RhdGEnIF0sIHJlc3BvbnNlX2RhdGFbICdhanhfc2VhcmNoX3BhcmFtcycgXSAsIHJlc3BvbnNlX2RhdGFbICdhanhfY2xlYW5lZF9wYXJhbXMnIF0gKTtcclxuXHJcblx0XHRcdFx0XHQvL3dwYmNfYWp4X2F2YWlsYWJpbGl0eV9fZGVmaW5lX3VpX2hvb2tzKCk7XHRcdFx0XHRcdFx0Ly8gUmVkZWZpbmUgSG9va3MsIGJlY2F1c2Ugd2Ugc2hvdyBuZXcgRE9NIGVsZW1lbnRzXHJcblx0XHRcdFx0XHRpZiAoICcnICE9IHJlc3BvbnNlX2RhdGFbICdhanhfZGF0YScgXVsgJ2FqeF9hZnRlcl9hY3Rpb25fbWVzc2FnZScgXS5yZXBsYWNlKCAvXFxuL2csIFwiPGJyIC8+XCIgKSApe1xyXG5cdFx0XHRcdFx0XHR3cGJjX2FkbWluX3Nob3dfbWVzc2FnZShcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIHJlc3BvbnNlX2RhdGFbICdhanhfZGF0YScgXVsgJ2FqeF9hZnRlcl9hY3Rpb25fbWVzc2FnZScgXS5yZXBsYWNlKCAvXFxuL2csIFwiPGJyIC8+XCIgKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCwgKCAnMScgPT0gcmVzcG9uc2VfZGF0YVsgJ2FqeF9kYXRhJyBdWyAnYWp4X2FmdGVyX2FjdGlvbl9yZXN1bHQnIF0gKSA/ICdzdWNjZXNzJyA6ICdlcnJvcidcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQsIDEwMDAwXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0d3BiY19hdmFpbGFiaWxpdHlfcmVsb2FkX2J1dHRvbl9fc3Bpbl9wYXVzZSgpO1xyXG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIHNwaW4gaWNvbiBmcm9tICBidXR0b24gYW5kIEVuYWJsZSB0aGlzIGJ1dHRvbi5cclxuXHRcdFx0XHRcdHdwYmNfYnV0dG9uX19yZW1vdmVfc3BpbiggcmVzcG9uc2VfZGF0YVsgJ2FqeF9jbGVhbmVkX3BhcmFtcycgXVsgJ3VpX2NsaWNrZWRfZWxlbWVudF9pZCcgXSApXHJcblxyXG5cdFx0XHRcdFx0alF1ZXJ5KCAnI2FqYXhfcmVzcG9uZCcgKS5odG1sKCByZXNwb25zZV9kYXRhICk7XHRcdC8vIEZvciBhYmlsaXR5IHRvIHNob3cgcmVzcG9uc2UsIGFkZCBzdWNoIERJViBlbGVtZW50IHRvIHBhZ2VcclxuXHRcdFx0XHR9XHJcblx0XHRcdCAgKS5mYWlsKCBmdW5jdGlvbiAoIGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93biApIHsgICAgaWYgKCB3aW5kb3cuY29uc29sZSAmJiB3aW5kb3cuY29uc29sZS5sb2cgKXsgY29uc29sZS5sb2coICdBamF4X0Vycm9yJywganFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duICk7IH1cclxuXHJcblx0XHRcdFx0XHR2YXIgZXJyb3JfbWVzc2FnZSA9ICc8c3Ryb25nPicgKyAnRXJyb3IhJyArICc8L3N0cm9uZz4gJyArIGVycm9yVGhyb3duIDtcclxuXHRcdFx0XHRcdGlmICgganFYSFIuc3RhdHVzICl7XHJcblx0XHRcdFx0XHRcdGVycm9yX21lc3NhZ2UgKz0gJyAoPGI+JyArIGpxWEhSLnN0YXR1cyArICc8L2I+KSc7XHJcblx0XHRcdFx0XHRcdGlmICg0MDMgPT0ganFYSFIuc3RhdHVzICl7XHJcblx0XHRcdFx0XHRcdFx0ZXJyb3JfbWVzc2FnZSArPSAnIFByb2JhYmx5IG5vbmNlIGZvciB0aGlzIHBhZ2UgaGFzIGJlZW4gZXhwaXJlZC4gUGxlYXNlIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiBvbmNsaWNrPVwiamF2YXNjcmlwdDpsb2NhdGlvbi5yZWxvYWQoKTtcIj5yZWxvYWQgdGhlIHBhZ2U8L2E+Lic7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmICgganFYSFIucmVzcG9uc2VUZXh0ICl7XHJcblx0XHRcdFx0XHRcdGVycm9yX21lc3NhZ2UgKz0gJyAnICsganFYSFIucmVzcG9uc2VUZXh0O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0ZXJyb3JfbWVzc2FnZSA9IGVycm9yX21lc3NhZ2UucmVwbGFjZSggL1xcbi9nLCBcIjxiciAvPlwiICk7XHJcblxyXG5cdFx0XHRcdFx0d3BiY19hanhfYXZhaWxhYmlsaXR5X19zaG93X21lc3NhZ2UoIGVycm9yX21lc3NhZ2UgKTtcclxuXHRcdFx0ICB9KVxyXG5cdCAgICAgICAgICAvLyAuZG9uZSggICBmdW5jdGlvbiAoIGRhdGEsIHRleHRTdGF0dXMsIGpxWEhSICkgeyAgIGlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUubG9nICl7IGNvbnNvbGUubG9nKCAnc2Vjb25kIHN1Y2Nlc3MnLCBkYXRhLCB0ZXh0U3RhdHVzLCBqcVhIUiApOyB9ICAgIH0pXHJcblx0XHRcdCAgLy8gLmFsd2F5cyggZnVuY3Rpb24gKCBkYXRhX2pxWEhSLCB0ZXh0U3RhdHVzLCBqcVhIUl9lcnJvclRocm93biApIHsgICBpZiAoIHdpbmRvdy5jb25zb2xlICYmIHdpbmRvdy5jb25zb2xlLmxvZyApeyBjb25zb2xlLmxvZyggJ2Fsd2F5cyBmaW5pc2hlZCcsIGRhdGFfanFYSFIsIHRleHRTdGF0dXMsIGpxWEhSX2Vycm9yVGhyb3duICk7IH0gICAgIH0pXHJcblx0XHRcdCAgOyAgLy8gRW5kIEFqYXhcclxuXHJcbn1cclxuXHJcblxyXG5cclxuLyoqXHJcbiAqICAgSCBvIG8gayBzICAtICBpdHMgQWN0aW9uL1RpbWVzIHdoZW4gbmVlZCB0byByZS1SZW5kZXIgVmlld3MgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXHJcblxyXG4vKipcclxuICogU2VuZCBBamF4IFNlYXJjaCBSZXF1ZXN0IGFmdGVyIFVwZGF0aW5nIHNlYXJjaCByZXF1ZXN0IHBhcmFtZXRlcnNcclxuICpcclxuICogQHBhcmFtIHBhcmFtc19hcnJcclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfYWp4X2F2YWlsYWJpbGl0eV9fc2VuZF9yZXF1ZXN0X3dpdGhfcGFyYW1zICggcGFyYW1zX2FyciApe1xyXG5cclxuXHQvLyBEZWZpbmUgZGlmZmVyZW50IFNlYXJjaCAgcGFyYW1ldGVycyBmb3IgcmVxdWVzdFxyXG5cdF8uZWFjaCggcGFyYW1zX2FyciwgZnVuY3Rpb24gKCBwX3ZhbCwgcF9rZXksIHBfZGF0YSApIHtcclxuXHRcdC8vY29uc29sZS5sb2coICdSZXF1ZXN0IGZvcjogJywgcF9rZXksIHBfdmFsICk7XHJcblx0XHR3cGJjX2FqeF9hdmFpbGFiaWxpdHkuc2VhcmNoX3NldF9wYXJhbSggcF9rZXksIHBfdmFsICk7XHJcblx0fSk7XHJcblxyXG5cdC8vIFNlbmQgQWpheCBSZXF1ZXN0XHJcblx0d3BiY19hanhfYXZhaWxhYmlsaXR5X19hamF4X3JlcXVlc3QoKTtcclxufVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2VhcmNoIHJlcXVlc3QgZm9yIFwiUGFnZSBOdW1iZXJcIlxyXG5cdCAqIEBwYXJhbSBwYWdlX251bWJlclx0aW50XHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19hanhfYXZhaWxhYmlsaXR5X19wYWdpbmF0aW9uX2NsaWNrKCBwYWdlX251bWJlciApe1xyXG5cclxuXHRcdHdwYmNfYWp4X2F2YWlsYWJpbGl0eV9fc2VuZF9yZXF1ZXN0X3dpdGhfcGFyYW1zKCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQncGFnZV9udW0nOiBwYWdlX251bWJlclxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gKTtcclxuXHR9XHJcblxyXG5cclxuXHJcbi8qKlxyXG4gKiAgIFNob3cgLyBIaWRlIENvbnRlbnQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5cclxuLyoqXHJcbiAqICBTaG93IExpc3RpbmcgQ29udGVudCBcdC0gXHRTZW5kaW5nIEFqYXggUmVxdWVzdFx0LVx0d2l0aCBwYXJhbWV0ZXJzIHRoYXQgIHdlIGVhcmx5ICBkZWZpbmVkXHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2FqeF9hdmFpbGFiaWxpdHlfX2FjdHVhbF9jb250ZW50X19zaG93KCl7XHJcblxyXG5cdHdwYmNfYWp4X2F2YWlsYWJpbGl0eV9fYWpheF9yZXF1ZXN0KCk7XHRcdFx0Ly8gU2VuZCBBamF4IFJlcXVlc3RcdC1cdHdpdGggcGFyYW1ldGVycyB0aGF0ICB3ZSBlYXJseSAgZGVmaW5lZCBpbiBcIndwYmNfYWp4X2Jvb2tpbmdfbGlzdGluZ1wiIE9iai5cclxufVxyXG5cclxuLyoqXHJcbiAqIEhpZGUgTGlzdGluZyBDb250ZW50XHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2FqeF9hdmFpbGFiaWxpdHlfX2FjdHVhbF9jb250ZW50X19oaWRlKCl7XHJcblxyXG5cdGpRdWVyeSggIHdwYmNfYWp4X2F2YWlsYWJpbGl0eS5nZXRfb3RoZXJfcGFyYW0oICdsaXN0aW5nX2NvbnRhaW5lcicgKSAgKS5odG1sKCAnJyApO1xyXG59XHJcblxyXG5cclxuXHJcbi8qKlxyXG4gKiAgIE0gZSBzIHMgYSBnIGUgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5cclxuLyoqXHJcbiAqIFNob3cganVzdCBtZXNzYWdlIGluc3RlYWQgb2YgY29udGVudFxyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19hanhfYXZhaWxhYmlsaXR5X19zaG93X21lc3NhZ2UoIG1lc3NhZ2UgKXtcclxuXHJcblx0d3BiY19hanhfYXZhaWxhYmlsaXR5X19hY3R1YWxfY29udGVudF9faGlkZSgpO1xyXG5cclxuXHRqUXVlcnkoIHdwYmNfYWp4X2F2YWlsYWJpbGl0eS5nZXRfb3RoZXJfcGFyYW0oICdsaXN0aW5nX2NvbnRhaW5lcicgKSApLmh0bWwoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCc8ZGl2IGNsYXNzPVwid3BiYy1zZXR0aW5ncy1ub3RpY2Ugbm90aWNlLXdhcm5pbmdcIiBzdHlsZT1cInRleHQtYWxpZ246bGVmdFwiPicgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2UgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnPC9kaXY+J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XHJcbn1cclxuXHJcblxyXG5cclxuLyoqXHJcbiAqICAgU3VwcG9ydCBGdW5jdGlvbnMgLSBTcGluIEljb24gaW4gQnV0dG9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXHJcblxyXG4vKipcclxuICogU3BpbiBidXR0b24gaW4gRmlsdGVyIHRvb2xiYXIgIC0gIFN0YXJ0XHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2F2YWlsYWJpbGl0eV9yZWxvYWRfYnV0dG9uX19zcGluX3N0YXJ0KCl7XHJcblx0alF1ZXJ5KCAnI3dwYmNfYXZhaWxhYmlsaXR5X3JlbG9hZF9idXR0b24gLm1lbnVfaWNvbi53cGJjX3NwaW4nKS5yZW1vdmVDbGFzcyggJ3dwYmNfYW5pbWF0aW9uX3BhdXNlJyApO1xyXG59XHJcblxyXG4vKipcclxuICogU3BpbiBidXR0b24gaW4gRmlsdGVyIHRvb2xiYXIgIC0gIFBhdXNlXHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2F2YWlsYWJpbGl0eV9yZWxvYWRfYnV0dG9uX19zcGluX3BhdXNlKCl7XHJcblx0alF1ZXJ5KCAnI3dwYmNfYXZhaWxhYmlsaXR5X3JlbG9hZF9idXR0b24gLm1lbnVfaWNvbi53cGJjX3NwaW4nICkuYWRkQ2xhc3MoICd3cGJjX2FuaW1hdGlvbl9wYXVzZScgKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFNwaW4gYnV0dG9uIGluIEZpbHRlciB0b29sYmFyICAtICBpcyBTcGlubmluZyA/XHJcbiAqXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19hdmFpbGFiaWxpdHlfcmVsb2FkX2J1dHRvbl9faXNfc3Bpbigpe1xyXG4gICAgaWYgKCBqUXVlcnkoICcjd3BiY19hdmFpbGFiaWxpdHlfcmVsb2FkX2J1dHRvbiAubWVudV9pY29uLndwYmNfc3BpbicgKS5oYXNDbGFzcyggJ3dwYmNfYW5pbWF0aW9uX3BhdXNlJyApICl7XHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxufVxyXG4iXSwiZmlsZSI6ImluY2x1ZGVzL3BhZ2UtYXZhaWxhYmlsaXR5L19vdXQvYXZhaWxhYmlsaXR5X3BhZ2UuanMifQ== | |
| 928 | +//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvcGFnZS1hdmFpbGFiaWxpdHkvX291dC9hdmFpbGFiaWxpdHlfcGFnZS5qcyIsIm5hbWVzIjpbIndwYmNfYWp4X2F2YWlsYWJpbGl0eSIsIm9iaiIsIiQiLCJwX3NlY3VyZSIsInNlY3VyaXR5X29iaiIsInVzZXJfaWQiLCJub25jZSIsImxvY2FsZSIsInNldF9zZWN1cmVfcGFyYW0iLCJwYXJhbV9rZXkiLCJwYXJhbV92YWwiLCJnZXRfc2VjdXJlX3BhcmFtIiwicF9saXN0aW5nIiwic2VhcmNoX3JlcXVlc3Rfb2JqIiwic2VhcmNoX3NldF9hbGxfcGFyYW1zIiwicmVxdWVzdF9wYXJhbV9vYmoiLCJzZWFyY2hfZ2V0X2FsbF9wYXJhbXMiLCJzZWFyY2hfZ2V0X3BhcmFtIiwic2VhcmNoX3NldF9wYXJhbSIsInNlYXJjaF9zZXRfcGFyYW1zX2FyciIsInBhcmFtc19hcnIiLCJfIiwiZWFjaCIsInBfdmFsIiwicF9rZXkiLCJwX2RhdGEiLCJwX290aGVyIiwib3RoZXJfb2JqIiwic2V0X290aGVyX3BhcmFtIiwiZ2V0X290aGVyX3BhcmFtIiwialF1ZXJ5Iiwid3BiY19hanhfYm9va2luZ3MiLCJ3cGJjX2FqeF9hdmFpbGFiaWxpdHlfX3BhZ2VfY29udGVudF9fc2hvdyIsImFqeF9kYXRhX2FyciIsImFqeF9zZWFyY2hfcGFyYW1zIiwiYWp4X2NsZWFuZWRfcGFyYW1zIiwidGVtcGxhdGVfX2F2YWlsYWJpbGl0eV9tYWluX3BhZ2VfY29udGVudCIsIndwIiwidGVtcGxhdGUiLCJodG1sIiwicGFyZW50IiwiaGlkZSIsIndwYmNfYWp4X2F2YWlsYWJpbGl0eV9fY2FsZW5kYXJfX3Nob3ciLCJyZXNvdXJjZV9pZCIsImFqeF9ub25jZV9jYWxlbmRhciIsInRyaWdnZXIiLCJjYWxlbmRhcl9wYXJhbXNfYXJyIiwib24iLCJldmVudCIsImluc3QiLCJkcERpdiIsImZpbmQiLCJ0aGlzX2V2ZW50IiwiakNlbGwiLCJjdXJyZW50VGFyZ2V0Iiwid3BiY19hdnlfX3Nob3dfdG9vbHRpcF9fZm9yX2VsZW1lbnQiLCJqQ2FsQ29udGFpbmVyIiwicmVtb3ZlQ2xhc3MiLCJjYWxlbmRhcl9fdmlld19fY2VsbF9oZWlnaHQiLCJhcHBlbmQiLCJ3aWR0aCIsImNhbGVuZGFyX192aWV3X193aWR0aCIsInVuZGVmaW5lZCIsImNhbGVuZGFyX192aWV3X19tYXhfd2lkdGgiLCJjYWxlbmRhcl9fdmlld19fbW9udGhzX2luX3JvdyIsImNhbGVuZGFyX192aWV3X192aXNpYmxlX21vbnRocyIsImNhbF9wYXJhbV9hcnIiLCJjYWxlbmRhcl9fc3RhcnRfd2Vla19kYXkiLCJjYWxlbmRhcl9fZGF5c19zZWxlY3Rpb25fbW9kZSIsImJvb2tlZF9kYXRlcyIsInNlYXNvbl9hdmFpbGFiaWxpdHkiLCJyZXNvdXJjZV91bmF2YWlsYWJsZV9kYXRlcyIsIndwYmNfc2hvd19pbmxpbmVfYm9va2luZ19jYWxlbmRhciIsIndwYmNfX2lubGluZV9ib29raW5nX2NhbGVuZGFyX19vbl9kYXlzX3NlbGVjdCIsInRleHRfaWQiLCJ2YWwiLCJwb3BvdmVyX2hpbnRzIiwidG9vbGJhcl90ZXh0IiwiaHRtbF9pZCIsImxlbmd0aCIsImhhc0NsYXNzIiwidGV4dCIsImRhdGVwaWNrIiwiYmVmb3JlU2hvd0RheSIsImRhdGUiLCJ3cGJjX19pbmxpbmVfYm9va2luZ19jYWxlbmRhcl9fYXBwbHlfY3NzX3RvX2RheXMiLCJvblNlbGVjdCIsIm9uSG92ZXIiLCJ2YWx1ZSIsIndwYmNfX2lubGluZV9ib29raW5nX2NhbGVuZGFyX19vbl9kYXlzX2hvdmVyIiwib25DaGFuZ2VNb250aFllYXIiLCJzaG93T24iLCJudW1iZXJPZk1vbnRocyIsInN0ZXBNb250aHMiLCJwcmV2VGV4dCIsIm5leHRUZXh0IiwiZGF0ZUZvcm1hdCIsImNoYW5nZU1vbnRoIiwiY2hhbmdlWWVhciIsIm1pbkRhdGUiLCJtYXhEYXRlIiwic2hvd1N0YXR1cyIsImNsb3NlQXRUb3AiLCJmaXJzdERheSIsImdvdG9DdXJyZW50IiwiaGlkZUlmTm9QcmV2TmV4dCIsIm11bHRpU2VwYXJhdG9yIiwibXVsdGlTZWxlY3QiLCJyYW5nZVNlbGVjdCIsInJhbmdlU2VwYXJhdG9yIiwidXNlVGhlbWVSb2xsZXIiLCJkYXRlcGlja190aGlzIiwidG9kYXlfZGF0ZSIsIkRhdGUiLCJfd3BiYyIsInBhcnNlSW50IiwicmVhbF90b2RheV9kYXRlIiwiY2xhc3NfZGF5IiwiZ2V0TW9udGgiLCJnZXREYXRlIiwiZ2V0RnVsbFllYXIiLCJzcWxfY2xhc3NfZGF5Iiwid3BiY19fZ2V0X19zcWxfY2xhc3NfZGF0ZSIsImNzc19kYXRlX19zdGFuZGFyZCIsImNzc19kYXRlX19hZGRpdGlvbmFsIiwiZ2V0RGF5IiwiaSIsImRhdGVfbWlkbmlnaHQiLCJnZXRUaW1lIiwid3BiY19kYXRlc19fZGF5c19iZXR3ZWVuIiwiaXNfZGF0ZV9hdmFpbGFibGUiLCJ3cGJjX2luX2FycmF5IiwiYm9va2luZ3NfaW5fZGF0ZSIsImFwcHJvdmVkIiwiT2JqZWN0Iiwia2V5cyIsImlzX2FwcHJvdmVkIiwidHMiLCJib29raW5nX2RhdGUiLCJzdWJzdHJpbmciLCJfZ2V0SW5zdCIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJkYXRlcyIsInRkX2NsYXNzIiwidGRfb3ZlcnMiLCJpc19jaGVjayIsInNlbGNldGVkX2ZpcnN0X2RheSIsInNldEZ1bGxZZWFyIiwiYWRkQ2xhc3MiLCJkYXRlc19zZWxlY3Rpb24iLCJkYXRlc19hcnIiLCJpbmRleE9mIiwid3BiY19nZXRfZGF0ZXNfYXJyX19mcm9tX2RhdGVzX3JhbmdlX2pzIiwid3BiY19nZXRfZGF0ZXNfYXJyX19mcm9tX2RhdGVzX2NvbW1hX3NlcGFyYXRlZF9qcyIsIndwYmNfYXZ5X2FmdGVyX2RheXNfc2VsZWN0aW9uX19zaG93X2hlbHBfaW5mbyIsInBhcmFtcyIsIm1lc3NhZ2UiLCJjb2xvciIsImlzIiwidG9vbGJhcl90ZXh0X2F2YWlsYWJsZSIsInRvb2xiYXJfdGV4dF91bmF2YWlsYWJsZSIsImZpcnN0X2RhdGUiLCJsYXN0X2RhdGUiLCJmb3JtYXREYXRlIiwiZGF0ZXNfY2xpY2tfbnVtIiwiYXR0ciIsIndwYmNfYmxpbmtfZWxlbWVudCIsInJlcGxhY2UiLCJwdXNoIiwiam9pbiIsInNwbGl0Iiwic29ydCIsImNoZWNrX2luX2RhdGVfeW1kIiwiY2hlY2tfb3V0X2RhdGVfeW1kIiwid3BiY19nZXRfZGF0ZXNfYXJyYXlfZnJvbV9zdGFydF9lbmRfZGF5c19qcyIsInNTdGFydERhdGUiLCJzRW5kRGF0ZSIsImFEYXlzIiwic0N1cnJlbnREYXRlIiwib25lX2RheV9kdXJhdGlvbiIsInNldFRpbWUiLCJ3cGJjX2F2eV9fcHJlcGFyZV90b29sdGlwX19pbl9jYWxlbmRhciIsInRvb2x0aXBfdGltZSIsInRkX2VsIiwiZ2V0IiwiX3RpcHB5Iiwid3BiY190aXBweSIsImNvbnRlbnQiLCJyZWZlcmVuY2UiLCJwb3BvdmVyX2NvbnRlbnQiLCJnZXRBdHRyaWJ1dGUiLCJhbGxvd0hUTUwiLCJpbnRlcmFjdGl2ZSIsImhpZGVPbkNsaWNrIiwiaW50ZXJhY3RpdmVCb3JkZXIiLCJtYXhXaWR0aCIsInRoZW1lIiwicGxhY2VtZW50IiwiZGVsYXkiLCJpZ25vcmVBdHRyaWJ1dGVzIiwidG91Y2giLCJhcHBlbmRUbyIsImJvZHkiLCJ3cGJjX2FqeF9hdmFpbGFiaWxpdHlfX2FqYXhfcmVxdWVzdCIsImNvbnNvbGUiLCJncm91cENvbGxhcHNlZCIsImxvZyIsIndwYmNfYXZhaWxhYmlsaXR5X3JlbG9hZF9idXR0b25fX3NwaW5fc3RhcnQiLCJwb3N0Iiwid3BiY191cmxfYWpheCIsImFjdGlvbiIsIndwYmNfYWp4X3VzZXJfaWQiLCJ3cGJjX2FqeF9sb2NhbGUiLCJzZWFyY2hfcGFyYW1zIiwicmVzcG9uc2VfZGF0YSIsInRleHRTdGF0dXMiLCJqcVhIUiIsImdyb3VwRW5kIiwid3BiY19hanhfYXZhaWxhYmlsaXR5X19zaG93X21lc3NhZ2UiLCJsb2NhdGlvbiIsInJlbG9hZCIsIndwYmNfYWRtaW5fc2hvd19tZXNzYWdlIiwid3BiY19hdmFpbGFiaWxpdHlfcmVsb2FkX2J1dHRvbl9fc3Bpbl9wYXVzZSIsIndwYmNfYnV0dG9uX19yZW1vdmVfc3BpbiIsImZhaWwiLCJlcnJvclRocm93biIsIndpbmRvdyIsImVycm9yX21lc3NhZ2UiLCJzdGF0dXMiLCJyZXNwb25zZVRleHQiLCJ3cGJjX2FqeF9hdmFpbGFiaWxpdHlfX3NlbmRfcmVxdWVzdF93aXRoX3BhcmFtcyIsIndwYmNfYWp4X2F2YWlsYWJpbGl0eV9fcGFnaW5hdGlvbl9jbGljayIsInBhZ2VfbnVtYmVyIiwid3BiY19hanhfYXZhaWxhYmlsaXR5X19hY3R1YWxfY29udGVudF9fc2hvdyIsIndwYmNfYWp4X2F2YWlsYWJpbGl0eV9fYWN0dWFsX2NvbnRlbnRfX2hpZGUiLCJ3cGJjX2F2YWlsYWJpbGl0eV9yZWxvYWRfYnV0dG9uX19pc19zcGluIl0sInNvdXJjZXMiOlsiaW5jbHVkZXMvcGFnZS1hdmFpbGFiaWxpdHkvX3NyYy9hdmFpbGFiaWxpdHlfcGFnZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcclxuXHJcbi8qKlxyXG4gKiBSZXF1ZXN0IE9iamVjdFxyXG4gKiBIZXJlIHdlIGNhbiAgZGVmaW5lIFNlYXJjaCBwYXJhbWV0ZXJzIGFuZCBVcGRhdGUgaXQgbGF0ZXIsICB3aGVuICBzb21lIHBhcmFtZXRlciB3YXMgY2hhbmdlZFxyXG4gKlxyXG4gKi9cclxuXHJcbnZhciB3cGJjX2FqeF9hdmFpbGFiaWxpdHkgPSAoZnVuY3Rpb24gKCBvYmosICQpIHtcclxuXHJcblx0Ly8gU2VjdXJlIHBhcmFtZXRlcnMgZm9yIEFqYXhcdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdHZhciBwX3NlY3VyZSA9IG9iai5zZWN1cml0eV9vYmogPSBvYmouc2VjdXJpdHlfb2JqIHx8IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dXNlcl9pZDogMCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bm9uY2UgIDogJycsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxvY2FsZSA6ICcnXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIH07XHJcblxyXG5cdG9iai5zZXRfc2VjdXJlX3BhcmFtID0gZnVuY3Rpb24gKCBwYXJhbV9rZXksIHBhcmFtX3ZhbCApIHtcclxuXHRcdHBfc2VjdXJlWyBwYXJhbV9rZXkgXSA9IHBhcmFtX3ZhbDtcclxuXHR9O1xyXG5cclxuXHRvYmouZ2V0X3NlY3VyZV9wYXJhbSA9IGZ1bmN0aW9uICggcGFyYW1fa2V5ICkge1xyXG5cdFx0cmV0dXJuIHBfc2VjdXJlWyBwYXJhbV9rZXkgXTtcclxuXHR9O1xyXG5cclxuXHJcblx0Ly8gTGlzdGluZyBTZWFyY2ggcGFyYW1ldGVyc1x0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0dmFyIHBfbGlzdGluZyA9IG9iai5zZWFyY2hfcmVxdWVzdF9vYmogPSBvYmouc2VhcmNoX3JlcXVlc3Rfb2JqIHx8IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gc29ydCAgICAgICAgICAgIDogXCJib29raW5nX2lkXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIHNvcnRfdHlwZSAgICAgICA6IFwiREVTQ1wiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBwYWdlX251bSAgICAgICAgOiAxLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBwYWdlX2l0ZW1zX2NvdW50OiAxMCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gY3JlYXRlX2RhdGUgICAgIDogXCJcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8ga2V5d29yZCAgICAgICAgIDogXCJcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gc291cmNlICAgICAgICAgIDogXCJcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fTtcclxuXHJcblx0b2JqLnNlYXJjaF9zZXRfYWxsX3BhcmFtcyA9IGZ1bmN0aW9uICggcmVxdWVzdF9wYXJhbV9vYmogKSB7XHJcblx0XHRwX2xpc3RpbmcgPSByZXF1ZXN0X3BhcmFtX29iajtcclxuXHR9O1xyXG5cclxuXHRvYmouc2VhcmNoX2dldF9hbGxfcGFyYW1zID0gZnVuY3Rpb24gKCkge1xyXG5cdFx0cmV0dXJuIHBfbGlzdGluZztcclxuXHR9O1xyXG5cclxuXHRvYmouc2VhcmNoX2dldF9wYXJhbSA9IGZ1bmN0aW9uICggcGFyYW1fa2V5ICkge1xyXG5cdFx0cmV0dXJuIHBfbGlzdGluZ1sgcGFyYW1fa2V5IF07XHJcblx0fTtcclxuXHJcblx0b2JqLnNlYXJjaF9zZXRfcGFyYW0gPSBmdW5jdGlvbiAoIHBhcmFtX2tleSwgcGFyYW1fdmFsICkge1xyXG5cdFx0Ly8gaWYgKCBBcnJheS5pc0FycmF5KCBwYXJhbV92YWwgKSApe1xyXG5cdFx0Ly8gXHRwYXJhbV92YWwgPSBKU09OLnN0cmluZ2lmeSggcGFyYW1fdmFsICk7XHJcblx0XHQvLyB9XHJcblx0XHRwX2xpc3RpbmdbIHBhcmFtX2tleSBdID0gcGFyYW1fdmFsO1xyXG5cdH07XHJcblxyXG5cdG9iai5zZWFyY2hfc2V0X3BhcmFtc19hcnIgPSBmdW5jdGlvbiggcGFyYW1zX2FyciApe1xyXG5cdFx0Xy5lYWNoKCBwYXJhbXNfYXJyLCBmdW5jdGlvbiAoIHBfdmFsLCBwX2tleSwgcF9kYXRhICl7XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGVmaW5lIGRpZmZlcmVudCBTZWFyY2ggIHBhcmFtZXRlcnMgZm9yIHJlcXVlc3RcclxuXHRcdFx0dGhpcy5zZWFyY2hfc2V0X3BhcmFtKCBwX2tleSwgcF92YWwgKTtcclxuXHRcdH0gKTtcclxuXHR9XHJcblxyXG5cclxuXHQvLyBPdGhlciBwYXJhbWV0ZXJzIFx0XHRcdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdHZhciBwX290aGVyID0gb2JqLm90aGVyX29iaiA9IG9iai5vdGhlcl9vYmogfHwgeyB9O1xyXG5cclxuXHRvYmouc2V0X290aGVyX3BhcmFtID0gZnVuY3Rpb24gKCBwYXJhbV9rZXksIHBhcmFtX3ZhbCApIHtcclxuXHRcdHBfb3RoZXJbIHBhcmFtX2tleSBdID0gcGFyYW1fdmFsO1xyXG5cdH07XHJcblxyXG5cdG9iai5nZXRfb3RoZXJfcGFyYW0gPSBmdW5jdGlvbiAoIHBhcmFtX2tleSApIHtcclxuXHRcdHJldHVybiBwX290aGVyWyBwYXJhbV9rZXkgXTtcclxuXHR9O1xyXG5cclxuXHJcblx0cmV0dXJuIG9iajtcclxufSggd3BiY19hanhfYXZhaWxhYmlsaXR5IHx8IHt9LCBqUXVlcnkgKSk7XHJcblxyXG52YXIgd3BiY19hanhfYm9va2luZ3MgPSBbXTtcclxuXHJcbi8qKlxyXG4gKiAgIFNob3cgQ29udGVudCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5cclxuLyoqXHJcbiAqIFNob3cgQ29udGVudCAtIENhbGVuZGFyIGFuZCBVSSBlbGVtZW50c1xyXG4gKlxyXG4gKiBAcGFyYW0gYWp4X2RhdGFfYXJyXHJcbiAqIEBwYXJhbSBhanhfc2VhcmNoX3BhcmFtc1xyXG4gKiBAcGFyYW0gYWp4X2NsZWFuZWRfcGFyYW1zXHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2FqeF9hdmFpbGFiaWxpdHlfX3BhZ2VfY29udGVudF9fc2hvdyggYWp4X2RhdGFfYXJyLCBhanhfc2VhcmNoX3BhcmFtcyAsIGFqeF9jbGVhbmVkX3BhcmFtcyApe1xyXG5cclxuXHR2YXIgdGVtcGxhdGVfX2F2YWlsYWJpbGl0eV9tYWluX3BhZ2VfY29udGVudCA9IHdwLnRlbXBsYXRlKCAnd3BiY19hanhfYXZhaWxhYmlsaXR5X21haW5fcGFnZV9jb250ZW50JyApO1xyXG5cclxuXHQvLyBDb250ZW50XHJcblx0alF1ZXJ5KCB3cGJjX2FqeF9hdmFpbGFiaWxpdHkuZ2V0X290aGVyX3BhcmFtKCAnbGlzdGluZ19jb250YWluZXInICkgKS5odG1sKCB0ZW1wbGF0ZV9fYXZhaWxhYmlsaXR5X21haW5fcGFnZV9jb250ZW50KCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2FqeF9kYXRhJyAgICAgICAgICAgICAgOiBhanhfZGF0YV9hcnIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2FqeF9zZWFyY2hfcGFyYW1zJyAgICAgOiBhanhfc2VhcmNoX3BhcmFtcyxcdFx0XHRcdFx0XHRcdFx0Ly8gJF9SRVFVRVNUWyAnc2VhcmNoX3BhcmFtcycgXVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdhanhfY2xlYW5lZF9wYXJhbXMnICAgIDogYWp4X2NsZWFuZWRfcGFyYW1zXHJcblx0XHRcdFx0XHRcdFx0XHRcdH0gKSApO1xyXG5cclxuXHRqUXVlcnkoICcud3BiY19wcm9jZXNzaW5nLndwYmNfc3BpbicpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCggJ1tpZF49XCJ3cGJjX25vdGljZV9cIl0nICkuaGlkZSgpO1xyXG5cdC8vIExvYWQgY2FsZW5kYXJcclxuXHR3cGJjX2FqeF9hdmFpbGFiaWxpdHlfX2NhbGVuZGFyX19zaG93KCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQncmVzb3VyY2VfaWQnICAgICAgIDogYWp4X2NsZWFuZWRfcGFyYW1zLnJlc291cmNlX2lkLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2FqeF9ub25jZV9jYWxlbmRhcic6IGFqeF9kYXRhX2Fyci5hanhfbm9uY2VfY2FsZW5kYXIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnYWp4X2RhdGFfYXJyJyAgICAgICAgICA6IGFqeF9kYXRhX2FycixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdhanhfY2xlYW5lZF9wYXJhbXMnICAgIDogYWp4X2NsZWFuZWRfcGFyYW1zXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSApO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogVHJpZ2dlciBmb3IgZGF0ZXMgc2VsZWN0aW9uIGluIHRoZSBib29raW5nIGZvcm1cclxuXHQgKlxyXG5cdCAqIGpRdWVyeSggd3BiY19hanhfYXZhaWxhYmlsaXR5LmdldF9vdGhlcl9wYXJhbSggJ2xpc3RpbmdfY29udGFpbmVyJyApICkub24oJ3dwYmNfcGFnZV9jb250ZW50X2xvYWRlZCcsIGZ1bmN0aW9uKGV2ZW50LCBhanhfZGF0YV9hcnIsIGFqeF9zZWFyY2hfcGFyYW1zICwgYWp4X2NsZWFuZWRfcGFyYW1zKSB7IC4uLiB9ICk7XHJcblx0ICovXHJcblx0alF1ZXJ5KCB3cGJjX2FqeF9hdmFpbGFiaWxpdHkuZ2V0X290aGVyX3BhcmFtKCAnbGlzdGluZ19jb250YWluZXInICkgKS50cmlnZ2VyKCAnd3BiY19wYWdlX2NvbnRlbnRfbG9hZGVkJywgWyBhanhfZGF0YV9hcnIsIGFqeF9zZWFyY2hfcGFyYW1zICwgYWp4X2NsZWFuZWRfcGFyYW1zIF0gKTtcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBTaG93IGlubGluZSBtb250aCB2aWV3IGNhbGVuZGFyICAgICAgICAgICAgICB3aXRoIGFsbCBwcmVkZWZpbmVkIENTUyAoc2l6ZXMgYW5kIGNoZWNrIGluL291dCwgIHRpbWVzIGNvbnRhaW5lcnMpXHJcbiAqIEBwYXJhbSB7b2JqfSBjYWxlbmRhcl9wYXJhbXNfYXJyXHJcblx0XHRcdHtcclxuXHRcdFx0XHQncmVzb3VyY2VfaWQnICAgICAgIFx0OiBhanhfY2xlYW5lZF9wYXJhbXMucmVzb3VyY2VfaWQsXHJcblx0XHRcdFx0J2FqeF9ub25jZV9jYWxlbmRhcidcdDogYWp4X2RhdGFfYXJyLmFqeF9ub25jZV9jYWxlbmRhcixcclxuXHRcdFx0XHQnYWp4X2RhdGFfYXJyJyAgICAgICAgICA6IGFqeF9kYXRhX2FyciA9IHsgYWp4X2Jvb2tpbmdfcmVzb3VyY2VzOltdLCBib29rZWRfZGF0ZXM6IHt9LCByZXNvdXJjZV91bmF2YWlsYWJsZV9kYXRlczpbXSwgc2Vhc29uX2F2YWlsYWJpbGl0eTp7fSwuLi4uIH1cclxuXHRcdFx0XHQnYWp4X2NsZWFuZWRfcGFyYW1zJyAgICA6IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhbGVuZGFyX19kYXlzX3NlbGVjdGlvbl9tb2RlOiBcImR5bmFtaWNcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FsZW5kYXJfX3N0YXJ0X3dlZWtfZGF5OiBcIjBcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FsZW5kYXJfX3ZpZXdfX2NlbGxfaGVpZ2h0OiBcIlwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjYWxlbmRhcl9fdmlld19fbW9udGhzX2luX3JvdzogNFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FsZW5kYXJfX3ZpZXdfX3Zpc2libGVfbW9udGhzOiAxMlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FsZW5kYXJfX3ZpZXdfX3dpZHRoOiBcIjEwMCVcIlxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGVzX2F2YWlsYWJpbGl0eTogXCJ1bmF2YWlsYWJsZVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRlc19zZWxlY3Rpb246IFwiMjAyMy0wMy0xNCB+IDIwMjMtMDMtMTZcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZG9fYWN0aW9uOiBcInNldF9hdmFpbGFiaWxpdHlcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb3VyY2VfaWQ6IDFcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVpX2NsaWNrZWRfZWxlbWVudF9pZDogXCJ3cGJjX2F2YWlsYWJpbGl0eV9hcHBseV9idG5cIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dWlfdXNyX19hdmFpbGFiaWxpdHlfc2VsZWN0ZWRfdG9vbGJhcjogXCJpbmZvXCJcclxuXHRcdFx0XHRcdFx0XHRcdCAgXHRcdCB9XHJcblx0XHRcdH1cclxuKi9cclxuZnVuY3Rpb24gd3BiY19hanhfYXZhaWxhYmlsaXR5X19jYWxlbmRhcl9fc2hvdyggY2FsZW5kYXJfcGFyYW1zX2FyciApe1xyXG5cclxuXHQvLyBVcGRhdGUgbm9uY2VcclxuXHRqUXVlcnkoICcjYWp4X25vbmNlX2NhbGVuZGFyX3NlY3Rpb24nICkuaHRtbCggY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfbm9uY2VfY2FsZW5kYXIgKTtcclxuXHJcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvLyBVcGRhdGUgYm9va2luZ3NcclxuXHRpZiAoICd1bmRlZmluZWQnID09IHR5cGVvZiAod3BiY19hanhfYm9va2luZ3NbIGNhbGVuZGFyX3BhcmFtc19hcnIucmVzb3VyY2VfaWQgXSkgKXsgd3BiY19hanhfYm9va2luZ3NbIGNhbGVuZGFyX3BhcmFtc19hcnIucmVzb3VyY2VfaWQgXSA9IFtdOyB9XHJcblx0d3BiY19hanhfYm9va2luZ3NbIGNhbGVuZGFyX3BhcmFtc19hcnIucmVzb3VyY2VfaWQgXSA9IGNhbGVuZGFyX3BhcmFtc19hcnJbICdhanhfZGF0YV9hcnInIF1bICdib29rZWRfZGF0ZXMnIF07XHJcblxyXG5cclxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8qKlxyXG5cdCAqIERlZmluZSBzaG93aW5nIG1vdXNlIG92ZXIgdG9vbHRpcCBvbiB1bmF2YWlsYWJsZSBkYXRlc1xyXG5cdCAqIEl0J3MgZGVmaW5lZCwgd2hlbiBjYWxlbmRhciBSRUZSRVNIRUQgKGNoYW5nZSBtb250aHMgb3IgZGF5cyBzZWxlY3Rpb24pIGxvYWRlZCBpbiBqcXVlcnkuZGF0ZXBpY2sud3BiYy45LjAuanMgOlxyXG5cdCAqIFx0XHQkKCAnYm9keScgKS50cmlnZ2VyKCAnd3BiY19kYXRlcGlja19pbmxpbmVfY2FsZW5kYXJfcmVmcmVzaCcsIC4uLlx0XHQvLyBGaXhJbjogOS40LjQuMTMuXHJcblx0ICovXHJcblx0alF1ZXJ5KCAnYm9keScgKS5vbiggJ3dwYmNfZGF0ZXBpY2tfaW5saW5lX2NhbGVuZGFyX3JlZnJlc2gnLCBmdW5jdGlvbiAoIGV2ZW50LCByZXNvdXJjZV9pZCwgaW5zdCApe1xyXG5cdFx0Ly8gaW5zdC5kcERpdiAgaXQnczogIDxkaXYgY2xhc3M9XCJkYXRlcGljay1pbmxpbmUgZGF0ZXBpY2stbXVsdGlcIiBzdHlsZT1cIndpZHRoOiAxNzcxMnB4O1wiPi4uLi48L2Rpdj5cclxuXHRcdGluc3QuZHBEaXYuZmluZCggJy5zZWFzb25fdW5hdmFpbGFibGUsLmJlZm9yZV9hZnRlcl91bmF2YWlsYWJsZSwud2Vla2RheXNfdW5hdmFpbGFibGUnICkub24oICdtb3VzZW92ZXInLCBmdW5jdGlvbiAoIHRoaXNfZXZlbnQgKXtcclxuXHRcdFx0Ly8gYWxzbyBhdmFpbGFibGUgdGhlc2UgdmFyczogXHRyZXNvdXJjZV9pZCwgakNhbENvbnRhaW5lciwgaW5zdFxyXG5cdFx0XHR2YXIgakNlbGwgPSBqUXVlcnkoIHRoaXNfZXZlbnQuY3VycmVudFRhcmdldCApO1xyXG5cdFx0XHR3cGJjX2F2eV9fc2hvd190b29sdGlwX19mb3JfZWxlbWVudCggakNlbGwsIGNhbGVuZGFyX3BhcmFtc19hcnJbICdhanhfZGF0YV9hcnInIF1bJ3BvcG92ZXJfaGludHMnXSApO1xyXG5cdFx0fSk7XHJcblxyXG5cdH1cdCk7XHJcblxyXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0LyoqXHJcblx0ICogRGVmaW5lIGhlaWdodCBvZiB0aGUgY2FsZW5kYXIgIGNlbGxzLCBcdGFuZCAgbW91c2Ugb3ZlciB0b29sdGlwcyBhdCAgc29tZSB1bmF2YWlsYWJsZSBkYXRlc1xyXG5cdCAqIEl0J3MgZGVmaW5lZCwgd2hlbiBjYWxlbmRhciBsb2FkZWQgaW4ganF1ZXJ5LmRhdGVwaWNrLndwYmMuOS4wLmpzIDpcclxuXHQgKiBcdFx0JCggJ2JvZHknICkudHJpZ2dlciggJ3dwYmNfZGF0ZXBpY2tfaW5saW5lX2NhbGVuZGFyX2xvYWRlZCcsIC4uLlx0XHQvLyBGaXhJbjogOS40LjQuMTIuXHJcblx0ICovXHJcblx0alF1ZXJ5KCAnYm9keScgKS5vbiggJ3dwYmNfZGF0ZXBpY2tfaW5saW5lX2NhbGVuZGFyX2xvYWRlZCcsIGZ1bmN0aW9uICggZXZlbnQsIHJlc291cmNlX2lkLCBqQ2FsQ29udGFpbmVyLCBpbnN0ICl7XHJcblxyXG5cdFx0Ly8gUmVtb3ZlIGhpZ2hsaWdodCBkYXkgZm9yIHRvZGF5ICBkYXRlXHJcblx0XHRqUXVlcnkoICcuZGF0ZXBpY2stZGF5cy1jZWxsLmRhdGVwaWNrLXRvZGF5LmRhdGVwaWNrLWRheXMtY2VsbC1vdmVyJyApLnJlbW92ZUNsYXNzKCAnZGF0ZXBpY2stZGF5cy1jZWxsLW92ZXInICk7XHJcblxyXG5cdFx0Ly8gU2V0IGhlaWdodCBvZiBjYWxlbmRhciAgY2VsbHMgaWYgZGVmaW5lZCB0aGlzIG9wdGlvbiAgLy8gRml4SW46IDEwLjEyLjQuMi5cclxuXHRcdGlmICggJycgIT09IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLmNhbGVuZGFyX192aWV3X19jZWxsX2hlaWdodCApe1xyXG5cdFx0XHRqUXVlcnkoICdoZWFkJyApLmFwcGVuZCggJzxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj4nXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0KyAnLmhhc0RhdGVwaWNrIC5kYXRlcGljay1pbmxpbmUgLmRhdGVwaWNrLXRpdGxlLXJvdyB0aCwgJ1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsgJy5oYXNEYXRlcGljayAuZGF0ZXBpY2staW5saW5lIC5kYXRlcGljay1kYXlzLWNlbGwgeydcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCsgJ21heC1oZWlnaHQ6ICcgKyBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9jbGVhbmVkX3BhcmFtcy5jYWxlbmRhcl9fdmlld19fY2VsbF9oZWlnaHQgKyAnICFpbXBvcnRhbnQ7J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsgJ30nXHJcblx0XHRcdFx0XHRcdFx0XHRcdCsnPC9zdHlsZT4nICk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRGVmaW5lIHNob3dpbmcgbW91c2Ugb3ZlciB0b29sdGlwIG9uIHVuYXZhaWxhYmxlIGRhdGVzXHJcblx0XHRqQ2FsQ29udGFpbmVyLmZpbmQoICcuc2Vhc29uX3VuYXZhaWxhYmxlLC5iZWZvcmVfYWZ0ZXJfdW5hdmFpbGFibGUsLndlZWtkYXlzX3VuYXZhaWxhYmxlJyApLm9uKCAnbW91c2VvdmVyJywgZnVuY3Rpb24gKCB0aGlzX2V2ZW50ICl7XHJcblx0XHRcdC8vIGFsc28gYXZhaWxhYmxlIHRoZXNlIHZhcnM6IFx0cmVzb3VyY2VfaWQsIGpDYWxDb250YWluZXIsIGluc3RcclxuXHRcdFx0dmFyIGpDZWxsID0galF1ZXJ5KCB0aGlzX2V2ZW50LmN1cnJlbnRUYXJnZXQgKTtcclxuXHRcdFx0d3BiY19hdnlfX3Nob3dfdG9vbHRpcF9fZm9yX2VsZW1lbnQoIGpDZWxsLCBjYWxlbmRhcl9wYXJhbXNfYXJyWyAnYWp4X2RhdGFfYXJyJyBdWydwb3BvdmVyX2hpbnRzJ10gKTtcclxuXHRcdH0pO1xyXG5cdH0gKTtcclxuXHJcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvLyBEZWZpbmUgd2lkdGggb2YgZW50aXJlIGNhbGVuZGFyXHJcblx0dmFyIHdpZHRoID0gICAnd2lkdGg6J1x0XHQrICAgY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfY2xlYW5lZF9wYXJhbXMuY2FsZW5kYXJfX3ZpZXdfX3dpZHRoICsgJzsnO1x0XHRcdFx0XHQvLyB2YXIgd2lkdGggPSAnd2lkdGg6MTAwJTttYXgtd2lkdGg6MTAwJTsnO1xyXG5cclxuXHRpZiAoICAgKCB1bmRlZmluZWQgIT0gY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfY2xlYW5lZF9wYXJhbXMuY2FsZW5kYXJfX3ZpZXdfX21heF93aWR0aCApXHJcblx0XHQmJiAoICcnICE9IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLmNhbGVuZGFyX192aWV3X19tYXhfd2lkdGggKVxyXG5cdCl7XHJcblx0XHR3aWR0aCArPSAnbWF4LXdpZHRoOicgXHQrIGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLmNhbGVuZGFyX192aWV3X19tYXhfd2lkdGggKyAnOyc7XHJcblx0fSBlbHNlIHtcclxuXHRcdHdpZHRoICs9ICdtYXgtd2lkdGg6JyBcdCsgKCBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9jbGVhbmVkX3BhcmFtcy5jYWxlbmRhcl9fdmlld19fbW9udGhzX2luX3JvdyAqIDM0MSApICsgJ3B4Oyc7XHJcblx0fVxyXG5cclxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8vIEFkZCBjYWxlbmRhciBjb250YWluZXI6IFwiQ2FsZW5kYXIgaXMgbG9hZGluZy4uLlwiICBhbmQgdGV4dGFyZWFcclxuXHRqUXVlcnkoICcud3BiY19hanhfYXZ5X19jYWxlbmRhcicgKS5odG1sKFxyXG5cclxuXHRcdCc8ZGl2IGNsYXNzPVwiJ1x0KyAnIGJrX2NhbGVuZGFyX2ZyYW1lJ1xyXG5cdFx0XHRcdFx0XHQrICcgbW9udGhzX251bV9pbl9yb3dfJyArIGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLmNhbGVuZGFyX192aWV3X19tb250aHNfaW5fcm93XHJcblx0XHRcdFx0XHRcdCsgJyBjYWxfbW9udGhfbnVtXycgXHQrIGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLmNhbGVuZGFyX192aWV3X192aXNpYmxlX21vbnRoc1xyXG5cdFx0XHRcdCsgJ1wiICdcclxuXHRcdFx0KyAnc3R5bGU9XCInICsgd2lkdGggKyAnXCI+J1xyXG5cclxuXHRcdFx0XHQrICc8ZGl2IGlkPVwiY2FsZW5kYXJfYm9va2luZycgKyBjYWxlbmRhcl9wYXJhbXNfYXJyLnJlc291cmNlX2lkICsgJ1wiPicgKyAnQ2FsZW5kYXIgaXMgbG9hZGluZy4uLicgKyAnPC9kaXY+J1xyXG5cclxuXHRcdCsgJzwvZGl2PidcclxuXHJcblx0XHQrICc8dGV4dGFyZWEgICAgICBpZD1cImRhdGVfYm9va2luZycgKyBjYWxlbmRhcl9wYXJhbXNfYXJyLnJlc291cmNlX2lkICsgJ1wiJ1xyXG5cdFx0XHRcdFx0KyAnIG5hbWU9XCJkYXRlX2Jvb2tpbmcnICsgY2FsZW5kYXJfcGFyYW1zX2Fyci5yZXNvdXJjZV9pZCArICdcIidcclxuXHRcdFx0XHRcdCsgJyBhdXRvY29tcGxldGU9XCJvZmZcIidcclxuXHRcdFx0XHRcdCsgJyBzdHlsZT1cImRpc3BsYXk6bm9uZTt3aWR0aDoxMDAlO2hlaWdodDoxMGVtO21hcmdpbjoyZW0gMCAwO1wiPjwvdGV4dGFyZWE+J1xyXG5cdCk7XHJcblxyXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0dmFyIGNhbF9wYXJhbV9hcnIgPSB7XHJcblx0XHRcdFx0XHRcdFx0J2h0bWxfaWQnICAgICAgICAgICA6ICdjYWxlbmRhcl9ib29raW5nJyArIGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLnJlc291cmNlX2lkLFxyXG5cdFx0XHRcdFx0XHRcdCd0ZXh0X2lkJyAgICAgICAgICAgOiAnZGF0ZV9ib29raW5nJyArIGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLnJlc291cmNlX2lkLFxyXG5cclxuXHRcdFx0XHRcdFx0XHQnY2FsZW5kYXJfX3N0YXJ0X3dlZWtfZGF5JzogXHQgIGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLmNhbGVuZGFyX19zdGFydF93ZWVrX2RheSxcclxuXHRcdFx0XHRcdFx0XHQnY2FsZW5kYXJfX3ZpZXdfX3Zpc2libGVfbW9udGhzJzogY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfY2xlYW5lZF9wYXJhbXMuY2FsZW5kYXJfX3ZpZXdfX3Zpc2libGVfbW9udGhzLFxyXG5cdFx0XHRcdFx0XHRcdCdjYWxlbmRhcl9fZGF5c19zZWxlY3Rpb25fbW9kZSc6ICBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9jbGVhbmVkX3BhcmFtcy5jYWxlbmRhcl9fZGF5c19zZWxlY3Rpb25fbW9kZSxcclxuXHJcblx0XHRcdFx0XHRcdFx0J3Jlc291cmNlX2lkJyAgICAgICAgOiBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9jbGVhbmVkX3BhcmFtcy5yZXNvdXJjZV9pZCxcclxuXHRcdFx0XHRcdFx0XHQnYWp4X25vbmNlX2NhbGVuZGFyJyA6IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2RhdGFfYXJyLmFqeF9ub25jZV9jYWxlbmRhcixcclxuXHRcdFx0XHRcdFx0XHQnYm9va2VkX2RhdGVzJyAgICAgICA6IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2RhdGFfYXJyLmJvb2tlZF9kYXRlcyxcclxuXHRcdFx0XHRcdFx0XHQnc2Vhc29uX2F2YWlsYWJpbGl0eSc6IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2RhdGFfYXJyLnNlYXNvbl9hdmFpbGFiaWxpdHksXHJcblxyXG5cdFx0XHRcdFx0XHRcdCdyZXNvdXJjZV91bmF2YWlsYWJsZV9kYXRlcycgOiBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9kYXRhX2Fyci5yZXNvdXJjZV91bmF2YWlsYWJsZV9kYXRlcyxcclxuXHJcblx0XHRcdFx0XHRcdFx0J3BvcG92ZXJfaGludHMnOiBjYWxlbmRhcl9wYXJhbXNfYXJyWyAnYWp4X2RhdGFfYXJyJyBdWydwb3BvdmVyX2hpbnRzJ11cdFx0Ly8geydzZWFzb25fdW5hdmFpbGFibGUnOicuLi4nLCd3ZWVrZGF5c191bmF2YWlsYWJsZSc6Jy4uLicsJ2JlZm9yZV9hZnRlcl91bmF2YWlsYWJsZSc6Jy4uLicsfVxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdHdwYmNfc2hvd19pbmxpbmVfYm9va2luZ19jYWxlbmRhciggY2FsX3BhcmFtX2FyciApO1xyXG5cclxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8qKlxyXG5cdCAqIE9uIGNsaWNrIEFWQUlMQUJMRSB8ICBVTkFWQUlMQUJMRSBidXR0b24gIGluIHdpZGdldFx0LVx0bmVlZCB0byAgY2hhbmdlIGhlbHAgZGF0ZXMgdGV4dFxyXG5cdCAqL1xyXG5cdGpRdWVyeSggJy53cGJjX3JhZGlvX19zZXRfZGF5c19hdmFpbGFiaWxpdHknICkub24oJ2NoYW5nZScsIGZ1bmN0aW9uICggZXZlbnQsIHJlc291cmNlX2lkLCBpbnN0ICl7XHJcblx0XHR3cGJjX19pbmxpbmVfYm9va2luZ19jYWxlbmRhcl9fb25fZGF5c19zZWxlY3QoIGpRdWVyeSggJyMnICsgY2FsX3BhcmFtX2Fyci50ZXh0X2lkICkudmFsKCkgLCBjYWxfcGFyYW1fYXJyICk7XHJcblx0fSk7XHJcblxyXG5cdC8vIFNob3cgXHQnU2VsZWN0IGRheXMgIGluIGNhbGVuZGFyIHRoZW4gc2VsZWN0IEF2YWlsYWJsZSAgLyAgVW5hdmFpbGFibGUgc3RhdHVzIGFuZCBjbGljayBBcHBseSBhdmFpbGFiaWxpdHkgYnV0dG9uLidcclxuXHRqUXVlcnkoICcjd3BiY190b29sYmFyX2RhdGVzX2hpbnQnKS5odG1sKCAgICAgJzxkaXYgY2xhc3M9XCJ1aV9lbGVtZW50XCI+PHNwYW4gY2xhc3M9XCJ3cGJjX3VpX2NvbnRyb2wgd3BiY191aV9hZGRvbiB3cGJjX2hlbHBfdGV4dFwiID4nXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KyBjYWxfcGFyYW1fYXJyLnBvcG92ZXJfaGludHMudG9vbGJhcl90ZXh0XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCsgJzwvc3Bhbj48L2Rpdj4nXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIFx0TG9hZCBEYXRlcGljayBJbmxpbmUgY2FsZW5kYXJcclxuICpcclxuICogQHBhcmFtIGNhbGVuZGFyX3BhcmFtc19hcnJcdFx0ZXhhbXBsZTp7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnaHRtbF9pZCcgICAgICAgICAgIDogJ2NhbGVuZGFyX2Jvb2tpbmcnICsgY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfY2xlYW5lZF9wYXJhbXMucmVzb3VyY2VfaWQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQndGV4dF9pZCcgICAgICAgICAgIDogJ2RhdGVfYm9va2luZycgKyBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9jbGVhbmVkX3BhcmFtcy5yZXNvdXJjZV9pZCxcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnY2FsZW5kYXJfX3N0YXJ0X3dlZWtfZGF5JzogXHQgIGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2NsZWFuZWRfcGFyYW1zLmNhbGVuZGFyX19zdGFydF93ZWVrX2RheSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdjYWxlbmRhcl9fdmlld19fdmlzaWJsZV9tb250aHMnOiBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9jbGVhbmVkX3BhcmFtcy5jYWxlbmRhcl9fdmlld19fdmlzaWJsZV9tb250aHMsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnY2FsZW5kYXJfX2RheXNfc2VsZWN0aW9uX21vZGUnOiAgY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfY2xlYW5lZF9wYXJhbXMuY2FsZW5kYXJfX2RheXNfc2VsZWN0aW9uX21vZGUsXHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3Jlc291cmNlX2lkJyAgICAgICAgOiBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9jbGVhbmVkX3BhcmFtcy5yZXNvdXJjZV9pZCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdhanhfbm9uY2VfY2FsZW5kYXInIDogY2FsZW5kYXJfcGFyYW1zX2Fyci5hanhfZGF0YV9hcnIuYWp4X25vbmNlX2NhbGVuZGFyLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2Jvb2tlZF9kYXRlcycgICAgICAgOiBjYWxlbmRhcl9wYXJhbXNfYXJyLmFqeF9kYXRhX2Fyci5ib29rZWRfZGF0ZXMsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnc2Vhc29uX2F2YWlsYWJpbGl0eSc6IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2RhdGFfYXJyLnNlYXNvbl9hdmFpbGFiaWxpdHksXHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3Jlc291cmNlX3VuYXZhaWxhYmxlX2RhdGVzJyA6IGNhbGVuZGFyX3BhcmFtc19hcnIuYWp4X2RhdGFfYXJyLnJlc291cmNlX3VuYXZhaWxhYmxlX2RhdGVzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfc2hvd19pbmxpbmVfYm9va2luZ19jYWxlbmRhciggY2FsZW5kYXJfcGFyYW1zX2FyciApe1xyXG5cclxuXHRpZiAoXHJcblx0XHQgICAoIDAgPT09IGpRdWVyeSggJyMnICsgY2FsZW5kYXJfcGFyYW1zX2Fyci5odG1sX2lkICkubGVuZ3RoIClcdFx0XHRcdFx0XHRcdC8vIElmIGNhbGVuZGFyIERPTSBlbGVtZW50IG5vdCBleGlzdCB0aGVuIGV4aXN0XHJcblx0XHR8fCAoIHRydWUgPT09IGpRdWVyeSggJyMnICsgY2FsZW5kYXJfcGFyYW1zX2Fyci5odG1sX2lkICkuaGFzQ2xhc3MoICdoYXNEYXRlcGljaycgKSApXHQvLyBJZiB0aGUgY2FsZW5kYXIgd2l0aCB0aGUgc2FtZSBCb29raW5nIHJlc291cmNlIGFscmVhZHkgIGhhcyBiZWVuIGFjdGl2YXRlZCwgdGhlbiBleGlzdC5cclxuXHQpe1xyXG5cdCAgIHJldHVybiBmYWxzZTtcclxuXHR9XHJcblxyXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0Ly8gQ29uZmlndXJlIGFuZCBzaG93IGNhbGVuZGFyXHJcblx0alF1ZXJ5KCAnIycgKyBjYWxlbmRhcl9wYXJhbXNfYXJyLmh0bWxfaWQgKS50ZXh0KCAnJyApO1xyXG5cdGpRdWVyeSggJyMnICsgY2FsZW5kYXJfcGFyYW1zX2Fyci5odG1sX2lkICkuZGF0ZXBpY2soe1xyXG5cdFx0XHRcdFx0YmVmb3JlU2hvd0RheTogXHRmdW5jdGlvbiAoIGRhdGUgKXtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gd3BiY19faW5saW5lX2Jvb2tpbmdfY2FsZW5kYXJfX2FwcGx5X2Nzc190b19kYXlzKCBkYXRlLCBjYWxlbmRhcl9wYXJhbXNfYXJyLCB0aGlzICk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0sXHJcbiAgICAgICAgICAgICAgICAgICAgb25TZWxlY3Q6IFx0ICBcdGZ1bmN0aW9uICggZGF0ZSApe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGpRdWVyeSggJyMnICsgY2FsZW5kYXJfcGFyYW1zX2Fyci50ZXh0X2lkICkudmFsKCBkYXRlICk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly93cGJjX2JsaW5rX2VsZW1lbnQoJy53cGJjX3dpZGdldF9hdmFpbGFibGVfdW5hdmFpbGFibGUnLCAzLCAyMjApO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB3cGJjX19pbmxpbmVfYm9va2luZ19jYWxlbmRhcl9fb25fZGF5c19zZWxlY3QoIGRhdGUsIGNhbGVuZGFyX3BhcmFtc19hcnIsIHRoaXMgKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSxcclxuICAgICAgICAgICAgICAgICAgICBvbkhvdmVyOiBcdFx0ZnVuY3Rpb24gKCB2YWx1ZSwgZGF0ZSApe1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvL3dwYmNfYXZ5X19wcmVwYXJlX3Rvb2x0aXBfX2luX2NhbGVuZGFyKCB2YWx1ZSwgZGF0ZSwgY2FsZW5kYXJfcGFyYW1zX2FyciwgdGhpcyApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gd3BiY19faW5saW5lX2Jvb2tpbmdfY2FsZW5kYXJfX29uX2RheXNfaG92ZXIoIHZhbHVlLCBkYXRlLCBjYWxlbmRhcl9wYXJhbXNfYXJyLCB0aGlzICk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0sXHJcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2VNb250aFllYXI6XHRudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIHNob3dPbjogXHRcdFx0J2JvdGgnLFxyXG4gICAgICAgICAgICAgICAgICAgIG51bWJlck9mTW9udGhzOiBcdGNhbGVuZGFyX3BhcmFtc19hcnIuY2FsZW5kYXJfX3ZpZXdfX3Zpc2libGVfbW9udGhzLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0ZXBNb250aHM6XHRcdFx0MSxcclxuICAgICAgICAgICAgICAgICAgICAvLyBwcmV2VGV4dDogXHRcdFx0JyZsYXF1bzsnLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIG5leHRUZXh0OiBcdFx0XHQnJnJhcXVvOycsXHJcblx0XHRcdFx0XHRwcmV2VGV4dCAgICAgIDogJyZsc2FxdW87JyxcclxuXHRcdFx0XHRcdG5leHRUZXh0ICAgICAgOiAnJnJzYXF1bzsnLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQ6IFx0XHQneXktbW0tZGQnLC8vICdkZC5tbS55eScsXHJcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlTW9udGg6IFx0XHRmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VZZWFyOiBcdFx0ZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgbWluRGF0ZTogXHRcdFx0XHRcdCAwLFx0XHQvL251bGwsICAvL1Njcm9sbCBhcyBsb25nIGFzIHlvdSBuZWVkXHJcblx0XHRcdFx0XHRtYXhEYXRlOiBcdFx0XHRcdFx0JzEweScsXHQvLyBtaW5EYXRlOiBuZXcgRGF0ZSgyMDIwLCAyLCAxKSwgbWF4RGF0ZTogbmV3IERhdGUoMjAyMCwgOSwgMzEpLCBcdC8vIEFiaWxpdHkgdG8gc2V0IGFueSAgc3RhcnQgYW5kIGVuZCBkYXRlIGluIGNhbGVuZGFyXHJcbiAgICAgICAgICAgICAgICAgICAgc2hvd1N0YXR1czogXHRcdGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlQXRUb3A6IFx0XHRmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBmaXJzdERheTpcdFx0XHRjYWxlbmRhcl9wYXJhbXNfYXJyLmNhbGVuZGFyX19zdGFydF93ZWVrX2RheSxcclxuICAgICAgICAgICAgICAgICAgICBnb3RvQ3VycmVudDogXHRcdGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGhpZGVJZk5vUHJldk5leHQ6XHR0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIG11bHRpU2VwYXJhdG9yOiBcdCcsICcsXHJcblx0XHRcdFx0XHRtdWx0aVNlbGVjdDogKCgnZHluYW1pYycgPT0gY2FsZW5kYXJfcGFyYW1zX2Fyci5jYWxlbmRhcl9fZGF5c19zZWxlY3Rpb25fbW9kZSkgPyAwIDogMzY1KSxcdFx0XHQvLyBNYXhpbXVtIG51bWJlciBvZiBzZWxlY3RhYmxlIGRhdGVzOlx0IFNpbmdsZSBkYXkgPSAwLCAgbXVsdGkgZGF5cyA9IDM2NVxyXG5cdFx0XHRcdFx0cmFuZ2VTZWxlY3Q6ICAoJ2R5bmFtaWMnID09IGNhbGVuZGFyX3BhcmFtc19hcnIuY2FsZW5kYXJfX2RheXNfc2VsZWN0aW9uX21vZGUpLFxyXG5cdFx0XHRcdFx0cmFuZ2VTZXBhcmF0b3I6IFx0JyB+ICcsXHRcdFx0XHRcdC8vJyAtICcsXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc2hvd1dlZWtzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHVzZVRoZW1lUm9sbGVyOlx0XHRmYWxzZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG5cdHJldHVybiAgdHJ1ZTtcclxufVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogQXBwbHkgQ1NTIHRvIGNhbGVuZGFyIGRhdGUgY2VsbHNcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBkYXRlXHRcdFx0XHRcdC0gIEphdmFTY3JpcHQgRGF0ZSBPYmo6ICBcdFx0TW9uIERlYyAxMSAyMDIzIDAwOjAwOjAwIEdNVCswMjAwIChFYXN0ZXJuIEV1cm9wZWFuIFN0YW5kYXJkIFRpbWUpXHJcblx0ICogQHBhcmFtIGNhbGVuZGFyX3BhcmFtc19hcnJcdC0gIENhbGVuZGFyIFNldHRpbmdzIE9iamVjdDogIFx0e1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcImh0bWxfaWRcIjogXCJjYWxlbmRhcl9ib29raW5nNFwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcInRleHRfaWRcIjogXCJkYXRlX2Jvb2tpbmc0XCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwiY2FsZW5kYXJfX3N0YXJ0X3dlZWtfZGF5XCI6IDEsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwiY2FsZW5kYXJfX3ZpZXdfX3Zpc2libGVfbW9udGhzXCI6IDEyLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcInJlc291cmNlX2lkXCI6IDQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwiYWp4X25vbmNlX2NhbGVuZGFyXCI6IFwiPGlucHV0IHR5cGU9XFxcImhpZGRlblxcXCIgLi4uIC8+XCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwiYm9va2VkX2RhdGVzXCI6IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCIxMi0yOC0yMDIyXCI6IFtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJib29raW5nX2RhdGVcIjogXCIyMDIyLTEyLTI4IDAwOjAwOjAwXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJhcHByb3ZlZFwiOiBcIjFcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcImJvb2tpbmdfaWRcIjogXCIyNlwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgfVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRdLCAuLi5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnc2Vhc29uX2F2YWlsYWJpbGl0eSc6e1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiMjAyMy0wMS0wOVwiOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiMjAyMy0wMS0xMFwiOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiMjAyMy0wMS0xMVwiOiB0cnVlLCAuLi5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICB9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0ICogQHBhcmFtIGRhdGVwaWNrX3RoaXNcdFx0XHQtIHRoaXMgb2YgZGF0ZXBpY2sgT2JqXHJcblx0ICpcclxuXHQgKiBAcmV0dXJucyBbYm9vbGVhbixzdHJpbmddXHQtIFsge3RydWUgLWF2YWlsYWJsZSB8IGZhbHNlIC0gdW5hdmFpbGFibGV9LCAnQ1NTIGNsYXNzZXMgZm9yIGNhbGVuZGFyIGRheSBjZWxsJyBdXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19faW5saW5lX2Jvb2tpbmdfY2FsZW5kYXJfX2FwcGx5X2Nzc190b19kYXlzKCBkYXRlLCBjYWxlbmRhcl9wYXJhbXNfYXJyLCBkYXRlcGlja190aGlzICl7XHJcblxyXG5cdFx0dmFyIHRvZGF5X2RhdGUgPSBuZXcgRGF0ZSggX3dwYmMuZ2V0X290aGVyX3BhcmFtKCAndG9kYXlfYXJyJyApWyAwIF0sIChwYXJzZUludCggX3dwYmMuZ2V0X290aGVyX3BhcmFtKCAndG9kYXlfYXJyJyApWyAxIF0gKSAtIDEpLCBfd3BiYy5nZXRfb3RoZXJfcGFyYW0oICd0b2RheV9hcnInIClbIDIgXSwgMCwgMCwgMCApO1xyXG5cdFx0dmFyIHJlYWxfdG9kYXlfZGF0ZSA9IG5ldyBEYXRlKCBfd3BiYy5nZXRfb3RoZXJfcGFyYW0oICd0aW1lX2xvY2FsX2FycicgKVsgMCBdLCAocGFyc2VJbnQoIF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ3RpbWVfbG9jYWxfYXJyJyApWyAxIF0gKSAtIDEpLCBfd3BiYy5nZXRfb3RoZXJfcGFyYW0oICd0aW1lX2xvY2FsX2FycicgKVsgMiBdLCAwLCAwLCAwICk7XHJcblxyXG5cdFx0dmFyIGNsYXNzX2RheSAgPSAoIGRhdGUuZ2V0TW9udGgoKSArIDEgKSArICctJyArIGRhdGUuZ2V0RGF0ZSgpICsgJy0nICsgZGF0ZS5nZXRGdWxsWWVhcigpO1x0XHRcdFx0XHRcdC8vICcxLTktMjAyMydcclxuXHRcdHZhciBzcWxfY2xhc3NfZGF5ID0gd3BiY19fZ2V0X19zcWxfY2xhc3NfZGF0ZSggZGF0ZSApO1x0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gJzIwMjMtMDEtMDknXHJcblxyXG5cdFx0dmFyIGNzc19kYXRlX19zdGFuZGFyZCAgID0gICdjYWw0ZGF0ZS0nICsgY2xhc3NfZGF5O1xyXG5cdFx0dmFyIGNzc19kYXRlX19hZGRpdGlvbmFsID0gJyB3cGJjX3dlZWtkYXlfJyArIGRhdGUuZ2V0RGF5KCkgKyAnICc7XHJcblxyXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHRcdC8vIFdFRUtEQVlTIDo6IFNldCB1bmF2YWlsYWJsZSB3ZWVrIGRheXMgZnJvbSAtIFNldHRpbmdzIEdlbmVyYWwgcGFnZSBpbiBcIkF2YWlsYWJpbGl0eVwiIHNlY3Rpb25cclxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ2F2YWlsYWJpbGl0eV9fd2Vla19kYXlzX3VuYXZhaWxhYmxlJyApLmxlbmd0aDsgaSsrICl7XHJcblx0XHRcdGlmICggZGF0ZS5nZXREYXkoKSA9PSBfd3BiYy5nZXRfb3RoZXJfcGFyYW0oICdhdmFpbGFiaWxpdHlfX3dlZWtfZGF5c191bmF2YWlsYWJsZScgKVsgaSBdICkge1xyXG5cdFx0XHRcdHJldHVybiBbICEhZmFsc2UsIGNzc19kYXRlX19zdGFuZGFyZCArICcgZGF0ZV91c2VyX3VuYXZhaWxhYmxlJyBcdCsgJyB3ZWVrZGF5c191bmF2YWlsYWJsZScgXTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0Ly8gMTAuOS42LjMuXHJcblx0XHR2YXIgZGF0ZV9taWRuaWdodCA9IG5ldyBEYXRlKCBwYXJzZUludCggZGF0ZS5nZXRGdWxsWWVhcigpICksIChwYXJzZUludCggZGF0ZS5nZXRNb250aCgpICkgLSAwKSwgcGFyc2VJbnQoIGRhdGUuZ2V0RGF0ZSgpICksIDAsIDAsIDAgKTtcclxuXHRcdC8vIEJFRk9SRV9BRlRFUiA6OiBTZXQgdW5hdmFpbGFibGUgZGF5cyBCZWZvcmUgLyBBZnRlciB0aGUgVG9kYXkgZGF0ZS5cclxuXHRcdC8vaWYgKCAoKHdwYmNfZGF0ZXNfX2RheXNfYmV0d2VlbiggZGF0ZSwgcmVhbF90b2RheV9kYXRlICkpIDwgcGFyc2VJbnQoIF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ2F2YWlsYWJpbGl0eV9fdW5hdmFpbGFibGVfZnJvbV90b2RheScgKSApKVxyXG5cdFx0aWYgKFxyXG5cdFx0XHQoICh0b2RheV9kYXRlLmdldFRpbWUoKSAtIGRhdGVfbWlkbmlnaHQuZ2V0VGltZSgpICkgPiAwIClcclxuXHRcdFx0fHwgKFxyXG5cdFx0XHRcdChwYXJzZUludCggJzAnICsgcGFyc2VJbnQoIF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ2F2YWlsYWJpbGl0eV9fYXZhaWxhYmxlX2Zyb21fdG9kYXknICkgKSApID4gMClcclxuXHRcdFx0XHQmJiAod3BiY19kYXRlc19fZGF5c19iZXR3ZWVuKCBkYXRlX21pZG5pZ2h0LCByZWFsX3RvZGF5X2RhdGUgKSA+PSBwYXJzZUludCggJzAnICsgcGFyc2VJbnQoIF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ2F2YWlsYWJpbGl0eV9fYXZhaWxhYmxlX2Zyb21fdG9kYXknICkgKSApKVxyXG5cdFx0XHQpXHJcblx0XHQpIHtcclxuXHRcdFx0cmV0dXJuIFsgZmFsc2UsIGNzc19kYXRlX19zdGFuZGFyZCArICcgZGF0ZV91c2VyX3VuYXZhaWxhYmxlJyArICcgYmVmb3JlX2FmdGVyX3VuYXZhaWxhYmxlJyBdO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFNFQVNPTlMgOjogIFx0XHRcdFx0XHRCb29raW5nID4gUmVzb3VyY2VzID4gQXZhaWxhYmlsaXR5IHBhZ2VcclxuXHRcdHZhciAgICBpc19kYXRlX2F2YWlsYWJsZSA9IGNhbGVuZGFyX3BhcmFtc19hcnIuc2Vhc29uX2F2YWlsYWJpbGl0eVsgc3FsX2NsYXNzX2RheSBdO1xyXG5cdFx0aWYgKCBmYWxzZSA9PT0gaXNfZGF0ZV9hdmFpbGFibGUgKXtcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRml4SW46IDkuNS40LjQuXHJcblx0XHRcdHJldHVybiBbICEhZmFsc2UsIGNzc19kYXRlX19zdGFuZGFyZCArICcgZGF0ZV91c2VyX3VuYXZhaWxhYmxlJ1x0XHQrICcgc2Vhc29uX3VuYXZhaWxhYmxlJyBdO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFJFU09VUkNFX1VOQVZBSUxBQkxFIDo6ICAgXHRCb29raW5nID4gQXZhaWxhYmlsaXR5IHBhZ2VcclxuXHRcdGlmICggd3BiY19pbl9hcnJheShjYWxlbmRhcl9wYXJhbXNfYXJyLnJlc291cmNlX3VuYXZhaWxhYmxlX2RhdGVzLCBzcWxfY2xhc3NfZGF5ICkgKXtcclxuXHRcdFx0aXNfZGF0ZV9hdmFpbGFibGUgPSBmYWxzZTtcclxuXHRcdH1cclxuXHRcdGlmICggIGZhbHNlID09PSBpc19kYXRlX2F2YWlsYWJsZSApe1x0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRml4SW46IDkuNS40LjQuXHJcblx0XHRcdHJldHVybiBbICFmYWxzZSwgY3NzX2RhdGVfX3N0YW5kYXJkICsgJyBkYXRlX3VzZXJfdW5hdmFpbGFibGUnXHRcdCsgJyByZXNvdXJjZV91bmF2YWlsYWJsZScgXTtcclxuXHRcdH1cclxuXHJcblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHJcblx0XHQvLyBJcyBhbnkgYm9va2luZ3MgaW4gdGhpcyBkYXRlID9cclxuXHRcdGlmICggJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiggY2FsZW5kYXJfcGFyYW1zX2Fyci5ib29rZWRfZGF0ZXNbIGNsYXNzX2RheSBdICkgKSB7XHJcblxyXG5cdFx0XHR2YXIgYm9va2luZ3NfaW5fZGF0ZSA9IGNhbGVuZGFyX3BhcmFtc19hcnIuYm9va2VkX2RhdGVzWyBjbGFzc19kYXkgXTtcclxuXHJcblxyXG5cdFx0XHRpZiAoICd1bmRlZmluZWQnICE9PSB0eXBlb2YoIGJvb2tpbmdzX2luX2RhdGVbICdzZWNfMCcgXSApICkge1x0XHRcdC8vIFwiRnVsbCBkYXlcIiBib29raW5nICAtPiAoc2Vjb25kcyA9PSAwKVxyXG5cclxuXHRcdFx0XHRjc3NfZGF0ZV9fYWRkaXRpb25hbCArPSAoICcwJyA9PT0gYm9va2luZ3NfaW5fZGF0ZVsgJ3NlY18wJyBdLmFwcHJvdmVkICkgPyAnIGRhdGUyYXBwcm92ZSAnIDogJyBkYXRlX2FwcHJvdmVkICc7XHRcdFx0XHQvLyBQZW5kaW5nID0gJzAnIHwgIEFwcHJvdmVkID0gJzEnXHJcblx0XHRcdFx0Y3NzX2RhdGVfX2FkZGl0aW9uYWwgKz0gJyBmdWxsX2RheV9ib29raW5nJztcclxuXHJcblx0XHRcdFx0cmV0dXJuIFsgIWZhbHNlLCBjc3NfZGF0ZV9fc3RhbmRhcmQgKyBjc3NfZGF0ZV9fYWRkaXRpb25hbCBdO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggT2JqZWN0LmtleXMoIGJvb2tpbmdzX2luX2RhdGUgKS5sZW5ndGggPiAwICl7XHRcdFx0XHQvLyBcIlRpbWUgc2xvdHNcIiBCb29raW5nc1xyXG5cclxuXHRcdFx0XHR2YXIgaXNfYXBwcm92ZWQgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRfLmVhY2goIGJvb2tpbmdzX2luX2RhdGUsIGZ1bmN0aW9uICggcF92YWwsIHBfa2V5LCBwX2RhdGEgKSB7XHJcblx0XHRcdFx0XHRpZiAoICFwYXJzZUludCggcF92YWwuYXBwcm92ZWQgKSApe1xyXG5cdFx0XHRcdFx0XHRpc19hcHByb3ZlZCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0dmFyIHRzID0gcF92YWwuYm9va2luZ19kYXRlLnN1YnN0cmluZyggcF92YWwuYm9va2luZ19kYXRlLmxlbmd0aCAtIDEgKTtcclxuXHRcdFx0XHRcdGlmICggdHJ1ZSA9PT0gX3dwYmMuZ2V0X290aGVyX3BhcmFtKCAnaXNfZW5hYmxlZF9jaGFuZ2Vfb3ZlcicgKSApe1xyXG5cdFx0XHRcdFx0XHRpZiAoIHRzID09ICcxJyApIHsgY3NzX2RhdGVfX2FkZGl0aW9uYWwgKz0gJyBjaGVja19pbl90aW1lJyArICgocGFyc2VJbnQocF92YWwuYXBwcm92ZWQpKSA/ICcgY2hlY2tfaW5fdGltZV9kYXRlX2FwcHJvdmVkJyA6ICcgY2hlY2tfaW5fdGltZV9kYXRlMmFwcHJvdmUnKTsgfVxyXG5cdFx0XHRcdFx0XHRpZiAoIHRzID09ICcyJyApIHsgY3NzX2RhdGVfX2FkZGl0aW9uYWwgKz0gJyBjaGVja19vdXRfdGltZScgKyAoKHBhcnNlSW50KHBfdmFsLmFwcHJvdmVkKSkgPyAnIGNoZWNrX291dF90aW1lX2RhdGVfYXBwcm92ZWQnIDogJyBjaGVja19vdXRfdGltZV9kYXRlMmFwcHJvdmUnKTsgfVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0aWYgKCAhIGlzX2FwcHJvdmVkICl7XHJcblx0XHRcdFx0XHRjc3NfZGF0ZV9fYWRkaXRpb25hbCArPSAnIGRhdGUyYXBwcm92ZSB0aW1lc3BhcnRseSdcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Y3NzX2RhdGVfX2FkZGl0aW9uYWwgKz0gJyBkYXRlX2FwcHJvdmVkIHRpbWVzcGFydGx5J1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCAhIF93cGJjLmdldF9vdGhlcl9wYXJhbSggJ2lzX2VuYWJsZWRfY2hhbmdlX292ZXInICkgKXtcclxuXHRcdFx0XHRcdGNzc19kYXRlX19hZGRpdGlvbmFsICs9ICcgdGltZXNfY2xvY2snXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdFx0cmV0dXJuIFsgdHJ1ZSwgY3NzX2RhdGVfX3N0YW5kYXJkICsgY3NzX2RhdGVfX2FkZGl0aW9uYWwgKyAnIGRhdGVfYXZhaWxhYmxlJyBdO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGx5IHNvbWUgQ1NTIGNsYXNzZXMsIHdoZW4gd2UgbW91c2Ugb3ZlciBzcGVjaWZpYyBkYXRlcyBpbiBjYWxlbmRhclxyXG5cdCAqIEBwYXJhbSB2YWx1ZVxyXG5cdCAqIEBwYXJhbSBkYXRlXHRcdFx0XHRcdC0gIEphdmFTY3JpcHQgRGF0ZSBPYmo6ICBcdFx0TW9uIERlYyAxMSAyMDIzIDAwOjAwOjAwIEdNVCswMjAwIChFYXN0ZXJuIEV1cm9wZWFuIFN0YW5kYXJkIFRpbWUpXHJcblx0ICogQHBhcmFtIGNhbGVuZGFyX3BhcmFtc19hcnJcdC0gIENhbGVuZGFyIFNldHRpbmdzIE9iamVjdDogIFx0e1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcImh0bWxfaWRcIjogXCJjYWxlbmRhcl9ib29raW5nNFwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcInRleHRfaWRcIjogXCJkYXRlX2Jvb2tpbmc0XCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwiY2FsZW5kYXJfX3N0YXJ0X3dlZWtfZGF5XCI6IDEsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwiY2FsZW5kYXJfX3ZpZXdfX3Zpc2libGVfbW9udGhzXCI6IDEyLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcInJlc291cmNlX2lkXCI6IDQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwiYWp4X25vbmNlX2NhbGVuZGFyXCI6IFwiPGlucHV0IHR5cGU9XFxcImhpZGRlblxcXCIgLi4uIC8+XCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwiYm9va2VkX2RhdGVzXCI6IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCIxMi0yOC0yMDIyXCI6IFtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJib29raW5nX2RhdGVcIjogXCIyMDIyLTEyLTI4IDAwOjAwOjAwXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJhcHByb3ZlZFwiOiBcIjFcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcImJvb2tpbmdfaWRcIjogXCIyNlwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgfVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRdLCAuLi5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnc2Vhc29uX2F2YWlsYWJpbGl0eSc6e1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiMjAyMy0wMS0wOVwiOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiMjAyMy0wMS0xMFwiOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiMjAyMy0wMS0xMVwiOiB0cnVlLCAuLi5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICB9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0ICogQHBhcmFtIGRhdGVwaWNrX3RoaXNcdFx0XHQtIHRoaXMgb2YgZGF0ZXBpY2sgT2JqXHJcblx0ICpcclxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX19pbmxpbmVfYm9va2luZ19jYWxlbmRhcl9fb25fZGF5c19ob3ZlciggdmFsdWUsIGRhdGUsIGNhbGVuZGFyX3BhcmFtc19hcnIsIGRhdGVwaWNrX3RoaXMgKXtcclxuXHJcblx0XHRpZiAoIG51bGwgPT09IGRhdGUgKXtcclxuXHRcdFx0alF1ZXJ5KCAnLmRhdGVwaWNrLWRheXMtY2VsbC1vdmVyJyApLnJlbW92ZUNsYXNzKCAnZGF0ZXBpY2stZGF5cy1jZWxsLW92ZXInICk7ICAgXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciBhbGwgaGlnaGxpZ2h0IGRheXMgc2VsZWN0aW9uc1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGluc3QgPSBqUXVlcnkuZGF0ZXBpY2suX2dldEluc3QoIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnY2FsZW5kYXJfYm9va2luZycgKyBjYWxlbmRhcl9wYXJhbXNfYXJyLnJlc291cmNlX2lkICkgKTtcclxuXHJcblx0XHRpZiAoXHJcblx0XHRcdCAgICggMSA9PSBpbnN0LmRhdGVzLmxlbmd0aClcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBJZiB3ZSBoYXZlIG9uZSBzZWxlY3RlZCBkYXRlXHJcblx0XHRcdCYmICgnZHluYW1pYycgPT09IGNhbGVuZGFyX3BhcmFtc19hcnIuY2FsZW5kYXJfX2RheXNfc2VsZWN0aW9uX21vZGUpIFx0XHRcdFx0XHQvLyB3aGlsZSBoYXZlIHJhbmdlIGRheXMgc2VsZWN0aW9uIG1vZGVcclxuXHRcdCl7XHJcblxyXG5cdFx0XHR2YXIgdGRfY2xhc3M7XHJcblx0XHRcdHZhciB0ZF9vdmVycyA9IFtdO1xyXG5cdFx0XHR2YXIgaXNfY2hlY2sgPSB0cnVlO1xyXG4gICAgICAgICAgICB2YXIgc2VsY2V0ZWRfZmlyc3RfZGF5ID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgc2VsY2V0ZWRfZmlyc3RfZGF5LnNldEZ1bGxZZWFyKGluc3QuZGF0ZXNbMF0uZ2V0RnVsbFllYXIoKSwoaW5zdC5kYXRlc1swXS5nZXRNb250aCgpKSwgKGluc3QuZGF0ZXNbMF0uZ2V0RGF0ZSgpICkgKTsgLy9HZXQgZmlyc3QgRGF0ZVxyXG5cclxuICAgICAgICAgICAgd2hpbGUoICBpc19jaGVjayApe1xyXG5cclxuXHRcdFx0XHR0ZF9jbGFzcyA9IChzZWxjZXRlZF9maXJzdF9kYXkuZ2V0TW9udGgoKSArIDEpICsgJy0nICsgc2VsY2V0ZWRfZmlyc3RfZGF5LmdldERhdGUoKSArICctJyArIHNlbGNldGVkX2ZpcnN0X2RheS5nZXRGdWxsWWVhcigpO1xyXG5cclxuXHRcdFx0XHR0ZF9vdmVyc1sgdGRfb3ZlcnMubGVuZ3RoIF0gPSAnI2NhbGVuZGFyX2Jvb2tpbmcnICsgY2FsZW5kYXJfcGFyYW1zX2Fyci5yZXNvdXJjZV9pZCArICcgLmNhbDRkYXRlLScgKyB0ZF9jbGFzczsgICAgICAgICAgICAgIC8vIGFkZCB0byBhcnJheSBmb3IgbGF0ZXIgbWFrZSBzZWxlY3Rpb24gYnkgY2xhc3NcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcblx0XHRcdFx0XHQoICAoIGRhdGUuZ2V0TW9udGgoKSA9PSBzZWxjZXRlZF9maXJzdF9kYXkuZ2V0TW9udGgoKSApICAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICggZGF0ZS5nZXREYXRlKCkgPT0gc2VsY2V0ZWRfZmlyc3RfZGF5LmdldERhdGUoKSApICAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICggZGF0ZS5nZXRGdWxsWWVhcigpID09IHNlbGNldGVkX2ZpcnN0X2RheS5nZXRGdWxsWWVhcigpIClcclxuXHRcdFx0XHRcdCkgfHwgKCBzZWxjZXRlZF9maXJzdF9kYXkgPiBkYXRlIClcclxuXHRcdFx0XHQpe1xyXG5cdFx0XHRcdFx0aXNfY2hlY2sgPSAgZmFsc2U7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRzZWxjZXRlZF9maXJzdF9kYXkuc2V0RnVsbFllYXIoIHNlbGNldGVkX2ZpcnN0X2RheS5nZXRGdWxsWWVhcigpLCAoc2VsY2V0ZWRfZmlyc3RfZGF5LmdldE1vbnRoKCkpLCAoc2VsY2V0ZWRfZmlyc3RfZGF5LmdldERhdGUoKSArIDEpICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEhpZ2hsaWdodCBEYXlzXHJcblx0XHRcdGZvciAoIHZhciBpPTA7IGkgPCB0ZF9vdmVycy5sZW5ndGggOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGNsYXNzIHRvIGFsbCBlbGVtZW50c1xyXG5cdFx0XHRcdGpRdWVyeSggdGRfb3ZlcnNbaV0gKS5hZGRDbGFzcygnZGF0ZXBpY2stZGF5cy1jZWxsLW92ZXInKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdCAgICByZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBPbiBEQVlzIHNlbGVjdGlvbiBpbiBjYWxlbmRhclxyXG5cdCAqXHJcblx0ICogQHBhcmFtIGRhdGVzX3NlbGVjdGlvblx0XHQtICBzdHJpbmc6XHRcdFx0ICcyMDIzLTAzLTA3IH4gMjAyMy0wMy0wNycgb3IgJzIwMjMtMDQtMTAsIDIwMjMtMDQtMTIsIDIwMjMtMDQtMDIsIDIwMjMtMDQtMDQnXHJcblx0ICogQHBhcmFtIGNhbGVuZGFyX3BhcmFtc19hcnJcdC0gIENhbGVuZGFyIFNldHRpbmdzIE9iamVjdDogIFx0e1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcImh0bWxfaWRcIjogXCJjYWxlbmRhcl9ib29raW5nNFwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcInRleHRfaWRcIjogXCJkYXRlX2Jvb2tpbmc0XCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwiY2FsZW5kYXJfX3N0YXJ0X3dlZWtfZGF5XCI6IDEsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwiY2FsZW5kYXJfX3ZpZXdfX3Zpc2libGVfbW9udGhzXCI6IDEyLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBcInJlc291cmNlX2lkXCI6IDQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwiYWp4X25vbmNlX2NhbGVuZGFyXCI6IFwiPGlucHV0IHR5cGU9XFxcImhpZGRlblxcXCIgLi4uIC8+XCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIFwiYm9va2VkX2RhdGVzXCI6IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCIxMi0yOC0yMDIyXCI6IFtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJib29raW5nX2RhdGVcIjogXCIyMDIyLTEyLTI4IDAwOjAwOjAwXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJhcHByb3ZlZFwiOiBcIjFcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcImJvb2tpbmdfaWRcIjogXCIyNlwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgfVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRdLCAuLi5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnc2Vhc29uX2F2YWlsYWJpbGl0eSc6e1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiMjAyMy0wMS0wOVwiOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiMjAyMy0wMS0xMFwiOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiMjAyMy0wMS0xMVwiOiB0cnVlLCAuLi5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICB9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0ICogQHBhcmFtIGRhdGVwaWNrX3RoaXNcdFx0XHQtIHRoaXMgb2YgZGF0ZXBpY2sgT2JqXHJcblx0ICpcclxuXHQgKiBAcmV0dXJucyBib29sZWFuXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19faW5saW5lX2Jvb2tpbmdfY2FsZW5kYXJfX29uX2RheXNfc2VsZWN0KCBkYXRlc19zZWxlY3Rpb24sIGNhbGVuZGFyX3BhcmFtc19hcnIsIGRhdGVwaWNrX3RoaXMgPSBudWxsICl7XHJcblxyXG5cdFx0dmFyIGluc3QgPSBqUXVlcnkuZGF0ZXBpY2suX2dldEluc3QoIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnY2FsZW5kYXJfYm9va2luZycgKyBjYWxlbmRhcl9wYXJhbXNfYXJyLnJlc291cmNlX2lkICkgKTtcclxuXHJcblx0XHR2YXIgZGF0ZXNfYXJyID0gW107XHQvLyAgWyBcIjIwMjMtMDQtMDlcIiwgXCIyMDIzLTA0LTEwXCIsIFwiMjAyMy0wNC0xMVwiIF1cclxuXHJcblx0XHRpZiAoIC0xICE9PSBkYXRlc19zZWxlY3Rpb24uaW5kZXhPZiggJ34nICkgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJhbmdlIERheXNcclxuXHJcblx0XHRcdGRhdGVzX2FyciA9IHdwYmNfZ2V0X2RhdGVzX2Fycl9fZnJvbV9kYXRlc19yYW5nZV9qcygge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2RhdGVzX3NlcGFyYXRvcicgOiAnIH4gJywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICcgfiAnXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnZGF0ZXMnICAgICAgICAgICA6IGRhdGVzX3NlbGVjdGlvbiwgICAgXHRcdCAgIC8vICcyMDIzLTA0LTA0IH4gMjAyMy0wNC0wNydcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0fSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE11bHRpcGxlIERheXNcclxuXHRcdFx0ZGF0ZXNfYXJyID0gd3BiY19nZXRfZGF0ZXNfYXJyX19mcm9tX2RhdGVzX2NvbW1hX3NlcGFyYXRlZF9qcygge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2RhdGVzX3NlcGFyYXRvcicgOiAnLCAnLCAgICAgICAgICAgICAgICAgICAgICAgICBcdC8vICAnLCAnXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnZGF0ZXMnICAgICAgICAgICA6IGRhdGVzX3NlbGVjdGlvbiwgICAgXHRcdFx0Ly8gJzIwMjMtMDQtMTAsIDIwMjMtMDQtMTIsIDIwMjMtMDQtMDIsIDIwMjMtMDQtMDQnXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdHdwYmNfYXZ5X2FmdGVyX2RheXNfc2VsZWN0aW9uX19zaG93X2hlbHBfaW5mbyh7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnY2FsZW5kYXJfX2RheXNfc2VsZWN0aW9uX21vZGUnOiBjYWxlbmRhcl9wYXJhbXNfYXJyLmNhbGVuZGFyX19kYXlzX3NlbGVjdGlvbl9tb2RlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2RhdGVzX2FycicgICAgICAgICAgICAgICAgICAgIDogZGF0ZXNfYXJyLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2RhdGVzX2NsaWNrX251bScgICAgICAgICAgICAgIDogaW5zdC5kYXRlcy5sZW5ndGgsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQncG9wb3Zlcl9oaW50cydcdFx0XHRcdFx0OiBjYWxlbmRhcl9wYXJhbXNfYXJyLnBvcG92ZXJfaGludHNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9ICk7XHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTaG93IGhlbHAgaW5mbyBhdCB0aGUgdG9wICB0b29sYmFyIGFib3V0IHNlbGVjdGVkIGRhdGVzIGFuZCBmdXR1cmUgYWN0aW9uc1xyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSBwYXJhbXNcclxuXHRcdCAqIFx0XHRcdFx0XHRFeGFtcGxlIDE6ICB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjYWxlbmRhcl9fZGF5c19zZWxlY3Rpb25fbW9kZTogXCJkeW5hbWljXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRlc19hcnI6ICBbIFwiMjAyMy0wNC0wM1wiIF0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRlc19jbGlja19udW06IDFcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdwb3BvdmVyX2hpbnRzJ1x0XHRcdFx0XHQ6IGNhbGVuZGFyX3BhcmFtc19hcnIucG9wb3Zlcl9oaW50c1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdCAqIFx0XHRcdFx0XHRFeGFtcGxlIDI6ICB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjYWxlbmRhcl9fZGF5c19zZWxlY3Rpb25fbW9kZTogXCJkeW5hbWljXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGVzX2FycjogQXJyYXkoMTApIFsgXCIyMDIzLTA0LTAzXCIsIFwiMjAyMy0wNC0wNFwiLCBcIjIwMjMtMDQtMDVcIiwg4oCmIF1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGVzX2NsaWNrX251bTogMlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3BvcG92ZXJfaGludHMnXHRcdFx0XHRcdDogY2FsZW5kYXJfcGFyYW1zX2Fyci5wb3BvdmVyX2hpbnRzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0ICovXHJcblx0XHRmdW5jdGlvbiB3cGJjX2F2eV9hZnRlcl9kYXlzX3NlbGVjdGlvbl9fc2hvd19oZWxwX2luZm8oIHBhcmFtcyApe1xyXG4vLyBjb25zb2xlLmxvZyggcGFyYW1zICk7XHQvL1x0XHRbIFwiMjAyMy0wNC0wOVwiLCBcIjIwMjMtMDQtMTBcIiwgXCIyMDIzLTA0LTExXCIgXVxyXG5cclxuXHRcdFx0dmFyIG1lc3NhZ2UsIGNvbG9yO1xyXG5cdFx0XHRpZiAoalF1ZXJ5KCAnI3VpX2J0bl9hdnlfX3NldF9kYXlzX2F2YWlsYWJpbGl0eV9fYXZhaWxhYmxlJykuaXMoJzpjaGVja2VkJykpe1xyXG5cdFx0XHRcdCBtZXNzYWdlID0gcGFyYW1zLnBvcG92ZXJfaGludHMudG9vbGJhcl90ZXh0X2F2YWlsYWJsZTsvLydTZXQgZGF0ZXMgX0RBVEVTXyBhcyBfSFRNTF8gYXZhaWxhYmxlLic7XHJcblx0XHRcdFx0IGNvbG9yID0gJyMxMWJlNGMnO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdG1lc3NhZ2UgPSBwYXJhbXMucG9wb3Zlcl9oaW50cy50b29sYmFyX3RleHRfdW5hdmFpbGFibGU7Ly8nU2V0IGRhdGVzIF9EQVRFU18gYXMgX0hUTUxfIHVuYXZhaWxhYmxlLic7XHJcblx0XHRcdFx0Y29sb3IgPSAnI2U0MzkzOSc7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG1lc3NhZ2UgPSAnPHNwYW4+JyArIG1lc3NhZ2UgKyAnPC9zcGFuPic7XHJcblxyXG5cdFx0XHR2YXIgZmlyc3RfZGF0ZSA9IHBhcmFtc1sgJ2RhdGVzX2FycicgXVsgMCBdO1xyXG5cdFx0XHR2YXIgbGFzdF9kYXRlICA9ICggJ2R5bmFtaWMnID09IHBhcmFtcy5jYWxlbmRhcl9fZGF5c19zZWxlY3Rpb25fbW9kZSApXHJcblx0XHRcdFx0XHRcdFx0PyBwYXJhbXNbICdkYXRlc19hcnInIF1bIChwYXJhbXNbICdkYXRlc19hcnInIF0ubGVuZ3RoIC0gMSkgXVxyXG5cdFx0XHRcdFx0XHRcdDogKCBwYXJhbXNbICdkYXRlc19hcnInIF0ubGVuZ3RoID4gMSApID8gcGFyYW1zWyAnZGF0ZXNfYXJyJyBdWyAxIF0gOiAnJztcclxuXHJcblx0XHRcdGZpcnN0X2RhdGUgPSBqUXVlcnkuZGF0ZXBpY2suZm9ybWF0RGF0ZSggJ2RkIE0sIHl5JywgbmV3IERhdGUoIGZpcnN0X2RhdGUgKyAnVDAwOjAwOjAwJyApICk7XHJcblx0XHRcdGxhc3RfZGF0ZSA9IGpRdWVyeS5kYXRlcGljay5mb3JtYXREYXRlKCAnZGQgTSwgeXknLCAgbmV3IERhdGUoIGxhc3RfZGF0ZSArICdUMDA6MDA6MDAnICkgKTtcclxuXHJcblxyXG5cdFx0XHRpZiAoICdkeW5hbWljJyA9PSBwYXJhbXMuY2FsZW5kYXJfX2RheXNfc2VsZWN0aW9uX21vZGUgKXtcclxuXHRcdFx0XHRpZiAoIDEgPT0gcGFyYW1zLmRhdGVzX2NsaWNrX251bSApe1xyXG5cdFx0XHRcdFx0bGFzdF9kYXRlID0gJ19fX19fX19fX19fJ1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRpZiAoICdmaXJzdF90aW1lJyA9PSBqUXVlcnkoICcud3BiY19hanhfYXZhaWxhYmlsaXR5X2NvbnRhaW5lcicgKS5hdHRyKCAnd3BiY19sb2FkZWQnICkgKXtcclxuXHRcdFx0XHRcdFx0alF1ZXJ5KCAnLndwYmNfYWp4X2F2YWlsYWJpbGl0eV9jb250YWluZXInICkuYXR0ciggJ3dwYmNfbG9hZGVkJywgJ2RvbmUnIClcclxuXHRcdFx0XHRcdFx0d3BiY19ibGlua19lbGVtZW50KCAnLndwYmNfd2lkZ2V0X2F2YWlsYWJsZV91bmF2YWlsYWJsZScsIDMsIDIyMCApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCAnX0RBVEVTXycsICAgICc8L3NwYW4+J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8rICc8ZGl2PicgKyAnZnJvbScgKyAnPC9kaXY+J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KyAnPHNwYW4gY2xhc3M9XCJ3cGJjX2JpZ19kYXRlXCI+JyArIGZpcnN0X2RhdGUgKyAnPC9zcGFuPidcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCsgJzxzcGFuPicgKyAnLScgKyAnPC9zcGFuPidcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCsgJzxzcGFuIGNsYXNzPVwid3BiY19iaWdfZGF0ZVwiPicgKyBsYXN0X2RhdGUgKyAnPC9zcGFuPidcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCsgJzxzcGFuPicgKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHQvLyBpZiAoIHBhcmFtc1sgJ2RhdGVzX2FycicgXS5sZW5ndGggPiAxICl7XHJcblx0XHRcdFx0Ly8gXHRsYXN0X2RhdGUgPSAnLCAnICsgbGFzdF9kYXRlO1xyXG5cdFx0XHRcdC8vIFx0bGFzdF9kYXRlICs9ICggcGFyYW1zWyAnZGF0ZXNfYXJyJyBdLmxlbmd0aCA+IDIgKSA/ICcsIC4uLicgOiAnJztcclxuXHRcdFx0XHQvLyB9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIFx0bGFzdF9kYXRlPScnO1xyXG5cdFx0XHRcdC8vIH1cclxuXHRcdFx0XHR2YXIgZGF0ZXNfYXJyID0gW107XHJcblx0XHRcdFx0Zm9yKCB2YXIgaSA9IDA7IGkgPCBwYXJhbXNbICdkYXRlc19hcnInIF0ubGVuZ3RoOyBpKysgKXtcclxuXHRcdFx0XHRcdGRhdGVzX2Fyci5wdXNoKCAgalF1ZXJ5LmRhdGVwaWNrLmZvcm1hdERhdGUoICdkZCBNIHl5JywgIG5ldyBEYXRlKCBwYXJhbXNbICdkYXRlc19hcnInIF1bIGkgXSArICdUMDA6MDA6MDAnICkgKSAgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Zmlyc3RfZGF0ZSA9IGRhdGVzX2Fyci5qb2luKCAnLCAnICk7XHJcblx0XHRcdFx0bWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSggJ19EQVRFU18nLCAgICAnPC9zcGFuPidcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCsgJzxzcGFuIGNsYXNzPVwid3BiY19iaWdfZGF0ZVwiPicgKyBmaXJzdF9kYXRlICsgJzwvc3Bhbj4nXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQrICc8c3Bhbj4nICk7XHJcblx0XHRcdH1cclxuXHRcdFx0bWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSggJ19IVE1MXycgLCAnPC9zcGFuPjxzcGFuIGNsYXNzPVwid3BiY19iaWdfdGV4dFwiIHN0eWxlPVwiY29sb3I6Jytjb2xvcisnO1wiPicpICsgJzxzcGFuPic7XHJcblxyXG5cdFx0XHQvL21lc3NhZ2UgKz0gJyA8ZGl2IHN0eWxlPVwibWFyZ2luLWxlZnQ6IDFlbTtcIj4nICsgJyBDbGljayBvbiBBcHBseSBidXR0b24gdG8gYXBwbHkgYXZhaWxhYmlsaXR5LicgKyAnPC9kaXY+JztcclxuXHJcblx0XHRcdG1lc3NhZ2UgPSAnPGRpdiBjbGFzcz1cIndwYmNfdG9vbGJhcl9kYXRlc19oaW50c1wiPicgKyBtZXNzYWdlICsgJzwvZGl2Pic7XHJcblxyXG5cdFx0XHRqUXVlcnkoICcud3BiY19oZWxwX3RleHQnICkuaHRtbChcdG1lc3NhZ2UgKTtcclxuXHRcdH1cclxuXHJcblx0LyoqXHJcblx0ICogICBQYXJzZSBkYXRlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogR2V0IGRhdGVzIGFycmF5LCAgZnJvbSBjb21tYSBzZXBhcmF0ZWQgZGF0ZXNcclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0gcGFyYW1zICAgICAgID0ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KiAnZGF0ZXNfc2VwYXJhdG9yJyA9PiAnLCAnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRlcyBzZXBhcmF0b3JcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCogJ2RhdGVzJyAgICAgICAgICAgPT4gJzIwMjMtMDQtMDQsIDIwMjMtMDQtMDcsIDIwMjMtMDQtMDUnICAgICAgICAgLy8gRGF0ZXMgaW4gJ1ktbS1kJyBmb3JtYXQ6ICcyMDIzLTAxLTMxJ1xyXG5cdFx0XHRcdFx0XHRcdFx0IH1cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIGFycmF5ICAgICAgPSBbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQqIFswXSA9PiAyMDIzLTA0LTA0XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQqIFsxXSA9PiAyMDIzLTA0LTA1XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQqIFsyXSA9PiAyMDIzLTA0LTA2XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQqIFszXSA9PiAyMDIzLTA0LTA3XHJcblx0XHRcdFx0XHRcdFx0XHRdXHJcblx0XHQgKlxyXG5cdFx0ICogRXhhbXBsZSAjMTogIHdwYmNfZ2V0X2RhdGVzX2Fycl9fZnJvbV9kYXRlc19jb21tYV9zZXBhcmF0ZWRfanMoICB7ICAnZGF0ZXNfc2VwYXJhdG9yJyA6ICcsICcsICdkYXRlcycgOiAnMjAyMy0wNC0wNCwgMjAyMy0wNC0wNywgMjAyMy0wNC0wNScgIH0gICk7XHJcblx0XHQgKi9cclxuXHRcdGZ1bmN0aW9uIHdwYmNfZ2V0X2RhdGVzX2Fycl9fZnJvbV9kYXRlc19jb21tYV9zZXBhcmF0ZWRfanMoIHBhcmFtcyApe1xyXG5cclxuXHRcdFx0dmFyIGRhdGVzX2FyciA9IFtdO1xyXG5cclxuXHRcdFx0aWYgKCAnJyAhPT0gcGFyYW1zWyAnZGF0ZXMnIF0gKXtcclxuXHJcblx0XHRcdFx0ZGF0ZXNfYXJyID0gcGFyYW1zWyAnZGF0ZXMnIF0uc3BsaXQoIHBhcmFtc1sgJ2RhdGVzX3NlcGFyYXRvcicgXSApO1xyXG5cclxuXHRcdFx0XHRkYXRlc19hcnIuc29ydCgpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBkYXRlc19hcnI7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBHZXQgZGF0ZXMgYXJyYXksICBmcm9tIHJhbmdlIGRheXMgc2VsZWN0aW9uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHBhcmFtcyAgICAgICA9ICB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQqICdkYXRlc19zZXBhcmF0b3InID0+ICcgfiAnLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRlcyBzZXBhcmF0b3JcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCogJ2RhdGVzJyAgICAgICAgICAgPT4gJzIwMjMtMDQtMDQgfiAyMDIzLTA0LTA3JyAgICAgIC8vIERhdGVzIGluICdZLW0tZCcgZm9ybWF0OiAnMjAyMy0wMS0zMSdcclxuXHRcdFx0XHRcdFx0XHRcdCAgfVxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm4gYXJyYXkgICAgICAgID0gW1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KiBbMF0gPT4gMjAyMy0wNC0wNFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KiBbMV0gPT4gMjAyMy0wNC0wNVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KiBbMl0gPT4gMjAyMy0wNC0wNlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KiBbM10gPT4gMjAyMy0wNC0wN1xyXG5cdFx0XHRcdFx0XHRcdFx0ICBdXHJcblx0XHQgKlxyXG5cdFx0ICogRXhhbXBsZSAjMTogIHdwYmNfZ2V0X2RhdGVzX2Fycl9fZnJvbV9kYXRlc19yYW5nZV9qcyggIHsgICdkYXRlc19zZXBhcmF0b3InIDogJyB+ICcsICdkYXRlcycgOiAnMjAyMy0wNC0wNCB+IDIwMjMtMDQtMDcnICB9ICApO1xyXG5cdFx0ICogRXhhbXBsZSAjMjogIHdwYmNfZ2V0X2RhdGVzX2Fycl9fZnJvbV9kYXRlc19yYW5nZV9qcyggIHsgICdkYXRlc19zZXBhcmF0b3InIDogJyAtICcsICdkYXRlcycgOiAnMjAyMy0wNC0wNCAtIDIwMjMtMDQtMDcnICB9ICApO1xyXG5cdFx0ICovXHJcblx0XHRmdW5jdGlvbiB3cGJjX2dldF9kYXRlc19hcnJfX2Zyb21fZGF0ZXNfcmFuZ2VfanMoIHBhcmFtcyApe1xyXG5cclxuXHRcdFx0dmFyIGRhdGVzX2FyciA9IFtdO1xyXG5cclxuXHRcdFx0aWYgKCAnJyAhPT0gcGFyYW1zWydkYXRlcyddICkge1xyXG5cclxuXHRcdFx0XHRkYXRlc19hcnIgPSBwYXJhbXNbICdkYXRlcycgXS5zcGxpdCggcGFyYW1zWyAnZGF0ZXNfc2VwYXJhdG9yJyBdICk7XHJcblx0XHRcdFx0dmFyIGNoZWNrX2luX2RhdGVfeW1kICA9IGRhdGVzX2FyclswXTtcclxuXHRcdFx0XHR2YXIgY2hlY2tfb3V0X2RhdGVfeW1kID0gZGF0ZXNfYXJyWzFdO1xyXG5cclxuXHRcdFx0XHRpZiAoICgnJyAhPT0gY2hlY2tfaW5fZGF0ZV95bWQpICYmICgnJyAhPT0gY2hlY2tfb3V0X2RhdGVfeW1kKSApe1xyXG5cclxuXHRcdFx0XHRcdGRhdGVzX2FyciA9IHdwYmNfZ2V0X2RhdGVzX2FycmF5X2Zyb21fc3RhcnRfZW5kX2RheXNfanMoIGNoZWNrX2luX2RhdGVfeW1kLCBjaGVja19vdXRfZGF0ZV95bWQgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGRhdGVzX2FycjtcclxuXHRcdH1cclxuXHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiBHZXQgZGF0ZXMgYXJyYXkgYmFzZWQgb24gc3RhcnQgYW5kIGVuZCBkYXRlcy5cclxuXHRcdFx0ICpcclxuXHRcdFx0ICogQHBhcmFtIHN0cmluZyBzU3RhcnREYXRlIC0gc3RhcnQgZGF0ZTogMjAyMy0wNC0wOVxyXG5cdFx0XHQgKiBAcGFyYW0gc3RyaW5nIHNFbmREYXRlICAgLSBlbmQgZGF0ZTogICAyMDIzLTA0LTExXHJcblx0XHRcdCAqIEByZXR1cm4gYXJyYXkgICAgICAgICAgICAgLSBbIFwiMjAyMy0wNC0wOVwiLCBcIjIwMjMtMDQtMTBcIiwgXCIyMDIzLTA0LTExXCIgXVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0ZnVuY3Rpb24gd3BiY19nZXRfZGF0ZXNfYXJyYXlfZnJvbV9zdGFydF9lbmRfZGF5c19qcyggc1N0YXJ0RGF0ZSwgc0VuZERhdGUgKXtcclxuXHJcblx0XHRcdFx0c1N0YXJ0RGF0ZSA9IG5ldyBEYXRlKCBzU3RhcnREYXRlICsgJ1QwMDowMDowMCcgKTtcclxuXHRcdFx0XHRzRW5kRGF0ZSA9IG5ldyBEYXRlKCBzRW5kRGF0ZSArICdUMDA6MDA6MDAnICk7XHJcblxyXG5cdFx0XHRcdHZhciBhRGF5cz1bXTtcclxuXHJcblx0XHRcdFx0Ly8gU3RhcnQgdGhlIHZhcmlhYmxlIG9mZiB3aXRoIHRoZSBzdGFydCBkYXRlXHJcblx0XHRcdFx0YURheXMucHVzaCggc1N0YXJ0RGF0ZS5nZXRUaW1lKCkgKTtcclxuXHJcblx0XHRcdFx0Ly8gU2V0IGEgJ3RlbXAnIHZhcmlhYmxlLCBzQ3VycmVudERhdGUsIHdpdGggdGhlIHN0YXJ0IGRhdGUgLSBiZWZvcmUgYmVnaW5uaW5nIHRoZSBsb29wXHJcblx0XHRcdFx0dmFyIHNDdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCBzU3RhcnREYXRlLmdldFRpbWUoKSApO1xyXG5cdFx0XHRcdHZhciBvbmVfZGF5X2R1cmF0aW9uID0gMjQqNjAqNjAqMTAwMDtcclxuXHJcblx0XHRcdFx0Ly8gV2hpbGUgdGhlIGN1cnJlbnQgZGF0ZSBpcyBsZXNzIHRoYW4gdGhlIGVuZCBkYXRlXHJcblx0XHRcdFx0d2hpbGUoc0N1cnJlbnREYXRlIDwgc0VuZERhdGUpe1xyXG5cdFx0XHRcdFx0Ly8gQWRkIGEgZGF5IHRvIHRoZSBjdXJyZW50IGRhdGUgXCIrMSBkYXlcIlxyXG5cdFx0XHRcdFx0c0N1cnJlbnREYXRlLnNldFRpbWUoIHNDdXJyZW50RGF0ZS5nZXRUaW1lKCkgKyBvbmVfZGF5X2R1cmF0aW9uICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gQWRkIHRoaXMgbmV3IGRheSB0byB0aGUgYURheXMgYXJyYXlcclxuXHRcdFx0XHRcdGFEYXlzLnB1c2goIHNDdXJyZW50RGF0ZS5nZXRUaW1lKCkgKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYURheXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdGFEYXlzWyBpIF0gPSBuZXcgRGF0ZSggYURheXNbaV0gKTtcclxuXHRcdFx0XHRcdGFEYXlzWyBpIF0gPSBhRGF5c1sgaSBdLmdldEZ1bGxZZWFyKClcclxuXHRcdFx0XHRcdFx0XHRcdCsgJy0nICsgKCggKGFEYXlzWyBpIF0uZ2V0TW9udGgoKSArIDEpIDwgMTApID8gJzAnIDogJycpICsgKGFEYXlzWyBpIF0uZ2V0TW9udGgoKSArIDEpXHJcblx0XHRcdFx0XHRcdFx0XHQrICctJyArICgoICAgICAgICBhRGF5c1sgaSBdLmdldERhdGUoKSA8IDEwKSA/ICcwJyA6ICcnKSArICBhRGF5c1sgaSBdLmdldERhdGUoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8gT25jZSB0aGUgbG9vcCBoYXMgZmluaXNoZWQsIHJldHVybiB0aGUgYXJyYXkgb2YgZGF5cy5cclxuXHRcdFx0XHRyZXR1cm4gYURheXM7XHJcblx0XHRcdH1cclxuXHJcblxyXG5cclxuXHQvKipcclxuXHQgKiAgIFRvb2x0aXBzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZSBzaG93aW5nIHRvb2x0aXAsICB3aGVuICBtb3VzZSBvdmVyIG9uICBTRUxFQ1RBQkxFIChhdmFpbGFibGUsIHBlbmRpbmcsIGFwcHJvdmVkLCByZXNvdXJjZSB1bmF2YWlsYWJsZSksICBkYXlzXHJcblx0ICogQ2FuIGJlIGNhbGxlZCBkaXJlY3RseSAgZnJvbSAgZGF0ZXBpY2sgaW5pdCBmdW5jdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB2YWx1ZVxyXG5cdCAqIEBwYXJhbSBkYXRlXHJcblx0ICogQHBhcmFtIGNhbGVuZGFyX3BhcmFtc19hcnJcclxuXHQgKiBAcGFyYW0gZGF0ZXBpY2tfdGhpc1xyXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfYXZ5X19wcmVwYXJlX3Rvb2x0aXBfX2luX2NhbGVuZGFyKCB2YWx1ZSwgZGF0ZSwgY2FsZW5kYXJfcGFyYW1zX2FyciwgZGF0ZXBpY2tfdGhpcyApe1xyXG5cclxuXHRcdGlmICggbnVsbCA9PSBkYXRlICl7ICByZXR1cm4gZmFsc2U7ICB9XHJcblxyXG5cdFx0dmFyIHRkX2NsYXNzID0gKCBkYXRlLmdldE1vbnRoKCkgKyAxICkgKyAnLScgKyBkYXRlLmdldERhdGUoKSArICctJyArIGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuXHJcblx0XHR2YXIgakNlbGwgPSBqUXVlcnkoICcjY2FsZW5kYXJfYm9va2luZycgKyBjYWxlbmRhcl9wYXJhbXNfYXJyLnJlc291cmNlX2lkICsgJyB0ZC5jYWw0ZGF0ZS0nICsgdGRfY2xhc3MgKTtcclxuXHJcblx0XHR3cGJjX2F2eV9fc2hvd190b29sdGlwX19mb3JfZWxlbWVudCggakNlbGwsIGNhbGVuZGFyX3BhcmFtc19hcnJbICdwb3BvdmVyX2hpbnRzJyBdICk7XHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmUgdG9vbHRpcCAgZm9yIHNob3dpbmcgb24gVU5BVkFJTEFCTEUgZGF5cyAoc2Vhc29uLCB3ZWVrZGF5LCB0b2RheV9kZXBlbmRzIHVuYXZhaWxhYmxlKVxyXG5cdCAqXHJcblx0ICogQHBhcmFtIGpDZWxsXHRcdFx0XHRcdGpRdWVyeSBvZiBzcGVjaWZpYyBkYXkgY2VsbFxyXG5cdCAqIEBwYXJhbSBwb3BvdmVyX2hpbnRzXHRcdCAgICBBcnJheSB3aXRoIHRvb2x0aXAgaGludCB0ZXh0c1x0IDogeydzZWFzb25fdW5hdmFpbGFibGUnOicuLi4nLCd3ZWVrZGF5c191bmF2YWlsYWJsZSc6Jy4uLicsJ2JlZm9yZV9hZnRlcl91bmF2YWlsYWJsZSc6Jy4uLicsfVxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfYXZ5X19zaG93X3Rvb2x0aXBfX2Zvcl9lbGVtZW50KCBqQ2VsbCwgcG9wb3Zlcl9oaW50cyApe1xyXG5cclxuXHRcdHZhciB0b29sdGlwX3RpbWUgPSAnJztcclxuXHJcblx0XHRpZiAoIGpDZWxsLmhhc0NsYXNzKCAnc2Vhc29uX3VuYXZhaWxhYmxlJyApICl7XHJcblx0XHRcdHRvb2x0aXBfdGltZSA9IHBvcG92ZXJfaGludHNbICdzZWFzb25fdW5hdmFpbGFibGUnIF07XHJcblx0XHR9IGVsc2UgaWYgKCBqQ2VsbC5oYXNDbGFzcyggJ3dlZWtkYXlzX3VuYXZhaWxhYmxlJyApICl7XHJcblx0XHRcdHRvb2x0aXBfdGltZSA9IHBvcG92ZXJfaGludHNbICd3ZWVrZGF5c191bmF2YWlsYWJsZScgXTtcclxuXHRcdH0gZWxzZSBpZiAoIGpDZWxsLmhhc0NsYXNzKCAnYmVmb3JlX2FmdGVyX3VuYXZhaWxhYmxlJyApICl7XHJcblx0XHRcdHRvb2x0aXBfdGltZSA9IHBvcG92ZXJfaGludHNbICdiZWZvcmVfYWZ0ZXJfdW5hdmFpbGFibGUnIF07XHJcblx0XHR9IGVsc2UgaWYgKCBqQ2VsbC5oYXNDbGFzcyggJ2RhdGUyYXBwcm92ZScgKSApe1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGpDZWxsLmhhc0NsYXNzKCAnZGF0ZV9hcHByb3ZlZCcgKSApe1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGpDZWxsLmF0dHIoICdkYXRhLWNvbnRlbnQnLCB0b29sdGlwX3RpbWUgKTtcclxuXHJcblx0XHR2YXIgdGRfZWwgPSBqQ2VsbC5nZXQoMCk7XHQvL2pRdWVyeSggJyNjYWxlbmRhcl9ib29raW5nJyArIGNhbGVuZGFyX3BhcmFtc19hcnIucmVzb3VyY2VfaWQgKyAnIHRkLmNhbDRkYXRlLScgKyB0ZF9jbGFzcyApLmdldCgwKTtcclxuXHJcblx0XHRpZiAoICggdW5kZWZpbmVkID09IHRkX2VsLl90aXBweSApICYmICggJycgIT0gdG9vbHRpcF90aW1lICkgKXtcclxuXHJcblx0XHRcdFx0d3BiY190aXBweSggdGRfZWwgLCB7XHJcblx0XHRcdFx0XHRjb250ZW50KCByZWZlcmVuY2UgKXtcclxuXHJcblx0XHRcdFx0XHRcdHZhciBwb3BvdmVyX2NvbnRlbnQgPSByZWZlcmVuY2UuZ2V0QXR0cmlidXRlKCAnZGF0YS1jb250ZW50JyApO1xyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuICc8ZGl2IGNsYXNzPVwicG9wb3ZlciBwb3BvdmVyX3RpcHB5XCI+J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQrICc8ZGl2IGNsYXNzPVwicG9wb3Zlci1jb250ZW50XCI+J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsgcG9wb3Zlcl9jb250ZW50XHJcblx0XHRcdFx0XHRcdFx0XHRcdCsgJzwvZGl2PidcclxuXHRcdFx0XHRcdFx0XHQgKyAnPC9kaXY+JztcclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRhbGxvd0hUTUwgICAgICAgIDogdHJ1ZSxcclxuXHRcdFx0XHRcdHRyaWdnZXJcdFx0XHQgOiAnbW91c2VlbnRlciBmb2N1cycsXHJcblx0XHRcdFx0XHRpbnRlcmFjdGl2ZSAgICAgIDogISB0cnVlLFxyXG5cdFx0XHRcdFx0aGlkZU9uQ2xpY2sgICAgICA6IHRydWUsXHJcblx0XHRcdFx0XHRpbnRlcmFjdGl2ZUJvcmRlcjogMTAsXHJcblx0XHRcdFx0XHRtYXhXaWR0aCAgICAgICAgIDogNTUwLFxyXG5cdFx0XHRcdFx0dGhlbWUgICAgICAgICAgICA6ICd3cGJjLXRpcHB5LXRpbWVzJyxcclxuXHRcdFx0XHRcdHBsYWNlbWVudCAgICAgICAgOiAndG9wJyxcclxuXHRcdFx0XHRcdGRlbGF5XHRcdFx0IDogWzQwMCwgMF0sXHRcdFx0Ly8gRml4SW46IDkuNC4yLjIuXHJcblx0XHRcdFx0XHRpZ25vcmVBdHRyaWJ1dGVzIDogdHJ1ZSxcclxuXHRcdFx0XHRcdHRvdWNoXHRcdFx0IDogdHJ1ZSxcdFx0XHRcdC8vWydob2xkJywgNTAwXSwgLy8gNTAwbXMgZGVsYXlcdFx0XHQvLyBGaXhJbjogOS4yLjEuNS5cclxuXHRcdFx0XHRcdGFwcGVuZFRvOiAoKSA9PiBkb2N1bWVudC5ib2R5LFxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblxyXG5cclxuXHJcblxyXG4vKipcclxuICogICBBamF4ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cclxuXHJcbi8qKlxyXG4gKiBTZW5kIEFqYXggc2hvdyByZXF1ZXN0XHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2FqeF9hdmFpbGFiaWxpdHlfX2FqYXhfcmVxdWVzdCgpe1xyXG5cclxuY29uc29sZS5ncm91cENvbGxhcHNlZCggJ1dQQkNfQUpYX0FWQUlMQUJJTElUWScgKTsgY29uc29sZS5sb2coICcgPT0gQmVmb3JlIEFqYXggU2VuZCAtIHNlYXJjaF9nZXRfYWxsX3BhcmFtcygpID09ICcgLCB3cGJjX2FqeF9hdmFpbGFiaWxpdHkuc2VhcmNoX2dldF9hbGxfcGFyYW1zKCkgKTtcclxuXHJcblx0d3BiY19hdmFpbGFiaWxpdHlfcmVsb2FkX2J1dHRvbl9fc3Bpbl9zdGFydCgpO1xyXG5cclxuXHQvLyBTdGFydCBBamF4XHJcblx0alF1ZXJ5LnBvc3QoIHdwYmNfdXJsX2FqYXgsXHJcblx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0YWN0aW9uICAgICAgICAgIDogJ1dQQkNfQUpYX0FWQUlMQUJJTElUWScsXHJcblx0XHRcdFx0XHR3cGJjX2FqeF91c2VyX2lkOiB3cGJjX2FqeF9hdmFpbGFiaWxpdHkuZ2V0X3NlY3VyZV9wYXJhbSggJ3VzZXJfaWQnICksXHJcblx0XHRcdFx0XHRub25jZSAgICAgICAgICAgOiB3cGJjX2FqeF9hdmFpbGFiaWxpdHkuZ2V0X3NlY3VyZV9wYXJhbSggJ25vbmNlJyApLFxyXG5cdFx0XHRcdFx0d3BiY19hanhfbG9jYWxlIDogd3BiY19hanhfYXZhaWxhYmlsaXR5LmdldF9zZWN1cmVfcGFyYW0oICdsb2NhbGUnICksXHJcblxyXG5cdFx0XHRcdFx0c2VhcmNoX3BhcmFtc1x0OiB3cGJjX2FqeF9hdmFpbGFiaWxpdHkuc2VhcmNoX2dldF9hbGxfcGFyYW1zKClcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdC8qKlxyXG5cdFx0XHRcdCAqIFMgdSBjIGMgZSBzIHNcclxuXHRcdFx0XHQgKlxyXG5cdFx0XHRcdCAqIEBwYXJhbSByZXNwb25zZV9kYXRhXHRcdC1cdGl0cyBvYmplY3QgcmV0dXJuZWQgZnJvbSAgQWpheCAtIGNsYXNzLWxpdmUtc2VhcmNnLnBocFxyXG5cdFx0XHRcdCAqIEBwYXJhbSB0ZXh0U3RhdHVzXHRcdC1cdCdzdWNjZXNzJ1xyXG5cdFx0XHRcdCAqIEBwYXJhbSBqcVhIUlx0XHRcdFx0LVx0T2JqZWN0XHJcblx0XHRcdFx0ICovXHJcblx0XHRcdFx0ZnVuY3Rpb24gKCByZXNwb25zZV9kYXRhLCB0ZXh0U3RhdHVzLCBqcVhIUiApIHtcclxuXHJcbmNvbnNvbGUubG9nKCAnID09IFJlc3BvbnNlIFdQQkNfQUpYX0FWQUlMQUJJTElUWSA9PSAnLCByZXNwb25zZV9kYXRhICk7IGNvbnNvbGUuZ3JvdXBFbmQoKTtcclxuXHJcblx0XHRcdFx0XHQvLyBQcm9iYWJseSBFcnJvclxyXG5cdFx0XHRcdFx0aWYgKCAodHlwZW9mIHJlc3BvbnNlX2RhdGEgIT09ICdvYmplY3QnKSB8fCAocmVzcG9uc2VfZGF0YSA9PT0gbnVsbCkgKXtcclxuXHJcblx0XHRcdFx0XHRcdHdwYmNfYWp4X2F2YWlsYWJpbGl0eV9fc2hvd19tZXNzYWdlKCByZXNwb25zZV9kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gUmVsb2FkIHBhZ2UsIGFmdGVyIGZpbHRlciB0b29sYmFyIGhhcyBiZWVuIHJlc2V0XHJcblx0XHRcdFx0XHRpZiAoICAgICAgICggICAgIHVuZGVmaW5lZCAhPSByZXNwb25zZV9kYXRhWyAnYWp4X2NsZWFuZWRfcGFyYW1zJyBdKVxyXG5cdFx0XHRcdFx0XHRcdCYmICggJ3Jlc2V0X2RvbmUnID09PSByZXNwb25zZV9kYXRhWyAnYWp4X2NsZWFuZWRfcGFyYW1zJyBdWyAnZG9fYWN0aW9uJyBdKVxyXG5cdFx0XHRcdFx0KXtcclxuXHRcdFx0XHRcdFx0bG9jYXRpb24ucmVsb2FkKCk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBTaG93IGxpc3RpbmdcclxuXHRcdFx0XHRcdHdwYmNfYWp4X2F2YWlsYWJpbGl0eV9fcGFnZV9jb250ZW50X19zaG93KCByZXNwb25zZV9kYXRhWyAnYWp4X2RhdGEnIF0sIHJlc3BvbnNlX2RhdGFbICdhanhfc2VhcmNoX3BhcmFtcycgXSAsIHJlc3BvbnNlX2RhdGFbICdhanhfY2xlYW5lZF9wYXJhbXMnIF0gKTtcclxuXHJcblx0XHRcdFx0XHQvL3dwYmNfYWp4X2F2YWlsYWJpbGl0eV9fZGVmaW5lX3VpX2hvb2tzKCk7XHRcdFx0XHRcdFx0Ly8gUmVkZWZpbmUgSG9va3MsIGJlY2F1c2Ugd2Ugc2hvdyBuZXcgRE9NIGVsZW1lbnRzXHJcblx0XHRcdFx0XHRpZiAoICcnICE9IHJlc3BvbnNlX2RhdGFbICdhanhfZGF0YScgXVsgJ2FqeF9hZnRlcl9hY3Rpb25fbWVzc2FnZScgXS5yZXBsYWNlKCAvXFxuL2csIFwiPGJyIC8+XCIgKSApe1xyXG5cdFx0XHRcdFx0XHR3cGJjX2FkbWluX3Nob3dfbWVzc2FnZShcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIHJlc3BvbnNlX2RhdGFbICdhanhfZGF0YScgXVsgJ2FqeF9hZnRlcl9hY3Rpb25fbWVzc2FnZScgXS5yZXBsYWNlKCAvXFxuL2csIFwiPGJyIC8+XCIgKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCwgKCAnMScgPT0gcmVzcG9uc2VfZGF0YVsgJ2FqeF9kYXRhJyBdWyAnYWp4X2FmdGVyX2FjdGlvbl9yZXN1bHQnIF0gKSA/ICdzdWNjZXNzJyA6ICdlcnJvcidcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQsIDEwMDAwXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0d3BiY19hdmFpbGFiaWxpdHlfcmVsb2FkX2J1dHRvbl9fc3Bpbl9wYXVzZSgpO1xyXG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIHNwaW4gaWNvbiBmcm9tICBidXR0b24gYW5kIEVuYWJsZSB0aGlzIGJ1dHRvbi5cclxuXHRcdFx0XHRcdHdwYmNfYnV0dG9uX19yZW1vdmVfc3BpbiggcmVzcG9uc2VfZGF0YVsgJ2FqeF9jbGVhbmVkX3BhcmFtcycgXVsgJ3VpX2NsaWNrZWRfZWxlbWVudF9pZCcgXSApXHJcblxyXG5cdFx0XHRcdFx0alF1ZXJ5KCAnI2FqYXhfcmVzcG9uZCcgKS5odG1sKCByZXNwb25zZV9kYXRhICk7XHRcdC8vIEZvciBhYmlsaXR5IHRvIHNob3cgcmVzcG9uc2UsIGFkZCBzdWNoIERJViBlbGVtZW50IHRvIHBhZ2VcclxuXHRcdFx0XHR9XHJcblx0XHRcdCAgKS5mYWlsKCBmdW5jdGlvbiAoIGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93biApIHsgICAgaWYgKCB3aW5kb3cuY29uc29sZSAmJiB3aW5kb3cuY29uc29sZS5sb2cgKXsgY29uc29sZS5sb2coICdBamF4X0Vycm9yJywganFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duICk7IH1cclxuXHJcblx0XHRcdFx0XHR2YXIgZXJyb3JfbWVzc2FnZSA9ICc8c3Ryb25nPicgKyAnRXJyb3IhJyArICc8L3N0cm9uZz4gJyArIGVycm9yVGhyb3duIDtcclxuXHRcdFx0XHRcdGlmICgganFYSFIuc3RhdHVzICl7XHJcblx0XHRcdFx0XHRcdGVycm9yX21lc3NhZ2UgKz0gJyAoPGI+JyArIGpxWEhSLnN0YXR1cyArICc8L2I+KSc7XHJcblx0XHRcdFx0XHRcdGlmICg0MDMgPT0ganFYSFIuc3RhdHVzICl7XHJcblx0XHRcdFx0XHRcdFx0ZXJyb3JfbWVzc2FnZSArPSAnIFByb2JhYmx5IG5vbmNlIGZvciB0aGlzIHBhZ2UgaGFzIGJlZW4gZXhwaXJlZC4gUGxlYXNlIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiBvbmNsaWNrPVwiamF2YXNjcmlwdDpsb2NhdGlvbi5yZWxvYWQoKTtcIj5yZWxvYWQgdGhlIHBhZ2U8L2E+Lic7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmICgganFYSFIucmVzcG9uc2VUZXh0ICl7XHJcblx0XHRcdFx0XHRcdGVycm9yX21lc3NhZ2UgKz0gJyAnICsganFYSFIucmVzcG9uc2VUZXh0O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0ZXJyb3JfbWVzc2FnZSA9IGVycm9yX21lc3NhZ2UucmVwbGFjZSggL1xcbi9nLCBcIjxiciAvPlwiICk7XHJcblxyXG5cdFx0XHRcdFx0d3BiY19hanhfYXZhaWxhYmlsaXR5X19zaG93X21lc3NhZ2UoIGVycm9yX21lc3NhZ2UgKTtcclxuXHRcdFx0ICB9KVxyXG5cdCAgICAgICAgICAvLyAuZG9uZSggICBmdW5jdGlvbiAoIGRhdGEsIHRleHRTdGF0dXMsIGpxWEhSICkgeyAgIGlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUubG9nICl7IGNvbnNvbGUubG9nKCAnc2Vjb25kIHN1Y2Nlc3MnLCBkYXRhLCB0ZXh0U3RhdHVzLCBqcVhIUiApOyB9ICAgIH0pXHJcblx0XHRcdCAgLy8gLmFsd2F5cyggZnVuY3Rpb24gKCBkYXRhX2pxWEhSLCB0ZXh0U3RhdHVzLCBqcVhIUl9lcnJvclRocm93biApIHsgICBpZiAoIHdpbmRvdy5jb25zb2xlICYmIHdpbmRvdy5jb25zb2xlLmxvZyApeyBjb25zb2xlLmxvZyggJ2Fsd2F5cyBmaW5pc2hlZCcsIGRhdGFfanFYSFIsIHRleHRTdGF0dXMsIGpxWEhSX2Vycm9yVGhyb3duICk7IH0gICAgIH0pXHJcblx0XHRcdCAgOyAgLy8gRW5kIEFqYXhcclxuXHJcbn1cclxuXHJcblxyXG5cclxuLyoqXHJcbiAqICAgSCBvIG8gayBzICAtICBpdHMgQWN0aW9uL1RpbWVzIHdoZW4gbmVlZCB0byByZS1SZW5kZXIgVmlld3MgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXHJcblxyXG4vKipcclxuICogU2VuZCBBamF4IFNlYXJjaCBSZXF1ZXN0IGFmdGVyIFVwZGF0aW5nIHNlYXJjaCByZXF1ZXN0IHBhcmFtZXRlcnNcclxuICpcclxuICogQHBhcmFtIHBhcmFtc19hcnJcclxuICovXHJcbmZ1bmN0aW9uIHdwYmNfYWp4X2F2YWlsYWJpbGl0eV9fc2VuZF9yZXF1ZXN0X3dpdGhfcGFyYW1zICggcGFyYW1zX2FyciApe1xyXG5cclxuXHQvLyBEZWZpbmUgZGlmZmVyZW50IFNlYXJjaCAgcGFyYW1ldGVycyBmb3IgcmVxdWVzdFxyXG5cdF8uZWFjaCggcGFyYW1zX2FyciwgZnVuY3Rpb24gKCBwX3ZhbCwgcF9rZXksIHBfZGF0YSApIHtcclxuXHRcdC8vY29uc29sZS5sb2coICdSZXF1ZXN0IGZvcjogJywgcF9rZXksIHBfdmFsICk7XHJcblx0XHR3cGJjX2FqeF9hdmFpbGFiaWxpdHkuc2VhcmNoX3NldF9wYXJhbSggcF9rZXksIHBfdmFsICk7XHJcblx0fSk7XHJcblxyXG5cdC8vIFNlbmQgQWpheCBSZXF1ZXN0XHJcblx0d3BiY19hanhfYXZhaWxhYmlsaXR5X19hamF4X3JlcXVlc3QoKTtcclxufVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2VhcmNoIHJlcXVlc3QgZm9yIFwiUGFnZSBOdW1iZXJcIlxyXG5cdCAqIEBwYXJhbSBwYWdlX251bWJlclx0aW50XHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19hanhfYXZhaWxhYmlsaXR5X19wYWdpbmF0aW9uX2NsaWNrKCBwYWdlX251bWJlciApe1xyXG5cclxuXHRcdHdwYmNfYWp4X2F2YWlsYWJpbGl0eV9fc2VuZF9yZXF1ZXN0X3dpdGhfcGFyYW1zKCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQncGFnZV9udW0nOiBwYWdlX251bWJlclxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gKTtcclxuXHR9XHJcblxyXG5cclxuXHJcbi8qKlxyXG4gKiAgIFNob3cgLyBIaWRlIENvbnRlbnQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5cclxuLyoqXHJcbiAqICBTaG93IExpc3RpbmcgQ29udGVudCBcdC0gXHRTZW5kaW5nIEFqYXggUmVxdWVzdFx0LVx0d2l0aCBwYXJhbWV0ZXJzIHRoYXQgIHdlIGVhcmx5ICBkZWZpbmVkXHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2FqeF9hdmFpbGFiaWxpdHlfX2FjdHVhbF9jb250ZW50X19zaG93KCl7XHJcblxyXG5cdHdwYmNfYWp4X2F2YWlsYWJpbGl0eV9fYWpheF9yZXF1ZXN0KCk7XHRcdFx0Ly8gU2VuZCBBamF4IFJlcXVlc3RcdC1cdHdpdGggcGFyYW1ldGVycyB0aGF0ICB3ZSBlYXJseSAgZGVmaW5lZCBpbiBcIndwYmNfYWp4X2Jvb2tpbmdfbGlzdGluZ1wiIE9iai5cclxufVxyXG5cclxuLyoqXHJcbiAqIEhpZGUgTGlzdGluZyBDb250ZW50XHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2FqeF9hdmFpbGFiaWxpdHlfX2FjdHVhbF9jb250ZW50X19oaWRlKCl7XHJcblxyXG5cdGpRdWVyeSggIHdwYmNfYWp4X2F2YWlsYWJpbGl0eS5nZXRfb3RoZXJfcGFyYW0oICdsaXN0aW5nX2NvbnRhaW5lcicgKSAgKS5odG1sKCAnJyApO1xyXG59XHJcblxyXG5cclxuXHJcbi8qKlxyXG4gKiAgIE0gZSBzIHMgYSBnIGUgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5cclxuLyoqXHJcbiAqIFNob3cganVzdCBtZXNzYWdlIGluc3RlYWQgb2YgY29udGVudFxyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19hanhfYXZhaWxhYmlsaXR5X19zaG93X21lc3NhZ2UoIG1lc3NhZ2UgKXtcclxuXHJcblx0d3BiY19hanhfYXZhaWxhYmlsaXR5X19hY3R1YWxfY29udGVudF9faGlkZSgpO1xyXG5cclxuXHRqUXVlcnkoIHdwYmNfYWp4X2F2YWlsYWJpbGl0eS5nZXRfb3RoZXJfcGFyYW0oICdsaXN0aW5nX2NvbnRhaW5lcicgKSApLmh0bWwoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCc8ZGl2IGNsYXNzPVwid3BiYy1zZXR0aW5ncy1ub3RpY2Ugbm90aWNlLXdhcm5pbmdcIiBzdHlsZT1cInRleHQtYWxpZ246bGVmdFwiPicgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2UgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnPC9kaXY+J1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XHJcbn1cclxuXHJcblxyXG5cclxuLyoqXHJcbiAqICAgU3VwcG9ydCBGdW5jdGlvbnMgLSBTcGluIEljb24gaW4gQnV0dG9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXHJcblxyXG4vKipcclxuICogU3BpbiBidXR0b24gaW4gRmlsdGVyIHRvb2xiYXIgIC0gIFN0YXJ0XHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2F2YWlsYWJpbGl0eV9yZWxvYWRfYnV0dG9uX19zcGluX3N0YXJ0KCl7XHJcblx0alF1ZXJ5KCAnI3dwYmNfYXZhaWxhYmlsaXR5X3JlbG9hZF9idXR0b24gLm1lbnVfaWNvbi53cGJjX3NwaW4nKS5yZW1vdmVDbGFzcyggJ3dwYmNfYW5pbWF0aW9uX3BhdXNlJyApO1xyXG59XHJcblxyXG4vKipcclxuICogU3BpbiBidXR0b24gaW4gRmlsdGVyIHRvb2xiYXIgIC0gIFBhdXNlXHJcbiAqL1xyXG5mdW5jdGlvbiB3cGJjX2F2YWlsYWJpbGl0eV9yZWxvYWRfYnV0dG9uX19zcGluX3BhdXNlKCl7XHJcblx0alF1ZXJ5KCAnI3dwYmNfYXZhaWxhYmlsaXR5X3JlbG9hZF9idXR0b24gLm1lbnVfaWNvbi53cGJjX3NwaW4nICkuYWRkQ2xhc3MoICd3cGJjX2FuaW1hdGlvbl9wYXVzZScgKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFNwaW4gYnV0dG9uIGluIEZpbHRlciB0b29sYmFyICAtICBpcyBTcGlubmluZyA/XHJcbiAqXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuZnVuY3Rpb24gd3BiY19hdmFpbGFiaWxpdHlfcmVsb2FkX2J1dHRvbl9faXNfc3Bpbigpe1xyXG4gICAgaWYgKCBqUXVlcnkoICcjd3BiY19hdmFpbGFiaWxpdHlfcmVsb2FkX2J1dHRvbiAubWVudV9pY29uLndwYmNfc3BpbicgKS5oYXNDbGFzcyggJ3dwYmNfYW5pbWF0aW9uX3BhdXNlJyApICl7XHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxufVxyXG4iXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7O0FBRVo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLElBQUlBLHFCQUFxQixHQUFJLFVBQVdDLEdBQUcsRUFBRUMsQ0FBQyxFQUFFO0VBRS9DO0VBQ0EsSUFBSUMsUUFBUSxHQUFHRixHQUFHLENBQUNHLFlBQVksR0FBR0gsR0FBRyxDQUFDRyxZQUFZLElBQUk7SUFDeENDLE9BQU8sRUFBRSxDQUFDO0lBQ1ZDLEtBQUssRUFBSSxFQUFFO0lBQ1hDLE1BQU0sRUFBRztFQUNSLENBQUM7RUFFaEJOLEdBQUcsQ0FBQ08sZ0JBQWdCLEdBQUcsVUFBV0MsU0FBUyxFQUFF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 | |