PluginProbe
Booking Calendar / 11.0
Booking Calendar v11.0
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 / field-packs / wizard-nav / _out / wizard-nav.js

wizard-nav.js in Booking Calendar 11.0, at includes/page-form-builder/field-packs/wizard-nav/_out/wizard-nav.js

259 lines 35.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 "use strict";
2
3 // File: /includes/page-form-builder/field-packs/wizard-nav/_out/wizard-nav.js
4 (function (w) {
5 'use strict';
6
7 var Core = w.WPBC_BFB_Core || {};
8 var registry = Core.WPBC_BFB_Field_Renderer_Registry;
9 var Base = Core.WPBC_BFB_Field_Base;
10 if (!registry || typeof registry.register !== 'function' || !Base) {
11 _wpbc?.dev?.error?.('WPBC_BFB_Field_Wizard_Nav', 'Core registry/base missing');
12 return;
13 }
14
15 /**
16 * WPBC BFB: Field Renderer for "wizard_nav" (Schema-driven)
17 * - Inspector is rendered by Factory (from PHP schema).
18 * - No wp.template usage for preview.
19 * - Must output:
20 * <a class="wpbc_button_light wpbc_wizard_step_button wpbc_wizard_step_{N} [cssclass_extra]">Label</a>
21 */
22 class WPBC_BFB_Field_Wizard_Nav extends Base {
23 /**
24 * Return default props for "wizard_nav" field.
25 * Must stay in sync with PHP schema defaults.
26 *
27 * @returns {Object}
28 */
29 static get_defaults() {
30 return {
31 type: 'wizard_nav',
32 direction: 'next',
33 // 'next' | 'back'
34 label: 'Next',
35 target_step: 2,
36 // >= 1
37 cssclass_extra: '',
38 name: '',
39 html_id: '',
40 help: '',
41 usage_key: 'wizard_nav'
42 };
43 }
44
45 /**
46 * Render the preview markup into the field element.
47 *
48 * @param {HTMLElement} el Field root element inside the canvas.
49 * @param {Object} data Field props (already normalized by schema).
50 * @param {Object} ctx Context: { builder, sanit, ... }
51 * @returns {void}
52 */
53 static render(el, data, ctx) {
54 if (!el) {
55 return;
56 }
57
58 // Normalize against defaults first.
59 const d = this.normalize_data(data);
60
61 // ----- Core sanitize helpers (static) -----
62 const eh = v => Core.WPBC_BFB_Sanitize.escape_html(v);
63 const sid = v => Core.WPBC_BFB_Sanitize.sanitize_html_id(v);
64 const sname = v => Core.WPBC_BFB_Sanitize.sanitize_html_name(v);
65 const sclass = v => Core.WPBC_BFB_Sanitize.sanitize_css_classlist(v);
66 const to_int = (v, def) => {
67 const n = parseInt(v, 10);
68 return isNaN(n) || n < 1 ? def : n;
69 };
70
71 // Direction & label coherence.
72 const dir = d.direction === 'back' ? 'back' : 'next';
73 const step_def = dir === 'next' ? 2 : 1;
74 const step_num = to_int(d.target_step, step_def);
75 const label_txt = typeof d.label === 'string' && d.label.length ? d.label : dir === 'next' ? 'Next' : 'Back';
76
77 // Public attributes.
78 const html_id = d.html_id ? sid(String(d.html_id)) : '';
79 const name_val = d.name ? sname(String(d.name)) : '';
80 const cls_extra = sclass(String(d.cssclass_extra || ''));
81
82 // Persist useful props on dataset (do not mutate wrapper classes directly).
83 if ('cssclass_extra' in d && el.dataset.cssclass_extra !== cls_extra) {
84 el.dataset.cssclass_extra = cls_extra;
85 }
86 if ('html_id' in d && el.dataset.html_id !== html_id) {
87 el.dataset.html_id = html_id;
88 }
89 if ('name' in d && el.dataset.name !== name_val) {
90 el.dataset.name = name_val;
91 }
92 if ('target_step' in d && String(el.dataset.target_step) !== String(step_num)) {
93 el.dataset.target_step = String(step_num);
94 }
95 if ('direction' in d && el.dataset.direction !== dir) {
96 el.dataset.direction = dir;
97 }
98
99 // Attribute fragments.
100 const id_attr = html_id ? ` id="${eh(html_id)}"` : '';
101 const name_attr = name_val ? ` name="${eh(name_val)}"` : '';
102 const req_cls = `wpbc_button_light wpbc_wizard_step_button wpbc_wizard_step_${String(step_num)}`;
103 const cls_attr = ` class="${req_cls}${cls_extra ? ' ' + eh(cls_extra) : ''}"`;
104 const href_attr = ` href="javascript:void(0);"`;
105
106 // Optional help text below the button.
107 const help_html = d.help ? `<div class="wpbc_bfb__help">${eh(d.help)}</div>` : '';
108
109 // Render preview HTML.
110 el.innerHTML = `
111 <span class="wpbc_bfb__noaction wpbc_bfb__no-drag-zone" inert="">
112 <div class="wpbc_bfb__field-preview">
113 <a${href_attr}${cls_attr}${id_attr}${name_attr}>${eh(label_txt)}</a>
114 </div>
115 ${help_html}
116 </span>
117 `;
118
119 // Overlay (handles/toolbars).
120 Core.UI?.WPBC_BFB_Overlay?.ensure?.(ctx?.builder, el);
121 }
122
123 /**
124 * Optional hook executed after field is dropped from the palette.
125 *
126 * @param {Object} data
127 * @param {HTMLElement} el
128 * @param {Object} ctx
129 * @returns {void}
130 */
131 static on_field_drop(data, el, ctx) {
132 // Keep base behavior (auto-name from label, etc.).
133 super.on_field_drop?.(data, el, ctx);
134 }
135 }
136 try {
137 registry.register('wizard_nav', WPBC_BFB_Field_Wizard_Nav);
138 } catch (e) {
139 _wpbc?.dev?.error?.('WPBC_BFB_Field_Wizard_Nav.register', e);
140 }
141
142 // -----------------------------------------------------------------------------------------------------------------
143 // Export for "Booking Form" (Advanced Form shortcode)
144 // -----------------------------------------------------------------------------------------------------------------
145 /**
146 * Booking Form exporter callback for "wizard_nav".
147 *
148 * Produces anchors equivalent to the legacy exporter:
149 * <a class="wpbc_button_light wpbc_wizard_step_button wpbc_wizard_step_2 extra">Next</a>
150 *
151 * Notes:
152 * - No shortcode; this is pure HTML (navigation control, not a data field).
153 * - Help text is appended centrally by WPBC_BFB_Exporter.render_field_node().
154 */
155 function register_wizard_nav_booking_form_exporter() {
156 var Exp = w.WPBC_BFB_Exporter;
157 if (!Exp || typeof Exp.register !== 'function') {
158 return;
159 }
160 if (typeof Exp.has_exporter === 'function' && Exp.has_exporter('wizard_nav')) {
161 return;
162 }
163 var S = Core.WPBC_BFB_Sanitize || {};
164 var esc_html = S.escape_html || function (v) {
165 return String(v);
166 };
167 var sid = S.sanitize_html_id || function (v) {
168 return String(v).trim();
169 };
170 var scls = S.sanitize_css_classlist || function (v) {
171 return String(v).trim();
172 };
173
174 /**
175 * @type {WPBC_BFB_ExporterCallback}
176 */
177 Exp.register('wizard_nav', function (field, emit, extras) {
178 extras = extras || {};
179 var ctx = extras.ctx || {};
180 var usedIds = ctx.usedIds instanceof Set ? ctx.usedIds : null;
181
182 // Merge with defaults to keep behavior stable even if some props are missing.
183 var defs = typeof WPBC_BFB_Field_Wizard_Nav.get_defaults === 'function' ? WPBC_BFB_Field_Wizard_Nav.get_defaults() : {};
184 var d = Object.assign({}, defs, field || {});
185
186 // Direction & label logic (same as preview).
187 var dir = d.direction === 'back' ? 'back' : 'next';
188 var step_raw = parseInt(d.target_step, 10);
189 var step_num = Number.isFinite(step_raw) && step_raw > 0 ? step_raw : dir === 'back' ? 1 : 2;
190 var label_txt = typeof d.label === 'string' && d.label.trim().length ? d.label.trim() : dir === 'back' ? 'Back' : 'Next';
191
192 // HTML ID: sanitize + ensure uniqueness across the export.
193 var html_id = d.html_id ? sid(String(d.html_id)) : '';
194 if (html_id && usedIds) {
195 var base = html_id;
196 var candidate = base;
197 var i = 2;
198 while (usedIds.has(candidate)) {
199 candidate = base + '_' + i++;
200 }
201 usedIds.add(candidate);
202 html_id = candidate;
203 }
204
205 // Extra classes (in addition to required base wizard nav classes).
206 var extra_raw = String(d.cssclass_extra || d.cssclass || d.class || '');
207 var extra_cls = scls(extra_raw);
208 var req_cls = 'wpbc_button_light wpbc_wizard_step_button wpbc_wizard_step_' + String(step_num);
209 var full_cls = req_cls + (extra_cls ? ' ' + esc_html(extra_cls) : '');
210 var id_attr = html_id ? ' id="' + esc_html(html_id) + '"' : '';
211
212 // Final anchor — no href (click is handled externally).
213 emit('<a class="' + full_cls + '"' + id_attr + '>' + esc_html(label_txt) + '</a>');
214
215 // NOTE:
216 // - Help text (field.help) is output by WPBC_BFB_Exporter.render_field_node()
217 // beneath this block, same as for other packs.
218 });
219 }
220 if (w.WPBC_BFB_Exporter && typeof w.WPBC_BFB_Exporter.register === 'function') {
221 register_wizard_nav_booking_form_exporter();
222 } else if (typeof document !== 'undefined') {
223 document.addEventListener('wpbc:bfb:exporter-ready', register_wizard_nav_booking_form_exporter, {
224 once: true
225 });
226 }
227
228 // -----------------------------------------------------------------------------------------------------------------
229 // Export for "Booking Data" (Content of booking fields data)
230 // -----------------------------------------------------------------------------------------------------------------
231 /**
232 * Booking Data exporter callback for "wizard_nav".
233 *
234 * Wizard navigation buttons do not carry user-entered values,
235 * so they are intentionally omitted from the "Content of booking fields data".
236 */
237 function register_wizard_nav_booking_data_exporter() {
238 var C = w.WPBC_BFB_ContentExporter;
239 if (!C || typeof C.register !== 'function') {
240 return;
241 }
242 if (typeof C.has_exporter === 'function' && C.has_exporter('wizard_nav')) {
243 return;
244 }
245 C.register('wizard_nav', function (field, emit, extras) {
246 // Intentionally no output: nav buttons are not part of data template.
247 return;
248 });
249 }
250 if (w.WPBC_BFB_ContentExporter && typeof w.WPBC_BFB_ContentExporter.register === 'function') {
251 register_wizard_nav_booking_data_exporter();
252 } else if (typeof document !== 'undefined') {
253 document.addEventListener('wpbc:bfb:content-exporter-ready', register_wizard_nav_booking_data_exporter, {
254 once: true
255 });
256 }
257 })(window);
258 //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvcGFnZS1mb3JtLWJ1aWxkZXIvZmllbGQtcGFja3Mvd2l6YXJkLW5hdi9fb3V0L3dpemFyZC1uYXYuanMiLCJuYW1lcyI6WyJ3IiwiQ29yZSIsIldQQkNfQkZCX0NvcmUiLCJyZWdpc3RyeSIsIldQQkNfQkZCX0ZpZWxkX1JlbmRlcmVyX1JlZ2lzdHJ5IiwiQmFzZSIsIldQQkNfQkZCX0ZpZWxkX0Jhc2UiLCJyZWdpc3RlciIsIl93cGJjIiwiZGV2IiwiZXJyb3IiLCJXUEJDX0JGQl9GaWVsZF9XaXphcmRfTmF2IiwiZ2V0X2RlZmF1bHRzIiwidHlwZSIsImRpcmVjdGlvbiIsImxhYmVsIiwidGFyZ2V0X3N0ZXAiLCJjc3NjbGFzc19leHRyYSIsIm5hbWUiLCJodG1sX2lkIiwiaGVscCIsInVzYWdlX2tleSIsInJlbmRlciIsImVsIiwiZGF0YSIsImN0eCIsImQiLCJub3JtYWxpemVfZGF0YSIsImVoIiwidiIsIldQQkNfQkZCX1Nhbml0aXplIiwiZXNjYXBlX2h0bWwiLCJzaWQiLCJzYW5pdGl6ZV9odG1sX2lkIiwic25hbWUiLCJzYW5pdGl6ZV9odG1sX25hbWUiLCJzY2xhc3MiLCJzYW5pdGl6ZV9jc3NfY2xhc3NsaXN0IiwidG9faW50IiwiZGVmIiwibiIsInBhcnNlSW50IiwiaXNOYU4iLCJkaXIiLCJzdGVwX2RlZiIsInN0ZXBfbnVtIiwibGFiZWxfdHh0IiwibGVuZ3RoIiwiU3RyaW5nIiwibmFtZV92YWwiLCJjbHNfZXh0cmEiLCJkYXRhc2V0IiwiaWRfYXR0ciIsIm5hbWVfYXR0ciIsInJlcV9jbHMiLCJjbHNfYXR0ciIsImhyZWZfYXR0ciIsImhlbHBfaHRtbCIsImlubmVySFRNTCIsIlVJIiwiV1BCQ19CRkJfT3ZlcmxheSIsImVuc3VyZSIsImJ1aWxkZXIiLCJvbl9maWVsZF9kcm9wIiwiZSIsInJlZ2lzdGVyX3dpemFyZF9uYXZfYm9va2luZ19mb3JtX2V4cG9ydGVyIiwiRXhwIiwiV1BCQ19CRkJfRXhwb3J0ZXIiLCJoYXNfZXhwb3J0ZXIiLCJTIiwiZXNjX2h0bWwiLCJ0cmltIiwic2NscyIsImZpZWxkIiwiZW1pdCIsImV4dHJhcyIsInVzZWRJZHMiLCJTZXQiLCJkZWZzIiwiT2JqZWN0IiwiYXNzaWduIiwic3RlcF9yYXciLCJOdW1iZXIiLCJpc0Zpbml0ZSIsImJhc2UiLCJjYW5kaWRhdGUiLCJpIiwiaGFzIiwiYWRkIiwiZXh0cmFfcmF3IiwiY3NzY2xhc3MiLCJjbGFzcyIsImV4dHJhX2NscyIsImZ1bGxfY2xzIiwiZG9jdW1lbnQiLCJhZGRFdmVudExpc3RlbmVyIiwib25jZSIsInJlZ2lzdGVyX3dpemFyZF9uYXZfYm9va2luZ19kYXRhX2V4cG9ydGVyIiwiQyIsIldQQkNfQkZCX0NvbnRlbnRFeHBvcnRlciIsIndpbmRvdyJdLCJzb3VyY2VzIjpbImluY2x1ZGVzL3BhZ2UtZm9ybS1idWlsZGVyL2ZpZWxkLXBhY2tzL3dpemFyZC1uYXYvX3NyYy93aXphcmQtbmF2LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IC9pbmNsdWRlcy9wYWdlLWZvcm0tYnVpbGRlci9maWVsZC1wYWNrcy93aXphcmQtbmF2L19vdXQvd2l6YXJkLW5hdi5qc1xyXG4oZnVuY3Rpb24gKCB3ICkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0dmFyIENvcmUgICAgID0gdy5XUEJDX0JGQl9Db3JlIHx8IHt9O1xyXG5cdHZhciByZWdpc3RyeSA9IENvcmUuV1BCQ19CRkJfRmllbGRfUmVuZGVyZXJfUmVnaXN0cnk7XHJcblx0dmFyIEJhc2UgICAgID0gQ29yZS5XUEJDX0JGQl9GaWVsZF9CYXNlO1xyXG5cclxuXHRpZiAoICEgcmVnaXN0cnkgfHwgdHlwZW9mIHJlZ2lzdHJ5LnJlZ2lzdGVyICE9PSAnZnVuY3Rpb24nIHx8ICEgQmFzZSApIHtcclxuXHRcdF93cGJjPy5kZXY/LmVycm9yPy4oICdXUEJDX0JGQl9GaWVsZF9XaXphcmRfTmF2JywgJ0NvcmUgcmVnaXN0cnkvYmFzZSBtaXNzaW5nJyApO1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV1BCQyBCRkI6IEZpZWxkIFJlbmRlcmVyIGZvciBcIndpemFyZF9uYXZcIiAoU2NoZW1hLWRyaXZlbilcclxuXHQgKiAtIEluc3BlY3RvciBpcyByZW5kZXJlZCBieSBGYWN0b3J5IChmcm9tIFBIUCBzY2hlbWEpLlxyXG5cdCAqIC0gTm8gd3AudGVtcGxhdGUgdXNhZ2UgZm9yIHByZXZpZXcuXHJcblx0ICogLSBNdXN0IG91dHB1dDpcclxuXHQgKiAgICAgPGEgY2xhc3M9XCJ3cGJjX2J1dHRvbl9saWdodCB3cGJjX3dpemFyZF9zdGVwX2J1dHRvbiB3cGJjX3dpemFyZF9zdGVwX3tOfSBbY3NzY2xhc3NfZXh0cmFdXCI+TGFiZWw8L2E+XHJcblx0ICovXHJcblx0Y2xhc3MgV1BCQ19CRkJfRmllbGRfV2l6YXJkX05hdiBleHRlbmRzIEJhc2Uge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJuIGRlZmF1bHQgcHJvcHMgZm9yIFwid2l6YXJkX25hdlwiIGZpZWxkLlxyXG5cdFx0ICogTXVzdCBzdGF5IGluIHN5bmMgd2l0aCBQSFAgc2NoZW1hIGRlZmF1bHRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm5zIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBnZXRfZGVmYXVsdHMoKSB7XHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0dHlwZSAgICAgICAgICAgOiAnd2l6YXJkX25hdicsXHJcblx0XHRcdFx0ZGlyZWN0aW9uICAgICAgOiAnbmV4dCcsICAgIC8vICduZXh0JyB8ICdiYWNrJ1xyXG5cdFx0XHRcdGxhYmVsICAgICAgICAgIDogJ05leHQnLFxyXG5cdFx0XHRcdHRhcmdldF9zdGVwICAgIDogMiwgICAgICAgICAvLyA+PSAxXHJcblx0XHRcdFx0Y3NzY2xhc3NfZXh0cmEgOiAnJyxcclxuXHRcdFx0XHRuYW1lICAgICAgICAgICA6ICcnLFxyXG5cdFx0XHRcdGh0bWxfaWQgICAgICAgIDogJycsXHJcblx0XHRcdFx0aGVscCAgICAgICAgICAgOiAnJyxcclxuXHRcdFx0XHR1c2FnZV9rZXkgICAgICA6ICd3aXphcmRfbmF2J1xyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVyIHRoZSBwcmV2aWV3IG1hcmt1cCBpbnRvIHRoZSBmaWVsZCBlbGVtZW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsICAgRmllbGQgcm9vdCBlbGVtZW50IGluc2lkZSB0aGUgY2FudmFzLlxyXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9ICAgICAgZGF0YSBGaWVsZCBwcm9wcyAoYWxyZWFkeSBub3JtYWxpemVkIGJ5IHNjaGVtYSkuXHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gICAgICBjdHggIENvbnRleHQ6IHsgYnVpbGRlciwgc2FuaXQsIC4uLiB9XHJcblx0XHQgKiBAcmV0dXJucyB7dm9pZH1cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIHJlbmRlciggZWwsIGRhdGEsIGN0eCApIHtcclxuXHJcblx0XHRcdGlmICggISBlbCApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE5vcm1hbGl6ZSBhZ2FpbnN0IGRlZmF1bHRzIGZpcnN0LlxyXG5cdFx0XHRjb25zdCBkID0gdGhpcy5ub3JtYWxpemVfZGF0YSggZGF0YSApO1xyXG5cclxuXHRcdFx0Ly8gLS0tLS0gQ29yZSBzYW5pdGl6ZSBoZWxwZXJzIChzdGF0aWMpIC0tLS0tXHJcblx0XHRcdGNvbnN0IGVoICAgICAgPSAoIHYgKSA9PiBDb3JlLldQQkNfQkZCX1Nhbml0aXplLmVzY2FwZV9odG1sKCB2ICk7XHJcblx0XHRcdGNvbnN0IHNpZCAgICAgPSAoIHYgKSA9PiBDb3JlLldQQkNfQkZCX1Nhbml0aXplLnNhbml0aXplX2h0bWxfaWQoIHYgKTtcclxuXHRcdFx0Y29uc3Qgc25hbWUgICA9ICggdiApID0+IENvcmUuV1BCQ19CRkJfU2FuaXRpemUuc2FuaXRpemVfaHRtbF9uYW1lKCB2ICk7XHJcblx0XHRcdGNvbnN0IHNjbGFzcyAgPSAoIHYgKSA9PiBDb3JlLldQQkNfQkZCX1Nhbml0aXplLnNhbml0aXplX2Nzc19jbGFzc2xpc3QoIHYgKTtcclxuXHRcdFx0Y29uc3QgdG9faW50ICA9ICggdiwgZGVmICkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IG4gPSBwYXJzZUludCggdiwgMTAgKTtcclxuXHRcdFx0XHRyZXR1cm4gKCBpc05hTiggbiApIHx8IG4gPCAxICkgPyBkZWYgOiBuO1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0Ly8gRGlyZWN0aW9uICYgbGFiZWwgY29oZXJlbmNlLlxyXG5cdFx0XHRjb25zdCBkaXIgICAgICAgPSAoIGQuZGlyZWN0aW9uID09PSAnYmFjaycgKSA/ICdiYWNrJyA6ICduZXh0JztcclxuXHRcdFx0Y29uc3Qgc3RlcF9kZWYgID0gKCBkaXIgPT09ICduZXh0JyApID8gMiA6IDE7XHJcblx0XHRcdGNvbnN0IHN0ZXBfbnVtICA9IHRvX2ludCggZC50YXJnZXRfc3RlcCwgc3RlcF9kZWYgKTtcclxuXHRcdFx0Y29uc3QgbGFiZWxfdHh0ID0gKCB0eXBlb2YgZC5sYWJlbCA9PT0gJ3N0cmluZycgJiYgZC5sYWJlbC5sZW5ndGggKSA/IGQubGFiZWwgOiAoIGRpciA9PT0gJ25leHQnID8gJ05leHQnIDogJ0JhY2snICk7XHJcblxyXG5cdFx0XHQvLyBQdWJsaWMgYXR0cmlidXRlcy5cclxuXHRcdFx0Y29uc3QgaHRtbF9pZCAgICA9IGQuaHRtbF9pZCA/IHNpZCggU3RyaW5nKCBkLmh0bWxfaWQgKSApIDogJyc7XHJcblx0XHRcdGNvbnN0IG5hbWVfdmFsICAgPSBkLm5hbWUgPyBzbmFtZSggU3RyaW5nKCBkLm5hbWUgKSApIDogJyc7XHJcblx0XHRcdGNvbnN0IGNsc19leHRyYSAgPSBzY2xhc3MoIFN0cmluZyggZC5jc3NjbGFzc19leHRyYSB8fCAnJyApICk7XHJcblxyXG5cdFx0XHQvLyBQZXJzaXN0IHVzZWZ1bCBwcm9wcyBvbiBkYXRhc2V0IChkbyBub3QgbXV0YXRlIHdyYXBwZXIgY2xhc3NlcyBkaXJlY3RseSkuXHJcblx0XHRcdGlmICggJ2Nzc2NsYXNzX2V4dHJhJyBpbiBkICYmIGVsLmRhdGFzZXQuY3NzY2xhc3NfZXh0cmEgIT09IGNsc19leHRyYSApIHtcclxuXHRcdFx0XHRlbC5kYXRhc2V0LmNzc2NsYXNzX2V4dHJhID0gY2xzX2V4dHJhO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICggJ2h0bWxfaWQnIGluIGQgJiYgZWwuZGF0YXNldC5odG1sX2lkICE9PSBodG1sX2lkICkge1xyXG5cdFx0XHRcdGVsLmRhdGFzZXQuaHRtbF9pZCA9IGh0bWxfaWQ7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKCAnbmFtZScgaW4gZCAmJiBlbC5kYXRhc2V0Lm5hbWUgIT09IG5hbWVfdmFsICkge1xyXG5cdFx0XHRcdGVsLmRhdGFzZXQubmFtZSA9IG5hbWVfdmFsO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICggJ3RhcmdldF9zdGVwJyBpbiBkICYmIFN0cmluZyggZWwuZGF0YXNldC50YXJnZXRfc3RlcCApICE9PSBTdHJpbmcoIHN0ZXBfbnVtICkgKSB7XHJcblx0XHRcdFx0ZWwuZGF0YXNldC50YXJnZXRfc3RlcCA9IFN0cmluZyggc3RlcF9udW0gKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoICdkaXJlY3Rpb24nIGluIGQgJiYgZWwuZGF0YXNldC5kaXJlY3Rpb24gIT09IGRpciApIHtcclxuXHRcdFx0XHRlbC5kYXRhc2V0LmRpcmVjdGlvbiA9IGRpcjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gQXR0cmlidXRlIGZyYWdtZW50cy5cclxuXHRcdFx0Y29uc3QgaWRfYXR0ciAgICA9IGh0bWxfaWQgPyBgIGlkPVwiJHtlaCggaHRtbF9pZCApfVwiYCA6ICcnO1xyXG5cdFx0XHRjb25zdCBuYW1lX2F0dHIgID0gbmFtZV92YWwgPyBgIG5hbWU9XCIke2VoKCBuYW1lX3ZhbCApfVwiYCA6ICcnO1xyXG5cdFx0XHRjb25zdCByZXFfY2xzICAgID0gYHdwYmNfYnV0dG9uX2xpZ2h0IHdwYmNfd2l6YXJkX3N0ZXBfYnV0dG9uIHdwYmNfd2l6YXJkX3N0ZXBfJHtTdHJpbmcoIHN0ZXBfbnVtICl9YDtcclxuXHRcdFx0Y29uc3QgY2xzX2F0dHIgICA9IGAgY2xhc3M9XCIke3JlcV9jbHN9JHtjbHNfZXh0cmEgPyAnICcgKyBlaCggY2xzX2V4dHJhICkgOiAnJ31cImA7XHJcblx0XHRcdGNvbnN0IGhyZWZfYXR0ciAgPSBgIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCJgO1xyXG5cclxuXHRcdFx0Ly8gT3B0aW9uYWwgaGVscCB0ZXh0IGJlbG93IHRoZSBidXR0b24uXHJcblx0XHRcdGNvbnN0IGhlbHBfaHRtbCAgPSBkLmhlbHAgPyBgPGRpdiBjbGFzcz1cIndwYmNfYmZiX19oZWxwXCI+JHtlaCggZC5oZWxwICl9PC9kaXY+YCA6ICcnO1xyXG5cclxuXHRcdFx0Ly8gUmVuZGVyIHByZXZpZXcgSFRNTC5cclxuXHRcdFx0ZWwuaW5uZXJIVE1MID0gYFxyXG5cdFx0XHRcdDxzcGFuIGNsYXNzPVwid3BiY19iZmJfX25vYWN0aW9uIHdwYmNfYmZiX19uby1kcmFnLXpvbmVcIiBpbmVydD1cIlwiPlxyXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cIndwYmNfYmZiX19maWVsZC1wcmV2aWV3XCI+XHJcblx0XHRcdFx0XHRcdDxhJHtocmVmX2F0dHJ9JHtjbHNfYXR0cn0ke2lkX2F0dHJ9JHtuYW1lX2F0dHJ9PiR7ZWgoIGxhYmVsX3R4dCApfTwvYT5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0JHtoZWxwX2h0bWx9XHJcblx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRgO1xyXG5cclxuXHRcdFx0Ly8gT3ZlcmxheSAoaGFuZGxlcy90b29sYmFycykuXHJcblx0XHRcdENvcmUuVUk/LldQQkNfQkZCX092ZXJsYXk/LmVuc3VyZT8uKCBjdHg/LmJ1aWxkZXIsIGVsICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPcHRpb25hbCBob29rIGV4ZWN1dGVkIGFmdGVyIGZpZWxkIGlzIGRyb3BwZWQgZnJvbSB0aGUgcGFsZXR0ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gICAgICBkYXRhXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxyXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9ICAgICAgY3R4XHJcblx0XHQgKiBAcmV0dXJucyB7dm9pZH1cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIG9uX2ZpZWxkX2Ryb3AoIGRhdGEsIGVsLCBjdHggKSB7XHJcblx0XHRcdC8vIEtlZXAgYmFzZSBiZWhhdmlvciAoYXV0by1uYW1lIGZyb20gbGFiZWwsIGV0Yy4pLlxyXG5cdFx0XHRzdXBlci5vbl9maWVsZF9kcm9wPy4oIGRhdGEsIGVsLCBjdHggKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHRyeSB7XHJcblx0XHRyZWdpc3RyeS5yZWdpc3RlciggJ3dpemFyZF9uYXYnLCBXUEJDX0JGQl9GaWVsZF9XaXphcmRfTmF2ICk7XHJcblx0fSBjYXRjaCAoIGUgKSB7IF93cGJjPy5kZXY/LmVycm9yPy4oICdXUEJDX0JGQl9GaWVsZF9XaXphcmRfTmF2LnJlZ2lzdGVyJywgZSApOyB9XHJcblxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8vIEV4cG9ydCBmb3IgXCJCb29raW5nIEZvcm1cIiAoQWR2YW5jZWQgRm9ybSBzaG9ydGNvZGUpXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvKipcclxuXHQgKiBCb29raW5nIEZvcm0gZXhwb3J0ZXIgY2FsbGJhY2sgZm9yIFwid2l6YXJkX25hdlwiLlxyXG5cdCAqXHJcblx0ICogUHJvZHVjZXMgYW5jaG9ycyBlcXVpdmFsZW50IHRvIHRoZSBsZWdhY3kgZXhwb3J0ZXI6XHJcblx0ICogICA8YSBjbGFzcz1cIndwYmNfYnV0dG9uX2xpZ2h0IHdwYmNfd2l6YXJkX3N0ZXBfYnV0dG9uIHdwYmNfd2l6YXJkX3N0ZXBfMiBleHRyYVwiPk5leHQ8L2E+XHJcblx0ICpcclxuXHQgKiBOb3RlczpcclxuXHQgKiAtIE5vIHNob3J0Y29kZTsgdGhpcyBpcyBwdXJlIEhUTUwgKG5hdmlnYXRpb24gY29udHJvbCwgbm90IGEgZGF0YSBmaWVsZCkuXHJcblx0ICogLSBIZWxwIHRleHQgaXMgYXBwZW5kZWQgY2VudHJhbGx5IGJ5IFdQQkNfQkZCX0V4cG9ydGVyLnJlbmRlcl9maWVsZF9ub2RlKCkuXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gcmVnaXN0ZXJfd2l6YXJkX25hdl9ib29raW5nX2Zvcm1fZXhwb3J0ZXIoKSB7XHJcblxyXG5cdFx0dmFyIEV4cCA9IHcuV1BCQ19CRkJfRXhwb3J0ZXI7XHJcblx0XHRpZiAoICEgRXhwIHx8IHR5cGVvZiBFeHAucmVnaXN0ZXIgIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfVxyXG5cdFx0aWYgKCB0eXBlb2YgRXhwLmhhc19leHBvcnRlciA9PT0gJ2Z1bmN0aW9uJyAmJiBFeHAuaGFzX2V4cG9ydGVyKCAnd2l6YXJkX25hdicgKSApIHsgcmV0dXJuOyB9XHJcblxyXG5cdFx0dmFyIFMgICAgICAgID0gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZSB8fCB7fTtcclxuXHRcdHZhciBlc2NfaHRtbCA9IFMuZXNjYXBlX2h0bWwgICAgICAgICAgICAgIHx8IGZ1bmN0aW9uKCB2ICl7IHJldHVybiBTdHJpbmcoIHYgKTsgfTtcclxuXHRcdHZhciBzaWQgICAgICA9IFMuc2FuaXRpemVfaHRtbF9pZCAgICAgICAgIHx8IGZ1bmN0aW9uKCB2ICl7IHJldHVybiBTdHJpbmcoIHYgKS50cmltKCk7IH07XHJcblx0XHR2YXIgc2NscyAgICAgPSBTLnNhbml0aXplX2Nzc19jbGFzc2xpc3QgICB8fCBmdW5jdGlvbiggdiApeyByZXR1cm4gU3RyaW5nKCB2ICkudHJpbSgpOyB9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQHR5cGUge1dQQkNfQkZCX0V4cG9ydGVyQ2FsbGJhY2t9XHJcblx0XHQgKi9cclxuXHRcdEV4cC5yZWdpc3RlciggJ3dpemFyZF9uYXYnLCBmdW5jdGlvbiggZmllbGQsIGVtaXQsIGV4dHJhcyApIHtcclxuXHRcdFx0ZXh0cmFzID0gZXh0cmFzIHx8IHt9O1xyXG5cclxuXHRcdFx0dmFyIGN0eCAgICAgPSBleHRyYXMuY3R4IHx8IHt9O1xyXG5cdFx0XHR2YXIgdXNlZElkcyA9ICggY3R4LnVzZWRJZHMgaW5zdGFuY2VvZiBTZXQgKSA/IGN0eC51c2VkSWRzIDogbnVsbDtcclxuXHJcblx0XHRcdC8vIE1lcmdlIHdpdGggZGVmYXVsdHMgdG8ga2VlcCBiZWhhdmlvciBzdGFibGUgZXZlbiBpZiBzb21lIHByb3BzIGFyZSBtaXNzaW5nLlxyXG5cdFx0XHR2YXIgZGVmcyA9ICggdHlwZW9mIFdQQkNfQkZCX0ZpZWxkX1dpemFyZF9OYXYuZ2V0X2RlZmF1bHRzID09PSAnZnVuY3Rpb24nIClcclxuXHRcdFx0XHQ/IFdQQkNfQkZCX0ZpZWxkX1dpemFyZF9OYXYuZ2V0X2RlZmF1bHRzKClcclxuXHRcdFx0XHQ6IHt9O1xyXG5cdFx0XHR2YXIgZCA9IE9iamVjdC5hc3NpZ24oIHt9LCBkZWZzLCBmaWVsZCB8fCB7fSApO1xyXG5cclxuXHRcdFx0Ly8gRGlyZWN0aW9uICYgbGFiZWwgbG9naWMgKHNhbWUgYXMgcHJldmlldykuXHJcblx0XHRcdHZhciBkaXIgICAgICA9ICggZC5kaXJlY3Rpb24gPT09ICdiYWNrJyApID8gJ2JhY2snIDogJ25leHQnO1xyXG5cdFx0XHR2YXIgc3RlcF9yYXcgPSBwYXJzZUludCggZC50YXJnZXRfc3RlcCwgMTAgKTtcclxuXHRcdFx0dmFyIHN0ZXBfbnVtID0gKCBOdW1iZXIuaXNGaW5pdGUoIHN0ZXBfcmF3ICkgJiYgc3RlcF9yYXcgPiAwIClcclxuXHRcdFx0XHQ/IHN0ZXBfcmF3XHJcblx0XHRcdFx0OiAoIGRpciA9PT0gJ2JhY2snID8gMSA6IDIgKTtcclxuXHJcblx0XHRcdHZhciBsYWJlbF90eHQgPSAoIHR5cGVvZiBkLmxhYmVsID09PSAnc3RyaW5nJyAmJiBkLmxhYmVsLnRyaW0oKS5sZW5ndGggKVxyXG5cdFx0XHRcdD8gZC5sYWJlbC50cmltKClcclxuXHRcdFx0XHQ6ICggZGlyID09PSAnYmFjaycgPyAnQmFjaycgOiAnTmV4dCcgKTtcclxuXHJcblx0XHRcdC8vIEhUTUwgSUQ6IHNhbml0aXplICsgZW5zdXJlIHVuaXF1ZW5lc3MgYWNyb3NzIHRoZSBleHBvcnQuXHJcblx0XHRcdHZhciBodG1sX2lkID0gZC5odG1sX2lkID8gc2lkKCBTdHJpbmcoIGQuaHRtbF9pZCApICkgOiAnJztcclxuXHRcdFx0aWYgKCBodG1sX2lkICYmIHVzZWRJZHMgKSB7XHJcblx0XHRcdFx0dmFyIGJhc2UgICAgICA9IGh0bWxfaWQ7XHJcblx0XHRcdFx0dmFyIGNhbmRpZGF0ZSA9IGJhc2U7XHJcblx0XHRcdFx0dmFyIGkgICAgICAgICA9IDI7XHJcblx0XHRcdFx0d2hpbGUgKCB1c2VkSWRzLmhhcyggY2FuZGlkYXRlICkgKSB7XHJcblx0XHRcdFx0XHRjYW5kaWRhdGUgPSBiYXNlICsgJ18nICsgKCBpKysgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dXNlZElkcy5hZGQoIGNhbmRpZGF0ZSApO1xyXG5cdFx0XHRcdGh0bWxfaWQgPSBjYW5kaWRhdGU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEV4dHJhIGNsYXNzZXMgKGluIGFkZGl0aW9uIHRvIHJlcXVpcmVkIGJhc2Ugd2l6YXJkIG5hdiBjbGFzc2VzKS5cclxuXHRcdFx0dmFyIGV4dHJhX3JhdyA9IFN0cmluZyggZC5jc3NjbGFzc19leHRyYSB8fCBkLmNzc2NsYXNzIHx8IGQuY2xhc3MgfHwgJycgKTtcclxuXHRcdFx0dmFyIGV4dHJhX2NscyA9IHNjbHMoIGV4dHJhX3JhdyApO1xyXG5cclxuXHRcdFx0dmFyIHJlcV9jbHMgICA9ICd3cGJjX2J1dHRvbl9saWdodCB3cGJjX3dpemFyZF9zdGVwX2J1dHRvbiB3cGJjX3dpemFyZF9zdGVwXycgKyBTdHJpbmcoIHN0ZXBfbnVtICk7XHJcblx0XHRcdHZhciBmdWxsX2NscyAgPSByZXFfY2xzICsgKCBleHRyYV9jbHMgPyAoICcgJyArIGVzY19odG1sKCBleHRyYV9jbHMgKSApIDogJycgKTtcclxuXHJcblx0XHRcdHZhciBpZF9hdHRyICAgPSBodG1sX2lkID8gKCAnIGlkPVwiJyArIGVzY19odG1sKCBodG1sX2lkICkgKyAnXCInICkgOiAnJztcclxuXHJcblx0XHRcdC8vIEZpbmFsIGFuY2hvciDigJQgbm8gaHJlZiAoY2xpY2sgaXMgaGFuZGxlZCBleHRlcm5hbGx5KS5cclxuXHRcdFx0ZW1pdChcclxuXHRcdFx0XHQnPGEgY2xhc3M9XCInICsgZnVsbF9jbHMgKyAnXCInICsgaWRfYXR0ciArICc+JyArXHJcblx0XHRcdFx0XHRlc2NfaHRtbCggbGFiZWxfdHh0ICkgK1xyXG5cdFx0XHRcdCc8L2E+J1xyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0Ly8gTk9URTpcclxuXHRcdFx0Ly8gIC0gSGVscCB0ZXh0IChmaWVsZC5oZWxwKSBpcyBvdXRwdXQgYnkgV1BCQ19CRkJfRXhwb3J0ZXIucmVuZGVyX2ZpZWxkX25vZGUoKVxyXG5cdFx0XHQvLyAgICBiZW5lYXRoIHRoaXMgYmxvY2ssIHNhbWUgYXMgZm9yIG90aGVyIHBhY2tzLlxyXG5cdFx0fSApO1xyXG5cdH1cclxuXHJcblx0aWYgKCB3LldQQkNfQkZCX0V4cG9ydGVyICYmIHR5cGVvZiB3LldQQkNfQkZCX0V4cG9ydGVyLnJlZ2lzdGVyID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0cmVnaXN0ZXJfd2l6YXJkX25hdl9ib29raW5nX2Zvcm1fZXhwb3J0ZXIoKTtcclxuXHR9IGVsc2UgaWYgKCB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICkge1xyXG5cdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcclxuXHRcdFx0J3dwYmM6YmZiOmV4cG9ydGVyLXJlYWR5JyxcclxuXHRcdFx0cmVnaXN0ZXJfd2l6YXJkX25hdl9ib29raW5nX2Zvcm1fZXhwb3J0ZXIsXHJcblx0XHRcdHsgb25jZTogdHJ1ZSB9XHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0Ly8gRXhwb3J0IGZvciBcIkJvb2tpbmcgRGF0YVwiIChDb250ZW50IG9mIGJvb2tpbmcgZmllbGRzIGRhdGEpXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvKipcclxuXHQgKiBCb29raW5nIERhdGEgZXhwb3J0ZXIgY2FsbGJhY2sgZm9yIFwid2l6YXJkX25hdlwiLlxyXG5cdCAqXHJcblx0ICogV2l6YXJkIG5hdmlnYXRpb24gYnV0dG9ucyBkbyBub3QgY2FycnkgdXNlci1lbnRlcmVkIHZhbHVlcyxcclxuXHQgKiBzbyB0aGV5IGFyZSBpbnRlbnRpb25hbGx5IG9taXR0ZWQgZnJvbSB0aGUgXCJDb250ZW50IG9mIGJvb2tpbmcgZmllbGRzIGRhdGFcIi5cclxuXHQgKi9cclxuXHRmdW5jdGlvbiByZWdpc3Rlcl93aXphcmRfbmF2X2Jvb2tpbmdfZGF0YV9leHBvcnRlcigpIHtcclxuXHJcblx0XHR2YXIgQyA9IHcuV1BCQ19CRkJfQ29udGVudEV4cG9ydGVyO1xyXG5cdFx0aWYgKCAhIEMgfHwgdHlwZW9mIEMucmVnaXN0ZXIgIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfVxyXG5cdFx0aWYgKCB0eXBlb2YgQy5oYXNfZXhwb3J0ZXIgPT09ICdmdW5jdGlvbicgJiYgQy5oYXNfZXhwb3J0ZXIoICd3aXphcmRfbmF2JyApICkgeyByZXR1cm47IH1cclxuXHJcblx0XHRDLnJlZ2lzdGVyKCAnd2l6YXJkX25hdicsIGZ1bmN0aW9uKCBmaWVsZCwgZW1pdCwgZXh0cmFzICkge1xyXG5cdFx0XHQvLyBJbnRlbnRpb25hbGx5IG5vIG91dHB1dDogbmF2IGJ1dHRvbnMgYXJlIG5vdCBwYXJ0IG9mIGRhdGEgdGVtcGxhdGUuXHJcblx0XHRcdHJldHVybjtcclxuXHRcdH0gKTtcclxuXHR9XHJcblxyXG5cdGlmICggdy5XUEJDX0JGQl9Db250ZW50RXhwb3J0ZXIgJiYgdHlwZW9mIHcuV1BCQ19CRkJfQ29udGVudEV4cG9ydGVyLnJlZ2lzdGVyID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0cmVnaXN0ZXJfd2l6YXJkX25hdl9ib29raW5nX2RhdGFfZXhwb3J0ZXIoKTtcclxuXHR9IGVsc2UgaWYgKCB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICkge1xyXG5cdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcclxuXHRcdFx0J3dwYmM6YmZiOmNvbnRlbnQtZXhwb3J0ZXItcmVhZHknLFxyXG5cdFx0XHRyZWdpc3Rlcl93aXphcmRfbmF2X2Jvb2tpbmdfZGF0YV9leHBvcnRlcixcclxuXHRcdFx0eyBvbmNlOiB0cnVlIH1cclxuXHRcdCk7XHJcblx0fVxyXG5cclxufSkoIHdpbmRvdyApO1xyXG4iXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQSxDQUFDLFVBQVdBLENBQUMsRUFBRztFQUNmLFlBQVk7O0VBRVosSUFBSUMsSUFBSSxHQUFPRCxDQUFDLENBQUNFLGFBQWEsSUFBSSxDQUFDLENBQUM7RUFDcEMsSUFBSUMsUUFB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
259