PluginProbe
Booking Calendar / 11.9
Booking Calendar v11.9
11.9 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 All 205 releases
booking / includes / page-form-builder / advanced-mode / _out / bfb-advanced-free.js

bfb-advanced-free.js in Booking Calendar 11.9, at includes/page-form-builder/advanced-mode/_out/bfb-advanced-free.js

367 lines 44.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 "use strict";
2
3 /*
4 * Advanced Mode Bridge (FREE) + CodeMirror Highlighting:
5 * - Builder is the only editor.
6 * - Always sync ON (Advanced text = Builder export).
7 * - CodeMirror read-only highlighting for textareas (oshortcode overlay).
8 * - Provides wpbc_bfb_advanced_editor_api.get_values() for Save/Preview.
9 *
10 * @file ../includes/page-form-builder/advanced-mode/_out/bfb-advanced-free.js
11 */
12 (function (w, d) {
13 'use strict';
14
15 // True after wpbc:bfb:structure:loaded fired at least once.
16 var structure_loaded_once = false;
17
18 // == Constants =========================================================================================
19 var IDS = {
20 ta_form: 'wpbc_bfb__advanced_form_editor',
21 ta_content: 'wpbc_bfb__content_form_editor'
22 };
23 var KEY = {
24 FORM: 'advanced_form',
25 CONTENT: 'content_form'
26 };
27 var TA_ID_BY_KEY = {};
28 TA_ID_BY_KEY[KEY.FORM] = IDS.ta_form;
29 TA_ID_BY_KEY[KEY.CONTENT] = IDS.ta_content;
30
31 // == DOM ===============================================================================================
32 var DOM = function () {
33 function get_by_id(id) {
34 return d.getElementById(id);
35 }
36 function has_textareas() {
37 return !!(get_by_id(IDS.ta_form) && get_by_id(IDS.ta_content));
38 }
39 function on(type, fn) {
40 d.addEventListener(type, fn);
41 }
42 return {
43 get: get_by_id,
44 has_textareas: has_textareas,
45 on: on
46 };
47 }();
48
49 // == Editor (CodeMirror readonly + oshortcode highlighting) ============================================
50 var Editor = function () {
51 var is_inited = false;
52 var editors = {}; // key -> wp.codeEditor instance (or null)
53 editors[KEY.FORM] = null;
54 editors[KEY.CONTENT] = null;
55 var is_oshortcode_defined = false;
56 function can_init_codemirror() {
57 var wpns = w.wp || null;
58 return !!(wpns && wpns.codeEditor && typeof wpns.codeEditor.initialize === 'function' && w.wpbc_bfb_code_editor_settings);
59 }
60 function ensure_oshortcode_mode() {
61 if (is_oshortcode_defined) {
62 return;
63 }
64 var CM = w.wp && w.wp.CodeMirror ? w.wp.CodeMirror : null;
65 if (!CM || typeof CM.defineMode !== 'function') {
66 return;
67 }
68 CM.defineMode('oshortcode', function (config, parserConfig) {
69 var overlay = {
70 token: function (stream) {
71 var ch;
72
73 // [name ...] or [name* ...]
74 if (stream.match(/^\[([a-zA-Z0-9_]+)\*?\s?/)) {
75 while ((ch = stream.next()) != null) {
76 if (ch === ']') {
77 return 'oshortcode';
78 }
79 }
80 }
81 while (stream.next() != null && !stream.match(/^\[([a-zA-Z0-9_]+)\*?\s?/, false)) {}
82 return null;
83 }
84 };
85 var base = CM.getMode(config, parserConfig && parserConfig.backdrop || 'htmlmixed');
86
87 // Fallback if overlay addon is missing.
88 if (typeof CM.overlayMode !== 'function') {
89 return base;
90 }
91 return CM.overlayMode(base, overlay);
92 });
93 is_oshortcode_defined = true;
94 }
95 function init_one(textarea_el, key) {
96 var wpns = w.wp || null;
97 if (!textarea_el || !wpns || !wpns.codeEditor || typeof wpns.codeEditor.initialize !== 'function') {
98 return null;
99 }
100 var base = w.wpbc_bfb_code_editor_settings || null;
101 if (!base) {
102 return null;
103 }
104 ensure_oshortcode_mode();
105
106 // Clone so we don't mutate localized shared settings object.
107 var settings = Object.assign({}, base);
108 settings.codemirror = Object.assign({}, base.codemirror || {});
109
110 // Highlight shortcodes in HTML-like markup.
111 settings.codemirror.mode = 'oshortcode';
112
113 // FREE: read-only editor (still selectable/copyable).
114 settings.codemirror.readOnly = true;
115
116 // Nice UX for read-only:
117 // - no active line highlight in some themes
118 // - no cursor blinking distraction
119 settings.codemirror.styleActiveLine = false;
120 settings.codemirror.cursorBlinkRate = -1;
121 var inst = wpns.codeEditor.initialize(textarea_el, settings);
122 editors[key] = inst || null;
123 return inst || null;
124 }
125 function ensure_inited() {
126 if (is_inited) {
127 return true;
128 }
129 var ta_form = DOM.get(IDS.ta_form);
130 var ta_cnt = DOM.get(IDS.ta_content);
131 if (!ta_form || !ta_cnt) {
132 return false;
133 }
134
135 // Initialize CodeMirror if possible; otherwise, plain textarea fallback.
136 if (can_init_codemirror()) {
137 init_one(ta_form, KEY.FORM);
138 init_one(ta_cnt, KEY.CONTENT);
139 }
140 is_inited = true;
141 return true;
142 }
143 function textarea_id_for(key) {
144 return TA_ID_BY_KEY[key] || '';
145 }
146 function set_value(key, value) {
147 value = value == null ? '' : String(value);
148 var ta = DOM.get(textarea_id_for(key));
149 if (ta) {
150 ta.value = value;
151 }
152 var inst = editors[key];
153 try {
154 if (inst && inst.codemirror && typeof inst.codemirror.setValue === 'function') {
155 inst.codemirror.setValue(value);
156 if (typeof inst.codemirror.save === 'function') {
157 inst.codemirror.save();
158 }
159 }
160 } catch (e) {}
161 }
162 function refresh_all() {
163 var keys = Object.keys(editors);
164 for (var i = 0; i < keys.length; i++) {
165 var inst = editors[keys[i]];
166 try {
167 if (inst && inst.codemirror && typeof inst.codemirror.refresh === 'function') {
168 inst.codemirror.refresh();
169 }
170 } catch (e) {}
171 }
172 var root = d.documentElement;
173 if (!root) {
174 return;
175 }
176 root.setAttribute('data-wpbc-bfb-live-source', 'builder');
177 }
178 return {
179 ensure_inited: ensure_inited,
180 set_value: set_value,
181 refresh_all: refresh_all
182 };
183 }();
184
185 // == Bridge (Builder export -> snapshot -> editor/textarea) ============================================
186 var Bridge = function () {
187 var last_good = {
188 advanced_form: '',
189 content_form: ''
190 };
191 var debounce_id = null;
192
193 /**
194 * Check if adapted structure contains ANY field (including inside sections).
195 *
196 * @param {Object|null} adapted
197 * @return {boolean}
198 */
199 function adapted_has_any_field(adapted) {
200 if (!adapted || !Array.isArray(adapted.pages)) {
201 return false;
202 }
203 var has = false;
204 function walk_section(sec) {
205 if (has || !sec) {
206 return;
207 }
208 var cols = Array.isArray(sec.columns) ? sec.columns : [];
209 for (var i = 0; i < cols.length; i++) {
210 var col = cols[i] || {};
211 if (Array.isArray(col.fields) && col.fields.length) {
212 has = true;
213 return;
214 }
215 var nested = Array.isArray(col.sections) ? col.sections : [];
216 for (var j = 0; j < nested.length; j++) {
217 walk_section(nested[j]);
218 if (has) {
219 return;
220 }
221 }
222 }
223 }
224 for (var p = 0; p < adapted.pages.length; p++) {
225 var page = adapted.pages[p] || {};
226 var items = Array.isArray(page.items) ? page.items : [];
227 for (var k = 0; k < items.length; k++) {
228 var it = items[k] || {};
229 if (it.kind === 'field') {
230 return true;
231 }
232 if (it.kind === 'section') {
233 walk_section(it.data);
234 if (has) {
235 return true;
236 }
237 }
238 }
239 }
240 return has;
241 }
242 function can_export_from_builder() {
243 return !!(w.wpbc_bfb && typeof w.wpbc_bfb.get_structure === 'function' && w.WPBC_BFB_Exporter && typeof w.WPBC_BFB_Exporter.export_all === 'function');
244 }
245 function export_all_from_builder() {
246 if (!can_export_from_builder()) {
247 return null;
248 }
249 try {
250 return w.WPBC_BFB_Exporter.export_all(w.wpbc_bfb.get_structure(), {
251 gapPercent: 3
252 });
253 } catch (e) {
254 return null;
255 }
256 }
257
258 // Prevent “wrapper-only / empty” early exports.
259 function export_output_looks_ready(out) {
260 if (!out) {
261 return false;
262 }
263 var af = out.advanced_form == null ? '' : String(out.advanced_form).trim();
264 var cf = out.fields_data == null ? '' : String(out.fields_data).trim();
265 if (!af && !cf) {
266 return false;
267 }
268
269 // If structure is loaded and there are NO fields anywhere, accept empty export.
270 // (Empty form should still regenerate to a valid wrapper+step markup.)
271 if (structure_loaded_once && !adapted_has_any_field(out.adapted)) {
272 return true;
273 }
274
275 // Real export usually includes <item> at least.
276 var has_any_item = /<\s*item\b/i.test(af) || /<\s*item\b/i.test(cf);
277 return has_any_item;
278 }
279 function apply_snapshot(values) {
280 // Update both textarea and CodeMirror (if inited).
281 Editor.ensure_inited();
282 Editor.set_value(KEY.FORM, values.advanced_form || '');
283 Editor.set_value(KEY.CONTENT, values.content_form || '');
284 }
285 function refresh_snapshot() {
286 var out = export_all_from_builder();
287 if (!out || !export_output_looks_ready(out)) {
288 return false;
289 }
290 last_good.advanced_form = String(out.advanced_form || '');
291 last_good.content_form = String(out.fields_data || '');
292 apply_snapshot(last_good);
293 return true;
294 }
295 function schedule_refresh(ms) {
296 if (debounce_id) {
297 clearTimeout(debounce_id);
298 }
299 debounce_id = setTimeout(function () {
300 debounce_id = null;
301 refresh_snapshot();
302 }, ms);
303 }
304 function get_values() {
305 // Try to refresh now; fallback to last_good if exporter not ready.
306 refresh_snapshot();
307 return {
308 advanced_form: String(last_good.advanced_form || ''),
309 content_form: String(last_good.content_form || ''),
310 is_dirty: false
311 };
312 }
313 return {
314 refresh_now: refresh_snapshot,
315 schedule_refresh: schedule_refresh,
316 get_values: get_values
317 };
318 }();
319
320 // == Events ============================================================================================
321 var Events = function () {
322 function hook() {
323 // Structure loaded: immediate + delayed refresh (exporter can be late).
324 DOM.on('wpbc:bfb:structure:loaded', function () {
325 structure_loaded_once = true;
326 Bridge.refresh_now();
327 Bridge.schedule_refresh(200);
328 setTimeout(Editor.refresh_all, 60);
329 });
330
331 // Structure changed: debounce refresh.
332 DOM.on('wpbc:bfb:structure:change', function () {
333 Bridge.schedule_refresh(250);
334 });
335
336 // If you still have an “advanced” tab/panel visible in Free, CodeMirror may need refresh.
337 DOM.on('wpbc:bfb:top-tab', function () {
338 setTimeout(Editor.refresh_all, 60);
339 });
340 }
341 return {
342 hook: hook
343 };
344 }();
345
346 // == Public API (same as Pro) ===========================================================================
347 w.wpbc_bfb_advanced_editor_api = w.wpbc_bfb_advanced_editor_api || {};
348 w.wpbc_bfb_advanced_editor_api.get_values = function () {
349 return Bridge.get_values();
350 };
351
352 // Compatibility no-op.
353 w.wpbc_bfb_advanced_editor_api.set_dirty = function () {};
354
355 // == Boot ==============================================================================================
356 DOM.on('DOMContentLoaded', function () {
357 // Init editor if textareas exist.
358 if (DOM.has_textareas()) {
359 Editor.ensure_inited();
360 Bridge.refresh_now();
361 setTimeout(Editor.refresh_all, 60);
362 }
363 Events.hook();
364 });
365 })(window, document);
366 //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvcGFnZS1mb3JtLWJ1aWxkZXIvYWR2YW5jZWQtbW9kZS9fb3V0L2JmYi1hZHZhbmNlZC1mcmVlLmpzIiwibmFtZXMiOlsidyIsImQiLCJzdHJ1Y3R1cmVfbG9hZGVkX29uY2UiLCJJRFMiLCJ0YV9mb3JtIiwidGFfY29udGVudCIsIktFWSIsIkZPUk0iLCJDT05URU5UIiwiVEFfSURfQllfS0VZIiwiRE9NIiwiZ2V0X2J5X2lkIiwiaWQiLCJnZXRFbGVtZW50QnlJZCIsImhhc190ZXh0YXJlYXMiLCJvbiIsInR5cGUiLCJmbiIsImFkZEV2ZW50TGlzdGVuZXIiLCJnZXQiLCJFZGl0b3IiLCJpc19pbml0ZWQiLCJlZGl0b3JzIiwiaXNfb3Nob3J0Y29kZV9kZWZpbmVkIiwiY2FuX2luaXRfY29kZW1pcnJvciIsIndwbnMiLCJ3cCIsImNvZGVFZGl0b3IiLCJpbml0aWFsaXplIiwid3BiY19iZmJfY29kZV9lZGl0b3Jfc2V0dGluZ3MiLCJlbnN1cmVfb3Nob3J0Y29kZV9tb2RlIiwiQ00iLCJDb2RlTWlycm9yIiwiZGVmaW5lTW9kZSIsImNvbmZpZyIsInBhcnNlckNvbmZpZyIsIm92ZXJsYXkiLCJ0b2tlbiIsInN0cmVhbSIsImNoIiwibWF0Y2giLCJuZXh0IiwiYmFzZSIsImdldE1vZGUiLCJiYWNrZHJvcCIsIm92ZXJsYXlNb2RlIiwiaW5pdF9vbmUiLCJ0ZXh0YXJlYV9lbCIsImtleSIsInNldHRpbmdzIiwiT2JqZWN0IiwiYXNzaWduIiwiY29kZW1pcnJvciIsIm1vZGUiLCJyZWFkT25seSIsInN0eWxlQWN0aXZlTGluZSIsImN1cnNvckJsaW5rUmF0ZSIsImluc3QiLCJlbnN1cmVfaW5pdGVkIiwidGFfY250IiwidGV4dGFyZWFfaWRfZm9yIiwic2V0X3ZhbHVlIiwidmFsdWUiLCJTdHJpbmciLCJ0YSIsInNldFZhbHVlIiwic2F2ZSIsImUiLCJyZWZyZXNoX2FsbCIsImtleXMiLCJpIiwibGVuZ3RoIiwicmVmcmVzaCIsInJvb3QiLCJkb2N1bWVudEVsZW1lbnQiLCJzZXRBdHRyaWJ1dGUiLCJCcmlkZ2UiLCJsYXN0X2dvb2QiLCJhZHZhbmNlZF9mb3JtIiwiY29udGVudF9mb3JtIiwiZGVib3VuY2VfaWQiLCJhZGFwdGVkX2hhc19hbnlfZmllbGQiLCJhZGFwdGVkIiwiQXJyYXkiLCJpc0FycmF5IiwicGFnZXMiLCJoYXMiLCJ3YWxrX3NlY3Rpb24iLCJzZWMiLCJjb2xzIiwiY29sdW1ucyIsImNvbCIsImZpZWxkcyIsIm5lc3RlZCIsInNlY3Rpb25zIiwiaiIsInAiLCJwYWdlIiwiaXRlbXMiLCJrIiwiaXQiLCJraW5kIiwiZGF0YSIsImNhbl9leHBvcnRfZnJvbV9idWlsZGVyIiwid3BiY19iZmIiLCJnZXRfc3RydWN0dXJlIiwiV1BCQ19CRkJfRXhwb3J0ZXIiLCJleHBvcnRfYWxsIiwiZXhwb3J0X2FsbF9mcm9tX2J1aWxkZXIiLCJnYXBQZXJjZW50IiwiZXhwb3J0X291dHB1dF9sb29rc19yZWFkeSIsIm91dCIsImFmIiwidHJpbSIsImNmIiwiZmllbGRzX2RhdGEiLCJoYXNfYW55X2l0ZW0iLCJ0ZXN0IiwiYXBwbHlfc25hcHNob3QiLCJ2YWx1ZXMiLCJyZWZyZXNoX3NuYXBzaG90Iiwic2NoZWR1bGVfcmVmcmVzaCIsIm1zIiwiY2xlYXJUaW1lb3V0Iiwic2V0VGltZW91dCIsImdldF92YWx1ZXMiLCJpc19kaXJ0eSIsInJlZnJlc2hfbm93IiwiRXZlbnRzIiwiaG9vayIsIndwYmNfYmZiX2FkdmFuY2VkX2VkaXRvcl9hcGkiLCJzZXRfZGlydHkiLCJ3aW5kb3ciLCJkb2N1bWVudCJdLCJzb3VyY2VzIjpbImluY2x1ZGVzL3BhZ2UtZm9ybS1idWlsZGVyL2FkdmFuY2VkLW1vZGUvX3NyYy9iZmItYWR2YW5jZWQtZnJlZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBBZHZhbmNlZCBNb2RlIEJyaWRnZSAoRlJFRSkgKyBDb2RlTWlycm9yIEhpZ2hsaWdodGluZzpcclxuICogLSBCdWlsZGVyIGlzIHRoZSBvbmx5IGVkaXRvci5cclxuICogLSBBbHdheXMgc3luYyBPTiAoQWR2YW5jZWQgdGV4dCA9IEJ1aWxkZXIgZXhwb3J0KS5cclxuICogLSBDb2RlTWlycm9yIHJlYWQtb25seSBoaWdobGlnaHRpbmcgZm9yIHRleHRhcmVhcyAob3Nob3J0Y29kZSBvdmVybGF5KS5cclxuICogLSBQcm92aWRlcyB3cGJjX2JmYl9hZHZhbmNlZF9lZGl0b3JfYXBpLmdldF92YWx1ZXMoKSBmb3IgU2F2ZS9QcmV2aWV3LlxyXG4gKlxyXG4gKiBAZmlsZSAuLi9pbmNsdWRlcy9wYWdlLWZvcm0tYnVpbGRlci9hZHZhbmNlZC1tb2RlL19vdXQvYmZiLWFkdmFuY2VkLWZyZWUuanNcclxuICovXHJcbihmdW5jdGlvbiAodywgZCkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0Ly8gVHJ1ZSBhZnRlciB3cGJjOmJmYjpzdHJ1Y3R1cmU6bG9hZGVkIGZpcmVkIGF0IGxlYXN0IG9uY2UuXHJcblx0dmFyIHN0cnVjdHVyZV9sb2FkZWRfb25jZSA9IGZhbHNlO1xyXG5cclxuXHQvLyA9PSBDb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuXHR2YXIgSURTID0ge1xyXG5cdFx0dGFfZm9ybSAgIDogJ3dwYmNfYmZiX19hZHZhbmNlZF9mb3JtX2VkaXRvcicsXHJcblx0XHR0YV9jb250ZW50OiAnd3BiY19iZmJfX2NvbnRlbnRfZm9ybV9lZGl0b3InXHJcblx0fTtcclxuXHJcblx0dmFyIEtFWSA9IHtcclxuXHRcdEZPUk0gICA6ICdhZHZhbmNlZF9mb3JtJyxcclxuXHRcdENPTlRFTlQ6ICdjb250ZW50X2Zvcm0nXHJcblx0fTtcclxuXHJcblx0dmFyIFRBX0lEX0JZX0tFWSAgICAgICAgICA9IHt9O1xyXG5cdFRBX0lEX0JZX0tFWVtLRVkuRk9STV0gICAgPSBJRFMudGFfZm9ybTtcclxuXHRUQV9JRF9CWV9LRVlbS0VZLkNPTlRFTlRdID0gSURTLnRhX2NvbnRlbnQ7XHJcblxyXG5cdC8vID09IERPTSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cdHZhciBET00gPSAoZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdGZ1bmN0aW9uIGdldF9ieV9pZChpZCkge1xyXG5cdFx0XHRyZXR1cm4gZC5nZXRFbGVtZW50QnlJZCggaWQgKTtcclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBoYXNfdGV4dGFyZWFzKCkge1xyXG5cdFx0XHRyZXR1cm4gISEgKGdldF9ieV9pZCggSURTLnRhX2Zvcm0gKSAmJiBnZXRfYnlfaWQoIElEUy50YV9jb250ZW50ICkpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIG9uKHR5cGUsIGZuKSB7XHJcblx0XHRcdGQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZm4gKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRnZXQgICAgICAgICAgOiBnZXRfYnlfaWQsXHJcblx0XHRcdGhhc190ZXh0YXJlYXM6IGhhc190ZXh0YXJlYXMsXHJcblx0XHRcdG9uICAgICAgICAgICA6IG9uXHJcblx0XHR9O1xyXG5cdH0pKCk7XHJcblxyXG5cdC8vID09IEVkaXRvciAoQ29kZU1pcnJvciByZWFkb25seSArIG9zaG9ydGNvZGUgaGlnaGxpZ2h0aW5nKSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cdHZhciBFZGl0b3IgPSAoZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdHZhciBpc19pbml0ZWQgICAgICAgID0gZmFsc2U7XHJcblx0XHR2YXIgZWRpdG9ycyAgICAgICAgICA9IHt9OyAvLyBrZXkgLT4gd3AuY29kZUVkaXRvciBpbnN0YW5jZSAob3IgbnVsbClcclxuXHRcdGVkaXRvcnNbS0VZLkZPUk1dICAgID0gbnVsbDtcclxuXHRcdGVkaXRvcnNbS0VZLkNPTlRFTlRdID0gbnVsbDtcclxuXHJcblx0XHR2YXIgaXNfb3Nob3J0Y29kZV9kZWZpbmVkID0gZmFsc2U7XHJcblxyXG5cdFx0ZnVuY3Rpb24gY2FuX2luaXRfY29kZW1pcnJvcigpIHtcclxuXHRcdFx0dmFyIHdwbnMgPSB3LndwIHx8IG51bGw7XHJcblx0XHRcdHJldHVybiAhISAoXHJcblx0XHRcdFx0d3BucyAmJlxyXG5cdFx0XHRcdHdwbnMuY29kZUVkaXRvciAmJlxyXG5cdFx0XHRcdHR5cGVvZiB3cG5zLmNvZGVFZGl0b3IuaW5pdGlhbGl6ZSA9PT0gJ2Z1bmN0aW9uJyAmJlxyXG5cdFx0XHRcdHcud3BiY19iZmJfY29kZV9lZGl0b3Jfc2V0dGluZ3NcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBlbnN1cmVfb3Nob3J0Y29kZV9tb2RlKCkge1xyXG5cdFx0XHRpZiAoIGlzX29zaG9ydGNvZGVfZGVmaW5lZCApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHZhciBDTSA9ICh3LndwICYmIHcud3AuQ29kZU1pcnJvcikgPyB3LndwLkNvZGVNaXJyb3IgOiBudWxsO1xyXG5cdFx0XHRpZiAoICEgQ00gfHwgdHlwZW9mIENNLmRlZmluZU1vZGUgIT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRDTS5kZWZpbmVNb2RlKCAnb3Nob3J0Y29kZScsIGZ1bmN0aW9uIChjb25maWcsIHBhcnNlckNvbmZpZykge1xyXG5cclxuXHRcdFx0XHR2YXIgb3ZlcmxheSA9IHtcclxuXHRcdFx0XHRcdHRva2VuOiBmdW5jdGlvbiAoc3RyZWFtKSB7XHJcblx0XHRcdFx0XHRcdHZhciBjaDtcclxuXHJcblx0XHRcdFx0XHRcdC8vIFtuYW1lIC4uLl0gb3IgW25hbWUqIC4uLl1cclxuXHRcdFx0XHRcdFx0aWYgKCBzdHJlYW0ubWF0Y2goIC9eXFxbKFthLXpBLVowLTlfXSspXFwqP1xccz8vICkgKSB7XHJcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAoY2ggPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBjaCA9PT0gJ10nICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gJ29zaG9ydGNvZGUnO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0d2hpbGUgKCBzdHJlYW0ubmV4dCgpICE9IG51bGwgJiYgISBzdHJlYW0ubWF0Y2goIC9eXFxbKFthLXpBLVowLTlfXSspXFwqP1xccz8vLCBmYWxzZSApICkge31cclxuXHRcdFx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0dmFyIGJhc2UgPSBDTS5nZXRNb2RlKCBjb25maWcsIChwYXJzZXJDb25maWcgJiYgcGFyc2VyQ29uZmlnLmJhY2tkcm9wKSB8fCAnaHRtbG1peGVkJyApO1xyXG5cclxuXHRcdFx0XHQvLyBGYWxsYmFjayBpZiBvdmVybGF5IGFkZG9uIGlzIG1pc3NpbmcuXHJcblx0XHRcdFx0aWYgKCB0eXBlb2YgQ00ub3ZlcmxheU1vZGUgIT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gYmFzZTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiBDTS5vdmVybGF5TW9kZSggYmFzZSwgb3ZlcmxheSApO1xyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRpc19vc2hvcnRjb2RlX2RlZmluZWQgPSB0cnVlO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGluaXRfb25lKHRleHRhcmVhX2VsLCBrZXkpIHtcclxuXHRcdFx0dmFyIHdwbnMgPSB3LndwIHx8IG51bGw7XHJcblx0XHRcdGlmICggISB0ZXh0YXJlYV9lbCB8fCAhIHdwbnMgfHwgISB3cG5zLmNvZGVFZGl0b3IgfHwgdHlwZW9mIHdwbnMuY29kZUVkaXRvci5pbml0aWFsaXplICE9PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR2YXIgYmFzZSA9IHcud3BiY19iZmJfY29kZV9lZGl0b3Jfc2V0dGluZ3MgfHwgbnVsbDtcclxuXHRcdFx0aWYgKCAhIGJhc2UgKSB7XHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGVuc3VyZV9vc2hvcnRjb2RlX21vZGUoKTtcclxuXHJcblx0XHRcdC8vIENsb25lIHNvIHdlIGRvbid0IG11dGF0ZSBsb2NhbGl6ZWQgc2hhcmVkIHNldHRpbmdzIG9iamVjdC5cclxuXHRcdFx0dmFyIHNldHRpbmdzICAgICAgICA9IE9iamVjdC5hc3NpZ24oIHt9LCBiYXNlICk7XHJcblx0XHRcdHNldHRpbmdzLmNvZGVtaXJyb3IgPSBPYmplY3QuYXNzaWduKCB7fSwgYmFzZS5jb2RlbWlycm9yIHx8IHt9ICk7XHJcblxyXG5cdFx0XHQvLyBIaWdobGlnaHQgc2hvcnRjb2RlcyBpbiBIVE1MLWxpa2UgbWFya3VwLlxyXG5cdFx0XHRzZXR0aW5ncy5jb2RlbWlycm9yLm1vZGUgPSAnb3Nob3J0Y29kZSc7XHJcblxyXG5cdFx0XHQvLyBGUkVFOiByZWFkLW9ubHkgZWRpdG9yIChzdGlsbCBzZWxlY3RhYmxlL2NvcHlhYmxlKS5cclxuXHRcdFx0c2V0dGluZ3MuY29kZW1pcnJvci5yZWFkT25seSA9IHRydWU7XHJcblxyXG5cdFx0XHQvLyBOaWNlIFVYIGZvciByZWFkLW9ubHk6XHJcblx0XHRcdC8vIC0gbm8gYWN0aXZlIGxpbmUgaGlnaGxpZ2h0IGluIHNvbWUgdGhlbWVzXHJcblx0XHRcdC8vIC0gbm8gY3Vyc29yIGJsaW5raW5nIGRpc3RyYWN0aW9uXHJcblx0XHRcdHNldHRpbmdzLmNvZGVtaXJyb3Iuc3R5bGVBY3RpdmVMaW5lID0gZmFsc2U7XHJcblx0XHRcdHNldHRpbmdzLmNvZGVtaXJyb3IuY3Vyc29yQmxpbmtSYXRlID0gLTE7XHJcblxyXG5cdFx0XHR2YXIgaW5zdCAgICAgPSB3cG5zLmNvZGVFZGl0b3IuaW5pdGlhbGl6ZSggdGV4dGFyZWFfZWwsIHNldHRpbmdzICk7XHJcblx0XHRcdGVkaXRvcnNba2V5XSA9IGluc3QgfHwgbnVsbDtcclxuXHJcblx0XHRcdHJldHVybiBpbnN0IHx8IG51bGw7XHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gZW5zdXJlX2luaXRlZCgpIHtcclxuXHRcdFx0aWYgKCBpc19pbml0ZWQgKSB7XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHZhciB0YV9mb3JtID0gRE9NLmdldCggSURTLnRhX2Zvcm0gKTtcclxuXHRcdFx0dmFyIHRhX2NudCAgPSBET00uZ2V0KCBJRFMudGFfY29udGVudCApO1xyXG5cclxuXHRcdFx0aWYgKCAhIHRhX2Zvcm0gfHwgISB0YV9jbnQgKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBJbml0aWFsaXplIENvZGVNaXJyb3IgaWYgcG9zc2libGU7IG90aGVyd2lzZSwgcGxhaW4gdGV4dGFyZWEgZmFsbGJhY2suXHJcblx0XHRcdGlmICggY2FuX2luaXRfY29kZW1pcnJvcigpICkge1xyXG5cdFx0XHRcdGluaXRfb25lKCB0YV9mb3JtLCBLRVkuRk9STSApO1xyXG5cdFx0XHRcdGluaXRfb25lKCB0YV9jbnQsIEtFWS5DT05URU5UICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlzX2luaXRlZCA9IHRydWU7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIHRleHRhcmVhX2lkX2ZvcihrZXkpIHtcclxuXHRcdFx0cmV0dXJuIFRBX0lEX0JZX0tFWVtrZXldIHx8ICcnO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIHNldF92YWx1ZShrZXksIHZhbHVlKSB7XHJcblx0XHRcdHZhbHVlID0gKHZhbHVlID09IG51bGwpID8gJycgOiBTdHJpbmcoIHZhbHVlICk7XHJcblxyXG5cdFx0XHR2YXIgdGEgPSBET00uZ2V0KCB0ZXh0YXJlYV9pZF9mb3IoIGtleSApICk7XHJcblx0XHRcdGlmICggdGEgKSB7XHJcblx0XHRcdFx0dGEudmFsdWUgPSB2YWx1ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dmFyIGluc3QgPSBlZGl0b3JzW2tleV07XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0aWYgKCBpbnN0ICYmIGluc3QuY29kZW1pcnJvciAmJiB0eXBlb2YgaW5zdC5jb2RlbWlycm9yLnNldFZhbHVlID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0aW5zdC5jb2RlbWlycm9yLnNldFZhbHVlKCB2YWx1ZSApO1xyXG5cdFx0XHRcdFx0aWYgKCB0eXBlb2YgaW5zdC5jb2RlbWlycm9yLnNhdmUgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0XHRcdGluc3QuY29kZW1pcnJvci5zYXZlKCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGNhdGNoICggZSApIHt9XHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gcmVmcmVzaF9hbGwoKSB7XHJcblx0XHRcdHZhciBrZXlzID0gT2JqZWN0LmtleXMoIGVkaXRvcnMgKTtcclxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKyApIHtcclxuXHRcdFx0XHR2YXIgaW5zdCA9IGVkaXRvcnNba2V5c1tpXV07XHJcblx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdGlmICggaW5zdCAmJiBpbnN0LmNvZGVtaXJyb3IgJiYgdHlwZW9mIGluc3QuY29kZW1pcnJvci5yZWZyZXNoID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0XHRpbnN0LmNvZGVtaXJyb3IucmVmcmVzaCgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gY2F0Y2ggKCBlICkge31cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dmFyIHJvb3QgPSBkLmRvY3VtZW50RWxlbWVudDtcclxuXHRcdFx0aWYgKCAhIHJvb3QgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJvb3Quc2V0QXR0cmlidXRlKCAnZGF0YS13cGJjLWJmYi1saXZlLXNvdXJjZScsICdidWlsZGVyJyApO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB7XHJcblx0XHRcdGVuc3VyZV9pbml0ZWQ6IGVuc3VyZV9pbml0ZWQsXHJcblx0XHRcdHNldF92YWx1ZSAgICA6IHNldF92YWx1ZSxcclxuXHRcdFx0cmVmcmVzaF9hbGwgIDogcmVmcmVzaF9hbGxcclxuXHRcdH07XHJcblx0fSkoKTtcclxuXHJcblx0Ly8gPT0gQnJpZGdlIChCdWlsZGVyIGV4cG9ydCAtPiBzbmFwc2hvdCAtPiBlZGl0b3IvdGV4dGFyZWEpID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblx0dmFyIEJyaWRnZSA9IChmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0dmFyIGxhc3RfZ29vZCAgID0geyBhZHZhbmNlZF9mb3JtOiAnJywgY29udGVudF9mb3JtOiAnJyB9O1xyXG5cdFx0dmFyIGRlYm91bmNlX2lkID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENoZWNrIGlmIGFkYXB0ZWQgc3RydWN0dXJlIGNvbnRhaW5zIEFOWSBmaWVsZCAoaW5jbHVkaW5nIGluc2lkZSBzZWN0aW9ucykuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtPYmplY3R8bnVsbH0gYWRhcHRlZFxyXG5cdFx0ICogQHJldHVybiB7Ym9vbGVhbn1cclxuXHRcdCAqL1xyXG5cdFx0ZnVuY3Rpb24gYWRhcHRlZF9oYXNfYW55X2ZpZWxkKGFkYXB0ZWQpIHtcclxuXHRcdFx0aWYgKCAhIGFkYXB0ZWQgfHwgISBBcnJheS5pc0FycmF5KCBhZGFwdGVkLnBhZ2VzICkgKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR2YXIgaGFzID0gZmFsc2U7XHJcblxyXG5cdFx0XHRmdW5jdGlvbiB3YWxrX3NlY3Rpb24oc2VjKSB7XHJcblx0XHRcdFx0aWYgKCBoYXMgfHwgISBzZWMgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHZhciBjb2xzID0gQXJyYXkuaXNBcnJheSggc2VjLmNvbHVtbnMgKSA/IHNlYy5jb2x1bW5zIDogW107XHJcblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKyApIHtcclxuXHRcdFx0XHRcdHZhciBjb2wgPSBjb2xzW2ldIHx8IHt9O1xyXG5cdFx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBjb2wuZmllbGRzICkgJiYgY29sLmZpZWxkcy5sZW5ndGggKSB7XHJcblx0XHRcdFx0XHRcdGhhcyA9IHRydWU7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHZhciBuZXN0ZWQgPSBBcnJheS5pc0FycmF5KCBjb2wuc2VjdGlvbnMgKSA/IGNvbC5zZWN0aW9ucyA6IFtdO1xyXG5cdFx0XHRcdFx0Zm9yICggdmFyIGogPSAwOyBqIDwgbmVzdGVkLmxlbmd0aDsgaisrICkge1xyXG5cdFx0XHRcdFx0XHR3YWxrX3NlY3Rpb24oIG5lc3RlZFtqXSApO1xyXG5cdFx0XHRcdFx0XHRpZiAoIGhhcyApIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZvciAoIHZhciBwID0gMDsgcCA8IGFkYXB0ZWQucGFnZXMubGVuZ3RoOyBwKysgKSB7XHJcblx0XHRcdFx0dmFyIHBhZ2UgPSBhZGFwdGVkLnBhZ2VzW3BdIHx8IHt9O1xyXG5cdFx0XHRcdHZhciBpdGVtcyA9IEFycmF5LmlzQXJyYXkoIHBhZ2UuaXRlbXMgKSA/IHBhZ2UuaXRlbXMgOiBbXTtcclxuXHRcdFx0XHRmb3IgKCB2YXIgayA9IDA7IGsgPCBpdGVtcy5sZW5ndGg7IGsrKyApIHtcclxuXHRcdFx0XHRcdHZhciBpdCA9IGl0ZW1zW2tdIHx8IHt9O1xyXG5cdFx0XHRcdFx0aWYgKCBpdC5raW5kID09PSAnZmllbGQnICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmICggaXQua2luZCA9PT0gJ3NlY3Rpb24nICkge1xyXG5cdFx0XHRcdFx0XHR3YWxrX3NlY3Rpb24oIGl0LmRhdGEgKTtcclxuXHRcdFx0XHRcdFx0aWYgKCBoYXMgKSB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBoYXM7XHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gY2FuX2V4cG9ydF9mcm9tX2J1aWxkZXIoKSB7XHJcblx0XHRcdHJldHVybiAhISAoXHJcblx0XHRcdFx0dy53cGJjX2JmYiAmJlxyXG5cdFx0XHRcdHR5cGVvZiB3LndwYmNfYmZiLmdldF9zdHJ1Y3R1cmUgPT09ICdmdW5jdGlvbicgJiZcclxuXHRcdFx0XHR3LldQQkNfQkZCX0V4cG9ydGVyICYmXHJcblx0XHRcdFx0dHlwZW9mIHcuV1BCQ19CRkJfRXhwb3J0ZXIuZXhwb3J0X2FsbCA9PT0gJ2Z1bmN0aW9uJ1xyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGV4cG9ydF9hbGxfZnJvbV9idWlsZGVyKCkge1xyXG5cdFx0XHRpZiAoICEgY2FuX2V4cG9ydF9mcm9tX2J1aWxkZXIoKSApIHtcclxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0fVxyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdHJldHVybiB3LldQQkNfQkZCX0V4cG9ydGVyLmV4cG9ydF9hbGwoIHcud3BiY19iZmIuZ2V0X3N0cnVjdHVyZSgpLCB7IGdhcFBlcmNlbnQ6IDMgfSApO1xyXG5cdFx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFByZXZlbnQg4oCcd3JhcHBlci1vbmx5IC8gZW1wdHnigJ0gZWFybHkgZXhwb3J0cy5cclxuXHRcdGZ1bmN0aW9uIGV4cG9ydF9vdXRwdXRfbG9va3NfcmVhZHkob3V0KSB7XHJcblx0XHRcdGlmICggISBvdXQgKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR2YXIgYWYgPSAob3V0LmFkdmFuY2VkX2Zvcm0gPT0gbnVsbCkgPyAnJyA6IFN0cmluZyggb3V0LmFkdmFuY2VkX2Zvcm0gKS50cmltKCk7XHJcblx0XHRcdHZhciBjZiA9IChvdXQuZmllbGRzX2RhdGEgPT0gbnVsbCkgPyAnJyA6IFN0cmluZyggb3V0LmZpZWxkc19kYXRhICkudHJpbSgpO1xyXG5cdFx0XHRpZiAoICEgYWYgJiYgISBjZiApIHtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIElmIHN0cnVjdHVyZSBpcyBsb2FkZWQgYW5kIHRoZXJlIGFyZSBOTyBmaWVsZHMgYW55d2hlcmUsIGFjY2VwdCBlbXB0eSBleHBvcnQuXHJcblx0XHRcdC8vIChFbXB0eSBmb3JtIHNob3VsZCBzdGlsbCByZWdlbmVyYXRlIHRvIGEgdmFsaWQgd3JhcHBlcitzdGVwIG1hcmt1cC4pXHJcblx0XHRcdGlmICggc3RydWN0dXJlX2xvYWRlZF9vbmNlICYmICEgYWRhcHRlZF9oYXNfYW55X2ZpZWxkKCBvdXQuYWRhcHRlZCApICkge1xyXG5cdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBSZWFsIGV4cG9ydCB1c3VhbGx5IGluY2x1ZGVzIDxpdGVtPiBhdCBsZWFzdC5cclxuXHRcdFx0dmFyIGhhc19hbnlfaXRlbSA9IC88XFxzKml0ZW1cXGIvaS50ZXN0KCBhZiApIHx8IC88XFxzKml0ZW1cXGIvaS50ZXN0KCBjZiApO1xyXG5cdFx0XHRyZXR1cm4gaGFzX2FueV9pdGVtO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGFwcGx5X3NuYXBzaG90KHZhbHVlcykge1xyXG5cdFx0XHQvLyBVcGRhdGUgYm90aCB0ZXh0YXJlYSBhbmQgQ29kZU1pcnJvciAoaWYgaW5pdGVkKS5cclxuXHRcdFx0RWRpdG9yLmVuc3VyZV9pbml0ZWQoKTtcclxuXHRcdFx0RWRpdG9yLnNldF92YWx1ZSggS0VZLkZPUk0sIHZhbHVlcy5hZHZhbmNlZF9mb3JtIHx8ICcnICk7XHJcblx0XHRcdEVkaXRvci5zZXRfdmFsdWUoIEtFWS5DT05URU5ULCB2YWx1ZXMuY29udGVudF9mb3JtIHx8ICcnICk7XHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gcmVmcmVzaF9zbmFwc2hvdCgpIHtcclxuXHRcdFx0dmFyIG91dCA9IGV4cG9ydF9hbGxfZnJvbV9idWlsZGVyKCk7XHJcblx0XHRcdGlmICggISBvdXQgfHwgISBleHBvcnRfb3V0cHV0X2xvb2tzX3JlYWR5KCBvdXQgKSApIHtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxhc3RfZ29vZC5hZHZhbmNlZF9mb3JtID0gU3RyaW5nKCBvdXQuYWR2YW5jZWRfZm9ybSB8fCAnJyApO1xyXG5cdFx0XHRsYXN0X2dvb2QuY29udGVudF9mb3JtICA9IFN0cmluZyggb3V0LmZpZWxkc19kYXRhIHx8ICcnICk7XHJcblxyXG5cdFx0XHRhcHBseV9zbmFwc2hvdCggbGFzdF9nb29kICk7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIHNjaGVkdWxlX3JlZnJlc2gobXMpIHtcclxuXHRcdFx0aWYgKCBkZWJvdW5jZV9pZCApIHtcclxuXHRcdFx0XHRjbGVhclRpbWVvdXQoIGRlYm91bmNlX2lkICk7XHJcblx0XHRcdH1cclxuXHRcdFx0ZGVib3VuY2VfaWQgPSBzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0ZGVib3VuY2VfaWQgPSBudWxsO1xyXG5cdFx0XHRcdHJlZnJlc2hfc25hcHNob3QoKTtcclxuXHRcdFx0fSwgbXMgKTtcclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBnZXRfdmFsdWVzKCkge1xyXG5cdFx0XHQvLyBUcnkgdG8gcmVmcmVzaCBub3c7IGZhbGxiYWNrIHRvIGxhc3RfZ29vZCBpZiBleHBvcnRlciBub3QgcmVhZHkuXHJcblx0XHRcdHJlZnJlc2hfc25hcHNob3QoKTtcclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRhZHZhbmNlZF9mb3JtOiBTdHJpbmcoIGxhc3RfZ29vZC5hZHZhbmNlZF9mb3JtIHx8ICcnICksXHJcblx0XHRcdFx0Y29udGVudF9mb3JtIDogU3RyaW5nKCBsYXN0X2dvb2QuY29udGVudF9mb3JtIHx8ICcnICksXHJcblx0XHRcdFx0aXNfZGlydHkgICAgIDogZmFsc2VcclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRyZWZyZXNoX25vdyAgICAgOiByZWZyZXNoX3NuYXBzaG90LFxyXG5cdFx0XHRzY2hlZHVsZV9yZWZyZXNoOiBzY2hlZHVsZV9yZWZyZXNoLFxyXG5cdFx0XHRnZXRfdmFsdWVzICAgICAgOiBnZXRfdmFsdWVzXHJcblx0XHR9O1xyXG5cdH0pKCk7XHJcblxyXG5cdC8vID09IEV2ZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cdHZhciBFdmVudHMgPSAoZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdGZ1bmN0aW9uIGhvb2soKSB7XHJcblxyXG5cdFx0XHQvLyBTdHJ1Y3R1cmUgbG9hZGVkOiBpbW1lZGlhdGUgKyBkZWxheWVkIHJlZnJlc2ggKGV4cG9ydGVyIGNhbiBiZSBsYXRlKS5cclxuXHRcdFx0RE9NLm9uKCAnd3BiYzpiZmI6c3RydWN0dXJlOmxvYWRlZCcsIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRzdHJ1Y3R1cmVfbG9hZGVkX29uY2UgPSB0cnVlO1xyXG5cdFx0XHRcdEJyaWRnZS5yZWZyZXNoX25vdygpO1xyXG5cdFx0XHRcdEJyaWRnZS5zY2hlZHVsZV9yZWZyZXNoKCAyMDAgKTtcclxuXHRcdFx0XHRzZXRUaW1lb3V0KCBFZGl0b3IucmVmcmVzaF9hbGwsIDYwICk7XHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdC8vIFN0cnVjdHVyZSBjaGFuZ2VkOiBkZWJvdW5jZSByZWZyZXNoLlxyXG5cdFx0XHRET00ub24oICd3cGJjOmJmYjpzdHJ1Y3R1cmU6Y2hhbmdlJywgZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdEJyaWRnZS5zY2hlZHVsZV9yZWZyZXNoKCAyNTAgKTtcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0Ly8gSWYgeW91IHN0aWxsIGhhdmUgYW4g4oCcYWR2YW5jZWTigJ0gdGFiL3BhbmVsIHZpc2libGUgaW4gRnJlZSwgQ29kZU1pcnJvciBtYXkgbmVlZCByZWZyZXNoLlxyXG5cdFx0XHRET00ub24oICd3cGJjOmJmYjp0b3AtdGFiJywgZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdHNldFRpbWVvdXQoIEVkaXRvci5yZWZyZXNoX2FsbCwgNjAgKTtcclxuXHRcdFx0fSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB7IGhvb2s6IGhvb2sgfTtcclxuXHR9KSgpO1xyXG5cclxuXHQvLyA9PSBQdWJsaWMgQVBJIChzYW1lIGFzIFBybykgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblx0dy53cGJjX2JmYl9hZHZhbmNlZF9lZGl0b3JfYXBpID0gdy53cGJjX2JmYl9hZHZhbmNlZF9lZGl0b3JfYXBpIHx8IHt9O1xyXG5cclxuXHR3LndwYmNfYmZiX2FkdmFuY2VkX2VkaXRvcl9hcGkuZ2V0X3ZhbHVlcyA9IGZ1bmN0aW9uICgpIHtcclxuXHRcdHJldHVybiBCcmlkZ2UuZ2V0X3ZhbHVlcygpO1xyXG5cdH07XHJcblxyXG5cdC8vIENvbXBhdGliaWxpdHkgbm8tb3AuXHJcblx0dy53cGJjX2JmYl9hZHZhbmNlZF9lZGl0b3JfYXBpLnNldF9kaXJ0eSA9IGZ1bmN0aW9uICgpIHtcclxuXHR9O1xyXG5cclxuXHQvLyA9PSBCb290ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuXHRET00ub24oICdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xyXG5cdFx0Ly8gSW5pdCBlZGl0b3IgaWYgdGV4dGFyZWFzIGV4aXN0LlxyXG5cdFx0aWYgKCBET00uaGFzX3RleHRhcmVhcygpICkge1xyXG5cdFx0XHRFZGl0b3IuZW5zdXJlX2luaXRlZCgpO1xyXG5cdFx0XHRCcmlkZ2UucmVmcmVzaF9ub3coKTtcclxuXHRcdFx0c2V0VGltZW91dCggRWRpdG9yLnJlZnJlc2hfYWxsLCA2MCApO1xyXG5cdFx0fVxyXG5cclxuXHRcdEV2ZW50cy5ob29rKCk7XHJcblx0fSApO1xyXG59KSggd2luZG93LCBkb2N1bWVudCApO1xyXG4iXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxVQUFVQSxDQUFDLEVBQUVDLENBQUMsRUFBRTtFQUNoQixZQUFZOztFQUVaO0VBQ0EsSUFBSUMscUJBQXFCLEdBQUcsS0FBSzs7RUFFakM7RUFDQSxJQUFJQyxHQUFHLEdBQUc7SUFDVEMsT0FBTyxFQUFLLGdDQUFnQztJQUM1Q0MsVUFBVSxF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
367