| 1 |
"use strict"; |
| 2 |
|
| 3 |
/** |
| 4 |
* WPBC BFB: Textarea Renderer (Schema-driven) |
| 5 |
* ===================================================================================================================== |
| 6 |
* File: /includes/page-form-builder/field-packs/textarea/_out/textarea.js |
| 7 |
* ===================================================================================================================== |
| 8 |
*/ |
| 9 |
(function (w) { |
| 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_Textarea', 'Core registry/base missing'); |
| 17 |
return; |
| 18 |
} |
| 19 |
|
| 20 |
/** |
| 21 |
* WPBC BFB: Field Renderer for "textarea" (Schema-driven, template-literal render) |
| 22 |
* |
| 23 |
* Contracts: |
| 24 |
* - Registry: WPBC_BFB_Field_Renderer_Registry.register( 'textarea', Class ) |
| 25 |
* - Class API: static get_defaults(), static render(el, data, ctx), static on_field_drop(data, el, ctx?) [optional] |
| 26 |
* |
| 27 |
* Notes: |
| 28 |
* - Keep defaults aligned with PHP schema->props->default. |
| 29 |
* - Uses WPBC_BFB_Sanitize helpers from Core. |
| 30 |
* - Uses Overlay.ensure(...) so field controls (handle, settings, etc.) appear. |
| 31 |
*/ |
| 32 |
class WPBC_BFB_Field_Textarea extends Base { |
| 33 |
/** |
| 34 |
* Return default props for "textarea" field. |
| 35 |
* Must stay in sync with PHP schema defaults. |
| 36 |
* |
| 37 |
* @returns {Object} |
| 38 |
*/ |
| 39 |
static get_defaults() { |
| 40 |
return { |
| 41 |
type: 'textarea', |
| 42 |
label: 'Textarea', |
| 43 |
name: '', |
| 44 |
html_id: '', |
| 45 |
placeholder: '', |
| 46 |
required: false, |
| 47 |
minlength: null, |
| 48 |
maxlength: null, |
| 49 |
rows: 4, |
| 50 |
cssclass: '', |
| 51 |
help: '', |
| 52 |
default_value: '', |
| 53 |
min_width: '260px' |
| 54 |
}; |
| 55 |
} |
| 56 |
|
| 57 |
/** |
| 58 |
* Render the preview markup into the field element. |
| 59 |
* |
| 60 |
* @param {HTMLElement} el Field root element inside the canvas. |
| 61 |
* @param {Object} data Field props (already normalized by schema). |
| 62 |
* @param {Object} ctx Context: { builder, sanit, ... } |
| 63 |
*/ |
| 64 |
static render(el, data, ctx) { |
| 65 |
if (!el) { |
| 66 |
return; |
| 67 |
} |
| 68 |
|
| 69 |
// Normalize against defaults first. |
| 70 |
const d = this.normalize_data(data); |
| 71 |
|
| 72 |
// ----- Core sanitize helpers (static) ----- |
| 73 |
const eh = v => Core.WPBC_BFB_Sanitize.escape_html(v); |
| 74 |
const sid = v => Core.WPBC_BFB_Sanitize.sanitize_html_id(v); |
| 75 |
const sname = v => Core.WPBC_BFB_Sanitize.sanitize_html_name(v); |
| 76 |
const sclass = v => Core.WPBC_BFB_Sanitize.sanitize_css_classlist(v); |
| 77 |
const truthy = v => Core.WPBC_BFB_Sanitize.is_truthy(v); |
| 78 |
|
| 79 |
// Sanitize public id/name for the control itself. |
| 80 |
const html_id = d.html_id ? sid(String(d.html_id)) : ''; |
| 81 |
const name_val = sname(String(d.name || d.id || 'field')); |
| 82 |
const css_next = sclass(String(d.cssclass || '')); |
| 83 |
|
| 84 |
// Keep dataset in sync (do not mutate wrapper classes). |
| 85 |
if ('cssclass' in d && el.dataset.cssclass !== css_next) { |
| 86 |
el.dataset.cssclass = css_next; |
| 87 |
} |
| 88 |
if ('html_id' in d && el.dataset.html_id !== html_id) { |
| 89 |
el.dataset.html_id = html_id; |
| 90 |
} |
| 91 |
// NEW: persist min_width for the Min-Width guard / layout controller. |
| 92 |
if (d.min_width) { |
| 93 |
el.dataset.min_width = String(d.min_width); |
| 94 |
el.style.setProperty('--wpbc-col-min', String(d.min_width)); |
| 95 |
} |
| 96 |
|
| 97 |
// Flags / numeric constraints. |
| 98 |
const is_required = truthy(d.required); |
| 99 |
const has_minlength = d.minlength != null && d.minlength !== '' && Number.isFinite(+d.minlength); |
| 100 |
const has_maxlength = d.maxlength != null && d.maxlength !== '' && Number.isFinite(+d.maxlength); |
| 101 |
const rows_num = d.rows != null && Number.isFinite(+d.rows) && +d.rows > 0 ? Math.max(1, Math.min(50, +d.rows)) : 4; |
| 102 |
const minlength_num = has_minlength ? Number(d.minlength) : null; |
| 103 |
const maxlength_num = has_maxlength ? Number(d.maxlength) : null; |
| 104 |
|
| 105 |
// Attribute fragments. |
| 106 |
const id_attr = html_id ? ` id="${eh(html_id)}"` : ''; |
| 107 |
const name_attr = ` name="${eh(name_val)}"`; |
| 108 |
// Include the base preview class so the canvas styles apply. |
| 109 |
const cls_attr = ` class="wpbc_bfb__preview-input wpbc_bfb__preview-textarea${css_next ? ' ' + eh(css_next) : ''}"`; |
| 110 |
const ph_attr = d.placeholder ? ` placeholder="${eh(d.placeholder)}"` : ''; |
| 111 |
const req_attr = is_required ? ' required aria-required="true"' : ''; |
| 112 |
const minlength_attr = has_minlength ? ` minlength="${minlength_num}"` : ''; |
| 113 |
const maxlength_attr = has_maxlength ? ` maxlength="${maxlength_num}"` : ''; |
| 114 |
const rows_attr = ` rows="${rows_num}"`; |
| 115 |
const label_html = d.label != null && d.label !== '' ? `<label class="wpbc_bfb__field-label"${html_id ? ` for="${eh(html_id)}"` : ''}>${eh(d.label)}${is_required ? '<span aria-hidden="true">*</span>' : ''}</label>` : ''; |
| 116 |
const help_html = d.help ? `<div class="wpbc_bfb__help">${eh(d.help)}</div>` : ''; |
| 117 |
const default_text = d.default_value != null && d.default_value !== '' ? eh(String(d.default_value)) : ''; |
| 118 |
el.innerHTML = ` |
| 119 |
<span class="wpbc_bfb__noaction wpbc_bfb__no-drag-zone" inert=""> |
| 120 |
${label_html} |
| 121 |
<span class="wpbc_wrap_text wpdev-form-control-wrap"> |
| 122 |
<textarea${cls_attr}${ph_attr}${name_attr} tabindex="-1" aria-disabled="true"${id_attr}${rows_attr}${req_attr}${minlength_attr}${maxlength_attr}>${default_text}</textarea> |
| 123 |
</span> |
| 124 |
${help_html} |
| 125 |
</span> |
| 126 |
`; |
| 127 |
|
| 128 |
// Overlay (handles/toolbars). |
| 129 |
Core.UI?.WPBC_BFB_Overlay?.ensure?.(ctx?.builder, el); |
| 130 |
} |
| 131 |
|
| 132 |
/** |
| 133 |
* Optional hook executed after field is dropped from the palette. |
| 134 |
* |
| 135 |
* @param {Object} data Palette/field data. |
| 136 |
* @param {HTMLElement} el Newly created field element. |
| 137 |
* @param {Object} ctx Context { builder, sanit, context: 'drop' | 'load' | 'preview' } |
| 138 |
* @returns {void} |
| 139 |
*/ |
| 140 |
static on_field_drop(data, el, ctx) { |
| 141 |
super.on_field_drop?.(data, el, ctx); |
| 142 |
} |
| 143 |
} |
| 144 |
try { |
| 145 |
registry.register('textarea', WPBC_BFB_Field_Textarea); |
| 146 |
} catch (e) { |
| 147 |
_wpbc?.dev?.error?.('WPBC_BFB_Field_Textarea.register', e); |
| 148 |
} |
| 149 |
|
| 150 |
// ----------------------------------------------------------------------------------------------------------------- |
| 151 |
// Export for "Booking Form" (Advanced Form shortcode) |
| 152 |
// ----------------------------------------------------------------------------------------------------------------- |
| 153 |
/** |
| 154 |
* Booking Form exporter callback for "textarea". |
| 155 |
* |
| 156 |
* Produces shortcodes equivalent to the legacy exporter: |
| 157 |
* [textarea* your-name 40x4 id:your-name class:your-class "Default text"] |
| 158 |
* |
| 159 |
* Labels and help text are handled in the same centralized way as other packs. |
| 160 |
*/ |
| 161 |
function register_textarea_booking_form_exporter() { |
| 162 |
var Exp = w.WPBC_BFB_Exporter; |
| 163 |
if (!Exp || typeof Exp.register !== 'function') { |
| 164 |
return; |
| 165 |
} |
| 166 |
if (typeof Exp.has_exporter === 'function' && Exp.has_exporter('textarea')) { |
| 167 |
return; |
| 168 |
} |
| 169 |
var S = Core.WPBC_BFB_Sanitize || {}; |
| 170 |
|
| 171 |
/** |
| 172 |
* @type {WPBC_BFB_ExporterCallback} |
| 173 |
*/ |
| 174 |
Exp.register('textarea', function (field, emit, extras) { |
| 175 |
extras = extras || {}; |
| 176 |
var cfg = extras.cfg || {}; |
| 177 |
var ctx = extras.ctx; |
| 178 |
var addLabels = cfg.addLabels !== false; |
| 179 |
|
| 180 |
// Required marker (same semantics as text field). |
| 181 |
var is_req = Exp.is_required(field); |
| 182 |
var req_mark = is_req ? '*' : ''; |
| 183 |
|
| 184 |
// Shared helpers keep naming / id / classes consistent across packs. |
| 185 |
var name = Exp.compute_name('textarea', field); |
| 186 |
var id_opt = Exp.id_option(field, ctx); |
| 187 |
var cls_opts = Exp.class_options(field); |
| 188 |
var ph_attr = Exp.ph_attr(field && field.placeholder); |
| 189 |
var def_text = Exp.default_text_suffix(field); |
| 190 |
|
| 191 |
// Rows token: [textarea name x5] — rows come from schema/Inspector (`field.rows`). |
| 192 |
// Clamp into [1,50] to mirror Inspector constraints. |
| 193 |
var rows_token = ''; |
| 194 |
if (field && field.rows != null && field.rows !== '') { |
| 195 |
var r = Number(field.rows); |
| 196 |
if (!Number.isFinite(r)) { |
| 197 |
r = 4; |
| 198 |
} |
| 199 |
if (r < 1) { |
| 200 |
r = 1; |
| 201 |
} |
| 202 |
if (r > 50) { |
| 203 |
r = 50; |
| 204 |
} |
| 205 |
rows_token = ' x' + String(r); |
| 206 |
} |
| 207 |
|
| 208 |
// Final shortcode body (rows-only sizing; no columns), e.g.: |
| 209 |
// [textarea* your-message x5 id:your-message class:... "Default text"] |
| 210 |
var body = '[textarea' + req_mark + ' ' + name + rows_token + id_opt + cls_opts + ph_attr + def_text + ']'; |
| 211 |
|
| 212 |
// Label behavior mirrors legacy emit_label_then(). |
| 213 |
var raw_label = field && typeof field.label === 'string' ? field.label : ''; |
| 214 |
var label = raw_label.trim(); |
| 215 |
if (label && addLabels) { |
| 216 |
emit('<l>' + (S.escape_html ? S.escape_html(label) : label) + req_mark + '</l>'); |
| 217 |
emit('<br>' + body); |
| 218 |
} else { |
| 219 |
emit(body); |
| 220 |
} |
| 221 |
// Help text is appended centrally by WPBC_BFB_Exporter.render_field_node(). |
| 222 |
}); |
| 223 |
} |
| 224 |
if (w.WPBC_BFB_Exporter && typeof w.WPBC_BFB_Exporter.register === 'function') { |
| 225 |
register_textarea_booking_form_exporter(); |
| 226 |
} else if (typeof document !== 'undefined') { |
| 227 |
document.addEventListener('wpbc:bfb:exporter-ready', register_textarea_booking_form_exporter, { |
| 228 |
once: true |
| 229 |
}); |
| 230 |
} |
| 231 |
|
| 232 |
// ----------------------------------------------------------------------------------------------------------------- |
| 233 |
// Export for "Booking Data" (Content of booking fields data) |
| 234 |
// ----------------------------------------------------------------------------------------------------------------- |
| 235 |
/** |
| 236 |
* Booking Data exporter ("Content of booking fields data") for "textarea". |
| 237 |
* |
| 238 |
* Default line format: |
| 239 |
* <b>Label</b>: <f>[field_name]</f><br> |
| 240 |
*/ |
| 241 |
function register_textarea_booking_data_exporter() { |
| 242 |
var C = w.WPBC_BFB_ContentExporter; |
| 243 |
if (!C || typeof C.register !== 'function') { |
| 244 |
return; |
| 245 |
} |
| 246 |
if (typeof C.has_exporter === 'function' && C.has_exporter('textarea')) { |
| 247 |
return; |
| 248 |
} |
| 249 |
C.register('textarea', function (field, emit, extras) { |
| 250 |
extras = extras || {}; |
| 251 |
var cfg = extras.cfg || {}; |
| 252 |
var Exp = w.WPBC_BFB_Exporter; |
| 253 |
if (!Exp || typeof Exp.compute_name !== 'function') { |
| 254 |
return; |
| 255 |
} |
| 256 |
var name = Exp.compute_name('textarea', field); |
| 257 |
if (!name) { |
| 258 |
return; |
| 259 |
} |
| 260 |
var label = field && typeof field.label === 'string' && field.label.trim() ? field.label.trim() : name; |
| 261 |
|
| 262 |
// Shared helper keeps formatting consistent across all packs. |
| 263 |
C.emit_line_bold_field(emit, label, name, cfg); |
| 264 |
}); |
| 265 |
} |
| 266 |
if (w.WPBC_BFB_ContentExporter && typeof w.WPBC_BFB_ContentExporter.register === 'function') { |
| 267 |
register_textarea_booking_data_exporter(); |
| 268 |
} else if (typeof document !== 'undefined') { |
| 269 |
document.addEventListener('wpbc:bfb:content-exporter-ready', register_textarea_booking_data_exporter, { |
| 270 |
once: true |
| 271 |
}); |
| 272 |
} |
| 273 |
})(window); |
| 274 |
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXMvcGFnZS1mb3JtLWJ1aWxkZXIvZmllbGQtcGFja3MvdGV4dGFyZWEvX291dC90ZXh0YXJlYS5qcyIsIm5hbWVzIjpbInciLCJDb3JlIiwiV1BCQ19CRkJfQ29yZSIsInJlZ2lzdHJ5IiwiV1BCQ19CRkJfRmllbGRfUmVuZGVyZXJfUmVnaXN0cnkiLCJCYXNlIiwiV1BCQ19CRkJfRmllbGRfQmFzZSIsInJlZ2lzdGVyIiwiX3dwYmMiLCJkZXYiLCJlcnJvciIsIldQQkNfQkZCX0ZpZWxkX1RleHRhcmVhIiwiZ2V0X2RlZmF1bHRzIiwidHlwZSIsImxhYmVsIiwibmFtZSIsImh0bWxfaWQiLCJwbGFjZWhvbGRlciIsInJlcXVpcmVkIiwibWlubGVuZ3RoIiwibWF4bGVuZ3RoIiwicm93cyIsImNzc2NsYXNzIiwiaGVscCIsImRlZmF1bHRfdmFsdWUiLCJtaW5fd2lkdGgiLCJyZW5kZXIiLCJlbCIsImRhdGEiLCJjdHgiLCJkIiwibm9ybWFsaXplX2RhdGEiLCJlaCIsInYiLCJXUEJDX0JGQl9TYW5pdGl6ZSIsImVzY2FwZV9odG1sIiwic2lkIiwic2FuaXRpemVfaHRtbF9pZCIsInNuYW1lIiwic2FuaXRpemVfaHRtbF9uYW1lIiwic2NsYXNzIiwic2FuaXRpemVfY3NzX2NsYXNzbGlzdCIsInRydXRoeSIsImlzX3RydXRoeSIsIlN0cmluZyIsIm5hbWVfdmFsIiwiaWQiLCJjc3NfbmV4dCIsImRhdGFzZXQiLCJzdHlsZSIsInNldFByb3BlcnR5IiwiaXNfcmVxdWlyZWQiLCJoYXNfbWlubGVuZ3RoIiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJoYXNfbWF4bGVuZ3RoIiwicm93c19udW0iLCJNYXRoIiwibWF4IiwibWluIiwibWlubGVuZ3RoX251bSIsIm1heGxlbmd0aF9udW0iLCJpZF9hdHRyIiwibmFtZV9hdHRyIiwiY2xzX2F0dHIiLCJwaF9hdHRyIiwicmVxX2F0dHIiLCJtaW5sZW5ndGhfYXR0ciIsIm1heGxlbmd0aF9hdHRyIiwicm93c19hdHRyIiwibGFiZWxfaHRtbCIsImhlbHBfaHRtbCIsImRlZmF1bHRfdGV4dCIsImlubmVySFRNTCIsIlVJIiwiV1BCQ19CRkJfT3ZlcmxheSIsImVuc3VyZSIsImJ1aWxkZXIiLCJvbl9maWVsZF9kcm9wIiwiZSIsInJlZ2lzdGVyX3RleHRhcmVhX2Jvb2tpbmdfZm9ybV9leHBvcnRlciIsIkV4cCIsIldQQkNfQkZCX0V4cG9ydGVyIiwiaGFzX2V4cG9ydGVyIiwiUyIsImZpZWxkIiwiZW1pdCIsImV4dHJhcyIsImNmZyIsImFkZExhYmVscyIsImlzX3JlcSIsInJlcV9tYXJrIiwiY29tcHV0ZV9uYW1lIiwiaWRfb3B0IiwiaWRfb3B0aW9uIiwiY2xzX29wdHMiLCJjbGFzc19vcHRpb25zIiwiZGVmX3RleHQiLCJkZWZhdWx0X3RleHRfc3VmZml4Iiwicm93c190b2tlbiIsInIiLCJib2R5IiwicmF3X2xhYmVsIiwidHJpbSIsImRvY3VtZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsIm9uY2UiLCJyZWdpc3Rlcl90ZXh0YXJlYV9ib29raW5nX2RhdGFfZXhwb3J0ZXIiLCJDIiwiV1BCQ19CRkJfQ29udGVudEV4cG9ydGVyIiwiZW1pdF9saW5lX2JvbGRfZmllbGQiLCJ3aW5kb3ciXSwic291cmNlcyI6WyJpbmNsdWRlcy9wYWdlLWZvcm0tYnVpbGRlci9maWVsZC1wYWNrcy90ZXh0YXJlYS9fc3JjL3RleHRhcmVhLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBXUEJDIEJGQjogVGV4dGFyZWEgUmVuZGVyZXIgKFNjaGVtYS1kcml2ZW4pXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBGaWxlOiAvaW5jbHVkZXMvcGFnZS1mb3JtLWJ1aWxkZXIvZmllbGQtcGFja3MvdGV4dGFyZWEvX291dC90ZXh0YXJlYS5qc1xyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICovXHJcbihmdW5jdGlvbiAodykge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0dmFyIENvcmUgICAgID0gdy5XUEJDX0JGQl9Db3JlIHx8IHt9O1xyXG5cdHZhciByZWdpc3RyeSA9IENvcmUuV1BCQ19CRkJfRmllbGRfUmVuZGVyZXJfUmVnaXN0cnk7XHJcblx0dmFyIEJhc2UgICAgID0gQ29yZS5XUEJDX0JGQl9GaWVsZF9CYXNlO1xyXG5cclxuXHRpZiAoICEgcmVnaXN0cnkgfHwgdHlwZW9mIHJlZ2lzdHJ5LnJlZ2lzdGVyICE9PSAnZnVuY3Rpb24nIHx8ICEgQmFzZSApIHtcclxuXHRcdF93cGJjPy5kZXY/LmVycm9yPy4oICdXUEJDX0JGQl9GaWVsZF9UZXh0YXJlYScsICdDb3JlIHJlZ2lzdHJ5L2Jhc2UgbWlzc2luZycgKTtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdQQkMgQkZCOiBGaWVsZCBSZW5kZXJlciBmb3IgXCJ0ZXh0YXJlYVwiIChTY2hlbWEtZHJpdmVuLCB0ZW1wbGF0ZS1saXRlcmFsIHJlbmRlcilcclxuXHQgKlxyXG5cdCAqIENvbnRyYWN0czpcclxuXHQgKiAtIFJlZ2lzdHJ5OiAgV1BCQ19CRkJfRmllbGRfUmVuZGVyZXJfUmVnaXN0cnkucmVnaXN0ZXIoICd0ZXh0YXJlYScsIENsYXNzIClcclxuXHQgKiAtIENsYXNzIEFQSTogc3RhdGljIGdldF9kZWZhdWx0cygpLCBzdGF0aWMgcmVuZGVyKGVsLCBkYXRhLCBjdHgpLCBzdGF0aWMgb25fZmllbGRfZHJvcChkYXRhLCBlbCwgY3R4PykgW29wdGlvbmFsXVxyXG5cdCAqXHJcblx0ICogTm90ZXM6XHJcblx0ICogLSBLZWVwIGRlZmF1bHRzIGFsaWduZWQgd2l0aCBQSFAgc2NoZW1hLT5wcm9wcy0+ZGVmYXVsdC5cclxuXHQgKiAtIFVzZXMgV1BCQ19CRkJfU2FuaXRpemUgaGVscGVycyBmcm9tIENvcmUuXHJcblx0ICogLSBVc2VzIE92ZXJsYXkuZW5zdXJlKC4uLikgc28gZmllbGQgY29udHJvbHMgKGhhbmRsZSwgc2V0dGluZ3MsIGV0Yy4pIGFwcGVhci5cclxuXHQgKi9cclxuXHRjbGFzcyBXUEJDX0JGQl9GaWVsZF9UZXh0YXJlYSBleHRlbmRzIEJhc2Uge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJuIGRlZmF1bHQgcHJvcHMgZm9yIFwidGV4dGFyZWFcIiBmaWVsZC5cclxuXHRcdCAqIE11c3Qgc3RheSBpbiBzeW5jIHdpdGggUEhQIHNjaGVtYSBkZWZhdWx0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJucyB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHRzdGF0aWMgZ2V0X2RlZmF1bHRzKCkge1xyXG5cdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdHR5cGUgICAgICAgICA6ICd0ZXh0YXJlYScsXHJcblx0XHRcdFx0bGFiZWwgICAgICAgIDogJ1RleHRhcmVhJyxcclxuXHRcdFx0XHRuYW1lICAgICAgICAgOiAnJyxcclxuXHRcdFx0XHRodG1sX2lkICAgICAgOiAnJyxcclxuXHRcdFx0XHRwbGFjZWhvbGRlciAgOiAnJyxcclxuXHRcdFx0XHRyZXF1aXJlZCAgICAgOiBmYWxzZSxcclxuXHRcdFx0XHRtaW5sZW5ndGggICAgOiBudWxsLFxyXG5cdFx0XHRcdG1heGxlbmd0aCAgICA6IG51bGwsXHJcblx0XHRcdFx0cm93cyAgICAgICAgIDogNCxcclxuXHRcdFx0XHRjc3NjbGFzcyAgICAgOiAnJyxcclxuXHRcdFx0XHRoZWxwICAgICAgICAgOiAnJyxcclxuXHRcdFx0XHRkZWZhdWx0X3ZhbHVlOiAnJyxcclxuXHRcdFx0XHRtaW5fd2lkdGggICAgOiAnMjYwcHgnXHJcblx0XHRcdH07XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXIgdGhlIHByZXZpZXcgbWFya3VwIGludG8gdGhlIGZpZWxkIGVsZW1lbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgICBGaWVsZCByb290IGVsZW1lbnQgaW5zaWRlIHRoZSBjYW52YXMuXHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gICAgICBkYXRhIEZpZWxkIHByb3BzIChhbHJlYWR5IG5vcm1hbGl6ZWQgYnkgc2NoZW1hKS5cclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSAgICAgIGN0eCAgQ29udGV4dDogeyBidWlsZGVyLCBzYW5pdCwgLi4uIH1cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIHJlbmRlcihlbCwgZGF0YSwgY3R4KSB7XHJcblx0XHRcdGlmICggISBlbCApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE5vcm1hbGl6ZSBhZ2FpbnN0IGRlZmF1bHRzIGZpcnN0LlxyXG5cdFx0XHRjb25zdCBkID0gdGhpcy5ub3JtYWxpemVfZGF0YSggZGF0YSApO1xyXG5cclxuXHRcdFx0Ly8gLS0tLS0gQ29yZSBzYW5pdGl6ZSBoZWxwZXJzIChzdGF0aWMpIC0tLS0tXHJcblx0XHRcdGNvbnN0IGVoICAgICA9ICh2KSA9PiBDb3JlLldQQkNfQkZCX1Nhbml0aXplLmVzY2FwZV9odG1sKCB2ICk7XHJcblx0XHRcdGNvbnN0IHNpZCAgICA9ICh2KSA9PiBDb3JlLldQQkNfQkZCX1Nhbml0aXplLnNhbml0aXplX2h0bWxfaWQoIHYgKTtcclxuXHRcdFx0Y29uc3Qgc25hbWUgID0gKHYpID0+IENvcmUuV1BCQ19CRkJfU2FuaXRpemUuc2FuaXRpemVfaHRtbF9uYW1lKCB2ICk7XHJcblx0XHRcdGNvbnN0IHNjbGFzcyA9ICh2KSA9PiBDb3JlLldQQkNfQkZCX1Nhbml0aXplLnNhbml0aXplX2Nzc19jbGFzc2xpc3QoIHYgKTtcclxuXHRcdFx0Y29uc3QgdHJ1dGh5ID0gKHYpID0+IENvcmUuV1BCQ19CRkJfU2FuaXRpemUuaXNfdHJ1dGh5KCB2ICk7XHJcblxyXG5cdFx0XHQvLyBTYW5pdGl6ZSBwdWJsaWMgaWQvbmFtZSBmb3IgdGhlIGNvbnRyb2wgaXRzZWxmLlxyXG5cdFx0XHRjb25zdCBodG1sX2lkICA9IGQuaHRtbF9pZCA/IHNpZCggU3RyaW5nKCBkLmh0bWxfaWQgKSApIDogJyc7XHJcblx0XHRcdGNvbnN0IG5hbWVfdmFsID0gc25hbWUoIFN0cmluZyggZC5uYW1lIHx8IGQuaWQgfHwgJ2ZpZWxkJyApICk7XHJcblx0XHRcdGNvbnN0IGNzc19uZXh0ID0gc2NsYXNzKCBTdHJpbmcoIGQuY3NzY2xhc3MgfHwgJycgKSApO1xyXG5cclxuXHRcdFx0Ly8gS2VlcCBkYXRhc2V0IGluIHN5bmMgKGRvIG5vdCBtdXRhdGUgd3JhcHBlciBjbGFzc2VzKS5cclxuXHRcdFx0aWYgKCAnY3NzY2xhc3MnIGluIGQgJiYgZWwuZGF0YXNldC5jc3NjbGFzcyAhPT0gY3NzX25leHQgKSB7XHJcblx0XHRcdFx0ZWwuZGF0YXNldC5jc3NjbGFzcyA9IGNzc19uZXh0O1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICggJ2h0bWxfaWQnIGluIGQgJiYgZWwuZGF0YXNldC5odG1sX2lkICE9PSBodG1sX2lkICkge1xyXG5cdFx0XHRcdGVsLmRhdGFzZXQuaHRtbF9pZCA9IGh0bWxfaWQ7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gTkVXOiBwZXJzaXN0IG1pbl93aWR0aCBmb3IgdGhlIE1pbi1XaWR0aCBndWFyZCAvIGxheW91dCBjb250cm9sbGVyLlxyXG5cdFx0XHRpZiAoIGQubWluX3dpZHRoICkge1xyXG5cdFx0XHRcdGVsLmRhdGFzZXQubWluX3dpZHRoID0gU3RyaW5nKCBkLm1pbl93aWR0aCApO1xyXG5cdFx0XHRcdGVsLnN0eWxlLnNldFByb3BlcnR5KCAnLS13cGJjLWNvbC1taW4nLCBTdHJpbmcoIGQubWluX3dpZHRoICkgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gRmxhZ3MgLyBudW1lcmljIGNvbnN0cmFpbnRzLlxyXG5cdFx0XHRjb25zdCBpc19yZXF1aXJlZCAgID0gdHJ1dGh5KCBkLnJlcXVpcmVkICk7XHJcblx0XHRcdGNvbnN0IGhhc19taW5sZW5ndGggPSAoZC5taW5sZW5ndGggIT0gbnVsbCAmJiBkLm1pbmxlbmd0aCAhPT0gJycgJiYgTnVtYmVyLmlzRmluaXRlKCArZC5taW5sZW5ndGggKSk7XHJcblx0XHRcdGNvbnN0IGhhc19tYXhsZW5ndGggPSAoZC5tYXhsZW5ndGggIT0gbnVsbCAmJiBkLm1heGxlbmd0aCAhPT0gJycgJiYgTnVtYmVyLmlzRmluaXRlKCArZC5tYXhsZW5ndGggKSk7XHJcblx0XHRcdGNvbnN0IHJvd3NfbnVtICAgICAgPSAoZC5yb3dzICE9IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKCArZC5yb3dzICkgJiYgK2Qucm93cyA+IDApXHJcblx0XHRcdFx0PyBNYXRoLm1heCggMSwgTWF0aC5taW4oIDUwLCArZC5yb3dzICkgKVxyXG5cdFx0XHRcdDogNDtcclxuXHJcblx0XHRcdGNvbnN0IG1pbmxlbmd0aF9udW0gPSBoYXNfbWlubGVuZ3RoID8gTnVtYmVyKCBkLm1pbmxlbmd0aCApIDogbnVsbDtcclxuXHRcdFx0Y29uc3QgbWF4bGVuZ3RoX251bSA9IGhhc19tYXhsZW5ndGggPyBOdW1iZXIoIGQubWF4bGVuZ3RoICkgOiBudWxsO1xyXG5cclxuXHRcdFx0Ly8gQXR0cmlidXRlIGZyYWdtZW50cy5cclxuXHRcdFx0Y29uc3QgaWRfYXR0ciAgICAgICAgPSBodG1sX2lkID8gYCBpZD1cIiR7ZWgoIGh0bWxfaWQgKX1cImAgOiAnJztcclxuXHRcdFx0Y29uc3QgbmFtZV9hdHRyICAgICAgPSBgIG5hbWU9XCIke2VoKCBuYW1lX3ZhbCApfVwiYDtcclxuXHRcdFx0Ly8gSW5jbHVkZSB0aGUgYmFzZSBwcmV2aWV3IGNsYXNzIHNvIHRoZSBjYW52YXMgc3R5bGVzIGFwcGx5LlxyXG5cdFx0XHRjb25zdCBjbHNfYXR0ciAgICAgICA9IGAgY2xhc3M9XCJ3cGJjX2JmYl9fcHJldmlldy1pbnB1dCB3cGJjX2JmYl9fcHJldmlldy10ZXh0YXJlYSR7Y3NzX25leHQgPyAnICcgKyBlaCggY3NzX25leHQgKSA6ICcnfVwiYDtcclxuXHRcdFx0Y29uc3QgcGhfYXR0ciAgICAgICAgPSBkLnBsYWNlaG9sZGVyID8gYCBwbGFjZWhvbGRlcj1cIiR7ZWgoIGQucGxhY2Vob2xkZXIgKX1cImAgOiAnJztcclxuXHRcdFx0Y29uc3QgcmVxX2F0dHIgICAgICAgPSBpc19yZXF1aXJlZCA/ICcgcmVxdWlyZWQgYXJpYS1yZXF1aXJlZD1cInRydWVcIicgOiAnJztcclxuXHRcdFx0Y29uc3QgbWlubGVuZ3RoX2F0dHIgPSBoYXNfbWlubGVuZ3RoID8gYCBtaW5sZW5ndGg9XCIke21pbmxlbmd0aF9udW19XCJgIDogJyc7XHJcblx0XHRcdGNvbnN0IG1heGxlbmd0aF9hdHRyID0gaGFzX21heGxlbmd0aCA/IGAgbWF4bGVuZ3RoPVwiJHttYXhsZW5ndGhfbnVtfVwiYCA6ICcnO1xyXG5cdFx0XHRjb25zdCByb3dzX2F0dHIgICAgICA9IGAgcm93cz1cIiR7cm93c19udW19XCJgO1xyXG5cclxuXHRcdFx0Y29uc3QgbGFiZWxfaHRtbCA9IChkLmxhYmVsICE9IG51bGwgJiYgZC5sYWJlbCAhPT0gJycpXHJcblx0XHRcdFx0PyBgPGxhYmVsIGNsYXNzPVwid3BiY19iZmJfX2ZpZWxkLWxhYmVsXCIke2h0bWxfaWQgPyBgIGZvcj1cIiR7ZWgoIGh0bWxfaWQgKX1cImAgOiAnJ30+JHtlaCggZC5sYWJlbCApfSR7aXNfcmVxdWlyZWQgPyAnPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj4nIDogJyd9PC9sYWJlbD5gXHJcblx0XHRcdFx0OiAnJztcclxuXHJcblx0XHRcdGNvbnN0IGhlbHBfaHRtbCAgICA9IGQuaGVscCA/IGA8ZGl2IGNsYXNzPVwid3BiY19iZmJfX2hlbHBcIj4ke2VoKCBkLmhlbHAgKX08L2Rpdj5gIDogJyc7XHJcblx0XHRcdGNvbnN0IGRlZmF1bHRfdGV4dCA9IChkLmRlZmF1bHRfdmFsdWUgIT0gbnVsbCAmJiBkLmRlZmF1bHRfdmFsdWUgIT09ICcnKSA/IGVoKCBTdHJpbmcoIGQuZGVmYXVsdF92YWx1ZSApICkgOiAnJztcclxuXHJcblx0XHRcdGVsLmlubmVySFRNTCA9IGBcclxuXHRcdFx0XHQ8c3BhbiBjbGFzcz1cIndwYmNfYmZiX19ub2FjdGlvbiB3cGJjX2JmYl9fbm8tZHJhZy16b25lXCIgaW5lcnQ9XCJcIj5cclxuXHRcdFx0XHRcdCR7bGFiZWxfaHRtbH1cclxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwid3BiY193cmFwX3RleHQgd3BkZXYtZm9ybS1jb250cm9sLXdyYXBcIj5cclxuXHRcdFx0XHRcdFx0PHRleHRhcmVhJHtjbHNfYXR0cn0ke3BoX2F0dHJ9JHtuYW1lX2F0dHJ9IHRhYmluZGV4PVwiLTFcIiBhcmlhLWRpc2FibGVkPVwidHJ1ZVwiJHtpZF9hdHRyfSR7cm93c19hdHRyfSR7cmVxX2F0dHJ9JHttaW5sZW5ndGhfYXR0cn0ke21heGxlbmd0aF9hdHRyfT4ke2RlZmF1bHRfdGV4dH08L3RleHRhcmVhPlxyXG5cdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdFx0JHtoZWxwX2h0bWx9XHJcblx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRgO1xyXG5cclxuXHRcdFx0Ly8gT3ZlcmxheSAoaGFuZGxlcy90b29sYmFycykuXHJcblx0XHRcdENvcmUuVUk/LldQQkNfQkZCX092ZXJsYXk/LmVuc3VyZT8uKCBjdHg/LmJ1aWxkZXIsIGVsICk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPcHRpb25hbCBob29rIGV4ZWN1dGVkIGFmdGVyIGZpZWxkIGlzIGRyb3BwZWQgZnJvbSB0aGUgcGFsZXR0ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gICAgICBkYXRhICBQYWxldHRlL2ZpZWxkIGRhdGEuXHJcblx0XHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCAgICBOZXdseSBjcmVhdGVkIGZpZWxkIGVsZW1lbnQuXHJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gICAgICBjdHggICBDb250ZXh0IHsgYnVpbGRlciwgc2FuaXQsIGNvbnRleHQ6ICdkcm9wJyB8ICdsb2FkJyB8ICdwcmV2aWV3JyB9XHJcblx0XHQgKiBAcmV0dXJucyB7dm9pZH1cclxuXHRcdCAqL1xyXG5cdFx0c3RhdGljIG9uX2ZpZWxkX2Ryb3AoZGF0YSwgZWwsIGN0eCkge1xyXG5cdFx0XHRzdXBlci5vbl9maWVsZF9kcm9wPy4oIGRhdGEsIGVsLCBjdHggKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHRyeSB7XHJcblx0XHRyZWdpc3RyeS5yZWdpc3RlciggJ3RleHRhcmVhJywgV1BCQ19CRkJfRmllbGRfVGV4dGFyZWEgKTtcclxuXHR9IGNhdGNoICggZSApIHtcclxuXHRcdF93cGJjPy5kZXY/LmVycm9yPy4oICdXUEJDX0JGQl9GaWVsZF9UZXh0YXJlYS5yZWdpc3RlcicsIGUgKTtcclxuXHR9XHJcblxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8vIEV4cG9ydCBmb3IgXCJCb29raW5nIEZvcm1cIiAoQWR2YW5jZWQgRm9ybSBzaG9ydGNvZGUpXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvKipcclxuXHQgKiBCb29raW5nIEZvcm0gZXhwb3J0ZXIgY2FsbGJhY2sgZm9yIFwidGV4dGFyZWFcIi5cclxuXHQgKlxyXG5cdCAqIFByb2R1Y2VzIHNob3J0Y29kZXMgZXF1aXZhbGVudCB0byB0aGUgbGVnYWN5IGV4cG9ydGVyOlxyXG5cdCAqICAgW3RleHRhcmVhKiB5b3VyLW5hbWUgNDB4NCBpZDp5b3VyLW5hbWUgY2xhc3M6eW91ci1jbGFzcyBcIkRlZmF1bHQgdGV4dFwiXVxyXG5cdCAqXHJcblx0ICogTGFiZWxzIGFuZCBoZWxwIHRleHQgYXJlIGhhbmRsZWQgaW4gdGhlIHNhbWUgY2VudHJhbGl6ZWQgd2F5IGFzIG90aGVyIHBhY2tzLlxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHJlZ2lzdGVyX3RleHRhcmVhX2Jvb2tpbmdfZm9ybV9leHBvcnRlcigpIHtcclxuXHJcblx0XHR2YXIgRXhwID0gdy5XUEJDX0JGQl9FeHBvcnRlcjtcclxuXHRcdGlmICggISBFeHAgfHwgdHlwZW9mIEV4cC5yZWdpc3RlciAhPT0gJ2Z1bmN0aW9uJyApIHsgcmV0dXJuOyB9XHJcblx0XHRpZiAoIHR5cGVvZiBFeHAuaGFzX2V4cG9ydGVyID09PSAnZnVuY3Rpb24nICYmIEV4cC5oYXNfZXhwb3J0ZXIoICd0ZXh0YXJlYScgKSApIHsgcmV0dXJuOyB9XHJcblxyXG5cdFx0dmFyIFMgPSBDb3JlLldQQkNfQkZCX1Nhbml0aXplIHx8IHt9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQHR5cGUge1dQQkNfQkZCX0V4cG9ydGVyQ2FsbGJhY2t9XHJcblx0XHQgKi9cclxuXHRcdEV4cC5yZWdpc3RlciggJ3RleHRhcmVhJywgZnVuY3Rpb24oIGZpZWxkLCBlbWl0LCBleHRyYXMgKSB7XHJcblx0XHRcdGV4dHJhcyA9IGV4dHJhcyB8fCB7fTtcclxuXHJcblx0XHRcdHZhciBjZmcgICAgICAgPSBleHRyYXMuY2ZnIHx8IHt9O1xyXG5cdFx0XHR2YXIgY3R4ICAgICAgID0gZXh0cmFzLmN0eDtcclxuXHRcdFx0dmFyIGFkZExhYmVscyA9IGNmZy5hZGRMYWJlbHMgIT09IGZhbHNlO1xyXG5cclxuXHRcdFx0Ly8gUmVxdWlyZWQgbWFya2VyIChzYW1lIHNlbWFudGljcyBhcyB0ZXh0IGZpZWxkKS5cclxuXHRcdFx0dmFyIGlzX3JlcSAgID0gRXhwLmlzX3JlcXVpcmVkKCBmaWVsZCApO1xyXG5cdFx0XHR2YXIgcmVxX21hcmsgPSBpc19yZXEgPyAnKicgOiAnJztcclxuXHJcblx0XHRcdC8vIFNoYXJlZCBoZWxwZXJzIGtlZXAgbmFtaW5nIC8gaWQgLyBjbGFzc2VzIGNvbnNpc3RlbnQgYWNyb3NzIHBhY2tzLlxyXG5cdFx0XHR2YXIgbmFtZSAgICAgPSBFeHAuY29tcHV0ZV9uYW1lKCAndGV4dGFyZWEnLCBmaWVsZCApO1xyXG5cdFx0XHR2YXIgaWRfb3B0ICAgPSBFeHAuaWRfb3B0aW9uKCBmaWVsZCwgY3R4ICk7XHJcblx0XHRcdHZhciBjbHNfb3B0cyA9IEV4cC5jbGFzc19vcHRpb25zKCBmaWVsZCApO1xyXG5cdFx0XHR2YXIgcGhfYXR0ciAgPSBFeHAucGhfYXR0ciggZmllbGQgJiYgZmllbGQucGxhY2Vob2xkZXIgKTtcclxuXHRcdFx0dmFyIGRlZl90ZXh0ID0gRXhwLmRlZmF1bHRfdGV4dF9zdWZmaXgoIGZpZWxkICk7XHJcblxyXG5cdFx0XHQvLyBSb3dzIHRva2VuOiBbdGV4dGFyZWEgbmFtZSB4NV0g4oCUIHJvd3MgY29tZSBmcm9tIHNjaGVtYS9JbnNwZWN0b3IgKGBmaWVsZC5yb3dzYCkuXHJcblx0XHRcdC8vIENsYW1wIGludG8gWzEsNTBdIHRvIG1pcnJvciBJbnNwZWN0b3IgY29uc3RyYWludHMuXHJcblx0XHRcdHZhciByb3dzX3Rva2VuID0gJyc7XHJcblx0XHRcdGlmICggZmllbGQgJiYgZmllbGQucm93cyAhPSBudWxsICYmIGZpZWxkLnJvd3MgIT09ICcnICkge1xyXG5cdFx0XHRcdHZhciByID0gTnVtYmVyKCBmaWVsZC5yb3dzICk7XHJcblx0XHRcdFx0aWYgKCAhIE51bWJlci5pc0Zpbml0ZSggciApICkge1xyXG5cdFx0XHRcdFx0ciA9IDQ7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmICggciA8IDEgKSAgeyByID0gMTsgfVxyXG5cdFx0XHRcdGlmICggciA+IDUwICkgeyByID0gNTA7IH1cclxuXHRcdFx0XHRyb3dzX3Rva2VuID0gJyB4JyArIFN0cmluZyggciApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBGaW5hbCBzaG9ydGNvZGUgYm9keSAocm93cy1vbmx5IHNpemluZzsgbm8gY29sdW1ucyksIGUuZy46XHJcblx0XHRcdC8vICAgW3RleHRhcmVhKiB5b3VyLW1lc3NhZ2UgeDUgaWQ6eW91ci1tZXNzYWdlIGNsYXNzOi4uLiBcIkRlZmF1bHQgdGV4dFwiXVxyXG5cdFx0XHR2YXIgYm9keSA9ICdbdGV4dGFyZWEnICsgcmVxX21hcmsgKyAnICcgKyBuYW1lICsgcm93c190b2tlbiArIGlkX29wdCArIGNsc19vcHRzICsgcGhfYXR0ciArIGRlZl90ZXh0ICsgJ10nO1xyXG5cclxuXHRcdFx0Ly8gTGFiZWwgYmVoYXZpb3IgbWlycm9ycyBsZWdhY3kgZW1pdF9sYWJlbF90aGVuKCkuXHJcblx0XHRcdHZhciByYXdfbGFiZWwgPSAoIGZpZWxkICYmIHR5cGVvZiBmaWVsZC5sYWJlbCA9PT0gJ3N0cmluZycgKSA/IGZpZWxkLmxhYmVsIDogJyc7XHJcblx0XHRcdHZhciBsYWJlbCAgICAgPSByYXdfbGFiZWwudHJpbSgpO1xyXG5cclxuXHRcdFx0aWYgKCBsYWJlbCAmJiBhZGRMYWJlbHMgKSB7XHJcblx0XHRcdFx0ZW1pdCggJzxsPicgKyAoUy5lc2NhcGVfaHRtbCA/IFMuZXNjYXBlX2h0bWwoIGxhYmVsICkgOiBsYWJlbCkgKyByZXFfbWFyayArICAnPC9sPicgKTtcclxuXHRcdFx0XHRlbWl0KCAnPGJyPicgKyBib2R5ICk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0ZW1pdCggYm9keSApO1xyXG5cdFx0XHR9XHJcblx0XHRcdC8vIEhlbHAgdGV4dCBpcyBhcHBlbmRlZCBjZW50cmFsbHkgYnkgV1BCQ19CRkJfRXhwb3J0ZXIucmVuZGVyX2ZpZWxkX25vZGUoKS5cclxuXHRcdH0gKTtcclxuXHR9XHJcblxyXG5cdGlmICggdy5XUEJDX0JGQl9FeHBvcnRlciAmJiB0eXBlb2Ygdy5XUEJDX0JGQl9FeHBvcnRlci5yZWdpc3RlciA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHRcdHJlZ2lzdGVyX3RleHRhcmVhX2Jvb2tpbmdfZm9ybV9leHBvcnRlcigpO1xyXG5cdH0gZWxzZSBpZiAoIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgKSB7XHJcblx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnd3BiYzpiZmI6ZXhwb3J0ZXItcmVhZHknLCByZWdpc3Rlcl90ZXh0YXJlYV9ib29raW5nX2Zvcm1fZXhwb3J0ZXIsIHsgb25jZTogdHJ1ZSB9ICk7XHJcblx0fVxyXG5cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvLyBFeHBvcnQgZm9yIFwiQm9va2luZyBEYXRhXCIgKENvbnRlbnQgb2YgYm9va2luZyBmaWVsZHMgZGF0YSlcclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8qKlxyXG5cdCAqIEJvb2tpbmcgRGF0YSBleHBvcnRlciAoXCJDb250ZW50IG9mIGJvb2tpbmcgZmllbGRzIGRhdGFcIikgZm9yIFwidGV4dGFyZWFcIi5cclxuXHQgKlxyXG5cdCAqIERlZmF1bHQgbGluZSBmb3JtYXQ6XHJcblx0ICogICA8Yj5MYWJlbDwvYj46IDxmPltmaWVsZF9uYW1lXTwvZj48YnI+XHJcblx0ICovXHJcblx0ZnVuY3Rpb24gcmVnaXN0ZXJfdGV4dGFyZWFfYm9va2luZ19kYXRhX2V4cG9ydGVyKCkge1xyXG5cclxuXHRcdHZhciBDID0gdy5XUEJDX0JGQl9Db250ZW50RXhwb3J0ZXI7XHJcblx0XHRpZiAoICEgQyB8fCB0eXBlb2YgQy5yZWdpc3RlciAhPT0gJ2Z1bmN0aW9uJyApIHsgcmV0dXJuOyB9XHJcblx0XHRpZiAoIHR5cGVvZiBDLmhhc19leHBvcnRlciA9PT0gJ2Z1bmN0aW9uJyAmJiBDLmhhc19leHBvcnRlciggJ3RleHRhcmVhJyApICkgeyByZXR1cm47IH1cclxuXHJcblx0XHRDLnJlZ2lzdGVyKCAndGV4dGFyZWEnLCBmdW5jdGlvbiggZmllbGQsIGVtaXQsIGV4dHJhcyApIHtcclxuXHRcdFx0ZXh0cmFzID0gZXh0cmFzIHx8IHt9O1xyXG5cdFx0XHR2YXIgY2ZnID0gZXh0cmFzLmNmZyB8fCB7fTtcclxuXHJcblx0XHRcdHZhciBFeHAgPSB3LldQQkNfQkZCX0V4cG9ydGVyO1xyXG5cdFx0XHRpZiAoICEgRXhwIHx8IHR5cGVvZiBFeHAuY29tcHV0ZV9uYW1lICE9PSAnZnVuY3Rpb24nICkgeyByZXR1cm47IH1cclxuXHJcblx0XHRcdHZhciBuYW1lID0gRXhwLmNvbXB1dGVfbmFtZSggJ3RleHRhcmVhJywgZmllbGQgKTtcclxuXHRcdFx0aWYgKCAhIG5hbWUgKSB7IHJldHVybjsgfVxyXG5cclxuXHRcdFx0dmFyIGxhYmVsID0gKCBmaWVsZCAmJiB0eXBlb2YgZmllbGQubGFiZWwgPT09ICdzdHJpbmcnICYmIGZpZWxkLmxhYmVsLnRyaW0oKSApID8gZmllbGQubGFiZWwudHJpbSgpIDogbmFtZTtcclxuXHJcblx0XHRcdC8vIFNoYXJlZCBoZWxwZXIga2VlcHMgZm9ybWF0dGluZyBjb25zaXN0ZW50IGFjcm9zcyBhbGwgcGFja3MuXHJcblx0XHRcdEMuZW1pdF9saW5lX2JvbGRfZmllbGQoIGVtaXQsIGxhYmVsLCBuYW1lLCBjZmcgKTtcclxuXHRcdH0gKTtcclxuXHR9XHJcblxyXG5cdGlmICggdy5XUEJDX0JGQl9Db250ZW50RXhwb3J0ZXIgJiYgdHlwZW9mIHcuV1BCQ19CRkJfQ29udGVudEV4cG9ydGVyLnJlZ2lzdGVyID09PSAnZnVuY3Rpb24nICkge1xyXG5cdFx0cmVnaXN0ZXJfdGV4dGFyZWFfYm9va2luZ19kYXRhX2V4cG9ydGVyKCk7XHJcblx0fSBlbHNlIGlmICggdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyApIHtcclxuXHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICd3cGJjOmJmYjpjb250ZW50LWV4cG9ydGVyLXJlYWR5JywgcmVnaXN0ZXJfdGV4dGFyZWFfYm9va2luZ19kYXRhX2V4cG9ydGVyLCB7IG9uY2U6IHRydWUgfSApO1xyXG5cdH1cclxuXHJcbn0pKCB3aW5kb3cgKTtcclxuIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsVUFBVUEsQ0FBQyxFQUFFO0VBQ2IsWUFBWTs7RUFFWixJQUFJQyxJQUFJLEdBQU9ELENBQUMsQ0FBQ0UsYUFBYSxJQUFJLENBQUMsQ0FBQztFQUNwQyxJQUFJQyxRQUFRLEdBQUdGLElBQUksQ0FBQ0csZ0NBQWdDO0VBQ3BELElBQUlDLElBQUksR0FBT0osSUFBSSxDQUFDSyxtQkFBbUI7RUFFdkMsSUFBSyxDQUFFSCxRQUFRLElBQUksT0FBT0EsUUFBUSxDQUFDSSxRQUFRLEtBQUssVUFBVSxJQUFJLENBQUVGLElBQUksRUFBRztJQUN0RUcsS0FBSyxFQUFFQyxHQUFHLEVBQUVDLEtBQUssR0FBSSx5QkFBeUIsRUFBRSw0QkFBNkIsQ0FBQztJQUM5RTtFQUNEOztFQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNDLE1BQU1DLHVCQUF1QixTQUFTTixJQUFJLENBQUM7SUFFMUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0UsT0FBT08sWUFBWUEsQ0FBQSxFQUFHO01BQ3JCLE9BQU87UUFDTkMsSUFBSSxFQUFXLFVBQVU7UUFDekJDLEtBQUssRUFBVSxVQUFVO1FBQ3pCQyxJQUFJLEVBQVcsRUFBRTtRQUNqQkMsT0FBTyxFQUFRLEVBQUU7UUFDakJDLFdBQVcsRUFBSSxFQUFFO1FBQ2pCQyxRQUFRLEVBQU8sS0FBSztRQUNwQkMsU0FBUyxFQUFNLElBQUk7UUFDbkJDLFNBQVMsRUFBTSxJQUFJO1FBQ25CQyxJQUFJLEVBQVcsQ0FBQztRQUNoQkMsUUFBUSxFQUFPLEVBQUU7UUFDakJDLElBQUksRUFBVyxFQUFFO1FBQ2pCQyxhQUFhLEVBQUUsRUFBRTtRQUNqQkMsU0FBUyxFQUFNO01BQ2hCLENBQUM7SUFDRjs7SUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNFLE9BQU9DLE1BQU1BLENBQUNDLEVBQUUsRUFBRUMsSUFBSSxFQUFFQyxHQUFHLEVBQUU7TUFDNUIsSUFBSyxDQUFFRixFQUFFLEVBQUc7UUFDWDtNQUNEOztNQUVBO01BQ0EsTUFBTUcsQ0FBQyxHQUFHLElBQUksQ0FBQ0MsY0FBYyxDQUFFSCxJQUFLLENBQUM7O01BRXJDO01BQ0EsTUFBTUksRUFBRSxHQUFRQyxDQUFDLElBQUtoQyxJQUFJLENBQUNpQyxpQkFBaUIsQ0FBQ0MsV0FBVyxDQUFFRixDQUFFLENBQUM7TUFDN0QsTUFBTUcsR0FBRyxHQUFPSCxDQUFDLElBQUtoQyxJQUFJLENBQUNpQyxpQkFBaUIsQ0FBQ0csZ0JBQWdCLENBQUVKLENBQUUsQ0FBQztNQUNsRSxNQUFNSyxLQUFLLEdBQUtMLENBQUMsSUFBS2hDLElBQUksQ0FBQ2lDLGlCQUFpQixDQUFDSyxrQkFBa0IsQ0FBRU4sQ0FBRSxDQUFDO01BQ3BFLE1BQU1PLE1BQU0sR0FBSVAsQ0FBQyxJQUFLaEMsSUFBSSxDQUFDaUMsaUJBQWlCLENBQUNPLHNCQUFzQixDQUFFUixDQUFFLENBQUM7TUFDeEUsTUFBTVMsTUFBTSxHQUFJVCxDQUFDLElBQUtoQyxJQUFJLENBQUNpQyxpQkFBaUIsQ0FBQ1MsU0FBUyxDQUFFVixDQUFFLENBQUM7O01BRTNEO01BQ0EsTUFBTWpCLE9BQU8sR0FBSWMsQ0FBQyxDQUFDZCxPQUFPLEdBQUdvQixHQUFHLENBQUVRLE1BQU0sQ0FBRWQsQ0FBQyxDQUFDZCxPQUFRLENBQUUsQ0FBQyxHQUFHLEVBQUU7TUFDNUQsTUFBTTZCLFFBQVEsR0FBR1AsS0FBSyxDQUFFTSxNQUFNLENBQUVkLENBQUMsQ0FBQ2YsSUFBSSxJQUFJZSxDQUFDLENBQUNnQixFQUFFLElBQUksT0FBUSxDQUFFLENBQUM7TUFDN0QsTUFBTUMsUUFBUSxHQUFHUCxNQUFNLENBQUVJLE1BQU0sQ0FBRWQsQ0FBQyxDQUFDUixRQUFRLElBQUksRUFBRyxDQUFFLENBQUM7O01BRXJEO01BQ0EsSUFBSyxVQUFVLElBQUlRLENBQUMsSUFBSUgsRUFBRSxDQUFDcUIsT0FBTyxDQUFDMUIsUUFBUSxLQUFLeUIsUUFBUSxFQUFHO1FBQzFEcEIsRUFBRSxDQUFDcUIsT0FBTyxDQUFDMUIsUUFBUSxHQUFHeUIsUUFBUTtNQUMvQjtNQUNBLElBQUssU0FBUyxJQUFJakIsQ0FBQyxJQUFJSCxFQUFFLENBQUNxQixPQUFPLENBQUNoQyxPQUFPLEtBQUtBLE9BQU8sRUFBRztRQUN2RFcsRUFBRSxDQUFDcUIsT0FBTyxDQUFDaEMsT0FBTyxHQUFHQSxPQUFPO01BQzdCO01BQ0E7TUFDQSxJQUFLYyxDQUFDLENBQUNMLFNBQVMsRUFBRztRQUNsQkUsRUFBRSxDQUFDcUIsT0FBTyxDQUFDdkIsU0FBUyxHQUFHbUIsTUFBTSxDQUFFZCxDQUFDLENBQUNMLFNBQVUsQ0FBQztRQUM1Q0UsRUFBRSxDQUFDc0IsS0FBSyxDQUFDQyxXQUFXLENBQUUsZ0JBQWdCLEVBQUVOLE1BQU0sQ0FBRWQsQ0FBQyxDQUFDTCxTQUFVLENBQUUsQ0FBQztNQUNoRTs7TUFFQTtNQUNBLE1BQU0wQixXQUFXLEdBQUtULE1BQU0sQ0FBRVosQ0FBQyxDQUFDWixRQUFTLENBQUM7TUFDMUMsTUFBTWtDLGFBQWEsR0FBSXRCLENBQUMsQ0FBQ1gsU0FBUyxJQUFJLElBQUksSUFBSVcsQ0FBQyxDQUFDWCxTQUFTLEtBQUssRUFBRSxJQUFJa0MsTUFBTSxDQUFDQyxRQUFRLENBQUUsQ0FBQ3hCLENBQUMsQ0FBQ1gsU0FBVSxDQUFFO01BQ3BHLE1BQU1vQyxhQUFhLEdBQUl6QixDQUFDLENBQUNWLFNBQVMsSUFBSSxJQUFJLElBQUlVLENBQUMsQ0FBQ1YsU0FBUyxLQUFLLEVBQUUsSUFBSWlDLE1BQU0sQ0FBQ0MsUUFBUSxDQUFFLENBQUN4QixDQUFDLENBQUNWLFNBQVUsQ0FBRTtNQUNwRyxNQUFNb0MsUUFBUSxHQUFTMUIsQ0FBQyxDQUFDVCxJQUFJLElBQUksSUFBSSxJQUFJZ0MsTUFBTSxDQUFDQyxRQUFRLENBQUUsQ0FBQ3hCLENBQUMsQ0FBQ1QsSUFBSyxDQUFDLElBQUksQ0FBQ1MsQ0FBQyxDQUFDVCxJQUFJLEdBQUcsQ0FBQyxHQUMvRW9DLElBQUksQ0FBQ0MsR0FBRyxDQUFFLENBQUMsRUFBRUQsSUFBSSxDQUFDRSxHQUFHLENBQUUsRUFBRSxFQUFFLENBQUM3QixDQUFDLENBQUNULElBQUssQ0FBRSxDQUFDLEdBQ3RDLENBQUM7TUFFSixNQUFNdUMsYUFBYSxHQUFHUixhQUFhLEdBQUdDLE1BQU0sQ0FBRXZCLENBQUMsQ0FBQ1gsU0FBVSxDQUFDLEdBQUcsSUFBSTtNQUNsRSxNQUFNMEMsYUFBYSxHQUFHTixhQUFhLEdBQUdGLE1BQU0sQ0FBRXZCLENBQUMsQ0FBQ1YsU0FBVSxDQUFDLEdBQUcsSUFBSTs7TUFFbEU7TUFDQSxNQUFNMEMsT0FBTyxHQUFVOUMsT0FBTyxHQUFHLFFBQVFnQixFQUFFLENBQUVoQixPQUFRLENBQUMsR0FBRyxHQUFHLEVBQUU7TUFDOUQsTUFBTStDLFNBQVMsR0FBUSxVQUFVL0IsRUFBRSxDQUFFYSxRQUFTLENBQUMsR0FBRztNQUNsRDtNQUNBLE1BQU1tQixRQUFRLEdBQVMsNkRBQTZEakIsUUFBUSxHQUFHLEdBQUcsR0FBR2YsRUFBRSxDQUFFZSxRQUFTLENBQUMsR0FBRyxFQUFFLEdBQUc7TUFDM0gsTUFBTWtCLE9BQU8sR0FBVW5DLENBQUMsQ0FBQ2IsV0FBVyxHQUFHLGlCQUFpQmUsRUFBRSxDQUFFRixDQUFDLENBQUNiLFdBQVksQ0FBQyxHQUFHLEdBQUcsRUFBRTtNQUNuRixNQUFNaUQsUUFBUSxHQUFTZixXQUFXLEdBQUcsZ0NBQWdDLEdBQUcsRUFBRTtNQUMxRSxNQUFNZ0IsY0FBYyxHQUFHZixhQUFhLEdBQUcsZUFBZVEsYUFBYSxHQUFHLEdBQUcsRUFBRTtNQUMzRSxNQUFNUSxjQUFjLEdBQUdiLGFBQWEsR0FBRyxlQUFlTSxhQUFhLEdBQUcsR0FBRyxFQUFFO01BQzNFLE1BQU1RLFNBQVMsR0FBUSxVQUFVYixRQUFRLEdBQUc7TUFFNUMsTUFBTWMsVUFBVSxHQUFJeEMsQ0FBQyxDQUFDaEIsS0FBSyxJQUFJLElBQUksSUFBSWdCLENBQUMsQ0FBQ2hCLEtBQUssS0FBSyxFQUFFLEdBQ2xELHVDQUF1Q0UsT0FBTyxHQUFHLFNBQVNnQixFQUFFLENBQUVoQixPQUFRLENBQUMsR0FBRyxHQUFHLEVBQUUsSUFBSWdCLEVBQUUsQ0FBRUYsQ0FBQyxDQUFDaEIsS0FBTSxDQUFDLEdBQUdxQyxXQUFXLEdBQUcsbUNBQW1DLEdBQUcsRUFBRSxVQUFVLEdBQ25LLEVBQUU7TUFFTCxNQUFNb0IsU0FBUyxHQUFNekMsQ0FBQyxDQUFDUCxJQUFJLEdBQUcsK0JBQStCUyxFQUFFLENBQUVGLENBQUMsQ0FBQ1AsSUFBSyxDQUFDLFFBQVEsR0FBRyxFQUFFO01BQ3RGLE1BQU1pRCxZQUFZLEdBQUkxQyxDQUFDLENBQUNOLGFBQWEsSUFBSSxJQUFJLElBQUlNLENBQUMsQ0FBQ04sYUFBYSxLQUFLLEVBQUUsR0FBSVEsRUFBRSxDQUFFWSxNQUFNLENBQUVkLENBQUMsQ0FBQ04sYUFBYyxDQUFFLENBQUMsR0FBRyxFQUFFO01BRS9HRyxFQUFFLENBQUM4QyxTQUFTLEdBQUc7QUFDbEI7QUFDQSxPQUFPSCxVQUFVO0FBQ2pCO0FBQ0EsaUJBQWlCTixRQUFRLEdBQUdDLE9BQU8sR0FBR0YsU0FBUyxzQ0FBc0NELE9BQU8sR0FBR08sU0FBUyxHQUFHSCxRQUFRLEdBQUdDLGNBQWMsR0FBR0MsY0FBYyxJQUFJSSxZQUFZO0FBQ3JLO0FBQ0EsT0FBT0QsU0FBUztBQUNoQjtBQUNBLElBQUk7O01BRUQ7TUFDQXRFLElBQUksQ0FBQ3lFLEVBQUUsRUFBRUMsZ0JBQWdCLEVBQUVDLE1BQU0sR0FBSS9DLEdBQUcsRUFBRWdELE9BQU8sRUFBRWxELEVBQUcsQ0FBQztJQUN4RDs7SUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0UsT0FBT21ELGFBQWFBLENBQUNsRCxJQUFJLEVBQUVELEVBQUUsRUFBRUUsR0FBRyxFQUFFO01BQ25DLEtBQUssQ0FBQ2lELGFBQWEsR0FBSWxELElBQUksRUFBRUQsRUFBRSxFQUFFRSxHQUFJLENBQUM7SUFDdkM7RUFDRDtFQUVBLElBQUk7SUFDSDFCLFFBQVEsQ0FBQ0ksUUFBUSxDQUFFLFVBQVUsRUFBRUksdUJBQXdCLENBQUM7RUFDekQsQ0FBQyxDQUFDLE9BQVFvRSxDQUFDLEVBQUc7SUFDYnZFLEtBQUssRUFBRUMsR0FBRyxFQUFFQyxLQUFLLEdBQUksa0NBQWtDLEVBQUVxRSxDQUFFLENBQUM7RUFDN0Q7O0VBR0E7RUFDQTtFQUNBO0VBQ0E7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNDLFNBQVNDLHVDQUF1Q0EsQ0FBQSxFQUFHO0lBRWxELElBQUlDLEdBQUcsR0FBR2pGLENBQUMsQ0FBQ2tGLGlCQUFpQjtJQUM3QixJQUFLLENBQUVELEdBQUcsSUFBSSxPQUFPQSxHQUFHLENBQUMxRSxRQUFRLEtBQUssVUFBVSxFQUFHO01BQUU7SUFBUTtJQUM3RCxJQUFLLE9BQU8wRSxHQUFHLENBQUNFLFlBQVksS0FBSyxVQUFVLElBQUlGLEdBQUcsQ0FBQ0UsWUFBWSxDQUFFLFVBQVcsQ0FBQyxFQUFHO01BQUU7SUFBUTtJQUUxRixJQUFJQyxDQUFDLEdBQUduRixJQUFJLENBQUNpQyxpQkFBaUIsSUFBSSxDQUFDLENBQUM7O0lBRXBDO0FBQ0Y7QUFDQTtJQUNFK0MsR0FBRyxDQUFDMUUsUUFBUSxDQUFFLFVBQVUsRUFBRSxVQUFVOEUsS0FBSyxFQUFFQyxJQUFJLEVBQUVDLE1BQU0sRUFBRztNQUN6REEsTUFBTSxHQUFHQSxNQUFNLElBQUksQ0FBQyxDQUFDO01BRXJCLElBQUlDLEdBQUcsR0FBU0QsTUFBTSxDQUFDQyxHQUFHLElBQUksQ0FBQyxDQUFDO01BQ2hDLElBQUkzRCxHQUFHLEdBQVMwRCxNQUFNLENBQUMxRCxHQUFHO01BQzFCLElBQUk0RCxTQUFTLEdBQUdELEdBQUcsQ0FBQ0MsU0FBUyxLQUFLLEtBQUs7O01BRXZDO01BQ0EsSUFBSUMsTUFBTSxHQUFLVCxHQUFHLENBQUM5QixXQUFXLENBQUVrQyxLQUFNLENBQUM7TUFDdkMsSUFBSU0sUUFBUSxHQUFHRCxNQUFNLEdBQUcsR0FBRyxHQUFHLEVBQUU7O01BRWhDO01BQ0EsSUFBSTNFLElBQUksR0FBT2tFLEdBQUcsQ0FBQ1csWUFBWSxDQUFFLFVBQVUsRUFBRVAsS0FBTSxDQUFDO01BQ3BELElBQUlRLE1BQU0sR0FBS1osR0FBRyxDQUFDYSxTQUFTLENBQUVULEtBQUssRUFBRXhELEdBQUksQ0FBQztNQUMxQyxJQUFJa0UsUUFBUSxHQUFHZCxHQUFHLENBQUNlLGFBQWEsQ0FBRVgsS0FBTSxDQUFDO01BQ3pDLElBQUlwQixPQUFPLEdBQUlnQixHQUFHLENBQUNoQixPQUFPLENBQUVvQixLQUFLLElBQUlBLEtBQUssQ0FBQ3BFLFdBQVksQ0FBQztNQUN4RCxJQUFJZ0YsUUFBUSxHQUFHaEIsR0FBRyxDQUFDaUIsbUJBQW1CLENBQUViLEtBQU0sQ0FBQzs7TUFFL0M7TUFDQTtNQUNBLElBQUljLFVBQVUsR0FBRyxFQUFFO01BQ25CLElBQUtkLEtBQUssSUFBSUEsS0FBSyxDQUFDaEUsSUFBSSxJQUFJLElBQUksSUFBSWdFLEtBQUssQ0FBQ2hFLElBQUksS0FBSyxFQUFFLEVBQUc7UUFDdkQsSUFBSStFLENBQUMsR0FBRy9DLE1BQU0sQ0FBRWdDLEtBQUssQ0FBQ2hFLElBQUssQ0FBQztRQUM1QixJQUFLLENBQUVnQyxNQUFNLENBQUNDLFFBQVEsQ0FBRThDLENBQUUsQ0FBQyxFQUFHO1VBQzdCQSxDQUFDLEdBQUcsQ0FBQztRQUNOO1FBQ0EsSUFBS0EsQ0FBQyxHQUFHLENBQUMsRUFBSTtVQUFFQSxDQUFDLEdBQUcsQ0FBQztRQUFFO1FBQ3ZCLElBQUtBLENBQUMsR0FBRyxFQUFFLEVBQUc7VUFBRUEsQ0FBQyxHQUFHLEVBQUU7UUFBRTtRQUN4QkQsVUFBVSxHQUFHLElBQUksR0FBR3ZELE1BQU0sQ0FBRXdELENBQUUsQ0FBQztNQUNoQzs7TUFFQTtNQUNBO01BQ0EsSUFBSUMsSUFBSSxHQUFHLFdBQVcsR0FBR1YsUUFBUSxHQUFHLEdBQUcsR0FBRzVFLElBQUksR0FBR29GLFVBQVUsR0FBR04sTUFBTSxHQUFHRSxRQUFRLEdBQUc5QixPQUFPLEdBQUdnQyxRQUFRLEdBQUcsR0FBRzs7TUFFMUc7TUFDQSxJQUFJSyxTQUFTLEdBQUtqQixLQUFLLElBQUksT0FBT0EsS0FBSyxDQUFDdkUsS0FBSyxLQUFLLFFBQVEsR0FBS3VFLEtBQUssQ0FBQ3ZFLEtBQUssR0FBRyxFQUFFO01BQy9FLElBQUlBLEtBQUssR0FBT3dGLFNBQVMsQ0FBQ0MsSUFBSSxDQUFDLENBQUM7TUFFaEMsSUFBS3pGLEtBQUssSUFBSTJFLFNBQVMsRUFBRztRQUN6QkgsSUFBSSxDQUFFLEtBQUssSUFBSUYsQ0FBQyxDQUFDakQsV0FBVyxHQUFHaUQsQ0FBQyxDQUFDakQsV0FBVyxDQUFFckIsS0FBTSxDQUFDLEdBQUdBLEtBQUssQ0FBQyxHQUFHNkUsUUFBUSxHQUFJLE1BQU8sQ0FBQztRQUNyRkwsSUFBSSxDQUFFLE1BQU0sR0FBR2UsSUFBSyxDQUFDO01BQ3RCLENBQUMsTUFBTTtRQUNOZixJQUFJLENBQUVlLElBQUssQ0FBQztNQUNiO01BQ0E7SUFDRCxDQUFFLENBQUM7RUFDSjtFQUVBLElBQUtyRyxDQUFDLENBQUNrRixpQkFBaUIsSUFBSSxPQUFPbEYsQ0FBQyxDQUFDa0YsaUJBQWlCLENBQUMzRSxRQUFRLEtBQUssVUFBVSxFQUFHO0lBQ2hGeUUsdUNBQXVDLENBQUMsQ0FBQztFQUMxQyxDQUFDLE1BQU0sSUFBSyxPQUFPd0IsUUFBUSxLQUFLLFdBQVcsRUFBRztJQUM3Q0EsUUFBUSxDQUFDQyxnQkFBZ0IsQ0FBRSx5QkFBeUIsRUFBRXpCLHVDQUF1QyxFQUFFO01BQUUwQixJQUFJLEVBQUU7SUFBSyxDQUFFLENBQUM7RUFDaEg7O0VBR0E7RUFDQTtFQUNBO0VBQ0E7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0MsU0FBU0MsdUNBQXVDQSxDQUFBLEVBQUc7SUFFbEQsSUFBSUMsQ0FBQyxHQUFHNUcsQ0FBQyxDQUFDNkcsd0JBQXdCO0lBQ2xDLElBQUssQ0FBRUQsQ0FBQyxJQUFJLE9BQU9BLENBQUMsQ0FBQ3JHLFFBQVEsS0FBSyxVQUFVLEVBQUc7TUFBRTtJQUFRO0lBQ3pELElBQUssT0FBT3FHLENBQUMsQ0FBQ3pCLFlBQVksS0FBSyxVQUFVLElBQUl5QixDQUFDLENBQUN6QixZQUFZLENBQUUsVUFBVyxDQUFDLEVBQUc7TUFBRTtJQUFRO0lBRXRGeUIsQ0FBQyxDQUFDckcsUUFBUSxDQUFFLFVBQVUsRUFBRSxVQUFVOEUsS0FBSyxFQUFFQyxJQUFJLEVBQUVDLE1BQU0sRUFBRztNQUN2REEsTUFBTSxHQUFHQSxNQUFNLElBQUksQ0FBQyxDQUFDO01BQ3JCLElBQUlDLEdBQUcsR0FBR0QsTUFBTSxDQUFDQyxHQUFHLElBQUksQ0FBQyxDQUFDO01BRTFCLElBQUlQLEdBQUcsR0FBR2pGLENBQUMsQ0FBQ2tGLGlCQUFpQjtNQUM3QixJQUFLLENBQUVELEdBQUcsSUFBSSxPQUFPQSxHQUFHLENBQUNXLFlBQVksS0FBSyxVQUFVLEVBQUc7UUFBRTtNQUFRO01BRWpFLElBQUk3RSxJQUFJLEdBQUdrRSxHQUFHLENBQUNXLFlBQVksQ0FBRSxVQUFVLEVBQUVQLEtBQU0sQ0FBQztNQUNoRCxJQUFLLENBQUV0RSxJQUFJLEVBQUc7UUFBRTtNQUFRO01BRXhCLElBQUlELEtBQUssR0FBS3VFLEtBQUssSUFBSSxPQUFPQSxLQUFLLENBQUN2RSxLQUFLLEtBQUssUUFBUSxJQUFJdUUsS0FBSyxDQUFDdkUsS0FBSyxDQUFDeUYsSUFBSSxDQUFDLENBQUMsR0FBS2xCLEtBQUssQ0FBQ3ZFLEtBQUssQ0FBQ3lGLElBQUksQ0FBQyxDQUFDLEdBQUd4RixJQUFJOztNQUUxRztNQUNBNkYsQ0FBQyxDQUFDRSxvQkFBb0IsQ0FBRXhCLElBQUksRUFBRXhFLEtBQUssRUFBRUMsSUFBSSxFQUFFeUUsR0FBSSxDQUFDO0lBQ2pELENBQUUsQ0FBQztFQUNKO0VBRUEsSUFBS3hGLENBQUMsQ0FBQzZHLHdCQUF3QixJQUFJLE9BQU83RyxDQUFDLENBQUM2Ryx3QkFBd0IsQ0FBQ3RHLFFBQVEsS0FBSyxVQUFVLEVBQUc7SUFDOUZvRyx1Q0FBdUMsQ0FBQyxDQUFDO0VBQzFDLENBQUMsTUFBTSxJQUFLLE9BQU9ILFFBQVEsS0FBSyxXQUFXLEVBQUc7SUFDN0NBLFFBQVEsQ0FBQ0MsZ0JBQWdCLENBQUUsaUNBQWlDLEVBQUVFLHVDQUF1QyxFQUFFO01BQUVELElBQUksRUFBRTtJQUFLLENBQUUsQ0FBQztFQUN4SDtBQUVELENBQUMsRUFBR0ssTUFBTyxDQUFDIiwiaWdub3JlTGlzdCI6W119 |
| 275 |
|