| 1 |
"use strict"; |
| 2 |
|
| 3 |
// ================================================================================================= |
| 4 |
// == Pack: Static Text (WP-template-less; schema-driven) |
| 5 |
// == File: /includes/page-form-builder/field-packs/static-text/_out/static-text.js |
| 6 |
// == Depends: WPBC_BFB_Field_Base, Field_Renderer_Registry, Core.Sanitize, Exporter API |
| 7 |
// == Version: 1.1.0 (25.09.2026) — add sanitized link tokens to preview & export |
| 8 |
// ================================================================================================= |
| 9 |
(function (w, d) { |
| 10 |
'use strict'; |
| 11 |
|
| 12 |
var Core = w.WPBC_BFB_Core || {}; |
| 13 |
var registry = Core.WPBC_BFB_Field_Renderer_Registry; |
| 14 |
var Base = Core.WPBC_BFB_Field_Base; |
| 15 |
if (!registry || typeof registry.register !== 'function' || !Base) { |
| 16 |
_wpbc?.dev?.error?.('wpbc_bfb_field_static_text', 'Core registry/base missing'); |
| 17 |
return; |
| 18 |
} |
| 19 |
|
| 20 |
/** |
| 21 |
* Field Renderer: static_text |
| 22 |
* - Renders a single text element with configurable tag, align, bold, italic. |
| 23 |
* - Supports pass-through HTML (preview only) if html_allowed=1; otherwise escapes + optional nl2br. |
| 24 |
* |
| 25 |
* @class wpbc_bfb_field_static_text |
| 26 |
* @extends Core.WPBC_BFB_Field_Base |
| 27 |
*/ |
| 28 |
class wpbc_bfb_field_static_text extends Base { |
| 29 |
/** |
| 30 |
* Defaults (must mirror PHP schema). |
| 31 |
* @returns {{type:string,text:string,links:Array,tag:string,align:string,bold:number,italic:number,html_allowed:number,nl2br:number,cssclass_extra:string,name:string,html_id:string,help:string,usage_key:string}} |
| 32 |
*/ |
| 33 |
static get_defaults() { |
| 34 |
return { |
| 35 |
type: 'static_text', |
| 36 |
text: 'Add your message here…', |
| 37 |
links: [], |
| 38 |
tag: 'p', |
| 39 |
align: 'left', |
| 40 |
bold: 0, |
| 41 |
italic: 0, |
| 42 |
html_allowed: 0, |
| 43 |
nl2br: 1, |
| 44 |
cssclass_extra: '', |
| 45 |
name: '', |
| 46 |
html_id: '', |
| 47 |
help: '', |
| 48 |
usage_key: 'static_text' |
| 49 |
}; |
| 50 |
} |
| 51 |
|
| 52 |
/** |
| 53 |
* Whitelist tag. |
| 54 |
* @param {string} v |
| 55 |
* @returns {string} |
| 56 |
*/ |
| 57 |
static allow_tag(v) { |
| 58 |
var t = String(v || 'p').toLowerCase(); |
| 59 |
var ok = { |
| 60 |
p: 1, |
| 61 |
label: 1, |
| 62 |
span: 1, |
| 63 |
small: 1, |
| 64 |
div: 1, |
| 65 |
h1: 1, |
| 66 |
h2: 1, |
| 67 |
h3: 1, |
| 68 |
h4: 1, |
| 69 |
h5: 1, |
| 70 |
h6: 1 |
| 71 |
}; |
| 72 |
return ok[t] ? t : 'p'; |
| 73 |
} |
| 74 |
|
| 75 |
/** |
| 76 |
* Whitelist align. |
| 77 |
* @param {string} v |
| 78 |
* @returns {string} |
| 79 |
*/ |
| 80 |
static allow_align(v) { |
| 81 |
var a = String(v || 'left').toLowerCase(); |
| 82 |
var ok = { |
| 83 |
left: 1, |
| 84 |
center: 1, |
| 85 |
right: 1 |
| 86 |
}; |
| 87 |
return ok[a] ? a : 'left'; |
| 88 |
} |
| 89 |
|
| 90 |
/** |
| 91 |
* Escape + optional nl2br for preview/export when HTML is not allowed. |
| 92 |
* @param {string} raw |
| 93 |
* @param {boolean} do_nl2br |
| 94 |
* @returns {string} |
| 95 |
*/ |
| 96 |
static escape_text(raw, do_nl2br) { |
| 97 |
var esc = Core.WPBC_BFB_Sanitize.escape_html(String(raw || '')); |
| 98 |
if (do_nl2br && !/<br\s*\/?>/i.test(esc)) { |
| 99 |
esc = esc.replace(/\n/g, '<br>'); |
| 100 |
} |
| 101 |
return esc; |
| 102 |
} |
| 103 |
|
| 104 |
/** |
| 105 |
* Main render entry (called by Builder). |
| 106 |
* Adds the base class "wpbc_static_text" to the text element for styling parity with export. |
| 107 |
* |
| 108 |
* @param {HTMLElement} el |
| 109 |
* @param {Object} data |
| 110 |
* @param {{builder?:any}} ctx |
| 111 |
* @returns {void} |
| 112 |
*/ |
| 113 |
static render(el, data, ctx) { |
| 114 |
if (!el) { |
| 115 |
return; |
| 116 |
} |
| 117 |
var sanit = Core.WPBC_BFB_Sanitize || {}; |
| 118 |
var esc_html = sanit.escape_html || (v => String(v).replace(/[<>&"]/g, '')); |
| 119 |
var sanitize_id = sanit.sanitize_html_id || (v => String(v).trim()); |
| 120 |
var sanitize_name = sanit.sanitize_html_name || (v => String(v).trim()); |
| 121 |
var sanitize_cls = sanit.sanitize_css_classlist || (v => String(v).trim()); |
| 122 |
var d_norm = Object.assign({}, this.get_defaults(), data || {}); |
| 123 |
var tag = this.allow_tag(d_norm.tag); |
| 124 |
var align = this.allow_align(d_norm.align); |
| 125 |
var html_id = d_norm.html_id ? sanitize_id(String(d_norm.html_id)) : ''; |
| 126 |
var name_val = d_norm.name ? sanitize_name(String(d_norm.name)) : ''; |
| 127 |
var cls_extra_raw = String(d_norm.cssclass_extra || ''); |
| 128 |
var cls_extra = sanitize_cls(cls_extra_raw); |
| 129 |
|
| 130 |
// Persist sanitized dataset (helps Inspector & snapshots) |
| 131 |
if (el.dataset.html_id !== html_id) { |
| 132 |
el.dataset.html_id = html_id; |
| 133 |
} |
| 134 |
if (el.dataset.name !== name_val) { |
| 135 |
el.dataset.name = name_val; |
| 136 |
} |
| 137 |
if (el.dataset.cssclass_extra !== cls_extra) { |
| 138 |
el.dataset.cssclass_extra = cls_extra; |
| 139 |
} |
| 140 |
if (el.dataset.tag !== tag) { |
| 141 |
el.dataset.tag = tag; |
| 142 |
} |
| 143 |
if (el.dataset.align !== align) { |
| 144 |
el.dataset.align = align; |
| 145 |
} |
| 146 |
var id_attr = html_id ? ' id="' + esc_html(html_id) + '"' : ''; |
| 147 |
var name_attr = name_val ? ' name="' + esc_html(name_val) + '"' : ''; |
| 148 |
|
| 149 |
// --- NEW: base class on the TEXT element --- |
| 150 |
var base_cls = 'wpbc_static_text'; |
| 151 |
var tag_cls_full = base_cls + (cls_extra ? ' ' + cls_extra : ''); |
| 152 |
var cls_attr = ' class="' + esc_html(tag_cls_full) + '"'; |
| 153 |
var style_bits = []; |
| 154 |
if (align) { |
| 155 |
style_bits.push('text-align:' + align); |
| 156 |
} |
| 157 |
if (d_norm.bold) { |
| 158 |
style_bits.push('font-weight:bold'); |
| 159 |
} |
| 160 |
if (d_norm.italic) { |
| 161 |
style_bits.push('font-style:italic'); |
| 162 |
} |
| 163 |
var style_attr = style_bits.length ? ' style="' + style_bits.join(';') + '"' : ''; |
| 164 |
|
| 165 |
// Content |
| 166 |
var content = ''; |
| 167 |
if (w.WPBC_BFB_Static_Text_Links && 'function' === typeof w.WPBC_BFB_Static_Text_Links.build_content_html) { |
| 168 |
content = w.WPBC_BFB_Static_Text_Links.build_content_html(d_norm.text, d_norm.links, { |
| 169 |
allow_html: !!d_norm.html_allowed, |
| 170 |
nl2br: !!d_norm.nl2br, |
| 171 |
preview_only: true |
| 172 |
}); |
| 173 |
} else if (d_norm.html_allowed) { |
| 174 |
content = String(d_norm.text || ''); |
| 175 |
} else { |
| 176 |
content = this.escape_text(d_norm.text, !!d_norm.nl2br); |
| 177 |
} |
| 178 |
var help_html = d_norm.help ? '<div class="wpbc_bfb__help">' + esc_html(String(d_norm.help)) + '</div>' : ''; |
| 179 |
el.innerHTML = '<span class="wpbc_bfb__no-drag-zone" inert="">' + '<' + tag + id_attr + name_attr + cls_attr + style_attr + '>' + content + '</' + tag + '>' + help_html + '</span>'; |
| 180 |
Core.UI?.WPBC_BFB_Overlay?.ensure?.(ctx?.builder, el); |
| 181 |
} |
| 182 |
|
| 183 |
/** |
| 184 |
* Optional hook after drop (keep base behavior). |
| 185 |
* @param {Object} data |
| 186 |
* @param {HTMLElement} el |
| 187 |
* @param {{palette_item?:HTMLElement}} ctx |
| 188 |
* @returns {void} |
| 189 |
*/ |
| 190 |
static on_field_drop(data, el, ctx) { |
| 191 |
try { |
| 192 |
super.on_field_drop?.(data, el, ctx); |
| 193 |
} catch (e) {} |
| 194 |
} |
| 195 |
} |
| 196 |
|
| 197 |
// Register renderer |
| 198 |
try { |
| 199 |
registry.register('static_text', wpbc_bfb_field_static_text); |
| 200 |
} catch (e) { |
| 201 |
_wpbc?.dev?.error?.('wpbc_bfb_field_static_text.register', e); |
| 202 |
} |
| 203 |
|
| 204 |
// ----------------------------------------------------------------------------------------------------------------- |
| 205 |
// Export for "Booking Form" (Advanced Form shortcode) |
| 206 |
// ----------------------------------------------------------------------------------------------------------------- |
| 207 |
/** |
| 208 |
* Register Booking Form exporter callback (Advanced Form) for "static_text". |
| 209 |
* |
| 210 |
* This exporter: |
| 211 |
* - Emits plain HTML using the same tag/align/bold/italic rules as the Builder preview. |
| 212 |
* - Adds the base class "wpbc_static_text" plus any extra CSS classes. |
| 213 |
* - Respects: |
| 214 |
* • html_allowed = 1 → pass-through HTML (no escaping). |
| 215 |
* • html_allowed = 0 → escape + optional nl2br (via wpbc_bfb_field_static_text.escape_text()). |
| 216 |
* • html_id / name → rendered as id="…" / name="…". |
| 217 |
* - Help text is appended centrally by WPBC_BFB_Exporter.render_field_node(), same as other packs. |
| 218 |
*/ |
| 219 |
function register_static_text_booking_form_exporter() { |
| 220 |
var Exp = w.WPBC_BFB_Exporter; |
| 221 |
if (!Exp || typeof Exp.register !== 'function') { |
| 222 |
return; |
| 223 |
} |
| 224 |
if (typeof Exp.has_exporter === 'function' && Exp.has_exporter('static_text')) { |
| 225 |
return; |
| 226 |
} |
| 227 |
var S = Core.WPBC_BFB_Sanitize || {}; |
| 228 |
var esc_html = S.escape_html || function (v) { |
| 229 |
return String(v); |
| 230 |
}; |
| 231 |
var sanitizeId = S.sanitize_html_id || function (v) { |
| 232 |
return String(v).trim(); |
| 233 |
}; |
| 234 |
var sanitizeNm = S.sanitize_html_name || function (v) { |
| 235 |
return String(v).trim(); |
| 236 |
}; |
| 237 |
var sanitizeCl = S.sanitize_css_classlist || function (v) { |
| 238 |
return String(v).trim(); |
| 239 |
}; |
| 240 |
|
| 241 |
/** |
| 242 |
* @type {WPBC_BFB_ExporterCallback} |
| 243 |
* @param {Object} field |
| 244 |
* @param {function(string):void} emit |
| 245 |
* @param {Object} [extras] |
| 246 |
*/ |
| 247 |
var exporter_callback = function (field, emit, extras) { |
| 248 |
extras = extras || {}; |
| 249 |
|
| 250 |
// Merge with defaults so all props are present (mirrors preview). |
| 251 |
var defs = wpbc_bfb_field_static_text.get_defaults(); |
| 252 |
var d = Object.assign({}, defs, field || {}); |
| 253 |
var tag = wpbc_bfb_field_static_text.allow_tag(d.tag); |
| 254 |
var align = wpbc_bfb_field_static_text.allow_align(d.align); |
| 255 |
var html_id = d.html_id ? sanitizeId(String(d.html_id)) : ''; |
| 256 |
var name_val = d.name ? sanitizeNm(String(d.name)) : ''; |
| 257 |
|
| 258 |
// Extra CSS classes from Inspector / schema. |
| 259 |
var cls_extra_raw = String(d.cssclass_extra || d.cssclass || d.class || ''); |
| 260 |
var cls_extra = sanitizeCl(cls_extra_raw); |
| 261 |
|
| 262 |
// Base class for styling parity between Builder preview and exported form. |
| 263 |
var base_cls = 'wpbc_static_text'; |
| 264 |
var cls_full = base_cls + (cls_extra ? ' ' + cls_extra : ''); |
| 265 |
var id_attr = html_id ? ' id="' + esc_html(html_id) + '"' : ''; |
| 266 |
var name_attr = name_val ? ' name="' + esc_html(name_val) + '"' : ''; |
| 267 |
var cls_attr = ' class="' + esc_html(cls_full) + '"'; |
| 268 |
|
| 269 |
// Inline styles: text-align + bold/italic flags. |
| 270 |
var style_bits = []; |
| 271 |
if (align) { |
| 272 |
style_bits.push('text-align:' + align); |
| 273 |
} |
| 274 |
if (d.bold) { |
| 275 |
style_bits.push('font-weight:bold'); |
| 276 |
} |
| 277 |
if (d.italic) { |
| 278 |
style_bits.push('font-style:italic'); |
| 279 |
} |
| 280 |
var style_attr = style_bits.length ? ' style="' + esc_html(style_bits.join(';')) + '"' : ''; |
| 281 |
|
| 282 |
// Content: escape + nl2br when HTML is NOT allowed; raw when allowed. |
| 283 |
var content; |
| 284 |
if (w.WPBC_BFB_Static_Text_Links && 'function' === typeof w.WPBC_BFB_Static_Text_Links.build_content_html) { |
| 285 |
content = w.WPBC_BFB_Static_Text_Links.build_content_html(d.text, d.links, { |
| 286 |
allow_html: !!d.html_allowed, |
| 287 |
nl2br: !!d.nl2br, |
| 288 |
preview_only: false |
| 289 |
}); |
| 290 |
} else if (d.html_allowed) { |
| 291 |
content = String(d.text || ''); |
| 292 |
} else { |
| 293 |
content = wpbc_bfb_field_static_text.escape_text(d.text, !!d.nl2br); |
| 294 |
} |
| 295 |
emit('<' + tag + id_attr + name_attr + cls_attr + style_attr + '>' + content + '</' + tag + '>'); |
| 296 |
// NOTE: |
| 297 |
// - Help text (field.help) is output by WPBC_BFB_Exporter.render_field_node() |
| 298 |
// beneath this block, keeping behavior consistent with other field packs. |
| 299 |
}; |
| 300 |
Exp.register('static_text', exporter_callback); |
| 301 |
} |
| 302 |
|
| 303 |
// Try immediate registration; if core isn’t ready yet, wait for the event. |
| 304 |
if (w.WPBC_BFB_Exporter && typeof w.WPBC_BFB_Exporter.register === 'function') { |
| 305 |
register_static_text_booking_form_exporter(); |
| 306 |
} else { |
| 307 |
d.addEventListener('wpbc:bfb:exporter-ready', register_static_text_booking_form_exporter, { |
| 308 |
once: true |
| 309 |
}); |
| 310 |
} |
| 311 |
|
| 312 |
// ----------------------------------------------------------------------------------------------------------------- |
| 313 |
// Export for "Booking Data" (Content of booking fields data) |
| 314 |
// ----------------------------------------------------------------------------------------------------------------- |
| 315 |
/** |
| 316 |
* Register Booking Data exporter callback ("Content of booking fields data") for "static_text". |
| 317 |
* |
| 318 |
* Static Text is purely presentational and does not carry user-entered values, |
| 319 |
* so it is intentionally omitted from the "Content of booking fields data" output. |
| 320 |
* This exporter therefore does nothing (emits no line). |
| 321 |
*/ |
| 322 |
function register_static_text_booking_data_exporter() { |
| 323 |
var C = w.WPBC_BFB_ContentExporter; |
| 324 |
if (!C || typeof C.register !== 'function') { |
| 325 |
return; |
| 326 |
} |
| 327 |
if (typeof C.has_exporter === 'function' && C.has_exporter('static_text')) { |
| 328 |
return; |
| 329 |
} |
| 330 |
var exporter_callback = function (field, emit, extras) { |
| 331 |
// Intentionally empty: static_text has no dynamic token/value to show in booking data. |
| 332 |
return; |
| 333 |
}; |
| 334 |
C.register('static_text', exporter_callback); |
| 335 |
} |
| 336 |
if (w.WPBC_BFB_ContentExporter && typeof w.WPBC_BFB_ContentExporter.register === 'function') { |
| 337 |
register_static_text_booking_data_exporter(); |
| 338 |
} else { |
| 339 |
d.addEventListener('wpbc:bfb:content-exporter-ready', register_static_text_booking_data_exporter, { |
| 340 |
once: true |
| 341 |
}); |
| 342 |
} |
| 343 |
})(window, document); |
| 344 |
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvcGFnZS1mb3JtLWJ1aWxkZXIvZmllbGQtcGFja3Mvc3RhdGljLXRleHQvX291dC9zdGF0aWMtdGV4dC5qcyIsIm5hbWVzIjpbInciLCJkIiwiQ29yZSIsIldQQkNfQkZCX0NvcmUiLCJyZWdpc3RyeSIsIldQQkNfQkZCX0ZpZWxkX1JlbmRlcmVyX1JlZ2lzdHJ5IiwiQmFzZSIsIldQQkNfQkZCX0ZpZWxkX0Jhc2UiLCJyZWdpc3RlciIsIl93cGJjIiwiZGV2IiwiZXJyb3IiLCJ3cGJjX2JmYl9maWVsZF9zdGF0aWNfdGV4dCIsImdldF9kZWZhdWx0cyIsInR5cGUiLCJ0ZXh0IiwibGlua3MiLCJ0YWciLCJhbGlnbiIsImJvbGQiLCJpdGFsaWMiLCJodG1sX2FsbG93ZWQiLCJubDJiciIsImNzc2NsYXNzX2V4dHJhIiwibmFtZSIsImh0bWxfaWQiLCJoZWxwIiwidXNhZ2Vfa2V5IiwiYWxsb3dfdGFnIiwidiIsInQiLCJTdHJpbmciLCJ0b0xvd2VyQ2FzZSIsIm9rIiwicCIsImxhYmVsIiwic3BhbiIsInNtYWxsIiwiZGl2IiwiaDEiLCJoMiIsImgzIiwiaDQiLCJoNSIsImg2IiwiYWxsb3dfYWxpZ24iLCJhIiwibGVmdCIsImNlbnRlciIsInJpZ2h0IiwiZXNjYXBlX3RleHQiLCJyYXciLCJkb19ubDJiciIsImVzYyIsIldQQkNfQkZCX1Nhbml0aXplIiwiZXNjYXBlX2h0bWwiLCJ0ZXN0IiwicmVwbGFjZSIsInJlbmRlciIsImVsIiwiZGF0YSIsImN0eCIsInNhbml0IiwiZXNjX2h0bWwiLCJzYW5pdGl6ZV9pZCIsInNhbml0aXplX2h0bWxfaWQiLCJ0cmltIiwic2FuaXRpemVfbmFtZSIsInNhbml0aXplX2h0bWxfbmFtZSIsInNhbml0aXplX2NscyIsInNhbml0aXplX2Nzc19jbGFzc2xpc3QiLCJkX25vcm0iLCJPYmplY3QiLCJhc3NpZ24iLCJuYW1lX3ZhbCIsImNsc19leHRyYV9yYXciLCJjbHNfZXh0cmEiLCJkYXRhc2V0IiwiaWRfYXR0ciIsIm5hbWVfYXR0ciIsImJhc2VfY2xzIiwidGFnX2Nsc19mdWxsIiwiY2xzX2F0dHIiLCJzdHlsZV9iaXRzIiwicHVzaCIsInN0eWxlX2F0dHIiLCJsZW5ndGgiLCJqb2luIiwiY29udGVudCIsIldQQkNfQkZCX1N0YXRpY19UZXh0X0xpbmtzIiwiYnVpbGRfY29udGVudF9odG1sIiwiYWxsb3dfaHRtbCIsInByZXZpZXdfb25seSIsImhlbHBfaHRtbCIsImlubmVySFRNTCIsIlVJIiwiV1BCQ19CRkJfT3ZlcmxheSIsImVuc3VyZSIsImJ1aWxkZXIiLCJvbl9maWVsZF9kcm9wIiwiZSIsInJlZ2lzdGVyX3N0YXRpY190ZXh0X2Jvb2tpbmdfZm9ybV9leHBvcnRlciIsIkV4cCIsIldQQkNfQkZCX0V4cG9ydGVyIiwiaGFzX2V4cG9ydGVyIiwiUyIsInNhbml0aXplSWQiLCJzYW5pdGl6ZU5tIiwic2FuaXRpemVDbCIsImV4cG9ydGVyX2NhbGxiYWNrIiwiZmllbGQiLCJlbWl0IiwiZXh0cmFzIiwiZGVmcyIsImNzc2NsYXNzIiwiY2xhc3MiLCJjbHNfZnVsbCIsImFkZEV2ZW50TGlzdGVuZXIiLCJvbmNlIiwicmVnaXN0ZXJfc3RhdGljX3RleHRfYm9va2luZ19kYXRhX2V4cG9ydGVyIiwiQyIsIldQQkNfQkZCX0NvbnRlbnRFeHBvcnRlciIsIndpbmRvdyIsImRvY3VtZW50Il0sInNvdXJjZXMiOlsiaW5jbHVkZXMvcGFnZS1mb3JtLWJ1aWxkZXIvZmllbGQtcGFja3Mvc3RhdGljLXRleHQvX3NyYy9zdGF0aWMtdGV4dC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbi8vID09IFBhY2s6IFN0YXRpYyBUZXh0IChXUC10ZW1wbGF0ZS1sZXNzOyBzY2hlbWEtZHJpdmVuKVxyXG4vLyA9PSBGaWxlOiAvaW5jbHVkZXMvcGFnZS1mb3JtLWJ1aWxkZXIvZmllbGQtcGFja3Mvc3RhdGljLXRleHQvX291dC9zdGF0aWMtdGV4dC5qc1xyXG4vLyA9PSBEZXBlbmRzOiBXUEJDX0JGQl9GaWVsZF9CYXNlLCBGaWVsZF9SZW5kZXJlcl9SZWdpc3RyeSwgQ29yZS5TYW5pdGl6ZSwgRXhwb3J0ZXIgQVBJXHJcbi8vID09IFZlcnNpb246IDEuMS4wICAoMjUuMDkuMjAyNikgIOKAlCBhZGQgc2FuaXRpemVkIGxpbmsgdG9rZW5zIHRvIHByZXZpZXcgJiBleHBvcnRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuKGZ1bmN0aW9uICh3LCBkKSB7XHJcblx0J3VzZSBzdHJpY3QnO1xyXG5cclxuXHR2YXIgQ29yZSAgICAgID0gdy5XUEJDX0JGQl9Db3JlIHx8IHt9O1xyXG5cdHZhciByZWdpc3RyeSAgPSBDb3JlLldQQkNfQkZCX0ZpZWxkX1JlbmRlcmVyX1JlZ2lzdHJ5O1xyXG5cdHZhciBCYXNlICAgICAgPSBDb3JlLldQQkNfQkZCX0ZpZWxkX0Jhc2U7XHJcblxyXG5cdGlmICggISByZWdpc3RyeSB8fCB0eXBlb2YgcmVnaXN0cnkucmVnaXN0ZXIgIT09ICdmdW5jdGlvbicgfHwgISBCYXNlICkge1xyXG5cdFx0X3dwYmM/LmRldj8uZXJyb3I/LiggJ3dwYmNfYmZiX2ZpZWxkX3N0YXRpY190ZXh0JywgJ0NvcmUgcmVnaXN0cnkvYmFzZSBtaXNzaW5nJyApO1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmllbGQgUmVuZGVyZXI6IHN0YXRpY190ZXh0XHJcblx0ICogLSBSZW5kZXJzIGEgc2luZ2xlIHRleHQgZWxlbWVudCB3aXRoIGNvbmZpZ3VyYWJsZSB0YWcsIGFsaWduLCBib2xkLCBpdGFsaWMuXHJcblx0ICogLSBTdXBwb3J0cyBwYXNzLXRocm91Z2ggSFRNTCAocHJldmlldyBvbmx5KSBpZiBodG1sX2FsbG93ZWQ9MTsgb3RoZXJ3aXNlIGVzY2FwZXMgKyBvcHRpb25hbCBubDJici5cclxuXHQgKlxyXG5cdCAqIEBjbGFzcyB3cGJjX2JmYl9maWVsZF9zdGF0aWNfdGV4dFxyXG5cdCAqIEBleHRlbmRzIENvcmUuV1BCQ19CRkJfRmllbGRfQmFzZVxyXG5cdCAqL1xyXG5cdGNsYXNzIHdwYmNfYmZiX2ZpZWxkX3N0YXRpY190ZXh0IGV4dGVuZHMgQmFzZSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZhdWx0cyAobXVzdCBtaXJyb3IgUEhQIHNjaGVtYSkuXHJcblx0XHQgKiBAcmV0dXJucyB7e3R5cGU6c3RyaW5nLHRleHQ6c3RyaW5nLGxpbmtzOkFycmF5LHRhZzpzdHJpbmcsYWxpZ246c3RyaW5nLGJvbGQ6bnVtYmVyLGl0YWxpYzpudW1iZXIsaHRtbF9hbGxvd2VkOm51bWJlcixubDJicjpudW1iZXIsY3NzY2xhc3NfZXh0cmE6c3RyaW5nLG5hbWU6c3RyaW5nLGh0bWxfaWQ6c3RyaW5nLGhlbHA6c3RyaW5nLHVzYWdlX2tleTpzdHJpbmd9fVxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIGdldF9kZWZhdWx0cygpIHtcclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHR0eXBlICAgICAgICAgICAgOiAnc3RhdGljX3RleHQnLFxyXG5cdFx0XHRcdHRleHQgICAgICAgICAgICA6ICdBZGQgeW91ciBtZXNzYWdlIGhlcmXigKYnLFxuXHRcdFx0XHRsaW5rcyAgICAgICAgICAgOiBbXSxcblx0XHRcdFx0dGFnICAgICAgICAgICAgIDogJ3AnLFxyXG5cdFx0XHRcdGFsaWduICAgICAgICAgICA6ICdsZWZ0JyxcclxuXHRcdFx0XHRib2xkICAgICAgICAgICAgOiAwLFxyXG5cdFx0XHRcdGl0YWxpYyAgICAgICAgICA6IDAsXHJcblx0XHRcdFx0aHRtbF9hbGxvd2VkICAgIDogMCxcclxuXHRcdFx0XHRubDJiciAgICAgICAgICAgOiAxLFxyXG5cdFx0XHRcdGNzc2NsYXNzX2V4dHJhICA6ICcnLFxyXG5cdFx0XHRcdG5hbWUgICAgICAgICAgICA6ICcnLFxyXG5cdFx0XHRcdGh0bWxfaWQgICAgICAgICA6ICcnLFxyXG5cdFx0XHRcdGhlbHAgICAgICAgICAgICA6ICcnLFxyXG5cdFx0XHRcdHVzYWdlX2tleSAgICAgICA6ICdzdGF0aWNfdGV4dCdcclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoaXRlbGlzdCB0YWcuXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gdlxyXG5cdFx0ICogQHJldHVybnMge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIGFsbG93X3RhZyggdiApIHtcclxuXHRcdFx0dmFyIHQgPSBTdHJpbmcoIHYgfHwgJ3AnICkudG9Mb3dlckNhc2UoKTtcclxuXHRcdFx0dmFyIG9rID0geyBwOjEsbGFiZWw6MSxzcGFuOjEsc21hbGw6MSxkaXY6MSxoMToxLGgyOjEsaDM6MSxoNDoxLGg1OjEsaDY6MSB9O1xyXG5cdFx0XHRyZXR1cm4gb2tbdF0gPyB0IDogJ3AnO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hpdGVsaXN0IGFsaWduLlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHZcclxuXHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHN0YXRpYyBhbGxvd19hbGlnbiggdiApIHtcclxuXHRcdFx0dmFyIGEgPSBTdHJpbmcoIHYgfHwgJ2xlZnQnICkudG9Mb3dlckNhc2UoKTtcclxuXHRcdFx0dmFyIG9rID0geyBsZWZ0OjEsIGNlbnRlcjoxLCByaWdodDoxIH07XHJcblx0XHRcdHJldHVybiBva1thXSA/IGEgOiAnbGVmdCc7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFc2NhcGUgKyBvcHRpb25hbCBubDJiciBmb3IgcHJldmlldy9leHBvcnQgd2hlbiBIVE1MIGlzIG5vdCBhbGxvd2VkLlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHJhd1xyXG5cdFx0ICogQHBhcmFtIHtib29sZWFufSBkb19ubDJiclxyXG5cdFx0ICogQHJldHVybnMge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIGVzY2FwZV90ZXh0KCByYXcsIGRvX25sMmJyICkge1xyXG5cdFx0XHR2YXIgZXNjID0gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZS5lc2NhcGVfaHRtbCggU3RyaW5nKCByYXcgfHwgJycgKSApO1xyXG5cdFx0XHRpZiAoIGRvX25sMmJyICYmICEgLzxiclxccypcXC8/Pi9pLnRlc3QoIGVzYyApICkge1xyXG5cdFx0XHRcdGVzYyA9IGVzYy5yZXBsYWNlKC9cXG4vZywgJzxicj4nKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gZXNjO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogTWFpbiByZW5kZXIgZW50cnkgKGNhbGxlZCBieSBCdWlsZGVyKS5cclxuXHRcdCAqIEFkZHMgdGhlIGJhc2UgY2xhc3MgXCJ3cGJjX3N0YXRpY190ZXh0XCIgdG8gdGhlIHRleHQgZWxlbWVudCBmb3Igc3R5bGluZyBwYXJpdHkgd2l0aCBleHBvcnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXHJcblx0XHQgKiBAcGFyYW0ge3tidWlsZGVyPzphbnl9fSBjdHhcclxuXHRcdCAqIEByZXR1cm5zIHt2b2lkfVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgcmVuZGVyKCBlbCwgZGF0YSwgY3R4ICkge1xyXG5cdFx0XHRpZiAoICEgZWwgKSB7IHJldHVybjsgfVxyXG5cclxuXHRcdFx0dmFyIHNhbml0ICAgICAgICAgID0gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZSB8fCB7fTtcclxuXHRcdFx0dmFyIGVzY19odG1sICAgICAgID0gc2FuaXQuZXNjYXBlX2h0bWwgfHwgKHYgPT4gU3RyaW5nKHYpLnJlcGxhY2UoL1s8PiZcIl0vZywgJycpKTtcclxuXHRcdFx0dmFyIHNhbml0aXplX2lkICAgID0gc2FuaXQuc2FuaXRpemVfaHRtbF9pZCB8fCAodiA9PiBTdHJpbmcodikudHJpbSgpKTtcclxuXHRcdFx0dmFyIHNhbml0aXplX25hbWUgID0gc2FuaXQuc2FuaXRpemVfaHRtbF9uYW1lIHx8ICh2ID0+IFN0cmluZyh2KS50cmltKCkpO1xyXG5cdFx0XHR2YXIgc2FuaXRpemVfY2xzICAgPSBzYW5pdC5zYW5pdGl6ZV9jc3NfY2xhc3NsaXN0IHx8ICh2ID0+IFN0cmluZyh2KS50cmltKCkpO1xyXG5cclxuXHRcdFx0dmFyIGRfbm9ybSAgICAgICAgID0gT2JqZWN0LmFzc2lnbigge30sIHRoaXMuZ2V0X2RlZmF1bHRzKCksIGRhdGEgfHwge30gKTtcclxuXHRcdFx0dmFyIHRhZyAgICAgICAgICAgID0gdGhpcy5hbGxvd190YWcoIGRfbm9ybS50YWcgKTtcclxuXHRcdFx0dmFyIGFsaWduICAgICAgICAgID0gdGhpcy5hbGxvd19hbGlnbiggZF9ub3JtLmFsaWduICk7XHJcblxyXG5cdFx0XHR2YXIgaHRtbF9pZCAgICAgICAgPSBkX25vcm0uaHRtbF9pZCA/IHNhbml0aXplX2lkKCBTdHJpbmcoIGRfbm9ybS5odG1sX2lkICkgKSA6ICcnO1xyXG5cdFx0XHR2YXIgbmFtZV92YWwgICAgICAgPSBkX25vcm0ubmFtZSAgICA/IHNhbml0aXplX25hbWUoIFN0cmluZyggZF9ub3JtLm5hbWUgKSApICA6ICcnO1xyXG5cdFx0XHR2YXIgY2xzX2V4dHJhX3JhdyAgPSBTdHJpbmcoIGRfbm9ybS5jc3NjbGFzc19leHRyYSB8fCAnJyApO1xyXG5cdFx0XHR2YXIgY2xzX2V4dHJhICAgICAgPSBzYW5pdGl6ZV9jbHMoIGNsc19leHRyYV9yYXcgKTtcclxuXHJcblx0XHRcdC8vIFBlcnNpc3Qgc2FuaXRpemVkIGRhdGFzZXQgKGhlbHBzIEluc3BlY3RvciAmIHNuYXBzaG90cylcclxuXHRcdFx0aWYgKCBlbC5kYXRhc2V0Lmh0bWxfaWQgIT09IGh0bWxfaWQgKSB7IGVsLmRhdGFzZXQuaHRtbF9pZCA9IGh0bWxfaWQ7IH1cclxuXHRcdFx0aWYgKCBlbC5kYXRhc2V0Lm5hbWUgICAgIT09IG5hbWVfdmFsICkgeyBlbC5kYXRhc2V0Lm5hbWUgPSBuYW1lX3ZhbDsgfVxyXG5cdFx0XHRpZiAoIGVsLmRhdGFzZXQuY3NzY2xhc3NfZXh0cmEgIT09IGNsc19leHRyYSApIHsgZWwuZGF0YXNldC5jc3NjbGFzc19leHRyYSA9IGNsc19leHRyYTsgfVxyXG5cdFx0XHRpZiAoIGVsLmRhdGFzZXQudGFnICAgICAhPT0gdGFnICkgICB7IGVsLmRhdGFzZXQudGFnID0gdGFnOyB9XHJcblx0XHRcdGlmICggZWwuZGF0YXNldC5hbGlnbiAgICE9PSBhbGlnbiApIHsgZWwuZGF0YXNldC5hbGlnbiA9IGFsaWduOyB9XHJcblxyXG5cdFx0XHR2YXIgaWRfYXR0ciAgICAgID0gaHRtbF9pZCA/ICcgaWQ9XCInICsgZXNjX2h0bWwoIGh0bWxfaWQgKSArICdcIicgOiAnJztcclxuXHRcdFx0dmFyIG5hbWVfYXR0ciAgICA9IG5hbWVfdmFsID8gJyBuYW1lPVwiJyArIGVzY19odG1sKCBuYW1lX3ZhbCApICsgJ1wiJyA6ICcnO1xyXG5cclxuXHRcdFx0Ly8gLS0tIE5FVzogYmFzZSBjbGFzcyBvbiB0aGUgVEVYVCBlbGVtZW50IC0tLVxyXG5cdFx0XHR2YXIgYmFzZV9jbHMgICAgID0gJ3dwYmNfc3RhdGljX3RleHQnO1xyXG5cdFx0XHR2YXIgdGFnX2Nsc19mdWxsID0gYmFzZV9jbHMgKyAoIGNsc19leHRyYSA/ICggJyAnICsgY2xzX2V4dHJhICkgOiAnJyApO1xyXG5cdFx0XHR2YXIgY2xzX2F0dHIgICAgID0gJyBjbGFzcz1cIicgKyBlc2NfaHRtbCggdGFnX2Nsc19mdWxsICkgKyAnXCInO1xyXG5cclxuXHRcdFx0dmFyIHN0eWxlX2JpdHMgPSBbXTtcclxuXHRcdFx0aWYgKCBhbGlnbiApICAgICAgICAgICAgICAgeyBzdHlsZV9iaXRzLnB1c2goICd0ZXh0LWFsaWduOicgKyBhbGlnbiApOyB9XHJcblx0XHRcdGlmICggZF9ub3JtLmJvbGQgKSAgICAgICAgIHsgc3R5bGVfYml0cy5wdXNoKCAnZm9udC13ZWlnaHQ6Ym9sZCcgKTsgfVxyXG5cdFx0XHRpZiAoIGRfbm9ybS5pdGFsaWMgKSAgICAgICB7IHN0eWxlX2JpdHMucHVzaCggJ2ZvbnQtc3R5bGU6aXRhbGljJyApOyB9XHJcblx0XHRcdHZhciBzdHlsZV9hdHRyID0gc3R5bGVfYml0cy5sZW5ndGggPyAoICcgc3R5bGU9XCInICsgc3R5bGVfYml0cy5qb2luKCc7JykgKyAnXCInICkgOiAnJztcclxuXHJcblx0XHRcdC8vIENvbnRlbnRcclxuXHRcdFx0dmFyIGNvbnRlbnQgPSAnJztcclxuXHRcdFx0aWYgKCB3LldQQkNfQkZCX1N0YXRpY19UZXh0X0xpbmtzICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiB3LldQQkNfQkZCX1N0YXRpY19UZXh0X0xpbmtzLmJ1aWxkX2NvbnRlbnRfaHRtbCApIHtcblx0XHRcdFx0Y29udGVudCA9IHcuV1BCQ19CRkJfU3RhdGljX1RleHRfTGlua3MuYnVpbGRfY29udGVudF9odG1sKFxuXHRcdFx0XHRcdGRfbm9ybS50ZXh0LFxuXHRcdFx0XHRcdGRfbm9ybS5saW5rcyxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRhbGxvd19odG1sICA6ICEhIGRfbm9ybS5odG1sX2FsbG93ZWQsXG5cdFx0XHRcdFx0XHRubDJiciAgICAgICA6ICEhIGRfbm9ybS5ubDJicixcblx0XHRcdFx0XHRcdHByZXZpZXdfb25seTogdHJ1ZVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSBpZiAoIGRfbm9ybS5odG1sX2FsbG93ZWQgKSB7XG5cdFx0XHRcdGNvbnRlbnQgPSBTdHJpbmcoIGRfbm9ybS50ZXh0IHx8ICcnICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb250ZW50ID0gdGhpcy5lc2NhcGVfdGV4dCggZF9ub3JtLnRleHQsICEhIGRfbm9ybS5ubDJiciApO1xuXHRcdFx0fVxuXHJcblx0XHRcdHZhciBoZWxwX2h0bWwgPSBkX25vcm0uaGVscCA/ICc8ZGl2IGNsYXNzPVwid3BiY19iZmJfX2hlbHBcIj4nICsgZXNjX2h0bWwoIFN0cmluZyggZF9ub3JtLmhlbHAgKSApICsgJzwvZGl2PicgOiAnJztcclxuXHJcblx0XHRcdGVsLmlubmVySFRNTCA9XHJcblx0XHRcdFx0JzxzcGFuIGNsYXNzPVwid3BiY19iZmJfX25vLWRyYWctem9uZVwiIGluZXJ0PVwiXCI+JyArXHJcblx0XHRcdFx0XHQnPCcgKyB0YWcgKyBpZF9hdHRyICsgbmFtZV9hdHRyICsgY2xzX2F0dHIgKyBzdHlsZV9hdHRyICsgJz4nICsgY29udGVudCArICc8LycgKyB0YWcgKyAnPicgK1xyXG5cdFx0XHRcdFx0aGVscF9odG1sICtcclxuXHRcdFx0XHQnPC9zcGFuPic7XHJcblxyXG5cdFx0XHRDb3JlLlVJPy5XUEJDX0JGQl9PdmVybGF5Py5lbnN1cmU/LiggY3R4Py5idWlsZGVyLCBlbCApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogT3B0aW9uYWwgaG9vayBhZnRlciBkcm9wIChrZWVwIGJhc2UgYmVoYXZpb3IpLlxyXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGFcclxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXHJcblx0XHQgKiBAcGFyYW0ge3twYWxldHRlX2l0ZW0/OkhUTUxFbGVtZW50fX0gY3R4XHJcblx0XHQgKiBAcmV0dXJucyB7dm9pZH1cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIG9uX2ZpZWxkX2Ryb3AoIGRhdGEsIGVsLCBjdHggKSB7XHJcblx0XHRcdHRyeSB7IHN1cGVyLm9uX2ZpZWxkX2Ryb3A/LiggZGF0YSwgZWwsIGN0eCApOyB9IGNhdGNoIChlKSB7fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gUmVnaXN0ZXIgcmVuZGVyZXJcclxuXHR0cnkge1xyXG5cdFx0cmVnaXN0cnkucmVnaXN0ZXIoICdzdGF0aWNfdGV4dCcsIHdwYmNfYmZiX2ZpZWxkX3N0YXRpY190ZXh0ICk7XHJcblx0fSBjYXRjaCAoZSkge1xyXG5cdFx0X3dwYmM/LmRldj8uZXJyb3I/LiggJ3dwYmNfYmZiX2ZpZWxkX3N0YXRpY190ZXh0LnJlZ2lzdGVyJywgZSApO1xyXG5cdH1cclxuXHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0Ly8gRXhwb3J0IGZvciBcIkJvb2tpbmcgRm9ybVwiIChBZHZhbmNlZCBGb3JtIHNob3J0Y29kZSlcclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8qKlxyXG5cdCAqIFJlZ2lzdGVyIEJvb2tpbmcgRm9ybSBleHBvcnRlciBjYWxsYmFjayAoQWR2YW5jZWQgRm9ybSkgZm9yIFwic3RhdGljX3RleHRcIi5cclxuXHQgKlxyXG5cdCAqIFRoaXMgZXhwb3J0ZXI6XHJcblx0ICogIC0gRW1pdHMgcGxhaW4gSFRNTCB1c2luZyB0aGUgc2FtZSB0YWcvYWxpZ24vYm9sZC9pdGFsaWMgcnVsZXMgYXMgdGhlIEJ1aWxkZXIgcHJldmlldy5cclxuXHQgKiAgLSBBZGRzIHRoZSBiYXNlIGNsYXNzIFwid3BiY19zdGF0aWNfdGV4dFwiIHBsdXMgYW55IGV4dHJhIENTUyBjbGFzc2VzLlxyXG5cdCAqICAtIFJlc3BlY3RzOlxyXG5cdCAqICAgICAg4oCiIGh0bWxfYWxsb3dlZCA9IDEg4oaSIHBhc3MtdGhyb3VnaCBIVE1MIChubyBlc2NhcGluZykuXHJcblx0ICogICAgICDigKIgaHRtbF9hbGxvd2VkID0gMCDihpIgZXNjYXBlICsgb3B0aW9uYWwgbmwyYnIgKHZpYSB3cGJjX2JmYl9maWVsZF9zdGF0aWNfdGV4dC5lc2NhcGVfdGV4dCgpKS5cclxuXHQgKiAgICAgIOKAoiBodG1sX2lkIC8gbmFtZSAgIOKGkiByZW5kZXJlZCBhcyBpZD1cIuKAplwiIC8gbmFtZT1cIuKAplwiLlxyXG5cdCAqICAtIEhlbHAgdGV4dCBpcyBhcHBlbmRlZCBjZW50cmFsbHkgYnkgV1BCQ19CRkJfRXhwb3J0ZXIucmVuZGVyX2ZpZWxkX25vZGUoKSwgc2FtZSBhcyBvdGhlciBwYWNrcy5cclxuXHQgKi9cclxuXHRmdW5jdGlvbiByZWdpc3Rlcl9zdGF0aWNfdGV4dF9ib29raW5nX2Zvcm1fZXhwb3J0ZXIoKSB7XHJcblxyXG5cdFx0dmFyIEV4cCA9IHcuV1BCQ19CRkJfRXhwb3J0ZXI7XHJcblx0XHRpZiAoICEgRXhwIHx8IHR5cGVvZiBFeHAucmVnaXN0ZXIgIT09ICdmdW5jdGlvbicgKSB7IHJldHVybjsgfVxyXG5cdFx0aWYgKCB0eXBlb2YgRXhwLmhhc19leHBvcnRlciA9PT0gJ2Z1bmN0aW9uJyAmJiBFeHAuaGFzX2V4cG9ydGVyKCAnc3RhdGljX3RleHQnICkgKSB7IHJldHVybjsgfVxyXG5cclxuXHRcdHZhciBTICAgICAgICAgID0gQ29yZS5XUEJDX0JGQl9TYW5pdGl6ZSB8fCB7fTtcclxuXHRcdHZhciBlc2NfaHRtbCAgID0gUy5lc2NhcGVfaHRtbCAgICAgICAgICAgfHwgZnVuY3Rpb24oIHYgKXsgcmV0dXJuIFN0cmluZyggdiApOyB9O1xyXG5cdFx0dmFyIHNhbml0aXplSWQgPSBTLnNhbml0aXplX2h0bWxfaWQgICAgICB8fCBmdW5jdGlvbiggdiApeyByZXR1cm4gU3RyaW5nKCB2ICkudHJpbSgpOyB9O1xyXG5cdFx0dmFyIHNhbml0aXplTm0gPSBTLnNhbml0aXplX2h0bWxfbmFtZSAgICB8fCBmdW5jdGlvbiggdiApeyByZXR1cm4gU3RyaW5nKCB2ICkudHJpbSgpOyB9O1xyXG5cdFx0dmFyIHNhbml0aXplQ2wgPSBTLnNhbml0aXplX2Nzc19jbGFzc2xpc3R8fCBmdW5jdGlvbiggdiApeyByZXR1cm4gU3RyaW5nKCB2ICkudHJpbSgpOyB9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQHR5cGUge1dQQkNfQkZCX0V4cG9ydGVyQ2FsbGJhY2t9XHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gIGZpZWxkXHJcblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZyk6dm9pZH0gZW1pdFxyXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9ICBbZXh0cmFzXVxyXG5cdFx0ICovXHJcblx0XHR2YXIgZXhwb3J0ZXJfY2FsbGJhY2sgPSBmdW5jdGlvbiggZmllbGQsIGVtaXQsIGV4dHJhcyApIHtcclxuXHRcdFx0ZXh0cmFzID0gZXh0cmFzIHx8IHt9O1xyXG5cclxuXHRcdFx0Ly8gTWVyZ2Ugd2l0aCBkZWZhdWx0cyBzbyBhbGwgcHJvcHMgYXJlIHByZXNlbnQgKG1pcnJvcnMgcHJldmlldykuXHJcblx0XHRcdHZhciBkZWZzID0gd3BiY19iZmJfZmllbGRfc3RhdGljX3RleHQuZ2V0X2RlZmF1bHRzKCk7XHJcblx0XHRcdHZhciBkICAgID0gT2JqZWN0LmFzc2lnbigge30sIGRlZnMsIGZpZWxkIHx8IHt9ICk7XHJcblxyXG5cdFx0XHR2YXIgdGFnICAgPSB3cGJjX2JmYl9maWVsZF9zdGF0aWNfdGV4dC5hbGxvd190YWcoIGQudGFnICk7XHJcblx0XHRcdHZhciBhbGlnbiA9IHdwYmNfYmZiX2ZpZWxkX3N0YXRpY190ZXh0LmFsbG93X2FsaWduKCBkLmFsaWduICk7XHJcblxyXG5cdFx0XHR2YXIgaHRtbF9pZCAgID0gZC5odG1sX2lkID8gc2FuaXRpemVJZCggU3RyaW5nKCBkLmh0bWxfaWQgKSApIDogJyc7XHJcblx0XHRcdHZhciBuYW1lX3ZhbCAgPSBkLm5hbWUgICAgPyBzYW5pdGl6ZU5tKCBTdHJpbmcoIGQubmFtZSApICkgICAgOiAnJztcclxuXHJcblx0XHRcdC8vIEV4dHJhIENTUyBjbGFzc2VzIGZyb20gSW5zcGVjdG9yIC8gc2NoZW1hLlxyXG5cdFx0XHR2YXIgY2xzX2V4dHJhX3JhdyA9IFN0cmluZyggZC5jc3NjbGFzc19leHRyYSB8fCBkLmNzc2NsYXNzIHx8IGQuY2xhc3MgfHwgJycgKTtcclxuXHRcdFx0dmFyIGNsc19leHRyYSAgICAgPSBzYW5pdGl6ZUNsKCBjbHNfZXh0cmFfcmF3ICk7XHJcblxyXG5cdFx0XHQvLyBCYXNlIGNsYXNzIGZvciBzdHlsaW5nIHBhcml0eSBiZXR3ZWVuIEJ1aWxkZXIgcHJldmlldyBhbmQgZXhwb3J0ZWQgZm9ybS5cclxuXHRcdFx0dmFyIGJhc2VfY2xzICA9ICd3cGJjX3N0YXRpY190ZXh0JztcclxuXHRcdFx0dmFyIGNsc19mdWxsICA9IGJhc2VfY2xzICsgKCBjbHNfZXh0cmEgPyAoICcgJyArIGNsc19leHRyYSApIDogJycgKTtcclxuXHJcblx0XHRcdHZhciBpZF9hdHRyICAgPSBodG1sX2lkICA/ICcgaWQ9XCInICAgKyBlc2NfaHRtbCggaHRtbF9pZCApICArICdcIicgOiAnJztcclxuXHRcdFx0dmFyIG5hbWVfYXR0ciA9IG5hbWVfdmFsID8gJyBuYW1lPVwiJyArIGVzY19odG1sKCBuYW1lX3ZhbCApICsgJ1wiJyA6ICcnO1xyXG5cdFx0XHR2YXIgY2xzX2F0dHIgID0gJyBjbGFzcz1cIicgKyBlc2NfaHRtbCggY2xzX2Z1bGwgKSArICdcIic7XHJcblxyXG5cdFx0XHQvLyBJbmxpbmUgc3R5bGVzOiB0ZXh0LWFsaWduICsgYm9sZC9pdGFsaWMgZmxhZ3MuXHJcblx0XHRcdHZhciBzdHlsZV9iaXRzID0gW107XHJcblx0XHRcdGlmICggYWxpZ24gKSAgICAgICB7IHN0eWxlX2JpdHMucHVzaCggJ3RleHQtYWxpZ246JyArIGFsaWduICk7IH1cclxuXHRcdFx0aWYgKCBkLmJvbGQgKSAgICAgIHsgc3R5bGVfYml0cy5wdXNoKCAnZm9udC13ZWlnaHQ6Ym9sZCcgKTsgfVxyXG5cdFx0XHRpZiAoIGQuaXRhbGljICkgICAgeyBzdHlsZV9iaXRzLnB1c2goICdmb250LXN0eWxlOml0YWxpYycgKTsgfVxyXG5cdFx0XHR2YXIgc3R5bGVfYXR0ciA9IHN0eWxlX2JpdHMubGVuZ3RoXHJcblx0XHRcdFx0PyAnIHN0eWxlPVwiJyArIGVzY19odG1sKCBzdHlsZV9iaXRzLmpvaW4oICc7JyApICkgKyAnXCInXHJcblx0XHRcdFx0OiAnJztcclxuXHJcblx0XHRcdC8vIENvbnRlbnQ6IGVzY2FwZSArIG5sMmJyIHdoZW4gSFRNTCBpcyBOT1QgYWxsb3dlZDsgcmF3IHdoZW4gYWxsb3dlZC5cclxuXHRcdFx0dmFyIGNvbnRlbnQ7XHJcblx0XHRcdGlmICggdy5XUEJDX0JGQl9TdGF0aWNfVGV4dF9MaW5rcyAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2Ygdy5XUEJDX0JGQl9TdGF0aWNfVGV4dF9MaW5rcy5idWlsZF9jb250ZW50X2h0bWwgKSB7XG5cdFx0XHRcdGNvbnRlbnQgPSB3LldQQkNfQkZCX1N0YXRpY19UZXh0X0xpbmtzLmJ1aWxkX2NvbnRlbnRfaHRtbChcblx0XHRcdFx0XHRkLnRleHQsXG5cdFx0XHRcdFx0ZC5saW5rcyxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRhbGxvd19odG1sICA6ICEhIGQuaHRtbF9hbGxvd2VkLFxuXHRcdFx0XHRcdFx0bmwyYnIgICAgICAgOiAhISBkLm5sMmJyLFxuXHRcdFx0XHRcdFx0cHJldmlld19vbmx5OiBmYWxzZVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSBpZiAoIGQuaHRtbF9hbGxvd2VkICkge1xuXHRcdFx0XHRjb250ZW50ID0gU3RyaW5nKCBkLnRleHQgfHwgJycgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnRlbnQgPSB3cGJjX2JmYl9maWVsZF9zdGF0aWNfdGV4dC5lc2NhcGVfdGV4dCggZC50ZXh0LCAhISBkLm5sMmJyICk7XG5cdFx0XHR9XG5cclxuXHRcdFx0ZW1pdChcclxuXHRcdFx0XHQnPCcgKyB0YWcgKyBpZF9hdHRyICsgbmFtZV9hdHRyICsgY2xzX2F0dHIgKyBzdHlsZV9hdHRyICsgJz4nICtcclxuXHRcdFx0XHRcdGNvbnRlbnQgK1xyXG5cdFx0XHRcdCc8LycgKyB0YWcgKyAnPidcclxuXHRcdFx0KTtcclxuXHRcdFx0Ly8gTk9URTpcclxuXHRcdFx0Ly8gIC0gSGVscCB0ZXh0IChmaWVsZC5oZWxwKSBpcyBvdXRwdXQgYnkgV1BCQ19CRkJfRXhwb3J0ZXIucmVuZGVyX2ZpZWxkX25vZGUoKVxyXG5cdFx0XHQvLyAgICBiZW5lYXRoIHRoaXMgYmxvY2ssIGtlZXBpbmcgYmVoYXZpb3IgY29uc2lzdGVudCB3aXRoIG90aGVyIGZpZWxkIHBhY2tzLlxyXG5cdFx0fTtcclxuXHJcblx0XHRFeHAucmVnaXN0ZXIoICdzdGF0aWNfdGV4dCcsIGV4cG9ydGVyX2NhbGxiYWNrICk7XHJcblx0fVxyXG5cclxuXHQvLyBUcnkgaW1tZWRpYXRlIHJlZ2lzdHJhdGlvbjsgaWYgY29yZSBpc27igJl0IHJlYWR5IHlldCwgd2FpdCBmb3IgdGhlIGV2ZW50LlxyXG5cdGlmICggdy5XUEJDX0JGQl9FeHBvcnRlciAmJiB0eXBlb2Ygdy5XUEJDX0JGQl9FeHBvcnRlci5yZWdpc3RlciA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdHJlZ2lzdGVyX3N0YXRpY190ZXh0X2Jvb2tpbmdfZm9ybV9leHBvcnRlcigpO1xyXG5cdH0gZWxzZSB7XHJcblx0XHRkLmFkZEV2ZW50TGlzdGVuZXIoXHJcblx0XHRcdCd3cGJjOmJmYjpleHBvcnRlci1yZWFkeScsXHJcblx0XHRcdHJlZ2lzdGVyX3N0YXRpY190ZXh0X2Jvb2tpbmdfZm9ybV9leHBvcnRlcixcclxuXHRcdFx0eyBvbmNlOiB0cnVlIH1cclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvLyBFeHBvcnQgZm9yIFwiQm9va2luZyBEYXRhXCIgKENvbnRlbnQgb2YgYm9va2luZyBmaWVsZHMgZGF0YSlcclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8qKlxyXG5cdCAqIFJlZ2lzdGVyIEJvb2tpbmcgRGF0YSBleHBvcnRlciBjYWxsYmFjayAoXCJDb250ZW50IG9mIGJvb2tpbmcgZmllbGRzIGRhdGFcIikgZm9yIFwic3RhdGljX3RleHRcIi5cclxuXHQgKlxyXG5cdCAqIFN0YXRpYyBUZXh0IGlzIHB1cmVseSBwcmVzZW50YXRpb25hbCBhbmQgZG9lcyBub3QgY2FycnkgdXNlci1lbnRlcmVkIHZhbHVlcyxcclxuXHQgKiBzbyBpdCBpcyBpbnRlbnRpb25hbGx5IG9taXR0ZWQgZnJvbSB0aGUgXCJDb250ZW50IG9mIGJvb2tpbmcgZmllbGRzIGRhdGFcIiBvdXRwdXQuXHJcblx0ICogVGhpcyBleHBvcnRlciB0aGVyZWZvcmUgZG9lcyBub3RoaW5nIChlbWl0cyBubyBsaW5lKS5cclxuXHQgKi9cclxuXHRmdW5jdGlvbiByZWdpc3Rlcl9zdGF0aWNfdGV4dF9ib29raW5nX2RhdGFfZXhwb3J0ZXIoKSB7XHJcblxyXG5cdFx0dmFyIEMgPSB3LldQQkNfQkZCX0NvbnRlbnRFeHBvcnRlcjtcclxuXHRcdGlmICggISBDIHx8IHR5cGVvZiBDLnJlZ2lzdGVyICE9PSAnZnVuY3Rpb24nICkgeyByZXR1cm47IH1cclxuXHRcdGlmICggdHlwZW9mIEMuaGFzX2V4cG9ydGVyID09PSAnZnVuY3Rpb24nICYmIEMuaGFzX2V4cG9ydGVyKCAnc3RhdGljX3RleHQnICkgKSB7IHJldHVybjsgfVxyXG5cclxuXHRcdHZhciBleHBvcnRlcl9jYWxsYmFjayA9IGZ1bmN0aW9uKCBmaWVsZCwgZW1pdCwgZXh0cmFzICkge1xyXG5cdFx0XHQvLyBJbnRlbnRpb25hbGx5IGVtcHR5OiBzdGF0aWNfdGV4dCBoYXMgbm8gZHluYW1pYyB0b2tlbi92YWx1ZSB0byBzaG93IGluIGJvb2tpbmcgZGF0YS5cclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fTtcclxuXHJcblx0XHRDLnJlZ2lzdGVyKCAnc3RhdGljX3RleHQnLCBleHBvcnRlcl9jYWxsYmFjayApO1xyXG5cdH1cclxuXHJcblx0aWYgKCB3LldQQkNfQkZCX0NvbnRlbnRFeHBvcnRlciAmJiB0eXBlb2Ygdy5XUEJDX0JGQl9Db250ZW50RXhwb3J0ZXIucmVnaXN0ZXIgPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRyZWdpc3Rlcl9zdGF0aWNfdGV4dF9ib29raW5nX2RhdGFfZXhwb3J0ZXIoKTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0ZC5hZGRFdmVudExpc3RlbmVyKFxyXG5cdFx0XHQnd3BiYzpiZmI6Y29udGVudC1leHBvcnRlci1yZWFkeScsXHJcblx0XHRcdHJlZ2lzdGVyX3N0YXRpY190ZXh0X2Jvb2tpbmdfZGF0YV9leHBvcnRlcixcclxuXHRcdFx0eyBvbmNlOiB0cnVlIH1cclxuXHRcdCk7XHJcblx0fVxyXG5cclxufSkoIHdpbmRvdywgZG9jdW1lbnQgKTtcclxuIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsVUFBVUEsQ0FBQyxFQUFFQyxDQUFDLEVBQUU7RUFDaEIsWUFBWTs7RUFFWixJQUFJQyxJQUFJLEdBQVFGLENBQUMsQ0FBQ0csYUFBYSxJQUFJLENBQUMsQ0FBQztFQUNyQyxJQUFJQyxRQUFRLEdBQUlGLElBQUksQ0FBQ0csZ0NBQWdDO0VBQ3JELElBQUlDLElBQUksR0FBUUosSUFBSSxDQUFDSyxtQkFBbUI7RUFFeEMsSUFBSyxDQUFFSCxRQUFRLElBQUksT0FBT0EsUUFBUSxDQUFDSSxRQUFRLEtBQUssVUFBVSxJQUFJLENBQUVGLElBQUksRUFBRztJQUN0RUcsS0FBSyxFQUFFQyxHQUFHLEVBQUVDLEtBQUssR0FBSSw0QkFBNEIsRUFB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 |
| 345 |
|