PluginProbe
Booking Calendar / 11.4
Booking Calendar v11.4
11.8.4 11.8.3 11.8.2 11.8.1 11.8 11.7 11.6.1 11.6 11.5 11.4.3 11.4.2 11.4.1 11.4 11.3 11.2.1 11.2 11.1 11.0 10.15.7 10.15.6 10.1.3 10.10 10.10.1 10.10.2 10.11 All 204 releases
booking / includes / page-form-builder / preview / _out / bfb-preview.js

bfb-preview.js in Booking Calendar 11.4, at includes/page-form-builder/preview/_out/bfb-preview.js

1,001 lines 123.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 "use strict";
2
3 // ---------------------------------------------------------------------------------------------------------------------
4 // == File /includes/page-form-builder/preview/_out/bfb-preview.js
5 // == BFB Preview Client — sends current structure via AJAX and loads preview URL into iframe
6 // ---------------------------------------------------------------------------------------------------------------------
7 (function (w, d) {
8 'use strict';
9
10 /**
11 * Simple logger alias (optional).
12 *
13 * @type {{log:Function, error:Function}}
14 */
15 var dev = w._wpbc && w._wpbc.dev ? w._wpbc.dev : {
16 log: function () {},
17 error: function () {}
18 };
19
20 /**
21 * Preview client class.
22 * Binds to a preview panel root that contains button + iframe.
23 */
24 class wpbc_bfb_preview_client {
25 /**
26 * @param {HTMLElement} root_el Root element of the preview panel.
27 */
28 constructor(root_el) {
29 this.root_el = root_el;
30 this.iframe = root_el.querySelector('[data-wpbc-bfb-preview-iframe="1"]');
31 this.loader = root_el.querySelector('[data-wpbc-bfb-preview-loader="1"]'); // NEW
32 this.button = null; // No local "Update Preview" button in panel anymore.
33
34 this.nonce = root_el.getAttribute('data-preview-nonce') || '';
35 this.is_busy = false;
36 if (!this.iframe) {
37 dev.error('wpbc_bfb_preview_client', 'Missing iframe element');
38 return;
39 }
40 this.bind_events();
41 }
42
43 /**
44 * Show/hide the overlay loader over the iframe.
45 *
46 * @param {boolean} is_visible
47 */
48 set_loader_visible(is_visible) {
49 if (!this.loader) {
50 return;
51 }
52 if (is_visible) {
53 this.loader.classList.add('is-visible');
54 } else {
55 this.loader.classList.remove('is-visible');
56 }
57 }
58
59 /**
60 * Bind UI events (panel-local button, if present).
61 */
62 bind_events() {
63 var self = this;
64 if (!this.button) {
65 return;
66 }
67 this.button.addEventListener('click', function () {
68 self.update_preview();
69 });
70 }
71
72 /**
73 * Get current BFB structure from global builder.
74 *
75 * @returns {Object|null}
76 */
77 get_current_structure() {
78 if (!w.wpbc_bfb || typeof w.wpbc_bfb.get_structure !== 'function') {
79 dev.error('wpbc_bfb_preview_client', 'wpbc_bfb.get_structure() is not available');
80 return null;
81 }
82 try {
83 return w.wpbc_bfb.get_structure();
84 } catch (e) {
85 dev.error('wpbc_bfb_preview_client.get_current_structure', e);
86 return null;
87 }
88 }
89
90 /**
91 * Parse combined length value like "100%", "320px", "12.5rem".
92 *
93 * @param {string} value
94 * @return {{num:string, unit:string}}
95 */
96 parse_length_value(value) {
97 var raw = String(value == null ? '' : value).trim();
98 var m = raw.match(/^\s*(-?\d+(?:\.\d+)?)\s*([a-z%]*)\s*$/i);
99 if (!m) {
100 return {
101 num: raw,
102 unit: ''
103 };
104 }
105 return {
106 num: m[1] || '',
107 unit: m[2] || ''
108 };
109 }
110
111 /**
112 * Build current form settings payload (same structure as real Save):
113 * {
114 * options: { ...source-of-truth... },
115 * css_vars: { ...compiled... }
116 * }
117 *
118 * @param {string} form_name
119 * @returns {{options:Object, css_vars:Object}}
120 */
121 get_current_form_settings(form_name) {
122 var form_settings = {
123 options: {},
124 css_vars: {}
125 };
126
127 // --- same event contract as ajax/_out/bfb-ajax.js ----------------------------------------------
128 wpbc_bfb__dispatch_event_safe('wpbc:bfb:form_settings:collect', {
129 settings: form_settings,
130 form_name: form_name || 'standard'
131 });
132
133 // Strict: require correct shape.
134 if (!form_settings || typeof form_settings !== 'object') {
135 form_settings = {
136 options: {},
137 css_vars: {}
138 };
139 }
140 if (!form_settings.options || typeof form_settings.options !== 'object') {
141 form_settings.options = {};
142 }
143 if (!form_settings.css_vars || typeof form_settings.css_vars !== 'object') {
144 form_settings.css_vars = {};
145 }
146 return form_settings;
147 }
148
149 /**
150 * Read a Form Style control directly from DOM.
151 *
152 * @param {string} key
153 * @returns {string|null}
154 */
155 read_form_style_control_value(key) {
156 var control = null;
157 var checked = null;
158 if (key === 'booking_form_style') {
159 checked = d.querySelector('input[type="radio"][name="booking_form_style"]:checked');
160 return checked ? String(checked.value || '') : null;
161 }
162 control = d.querySelector('[data-wpbc-bfb-fs-key="' + key + '"]');
163 if (!control) {
164 control = d.getElementById(key);
165 }
166 if (!control) {
167 return null;
168 }
169 if (control.matches && control.matches('input[type="radio"]')) {
170 checked = d.querySelector('input[type="radio"][name="' + control.name + '"]:checked');
171 return checked ? String(checked.value || '') : null;
172 }
173 if (typeof control.value !== 'undefined') {
174 return String(control.value == null ? '' : control.value);
175 }
176 return null;
177 }
178
179 /**
180 * Build the current global Form Style override for preview only.
181 *
182 * @returns {Object}
183 */
184 get_current_form_style_settings() {
185 var style_keys = ['booking_form_style', 'booking_form_custom_background_color', 'booking_form_custom_border_color', 'booking_form_custom_border_width', 'booking_form_custom_border_radius', 'booking_form_custom_padding_vertical', 'booking_form_custom_padding_horizontal', 'booking_form_custom_text_color', 'booking_form_custom_field_background_color', 'booking_form_custom_field_text_color', 'booking_form_custom_field_border_color', 'booking_form_custom_button_background_color', 'booking_form_custom_button_text_color', 'booking_form_custom_button_border_color', 'booking_form_custom_button_hover_background_color', 'booking_form_custom_button_hover_text_color', 'booking_form_custom_button_hover_border_color', 'booking_form_custom_secondary_button_background_color', 'booking_form_custom_secondary_button_text_color', 'booking_form_custom_secondary_button_border_color', 'booking_form_custom_secondary_button_hover_background_color', 'booking_form_custom_secondary_button_hover_text_color', 'booking_form_custom_secondary_button_hover_border_color'];
186 var out = {};
187 var collected = {};
188 var self = this;
189 var localized = w.wpbc_bfb_settings_vars && w.wpbc_bfb_settings_vars.global_form_style ? w.wpbc_bfb_settings_vars.global_form_style : {};
190 if (w.WPBC_BFB_FormSettings && typeof w.WPBC_BFB_FormSettings.collect === 'function') {
191 collected = w.WPBC_BFB_FormSettings.collect('global') || {};
192 }
193 style_keys.forEach(function (key) {
194 var dom_value = self.read_form_style_control_value(key);
195 if (null !== dom_value) {
196 out[key] = dom_value;
197 } else if (Object.prototype.hasOwnProperty.call(collected, key)) {
198 out[key] = collected[key];
199 } else if (Object.prototype.hasOwnProperty.call(localized, key)) {
200 out[key] = localized[key];
201 }
202 });
203 return out;
204 }
205
206 /**
207 * Get the currently selected calendar skin URL from the Builder page.
208 *
209 * @returns {string}
210 */
211 get_selected_calendar_skin_url() {
212 var select_el = d.querySelector('.js-wpbc-bfb-calendar-skin');
213 if (select_el && select_el.options) {
214 var selected_option = select_el.options[select_el.selectedIndex];
215 if (selected_option) {
216 var selected_url = selected_option.getAttribute('data-wpbc-calendar-skin-url');
217 if (selected_url) {
218 return String(selected_url);
219 }
220 }
221 }
222 var stylesheet = d.getElementById('wpbc-calendar-skin-css');
223 if (stylesheet && stylesheet.href) {
224 return String(stylesheet.href);
225 }
226 return '';
227 }
228
229 /**
230 * Apply the unsaved Builder calendar skin inside the loaded Preview iframe.
231 *
232 * @param {string} skin_url
233 * @param {Function} done
234 * @param {number} tries
235 */
236 apply_calendar_skin_to_iframe(skin_url, done, tries) {
237 var self = this;
238 var attempt_num = Number(tries || 0);
239 if (!skin_url || !this.iframe || !this.iframe.contentWindow) {
240 if (typeof done === 'function') {
241 done();
242 }
243 return;
244 }
245 try {
246 if (typeof this.iframe.contentWindow.wpbc__calendar__change_skin === 'function') {
247 this.iframe.contentWindow.wpbc__calendar__change_skin(skin_url);
248 if (typeof done === 'function') {
249 done();
250 }
251 return;
252 }
253 } catch (e) {
254 dev.error('wpbc_bfb_preview_client.apply_calendar_skin_to_iframe', e);
255 }
256 if (attempt_num >= 20) {
257 if (typeof done === 'function') {
258 done();
259 }
260 return;
261 }
262 w.setTimeout(function () {
263 self.apply_calendar_skin_to_iframe(skin_url, done, attempt_num + 1);
264 }, 100);
265 }
266
267 /**
268 * Send snapshot to server and update iframe src with returned preview URL.
269 *
270 * @param {{source_button?:HTMLElement}} [opts]
271 */
272 update_preview(opts) {
273 if (this.is_busy) {
274 return;
275 }
276 var structure = this.get_current_structure();
277 if (!structure) {
278 return;
279 }
280 this.set_loader_visible(true);
281 var options = opts || {};
282 var source_btn = options.source_button || null;
283 var $source_btn = null;
284 if (source_btn && w.jQuery && typeof w.wpbc_bfb__button_busy_start === 'function') {
285 $source_btn = w.jQuery(source_btn);
286 if ($source_btn && $source_btn.length) {
287 w.wpbc_bfb__button_busy_start($source_btn);
288 }
289 }
290 this.is_busy = true;
291 this.set_button_busy(true); // local "Update Preview" button in the panel
292
293 var payload = new w.FormData();
294 var cfg = w.WPBC_BFB_Ajax || {};
295
296 // Build settings payload (same as real saving).
297 var form_settings = this.get_current_form_settings(cfg.form_name || 'standard');
298 var preview_form_style = this.get_current_form_style_settings();
299 payload.append('action', 'WPBC_AJX_BFB_SAVE_FORM_CONFIG');
300 payload.append('nonce', cfg.nonce_save || this.nonce || '');
301
302 // IMPORTANT:
303 // - form_name is the logical form key (usually 'standard' or selected form)
304 payload.append('form_name', cfg.form_name || 'standard');
305 payload.append('status', 'preview');
306 payload.append('return_preview_url', '1');
307 payload.append('engine', cfg.engine || 'bfb');
308 payload.append('engine_version', cfg.engine_version || '1.0');
309 payload.append('structure', JSON.stringify(structure));
310
311 // Send real settings (options + compiled css_vars).
312 payload.append('settings', JSON.stringify(form_settings));
313 payload.append('preview_form_style', JSON.stringify(preview_form_style));
314
315 // ----------------------------------------------------------------------------
316 // Choose where advanced_form + content_form are taken from (auto|builder|advanced)
317 // ----------------------------------------------------------------------------
318 var preview_source = wpbc_bfb_preview__get_source(cfg, source_btn);
319 payload.append('preview_source', preview_source);
320 var adv = null;
321
322 // 1) Try Advanced Mode text (if selected / auto+dirty)
323 if (preview_source === 'advanced' || preview_source === 'auto') {
324 adv = wpbc_bfb_preview__read_advanced_mode_payload(d, w);
325 var can_use_advanced = preview_source === 'advanced' || preview_source === 'auto' && adv && adv.is_dirty;
326 if (can_use_advanced) {
327 // Forced "advanced" but empty -> fallback to builder export.
328 if (!wpbc_bfb_preview__has_text(adv.advanced_form) && !wpbc_bfb_preview__has_text(adv.content_form)) {
329 if (typeof w.wpbc_admin_show_message === 'function') {
330 w.wpbc_admin_show_message('Advanced Mode is selected, but editors are empty. Using Builder export.', 'warning', 6000);
331 }
332 } else {
333 if (wpbc_bfb_preview__has_text(adv.advanced_form)) {
334 payload.append('advanced_form', adv.advanced_form);
335 }
336 if (wpbc_bfb_preview__has_text(adv.content_form)) {
337 payload.append('content_form', adv.content_form);
338 }
339 }
340 }
341 }
342
343 // 2) If not taken from Advanced Mode -> export from Builder structure (current behavior)
344 var already_has_adv = payload.has && (payload.has('advanced_form') || payload.has('content_form')); // some browsers
345 // support
346 // FormData.has
347
348 // Fallback for old browsers (no FormData.has)
349 if (typeof payload.has !== 'function') {
350 already_has_adv = false; // just try exporter if needed
351 }
352 if (!already_has_adv) {
353 if (w.WPBC_BFB_Exporter && typeof w.WPBC_BFB_Exporter.export_all === 'function') {
354 try {
355 var width_combined = form_settings.options.booking_form_layout_width || '';
356 var parsed_width = this.parse_length_value(width_combined);
357 var width_unit = parsed_width.unit ? parsed_width.unit : '%';
358 var export_options = {
359 gapPercent: 3,
360 form_slug: cfg.form_name || 'standard',
361 form_width_value: parsed_width.num,
362 form_width_unit: width_unit
363 };
364 var export_result = w.WPBC_BFB_Exporter.export_all(structure || [], export_options);
365 if (export_result) {
366 if (export_result.advanced_form) {
367 payload.append('advanced_form', export_result.advanced_form);
368 }
369 if (export_result.fields_data) {
370 payload.append('content_form', export_result.fields_data);
371 }
372 }
373 } catch (e) {
374 console.error('WPBC BFB: export_all error', e);
375 }
376 }
377 }
378
379 // Use shared helper if available; fallback to ajaxurl.
380 var ajax_url = '';
381 if (typeof w.wpbc_bfb__get_ajax_url === 'function') {
382 ajax_url = w.wpbc_bfb__get_ajax_url();
383 } else if (typeof w.ajaxurl !== 'undefined' && w.ajaxurl) {
384 ajax_url = w.ajaxurl;
385 }
386 var self = this;
387 var preview_calendar_skin_url = this.get_selected_calendar_skin_url();
388 function end_busy_now() {
389 self._end_busy($source_btn);
390 }
391 if (!ajax_url) {
392 dev.error('wpbc_bfb_preview_client', 'ajax URL is not defined');
393 end_busy_now();
394 return;
395 }
396 w.fetch(ajax_url, {
397 method: 'POST',
398 body: payload
399 }).then(function (response) {
400 return response.json();
401 }).then(function (data) {
402 if (!data || !data.success || !data.data || !data.data.preview_url) {
403 dev.error('wpbc_bfb_preview_client', 'Preview AJAX error', data);
404 end_busy_now();
405 return;
406 }
407 if (!self.iframe) {
408 dev.error('wpbc_bfb_preview_client', 'Missing iframe element');
409 end_busy_now();
410 return;
411 }
412
413 // Wait until iframe has really loaded the preview URL.
414 var on_load = function () {
415 self.iframe.removeEventListener('load', on_load);
416 self.apply_calendar_skin_to_iframe(preview_calendar_skin_url, end_busy_now);
417 };
418 self.iframe.addEventListener('load', on_load);
419 self.iframe.setAttribute('src', data.data.preview_url);
420 }).catch(function (err) {
421 dev.error('wpbc_bfb_preview_client', 'Preview AJAX failed', err);
422 end_busy_now();
423 });
424 }
425
426 /**
427 * Internal helper: stop busy state on panel button + optional top toolbar button.
428 *
429 * @param {jQuery|null} $source_btn
430 * @private
431 */
432 _end_busy($source_btn) {
433 this.is_busy = false;
434 this.set_button_busy(false);
435 this.set_loader_visible(false); // NEW
436
437 if ($source_btn && typeof w.wpbc_bfb__button_busy_end === 'function') {
438 w.wpbc_bfb__button_busy_end($source_btn);
439 }
440 }
441
442 /**
443 * Force-reset any busy states related to preview.
444 * This is called when switching back to Builder mode (soft-cancel UX).
445 */
446 reset_busy_state() {
447 this.is_busy = false;
448 this.set_button_busy(false); // panel button, if any
449 this.set_loader_visible(false); // NEW
450
451 if (w.jQuery && typeof w.wpbc_bfb__button_busy_end === 'function') {
452 // Top toolbar buttons that may show "Loading preview..."
453 var $btns = w.jQuery('[data-wpbc-bfb-top-preview-btn="1"],' + '[data-wpbc-bfb-top-refresh-btn="1"]');
454 $btns.each(function () {
455 var $b = w.jQuery(this);
456 if ($b.hasClass('wpbc-is-busy')) {
457 w.wpbc_bfb__button_busy_end($b);
458 }
459 });
460 }
461 }
462
463 /**
464 * Simple busy indicator for the panel "Update Preview" button.
465 * Reuses global WPBC busy helpers if available, so the spinner matches Save/Load buttons.
466 *
467 * @param {boolean} is_busy
468 */
469 set_button_busy(is_busy) {
470 if (!this.button) {
471 return;
472 }
473
474 // If jQuery + global helpers exist, use same spinner as other toolbar buttons.
475 if (w.jQuery && typeof w.wpbc_bfb__button_busy_start === 'function' && typeof w.wpbc_bfb__button_busy_end === 'function') {
476 var $btn = w.jQuery(this.button);
477 if (is_busy) {
478 w.wpbc_bfb__button_busy_start($btn);
479 } else {
480 w.wpbc_bfb__button_busy_end($btn);
481 }
482 return;
483 }
484
485 // Fallback: simple disabled state without spinner.
486 if (is_busy) {
487 this.button.setAttribute('disabled', 'disabled');
488 this.button.classList.add('wpbc_bfb__preview_btn_busy');
489 } else {
490 this.button.removeAttribute('disabled');
491 this.button.classList.remove('wpbc_bfb__preview_btn_busy');
492 }
493 }
494
495 /**
496 * Set current view mode: "builder" or "preview".
497 * Applies/removes CSS class on <body>.
498 *
499 * @param {('builder'|'preview')} mode
500 */
501 set_mode(mode) {
502 var body = d.body;
503 if (!body) {
504 return;
505 }
506 if (mode === 'preview') {
507 body.classList.add('wpbc_bfb__mode_preview');
508 } else {
509 body.classList.remove('wpbc_bfb__mode_preview');
510 }
511 }
512 }
513
514 // -- Helpers ------------------------------------------------------------------------------------------------------
515 /**
516 * Is Preview mode currently active?
517 * We prefer body class (set by client.set_mode), fallback to active tab id.
518 *
519 * @return {boolean}
520 */
521 function wpbc_bfb_preview__is_preview_mode_active() {
522 var body = d.body;
523 if (body && body.classList && body.classList.contains('wpbc_bfb__mode_preview')) {
524 return true;
525 }
526 return wpbc_bfb_preview__get_active_top_tab_id() === 'preview_tab';
527 }
528
529 /**
530 * When a form is loaded via AJAX while Preview tab is active,
531 * refresh the iframe so it shows the newly loaded form.
532 *
533 * @param {wpbc_bfb_preview_client} client
534 */
535 function wpbc_bfb_preview__bind_form_ajax_loaded_events(client) {
536 if (!client) {
537 return;
538 }
539
540 // Prevent double binding if this script is injected twice.
541 if (w.__wpbc_bfb_preview__form_ajax_loaded_bound === '1') {
542 return;
543 }
544 w.__wpbc_bfb_preview__form_ajax_loaded_bound = '1';
545 var debounce_id = null;
546 d.addEventListener('wpbc:bfb:form:ajax_loaded', function (ev) {
547 // Only do anything if Preview is currently active.
548 if (!wpbc_bfb_preview__is_preview_mode_active()) {
549 return;
550 }
551 var det = ev && ev.detail ? ev.detail : {};
552 var fn = det.form_name ? String(det.form_name) : '';
553
554 // Best-effort: keep cfg.form_name in sync for payload building.
555 if (fn) {
556 w.WPBC_BFB_Ajax = w.WPBC_BFB_Ajax || {};
557 w.WPBC_BFB_Ajax.form_name = fn;
558 }
559
560 // Debounce multiple rapid loads (or secondary events).
561 if (debounce_id) {
562 clearTimeout(debounce_id);
563 }
564 debounce_id = setTimeout(function () {
565 debounce_id = null;
566
567 // Preview might have been left while waiting.
568 if (!wpbc_bfb_preview__is_preview_mode_active()) {
569 return;
570 }
571
572 // If we are already sending preview, don't stack another request.
573 if (client.is_busy) {
574 // Try once more shortly (safe).
575 setTimeout(function () {
576 if (wpbc_bfb_preview__is_preview_mode_active() && !client.is_busy) {
577 client.update_preview({
578 source_button: null
579 });
580 }
581 }, 250);
582 return;
583 }
584
585 // Wait until builder API is present (form load can be async).
586 var tries = 0;
587 (function wait_for_builder() {
588 if (!wpbc_bfb_preview__is_preview_mode_active()) {
589 return;
590 }
591 if (w.wpbc_bfb && typeof w.wpbc_bfb.get_structure === 'function') {
592 client.update_preview({
593 source_button: null
594 });
595 return;
596 }
597 tries++;
598 if (tries < 15) {
599 setTimeout(wait_for_builder, 200);
600 }
601 })();
602 }, 180);
603 }, {
604 passive: true
605 });
606 }
607 function wpbc_bfb_preview__get_source(cfg, btn) {
608 // priority: button attr -> global cfg -> default
609 var v = '';
610 try {
611 if (btn && btn.getAttribute) {
612 v = btn.getAttribute('data-wpbc-bfb-preview-source') || btn.getAttribute('data-wpbc-bfb-save-source') || '';
613 }
614 } catch (e) {}
615 if (!v && cfg && (cfg.preview_source || cfg.save_source)) {
616 v = cfg.preview_source || cfg.save_source;
617 }
618 v = String(v || 'auto').toLowerCase();
619 if (['builder', 'advanced', 'auto'].indexOf(v) === -1) {
620 v = 'builder';
621 }
622 return v;
623 }
624 function wpbc_bfb_preview__has_text(v) {
625 return !!(v && String(v).trim());
626 }
627 function wpbc_bfb_preview__read_advanced_mode_payload(d, w) {
628 // best: API (syncs CodeMirror -> textarea)
629 if (w.wpbc_bfb_advanced_editor_api && typeof w.wpbc_bfb_advanced_editor_api.get_values === 'function') {
630 try {
631 return w.wpbc_bfb_advanced_editor_api.get_values();
632 } catch (e) {}
633 }
634
635 // fallback: read textareas directly
636 var ta_form = d.getElementById('wpbc_bfb__advanced_form_editor');
637 var ta_content = d.getElementById('wpbc_bfb__content_form_editor');
638 return {
639 advanced_form: ta_form ? String(ta_form.value || '') : '',
640 content_form: ta_content ? String(ta_content.value || '') : '',
641 is_dirty: false
642 };
643 }
644
645 /**
646 * Is this element the Preview TAB link in top tabs nav?
647 *
648 * @param {HTMLElement|null} el
649 * @return {boolean}
650 */
651 function wpbc_bfb_preview__is_preview_tab_link(el) {
652 if (!el || !el.getAttribute) {
653 return false;
654 }
655 return el.getAttribute('data-wpbc-bfb-action') === 'panel' && el.getAttribute('data-wpbc-bfb-tab') === 'preview_tab';
656 }
657
658 /**
659 * Is this element the Builder TAB link in top tabs nav?
660 *
661 * @param {HTMLElement|null} el
662 * @return {boolean}
663 */
664 function wpbc_bfb_preview__is_builder_tab_link(el) {
665 if (!el || !el.getAttribute) {
666 return false;
667 }
668 return el.getAttribute('data-wpbc-bfb-action') === 'panel' && el.getAttribute('data-wpbc-bfb-tab') === 'builder_tab';
669 }
670
671 /**
672 * Activate a "panel" tab and show its panel section (scoped).
673 *
674 * Strategy:
675 * 1) Try to click the real top-tab link (best).
676 * 2) If link does not exist (e.g. Preview tab removed from nav), do a scoped manual switch:
677 * - use nav's data-wpbc-bfb-panels-root + data-wpbc-bfb-panel-class
678 * - hide/show ONLY those outer panels
679 * - DO NOT touch inner panels
680 *
681 * @param {string} tab_id
682 * @return {boolean}
683 */
684 function wpbc_bfb__activate_panel_tab(tab_id) {
685 tab_id = String(tab_id || '').trim();
686 if (!tab_id) {
687 return false;
688 }
689
690 // 1) Best: trigger existing top-tabs switching by clicking the tab link (if it exists).
691 var tab_link = d.querySelector('[data-wpbc-bfb-action="panel"][data-wpbc-bfb-tab="' + tab_id + '"]');
692 if (tab_link && typeof tab_link.click === 'function') {
693 try {
694 tab_link.click();
695 return true;
696 } catch (_e) {}
697 }
698
699 // 2) Fallback: scoped manual toggle (outer panels only).
700 var nav = d.getElementById('wpbc_bfb__top_horisontal_nav');
701
702 // Determine outer panels root.
703 var panels_root = d;
704 var panels_root_selector = '';
705 if (nav) {
706 panels_root_selector = nav.getAttribute('data-wpbc-bfb-panels-root') || '';
707 panels_root_selector = String(panels_root_selector || '').trim();
708 }
709
710 // Fallback if attribute missing: prefer #wpbc_bfb__top_panels if present.
711 if (!panels_root_selector) {
712 panels_root_selector = '#wpbc_bfb__top_panels';
713 }
714 if (panels_root_selector) {
715 try {
716 var root_el = d.querySelector(panels_root_selector);
717 if (root_el) {
718 panels_root = root_el;
719 }
720 } catch (_e2) {}
721 }
722
723 // Determine outer base class (IMPORTANT: must be the OUTER base, not wpbc_bfb__tab_section).
724 var panel_base_class = 'wpbc_bfb__top_tab_section';
725 if (nav) {
726 var from_nav = nav.getAttribute('data-wpbc-bfb-panel-class') || '';
727 from_nav = String(from_nav || '').trim();
728 if (from_nav) {
729 panel_base_class = from_nav;
730 }
731 }
732
733 // Update active tab on nav (source of truth).
734 if (nav) {
735 nav.setAttribute('data-active-tab', tab_id);
736 }
737
738 // Hide ONLY outer panels (scoped by base class).
739 var selector_all = '.' + panel_base_class;
740 var panel_nodes = panels_root.querySelectorAll(selector_all);
741 for (var i = 0; i < panel_nodes.length; i++) {
742 panel_nodes[i].style.display = 'none';
743 }
744
745 // Show requested outer panel.
746 var selector_active = '.' + panel_base_class + '__' + tab_id;
747 var active_panel = panels_root.querySelector(selector_active);
748 if (!active_panel) {
749 // Backward-compatible fallback (if someone forgot to add outer classes).
750 active_panel = panels_root.querySelector('.wpbc_bfb__tab_section__' + tab_id);
751 }
752 if (active_panel) {
753 active_panel.style.display = '';
754 }
755
756 // Mark active item in outer nav if it exists (Preview can be missing).
757 if (nav) {
758 var items = nav.querySelectorAll('.wpbc_ui_el__horis_nav_item');
759 for (var j = 0; j < items.length; j++) {
760 items[j].classList.remove('active');
761 }
762 var active_item = nav.querySelector('.wpbc_ui_el__horis_nav_item__' + tab_id);
763 if (active_item) {
764 active_item.classList.add('active');
765 }
766 }
767
768 // Emit same event as bfb-top-tabs.js so other modules stay in sync.
769 try {
770 d.dispatchEvent(new CustomEvent('wpbc:bfb:top-tab', {
771 detail: {
772 tab: tab_id,
773 nav_id: nav && nav.id ? String(nav.id) : ''
774 }
775 }));
776 } catch (_e3) {}
777 return true;
778 }
779
780 /**
781 * Get currently active top tab id from the nav container.
782 *
783 * @return {string}
784 */
785 function wpbc_bfb_preview__get_active_top_tab_id() {
786 var nav = d.getElementById('wpbc_bfb__top_horisontal_nav');
787 if (!nav) {
788 return '';
789 }
790 return nav.getAttribute('data-active-tab') || '';
791 }
792
793 /**
794 * Sync preview "mode" with currently active top tab.
795 *
796 * Rules:
797 * - preview_tab => enable preview mode (buttons make sense)
798 * - any other tab => disable preview mode + reset busy states
799 *
800 * IMPORTANT:
801 * - We do NOT change the active top tab here (no panel switching).
802 * We only sync preview UI mode.
803 *
804 * @param {string} tab_id
805 * @param {wpbc_bfb_preview_client} client
806 */
807 function wpbc_bfb_preview__sync_mode_to_tab(tab_id, client) {
808 tab_id = String(tab_id || '');
809 if (!client) {
810 return;
811 }
812 if ('preview_tab' === tab_id) {
813 client.set_mode('preview');
814 return;
815 }
816
817 // Leaving preview -> soft-cancel busy state and hide preview-specific toolbar.
818 if (typeof client.reset_busy_state === 'function') {
819 client.reset_busy_state();
820 }
821 client.set_mode('builder');
822 }
823
824 /**
825 * Bind to top-tab switch event emitted by bfb-top-tabs.js.
826 *
827 * @param {wpbc_bfb_preview_client} client
828 */
829 function wpbc_bfb_preview__bind_top_tab_events(client) {
830 // Sync immediately (in case event already fired before this script init).
831 wpbc_bfb_preview__sync_mode_to_tab(wpbc_bfb_preview__get_active_top_tab_id(), client);
832
833 // React to future tab changes.
834 d.addEventListener('wpbc:bfb:top-tab', function (ev) {
835 var det = ev && ev.detail ? ev.detail : {};
836 var tab_id = det.tab ? String(det.tab) : '';
837 var nav_id = det.nav_id ? String(det.nav_id) : '';
838 var prev_id = det.prev_tab ? String(det.prev_tab) : '';
839
840 // If user switched to preview_tab in the MAIN top nav,
841 // remember what tab they came from.
842 if (nav_id === TOP_NAV_ID && tab_id === 'preview_tab' && prev_id && prev_id !== 'preview_tab') {
843 return_tab_id = prev_id;
844 }
845 wpbc_bfb_preview__sync_mode_to_tab(tab_id, client);
846 });
847 }
848
849 // -- Bind | Init on Load ------------------------------------------------------------------------------------------
850 var TOP_NAV_ID = 'wpbc_bfb__top_horisontal_nav';
851 var return_tab_id = 'builder_tab';
852 function remember_return_tab_from_dom() {
853 var cur = wpbc_bfb_preview__get_active_top_tab_id();
854 if (cur && cur !== 'preview_tab') {
855 return_tab_id = cur;
856 }
857 }
858 function get_return_tab_id() {
859 var t = String(return_tab_id || '').trim();
860 if (!t || t === 'preview_tab') t = 'builder_tab';
861 return t;
862 }
863
864 /**
865 * Auto-init preview client on Builder page and wire top toolbar buttons.
866 */
867 function wpbc_bfb_init_preview_client() {
868 var root = d.querySelector('[data-wpbc-bfb-preview-root="1"]');
869 if (!root) {
870 return;
871 }
872 var client = new wpbc_bfb_preview_client(root);
873 if (!w.WPBC_BFB_Preview) {
874 w.WPBC_BFB_Preview = {
875 client: client,
876 show_preview: function (opts) {
877 var opt = opts || {};
878 var src = opt.source_button || null;
879
880 // Remember where we were BEFORE switching to preview.
881 remember_return_tab_from_dom();
882 if (!wpbc_bfb_preview__is_preview_tab_link(src)) {
883 wpbc_bfb__activate_panel_tab('preview_tab');
884 }
885
886 // Enable preview mode UI (shows refresh/back buttons etc).
887 client.set_mode('preview');
888
889 // IMPORTANT: Always regenerate when show_preview() is called (Preview tab click included).
890 client.update_preview({
891 source_button: src
892 });
893 },
894 show_builder: function (opts) {
895 var opt = opts || {};
896 var src = opt.source_button || null;
897 if (client && typeof client.reset_busy_state === 'function') {
898 client.reset_busy_state();
899 }
900 var back_to = get_return_tab_id();
901
902 // If Back button itself is not a real tab link -> just activate remembered tab.
903 // If activation fails (tab removed), fallback to builder_tab.
904 if (!wpbc_bfb_preview__is_builder_tab_link(src)) {
905 if (!wpbc_bfb__activate_panel_tab(back_to)) {
906 wpbc_bfb__activate_panel_tab('builder_tab');
907 }
908 }
909 client.set_mode('builder');
910 },
911 show_advanced_tab: function (opts) {
912 var opt = opts || {};
913 if (client && typeof client.reset_busy_state === 'function') {
914 client.reset_busy_state();
915 }
916 wpbc_bfb__activate_panel_tab('advanced_tab');
917 client.set_mode('builder');
918 }
919 };
920 }
921
922 // Listen for top-tab changes and sync preview mode automatically.
923 wpbc_bfb_preview__bind_top_tab_events(client);
924
925 // When a form is loaded via AJAX, refresh preview (only if preview mode is active).
926 wpbc_bfb_preview__bind_form_ajax_loaded_events(client);
927 wpbc_bfb_bind_top_toolbar_buttons(client);
928 }
929
930 /**
931 * Bind top toolbar Builder / Preview / Refresh buttons.
932 * Supports multiple elements for each action (toolbar buttons, top tabs, etc.)
933 * via data-wpbc-bfb-top-*-btn="1".
934 */
935 function wpbc_bfb_bind_top_toolbar_buttons(client) {
936 var btn_preview_list = d.querySelectorAll('[data-wpbc-bfb-top-preview-btn="1"]');
937 var btn_builder_list = d.querySelectorAll('[data-wpbc-bfb-top-builder-btn="1"]');
938 var btn_refresh_list = d.querySelectorAll('[data-wpbc-bfb-top-refresh-btn="1"]');
939 function for_each_node(list, cb) {
940 if (!list || !list.length) {
941 return;
942 }
943 Array.prototype.forEach.call(list, function (el) {
944 if (el && typeof cb === 'function') {
945 cb(el);
946 }
947 });
948 }
949 for_each_node(btn_preview_list, function (btn_preview) {
950 // Prevent double binding if this script runs twice.
951 if (btn_preview.getAttribute('data-wpbc-bfb-bound') === '1') {
952 return;
953 }
954 btn_preview.setAttribute('data-wpbc-bfb-bound', '1');
955 btn_preview.addEventListener('click', function (e) {
956 e.preventDefault();
957 if (w.WPBC_BFB_Preview && typeof w.WPBC_BFB_Preview.show_preview === 'function') {
958 w.WPBC_BFB_Preview.show_preview({
959 source_button: btn_preview
960 });
961 }
962 });
963 });
964 for_each_node(btn_refresh_list, function (btn_refresh) {
965 if (btn_refresh.getAttribute('data-wpbc-bfb-bound') === '1') {
966 return;
967 }
968 btn_refresh.setAttribute('data-wpbc-bfb-bound', '1');
969 btn_refresh.addEventListener('click', function (e) {
970 e.preventDefault();
971 if (w.WPBC_BFB_Preview && typeof w.WPBC_BFB_Preview.show_preview === 'function') {
972 w.WPBC_BFB_Preview.show_preview({
973 update: true,
974 source_button: btn_refresh
975 });
976 }
977 });
978 });
979 for_each_node(btn_builder_list, function (btn_builder) {
980 if (btn_builder.getAttribute('data-wpbc-bfb-bound') === '1') {
981 return;
982 }
983 btn_builder.setAttribute('data-wpbc-bfb-bound', '1');
984 btn_builder.addEventListener('click', function (e) {
985 e.preventDefault();
986 if (w.WPBC_BFB_Preview && typeof w.WPBC_BFB_Preview.show_builder === 'function') {
987 w.WPBC_BFB_Preview.show_builder({
988 source_button: btn_builder
989 });
990 }
991 });
992 });
993 }
994 if (d.readyState === 'complete' || d.readyState === 'interactive') {
995 setTimeout(wpbc_bfb_init_preview_client, 0);
996 } else {
997 d.addEventListener('DOMContentLoaded', wpbc_bfb_init_preview_client);
998 }
999 })(window, document);
1000 //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvcGFnZS1mb3JtLWJ1aWxkZXIvcHJldmlldy9fb3V0L2JmYi1wcmV2aWV3LmpzIiwibmFtZXMiOlsidyIsImQiLCJkZXYiLCJfd3BiYyIsImxvZyIsImVycm9yIiwid3BiY19iZmJfcHJldmlld19jbGllbnQiLCJjb25zdHJ1Y3RvciIsInJvb3RfZWwiLCJpZnJhbWUiLCJxdWVyeVNlbGVjdG9yIiwibG9hZGVyIiwiYnV0dG9uIiwibm9uY2UiLCJnZXRBdHRyaWJ1dGUiLCJpc19idXN5IiwiYmluZF9ldmVudHMiLCJzZXRfbG9hZGVyX3Zpc2libGUiLCJpc192aXNpYmxlIiwiY2xhc3NMaXN0IiwiYWRkIiwicmVtb3ZlIiwic2VsZiIsImFkZEV2ZW50TGlzdGVuZXIiLCJ1cGRhdGVfcHJldmlldyIsImdldF9jdXJyZW50X3N0cnVjdHVyZSIsIndwYmNfYmZiIiwiZ2V0X3N0cnVjdHVyZSIsImUiLCJwYXJzZV9sZW5ndGhfdmFsdWUiLCJ2YWx1ZSIsInJhdyIsIlN0cmluZyIsInRyaW0iLCJtIiwibWF0Y2giLCJudW0iLCJ1bml0IiwiZ2V0X2N1cnJlbnRfZm9ybV9zZXR0aW5ncyIsImZvcm1fbmFtZSIsImZvcm1fc2V0dGluZ3MiLCJvcHRpb25zIiwiY3NzX3ZhcnMiLCJ3cGJjX2JmYl9fZGlzcGF0Y2hfZXZlbnRfc2FmZSIsInNldHRpbmdzIiwicmVhZF9mb3JtX3N0eWxlX2NvbnRyb2xfdmFsdWUiLCJrZXkiLCJjb250cm9sIiwiY2hlY2tlZCIsImdldEVsZW1lbnRCeUlkIiwibWF0Y2hlcyIsIm5hbWUiLCJnZXRfY3VycmVudF9mb3JtX3N0eWxlX3NldHRpbmdzIiwic3R5bGVfa2V5cyIsIm91dCIsImNvbGxlY3RlZCIsImxvY2FsaXplZCIsIndwYmNfYmZiX3NldHRpbmdzX3ZhcnMiLCJnbG9iYWxfZm9ybV9zdHlsZSIsIldQQkNfQkZCX0Zvcm1TZXR0aW5ncyIsImNvbGxlY3QiLCJmb3JFYWNoIiwiZG9tX3ZhbHVlIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZ2V0X3NlbGVjdGVkX2NhbGVuZGFyX3NraW5fdXJsIiwic2VsZWN0X2VsIiwic2VsZWN0ZWRfb3B0aW9uIiwic2VsZWN0ZWRJbmRleCIsInNlbGVjdGVkX3VybCIsInN0eWxlc2hlZXQiLCJocmVmIiwiYXBwbHlfY2FsZW5kYXJfc2tpbl90b19pZnJhbWUiLCJza2luX3VybCIsImRvbmUiLCJ0cmllcyIsImF0dGVtcHRfbnVtIiwiTnVtYmVyIiwiY29udGVudFdpbmRvdyIsIndwYmNfX2NhbGVuZGFyX19jaGFuZ2Vfc2tpbiIsInNldFRpbWVvdXQiLCJvcHRzIiwic3RydWN0dXJlIiwic291cmNlX2J0biIsInNvdXJjZV9idXR0b24iLCIkc291cmNlX2J0biIsImpRdWVyeSIsIndwYmNfYmZiX19idXR0b25fYnVzeV9zdGFydCIsImxlbmd0aCIsInNldF9idXR0b25fYnVzeSIsInBheWxvYWQiLCJGb3JtRGF0YSIsImNmZyIsIldQQkNfQkZCX0FqYXgiLCJwcmV2aWV3X2Zvcm1fc3R5bGUiLCJhcHBlbmQiLCJub25jZV9zYXZlIiwiZW5naW5lIiwiZW5naW5lX3ZlcnNpb24iLCJKU09OIiwic3RyaW5naWZ5IiwicHJldmlld19zb3VyY2UiLCJ3cGJjX2JmYl9wcmV2aWV3X19nZXRfc291cmNlIiwiYWR2Iiwid3BiY19iZmJfcHJldmlld19fcmVhZF9hZHZhbmNlZF9tb2RlX3BheWxvYWQiLCJjYW5fdXNlX2FkdmFuY2VkIiwiaXNfZGlydHkiLCJ3cGJjX2JmYl9wcmV2aWV3X19oYXNfdGV4dCIsImFkdmFuY2VkX2Zvcm0iLCJjb250ZW50X2Zvcm0iLCJ3cGJjX2FkbWluX3Nob3dfbWVzc2FnZSIsImFscmVhZHlfaGFzX2FkdiIsImhhcyIsIldQQkNfQkZCX0V4cG9ydGVyIiwiZXhwb3J0X2FsbCIsIndpZHRoX2NvbWJpbmVkIiwiYm9va2luZ19mb3JtX2xheW91dF93aWR0aCIsInBhcnNlZF93aWR0aCIsIndpZHRoX3VuaXQiLCJleHBvcnRfb3B0aW9ucyIsImdhcFBlcmNlbnQiLCJmb3JtX3NsdWciLCJmb3JtX3dpZHRoX3ZhbHVlIiwiZm9ybV93aWR0aF91bml0IiwiZXhwb3J0X3Jlc3VsdCIsImZpZWxkc19kYXRhIiwiY29uc29sZSIsImFqYXhfdXJsIiwid3BiY19iZmJfX2dldF9hamF4X3VybCIsImFqYXh1cmwiLCJwcmV2aWV3X2NhbGVuZGFyX3NraW5fdXJsIiwiZW5kX2J1c3lfbm93IiwiX2VuZF9idXN5IiwiZmV0Y2giLCJtZXRob2QiLCJib2R5IiwidGhlbiIsInJlc3BvbnNlIiwianNvbiIsImRhdGEiLCJzdWNjZXNzIiwicHJldmlld191cmwiLCJvbl9sb2FkIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInNldEF0dHJpYnV0ZSIsImNhdGNoIiwiZXJyIiwid3BiY19iZmJfX2J1dHRvbl9idXN5X2VuZCIsInJlc2V0X2J1c3lfc3RhdGUiLCIkYnRucyIsImVhY2giLCIkYiIsImhhc0NsYXNzIiwiJGJ0biIsInJlbW92ZUF0dHJpYnV0ZSIsInNldF9tb2RlIiwibW9kZSIsIndwYmNfYmZiX3ByZXZpZXdfX2lzX3ByZXZpZXdfbW9kZV9hY3RpdmUiLCJjb250YWlucyIsIndwYmNfYmZiX3ByZXZpZXdfX2dldF9hY3RpdmVfdG9wX3RhYl9pZCIsIndwYmNfYmZiX3ByZXZpZXdfX2JpbmRfZm9ybV9hamF4X2xvYWRlZF9ldmVudHMiLCJjbGllbnQiLCJfX3dwYmNfYmZiX3ByZXZpZXdfX2Zvcm1fYWpheF9sb2FkZWRfYm91bmQiLCJkZWJvdW5jZV9pZCIsImV2IiwiZGV0IiwiZGV0YWlsIiwiZm4iLCJjbGVhclRpbWVvdXQiLCJ3YWl0X2Zvcl9idWlsZGVyIiwicGFzc2l2ZSIsImJ0biIsInYiLCJzYXZlX3NvdXJjZSIsInRvTG93ZXJDYXNlIiwiaW5kZXhPZiIsIndwYmNfYmZiX2FkdmFuY2VkX2VkaXRvcl9hcGkiLCJnZXRfdmFsdWVzIiwidGFfZm9ybSIsInRhX2NvbnRlbnQiLCJ3cGJjX2JmYl9wcmV2aWV3X19pc19wcmV2aWV3X3RhYl9saW5rIiwiZWwiLCJ3cGJjX2JmYl9wcmV2aWV3X19pc19idWlsZGVyX3RhYl9saW5rIiwid3BiY19iZmJfX2FjdGl2YXRlX3BhbmVsX3RhYiIsInRhYl9pZCIsInRhYl9saW5rIiwiY2xpY2siLCJfZSIsIm5hdiIsInBhbmVsc19yb290IiwicGFuZWxzX3Jvb3Rfc2VsZWN0b3IiLCJfZTIiLCJwYW5lbF9iYXNlX2NsYXNzIiwiZnJvbV9uYXYiLCJzZWxlY3Rvcl9hbGwiLCJwYW5lbF9ub2RlcyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJpIiwic3R5bGUiLCJkaXNwbGF5Iiwic2VsZWN0b3JfYWN0aXZlIiwiYWN0aXZlX3BhbmVsIiwiaXRlbXMiLCJqIiwiYWN0aXZlX2l0ZW0iLCJkaXNwYXRjaEV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJ0YWIiLCJuYXZfaWQiLCJpZCIsIl9lMyIsIndwYmNfYmZiX3ByZXZpZXdfX3N5bmNfbW9kZV90b190YWIiLCJ3cGJjX2JmYl9wcmV2aWV3X19iaW5kX3RvcF90YWJfZXZlbnRzIiwicHJldl9pZCIsInByZXZfdGFiIiwiVE9QX05BVl9JRCIsInJldHVybl90YWJfaWQiLCJyZW1lbWJlcl9yZXR1cm5fdGFiX2Zyb21fZG9tIiwiY3VyIiwiZ2V0X3JldHVybl90YWJfaWQiLCJ0Iiwid3BiY19iZmJfaW5pdF9wcmV2aWV3X2NsaWVudCIsInJvb3QiLCJXUEJDX0JGQl9QcmV2aWV3Iiwic2hvd19wcmV2aWV3Iiwib3B0Iiwic3JjIiwic2hvd19idWlsZGVyIiwiYmFja190byIsInNob3dfYWR2YW5jZWRfdGFiIiwid3BiY19iZmJfYmluZF90b3BfdG9vbGJhcl9idXR0b25zIiwiYnRuX3ByZXZpZXdfbGlzdCIsImJ0bl9idWlsZGVyX2xpc3QiLCJidG5fcmVmcmVzaF9saXN0IiwiZm9yX2VhY2hfbm9kZSIsImxpc3QiLCJjYiIsIkFycmF5IiwiYnRuX3ByZXZpZXciLCJwcmV2ZW50RGVmYXVsdCIsImJ0bl9yZWZyZXNoIiwidXBkYXRlIiwiYnRuX2J1aWxkZXIiLCJyZWFkeVN0YXRlIiwid2luZG93IiwiZG9jdW1lbnQiXSwic291cmNlcyI6WyJpbmNsdWRlcy9wYWdlLWZvcm0tYnVpbGRlci9wcmV2aWV3L19zcmMvYmZiLXByZXZpZXcuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vID09IEZpbGUgIC9pbmNsdWRlcy9wYWdlLWZvcm0tYnVpbGRlci9wcmV2aWV3L19vdXQvYmZiLXByZXZpZXcuanNcclxuLy8gPT0gQkZCIFByZXZpZXcgQ2xpZW50IOKAlCBzZW5kcyBjdXJyZW50IHN0cnVjdHVyZSB2aWEgQUpBWCBhbmQgbG9hZHMgcHJldmlldyBVUkwgaW50byBpZnJhbWVcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbihmdW5jdGlvbiAodywgZCkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0LyoqXHJcblx0ICogU2ltcGxlIGxvZ2dlciBhbGlhcyAob3B0aW9uYWwpLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge3tsb2c6RnVuY3Rpb24sIGVycm9yOkZ1bmN0aW9ufX1cclxuXHQgKi9cclxuXHR2YXIgZGV2ID0gKHcuX3dwYmMgJiYgdy5fd3BiYy5kZXYpID8gdy5fd3BiYy5kZXYgOiB7XHJcblx0XHRsb2c6IGZ1bmN0aW9uICgpIHt9LFxyXG5cdFx0ZXJyb3I6IGZ1bmN0aW9uICgpIHt9XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogUHJldmlldyBjbGllbnQgY2xhc3MuXHJcblx0ICogQmluZHMgdG8gYSBwcmV2aWV3IHBhbmVsIHJvb3QgdGhhdCBjb250YWlucyBidXR0b24gKyBpZnJhbWUuXHJcblx0ICovXHJcblx0Y2xhc3Mgd3BiY19iZmJfcHJldmlld19jbGllbnQge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcm9vdF9lbCBSb290IGVsZW1lbnQgb2YgdGhlIHByZXZpZXcgcGFuZWwuXHJcblx0XHQgKi9cclxuXHRcdGNvbnN0cnVjdG9yKHJvb3RfZWwpIHtcclxuXHRcdFx0dGhpcy5yb290X2VsID0gcm9vdF9lbDtcclxuXHRcdFx0dGhpcy5pZnJhbWUgID0gcm9vdF9lbC5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtd3BiYy1iZmItcHJldmlldy1pZnJhbWU9XCIxXCJdJyApO1xyXG5cdFx0XHR0aGlzLmxvYWRlciAgPSByb290X2VsLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS13cGJjLWJmYi1wcmV2aWV3LWxvYWRlcj1cIjFcIl0nICk7IC8vIE5FV1xyXG5cdFx0XHR0aGlzLmJ1dHRvbiAgPSBudWxsOyAvLyBObyBsb2NhbCBcIlVwZGF0ZSBQcmV2aWV3XCIgYnV0dG9uIGluIHBhbmVsIGFueW1vcmUuXHJcblxyXG5cdFx0XHR0aGlzLm5vbmNlICAgPSByb290X2VsLmdldEF0dHJpYnV0ZSggJ2RhdGEtcHJldmlldy1ub25jZScgKSB8fCAnJztcclxuXHRcdFx0dGhpcy5pc19idXN5ID0gZmFsc2U7XHJcblxyXG5cdFx0XHRpZiAoICF0aGlzLmlmcmFtZSApIHtcclxuXHRcdFx0XHRkZXYuZXJyb3IoICd3cGJjX2JmYl9wcmV2aWV3X2NsaWVudCcsICdNaXNzaW5nIGlmcmFtZSBlbGVtZW50JyApO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5iaW5kX2V2ZW50cygpO1xyXG5cdFx0fVxyXG5cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNob3cvaGlkZSB0aGUgb3ZlcmxheSBsb2FkZXIgb3ZlciB0aGUgaWZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNfdmlzaWJsZVxyXG5cdFx0ICovXHJcblx0XHRzZXRfbG9hZGVyX3Zpc2libGUoaXNfdmlzaWJsZSkge1xyXG5cdFx0XHRpZiAoICF0aGlzLmxvYWRlciApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKCBpc192aXNpYmxlICkge1xyXG5cdFx0XHRcdHRoaXMubG9hZGVyLmNsYXNzTGlzdC5hZGQoICdpcy12aXNpYmxlJyApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMubG9hZGVyLmNsYXNzTGlzdC5yZW1vdmUoICdpcy12aXNpYmxlJyApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBCaW5kIFVJIGV2ZW50cyAocGFuZWwtbG9jYWwgYnV0dG9uLCBpZiBwcmVzZW50KS5cclxuXHRcdCAqL1xyXG5cdFx0YmluZF9ldmVudHMoKSB7XHJcblx0XHRcdHZhciBzZWxmID0gdGhpcztcclxuXHJcblx0XHRcdGlmICggISB0aGlzLmJ1dHRvbiApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRzZWxmLnVwZGF0ZV9wcmV2aWV3KCk7XHJcblx0XHRcdH0gKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEdldCBjdXJyZW50IEJGQiBzdHJ1Y3R1cmUgZnJvbSBnbG9iYWwgYnVpbGRlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJucyB7T2JqZWN0fG51bGx9XHJcblx0XHQgKi9cclxuXHRcdGdldF9jdXJyZW50X3N0cnVjdHVyZSgpIHtcclxuXHRcdFx0aWYgKCAhIHcud3BiY19iZmIgfHwgdHlwZW9mIHcud3BiY19iZmIuZ2V0X3N0cnVjdHVyZSAhPT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRkZXYuZXJyb3IoICd3cGJjX2JmYl9wcmV2aWV3X2NsaWVudCcsICd3cGJjX2JmYi5nZXRfc3RydWN0dXJlKCkgaXMgbm90IGF2YWlsYWJsZScgKTtcclxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRyZXR1cm4gdy53cGJjX2JmYi5nZXRfc3RydWN0dXJlKCk7XHJcblx0XHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0XHRkZXYuZXJyb3IoICd3cGJjX2JmYl9wcmV2aWV3X2NsaWVudC5nZXRfY3VycmVudF9zdHJ1Y3R1cmUnLCBlICk7XHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFBhcnNlIGNvbWJpbmVkIGxlbmd0aCB2YWx1ZSBsaWtlIFwiMTAwJVwiLCBcIjMyMHB4XCIsIFwiMTIuNXJlbVwiLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxyXG5cdFx0ICogQHJldHVybiB7e251bTpzdHJpbmcsIHVuaXQ6c3RyaW5nfX1cclxuXHRcdCAqL1xyXG5cdFx0cGFyc2VfbGVuZ3RoX3ZhbHVlKHZhbHVlKSB7XHJcblx0XHRcdHZhciByYXcgPSBTdHJpbmcodmFsdWUgPT0gbnVsbCA/ICcnIDogdmFsdWUpLnRyaW0oKTtcclxuXHRcdFx0dmFyIG0gPSByYXcubWF0Y2goL15cXHMqKC0/XFxkKyg/OlxcLlxcZCspPylcXHMqKFthLXolXSopXFxzKiQvaSk7XHJcblx0XHRcdGlmICghbSkge1xyXG5cdFx0XHRcdHJldHVybiB7IG51bTogcmF3LCB1bml0OiAnJyB9O1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiB7IG51bTogKG1bMV0gfHwgJycpLCB1bml0OiAobVsyXSB8fCAnJykgfTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEJ1aWxkIGN1cnJlbnQgZm9ybSBzZXR0aW5ncyBwYXlsb2FkIChzYW1lIHN0cnVjdHVyZSBhcyByZWFsIFNhdmUpOlxyXG5cdFx0ICoge1xyXG5cdFx0ICogICBvcHRpb25zOiB7IC4uLnNvdXJjZS1vZi10cnV0aC4uLiB9LFxyXG5cdFx0ICogICBjc3NfdmFyczogeyAuLi5jb21waWxlZC4uLiB9XHJcblx0XHQgKiB9XHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGZvcm1fbmFtZVxyXG5cdFx0ICogQHJldHVybnMge3tvcHRpb25zOk9iamVjdCwgY3NzX3ZhcnM6T2JqZWN0fX1cclxuXHRcdCAqL1xyXG5cdFx0Z2V0X2N1cnJlbnRfZm9ybV9zZXR0aW5ncyhmb3JtX25hbWUpIHtcblxyXG5cdFx0XHR2YXIgZm9ybV9zZXR0aW5ncyA9IHtcclxuXHRcdFx0XHRvcHRpb25zIDoge30sXHJcblx0XHRcdFx0Y3NzX3ZhcnM6IHt9XHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHQvLyAtLS0gc2FtZSBldmVudCBjb250cmFjdCBhcyBhamF4L19vdXQvYmZiLWFqYXguanMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0XHR3cGJjX2JmYl9fZGlzcGF0Y2hfZXZlbnRfc2FmZSggJ3dwYmM6YmZiOmZvcm1fc2V0dGluZ3M6Y29sbGVjdCcsIHtcclxuXHRcdFx0XHRzZXR0aW5ncyA6IGZvcm1fc2V0dGluZ3MsXHJcblx0XHRcdFx0Zm9ybV9uYW1lOiBmb3JtX25hbWUgfHwgJ3N0YW5kYXJkJ1xyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHQvLyBTdHJpY3Q6IHJlcXVpcmUgY29ycmVjdCBzaGFwZS5cclxuXHRcdFx0aWYgKCAhZm9ybV9zZXR0aW5ncyB8fCB0eXBlb2YgZm9ybV9zZXR0aW5ncyAhPT0gJ29iamVjdCcgKSB7XHJcblx0XHRcdFx0Zm9ybV9zZXR0aW5ncyA9IHsgb3B0aW9uczoge30sIGNzc192YXJzOiB7fSB9O1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICggIWZvcm1fc2V0dGluZ3Mub3B0aW9ucyB8fCB0eXBlb2YgZm9ybV9zZXR0aW5ncy5vcHRpb25zICE9PSAnb2JqZWN0JyApIHtcclxuXHRcdFx0XHRmb3JtX3NldHRpbmdzLm9wdGlvbnMgPSB7fTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoICFmb3JtX3NldHRpbmdzLmNzc192YXJzIHx8IHR5cGVvZiBmb3JtX3NldHRpbmdzLmNzc192YXJzICE9PSAnb2JqZWN0JyApIHtcclxuXHRcdFx0XHRmb3JtX3NldHRpbmdzLmNzc192YXJzID0ge307XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBmb3JtX3NldHRpbmdzO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIFJlYWQgYSBGb3JtIFN0eWxlIGNvbnRyb2wgZGlyZWN0bHkgZnJvbSBET00uXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG5cdFx0ICogQHJldHVybnMge3N0cmluZ3xudWxsfVxuXHRcdCAqL1xuXHRcdHJlYWRfZm9ybV9zdHlsZV9jb250cm9sX3ZhbHVlKGtleSkge1xuXHRcdFx0dmFyIGNvbnRyb2wgPSBudWxsO1xuXHRcdFx0dmFyIGNoZWNrZWQgPSBudWxsO1xuXG5cdFx0XHRpZiAoIGtleSA9PT0gJ2Jvb2tpbmdfZm9ybV9zdHlsZScgKSB7XG5cdFx0XHRcdGNoZWNrZWQgPSBkLnF1ZXJ5U2VsZWN0b3IoICdpbnB1dFt0eXBlPVwicmFkaW9cIl1bbmFtZT1cImJvb2tpbmdfZm9ybV9zdHlsZVwiXTpjaGVja2VkJyApO1xuXHRcdFx0XHRyZXR1cm4gY2hlY2tlZCA/IFN0cmluZyggY2hlY2tlZC52YWx1ZSB8fCAnJyApIDogbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0Y29udHJvbCA9IGQucXVlcnlTZWxlY3RvciggJ1tkYXRhLXdwYmMtYmZiLWZzLWtleT1cIicgKyBrZXkgKyAnXCJdJyApO1xuXHRcdFx0aWYgKCAhIGNvbnRyb2wgKSB7XG5cdFx0XHRcdGNvbnRyb2wgPSBkLmdldEVsZW1lbnRCeUlkKCBrZXkgKTtcblx0XHRcdH1cblx0XHRcdGlmICggISBjb250cm9sICkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBjb250cm9sLm1hdGNoZXMgJiYgY29udHJvbC5tYXRjaGVzKCAnaW5wdXRbdHlwZT1cInJhZGlvXCJdJyApICkge1xuXHRcdFx0XHRjaGVja2VkID0gZC5xdWVyeVNlbGVjdG9yKCAnaW5wdXRbdHlwZT1cInJhZGlvXCJdW25hbWU9XCInICsgY29udHJvbC5uYW1lICsgJ1wiXTpjaGVja2VkJyApO1xuXHRcdFx0XHRyZXR1cm4gY2hlY2tlZCA/IFN0cmluZyggY2hlY2tlZC52YWx1ZSB8fCAnJyApIDogbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0eXBlb2YgY29udHJvbC52YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgKSB7XG5cdFx0XHRcdHJldHVybiBTdHJpbmcoIGNvbnRyb2wudmFsdWUgPT0gbnVsbCA/ICcnIDogY29udHJvbC52YWx1ZSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBCdWlsZCB0aGUgY3VycmVudCBnbG9iYWwgRm9ybSBTdHlsZSBvdmVycmlkZSBmb3IgcHJldmlldyBvbmx5LlxuXHRcdCAqXG5cdFx0ICogQHJldHVybnMge09iamVjdH1cblx0XHQgKi9cblx0XHRnZXRfY3VycmVudF9mb3JtX3N0eWxlX3NldHRpbmdzKCkge1xuXHRcdFx0dmFyIHN0eWxlX2tleXMgPSBbXG5cdFx0XHRcdCdib29raW5nX2Zvcm1fc3R5bGUnLFxuXHRcdFx0XHQnYm9va2luZ19mb3JtX2N1c3RvbV9iYWNrZ3JvdW5kX2NvbG9yJyxcblx0XHRcdFx0J2Jvb2tpbmdfZm9ybV9jdXN0b21fYm9yZGVyX2NvbG9yJyxcblx0XHRcdFx0J2Jvb2tpbmdfZm9ybV9jdXN0b21fYm9yZGVyX3dpZHRoJyxcblx0XHRcdFx0J2Jvb2tpbmdfZm9ybV9jdXN0b21fYm9yZGVyX3JhZGl1cycsXG5cdFx0XHRcdCdib29raW5nX2Zvcm1fY3VzdG9tX3BhZGRpbmdfdmVydGljYWwnLFxuXHRcdFx0XHQnYm9va2luZ19mb3JtX2N1c3RvbV9wYWRkaW5nX2hvcml6b250YWwnLFxuXHRcdFx0XHQnYm9va2luZ19mb3JtX2N1c3RvbV90ZXh0X2NvbG9yJyxcblx0XHRcdFx0J2Jvb2tpbmdfZm9ybV9jdXN0b21fZmllbGRfYmFja2dyb3VuZF9jb2xvcicsXG5cdFx0XHRcdCdib29raW5nX2Zvcm1fY3VzdG9tX2ZpZWxkX3RleHRfY29sb3InLFxuXHRcdFx0XHQnYm9va2luZ19mb3JtX2N1c3RvbV9maWVsZF9ib3JkZXJfY29sb3InLFxuXHRcdFx0XHQnYm9va2luZ19mb3JtX2N1c3RvbV9idXR0b25fYmFja2dyb3VuZF9jb2xvcicsXG5cdFx0XHRcdCdib29raW5nX2Zvcm1fY3VzdG9tX2J1dHRvbl90ZXh0X2NvbG9yJyxcblx0XHRcdFx0J2Jvb2tpbmdfZm9ybV9jdXN0b21fYnV0dG9uX2JvcmRlcl9jb2xvcicsXG5cdFx0XHRcdCdib29raW5nX2Zvcm1fY3VzdG9tX2J1dHRvbl9ob3Zlcl9iYWNrZ3JvdW5kX2NvbG9yJyxcblx0XHRcdFx0J2Jvb2tpbmdfZm9ybV9jdXN0b21fYnV0dG9uX2hvdmVyX3RleHRfY29sb3InLFxuXHRcdFx0XHQnYm9va2luZ19mb3JtX2N1c3RvbV9idXR0b25faG92ZXJfYm9yZGVyX2NvbG9yJyxcblx0XHRcdFx0J2Jvb2tpbmdfZm9ybV9jdXN0b21fc2Vjb25kYXJ5X2J1dHRvbl9iYWNrZ3JvdW5kX2NvbG9yJyxcblx0XHRcdFx0J2Jvb2tpbmdfZm9ybV9jdXN0b21fc2Vjb25kYXJ5X2J1dHRvbl90ZXh0X2NvbG9yJyxcblx0XHRcdFx0J2Jvb2tpbmdfZm9ybV9jdXN0b21fc2Vjb25kYXJ5X2J1dHRvbl9ib3JkZXJfY29sb3InLFxuXHRcdFx0XHQnYm9va2luZ19mb3JtX2N1c3RvbV9zZWNvbmRhcnlfYnV0dG9uX2hvdmVyX2JhY2tncm91bmRfY29sb3InLFxuXHRcdFx0XHQnYm9va2luZ19mb3JtX2N1c3RvbV9zZWNvbmRhcnlfYnV0dG9uX2hvdmVyX3RleHRfY29sb3InLFxuXHRcdFx0XHQnYm9va2luZ19mb3JtX2N1c3RvbV9zZWNvbmRhcnlfYnV0dG9uX2hvdmVyX2JvcmRlcl9jb2xvcidcblx0XHRcdF07XG5cdFx0XHR2YXIgb3V0ID0ge307XG5cdFx0XHR2YXIgY29sbGVjdGVkID0ge307XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cdFx0XHR2YXIgbG9jYWxpemVkID0gdy53cGJjX2JmYl9zZXR0aW5nc192YXJzICYmIHcud3BiY19iZmJfc2V0dGluZ3NfdmFycy5nbG9iYWxfZm9ybV9zdHlsZVxuXHRcdFx0XHQ/IHcud3BiY19iZmJfc2V0dGluZ3NfdmFycy5nbG9iYWxfZm9ybV9zdHlsZVxuXHRcdFx0XHQ6IHt9O1xuXG5cdFx0XHRpZiAoIHcuV1BCQ19CRkJfRm9ybVNldHRpbmdzICYmIHR5cGVvZiB3LldQQkNfQkZCX0Zvcm1TZXR0aW5ncy5jb2xsZWN0ID09PSAnZnVuY3Rpb24nICkge1xuXHRcdFx0XHRjb2xsZWN0ZWQgPSB3LldQQkNfQkZCX0Zvcm1TZXR0aW5ncy5jb2xsZWN0KCAnZ2xvYmFsJyApIHx8IHt9O1xuXHRcdFx0fVxuXG5cdFx0XHRzdHlsZV9rZXlzLmZvckVhY2goIGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdFx0dmFyIGRvbV92YWx1ZSA9IHNlbGYucmVhZF9mb3JtX3N0eWxlX2NvbnRyb2xfdmFsdWUoIGtleSApO1xuXHRcdFx0XHRpZiAoIG51bGwgIT09IGRvbV92YWx1ZSApIHtcblx0XHRcdFx0XHRvdXRba2V5XSA9IGRvbV92YWx1ZTtcblx0XHRcdFx0fSBlbHNlIGlmICggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCBjb2xsZWN0ZWQsIGtleSApICkge1xuXHRcdFx0XHRcdG91dFtrZXldID0gY29sbGVjdGVkW2tleV07XG5cdFx0XHRcdH0gZWxzZSBpZiAoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggbG9jYWxpemVkLCBrZXkgKSApIHtcblx0XHRcdFx0XHRvdXRba2V5XSA9IGxvY2FsaXplZFtrZXldO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cblx0XHRcdHJldHVybiBvdXQ7XG5cdFx0fVxuXHJcblx0XHQvKipcclxuXHRcdCAqIEdldCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGNhbGVuZGFyIHNraW4gVVJMIGZyb20gdGhlIEJ1aWxkZXIgcGFnZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJucyB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHRnZXRfc2VsZWN0ZWRfY2FsZW5kYXJfc2tpbl91cmwoKSB7XHJcblx0XHRcdHZhciBzZWxlY3RfZWwgPSBkLnF1ZXJ5U2VsZWN0b3IoICcuanMtd3BiYy1iZmItY2FsZW5kYXItc2tpbicgKTtcclxuXHRcdFx0aWYgKCBzZWxlY3RfZWwgJiYgc2VsZWN0X2VsLm9wdGlvbnMgKSB7XHJcblx0XHRcdFx0dmFyIHNlbGVjdGVkX29wdGlvbiA9IHNlbGVjdF9lbC5vcHRpb25zWyBzZWxlY3RfZWwuc2VsZWN0ZWRJbmRleCBdO1xyXG5cdFx0XHRcdGlmICggc2VsZWN0ZWRfb3B0aW9uICkge1xyXG5cdFx0XHRcdFx0dmFyIHNlbGVjdGVkX3VybCA9IHNlbGVjdGVkX29wdGlvbi5nZXRBdHRyaWJ1dGUoICdkYXRhLXdwYmMtY2FsZW5kYXItc2tpbi11cmwnICk7XHJcblx0XHRcdFx0XHRpZiAoIHNlbGVjdGVkX3VybCApIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIFN0cmluZyggc2VsZWN0ZWRfdXJsICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR2YXIgc3R5bGVzaGVldCA9IGQuZ2V0RWxlbWVudEJ5SWQoICd3cGJjLWNhbGVuZGFyLXNraW4tY3NzJyApO1xyXG5cdFx0XHRpZiAoIHN0eWxlc2hlZXQgJiYgc3R5bGVzaGVldC5ocmVmICkge1xyXG5cdFx0XHRcdHJldHVybiBTdHJpbmcoIHN0eWxlc2hlZXQuaHJlZiApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gJyc7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBcHBseSB0aGUgdW5zYXZlZCBCdWlsZGVyIGNhbGVuZGFyIHNraW4gaW5zaWRlIHRoZSBsb2FkZWQgUHJldmlldyBpZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHNraW5fdXJsXHJcblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gdHJpZXNcclxuXHRcdCAqL1xyXG5cdFx0YXBwbHlfY2FsZW5kYXJfc2tpbl90b19pZnJhbWUoc2tpbl91cmwsIGRvbmUsIHRyaWVzKSB7XHJcblx0XHRcdHZhciBzZWxmICAgICAgICA9IHRoaXM7XHJcblx0XHRcdHZhciBhdHRlbXB0X251bSA9IE51bWJlciggdHJpZXMgfHwgMCApO1xyXG5cclxuXHRcdFx0aWYgKCAhIHNraW5fdXJsIHx8ICEgdGhpcy5pZnJhbWUgfHwgISB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93ICkge1xyXG5cdFx0XHRcdGlmICggdHlwZW9mIGRvbmUgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0XHRkb25lKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRpZiAoIHR5cGVvZiB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93LndwYmNfX2NhbGVuZGFyX19jaGFuZ2Vfc2tpbiA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRcdHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cud3BiY19fY2FsZW5kYXJfX2NoYW5nZV9za2luKCBza2luX3VybCApO1xyXG5cdFx0XHRcdFx0aWYgKCB0eXBlb2YgZG9uZSA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRcdFx0ZG9uZSgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XHJcblx0XHRcdFx0ZGV2LmVycm9yKCAnd3BiY19iZmJfcHJldmlld19jbGllbnQuYXBwbHlfY2FsZW5kYXJfc2tpbl90b19pZnJhbWUnLCBlICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggYXR0ZW1wdF9udW0gPj0gMjAgKSB7XHJcblx0XHRcdFx0aWYgKCB0eXBlb2YgZG9uZSA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRcdGRvbmUoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR3LnNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRzZWxmLmFwcGx5X2NhbGVuZGFyX3NraW5fdG9faWZyYW1lKCBza2luX3VybCwgZG9uZSwgYXR0ZW1wdF9udW0gKyAxICk7XHJcblx0XHRcdH0sIDEwMCApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2VuZCBzbmFwc2hvdCB0byBzZXJ2ZXIgYW5kIHVwZGF0ZSBpZnJhbWUgc3JjIHdpdGggcmV0dXJuZWQgcHJldmlldyBVUkwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHt7c291cmNlX2J1dHRvbj86SFRNTEVsZW1lbnR9fSBbb3B0c11cclxuXHRcdCAqL1xyXG5cdFx0dXBkYXRlX3ByZXZpZXcoIG9wdHMgKSB7XHJcblx0XHRcdGlmICggdGhpcy5pc19idXN5ICkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dmFyIHN0cnVjdHVyZSA9IHRoaXMuZ2V0X2N1cnJlbnRfc3RydWN0dXJlKCk7XHJcblx0XHRcdGlmICggISBzdHJ1Y3R1cmUgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLnNldF9sb2FkZXJfdmlzaWJsZSggdHJ1ZSApO1xyXG5cclxuXHRcdFx0dmFyIG9wdGlvbnMgICAgPSBvcHRzIHx8IHt9O1xyXG5cdFx0XHR2YXIgc291cmNlX2J0biA9IG9wdGlvbnMuc291cmNlX2J1dHRvbiB8fCBudWxsO1xyXG5cclxuXHRcdFx0dmFyICRzb3VyY2VfYnRuID0gbnVsbDtcclxuXHRcdFx0aWYgKCBzb3VyY2VfYnRuICYmIHcualF1ZXJ5ICYmIHR5cGVvZiB3LndwYmNfYmZiX19idXR0b25fYnVzeV9zdGFydCA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHQkc291cmNlX2J0biA9IHcualF1ZXJ5KCBzb3VyY2VfYnRuICk7XHJcblx0XHRcdFx0aWYgKCAkc291cmNlX2J0biAmJiAkc291cmNlX2J0bi5sZW5ndGggKSB7XHJcblx0XHRcdFx0XHR3LndwYmNfYmZiX19idXR0b25fYnVzeV9zdGFydCggJHNvdXJjZV9idG4gKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuaXNfYnVzeSA9IHRydWU7XHJcblx0XHRcdHRoaXMuc2V0X2J1dHRvbl9idXN5KCB0cnVlICk7IC8vIGxvY2FsIFwiVXBkYXRlIFByZXZpZXdcIiBidXR0b24gaW4gdGhlIHBhbmVsXHJcblxyXG5cdFx0XHR2YXIgcGF5bG9hZCA9IG5ldyB3LkZvcm1EYXRhKCk7XHJcblx0XHRcdHZhciBjZmcgICAgID0gdy5XUEJDX0JGQl9BamF4IHx8IHt9O1xyXG5cclxuXHRcdFx0Ly8gQnVpbGQgc2V0dGluZ3MgcGF5bG9hZCAoc2FtZSBhcyByZWFsIHNhdmluZykuXG5cdFx0XHR2YXIgZm9ybV9zZXR0aW5ncyA9IHRoaXMuZ2V0X2N1cnJlbnRfZm9ybV9zZXR0aW5ncyggY2ZnLmZvcm1fbmFtZSB8fCAnc3RhbmRhcmQnICk7XG5cdFx0XHR2YXIgcHJldmlld19mb3JtX3N0eWxlID0gdGhpcy5nZXRfY3VycmVudF9mb3JtX3N0eWxlX3NldHRpbmdzKCk7XG5cclxuXHRcdFx0cGF5bG9hZC5hcHBlbmQoICdhY3Rpb24nLCAnV1BCQ19BSlhfQkZCX1NBVkVfRk9STV9DT05GSUcnICk7XHJcblx0XHRcdHBheWxvYWQuYXBwZW5kKCAnbm9uY2UnLCAoIGNmZy5ub25jZV9zYXZlIHx8IHRoaXMubm9uY2UgfHwgJycgKSApO1xyXG5cclxuXHRcdFx0Ly8gSU1QT1JUQU5UOlxyXG5cdFx0XHQvLyAtIGZvcm1fbmFtZSBpcyB0aGUgbG9naWNhbCBmb3JtIGtleSAodXN1YWxseSAnc3RhbmRhcmQnIG9yIHNlbGVjdGVkIGZvcm0pXHJcblx0XHRcdHBheWxvYWQuYXBwZW5kKCAnZm9ybV9uYW1lJywgKCBjZmcuZm9ybV9uYW1lIHx8ICdzdGFuZGFyZCcgKSApO1xyXG5cdFx0XHRwYXlsb2FkLmFwcGVuZCggJ3N0YXR1cycsICdwcmV2aWV3JyApO1xyXG5cdFx0XHRwYXlsb2FkLmFwcGVuZCggJ3JldHVybl9wcmV2aWV3X3VybCcsICcxJyApO1xyXG5cclxuXHRcdFx0cGF5bG9hZC5hcHBlbmQoICdlbmdpbmUnLCAoIGNmZy5lbmdpbmUgfHwgJ2JmYicgKSApO1xyXG5cdFx0XHRwYXlsb2FkLmFwcGVuZCggJ2VuZ2luZV92ZXJzaW9uJywgKCBjZmcuZW5naW5lX3ZlcnNpb24gfHwgJzEuMCcgKSApO1xyXG5cclxuXHRcdFx0cGF5bG9hZC5hcHBlbmQoICdzdHJ1Y3R1cmUnLCBKU09OLnN0cmluZ2lmeSggc3RydWN0dXJlICkgKTtcclxuXHJcblx0XHRcdC8vIFNlbmQgcmVhbCBzZXR0aW5ncyAob3B0aW9ucyArIGNvbXBpbGVkIGNzc192YXJzKS5cblx0XHRcdHBheWxvYWQuYXBwZW5kKCAnc2V0dGluZ3MnLCBKU09OLnN0cmluZ2lmeSggZm9ybV9zZXR0aW5ncyApICk7XG5cdFx0XHRwYXlsb2FkLmFwcGVuZCggJ3ByZXZpZXdfZm9ybV9zdHlsZScsIEpTT04uc3RyaW5naWZ5KCBwcmV2aWV3X2Zvcm1fc3R5bGUgKSApO1xuXHJcblx0XHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHRcdFx0Ly8gQ2hvb3NlIHdoZXJlIGFkdmFuY2VkX2Zvcm0gKyBjb250ZW50X2Zvcm0gYXJlIHRha2VuIGZyb20gKGF1dG98YnVpbGRlcnxhZHZhbmNlZClcclxuXHRcdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdFx0XHR2YXIgcHJldmlld19zb3VyY2UgPSB3cGJjX2JmYl9wcmV2aWV3X19nZXRfc291cmNlKCBjZmcsIHNvdXJjZV9idG4gKTtcclxuXHRcdFx0cGF5bG9hZC5hcHBlbmQoICdwcmV2aWV3X3NvdXJjZScsIHByZXZpZXdfc291cmNlICk7XHJcblxyXG5cdFx0XHR2YXIgYWR2ID0gbnVsbDtcclxuXHJcblx0XHRcdC8vIDEpIFRyeSBBZHZhbmNlZCBNb2RlIHRleHQgKGlmIHNlbGVjdGVkIC8gYXV0bytkaXJ0eSlcclxuXHRcdFx0aWYgKCBwcmV2aWV3X3NvdXJjZSA9PT0gJ2FkdmFuY2VkJyB8fCBwcmV2aWV3X3NvdXJjZSA9PT0gJ2F1dG8nICkge1xyXG5cclxuXHRcdFx0XHRhZHYgPSB3cGJjX2JmYl9wcmV2aWV3X19yZWFkX2FkdmFuY2VkX21vZGVfcGF5bG9hZCggZCwgdyApO1xyXG5cclxuXHRcdFx0XHR2YXIgY2FuX3VzZV9hZHZhbmNlZCA9XHJcblx0XHRcdFx0XHRcdChwcmV2aWV3X3NvdXJjZSA9PT0gJ2FkdmFuY2VkJykgfHxcclxuXHRcdFx0XHRcdFx0KHByZXZpZXdfc291cmNlID09PSAnYXV0bycgJiYgYWR2ICYmIGFkdi5pc19kaXJ0eSk7XHJcblxyXG5cdFx0XHRcdGlmICggY2FuX3VzZV9hZHZhbmNlZCApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBGb3JjZWQgXCJhZHZhbmNlZFwiIGJ1dCBlbXB0eSAtPiBmYWxsYmFjayB0byBidWlsZGVyIGV4cG9ydC5cclxuXHRcdFx0XHRcdGlmICggISB3cGJjX2JmYl9wcmV2aWV3X19oYXNfdGV4dCggYWR2LmFkdmFuY2VkX2Zvcm0gKSAmJiAhIHdwYmNfYmZiX3ByZXZpZXdfX2hhc190ZXh0KCBhZHYuY29udGVudF9mb3JtICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHR5cGVvZiB3LndwYmNfYWRtaW5fc2hvd19tZXNzYWdlID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0XHRcdHcud3BiY19hZG1pbl9zaG93X21lc3NhZ2UoXHJcblx0XHRcdFx0XHRcdFx0XHQnQWR2YW5jZWQgTW9kZSBpcyBzZWxlY3RlZCwgYnV0IGVkaXRvcnMgYXJlIGVtcHR5LiBVc2luZyBCdWlsZGVyIGV4cG9ydC4nLFxyXG5cdFx0XHRcdFx0XHRcdFx0J3dhcm5pbmcnLFxyXG5cdFx0XHRcdFx0XHRcdFx0NjAwMFxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCB3cGJjX2JmYl9wcmV2aWV3X19oYXNfdGV4dCggYWR2LmFkdmFuY2VkX2Zvcm0gKSApIHtcclxuXHRcdFx0XHRcdFx0XHRwYXlsb2FkLmFwcGVuZCggJ2FkdmFuY2VkX2Zvcm0nLCBhZHYuYWR2YW5jZWRfZm9ybSApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmICggd3BiY19iZmJfcHJldmlld19faGFzX3RleHQoIGFkdi5jb250ZW50X2Zvcm0gKSApIHtcclxuXHRcdFx0XHRcdFx0XHRwYXlsb2FkLmFwcGVuZCggJ2NvbnRlbnRfZm9ybScsIGFkdi5jb250ZW50X2Zvcm0gKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIDIpIElmIG5vdCB0YWtlbiBmcm9tIEFkdmFuY2VkIE1vZGUgLT4gZXhwb3J0IGZyb20gQnVpbGRlciBzdHJ1Y3R1cmUgKGN1cnJlbnQgYmVoYXZpb3IpXHJcblx0XHRcdHZhciBhbHJlYWR5X2hhc19hZHYgPVxyXG5cdFx0XHRcdFx0cGF5bG9hZC5oYXMgJiYgKHBheWxvYWQuaGFzKCAnYWR2YW5jZWRfZm9ybScgKSB8fCBwYXlsb2FkLmhhcyggJ2NvbnRlbnRfZm9ybScgKSk7IC8vIHNvbWUgYnJvd3NlcnNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIC8vIHN1cHBvcnRcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgIC8vIEZvcm1EYXRhLmhhc1xyXG5cclxuXHRcdFx0Ly8gRmFsbGJhY2sgZm9yIG9sZCBicm93c2VycyAobm8gRm9ybURhdGEuaGFzKVxyXG5cdFx0XHRpZiAoIHR5cGVvZiBwYXlsb2FkLmhhcyAhPT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRhbHJlYWR5X2hhc19hZHYgPSBmYWxzZTsgLy8ganVzdCB0cnkgZXhwb3J0ZXIgaWYgbmVlZGVkXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggISBhbHJlYWR5X2hhc19hZHYgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggdy5XUEJDX0JGQl9FeHBvcnRlciAmJiB0eXBlb2Ygdy5XUEJDX0JGQl9FeHBvcnRlci5leHBvcnRfYWxsID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0dHJ5IHtcclxuXHJcblx0XHRcdFx0XHRcdHZhciB3aWR0aF9jb21iaW5lZCA9IGZvcm1fc2V0dGluZ3Mub3B0aW9ucy5ib29raW5nX2Zvcm1fbGF5b3V0X3dpZHRoIHx8ICcnO1xyXG5cdFx0XHRcdFx0XHR2YXIgcGFyc2VkX3dpZHRoICAgPSB0aGlzLnBhcnNlX2xlbmd0aF92YWx1ZSggd2lkdGhfY29tYmluZWQgKTtcclxuXHRcdFx0XHRcdFx0dmFyIHdpZHRoX3VuaXQgICAgID0gcGFyc2VkX3dpZHRoLnVuaXQgPyBwYXJzZWRfd2lkdGgudW5pdCA6ICclJztcclxuXHJcblx0XHRcdFx0XHRcdHZhciBleHBvcnRfb3B0aW9ucyA9IHtcclxuXHRcdFx0XHRcdFx0XHRnYXBQZXJjZW50ICAgICAgOiAzLFxyXG5cdFx0XHRcdFx0XHRcdGZvcm1fc2x1ZyAgICAgICA6IChjZmcuZm9ybV9uYW1lIHx8ICdzdGFuZGFyZCcpLFxyXG5cdFx0XHRcdFx0XHRcdGZvcm1fd2lkdGhfdmFsdWU6IHBhcnNlZF93aWR0aC5udW0sXHJcblx0XHRcdFx0XHRcdFx0Zm9ybV93aWR0aF91bml0IDogd2lkdGhfdW5pdFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdFx0dmFyIGV4cG9ydF9yZXN1bHQgPSB3LldQQkNfQkZCX0V4cG9ydGVyLmV4cG9ydF9hbGwoIHN0cnVjdHVyZSB8fCBbXSwgZXhwb3J0X29wdGlvbnMgKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggZXhwb3J0X3Jlc3VsdCApIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIGV4cG9ydF9yZXN1bHQuYWR2YW5jZWRfZm9ybSApIHtcclxuXHRcdFx0XHRcdFx0XHRcdHBheWxvYWQuYXBwZW5kKCAnYWR2YW5jZWRfZm9ybScsIGV4cG9ydF9yZXN1bHQuYWR2YW5jZWRfZm9ybSApO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRpZiAoIGV4cG9ydF9yZXN1bHQuZmllbGRzX2RhdGEgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRwYXlsb2FkLmFwcGVuZCggJ2NvbnRlbnRfZm9ybScsIGV4cG9ydF9yZXN1bHQuZmllbGRzX2RhdGEgKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1dQQkMgQkZCOiBleHBvcnRfYWxsIGVycm9yJywgZSApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHJcblx0XHRcdC8vIFVzZSBzaGFyZWQgaGVscGVyIGlmIGF2YWlsYWJsZTsgZmFsbGJhY2sgdG8gYWpheHVybC5cclxuXHRcdFx0dmFyIGFqYXhfdXJsID0gJyc7XHJcblx0XHRcdGlmICggdHlwZW9mIHcud3BiY19iZmJfX2dldF9hamF4X3VybCA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRhamF4X3VybCA9IHcud3BiY19iZmJfX2dldF9hamF4X3VybCgpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlb2Ygdy5hamF4dXJsICE9PSAndW5kZWZpbmVkJyAmJiB3LmFqYXh1cmwgKSB7XHJcblx0XHRcdFx0YWpheF91cmwgPSB3LmFqYXh1cmw7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHZhciBzZWxmID0gdGhpcztcclxuXHRcdFx0dmFyIHByZXZpZXdfY2FsZW5kYXJfc2tpbl91cmwgPSB0aGlzLmdldF9zZWxlY3RlZF9jYWxlbmRhcl9za2luX3VybCgpO1xyXG5cclxuXHRcdFx0ZnVuY3Rpb24gZW5kX2J1c3lfbm93KCkge1xyXG5cdFx0XHRcdHNlbGYuX2VuZF9idXN5KCAkc291cmNlX2J0biApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoICEgYWpheF91cmwgKSB7XHJcblx0XHRcdFx0ZGV2LmVycm9yKCAnd3BiY19iZmJfcHJldmlld19jbGllbnQnLCAnYWpheCBVUkwgaXMgbm90IGRlZmluZWQnICk7XHJcblx0XHRcdFx0ZW5kX2J1c3lfbm93KCk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR3LmZldGNoKCBhamF4X3VybCwge1xyXG5cdFx0XHRcdG1ldGhvZDogJ1BPU1QnLFxyXG5cdFx0XHRcdGJvZHk6ICAgcGF5bG9hZFxyXG5cdFx0XHR9IClcclxuXHRcdFx0LnRoZW4oIGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG5cdFx0XHRcdHJldHVybiByZXNwb25zZS5qc29uKCk7XHJcblx0XHRcdH0gKVxyXG5cdFx0XHQudGhlbiggZnVuY3Rpb24gKGRhdGEpIHtcclxuXHRcdFx0XHRpZiAoICEgZGF0YSB8fCAhIGRhdGEuc3VjY2VzcyB8fCAhIGRhdGEuZGF0YSB8fCAhIGRhdGEuZGF0YS5wcmV2aWV3X3VybCApIHtcclxuXHRcdFx0XHRcdGRldi5lcnJvciggJ3dwYmNfYmZiX3ByZXZpZXdfY2xpZW50JywgJ1ByZXZpZXcgQUpBWCBlcnJvcicsIGRhdGEgKTtcclxuXHRcdFx0XHRcdGVuZF9idXN5X25vdygpO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCAhIHNlbGYuaWZyYW1lICkge1xyXG5cdFx0XHRcdFx0ZGV2LmVycm9yKCAnd3BiY19iZmJfcHJldmlld19jbGllbnQnLCAnTWlzc2luZyBpZnJhbWUgZWxlbWVudCcgKTtcclxuXHRcdFx0XHRcdGVuZF9idXN5X25vdygpO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gV2FpdCB1bnRpbCBpZnJhbWUgaGFzIHJlYWxseSBsb2FkZWQgdGhlIHByZXZpZXcgVVJMLlxyXG5cdFx0XHRcdHZhciBvbl9sb2FkID0gZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0c2VsZi5pZnJhbWUucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCBvbl9sb2FkICk7XHJcblx0XHRcdFx0XHRzZWxmLmFwcGx5X2NhbGVuZGFyX3NraW5fdG9faWZyYW1lKCBwcmV2aWV3X2NhbGVuZGFyX3NraW5fdXJsLCBlbmRfYnVzeV9ub3cgKTtcclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRzZWxmLmlmcmFtZS5hZGRFdmVudExpc3RlbmVyKCAnbG9hZCcsIG9uX2xvYWQgKTtcclxuXHRcdFx0XHRzZWxmLmlmcmFtZS5zZXRBdHRyaWJ1dGUoICdzcmMnLCBkYXRhLmRhdGEucHJldmlld191cmwgKTtcclxuXHRcdFx0fSApXHJcblx0XHRcdC5jYXRjaCggZnVuY3Rpb24gKGVycikge1xyXG5cdFx0XHRcdGRldi5lcnJvciggJ3dwYmNfYmZiX3ByZXZpZXdfY2xpZW50JywgJ1ByZXZpZXcgQUpBWCBmYWlsZWQnLCBlcnIgKTtcclxuXHRcdFx0XHRlbmRfYnVzeV9ub3coKTtcclxuXHRcdFx0fSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW50ZXJuYWwgaGVscGVyOiBzdG9wIGJ1c3kgc3RhdGUgb24gcGFuZWwgYnV0dG9uICsgb3B0aW9uYWwgdG9wIHRvb2xiYXIgYnV0dG9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7alF1ZXJ5fG51bGx9ICRzb3VyY2VfYnRuXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRfZW5kX2J1c3koJHNvdXJjZV9idG4pIHtcclxuXHRcdFx0dGhpcy5pc19idXN5ID0gZmFsc2U7XHJcblx0XHRcdHRoaXMuc2V0X2J1dHRvbl9idXN5KCBmYWxzZSApO1xyXG5cdFx0XHR0aGlzLnNldF9sb2FkZXJfdmlzaWJsZSggZmFsc2UgKTsgLy8gTkVXXHJcblxyXG5cdFx0XHRpZiAoICRzb3VyY2VfYnRuICYmIHR5cGVvZiB3LndwYmNfYmZiX19idXR0b25fYnVzeV9lbmQgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0dy53cGJjX2JmYl9fYnV0dG9uX2J1c3lfZW5kKCAkc291cmNlX2J0biApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBGb3JjZS1yZXNldCBhbnkgYnVzeSBzdGF0ZXMgcmVsYXRlZCB0byBwcmV2aWV3LlxyXG5cdFx0ICogVGhpcyBpcyBjYWxsZWQgd2hlbiBzd2l0Y2hpbmcgYmFjayB0byBCdWlsZGVyIG1vZGUgKHNvZnQtY2FuY2VsIFVYKS5cclxuXHRcdCAqL1xyXG5cdFx0cmVzZXRfYnVzeV9zdGF0ZSgpIHtcclxuXHRcdFx0dGhpcy5pc19idXN5ID0gZmFsc2U7XHJcblx0XHRcdHRoaXMuc2V0X2J1dHRvbl9idXN5KCBmYWxzZSApOyAvLyBwYW5lbCBidXR0b24sIGlmIGFueVxyXG5cdFx0XHR0aGlzLnNldF9sb2FkZXJfdmlzaWJsZSggZmFsc2UgKTsgLy8gTkVXXHJcblxyXG5cdFx0XHRpZiAoIHcualF1ZXJ5ICYmIHR5cGVvZiB3LndwYmNfYmZiX19idXR0b25fYnVzeV9lbmQgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0Ly8gVG9wIHRvb2xiYXIgYnV0dG9ucyB0aGF0IG1heSBzaG93IFwiTG9hZGluZyBwcmV2aWV3Li4uXCJcclxuXHRcdFx0XHR2YXIgJGJ0bnMgPSB3LmpRdWVyeShcclxuXHRcdFx0XHRcdCdbZGF0YS13cGJjLWJmYi10b3AtcHJldmlldy1idG49XCIxXCJdLCcgK1xyXG5cdFx0XHRcdFx0J1tkYXRhLXdwYmMtYmZiLXRvcC1yZWZyZXNoLWJ0bj1cIjFcIl0nXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0JGJ0bnMuZWFjaCggZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0dmFyICRiID0gdy5qUXVlcnkoIHRoaXMgKTtcclxuXHRcdFx0XHRcdGlmICggJGIuaGFzQ2xhc3MoICd3cGJjLWlzLWJ1c3knICkgKSB7XHJcblx0XHRcdFx0XHRcdHcud3BiY19iZmJfX2J1dHRvbl9idXN5X2VuZCggJGIgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9ICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNpbXBsZSBidXN5IGluZGljYXRvciBmb3IgdGhlIHBhbmVsIFwiVXBkYXRlIFByZXZpZXdcIiBidXR0b24uXHJcblx0XHQgKiBSZXVzZXMgZ2xvYmFsIFdQQkMgYnVzeSBoZWxwZXJzIGlmIGF2YWlsYWJsZSwgc28gdGhlIHNwaW5uZXIgbWF0Y2hlcyBTYXZlL0xvYWQgYnV0dG9ucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IGlzX2J1c3lcclxuXHRcdCAqL1xyXG5cdFx0c2V0X2J1dHRvbl9idXN5KCBpc19idXN5ICkge1xyXG5cdFx0XHRpZiAoICEgdGhpcy5idXR0b24gKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBJZiBqUXVlcnkgKyBnbG9iYWwgaGVscGVycyBleGlzdCwgdXNlIHNhbWUgc3Bpbm5lciBhcyBvdGhlciB0b29sYmFyIGJ1dHRvbnMuXHJcblx0XHRcdGlmICggdy5qUXVlcnkgJiYgdHlwZW9mIHcud3BiY19iZmJfX2J1dHRvbl9idXN5X3N0YXJ0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB3LndwYmNfYmZiX19idXR0b25fYnVzeV9lbmQgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0dmFyICRidG4gPSB3LmpRdWVyeSggdGhpcy5idXR0b24gKTtcclxuXHJcblx0XHRcdFx0aWYgKCBpc19idXN5ICkge1xyXG5cdFx0XHRcdFx0dy53cGJjX2JmYl9fYnV0dG9uX2J1c3lfc3RhcnQoICRidG4gKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dy53cGJjX2JmYl9fYnV0dG9uX2J1c3lfZW5kKCAkYnRuICk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEZhbGxiYWNrOiBzaW1wbGUgZGlzYWJsZWQgc3RhdGUgd2l0aG91dCBzcGlubmVyLlxyXG5cdFx0XHRpZiAoIGlzX2J1c3kgKSB7XHJcblx0XHRcdFx0dGhpcy5idXR0b24uc2V0QXR0cmlidXRlKCAnZGlzYWJsZWQnLCAnZGlzYWJsZWQnICk7XHJcblx0XHRcdFx0dGhpcy5idXR0b24uY2xhc3NMaXN0LmFkZCggJ3dwYmNfYmZiX19wcmV2aWV3X2J0bl9idXN5JyApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuYnV0dG9uLnJlbW92ZUF0dHJpYnV0ZSggJ2Rpc2FibGVkJyApO1xyXG5cdFx0XHRcdHRoaXMuYnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoICd3cGJjX2JmYl9fcHJldmlld19idG5fYnVzeScgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0IGN1cnJlbnQgdmlldyBtb2RlOiBcImJ1aWxkZXJcIiBvciBcInByZXZpZXdcIi5cclxuXHRcdCAqIEFwcGxpZXMvcmVtb3ZlcyBDU1MgY2xhc3Mgb24gPGJvZHk+LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7KCdidWlsZGVyJ3wncHJldmlldycpfSBtb2RlXHJcblx0XHQgKi9cclxuXHRcdHNldF9tb2RlKCBtb2RlICkge1xyXG5cdFx0XHR2YXIgYm9keSA9IGQuYm9keTtcclxuXHRcdFx0aWYgKCAhIGJvZHkgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIG1vZGUgPT09ICdwcmV2aWV3JyApIHtcclxuXHRcdFx0XHRib2R5LmNsYXNzTGlzdC5hZGQoICd3cGJjX2JmYl9fbW9kZV9wcmV2aWV3JyApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGJvZHkuY2xhc3NMaXN0LnJlbW92ZSggJ3dwYmNfYmZiX19tb2RlX3ByZXZpZXcnICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvLyAtLSBIZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8qKlxyXG5cdCAqIElzIFByZXZpZXcgbW9kZSBjdXJyZW50bHkgYWN0aXZlP1xyXG5cdCAqIFdlIHByZWZlciBib2R5IGNsYXNzIChzZXQgYnkgY2xpZW50LnNldF9tb2RlKSwgZmFsbGJhY2sgdG8gYWN0aXZlIHRhYiBpZC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59XHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19iZmJfcHJldmlld19faXNfcHJldmlld19tb2RlX2FjdGl2ZSgpIHtcclxuXHRcdHZhciBib2R5ID0gZC5ib2R5O1xyXG5cdFx0aWYgKCBib2R5ICYmIGJvZHkuY2xhc3NMaXN0ICYmIGJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCAnd3BiY19iZmJfX21vZGVfcHJldmlldycgKSApIHtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gKHdwYmNfYmZiX3ByZXZpZXdfX2dldF9hY3RpdmVfdG9wX3RhYl9pZCgpID09PSAncHJldmlld190YWInKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZW4gYSBmb3JtIGlzIGxvYWRlZCB2aWEgQUpBWCB3aGlsZSBQcmV2aWV3IHRhYiBpcyBhY3RpdmUsXHJcblx0ICogcmVmcmVzaCB0aGUgaWZyYW1lIHNvIGl0IHNob3dzIHRoZSBuZXdseSBsb2FkZWQgZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7d3BiY19iZmJfcHJldmlld19jbGllbnR9IGNsaWVudFxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfYmZiX3ByZXZpZXdfX2JpbmRfZm9ybV9hamF4X2xvYWRlZF9ldmVudHMoY2xpZW50KSB7XHJcblxyXG5cdFx0aWYgKCAhIGNsaWVudCApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFByZXZlbnQgZG91YmxlIGJpbmRpbmcgaWYgdGhpcyBzY3JpcHQgaXMgaW5qZWN0ZWQgdHdpY2UuXHJcblx0XHRpZiAoIHcuX193cGJjX2JmYl9wcmV2aWV3X19mb3JtX2FqYXhfbG9hZGVkX2JvdW5kID09PSAnMScgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdHcuX193cGJjX2JmYl9wcmV2aWV3X19mb3JtX2FqYXhfbG9hZGVkX2JvdW5kID0gJzEnO1xyXG5cclxuXHRcdHZhciBkZWJvdW5jZV9pZCA9IG51bGw7XHJcblxyXG5cdFx0ZC5hZGRFdmVudExpc3RlbmVyKFxyXG5cdFx0XHQnd3BiYzpiZmI6Zm9ybTphamF4X2xvYWRlZCcsXHJcblx0XHRcdGZ1bmN0aW9uIChldikge1xyXG5cclxuXHRcdFx0XHQvLyBPbmx5IGRvIGFueXRoaW5nIGlmIFByZXZpZXcgaXMgY3VycmVudGx5IGFjdGl2ZS5cclxuXHRcdFx0XHRpZiAoICEgd3BiY19iZmJfcHJldmlld19faXNfcHJldmlld19tb2RlX2FjdGl2ZSgpICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dmFyIGRldCA9IChldiAmJiBldi5kZXRhaWwpID8gZXYuZGV0YWlsIDoge307XHJcblx0XHRcdFx0dmFyIGZuICA9IGRldC5mb3JtX25hbWUgPyBTdHJpbmcoIGRldC5mb3JtX25hbWUgKSA6ICcnO1xyXG5cclxuXHRcdFx0XHQvLyBCZXN0LWVmZm9ydDoga2VlcCBjZmcuZm9ybV9uYW1lIGluIHN5bmMgZm9yIHBheWxvYWQgYnVpbGRpbmcuXHJcblx0XHRcdFx0aWYgKCBmbiApIHtcclxuXHRcdFx0XHRcdHcuV1BCQ19CRkJfQWpheCAgICAgICAgICAgPSB3LldQQkNfQkZCX0FqYXggfHwge307XHJcblx0XHRcdFx0XHR3LldQQkNfQkZCX0FqYXguZm9ybV9uYW1lID0gZm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBEZWJvdW5jZSBtdWx0aXBsZSByYXBpZCBsb2FkcyAob3Igc2Vjb25kYXJ5IGV2ZW50cykuXHJcblx0XHRcdFx0aWYgKCBkZWJvdW5jZV9pZCApIHtcclxuXHRcdFx0XHRcdGNsZWFyVGltZW91dCggZGVib3VuY2VfaWQgKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGRlYm91bmNlX2lkID0gc2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0ZGVib3VuY2VfaWQgPSBudWxsO1xyXG5cclxuXHRcdFx0XHRcdC8vIFByZXZpZXcgbWlnaHQgaGF2ZSBiZWVuIGxlZnQgd2hpbGUgd2FpdGluZy5cclxuXHRcdFx0XHRcdGlmICggISB3cGJjX2JmYl9wcmV2aWV3X19pc19wcmV2aWV3X21vZGVfYWN0aXZlKCkgKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBJZiB3ZSBhcmUgYWxyZWFkeSBzZW5kaW5nIHByZXZpZXcsIGRvbid0IHN0YWNrIGFub3RoZXIgcmVxdWVzdC5cclxuXHRcdFx0XHRcdGlmICggY2xpZW50LmlzX2J1c3kgKSB7XHJcblx0XHRcdFx0XHRcdC8vIFRyeSBvbmNlIG1vcmUgc2hvcnRseSAoc2FmZSkuXHJcblx0XHRcdFx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIHdwYmNfYmZiX3ByZXZpZXdfX2lzX3ByZXZpZXdfbW9kZV9hY3RpdmUoKSAmJiAhIGNsaWVudC5pc19idXN5ICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2xpZW50LnVwZGF0ZV9wcmV2aWV3KCB7IHNvdXJjZV9idXR0b246IG51bGwgfSApO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSwgMjUwICk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBXYWl0IHVudGlsIGJ1aWxkZXIgQVBJIGlzIHByZXNlbnQgKGZvcm0gbG9hZCBjYW4gYmUgYXN5bmMpLlxyXG5cdFx0XHRcdFx0dmFyIHRyaWVzID0gMDtcclxuXHRcdFx0XHRcdChmdW5jdGlvbiB3YWl0X2Zvcl9idWlsZGVyKCkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCAhIHdwYmNfYmZiX3ByZXZpZXdfX2lzX3ByZXZpZXdfbW9kZV9hY3RpdmUoKSApIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmICggdy53cGJjX2JmYiAmJiB0eXBlb2Ygdy53cGJjX2JmYi5nZXRfc3RydWN0dXJlID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0XHRcdGNsaWVudC51cGRhdGVfcHJldmlldyggeyBzb3VyY2VfYnV0dG9uOiBudWxsIH0gKTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdHRyaWVzKys7XHJcblx0XHRcdFx0XHRcdGlmICggdHJpZXMgPCAxNSApIHtcclxuXHRcdFx0XHRcdFx0XHRzZXRUaW1lb3V0KCB3YWl0X2Zvcl9idWlsZGVyLCAyMDAgKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSkoKTtcclxuXHRcdFx0XHR9LCAxODAgKTtcclxuXHJcblx0XHRcdH0sXHJcblx0XHRcdHsgcGFzc2l2ZTogdHJ1ZSB9XHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gd3BiY19iZmJfcHJldmlld19fZ2V0X3NvdXJjZShjZmcsIGJ0bikge1xyXG5cclxuXHRcdC8vIHByaW9yaXR5OiBidXR0b24gYXR0ciAtPiBnbG9iYWwgY2ZnIC0+IGRlZmF1bHRcclxuXHRcdHZhciB2ID0gJyc7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRpZiAoIGJ0biAmJiBidG4uZ2V0QXR0cmlidXRlICkge1xyXG5cdFx0XHRcdHYgPSBidG4uZ2V0QXR0cmlidXRlKCAnZGF0YS13cGJjLWJmYi1wcmV2aWV3LXNvdXJjZScgKSB8fCBidG4uZ2V0QXR0cmlidXRlKCAnZGF0YS13cGJjLWJmYi1zYXZlLXNvdXJjZScgKSB8fCAnJztcclxuXHRcdFx0fVxyXG5cdFx0fSBjYXRjaCAoIGUgKSB7fVxyXG5cclxuXHRcdGlmICggISB2ICYmIGNmZyAmJiAoY2ZnLnByZXZpZXdfc291cmNlIHx8IGNmZy5zYXZlX3NvdXJjZSkgKSB7XHJcblx0XHRcdHYgPSBjZmcucHJldmlld19zb3VyY2UgfHwgY2ZnLnNhdmVfc291cmNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdHYgPSBTdHJpbmcoIHYgfHwgJ2F1dG8nICkudG9Mb3dlckNhc2UoKTtcclxuXHRcdGlmICggWyAnYnVpbGRlcicsICdhZHZhbmNlZCcsICdhdXRvJyBdLmluZGV4T2YoIHYgKSA9PT0gLTEgKSB7XHJcblx0XHRcdHYgPSAnYnVpbGRlcic7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdjtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHdwYmNfYmZiX3ByZXZpZXdfX2hhc190ZXh0KHYpIHtcclxuXHRcdHJldHVybiAhISAodiAmJiBTdHJpbmcoIHYgKS50cmltKCkpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gd3BiY19iZmJfcHJldmlld19fcmVhZF9hZHZhbmNlZF9tb2RlX3BheWxvYWQoZCwgdykge1xyXG5cclxuXHRcdC8vIGJlc3Q6IEFQSSAoc3luY3MgQ29kZU1pcnJvciAtPiB0ZXh0YXJlYSlcclxuXHRcdGlmICggdy53cGJjX2JmYl9hZHZhbmNlZF9lZGl0b3JfYXBpICYmIHR5cGVvZiB3LndwYmNfYmZiX2FkdmFuY2VkX2VkaXRvcl9hcGkuZ2V0X3ZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRyZXR1cm4gdy53cGJjX2JmYl9hZHZhbmNlZF9lZGl0b3JfYXBpLmdldF92YWx1ZXMoKTtcclxuXHRcdFx0fSBjYXRjaCAoIGUgKSB7fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGZhbGxiYWNrOiByZWFkIHRleHRhcmVhcyBkaXJlY3RseVxyXG5cdFx0dmFyIHRhX2Zvcm0gICAgPSBkLmdldEVsZW1lbnRCeUlkKCAnd3BiY19iZmJfX2FkdmFuY2VkX2Zvcm1fZWRpdG9yJyApO1xyXG5cdFx0dmFyIHRhX2NvbnRlbnQgPSBkLmdldEVsZW1lbnRCeUlkKCAnd3BiY19iZmJfX2NvbnRlbnRfZm9ybV9lZGl0b3InICk7XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0YWR2YW5jZWRfZm9ybTogdGFfZm9ybSA/IFN0cmluZyggdGFfZm9ybS52YWx1ZSB8fCAnJyApIDogJycsXHJcblx0XHRcdGNvbnRlbnRfZm9ybSA6IHRhX2NvbnRlbnQgPyBTdHJpbmcoIHRhX2NvbnRlbnQudmFsdWUgfHwgJycgKSA6ICcnLFxyXG5cdFx0XHRpc19kaXJ0eSAgICAgOiBmYWxzZVxyXG5cdFx0fTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElzIHRoaXMgZWxlbWVudCB0aGUgUHJldmlldyBUQUIgbGluayBpbiB0b3AgdGFicyBuYXY/XHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fG51bGx9IGVsXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2JmYl9wcmV2aWV3X19pc19wcmV2aWV3X3RhYl9saW5rKGVsKSB7XHJcblx0XHRpZiAoICFlbCB8fCAhZWwuZ2V0QXR0cmlidXRlICkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gKFxyXG5cdFx0XHRlbC5nZXRBdHRyaWJ1dGUoICdkYXRhLXdwYmMtYmZiLWFjdGlvbicgKSA9PT0gJ3BhbmVsJyAmJlxyXG5cdFx0XHRlbC5nZXRBdHRyaWJ1dGUoICdkYXRhLXdwYmMtYmZiLXRhYicgKSA9PT0gJ3ByZXZpZXdfdGFiJ1xyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElzIHRoaXMgZWxlbWVudCB0aGUgQnVpbGRlciBUQUIgbGluayBpbiB0b3AgdGFicyBuYXY/XHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fG51bGx9IGVsXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2JmYl9wcmV2aWV3X19pc19idWlsZGVyX3RhYl9saW5rKGVsKSB7XHJcblx0XHRpZiAoICFlbCB8fCAhZWwuZ2V0QXR0cmlidXRlICkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gKFxyXG5cdFx0XHRlbC5nZXRBdHRyaWJ1dGUoICdkYXRhLXdwYmMtYmZiLWFjdGlvbicgKSA9PT0gJ3BhbmVsJyAmJlxyXG5cdFx0XHRlbC5nZXRBdHRyaWJ1dGUoICdkYXRhLXdwYmMtYmZiLXRhYicgKSA9PT0gJ2J1aWxkZXJfdGFiJ1xyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFjdGl2YXRlIGEgXCJwYW5lbFwiIHRhYiBhbmQgc2hvdyBpdHMgcGFuZWwgc2VjdGlvbiAoc2NvcGVkKS5cclxuXHQgKlxyXG5cdCAqIFN0cmF0ZWd5OlxyXG5cdCAqIDEpIFRyeSB0byBjbGljayB0aGUgcmVhbCB0b3AtdGFiIGxpbmsgKGJlc3QpLlxyXG5cdCAqIDIpIElmIGxpbmsgZG9lcyBub3QgZXhpc3QgKGUuZy4gUHJldmlldyB0YWIgcmVtb3ZlZCBmcm9tIG5hdiksIGRvIGEgc2NvcGVkIG1hbnVhbCBzd2l0Y2g6XHJcblx0ICogICAgLSB1c2UgbmF2J3MgZGF0YS13cGJjLWJmYi1wYW5lbHMtcm9vdCArIGRhdGEtd3BiYy1iZmItcGFuZWwtY2xhc3NcclxuXHQgKiAgICAtIGhpZGUvc2hvdyBPTkxZIHRob3NlIG91dGVyIHBhbmVsc1xyXG5cdCAqICAgIC0gRE8gTk9UIHRvdWNoIGlubmVyIHBhbmVsc1xyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRhYl9pZFxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59XHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19iZmJfX2FjdGl2YXRlX3BhbmVsX3RhYih0YWJfaWQpIHtcclxuXHJcblx0XHR0YWJfaWQgPSBTdHJpbmcoIHRhYl9pZCB8fCAnJyApLnRyaW0oKTtcclxuXHRcdGlmICggISB0YWJfaWQgKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyAxKSBCZXN0OiB0cmlnZ2VyIGV4aXN0aW5nIHRvcC10YWJzIHN3aXRjaGluZyBieSBjbGlja2luZyB0aGUgdGFiIGxpbmsgKGlmIGl0IGV4aXN0cykuXHJcblx0XHR2YXIgdGFiX2xpbmsgPSBkLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS13cGJjLWJmYi1hY3Rpb249XCJwYW5lbFwiXVtkYXRhLXdwYmMtYmZiLXRhYj1cIicgKyB0YWJfaWQgKyAnXCJdJyApO1xyXG5cdFx0aWYgKCB0YWJfbGluayAmJiB0eXBlb2YgdGFiX2xpbmsuY2xpY2sgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0dGFiX2xpbmsuY2xpY2soKTtcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fSBjYXRjaCAoIF9lICkge31cclxuXHRcdH1cclxuXHJcblx0XHQvLyAyKSBGYWxsYmFjazogc2NvcGVkIG1hbnVhbCB0b2dnbGUgKG91dGVyIHBhbmVscyBvbmx5KS5cclxuXHRcdHZhciBuYXYgPSBkLmdldEVsZW1lbnRCeUlkKCAnd3BiY19iZmJfX3RvcF9ob3Jpc29udGFsX25hdicgKTtcclxuXHJcblx0XHQvLyBEZXRlcm1pbmUgb3V0ZXIgcGFuZWxzIHJvb3QuXHJcblx0XHR2YXIgcGFuZWxzX3Jvb3QgICAgICAgICAgPSBkO1xyXG5cdFx0dmFyIHBhbmVsc19yb290X3NlbGVjdG9yID0gJyc7XHJcblxyXG5cdFx0aWYgKCBuYXYgKSB7XHJcblx0XHRcdHBhbmVsc19yb290X3NlbGVjdG9yID0gbmF2LmdldEF0dHJpYnV0ZSggJ2RhdGEtd3BiYy1iZmItcGFuZWxzLXJvb3QnICkgfHwgJyc7XHJcblx0XHRcdHBhbmVsc19yb290X3NlbGVjdG9yID0gU3RyaW5nKCBwYW5lbHNfcm9vdF9zZWxlY3RvciB8fCAnJyApLnRyaW0oKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBGYWxsYmFjayBpZiBhdHRyaWJ1dGUgbWlzc2luZzogcHJlZmVyICN3cGJjX2JmYl9fdG9wX3BhbmVscyBpZiBwcmVzZW50LlxyXG5cdFx0aWYgKCAhIHBhbmVsc19yb290X3NlbGVjdG9yICkge1xyXG5cdFx0XHRwYW5lbHNfcm9vdF9zZWxlY3RvciA9ICcjd3BiY19iZmJfX3RvcF9wYW5lbHMnO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggcGFuZWxzX3Jvb3Rfc2VsZWN0b3IgKSB7XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0dmFyIHJvb3RfZWwgPSBkLnF1ZXJ5U2VsZWN0b3IoIHBhbmVsc19yb290X3NlbGVjdG9yICk7XHJcblx0XHRcdFx0aWYgKCByb290X2VsICkge1xyXG5cdFx0XHRcdFx0cGFuZWxzX3Jvb3QgPSByb290X2VsO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBjYXRjaCAoIF9lMiApIHt9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRGV0ZXJtaW5lIG91dGVyIGJhc2UgY2xhc3MgKElNUE9SVEFOVDogbXVzdCBiZSB0aGUgT1VURVIgYmFzZSwgbm90IHdwYmNfYmZiX190YWJfc2VjdGlvbikuXHJcblx0XHR2YXIgcGFuZWxfYmFzZV9jbGFzcyA9ICd3cGJjX2JmYl9fdG9wX3RhYl9zZWN0aW9uJztcclxuXHRcdGlmICggbmF2ICkge1xyXG5cdFx0XHR2YXIgZnJvbV9uYXYgPSBuYXYuZ2V0QXR0cmlidXRlKCAnZGF0YS13cGJjLWJmYi1wYW5lbC1jbGFzcycgKSB8fCAnJztcclxuXHRcdFx0ZnJvbV9uYXYgICAgID0gU3RyaW5nKCBmcm9tX25hdiB8fCAnJyApLnRyaW0oKTtcclxuXHRcdFx0aWYgKCBmcm9tX25hdiApIHtcclxuXHRcdFx0XHRwYW5lbF9iYXNlX2NsYXNzID0gZnJvbV9uYXY7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBVcGRhdGUgYWN0aXZlIHRhYiBvbiBuYXYgKHNvdXJjZSBvZiB0cnV0aCkuXHJcblx0XHRpZiAoIG5hdiApIHtcclxuXHRcdFx0bmF2LnNldEF0dHJpYnV0ZSggJ2RhdGEtYWN0aXZlLXRhYicsIHRhYl9pZCApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEhpZGUgT05MWSBvdXRlciBwYW5lbHMgKHNjb3BlZCBieSBiYXNlIGNsYXNzKS5cclxuXHRcdHZhciBzZWxlY3Rvcl9hbGwgPSAnLicgKyBwYW5lbF9iYXNlX2NsYXNzO1xyXG5cdFx0dmFyIHBhbmVsX25vZGVzICA9IHBhbmVsc19yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIHNlbGVjdG9yX2FsbCApO1xyXG5cclxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHBhbmVsX25vZGVzLmxlbmd0aDsgaSsrICkge1xyXG5cdFx0XHRwYW5lbF9ub2Rlc1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFNob3cgcmVxdWVzdGVkIG91dGVyIHBhbmVsLlxyXG5cdFx0dmFyIHNlbGVjdG9yX2FjdGl2ZSA9ICcuJyArIHBhbmVsX2Jhc2VfY2xhc3MgKyAnX18nICsgdGFiX2lkO1xyXG5cdFx0dmFyIGFjdGl2ZV9wYW5lbCAgICA9IHBhbmVsc19yb290LnF1ZXJ5U2VsZWN0b3IoIHNlbGVjdG9yX2FjdGl2ZSApO1xyXG5cclxuXHRcdGlmICggISBhY3RpdmVfcGFuZWwgKSB7XHJcblx0XHRcdC8vIEJhY2t3YXJkLWNvbXBhdGlibGUgZmFsbGJhY2sgKGlmIHNvbWVvbmUgZm9yZ290IHRvIGFkZCBvdXRlciBjbGFzc2VzKS5cclxuXHRcdFx0YWN0aXZlX3BhbmVsID0gcGFuZWxzX3Jvb3QucXVlcnlTZWxlY3RvciggJy53cGJjX2JmYl9fdGFiX3NlY3Rpb25fXycgKyB0YWJfaWQgKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGFjdGl2ZV9wYW5lbCApIHtcclxuXHRcdFx0YWN0aXZlX3BhbmVsLnN0eWxlLmRpc3BsYXkgPSAnJztcclxuXHRcdH1cclxuXHJcblx0XHQvLyBNYXJrIGFjdGl2ZSBpdGVtIGluIG91dGVyIG5hdiBpZiBpdCBleGlzdHMgKFByZXZpZXcgY2FuIGJlIG1pc3NpbmcpLlxyXG5cdFx0aWYgKCBuYXYgKSB7XHJcblx0XHRcdHZhciBpdGVtcyA9IG5hdi5xdWVyeVNlbGVjdG9yQWxsKCAnLndwYmNfdWlfZWxfX2hvcmlzX25hdl9pdGVtJyApO1xyXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCBpdGVtcy5sZW5ndGg7IGorKyApIHtcclxuXHRcdFx0XHRpdGVtc1tqXS5jbGFzc0xpc3QucmVtb3ZlKCAnYWN0aXZlJyApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR2YXIgYWN0aXZlX2l0ZW0gPSBuYXYucXVlcnlTZWxlY3RvciggJy53cGJjX3VpX2VsX19ob3Jpc19uYXZfaXRlbV9fJyArIHRhYl9pZCApO1xyXG5cdFx0XHRpZiAoIGFjdGl2ZV9pdGVtICkge1xyXG5cdFx0XHRcdGFjdGl2ZV9pdGVtLmNsYXNzTGlzdC5hZGQoICdhY3RpdmUnICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBFbWl0IHNhbWUgZXZlbnQgYXMgYmZiLXRvcC10YWJzLmpzIHNvIG90aGVyIG1vZHVsZXMgc3RheSBpbiBzeW5jLlxyXG5cdFx0dHJ5IHtcclxuXHRcdFx0ZC5kaXNwYXRjaEV2ZW50KFxyXG5cdFx0XHRcdG5ldyBDdXN0b21FdmVudCggJ3dwYmM6YmZiOnRvcC10YWInLCB7XHJcblx0XHRcdFx0XHRkZXRhaWw6IHtcclxuXHRcdFx0XHRcdFx0dGFiICAgOiB0YWJfaWQsXHJcblx0XHRcdFx0XHRcdG5hdl9pZDogKG5hdiAmJiBuYXYuaWQpID8gU3RyaW5nKCBuYXYuaWQgKSA6ICcnXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSApXHJcblx0XHRcdCk7XHJcblx0XHR9IGNhdGNoICggX2UzICkge31cclxuXHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBHZXQgY3VycmVudGx5IGFjdGl2ZSB0b3AgdGFiIGlkIGZyb20gdGhlIG5hdiBjb250YWluZXIuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XHJcblx0ICovXHJcblx0ZnVuY3Rpb24gd3BiY19iZmJfcHJldmlld19fZ2V0X2FjdGl2ZV90b3BfdGFiX2lkKCkge1xyXG5cdFx0dmFyIG5hdiA9IGQuZ2V0RWxlbWVudEJ5SWQoICd3cGJjX2JmYl9fdG9wX2hvcmlzb250YWxfbmF2JyApO1xyXG5cdFx0aWYgKCAhbmF2ICkge1xyXG5cdFx0XHRyZXR1cm4gJyc7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbmF2LmdldEF0dHJpYnV0ZSggJ2RhdGEtYWN0aXZlLXRhYicgKSB8fCAnJztcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN5bmMgcHJldmlldyBcIm1vZGVcIiB3aXRoIGN1cnJlbnRseSBhY3RpdmUgdG9wIHRhYi5cclxuXHQgKlxyXG5cdCAqIFJ1bGVzOlxyXG5cdCAqIC0gcHJldmlld190YWIgPT4gZW5hYmxlIHByZXZpZXcgbW9kZSAoYnV0dG9ucyBtYWtlIHNlbnNlKVxyXG5cdCAqIC0gYW55IG90aGVyIHRhYiA9PiBkaXNhYmxlIHByZXZpZXcgbW9kZSArIHJlc2V0IGJ1c3kgc3RhdGVzXHJcblx0ICpcclxuXHQgKiBJTVBPUlRBTlQ6XHJcblx0ICogLSBXZSBkbyBOT1QgY2hhbmdlIHRoZSBhY3RpdmUgdG9wIHRhYiBoZXJlIChubyBwYW5lbCBzd2l0Y2hpbmcpLlxyXG5cdCAqICAgV2Ugb25seSBzeW5jIHByZXZpZXcgVUkgbW9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0YWJfaWRcclxuXHQgKiBAcGFyYW0ge3dwYmNfYmZiX3ByZXZpZXdfY2xpZW50fSBjbGllbnRcclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2JmYl9wcmV2aWV3X19zeW5jX21vZGVfdG9fdGFiKHRhYl9pZCwgY2xpZW50KSB7XHJcblxyXG5cdFx0dGFiX2lkID0gU3RyaW5nKCB0YWJfaWQgfHwgJycgKTtcclxuXHJcblx0XHRpZiAoICFjbGllbnQgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoICdwcmV2aWV3X3RhYicgPT09IHRhYl9pZCApIHtcclxuXHRcdFx0Y2xpZW50LnNldF9tb2RlKCAncHJldmlldycgKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIExlYXZpbmcgcHJldmlldyAtPiBzb2Z0LWNhbmNlbCBidXN5IHN0YXRlIGFuZCBoaWRlIHByZXZpZXctc3BlY2lmaWMgdG9vbGJhci5cclxuXHRcdGlmICggdHlwZW9mIGNsaWVudC5yZXNldF9idXN5X3N0YXRlID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRjbGllbnQucmVzZXRfYnVzeV9zdGF0ZSgpO1xyXG5cdFx0fVxyXG5cdFx0Y2xpZW50LnNldF9tb2RlKCAnYnVpbGRlcicgKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEJpbmQgdG8gdG9wLXRhYiBzd2l0Y2ggZXZlbnQgZW1pdHRlZCBieSBiZmItdG9wLXRhYnMuanMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3dwYmNfYmZiX3ByZXZpZXdfY2xpZW50fSBjbGllbnRcclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2JmYl9wcmV2aWV3X19iaW5kX3RvcF90YWJfZXZlbnRzKGNsaWVudCkge1xyXG5cclxuXHRcdC8vIFN5bmMgaW1tZWRpYXRlbHkgKGluIGNhc2UgZXZlbnQgYWxyZWFkeSBmaXJlZCBiZWZvcmUgdGhpcyBzY3JpcHQgaW5pdCkuXHJcblx0XHR3cGJjX2JmYl9wcmV2aWV3X19zeW5jX21vZGVfdG9fdGFiKCB3cGJjX2JmYl9wcmV2aWV3X19nZXRfYWN0aXZlX3RvcF90YWJfaWQoKSwgY2xpZW50ICk7XHJcblxyXG5cdFx0Ly8gUmVhY3QgdG8gZnV0dXJlIHRhYiBjaGFuZ2VzLlxyXG5cdFx0ZC5hZGRFdmVudExpc3RlbmVyKCAnd3BiYzpiZmI6dG9wLXRhYicsIGZ1bmN0aW9uIChldikge1xyXG5cdFx0XHR2YXIgZGV0ICAgICA9IChldiAmJiBldi5kZXRhaWwpID8gZXYuZGV0YWlsIDoge307XHJcblx0XHRcdHZhciB0YWJfaWQgID0gZGV0LnRhYiA/IFN0cmluZyggZGV0LnRhYiApIDogJyc7XHJcblx0XHRcdHZhciBuYXZfaWQgID0gZGV0Lm5hdl9pZCA/IFN0cmluZyggZGV0Lm5hdl9pZCApIDogJyc7XHJcblx0XHRcdHZhciBwcmV2X2lkID0gZGV0LnByZXZfdGFiID8gU3RyaW5nKCBkZXQucHJldl90YWIgKSA6ICcnO1xyXG5cclxuXHRcdFx0Ly8gSWYgdXNlciBzd2l0Y2hlZCB0byBwcmV2aWV3X3RhYiBpbiB0aGUgTUFJTiB0b3AgbmF2LFxyXG5cdFx0XHQvLyByZW1lbWJlciB3aGF0IHRhYiB0aGV5IGNhbWUgZnJvbS5cclxuXHRcdFx0aWYgKCBuYXZfaWQgPT09IFRPUF9OQVZfSUQgJiYgdGFiX2lkID09PSAncHJldmlld190YWInICYmIHByZXZfaWQgJiYgcHJldl9pZCAhPT0gJ3ByZXZpZXdfdGFiJyApIHtcclxuXHRcdFx0XHRyZXR1cm5fdGFiX2lkID0gcHJldl9pZDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0d3BiY19iZmJfcHJldmlld19fc3luY19tb2RlX3RvX3RhYiggdGFiX2lkLCBjbGllbnQgKTtcclxuXHRcdH0gKTtcclxuXHJcblx0fVxyXG5cclxuXHJcblx0Ly8gLS0gQmluZCB8IEluaXQgb24gTG9hZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHR2YXIgVE9QX05BVl9JRCA9ICd3cGJjX2JmYl9fdG9wX2hvcmlzb250YWxfbmF2JztcclxuXHR2YXIgcmV0dXJuX3RhYl9pZCA9ICdidWlsZGVyX3RhYic7XHJcblxyXG5cdGZ1bmN0aW9uIHJlbWVtYmVyX3JldHVybl90YWJfZnJvbV9kb20oKSB7XHJcblx0XHR2YXIgY3VyID0gd3BiY19iZmJfcHJldmlld19fZ2V0X2FjdGl2ZV90b3BfdGFiX2lkKCk7XHJcblx0XHRpZiAoY3VyICYmIGN1ciAhPT0gJ3ByZXZpZXdfdGFiJykge1xyXG5cdFx0XHRyZXR1cm5fdGFiX2lkID0gY3VyO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0X3JldHVybl90YWJfaWQoKSB7XHJcblx0XHR2YXIgdCA9IFN0cmluZyhyZXR1cm5fdGFiX2lkIHx8ICcnKS50cmltKCk7XHJcblx0XHRpZiAoIXQgfHwgdCA9PT0gJ3ByZXZpZXdfdGFiJykgdCA9ICdidWlsZGVyX3RhYic7XHJcblx0XHRyZXR1cm4gdDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEF1dG8taW5pdCBwcmV2aWV3IGNsaWVudCBvbiBCdWlsZGVyIHBhZ2UgYW5kIHdpcmUgdG9wIHRvb2xiYXIgYnV0dG9ucy5cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB3cGJjX2JmYl9pbml0X3ByZXZpZXdfY2xpZW50KCkge1xyXG5cdFx0dmFyIHJvb3QgPSBkLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS13cGJjLWJmYi1wcmV2aWV3LXJvb3Q9XCIxXCJdJyApO1xyXG5cclxuXHRcdGlmICggIXJvb3QgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgY2xpZW50ID0gbmV3IHdwYmNfYmZiX3ByZXZpZXdfY2xpZW50KCByb290ICk7XHJcblxyXG5cdFx0aWYgKCAhdy5XUEJDX0JGQl9QcmV2aWV3ICkge1xyXG5cdFx0XHR3LldQQkNfQkZCX1ByZXZpZXcgPSB7XHJcblx0XHRcdFx0Y2xpZW50OiBjbGllbnQsXHJcblxyXG5cdFx0XHRcdHNob3dfcHJldmlldzogZnVuY3Rpb24gKG9wdHMpIHtcclxuXHRcdFx0XHRcdHZhciBvcHQgPSBvcHRzIHx8IHt9O1xyXG5cdFx0XHRcdFx0dmFyIHNyYyA9IG9wdC5zb3VyY2VfYnV0dG9uIHx8IG51bGw7XHJcblxyXG5cdFx0XHRcdFx0Ly8gUmVtZW1iZXIgd2hlcmUgd2Ugd2VyZSBCRUZPUkUgc3dpdGNoaW5nIHRvIHByZXZpZXcuXHJcblx0XHRcdFx0XHRyZW1lbWJlcl9yZXR1cm5fdGFiX2Zyb21fZG9tKCk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhIHdwYmNfYmZiX3ByZXZpZXdfX2lzX3ByZXZpZXdfdGFiX2xpbmsoIHNyYyApICkge1xyXG5cdFx0XHRcdFx0XHR3cGJjX2JmYl9fYWN0aXZhdGVfcGFuZWxfdGFiKCAncHJldmlld190YWInICk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gRW5hYmxlIHByZXZpZXcgbW9kZSBVSSAoc2hvd3MgcmVmcmVzaC9iYWNrIGJ1dHRvbnMgZXRjKS5cclxuXHRcdFx0XHRcdGNsaWVudC5zZXRfbW9kZSggJ3ByZXZpZXcnICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gSU1QT1JUQU5UOiBBbHdheXMgcmVnZW5lcmF0ZSB3aGVuIHNob3dfcHJldmlldygpIGlzIGNhbGxlZCAoUHJldmlldyB0YWIgY2xpY2sgaW5jbHVkZWQpLlxyXG5cdFx0XHRcdFx0Y2xpZW50LnVwZGF0ZV9wcmV2aWV3KCB7IHNvdXJjZV9idXR0b246IHNyYyB9ICk7XHJcblx0XHRcdFx0fSxcclxuXHJcblxyXG5cdFx0XHRcdHNob3dfYnVpbGRlcjogZnVuY3Rpb24gKG9wdHMpIHtcclxuXHRcdFx0XHRcdHZhciBvcHQgPSBvcHRzIHx8IHt9O1xyXG5cdFx0XHRcdFx0dmFyIHNyYyA9IG9wdC5zb3VyY2VfYnV0dG9uIHx8IG51bGw7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBjbGllbnQgJiYgdHlwZW9mIGNsaWVudC5yZXNldF9idXN5X3N0YXRlID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0XHRjbGllbnQucmVzZXRfYnVzeV9zdGF0ZSgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHZhciBiYWNrX3RvID0gZ2V0X3JldHVybl90YWJfaWQoKTtcclxuXHJcblx0XHRcdFx0XHQvLyBJZiBCYWNrIGJ1dHRvbiBpdHNlbGYgaXMgbm90IGEgcmVhbCB0YWIgbGluayAtPiBqdXN0IGFjdGl2YXRlIHJlbWVtYmVyZWQgdGFiLlxyXG5cdFx0XHRcdFx0Ly8gSWYgYWN0aXZhdGlvbiBmYWlscyAodGFiIHJlbW92ZWQpLCBmYWxsYmFjayB0byBidWlsZGVyX3RhYi5cclxuXHRcdFx0XHRcdGlmICggISB3cGJjX2JmYl9wcmV2aWV3X19pc19idWlsZGVyX3RhYl9saW5rKCBzcmMgKSApIHtcclxuXHRcdFx0XHRcdFx0aWYgKCAhIHdwYmNfYmZiX19hY3RpdmF0ZV9wYW5lbF90YWIoIGJhY2tfdG8gKSApIHtcclxuXHRcdFx0XHRcdFx0XHR3cGJjX2JmYl9fYWN0aXZhdGVfcGFuZWxfdGFiKCAnYnVpbGRlcl90YWInICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRjbGllbnQuc2V0X21vZGUoICdidWlsZGVyJyApO1xyXG5cdFx0XHRcdH0sXHJcblxyXG5cdFx0XHRcdHNob3dfYWR2YW5jZWRfdGFiOiBmdW5jdGlvbiAob3B0cykge1xyXG5cdFx0XHRcdFx0dmFyIG9wdCA9IG9wdHMgfHwge307XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBjbGllbnQgJiYgdHlwZW9mIGNsaWVudC5yZXNldF9idXN5X3N0YXRlID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0XHRjbGllbnQucmVzZXRfYnVzeV9zdGF0ZSgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0d3BiY19iZmJfX2FjdGl2YXRlX3BhbmVsX3RhYiggJ2FkdmFuY2VkX3RhYicgKTtcclxuXHRcdFx0XHRcdGNsaWVudC5zZXRfbW9kZSggJ2J1aWxkZXInICk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHJcblx0XHRcdH07XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gTGlzdGVuIGZvciB0b3AtdGFiIGNoYW5nZXMgYW5kIHN5bmMgcHJldmlldyBtb2RlIGF1dG9tYXRpY2FsbHkuXHJcblx0XHR3cGJjX2JmYl9wcmV2aWV3X19iaW5kX3RvcF90YWJfZXZlbnRzKCBjbGllbnQgKTtcclxuXHJcblx0XHQvLyBXaGVuIGEgZm9ybSBpcyBsb2FkZWQgdmlhIEFKQVgsIHJlZnJlc2ggcHJldmlldyAob25seSBpZiBwcmV2aWV3IG1vZGUgaXMgYWN0aXZlKS5cclxuXHRcdHdwYmNfYmZiX3ByZXZpZXdfX2JpbmRfZm9ybV9hamF4X2xvYWRlZF9ldmVudHMoIGNsaWVudCApO1xyXG5cclxuXHRcdHdwYmNfYmZiX2JpbmRfdG9wX3Rvb2xiYXJfYnV0dG9ucyggY2xpZW50ICk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogQmluZCB0b3AgdG9vbGJhciBCdWlsZGVyIC8gUHJldmlldyAvIFJlZnJlc2ggYnV0dG9ucy5cclxuXHQgKiBTdXBwb3J0cyBtdWx0aXBsZSBlbGVtZW50cyBmb3IgZWFjaCBhY3Rpb24gKHRvb2xiYXIgYnV0dG9ucywgdG9wIHRhYnMsIGV0Yy4pXHJcblx0ICogdmlhIGRhdGEtd3BiYy1iZmItdG9wLSotYnRuPVwiMVwiLlxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHdwYmNfYmZiX2JpbmRfdG9wX3Rvb2xiYXJfYnV0dG9ucyhjbGllbnQpIHtcclxuXHJcblx0XHR2YXIgYnRuX3ByZXZpZXdfbGlzdCA9IGQucXVlcnlTZWxlY3RvckFsbCggJ1tkYXRhLXdwYmMtYmZiLXRvcC1wcmV2aWV3LWJ0bj1cIjFcIl0nICk7XHJcblx0XHR2YXIgYnRuX2J1aWxkZXJfbGlzdCA9IGQucXVlcnlTZWxlY3RvckFsbCggJ1tkYXRhLXdwYmMtYmZiLXRvcC1idWlsZGVyLWJ0bj1cIjFcIl0nICk7XHJcblx0XHR2YXIgYnRuX3JlZnJlc2hfbGlzdCA9IGQucXVlcnlTZWxlY3RvckFsbCggJ1tkYXRhLXdwYmMtYmZiLXRvcC1yZWZyZXNoLWJ0bj1cIjFcIl0nICk7XHJcblxyXG5cdFx0ZnVuY3Rpb24gZm9yX2VhY2hfbm9kZShsaXN0LCBjYikge1xyXG5cdFx0XHRpZiAoICFsaXN0IHx8ICFsaXN0Lmxlbmd0aCApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCggbGlzdCwgZnVuY3Rpb24gKGVsKSB7XHJcblx0XHRcdFx0aWYgKCBlbCAmJiB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0XHRjYiggZWwgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gKTtcclxuXHRcdH1cclxuXHJcblx0XHRmb3JfZWFjaF9ub2RlKCBidG5fcHJldmlld19saXN0LCBmdW5jdGlvbiAoYnRuX3ByZXZpZXcpIHtcclxuXHJcblx0XHRcdC8vIFByZXZlbnQgZG91YmxlIGJpbmRpbmcgaWYgdGhpcyBzY3JpcHQgcnVucyB0d2ljZS5cclxuXHRcdFx0aWYgKCBidG5fcHJldmlldy5nZXRBdHRyaWJ1dGUoICdkYXRhLXdwYmMtYmZiLWJvdW5kJyApID09PSAnMScgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdGJ0bl9wcmV2aWV3LnNldEF0dHJpYnV0ZSggJ2RhdGEtd3BiYy1iZmItYm91bmQnLCAnMScgKTtcclxuXHJcblx0XHRcdGJ0bl9wcmV2aWV3LmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuXHRcdFx0XHRpZiAoIHcuV1BCQ19CRkJfUHJldmlldyAmJiB0eXBlb2Ygdy5XUEJDX0JGQl9QcmV2aWV3LnNob3dfcHJldmlldyA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdFx0XHRcdHcuV1BCQ19CRkJfUHJldmlldy5zaG93X3ByZXZpZXcoIHtcclxuXHRcdFx0XHRcdFx0c291cmNlX2J1dHRvbjogYnRuX3ByZXZpZXdcclxuXHRcdFx0XHRcdH0gKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gKTtcclxuXHRcdH0gKTtcclxuXHJcblx0XHRmb3JfZWFjaF9ub2RlKCBidG5fcmVmcmVzaF9saXN0LCBmdW5jdGlvbiAoYnRuX3JlZnJlc2gpIHtcclxuXHJcblx0XHRcdGlmICggYnRuX3JlZnJlc2guZ2V0QXR0cmlidXRlKCAnZGF0YS13cGJjLWJmYi1ib3VuZCcgKSA9PT0gJzEnICkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHRidG5fcmVmcmVzaC5zZXRBdHRyaWJ1dGUoICdkYXRhLXdwYmMtYmZiLWJvdW5kJywgJzEnICk7XHJcblxyXG5cdFx0XHRidG5fcmVmcmVzaC5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHJcblx0XHRcdFx0aWYgKCB3LldQQkNfQkZCX1ByZXZpZXcgJiYgdHlwZW9mIHcuV1BCQ19CRkJfUHJldmlldy5zaG93X3ByZXZpZXcgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0XHR3LldQQkNfQkZCX1ByZXZpZXcuc2hvd19wcmV2aWV3KCB7XHJcblx0XHRcdFx0XHRcdHVwZGF0ZSAgICAgICA6IHRydWUsXHJcblx0XHRcdFx0XHRcdHNvdXJjZV9idXR0b246IGJ0bl9yZWZyZXNoXHJcblx0XHRcdFx0XHR9ICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9ICk7XHJcblx0XHR9ICk7XHJcblxyXG5cdFx0Zm9yX2VhY2hfbm9kZSggYnRuX2J1aWxkZXJfbGlzdCwgZnVuY3Rpb24gKGJ0bl9idWlsZGVyKSB7XHJcblxyXG5cdFx0XHRpZiAoIGJ0bl9idWlsZGVyLmdldEF0dHJpYnV0ZSggJ2RhdGEtd3BiYy1iZmItYm91bmQnICkgPT09ICcxJyApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0YnRuX2J1aWxkZXIuc2V0QXR0cmlidXRlKCAnZGF0YS13cGJjLWJmYi1ib3VuZCcsICcxJyApO1xyXG5cclxuXHRcdFx0YnRuX2J1aWxkZXIuYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0XHRcdGlmICggdy5XUEJDX0JGQl9QcmV2aWV3ICYmIHR5cGVvZiB3LldQQkNfQkZCX1ByZXZpZXcuc2hvd19idWlsZGVyID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0dy5XUEJDX0JGQl9QcmV2aWV3LnNob3dfYnVpbGRlciggeyBzb3VyY2VfYnV0dG9uOiBidG5fYnVpbGRlciB9ICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9ICk7XHJcblx0XHR9ICk7XHJcblx0fVxyXG5cclxuXHJcblx0aWYgKCBkLnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScgfHwgZC5yZWFkeVN0YXRlID09PSAnaW50ZXJhY3RpdmUnICkge1xyXG5cdFx0c2V0VGltZW91dCggd3BiY19iZmJfaW5pdF9wcmV2aWV3X2NsaWVudCwgMCApO1xyXG5cdH0gZWxzZSB7XHJcblx0XHRkLmFkZEV2ZW50TGlzdGVuZXIoICdET01Db250ZW50TG9hZGVkJywgd3BiY19iZmJfaW5pdF9wcmV2aWV3X2NsaWVudCApO1xyXG5cdH1cclxuXHJcbn0pKCB3aW5kb3csIGRvY3VtZW50ICk7XHJcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsVUFBVUEsQ0FBQyxFQUFFQyxDQUFDLEVBQUU7RUFDaEIsWUFBWTs7RUFFWjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0VBQ0MsSUFBSUMsR0FBRyxHQUFJRixDQUFDLENBQUNHLEtBQUssSUFBSUgsQ0FBQyxDQUFDRyxLQUFLLENBQUNELEdBQUcsR0FBSUYsQ0FBQyxDQUFDRyxLQUFLLENBQUNELEdBQUcsR0FBRztJQUNsREUsR0FBRyxFQUFFLFNBQUFBLENBQUEsRUFBWSxDQUFDLENBQUM7SUFDbkJDLEtBQUssRUFBRSxTQUFBQSxDQUFBLEVBQVksQ0FBQztFQUNyQixDQUFDOztFQUVEO0FBQ0Q7QUFDQTtBQUNBO0VBQ0MsTUFBTUMsdUJBQXVCLENBQUM7SUFFN0I7QUFDRjtBQUNBO0lBQ0VDLFdBQVdBLENBQUNDLE9BQU8sRUFBRTtNQUNwQixJQUFJLENBQUNBLE9BQU8sR0FBR0EsT0FBTztNQUN0QixJQUFJLENBQUNDLE1BQU0sR0FBSUQsT0FBTyxDQUFDRSxhQUFhLENBQUUsb0NBQXFDLENBQUM7TUFDNUUsSUFBSSxDQUFDQyxNQUFNLEdBQUlILE9BQU8sQ0FBQ0UsYUFBYSxDQUFFLG9DQUFxQyxDQUFDLENBQUMsQ0FBQztNQUM5RSxJQUFJLENBQUNFLE1BQU0sR0FBSSxJQUFJLENBQUMsQ0FBQzs7TUFFckIsSUFBSSxDQUFDQyxLQUFLLEdBQUtMLE9BQU8sQ0FBQ00sWUFBWSxDQUFFLG9CQUFxQixDQUFDLElBQUksRUFBRTtNQUNqRSxJQUFJLENBQUNDLE9BQU8sR0FBRyxLQUFLO01BRXBCLElBQUssQ0FBQyxJQUFJLENBQUNOLE1BQU0sRUFBRztRQUNuQlAsR0FBRyxDQUFDRyxLQUFL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
1001