Files
rspade_system/storage-broken/rsx-build/bundles/Login_Bundle__app.46c7d6e2.js
root 78553d4edf Fix code quality violations for publish
Remove unused blade settings pages not linked from UI
Convert remaining frontend pages to SPA actions
Convert settings user_settings and general to SPA actions
Convert settings profile pages to SPA actions
Convert contacts and projects add/edit pages to SPA actions
Convert clients add/edit page to SPA action with loading pattern
Refactor component scoped IDs from $id to $sid
Fix jqhtml comment syntax and implement universal error component system
Update all application code to use new unified error system
Remove all backwards compatibility - unified error system complete
Phase 5: Remove old response classes
Phase 3-4: Ajax response handler sends new format, old helpers deprecated
Phase 2: Add client-side unified error foundation
Phase 1: Add server-side unified error foundation
Add unified Ajax error response system with constants

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 04:35:01 +00:00

17559 lines
1.7 MiB
Executable File

/* === storage/rsx-tmp/npm_import_declarations_95a6f602c98037611b640b0b5342830b.js === */
// NPM Import Declarations for App Bundle
// Auto-generated to provide NPM modules to app bundle scope
// Cache key: 95a6f602c98037611b640b0b5342830b
const jqhtml = window._rsx_npm.jqhtml;
if (!jqhtml) {
throw new Error(
'RSX Framework Error: NPM module "jqhtml" not found.\n' +
'Expected window._rsx_npm.jqhtml to be defined by the vendor bundle.'
);
}
const _Base_Jqhtml_Component = window._rsx_npm._Base_Jqhtml_Component;
if (!_Base_Jqhtml_Component) {
throw new Error(
'RSX Framework Error: NPM module "_Base_Jqhtml_Component" not found.\n' +
'Expected window._rsx_npm._Base_Jqhtml_Component to be defined by the vendor bundle.'
);
}
// Clean up NPM container to prevent console access
delete window._rsx_npm;
/* === app/RSpade/Core/Js/decorator.js (babel) === */
"use strict";
/**
* Decorator function that marks a function as a decorator implementation.
*
* When a function has @decorator in its JSDoc comment, it whitelists that function
* to be used as a decorator on other methods throughout the codebase.
*
* The function itself performs no operation - it simply returns its input unchanged.
* Its purpose is purely as a marker for the manifest validation system.
*
* Usage:
* // /**
* // * My custom decorator implementation
* // * @decorator
* // *\/
* function my_custom_decorator(target, key, descriptor) {
* // Decorator implementation
* }
*
* This allows my_custom_decorator to be used as @my_custom_decorator on static methods.
*
* TODO: This is probably no longer necessary? maybe?
*/
function decorator(value) {
return value;
}
/* === app/RSpade/Core/Js/browser.js (babel) === */
"use strict";
/*
* Browser and DOM utility functions for the RSpade framework.
* These functions handle browser detection, viewport utilities, and DOM manipulation.
*/
// ============================================================================
// BROWSER DETECTION
// ============================================================================
/**
* Detects if user is on a mobile device or using mobile viewport
* @returns {boolean} True if mobile device or viewport < 992px
* @todo Improve user agent detection for all mobile devices
*/
function is_mobile() {
if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
return true;
} else if ($(window).width() < 992) {
// 992px = bootstrap 4 col-md-
return true;
} else {
return false;
}
}
/**
* Detects if user is on desktop (not mobile)
* @returns {boolean} True if not mobile device/viewport
*/
function is_desktop() {
return !is_mobile();
}
/**
* Detects the user's operating system
* @returns {string} OS name: 'Mac OS', 'iPhone', 'iPad', 'Windows', 'Android-Phone', 'Android-Tablet', 'Linux', or 'Unknown'
*/
function get_os() {
let user_agent = window.navigator.userAgent,
platform = window.navigator.platform,
macos_platforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'],
windows_platforms = ['Win32', 'Win64', 'Windows', 'WinCE'],
ios_platforms = ['iPhone', 'iPad', 'iPod'],
os = null;
let is_mobile_device = is_mobile();
if (macos_platforms.indexOf(platform) !== -1) {
os = 'Mac OS';
} else if (ios_platforms.indexOf(platform) !== -1 && is_mobile_device) {
os = 'iPhone';
} else if (ios_platforms.indexOf(platform) !== -1 && !is_mobile_device) {
os = 'iPad';
} else if (windows_platforms.indexOf(platform) !== -1) {
os = 'Windows';
} else if (/Android/.test(user_agent) && is_mobile_device) {
os = 'Android-Phone';
} else if (/Android/.test(user_agent) && !is_mobile_device) {
os = 'Android-Tablet';
} else if (!os && /Linux/.test(platform)) {
os = 'Linux';
} else {
os = 'Unknown';
}
return os;
}
/**
* Detects if the user agent is a web crawler/bot
* @returns {boolean} True if user agent appears to be a bot/crawler
*/
function is_crawler() {
let user_agent = navigator.userAgent;
let bot_pattern = /bot|spider|crawl|slurp|archiver|ping|search|dig|tracker|monitor|snoopy|yahoo|baidu|msn|ask|teoma|axios/i;
return bot_pattern.test(user_agent);
}
// ============================================================================
// DOM SCROLLING UTILITIES
// ============================================================================
/**
* Scrolls parent container to make target element visible if needed
* @param {string|HTMLElement|jQuery} target - Target element to scroll into view
*/
function scroll_into_view_if_needed(target) {
const $target = $(target);
// Find the closest parent with overflow-y: auto
const $parent = $target.parent();
// Calculate the absolute top position of the target
const target_top = $target.position().top + $parent.scrollTop();
const target_height = $target.outerHeight();
const parent_height = $parent.height();
const scroll_position = $parent.scrollTop();
// Check if the target is out of view
if (target_top < scroll_position || target_top + target_height > scroll_position + parent_height) {
Debugger.console_debug('UI', 'Scrolling!', target_top);
// Calculate the new scroll position to center the target
let new_scroll_position = target_top + target_height / 2 - parent_height / 2;
// Limit the scroll position between 0 and the maximum scrollable height
new_scroll_position = Math.max(0, Math.min(new_scroll_position, $parent[0].scrollHeight - parent_height));
// Scroll the parent to the new scroll position
$parent.scrollTop(new_scroll_position);
}
}
/**
* Scrolls page to make target element visible if needed (with animation)
* @param {string|HTMLElement|jQuery} target - Target element to scroll into view
*/
function scroll_page_into_view_if_needed(target) {
const $target = $(target);
// Calculate the absolute top position of the target relative to the document
const target_top = $target.offset().top;
const target_height = $target.outerHeight();
const window_height = $(window).height();
const window_scroll_position = $(window).scrollTop();
// Check if the target is out of view
if (target_top < window_scroll_position || target_top + target_height > window_scroll_position + window_height) {
Debugger.console_debug('UI', 'Scrolling!', target_top);
// Calculate the new scroll position to center the target
const new_scroll_position = target_top + target_height / 2 - window_height / 2;
// Animate the scroll to the new position
$('html, body').animate({
scrollTop: new_scroll_position
}, 1000); // duration of the scroll animation in milliseconds
}
}
// ============================================================================
// DOM UTILITIES
// ============================================================================
/**
* Waits for all images on the page to load
* @param {Function} callback - Function to call when all images are loaded
*/
function wait_for_images(callback) {
const $images = $('img'); // Get all img tags
const total_images = $images.length;
let images_loaded = 0;
if (total_images === 0) {
callback(); // if there are no images, immediately call the callback
}
$images.each(function () {
const img = new Image();
img.onload = function () {
images_loaded++;
if (images_loaded === total_images) {
callback(); // call the callback when all images are loaded
}
};
img.onerror = function () {
images_loaded++;
if (images_loaded === total_images) {
callback(); // also call the callback if an image fails to load
}
};
img.src = this.src; // this triggers the loading
});
}
/**
* Creates a jQuery element containing a non-breaking space
* @returns {jQuery} jQuery span element with &nbsp;
*/
function $nbsp() {
return $('<span>&nbsp;</span>');
}
/**
* Escapes special characters in a jQuery selector
* @param {string} id - Element ID to escape
* @returns {string} jQuery selector string with escaped special characters
* @warning Not safe for security-critical operations
*/
function escape_jq_selector(id) {
return '#' + id.replace(/(:|\.|\[|\]|,|=|@)/g, '\\$1');
}
/* === app/RSpade/Core/Js/datetime.js (babel) === */
"use strict";
/*
* Date and time utility functions for the RSpade framework.
* These functions handle date/time conversions and Unix timestamps.
*/
// ============================================================================
// DATE/TIME UTILITIES
// ============================================================================
/**
* Gets the current Unix timestamp (seconds since epoch)
* @returns {number} Current Unix timestamp in seconds
* @todo Calculate based on server time at page render
* @todo Move to a date library
*/
function unix_time() {
return Math.round(new Date().getTime() / 1000);
}
/**
* Converts a date string to Unix timestamp
* @param {string} str_date - Date string (Y-m-d H:i:s format)
* @returns {number} Unix timestamp in seconds
*/
function ymdhis_to_unix(str_date) {
const date = new Date(str_date);
return date.getTime() / 1000;
}
/* === app/RSpade/Core/Js/error.js (babel) === */
"use strict";
/*
* Error handling utility functions for the RSpade framework.
* These functions handle error creation and debugging utilities.
*/
// ============================================================================
// ERROR HANDLING
// ============================================================================
/**
* Creates an error object from a string
* @param {string|Object} str - Error message or existing error object
* @param {number} [error_code] - Optional error status code
* @returns {Object} Error object with error and status properties
*/
function error(str, error_code) {
if (typeof str.error != undef) {
return str;
} else {
if (typeof error_code == undef) {
return {
error: str,
status: null
};
} else {
return {
error: str,
status: error_code
};
}
}
}
/**
* Sanity check failure handler for JavaScript
*
* This function should be called when a sanity check fails - i.e., when the code
* encounters a condition that "shouldn't happen" if everything is working correctly.
*
* Unlike PHP, we can't stop JavaScript execution, but we can:
* 1. Throw an error that will be caught by error handlers
* 2. Log a clear error to the console
* 3. Provide stack trace for debugging
*
* Use this instead of silently returning or continuing when encountering unexpected conditions.
*
* @param {string} message Optional specific message about what shouldn't have happened
* @throws {Error} Always throws with location and context information
*/
function shouldnt_happen() {
let message = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
const error = new Error();
const stack = error.stack || '';
const stackLines = stack.split('\n');
// Get the caller location (skip the Error line and this function)
let callerInfo = 'unknown location';
if (stackLines.length > 2) {
const callerLine = stackLines[2] || stackLines[1] || '';
// Extract file and line number from stack trace
const match = callerLine.match(/at\s+.*?\s+\((.*?):(\d+):(\d+)\)/) || callerLine.match(/at\s+(.*?):(\d+):(\d+)/);
if (match) {
callerInfo = `${match[1]}:${match[2]}`;
}
}
let errorMessage = `Fatal: shouldnt_happen() was called at ${callerInfo}\n`;
errorMessage += 'This indicates a sanity check failed - the code is not behaving as expected.\n';
if (message) {
errorMessage += `Details: ${message}\n`;
}
errorMessage += 'Please thoroughly review the related code to determine why this error occurred.';
// Log to console with full visibility
console.error('='.repeat(80));
console.error('SANITY CHECK FAILURE');
console.error('='.repeat(80));
console.error(errorMessage);
console.error('Stack trace:', stack);
console.error('='.repeat(80));
// Throw error to stop execution flow
const fatalError = new Error(errorMessage);
fatalError.name = 'SanityCheckFailure';
throw fatalError;
}
/* === app/RSpade/Core/Js/hash.js (babel) === */
"use strict";
/*
* Hashing and comparison utility functions for the RSpade framework.
* These functions handle object hashing and deep comparison.
*/
// ============================================================================
// HASHING AND COMPARISON
// ============================================================================
/**
* Generates a unique hash for any value (handles objects, arrays, circular references)
* @param {*} the_var - Value to hash
* @param {boolean} [calc_sha1=true] - If true, returns SHA1 hash; if false, returns JSON
* @param {Array<string>} [ignored_keys=null] - Keys to ignore when hashing objects
* @returns {string} SHA1 hash or JSON string of the value
*/
function hash(the_var) {
let calc_sha1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
let ignored_keys = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
if (typeof the_var == undef) {
the_var = '__undefined__';
}
if (ignored_keys === null) {
ignored_keys = ['$'];
}
// Converts value to json, discarding circular references
let json_stringify_nocirc = function (value) {
const cache = [];
return JSON.stringify(value, function (key, v) {
if (typeof v === 'object' && typeof the_var._cache_key == 'function') {
return the_var._hash_key();
} else if (typeof v === 'object' && v !== null) {
if (cache.indexOf(v) !== -1) {
// Duplicate reference found, discard key
return;
}
cache.push(v);
}
return v;
});
};
// Turn every property and all its children into a single depth array of values that we can then
// sort and hash as a whole
let flat_var = {};
let _flatten = function (the_var, prefix) {
let depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
// If a class object is provided, circular references can make the call stack recursive.
// For the purposes of how the hash function is called, this should be sufficient.
if (depth > 10) {
return;
}
// Does not account for dates i think...
if (is_object(the_var) && typeof the_var._cache_key == 'function') {
// Use _cache_key to hash components
flat_var[prefix] = the_var._hash_key();
} else if (is_object(the_var) && typeof Abstract !== 'undefined' && the_var instanceof Abstract) {
// Stringify all class objects
flat_var[prefix] = json_stringify_nocirc(the_var);
} else if (is_object(the_var)) {
// Iterate other objects
flat_var[prefix] = {};
for (let k in the_var) {
if (the_var.hasOwnProperty(k) && ignored_keys.indexOf(k) == -1) {
_flatten(the_var[k], prefix + '..' + k, depth + 1);
}
}
} else if (is_array(the_var)) {
// Iterate arrays
flat_var[prefix] = [];
let i = 0;
foreach(the_var, v => {
_flatten(v, prefix + '..' + i, depth + 1);
i++;
});
} else if (is_function(the_var)) {
// nothing
} else if (!is_numeric(the_var)) {
flat_var[prefix] = String(the_var);
} else {
flat_var[prefix] = the_var;
}
};
_flatten(the_var, '_');
let sorter = [];
foreach(flat_var, function (v, k) {
sorter.push([k, v]);
});
sorter.sort(function (a, b) {
return a[0] > b[0];
});
let json = JSON.stringify(sorter);
if (calc_sha1) {
let hashed = sha1.sha1(json);
return hashed;
} else {
return json;
}
}
/**
* Deep comparison of two values (ignores property order and functions)
* @param {*} a - First value to compare
* @param {*} b - Second value to compare
* @returns {boolean} True if values are deeply equal
*/
function deep_equal(a, b) {
return hash(a, false) == hash(b, false);
}
/* === app/RSpade/Core/Js/Mutex.js (babel) === */
"use strict";
/**
* Mutex decorator for exclusive method execution
*
* Without arguments: Per-instance locking (each object has its own lock per method)
* @mutex
* async my_method() { ... }
*
* With ID argument: Global locking by ID (all instances share the lock)
* @mutex('operation_name')
* async my_method() { ... }
*
* @decorator
* @param {string} [global_id] - Optional global mutex ID for cross-instance locking
*/
function mutex(global_id) {
// Storage (using IIFEs to keep WeakMap/Map in closure scope)
const instance_mutexes = function () {
if (!mutex._instance_storage) {
mutex._instance_storage = new WeakMap();
}
return mutex._instance_storage;
}();
const global_mutexes = function () {
if (!mutex._global_storage) {
mutex._global_storage = new Map();
}
return mutex._global_storage;
}();
/**
* Get or create a mutex for a specific instance and method
*/
function get_instance_mutex(instance, method_name) {
let instance_locks = instance_mutexes.get(instance);
if (!instance_locks) {
instance_locks = new Map();
instance_mutexes.set(instance, instance_locks);
}
let lock_state = instance_locks.get(method_name);
if (!lock_state) {
lock_state = {
active: false,
queue: []
};
instance_locks.set(method_name, lock_state);
}
return lock_state;
}
/**
* Get or create a global mutex by ID
*/
function get_global_mutex(id) {
let lock_state = global_mutexes.get(id);
if (!lock_state) {
lock_state = {
active: false,
queue: []
};
global_mutexes.set(id, lock_state);
}
return lock_state;
}
/**
* Execute the next queued operation for a mutex
*/
function schedule_next(lock_state) {
if (lock_state.active || lock_state.queue.length === 0) {
return;
}
const {
fn,
resolve,
reject
} = lock_state.queue.shift();
lock_state.active = true;
Promise.resolve().then(fn).then(resolve, reject).finally(() => {
lock_state.active = false;
schedule_next(lock_state);
});
}
/**
* Acquire a mutex lock and execute callback
*/
function acquire_lock(lock_state, fn) {
return new Promise((resolve, reject) => {
lock_state.queue.push({
fn,
resolve,
reject
});
schedule_next(lock_state);
});
}
// If called with an ID argument: @mutex('id')
if (typeof global_id === 'string') {
return function (target, key, descriptor) {
const original_method = descriptor.value;
if (typeof original_method !== 'function') {
throw new Error(`@mutex can only be applied to methods (tried to apply to ${key})`);
}
descriptor.value = function () {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
const lock_state = get_global_mutex(global_id);
return acquire_lock(lock_state, () => original_method.apply(this, args));
};
return descriptor;
};
}
// If called without arguments: @mutex (target is the first argument)
const target = global_id; // In this case, first arg is target
const key = arguments[1];
const descriptor = arguments[2];
const original_method = descriptor.value;
if (typeof original_method !== 'function') {
throw new Error(`@mutex can only be applied to methods (tried to apply to ${key})`);
}
descriptor.value = function () {
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
const lock_state = get_instance_mutex(this, key);
return acquire_lock(lock_state, () => original_method.apply(this, args));
};
return descriptor;
}
/* === app/RSpade/Core/Js/async.js (babel) === */
"use strict";
/*
* Async utility functions for the RSpade framework.
* These functions handle asynchronous operations, delays, debouncing, and mutexes.
*/
// ============================================================================
// ASYNC UTILITIES
// ============================================================================
/**
* Pauses execution for specified milliseconds
* @param {number} [milliseconds=0] - Delay in milliseconds (0 uses requestAnimationFrame)
* @returns {Promise<void>} Promise that resolves after delay
* @example await sleep(1000); // Wait 1 second
*/
function sleep() {
let milliseconds = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
return new Promise(resolve => {
if (milliseconds == 0 && requestAnimationFrame) {
requestAnimationFrame(resolve);
} else {
setTimeout(resolve, milliseconds);
}
});
}
/**
* Creates a debounced function with exclusivity and promise fan-in
*
* This function, when invoked, immediately runs the callback exclusively.
* For subsequent invocations, it applies a delay before running the callback exclusively again.
* The delay starts after the current asynchronous operation resolves.
*
* If 'delay' is set to 0, the function will only prevent enqueueing multiple executions of the
* same method more than once, but will still run them immediately in an exclusive sequential manner.
*
* The most recent invocation of the function will be the parameters that get passed to the function
* when it invokes.
*
* The function returns a promise that resolves when the next exclusive execution completes.
*
* Usage as function:
* const debouncedFn = debounce(myFunction, 250);
*
* Usage as decorator:
* @debounce(250)
* myMethod() { ... }
*
* @param {function|number} callback_or_delay The callback function OR delay when used as decorator
* @param {number} delay The delay in milliseconds before subsequent invocations
* @param {boolean} immediate if true, the first time the action is called, the callback executes immediately
* @returns {function} A function that when invoked, runs the callback immediately and exclusively,
*
* @decorator
*/
function debounce(callback_or_delay, delay) {
let immediate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
// Decorator usage: @debounce(250) or @debounce(250, true)
// First argument is a number (the delay), returns decorator function
if (typeof callback_or_delay === 'number') {
const decorator_delay = callback_or_delay;
const decorator_immediate = delay || false;
// TC39 decorator form: receives (value, context)
return function (value, context) {
if (context.kind === 'method') {
return debounce_impl(value, decorator_delay, decorator_immediate);
}
};
}
// Function usage: debounce(fn, 250)
// First argument is a function (the callback)
const callback = callback_or_delay;
return debounce_impl(callback, delay, immediate);
}
/**
* Internal implementation of debounce logic
* @private
*/
function debounce_impl(callback, delay) {
let immediate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
let running = false;
let queued = false;
let last_end_time = 0; // timestamp of last completed run
let timer = null;
let next_args = [];
let next_context = null;
let resolve_queue = [];
let reject_queue = [];
const run_function = async () => {
const these_resolves = resolve_queue;
const these_rejects = reject_queue;
const args = next_args;
const context = next_context;
resolve_queue = [];
reject_queue = [];
next_args = [];
next_context = null;
queued = false;
running = true;
try {
const result = await callback.apply(context, args);
for (const resolve of these_resolves) resolve(result);
} catch (err) {
for (const reject of these_rejects) reject(err);
} finally {
running = false;
last_end_time = Date.now();
if (queued) {
clearTimeout(timer);
timer = setTimeout(run_function, Math.max(delay, 0));
} else {
timer = null;
}
}
};
return function () {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
next_args = args;
next_context = this;
return new Promise((resolve, reject) => {
resolve_queue.push(resolve);
reject_queue.push(reject);
// Nothing running and nothing scheduled
if (!running && !timer) {
const first_call = last_end_time === 0;
if (immediate && first_call) {
run_function();
return;
}
const since = first_call ? Infinity : Date.now() - last_end_time;
if (since >= delay) {
run_function();
} else {
const wait = Math.max(delay - since, 0);
clearTimeout(timer);
timer = setTimeout(run_function, wait);
}
return;
}
// If we're already running or a timer exists, just mark queued.
// The finally{} of run_function handles scheduling after full delay.
queued = true;
});
};
}
// ============================================================================
// READ-WRITE LOCK FUNCTIONS - Delegated to ReadWriteLock class
// ============================================================================
/**
* Acquire an exclusive write lock by name.
* Only one writer runs at a time; blocks readers until finished.
* @param {string} name
* @param {() => any|Promise<any>} cb
* @returns {Promise<any>}
*/
function rwlock(name, cb) {
return ReadWriteLock.acquire(name, cb);
}
/**
* Acquire a shared read lock by name.
* Multiple readers run in parallel, but readers are blocked by queued/active writers.
* @param {string} name
* @param {() => any|Promise<any>} cb
* @returns {Promise<any>}
*/
function rwlock_read(name, cb) {
return ReadWriteLock.acquire_read(name, cb);
}
/**
* Forcefully clear all locks and queues for a given name.
* @param {string} name
*/
function rwlock_force_unlock(name) {
ReadWriteLock.force_unlock(name);
}
/**
* Inspect lock state for debugging.
* @param {string} name
* @returns {{readers:number, writer_active:boolean, reader_q:number, writer_q:number}}
*/
function rwlock_pending(name) {
return ReadWriteLock.pending(name);
}
/* === app/RSpade/Core/Js/functions.js (babel) === */
"use strict";
/*
* Core utility functions for the RSpade framework.
* These functions handle type checking, type conversion, string manipulation,
* and object/array utilities. They mirror functionality from PHP functions.
*
* Other utility functions are organized in:
* - async.js: Async utilities (sleep, debounce, mutex)
* - browser.js: Browser/DOM utilities (is_mobile, scroll functions)
* - datetime.js: Date/time utilities
* - hash.js: Hashing and comparison
* - error.js: Error handling
*/
// Todo: test that prod build identifies and removes uncalled functions from the final bundle.
// ============================================================================
// CONSTANTS AND HELPERS
// ============================================================================
// Define commonly used constants
const undef = 'undefined';
/**
* Iterates over arrays or objects with promise support
*
* Works with both synchronous and asynchronous callbacks. If the callback
* returns promises, they are executed in parallel and this function returns
* a promise that resolves when all parallel tasks complete.
*
* @param {Array|Object} obj - Collection to iterate
* @param {Function} callback - Function to call for each item (value, key) - can be async
* @returns {Promise|undefined} Promise if any callbacks return promises, undefined otherwise
*
* @example
* // Synchronous usage
* foreach([1,2,3], (val) => console.log(val));
*
* @example
* // Asynchronous usage - waits for all to complete
* await foreach([1,2,3], async (val) => {
* await fetch('/api/process/' + val);
* });
*/
function foreach(obj, callback) {
const results = [];
if (Array.isArray(obj)) {
obj.forEach((value, index) => {
results.push(callback(value, index));
});
} else if (obj && typeof obj === 'object') {
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
results.push(callback(obj[key], key));
}
}
}
// Filter for promises
const promises = results.filter(result => result && typeof result.then === 'function');
// If there are any promises, return Promise.all to wait for all to complete
if (promises.length > 0) {
return Promise.all(promises);
}
// No promises returned, so we're done
return undefined;
}
// ============================================================================
// TYPE CHECKING FUNCTIONS
// ============================================================================
/**
* Checks if a value is numeric
* @param {*} n - Value to check
* @returns {boolean} True if the value is a finite number
*/
function is_numeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
/**
* Checks if a value is a string
* @param {*} s - Value to check
* @returns {boolean} True if the value is a string
*/
function is_string(s) {
return typeof s == 'string';
}
/**
* Checks if a value is an integer
* @param {*} n - Value to check
* @returns {boolean} True if the value is an integer
*/
function is_integer(n) {
return Number.isInteger(n);
}
/**
* Checks if a value is a promise-like object
* @param {*} obj - Value to check
* @returns {boolean} True if the value has a then method
*/
function is_promise(obj) {
return typeof obj == 'object' && typeof obj.then == 'function';
}
/**
* Checks if a value is an array
* @param {*} obj - Value to check
* @returns {boolean} True if the value is an array
*/
function is_array(obj) {
return Array.isArray(obj);
}
/**
* Checks if a value is an object (excludes null)
* @param {*} obj - Value to check
* @returns {boolean} True if the value is an object and not null
*/
function is_object(obj) {
return typeof obj === 'object' && obj !== null;
}
/**
* Checks if a value is a function
* @param {*} function_to_check - Value to check
* @returns {boolean} True if the value is a function
*/
function is_function(function_to_check) {
return function_to_check && {}.toString.call(function_to_check) === '[object Function]';
}
/**
* Checks if a string is a valid email address
* Uses a practical RFC 5322 compliant regex that matches 99.99% of real-world email addresses
* @param {string} email - Email address to validate
* @returns {boolean} True if the string is a valid email address
*/
function is_email(email) {
if (!is_string(email)) {
return false;
}
const regex = /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i;
return regex.test(email);
}
/**
* Checks if a value is defined (not undefined)
* @param {*} value - Value to check
* @returns {boolean} True if value is not undefined
*/
function isset(value) {
return typeof value != undef;
}
/**
* Checks if a value is empty (null, undefined, 0, "", empty array/object)
* @param {*} object - Value to check
* @returns {boolean} True if the value is considered empty
*/
function empty(object) {
if (typeof object == undef) {
return true;
}
if (object === null) {
return true;
}
if (typeof object == 'string' && object == '') {
return true;
}
if (typeof object == 'number') {
return object == 0;
}
if (Array.isArray(object)) {
return !object.length;
}
if (typeof object == 'function') {
return false;
}
for (let key in object) {
if (object.hasOwnProperty(key)) {
return false;
}
}
return true;
}
// ============================================================================
// TYPE CONVERSION FUNCTIONS
// ============================================================================
/**
* Converts a value to a floating point number
* Returns 0 for null, undefined, NaN, or non-numeric values
* @param {*} val - Value to convert
* @returns {number} Floating point number
*/
function float(val) {
// Handle null, undefined, empty string
if (val === null || val === undefined || val === '') {
return 0.0;
}
// Try to parse the value
const parsed = parseFloat(val);
// Check for NaN and return 0 if parsing failed
return isNaN(parsed) ? 0.0 : parsed;
}
/**
* Converts a value to an integer
* Returns 0 for null, undefined, NaN, or non-numeric values
* @param {*} val - Value to convert
* @returns {number} Integer value
*/
function int(val) {
// Handle null, undefined, empty string
if (val === null || val === undefined || val === '') {
return 0;
}
// Try to parse the value
const parsed = parseInt(val, 10);
// Check for NaN and return 0 if parsing failed
return isNaN(parsed) ? 0 : parsed;
}
/**
* Converts a value to a string
* Returns empty string for null or undefined
* @param {*} val - Value to convert
* @returns {string} String representation
*/
function str(val) {
// Handle null and undefined specially
if (val === null || val === undefined) {
return '';
}
// Convert to string
return String(val);
}
/**
* Converts numeric strings to numbers, returns all other values unchanged
* Used when you need to ensure numeric types but don't want to force
* conversion of non-numeric values (which would become 0)
* @param {*} val - Value to convert
* @returns {*} Number if input was numeric string, otherwise unchanged
*/
function value_unless_numeric_string_then_numeric_value(val) {
// If it's already a number, return it
if (typeof val === 'number') {
return val;
}
// If it's a string and numeric, convert it
if (is_string(val) && is_numeric(val)) {
// Use parseFloat to handle both integers and floats
return parseFloat(val);
}
// Return everything else unchanged (null, objects, non-numeric strings, etc.)
return val;
}
// ============================================================================
// STRING MANIPULATION FUNCTIONS
// ============================================================================
/**
* Escapes HTML special characters (uses Lodash escape)
* @param {string} str - String to escape
* @returns {string} HTML-escaped string
*/
function html(str) {
return _.escape(str);
}
/**
* Converts newlines to HTML line breaks
* @param {string} str - String to convert
* @returns {string} String with newlines replaced by <br />
*/
function nl2br(str) {
if (typeof str === undef || str === null) {
return '';
}
return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1<br />$2');
}
/**
* Escapes HTML and converts newlines to <br />
* @param {string} str - String to process
* @returns {string} HTML-escaped string with line breaks
*/
function htmlbr(str) {
return nl2br(html(str));
}
/**
* URL-encodes a string
* @param {string} str - String to encode
* @returns {string} URL-encoded string
*/
function urlencode(str) {
return encodeURIComponent(str);
}
/**
* URL-decodes a string
* @param {string} str - String to decode
* @returns {string} URL-decoded string
*/
function urldecode(str) {
return decodeURIComponent(str);
}
/**
* JSON-encodes a value
* @param {*} value - Value to encode
* @returns {string} JSON string
*/
function json_encode(value) {
return JSON.stringify(value);
}
/**
* JSON-decodes a string
* @param {string} str - JSON string to decode
* @returns {*} Decoded value
*/
function json_decode(str) {
return JSON.parse(str);
}
/**
* Console debug output with channel filtering
* Alias for Debugger.console_debug
* @param {string} channel - Debug channel name
* @param {...*} values - Values to log
*/
function console_debug(channel) {
for (var _len = arguments.length, values = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
values[_key - 1] = arguments[_key];
}
Debugger.console_debug(channel, ...values);
}
/**
* Replaces all occurrences of a substring in a string
* @param {string} string - String to search in
* @param {string} search - Substring to find
* @param {string} replace - Replacement substring
* @returns {string} String with all occurrences replaced
*/
function replace_all(string, search, replace) {
if (!is_string(string)) {
string = string + '';
}
return string.split(search).join(replace);
}
/**
* Capitalizes the first letter of each word
* @param {string} input - String to capitalize
* @returns {string} String with first letter of each word capitalized
*/
function ucwords(input) {
return input.split(' ').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' ');
}
// ============================================================================
// OBJECT AND ARRAY UTILITIES
// ============================================================================
/**
* Counts the number of properties in an object or elements in an array
* @param {Object|Array} o - Object or array to count
* @returns {number} Number of own properties/elements
*/
function count(o) {
let c = 0;
for (const k in o) {
if (o.hasOwnProperty(k)) {
++c;
}
}
return c;
}
/**
* Creates a shallow clone of an object, array, or function
* @param {*} obj - Value to clone
* @returns {*} Cloned value
*/
function clone(obj) {
if (typeof Function.prototype.__clone == undef) {
Function.prototype.__clone = function () {
//https://stackoverflow.com/questions/1833588/javascript-clone-a-function
const that = this;
let temp = function cloned() {
return that.apply(this, arguments);
};
for (let key in this) {
if (this.hasOwnProperty(key)) {
temp[key] = this[key];
}
}
return temp;
};
}
if (typeof obj == 'function') {
return obj.__clone();
} else if (obj.constructor && obj.constructor == Array) {
return obj.slice(0);
} else {
// https://stackoverflow.com/questions/728360/how-do-i-correctly-clone-a-javascript-object/30042948#30042948
return Object.assign({}, obj);
}
}
/**
* Returns the first non-null/undefined value from arguments
* @param {...*} arguments - Values to check
* @returns {*} First non-null/undefined value, or null if none found
*/
function coalesce() {
let args = Array.from(arguments);
let return_val = null;
args.forEach(function (arg) {
if (return_val === null && typeof arg != undef && arg !== null) {
return_val = arg;
}
});
return return_val;
}
/**
* Converts CSV string to array, trimming each element
* @param {string} str_csv - CSV string to convert
* @returns {Array<string>} Array of trimmed values
* @todo Handle quoted/escaped characters
*/
function csv_to_array_trim(str_csv) {
const parts = str_csv.split(',');
const ret = [];
foreach(parts, part => {
ret.push(part.trim());
});
return ret;
}
/* === app/RSpade/Core/Js/Manifest.js (babel) === */
"use strict";
/**
* Manifest - JavaScript class registry and metadata system
*
* This class maintains a registry of all JavaScript classes in the bundle,
* tracking their names and inheritance relationships. It provides utilities
* for working with class hierarchies and calling initialization methods.
*/
class Manifest {
/**
* Define classes in the manifest (framework internal)
* @param {Array} items - Array of class definitions [[Class, "ClassName", ParentClass, decorators], ...]
*/
static _define(items) {
// Initialize the classes object if not already defined
if (typeof Manifest._classes === 'undefined') {
Manifest._classes = {};
}
// Process each class definition
items.forEach(item => {
let class_object = item[0];
let class_name = item[1];
let class_extends = item[2] || null;
let decorators = item[3] || null;
// Store the class information (using object to avoid duplicates)
Manifest._classes[class_name] = {
class: class_object,
name: class_name,
extends: class_extends,
decorators: decorators // Store compact decorator data
};
// Add metadata to the class object itself
class_object._name = class_name;
class_object._extends = class_extends;
class_object._decorators = decorators;
});
// Build the subclass index after all classes are defined
Manifest._build_subclass_index();
}
/**
* Build an index of subclasses for efficient lookups
* This creates a mapping where each class name points to an array of all its subclasses
* @private
*/
static _build_subclass_index() {
// Initialize the subclass index
Manifest._subclass_index = {};
// Step through each class and walk up its parent chain
for (let class_name in Manifest._classes) {
const classdata = Manifest._classes[class_name];
let current_class_name = class_name;
let current_classdata = classdata;
// Walk up the parent chain until we reach the root
while (current_classdata) {
const extends_name = current_classdata.extends;
if (extends_name) {
// Initialize the parent's subclass array if needed
if (!Manifest._subclass_index[extends_name]) {
Manifest._subclass_index[extends_name] = [];
}
// Add this class to its parent's subclass list
if (!Manifest._subclass_index[extends_name].includes(class_name)) {
Manifest._subclass_index[extends_name].push(class_name);
}
// Move up to the parent's metadata (if it exists in manifest)
if (Manifest._classes[extends_name]) {
current_classdata = Manifest._classes[extends_name];
} else {
// Parent not in manifest (e.g., native JavaScript class), stop here
current_classdata = null;
}
} else {
// No parent, we've reached the root
current_classdata = null;
}
}
}
}
/**
* Get all classes that extend a given base class
* @param {Class|string} base_class - The base class (object or name string) to check for
* @returns {Array} Array of objects with {class_name, class_object} for classes that extend the base class
*/
static get_extending(base_class) {
if (!Manifest._classes) {
return [];
}
// Convert string to class object if needed
let base_class_object = base_class;
if (typeof base_class === 'string') {
base_class_object = Manifest.get_class_by_name(base_class);
if (!base_class_object) {
throw new Error(`Base class not found: ${base_class}`);
}
}
const classes = [];
for (let class_name in Manifest._classes) {
const classdata = Manifest._classes[class_name];
if (Manifest.js_is_subclass_of(classdata.class, base_class_object)) {
classes.push({
class_name: class_name,
class_object: classdata.class
});
}
}
// Sort alphabetically by class name to ensure deterministic behavior and prevent race condition bugs
classes.sort((a, b) => a.class_name.localeCompare(b.class_name));
return classes;
}
/**
* Check if a class is a subclass of another class
* Matches PHP Manifest::js_is_subclass_of() signature and behavior
* @param {Class|string} subclass - The child class (object or name) to check
* @param {Class|string} superclass - The parent class (object or name) to check against
* @returns {boolean} True if subclass extends superclass (directly or indirectly)
*/
static js_is_subclass_of(subclass, superclass) {
// Convert string names to class objects
let subclass_object = subclass;
if (typeof subclass === 'string') {
subclass_object = Manifest.get_class_by_name(subclass);
if (!subclass_object) {
// Can't resolve subclass - return false per spec
return false;
}
}
let superclass_object = superclass;
if (typeof superclass === 'string') {
superclass_object = Manifest.get_class_by_name(superclass);
if (!superclass_object) {
// Can't resolve superclass - fail loud per spec
throw new Error(`Superclass not found in manifest: ${superclass}`);
}
}
// Classes are not subclasses of themselves
if (subclass_object === superclass_object) {
return false;
}
// Walk up the inheritance chain
let current_class = subclass_object;
while (current_class) {
if (current_class === superclass_object) {
return true;
}
// Move up to parent class
if (current_class._extends) {
// _extends may be a string or class reference
if (typeof current_class._extends === 'string') {
current_class = Manifest.get_class_by_name(current_class._extends);
} else {
current_class = current_class._extends;
}
} else {
current_class = null;
}
}
return false;
}
/**
* Get a class by its name
* @param {string} class_name - The name of the class
* @returns {Class|null} The class object or null if not found
*/
static get_class_by_name(class_name) {
if (!Manifest._classes || !Manifest._classes[class_name]) {
return null;
}
return Manifest._classes[class_name].class;
}
/**
* Get all registered classes
* @returns {Array} Array of objects with {class_name, class_object, extends}
*/
static get_all_classes() {
if (!Manifest._classes) {
return [];
}
const results = [];
for (let class_name in Manifest._classes) {
const classdata = Manifest._classes[class_name];
results.push({
class_name: classdata.name,
class_object: classdata.class,
extends: classdata.extends
});
}
// Sort alphabetically by class name to ensure deterministic behavior and prevent race condition bugs
results.sort((a, b) => a.class_name.localeCompare(b.class_name));
return results;
}
/**
* Get the build key from the application configuration
* @returns {string} The build key or "NOBUILD" if not available
*/
static build_key() {
if (window.rsxapp && window.rsxapp.build_key) {
return window.rsxapp.build_key;
}
return 'NOBUILD';
}
/**
* Get decorators for a specific class and method
* @param {string|Class} class_name - The class name or class object
* @param {string} method_name - The method name
* @returns {Array|null} Array of decorator objects or null if none found
*/
static get_decorators(class_name, method_name) {
// Convert class object to name if needed
if (typeof class_name !== 'string') {
class_name = class_name._name || class_name.name;
}
const class_info = Manifest._classes[class_name];
if (!class_info || !class_info.decorators || !class_info.decorators[method_name]) {
return null;
}
// Transform compact format to object format
return Manifest._transform_decorators(class_info.decorators[method_name]);
}
/**
* Get all methods with decorators for a class
* @param {string|Class} class_name - The class name or class object
* @returns {Object} Object with method names as keys and decorator arrays as values
*/
static get_all_decorators(class_name) {
// Convert class object to name if needed
if (typeof class_name !== 'string') {
class_name = class_name._name || class_name.name;
}
const class_info = Manifest._classes[class_name];
if (!class_info || !class_info.decorators) {
return {};
}
// Transform all decorators from compact to object format
const result = {};
for (let method_name in class_info.decorators) {
result[method_name] = Manifest._transform_decorators(class_info.decorators[method_name]);
}
return result;
}
/**
* Transform compact decorator format to object format
* @param {Array} compact_decorators - Array of [name, [args]] tuples
* @returns {Array} Array of decorator objects with name and arguments properties
* @private
*/
static _transform_decorators(compact_decorators) {
if (!Array.isArray(compact_decorators)) {
return [];
}
return compact_decorators.map(decorator => {
if (Array.isArray(decorator) && decorator.length >= 2) {
return {
name: decorator[0],
arguments: decorator[1] || []
};
}
// Handle malformed decorator data
return {
name: 'unknown',
arguments: []
};
});
}
/**
* Check if a method has a specific decorator
* @param {string|Class} class_name - The class name or class object
* @param {string} method_name - The method name
* @param {string} decorator_name - The decorator name to check for
* @returns {boolean} True if the method has the decorator
*/
static has_decorator(class_name, method_name, decorator_name) {
const decorators = Manifest.get_decorators(class_name, method_name);
if (!decorators) {
return false;
}
return decorators.some(d => d.name === decorator_name);
}
/**
* Get all subclasses of a given class using the pre-built index
* This is the JavaScript equivalent of PHP's Manifest::js_get_subclasses_of()
* @param {Class|string} base_class - The base class (object or name string) to get subclasses of
* @returns {Array<Class>} Array of actual class objects that are subclasses of the base class
*/
static js_get_subclasses_of(base_class) {
// Initialize index if needed
if (!Manifest._subclass_index) {
Manifest._build_subclass_index();
}
// Convert class object to name if needed
let base_class_name = base_class;
if (typeof base_class !== 'string') {
base_class_name = base_class._name || base_class.name;
}
// Check if the base class exists
if (!Manifest._classes[base_class_name]) {
// Base class not in manifest - return empty array
return [];
}
// Get subclass names from the index
const subclass_names = Manifest._subclass_index[base_class_name] || [];
// Convert names to actual class objects
const subclass_objects = [];
for (let subclass_name of subclass_names) {
const classdata = Manifest._classes[subclass_name];
subclass_objects.push(classdata.class);
}
// Sort by class name for deterministic behavior
subclass_objects.sort((a, b) => {
const name_a = a._name || a.name;
const name_b = b._name || b.name;
return name_a.localeCompare(name_b);
});
return subclass_objects;
}
}
// RSX manifest automatically makes classes global - no manual assignment needed
/* === app/RSpade/Core/Js/Rsx_Behaviors.js (babel) === */
"use strict";
/**
* Rsx_Behaviors - Core Framework User Experience Enhancements
*
* This class provides automatic quality-of-life behaviors that improve the default
* browser experience for RSX applications. These behaviors are transparent to
* application developers and run automatically on framework initialization.
*
* These behaviors use jQuery event delegation to handle both existing and dynamically
* added content. They are implemented with low priority to allow application code to
* override default behaviors when needed.
*
* @internal Framework use only - not part of public API
*/
class Rsx_Behaviors {
static _on_framework_core_init() {
Rsx_Behaviors._init_ignore_invalid_anchor_links();
Rsx_Behaviors._trim_copied_text();
}
/**
* - Anchor link handling: Prevents broken "#" links from causing page jumps or URL changes
* - Ignores "#" (empty hash) to prevent scroll-to-top behavior
* - Ignores "#placeholder*" links used as route placeholders during development
* - Validates anchor targets exist before allowing navigation
* - Preserves normal anchor behavior when targets exist
*/
static _init_ignore_invalid_anchor_links() {
return; // disabled for now - make this into a configurable option
// Use event delegation on document to handle all current and future anchor clicks
// Use mousedown instead of click to run before most application handlers
$(document).on('mousedown', 'a[href^="#"]', function (e) {
const $link = $(this);
const href = $link.attr('href');
// Check if another handler has already prevented default
if (e.isDefaultPrevented()) {
return;
}
// Allow data-rsx-allow-hash attribute to bypass this behavior
if ($link.data('rsx-allow-hash')) {
return;
}
// Handle empty hash - prevent scroll to top
if (href === '#') {
e.preventDefault();
e.stopImmediatePropagation();
return false;
}
// Handle placeholder links used during development
if (href.startsWith('#placeholder')) {
e.preventDefault();
e.stopImmediatePropagation();
return false;
}
// For other hash links, check if target exists
const targetId = href.substring(1);
if (targetId) {
// Check for element with matching ID or name attribute
const targetExists = document.getElementById(targetId) !== null || document.querySelector(`[name="${targetId}"]`) !== null;
if (!targetExists) {
// Target doesn't exist - prevent navigation
e.preventDefault();
e.stopImmediatePropagation();
return false;
}
// Target exists - allow normal anchor behavior
}
});
}
/**
* - Copy text trimming: Automatically removes leading/trailing whitespace from copied text
* - Hold Shift to preserve whitespace
* - Skips trimming in code blocks, textareas, and contenteditable elements
*/
static _trim_copied_text() {
document.addEventListener('copy', function (event) {
// Don't trim if user is holding Shift (allows copying with whitespace if needed)
if (event.shiftKey) return;
let selection = window.getSelection();
let selected_text = selection.toString();
// Don't trim if selection is empty
if (!selected_text) return;
// Don't trim if copying from code blocks, textareas, or content-editable (preserve formatting)
let container = selection.getRangeAt(0).commonAncestorContainer;
if (container.nodeType === 3) container = container.parentNode; // Text node to element
if (container.closest('pre, code, .code-block, textarea, [contenteditable="true"]')) return;
let trimmed_text = selected_text.trim();
// Only modify if there's actually whitespace to trim
if (trimmed_text !== selected_text && trimmed_text.length > 0) {
event.preventDefault();
event.clipboardData.setData('text/plain', trimmed_text);
console.log('Copy: trimmed whitespace from selection');
}
});
}
}
/* === app/RSpade/Core/Js/Rsx_Cache.js (babel) === */
"use strict";
// Simple key value cache. Can only store 5000 entries, will reset after 5000 entries.
// Todo: keep local cache concept the same, replace global cache concept with the nov 2019 version of
// session cache. Use a session key & build key to track cache keys so cached values only last until user logs out.
// review session code to ensure that session key *always* rotates on logout. Make session id a protected value.
class Rsx_Cache {
static on_core_define() {
Core_Cache._caches = {
global: {},
instance: {}
};
Core_Cache._caches_set = 0;
}
// Alias for get_instance
static get(key) {
return Rsx_Cache.get_instance(key);
}
// Returns from the pool of cached data for this 'instance'. An instance
// in this case is a virtual page load / navigation in the SPA. Call Main.lib.reset() to reset.
// Returns null on failure
static get_instance(key) {
if (Main.debug('no_api_cache')) {
return null;
}
let key_encoded = Rsx_Cache._encodekey(key);
if (typeof Core_Cache._caches.instance[key_encoded] != undef) {
return JSON.parse(Core_Cache._caches.instance[key_encoded]);
}
return null;
}
// Returns null on failure
// Returns a cached value from global cache (unique to page load, survives reset())
static get_global(key) {
if (Main.debug('no_api_cache')) {
return null;
}
let key_encoded = Rsx_Cache._encodekey(key);
if (typeof Core_Cache._caches.global[key_encoded] != undef) {
return JSON.parse(Core_Cache._caches.global[key_encoded]);
}
return null;
}
// Sets a value in instance and global cache (not shared between browser tabs)
static set(key, value) {
if (Main.debug('no_api_cache')) {
return;
}
if (value === null) {
return;
}
if (value.length > 64 * 1024) {
Debugger.console_debug('CACHE', 'Warning - not caching large cache entry', key);
return;
}
let key_encoded = Rsx_Cache._encodekey(key);
Core_Cache._caches.global[key_encoded] = JSON.stringify(value);
Core_Cache._caches.instance[key_encoded] = JSON.stringify(value);
// Debugger.console_debug("CACHE", "Set", key, value);
Core_Cache._caches_set++;
// Reset cache after 5000 items set
if (Core_Cache._caches_set > 5000) {
// Get an accurate count
Core_Cache._caches_set = count(Core_Cache._caches.global);
if (Core_Cache._caches_set > 5000) {
Core_Cache._caches = {
global: {},
instance: {}
};
Core_Cache._caches_set = 0;
}
}
}
// Returns null on failure
// Returns a cached value from session cache (shared between browser tabs)
static get_session(key) {
if (Main.debug('no_api_cache')) {
return null;
}
if (!Rsx_Cache._supportsStorage()) {
return null;
}
let key_encoded = Rsx_Cache._encodekey(key);
let rs = sessionStorage.getItem(key_encoded);
if (!empty(rs)) {
return JSON.parse(rs);
} else {
return null;
}
}
// Sets a value in session cache (shared between browser tabs)
static set_session(key, value) {
let _tryagain = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
if (Main.debug('no_api_cache')) {
return;
}
if (value.length > 64 * 1024) {
Debugger.console_debug('CACHE', 'Warning - not caching large cache entry', key);
return;
}
if (!Rsx_Cache._supportsStorage()) {
return null;
}
let key_encoded = Rsx_Cache._encodekey(key);
try {
sessionStorage.removeItem(key_encoded);
sessionStorage.setItem(key_encoded, JSON.stringify(value));
} catch (e) {
if (Rsx_Cache._isOutOfSpace(e) && sessionStorage.length) {
sessionStorage.clear();
if (_tryagain) {
Core_Cache.set_session(key, value, false);
}
}
}
}
static _reset() {
Core_Cache._caches.instance = {};
}
/**
* For given key of any type including an object, return a string representing
* the key that the cached value should be stored as in sessionstorage
*/
static _encodekey(key) {
const prefix = 'cache_';
// Session reimplement
// var prefix = "cache_" + Spa.session().user_id() + "_";
if (is_string(key) && key.length < 150 && key.indexOf(' ') == -1) {
return prefix + Manifest.build_key() + '_' + key;
} else {
return prefix + hash([Manifest.build_key(), key]);
}
}
// Determines if sessionStorage is supported in the browser;
// result is cached for better performance instead of being run each time.
// Feature detection is based on how Modernizr does it;
// it's not straightforward due to FF4 issues.
// It's not run at parse-time as it takes 200ms in Android.
// Code from https://github.com/pamelafox/lscache/blob/master/lscache.js, Apache License Pamelafox
static _supportsStorage() {
let key = '__cachetest__';
let value = key;
if (Rsx_Cache.__supportsStorage !== undefined) {
return Rsx_Cache.__supportsStorage;
}
// some browsers will throw an error if you try to access local storage (e.g. brave browser)
// hence check is inside a try/catch
try {
if (!sessionStorage) {
return false;
}
} catch (ex) {
return false;
}
try {
sessionStorage.setItem(key, value);
sessionStorage.removeItem(key);
Rsx_Cache.__supportsStorage = true;
} catch (e) {
// If we hit the limit, and we don't have an empty sessionStorage then it means we have support
if (Rsx_Cache._isOutOfSpace(e) && sessionStorage.length) {
Rsx_Cache.__supportsStorage = true; // just maxed it out and even the set test failed.
} else {
Rsx_Cache.__supportsStorage = false;
}
}
return Rsx_Cache.__supportsStorage;
}
// Check to set if the error is us dealing with being out of space
static _isOutOfSpace(e) {
return e && (e.name === 'QUOTA_EXCEEDED_ERR' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED' || e.name === 'QuotaExceededError');
}
}
/* === app/RSpade/Core/Js/Rsx_Init.js (babel) === */
"use strict";
/**
* Rsx_Init - Core framework initialization and environment validation
*/
class Rsx_Init {
/**
* Called via Rsx._rsx_core_boot
* Initializes the core environment and runs basic sanity checks
*/
static _on_framework_core_init() {
if (!Rsx.is_prod()) {
Rsx_Init.__environment_checks();
}
}
/**
* Development environment checks to ensure proper configuration
*/
static __environment_checks() {
// Find all script tags in the DOM
const scripts = document.getElementsByTagName('script');
for (let i = 0; i < scripts.length; i++) {
const script = scripts[i];
// Skip inline scripts (no src attribute)
if (!script.src) {
continue;
}
// Check if script has defer attribute
if (!script.defer) {
const src = script.src || '(inline script)';
const reason = `All script tags used in an RSpade project must have defer attribute. Found script without defer: ${src}`;
// Stop framework boot with reason
Rsx._rsx_core_boot_stop(reason);
// Also log to console for visibility
console.error(`[RSX BOOT STOPPED] ${reason}`);
// Stop checking after first violation
return;
}
}
}
}
/* === app/RSpade/Core/Js/Rsx_Js_Model.js (babel) === */
"use strict";
// @FILE-SUBCLASS-01-EXCEPTION
/**
* Base class for JavaScript ORM models
*
* Provides core functionality for fetching records from backend PHP models.
* All model stubs generated by the manifest extend this base class.
*
* Example usage:
* // Fetch single record
* const user = await User_Model.fetch(123);
*
* // Fetch multiple records
* const users = await User_Model.fetch([1, 2, 3]);
*
* // Create instance with data
* const user = new User_Model({id: 1, name: 'John'});
*
* @Instantiatable
*/
class Rsx_Js_Model {
/**
* Constructor - Initialize model instance with data
*
* @param {Object} data - Key-value pairs to populate the model
*/
constructor() {
let data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
// __MODEL SYSTEM: Enables automatic ORM instantiation when fetching from PHP models.
// PHP models add "__MODEL": "ClassName" to JSON, JavaScript uses it to create proper instances.
// This provides typed model objects instead of plain JSON, with methods and type checking.
// This constructor filters out the __MODEL marker that was used to identify which class
// to instantiate, keeping only the actual data properties on the instance.
const {
__MODEL,
...modelData
} = data;
Object.assign(this, modelData);
}
/**
* Fetch record(s) from the backend model
*
* This method mirrors the PHP Model::fetch() functionality.
* The backend model must have a fetch() method with the
* #[Ajax_Endpoint_Model_Fetch] annotation to be callable.
*
* @param {number|Array} id - Single ID or array of IDs to fetch
* @returns {Promise} - Single model instance, array of instances, or false
*/
static async fetch(id) {
const CurrentClass = this;
// Get the model class name from the current class
const modelName = CurrentClass.name;
const response = await $.ajax({
url: `/_fetch/${modelName}`,
method: 'POST',
data: {
id: id
},
dataType: 'json'
});
// Handle response based on type
if (response === false) {
return false;
}
// Use _instantiate_models_recursive to handle ORM instantiation
// This will automatically detect __MODEL properties and create appropriate instances
return Rsx_Js_Model._instantiate_models_recursive(response);
}
/**
* Get the model class name
* Used internally for API calls
*
* @returns {string} The class name
*/
static getModelName() {
const CurrentClass = this;
return CurrentClass.name;
}
/**
* Refresh this instance with latest data from server
*
* @returns {Promise} Updated instance or false if not found
*/
async refresh() {
const that = this;
if (!that.id) {
shouldnt_happen('Cannot refresh model without id property');
}
const fresh = await that.constructor.fetch(that.id);
if (fresh === false) {
return false;
}
// Update this instance with fresh data
Object.assign(that, fresh);
return that;
}
/**
* Convert model instance to plain object
* Useful for serialization or sending to APIs
*
* @returns {Object} Plain object representation
*/
toObject() {
const that = this;
const obj = {};
for (const key in that) {
if (that.hasOwnProperty(key) && typeof that[key] !== 'function') {
obj[key] = that[key];
}
}
return obj;
}
/**
* Convert model instance to JSON string
*
* @returns {string} JSON representation
*/
toJSON() {
const that = this;
return JSON.stringify(that.toObject());
}
/**
* Recursively instantiate ORM models in response data
*
* Looks for objects with __MODEL property and instantiates the appropriate
* JavaScript model class if it exists in the global scope.
*
* @param {*} data - The data to process (can be any type)
* @returns {*} The data with ORM objects instantiated
*/
static _instantiate_models_recursive(data) {
// __MODEL SYSTEM: Enables automatic ORM instantiation when fetching from PHP models.
// PHP models add "__MODEL": "ClassName" to JSON, JavaScript uses it to create proper instances.
// This provides typed model objects instead of plain JSON, with methods and type checking.
// This recursive processor scans all API response data looking for __MODEL markers.
// When found, it attempts to instantiate the appropriate JavaScript model class,
// converting {__MODEL: "User_Model", id: 1, name: "John"} into new User_Model({...}).
// Works recursively through arrays and nested objects to handle complex data structures.
// Handle null/undefined
if (data === null || data === undefined) {
return data;
}
// Handle arrays - recursively process each element
if (Array.isArray(data)) {
return data.map(item => Rsx_Js_Model._instantiate_models_recursive(item));
}
// Handle objects
if (typeof data === 'object') {
// Check if this object has a __MODEL property
if (data.__MODEL && typeof data.__MODEL === 'string') {
// Try to find the model class in the global scope
const ModelClass = window[data.__MODEL];
// If the model class exists and extends Rsx_Js_Model, instantiate it
// Dynamic model resolution requires checking class existence - @JS-DEFENSIVE-01-EXCEPTION
if (ModelClass && ModelClass.prototype instanceof Rsx_Js_Model) {
return new ModelClass(data);
}
}
// Recursively process all object properties
const result = {};
for (const key in data) {
if (data.hasOwnProperty(key)) {
result[key] = Rsx_Js_Model._instantiate_models_recursive(data[key]);
}
}
return result;
}
// Return primitive values as-is
return data;
}
}
/* === app/RSpade/Core/Js/Rsx_View_Transitions.js (babel) === */
"use strict";
/**
* View_Transitions - Smooth page-to-page transitions using View Transitions API
*
* Enables cross-document view transitions so the browser doesn't paint the new page
* until it's ready, creating smooth animations between pages.
*
* Falls back gracefully if View Transitions API is not available.
*/
class Rsx_View_Transitions {
/**
* Called during framework core init phase
* Checks for View Transitions API support and enables if available
*/
static _on_framework_core_init() {
// Check if View Transitions API is supported
if (!document.startViewTransition) {
console_debug('VIEW_TRANSITIONS', 'View Transitions API not supported, skipping');
return;
}
// Enable cross-document view transitions via CSS
Rsx_View_Transitions._inject_transition_css();
}
/**
* Inject CSS to enable cross-document view transitions
*
* The @view-transition { navigation: auto; } rule tells the browser to:
* 1. Capture a snapshot of the current page before navigation
* 2. Fetch the new page
* 3. Wait until the new page is fully loaded and painted (document.ready)
* 4. Animate smoothly between the two states
*
* This prevents the white flash during navigation and creates app-like transitions.
*/
static _inject_transition_css() {
const style = document.createElement('style');
style.textContent = `
@view-transition {
navigation: auto;
}
/* Disable animation - instant transition */
::view-transition-group(*),
::view-transition-old(*),
::view-transition-new(*) {
animation-duration: 0s;
}
`;
document.head.appendChild(style);
}
}
/* === app/RSpade/Core/Js/ReadWriteLock.js (babel) === */
"use strict";
var _50ae609e_ReadWriteLock;
function _50ae609e_assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); }
/**
* ReadWriteLock implementation for RSpade framework
* Provides exclusive (write) and shared (read) locking mechanisms for asynchronous operations
*/
class ReadWriteLock {
/**
* Acquire an exclusive mutex lock by name.
* Only one writer runs at a time; blocks readers until finished.
* @param {string} name
* @param {() => any|Promise<any>} cb
* @returns {Promise<any>}
*/
static acquire(name, cb) {
return new Promise((resolve, reject) => {
const s = _50ae609e_assertClassBrand(ReadWriteLock, this, _50ae609e_get_lock).call(this, name);
s.writer_q.push({
cb,
resolve,
reject
});
_50ae609e_assertClassBrand(ReadWriteLock, this, _50ae609e_schedule).call(this, name);
});
}
/**
* Acquire a shared read lock by name.
* Multiple readers can run in parallel; blocks when writer is active.
* @param {string} name
* @param {() => any|Promise<any>} cb
* @returns {Promise<any>}
*/
static acquire_read(name, cb) {
return new Promise((resolve, reject) => {
const s = _50ae609e_assertClassBrand(ReadWriteLock, this, _50ae609e_get_lock).call(this, name);
if (s.writer_active || s.writer_q.length > 0) {
s.reader_q.push({
cb,
resolve,
reject
});
return _50ae609e_assertClassBrand(ReadWriteLock, this, _50ae609e_schedule).call(this, name);
}
s.readers += 1;
Promise.resolve().then(cb).then(resolve, reject).finally(() => {
s.readers -= 1;
if (s.readers === 0) _50ae609e_assertClassBrand(ReadWriteLock, this, _50ae609e_schedule).call(this, name);
});
});
}
/**
* Force-unlock a mutex (use with caution).
* Completely removes the lock state, potentially breaking waiting operations.
* @param {string} name
*/
static force_unlock(name) {
_50ae609e_assertClassBrand(ReadWriteLock, this, _locks)._.delete(name);
}
/**
* Get information about pending operations on a mutex.
* @param {string} name
* @returns {{readers: number, writer_active: boolean, reader_q: number, writer_q: number}}
*/
static pending(name) {
const s = _50ae609e_assertClassBrand(ReadWriteLock, this, _locks)._.get(name);
if (!s) return {
readers: 0,
writer_active: false,
reader_q: 0,
writer_q: 0
};
return {
readers: s.readers,
writer_active: s.writer_active,
reader_q: s.reader_q.length,
writer_q: s.writer_q.length
};
}
}
_50ae609e_ReadWriteLock = ReadWriteLock;
/**
* Get or create a lock object for a given name
* @private
*/
function _50ae609e_get_lock(name) {
let s = _50ae609e_assertClassBrand(_50ae609e_ReadWriteLock, this, _locks)._.get(name);
if (!s) {
s = {
readers: 0,
writer_active: false,
reader_q: [],
writer_q: []
};
_50ae609e_assertClassBrand(_50ae609e_ReadWriteLock, this, _locks)._.set(name, s);
}
return s;
}
/**
* Schedule the next operation for a lock
* @private
*/
function _50ae609e_schedule(name) {
const s = _50ae609e_assertClassBrand(_50ae609e_ReadWriteLock, this, _50ae609e_get_lock).call(this, name);
if (s.writer_active || s.readers > 0) return;
// run one writer if queued
if (s.writer_q.length > 0) {
const {
cb,
resolve,
reject
} = s.writer_q.shift();
s.writer_active = true;
Promise.resolve().then(cb).then(resolve, reject).finally(() => {
s.writer_active = false;
_50ae609e_assertClassBrand(_50ae609e_ReadWriteLock, this, _50ae609e_schedule).call(this, name);
});
return;
}
// otherwise run all queued readers in parallel
if (s.reader_q.length > 0) {
const batch = s.reader_q.splice(0);
s.readers += batch.length;
for (const {
cb,
resolve,
reject
} of batch) {
Promise.resolve().then(cb).then(resolve, reject).finally(() => {
s.readers -= 1;
if (s.readers === 0) _50ae609e_assertClassBrand(_50ae609e_ReadWriteLock, this, _50ae609e_schedule).call(this, name);
});
}
}
}
var _locks = {
_: new Map()
};
/* === app/RSpade/Core/Js/Form_Utils.js (babel) === */
"use strict";
/**
* Form utilities for validation and error handling
*/
class Form_Utils {
/**
* Framework initialization hook to register jQuery plugin
* Creates $.fn.ajax_submit() for form elements
* @private
*/
static _on_framework_core_define() {
let params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
$.fn.ajax_submit = function () {
let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
const $element = $(this);
if (!$element.is('form')) {
throw new Error('ajax_submit() can only be called on form elements');
}
const url = $element.attr('action');
if (!url) {
throw new Error('Form must have an action attribute');
}
const {
controller,
action
} = Ajax.ajax_url_to_controller_action(url);
return Form_Utils.ajax_submit($element, controller, action, options);
};
}
/**
* Shows form validation errors
*
* REQUIRED HTML STRUCTURE:
* For inline field errors to display properly, form fields must follow this structure:
*
* <div class="form-group">
* <label class="form-label" for="field-name">Field Label</label>
* <input class="form-control" id="field-name" name="field-name" type="text">
* </div>
*
* Key requirements:
* - Wrap each field in a container with class "form-group" (or "form-check" / "input-group")
* - Input must have a "name" attribute matching the error key
* - Use "form-control" class on inputs for Bootstrap 5 styling
*
* Accepts three formats:
* - String: Single error shown as alert
* - Array of strings: Multiple errors shown as bulleted alert
* - Object: Field names mapped to errors, shown inline (unmatched shown as alert)
*
* @param {string} parent_selector - jQuery selector for parent element
* @param {string|Object|Array} errors - Error messages to display
* @returns {Promise} Promise that resolves when all animations complete
*/
static apply_form_errors(parent_selector, errors) {
console.error(errors);
const $parent = $(parent_selector);
// Reset the form errors before applying new ones
Form_Utils.reset_form_errors(parent_selector);
// Normalize input to standard format
const normalized = Form_Utils._normalize_errors(errors);
return new Promise(resolve => {
let animations = [];
if (normalized.type === 'string') {
// Single error message
animations = Form_Utils._apply_general_errors($parent, normalized.data);
} else if (normalized.type === 'array') {
// Array of error messages
const deduplicated = Form_Utils._deduplicate_errors(normalized.data);
animations = Form_Utils._apply_general_errors($parent, deduplicated);
} else if (normalized.type === 'fields') {
// Field-specific errors
const result = Form_Utils._apply_field_errors($parent, normalized.data);
animations = result.animations;
// Count matched fields
const matched_count = Object.keys(normalized.data).length - Object.keys(result.unmatched).length;
const unmatched_deduplicated = Form_Utils._deduplicate_errors(result.unmatched);
const unmatched_count = Object.keys(unmatched_deduplicated).length;
// Show summary alert if there are any field errors (matched or unmatched)
if (matched_count > 0 || unmatched_count > 0) {
// Build summary message
let summary_msg = '';
if (matched_count > 0) {
summary_msg = matched_count === 1 ? 'Please correct the error highlighted below.' : 'Please correct the errors highlighted below.';
}
// If there are unmatched errors, add them as a bulleted list
if (unmatched_count > 0) {
const summary_animations = Form_Utils._apply_combined_error($parent, summary_msg, unmatched_deduplicated);
animations.push(...summary_animations);
} else {
// Just the summary message, no unmatched errors
const summary_animations = Form_Utils._apply_general_errors($parent, summary_msg);
animations.push(...summary_animations);
}
}
}
// Resolve the promise once all animations are complete
Promise.all(animations).then(() => {
// Scroll to error container if it exists
const $error_container = $parent.find('[data-id="error_container"]').first();
if ($error_container.length > 0) {
const container_top = $error_container.offset().top;
// Calculate fixed header offset
const fixed_header_height = Form_Utils._get_fixed_header_height();
// Scroll to position error container 20px below any fixed headers
const target_scroll = container_top - fixed_header_height - 20;
$('html, body').animate({
scrollTop: target_scroll
}, 500);
}
resolve();
});
});
}
/**
* Clears form validation errors and resets all form values to defaults
* @param {string|jQuery} form_selector - jQuery selector or jQuery object for form element
*/
static reset(form_selector) {
const $form = typeof form_selector === 'string' ? $(form_selector) : form_selector;
Form_Utils.reset_form_errors(form_selector);
$form.trigger('reset');
}
/**
* Serializes form data into key-value object
* Returns all input elements with name attributes as object properties
* @param {string|jQuery} form_selector - jQuery selector or jQuery object for form element
* @returns {Object} Form data as key-value pairs
*/
static serialize(form_selector) {
const $form = typeof form_selector === 'string' ? $(form_selector) : form_selector;
const data = {};
$form.serializeArray().forEach(item => {
data[item.name] = item.value;
});
return data;
}
/**
* Submits form to RSX controller action via AJAX
* @param {string|jQuery} form_selector - jQuery selector or jQuery object for form element
* @param {string} controller - Controller class name (e.g., 'User_Controller')
* @param {string} action - Action method name (e.g., 'save_profile')
* @param {Object} options - Optional configuration {on_success: fn, on_error: fn}
* @returns {Promise} Promise that resolves with response data
*/
static async ajax_submit(form_selector, controller, action) {
let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
const $form = typeof form_selector === 'string' ? $(form_selector) : form_selector;
const form_data = Form_Utils.serialize($form);
Form_Utils.reset_form_errors(form_selector);
try {
const response = await Ajax.call(controller, action, form_data);
if (options.on_success) {
options.on_success(response);
}
return response;
} catch (error) {
if (error.type === 'form_error' && error.details) {
await Form_Utils.apply_form_errors(form_selector, error.details);
} else {
await Form_Utils.apply_form_errors(form_selector, error.message || 'An error occurred');
}
if (options.on_error) {
options.on_error(error);
}
throw error;
}
}
/**
* Removes form validation errors
* @param {string} parent_selector - jQuery selector for parent element
*/
static reset_form_errors(parent_selector) {
const $parent = $(parent_selector);
// Remove flash messages
$('.flash-messages').remove();
// Remove alert-danger messages
$parent.find('.alert-danger').remove();
// Remove validation error classes and text from form elements
$parent.find('.is-invalid').removeClass('is-invalid');
$parent.find('.invalid-feedback').remove();
}
// ------------------------
/**
* Normalizes error input into standard formats
* @param {string|Object|Array} errors - Raw error input
* @returns {Object} Normalized errors as {type: 'string'|'array'|'fields', data: ...}
* @private
*/
static _normalize_errors(errors) {
// Handle null/undefined
if (!errors) {
return {
type: 'string',
data: 'An error has occurred'
};
}
// Handle string
if (typeof errors === 'string') {
return {
type: 'string',
data: errors
};
}
// Handle array
if (Array.isArray(errors)) {
// Array of strings - general errors
if (errors.every(e => typeof e === 'string')) {
return {
type: 'array',
data: errors
};
}
// Array with object as first element - extract it
if (errors.length > 0 && typeof errors[0] === 'object') {
return Form_Utils._normalize_errors(errors[0]);
}
// Empty or mixed array
return {
type: 'array',
data: []
};
}
// Handle object - check for Laravel response wrapper
if (typeof errors === 'object') {
// Unwrap {errors: {...}} or {error: {...}}
const unwrapped = errors.errors || errors.error;
if (unwrapped) {
return Form_Utils._normalize_errors(unwrapped);
}
// Convert Laravel validator format {field: [msg1, msg2]} to {field: msg1}
const normalized = {};
for (const field in errors) {
if (errors.hasOwnProperty(field)) {
const value = errors[field];
if (Array.isArray(value) && value.length > 0) {
normalized[field] = value[0];
} else if (typeof value === 'string') {
normalized[field] = value;
} else {
normalized[field] = String(value);
}
}
}
return {
type: 'fields',
data: normalized
};
}
// Final catch-all*
return {
type: 'string',
data: String(errors)
};
}
/**
* Removes duplicate error messages from array or object values
* @param {Array|Object} errors - Errors to deduplicate
* @returns {Array|Object} Deduplicated errors
* @private
*/
static _deduplicate_errors(errors) {
if (Array.isArray(errors)) {
return [...new Set(errors)];
}
if (typeof errors === 'object') {
const seen = new Set();
const result = {};
for (const key in errors) {
const value = errors[key];
if (!seen.has(value)) {
seen.add(value);
result[key] = value;
}
}
return result;
}
return errors;
}
/**
* Applies field-specific validation errors to form inputs
* @param {jQuery} $parent - Parent element containing form
* @param {Object} field_errors - Object mapping field names to error messages
* @returns {Object} Object containing {animations: Array, unmatched: Object}
* @private
*/
static _apply_field_errors($parent, field_errors) {
const animations = [];
const unmatched = {};
for (const field_name in field_errors) {
const error_message = field_errors[field_name];
const $input = $parent.find(`[name="${field_name}"]`);
if (!$input.length) {
unmatched[field_name] = error_message;
continue;
}
const $error = $('<div class="invalid-feedback"></div>').html(error_message);
const $target = $input.closest('.form-group, .form-check, .input-group');
if (!$target.length) {
unmatched[field_name] = error_message;
continue;
}
$input.addClass('is-invalid');
$error.appendTo($target);
animations.push($error.hide().fadeIn(300).promise());
}
return {
animations,
unmatched
};
}
/**
* Applies combined error message with summary and unmatched field errors
* @param {jQuery} $parent - Parent element containing form
* @param {string} summary_msg - Summary message (e.g., "Please correct the errors below")
* @param {Object} unmatched_errors - Object of field errors that couldn't be matched to fields
* @returns {Array} Array of animation promises
* @private
*/
static _apply_combined_error($parent, summary_msg, unmatched_errors) {
const animations = [];
const $error_container = $parent.find('[data-id="error_container"]').first();
const $target = $error_container.length > 0 ? $error_container : $parent;
// Create alert with summary message and bulleted list of unmatched errors
const $alert = $('<div class="alert alert-danger" role="alert"></div>');
// Add summary message if provided
if (summary_msg) {
$('<p class="mb-2"></p>').text(summary_msg).appendTo($alert);
}
// Add unmatched errors as bulleted list
if (Object.keys(unmatched_errors).length > 0) {
const $list = $('<ul class="mb-0"></ul>');
for (const field_name in unmatched_errors) {
const error_msg = unmatched_errors[field_name];
$('<li></li>').html(error_msg).appendTo($list);
}
$list.appendTo($alert);
}
if ($error_container.length > 0) {
animations.push($alert.hide().appendTo($target).fadeIn(300).promise());
} else {
animations.push($alert.hide().prependTo($target).fadeIn(300).promise());
}
return animations;
}
/**
* Applies general error messages as alert box
* @param {jQuery} $parent - Parent element to prepend alert to
* @param {string|Array} messages - Error message(s) to display
* @returns {Array} Array of animation promises
* @private
*/
static _apply_general_errors($parent, messages) {
const animations = [];
// Look for a specific error container div (e.g., in Rsx_Form component)
const $error_container = $parent.find('[data-id="error_container"]').first();
const $target = $error_container.length > 0 ? $error_container : $parent;
if (typeof messages === 'string') {
// Single error - simple alert without list
const $alert = $('<div class="alert alert-danger" role="alert"></div>').text(messages);
if ($error_container.length > 0) {
animations.push($alert.hide().appendTo($target).fadeIn(300).promise());
} else {
animations.push($alert.hide().prependTo($target).fadeIn(300).promise());
}
} else if (Array.isArray(messages) && messages.length > 0) {
// Multiple errors - bulleted list
const $alert = $('<div class="alert alert-danger" role="alert"><ul class="mb-0"></ul></div>');
const $list = $alert.find('ul');
messages.forEach(msg => {
const text = (msg + '').trim() || 'An error has occurred';
$('<li></li>').html(text).appendTo($list);
});
if ($error_container.length > 0) {
animations.push($alert.hide().appendTo($target).fadeIn(300).promise());
} else {
animations.push($alert.hide().prependTo($target).fadeIn(300).promise());
}
} else if (typeof messages === 'object' && !Array.isArray(messages)) {
// Object of unmatched field errors - convert to array
const error_list = Object.values(messages).map(v => String(v).trim()).filter(v => v);
if (error_list.length > 0) {
return Form_Utils._apply_general_errors($parent, error_list);
}
}
return animations;
}
/**
* Calculates the total height of fixed/sticky headers at the top of the page
* @returns {number} Total height in pixels of fixed top elements
* @private
*/
static _get_fixed_header_height() {
let total_height = 0;
// Find all fixed or sticky positioned elements
$('*').each(function () {
const $el = $(this);
const position = $el.css('position');
// Only check fixed or sticky elements
if (position !== 'fixed' && position !== 'sticky') {
return;
}
// Check if element is positioned at or near the top
const top = parseInt($el.css('top')) || 0;
if (top > 50) {
return; // Not a top header
}
// Check if element is visible
if (!$el.is(':visible')) {
return;
}
// Check if element spans significant width (likely a header/navbar)
const width = $el.outerWidth();
const viewport_width = $(window).width();
if (width < viewport_width * 0.5) {
return; // Too narrow to be a header
}
// Add this element's height
total_height += $el.outerHeight();
});
return total_height;
}
}
/* === app/RSpade/Core/Js/Debugger.js (babel) === */
"use strict";
function _27e0e986_defineProperty(e, r, t) { return (r = _27e0e986_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _27e0e986_toPropertyKey(t) { var i = _27e0e986_toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
function _27e0e986_toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
/**
* Debugger class for console_debug and browser error logging
* Handles batched submission to server when configured
*/
class Debugger {
/**
* Initialize framework error handling
* Called during framework initialization
*/
static _on_framework_core_init() {
// Check if browser error logging is enabled
if (window.rsxapp && window.rsxapp.log_browser_errors) {
// Register global error handler
window.addEventListener('error', function (event) {
Debugger._handle_browser_error({
message: event.message,
filename: event.filename,
lineno: event.lineno,
colno: event.colno,
stack: event.error ? event.error.stack : null,
type: 'error'
});
});
// Register unhandled promise rejection handler
window.addEventListener('unhandledrejection', function (event) {
Debugger._handle_browser_error({
message: event.reason ? event.reason.message || String(event.reason) : 'Unhandled promise rejection',
stack: event.reason && event.reason.stack ? event.reason.stack : null,
type: 'unhandledrejection'
});
});
}
// Register ui refresh handler
Rsx.on('refresh', Debugger.on_refresh);
}
// In dev mode, some ui elements can be automatically applied to assist with development
static on_refresh() {
if (!Rsx.is_prod()) {
// Add an underline 2 px blue to all a tags with href === "#" using jquery
// Todo: maybe this should be a configurable debug option?
// $('a[href="#"]').css({
// 'border-bottom': '2px solid blue',
// 'text-decoration': 'none'
// });
}
}
/**
* JavaScript implementation of console_debug
* Mirrors PHP functionality with batching for Laravel log
*/
static console_debug(channel) {
// Check if console_debug is enabled
if (!window.rsxapp || !window.rsxapp.console_debug || !window.rsxapp.console_debug.enabled) {
return;
}
const config = window.rsxapp.console_debug;
// Normalize channel name
channel = String(channel).toUpperCase().replace(/[\[\]]/g, '');
// Apply filtering
if (config.filter_mode === 'specific') {
const specific = config.specific_channel;
if (specific) {
// Split comma-separated values and normalize
const channels = specific.split(',').map(c => c.trim().toUpperCase());
if (!channels.includes(channel)) {
return;
}
}
} else if (config.filter_mode === 'whitelist') {
const whitelist = (config.filter_channels || []).map(c => c.toUpperCase());
if (!whitelist.includes(channel)) {
return;
}
} else if (config.filter_mode === 'blacklist') {
const blacklist = (config.filter_channels || []).map(c => c.toUpperCase());
if (blacklist.includes(channel)) {
return;
}
}
// Prepare the message
for (var _len = arguments.length, values = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
values[_key - 1] = arguments[_key];
}
let message = {
channel: channel,
values: values,
timestamp: new Date().toISOString()
};
// Add location if configured
if (config.include_location || config.include_backtrace) {
const error = new Error();
const stack = error.stack || '';
const stackLines = stack.split('\n');
if (config.include_location && stackLines.length > 2) {
// Skip Error line and this function
const callerLine = stackLines[2] || '';
const match = callerLine.match(/at\s+.*?\s+\((.*?):(\d+):(\d+)\)/) || callerLine.match(/at\s+(.*?):(\d+):(\d+)/);
if (match) {
message.location = `${match[1]}:${match[2]}`;
}
}
if (config.include_backtrace) {
// Include first 5 stack frames, skipping this function
message.backtrace = stackLines.slice(2, 7).map(line => line.trim()).filter(line => line);
}
}
// Output to browser console if enabled
if (config.outputs && config.outputs.browser) {
const prefix = config.include_benchmark ? `[${Debugger._get_time_prefix()}] ` : '';
const channelPrefix = `[${channel}]`;
// Use appropriate console method based on channel
let consoleMethod = 'log';
if (channel.includes('ERROR')) consoleMethod = 'error';else if (channel.includes('WARN')) consoleMethod = 'warn';else if (channel.includes('INFO')) consoleMethod = 'info';
console[consoleMethod](prefix + channelPrefix, ...values);
}
// Batch for Laravel log if enabled
if (config.outputs && config.outputs.laravel_log) {
Debugger._batch_console_message(message);
}
}
/**
* Log an error to the server
* Used manually or by Ajax error handling
*/
static log_error(error) {
// Check if browser error logging is enabled
if (!window.rsxapp || !window.rsxapp.log_browser_errors) {
return;
}
// Normalize error format
let errorData = {};
if (typeof error === 'string') {
errorData.message = error;
errorData.type = 'manual';
} else if (error instanceof Error) {
errorData.message = error.message;
errorData.stack = error.stack;
errorData.type = 'exception';
} else if (error && typeof error === 'object') {
errorData = error;
if (!errorData.type) {
errorData.type = 'manual';
}
}
Debugger._handle_browser_error(errorData);
}
/**
* Internal: Handle browser errors with batching
*/
static _handle_browser_error(errorData) {
// Check limits
if (Debugger._error_count >= Debugger.MAX_ERRORS_PER_PAGE) {
return;
}
if (Debugger._error_batch_count >= Debugger.MAX_ERROR_BATCHES) {
return;
}
Debugger._error_count++;
// Add metadata
errorData.url = window.location.href;
errorData.userAgent = navigator.userAgent;
errorData.timestamp = new Date().toISOString();
// Add to batch
Debugger._error_batch.push(errorData);
// Clear existing timer
if (Debugger._error_timer) {
clearTimeout(Debugger._error_timer);
}
// Set debounce timer
Debugger._error_timer = setTimeout(() => {
Debugger._flush_error_batch();
}, Debugger.DEBOUNCE_MS);
}
/**
* Internal: Batch console_debug messages for Laravel log
*/
static _batch_console_message(message) {
Debugger._console_batch.push(message);
// Clear existing timer
if (Debugger._console_timer) {
clearTimeout(Debugger._console_timer);
}
// Set debounce timer
Debugger._console_timer = setTimeout(() => {
Debugger._flush_console_batch();
}, Debugger.DEBOUNCE_MS);
}
/**
* Internal: Flush console_debug batch to server
*/
static async _flush_console_batch() {
if (Debugger._console_batch.length === 0) {
return;
}
const messages = Debugger._console_batch;
Debugger._console_batch = [];
Debugger._console_timer = null;
try {
return Ajax.call(Rsx.Route('Debugger_Controller', 'log_console_messages'), {
messages: messages
});
} catch (error) {
// Silently fail - don't create error loop
console.error('Failed to send console_debug messages to server:', error);
}
}
/**
* Internal: Flush error batch to server
*/
static async _flush_error_batch() {
if (Debugger._error_batch.length === 0) {
return;
}
const errors = Debugger._error_batch;
Debugger._error_batch = [];
Debugger._error_timer = null;
Debugger._error_batch_count++;
try {
return Ajax.call(Rsx.Route('Debugger_Controller', 'log_browser_errors'), {
errors: errors
});
} catch (error) {
// Silently fail - don't create error loop
console.error('Failed to send browser errors to server:', error);
}
}
/**
* Internal: Get time prefix for benchmarking
*/
static _get_time_prefix() {
const now = Date.now();
if (!Debugger._start_time) {
Debugger._start_time = now;
}
const elapsed = now - Debugger._start_time;
return (elapsed / 1000).toFixed(3) + 's';
}
}
// Batching state for console_debug messages
_27e0e986_defineProperty(Debugger, "_console_batch", []);
_27e0e986_defineProperty(Debugger, "_console_timer", null);
_27e0e986_defineProperty(Debugger, "_console_batch_count", 0);
// Batching state for error messages
_27e0e986_defineProperty(Debugger, "_error_batch", []);
_27e0e986_defineProperty(Debugger, "_error_timer", null);
_27e0e986_defineProperty(Debugger, "_error_count", 0);
_27e0e986_defineProperty(Debugger, "_error_batch_count", 0);
// Constants
_27e0e986_defineProperty(Debugger, "DEBOUNCE_MS", 2000);
_27e0e986_defineProperty(Debugger, "MAX_ERRORS_PER_PAGE", 20);
_27e0e986_defineProperty(Debugger, "MAX_ERROR_BATCHES", 5);
// Store start time for benchmarking
_27e0e986_defineProperty(Debugger, "_start_time", null);
/* === app/RSpade/Core/Js/Rsx_Jq_Helpers.js (babel) === */
"use strict";
// @JS-THIS-01-EXCEPTION
/**
* jQuery helper extensions for the RSX framework
* These extensions add utility methods to jQuery's prototype
* Note: 'this' references in jQuery extensions refer to jQuery objects by design
*/
class Rsx_Jq_Helpers {
/**
* Initialize jQuery extensions when the framework core is defined
* This method is called during framework initialization
*/
static _on_framework_core_define() {
// Returns true if jquery selector matched an element
$.fn.exists = function () {
return this.length > 0;
};
// Returns true if jquery element is visible
$.fn.is_visible = function () {
return this.is(':visible');
};
// Scrolls to the target element, only scrolls up. Todo: Create a version
// of this that also scrolls only down, or both
$.fn.scroll_up_to = function () {
let speed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
if (!this.exists()) {
// console.warn("Could not find target element to scroll to");
return;
}
if (!this.is_in_dom()) {
// console.warn("Target element for scroll is not on dom");
return;
}
let e_top = Math.round(this.offset().top);
let s_top = $('body').scrollTop();
if (e_top < 0) {
let target = s_top + e_top;
$('html, body').animate({
scrollTop: target
}, speed);
}
};
// $().is(":focus") - check if element has focus
$.expr[':'].focus = function (elem) {
return elem === document.activeElement && (elem.type || elem.href);
};
// Save native click behavior before override
$.fn._click_native = $.fn.click;
// Override .click() to call preventDefault by default
// This prevents accidental page navigation/form submission - the correct behavior 95% of the time
$.fn.click = function (handler) {
// If no handler provided, trigger click event (jQuery .click() with no args)
if (typeof handler === 'undefined') {
return this._click_native();
}
// Attach click handler with automatic preventDefault
return this.on('click', function (e) {
// Save original preventDefault
const original_preventDefault = e.preventDefault.bind(e);
// Override preventDefault to show warning when called explicitly
e.preventDefault = function () {
console.warn('event.preventDefault() is called automatically by RSpade .click() handlers and can be removed.');
return original_preventDefault();
};
// Call preventDefault before handler
original_preventDefault();
return handler.call(this, e);
});
};
// Escape hatch: click handler without preventDefault for the 5% case
$.fn.click_allow_default = function (handler) {
if (typeof handler === 'undefined') {
return this._click_native();
}
return this._click_native(handler);
};
// Returns true if the jquery element exists in and is attached to the DOM
$.fn.is_in_dom = function () {
let $element = this;
let _ancestor = function (HTMLobj) {
while (HTMLobj.parentElement) {
HTMLobj = HTMLobj.parentElement;
}
return HTMLobj;
};
return _ancestor($element[0]) === document.documentElement;
};
// Returns true if the element is visible in the viewport
$.fn.is_in_viewport = function () {
let scrolltop = $(window).scrollTop() > 0 ? $(window).scrollTop() : $('body').scrollTop();
let $element = this;
const top_of_element = $element.offset().top;
const bottom_of_element = $element.offset().top + $element.outerHeight();
const bottom_of_screen = scrolltop + $(window).innerHeight();
const top_of_screen = scrolltop;
if (bottom_of_screen > top_of_element && top_of_screen < bottom_of_element) {
return true;
} else {
return false;
}
};
// Gets the tagname of a jquery element
$.fn.tagname = function () {
return this.prop('tagName').toLowerCase();
};
// Returns true if a href is not same domain
$.fn.is_external = function () {
const host = window.location.host;
const link = $('<a>', {
href: this.attr('href')
})[0].hostname;
return link !== host;
};
// HTML5 form validation wrappers
$.fn.checkValidity = function () {
if (this.length === 0) return false;
return this[0].checkValidity();
};
$.fn.reportValidity = function () {
if (this.length === 0) return false;
return this[0].reportValidity();
};
$.fn.requestSubmit = function () {
if (this.length === 0) return this;
this[0].requestSubmit();
return this;
};
// Find related components by searching up the ancestor tree
// Like .closest() but searches within ancestors instead of matching them
$.fn.closest_sibling = function (selector) {
let $current = this;
let $parent = $current.parent();
// Keep going up the tree until we hit body
while ($parent.length > 0 && !$parent.is('body')) {
// Search within this parent for the selector
let $found = $parent.find(selector);
if ($found.length > 0) {
return $found;
}
// Move up one level
$parent = $parent.parent();
}
// If we reached body, search within body as well
if ($parent.is('body')) {
let $found = $parent.find(selector);
if ($found.length > 0) {
return $found;
}
}
// Return empty jQuery object if nothing found
return $();
};
// Override $.ajax to prevent direct AJAX calls to local server
// Developers must use the Ajax endpoint pattern: await Controller.method(params)
const native_ajax = $.ajax;
$.ajax = function (url, options) {
// Handle both $.ajax(url, options) and $.ajax(options) signatures
let settings;
if (typeof url === 'string') {
settings = options || {};
settings.url = url;
} else {
settings = url || {};
}
// Check if this is a local request (relative URL or same domain)
const request_url = settings.url || '';
const is_relative = !request_url.match(/^https?:\/\//);
const is_same_domain = request_url.startsWith(window.location.origin);
const is_local_request = is_relative || is_same_domain;
// Allow framework Ajax.call() to function
if (settings.__local_integration === true) {
return native_ajax.call(this, settings);
}
// Allow file upload endpoint - requires native $.ajax for FormData support
const is_file_upload = request_url === '/_upload' || request_url.endsWith('/_upload');
if (is_file_upload) {
return native_ajax.call(this, settings);
}
// Block local AJAX requests that don't use the Ajax endpoint pattern
if (is_local_request) {
// Try to parse controller and action from URL
let controller_name = null;
let action_name = null;
const url_match = request_url.match(/\/_rsx_api\/([^\/]+)\/([^\/\?]+)/);
if (url_match) {
controller_name = url_match[1];
action_name = url_match[2];
}
let error_message = 'AJAX requests to localhost via $.ajax() are prohibited.\n\n';
if (controller_name && action_name) {
error_message += `Instead of:\n`;
error_message += ` $.ajax({url: '${request_url}', ...})\n\n`;
error_message += `Use:\n`;
error_message += ` await ${controller_name}.${action_name}(parameters)\n\n`;
} else {
error_message += `Use the Ajax endpoint pattern:\n`;
error_message += ` await Controller_Name.action_name(parameters)\n\n`;
}
error_message += `The controller method must have the #[Ajax_Endpoint] attribute.`;
shouldnt_happen(error_message);
}
// Allow external requests (different domain)
return native_ajax.call(this, settings);
};
}
}
/* === app/RSpade/Core/Js/Rsx.js (babel) === */
"use strict";
function _e8211f5b_defineProperty(e, r, t) { return (r = _e8211f5b_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _e8211f5b_toPropertyKey(t) { var i = _e8211f5b_toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
function _e8211f5b_toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
// @ROUTE-EXISTS-01-EXCEPTION - This file contains documentation examples with fictional route names
/**
* Rsx - Core JavaScript Runtime System
*
* The Rsx class is the central hub for the RSX JavaScript runtime, providing essential
* system-level utilities that all other framework components depend on. It serves as the
* foundation for the client-side framework, handling core operations that must be globally
* accessible and consistently available.
*
* Core Responsibilities:
* - Event System: Application-wide event bus for framework lifecycle and custom events
* - Environment Detection: Runtime environment identification (dev/production)
* - Route Management: Type-safe route generation and URL building
* - Unique ID Generation: Client-side unique identifier generation
* - Framework Bootstrap: Multi-phase initialization orchestration
* - Logging: Centralized logging interface (delegates to console_debug)
*
* The Rsx class deliberately keeps its scope limited to core utilities. Advanced features
* are delegated to specialized classes:
* - Manifest operations → Manifest class
* - Caching → Rsx_Cache class
* - AJAX/API calls → Ajax_* classes
* - Route proxies → Rsx_Route_Proxy class
* - Behaviors → Rsx_Behaviors class
*
* All methods are static - Rsx is never instantiated. It's available globally from the
* moment bundles load and remains constant throughout the application lifecycle.
*
* Usage Examples:
* ```javascript
* // Event system
* Rsx.on('app_ready', () => console.log('App initialized'));
* Rsx.trigger('custom_event', {data: 'value'});
*
* // Environment detection
* if (Rsx.is_dev()) { console.log('Development mode'); }
*
* // Route generation
* const url = Rsx.Route('Controller', 'action').url();
*
* // Unique IDs
* const uniqueId = Rsx.uid(); // e.g., "rsx_1234567890_1"
* ```
*
* @static
* @global
*/
class Rsx {
// Initialize event handlers storage
static _init_events() {
if (typeof Rsx._event_handlers === 'undefined') {
Rsx._event_handlers = {};
}
if (typeof Rsx._triggered_events === 'undefined') {
Rsx._triggered_events = {};
}
}
// Register an event handler
static on(event, callback) {
Rsx._init_events();
if (typeof callback !== 'function') {
throw new Error('Callback must be a function');
}
if (!Rsx._event_handlers[event]) {
Rsx._event_handlers[event] = [];
}
Rsx._event_handlers[event].push(callback);
// If this event was already triggered, call the callback immediately
if (Rsx._triggered_events[event]) {
console_debug('RSX_INIT', 'Triggering ' + event + ' for late registered callback');
callback(Rsx._triggered_events[event]);
}
}
// Trigger an event with optional data
static trigger(event) {
let data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
Rsx._init_events();
// Record that this event was triggered
Rsx._triggered_events[event] = data;
if (!Rsx._event_handlers[event]) {
return;
}
console_debug('RSX_INIT', 'Triggering ' + event + ' for ' + Rsx._event_handlers[event].length + ' callbacks');
// Call all registered handlers for this event in order
for (const callback of Rsx._event_handlers[event]) {
callback(data);
}
}
// Alias for trigger.refresh(''), should be called after major UI updates to apply such effects as
// underlining links to unimplemented # routes
static trigger_refresh() {
// Use Rsx.on('refresh', callback); to register a callback for refresh
this.trigger('refresh');
}
// Log to server that an event happened
static log(type) {
let message = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'notice';
Core_Log.log(type, message);
}
// Returns true if the app is being run in dev mode
// This should affect caching and some debug checks
static is_dev() {
return window.rsxapp.debug;
}
static is_prod() {
return !window.rsxapp.debug;
}
// Generates a unique number for the application instance
static uid() {
if (typeof Rsx._uid == undef) {
Rsx._uid = 0;
}
return Rsx._uid++;
}
// Storage for route definitions loaded from bundles
/**
* Define routes from bundled data
* Called by generated JavaScript in bundles
*/
static _define_routes(routes) {
// Merge routes into the global route storage
for (const class_name in routes) {
if (!Rsx._routes[class_name]) {
Rsx._routes[class_name] = {};
}
for (const method_name in routes[class_name]) {
Rsx._routes[class_name][method_name] = routes[class_name][method_name];
}
}
}
/**
* Generate URL for a controller route
*
* This method generates URLs for controller actions by looking up route patterns
* and replacing parameters. It handles both regular routes and Ajax endpoints.
*
* If the route is not found in the route definitions, a default pattern is used:
* `/_/{controller}/{action}` with all parameters appended as query strings.
*
* Usage examples:
* ```javascript
* // Simple route without parameters (defaults to 'index' action)
* const url = Rsx.Route('Frontend_Index_Controller');
* // Returns: /dashboard
*
* // Route with explicit action
* const url = Rsx.Route('Frontend_Index_Controller', 'index');
* // Returns: /dashboard
*
* // Route with integer parameter (sets 'id')
* const url = Rsx.Route('Frontend_Client_View_Controller', 'view', 123);
* // Returns: /clients/view/123
*
* // Route with named parameters (object)
* const url = Rsx.Route('Frontend_Client_View_Controller', 'view', {id: 'C001'});
* // Returns: /clients/view/C001
*
* // Route with required and query parameters
* const url = Rsx.Route('Frontend_Client_View_Controller', 'view', {
* id: 'C001',
* tab: 'history'
* });
* // Returns: /clients/view/C001?tab=history
*
* // Route not found - uses default pattern
* const url = Rsx.Route('Unimplemented_Controller', 'some_action', {foo: 'bar'});
* // Returns: /_/Unimplemented_Controller/some_action?foo=bar
*
* // Placeholder route
* const url = Rsx.Route('Future_Controller', '#index');
* // Returns: #
* ```
*
* @param {string} class_name The controller class name (e.g., 'User_Controller')
* @param {string} [action_name='index'] The action/method name (defaults to 'index'). Use '#action' for placeholders.
* @param {number|Object} [params=null] Route parameters. Integer sets 'id', object provides named params.
* @returns {string} The generated URL
*/
static Route(class_name) {
let action_name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'index';
let params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
// Normalize params to object
let params_obj = {};
if (typeof params === 'number') {
params_obj = {
id: params
};
} else if (params && typeof params === 'object') {
params_obj = params;
} else if (params !== null && params !== undefined) {
throw new Error('Params must be number, object, or null');
}
// Placeholder route: action starts with # means unimplemented/scaffolding
if (action_name.startsWith('#')) {
return '#';
}
// Check if route exists in definitions
let pattern;
if (Rsx._routes[class_name] && Rsx._routes[class_name][action_name]) {
pattern = Rsx._routes[class_name][action_name];
} else {
// Route not found - use default pattern /_/{controller}/{action}
pattern = `/_/${class_name}/${action_name}`;
}
// Generate URL from pattern
return Rsx._generate_url_from_pattern(pattern, params_obj);
}
/**
* Generate URL from route pattern by replacing parameters
*
* @param {string} pattern The route pattern (e.g., '/users/:id/view')
* @param {Object} params Parameters to fill into the route
* @returns {string} The generated URL
*/
static _generate_url_from_pattern(pattern, params) {
// Extract required parameters from the pattern
const required_params = [];
const matches = pattern.match(/:([a-zA-Z_][a-zA-Z0-9_]*)/g);
if (matches) {
// Remove the : prefix from each match
for (const match of matches) {
required_params.push(match.substring(1));
}
}
// Check for required parameters
const missing = [];
for (const required of required_params) {
if (!(required in params)) {
missing.push(required);
}
}
if (missing.length > 0) {
throw new Error(`Required parameters [${missing.join(', ')}] are missing for route ${pattern}`);
}
// Build the URL by replacing parameters
let url = pattern;
const used_params = {};
for (const param_name of required_params) {
const value = params[param_name];
// URL encode the value
const encoded_value = encodeURIComponent(value);
url = url.replace(':' + param_name, encoded_value);
used_params[param_name] = true;
}
// Collect any extra parameters for query string
const query_params = {};
for (const key in params) {
if (!used_params[key]) {
query_params[key] = params[key];
}
}
// Append query string if there are extra parameters
if (Object.keys(query_params).length > 0) {
const query_string = Object.entries(query_params).map(_ref => {
let [key, value] = _ref;
return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
}).join('&');
url += '?' + query_string;
}
return url;
}
/**
* Internal: Call a specific method on all classes that have it
* Collects promises from return values and waits for all to resolve
* @param {string} method_name The method name to call on all classes
* @returns {Promise} Promise that resolves when all method calls complete
*/
static async _rsx_call_all_classes(method_name) {
const all_classes = Manifest.get_all_classes();
const classes_with_method = [];
const promise_pile = [];
for (const class_info of all_classes) {
const class_object = class_info.class_object;
const class_name = class_info.class_name;
// Check if this class has the method (static methods are on the class itself)
if (typeof class_object[method_name] === 'function') {
classes_with_method.push(class_name);
const return_value = await class_object[method_name]();
// Collect promises from return value
if (return_value instanceof Promise) {
promise_pile.push(return_value);
} else if (Array.isArray(return_value)) {
for (const item of return_value) {
if (item instanceof Promise) {
promise_pile.push(item);
}
}
}
if (Rsx.__stopped) {
return;
}
}
}
if (classes_with_method.length > 0) {
console_debug('RSX_INIT', `${method_name}: ${classes_with_method.length} classes`);
}
// Await all promises before returning
if (promise_pile.length > 0) {
console_debug('RSX_INIT', `${method_name}: Awaiting ${promise_pile.length} promises`);
await Promise.all(promise_pile);
}
}
/**
* Internal: Execute multi-phase initialization for all registered classes
* This runs various initialization phases in order to properly set up the application
* @returns {Promise} Promise that resolves when all initialization phases complete
*/
static async _rsx_core_boot() {
if (Rsx.__booted) {
console.error('Rsx._rsx_core_boot called more than once');
return;
}
Rsx.__booted = true;
// Get all registered classes from the manifest
const all_classes = Manifest.get_all_classes();
console_debug('RSX_INIT', `Starting _rsx_core_boot with ${all_classes.length} classes`);
if (!all_classes || all_classes.length === 0) {
// No classes to initialize
shouldnt_happen('No classes registered in js - there should be at least the core framework classes');
return;
}
// Define initialization phases in order
const phases = [{
event: 'framework_core_define',
method: '_on_framework_core_define'
}, {
event: 'framework_modules_define',
method: '_on_framework_modules_define'
}, {
event: 'framework_core_init',
method: '_on_framework_core_init'
}, {
event: 'app_modules_define',
method: 'on_app_modules_define'
}, {
event: 'app_define',
method: 'on_app_define'
}, {
event: 'framework_modules_init',
method: '_on_framework_modules_init'
}, {
event: 'app_modules_init',
method: 'on_app_modules_init'
}, {
event: 'app_init',
method: 'on_app_init'
}, {
event: 'app_ready',
method: 'on_app_ready'
}];
// Execute each phase in order
for (const phase of phases) {
await Rsx._rsx_call_all_classes(phase.method);
if (Rsx.__stopped) {
return;
}
Rsx.trigger(phase.event);
}
// Ui refresh callbacks
Rsx.trigger_refresh();
// All phases complete
console_debug('RSX_INIT', 'Initialization complete');
// TODO: Find a good wait to wait for all jqhtml components to load, then trigger on_ready and on('ready') emulating the top level last syntax that jqhtml components operateas, but as a standard js class (such as a page class). The biggest question is, how do we efficiently choose only the top level jqhtml components. do we only consider components cretaed directly on blade templates? that seams reasonable...
// Trigger _debug_ready event - this is ONLY for tooling like rsx:debug
// DO NOT use this in application code - use on_app_ready() phase instead
// This event exists solely for debugging tools that need to run after full initialization
Rsx.trigger('_debug_ready');
}
/* Calling this stops the boot process. */
static async _rsx_core_boot_stop(reason) {
console.error(reason);
Rsx.__stopped = true;
}
/**
* Parse URL hash into key-value object
* Handles format: #key=value&key2=value2
*
* @returns {Object} Parsed hash parameters
*/
static _parse_hash() {
const hash = window.location.hash;
if (!hash || hash === '#') {
return {};
}
// Remove leading # and parse as query string
const hash_string = hash.substring(1);
const params = {};
const pairs = hash_string.split('&');
for (const pair of pairs) {
const [key, value] = pair.split('=');
if (key) {
params[decodeURIComponent(key)] = value ? decodeURIComponent(value) : '';
}
}
return params;
}
/**
* Serialize object into URL hash format
* Produces format: #key=value&key2=value2
*
* @param {Object} params Key-value pairs to encode
* @returns {string} Encoded hash string (with leading #, or empty string)
*/
static _serialize_hash(params) {
const pairs = [];
for (const key in params) {
const value = params[key];
if (value !== null && value !== undefined && value !== '') {
pairs.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);
}
}
return pairs.length > 0 ? '#' + pairs.join('&') : '';
}
/**
* Get all page state from URL hash
*
* Usage:
* ```javascript
* const state = Rsx.get_all_page_state();
* // Returns: {dg_page: '2', dg_sort: 'name'}
* ```
*
* @returns {Object} All hash parameters as key-value pairs
*/
static get_all_page_state() {
return Rsx._parse_hash();
}
/**
* Get single value from URL hash state
*
* Usage:
* ```javascript
* const page = Rsx.get_page_state('dg_page');
* // Returns: '2' or null if not set
* ```
*
* @param {string} key The key to retrieve
* @returns {string|null} The value or null if not found
*/
static get_page_state(key) {
var _state$key;
const state = Rsx._parse_hash();
return (_state$key = state[key]) !== null && _state$key !== void 0 ? _state$key : null;
}
/**
* Set single value in URL hash state (replaces history, doesn't add)
*
* Usage:
* ```javascript
* Rsx.set_page_state('dg_page', 2);
* // URL becomes: http://example.com/page#dg_page=2
*
* Rsx.set_page_state('dg_page', null); // Remove key
* ```
*
* @param {string} key The key to set
* @param {string|number|null} value The value (null/empty removes the key)
*/
static set_page_state(key, value) {
const state = Rsx._parse_hash();
// Update or remove the key
if (value === null || value === undefined || value === '') {
delete state[key];
} else {
state[key] = String(value);
}
// Update URL without adding history
const new_hash = Rsx._serialize_hash(state);
const url = window.location.pathname + window.location.search + new_hash;
history.replaceState(null, '', url);
}
/**
* Set multiple values in URL hash state at once
*
* Usage:
* ```javascript
* Rsx.set_all_page_state({dg_page: 2, dg_sort: 'name'});
* // URL becomes: http://example.com/page#dg_page=2&dg_sort=name
* ```
*
* @param {Object} new_state Object with key-value pairs to set
*/
static set_all_page_state(new_state) {
const state = Rsx._parse_hash();
// Merge new state
for (const key in new_state) {
const value = new_state[key];
if (value === null || value === undefined || value === '') {
delete state[key];
} else {
state[key] = String(value);
}
}
// Update URL without adding history
const new_hash = Rsx._serialize_hash(state);
const url = window.location.pathname + window.location.search + new_hash;
history.replaceState(null, '', url);
}
/**
* Render an error in a DOM element
*
* Displays errors from Ajax calls in a standardized format. Handles different
* error types (fatal, validation, auth, generic) with appropriate formatting.
*
* Usage:
* ```javascript
* try {
* const result = await Controller.method();
* } catch (error) {
* Rsx.render_error(error, '#error_container');
* }
* ```
*
* @param {Error|Object} error - Error object from Ajax call
* @param {jQuery|string} container - jQuery element or selector for error display
*/
static render_error(error, container) {
const $container = $(container);
if (!$container.exists()) {
console.error('Rsx.render_error: Container not found', container);
return;
}
// Clear existing content
$container.empty();
let html = '';
// Handle different error types
if (error.type === 'fatal' && error.details) {
// Fatal PHP error with file/line/error
const details = error.details;
const file = details.file || 'Unknown file';
const line = details.line || '?';
const message = details.error || error.message || 'Fatal error occurred';
html = `
<div class="alert alert-danger" role="alert">
<h5>Uncaught Fatal Error in ${file}:${line}:</h5>
<p class="mb-0">${Rsx._escape_html(message)}</p>
</div>
`;
} else if (error.type === 'form_error' && error.details) {
// Validation errors - show unmatched errors only
// (matched errors should be handled by Form_Utils.apply_form_errors)
const errors = error.details;
const error_list = [];
for (const field in errors) {
error_list.push(errors[field]);
}
if (error_list.length > 0) {
html = `
<div class="alert alert-warning" role="alert">
<h5>Validation Errors:</h5>
<ul class="mb-0">
${error_list.map(err => `<li>${Rsx._escape_html(err)}</li>`).join('')}
</ul>
</div>
`;
}
} else if (error.type === 'auth_required' || error.type === 'unauthorized') {
// Authentication/authorization errors
const message = error.message || 'Authentication required';
html = `
<div class="alert alert-warning" role="alert">
<p class="mb-0">${Rsx._escape_html(message)}</p>
</div>
`;
} else if (error.type === 'network') {
// Network errors
const message = error.message || 'Unable to reach server. Please check your connection.';
html = `
<div class="alert alert-danger" role="alert">
<p class="mb-0">${Rsx._escape_html(message)}</p>
</div>
`;
} else {
// Generic/unknown error
const message = error.message || error.toString() || 'An unknown error occurred';
html = `
<div class="alert alert-danger" role="alert">
<p class="mb-0">${Rsx._escape_html(message)}</p>
</div>
`;
}
$container.html(html);
}
/**
* Escape HTML to prevent XSS in error messages
* @private
*/
static _escape_html(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
}
// Gets set to true to interupt startup sequence
_e8211f5b_defineProperty(Rsx, "__stopped", false);
_e8211f5b_defineProperty(Rsx, "_routes", {});
/* === app/RSpade/Core/Js/Ajax.js (babel) === */
"use strict";
// @FILE-SUBCLASS-01-EXCEPTION
/**
* Client-side Ajax class for making API calls to RSX controllers
*
* Automatically batches multiple calls into single HTTP requests to reduce network overhead.
* Batches up to 20 calls or flushes after setTimeout(0) debounce.
*/
class Ajax {
/**
* Initialize Ajax system
* Called automatically when class is loaded
*/
static _on_framework_core_init() {
// Queue of pending calls waiting to be batched
Ajax._pending_calls = {};
// Timer for batching flush
Ajax._flush_timeout = null;
// Call counter for generating unique call IDs
Ajax._call_counter = 0;
// Maximum batch size before forcing immediate flush
Ajax.MAX_BATCH_SIZE = 20;
// Debounce time in milliseconds
Ajax.DEBOUNCE_MS = 0;
// Track promises from Ajax calls to detect uncaught rejections
Ajax._tracked_promises = new WeakSet();
// Set up global unhandled rejection handler for Ajax errors
window.addEventListener('unhandledrejection', async event => {
// Only handle rejections from Ajax promises
if (Ajax._tracked_promises.has(event.promise)) {
event.preventDefault(); // Prevent browser's default "Uncaught (in promise)" error
const error = event.reason;
console.error('Uncaught Ajax error:', error);
// Show Modal.error() for uncaught Ajax errors
if (typeof Modal !== 'undefined' && Modal.error) {
await Modal.error(error, 'Uncaught Ajax Error');
}
}
});
}
/**
* Make an AJAX call to an RSX controller action
*
* All calls are automatically batched unless window.rsxapp.ajax_disable_batching is true.
*
* @param {string|object|function} url - The Ajax URL (e.g., '/_ajax/Controller_Name/action_name') or an object/function with a .path property
* @param {object} params - Parameters to send to the action
* @returns {Promise} - Resolves with the return value, rejects with error
*/
static async call(url) {
let params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
// If url is an object or function with a .path property, use that as the URL
if (url && typeof url === 'object' && url.path) {
url = url.path;
} else if (url && typeof url === 'function' && url.path) {
url = url.path;
}
// Validate url is a non-empty string
if (typeof url !== 'string' || url.length === 0) {
throw new Error('Ajax.call() requires a non-empty string URL or an object/function with a .path property');
}
// Extract controller and action from URL
const {
controller,
action
} = Ajax.ajax_url_to_controller_action(url);
console.log('Ajax:', controller, action, params);
// Check if batching is disabled for debugging
let promise;
if (window.rsxapp && window.rsxapp.ajax_disable_batching) {
promise = Ajax._call_direct(controller, action, params);
} else {
promise = Ajax._call_batch(controller, action, params);
}
// Track this promise for unhandled rejection detection
Ajax._tracked_promises.add(promise);
return promise;
}
/**
* Make a batched Ajax call
* @private
*/
static _call_batch(controller, action) {
let params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
console.log('Ajax Batch:', controller, action, params);
return new Promise((resolve, reject) => {
// Generate call key for deduplication
const call_key = Ajax._generate_call_key(controller, action, params);
// Check if this exact call is already pending
if (Ajax._pending_calls[call_key]) {
const existing_call = Ajax._pending_calls[call_key];
// If call already completed (cached), return immediately
if (existing_call.is_complete) {
if (existing_call.is_error) {
reject(existing_call.error);
} else {
resolve(existing_call.result);
}
return;
}
// Call is pending, add this promise to callbacks
existing_call.callbacks.push({
resolve,
reject
});
return;
}
// Create new pending call
const call_id = Ajax._call_counter++;
const pending_call = {
call_id: call_id,
call_key: call_key,
controller: controller,
action: action,
params: params,
callbacks: [{
resolve,
reject
}],
is_complete: false,
is_error: false,
result: null,
error: null
};
// Add to pending queue
Ajax._pending_calls[call_key] = pending_call;
// Count pending calls
const pending_count = Object.keys(Ajax._pending_calls).filter(key => !Ajax._pending_calls[key].is_complete).length;
// If we've hit the batch size limit, flush immediately
if (pending_count >= Ajax.MAX_BATCH_SIZE) {
clearTimeout(Ajax._flush_timeout);
Ajax._flush_timeout = null;
Ajax._flush_pending_calls();
} else {
// Schedule batch flush with debounce
clearTimeout(Ajax._flush_timeout);
Ajax._flush_timeout = setTimeout(() => {
Ajax._flush_pending_calls();
}, Ajax.DEBOUNCE_MS);
}
});
}
/**
* Make a direct (non-batched) Ajax call
* @private
*/
static async _call_direct(controller, action) {
let params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
// Construct URL from controller and action
const url = `/_ajax/${controller}/${action}`;
// Log the AJAX call using console_debug
if (typeof Debugger !== 'undefined' && Debugger.console_debug) {
Debugger.console_debug('AJAX', `Calling ${controller}.${action} (unbatched)`, params);
}
return new Promise((resolve, reject) => {
$.ajax({
url: url,
method: 'POST',
data: params,
dataType: 'json',
__local_integration: true,
// Bypass $.ajax override
success: response => {
// Handle console_debug messages
if (response.console_debug && Array.isArray(response.console_debug)) {
response.console_debug.forEach(msg => {
if (!Array.isArray(msg) || msg.length !== 2) {
throw new Error('Invalid console_debug message format - expected [channel, [arguments]]');
}
const [channel, args] = msg;
console.log(channel, ...args);
});
}
// Check if the response was successful
if (response._success === true) {
// @JS-AJAX-02-EXCEPTION - Unwrap server responses with _ajax_return_value
const processed_value = Rsx_Js_Model._instantiate_models_recursive(response._ajax_return_value);
resolve(processed_value);
} else {
// Handle error responses
const error_type = response.error_type || 'unknown_error';
const reason = response.reason || 'Unknown error occurred';
const details = response.details || {};
// Handle specific error types
switch (error_type) {
case 'fatal':
// Fatal PHP error with full error details
const fatal_error_data = response.error || {};
const error_message = fatal_error_data.error || 'Fatal error occurred';
console.error('Ajax error response from server:', response.error);
const fatal_error = new Error(error_message);
fatal_error.type = 'fatal';
fatal_error.details = response.error;
// Log to server if browser error logging is enabled
Debugger.log_error({
message: `Ajax Fatal Error: ${error_message}`,
type: 'ajax_fatal',
endpoint: url,
details: response.error
});
reject(fatal_error);
break;
case 'response_auth_required':
console.error('The user is no longer authenticated, this is a placeholder for future code which handles this scenario.');
const auth_error = new Error(reason);
auth_error.type = 'auth_required';
auth_error.details = details;
reject(auth_error);
break;
case 'response_unauthorized':
console.error('The user is unauthorized to perform this action, this is a placeholder for future code which handles this scenario.');
const unauth_error = new Error(reason);
unauth_error.type = 'unauthorized';
unauth_error.details = details;
reject(unauth_error);
break;
case 'response_form_error':
const form_error = new Error(reason);
form_error.type = 'form_error';
form_error.details = details;
reject(form_error);
break;
default:
const generic_error = new Error(reason);
generic_error.type = error_type;
generic_error.details = details;
reject(generic_error);
break;
}
}
},
error: (xhr, status, error) => {
const error_message = Ajax._extract_error_message(xhr);
const network_error = new Error(error_message);
network_error.type = 'network_error';
network_error.status = xhr.status;
network_error.statusText = status;
// Log server errors (500+) to the server if browser error logging is enabled
if (xhr.status >= 500) {
Debugger.log_error({
message: `Ajax Server Error ${xhr.status}: ${error_message}`,
type: 'ajax_server_error',
endpoint: url,
status: xhr.status,
statusText: status
});
}
reject(network_error);
}
});
});
}
/**
* Flush all pending calls by sending batch request
* @private
*/
static async _flush_pending_calls() {
// Collect all pending calls
const calls_to_send = [];
const call_map = {}; // Map call_id to pending_call object
for (const call_key in Ajax._pending_calls) {
const pending_call = Ajax._pending_calls[call_key];
if (!pending_call.is_complete) {
calls_to_send.push({
call_id: pending_call.call_id,
controller: pending_call.controller,
action: pending_call.action,
params: pending_call.params
});
call_map[pending_call.call_id] = pending_call;
}
}
// Nothing to send
if (calls_to_send.length === 0) {
return;
}
// Log batch for debugging
if (typeof Debugger !== 'undefined' && Debugger.console_debug) {
Debugger.console_debug('AJAX_BATCH', `Sending batch of ${calls_to_send.length} calls`, calls_to_send.map(c => `${c.controller}.${c.action}`));
}
try {
// Send batch request
const response = await $.ajax({
url: '/_ajax/_batch',
method: 'POST',
data: {
batch_calls: JSON.stringify(calls_to_send)
},
dataType: 'json',
__local_integration: true // Bypass $.ajax override
});
// Process batch response
// Response format: { C_0: {success, _ajax_return_value}, C_1: {...}, ... }
for (const response_key in response) {
if (!response_key.startsWith('C_')) {
continue;
}
const call_id = parseInt(response_key.substring(2), 10);
const call_response = response[response_key];
const pending_call = call_map[call_id];
if (!pending_call) {
console.error('Received response for unknown call_id:', call_id);
continue;
}
// Handle console_debug messages if present
if (call_response.console_debug && Array.isArray(call_response.console_debug)) {
call_response.console_debug.forEach(msg => {
if (!Array.isArray(msg) || msg.length !== 2) {
throw new Error('Invalid console_debug message format - expected [channel, [arguments]]');
}
const [channel, args] = msg;
console.log(channel, ...args);
});
}
// Mark call as complete
pending_call.is_complete = true;
// Check if successful
if (call_response._success === true) {
// @JS-AJAX-02-EXCEPTION - Batch system unwraps server responses with _ajax_return_value
const processed_value = Rsx_Js_Model._instantiate_models_recursive(call_response._ajax_return_value);
pending_call.result = processed_value;
// Resolve all callbacks
pending_call.callbacks.forEach(_ref => {
let {
resolve
} = _ref;
resolve(processed_value);
});
} else {
// Handle error
const error_type = call_response.error_type || 'unknown_error';
let error_message;
let error_details;
if (error_type === 'fatal' && call_response.error) {
// Fatal PHP error with full error details
const fatal_error_data = call_response.error;
error_message = fatal_error_data.error || 'Fatal error occurred';
error_details = call_response.error;
console.error('Ajax error response from server:', call_response.error);
} else {
// Other error types
error_message = call_response.reason || 'Unknown error occurred';
error_details = call_response.details || {};
}
const error = new Error(error_message);
error.type = error_type;
error.details = error_details;
pending_call.is_error = true;
pending_call.error = error;
// Reject all callbacks
pending_call.callbacks.forEach(_ref2 => {
let {
reject
} = _ref2;
reject(error);
});
}
}
} catch (xhr_error) {
// Network or server error - reject all pending calls
const error_message = Ajax._extract_error_message(xhr_error);
const error = new Error(error_message);
error.type = 'network_error';
for (const call_id in call_map) {
const pending_call = call_map[call_id];
pending_call.is_complete = true;
pending_call.is_error = true;
pending_call.error = error;
pending_call.callbacks.forEach(_ref3 => {
let {
reject
} = _ref3;
reject(error);
});
}
console.error('Batch Ajax request failed:', error_message);
}
}
/**
* Generate a unique key for deduplicating calls
* @private
*/
static _generate_call_key(controller, action, params) {
// Create a stable string representation of the call
// Sort params keys for consistent hashing
const sorted_params = {};
Object.keys(params).sort().forEach(key => {
sorted_params[key] = params[key];
});
return `${controller}::${action}::${JSON.stringify(sorted_params)}`;
}
/**
* Extract error message from jQuery XHR object
* @private
*/
static _extract_error_message(xhr) {
if (xhr.responseJSON && xhr.responseJSON.message) {
return xhr.responseJSON.message;
} else if (xhr.responseText) {
try {
const response = JSON.parse(xhr.responseText);
if (response.message) {
return response.message;
}
} catch (e) {
// Not JSON
}
}
return `${xhr.status}: ${xhr.statusText || 'Unknown error'}`;
}
/**
* Parses an AJAX URL into controller and action
* Supports both /_ajax/ and /_/ URL prefixes
* @param {string|object|function} url - URL in format '/_ajax/Controller_Name/action_name' or '/_/Controller_Name/action_name', or an object/function with a .path property
* @returns {Object} Object with {controller: string, action: string}
* @throws {Error} If URL doesn't start with /_ajax or /_ or has invalid structure
*/
static ajax_url_to_controller_action(url) {
// If url is an object or function with a .path property, use that as the URL
if (url && typeof url === 'object' && url.path) {
url = url.path;
} else if (url && typeof url === 'function' && url.path) {
url = url.path;
}
// Validate url is a string
if (typeof url !== 'string') {
throw new Error(`URL must be a string or have a .path property, got: ${typeof url}`);
}
if (!url.startsWith('/_ajax') && !url.startsWith('/_/')) {
throw new Error(`URL must start with /_ajax or /_, got: ${url}`);
}
const parts = url.split('/').filter(part => part !== '');
if (parts.length < 2) {
throw new Error(`Invalid AJAX URL structure: ${url}`);
}
if (parts.length > 3) {
throw new Error(`AJAX URL has too many segments: ${url}`);
}
const controller = parts[1];
const action = parts[2] || 'index';
return {
controller,
action
};
}
/**
* Auto-initialize static properties when class is first loaded
*/
static on_core_define() {
Ajax._on_framework_core_init();
}
}
/* === app/RSpade/Integrations/Jqhtml/Component.js (babel) === */
"use strict";
/**
* Component - Base class for JQHTML components in RSX framework
*
* This class wraps the jqhtml.Component from the npm package and provides
* the standard interface for RSX components following the Upper_Case naming convention.
*
* _Base_Jqhtml_Component is imported from npm via Jqhtml_Bundle.
*
* @Instantiatable
*/
class Component extends _Base_Jqhtml_Component {}
// RSX manifest automatically makes classes global - no manual assignment needed
/* === app/RSpade/Integrations/Jqhtml/Jqhtml_Integration.js (babel) === */
"use strict";
/**
* JQHTML Integration - Automatic component registration and binding
*
* This module automatically:
* 1. Registers component classes that extend Component
* 2. Binds templates to component classes when names match
* 3. Enables $(selector).component("Component_Name") syntax
*/
class Jqhtml_Integration {
/**
* Compiled Jqhtml templates self-register. The developer (the framework in this case) is still
* responsible for registering es6 component classes with jqhtml. This does so at an early stage
* of framework init.
*/
static _on_framework_modules_define() {
let jqhtml_components = Manifest.get_extending('Component');
console_debug('JQHTML_INIT', 'Registering ' + jqhtml_components.length + ' Jqhtml Components');
for (let component of jqhtml_components) {
jqhtml.register_component(component.class_name, component.class_object);
}
}
/**
* Framework modules init phase - Bind components and initialize DOM
* This runs after templates are registered to bind component classes
* @param {jQuery} [$scope] Optional scope to search within (defaults to body)
* @returns {Array<Promise>|undefined} Array of promises for recursive calls, undefined for top-level
*/
static _on_framework_modules_init($scope) {
const is_top_level = !$scope;
const promises = [];
const components_needing_init = ($scope || $('body')).find('.Component_Init');
if (components_needing_init.length > 0) {
console_debug('JQHTML_INIT', `Initializing ${components_needing_init.length} DOM components`);
}
components_needing_init.each(function () {
const $element = $(this);
// Skip if element is no longer attached to the document
// (may have been removed by a parent component's .empty() call)
if (!document.contains($element[0])) {
return;
}
// Check if any parent has Component_Init class - skip nested components
let parent = $element[0].parentElement;
while (parent) {
if (parent.classList.contains('Component_Init')) {
return; // Skip this element, it's nested
}
parent = parent.parentElement;
}
const component_name = $element.attr('data-component-init-name');
// jQuery's .data() doesn't auto-parse JSON - we need to parse it manually
let component_args = {};
const args_string = $element.attr('data-component-args');
// Unset component- php side initialization args, it is no longer needed as a compionent attribute
// Unsetting also prevents undesired access to this code in other parts of the program, prevening an
// unwanted future dependency on this paradigm
$element.removeAttr('data-component-init-name');
$element.removeAttr('data-component-args');
$element.removeData('component-init-name');
$element.removeData('component-args');
if (args_string) {
try {
component_args = JSON.parse(args_string);
} catch (e) {
console.error(`[JQHTML Integration] Failed to parse component args for ${component_name}:`, e);
component_args = {};
}
}
if (component_name) {
// Transform $ prefixed keys to data- attributes
let component_args_filtered = {};
for (const [key, value] of Object.entries(component_args)) {
// if (key.startsWith('$')) {
// component_args_filtered[key.substring(1)] = value;
// } else
if (key.startsWith('data-')) {
component_args_filtered[key.substring(5)] = value;
} else {
component_args_filtered[key] = value;
}
}
try {
// Store inner HTML as string for nested component processing
component_args_filtered._inner_html = $element.html();
$element.empty();
// Remove the init class before instantiation to prevent re-initialization
$element.removeClass('Component_Init');
// Create promise for this component's initialization
const component_promise = new Promise(resolve => {
// Use jQuery component plugin to create the component
// Plugin handles element internally, just pass args
// Get the updated $element from
let component = $element.component(component_name, component_args_filtered);
component.on('render', function () {
// Recursively collect promises from nested components
// Getting the updated component here - if the tag name was not div, the element would have been recreated, so we need to get the element set on the component, not from our earlier selector
const nested_promises = Jqhtml_Integration._on_framework_modules_init(component.$);
promises.push(...nested_promises);
// Resolve this component's promise
resolve();
}).$;
});
promises.push(component_promise);
} catch (error) {
console.error(`[JQHTML Integration] Failed to initialize component ${component_name}:`, error);
console.error('Error details:', error.stack || error);
}
}
});
// Top-level call: spawn async handler to wait for all promises, then trigger event
if (is_top_level) {
(async () => {
await Promise.all(promises);
await Rsx._rsx_call_all_classes('on_jqhtml_ready');
Rsx.trigger('jqhtml_ready');
})();
return;
}
// Recursive call: return promises for parent to collect
return promises;
}
/**
* Get all registered component names
* @returns {Array<string>} Array of component names
*/
static get_component_names() {
return jqhtml.get_component_names();
}
/**
* Check if a component is registered
* @param {string} name Component name
* @returns {boolean} True if component is registered
*/
static has_component(name) {
return jqhtml.has_component(name);
}
}
// RSX manifest automatically makes classes global - no manual assignment needed
/* === rsx/theme/components/datagrid/datagrid_abstract.js (babel) === */
"use strict";
/**
* DataGrid Component (Phase 1)
*
* Due to the more dynamic nature of this component, we are handling load / render lifecycles
* directly in this class rather than using the on_load lifecycle event
*
* **Features**:
* - Ajax data fetching
* - Sorting (click headers)
* - Pagination (next/prev/page select)
* - Row selection (checkboxes)
* - CSV export (selected rows, current page)
* - URL state synchronization
*
* **Usage**:
* ```html
* <Contacts_DataGrid $api="Frontend_Contacts_Controller" />
* ```
*
* **Required Args**:
* - `api` - Controller class name with datagrid_fetch() Ajax endpoint
*
* **Optional Args**:
* - `per_page` - Default rows per page (default: 25)
* - `sort` - Default sort column (default: first column)
* - `order` - Default sort order (default: 'asc')
*/
class DataGrid_Abstract extends Component {
// Initialize data before first render
on_create() {
let that = this;
// Initialize data state immediately so template can render
that.data.rows = [];
that.data.loading = true;
that.data.is_empty = false;
that.data.loaded = false;
that.data.total_pages = 0;
}
// Calls when datagrid first initialized
async on_ready() {
var _that$args$per_page, _that$args$sort, _that$args$order;
let that = this;
if (!that.args.data_source) {
console.error('Datagrid ' + that.component_name() + ' requires args.data_source set to a Ajax_Endpoint object');
return;
}
// Store defaults for later comparison
that.data.default_page = 1;
that.data.default_per_page = (_that$args$per_page = that.args.per_page) !== null && _that$args$per_page !== void 0 ? _that$args$per_page : 15;
that.data.default_sort = (_that$args$sort = that.args.sort) !== null && _that$args$sort !== void 0 ? _that$args$sort : null;
that.data.default_order = (_that$args$order = that.args.order) !== null && _that$args$order !== void 0 ? _that$args$order : 'asc';
that.data.default_filter = '';
// Set configured values
that.data.per_page = that.data.default_per_page;
// Initialize state from URL hash if present, otherwise use defaults
const hash_page = Rsx.get_page_state(that._cid + '_page');
const hash_sort = Rsx.get_page_state(that._cid + '_sort');
const hash_order = Rsx.get_page_state(that._cid + '_order');
const hash_filter = Rsx.get_page_state(that._cid + '_filter');
that.data.page = hash_page ? int(hash_page) : that.data.default_page;
that.data.sort = hash_sort || that.data.default_sort;
that.data.order = hash_order || that.data.default_order;
that.data.filter = hash_filter || that.data.default_filter;
that.register_render_callbacks();
that.register_filter_handlers();
// If hash had a filter value, populate the filter input
if (that.data.filter) {
const $filter = that.$sid('filter_input');
if ($filter && $filter.length > 0) {
$filter.val(that.data.filter);
}
}
// Measure row height and set fixed tbody height (all in one frame)
await that.measure_and_set_fixed_height();
// Fetch the initial page (respects hash state)
that.load_page(that.data.page);
}
// Update header only if sort/order changed
update_header() {
let that = this;
// Track last rendered state
if (!that._last_header_state) {
that._last_header_state = {};
}
const current = {
sort: that.data.sort,
order: that.data.order
};
// Only render if values changed
if (that._last_header_state.sort !== current.sort || that._last_header_state.order !== current.order) {
that._last_header_state = current;
that.id('datagrid_table_header').render();
}
}
// Update pagination only if values changed
update_pagination() {
let that = this;
// Track last rendered state
if (!that._last_pagination_state) {
that._last_pagination_state = {};
}
const current = {
page: that.data.page,
per_page: that.data.per_page,
total: that.data.total,
total_pages: that.data.total_pages
};
// Only render if values changed
if (that._last_pagination_state.page !== current.page || that._last_pagination_state.per_page !== current.per_page || that._last_pagination_state.total !== current.total || that._last_pagination_state.total_pages !== current.total_pages) {
that._last_pagination_state = current;
that.id('pagination_info').render();
that.id('pagination_controls').render();
}
}
// Load data for specified page and re-render data
async load_page(page) {
let that = this;
// Set loading state
that.data.loading = true;
that.data.page = page;
// Update UI with requested values (optimistic update)
that.update_header();
that.update_pagination();
// Only render loading state if no data yet (initial load)
if (that.data.rows.length === 0) {
that.id('datagrid_table_body').render();
}
const response = await Ajax.call(that.args.data_source, {
page: page,
per_page: that.data.per_page,
sort: that.data.sort,
order: that.data.order,
filter: that.data.filter
});
// Update data
that.data.loading = false;
that.data.loaded = true;
that.data.rows = response.records;
that.data.page = response.page;
that.data.per_page = response.per_page;
that.data.total = response.total;
that.data.total_pages = response.total_pages;
that.data.sort = response.sort;
that.data.order = response.order;
that.data.is_empty = response.records.length === 0;
// Persist state to URL hash for bookmarking/sharing
// Only set values that differ from defaults (null removes the key)
const state = {};
state[that._cid + '_page'] = that.data.page !== that.data.default_page ? that.data.page : null;
state[that._cid + '_sort'] = that.data.sort !== that.data.default_sort ? that.data.sort : null;
state[that._cid + '_order'] = that.data.order !== that.data.default_order ? that.data.order : null;
state[that._cid + '_filter'] = that.data.filter !== that.data.default_filter ? that.data.filter : null;
Rsx.set_all_page_state(state);
// Update UI with server response (only renders if changed)
that.id('datagrid_table_body').render();
that.update_header();
that.update_pagination();
// Scroll to top of datagrid if it's not currently visible
that.scroll_to_top_if_needed();
}
// The callbacks in this function fire after each targeted component re-renders
register_render_callbacks() {
let that = this;
// Attach row click handler - re-runs every time datagrid_table_body renders
that.id('datagrid_table_body').on('render', function () {
console.log('DGTB_R');
// Step 1: Wrap cells in data-href rows with anchor tags
$(this).find('tr[data-href]').each(function () {
let $row = $(this);
let href = $row.attr('data-href');
$row.find('td').each(function () {
// let $col = $(this);
// // Skip if cell already contains interactive elements
// if ($col.find('a, button, input, select, textarea').length > 0) {
// return;
// }
// // Wrap entire cell contents in an anchor (preserve DOM nodes for component lifecycle)
// let $anchor = $('<a>', {
// href: href,
// class: 'datagrid-row-link'
// });
// // Move existing child nodes into anchor (preserves components and their state)
// $col.contents().appendTo($anchor);
// // Add anchor to cell
// $col.append($anchor);
});
});
// Step 2: Find all cells with single anchor as only child and apply full-width styling
$(this).find('td').each(function () {
let $col = $(this);
let $children = $col.children();
// Check if cell contains exactly one direct child that is an anchor
if ($children.length === 1 && $children.first().is('a')) {
// Add class to transfer padding from cell to anchor
$col.addClass('has-full-link');
}
// Check if cell contains only text (no child elements)
else if ($children.length === 0) {
// Add class to apply vertical padding to text-only cells
$col.addClass('has-only-text');
}
});
});
// Attach sortable header click handler - re-runs every time datagrid_table_header renders
that.id('datagrid_table_header').on('render', function () {
// Transform th[data-sortby] elements by wrapping contents in clickable link
$(this).find('th[data-sortby]').each(function () {
let $th = $(this);
let sortby = $th.attr('data-sortby');
// TODO: Find out why this on('render') callback is being called twice/on already-processed HTML
// This unwrap logic shouldn't be necessary - template should render fresh each time
// For now, unwrap already-wrapped content to prevent double-wrapping
let $existing_link = $th.find('a.sortable-header');
let contents;
if ($existing_link.length > 0) {
// Unwrap - get the text content without the wrapper and arrows
contents = $existing_link.clone().find('i.bi').remove().end().html();
} else {
contents = $th.html();
}
// Build the arrow icon HTML if this column is currently sorted
let arrow = '';
if (that.data.sort === sortby) {
arrow = that.data.order === 'desc' ? '<i class="bi bi-chevron-up ms-1"></i>' : '<i class="bi bi-chevron-down ms-1"></i>';
}
// Replace contents with wrapped link (fresh wrapper every time)
$th.html(`<a href="#" class="sortable-header" data-sortby="${sortby}">${contents}${arrow}</a>`);
});
// Attach click handlers to the sortable links we just created
$(this).find('a.sortable-header[data-sortby]').on('click', function (e) {
e.preventDefault();
const sortby = $(this).attr('data-sortby');
that.sort_by(sortby);
});
});
// Attach pagination click handler - re-runs every time pagination_controls renders
that.id('pagination_controls').on('render', function () {
$(this).find('.page-link').on('click', function (e) {
e.preventDefault();
const $link = $(this);
const page = int($link.attr('data-page'));
// Ignore disabled/ellipsis clicks
if (!page || isNaN(page) || $link.parent().hasClass('disabled')) {
return;
}
// Load the requested page
that.load_page(page);
});
});
// Attach clear filter button handler - re-runs every time datagrid_table_body renders
that.id('datagrid_table_body').on('render', function () {
const $clear_btn = that.$sid('clear_filter_btn');
if ($clear_btn && $clear_btn.length > 0) {
$clear_btn.on('click', function (e) {
e.preventDefault();
that.clear_filter();
});
}
});
}
// Sort by specified column, toggling order if already sorted by that column
sort_by(column) {
let that = this;
// Toggle order if clicking same column, otherwise default to asc
if (that.data.sort === column) {
that.data.order = that.data.order === 'asc' ? 'desc' : 'asc';
} else {
that.data.sort = column;
that.data.order = 'asc';
}
// Reload current page with new sort
that.id('datagrid_table_header').render();
that.load_page(that.data.page);
}
// Register filter input handlers
register_filter_handlers() {
let that = this;
// Find filter input by common identifiers
let $filter = that.$sid('filter_input');
if (!$filter || $filter.length === 0) {
$filter = that.$.find('input[type="search"], input[type="text"].filter-input');
}
if ($filter && $filter.length > 0) {
$filter.on('input keyup', function () {
const filter_value = $(this).val();
that.filter_changed(filter_value);
});
}
}
filter_changed(filter) {
let that = this;
that.data.filter = filter;
that.load_page(1);
}
// Scroll to datagrid top if the top edge is not currently visible in viewport
scroll_to_top_if_needed() {
let that = this;
const $datagrid = that.$;
const datagridTop = $datagrid.offset().top;
const scrollTop = $(window).scrollTop();
// If datagrid top is above the current viewport, scroll to show it
if (datagridTop < scrollTop) {
// If datagrid is within 300px of page top, scroll to 0
if (datagridTop <= 300) {
window.scrollTo({
top: 0,
behavior: 'instant'
});
} else {
// Scroll to 20px above datagrid
window.scrollTo({
top: datagridTop - 20,
behavior: 'instant'
});
}
}
}
// Measure actual row height and set fixed tbody min-height
// All happens in one animation frame so user doesn't see it
async measure_and_set_fixed_height() {
let that = this;
// Wait for next animation frame to ensure DOM is ready
await sleep(0);
const $tbody = that.id('datagrid_table_body').$;
// Temporarily render a single measurement row
const $measurement_row = $('<tr>').css('visibility', 'hidden').html('<td>Measuring...</td>');
$tbody.append($measurement_row);
// Measure the row height
const row_height = $measurement_row.outerHeight();
// Remove measurement row
$measurement_row.remove();
// Calculate and set min-height based on per_page
const min_height = row_height * that.data.per_page;
$tbody.css('min-height', min_height + 'px');
// Store for future reference
that.data.row_height = row_height;
that.data.tbody_min_height = min_height;
}
// Clear filter and reset to page 1
clear_filter() {
let that = this;
that.data.filter = '';
// Clear the filter input
const $filter = that.$sid('filter_input');
if ($filter && $filter.length > 0) {
$filter.val('');
}
// Reload from page 1
that.load_page(1);
}
}
/* === rsx/theme/components/_archived/unfinished/Activity_Feed.js (babel) === */
"use strict";
class Activity_Feed extends Component {
async on_load() {
if (this.args.data_source) {
const response = await fetch(this.args.data_source);
this.data.activities = await response.json();
} else if (this.args.activities) {
this.data.activities = this.args.activities;
}
}
on_ready() {
// Optional: Auto-refresh
if (this.args.auto_refresh) {
this.start_auto_refresh();
}
}
start_auto_refresh() {
const interval = this.args.refresh_interval || 30000; // Default 30 seconds
this.refresh_timer = setInterval(() => {
this.reload_data();
}, interval);
}
stop_auto_refresh() {
if (this.refresh_timer) {
clearInterval(this.refresh_timer);
this.refresh_timer = null;
}
}
async reload_data() {
if (this.args.data_source) {
const response = await fetch(this.args.data_source);
this.data.activities = await response.json();
this.render();
}
}
}
/* === rsx/theme/components/_archived/unfinished/Actor_Reference.js (babel) === */
"use strict";
class Actor_Reference extends Component {
// Pure Bootstrap styling - no JavaScript needed
}
/* === rsx/theme/components/_archived/unfinished/Advanced_Search_Panel.js (babel) === */
"use strict";
class Advanced_Search_Panel extends Component {
on_ready() {
// Populate dropdowns if provided
if (this.args.categories) {
this.$sid('category').set_options(this.args.categories);
}
if (this.args.tags) {
this.$sid('tags').set_options(this.args.tags);
}
// Search button
this.$sid('search_btn').on('click', e => {
e.preventDefault();
this.perform_search();
});
// Reset button
this.$sid('reset_btn').on('click', e => {
e.preventDefault();
this.reset();
});
// Close button
this.$sid('close_btn').on('click', () => {
if (this.args.on_close) {
this.args.on_close();
} else {
this.$.hide();
}
});
// Form submit
this.$sid('search_form').on('submit', e => {
e.preventDefault();
this.perform_search();
});
}
perform_search() {
const criteria = {
keywords: this.$sid('keywords').get_value(),
category: this.$sid('category').get_value(),
tags: this.$sid('tags').get_value(),
from_date: this.$sid('from_date').get_value(),
to_date: this.$sid('to_date').get_value(),
sort_by: this.$sid('sort_by').val(),
exact_match: this.$sid('exact_match').is(':checked')
};
// Remove empty values
Object.keys(criteria).forEach(key => {
if (!criteria[key] || is_array(criteria[key]) && criteria[key].length === 0) {
delete criteria[key];
}
});
if (this.args.on_search) {
this.args.on_search(criteria);
}
}
reset() {
this.$sid('keywords').set_value('');
this.$sid('category').set_value('');
this.$sid('tags').set_value([]);
this.$sid('from_date').set_value('');
this.$sid('to_date').set_value('');
this.$sid('sort_by').val('relevance');
this.$sid('exact_match').prop('checked', false);
if (this.args.on_reset) {
this.args.on_reset();
}
}
}
/* === rsx/theme/components/_archived/unfinished/Alert_Banner.js (babel) === */
"use strict";
class Alert_Banner extends Component {
on_ready() {
// Apply type from args (success, danger, warning, info)
if (this.args.type) {
this.$.removeClass('alert-info').addClass(`alert-${this.args.type}`);
}
// Remove dismissible if not needed
if (this.args.dismissible === false) {
this.$.removeClass('alert-dismissible');
this.$.find('.btn-close').remove();
}
}
}
/* === rsx/theme/components/_archived/unfinished/Avatar.js (babel) === */
"use strict";
class Avatar extends Component {
on_ready() {
// Set src from args
if (this.args.src) {
this.$.attr('src', this.args.src);
}
// Set size (xs, sm, md, lg, xl)
const size = this.args.size || 'md';
const size_map = {
'xs': '24px',
'sm': '32px',
'md': '48px',
'lg': '64px',
'xl': '96px'
};
this.$.css({
'width': size_map[size],
'height': size_map[size],
'object-fit': 'cover'
});
// Alternative rendering: show initials when no image source provided
if (!this.args.src && this.args.name) {
this.show_initials(this.args.name);
}
}
show_initials(name) {
// Convert img to div with initials
const initials = name.split(' ').map(n => n[0]).join('').toUpperCase().slice(0, 2);
const $div = $('<div>').addClass('rounded-circle d-flex align-items-center justify-content-center bg-primary text-white fw-bold').css({
'width': this.$.css('width'),
'height': this.$.css('height')
}).text(initials);
this.$.replaceWith($div);
this.$ = $div;
}
}
/* === rsx/theme/components/_archived/unfinished/Blockquote.js (babel) === */
"use strict";
class Blockquote extends Component {
on_ready() {
// No special behavior
}
}
/* === rsx/theme/components/_archived/unfinished/Breadcrumbs.js (babel) === */
"use strict";
class Breadcrumbs extends Component {
// Placeholder component - currently empty in dashboard usage
}
/* === rsx/theme/components/_archived/unfinished/Bulk_Action_Bar.js (babel) === */
"use strict";
class Bulk_Action_Bar extends Component {
on_ready() {
// Clear selection on close
this.$sid('close_btn').on('click', () => {
this.$.hide();
// Uncheck all boxes
const $table = this.$.closest('.card').find('table');
$table.find('input[type="checkbox"]').prop('checked', false);
});
}
set_count(count) {
this.$.find('.count').text(count);
}
}
/* === rsx/theme/components/_archived/unfinished/Bulk_Selection.js (babel) === */
"use strict";
class Bulk_Selection extends Component {
on_ready() {
const $checkbox = this.$sid('checkbox');
// Toggle all checkboxes in table body
$checkbox.on('change', e => {
const checked = e.target.checked;
const $table = this.$.closest('table');
$table.find('tbody input[type="checkbox"]').prop('checked', checked);
// Trigger update event
if (this.args.on_change) {
this.args.on_change(checked);
}
});
}
}
/* === rsx/theme/components/_archived/unfinished/button_group.js (babel) === */
"use strict";
class Button_Group extends Component {
// Container for grouped buttons with connected borders
// Bootstrap btn-group handles all visual grouping
}
/* === rsx/theme/components/_archived/unfinished/button_primary.js (babel) === */
"use strict";
class Button_Primary extends Component {
// Primary action button - highest visual hierarchy
// Bootstrap btn-primary provides all styling
}
/* === rsx/theme/components/_archived/unfinished/button_secondary.js (babel) === */
"use strict";
class Button_Secondary extends Component {
// Secondary action button - lower prominence than primary
// Bootstrap btn-secondary provides gray color scheme
}
/* === rsx/theme/components/_archived/unfinished/button.js (babel) === */
"use strict";
class Button extends Component {
// Base button component - no special behavior needed
// Bootstrap handles all states (hover, active, focus, disabled)
}
/* === rsx/theme/components/_archived/unfinished/Calendar_Event.js (babel) === */
"use strict";
class Calendar_Event extends Component {
on_ready() {
if (this.args.on_click) {
this.$.on('click', () => {
this.args.on_click(this.args);
});
}
// Hover effect
this.$.on('mouseenter', () => {
this.$.addClass('shadow-sm');
});
this.$.on('mouseleave', () => {
this.$.removeClass('shadow-sm');
});
}
}
/* === rsx/theme/components/_archived/unfinished/Calendar_Grid.js (babel) === */
"use strict";
class Calendar_Grid extends Component {
on_ready() {
this.current_date = new Date();
this.render_calendar();
this.$sid('prev_btn').on('click', () => {
this.current_date.setMonth(this.current_date.getMonth() - 1);
this.render_calendar();
});
this.$sid('next_btn').on('click', () => {
this.current_date.setMonth(this.current_date.getMonth() + 1);
this.render_calendar();
});
this.$sid('today_btn').on('click', () => {
this.current_date = new Date();
this.render_calendar();
});
}
render_calendar() {
const year = this.current_date.getFullYear();
const month = this.current_date.getMonth();
// Update title
const month_names = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
this.$sid('month_title').text(`${month_names[month]} ${year}`);
// Get first day of month and total days
const first_day = new Date(year, month, 1).getDay();
const days_in_month = new Date(year, month + 1, 0).getDate();
const $tbody = this.$sid('calendar_body');
$tbody.empty();
let day = 1;
let $tr = null;
// Build calendar grid
for (let i = 0; i < 6; i++) {
$tr = $('<tr>');
for (let j = 0; j < 7; j++) {
const $td = $('<td>').css({
'height': '100px',
'vertical-align': 'top',
'padding': '8px'
});
if (i === 0 && j < first_day) {
// Empty cell before month starts
$td.addClass('bg-light');
} else if (day > days_in_month) {
// Empty cell after month ends
$td.addClass('bg-light');
} else {
// Day cell
const $day_num = $('<div>').addClass('fw-bold mb-2').text(day);
// Highlight today
const today = new Date();
if (day === today.getDate() && month === today.getMonth() && year === today.getFullYear()) {
$day_num.addClass('text-primary');
$td.addClass('border-primary');
}
$td.append($day_num);
// Add events for this day if provided
if (this.args.events) {
const events = this.get_events_for_date(year, month, day);
events.forEach(event => {
const $event = $('<div>').addClass('badge bg-primary text-truncate w-100 mb-1 text-start').css('cursor', 'pointer').text(event.title);
$event.on('click', () => {
if (this.args.on_event_click) {
this.args.on_event_click(event);
}
});
$td.append($event);
});
}
$td.attr('data-date', `${year}-${str(month + 1).padStart(2, '0')}-${str(day).padStart(2, '0')}`);
$td.css('cursor', 'pointer');
$td.on('click', e => {
if (this.args.on_date_click && !$(e.target).hasClass('badge')) {
this.args.on_date_click($td.attr('data-date'));
}
});
day++;
}
$tr.append($td);
}
$tbody.append($tr);
if (day > days_in_month) break;
}
}
get_events_for_date(year, month, day) {
if (!this.args.events) return [];
const date_str = `${year}-${str(month + 1).padStart(2, '0')}-${str(day).padStart(2, '0')}`;
return this.args.events.filter(event => {
return event.date === date_str;
});
}
}
/* === rsx/theme/components/_archived/unfinished/Card.js (babel) === */
"use strict";
/**
* Card - Bootstrap 5 Content Container Component
*
* Purpose: Primary content container using Bootstrap .card class
* Design: Pure Bootstrap - border-0 with shadow for modern Volt aesthetic
*/
class Card extends Component {
// Card is a pure container component - no lifecycle methods needed
// All styling comes from Bootstrap classes: card, border-0, shadow
}
/* === rsx/theme/components/_archived/unfinished/Chart_Component.js (babel) === */
"use strict";
class Chart_Component extends Component {
// Placeholder component - no functionality yet
}
/* === rsx/theme/components/_archived/unfinished/Checkbox.js (babel) === */
"use strict";
/**
* Checkbox - Bootstrap 5 Checkbox Input Component
*
* Purpose: Single checkbox for yes/no, true/false selections
* Design: Bootstrap .form-check-input styling
* Wrapper: Typically used within <div class="form-check"> for proper layout
*/
class Checkbox extends Component {
on_ready() {
// Set checked state if provided
if (this.args.checked) {
this.$.prop('checked', true);
}
// Set value if provided
if (this.args.value) {
this.$.val(this.args.value);
}
// Add custom classes if provided
if (this.args.class) {
this.$.addClass(this.args.class);
}
// Set disabled state if provided
if (this.args.disabled) {
this.$.prop('disabled', true);
}
// Set required attribute if provided
if (this.args.required) {
this.$.prop('required', true);
}
}
}
/* === rsx/theme/components/_archived/unfinished/Code_Block.js (babel) === */
"use strict";
class Code_Block extends Component {
on_ready() {
// No special behavior (syntax highlighting could be added later)
}
}
/* === rsx/theme/components/_archived/unfinished/Column_Visibility_Toggle.js (babel) === */
"use strict";
class Column_Visibility_Toggle extends Component {
on_ready() {
// Build column checkboxes
if (this.args.columns) {
this.build_menu(this.args.columns);
}
}
build_menu(columns) {
const $menu = this.$sid('menu');
$menu.empty();
columns.forEach((column, index) => {
const $li = $('<li>');
const $label = $('<label>').addClass('dropdown-item');
const $checkbox = $('<input>').addClass('form-check-input me-2').attr('type', 'checkbox').prop('checked', column.visible !== false).attr('data-column-index', index);
$label.append($checkbox).append(column.label || column.name);
$li.append($label);
$menu.append($li);
$checkbox.on('change', e => {
this.toggle_column(index, e.target.checked);
});
});
}
toggle_column(index, visible) {
if (this.args.on_toggle) {
this.args.on_toggle(index, visible);
}
// Find table and toggle column visibility
const $table = this.args.table ? $(this.args.table) : this.$.closest('.card').find('table');
const selector = `th:nth-child(${index + 1}), td:nth-child(${index + 1})`;
if (visible) {
$table.find(selector).show();
} else {
$table.find(selector).hide();
}
}
set_columns(columns) {
this.build_menu(columns);
}
}
/* === rsx/theme/components/_archived/unfinished/Comment_Thread.js (babel) === */
"use strict";
class Comment_Thread extends Component {
async on_load() {
if (this.args.data_source) {
const response = await fetch(this.args.data_source);
this.data.comments = await response.json();
} else if (this.args.comments) {
this.data.comments = this.args.comments;
}
}
on_ready() {
// Submit new comment
this.$sid('submit_btn').on('click', () => {
this.submit_comment();
});
// Reply buttons
this.$.find('.reply-btn').on('click', e => {
const $comment = $(e.target).closest('[data-comment-id]');
const comment_id = $comment.attr('data-comment-id');
this.show_reply_form(comment_id);
});
// Edit buttons
this.$.find('.edit-btn').on('click', e => {
const $comment = $(e.target).closest('[data-comment-id]');
const comment_id = $comment.attr('data-comment-id');
this.edit_comment(comment_id);
});
// Delete buttons
this.$.find('.delete-btn').on('click', e => {
const $comment = $(e.target).closest('[data-comment-id]');
const comment_id = $comment.attr('data-comment-id');
this.delete_comment(comment_id);
});
}
async submit_comment() {
const text = this.$sid('comment_input').val().trim();
if (!text) return;
if (this.args.on_submit) {
const result = await this.args.on_submit(text);
if (result) {
this.$sid('comment_input').val('');
await this.reload_data();
}
}
}
show_reply_form(comment_id) {
// TODO: Implement reply form UI
console.log('Reply to comment:', comment_id);
}
edit_comment(comment_id) {
if (this.args.on_edit) {
this.args.on_edit(comment_id);
}
}
async delete_comment(comment_id) {
if (!confirm('Delete this comment?')) return;
if (this.args.on_delete) {
const result = await this.args.on_delete(comment_id);
if (result) {
await this.reload_data();
}
}
}
async reload_data() {
if (this.args.data_source) {
const response = await fetch(this.args.data_source);
this.data.comments = await response.json();
this.render();
}
}
}
/* === rsx/theme/components/_archived/unfinished/Date_Picker.js (babel) === */
"use strict";
class Date_Picker extends Component {
on_ready() {
const $input = this.$sid('input');
if (this.args.value) {
$input.val(this.args.value);
}
if (this.args.name) {
$input.attr('name', this.args.name);
}
if (this.args.min) {
$input.attr('min', this.args.min);
}
if (this.args.max) {
$input.attr('max', this.args.max);
}
if (this.args.disabled) {
$input.prop('disabled', true);
}
if (this.args.readonly) {
$input.prop('readonly', true);
}
if (this.args.required) {
$input.prop('required', true);
}
if (this.args.on_change) {
$input.on('change', e => {
this.args.on_change(e.target.value);
});
}
}
get_value() {
return this.$sid('input').val();
}
set_value(value) {
this.$sid('input').val(value);
}
focus() {
this.$sid('input').focus();
}
}
/* === rsx/theme/components/_archived/unfinished/Dropdown_Menu.js (babel) === */
"use strict";
class Dropdown_Menu extends Component {
on_ready() {
// Wrap bare text children in <li><a> structure
const $menu = this.$sid('menu');
$menu.children().each(function () {
const $child = $(this);
if ($child.prop('tagName') !== 'LI') {
const text = $child.text();
const href = $child.attr('href') || '#';
const $li = $('<li>').append($('<a>').addClass('dropdown-item').attr('href', href).text(text));
$child.replaceWith($li);
}
});
}
}
/* === rsx/theme/components/_archived/unfinished/Empty_State.js (babel) === */
"use strict";
class Empty_State extends Component {
on_ready() {
// No special behavior
}
}
/* === rsx/theme/components/_archived/unfinished/Export_Button.js (babel) === */
"use strict";
class Export_Button extends Component {
on_ready() {
const that = this;
this.$.find('[data-format]').on('click', e => {
e.preventDefault();
const format = $(e.currentTarget).attr('data-format');
that.export_data(format);
});
}
async export_data(format) {
if (this.args.on_export) {
// Custom export handler
this.args.on_export(format);
} else if (this.args.data) {
// Auto-export provided data
this.auto_export(format, this.args.data);
} else if (this.args.export_url) {
// Fetch export from URL
const url = `${this.args.export_url}?format=${format}`;
window.location.href = url;
}
}
auto_export(format, data) {
if (format === 'csv') {
this.export_csv(data);
} else if (format === 'json') {
this.export_json(data);
} else {
console.warn('Auto-export only supports CSV and JSON. Implement custom handler for other formats.');
}
}
export_csv(data) {
if (data.length === 0) return;
// Generate CSV
const headers = Object.keys(data[0]);
let csv = headers.join(',') + '\n';
data.forEach(row => {
const values = headers.map(header => {
const value = row[header] || '';
return `"${str(value).replace(/"/g, '""')}"`;
});
csv += values.join(',') + '\n';
});
// Download
const blob = new Blob([csv], {
type: 'text/csv'
});
const url = window.URL.createObjectURL(blob);
const $a = $('<a>');
$a.attr('href', url);
$a.attr('download', `export_${Date.now()}.csv`);
$a[0].click();
window.URL.revokeObjectURL(url);
}
export_json(data) {
const json = json_encode(data);
const blob = new Blob([json], {
type: 'application/json'
});
const url = window.URL.createObjectURL(blob);
const $a = $('<a>');
$a.attr('href', url);
$a.attr('download', `export_${Date.now()}.json`);
$a[0].click();
window.URL.revokeObjectURL(url);
}
}
/* === rsx/theme/components/_archived/unfinished/File_Upload.js (babel) === */
"use strict";
class File_Upload extends Component {
on_ready() {
const $input = this.$sid('file_input');
const $drop_zone = this.$sid('drop_zone');
if (this.args.accept) {
$input.attr('accept', this.args.accept);
}
if (this.args.multiple) {
$input.attr('multiple', true);
}
// Click to upload
$drop_zone.on('click', () => {
$input.click();
});
// File selected
$input.on('change', e => {
const files = e.target.files;
if (files.length > 0) {
this.handle_files(files);
}
});
// Drag and drop
$drop_zone.on('dragover', e => {
e.preventDefault();
e.stopPropagation();
$drop_zone.addClass('border-primary bg-light');
});
$drop_zone.on('dragleave', e => {
e.preventDefault();
e.stopPropagation();
$drop_zone.removeClass('border-primary bg-light');
});
$drop_zone.on('drop', e => {
e.preventDefault();
e.stopPropagation();
$drop_zone.removeClass('border-primary bg-light');
const files = e.originalEvent.dataTransfer.files;
if (files.length > 0) {
this.handle_files(files);
}
});
// Remove button
this.$sid('remove_btn').on('click', e => {
e.stopPropagation();
this.clear();
});
}
handle_files(files) {
const file = files[0]; // Single file for now
// Validate file size
if (this.args.max_size_bytes && file.size > this.args.max_size_bytes) {
alert(`File is too large. Max size is ${this.format_size(this.args.max_size_bytes)}`);
return;
}
this.selected_file = file;
// Show file info
this.$sid('placeholder').hide();
this.$sid('file_info').show();
this.$sid('file_name').text(file.name);
this.$sid('file_size').text(this.format_size(file.size));
// Auto-upload if endpoint provided
if (this.args.upload_url) {
this.upload();
}
// Trigger callback
if (this.args.on_select) {
this.args.on_select(file);
}
}
async upload() {
if (!this.selected_file || !this.args.upload_url) return;
// Show progress
this.$sid('file_info').hide();
this.$sid('progress').show();
const form_data = new FormData();
form_data.append('file', this.selected_file);
try {
const response = await fetch(this.args.upload_url, {
method: 'POST',
body: form_data
});
const result = await response.json();
// Hide progress
this.$sid('progress').hide();
this.$sid('file_info').show();
if (this.args.on_upload) {
this.args.on_upload(result);
}
} catch (error) {
alert('Upload failed: ' + error.message);
this.$sid('progress').hide();
this.$sid('placeholder').show();
}
}
clear() {
this.selected_file = null;
this.$sid('file_input').val('');
this.$sid('file_info').hide();
this.$sid('progress').hide();
this.$sid('placeholder').show();
if (this.args.on_clear) {
this.args.on_clear();
}
}
get_file() {
return this.selected_file;
}
format_size(bytes) {
if (bytes < 1024) return bytes + ' B';
if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';
return (bytes / (1024 * 1024)).toFixed(1) + ' MB';
}
}
/* === rsx/theme/components/_archived/unfinished/Filter_Bar.js (babel) === */
"use strict";
class Filter_Bar extends Component {
on_ready() {
this.active_filters = {};
// Populate status options if provided
if (this.args.status_options) {
const $status = this.$sid('status');
this.args.status_options.forEach(opt => {
$status.append($('<option>').val(opt.value).text(opt.label));
});
}
// Date range change handler
this.$sid('date_range').on('change', e => {
if (e.target.value === 'custom') {
this.$sid('custom_dates').show();
this.$sid('custom_dates_end').show();
} else {
this.$sid('custom_dates').hide();
this.$sid('custom_dates_end').hide();
}
});
// Search with debounce
let search_timeout;
this.$sid('search').$.find('input').on('input', e => {
clearTimeout(search_timeout);
search_timeout = setTimeout(() => {
this.add_filter('search', e.target.value);
}, 500);
});
// Apply button
this.$sid('apply_btn').on('click', () => {
this.apply_filters();
});
// Clear button
this.$sid('clear_btn').on('click', () => {
this.clear_filters();
});
}
add_filter(key, value) {
if (value) {
this.active_filters[key] = value;
} else {
delete this.active_filters[key];
}
this.update_filter_display();
}
apply_filters() {
// Collect all filter values
const search = this.$sid('search').get_value();
const status = this.$sid('status').val();
const date_range = this.$sid('date_range').val();
this.active_filters = {};
if (search) this.active_filters.search = search;
if (status) this.active_filters.status = status;
if (date_range) this.active_filters.date_range = date_range;
if (date_range === 'custom') {
const start_date = this.$sid('start_date').get_value();
const end_date = this.$sid('end_date').get_value();
if (start_date) this.active_filters.start_date = start_date;
if (end_date) this.active_filters.end_date = end_date;
}
this.update_filter_display();
if (this.args.on_apply) {
this.args.on_apply(this.active_filters);
}
}
clear_filters() {
this.active_filters = {};
this.$sid('search').set_value('');
this.$sid('status').val('');
this.$sid('date_range').val('');
this.$sid('custom_dates').hide();
this.$sid('custom_dates_end').hide();
this.update_filter_display();
if (this.args.on_clear) {
this.args.on_clear();
}
}
update_filter_display() {
const count = Object.keys(this.active_filters).length;
const $container = this.$sid('active_filters');
const $tags = this.$sid('filter_tags');
if (count === 0) {
$container.hide();
return;
}
$container.show();
$tags.empty();
for (let key in this.active_filters) {
const $tag = $('<span>').addClass('badge bg-primary me-1');
$tag.text(`${key}: ${this.active_filters[key]}`);
const $remove = $('<i>').addClass('bi bi-x-circle ms-1').css('cursor', 'pointer');
$remove.on('click', () => {
delete this.active_filters[key];
this.update_filter_display();
this.apply_filters();
});
$tag.append($remove);
$tags.append($tag);
}
}
get_filters() {
return this.active_filters;
}
}
/* === rsx/theme/components/_archived/unfinished/form_actions_component.js (babel) === */
"use strict";
/**
* Form_Actions_Component - JQHTML Component
*
* Lifecycle methods are called in this order:
* 1. on_create() - Quick UI setup, runs bottom-up through component tree
* 2. on_load() - Fetch data from APIs (parallel execution, no DOM modifications)
* 3. on_ready() - Component fully initialized, runs bottom-up through component tree
*/
class Form_Actions_Component extends Component {
/**
* Called after render, quick UI setup (bottom-up)
* Use for: Initial state, event bindings, showing loading indicators
*/
async on_create() {
// Example: this.$sid('loading').show();
// Example: this.$.addClass('initializing');
}
/**
* Fetch data from APIs (parallel, NO DOM modifications)
* Use for: Loading data from server, fetching configurations
* WARNING: Do NOT modify DOM here - only load data
*/
async on_load() {
// Example: this.data.users = await Users_Controller.get_users_api();
// Example: this.data.config = await this.load_config();
// WARNING: Do NOT modify DOM here - only load data
}
/**
* Component fully initialized (bottom-up)
* Use for: Final UI setup, hiding loading indicators, starting animations
*/
async on_ready() {
// Example: this.$sid('loading').hide();
// Example: this.setup_event_listeners();
}
/**
* Click handler for the hello button
* Referenced in template via @click=this.on_click_hello
*/
on_click_hello() {
this.$sid('inner_html').hide();
this.$sid('hello_world').show();
}
// For more information: php artisan rsx:man jqhtml
}
/* === rsx/theme/components/_archived/unfinished/Form_Field_Group.js (babel) === */
"use strict";
class Form_Field_Group extends Component {
on_ready() {
// Optional: Add collapsible functionality
if (this.args.collapsible) {
this.make_collapsible();
}
}
make_collapsible() {
const $header = this.$.find('.card-header');
const $body = this.$.find('.card-body');
const collapse_id = 'collapse_' + Math.random().toString(36).substr(2, 9);
$body.attr('id', collapse_id).addClass('collapse show');
const $toggle = $('<button>').attr('type', 'button').addClass('btn btn-link btn-sm float-end text-decoration-none').attr('data-bs-toggle', 'collapse').attr('data-bs-target', '#' + collapse_id).html('<i class="bi bi-chevron-up"></i>');
$header.find('h5').append($toggle);
$body.on('show.bs.collapse', () => {
$toggle.html('<i class="bi bi-chevron-up"></i>');
});
$body.on('hide.bs.collapse', () => {
$toggle.html('<i class="bi bi-chevron-down"></i>');
});
}
}
/* === rsx/theme/components/_archived/unfinished/form_group_component.js (babel) === */
"use strict";
/**
* Form_Group_Component - JQHTML Component
*
* Lifecycle methods are called in this order:
* 1. on_create() - Quick UI setup, runs bottom-up through component tree
* 2. on_load() - Fetch data from APIs (parallel execution, no DOM modifications)
* 3. on_ready() - Component fully initialized, runs bottom-up through component tree
*/
class Form_Group_Component extends Component {
/**
* Called after render, quick UI setup (bottom-up)
* Use for: Initial state, event bindings, showing loading indicators
*/
on_create() {
// Apply responsive column classes
const col_class = this.args.col_class || 'col-12 col-md-6 col-xl-4';
this.$.addClass(col_class + ' mb-3');
}
}
/* === rsx/theme/components/_archived/unfinished/form_row_component.js (babel) === */
"use strict";
/**
* Form_Row_Component - JQHTML Component
*
* Lifecycle methods are called in this order:
* 1. on_create() - Quick UI setup, runs bottom-up through component tree
* 2. on_load() - Fetch data from APIs (parallel execution, no DOM modifications)
* 3. on_ready() - Component fully initialized, runs bottom-up through component tree
*/
class Form_Row_Component extends Component {
/**
* Called after render, quick UI setup (bottom-up)
* Use for: Initial state, event bindings, showing loading indicators
*/
async on_create() {
// Example: this.$sid('loading').show();
// Example: this.$.addClass('initializing');
}
/**
* Fetch data from APIs (parallel, NO DOM modifications)
* Use for: Loading data from server, fetching configurations
* WARNING: Do NOT modify DOM here - only load data
*/
async on_load() {
// Example: this.data.users = await Users_Controller.get_users_api();
// Example: this.data.config = await this.load_config();
// WARNING: Do NOT modify DOM here - only load data
}
/**
* Component fully initialized (bottom-up)
* Use for: Final UI setup, hiding loading indicators, starting animations
*/
async on_ready() {
// Example: this.$sid('loading').hide();
// Example: this.setup_event_listeners();
}
/**
* Click handler for the hello button
* Referenced in template via @click=this.on_click_hello
*/
on_click_hello() {
this.$sid('inner_html').hide();
this.$sid('hello_world').show();
}
// For more information: php artisan rsx:man jqhtml
}
/* === rsx/theme/components/_archived/unfinished/Form_Validation_Message.js (babel) === */
"use strict";
/**
* Form_Validation_Message - Bootstrap 5 Validation Feedback Component
*
* Purpose: Display validation feedback messages (success/error) below form inputs
* Design: Bootstrap .invalid-feedback (default) or .valid-feedback styling
* Visibility: Only shows when sibling input has .is-valid or .is-invalid class
*/
class Form_Validation_Message extends Component {
on_ready() {
// Add custom classes if provided (e.g., switching to valid-feedback)
if (this.args.class) {
// Replace default invalid-feedback with provided class
this.$.removeClass('invalid-feedback');
this.$.addClass(this.args.class);
}
}
}
/* === rsx/theme/components/_archived/unfinished/Gantt_Chart.js (babel) === */
"use strict";
class Gantt_Chart extends Component {
async on_load() {
if (this.args.data_source) {
const response = await fetch(this.args.data_source);
const data = await response.json();
this.data.tasks = data.tasks;
this.data.months = data.months;
} else if (this.args.tasks) {
this.data.tasks = this.args.tasks;
this.data.months = this.args.months || this.generate_months();
}
}
generate_months() {
const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
return months;
}
}
/* === rsx/theme/components/_archived/unfinished/icon_button.js (babel) === */
"use strict";
class Icon_Button extends Component {
on_ready() {
// Add aria-label for accessibility (icon-only buttons need labels)
if (this.args.label) {
this.$.attr('aria-label', this.args.label);
}
// Add title for tooltip on hover
if (this.args.title) {
this.$.attr('title', this.args.title);
}
// Support custom button classes (btn-primary, btn-danger, etc.)
if (this.args.class) {
this.$.addClass(this.args.class);
}
}
}
/* === rsx/theme/components/_archived/unfinished/Icon_With_Label.js (babel) === */
"use strict";
class Icon_With_Label extends Component {
on_ready() {
// No special behavior
}
}
/* === rsx/theme/components/_archived/unfinished/Icon_With_Text.js (babel) === */
"use strict";
class Icon_With_Text extends Component {
// Pure Bootstrap styling - no JavaScript needed
}
/* === rsx/theme/components/_archived/unfinished/icon.js (babel) === */
"use strict";
class Icon extends Component {
// SVG icon container with size variants
}
/* === rsx/theme/components/_archived/unfinished/Info_Box.js (babel) === */
"use strict";
class Info_Box extends Component {
on_ready() {
// Apply color from args
if (this.args.color) {
this.$.removeClass('border-primary').addClass(`border-${this.args.color}`);
}
}
}
/* === rsx/theme/components/_archived/unfinished/Inline_Edit_Field.js (babel) === */
"use strict";
class Inline_Edit_Field extends Component {
on_ready() {
this.current_value = this.args.value || '';
// Enter edit mode
this.$sid('display_mode').on('click', () => {
this.enter_edit_mode();
});
// Save
this.$sid('save_btn').on('click', () => {
this.save();
});
// Cancel
this.$sid('cancel_btn').on('click', () => {
this.cancel();
});
// Save on Enter, cancel on Escape
this.$sid('input').on('keydown', e => {
if (e.key === 'Enter') {
e.preventDefault();
this.save();
} else if (e.key === 'Escape') {
e.preventDefault();
this.cancel();
}
});
}
enter_edit_mode() {
const $input = this.$sid('input');
$input.val(this.current_value);
this.$sid('display_mode').hide();
this.$sid('edit_mode').show();
$input.focus();
$input.select();
}
exit_edit_mode() {
this.$sid('edit_mode').hide();
this.$sid('display_mode').show();
}
save() {
const new_value = this.$sid('input').val();
if (new_value === this.current_value) {
this.exit_edit_mode();
return;
}
// Trigger callback
if (this.args.on_save) {
const result = this.args.on_save(new_value, this.current_value);
// If callback returns false, don't save
if (result === false) {
return;
}
// If callback returns a promise, wait for it
if (result && typeof result.then === 'function') {
this.show_saving();
result.then(() => {
this.current_value = new_value;
this.update_display();
this.exit_edit_mode();
}).catch(() => {
this.exit_edit_mode();
});
return;
}
}
this.current_value = new_value;
this.update_display();
this.exit_edit_mode();
}
cancel() {
this.exit_edit_mode();
}
update_display() {
const display = this.current_value || this.args.placeholder || 'Click to edit';
this.$sid('value_display').text(display);
}
show_saving() {
this.$sid('save_btn').prop('disabled', true).html('<span class="spinner-border spinner-border-sm"></span>');
this.$sid('cancel_btn').prop('disabled', true);
}
get_value() {
return this.current_value;
}
set_value(value) {
this.current_value = value;
this.update_display();
}
}
/* === rsx/theme/components/_archived/unfinished/Input_With_Icon.js (babel) === */
"use strict";
class Input_With_Icon extends Component {
on_ready() {
const $input = this.$sid('input');
if (this.args.value) {
$input.val(this.args.value);
}
if (this.args.name) {
$input.attr('name', this.args.name);
}
if (this.args.disabled) {
$input.prop('disabled', true);
}
if (this.args.readonly) {
$input.prop('readonly', true);
}
if (this.args.on_change) {
$input.on('change', e => {
this.args.on_change(e.target.value);
});
}
if (this.args.on_input) {
$input.on('input', e => {
this.args.on_input(e.target.value);
});
}
}
get_value() {
return this.$sid('input').val();
}
set_value(value) {
this.$sid('input').val(value);
}
focus() {
this.$sid('input').focus();
}
}
/* === rsx/theme/components/_archived/unfinished/Input_With_Validation.js (babel) === */
"use strict";
class Input_With_Validation extends Component {
on_ready() {
const $input = this.$sid('input');
if (this.args.value) {
$input.val(this.args.value);
}
if (this.args.name) {
$input.attr('name', this.args.name);
}
if (this.args.required) {
$input.prop('required', true);
}
if (this.args.disabled) {
$input.prop('disabled', true);
}
if (this.args.readonly) {
$input.prop('readonly', true);
}
// Real-time validation
if (this.args.validate) {
$input.on('blur', () => {
this.validate();
});
$input.on('input', () => {
if (this.$.hasClass('was-validated')) {
this.validate();
}
});
}
if (this.args.on_change) {
$input.on('change', e => {
this.args.on_change(e.target.value);
});
}
}
validate() {
const value = this.$sid('input').val();
const $input = this.$sid('input');
this.$.addClass('was-validated');
// Run validation function
if (this.args.validate) {
const result = this.args.validate(value);
if (result === true || result === null || result === undefined) {
this.set_valid();
return true;
} else {
this.set_error(result);
return false;
}
}
// Basic required check
if (this.args.required && !value) {
this.set_error('This field is required');
return false;
}
this.set_valid();
return true;
}
set_error(message) {
const $input = this.$sid('input');
const $error = this.$sid('error');
$input.removeClass('is-valid').addClass('is-invalid');
$error.text(message).css('display', 'block');
this.$sid('success').css('display', 'none');
}
set_valid(message) {
const $input = this.$sid('input');
const $success = this.$sid('success');
$input.removeClass('is-invalid').addClass('is-valid');
this.$sid('error').css('display', 'none');
if (message) {
$success.text(message).css('display', 'block');
} else {
$success.css('display', 'none');
}
}
clear_validation() {
const $input = this.$sid('input');
$input.removeClass('is-valid is-invalid');
this.$sid('error').css('display', 'none');
this.$sid('success').css('display', 'none');
this.$.removeClass('was-validated');
}
get_value() {
return this.$sid('input').val();
}
set_value(value) {
this.$sid('input').val(value);
if (this.$.hasClass('was-validated')) {
this.validate();
}
}
focus() {
this.$sid('input').focus();
}
}
/* === rsx/theme/components/_archived/unfinished/Input.js (babel) === */
"use strict";
/**
* Input - Bootstrap 5 Text Input Component
*
* Purpose: Single-line text input field for user data entry
* Design: Bootstrap .form-control styling
* Types: text, email, password, number, tel, url, date, etc.
*/
class Input extends Component {
on_ready() {
// Set type attribute if provided
if (this.args.type) {
this.$.attr('type', this.args.type);
}
// Set placeholder if provided
if (this.args.placeholder) {
this.$.attr('placeholder', this.args.placeholder);
}
// Set value if provided
if (this.args.value) {
this.$.val(this.args.value);
}
// Add custom classes if provided
if (this.args.class) {
this.$.addClass(this.args.class);
}
// Set disabled state if provided
if (this.args.disabled) {
this.$.prop('disabled', true);
}
// Set required attribute if provided
if (this.args.required) {
this.$.prop('required', true);
}
}
}
/* === rsx/theme/components/_archived/unfinished/Kanban_Board.js (babel) === */
"use strict";
class Kanban_Board extends Component {
async on_load() {
if (this.args.data_source) {
const response = await fetch(this.args.data_source);
this.data.columns = await response.json();
} else if (this.args.columns) {
this.data.columns = this.args.columns;
}
}
on_ready() {
// Drag and drop functionality
this.setup_drag_and_drop();
}
setup_drag_and_drop() {
let dragged_card = null;
// Make cards draggable
this.$.find('[data-card-id]').each(function () {
const $card = $(this);
$card.on('dragstart', function (e) {
dragged_card = this;
$(this).css('opacity', '0.5');
});
$card.on('dragend', function (e) {
$(this).css('opacity', '1');
});
});
// Make columns droppable
this.$.find('[data-column-cards]').each(function () {
const $column = $(this);
$column.on('dragover', function (e) {
e.preventDefault();
$column.addClass('bg-light');
});
$column.on('dragleave', function (e) {
$column.removeClass('bg-light');
});
$column.on('drop', function (e) {
e.preventDefault();
$column.removeClass('bg-light');
if (dragged_card) {
$column.append(dragged_card);
// Trigger callback
if (this.args.on_move) {
const card_id = $(dragged_card).attr('data-card-id');
const column_id = $column.attr('data-column-cards');
this.args.on_move(card_id, column_id);
}
}
}.bind(this));
}.bind(this));
}
}
/* === rsx/theme/components/_archived/unfinished/link.js (babel) === */
"use strict";
class Link extends Component {
on_ready() {
// Support $href attribute for dynamic URLs
if (this.args.href) {
this.$.attr('href', this.args.href);
}
}
}
/* === rsx/theme/components/_archived/unfinished/List.js (babel) === */
"use strict";
class List extends Component {
on_ready() {
// Add list-group-item class to each direct child
this.$.children().each(function () {
const $element = $(this);
$element.addClass('list-group-item');
});
}
}
/* === rsx/theme/components/_archived/unfinished/Loading_Skeleton.js (babel) === */
"use strict";
class Loading_Skeleton extends Component {
on_ready() {
// Apply lines from args
if (this.args.lines) {
this.$.empty();
for (let i = 0; i < this.args.lines; i++) {
const width = 12 - i * 2;
const $span = $('<span>').addClass(`placeholder col-${Math.max(width, 6)}`);
this.$.append($span);
}
}
}
}
/* === rsx/theme/components/_archived/unfinished/Metric_Card.js (babel) === */
"use strict";
class Metric_Card extends Component {
// Pure container - children already styled
}
/* === rsx/theme/components/_archived/unfinished/Mobile_Header.js (babel) === */
"use strict";
class Mobile_Header extends Component {
on_ready() {
// No special behavior
}
}
/* === rsx/theme/components/_archived/unfinished/Modal_Dialog.js (babel) === */
"use strict";
class Modal_Dialog extends Component {
on_ready() {
// Initialize Bootstrap modal
this.modal = new bootstrap.Modal(this.$[0]);
}
show() {
this.modal.show();
}
hide() {
this.modal.hide();
}
}
/* === rsx/theme/components/_archived/unfinished/Multi_Select.js (babel) === */
"use strict";
class Multi_Select extends Component {
on_ready() {
this.selected_values = this.args.value || [];
this.all_options = this.args.options || [];
if (this.all_options.length > 0) {
this.render_options(this.all_options);
}
// Search functionality
const $search = this.$sid('search');
$search.on('input', e => {
this.filter_options(e.target.value);
});
// Prevent dropdown close when clicking inside
this.$sid('menu').on('click', e => {
e.stopPropagation();
});
// Clear/Select all buttons
this.$sid('clear_all').on('click', () => {
this.clear_all();
});
this.$sid('select_all').on('click', () => {
this.select_all();
});
// Update display
this.update_display();
}
render_options(options) {
const $container = this.$sid('options');
$container.empty();
if (options.length === 0) {
$container.append($('<div>').addClass('px-3 py-2 text-muted').text('No options found'));
return;
}
options.forEach(option => {
const $label = $('<label>').addClass('dropdown-item mb-0');
const $checkbox = $('<input>').attr('type', 'checkbox').addClass('form-check-input me-2').attr('data-value', option.value).prop('checked', this.selected_values.includes(option.value));
$checkbox.on('change', e => {
this.toggle_option(option.value, e.target.checked);
});
$label.append($checkbox).append(option.label);
$container.append($label);
});
}
filter_options(query) {
const filtered = this.all_options.filter(opt => opt.label.toLowerCase().includes(query.toLowerCase()));
this.render_options(filtered);
}
toggle_option(value, checked) {
if (checked) {
if (!this.selected_values.includes(value)) {
this.selected_values.push(value);
}
} else {
this.selected_values = this.selected_values.filter(v => v !== value);
}
this.update_display();
if (this.args.on_change) {
this.args.on_change(this.selected_values);
}
}
update_display() {
const count = this.selected_values.length;
const $text = this.$sid('selected_text');
if (count === 0) {
$text.text(this.args.placeholder || 'Select options');
} else if (count === 1) {
const option = this.all_options.find(opt => opt.value === this.selected_values[0]);
$text.text(option ? option.label : '1 selected');
} else {
$text.text(`${count} selected`);
}
}
clear_all() {
this.selected_values = [];
this.$sid('options').find('input[type="checkbox"]').prop('checked', false);
this.update_display();
if (this.args.on_change) {
this.args.on_change(this.selected_values);
}
}
select_all() {
this.selected_values = this.all_options.map(opt => opt.value);
this.$sid('options').find('input[type="checkbox"]').prop('checked', true);
this.update_display();
if (this.args.on_change) {
this.args.on_change(this.selected_values);
}
}
get_value() {
return this.selected_values;
}
set_value(values) {
this.selected_values = values;
this.$sid('options').find('input[type="checkbox"]').each((i, el) => {
const $el = $(el);
$el.prop('checked', values.includes($el.attr('data-value')));
});
this.update_display();
}
set_options(options) {
this.all_options = options;
this.render_options(options);
}
}
/* === rsx/theme/components/_archived/unfinished/Notification_Badge.js (babel) === */
"use strict";
class Notification_Badge extends Component {
on_ready() {
const $count = this.$sid('count');
// Update count dynamically
if (this.args.count === 0 || this.args.count === '0') {
$count.hide();
}
}
set_count(count) {
const $count = this.$sid('count');
$count.text(count);
if (count > 0) {
$count.show();
} else {
$count.hide();
}
}
}
/* === rsx/theme/components/_archived/unfinished/Notification_Dropdown.js (babel) === */
"use strict";
class Notification_Dropdown extends Component {
on_ready() {
// No special behavior
}
}
/* === rsx/theme/components/_archived/unfinished/Overdue_Indicator.js (babel) === */
"use strict";
class Overdue_Indicator extends Component {
// Pure Bootstrap styling - no JavaScript needed
}
/* === rsx/theme/components/_archived/unfinished/Page_Header.js (babel) === */
"use strict";
/**
* Page_Header - Bootstrap 5 Page Action Bar Component
*
* Purpose: Top section of page containing title, breadcrumbs, and actions
* Design: Flexbox layout using Bootstrap utility classes
* Layout: Title/breadcrumbs on left, actions/buttons on right
*/
class Page_Header extends Component {
// Page_Header is a pure container component - no lifecycle methods needed
// All layout from Bootstrap utilities: d-flex, justify-content-between, align-items-center, py-4
}
/* === rsx/theme/components/_archived/unfinished/page_section.js (babel) === */
"use strict";
class Page_Section extends Component {
// Content section with spacing - no special behavior needed
}
/* === rsx/theme/components/_archived/unfinished/page.js (babel) === */
"use strict";
class Page extends Component {
// Semantic page container - no special behavior needed
}
/* === rsx/theme/components/_archived/unfinished/Popover.js (babel) === */
"use strict";
class Popover extends Component {
on_ready() {
// Set popover content from args
if (this.args.title) {
this.$.attr('data-bs-title', this.args.title);
}
if (this.args.content) {
this.$.attr('data-bs-content', this.args.content);
}
// Set trigger (hover, click, focus)
this.$.attr('data-bs-trigger', this.args.trigger || 'click');
// Initialize Bootstrap popover
new bootstrap.Popover(this.$[0]);
}
}
/* === rsx/theme/components/_archived/unfinished/Progress_Bar.js (babel) === */
"use strict";
class Progress_Bar extends Component {
on_ready() {
const $bar = this.$sid('bar');
// Apply color from args
if (this.args.color) {
$bar.addClass(`bg-${this.args.color}`);
}
// Show value text if requested
if (this.args.show_value) {
$bar.text(`${this.args.value || 0}%`);
}
}
set_value(value) {
const $bar = this.$sid('bar');
$bar.css('width', `${value}%`).attr('aria-valuenow', value);
if (this.args.show_value) {
$bar.text(`${value}%`);
}
}
}
/* === rsx/theme/components/_archived/unfinished/Radio_Button.js (babel) === */
"use strict";
/**
* Radio_Button - Bootstrap 5 Radio Input Component
*
* Purpose: Radio button for mutually exclusive selections within a group
* Design: Bootstrap .form-check-input styling with circular shape
* CRITICAL: All radios in same group must have same "name" attribute
* Wrapper: Typically used within <div class="form-check"> and <fieldset>
*/
class Radio_Button extends Component {
on_ready() {
// Set name attribute (CRITICAL for grouping)
if (this.args.name) {
this.$.attr('name', this.args.name);
}
// Set checked state if provided
if (this.args.checked) {
this.$.prop('checked', true);
}
// Set value if provided
if (this.args.value) {
this.$.val(this.args.value);
}
// Add custom classes if provided
if (this.args.class) {
this.$.addClass(this.args.class);
}
// Set disabled state if provided
if (this.args.disabled) {
this.$.prop('disabled', true);
}
// Set required attribute if provided
if (this.args.required) {
this.$.prop('required', true);
}
}
}
/* === rsx/theme/components/_archived/unfinished/Rich_Text_Editor.js (babel) === */
"use strict";
class Rich_Text_Editor extends Component {
on_ready() {
const $editor = this.$sid('editor');
// Toolbar button handlers
this.$sid('toolbar').find('[data-command]').on('click', e => {
e.preventDefault();
const command = $(e.currentTarget).attr('data-command');
if (command === 'createLink') {
const url = prompt('Enter URL:');
if (url) {
document.execCommand(command, false, url);
}
} else {
document.execCommand(command, false, null);
}
$editor.focus();
});
// Track changes
$editor.on('input', () => {
if (this.args.on_change) {
this.args.on_change(this.get_value());
}
});
// Prevent default behavior on paste (optional - can be customized)
$editor.on('paste', e => {
if (this.args.plain_text_paste) {
e.preventDefault();
const text = e.originalEvent.clipboardData.getData('text/plain');
document.execCommand('insertText', false, text);
}
});
}
get_value() {
return this.$sid('editor').html();
}
get_text() {
return this.$sid('editor').text();
}
set_value(html) {
this.$sid('editor').html(html);
}
clear() {
this.$sid('editor').empty();
}
focus() {
this.$sid('editor').focus();
}
}
/* === rsx/theme/components/_archived/unfinished/Row_Action_Menu.js (babel) === */
"use strict";
class Row_Action_Menu extends Component {
on_ready() {
// Wrap children in dropdown structure
const $menu = this.$sid('menu');
$menu.children().each(function () {
const $child = $(this);
if ($child.prop('tagName') !== 'LI') {
if ($child.prop('tagName') === 'HR') {
const $li = $('<li>').append($('<hr>').addClass('dropdown-divider'));
$child.replaceWith($li);
} else {
$child.addClass('dropdown-item');
const $li = $('<li>');
$child.wrap($li);
}
}
});
}
}
/* === rsx/theme/components/_archived/unfinished/Sample_Datagrid_Component.js (babel) === */
"use strict";
/**
* Sample_Datagrid_Component
*
* Full-featured data table with:
* - Row selection (checkboxes)
* - Pagination
* - Row actions (view, edit, delete)
* - Loading states with placeholders
* - Empty states
*
* Usage:
* <Sample_Datagrid_Component
* $title="Client List"
* $entity_name="clients"
* $selectable=true
* $pagination=true
* $allow_delete=true
* $view_url="/clients/{id}"
* $edit_url="/clients/{id}/edit"
* $api_url="/api/clients"
* $columns=columns_definition
* />
*/
class Sample_Datagrid_Component extends Component {
async on_load() {
const that = this;
// If API URL provided, fetch data
if (that.args.api_url) {
const response = await fetch(that.args.api_url);
that.data = await response.json();
} else {
// Generate sample data for demonstration
that.data = that.generate_sample_data();
}
}
on_ready() {
const that = this;
// Select all checkbox
if (that.args.selectable) {
that.$sid('select_all').on('change', e => {
const checked = e.target.checked;
that.$.find('tbody input[type="checkbox"]').prop('checked', checked);
that.update_selection_count();
});
// Individual row checkboxes
that.$.find('tbody input[type="checkbox"]').on('change', () => {
that.update_selection_count();
});
}
// Delete buttons
if (that.args.allow_delete) {
that.$.find('button[data-id]').on('click', e => {
const $button = $(e.currentTarget);
const id = $button.data('id');
that.confirm_delete(id);
});
}
// Pagination
if (that.args.pagination !== false) {
that.$sid('prev_page').on('click', e => {
e.preventDefault();
that.go_to_page(that.data.pagination.current_page - 1);
});
that.$sid('next_page').on('click', e => {
e.preventDefault();
that.go_to_page(that.data.pagination.current_page + 1);
});
that.$.find('.page-link[data-page]').on('click', e => {
e.preventDefault();
const $link = $(e.currentTarget);
const page = int($link.data('page'));
that.go_to_page(page);
});
}
}
/**
* Update UI to show how many rows are selected
*/
update_selection_count() {
const that = this;
const selected = that.$.find('tbody input[type="checkbox"]:checked').length;
if (selected > 0) {
// Could show a banner: "3 items selected"
console.log(`${selected} items selected`);
// Fire event for parent components to listen to
that.$.trigger('selection:changed', {
count: selected
});
}
}
/**
* Get array of selected IDs
*/
get_selected_ids() {
const that = this;
const ids = [];
that.$.find('tbody input[type="checkbox"]:checked').each((i, checkbox) => {
const $checkbox = $(checkbox);
const id = $checkbox.data('id');
if (id) ids.push(id);
});
return ids;
}
/**
* Clear all selections
*/
clear_selection() {
const that = this;
that.$.find('input[type="checkbox"]').prop('checked', false);
that.update_selection_count();
}
/**
* Confirm deletion of a row
*/
confirm_delete(id) {
const that = this;
// In a real app, show a Bootstrap modal
if (confirm('Are you sure you want to delete this item?')) {
that.delete_row(id);
}
}
/**
* Delete a row (would typically make API call)
*/
async delete_row(id) {
const that = this;
try {
// Make API call
// await fetch(`${that.args.api_url}/${id}`, { method: 'DELETE' });
// Remove row from data
that.data.rows = that.data.rows.filter(row => row.id !== id);
// Re-render component
that.refresh();
// Show success message
console.log(`Deleted item ${id}`);
} catch (error) {
console.error('Delete failed:', error);
alert('Failed to delete item');
}
}
/**
* Navigate to a specific page
*/
async go_to_page(page) {
const that = this;
if (page < 1 || page > that.data.pagination.total_pages) {
return;
}
// Show loading state
that.$.find('tbody').css('opacity', '0.5');
try {
// Fetch new page
const url = `${that.args.api_url}?page=${page}`;
const response = await fetch(url);
that.data = await response.json();
// Re-render
that.refresh();
} catch (error) {
console.error('Pagination failed:', error);
that.$.find('tbody').css('opacity', '1');
}
}
/**
* Refresh the table (reload data and re-render)
*/
async reload_data() {
const that = this;
that.data = {}; // Clear data to show loading state
that.refresh();
await that.on_load();
that.refresh();
}
/**
* Generate sample data for demonstration purposes
*/
generate_sample_data() {
const that = this;
const statuses = [{
label: 'Active',
color: 'success'
}, {
label: 'Pending',
color: 'warning'
}, {
label: 'Inactive',
color: 'secondary'
}, {
label: 'Suspended',
color: 'danger'
}];
const first_names = ['John', 'Sarah', 'Michael', 'Emily', 'David', 'Lisa', 'Robert', 'Jennifer', 'William', 'Amanda'];
const last_names = ['Smith', 'Johnson', 'Brown', 'Garcia', 'Martinez', 'Lee', 'Anderson', 'Thompson', 'White', 'Davis'];
const companies = ['Acme Corp', 'Tech Solutions', 'Global Enterprises', 'Innovation Labs', 'Digital Systems', 'Cloud Services', 'Smart Industries', 'Future Networks', 'Prime Consulting', 'Elite Partners'];
const rows = [];
const count = that.args.showing || 10;
for (let i = 0; i < count; i++) {
const first_name = first_names[Math.floor(Math.random() * first_names.length)];
const last_name = last_names[Math.floor(Math.random() * last_names.length)];
const company = companies[Math.floor(Math.random() * companies.length)];
const status = statuses[Math.floor(Math.random() * statuses.length)];
rows.push({
id: `C${str(i + 1).padStart(3, '0')}`,
name: `${first_name} ${last_name}`,
company: company,
email: `${first_name.toLowerCase()}.${last_name.toLowerCase()}@${company.toLowerCase().replace(/\s+/g, '')}.com`,
phone: `(555) ${str(Math.floor(Math.random() * 900) + 100)}-${str(Math.floor(Math.random() * 9000) + 1000)}`,
status: status.label,
status_color: status.color,
created: that.random_date()
});
}
return {
rows: rows,
pagination: {
current_page: 1,
total_pages: Math.ceil((that.args.total || 100) / count),
from: 1,
to: count,
total: that.args.total || 100,
pages: [1, 2, 3, '...', Math.ceil((that.args.total || 100) / count)]
}
};
}
/**
* Generate random date for sample data
*/
random_date() {
const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
const month = months[Math.floor(Math.random() * 12)];
const day = Math.floor(Math.random() * 28) + 1;
return `${month} ${str(day).padStart(2, '0')}, 2024`;
}
}
/* === rsx/theme/components/_archived/unfinished/Search_Bar.js (babel) === */
"use strict";
class Search_Bar extends Component {
on_ready() {
// Bind search event
const $input = this.$sid('input');
$input.on('input', e => {
if (this.args.on_search) {
this.args.on_search(e.target.value);
}
});
}
}
/* === rsx/theme/components/_archived/unfinished/Searchable_Select.js (babel) === */
"use strict";
class Searchable_Select extends Component {
on_ready() {
this.selected_value = this.args.value || null;
this.all_options = this.args.options || [];
if (this.all_options.length > 0) {
this.render_options(this.all_options);
}
// Search functionality
const $search = this.$sid('search');
$search.on('input', e => {
this.filter_options(e.target.value);
});
// Prevent dropdown close when clicking search input
$search.on('click', e => {
e.stopPropagation();
});
// Update selected text if initial value provided
if (this.selected_value) {
const selected_option = this.all_options.find(opt => opt.value == this.selected_value);
if (selected_option) {
this.$sid('selected_text').text(selected_option.label);
}
}
}
render_options(options) {
const $container = this.$sid('options');
$container.empty();
if (options.length === 0) {
$container.append($('<div>').addClass('px-3 py-2 text-muted').text('No options found'));
return;
}
options.forEach(option => {
const $item = $('<a>').addClass('dropdown-item').attr('href', '#').text(option.label).attr('data-value', option.value);
if (option.value == this.selected_value) {
$item.addClass('active');
}
$item.on('click', e => {
e.preventDefault();
this.select_option(option);
});
$container.append($item);
});
}
filter_options(query) {
const filtered = this.all_options.filter(opt => opt.label.toLowerCase().includes(query.toLowerCase()));
this.render_options(filtered);
}
select_option(option) {
this.selected_value = option.value;
this.$sid('selected_text').text(option.label);
// Update active state
this.$sid('options').find('.dropdown-item').removeClass('active');
this.$sid('options').find(`[data-value="${option.value}"]`).addClass('active');
// Close dropdown
const dropdown = bootstrap.Dropdown.getInstance(this.$sid('button')[0]);
if (dropdown) {
dropdown.hide();
}
// Clear search
this.$sid('search').val('');
this.render_options(this.all_options);
// Trigger callback
if (this.args.on_change) {
this.args.on_change(option.value, option);
}
}
get_value() {
return this.selected_value;
}
set_value(value) {
this.selected_value = value;
const option = this.all_options.find(opt => opt.value == value);
if (option) {
this.$sid('selected_text').text(option.label);
this.$sid('options').find('.dropdown-item').removeClass('active');
this.$sid('options').find(`[data-value="${value}"]`).addClass('active');
}
}
set_options(options) {
this.all_options = options;
this.render_options(options);
}
}
/* === rsx/theme/components/_archived/unfinished/Select_Dropdown.js (babel) === */
"use strict";
/**
* Select_Dropdown - Bootstrap 5 Dropdown Selection Component
*
* Purpose: Dropdown menu for selecting one option from a list
* Design: Bootstrap .form-select styling with dropdown arrow
* Content: Contains <option> elements
*/
class Select_Dropdown extends Component {
on_ready() {
// Set value if provided
if (this.args.value) {
this.$.val(this.args.value);
}
// Add custom classes if provided
if (this.args.class) {
this.$.addClass(this.args.class);
}
// Set disabled state if provided
if (this.args.disabled) {
this.$.prop('disabled', true);
}
// Set required attribute if provided
if (this.args.required) {
this.$.prop('required', true);
}
}
}
/* === rsx/theme/components/_archived/unfinished/Sidebar_Nav.js (babel) === */
"use strict";
class Sidebar_Nav extends Component {
on_ready() {
// Auto-wrap children in nav structure if needed
const $nav_items = this.$sid('nav_items');
$nav_items.children().each(function () {
const $child = $(this);
if ($child.prop('tagName') !== 'LI') {
const $li = $('<li>').addClass('nav-item');
$child.addClass('nav-link');
$child.wrap($li);
}
});
// Set active state based on current URL
const current_path = window.location.pathname;
$nav_items.find('a.nav-link').each(function () {
const $link = $(this);
if ($link.attr('href') === current_path) {
$link.addClass('active');
}
});
}
}
/* === rsx/theme/components/_archived/unfinished/Sortable_Column_Header.js (babel) === */
"use strict";
class Sortable_Column_Header extends Component {
on_ready() {
// Click to toggle sort
this.$.on('click', () => {
this.toggle_sort();
});
// Set initial sort state
if (this.args.sort) {
this.set_sort(this.args.sort); // 'asc' or 'desc'
}
}
toggle_sort() {
const current = this.$.attr('data-sort') || 'none';
const next = current === 'none' ? 'asc' : current === 'asc' ? 'desc' : 'asc';
this.set_sort(next);
// Call callback if provided
if (this.args.on_sort) {
this.args.on_sort(this.args.column, next);
}
}
set_sort(direction) {
this.$.attr('data-sort', direction);
const $icon = this.$sid('sort_icon');
if (direction === 'asc') {
$icon.html('<i class="text-primary">↑</i>');
} else if (direction === 'desc') {
$icon.html('<i class="text-primary">↓</i>');
} else {
$icon.html('<i class="text-muted">⇅</i>');
}
}
}
/* === rsx/theme/components/_archived/unfinished/Spinner.js (babel) === */
"use strict";
class Spinner extends Component {
on_ready() {
// Apply size (sm)
if (this.args.size === 'sm') {
this.$.addClass('spinner-border-sm');
}
// Apply color
if (this.args.color) {
this.$.addClass(`text-${this.args.color}`);
}
}
}
/* === rsx/theme/components/_archived/unfinished/Stat_Card.js (babel) === */
"use strict";
class Stat_Card extends Component {
on_ready() {
// No special behavior
}
}
/* === rsx/theme/components/_archived/unfinished/Status_Badge.js (babel) === */
"use strict";
class Status_Badge extends Component {
on_ready() {
// Apply color based on content or args
const status = this.args.status || this.$.text().trim().toLowerCase();
// Default color mappings
const color_map = {
'active': 'bg-success',
'pending': 'bg-warning',
'completed': 'bg-primary',
'cancelled': 'bg-danger',
'draft': 'bg-secondary',
'archived': 'bg-dark'
};
const bg_class = this.args.bg_class || color_map[status] || 'bg-secondary';
this.$.addClass(bg_class);
}
}
/* === rsx/theme/components/_archived/unfinished/Tab_Content.js (babel) === */
"use strict";
class Tab_Content extends Component {
on_ready() {
// Ensure children have tab-pane class
this.$.children().each(function () {
const $child = $(this);
$child.addClass('tab-pane fade');
// Set first pane as active if none active
if ($child.parent().find('.tab-pane.active').length === 0 && $child.index() === 0) {
$child.addClass('show active');
}
});
}
}
/* === rsx/theme/components/_archived/unfinished/Table_Pagination.js (babel) === */
"use strict";
class Table_Pagination extends Component {
on_ready() {
// Generate pagination if pages provided via args
if (this.args.current_page && this.args.total_pages) {
this.generate_pagination(this.args.current_page, this.args.total_pages);
}
}
generate_pagination(current, total) {
const $pagination = this.$sid('pagination');
$pagination.empty();
// Previous button
const $prev = $('<li>').addClass('page-item' + (current === 1 ? ' disabled' : ''));
$prev.append($('<a>').addClass('page-link').attr('href', '#').text('Previous'));
$pagination.append($prev);
// Page numbers (show 5 pages max)
let start = Math.max(1, current - 2);
let end = Math.min(total, current + 2);
for (let i = start; i <= end; i++) {
const $li = $('<li>').addClass('page-item' + (i === current ? ' active' : ''));
$li.append($('<a>').addClass('page-link').attr('href', '#').text(i));
$pagination.append($li);
}
// Next button
const $next = $('<li>').addClass('page-item' + (current === total ? ' disabled' : ''));
$next.append($('<a>').addClass('page-link').attr('href', '#').text('Next'));
$pagination.append($next);
}
}
/* === rsx/theme/components/_archived/unfinished/Table.js (babel) === */
"use strict";
class Table extends Component {
on_ready() {
// Apply variant from args
if (this.args.variant) {
this.$.addClass(`table-${this.args.variant}`); // striped, bordered, borderless
}
// Apply size
if (this.args.size === 'sm') {
this.$.addClass('table-sm');
}
}
}
/* === rsx/theme/components/_archived/unfinished/Tabs.js (babel) === */
"use strict";
class Tabs extends Component {
on_ready() {
// Wrap children in nav-item structure
this.$.children().each(function () {
const $child = $(this);
if ($child.prop('tagName') !== 'LI') {
const $li = $('<li>').addClass('nav-item');
$child.addClass('nav-link');
$child.wrap($li);
}
});
// Set first tab as active if none active
if (this.$.find('.nav-link.active').length === 0) {
this.$.find('.nav-link').first().addClass('active');
}
}
}
/* === rsx/theme/components/_archived/unfinished/Tag_Group.js (babel) === */
"use strict";
class Tag_Group extends Component {
on_ready() {
// No special behavior needed
}
}
/* === rsx/theme/components/_archived/unfinished/Tag.js (babel) === */
"use strict";
class Tag extends Component {
on_ready() {
// Apply color from args
if (this.args.color) {
this.$.removeClass('bg-secondary').addClass(`bg-${this.args.color}`);
}
}
}
/* === rsx/theme/components/_archived/unfinished/text_display.js (babel) === */
"use strict";
class Text_Display extends Component {
// Generic text display - inherits Bootstrap typography
}
/* === rsx/theme/components/_archived/unfinished/Textarea.js (babel) === */
"use strict";
/**
* Textarea - Bootstrap 5 Multi-line Text Input Component
*
* Purpose: Multi-line text input for longer content like descriptions, comments, notes
* Design: Bootstrap .form-control styling (same as Input)
*/
class Textarea extends Component {
on_ready() {
// Set rows if provided
if (this.args.rows) {
this.$.attr('rows', this.args.rows);
}
// Set placeholder if provided
if (this.args.placeholder) {
this.$.attr('placeholder', this.args.placeholder);
}
// Set value if provided (overrides content())
if (this.args.value) {
this.$.val(this.args.value);
}
// Add custom classes if provided
if (this.args.class) {
this.$.addClass(this.args.class);
}
// Set disabled state if provided
if (this.args.disabled) {
this.$.prop('disabled', true);
}
// Set required attribute if provided
if (this.args.required) {
this.$.prop('required', true);
}
}
}
/* === rsx/theme/components/_archived/unfinished/Three_Column_Layout.js (babel) === */
"use strict";
class Three_Column_Layout extends Component {
on_ready() {
// Wrap each direct child in responsive column classes
this.$.children().each(function () {
const $element = $(this);
$element.addClass('col-12 col-md-6 col-xl-4 mb-4');
});
}
}
/* === rsx/theme/components/_archived/unfinished/Time_Picker.js (babel) === */
"use strict";
class Time_Picker extends Component {
on_ready() {
const $input = this.$sid('input');
if (this.args.value) {
$input.val(this.args.value);
}
if (this.args.name) {
$input.attr('name', this.args.name);
}
if (this.args.min) {
$input.attr('min', this.args.min);
}
if (this.args.max) {
$input.attr('max', this.args.max);
}
if (this.args.step) {
$input.attr('step', this.args.step);
}
if (this.args.disabled) {
$input.prop('disabled', true);
}
if (this.args.readonly) {
$input.prop('readonly', true);
}
if (this.args.required) {
$input.prop('required', true);
}
if (this.args.on_change) {
$input.on('change', e => {
this.args.on_change(e.target.value);
});
}
}
get_value() {
return this.$sid('input').val();
}
set_value(value) {
this.$sid('input').val(value);
}
focus() {
this.$sid('input').focus();
}
}
/* === rsx/theme/components/_archived/unfinished/Timeline.js (babel) === */
"use strict";
class Timeline extends Component {
// Pure Bootstrap flexbox - no JavaScript needed
}
/* === rsx/theme/components/_archived/unfinished/Timestamp_Display.js (babel) === */
"use strict";
class Timestamp_Display extends Component {
// Pure Bootstrap styling - no JavaScript needed
}
/* === rsx/theme/components/_archived/unfinished/Tooltip.js (babel) === */
"use strict";
class Tooltip extends Component {
on_ready() {
// Set tooltip text from args
if (this.args.text) {
this.$.attr('data-bs-title', this.args.text);
}
// Set placement
if (this.args.placement) {
this.$.attr('data-bs-placement', this.args.placement);
}
// Initialize Bootstrap tooltip
new bootstrap.Tooltip(this.$[0]);
}
}
/* === rsx/theme/components/_archived/unfinished/Top_Nav.js (babel) === */
"use strict";
class Top_Nav extends Component {
on_ready() {
// Wrap children in nav structure
const $nav = this.$sid('nav_items');
$nav.children().each(function () {
const $child = $(this);
if ($child.prop('tagName') !== 'LI') {
const $li = $('<li>').addClass('nav-item');
$child.addClass('nav-link');
$child.wrap($li);
}
});
}
}
/* === rsx/theme/components/_archived/unfinished/Trend_Indicator.js (babel) === */
"use strict";
class Trend_Indicator extends Component {
on_ready() {
const text = this.$.text().trim();
const is_positive = text.startsWith('+');
const is_negative = text.startsWith('-');
if (is_positive) {
this.$.addClass('text-success fw-bold');
} else if (is_negative) {
this.$.addClass('text-danger fw-bold');
} else {
this.$.addClass('text-muted fw-bold');
}
this.$.addClass('d-block mt-1');
}
}
/* === rsx/theme/components/_archived/unfinished/Two_Column_Layout.js (babel) === */
"use strict";
class Two_Column_Layout extends Component {
on_ready() {
// Wrap each direct child in responsive column classes
this.$.children().each(function () {
const $element = $(this);
$element.addClass('col-12 col-lg-6 mb-4');
});
}
}
/* === rsx/theme/components/_archived/unfinished/User_Avatar_Dropdown.js (babel) === */
"use strict";
class User_Avatar_Dropdown extends Component {
on_ready() {
// Ensure proper dropdown item structure
const $menu = this.$sid('menu');
$menu.children().each(function () {
const $child = $(this);
if ($child.prop('tagName') !== 'LI') {
const $li = $('<li>');
if ($child.prop('tagName') === 'HR') {
$li.append($('<hr>').addClass('dropdown-divider'));
$child.replaceWith($li);
} else {
$child.addClass('dropdown-item');
$child.wrap($li);
}
}
});
}
}
/* === rsx/theme/components/modal/modal_abstract.js (babel) === */
"use strict";
/**
* Modal_Abstract - Base class for modal orchestration classes
*
* **Philosophy**:
* Modal classes are orchestration layers that manage the lifecycle of showing
* a modal, collecting user input, and returning results. They do NOT contain
* form validation or business logic - that belongs in jqhtml components and
* controller endpoints.
*
* **Purpose**:
* - Provides a common base class for type identification
* - Enforces file naming conventions (modal classes end with _Modal)
* - Documents the modal class pattern
* - Enables framework-level features (future: discovery, validation)
*
* **Responsibilities of Modal Classes**:
* - Invoke Modal.form() / Modal.show() / Modal.confirm() with appropriate configuration
* - Handle modal lifecycle (show, submit, cancel, errors)
* - Return Promise that resolves with data or false
* - Encapsulate modal-specific UI logic
*
* **Contract**:
* All modal classes extending Modal_Abstract must implement:
* - `static async show(params)`: Primary entry point, returns Promise
*
* **Return Values**:
* - Success: Resolve with data object (e.g., created user record)
* - Cancel/Close: Resolve with false
* - Error: Show error in modal, keep open, don't resolve until user acts
*
* **Integration**:
* Modal classes use Modal.js static API (Modal.form(), Modal.show(), etc.)
* as building blocks. Form validation handled by Rsx_Form and Form_Utils.
* Page JS orchestrates modal flow but doesn't contain modal UI logic.
*
* **Pattern Examples**:
*
* Simple form modal:
* ```
* class Add_User_Modal extends Modal_Abstract {
* static async show() {
* const result = await Modal.form({
* title: 'Add User',
* component: 'Add_User_Modal_Form',
* on_submit: async (form) => {
* try {
* const values = form.vals();
* const result = await Controller.add_user(values);
* return result; // Close modal, return data
* } catch (error) {
* await form.render_error(error);
* return false; // Keep modal open
* }
* },
* });
* return result || false;
* }
* }
* ```
*
* Custom content modal:
* ```
* class Confirm_Delete_Modal extends Modal_Abstract {
* static async show({item_name}) {
* return await Modal.confirm(
* 'Confirm Delete',
* `Are you sure you want to delete ${item_name}?`
* );
* }
* }
* ```
*
* Modal with backend call:
* ```
* class Send_Invite_Modal extends Modal_Abstract {
* static async show(user_id) {
* const result = await Controller.send_invite({user_id});
* if (result.invite_url) {
* await Modal.alert('Invite Sent', result.invite_url);
* }
* return result;
* }
* }
* ```
*
* **Usage Pattern**:
* ```
* // Page JS orchestrates flow, modals handle UI
* const user = await Add_User_Modal.show();
* if (user) {
* $('.Users_DataGrid').component().reload();
* await Send_User_Invite_Modal.show(user.id);
* }
* ```
*
* **Best Practices**:
* - Keep modal classes focused: one modal = one class
* - Page JS orchestrates sequence, modal classes handle individual modals
* - Modal classes don't call each other directly
* - Modal classes don't update UI (grids, lists) - page JS does that
* - Use descriptive names ending in _Modal (Add_User_Modal, Send_Invite_Modal)
* - Place feature-specific modals in feature directory
* - Place reusable modals in theme/components/modal/
*
* **When to Use Modal Classes**:
* - Multi-step forms
* - Forms with complex validation
* - Modals called from multiple places
* - Modals with backend interactions
*
* **When NOT to Use Modal Classes**:
* - Simple alerts: `await Modal.alert('Saved!')`
* - Simple confirmations: `if (await Modal.confirm('Delete?')) {...}`
* - One-off prompts: `const name = await Modal.prompt('Enter name:')`
*/
class Modal_Abstract {
// This class provides structure and documentation for modal patterns.
// Concrete modal classes extend this and implement static show() method.
}
/* === rsx/theme/components/modal/rsx_modal.js (babel) === */
"use strict";
/**
* Rsx_Modal Component
*
* Instance of a modal dialog. Handles lifecycle, sizing, and user interaction.
* Typically created and managed by the Modal static API class.
*/
class Rsx_Modal extends Component {
on_create() {
this.data.title = '';
this.data.body_content = null;
this.data.buttons = [];
this.data.closable = true;
this.data.max_width = 800;
this.data.close_on_submit = true;
this.data.is_visible = false;
this.data.result_promise = null;
this.data.resolve_fn = null;
// Store reference to bootstrap modal instance
this._bs_modal = null;
this._resize_handler = null;
}
on_ready() {
const that = this;
// Set up close button handler
this.$sid('close_btn').on('click', function (e) {
e.preventDefault();
if (that.data.closable) {
that.close(false);
}
});
// Set up backdrop click handler
this.$sid('backdrop').on('click', function (e) {
if (that.data.closable && e.target === this) {
that.close(false);
}
});
// Set up ESC key handler
$(document).on('keydown.rsx_modal_' + this._cid, function (e) {
if (e.key === 'Escape' && that.data.closable && that.data.is_visible) {
that.close(false);
}
});
// Set up resize handler
this._resize_handler = debounce(() => {
if (that.data.is_visible) {
that._apply_sizing();
}
}, 100);
$(window).on('resize.rsx_modal_' + this._cid, this._resize_handler);
}
/**
* Configure and show the modal
* @param {Object} options - Modal options (title, body, buttons, etc.)
* @param {Object} internal_options - Internal options (skip_backdrop, animate)
*/
async show(options) {
let internal_options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
const that = this;
const skip_backdrop = internal_options.skip_backdrop || false;
const should_animate = internal_options.animate || false;
console.log('[Rsx_Modal] show() called with options:', options);
// Store options
this.data.title = options.title || '';
this.data.closable = options.closable !== undefined ? options.closable : true;
this.data.max_width = options.max_width || 800;
this.data.close_on_submit = options.close_on_submit !== undefined ? options.close_on_submit : true;
this.data.buttons = options.buttons || [];
this.data.skip_backdrop = skip_backdrop;
this.data.icon = options.icon || null;
console.log('[Rsx_Modal] Setting title to:', this.data.title);
console.log('[Rsx_Modal] Title element:', this.$sid('title'));
// Set title
this.$sid('title').text(this.data.title);
// Show/hide close button based on closable
if (this.data.closable) {
this.$sid('close_btn').show();
} else {
this.$sid('close_btn').hide();
}
// Set body content (with optional icon)
this._set_body_content(options.body, this.data.icon);
// Set buttons
this._set_buttons();
// Create promise that will resolve when modal closes
const result_promise = new Promise(resolve => {
that.data.resolve_fn = resolve;
});
// Show modal and backdrop
this.data.is_visible = true;
// Append to body so it's on top (don't append backdrop if using shared)
if (!skip_backdrop) {
$('body').append(this.$sid('backdrop'));
}
$('body').append(this.$);
// Apply sizing before showing
this._apply_sizing();
// Fade in modal (and backdrop if not using shared)
await this._fade_in(should_animate);
// Auto-focus first input element
this._focus_first_input();
return result_promise;
}
/**
* Set body content with optional icon
*/
_set_body_content(body, icon) {
const $body = this.$sid('body');
$body.empty();
// If icon provided, add it
if (icon) {
const $icon = $(`<i class="bi bi-${icon} modal-icon"></i>`);
$body.append($icon);
$body.addClass('has-icon');
} else {
$body.removeClass('has-icon');
}
// Get or create body content wrapper
let $content = this.$sid('body_content');
if (!$content.exists()) {
$content = $('<div class="modal-body-content"></div>');
$body.append($content);
}
if (typeof body === 'string') {
// Text content - escape and convert newlines
const escaped = $('<div>').text(body).html().replace(/\n/g, '<br>');
$content.html(escaped);
} else if (body instanceof jQuery) {
// jQuery element
$content.append(body);
} else if (body && typeof body === 'object') {
// Assume it's a jqhtml component instance
$content.append(body.$);
}
}
/**
* Set buttons in footer
*/
_set_buttons() {
const that = this;
const $footer = this.$sid('footer');
$footer.empty();
if (this.data.buttons.length === 0) {
$footer.hide();
return;
}
$footer.show();
for (let button_def of this.data.buttons) {
const $button = $('<button>').attr('type', 'button').addClass('btn').addClass(button_def.class || 'btn-secondary').text(button_def.label || 'Button');
$button.on('click', async function () {
let result = button_def.value;
let had_callback = false;
// If button has a callback, call it and use return value as result
if (button_def.callback && typeof button_def.callback === 'function') {
had_callback = true;
result = await button_def.callback();
}
// If callback returned false, keep modal open (but not if just button value is false)
if (result === false && had_callback) {
return;
}
// Close modal with result
that.close(result);
});
$footer.append($button);
}
}
/**
* Calculate and apply responsive sizing
*/
_apply_sizing() {
const viewport_width = $(window).width();
const viewport_height = $(window).height();
const is_mobile = viewport_width < 768;
// Calculate max width based on viewport
let max_width = this.data.max_width;
const viewport_limit = is_mobile ? viewport_width * 0.9 : viewport_width * 0.8;
max_width = Math.min(max_width, viewport_limit);
// Try to constrain to 60% width for better proportions on desktop
if (!is_mobile) {
const preferred_width = viewport_width * 0.6;
if (preferred_width < max_width) {
max_width = preferred_width;
}
}
// Apply width
this.$sid('dialog').css('max-width', max_width + 'px');
// Check if content exceeds 80% height
const content_height = this.$sid('dialog').outerHeight();
const max_height = viewport_height * 0.8;
if (content_height > max_height) {
// Enable scrolling
this.$sid('dialog').css('max-height', max_height + 'px');
this.$sid('body').css({
'overflow-y': 'auto',
'max-height': max_height - 150 + 'px' // Account for header/footer
});
} else {
// Reset scrolling
this.$sid('dialog').css('max-height', '');
this.$sid('body').css({
'overflow-y': '',
'max-height': ''
});
}
// Mobile edge spacing
if (is_mobile) {
this.$sid('dialog').css('margin', '5%');
} else {
this.$sid('dialog').css('margin', '0');
}
}
/**
* Show animation (instant or with fly-in)
* @param {boolean} animate - Whether to animate the modal entrance
*/
async _fade_in() {
let animate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
if (animate) {
// Initial state: modal positioned above final position
this.$.css('display', 'flex').css('opacity', '0');
this.$sid('modal').css({
'transform': 'translate(0, -50px)',
'opacity': '0'
});
this.$sid('backdrop').css('display', 'block').addClass('show');
// Force reflow
this.$sid('modal')[0].offsetHeight;
// Trigger animation
this.$sid('modal').addClass('show').css({
'transform': 'translate(0, 0)',
'opacity': '1'
});
this.$.css('opacity', '1');
// Wait for animation to complete
await new Promise(resolve => setTimeout(resolve, 150));
} else {
// Disable transitions temporarily for instant display
this.$sid('dialog').css('transition', 'none');
// Show modal and backdrop instantly
this.$.css('display', 'flex').css('opacity', '1');
this.$sid('modal').addClass('show').css('opacity', '1');
this.$sid('backdrop').css('display', 'block').addClass('show');
// Force reflow to apply the no-transition state
this.$sid('dialog')[0].offsetHeight;
// Re-enable transitions for future animations
this.$sid('dialog').css('transition', '');
}
return Promise.resolve();
}
/**
* Focus the first input element in the modal
*/
_focus_first_input() {
// Find first input/textarea/select in modal body
const $first_input = this.$sid('body').find('input:not([type="hidden"]), textarea, select').first();
if ($first_input.exists()) {
requestAnimationFrame(() => {
$first_input.focus();
// Select text if it's an input with existing value
if ($first_input.is('input[type="text"], input[type="email"]') && $first_input.val()) {
$first_input.select();
}
});
}
}
/**
* Close the modal instantly
*/
async close(result) {
const that = this;
// Mark as not visible
this.data.is_visible = false;
// Remove event listeners
$(document).off('keydown.rsx_modal_' + this._cid);
$(window).off('resize.rsx_modal_' + this._cid);
// Hide instantly (no fade out)
this.$.hide();
this.$sid('backdrop').hide();
// Remove from DOM
this.$.remove();
this.$sid('backdrop').remove();
// Resolve promise
if (this.data.resolve_fn) {
this.data.resolve_fn(result);
this.data.resolve_fn = null;
}
}
/**
* Apply validation errors to form fields in modal body
*/
apply_errors(errors) {
// Use Form_Utils to apply errors to elements within modal body
Form_Utils.apply_form_errors(this.$sid('body'), errors);
}
}
/* === rsx/theme/components/modal/Modal.js (babel) === */
"use strict";
function _d1f5a3cb_defineProperty(e, r, t) { return (r = _d1f5a3cb_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _d1f5a3cb_toPropertyKey(t) { var i = _d1f5a3cb_toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
function _d1f5a3cb_toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
/**
* Modal Static API
*
* Primary interface for displaying modals throughout the application.
* Provides simple methods for common dialogs and flexible options for custom modals.
*
* Usage:
* await Modal.alert("File saved")
* if (await Modal.confirm("Delete?")) { ... }
* let name = await Modal.prompt("Enter name:")
* let result = await Modal.show({ title, body, buttons })
*/
class Modal {
/**
* Initialize global handlers (called automatically on first modal)
* @private
*/
static _init() {
if (this._initialized) return;
this._initialized = true;
// Create shared backdrop element
this._backdrop = $('<div class="modal-backdrop fade"></div>');
$('body').append(this._backdrop);
}
/**
* Calculate scrollbar width
* @private
* @returns {number}
*/
static _get_scrollbar_width() {
// Create temporary element to measure scrollbar width
const $outer = $('<div>').css({
visibility: 'hidden',
overflow: 'scroll',
width: '100px',
position: 'absolute',
top: '-9999px'
});
$('body').append($outer);
const width_with_scrollbar = $outer[0].offsetWidth;
const $inner = $('<div>').css('width', '100%');
$outer.append($inner);
const width_without_scrollbar = $inner[0].offsetWidth;
$outer.remove();
return width_with_scrollbar - width_without_scrollbar;
}
/**
* Lock body scroll and compensate for scrollbar width
* Only locks if we haven't already saved the original state (first modal in chain)
* @private
*/
static _lock_body_scroll() {
// Cancel any pending unlock timeout
if (this._unlock_timeout) {
clearTimeout(this._unlock_timeout);
this._unlock_timeout = null;
}
// Only lock scroll if we haven't already saved state (first modal)
// This is the true indicator - not backdrop visibility which can be transitional
if (this._original_body_overflow === null) {
const $body = $('body');
// Store original values
this._original_body_overflow = $body.css('overflow');
this._original_body_padding = $body.css('padding-right');
// Check if body currently has vertical scroll
const has_scrollbar = document.body.scrollHeight > window.innerHeight;
// If there's a scrollbar, add padding to compensate for its removal
if (has_scrollbar) {
const scrollbar_width = this._get_scrollbar_width();
const current_padding = int(this._original_body_padding) || 0;
$body.css('padding-right', current_padding + scrollbar_width + 'px');
}
// Lock scroll
$body.css('overflow', 'hidden');
}
}
/**
* Unlock body scroll and restore original state
* Uses delayed check to ensure no other modals are opening
* @private
*/
static _unlock_body_scroll() {
// Clear any existing timeout
if (this._unlock_timeout) {
clearTimeout(this._unlock_timeout);
}
// Minimal delay before unlocking
this._unlock_timeout = setTimeout(() => {
// Double-check no modal is currently open and queue is empty
if (!this._current && this._queue.length === 0) {
const $body = $('body');
// Restore original values
if (this._original_body_overflow !== null) {
$body.css('overflow', this._original_body_overflow);
this._original_body_overflow = null;
}
if (this._original_body_padding !== null) {
$body.css('padding-right', this._original_body_padding);
this._original_body_padding = null;
}
}
this._unlock_timeout = null;
}, 50); // Minimal safety buffer
}
/**
* Show the shared backdrop (instant - no animation)
* @private
*/
static async _show_backdrop() {
if (!this._backdrop.hasClass('show')) {
// Lock body scroll before showing backdrop
this._lock_body_scroll();
this._backdrop.css('display', 'block').addClass('show');
// No delay - return immediately
}
}
/**
* Hide the shared backdrop (instant - no animation)
* @private
*/
static async _hide_backdrop() {
this._backdrop.removeClass('show').css('display', 'none');
// Unlock body scroll after backdrop is hidden
this._unlock_body_scroll();
}
/**
* Create a new Rsx_Modal instance
* @private
*/
static async _create_modal() {
// Create modal component using jQuery plugin
const $modal_element = $('<div>');
// Create component instance directly (returns the component)
const modal_instance = $modal_element.component('Rsx_Modal', {});
// Wait for component to be fully ready (DOM elements queryable)
await new Promise(resolve => {
modal_instance.on('ready', () => {
console.log('[Modal] Component ready, elements:', {
title: modal_instance.$sid('title').length,
body: modal_instance.$sid('body').length,
footer: modal_instance.$sid('footer').length
});
resolve();
});
});
return modal_instance;
}
/**
* Show a modal and manage queue
* @private
*/
static async _show_modal(options) {
return new Promise(resolve => {
this._queue.push({
options,
resolve
});
// Process queue if no modal currently showing
if (!this._current) {
this._process_queue();
}
});
}
/**
* Process the modal queue
* @private
*/
static async _process_queue() {
if (this._queue.length === 0) {
this._current = null;
// Hide backdrop when queue is empty
await this._hide_backdrop();
return;
}
const {
options,
resolve
} = this._queue.shift();
// Ensure initialized
this._init();
// Show backdrop if not already visible (instant - no delay between modals)
const backdrop_visible = this._backdrop.hasClass('show');
if (!backdrop_visible) {
await this._show_backdrop();
}
// No delay between sequential modals - immediate transition
// Create modal instance
const modal_instance = await this._create_modal();
this._current = modal_instance;
// Determine if we should animate based on:
// 1. Desktop viewport (>= 1000px)
// 2. More than 1 second since last modal closed
const viewport_width = $(window).width();
const is_desktop = viewport_width >= 1000;
const time_since_last_close = Date.now() - this._last_close_timestamp;
const should_animate = is_desktop && time_since_last_close > 1000;
// Show modal and wait for result (modal won't create its own backdrop)
const result = await modal_instance.show(options, {
skip_backdrop: true,
animate: should_animate
});
// Record close timestamp BEFORE resolving (ensures it's set before next modal can start)
this._last_close_timestamp = Date.now();
// Resolve the promise with the result
resolve(result);
// Clear current and process next
this._current = null;
this._process_queue();
}
// ================================================================================
// State Management Methods
// ================================================================================
/**
* Check if a modal is currently open
* @returns {boolean}
*/
static is_open() {
return this._current !== null;
}
/**
* Get the currently open modal instance
* @returns {Rsx_Modal|null}
*/
static get_current() {
return this._current;
}
/**
* Force close the current modal
* @returns {Promise<void>}
*/
static async close() {
if (this._current) {
await this._current.close(false);
}
}
/**
* Apply validation errors to the current modal
* @param {Object} errors - Error object {field: message}
*/
static apply_errors(errors) {
if (this._current) {
this._current.apply_errors(errors);
}
}
// ================================================================================
// Simple Dialog Methods
// ================================================================================
/**
* Show an alert dialog
* @param {string|jQuery} title_or_body - Message (if only 1 arg) or Title (if 2 args). Can be string or jQuery element.
* @param {string|jQuery} body - Message body (if 2 args). Can be string or jQuery element.
* @param {string} button_label - Button text (default: "OK")
* @returns {Promise<void>}
*/
static async alert(title_or_body) {
let body = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
let button_label = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'OK';
let title = 'Notice';
let message = title_or_body;
if (body !== null) {
title = title_or_body;
message = body;
}
await this._show_modal({
title: title,
body: message,
buttons: [{
label: button_label,
value: true,
class: 'btn-primary',
default: true
}],
closable: true,
close_on_submit: true
});
}
/**
* Show a confirmation dialog
* @param {string|jQuery} title_or_body - Message (if 1-2 args) or Title (if 3-4 args). Can be string or jQuery element.
* @param {string|jQuery} body - Message body (optional). Can be string or jQuery element.
* @param {string} confirm_label - Confirm button text (default: "Confirm")
* @param {string} cancel_label - Cancel button text (default: "Cancel")
* @returns {Promise<boolean>}
*/
static async confirm(title_or_body) {
let body = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
let confirm_label = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'Confirm';
let cancel_label = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'Cancel';
let title = 'Confirm';
let message = title_or_body;
if (body !== null) {
title = title_or_body;
message = body;
}
const result = await this._show_modal({
title: title,
body: message,
buttons: [{
label: cancel_label,
value: false,
class: 'btn-secondary'
}, {
label: confirm_label,
value: true,
class: 'btn-primary',
default: true
}],
closable: true,
close_on_submit: true
});
return result === true;
}
/**
* Show a prompt dialog for text input
* @param {string|jQuery} title_or_body - Message (if 1-3 args) or Title (if 4 args). Can be string or jQuery element.
* @param {string|jQuery} body - Message body (optional). Can be string or jQuery element.
* @param {string} default_value - Default input value
* @param {boolean} multiline - Show textarea instead of input
* @param {string} error - Optional error message to display as validation feedback
* @returns {Promise<string|false>}
*/
static async prompt(title_or_body) {
let body = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
let default_value = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
let multiline = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
let error = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
let title = 'Input';
let message = title_or_body;
// Handle overloaded arguments
if (typeof body === 'string' && body !== '') {
title = title_or_body;
message = body;
}
// Create input element with minimum width constraints
const $input = multiline ? $('<textarea class="form-control" rows="4" style="min-width: 315px;"></textarea>') : $('<input type="text" class="form-control" style="min-width: 245px;">');
$input.val(default_value);
// Mark as invalid if there's an error
if (error) {
$input.addClass('is-invalid');
}
// Create body with message and input
let $body;
if (message instanceof jQuery) {
// If message is a jQuery element, use it as the container and append input
$body = message.append($input);
} else {
// If message is a string, create wrapper with text and input (36px spacing)
$body = $('<div class="form-group">').append($('<div style="margin-bottom: 36px;">').text(message)).append($input);
}
// Add error message if provided
if (error) {
const $error = $('<div class="invalid-feedback d-block"></div>').text(error);
$body.append($error);
}
const result = await this._show_modal({
title: title,
body: $body,
buttons: [{
label: 'Cancel',
value: false,
class: 'btn-secondary'
}, {
label: 'Submit',
value: null,
// Will be replaced by callback
class: 'btn-primary',
default: true,
callback: function () {
return $input.val();
}
}],
closable: true,
close_on_submit: true,
max_width: 500
});
// Focus and select input after modal shows
requestAnimationFrame(() => {
$input.focus();
if (!multiline) {
$input.select();
}
});
return result;
}
/**
* Show an error dialog with red alert styling
*
* Can appear over other modals to show critical uncaught exceptions.
* Used primarily for Ajax errors that weren't caught by application code.
*
* @param {string|Error|Object} error - Error message string, Error object, or structured error
* @param {string} title - Modal title (default: "Error")
* @returns {Promise<void>}
*/
static async error(error) {
let title = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'Error';
let message = '';
// Handle different error types
if (typeof error === 'string') {
message = error;
} else if (error instanceof Error) {
message = error.message || error.toString();
} else if (error && error.message) {
message = error.message;
} else if (error && error.error) {
// Fatal error with details
const details = error.error;
if (details.file && details.line) {
message = `Uncaught Fatal Error in ${details.file}:${details.line}:\n\n${details.error}`;
} else {
message = details.error || 'An unknown error occurred';
}
} else {
message = 'An unknown error occurred';
}
// Create error body with red alert styling
const $body = $('<div class="alert alert-danger mb-0" role="alert">').append($('<pre class="mb-0" style="white-space: pre-wrap; word-wrap: break-word; font-family: monospace; font-size: 0.9em;">').text(message));
await this._show_modal({
title: title,
body: $body,
buttons: [{
label: 'Close',
value: true,
class: 'btn-danger',
default: true
}],
closable: true,
close_on_submit: true,
max_width: 600
});
}
// ================================================================================
// Custom Modal Methods
// ================================================================================
/**
* Show a custom modal with specified content and buttons
* @param {Object} options
* @returns {Promise<*>}
*/
static async show(options) {
const defaults = {
title: 'Modal',
body: '',
buttons: [],
max_width: 800,
closable: true,
close_on_submit: true
};
const final_options = Object.assign({}, defaults, options);
return await this._show_modal(final_options);
}
/**
* Show a modal with a jqhtml form component
* @param {Object} options
* @param {string} options.component - Component class name
* @param {Object} options.component_args - Arguments to pass to component
* @param {Function} options.on_submit - Callback function called on submit. Receives form component instance.
* Return false to keep modal open, or return data to close and resolve.
* @returns {Promise<Object|false>}
*/
static async form(options) {
const defaults = {
title: 'Form',
component: null,
component_args: {},
max_width: 800,
closable: true,
submit_label: 'Submit',
cancel_label: 'Cancel',
on_submit: null
};
const final_options = Object.assign({}, defaults, options);
if (!final_options.component) {
console.error('Modal.form() requires a component');
return false;
}
// Create component instance
let $component_container = $('<div>');
let component_instance = $component_container.component(final_options.component, final_options.component_args);
// Wait for component to be ready
await new Promise(resolve => {
component_instance.on('ready', () => resolve());
});
// Find a form instance if component instance doesnt have .vals()
if (!component_instance.vals) {
let $form = component_instance.$.find('.Rsx_Form');
if ($form.exists()) {
component_instance = $form.component();
}
}
// Create buttons
const buttons = [{
label: final_options.cancel_label,
value: false,
class: 'btn-secondary'
}, {
label: final_options.submit_label,
value: null,
class: 'btn-primary',
default: true,
callback: async function () {
// If on_submit callback provided, use it
if (final_options.on_submit && typeof final_options.on_submit === 'function') {
const result = await final_options.on_submit(component_instance);
// If callback returns null/undefined, keep modal open
if (result === null || result === undefined) {
return false;
}
// Otherwise (including false), return the result to close modal
return result;
}
// No on_submit callback - get form data and close modal
if (component_instance.submit && typeof component_instance.submit === 'function') {
return await component_instance.submit();
} else if (component_instance.vals && typeof component_instance.vals === 'function') {
return component_instance.vals();
} else {
console.warn('Form component has no submit() or vals() method');
return true;
}
}
}];
return await this._show_modal({
title: final_options.title,
body: component_instance.$,
buttons: buttons,
max_width: final_options.max_width,
closable: final_options.closable
});
}
/**
* Show an unclosable modal
* @param {string} title_or_body
* @param {string} body
* @returns {Promise<void>}
*/
static async unclosable(title_or_body) {
let body = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
let title = 'Please Wait';
let message = title_or_body;
if (body !== null) {
title = title_or_body;
message = body;
}
// Don't wait for this promise - it never resolves until closed manually
this._show_modal({
title: title,
body: message,
buttons: [],
// No buttons
closable: false,
// Can't close
close_on_submit: false
});
// Wait for next animation frame for modal to render
await new Promise(resolve => requestAnimationFrame(resolve));
}
/**
* Show a modal with custom jQuery content
* @param {Object} options
* @returns {Promise<*>}
*/
static async custom(options) {
// Alias for show() - same functionality
return await this.show(options);
}
// ================================================================================
// Helper Methods
// ================================================================================
/**
* Show an error alert
* @param {*} errors
* @param {string} title
* @returns {Promise<void>}
*/
static async error(errors) {
let title = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'Error';
let message = 'An error occurred';
// Handle various error formats
if (typeof errors === 'string') {
message = errors;
} else if (errors && 'responseJSON' in errors && 'message' in errors.responseJSON) {
message = errors.responseJSON.message;
} else if (errors && 'message' in errors) {
message = errors.message;
} else if (errors && typeof errors === 'object') {
// Try to format error object
const error_messages = [];
for (const key in errors) {
if (is_array(errors[key])) {
error_messages.push(errors[key][0]);
} else {
error_messages.push(errors[key]);
}
}
if (error_messages.length > 0) {
message = error_messages.join('\n');
}
}
await this._show_modal({
title: title,
body: message,
icon: 'exclamation-circle',
buttons: [{
label: 'OK',
value: true,
class: 'btn-danger',
default: true
}],
closable: true,
close_on_submit: true
});
}
/**
* Reopen current modal with validation errors
* @param {Object} errors
* @returns {Promise<void>}
*/
static async reopen_with_errors(errors) {
if (this._current) {
// Modal is still open, just apply errors
this.apply_errors(errors);
} else {
console.warn('No modal open to apply errors to');
}
}
}
// Internal state
_d1f5a3cb_defineProperty(Modal, "_queue", []);
_d1f5a3cb_defineProperty(Modal, "_current", null);
_d1f5a3cb_defineProperty(Modal, "_initialized", false);
_d1f5a3cb_defineProperty(Modal, "_backdrop", null);
_d1f5a3cb_defineProperty(Modal, "_original_body_overflow", null);
_d1f5a3cb_defineProperty(Modal, "_original_body_padding", null);
_d1f5a3cb_defineProperty(Modal, "_unlock_timeout", null);
_d1f5a3cb_defineProperty(Modal, "_last_close_timestamp", 0);
/* === rsx/theme/components/page_elements/breadcrumb_item.js (babel) === */
"use strict";
class Breadcrumb_Item extends Component {
on_create() {
// Read href from HTML attribute if present
const href = this.$.attr('href');
if (href) {
this.args.href = href;
}
// Read active from HTML attribute if present
const active = this.$.attr('active');
if (active !== undefined) {
this.args.active = true;
this.$.addClass('active');
this.$.attr('aria-current', 'page');
this.$.removeAttr('active'); // Remove the attribute after reading
}
}
}
/* === rsx/theme/components/page_elements/client_label_link.js (babel) === */
"use strict";
class Client_Label_Link extends Component {
on_create() {
this.data.loading = true;
this.data.client = null;
// Convert client_id to number if it's a numeric string
if (this.args.client_id) {
this.args.client_id = value_unless_numeric_string_then_numeric_value(this.args.client_id);
}
}
async on_load() {
// Load client data if we have an ID
if (this.args.client_id) {
try {
this.data.client = await Frontend_Contacts_Controller.get_client({
client_id: this.args.client_id
});
this.data.loading = false;
} catch (error) {
console.error('Failed to load client:', error);
this.data.loading = false;
}
} else {
this.data.loading = false;
}
}
on_render() {
// Set href dynamically after each render
if (this.args.client_id) {
const href = Rsx.Route('Frontend_Clients_Controller', 'view', this.args.client_id);
this.$.attr('href', href);
} else {
this.$.attr('href', '#');
}
}
/**
* Get or set the client_id
* @param {number} [client_id] - If provided, sets the client_id and reloads
* @returns {number} Current client_id when called as getter
*/
val(client_id) {
if (arguments.length === 0) {
// Getter
return this.args.client_id;
} else {
// Setter - update client_id and reload
this.args.client_id = value_unless_numeric_string_then_numeric_value(client_id);
this.data.loading = true;
this.data.client = null;
// Reload client data and re-render (on_render will update href)
this.on_load().then(() => {
this.render();
});
}
}
}
/* === rsx/theme/components/page_elements/client_label.js (babel) === */
"use strict";
class Client_Label extends Component {
on_create() {
this.data.loading = true;
this.data.client = null;
// Convert client_id to number if it's a numeric string
if (this.args.client_id) {
this.args.client_id = value_unless_numeric_string_then_numeric_value(this.args.client_id);
}
}
async on_load() {
// Load client data if we have an ID
if (this.args.client_id) {
try {
this.data.client = await Frontend_Contacts_Controller.get_client({
client_id: this.args.client_id
});
this.data.loading = false;
} catch (error) {
console.error('Failed to load client:', error);
this.data.loading = false;
}
} else {
this.data.loading = false;
}
}
/**
* Get or set the client_id
* @param {number} [client_id] - If provided, sets the client_id and reloads
* @returns {number} Current client_id when called as getter
*/
val(client_id) {
if (arguments.length === 0) {
// Getter
return this.args.client_id;
} else {
// Setter - update client_id and reload
this.args.client_id = value_unless_numeric_string_then_numeric_value(client_id);
this.data.loading = true;
this.data.client = null;
// Reload client data and re-render (on_render will update href)
this.on_load().then(() => {
this.render();
});
}
}
}
/* === rsx/theme/components/inputs/form_input_abstract.js (babel) === */
"use strict";
/**
* Form_Input_Abstract - Base class for all form input widgets
*
* Defines the interface that all form widgets must implement.
* This ensures consistency across all input types (text, select, wysiwyg, etc.)
*
* REQUIRED METHODS (must be implemented by subclasses):
* - val() - Get current value (no arguments)
* - val(value) - Set value (one argument)
* - seed() - Fills the widget with random test data (optional)
*
* All widgets must:
* - Have .Widget CSS class
* - Have data-name attribute set by Form_Field
*/
class Form_Input_Abstract extends Component {
/**
* val() - Get or set the current value
* Subclasses MUST implement this method
*
* @param {*} [value] - If provided, sets the value. If omitted, returns the value.
* @returns {*} The current value when called as getter
*/
val(value) {
if (arguments.length === 0) {
// Getter
throw new Error(`${this.constructor.name} must implement val() getter`);
} else {
// Setter
throw new Error(`${this.constructor.name} must implement val(value) setter`);
}
}
/**
* Seed - Fill with random test data (optional)
* Subclasses MAY implement this method
*/
async seed() {
// Optional - widgets can override if they support seeding
}
}
/* === rsx/theme/components/inputs/text_input.js (babel) === */
"use strict";
class Text_Input extends Form_Input_Abstract {
on_create() {
this.data.value = '';
}
/**
* val() - Get or set the input value
* @param {string} [value] - If provided, sets the value
* @returns {string} The current value when called as getter
*/
val(value) {
if (arguments.length === 0) {
// Getter
return this.$sid('input').val();
} else {
// Setter
this.data.value = value || '';
if (this.$sid('input').exists()) {
this.$sid('input').val(this.data.value);
}
}
}
async seed() {
if (this.args.seeder) {
// TODO: Implement Rsx_Random_Values endpoint
// let value = await Rsx_Random_Values[this.args.seeder]();
// For now, just use placeholder text
let value = 'Test ' + (this.args.seeder || 'Value');
this.val(value);
}
}
}
/* === rsx/theme/components/inputs/checkbox_input.js (babel) === */
"use strict";
class Checkbox_Input extends Form_Input_Abstract {
on_create() {
this.data.checked = false;
this.checked_value = this.args.checked_value || '1';
this.unchecked_value = this.args.unchecked_value || '0';
}
on_ready() {
// Connect label clicks to checkbox
const $input = this.$sid('input');
const $label = this.$sid('label');
if ($label.exists()) {
const input_id = $input.attr('id');
$label.attr('for', input_id);
}
}
/**
* val() - Get or set the checkbox state
* @param {string|boolean} [value] - If provided, sets the checked state
* @returns {string} The checked_value or unchecked_value when called as getter
*/
val(value) {
if (arguments.length === 0) {
// Getter
const is_checked = this.$sid('input').prop('checked');
return is_checked ? this.checked_value : this.unchecked_value;
} else {
// Setter - accepts boolean, checked_value, or unchecked_value
let should_check = false;
if (typeof value === 'boolean') {
should_check = value;
} else if (value === this.checked_value || value === '1' || value === 1 || value === true) {
should_check = true;
}
this.data.checked = should_check;
if (this.$sid('input').exists()) {
this.$sid('input').prop('checked', should_check);
}
}
}
async seed() {
// Randomly check or uncheck
this.val(Math.random() > 0.5);
}
}
/* === rsx/theme/components/inputs/wysiwyg_input.js (babel) === */
"use strict";
/**
* Wysiwyg_Input - WYSIWYG editor widget using Quill
*
* Implements the form widget interface:
* - val() - Get/set HTML content
* - seed() - Fills with random content
*/
class Wysiwyg_Input extends Form_Input_Abstract {
on_create() {
this.quill = null;
}
on_ready() {
// Wait for Quill to be loaded, then initialize
const that = this;
quill_ready(function () {
that._initialize_quill();
});
}
_initialize_quill() {
// Initialize Quill editor
this.quill = new Quill(this.$sid('editor')[0], {
theme: 'snow',
placeholder: this.args.placeholder || 'Enter text...',
modules: {
toolbar: [[{
'header': [1, 2, 3, false]
}], ['bold', 'italic', 'underline', 'strike'], ['blockquote', 'code-block'], [{
'list': 'ordered'
}, {
'list': 'bullet'
}], [{
'indent': '-1'
}, {
'indent': '+1'
}], ['link', 'image'], ['clean']]
}
});
// Update hidden input on text change
const that = this;
this.quill.on('text-change', function () {
that.$sid('hidden_input').val(that.quill.root.innerHTML);
});
}
/**
* val() - Get or set HTML content
* @param {string} [value] - If provided, sets the HTML content
* @returns {string} The HTML content when called as getter
*/
val(value) {
if (arguments.length === 0) {
// Getter
if (!this.quill) return '';
return this.quill.root.innerHTML;
} else {
// Setter
if (!this.quill) {
// Quill not ready yet, wait and try again
const that = this;
setTimeout(() => that.val(value), 100);
return;
}
if (value) {
this.quill.root.innerHTML = value;
this.$sid('hidden_input').val(value);
}
}
}
/**
* Seed - Fill with random content for testing
*/
async seed() {
if (!this.quill) return;
const sample_content = `
<h2>Sample Heading</h2>
<p>This is a sample paragraph with <strong>bold text</strong> and <em>italic text</em>.</p>
<ul>
<li>First bullet point</li>
<li>Second bullet point</li>
<li>Third bullet point</li>
</ul>
<p>Another paragraph with <a href="#">a sample link</a>.</p>
`;
this.val(sample_content);
}
}
/* === rsx/theme/components/inputs/select_input.js (babel) === */
"use strict";
class Select_Input extends Form_Input_Abstract {
on_create() {
this.data.value = '';
// Parse options if passed as JSON string
if (typeof this.args.options === 'string') {
try {
// Decode HTML entities before parsing JSON
// This handles cases where JSON is passed through Blade {!! !!} syntax
const decoded = $('<textarea>').html(this.args.options).text();
this.args.options = json_decode(decoded);
} catch (e) {
console.error('Failed to parse options JSON:', e);
this.args.options = [];
}
}
// Convert object options to array format
if (this.args.options && typeof this.args.options === 'object' && !is_array(this.args.options)) {
this.args.options = Object.entries(this.args.options).map(_ref => {
let [value, label] = _ref;
return {
value,
label
};
});
}
}
on_ready() {
// Initialize Tom Select
let config = {
placeholder: this.args.placeholder || '',
allowEmptyOption: true,
create: false,
maxOptions: null,
// Show all options (default is 50)
plugins: ['dropdown_input'],
// Enable search in dropdown
onInitialize: function () {
// Keep Bootstrap form-select class
this.control.classList.add('form-select');
}
};
this.tom_select = new TomSelect(this.$sid('input').get(0), config);
// Set initial value if provided
if (this.data.value) {
this.tom_select.setValue(this.data.value, true);
}
}
/**
* val() - Get or set the selected value
* @param {string} [value] - If provided, sets the value
* @returns {string} The current value when called as getter
*/
val(value) {
if (arguments.length === 0) {
// Getter
if (this.tom_select) {
return this.tom_select.getValue();
}
return this.$sid('input').val();
} else {
// Setter
this.data.value = value || '';
if (this.tom_select) {
this.tom_select.setValue(this.data.value, true);
} else if (this.$sid('input').exists()) {
this.$sid('input').val(this.data.value);
}
}
}
async seed() {
if (this.args.seeder) {
// TODO: Implement Rsx_Random_Values endpoint
let value = 'Test ' + (this.args.seeder || 'Value');
this.val(value);
} else if (this.args.options && this.args.options.length > 0) {
// Select random option
let random_index = Math.floor(Math.random() * this.args.options.length);
let random_opt = this.args.options[random_index];
let random_value = typeof random_opt === 'object' ? random_opt.value : random_opt;
this.val(random_value);
}
}
on_destroy() {
// Clean up Tom Select instance
if (this.tom_select) {
this.tom_select.destroy();
}
}
}
/* === rsx/theme/components/inputs/ajax_select_input.js (babel) === */
"use strict";
class Ajax_Select_Input extends Select_Input {
on_create() {
// Initialize empty select values array
this.data.select_values = [];
// Store for value set before initialization completes
this._pending_value = null;
// Call parent to do basic setup
super.on_create();
}
async on_load() {
// Load options from Ajax endpoint if provided
if (this.args.data) {
try {
const response = await fetch(this.args.data);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
this.data.select_values = data;
} catch (error) {
console.error('Failed to load select options:', error);
this.data.select_values = [];
}
}
}
on_ready() {
// Call parent to initialize Tom Select
super.on_ready();
// If a value was set before initialization, apply it now
if (this._pending_value !== null) {
if (this.tom_select) {
this.tom_select.setValue(this._pending_value, true);
} else if (this.$sid('input').exists()) {
this.$sid('input').val(this._pending_value);
}
this.data.value = this._pending_value;
this._pending_value = null;
}
}
/**
* val() - Get or set the selected value
* Handles calls before Tom Select initialization completes
* @param {string} [value] - If provided, sets the value
* @returns {string} The current value when called as getter
*/
val(value) {
if (arguments.length === 0) {
// Getter
if (this.tom_select) {
// Initialized - get from Tom Select
return this.tom_select.getValue();
} else if (this._pending_value !== null) {
// Not yet initialized - return pending value
return this._pending_value;
} else if (this.data.value) {
// Return data value
return this.data.value;
}
return '';
} else {
// Setter
if (this.tom_select) {
// Initialized - set via Tom Select
this.data.value = value || '';
this.tom_select.setValue(this.data.value, true);
} else {
// Not yet initialized - store for later
this._pending_value = value || '';
this.data.value = value || '';
}
}
}
}
/* === rsx/theme/components/inputs/currency_input.js (babel) === */
"use strict";
/**
* Currency_Input
*
* Extends Text_Input to provide automatic currency formatting.
*
* Features:
* - Adds thousands separators (commas) every 3 digits
* - Optional currency symbol prefix (default: hidden)
* - Optional decimal support (default: disabled)
* - Smart backspace over formatting characters
* - No mid-string formatting (waits for blur)
*
* Arguments:
* - $allow_decimals - Allow 2 decimal places (default: false)
* - $show_symbol - Show currency symbol (default: false)
* - $currency_symbol - Currency symbol to use (default: "$")
*
* Usage:
* <Currency_Input />
* <Currency_Input $show_symbol=true />
* <Currency_Input $allow_decimals=true />
* <Currency_Input $show_symbol=true $allow_decimals=true $currency_symbol="€" />
*
* Behavior:
* - Type "1234567" -> displays "1,234,567", val() returns "1234567"
* - Type "1234567.89" (with decimals) -> displays "1,234,567.89", val() returns "1234567.89"
* - With symbol: displays "$1,234,567", val() still returns "1234567"
*/
class Currency_Input extends Text_Input {
on_create() {
super.on_create();
// Set defaults for options
if (this.args.allow_decimals === undefined) {
this.args.allow_decimals = false;
}
if (this.args.show_symbol === undefined) {
this.args.show_symbol = false;
}
if (this.args.currency_symbol === undefined) {
this.args.currency_symbol = '$';
}
}
/**
* Format currency with commas and optional symbol
* @param {string} value - Numeric value (may include decimal)
* @returns {string} Formatted currency string
*/
_format_currency(value) {
if (!value) {
return '';
}
// Split into integer and decimal parts
let parts = value.split('.');
let integer_part = parts[0];
let decimal_part = parts[1];
// Add commas to integer part
integer_part = integer_part.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
// Reconstruct with decimal if allowed
let formatted = integer_part;
if (this.args.allow_decimals && decimal_part !== undefined) {
// Limit to 2 decimal places
decimal_part = decimal_part.substr(0, 2);
formatted += '.' + decimal_part;
}
// Add currency symbol if enabled
if (this.args.show_symbol) {
formatted = this.args.currency_symbol + formatted;
}
return formatted;
}
/**
* Extract numeric value from formatted string
* @param {string} formatted - Formatted currency string
* @returns {string} Clean numeric value (digits and decimal only)
*/
_get_numeric_value(formatted) {
if (!formatted) {
return '';
}
// Remove currency symbol and commas
let cleaned = formatted.replace(/[^0-9.]/g, '');
// Ensure only one decimal point
const decimal_count = (cleaned.match(/\./g) || []).length;
if (decimal_count > 1) {
// Keep only first decimal point
const first_decimal = cleaned.indexOf('.');
cleaned = cleaned.substr(0, first_decimal + 1) + cleaned.substr(first_decimal + 1).replace(/\./g, '');
}
return cleaned;
}
/**
* val() - Get or set the currency value
* Getter returns numeric string (no commas, no symbol)
* Setter accepts anything and formats with commas/symbol
* @param {string} [value]
* @returns {string}
*/
val(value) {
if (arguments.length === 0) {
// Getter - return numeric value only
const raw = this.$sid('input').val();
return this._get_numeric_value(raw);
} else {
// Setter - format and display
if (!value) {
this.data.value = '';
if (this.$sid('input').exists()) {
this.$sid('input').val('');
}
return;
}
// Clean the input value
const numeric = this._get_numeric_value(str(value));
const formatted = this._format_currency(numeric);
this.data.value = formatted;
if (this.$sid('input').exists()) {
this.$sid('input').val(formatted);
}
}
}
on_ready() {
super.on_ready();
const $input = this.$sid('input');
// Handle keydown to intercept backspace at end of string
$input.on('keydown', e => {
const raw = $input.val();
// Only handle backspace key
if (e.key !== 'Backspace') {
return;
}
const input_element = $input[0];
const cursor_pos = input_element.selectionStart;
const cursor_end = input_element.selectionEnd;
const value_length = raw.length;
// Only handle if cursor is at the end and no selection
if (cursor_pos === value_length && cursor_pos === cursor_end) {
// Check if character before cursor is non-numeric
if (cursor_pos > 0) {
const char_before = raw.charAt(cursor_pos - 1);
if (!/[0-9]/.test(char_before)) {
// Character before cursor is not a digit
// Delete the last digit instead
e.preventDefault();
const numeric = this._get_numeric_value(raw);
if (numeric.length > 0) {
// Remove last character from numeric value
const new_numeric = numeric.substr(0, numeric.length - 1);
const formatted = this._format_currency(new_numeric);
$input.val(formatted);
// Place cursor at end
setTimeout(() => {
const new_length = $input.val().length;
input_element.setSelectionRange(new_length, new_length);
}, 0);
}
}
}
}
});
// Handle input event for live formatting
$input.on('input', () => {
const raw = $input.val();
const input_element = $input[0];
const cursor_pos = input_element.selectionStart;
const value_length = raw.length;
// Only apply live formatting if cursor is at the end
if (cursor_pos === value_length) {
// Extract numeric value
let numeric = this._get_numeric_value(raw);
// Limit decimal places to 2 if decimals allowed
if (this.args.allow_decimals) {
const parts = numeric.split('.');
if (parts[1] && parts[1].length > 2) {
numeric = parts[0] + '.' + parts[1].substr(0, 2);
}
}
// Format the numeric value
const formatted = this._format_currency(numeric);
$input.val(formatted);
} else {
// Cursor is not at end - user is editing in the middle
// Don't format, just clean invalid characters
const numeric = this._get_numeric_value(raw);
// Only update if we removed invalid characters
if (this._format_currency(numeric) !== raw) {
// Preserve just the numeric characters
const symbol_offset = this.args.show_symbol ? this.args.currency_symbol.length : 0;
const cleaned = (this.args.show_symbol ? this.args.currency_symbol : '') + numeric;
if (cleaned !== raw) {
$input.val(cleaned);
// Restore cursor position (approximately)
const new_cursor = Math.min(cursor_pos, cleaned.length);
input_element.setSelectionRange(new_cursor, new_cursor);
}
}
}
});
// Handle blur to reformat when done editing
$input.on('blur', () => {
const raw = $input.val();
if (!raw) {
return;
}
// Reformat the entire value on blur
const numeric = this._get_numeric_value(raw);
const formatted = this._format_currency(numeric);
$input.val(formatted);
});
// Handle focus to select all for easy replacement
$input.on('focus', () => {
setTimeout(() => {
$input[0].select();
}, 0);
});
// Initialize formatting if there's a value
const initial_value = $input.val();
if (initial_value) {
this.val(initial_value);
}
}
}
/* === rsx/theme/components/inputs/phone_text_input.js (babel) === */
"use strict";
/**
* Phone_Text_Input
*
* Extends Text_Input to provide automatic phone number formatting.
*
* Features:
* - US Mode (default): Formats as (XXX) XXX-XXXX on every keystroke
* - International Mode: Triggered by starting with '+', disables formatting
* - val() getter returns formatted string as displayed
* - val() setter accepts any format and displays appropriately
*
* Usage:
* <Phone_Text_Input $placeholder="Phone number" />
*
* Behavior:
* - Type "5551234567" -> displays "(555) 123-4567", val() returns "(555) 123-4567"
* - Type "+44 20 7123 4567" -> displays as typed, val() returns "+44 20 7123 4567"
* - Leading "1" is stripped: "15551234567" -> "(555) 123-4567"
*/
class Phone_Text_Input extends Text_Input {
on_create() {
super.on_create();
this._is_international = false;
}
/**
* Check if input is in international mode (starts with +)
* @param {string} value
* @returns {boolean}
*/
_check_international_mode(value) {
return value && str(value).charAt(0) === '+';
}
/**
* Format US phone number as (XXX) XXX-XXXX
* @param {string} digits - Clean numeric string (should be 10 digits or less after processing)
* @returns {string} Formatted phone number
*/
_format_us_phone(digits) {
// Format based on length (assumes digits are already cleaned and limited to 10)
if (digits.length >= 6) {
// (XXX) XXX-XXXX
return '(' + digits.substr(0, 3) + ') ' + digits.substr(3, 3) + '-' + digits.substr(6);
} else if (digits.length >= 3) {
// (XXX) XXX
return '(' + digits.substr(0, 3) + ') ' + digits.substr(3);
} else if (digits.length > 0) {
// (XX
return '(' + digits;
}
return digits;
}
/**
* val() - Get or set the phone number
* Getter returns formatted value as displayed (with parens, dashes, etc)
* Setter accepts anything and formats appropriately
* @param {string} [value]
* @returns {string}
*/
val(value) {
if (arguments.length === 0) {
// Getter - return the formatted value as displayed
return this.$sid('input').val() || '';
} else {
// Setter - format and display
if (!value) {
this.data.value = '';
if (this.$sid('input').exists()) {
this.$sid('input').val('');
}
return;
}
const str_value = str(value);
if (this._check_international_mode(str_value)) {
// International mode - no formatting
this.data.value = str_value;
if (this.$sid('input').exists()) {
this.$sid('input').val(str_value);
}
} else {
// US mode - clean digits and format
const digits = str_value.replace(/[^0-9]/g, '');
// Determine which digits to format
let digits_to_format;
if (digits.length === 11 && digits.charAt(0) === '1' && /[2-9]/.test(digits.charAt(1))) {
// Strip US country code
digits_to_format = digits.substr(1);
} else if (digits.length > 10) {
// Take first 10
digits_to_format = digits.substr(0, 10);
} else {
// Use as-is
digits_to_format = digits;
}
const formatted = this._format_us_phone(digits_to_format);
this.data.value = formatted;
if (this.$sid('input').exists()) {
this.$sid('input').val(formatted);
}
}
}
}
on_ready() {
super.on_ready();
const $input = this.$sid('input');
let _last_cursor_position = null;
// Handle keydown to intercept backspace at end of string
$input.on('keydown', e => {
const raw = $input.val();
// Skip if international mode
if (this._check_international_mode(raw)) {
return;
}
// Only handle backspace key
if (e.key !== 'Backspace') {
return;
}
const input_element = $input[0];
const cursor_pos = input_element.selectionStart;
const cursor_end = input_element.selectionEnd;
const value_length = raw.length;
// Only handle if cursor is at the end and no selection
if (cursor_pos === value_length && cursor_pos === cursor_end) {
// Check if character before cursor is non-numeric
if (cursor_pos > 0) {
const char_before = raw.charAt(cursor_pos - 1);
if (!/[0-9]/.test(char_before)) {
// Character before cursor is not a digit
// Delete the last digit instead
e.preventDefault();
const digits = raw.replace(/[^0-9]/g, '');
if (digits.length > 0) {
const new_digits = digits.substr(0, digits.length - 1);
const formatted = this._format_us_phone(new_digits);
$input.val(formatted);
// Place cursor at end
setTimeout(() => {
const new_length = $input.val().length;
input_element.setSelectionRange(new_length, new_length);
}, 0);
}
}
}
}
});
// Handle input event for live formatting
$input.on('input', () => {
const raw = $input.val();
if (this._check_international_mode(raw)) {
// International mode - allow anything
this._is_international = true;
// No formatting, no restrictions
return;
}
// US mode
this._is_international = false;
const input_element = $input[0];
const cursor_pos = input_element.selectionStart;
const value_length = raw.length;
// Only apply live formatting if cursor is at the end
if (cursor_pos === value_length) {
// Remove any non-digit, non-formatting characters
const cleaned = raw.replace(/[^0-9\s\-()]/g, '');
const digits = cleaned.replace(/[^0-9]/g, '');
// Determine which digits to format
let digits_to_format;
if (digits.length === 11 && digits.charAt(0) === '1' && /[2-9]/.test(digits.charAt(1))) {
// Exactly 11 digits starting with "1" followed by valid area code digit (2-9)
// This is a US country code - strip the leading 1
digits_to_format = digits.substr(1);
} else if (digits.length > 10) {
// More than 10 digits - just take the first 10 and ignore the rest
digits_to_format = digits.substr(0, 10);
} else {
// 10 or fewer digits - use as-is
digits_to_format = digits;
}
// Format the digits
const formatted = this._format_us_phone(digits_to_format);
$input.val(formatted);
} else {
// Cursor is not at end - user is editing in the middle
// Don't format, just clean invalid characters
const cleaned = raw.replace(/[^0-9\s\-()]/g, '');
if (cleaned !== raw) {
$input.val(cleaned);
// Restore cursor position
input_element.setSelectionRange(cursor_pos, cursor_pos);
}
}
});
// Handle blur to reformat when done editing
$input.on('blur', () => {
const raw = $input.val();
// Skip if international mode or empty
if (this._check_international_mode(raw) || !raw) {
return;
}
// Reformat the entire value on blur
const digits = raw.replace(/[^0-9]/g, '');
// Determine which digits to format
let digits_to_format;
if (digits.length === 11 && digits.charAt(0) === '1' && /[2-9]/.test(digits.charAt(1))) {
// Exactly 11 digits starting with "1" followed by valid area code digit (2-9)
// This is a US country code - strip the leading 1
digits_to_format = digits.substr(1);
} else if (digits.length > 10) {
// More than 10 digits - just take the first 10
digits_to_format = digits.substr(0, 10);
} else {
// 10 or fewer digits - use as-is
digits_to_format = digits;
}
const formatted = this._format_us_phone(digits_to_format);
$input.val(formatted);
});
// Initialize formatting if there's a value
const initial_value = $input.val();
if (initial_value) {
this.val(initial_value);
}
}
}
/* === rsx/theme/components/inputs/state_select_input.js (babel) === */
"use strict";
class State_Select_Input extends Ajax_Select_Input {
async on_load() {
// Initialize country code from args or default to US
if (!this.data.country_code) {
this.data.country_code = this.args.country_code || 'US';
}
// Load states via Ajax endpoint if country code is set
if (this.data.country_code) {
this.data.select_values = await Rsx_Reference_Data_Controller.states({
country: this.data.country_code
});
// If no states returned, add N/A option
if (!this.data.select_values || this.data.select_values.length === 0) {
this.data.select_values = [{
value: 'N/A',
label: 'N/A'
}];
}
} else {
this.data.select_values = [];
}
}
on_create() {
// Set default placeholder if not provided
if (!this.args.placeholder) {
this.args.placeholder = 'Select State...';
}
// Initialize country code in data
this.data.country_code = this.args.country_code || '';
// Cache for selected state per country code
this._state_cache = {};
// Call parent to initialize Ajax_Select_Input
super.on_create();
}
on_ready() {
// Call parent to initialize Tom Select
super.on_ready();
// Check if this is N/A case (no states for country)
const is_na = this.data.select_values.length === 1 && this.data.select_values[0].value === 'N/A';
// Disable if no country code or N/A case
if ((!this.data.country_code || is_na) && this.tom_select) {
this.tom_select.disable();
}
// Set value to N/A if that's the only option
if (is_na) {
this.val('N/A');
}
}
/**
* Set country code and reload state list
* @param {string} country_code - ISO country code (e.g., 'US', 'CA')
*/
async set_country_code(country_code) {
// Cache the current value for the current country before switching
const current_country = this.data.country_code;
const current_value = this.val();
if (current_country && current_value && current_value !== 'N/A') {
this._state_cache[current_country] = current_value;
}
// Update country code
this.data.country_code = country_code;
// Disable the selector while loading
if (this.tom_select) {
this.tom_select.disable();
}
// Load new state list
try {
this.data.select_values = await Rsx_Reference_Data_Controller.states({
country: country_code
});
// Race condition check: verify country hasn't changed during the request
if (this.data.country_code !== country_code) {
// Country changed while request was in flight - ignore this response
return;
}
// If no states returned, add N/A option
if (!this.data.select_values || this.data.select_values.length === 0) {
this.data.select_values = [{
value: 'N/A',
label: 'N/A'
}];
}
// Re-render the widget with new states
this.redraw();
// Re-initialize Tom Select after redraw
if (this.tom_select) {
this.tom_select.destroy();
}
// Re-run on_ready to set up Tom Select again
this.on_ready();
// Check if this is N/A case
const is_na = this.data.select_values.length === 1 && this.data.select_values[0].value === 'N/A';
if (is_na) {
// Set to N/A and keep disabled
this.val('N/A');
if (this.tom_select) {
this.tom_select.disable();
}
} else {
// Try to restore cached value for this country
const cached_value = this._state_cache[country_code];
if (cached_value) {
const value_exists = this.data.select_values.some(opt => (typeof opt === 'object' ? opt.value : opt) === cached_value);
if (value_exists) {
this.val(cached_value);
} else {
this.val(''); // Clear if cached value not in new list
}
} else {
this.val(''); // No cached value - leave empty
}
// Enable the widget now that we have a country with states
if (this.tom_select) {
this.tom_select.enable();
}
}
} catch (error) {
console.error('Failed to load states for country:', country_code, error);
this.data.select_values = [];
// Re-enable even on error
if (this.tom_select) {
this.tom_select.enable();
}
}
}
/**
* Override val() to update cache when user manually selects a state
*/
val(value) {
if (arguments.length === 0) {
// Getter - use parent implementation
return super.val();
} else {
// Setter - update cache and call parent
if (this.data.country_code && value && value !== 'N/A') {
this._state_cache[this.data.country_code] = value;
}
return super.val(value);
}
}
}
/* === rsx/theme/components/inputs/country_select_input.js (babel) === */
"use strict";
class Country_Select_Input extends Ajax_Select_Input {
async on_load() {
// Load countries via Ajax endpoint if data not provided
if (!this.args.data) {
this.data.select_values = await Rsx_Reference_Data_Controller.countries();
} else {
// Use parent on_load for custom data endpoints
await super.on_load();
}
// Reorder select_values to put default country first in the list
if (this.args.default_country && this.data.select_values && is_array(this.data.select_values)) {
const default_country_code = this.args.default_country;
// Find the default country in the array
const default_country_index = this.data.select_values.findIndex(opt => (typeof opt === 'object' ? opt.value : opt) === default_country_code);
if (default_country_index !== -1) {
// Remove it from its current position
const [default_country] = this.data.select_values.splice(default_country_index, 1);
// Add it to the beginning
this.data.select_values.unshift(default_country);
}
}
}
on_create() {
// Set default placeholder if not provided
if (!this.args.placeholder) {
this.args.placeholder = 'Select Country...';
}
// Call parent to initialize Ajax_Select_Input
super.on_create();
// Handle default country value
if (this.args.default_country && !this.data.value) {
this.data.value = this.args.default_country;
}
}
on_ready() {
// Call parent to initialize Tom Select
super.on_ready();
// Update state selector with initial/default country
this._update_state_selector();
// Listen for country changes and update state selector
if (this.tom_select) {
this.tom_select.on('change', () => {
this._update_state_selector();
});
}
}
/**
* Find State_Select_Input sibling and update its country code
* @private
*/
_update_state_selector() {
const current_country = this.val();
// Find State_Select_Input component using closest_sibling
const state_component = this.$.closest_sibling('.State_Select_Input').component();
if (state_component && typeof state_component.set_country_code === 'function') {
state_component.set_country_code(current_country);
}
}
}
/* === rsx/theme/components/inputs/profile_photo_input.js (babel) === */
"use strict";
/**
* Profile_Photo_Input
*
* Profile photo upload widget with thumbnail display and upload handling.
* See profile_photo_input.jqhtml for full documentation.
*
* JavaScript Responsibilities:
* - Handle file selection and upload
* - Update thumbnail on successful upload
* - Manage loading state with spinner
* - Provide val() getter/setter for attachment key
* - Handle remove button functionality
*/
class Profile_Photo_Input extends Form_Input_Abstract {
on_create() {
// Initialize data
this.data.attachment_key = '';
this.data.thumbnail_url = '';
}
on_render() {
// Handle upload button click - trigger hidden file input
this.$sid('upload_btn').on('click', () => {
this.$sid('file_input').click();
});
// Handle file selection
this.$sid('file_input').on('change', () => {
const file = this.$sid('file_input')[0].files[0];
if (!file) return;
this.upload_photo(file);
});
// Handle remove button
if (this.args.show_remove) {
this.$sid('remove_btn').on('click', () => {
this.remove_photo();
});
}
}
/**
* val() - Get or set the attachment key
* @param {string} [key] - If provided, sets the attachment key and updates thumbnail
* @returns {string} The current attachment key when called as getter
*/
val(key) {
if (arguments.length === 0) {
// Getter - return attachment key
return this.data.attachment_key || '';
} else {
// Setter - set attachment key and update thumbnail
this.data.attachment_key = key || '';
if (this.data.attachment_key) {
// Generate thumbnail URL from attachment key
const width = this.args.width || 96;
const height = this.args.height || 96;
this.data.thumbnail_url = `/_thumbnail/${this.data.attachment_key}/cover/${width}/${height}`;
} else {
// No key - clear thumbnail
this.data.thumbnail_url = '';
}
console.log('Rerender');
// Re-render to switch between icon and image
this.render();
}
}
upload_photo(file) {
// Validate file size
const max_size = (this.args.max_size || 2) * 1024 * 1024; // Convert MB to bytes
if (file.size > max_size) {
alert(`File size must be less than ${this.args.max_size || 2}MB`);
this.$sid('file_input').val(''); // Clear selection
return;
}
// Show spinner, dim image
this.$sid('spinner').removeClass('d-none');
this.$sid('photo').css('opacity', '0.3');
// Create FormData for file upload
const form_data = new FormData();
form_data.append('file', file);
form_data.append('site_id', '1'); // TODO: Get from session/config
// Do NOT set fileable_type/fileable_category - file uploads unattached
// The parent form will assign it via attach_to() on save
// Upload file via AJAX
$.ajax({
url: '/_upload',
type: 'POST',
data: form_data,
processData: false,
contentType: false,
success: response => {
console.log('Profile photo upload successful:', response);
// Update attachment key (this will also update thumbnail)
this.val(response.attachment.key);
// Hide spinner, restore opacity
this.$sid('spinner').addClass('d-none');
this.$sid('photo').css('opacity', '1');
// Clear file input for future uploads
this.$sid('file_input').val('');
// Trigger change event for form tracking
this.$.trigger('change');
},
error: (xhr, status, error) => {
var _xhr$responseJSON;
console.error('Profile photo upload failed:', error);
console.error('Response:', xhr.responseJSON);
// Hide spinner, restore opacity
this.$sid('spinner').addClass('d-none');
this.$sid('photo').css('opacity', '1');
// Clear file input
this.$sid('file_input').val('');
// Show error to user
alert('Upload failed: ' + (((_xhr$responseJSON = xhr.responseJSON) === null || _xhr$responseJSON === void 0 ? void 0 : _xhr$responseJSON.error) || error));
}
});
}
update_photo() {
// <% if (this.args.show_remove && this.data.attachment_key) { %>
}
remove_photo() {
// Clear attachment key (sets to placeholder)
this.val('');
// Trigger change event for form tracking
this.$.trigger('change');
}
async seed() {
// For testing - set a placeholder key
// In production, this would use actual test data
this.val('');
}
}
/* === rsx/theme/components/forms/rsx_tabs.js (babel) === */
"use strict";
/**
* Rsx_Tabs
*
* Tab container component with form-aware error handling integration.
* See rsx_tabs.jqhtml for full documentation.
*
* JavaScript Responsibilities:
* - Builds tab navigation dynamically from registered Rsx_Tab children
* - Manages tab activation and switching behavior
* - Persists active tab to URL hash for bookmarking
* - Integrates with form validation to show error badges on tabs
* - Auto-switches to first tab with errors on validation failure
* - Provides API for parent forms to report validation errors
*/
class Rsx_Tabs extends Component {
on_create() {
this.tabs = []; // Registered Rsx_Tab components
this.active_tab_id = null;
this.form = null;
}
on_ready() {
// Find parent form if it exists
this.form = this.closest('.Rsx_Form');
// Build tab navigation from registered tabs
this._build_nav();
// Restore active tab from URL hash or activate first tab
const hash = window.location.hash;
if (hash) {
const tab_id = hash.substring(1);
this.activate_tab(tab_id);
} else if (this.tabs.length > 0) {
this.activate_tab(this.tabs[0].args.id);
}
// Persist active tab to URL hash
const that = this;
this.$sid('nav').on('click', 'a[data-bs-toggle="tab"]', function (e) {
const tab_id = $(e.currentTarget).data('tab-id');
window.location.hash = '#' + tab_id;
});
}
register_tab(tab_component) {
this.tabs.push(tab_component);
}
_build_nav() {
const $nav = this.$sid('nav');
$nav.empty();
for (let i = 0; i < this.tabs.length; i++) {
const tab = this.tabs[i];
const is_active = i === 0 ? 'active' : '';
const $li = $(`
<li class="nav-item" role="presentation">
<a class="nav-link ${is_active}"
data-bs-toggle="tab"
href="#${tab.args.id}"
data-tab-id="${tab.args.id}"
aria-selected="${i === 0 ? 'true' : 'false'}"
role="tab">
${tab.args.icon ? `<i class="${tab.args.icon}"></i> ` : ''}
${tab.args.label}
<span class="badge bg-danger ms-2" style="display: none;" data-error-badge="${tab.args.id}">0</span>
</a>
</li>
`);
$nav.append($li);
}
}
activate_tab(tab_id) {
// Find the tab
const tab = this.tabs.find(t => t.args.id === tab_id);
if (!tab) return;
// Remove active show from all tab panes
for (let t of this.tabs) {
t.$.removeClass('active show');
}
// Add active show to the selected tab pane
tab.$.addClass('active show');
// Update Bootstrap tab navigation
this.$sid('nav').find('a[data-bs-toggle="tab"]').removeClass('active').attr('aria-selected', 'false');
this.$sid('nav').find('a[data-tab-id="' + tab_id + '"]').addClass('active').attr('aria-selected', 'true');
this.active_tab_id = tab_id;
}
handle_validation_errors(errors) {
// Count errors per tab
const tab_errors = {};
for (let tab of this.tabs) {
const error_count = tab.count_errors(errors);
tab_errors[tab.args.id] = error_count;
// Update badge
const $badge = this.$sid('nav').find(`[data-error-badge="${tab.args.id}"]`);
if (error_count > 0) {
$badge.text(error_count).show();
} else {
$badge.hide();
}
}
// Find first tab with errors
const first_errored_tab = this.tabs.find(t => tab_errors[t.args.id] > 0);
// Switch to first errored tab if not currently on an errored tab
if (first_errored_tab && tab_errors[this.active_tab_id] === 0) {
this.activate_tab(first_errored_tab.args.id);
}
}
clear_error_badges() {
this.$sid('nav').find('[data-error-badge]').hide();
}
}
/* === rsx/theme/components/forms/rsx_tab.js (babel) === */
"use strict";
/**
* Rsx_Tab
*
* Individual tab pane component that works with Rsx_Tabs for form validation.
* See rsx_tab.jqhtml for full documentation.
*
* JavaScript Responsibilities:
* - Auto-registers with parent Rsx_Tabs component on creation
* - Sets tab pane ID attribute from $id argument
* - Discovers and tracks child Form_Field components
* - Counts validation errors within this tab's fields
* - Provides error count to parent for badge display
*/
class Rsx_Tab extends Component {
on_create() {
let that = this;
// Set the tab ID dynamically from args
if (that.args.id) {
that.$.attr('id', that.args.id);
}
// Find parent Rsx_Tabs and register
that.tabs_container = that.closest('.Rsx_Tabs');
if (that.tabs_container) {
that.tabs_container.register_tab(that);
}
// Store reference to all Form_Field components within this tab
that.fields = [];
}
on_ready() {
let that = this;
// Find all Form_Field components within this tab
that.$.find('.Form_Field').each((index, element) => {
const field_component = $(element).component();
if (field_component) {
that.fields.push(field_component);
}
});
}
/**
* Count validation errors in Form_Field components within this tab
* @param {Object} errors - Error object from form validation {field_name: error_message}
* @returns {number} Count of errors in this tab
*/
count_errors(errors) {
let that = this;
let count = 0;
for (let field of that.fields) {
if (errors[field.args.name]) {
count++;
}
}
return count;
}
}
/* === rsx/theme/components/forms/rsx_form.js (babel) === */
"use strict";
/**
* Rsx_Form
*
* Form container with validation, submission, and widget value management.
* See rsx_form.jqhtml for full documentation.
*
* JavaScript Responsibilities:
* - Parses and stores initial form data from $data attribute (JSON or object)
* - Discovers and manages child Widget components via vals() getter/setter
* - Handles form submission via Ajax to controller/method endpoints
* - Applies validation errors to fields using Form_Utils
* - Integrates with Rsx_Tabs for tab-aware error handling
* - Provides seed() functionality for debug/testing
* - Manages form state (values, errors) throughout lifecycle
*/
class Rsx_Form extends Component {
on_create() {
this.data.values = {}; // Current form values {name: value}
this.data.errors = {}; // Validation errors {name: error_message}
this.tabs = null; // Reference to Rsx_Tabs component if present
// Parse initial data from $data attribute (e.g., from $data=$client)
let data = this.args.data;
if (typeof data === 'string') {
try {
// Decode HTML entities before parsing JSON
// This handles cases where JSON is passed through Blade {!! !!} syntax
const decoded = $('<textarea>').html(data).text();
data = json_decode(decoded);
} catch (e) {
console.error('Form: Failed to parse data JSON string', e);
data = {};
}
}
if (data && typeof data === 'object') {
this.data.values = data;
}
}
on_ready() {
const that = this;
// Validate that error container exists
if (!this.$sid('error').exists()) {
console.log(this.$.html());
throw new Error('Rsx_Form requires an error container with $id="error". ' + 'Add <div $id="error"></div> to your form template for displaying validation and error messages.');
}
// Set up seed button handler if in debug mode
if (window.rsxapp.debug && this.$sid('seed_btn').exists()) {
that.$sid('seed_btn').on('click', function () {
that.seed();
});
}
// Find child Rsx_Tabs component if present for error handling integration
const tabs_el = this.$.find('.Rsx_Tabs').first();
if (tabs_el.length) {
that.tabs = tabs_el.component();
}
// Automatically wire all submit buttons to call form submit()
this.$.find('button[type="submit"]').each(function () {
$(this).on('click', function (e) {
e.preventDefault();
that.submit();
});
});
// Notify all fields to load their initial values
// This happens in on_ready to ensure all Form_Field children are initialized
this.vals(this.data.values);
// Hide loading spinner and show form content (without re-rendering)
this.$sid('loader').hide();
this.$sid('form_content').show();
}
// Getter or setter for all form values, similar to jquery val
vals(values) {
if (values) {
// Setter
this.$.shallowFind('.Widget').each(function () {
let $widget = $(this);
let component = $widget.component();
if (component && 'val' in component) {
let widget_name = $widget.data('name');
if (widget_name in values) {
component.val(values[widget_name]);
}
}
});
return null;
} else {
// Getter
let data = {};
// Get widget values
this.$.shallowFind('.Widget').each(function () {
let $widget = $(this);
let component = $widget.component();
if (component && 'val' in component) {
let widget_name = $widget.data('name');
data[widget_name] = component.val();
}
});
// Also get regular hidden inputs (non-widget inputs)
this.$.find('input[type="hidden"][name]').each(function () {
let $input = $(this);
let name = $input.attr('name');
if (name) {
data[name] = $input.val();
}
});
return data;
}
}
get_error(name) {
return this.data.errors[name];
}
/**
* Render an error in the form's error container
*
* Handles both field-specific validation errors and generic errors.
* Can be called by external handlers (e.g., modal on_submit) or internally
* by the form's own submit() method.
*
* @param {Error|Object} error - Error object from Ajax call
*/
async render_error(error) {
// Handle validation errors - apply to fields
if (error.type === 'form_error' && error.details) {
await Form_Utils.apply_form_errors(this.$, error.details);
// Notify tabs of validation errors for error badges and auto-switching
if (this.tabs) {
this.tabs.handle_validation_errors(error.details);
}
// Form_Utils handles all rendering (inline errors + unmatched errors alert)
// Don't call Rsx.render_error() to avoid duplicate alerts
return;
}
// For non-form errors (fatal, auth, network, etc.), render in form's error container
Rsx.render_error(error, this.$sid('error'));
}
async submit() {
// Clear any previous errors
Form_Utils.reset_form_errors(this.$);
this.$sid('error').empty();
// Clear tab error badges if tabs are present
if (this.tabs) {
this.tabs.clear_error_badges();
}
// Serialize all field values
let values = this.vals();
// Call submit handler
if (!this.args.controller || !this.args.method) {
console.error('Form: No controller/method provided');
throw new Error('Form configuration error: Missing controller or method');
}
try {
// Build Ajax URL from controller and method
const ajax_url = `/_ajax/${this.args.controller}/${this.args.method}`;
// Call Ajax endpoint - response is directly what PHP returned
const result = await Ajax.call(ajax_url, values);
// Success! Handle result
if (result && result.redirect) {
// Redirect to URL
window.location.href = result.redirect;
} else {
// Success without redirect
console.log('Form submitted successfully', result);
}
} catch (error) {
// Render error (handles both validation and generic errors)
await this.render_error(error);
}
}
async seed() {
const promises = [];
this.$.shallowFind('.Form_Field').each(function () {
let component = $(this).component();
if (component && 'seed' in component) {
promises.push(component.seed());
}
});
await Promise.all(promises);
}
}
/* === rsx/theme/components/forms/pin_verification_form.js (babel) === */
"use strict";
/**
* Pin_Verification_Form
*
* Specialized 6-digit PIN entry form with auto-navigation between inputs.
* See pin_verification_form.jqhtml for full documentation.
*
* JavaScript Responsibilities:
* - Auto-advances to next input when digit is entered
* - Smart backspace: clears current box and moves to previous
* - Paste support: distributes pasted digits across all 6 inputs
* - Arrow key navigation between inputs
* - Numeric-only input validation
* - Select-all on focus for easy digit replacement
* - Validates all 6 digits entered before allowing submission
* - Provides val() getter/setter for programmatic PIN access
*/
class Pin_Verification_Form extends Rsx_Form {
on_create() {
super.on_create();
this.pin_length = 6;
}
/**
* Get or set the PIN value
* @param {string} [value] - If provided, sets the PIN (distributes across inputs)
* @returns {string} Current PIN value when called as getter
*/
val(value) {
if (arguments.length === 0) {
// Getter - collect all digits
let pin = '';
for (let i = 0; i < this.pin_length; i++) {
pin += this.$sid(`digit_${i}`).val() || '';
}
return pin;
} else {
// Setter - distribute digits across inputs
const digits = str(value || '').replace(/[^0-9]/g, '');
for (let i = 0; i < this.pin_length; i++) {
this.$sid(`digit_${i}`).val(digits[i] || '');
}
// Focus first empty input or last input
const first_empty = this._find_first_empty_index();
if (first_empty !== -1) {
this.$sid(`digit_${first_empty}`)[0].focus();
} else {
this.$sid(`digit_${this.pin_length - 1}`)[0].focus();
}
}
}
/**
* Find the first empty input index
* @returns {number} Index of first empty input, or -1 if all filled
*/
_find_first_empty_index() {
for (let i = 0; i < this.pin_length; i++) {
if (!this.$sid(`digit_${i}`).val()) {
return i;
}
}
return -1;
}
/**
* Move focus to specific input index
* @param {number} index
*/
_focus_input(index) {
if (index >= 0 && index < this.pin_length) {
const $input = this.$sid(`digit_${index}`);
if ($input.exists()) {
$input[0].focus();
// Select the content if there is any
$input[0].select();
}
}
}
/**
* Handle paste event - distribute digits across inputs
* @param {ClipboardEvent} e
* @param {number} start_index
*/
_handle_paste(e, start_index) {
e.preventDefault();
// Get pasted data
const paste = (e.originalEvent || e).clipboardData.getData('text');
const digits = paste.replace(/[^0-9]/g, '');
if (!digits) {
return;
}
// Distribute digits starting from current input
for (let i = 0; i < digits.length && start_index + i < this.pin_length; i++) {
this.$sid(`digit_${start_index + i}`).val(digits[i]);
}
// Focus next empty input or last input
const next_index = Math.min(start_index + digits.length, this.pin_length - 1);
this._focus_input(next_index);
}
on_ready() {
super.on_ready();
const that = this;
// Set up event handlers for each input
for (let i = 0; i < this.pin_length; i++) {
const $input = this.$sid(`digit_${i}`);
const index = i;
// Handle input event - auto-advance
$input.on('input', function (e) {
const value = $(this).val();
// Only allow numeric input
const numeric = value.replace(/[^0-9]/g, '');
if (numeric !== value) {
$(this).val(numeric);
}
// If multiple digits were entered (paste), distribute them
if (numeric.length > 1) {
that._handle_paste({
preventDefault: () => {},
originalEvent: {
clipboardData: {
getData: () => numeric
}
}
}, index);
return;
}
// Auto-advance to next input if digit was entered
if (numeric.length === 1 && index < that.pin_length - 1) {
that._focus_input(index + 1);
}
});
// Handle keydown for backspace
$input.on('keydown', function (e) {
// Backspace key
if (e.key === 'Backspace') {
const current_value = $(this).val();
// If current input is empty, move to previous and clear it
if (!current_value && index > 0) {
e.preventDefault();
that.$sid(`digit_${index - 1}`).val('');
that._focus_input(index - 1);
}
// If current input has value, it will be cleared by default behavior
// and we stay on current input
}
// Arrow left
if (e.key === 'ArrowLeft' && index > 0) {
e.preventDefault();
that._focus_input(index - 1);
}
// Arrow right
if (e.key === 'ArrowRight' && index < that.pin_length - 1) {
e.preventDefault();
that._focus_input(index + 1);
}
});
// Handle paste event
$input.on('paste', function (e) {
that._handle_paste(e, index);
});
// Select all on focus for easy replacement
$input.on('focus', function () {
$(this)[0].select();
});
}
// Focus first input on load
this._focus_input(0);
}
/**
* Override submit to validate PIN is complete
*/
async submit() {
const pin = this.val();
// Clear previous errors
this.$sid('error_container').hide().empty();
// Validate PIN is 6 digits
if (pin.length !== this.pin_length) {
this.$sid('error_container').text('Please enter all 6 digits').show();
// Mark inputs as invalid
for (let i = 0; i < this.pin_length; i++) {
if (!this.$sid(`digit_${i}`).val()) {
this.$sid(`digit_${i}`).addClass('is-invalid');
}
}
return;
}
// Remove invalid class from all inputs
for (let i = 0; i < this.pin_length; i++) {
this.$sid(`digit_${i}`).removeClass('is-invalid');
}
// Call parent submit (which will use controller/method if provided)
await super.submit();
}
}
/* === rsx/theme/components/forms/form_field_abstract.js (babel) === */
"use strict";
/**
* Form_Field_Abstract
*
* Abstract base class for form field wrappers. Provides core functionality without visual formatting.
* See form_field_abstract.jqhtml for full documentation.
*
* JavaScript Responsibilities:
* - Discovers and configures child Widget component
* - Sets data-name attribute on widget for form value collection
* - Sets name attribute on native inputs for Form_Utils compatibility
* - Wires label 'for' attribute to input element ID for accessibility (if label exists)
* - Provides seed() support for debug/testing data
* - Bridges between form validation state and child widget
*/
class Form_Field_Abstract extends Component {
on_create() {
// Find parent form for error display
this.form = this.closest('.Rsx_Form');
if (!this.form) {
shouldnt_happen('Form_Field_Abstract must be inside a Rsx_Form component');
}
}
on_ready() {
// Find child widget and set its data-name attribute
let $widget = this.$.find('.Widget').first();
if (!$widget.exists()) {
shouldnt_happen(`Form_Field_Abstract "${this.args.name}" has no .Widget child. Every Form_Field must contain exactly one widget (Text_Input, Wysiwyg_Input, etc.)`);
}
// Set data-name on the widget so Rsx_Form can collect values
$widget.attr('data-name', this.args.name);
let $input = this.$.find('input, select, textarea').first();
if ($input.exists()) {
// Also set name attribute on native inputs for Form_Utils compatibility
// Todo: clever way to deal with this for non standard input elements
$input.attr('name', this.args.name);
// Set the for field to the element if label exists (for child classes)
// Todo: clever way to deal with this for non standard input elements
let $label = this.$sid('form_label');
if ($label.exists()) {
$label.attr('for', $input.attr('id'));
}
}
}
get_error() {
return this.form.get_error(this.args.name);
}
has_error() {
return !!this.get_error();
}
async seed() {
if (!this.args.seeder) {
return;
}
// Find child widget
let $widget = this.$.find('.Widget').first();
if (!$widget.exists()) {
return;
}
let widget_component = $widget.component();
if (!widget_component || !widget_component.val) {
return;
}
// Call the seeder endpoint (Ajax route reference like form $action)
try {
let value = await Ajax.call(this.args.seeder, {});
widget_component.val(value);
} catch (error) {
console.error(`Seeder error for ${this.args.name}:`, error);
}
}
}
/* === rsx/theme/components/forms/form_field.js (babel) === */
"use strict";
/**
* Form_Field
*
* Form field wrapper that adds labels, help text, and required indicators.
* See form_field.jqhtml for full documentation.
*
* Extends Form_Field_Abstract to inherit all core functionality.
* This class exists primarily for template inheritance and any future
* formatted-field-specific behavior.
*/
class Form_Field extends Form_Field_Abstract {
// All functionality inherited from Form_Field_Abstract
// This class provides the formatted visual wrapper via its template
}
/* === rsx/theme/components/forms/form_hidden_field.js (babel) === */
"use strict";
/**
* Form_Hidden_Field - Hidden input field component
*
* Extends Form_Field_Abstract but IS the input element itself (using tag="input" type="hidden").
* See form_hidden_field.jqhtml for full documentation.
*
* JavaScript Responsibilities:
* - Sets value attribute dynamically in on_create()
* - Overrides on_ready() to handle that this.$ IS both the widget and the input
* - Provides val() method for getting/setting the hidden value
*/
class Form_Hidden_Field extends Form_Field_Abstract {
on_create() {
// Call parent to set up form reference
super.on_create();
// Set initial value attribute (can't be done in Define tag)
this.$.attr('value', '');
}
on_ready() {
// Override parent on_ready() because this.$ IS the widget and the input
// Set data-name on this.$ (which is the input element)
this.$.attr('data-name', this.args.name);
// Set name attribute on this.$ for Form_Utils compatibility
this.$.attr('name', this.args.name);
}
/**
* val() - Get or set the hidden input value
* @param {string} [value] - If provided, sets the value
* @returns {string} The current value when called as getter
*/
val(value) {
if (arguments.length === 0) {
// Getter - this.$ is the input element itself
return this.$.val();
} else {
// Setter - update the input value directly (this.$ is the input)
this.$.val(value || '');
}
}
}
/* === rsx/app/login/signup/signup_index.js (babel) === */
"use strict";
/**
* Signup_Index
*
* Handles signup form success callback
*/
class Signup_Index {
/**
* Handle successful signup
* Shows the created user record as JSON and provides next steps
*/
static async on_success(response) {
// Show success message with user data for now
// Will expand to email verification flow later
const user_json = json_encode(response.user, null, 2);
await Modal.alert('Account Created', `Your account has been created successfully!\n\nUser Record:\n${user_json}\n\n${response.message || 'Please check your email to verify your account.'}`);
// Redirect to login page
window.location.href = Rsx.Route('Login_Controller');
}
}
/* === rsx/app/login/login_index.js (babel) === */
"use strict";
/**
* Login form enhancement
*
* Provides client-side validation for the login form
*/
class Login_Index {
/**
* Initialize the login page
* This method is automatically called by RSX framework for any class with a static on_app_ready() method
* No manual registration is required
*/
static on_app_ready() {
// Check if we're on this specific page
if (!$('.Login_Index').exists()) return;
let $form = $('#login-form');
let $submit_button = $('#btn-submit');
// Add form validation
$submit_button.on('click', async e => {
e.preventDefault();
const $email = $form.find('#email');
const $password = $form.find('#password');
// Build validation errors object
const errors = {};
if (!$email.val()) {
errors.email = 'Email is required';
} else if (!is_email($email.val())) {
errors.email = 'Please enter a valid email address';
}
if (!$password.val()) {
errors.password = 'Password is required';
}
// If there are validation errors, display them
if (Object.keys(errors).length > 0) {
await Form_Utils.apply_form_errors($form, errors);
return false;
}
// Clear any previous errors and submit form
Form_Utils.reset_form_errors($form);
// And away we go
$form.trigger('submit');
});
}
}
/* === rsx/app/login/accept_invite_index.js (babel) === */
"use strict";
/**
* Accept_Invite_Index
*
* Handles invitation acceptance workflow
*/
class Accept_Invite_Index {
/**
* Initialize when app is ready
* Called automatically by RSX framework
*/
static on_app_ready() {
// Only initialize if we're on this view
if (!$('.Accept_Invite_Index').exists()) {
return;
}
// Bind accept button click handler
$('#accept-btn').click(async () => {
const code = $('#accept-btn').data('code');
if (!code) {
await Modal.alert('Error', 'No invitation code found');
return;
}
try {
const response = await Accept_Invite_Controller.accept({
code: code
});
if (response._success) {
// Redirect to the site dashboard
window.location.href = response.redirect_url;
} else {
await Modal.alert('Error', response.error || 'Failed to accept invitation');
}
} catch (error) {
await Modal.alert('Error', 'An error occurred while accepting the invitation');
}
});
}
}
/* === storage/rsx-tmp/jqhtml_4c789804a2735328.js === */
/* Compiled from: rsx/theme/components/datagrid/datagrid_abstract.jqhtml */ (function() {
'use strict';
const template_DataGrid_Abstract = {
_jqhtml_version: '2.2.185',
name: 'DataGrid_Abstract',
tag: 'div',
defaultAttributes: {"class": "card DataGrid"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");
_output.push({comp: ["Card_Header", {}, function(Card_Header) { let _output = [];
_output.push(" "); (() => { const result = content('DG_Card_Header');; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); return [_output, this]; }.bind(this)]});
_output.push({tag: ["div", {"class": "card-body p-0"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "table-responsive"}, false]});
_output.push(" ");_output.push({tag: ["table", {"class": "table table-hover mb-0"}, false]});
_output.push(" "); _output.push({comp: ["Redrawable", {"id": "datagrid_table_header" + ":" + this._cid, "data-id": "datagrid_table_header", "_tag": "thead"}, function(Redrawable) { let _output = [];
_output.push(" "); (() => { const result = content('DG_Table_Header');; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); return [_output, this]; }.bind(this)]});
_output.push({comp: ["Redrawable", {"id": "datagrid_table_body" + ":" + this._cid, "data-id": "datagrid_table_body", "class": ((this.data.loading && this.data.rows.length === 0) ? 'is-loading' : (this.data.is_empty ? 'is-empty' : '')), "_tag": "tbody"}, function(Redrawable) { let _output = [];
_output.push(" "); if (this.data.loading && this.data.rows.length === 0) {
_output.push({tag: ["tr", {"class": "loading-row"}, false]}); _output.push(" "); _output.push({tag: ["td", {"colspan": "999", "class": "text-center py-5"}, false]}); _output.push(" "); _output.push({tag: ["div", {"class": "spinner-border text-primary mb-3", "role": "status"}, false]}); _output.push(" "); _output.push({tag: ["span", {"class": "visually-hidden"}, false]}); _output.push("Loading..."); _output.push("</span>"); _output.push(" "); _output.push("</div>"); _output.push({tag: ["p", {"class": "text-muted"}, false]}); _output.push("Loading..."); _output.push("</p>"); _output.push(" "); _output.push("</td>"); _output.push("</tr>");
} else if (this.data.is_empty) {
_output.push({tag: ["tr", {"class": "empty-row"}, false]}); _output.push(" "); _output.push({tag: ["td", {"colspan": "999", "class": "text-center py-5"}, false]}); _output.push(" "); _output.push({tag: ["i", {"class": "bi bi-inbox", "style": "font-size: 3rem; color: #6c757d;"}, false]}); _output.push("</i>"); _output.push(" "); if (this.data.filter) { _output.push({tag: ["p", {"class": "text-muted mt-3"}, false]}); _output.push("No results found for \""); (() => { const result = this.data.filter ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("\""); _output.push("</p>"); _output.push(" "); _output.push({tag: ["button", {"id": "clear_filter_btn" + ":" + this._cid, "data-id": "clear_filter_btn", "class": "btn btn-sm btn-secondary mt-2"}, false]}); _output.push("Clear Filter"); _output.push("</button>"); _output.push(" "); } else { _output.push({tag: ["p", {"class": "text-muted mt-3"}, false]}); _output.push("No results found"); _output.push("</p>"); _output.push(" "); } _output.push("</td>"); _output.push("</tr>");
} else {
for(let row of this.data.rows) {
(() => { const result = content('row', row);; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); }
}
return [_output, this]; }.bind(this)]});
_output.push("</table>");
_output.push("</div>");
_output.push("</div>");
_output.push({comp: ["Card_Footer", {}, function(Card_Footer) { let _output = [];
_output.push(" "); _output.push({tag: ["div", {"class": "d-flex gap-2 align-items-center"}, false]}); _output.push(" "); _output.push({tag: ["div", {"class": "dropdown"}, false]}); _output.push(" "); _output.push({tag: ["button", {"class": "btn btn-secondary btn-sm dropdown-toggle", "type": "button", "data-bs-toggle": "dropdown"}, false]}); _output.push(" "); _output.push(" Actions "); _output.push("</button>"); _output.push(" "); _output.push({tag: ["ul", {"class": "dropdown-menu"}, false]}); _output.push(" "); _output.push({tag: ["li", {}, false]}); _output.push({tag: ["a", {"class": "dropdown-item", "href": "#"}, false]}); _output.push("Export Selected"); _output.push("</a>"); _output.push("</li>"); _output.push(" "); _output.push({tag: ["li", {}, false]}); _output.push({tag: ["a", {"class": "dropdown-item", "href": "#"}, false]}); _output.push("Delete Selected"); _output.push("</a>"); _output.push("</li>"); _output.push(" "); _output.push({tag: ["li", {}, false]}); _output.push(" "); _output.push({tag: ["hr", {"class": "dropdown-divider"}, true]}); _output.push(" "); _output.push("</li>"); _output.push({tag: ["li", {}, false]}); _output.push({tag: ["a", {"class": "dropdown-item", "href": "#"}, false]}); _output.push("Mark as Active"); _output.push("</a>"); _output.push("</li>"); _output.push(" "); _output.push("</ul>"); _output.push("</div>"); _output.push({comp: ["Pagination_Info", {"id": "pagination_info" + ":" + this._cid, "data-id": "pagination_info"}, function(Pagination_Info) {
const _output = [];
_output.push(" "); if (this.data.total && this.data.page && this.data.per_page) { /* empty line */
const start = ((this.data.page - 1) * this.data.per_page) + 1;
const end = Math.min(this.data.page * this.data.per_page, this.data.total); _output.push(" Showing "); (() => { const result = start ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push(" to "); (() => { const result = end ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push(" of "); (() => { const result = this.data.total ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push(" entries "); } _output.push(" ");
return [_output, this];
}.bind(this)]}); _output.push("</div>");
_output.push({comp: ["Pagination_Controls", {"id": "pagination_controls" + ":" + this._cid, "data-id": "pagination_controls"}, function(Pagination_Controls) {
const _output = [];
_output.push(" "); if (this.data.total_pages && this.data.total_pages > 1) { /* empty line */
const currentPage = this.data.page || 1;
const totalPages = this.data.total_pages;
const maxVisible = 7; // Maximum page numbers to show
/* empty line */
// Calculate page range to display
let startPage, endPage;
/* empty line */
if (totalPages <= maxVisible) {
// Show all pages if total is less than max
startPage = 1;
endPage = totalPages;
} else {
// Calculate range with current page near center
const maxPagesBeforeCurrentPage = Math.floor(maxVisible / 2);
const maxPagesAfterCurrentPage = Math.ceil(maxVisible / 2) - 1;
/* empty line */
if (currentPage <= maxPagesBeforeCurrentPage) {
// Near the start
startPage = 1;
endPage = maxVisible;
} else if (currentPage + maxPagesAfterCurrentPage >= totalPages) {
// Near the end
startPage = totalPages - maxVisible + 1;
endPage = totalPages;
} else {
// In the middle
startPage = currentPage - maxPagesBeforeCurrentPage;
endPage = currentPage + maxPagesAfterCurrentPage;
}
}
/* empty line */
// Generate page numbers array
const pages = [];
for (let i = startPage; i <= endPage; i++) {
pages.push(i);
}
/* empty line */
const showStartEllipsis = startPage > 1;
const showEndEllipsis = endPage < totalPages; _output.push({tag: ["li", {"class": "page-item" + (currentPage === 1 ? 'disabled' : '')}, false]}); _output.push(" "); _output.push({tag: ["a", {"class": "page-link", "href": "#", "data-page": (currentPage - 1), "tabindex": (currentPage === 1 ? '-1' : '0')}, false]}); _output.push(" "); _output.push(" Previous "); _output.push("</a>"); _output.push(" "); _output.push("</li>"); if (showStartEllipsis) { _output.push({tag: ["li", {"class": "page-item"}, false]}); _output.push(" "); _output.push({tag: ["a", {"class": "page-link", "href": "#", "data-page": "1"}, false]}); _output.push("1"); _output.push("</a>"); _output.push(" "); _output.push("</li>"); _output.push({tag: ["li", {"class": "page-item disabled"}, false]}); _output.push(" "); _output.push({tag: ["span", {"class": "page-link"}, false]}); _output.push("..."); _output.push("</span>"); _output.push(" "); _output.push("</li>"); } for (let pageNum of pages) { console.log("Loop check", pageNum, currentPage); _output.push({tag: ["li", {"class": "page-item" + (pageNum === currentPage ? 'active' : '')}, false]}); _output.push(" "); _output.push({tag: ["a", {"class": "page-link", "href": "#", "data-page": (pageNum)}, false]}); _output.push(" "); (() => { const result = pageNum ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push(" "); _output.push("</a>"); _output.push("</li>"); } if (showEndEllipsis) { _output.push({tag: ["li", {"class": "page-item disabled"}, false]}); _output.push(" "); _output.push({tag: ["span", {"class": "page-link"}, false]}); _output.push("..."); _output.push("</span>"); _output.push(" "); _output.push("</li>"); _output.push({tag: ["li", {"class": "page-item"}, false]}); _output.push(" "); _output.push({tag: ["a", {"class": "page-link", "href": "#", "data-page": (totalPages)}, false]}); (() => { const result = totalPages ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</a>"); _output.push(" "); _output.push("</li>"); } _output.push({tag: ["li", {"class": "page-item" + (currentPage === totalPages ? 'disabled' : '')}, false]}); _output.push(" "); _output.push({tag: ["a", {"class": "page-link", "href": "#", "data-page": (currentPage + 1)}, false]}); _output.push(" "); _output.push(" Next "); _output.push("</a>"); _output.push(" "); _output.push("</li>"); }
return [_output, this];
}.bind(this)]});
return [_output, this]; }.bind(this)]});
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_DataGrid_Abstract);
})();
/* === storage/rsx-tmp/jqhtml_cafa46b601e1b05d.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/action_button_delete.jqhtml */ (function() {
'use strict';
const template_Action_Button_Delete = {
_jqhtml_version: '2.2.185',
name: 'Action_Button_Delete',
tag: 'button',
defaultAttributes: {"type": "button", "class": "btn btn-danger", "title": "Delete"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-trash"}, false]}); _output.push("</i>");
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Action_Button_Delete);
})();
/* === storage/rsx-tmp/jqhtml_39f39e3b268dbe32.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/action_button_edit.jqhtml */ (function() {
'use strict';
const template_Action_Button_Edit = {
_jqhtml_version: '2.2.185',
name: 'Action_Button_Edit',
tag: 'a',
defaultAttributes: {"class": "btn btn-secondary", "title": "Edit"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>");
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Action_Button_Edit);
})();
/* === storage/rsx-tmp/jqhtml_40cbd9b14342dbca.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/action_button_view.jqhtml */ (function() {
'use strict';
const template_Action_Button_View = {
_jqhtml_version: '2.2.185',
name: 'Action_Button_View',
tag: 'a',
defaultAttributes: {"class": "btn btn-primary", "title": "View"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>");
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Action_Button_View);
})();
/* === storage/rsx-tmp/jqhtml_c4cd6b6689b37222.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/activity_feed.jqhtml */ (function() {
'use strict';
const template_Activity_Feed = {
_jqhtml_version: '2.2.185',
name: 'Activity_Feed',
tag: 'div',
defaultAttributes: {"class": "list-group list-group-flush"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); if (Object.keys(this.data).length === 0) {
_output.push(" ");_output.push({tag: ["div", {"class": "text-center py-4"}, false]});
_output.push(" "); _output.push({comp: ["Spinner", {}]});
_output.push(" ");_output.push({tag: ["div", {"class": "mt-2 text-muted small"}, false]}); _output.push("Loading activity..."); _output.push("</div>");
_output.push(" "); _output.push("</div>");
} else if (this.data.activities && this.data.activities.length === 0) {
_output.push(" "); _output.push({comp: ["Empty_State", {"data-icon": "activity", "data-title": "No activity yet", "data-message": "Activity will appear here"}]});
_output.push(" "); } else {
_output.push(" "); for (let activity of this.data.activities || []) {
_output.push(" ");_output.push({tag: ["div", {"class": "list-group-item d-flex gap-3 py-3"}, false]});
_output.push(" "); if (activity.avatar) {
_output.push(" "); _output.push({comp: ["Avatar", {"data-src": activity.avatar, "data-size": "sm"}]});
_output.push(" "); } else {
_output.push(" ");_output.push({tag: ["div", {"class": "rounded-circle bg-primary text-white d-flex align-items-center justify-content-center", "style": "width: 32px; height: 32px; flex-shrink: 0;"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-" + (activity.icon || 'activity')}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</div>");
}
_output.push(" ");_output.push({tag: ["div", {"class": "flex-grow-1"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex justify-content-between align-items-start"}, false]});
_output.push(" ");_output.push({tag: ["div", {}, false]});
_output.push(" ");_output.push({tag: ["strong", {}, false]}); (() => { const result = activity.user_name ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</strong>");
_output.push(" ");_output.push({tag: ["span", {"class": "text-muted"}, false]}); (() => { const result = activity.action ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</span>");
_output.push(" "); _output.push("</div>");
_output.push({tag: ["small", {"class": "text-muted"}, false]}); (() => { const result = activity.time_ago ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</small>");
_output.push(" "); _output.push("</div>");
if (activity.description) {
_output.push(" ");_output.push({tag: ["div", {"class": "text-muted small mt-1"}, false]}); (() => { const result = activity.description ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</div>");
_output.push(" "); }
_output.push(" "); if (activity.metadata) {
_output.push(" ");_output.push({tag: ["div", {"class": "mt-2"}, false]});
_output.push(" "); for (let key in activity.metadata) {
_output.push(" ");_output.push({tag: ["span", {"class": "badge bg-light text-dark me-1"}, false]});
_output.push(" "); (() => { const result = key ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push(": "); (() => { const result = activity.metadata[key] ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); _output.push("</span>");
}
_output.push(" "); _output.push("</div>");
}
_output.push(" "); _output.push("</div>");
_output.push("</div>");
}
_output.push(" "); }
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Activity_Feed);
})();
/* === storage/rsx-tmp/jqhtml_16e12ed0cd36683b.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/actor_reference.jqhtml */ (function() {
'use strict';
const template_Actor_Reference = {
_jqhtml_version: '2.2.185',
name: 'Actor_Reference',
tag: 'small',
defaultAttributes: {"class": "text-muted d-block mt-1"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Actor_Reference);
})();
/* === storage/rsx-tmp/jqhtml_94c8ee6c8ba68a1d.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/advanced_search_panel.jqhtml */ (function() {
'use strict';
const template_Advanced_Search_Panel = {
_jqhtml_version: '2.2.185',
name: 'Advanced_Search_Panel',
tag: 'div',
defaultAttributes: {"class": "card"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "card-header d-flex justify-content-between align-items-center"}, false]});
_output.push(" ");_output.push({tag: ["h5", {"class": "mb-0"}, false]}); _output.push("Advanced Search"); _output.push("</h5>");
_output.push(" ");_output.push({tag: ["button", {"type": "button", "class": "btn-close", "id": "close_btn" + ":" + this._cid, "data-id": "close_btn"}, false]}); _output.push("</button>");
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"class": "card-body"}, false]});
_output.push(" ");_output.push({tag: ["form", {"id": "search_form" + ":" + this._cid, "data-id": "search_form"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "row g-3"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "col-12"}, false]});
_output.push(" "); _output.push({comp: ["Input_With_Validation", {"data-label": "Keywords", "data-placeholder": "Search keywords...", "data-name": "keywords", "id": "keywords" + ":" + this._cid, "data-id": "keywords"}]});
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"class": "col-md-6"}, false]});
_output.push(" "); _output.push({comp: ["Searchable_Select", {"data-label": "Category", "data-placeholder": "Select category", "id": "category" + ":" + this._cid, "data-id": "category"}]});
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"class": "col-md-6"}, false]});
_output.push(" "); _output.push({comp: ["Multi_Select", {"data-label": "Tags", "data-placeholder": "Select tags", "id": "tags" + ":" + this._cid, "data-id": "tags"}]});
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"class": "col-md-6"}, false]});
_output.push(" "); _output.push({comp: ["Date_Picker", {"data-label": "From Date", "id": "from_date" + ":" + this._cid, "data-id": "from_date"}]});
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"class": "col-md-6"}, false]});
_output.push(" "); _output.push({comp: ["Date_Picker", {"data-label": "To Date", "id": "to_date" + ":" + this._cid, "data-id": "to_date"}]});
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"class": "col-12"}, false]});
_output.push(" ");_output.push({tag: ["label", {"class": "form-label"}, false]}); _output.push("Sort By"); _output.push("</label>");
_output.push(" ");_output.push({tag: ["select", {"class": "form-select", "id": "sort_by" + ":" + this._cid, "data-id": "sort_by"}, false]});
_output.push(" ");_output.push({tag: ["option", {"value": "relevance"}, false]}); _output.push("Relevance"); _output.push("</option>");
_output.push(" ");_output.push({tag: ["option", {"value": "date"}, false]}); _output.push("Date"); _output.push("</option>");
_output.push(" ");_output.push({tag: ["option", {"value": "title"}, false]}); _output.push("Title"); _output.push("</option>");
_output.push(" "); _output.push("</select>");
_output.push("</div>");
_output.push({tag: ["div", {"class": "col-12"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "form-check"}, false]});
_output.push(" ");_output.push({tag: ["input", {"class": "form-check-input", "type": "checkbox", "id": "exact_match" + ":" + this._cid, "data-id": "exact_match"}, true]}); _output.push("</input>");
_output.push(" ");_output.push({tag: ["label", {"class": "form-check-label"}, false]});
_output.push(" "); _output.push(" Exact match only "); _output.push("</label>");
_output.push(" "); _output.push("</div>");
_output.push("</div>");
_output.push("</div>");
_output.push("</form>");
_output.push("</div>");
_output.push({tag: ["div", {"class": "card-footer d-flex justify-content-between"}, false]});
_output.push(" "); _output.push({comp: ["Button_Secondary", {"id": "reset_btn" + ":" + this._cid, "data-id": "reset_btn"}, function(Button_Secondary) { let _output = []; _output.push("Reset"); return [_output, this]; }.bind(this)]});
_output.push(" "); _output.push({comp: ["Button_Primary", {"id": "search_btn" + ":" + this._cid, "data-id": "search_btn"}, function(Button_Primary) { let _output = []; _output.push("Search"); return [_output, this]; }.bind(this)]});
_output.push(" "); _output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Advanced_Search_Panel);
})();
/* === storage/rsx-tmp/jqhtml_9785d1ab0167c4c2.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/alert_banner.jqhtml */ (function() {
'use strict';
const template_Alert_Banner = {
_jqhtml_version: '2.2.185',
name: 'Alert_Banner',
tag: 'div',
defaultAttributes: {"class": "alert alert-info alert-dismissible fade show", "role": "alert"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" ");_output.push({tag: ["button", {"type": "button", "class": "btn-close", "data-bs-dismiss": "alert", "aria-label": "Close"}, false]}); _output.push("</button>");
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Alert_Banner);
})();
/* === storage/rsx-tmp/jqhtml_23f6ef44135b0ff4.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/avatar.jqhtml */ (function() {
'use strict';
const template_Avatar = {
_jqhtml_version: '2.2.185',
name: 'Avatar',
tag: 'img',
defaultAttributes: {"class": "rounded-circle", "alt": "User avatar"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Avatar);
})();
/* === storage/rsx-tmp/jqhtml_9b93da3b449e709a.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/blockquote.jqhtml */ (function() {
'use strict';
const template_Blockquote = {
_jqhtml_version: '2.2.185',
name: 'Blockquote',
tag: 'blockquote',
defaultAttributes: {"class": "blockquote"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Blockquote);
})();
/* === storage/rsx-tmp/jqhtml_8962f68b97d8e8f3.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/breadcrumbs.jqhtml */ (function() {
'use strict';
const template_Breadcrumbs = {
_jqhtml_version: '2.2.185',
name: 'Breadcrumbs',
tag: 'nav',
defaultAttributes: {"aria-label": "breadcrumb"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["ol", {"class": "breadcrumb mb-0"}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</ol>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Breadcrumbs);
})();
/* === storage/rsx-tmp/jqhtml_afe144bdfa61d3cd.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/bulk_action_bar.jqhtml */ (function() {
'use strict';
const template_Bulk_Action_Bar = {
_jqhtml_version: '2.2.185',
name: 'Bulk_Action_Bar',
tag: 'div',
defaultAttributes: {"class": "alert alert-primary d-flex justify-content-between align-items-center mb-3", "role": "alert"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {}, false]});
_output.push(" ");_output.push({tag: ["strong", {"class": "count"}, false]}); _output.push("0"); _output.push("</strong>"); _output.push(" items selected "); _output.push("</div>");
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex gap-2"}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" ");_output.push({tag: ["button", {"type": "button", "class": "btn-close", "id": "close_btn" + ":" + this._cid, "data-id": "close_btn", "aria-label": "Close"}, false]}); _output.push("</button>");
_output.push(" "); _output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Bulk_Action_Bar);
})();
/* === storage/rsx-tmp/jqhtml_e544f4c81faee9c9.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/bulk_selection.jqhtml */ (function() {
'use strict';
const template_Bulk_Selection = {
_jqhtml_version: '2.2.185',
name: 'Bulk_Selection',
tag: 'div',
defaultAttributes: {"class": "form-check"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["input", {"class": "form-check-input", "type": "checkbox", "id": "checkbox" + ":" + this._cid, "data-id": "checkbox", "aria-label": "Select all"}, true]}); _output.push("</input>");
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Bulk_Selection);
})();
/* === storage/rsx-tmp/jqhtml_2f4eef67eee9d66a.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/button_group.jqhtml */ (function() {
'use strict';
const template_Button_Group = {
_jqhtml_version: '2.2.185',
name: 'Button_Group',
tag: 'div',
defaultAttributes: {"class": "btn-group", "role": "group"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Button_Group);
})();
/* === storage/rsx-tmp/jqhtml_b239d09fd9e8122f.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/button_primary.jqhtml */ (function() {
'use strict';
const template_Button_Primary = {
_jqhtml_version: '2.2.185',
name: 'Button_Primary',
tag: 'button',
defaultAttributes: {"class": "btn btn-primary", "type": "button"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Button_Primary);
})();
/* === storage/rsx-tmp/jqhtml_3ad6fdf2a551145b.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/button_secondary.jqhtml */ (function() {
'use strict';
const template_Button_Secondary = {
_jqhtml_version: '2.2.185',
name: 'Button_Secondary',
tag: 'button',
defaultAttributes: {"class": "btn btn-secondary", "type": "button"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Button_Secondary);
})();
/* === storage/rsx-tmp/jqhtml_bcfe3c72ddaa89e1.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/button.jqhtml */ (function() {
'use strict';
const template_Button = {
_jqhtml_version: '2.2.185',
name: 'Button',
tag: 'button',
defaultAttributes: {"class": "btn", "type": "button"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Button);
})();
/* === storage/rsx-tmp/jqhtml_90dcdfb9bcaea588.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/calendar_event.jqhtml */ (function() {
'use strict';
const template_Calendar_Event = {
_jqhtml_version: '2.2.185',
name: 'Calendar_Event',
tag: 'div',
defaultAttributes: {"class": "card mb-2", "style": "cursor: pointer;"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "card-body p-2"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex align-items-start gap-2"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "bg-" + (this.args.color || 'primary') + "rounded", "style": "width: 4px; height: 100%; min-height: 40px;"}, false]}); _output.push("</div>");
_output.push(" ");_output.push({tag: ["div", {"class": "flex-grow-1"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "fw-bold small"}, false]}); (() => { const result = this.args.title ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</div>");
_output.push(" ");_output.push({tag: ["div", {"class": "text-muted small"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-clock me-1"}, false]}); _output.push("</i>");
_output.push(" "); (() => { const result = this.args.time ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); _output.push("</div>");
if (this.args.location) {
_output.push(" ");_output.push({tag: ["div", {"class": "text-muted small"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-geo-alt me-1"}, false]}); _output.push("</i>");
_output.push(" "); (() => { const result = this.args.location ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); _output.push("</div>");
}
_output.push(" "); _output.push("</div>");
_output.push("</div>");
_output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Calendar_Event);
})();
/* === storage/rsx-tmp/jqhtml_21cc4349a5469d96.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/calendar_grid.jqhtml */ (function() {
'use strict';
const template_Calendar_Grid = {
_jqhtml_version: '2.2.185',
name: 'Calendar_Grid',
tag: 'div',
defaultAttributes: {"class": "card"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "card-header d-flex justify-content-between align-items-center"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["button", {"type": "button", "class": "btn btn-secondary", "id": "prev_btn" + ":" + this._cid, "data-id": "prev_btn"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-chevron-left"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"type": "button", "class": "btn btn-secondary", "id": "today_btn" + ":" + this._cid, "data-id": "today_btn"}, false]}); _output.push("Today"); _output.push("</button>");
_output.push(" ");_output.push({tag: ["button", {"type": "button", "class": "btn btn-secondary", "id": "next_btn" + ":" + this._cid, "data-id": "next_btn"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-chevron-right"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push("</div>");
_output.push({tag: ["h5", {"class": "mb-0", "id": "month_title" + ":" + this._cid, "data-id": "month_title"}, false]}); _output.push("</h5>");
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["button", {"type": "button", "class": "btn btn-secondary", "data-view": "month"}, false]}); _output.push("Month"); _output.push("</button>");
_output.push(" ");_output.push({tag: ["button", {"type": "button", "class": "btn btn-secondary", "data-view": "week"}, false]}); _output.push("Week"); _output.push("</button>");
_output.push(" "); _output.push("</div>");
_output.push("</div>");
_output.push({tag: ["div", {"class": "card-body p-0"}, false]});
_output.push(" ");_output.push({tag: ["table", {"class": "table table-bordered mb-0"}, false]});
_output.push(" ");_output.push({tag: ["thead", {"class": "table-light"}, false]});
_output.push(" ");_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["th", {"class": "text-center"}, false]}); _output.push("Sun"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {"class": "text-center"}, false]}); _output.push("Mon"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {"class": "text-center"}, false]}); _output.push("Tue"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {"class": "text-center"}, false]}); _output.push("Wed"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {"class": "text-center"}, false]}); _output.push("Thu"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {"class": "text-center"}, false]}); _output.push("Fri"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {"class": "text-center"}, false]}); _output.push("Sat"); _output.push("</th>");
_output.push(" "); _output.push("</tr>");
_output.push("</thead>");
_output.push({tag: ["tbody", {"id": "calendar_body" + ":" + this._cid, "data-id": "calendar_body"}, false]});
_output.push(" "); _output.push("<!-- Generated via JavaScript -->");
_output.push(" "); _output.push("</tbody>");
_output.push("</table>");
_output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Calendar_Grid);
})();
/* === storage/rsx-tmp/jqhtml_c7f2613cd27ca298.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/card_footer.jqhtml */ (function() {
'use strict';
const template_Card_Footer = {
_jqhtml_version: '2.2.185',
name: 'Card_Footer',
tag: 'div',
defaultAttributes: {"class": "card-footer bg-light"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex justify-content-between align-items-center"}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Card_Footer);
})();
/* === storage/rsx-tmp/jqhtml_ebb90bbbba9ffc1b.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/card_header.jqhtml */ (function() {
'use strict';
const template_Card_Header = {
_jqhtml_version: '2.2.185',
name: 'Card_Header',
tag: 'div',
defaultAttributes: {"class": "card-header bg-light"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex justify-content-between align-items-center"}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Card_Header);
})();
/* === storage/rsx-tmp/jqhtml_046c6fa8cf01a4ee.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/card_title.jqhtml */ (function() {
'use strict';
const template_Card_Title = {
_jqhtml_version: '2.2.185',
name: 'Card_Title',
tag: 'h5',
defaultAttributes: {"class": "mb-0"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");
(() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" ");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Card_Title);
})();
/* === storage/rsx-tmp/jqhtml_fd9575173d3ff436.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/card.jqhtml */ (function() {
'use strict';
const template_Card = {
_jqhtml_version: '2.2.185',
name: 'Card',
tag: 'div',
defaultAttributes: {"class": "card"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");
_output.push({tag: ["div", {"class": "card-body"}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Card);
})();
/* === storage/rsx-tmp/jqhtml_bb17642e22644b05.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/chart_component.jqhtml */ (function() {
'use strict';
const template_Chart_Component = {
_jqhtml_version: '2.2.185',
name: 'Chart_Component',
tag: 'div',
defaultAttributes: {"class": "chart-placeholder bg-light rounded d-flex align-items-center justify-content-center"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "text-center text-muted p-5"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-graph-up fs-1 d-block mb-2"}, false]}); _output.push("</i>");
_output.push(" ");_output.push({tag: ["p", {"class": "mb-0"}, false]}); _output.push("Chart Component"); _output.push("</p>");
_output.push(" ");_output.push({tag: ["small", {}, false]}); _output.push("Placeholder for future chart integration"); _output.push("</small>");
_output.push(" "); _output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Chart_Component);
})();
/* === storage/rsx-tmp/jqhtml_c5c07318a6a9c3fb.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/checkbox.jqhtml */ (function() {
'use strict';
const template_Checkbox = {
_jqhtml_version: '2.2.185',
name: 'Checkbox',
tag: 'input',
defaultAttributes: {"type": "checkbox", "class": "form-check-input"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Checkbox);
})();
/* === storage/rsx-tmp/jqhtml_91cd4a0023337040.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/code_block.jqhtml */ (function() {
'use strict';
const template_Code_Block = {
_jqhtml_version: '2.2.185',
name: 'Code_Block',
tag: 'pre',
defaultAttributes: {"class": "p-3 bg-dark text-light rounded"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["code", {}, false]}); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })(); _output.push("</code>");
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Code_Block);
})();
/* === storage/rsx-tmp/jqhtml_915ef00c65975793.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/column_visibility_toggle.jqhtml */ (function() {
'use strict';
const template_Column_Visibility_Toggle = {
_jqhtml_version: '2.2.185',
name: 'Column_Visibility_Toggle',
tag: 'div',
defaultAttributes: {"class": "dropdown"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-secondary btn-sm dropdown-toggle", "type": "button", "data-bs-toggle": "dropdown", "aria-expanded": "false"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-columns"}, false]}); _output.push("</i>"); _output.push(" Columns "); _output.push("</button>");
_output.push(" ");_output.push({tag: ["ul", {"class": "dropdown-menu dropdown-menu-end", "id": "menu" + ":" + this._cid, "data-id": "menu"}, false]});
_output.push(" "); _output.push("<!-- Dynamically populated via JavaScript -->");
_output.push(" "); _output.push("</ul>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Column_Visibility_Toggle);
})();
/* === storage/rsx-tmp/jqhtml_b3e6a83d01905036.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/comment_thread.jqhtml */ (function() {
'use strict';
const template_Comment_Thread = {
_jqhtml_version: '2.2.185',
name: 'Comment_Thread',
tag: 'div',
defaultAttributes: {"class": "card"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "card-header d-flex justify-content-between align-items-center"}, false]});
_output.push(" ");_output.push({tag: ["h5", {"class": "mb-0"}, false]}); _output.push("Comments (");_output.push({tag: ["span", {"id": "comment_count" + ":" + this._cid, "data-id": "comment_count"}, false]}); (() => { const result = (this.data.comments || []).length ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</span>"); _output.push(")"); _output.push("</h5>");
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"class": "card-body"}, false]});
_output.push(" ");_output.push({tag: ["div", {"id": "comments" + ":" + this._cid, "data-id": "comments"}, false]});
_output.push(" "); if (Object.keys(this.data).length === 0) {
_output.push(" ");_output.push({tag: ["div", {"class": "text-center py-4"}, false]});
_output.push(" "); _output.push({comp: ["Spinner", {}]});
_output.push(" "); _output.push("</div>");
} else if (this.data.comments && this.data.comments.length === 0) {
_output.push(" "); _output.push({comp: ["Empty_State", {"data-icon": "chat-left-text", "data-title": "No comments yet", "data-message": "Be the first to comment"}]});
_output.push(" "); } else {
_output.push(" "); for (let comment of this.data.comments || []) {
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex gap-3 mb-4", "data-comment-id": (comment.id)}, false]});
_output.push(" "); _output.push({comp: ["Avatar", {"data-src": comment.avatar, "data-name": comment.user_name, "data-size": "sm"}]});
_output.push(" ");_output.push({tag: ["div", {"class": "flex-grow-1"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "bg-light rounded p-3"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex justify-content-between align-items-start mb-2"}, false]});
_output.push(" ");_output.push({tag: ["strong", {}, false]}); (() => { const result = comment.user_name ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</strong>");
_output.push(" ");_output.push({tag: ["small", {"class": "text-muted"}, false]}); (() => { const result = comment.time_ago ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</small>");
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {}, false]}); (() => { const result = comment.text ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</div>");
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"class": "mt-2"}, false]});
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-link btn-sm p-0 me-3 reply-btn"}, false]}); _output.push("Reply"); _output.push("</button>");
_output.push(" "); if (comment.can_edit) {
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-link btn-sm p-0 me-3 edit-btn"}, false]}); _output.push("Edit"); _output.push("</button>");
_output.push(" "); }
_output.push(" "); if (comment.can_delete) {
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-link btn-sm p-0 text-danger delete-btn"}, false]}); _output.push("Delete"); _output.push("</button>");
_output.push(" "); }
_output.push(" "); _output.push("</div>");
if (comment.replies && comment.replies.length > 0) {
_output.push(" ");_output.push({tag: ["div", {"class": "ms-4 mt-3"}, false]});
_output.push(" "); for (let reply of comment.replies) {
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex gap-3 mb-3", "data-comment-id": (reply.id)}, false]});
_output.push(" "); _output.push({comp: ["Avatar", {"data-src": reply.avatar, "data-name": reply.user_name, "data-size": "xs"}]});
_output.push(" ");_output.push({tag: ["div", {"class": "flex-grow-1"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "bg-light rounded p-2"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex justify-content-between align-items-start mb-1"}, false]});
_output.push(" ");_output.push({tag: ["strong", {"class": "small"}, false]}); (() => { const result = reply.user_name ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</strong>");
_output.push(" ");_output.push({tag: ["small", {"class": "text-muted"}, false]}); (() => { const result = reply.time_ago ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</small>");
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"class": "small"}, false]}); (() => { const result = reply.text ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</div>");
_output.push(" "); _output.push("</div>");
_output.push("</div>");
_output.push("</div>");
}
_output.push(" "); _output.push("</div>");
}
_output.push(" "); _output.push("</div>");
_output.push("</div>");
}
_output.push(" "); }
_output.push(" "); _output.push("</div>");
_output.push("<!-- New comment form -->");
_output.push(" ");_output.push({tag: ["div", {"class": "mt-4 pt-4 border-top", "id": "new_comment_form" + ":" + this._cid, "data-id": "new_comment_form"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex gap-3"}, false]});
_output.push(" "); _output.push({comp: ["Avatar", {"data-src": this.args.current_user_avatar, "data-name": this.args.current_user_name, "data-size": "sm"}]});
_output.push(" ");_output.push({tag: ["div", {"class": "flex-grow-1"}, false]});
_output.push(" ");_output.push({tag: ["textarea", {"class": "form-control mb-2", "rows": "3", "placeholder": "Write a comment...", "id": "comment_input" + ":" + this._cid, "data-id": "comment_input"}, false]}); _output.push("</textarea>");
_output.push(" "); _output.push({comp: ["Button_Primary", {"id": "submit_btn" + ":" + this._cid, "data-id": "submit_btn"}, function(Button_Primary) { let _output = []; _output.push("Post Comment"); return [_output, this]; }.bind(this)]});
_output.push(" "); _output.push("</div>");
_output.push("</div>");
_output.push("</div>");
_output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Comment_Thread);
})();
/* === storage/rsx-tmp/jqhtml_8e90648b1e516e10.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/contact_actions.jqhtml */ (function() {
'use strict';
const template_Contact_Actions = {
_jqhtml_version: '2.2.185',
name: 'Contact_Actions',
tag: 'td',
defaultAttributes: {},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");
_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Contact_Actions);
})();
/* === storage/rsx-tmp/jqhtml_7f748fe97d884387.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/contact_row.jqhtml */ (function() {
'use strict';
const template_Contact_Row = {
_jqhtml_version: '2.2.185',
name: 'Contact_Row',
tag: 'tr',
defaultAttributes: {},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Contact_Row);
})();
/* === storage/rsx-tmp/jqhtml_522acc1e0535a8e0.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/contacts_data_table.jqhtml */ (function() {
'use strict';
const template_Contacts_Data_Table = {
_jqhtml_version: '2.2.185',
name: 'Contacts_Data_Table',
tag: 'div',
defaultAttributes: {"class": "card-body p-0"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "table-responsive"}, false]});
_output.push(" ");_output.push({tag: ["table", {"class": "table table-hover mb-0"}, false]});
_output.push(" ");_output.push({tag: ["thead", {}, false]});
_output.push(" ");_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["th", {"style": "width: 40px;"}, false]});_output.push({tag: ["input", {"class": "form-check-input", "type": "checkbox"}, true]}); _output.push("</input>"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {}, false]}); _output.push("ID"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {}, false]}); _output.push("Name"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {}, false]}); _output.push("Email"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {}, false]}); _output.push("Phone"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {}, false]}); _output.push("Company"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {}, false]}); _output.push("Role"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {}, false]}); _output.push("Status"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {}, false]}); _output.push("Created"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {"style": "width: 100px;"}, false]}); _output.push("Actions"); _output.push("</th>");
_output.push(" "); _output.push("</tr>");
_output.push("</thead>");
_output.push({tag: ["tbody", {}, false]});
_output.push(" ");_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["input", {"class": "form-check-input", "type": "checkbox"}, true]}); _output.push("</input>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["a", {"href": (Rsx.Route('Frontend_Contacts_View_Controller'))}, false]}); _output.push("#CT001"); _output.push("</a>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["a", {"href": (Rsx.Route('Frontend_Contacts_View_Controller'))}, false]}); _output.push("Jane Smith"); _output.push("</a>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["a", {"href": (Rsx.Route('Frontend_Contacts_View_Controller'))}, false]}); _output.push("jane@acme.com"); _output.push("</a>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("(555) 123-4567"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Acme Corporation"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("CEO"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-success"}, false]}); _output.push("Active"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Jan 15, 2024"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["a", {"class": "btn btn-primary", "href": (Rsx.Route('Frontend_Contacts_View_Controller')), "title": "View"}, false]});_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>"); _output.push("</a>");
_output.push(" ");_output.push({tag: ["a", {"class": "btn btn-secondary", "href": "#", "title": "Edit"}, false]});_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>"); _output.push("</a>");
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-danger", "type": "button", "title": "Delete"}, false]});_output.push({tag: ["i", {"class": "bi bi-trash"}, false]}); _output.push("</i>"); _output.push("</button>");
_output.push(" "); _output.push("</div>");
_output.push("</td>");
_output.push("</tr>");
_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["input", {"class": "form-check-input", "type": "checkbox"}, true]}); _output.push("</input>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("#CT002"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Bob Johnson"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("bob@techsolutions.io"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("(555) 234-5678"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Tech Solutions Inc"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("CTO"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-success"}, false]}); _output.push("Active"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Jan 18, 2024"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["a", {"class": "btn btn-primary", "href": (Rsx.Route('Frontend_Contacts_View_Controller')), "title": "View"}, false]});_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>"); _output.push("</a>");
_output.push(" ");_output.push({tag: ["a", {"class": "btn btn-secondary", "href": "#", "title": "Edit"}, false]});_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>"); _output.push("</a>");
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-danger", "type": "button", "title": "Delete"}, false]});_output.push({tag: ["i", {"class": "bi bi-trash"}, false]}); _output.push("</i>"); _output.push("</button>");
_output.push(" "); _output.push("</div>");
_output.push("</td>");
_output.push("</tr>");
_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["input", {"class": "form-check-input", "type": "checkbox"}, true]}); _output.push("</input>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("#CT003"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Sarah Wilson"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("sarah@globalent.com"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("(555) 345-6789"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Global Enterprises"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Project Manager"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-warning"}, false]}); _output.push("Pending"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Feb 02, 2024"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["a", {"class": "btn btn-primary", "href": (Rsx.Route('Frontend_Contacts_View_Controller')), "title": "View"}, false]});_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>"); _output.push("</a>");
_output.push(" ");_output.push({tag: ["a", {"class": "btn btn-secondary", "href": "#", "title": "Edit"}, false]});_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>"); _output.push("</a>");
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-danger", "type": "button", "title": "Delete"}, false]});_output.push({tag: ["i", {"class": "bi bi-trash"}, false]}); _output.push("</i>"); _output.push("</button>");
_output.push(" "); _output.push("</div>");
_output.push("</td>");
_output.push("</tr>");
_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["input", {"class": "form-check-input", "type": "checkbox"}, true]}); _output.push("</input>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("#CT004"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Michael Brown"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("mbrown@innovation.co"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("(555) 456-7890"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("StartUp Innovations"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Developer"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-success"}, false]}); _output.push("Active"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Feb 10, 2024"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["a", {"class": "btn btn-primary", "href": (Rsx.Route('Frontend_Contacts_View_Controller')), "title": "View"}, false]});_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>"); _output.push("</a>");
_output.push(" ");_output.push({tag: ["a", {"class": "btn btn-secondary", "href": "#", "title": "Edit"}, false]});_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>"); _output.push("</a>");
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-danger", "type": "button", "title": "Delete"}, false]});_output.push({tag: ["i", {"class": "bi bi-trash"}, false]}); _output.push("</i>"); _output.push("</button>");
_output.push(" "); _output.push("</div>");
_output.push("</td>");
_output.push("</tr>");
_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["input", {"class": "form-check-input", "type": "checkbox"}, true]}); _output.push("</input>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("#CT005"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Emily Davis"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("emily@wilson.com"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("(555) 567-8901"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Wilson & Associates"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Marketing Director"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-danger"}, false]}); _output.push("Suspended"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Feb 15, 2024"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["a", {"class": "btn btn-primary", "href": (Rsx.Route('Frontend_Contacts_View_Controller')), "title": "View"}, false]});_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>"); _output.push("</a>");
_output.push(" ");_output.push({tag: ["a", {"class": "btn btn-secondary", "href": "#", "title": "Edit"}, false]});_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>"); _output.push("</a>");
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-danger", "type": "button", "title": "Delete"}, false]});_output.push({tag: ["i", {"class": "bi bi-trash"}, false]}); _output.push("</i>"); _output.push("</button>");
_output.push(" "); _output.push("</div>");
_output.push("</td>");
_output.push("</tr>");
_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["input", {"class": "form-check-input", "type": "checkbox"}, true]}); _output.push("</input>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("#CT006"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("David Martinez"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("david@dmppro.com"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("(555) 678-9012"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Digital Marketing Pro"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Sales Manager"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-success"}, false]}); _output.push("Active"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Mar 01, 2024"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["a", {"class": "btn btn-primary", "href": (Rsx.Route('Frontend_Contacts_View_Controller')), "title": "View"}, false]});_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>"); _output.push("</a>");
_output.push(" ");_output.push({tag: ["a", {"class": "btn btn-secondary", "href": "#", "title": "Edit"}, false]});_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>"); _output.push("</a>");
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-danger", "type": "button", "title": "Delete"}, false]});_output.push({tag: ["i", {"class": "bi bi-trash"}, false]}); _output.push("</i>"); _output.push("</button>");
_output.push(" "); _output.push("</div>");
_output.push("</td>");
_output.push("</tr>");
_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["input", {"class": "form-check-input", "type": "checkbox"}, true]}); _output.push("</input>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("#CT007"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Jennifer Anderson"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("jennifer@andersonind.net"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("(555) 789-0123"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Anderson Industries"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("CFO"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-success"}, false]}); _output.push("Active"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Mar 05, 2024"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["a", {"class": "btn btn-primary", "href": (Rsx.Route('Frontend_Contacts_View_Controller')), "title": "View"}, false]});_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>"); _output.push("</a>");
_output.push(" ");_output.push({tag: ["a", {"class": "btn btn-secondary", "href": "#", "title": "Edit"}, false]});_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>"); _output.push("</a>");
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-danger", "type": "button", "title": "Delete"}, false]});_output.push({tag: ["i", {"class": "bi bi-trash"}, false]}); _output.push("</i>"); _output.push("</button>");
_output.push(" "); _output.push("</div>");
_output.push("</td>");
_output.push("</tr>");
_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["input", {"class": "form-check-input", "type": "checkbox"}, true]}); _output.push("</input>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("#CT008"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Robert Thompson"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("robert@creativestudios.com"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("(555) 890-1234"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Creative Studios LLC"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Art Director"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-warning"}, false]}); _output.push("Pending"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Mar 12, 2024"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["a", {"class": "btn btn-primary", "href": (Rsx.Route('Frontend_Contacts_View_Controller')), "title": "View"}, false]});_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>"); _output.push("</a>");
_output.push(" ");_output.push({tag: ["a", {"class": "btn btn-secondary", "href": "#", "title": "Edit"}, false]});_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>"); _output.push("</a>");
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-danger", "type": "button", "title": "Delete"}, false]});_output.push({tag: ["i", {"class": "bi bi-trash"}, false]}); _output.push("</i>"); _output.push("</button>");
_output.push(" "); _output.push("</div>");
_output.push("</td>");
_output.push("</tr>");
_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["input", {"class": "form-check-input", "type": "checkbox"}, true]}); _output.push("</input>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("#CT009"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Lisa Garcia"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("lisa@garciaconsult.com"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("(555) 901-2345"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Garcia Consulting"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Consultant"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-success"}, false]}); _output.push("Active"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Mar 18, 2024"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["a", {"class": "btn btn-primary", "href": (Rsx.Route('Frontend_Contacts_View_Controller')), "title": "View"}, false]});_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>"); _output.push("</a>");
_output.push(" ");_output.push({tag: ["a", {"class": "btn btn-secondary", "href": "#", "title": "Edit"}, false]});_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>"); _output.push("</a>");
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-danger", "type": "button", "title": "Delete"}, false]});_output.push({tag: ["i", {"class": "bi bi-trash"}, false]}); _output.push("</i>"); _output.push("</button>");
_output.push(" "); _output.push("</div>");
_output.push("</td>");
_output.push("</tr>");
_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["input", {"class": "form-check-input", "type": "checkbox"}, true]}); _output.push("</input>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("#CT010"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Christopher White"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("chris@whitepartners.org"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("(555) 012-3456"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("White & Partners"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Partner"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-success"}, false]}); _output.push("Active"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Mar 22, 2024"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["a", {"class": "btn btn-primary", "href": (Rsx.Route('Frontend_Contacts_View_Controller')), "title": "View"}, false]});_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>"); _output.push("</a>");
_output.push(" ");_output.push({tag: ["a", {"class": "btn btn-secondary", "href": "#", "title": "Edit"}, false]});_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>"); _output.push("</a>");
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-danger", "type": "button", "title": "Delete"}, false]});_output.push({tag: ["i", {"class": "bi bi-trash"}, false]}); _output.push("</i>"); _output.push("</button>");
_output.push(" "); _output.push("</div>");
_output.push("</td>");
_output.push("</tr>");
_output.push("</tbody>");
_output.push("</table>");
_output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Contacts_Data_Table);
})();
/* === storage/rsx-tmp/jqhtml_11caea8e6e7fc2d3.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/contacts_list_card.jqhtml */ (function() {
'use strict';
const template_Contacts_List_Card = {
_jqhtml_version: '2.2.185',
name: 'Contacts_List_Card',
tag: 'div',
defaultAttributes: {"class": "card"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");
(() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" ");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Contacts_List_Card);
})();
/* === storage/rsx-tmp/jqhtml_2b0dad9b2a4c6834.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/date_picker.jqhtml */ (function() {
'use strict';
const template_Date_Picker = {
_jqhtml_version: '2.2.185',
name: 'Date_Picker',
tag: 'div',
defaultAttributes: {"class": "mb-3"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); if (this.args.label) {
_output.push(" ");_output.push({tag: ["label", {"class": "form-label"}, false]}); (() => { const result = this.args.label ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</label>");
_output.push(" "); }
_output.push(" ");_output.push({tag: ["div", {"class": "input-group"}, false]});
_output.push(" ");_output.push({tag: ["span", {"class": "input-group-text"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-calendar"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</span>");
_output.push({tag: ["input", {"type": "date", "class": "form-control", "placeholder": (this.args.placeholder || ''), "id": "input" + ":" + this._cid, "data-id": "input"}, true]}); _output.push("</input>");
_output.push(" "); _output.push("</div>");
if (this.args.help) {
_output.push(" ");_output.push({tag: ["div", {"class": "form-text"}, false]}); (() => { const result = this.args.help ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</div>");
_output.push(" "); }
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Date_Picker);
})();
/* === storage/rsx-tmp/jqhtml_865ebd1e323b6278.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/dropdown_menu.jqhtml */ (function() {
'use strict';
const template_Dropdown_Menu = {
_jqhtml_version: '2.2.185',
name: 'Dropdown_Menu',
tag: 'div',
defaultAttributes: {"class": "dropdown"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-secondary dropdown-toggle", "type": "button", "data-bs-toggle": "dropdown", "aria-expanded": "false", "id": "toggle" + ":" + this._cid, "data-id": "toggle"}, false]});
_output.push(" "); (() => { const result = this.args.label || 'Menu' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); _output.push("</button>");
_output.push({tag: ["ul", {"class": "dropdown-menu", "aria-labelledby": "toggle", "id": "menu" + ":" + this._cid, "data-id": "menu"}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</ul>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Dropdown_Menu);
})();
/* === storage/rsx-tmp/jqhtml_c4180645ca8fee3a.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/empty_state.jqhtml */ (function() {
'use strict';
const template_Empty_State = {
_jqhtml_version: '2.2.185',
name: 'Empty_State',
tag: 'div',
defaultAttributes: {"class": "text-center py-5"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "mb-3 text-muted", "style": "font-size: 3rem;"}, false]});
_output.push(" "); _output.push({comp: ["Icon", {"data-name": this.args.icon || 'inbox'}]});
_output.push(" "); _output.push("</div>");
_output.push({tag: ["h5", {"class": "text-muted"}, false]}); (() => { const result = this.args.title || 'No items found' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</h5>");
_output.push(" ");_output.push({tag: ["p", {"class": "text-muted"}, false]}); (() => { const result = this.args.message || 'Get started by creating a new item.' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</p>");
_output.push(" "); if (this.args.action_label) {
_output.push(" "); _output.push({comp: ["Button_Primary", {}, function(Button_Primary) { let _output = []; (() => { const result = this.args.action_label ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); return [_output, this]; }.bind(this)]});
_output.push(" "); }
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Empty_State);
})();
/* === storage/rsx-tmp/jqhtml_92f90b187b0143cf.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/export_button.jqhtml */ (function() {
'use strict';
const template_Export_Button = {
_jqhtml_version: '2.2.185',
name: 'Export_Button',
tag: 'div',
defaultAttributes: {"class": "dropdown"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-" + (this.args.variant || 'primary') + "dropdown-toggle", "type": "button", "data-bs-toggle": "dropdown", "aria-expanded": "false"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-download"}, false]}); _output.push("</i>");
_output.push(" "); (() => { const result = this.args.label || 'Export' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); _output.push("</button>");
_output.push({tag: ["ul", {"class": "dropdown-menu"}, false]});
_output.push(" ");_output.push({tag: ["li", {}, false]});
_output.push(" ");_output.push({tag: ["a", {"class": "dropdown-item", "href": "#", "data-format": "csv"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-filetype-csv me-2"}, false]}); _output.push("</i>");
_output.push(" "); _output.push(" Export as CSV "); _output.push("</a>");
_output.push(" "); _output.push("</li>");
_output.push({tag: ["li", {}, false]});
_output.push(" ");_output.push({tag: ["a", {"class": "dropdown-item", "href": "#", "data-format": "excel"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-filetype-xlsx me-2"}, false]}); _output.push("</i>");
_output.push(" "); _output.push(" Export as Excel "); _output.push("</a>");
_output.push(" "); _output.push("</li>");
_output.push({tag: ["li", {}, false]});
_output.push(" ");_output.push({tag: ["a", {"class": "dropdown-item", "href": "#", "data-format": "pdf"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-filetype-pdf me-2"}, false]}); _output.push("</i>");
_output.push(" "); _output.push(" Export as PDF "); _output.push("</a>");
_output.push(" "); _output.push("</li>");
_output.push({tag: ["li", {}, false]});
_output.push(" ");_output.push({tag: ["a", {"class": "dropdown-item", "href": "#", "data-format": "json"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-filetype-json me-2"}, false]}); _output.push("</i>");
_output.push(" "); _output.push(" Export as JSON "); _output.push("</a>");
_output.push(" "); _output.push("</li>");
_output.push("</ul>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Export_Button);
})();
/* === storage/rsx-tmp/jqhtml_9a5639b57b894f70.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/file_upload.jqhtml */ (function() {
'use strict';
const template_File_Upload = {
_jqhtml_version: '2.2.185',
name: 'File_Upload',
tag: 'div',
defaultAttributes: {"class": "mb-3"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); if (this.args.label) {
_output.push(" ");_output.push({tag: ["label", {"class": "form-label"}, false]}); (() => { const result = this.args.label ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</label>");
_output.push(" "); }
_output.push(" ");_output.push({tag: ["div", {"class": "border rounded p-4 text-center", "id": "drop_zone" + ":" + this._cid, "data-id": "drop_zone", "style": "cursor: pointer; transition: all 0.2s;"}, false]});
_output.push(" ");_output.push({tag: ["input", {"type": "file", "class": "d-none", "id": "file_input" + ":" + this._cid, "data-id": "file_input"}, true]}); _output.push("</input>");
_output.push(" ");_output.push({tag: ["div", {"id": "placeholder" + ":" + this._cid, "data-id": "placeholder"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-cloud-upload fs-1 text-muted"}, false]}); _output.push("</i>");
_output.push(" ");_output.push({tag: ["div", {"class": "mt-2"}, false]});
_output.push(" ");_output.push({tag: ["span", {"class": "text-primary"}, false]}); _output.push("Click to upload"); _output.push("</span>"); _output.push(" or drag and drop "); _output.push("</div>");
_output.push(" "); if (this.args.accept) {
_output.push(" ");_output.push({tag: ["div", {"class": "text-muted small mt-1"}, false]}); (() => { const result = this.args.accept ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</div>");
_output.push(" "); }
_output.push(" "); if (this.args.max_size) {
_output.push(" ");_output.push({tag: ["div", {"class": "text-muted small"}, false]}); _output.push("Max size: "); (() => { const result = this.args.max_size ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</div>");
_output.push(" "); }
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"id": "file_info" + ":" + this._cid, "data-id": "file_info", "style": "display: none;"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-file-earmark fs-1 text-success"}, false]}); _output.push("</i>");
_output.push(" ");_output.push({tag: ["div", {"class": "mt-2", "id": "file_name" + ":" + this._cid, "data-id": "file_name"}, false]}); _output.push("</div>");
_output.push(" ");_output.push({tag: ["div", {"class": "text-muted small", "id": "file_size" + ":" + this._cid, "data-id": "file_size"}, false]}); _output.push("</div>");
_output.push(" "); _output.push({comp: ["Button_Secondary", {"id": "remove_btn" + ":" + this._cid, "data-id": "remove_btn", "class": "mt-2"}, function(Button_Secondary) { let _output = []; _output.push("Remove"); return [_output, this]; }.bind(this)]});
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"id": "progress" + ":" + this._cid, "data-id": "progress", "style": "display: none;"}, false]});
_output.push(" "); _output.push({comp: ["Progress_Bar", {"id": "progress_bar" + ":" + this._cid, "data-id": "progress_bar"}]});
_output.push(" ");_output.push({tag: ["div", {"class": "text-muted small mt-2"}, false]}); _output.push("Uploading..."); _output.push("</div>");
_output.push(" "); _output.push("</div>");
_output.push("</div>");
if (this.args.help) {
_output.push(" ");_output.push({tag: ["div", {"class": "form-text"}, false]}); (() => { const result = this.args.help ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</div>");
_output.push(" "); }
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_File_Upload);
})();
/* === storage/rsx-tmp/jqhtml_e8b264b6e5dbbf91.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/filter_bar.jqhtml */ (function() {
'use strict';
const template_Filter_Bar = {
_jqhtml_version: '2.2.185',
name: 'Filter_Bar',
tag: 'div',
defaultAttributes: {"class": "card mb-3"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "card-body"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "row g-3 align-items-end"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "col-auto"}, false]});
_output.push(" ");_output.push({tag: ["label", {"class": "form-label small text-muted mb-1"}, false]}); _output.push("Search"); _output.push("</label>");
_output.push(" "); _output.push({comp: ["Input_With_Icon", {"data-icon": "search", "data-placeholder": "Search...", "id": "search" + ":" + this._cid, "data-id": "search"}]});
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"class": "col-auto"}, false]});
_output.push(" ");_output.push({tag: ["label", {"class": "form-label small text-muted mb-1"}, false]}); _output.push("Status"); _output.push("</label>");
_output.push(" ");_output.push({tag: ["select", {"class": "form-select", "id": "status" + ":" + this._cid, "data-id": "status"}, false]});
_output.push(" ");_output.push({tag: ["option", {"value": ""}, false]}); _output.push("All"); _output.push("</option>");
_output.push(" "); _output.push("</select>");
_output.push("</div>");
_output.push({tag: ["div", {"class": "col-auto"}, false]});
_output.push(" ");_output.push({tag: ["label", {"class": "form-label small text-muted mb-1"}, false]}); _output.push("Date Range"); _output.push("</label>");
_output.push(" ");_output.push({tag: ["select", {"class": "form-select", "id": "date_range" + ":" + this._cid, "data-id": "date_range"}, false]});
_output.push(" ");_output.push({tag: ["option", {"value": ""}, false]}); _output.push("All Time"); _output.push("</option>");
_output.push(" ");_output.push({tag: ["option", {"value": "today"}, false]}); _output.push("Today"); _output.push("</option>");
_output.push(" ");_output.push({tag: ["option", {"value": "week"}, false]}); _output.push("This Week"); _output.push("</option>");
_output.push(" ");_output.push({tag: ["option", {"value": "month"}, false]}); _output.push("This Month"); _output.push("</option>");
_output.push(" ");_output.push({tag: ["option", {"value": "custom"}, false]}); _output.push("Custom Range"); _output.push("</option>");
_output.push(" "); _output.push("</select>");
_output.push("</div>");
_output.push({tag: ["div", {"class": "col-auto", "id": "custom_dates" + ":" + this._cid, "data-id": "custom_dates", "style": "display: none;"}, false]});
_output.push(" "); _output.push({comp: ["Date_Picker", {"id": "start_date" + ":" + this._cid, "data-id": "start_date"}]});
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"class": "col-auto", "id": "custom_dates_end" + ":" + this._cid, "data-id": "custom_dates_end", "style": "display: none;"}, false]});
_output.push(" "); _output.push({comp: ["Date_Picker", {"id": "end_date" + ":" + this._cid, "data-id": "end_date"}]});
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"class": "col-auto ms-auto"}, false]});
_output.push(" "); _output.push({comp: ["Button_Secondary", {"id": "clear_btn" + ":" + this._cid, "data-id": "clear_btn"}, function(Button_Secondary) { let _output = []; _output.push("Clear Filters"); return [_output, this]; }.bind(this)]});
_output.push(" "); _output.push({comp: ["Button_Primary", {"id": "apply_btn" + ":" + this._cid, "data-id": "apply_btn", "class": "ms-2"}, function(Button_Primary) { let _output = []; _output.push("Apply"); return [_output, this]; }.bind(this)]});
_output.push(" "); _output.push("</div>");
_output.push("</div>");
_output.push({tag: ["div", {"class": "mt-3", "id": "active_filters" + ":" + this._cid, "data-id": "active_filters", "style": "display: none;"}, false]});
_output.push(" ");_output.push({tag: ["small", {"class": "text-muted me-2"}, false]}); _output.push("Active filters:"); _output.push("</small>");
_output.push(" ");_output.push({tag: ["div", {"class": "d-inline-block", "id": "filter_tags" + ":" + this._cid, "data-id": "filter_tags"}, false]}); _output.push("</div>");
_output.push(" "); _output.push("</div>");
_output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Filter_Bar);
})();
/* === storage/rsx-tmp/jqhtml_86bdf5e6b735bb21.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/form_actions_component.jqhtml */ (function() {
'use strict';
const template_Form_Actions_Component = {
_jqhtml_version: '2.2.185',
name: 'Form_Actions_Component',
tag: 'div',
defaultAttributes: {"class": "mt-3"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); if (this.args.cancel_url) {
_output.push(" ");_output.push({tag: ["a", {"href": (this.args.cancel_url), "class": "btn btn-secondary"}, false]}); (() => { const result = this.args.cancel_text || 'Cancel' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</a>");
_output.push(" "); }
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-primary", "type": "submit"}, false]}); (() => { const result = this.args.submit_text || 'Save' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</button>");
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Form_Actions_Component);
})();
/* === storage/rsx-tmp/jqhtml_c125b86d10e97419.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/form_field_group.jqhtml */ (function() {
'use strict';
const template_Form_Field_Group = {
_jqhtml_version: '2.2.185',
name: 'Form_Field_Group',
tag: 'div',
defaultAttributes: {"class": "card mb-3"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "card-header"}, false]});
_output.push(" ");_output.push({tag: ["h5", {"class": "mb-0"}, false]}); (() => { const result = this.args.title || 'Form Section' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</h5>");
_output.push(" "); if (this.args.description) {
_output.push(" ");_output.push({tag: ["small", {"class": "text-muted"}, false]}); (() => { const result = this.args.description ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</small>");
_output.push(" "); }
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"class": "card-body"}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Form_Field_Group);
})();
/* === storage/rsx-tmp/jqhtml_1e85106de52ce305.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/form_group_component.jqhtml */ (function() {
'use strict';
const template_Form_Group_Component = {
_jqhtml_version: '2.2.185',
name: 'Form_Group_Component',
tag: 'div',
defaultAttributes: {},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {}, false]});
_output.push(" "); if (this.args.label) {
_output.push(" ");_output.push({tag: ["label", {"for": (this.args.id)}, false]}); (() => { const result = this.args.label ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</label>");
_output.push(" "); }
_output.push(" "); if (this.args.type === 'select') {
_output.push(" "); if (this.args.required) {
_output.push(" ");_output.push({tag: ["select", {"class": "form-select", "id": "[object Object]", "required": "true"}, false]});
_output.push(" "); if (this.args.placeholder) {
_output.push(" ");_output.push({tag: ["option", {"value": ""}, false]}); (() => { const result = this.args.placeholder ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</option>");
_output.push(" "); }
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</select>");
} else {
_output.push(" ");_output.push({tag: ["select", {"class": "form-select", "id": "[object Object]"}, false]});
_output.push(" "); if (this.args.placeholder) {
_output.push(" ");_output.push({tag: ["option", {"value": ""}, false]}); (() => { const result = this.args.placeholder ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</option>");
_output.push(" "); }
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</select>");
}
_output.push(" "); } else if (this.args.type === 'textarea') {
_output.push(" "); if (this.args.required) {
_output.push(" ");_output.push({tag: ["textarea", {"class": "form-control", "id": "[object Object]", "rows": (this.args.rows || 4), "placeholder": (this.args.placeholder || ''), "required": "true"}, false]}); _output.push("</textarea>");
_output.push(" "); } else {
_output.push(" ");_output.push({tag: ["textarea", {"class": "form-control", "id": "[object Object]", "rows": (this.args.rows || 4), "placeholder": (this.args.placeholder || '')}, false]}); _output.push("</textarea>");
_output.push(" "); }
_output.push(" "); } else {
_output.push(" "); if (this.args.required) {
_output.push(" ");_output.push({tag: ["input", {"class": "form-control", "id": "[object Object]", "type": (this.args.type || 'text'), "placeholder": (this.args.placeholder || ''), "required": "true"}, true]}); _output.push("</input>");
_output.push(" "); } else {
_output.push(" ");_output.push({tag: ["input", {"class": "form-control", "id": "[object Object]", "type": (this.args.type || 'text'), "placeholder": (this.args.placeholder || '')}, true]}); _output.push("</input>");
_output.push(" "); }
_output.push(" "); }
_output.push(" "); _output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Form_Group_Component);
})();
/* === storage/rsx-tmp/jqhtml_72937efe895dac3c.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/form_row_component.jqhtml */ (function() {
'use strict';
const template_Form_Row_Component = {
_jqhtml_version: '2.2.185',
name: 'Form_Row_Component',
tag: 'div',
defaultAttributes: {"class": "row"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Form_Row_Component);
})();
/* === storage/rsx-tmp/jqhtml_9f9f86aba7786134.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/form_validation_message.jqhtml */ (function() {
'use strict';
const template_Form_Validation_Message = {
_jqhtml_version: '2.2.185',
name: 'Form_Validation_Message',
tag: 'div',
defaultAttributes: {"class": "invalid-feedback"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Form_Validation_Message);
})();
/* === storage/rsx-tmp/jqhtml_2246bd22f8e9add5.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/gantt_chart.jqhtml */ (function() {
'use strict';
const template_Gantt_Chart = {
_jqhtml_version: '2.2.185',
name: 'Gantt_Chart',
tag: 'div',
defaultAttributes: {"class": "card"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "card-header"}, false]});
_output.push(" ");_output.push({tag: ["h5", {"class": "mb-0"}, false]}); (() => { const result = this.args.title || 'Project Timeline' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</h5>");
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"class": "card-body p-0"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "table-responsive"}, false]});
_output.push(" ");_output.push({tag: ["table", {"class": "table table-bordered mb-0", "style": "table-layout: fixed;"}, false]});
_output.push(" ");_output.push({tag: ["thead", {"class": "table-light"}, false]});
_output.push(" ");_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["th", {"style": "width: 200px;"}, false]}); _output.push("Task"); _output.push("</th>");
_output.push(" "); for (let month of this.data.months || []) {
_output.push(" ");_output.push({tag: ["th", {"class": "text-center small"}, false]}); (() => { const result = month ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</th>");
_output.push(" "); }
_output.push(" "); _output.push("</tr>");
_output.push("</thead>");
_output.push({tag: ["tbody", {}, false]});
_output.push(" "); if (Object.keys(this.data).length === 0) {
_output.push(" ");_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {"colspan": "100", "class": "text-center py-5"}, false]});
_output.push(" "); _output.push({comp: ["Spinner", {}]});
_output.push(" "); _output.push("</td>");
_output.push("</tr>");
} else {
_output.push(" "); for (let task of this.data.tasks || []) {
_output.push(" ");_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {"class": "align-middle"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "fw-bold"}, false]}); (() => { const result = task.name ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</div>");
_output.push(" "); if (task.assignee) {
_output.push(" ");_output.push({tag: ["small", {"class": "text-muted"}, false]}); (() => { const result = task.assignee ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</small>");
_output.push(" "); }
_output.push(" "); _output.push("</td>");
for (let i = 0; i < (this.data.months || []).length; i++) {
_output.push(" ");_output.push({tag: ["td", {"class": "p-1 align-middle"}, false]});
_output.push(" "); if (task.start_month <= i && task.end_month >= i) {
_output.push(" ");_output.push({tag: ["div", {"class": "bg-" + (task.color || 'primary') + "rounded p-2 text-white small text-center"}, false]});
_output.push(" "); (() => { const result = task.start_month === i ? task.name : '' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); _output.push("</div>");
}
_output.push(" "); _output.push("</td>");
}
_output.push(" "); _output.push("</tr>");
}
_output.push(" "); }
_output.push(" "); _output.push("</tbody>");
_output.push("</table>");
_output.push("</div>");
_output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Gantt_Chart);
})();
/* === storage/rsx-tmp/jqhtml_bd1cce1a76e13af1.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/icon_button.jqhtml */ (function() {
'use strict';
const template_Icon_Button = {
_jqhtml_version: '2.2.185',
name: 'Icon_Button',
tag: 'button',
defaultAttributes: {"class": "btn btn-secondary", "type": "button"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Icon_Button);
})();
/* === storage/rsx-tmp/jqhtml_31b59dfa6b448fb1.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/icon_with_label.jqhtml */ (function() {
'use strict';
const template_Icon_With_Label = {
_jqhtml_version: '2.2.185',
name: 'Icon_With_Label',
tag: 'div',
defaultAttributes: {"class": "d-inline-flex align-items-center gap-2"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); _output.push({comp: ["Icon", {"data-name": this.args.icon}]});
_output.push(" ");_output.push({tag: ["span", {}, false]}); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })(); _output.push("</span>");
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Icon_With_Label);
})();
/* === storage/rsx-tmp/jqhtml_0dec1f395fabb9f3.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/icon_with_text.jqhtml */ (function() {
'use strict';
const template_Icon_With_Text = {
_jqhtml_version: '2.2.185',
name: 'Icon_With_Text',
tag: 'div',
defaultAttributes: {"class": "d-flex align-items-center py-2"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-circle-fill me-2 text-primary", "style": "font-size: 0.5rem;"}, false]}); _output.push("</i>");
_output.push(" ");_output.push({tag: ["span", {"class": "flex-grow-1"}, false]}); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })(); _output.push("</span>");
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Icon_With_Text);
})();
/* === storage/rsx-tmp/jqhtml_cbefc50830c7e1b7.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/icon.jqhtml */ (function() {
'use strict';
const template_Icon = {
_jqhtml_version: '2.2.185',
name: 'Icon',
tag: 'svg',
defaultAttributes: {"class": "icon icon-xs", "fill": "currentColor", "viewBox": "0 0 24 24", "xmlns": "http://www.w3.org/2000/svg"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Icon);
})();
/* === storage/rsx-tmp/jqhtml_f277ab5240123d0d.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/info_box.jqhtml */ (function() {
'use strict';
const template_Info_Box = {
_jqhtml_version: '2.2.185',
name: 'Info_Box',
tag: 'div',
defaultAttributes: {"class": "p-3 mb-3 bg-light border-start border-primary border-4"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Info_Box);
})();
/* === storage/rsx-tmp/jqhtml_c6771957d17edc03.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/inline_edit_field.jqhtml */ (function() {
'use strict';
const template_Inline_Edit_Field = {
_jqhtml_version: '2.2.185',
name: 'Inline_Edit_Field',
tag: 'div',
defaultAttributes: {"class": "d-flex align-items-center gap-2"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"id": "display_mode" + ":" + this._cid, "data-id": "display_mode", "style": "cursor: pointer;"}, false]});
_output.push(" ");_output.push({tag: ["span", {"id": "value_display" + ":" + this._cid, "data-id": "value_display"}, false]}); (() => { const result = this.args.value || this.args.placeholder || 'Click to edit' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</span>");
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-pencil text-muted ms-2"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"id": "edit_mode" + ":" + this._cid, "data-id": "edit_mode", "style": "display: none;"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "input-group input-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["input", {"type": "text", "class": "form-control", "id": "input" + ":" + this._cid, "data-id": "input"}, true]}); _output.push("</input>");
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-success", "type": "button", "id": "save_btn" + ":" + this._cid, "data-id": "save_btn", "title": "Save"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-check-lg"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-secondary", "type": "button", "id": "cancel_btn" + ":" + this._cid, "data-id": "cancel_btn", "title": "Cancel"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-x-lg"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push("</div>");
_output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Inline_Edit_Field);
})();
/* === storage/rsx-tmp/jqhtml_27017433acf49ce1.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/input_with_icon.jqhtml */ (function() {
'use strict';
const template_Input_With_Icon = {
_jqhtml_version: '2.2.185',
name: 'Input_With_Icon',
tag: 'div',
defaultAttributes: {"class": "input-group"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); if (this.args.icon_position !== 'end') {
_output.push(" ");_output.push({tag: ["span", {"class": "input-group-text"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-" + (this.args.icon || 'search')}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</span>");
}
_output.push(" ");_output.push({tag: ["input", {"type": (this.args.type || 'text'), "class": "form-control", "placeholder": (this.args.placeholder || ''), "id": "input" + ":" + this._cid, "data-id": "input"}, true]}); _output.push("</input>");
_output.push(" "); if (this.args.icon_position === 'end') {
_output.push(" ");_output.push({tag: ["span", {"class": "input-group-text"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-" + (this.args.icon || 'search')}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</span>");
}
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Input_With_Icon);
})();
/* === storage/rsx-tmp/jqhtml_8f20f47d36d9f4f1.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/input_with_validation.jqhtml */ (function() {
'use strict';
const template_Input_With_Validation = {
_jqhtml_version: '2.2.185',
name: 'Input_With_Validation',
tag: 'div',
defaultAttributes: {"class": "mb-3"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); if (this.args.label) {
_output.push(" ");_output.push({tag: ["label", {"class": "form-label", "id": "label" + ":" + this._cid, "data-id": "label"}, false]});
_output.push(" "); (() => { const result = this.args.label ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); if (this.args.required) {_output.push({tag: ["span", {"class": "text-danger"}, false]}); _output.push("*"); _output.push("</span>"); }
_output.push(" "); _output.push("</label>");
}
_output.push(" ");_output.push({tag: ["input", {"type": (this.args.type || 'text'), "class": "form-control", "placeholder": (this.args.placeholder || ''), "id": "input" + ":" + this._cid, "data-id": "input"}, true]}); _output.push("</input>");
_output.push(" ");_output.push({tag: ["div", {"class": "invalid-feedback", "id": "error" + ":" + this._cid, "data-id": "error"}, false]}); _output.push("</div>");
_output.push(" ");_output.push({tag: ["div", {"class": "valid-feedback", "id": "success" + ":" + this._cid, "data-id": "success"}, false]}); _output.push("</div>");
_output.push(" "); if (this.args.help) {
_output.push(" ");_output.push({tag: ["div", {"class": "form-text"}, false]}); (() => { const result = this.args.help ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</div>");
_output.push(" "); }
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Input_With_Validation);
})();
/* === storage/rsx-tmp/jqhtml_f2c3b3f07b2cfc23.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/input.jqhtml */ (function() {
'use strict';
const template_Input = {
_jqhtml_version: '2.2.185',
name: 'Input',
tag: 'input',
defaultAttributes: {"type": "text", "class": "form-control"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Input);
})();
/* === storage/rsx-tmp/jqhtml_3cd257bb9dd3ef15.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/kanban_board.jqhtml */ (function() {
'use strict';
const template_Kanban_Board = {
_jqhtml_version: '2.2.185',
name: 'Kanban_Board',
tag: 'div',
defaultAttributes: {"class": "d-flex gap-3", "style": "overflow-x: auto;"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); if (Object.keys(this.data).length === 0) {
_output.push(" ");_output.push({tag: ["div", {"class": "w-100 text-center py-5"}, false]});
_output.push(" "); _output.push({comp: ["Spinner", {}]});
_output.push(" "); _output.push("</div>");
} else {
_output.push(" "); for (let column of this.data.columns || []) {
_output.push(" ");_output.push({tag: ["div", {"class": "card", "style": "min-width: 300px; max-width: 300px;", "data-column-id": (column.id)}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "card-header bg-light"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex justify-content-between align-items-center"}, false]});
_output.push(" ");_output.push({tag: ["h6", {"class": "mb-0"}, false]}); (() => { const result = column.title ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</h6>");
_output.push(" ");_output.push({tag: ["span", {"class": "badge bg-secondary"}, false]}); (() => { const result = column.cards.length ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</span>");
_output.push(" "); _output.push("</div>");
_output.push("</div>");
_output.push({tag: ["div", {"class": "card-body p-2", "style": "min-height: 400px; max-height: 600px; overflow-y: auto;", "data-column-cards": (column.id)}, false]});
_output.push(" "); for (let card of column.cards) {
_output.push(" ");_output.push({tag: ["div", {"class": "card mb-2", "draggable": "true", "data-card-id": (card.id)}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "card-body p-3"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "fw-bold mb-2"}, false]}); (() => { const result = card.title ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</div>");
_output.push(" "); if (card.description) {
_output.push(" ");_output.push({tag: ["div", {"class": "text-muted small mb-2"}, false]}); (() => { const result = card.description ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</div>");
_output.push(" "); }
_output.push(" "); if (card.tags && card.tags.length > 0) {
_output.push(" ");_output.push({tag: ["div", {"class": "mb-2"}, false]});
_output.push(" "); for (let tag of card.tags) {
_output.push(" ");_output.push({tag: ["span", {"class": "badge bg-light text-dark me-1"}, false]}); (() => { const result = tag ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</span>");
_output.push(" "); }
_output.push(" "); _output.push("</div>");
}
_output.push(" "); if (card.assignee) {
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex align-items-center gap-2"}, false]});
_output.push(" "); _output.push({comp: ["Avatar", {"data-name": card.assignee, "data-size": "xs"}]});
_output.push(" ");_output.push({tag: ["small", {"class": "text-muted"}, false]}); (() => { const result = card.assignee ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</small>");
_output.push(" "); _output.push("</div>");
}
_output.push(" "); _output.push("</div>");
_output.push("</div>");
}
_output.push(" "); _output.push("</div>");
_output.push("</div>");
}
_output.push(" "); }
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Kanban_Board);
})();
/* === storage/rsx-tmp/jqhtml_66091e157d531d0d.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/link.jqhtml */ (function() {
'use strict';
const template_Link = {
_jqhtml_version: '2.2.185',
name: 'Link',
tag: 'a',
defaultAttributes: {"href": "#"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Link);
})();
/* === storage/rsx-tmp/jqhtml_5cb3cbf116fa5289.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/list.jqhtml */ (function() {
'use strict';
const template_List = {
_jqhtml_version: '2.2.185',
name: 'List',
tag: 'div',
defaultAttributes: {"class": "list-group list-group-flush"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_List);
})();
/* === storage/rsx-tmp/jqhtml_ee1dd5e5562b7d50.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/loading_skeleton.jqhtml */ (function() {
'use strict';
const template_Loading_Skeleton = {
_jqhtml_version: '2.2.185',
name: 'Loading_Skeleton',
tag: 'div',
defaultAttributes: {"class": "placeholder-glow"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["span", {"class": "placeholder col-12"}, false]}); _output.push("</span>");
_output.push(" ");_output.push({tag: ["span", {"class": "placeholder col-10"}, false]}); _output.push("</span>");
_output.push(" ");_output.push({tag: ["span", {"class": "placeholder col-8"}, false]}); _output.push("</span>");
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Loading_Skeleton);
})();
/* === storage/rsx-tmp/jqhtml_a0cf37c460ea7ee3.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/metric_card.jqhtml */ (function() {
'use strict';
const template_Metric_Card = {
_jqhtml_version: '2.2.185',
name: 'Metric_Card',
tag: 'div',
defaultAttributes: {"class": "card h-100"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");
_output.push({tag: ["div", {"class": "card-body p-4"}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Metric_Card);
})();
/* === storage/rsx-tmp/jqhtml_5300a706b2d27d65.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/mobile_header.jqhtml */ (function() {
'use strict';
const template_Mobile_Header = {
_jqhtml_version: '2.2.185',
name: 'Mobile_Header',
tag: 'header',
defaultAttributes: {"class": "navbar navbar-light bg-light d-lg-none"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "container-fluid"}, false]});
_output.push(" ");_output.push({tag: ["button", {"class": "navbar-toggler", "type": "button", "data-bs-toggle": "offcanvas", "data-bs-target": "#mobileSidebar", "aria-controls": "mobileSidebar"}, false]});
_output.push(" ");_output.push({tag: ["span", {"class": "navbar-toggler-icon"}, false]}); _output.push("</span>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["span", {"class": "navbar-brand mb-0 h1"}, false]}); _output.push("PSM"); _output.push("</span>");
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex align-items-center gap-2"}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</div>");
_output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Mobile_Header);
})();
/* === storage/rsx-tmp/jqhtml_8e635c235d2a1b12.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/modal_dialog.jqhtml */ (function() {
'use strict';
const template_Modal_Dialog = {
_jqhtml_version: '2.2.185',
name: 'Modal_Dialog',
tag: 'div',
defaultAttributes: {"class": "modal fade", "tabindex": "-1", "aria-hidden": "true"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "modal-dialog"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "modal-content"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "modal-header"}, false]});
_output.push(" ");_output.push({tag: ["h5", {"class": "modal-title", "id": "title" + ":" + this._cid, "data-id": "title"}, false]}); (() => { const result = this.args.title || 'Modal' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</h5>");
_output.push(" ");_output.push({tag: ["button", {"type": "button", "class": "btn-close", "data-bs-dismiss": "modal", "aria-label": "Close"}, false]}); _output.push("</button>");
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"class": "modal-body", "id": "body" + ":" + this._cid, "data-id": "body"}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"class": "modal-footer", "id": "footer" + ":" + this._cid, "data-id": "footer"}, false]});
_output.push(" "); _output.push({comp: ["Button_Secondary", {"data-bs-dismiss": "modal"}, function(Button_Secondary) { let _output = []; _output.push("Close"); return [_output, this]; }.bind(this)]});
_output.push(" "); _output.push({comp: ["Button_Primary", {"id": "confirm" + ":" + this._cid, "data-id": "confirm"}, function(Button_Primary) { let _output = []; _output.push("Confirm"); return [_output, this]; }.bind(this)]});
_output.push(" "); _output.push("</div>");
_output.push("</div>");
_output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Modal_Dialog);
})();
/* === storage/rsx-tmp/jqhtml_7095e51c2533c441.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/multi_select.jqhtml */ (function() {
'use strict';
const template_Multi_Select = {
_jqhtml_version: '2.2.185',
name: 'Multi_Select',
tag: 'div',
defaultAttributes: {"class": "dropdown"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); if (this.args.label) {
_output.push(" ");_output.push({tag: ["label", {"class": "form-label"}, false]}); (() => { const result = this.args.label ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</label>");
_output.push(" "); }
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-secondary dropdown-toggle w-100 text-start", "type": "button", "data-bs-toggle": "dropdown", "aria-expanded": "false", "id": "button" + ":" + this._cid, "data-id": "button"}, false]});
_output.push(" ");_output.push({tag: ["span", {"id": "selected_text" + ":" + this._cid, "data-id": "selected_text"}, false]}); (() => { const result = this.args.placeholder || 'Select options' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</span>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["div", {"class": "dropdown-menu w-100", "id": "menu" + ":" + this._cid, "data-id": "menu"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "px-3 py-2"}, false]});
_output.push(" ");_output.push({tag: ["input", {"type": "search", "class": "form-control form-control-sm", "placeholder": "Search...", "id": "search" + ":" + this._cid, "data-id": "search"}, true]}); _output.push("</input>");
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"class": "dropdown-divider"}, false]}); _output.push("</div>");
_output.push(" ");_output.push({tag: ["div", {"id": "options" + ":" + this._cid, "data-id": "options", "style": "max-height: 250px; overflow-y: auto;"}, false]});
_output.push(" "); _output.push("<!-- Options populated via JavaScript -->");
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"class": "dropdown-divider"}, false]}); _output.push("</div>");
_output.push(" ");_output.push({tag: ["div", {"class": "px-3 py-2 d-flex justify-content-between"}, false]});
_output.push(" ");_output.push({tag: ["button", {"type": "button", "class": "btn btn-link btn-sm p-0", "id": "clear_all" + ":" + this._cid, "data-id": "clear_all"}, false]}); _output.push("Clear All"); _output.push("</button>");
_output.push(" ");_output.push({tag: ["button", {"type": "button", "class": "btn btn-link btn-sm p-0", "id": "select_all" + ":" + this._cid, "data-id": "select_all"}, false]}); _output.push("Select All"); _output.push("</button>");
_output.push(" "); _output.push("</div>");
_output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Multi_Select);
})();
/* === storage/rsx-tmp/jqhtml_b3fc253174c86570.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/notification_badge.jqhtml */ (function() {
'use strict';
const template_Notification_Badge = {
_jqhtml_version: '2.2.185',
name: 'Notification_Badge',
tag: 'span',
defaultAttributes: {"class": "position-relative"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" ");_output.push({tag: ["span", {"class": "position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger", "id": "count" + ":" + this._cid, "data-id": "count", "style": ((this.args.count > 0 ? '' : 'display: none;'))}, false]});
_output.push(" "); (() => { const result = this.args.count || 0 ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); _output.push("</span>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Notification_Badge);
})();
/* === storage/rsx-tmp/jqhtml_5f169cc80d559d94.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/notification_dropdown.jqhtml */ (function() {
'use strict';
const template_Notification_Dropdown = {
_jqhtml_version: '2.2.185',
name: 'Notification_Dropdown',
tag: 'div',
defaultAttributes: {"class": "dropdown"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-link position-relative", "type": "button", "data-bs-toggle": "dropdown", "aria-expanded": "false"}, false]});
_output.push(" "); _output.push({comp: ["Icon", {"data-name": "bell"}]});
_output.push(" "); if (this.args.unread_count > 0) {
_output.push(" ");_output.push({tag: ["span", {"class": "position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger"}, false]});
_output.push(" "); (() => { const result = this.args.unread_count ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); _output.push("</span>");
}
_output.push(" "); _output.push("</button>");
_output.push({tag: ["div", {"class": "dropdown-menu dropdown-menu-end", "style": "width: 320px;"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "dropdown-header d-flex justify-content-between align-items-center"}, false]});
_output.push(" ");_output.push({tag: ["span", {"class": "fw-bold"}, false]}); _output.push("Notifications"); _output.push("</span>");
_output.push(" ");_output.push({tag: ["a", {"href": "#", "class": "small"}, false]}); _output.push("Mark all read"); _output.push("</a>");
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"class": "dropdown-divider"}, false]}); _output.push("</div>");
_output.push(" ");_output.push({tag: ["div", {"class": "overflow-auto", "style": "max-height: 400px;"}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</div>");
_output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Notification_Dropdown);
})();
/* === storage/rsx-tmp/jqhtml_fca9bd701278cdf2.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/overdue_indicator.jqhtml */ (function() {
'use strict';
const template_Overdue_Indicator = {
_jqhtml_version: '2.2.185',
name: 'Overdue_Indicator',
tag: 'span',
defaultAttributes: {"class": "badge bg-warning text-dark d-block mt-1"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Overdue_Indicator);
})();
/* === storage/rsx-tmp/jqhtml_98f2e35a4e8f98a6.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/page_header_left.jqhtml */ (function() {
'use strict';
const template_Page_Header_Left = {
_jqhtml_version: '2.2.185',
name: 'Page_Header_Left',
tag: 'div',
defaultAttributes: {},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Page_Header_Left);
})();
/* === storage/rsx-tmp/jqhtml_3f3348e80138bd83.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/page_header_right.jqhtml */ (function() {
'use strict';
const template_Page_Header_Right = {
_jqhtml_version: '2.2.185',
name: 'Page_Header_Right',
tag: 'div',
defaultAttributes: {"class": "d-flex gap-2"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Page_Header_Right);
})();
/* === storage/rsx-tmp/jqhtml_0a3eab3f332207ff.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/page_header.jqhtml */ (function() {
'use strict';
const template_Page_Header = {
_jqhtml_version: '2.2.185',
name: 'Page_Header',
tag: 'div',
defaultAttributes: {"class": "d-flex justify-content-between align-items-center mb-4"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Page_Header);
})();
/* === storage/rsx-tmp/jqhtml_2b286f1f39207482.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/page_section.jqhtml */ (function() {
'use strict';
const template_Page_Section = {
_jqhtml_version: '2.2.185',
name: 'Page_Section',
tag: 'div',
defaultAttributes: {"class": "mb-4"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Page_Section);
})();
/* === storage/rsx-tmp/jqhtml_d6cf7c9e16e8f541.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/page_subtitle.jqhtml */ (function() {
'use strict';
const template_Page_Subtitle = {
_jqhtml_version: '2.2.185',
name: 'Page_Subtitle',
tag: 'p',
defaultAttributes: {"class": "text-muted mb-0"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Page_Subtitle);
})();
/* === storage/rsx-tmp/jqhtml_0ab20aacac832674.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/page_title.jqhtml */ (function() {
'use strict';
const template_Page_Title = {
_jqhtml_version: '2.2.185',
name: 'Page_Title',
tag: 'h1',
defaultAttributes: {"class": "h2 mb-1"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Page_Title);
})();
/* === storage/rsx-tmp/jqhtml_fcfe2eadb09b8b45.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/page.jqhtml */ (function() {
'use strict';
const template_Page = {
_jqhtml_version: '2.2.185',
name: 'Page',
tag: 'div',
defaultAttributes: {},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Page);
})();
/* === storage/rsx-tmp/jqhtml_31fd149cfb317d39.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/pagination_controls.jqhtml */ (function() {
'use strict';
const template_Pagination_Controls = {
_jqhtml_version: '2.2.185',
name: 'Pagination_Controls',
tag: 'nav',
defaultAttributes: {"aria-label": "Table pagination"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["ul", {"class": "pagination pagination-sm mb-0"}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</ul>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Pagination_Controls);
})();
/* === storage/rsx-tmp/jqhtml_e6ee289a952c7453.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/pagination_info.jqhtml */ (function() {
'use strict';
const template_Pagination_Info = {
_jqhtml_version: '2.2.185',
name: 'Pagination_Info',
tag: 'div',
defaultAttributes: {},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {}, false]});
_output.push(" ");_output.push({tag: ["small", {"class": "text-muted"}, false]}); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })(); _output.push("</small>");
_output.push(" "); _output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Pagination_Info);
})();
/* === storage/rsx-tmp/jqhtml_75460b9999183e3a.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/popover.jqhtml */ (function() {
'use strict';
const template_Popover = {
_jqhtml_version: '2.2.185',
name: 'Popover',
tag: 'button',
defaultAttributes: {"type": "button", "class": "btn btn-secondary", "data-bs-toggle": "popover"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { const result = this.args.label || 'Info' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Popover);
})();
/* === storage/rsx-tmp/jqhtml_c31885d0846c31e6.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/progress_bar.jqhtml */ (function() {
'use strict';
const template_Progress_Bar = {
_jqhtml_version: '2.2.185',
name: 'Progress_Bar',
tag: 'div',
defaultAttributes: {"class": "progress"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "progress-bar", "role": "progressbar", "style": "width:" + (this.args.value || 0) + "%", "aria-valuenow": (this.args.value || 0), "aria-valuemin": "0", "aria-valuemax": "100", "id": "bar" + ":" + this._cid, "data-id": "bar"}, false]});
_output.push(" "); _output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Progress_Bar);
})();
/* === storage/rsx-tmp/jqhtml_090d679f00c495b6.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/radio_button.jqhtml */ (function() {
'use strict';
const template_Radio_Button = {
_jqhtml_version: '2.2.185',
name: 'Radio_Button',
tag: 'input',
defaultAttributes: {"type": "radio", "class": "form-check-input"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Radio_Button);
})();
/* === storage/rsx-tmp/jqhtml_b0b4f93e436d5119.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/record_count_display.jqhtml */ (function() {
'use strict';
const template_Record_Count_Display = {
_jqhtml_version: '2.2.185',
name: 'Record_Count_Display',
tag: 'small',
defaultAttributes: {"class": "text-muted"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Record_Count_Display);
})();
/* === storage/rsx-tmp/jqhtml_c55ba0e3e36e44d5.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/rich_text_editor.jqhtml */ (function() {
'use strict';
const template_Rich_Text_Editor = {
_jqhtml_version: '2.2.185',
name: 'Rich_Text_Editor',
tag: 'div',
defaultAttributes: {"class": "mb-3"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); if (this.args.label) {
_output.push(" ");_output.push({tag: ["label", {"class": "form-label"}, false]}); (() => { const result = this.args.label ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</label>");
_output.push(" "); }
_output.push(" ");_output.push({tag: ["div", {"class": "border rounded"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "border-bottom bg-light p-2", "id": "toolbar" + ":" + this._cid, "data-id": "toolbar"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm me-2", "role": "group"}, false]});
_output.push(" ");_output.push({tag: ["button", {"type": "button", "class": "btn btn-secondary", "data-command": "bold", "title": "Bold"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-type-bold"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"type": "button", "class": "btn btn-secondary", "data-command": "italic", "title": "Italic"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-type-italic"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"type": "button", "class": "btn btn-secondary", "data-command": "underline", "title": "Underline"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-type-underline"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push("</div>");
_output.push({tag: ["div", {"class": "btn-group btn-group-sm me-2", "role": "group"}, false]});
_output.push(" ");_output.push({tag: ["button", {"type": "button", "class": "btn btn-secondary", "data-command": "insertUnorderedList", "title": "Bullet List"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-list-ul"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"type": "button", "class": "btn btn-secondary", "data-command": "insertOrderedList", "title": "Numbered List"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-list-ol"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push("</div>");
_output.push({tag: ["div", {"class": "btn-group btn-group-sm me-2", "role": "group"}, false]});
_output.push(" ");_output.push({tag: ["button", {"type": "button", "class": "btn btn-secondary", "data-command": "justifyLeft", "title": "Align Left"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-text-left"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"type": "button", "class": "btn btn-secondary", "data-command": "justifyCenter", "title": "Align Center"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-text-center"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"type": "button", "class": "btn btn-secondary", "data-command": "justifyRight", "title": "Align Right"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-text-right"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push("</div>");
_output.push({tag: ["div", {"class": "btn-group btn-group-sm", "role": "group"}, false]});
_output.push(" ");_output.push({tag: ["button", {"type": "button", "class": "btn btn-secondary", "data-command": "createLink", "title": "Insert Link"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-link"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"type": "button", "class": "btn btn-secondary", "data-command": "unlink", "title": "Remove Link"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-link-45deg"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push("</div>");
_output.push("</div>");
_output.push({tag: ["div", {"contenteditable": "true", "class": "p-3", "style": "min-height: 200px; max-height: 400px; overflow-y: auto;", "id": "editor" + ":" + this._cid, "data-id": "editor"}, false]});
(() => { const result = this.args.value || '' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</div>");
_output.push(" "); _output.push("</div>");
if (this.args.help) {
_output.push(" ");_output.push({tag: ["div", {"class": "form-text"}, false]}); (() => { const result = this.args.help ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</div>");
_output.push(" "); }
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Rich_Text_Editor);
})();
/* === storage/rsx-tmp/jqhtml_15b2ff9a7d6c41ca.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/row_action_menu.jqhtml */ (function() {
'use strict';
const template_Row_Action_Menu = {
_jqhtml_version: '2.2.185',
name: 'Row_Action_Menu',
tag: 'div',
defaultAttributes: {"class": "dropdown"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-sm btn-link text-muted dropdown-toggle", "type": "button", "data-bs-toggle": "dropdown", "aria-expanded": "false"}, false]});
_output.push(" "); _output.push(" ⋮ "); _output.push("</button>");
_output.push(" ");_output.push({tag: ["ul", {"class": "dropdown-menu dropdown-menu-end", "id": "menu" + ":" + this._cid, "data-id": "menu"}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</ul>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Row_Action_Menu);
})();
/* === storage/rsx-tmp/jqhtml_f1b2503da86c7b29.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/Sample_Datagrid_Component.jqhtml */ (function() {
'use strict';
const template_Sample_Datagrid_Component = {
_jqhtml_version: '2.2.185',
name: 'Sample_Datagrid_Component',
tag: 'div',
defaultAttributes: {"class": "card"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");
_output.push({tag: ["div", {"class": "card-header bg-light"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex justify-content-between align-items-center"}, false]});
_output.push(" ");_output.push({tag: ["h5", {"class": "mb-0"}, false]}); (() => { const result = this.args.title || 'Data Table' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</h5>");
_output.push(" ");_output.push({tag: ["small", {"class": "text-muted"}, false]});
_output.push(" "); _output.push(" Showing "); (() => { const result = this.args.showing || 10 ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push(" of "); (() => { const result = this.args.total || 100 ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push(" "); (() => { const result = this.args.entity_name || 'items' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); _output.push("</small>");
_output.push("</div>");
_output.push("</div>");
_output.push({tag: ["div", {"class": "card-body p-0"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "table-responsive"}, false]});
_output.push(" ");_output.push({tag: ["table", {"class": "table table-hover mb-0"}, false]});
_output.push(" ");
_output.push({tag: ["thead", {}, false]});
_output.push(" ");_output.push({tag: ["tr", {}, false]});
_output.push(" "); if (this.args.selectable) {
_output.push(" ");_output.push({tag: ["th", {"style": "width: 40px;"}, false]});
_output.push(" ");_output.push({tag: ["input", {"type": "checkbox", "class": "form-check-input", "id": "select_all" + ":" + this._cid, "data-id": "select_all"}, true]}); _output.push("</input>");
_output.push(" "); _output.push("</th>");
}
_output.push(" ");
if (this.args.columns && this.args.columns.length > 0) {
_output.push(" "); for (let column of this.args.columns) {
_output.push(" ");_output.push({tag: ["th", {"style": ((column.width ? 'width: '+column.width : ''))}, false]});
_output.push(" "); (() => { const result = column.label ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); _output.push("</th>");
}
_output.push(" "); } else {
_output.push(" ");
_output.push({tag: ["th", {}, false]}); _output.push("ID"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {}, false]}); _output.push("Name"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {}, false]}); _output.push("Company"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {}, false]}); _output.push("Email"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {}, false]}); _output.push("Phone"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {}, false]}); _output.push("Status"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {}, false]}); _output.push("Created"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {"style": "width: 100px;"}, false]}); _output.push("Actions"); _output.push("</th>");
_output.push(" "); }
_output.push(" "); _output.push("</tr>");
_output.push("</thead>");
_output.push({tag: ["tbody", {}, false]});
_output.push(" ");
if (Object.keys(this.data).length === 0) {
_output.push(" ");
for (let i = 0; i < (this.args.placeholder_rows || 10); i++) {
_output.push(" ");_output.push({tag: ["tr", {}, false]});
_output.push(" "); if (this.args.selectable) {
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["input", {"type": "checkbox", "class": "form-check-input", "disabled": "true"}, true]}); _output.push("</input>"); _output.push("</td>");
_output.push(" "); }
_output.push(" "); for (let j = 0; j < (this.args.columns ? this.args.columns.length : 8); j++) {
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "placeholder-glow"}, false]});
_output.push(" ");_output.push({tag: ["span", {"class": "placeholder col-" + (Math.floor(Math.random() * 8) + 4)}, false]}); _output.push("</span>");
_output.push(" "); _output.push("</div>");
_output.push("</td>");
}
_output.push(" "); _output.push("</tr>");
}
_output.push(" "); } else if (this.data.rows && this.data.rows.length > 0) {
_output.push(" ");
for (let row of this.data.rows) {
_output.push(" ");_output.push({tag: ["tr", {}, false]});
_output.push(" "); if (this.args.selectable) {
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["input", {"type": "checkbox", "class": "form-check-input", "id": row.id + ":" + this._cid, "data-id": row.id}, true]}); _output.push("</input>"); _output.push("</td>");
_output.push(" "); }
_output.push(" ");
if (this.args.columns) {
_output.push(" "); for (let column of this.args.columns) {
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" "); if (column.type === 'badge') {
_output.push(" ");
_output.push({tag: ["span", {"class": "badge bg-" + (row[column.field + '_color'] || 'secondary')}, false]});
_output.push(" "); (() => { const result = row[column.field] ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); _output.push("</span>");
} else if (column.type === 'actions') {
_output.push(" ");
_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" "); if (this.args.view_url) {
_output.push(" ");_output.push({tag: ["a", {"href": (this.args.view_url.replace('{id}', row.id)), "class": "btn btn-primary", "title": "View"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</a>");
}
_output.push(" "); if (this.args.edit_url) {
_output.push(" ");_output.push({tag: ["a", {"href": (this.args.edit_url.replace('{id}', row.id)), "class": "btn btn-secondary", "title": "Edit"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</a>");
}
_output.push(" "); if (this.args.allow_delete) {
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-danger", "id": "delete_button" + ":" + this._cid, "data-id": "delete_button", "title": "Delete"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-trash"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
}
_output.push(" "); _output.push("</div>");
} else {
_output.push(" ");
(() => { const result = row[column.field] ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); }
_output.push(" "); _output.push("</td>");
}
_output.push(" "); } else {
_output.push(" ");
_output.push({tag: ["td", {}, false]}); (() => { const result = row.id ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); (() => { const result = row.name ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); (() => { const result = row.company ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); (() => { const result = row.email ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); (() => { const result = row.phone ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["span", {"class": "badge bg-" + (row.status_color || 'success')}, false]});
_output.push(" "); (() => { const result = row.status ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); _output.push("</span>");
_output.push("</td>");
_output.push({tag: ["td", {}, false]}); (() => { const result = row.created ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-primary", "title": "View"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-secondary", "title": "Edit"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-danger", "title": "Delete"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-trash"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push("</div>");
_output.push("</td>");
}
_output.push(" "); _output.push("</tr>");
}
_output.push(" "); } else {
_output.push(" ");
_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {"colspan": ((this.args.selectable ? 1 : 0) + (this.args.columns ? this.args.columns.length : 8)), "class": "text-center text-muted py-5"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-inbox fs-1 d-block mb-2"}, false]}); _output.push("</i>");
_output.push(" "); _output.push(" No "); (() => { const result = this.args.entity_name || 'items' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push(" found "); _output.push("</td>");
_output.push(" "); _output.push("</tr>");
}
_output.push(" "); _output.push("</tbody>");
_output.push("</table>");
_output.push("</div>");
_output.push("</div>");
if (this.args.pagination !== false && Object.keys(this.data).length > 0) {
_output.push(" ");_output.push({tag: ["div", {"class": "card-footer bg-light"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex justify-content-between align-items-center"}, false]});
_output.push(" ");_output.push({tag: ["div", {}, false]});
_output.push(" ");_output.push({tag: ["small", {"class": "text-muted"}, false]});
_output.push(" "); _output.push(" Showing "); (() => { const result = this.data.pagination?.from || 1 ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push(" to "); (() => { const result = this.data.pagination?.to || 10 ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); _output.push(" of "); (() => { const result = this.data.pagination?.total || 100 ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push(" entries "); _output.push("</small>");
_output.push(" "); _output.push("</div>");
_output.push({tag: ["nav", {}, false]});
_output.push(" ");_output.push({tag: ["ul", {"class": "pagination pagination-sm mb-0"}, false]});
_output.push(" ");
_output.push({tag: ["li", {"class": "page-item" + (this.data.pagination?.current_page === 1 ? 'disabled' : '')}, false]});
_output.push(" ");_output.push({tag: ["a", {"class": "page-link", "href": "#", "tabindex": "-1", "id": "prev_page" + ":" + this._cid, "data-id": "prev_page"}, false]}); _output.push("Previous"); _output.push("</a>");
_output.push(" "); _output.push("</li>");
if (this.data.pagination?.pages) {
_output.push(" "); for (let page of this.data.pagination.pages) {
_output.push(" "); if (page === '...') {
_output.push(" ");_output.push({tag: ["li", {"class": "page-item disabled"}, false]});_output.push({tag: ["a", {"class": "page-link", "href": "#"}, false]}); _output.push("..."); _output.push("</a>"); _output.push("</li>");
_output.push(" "); } else {
_output.push(" ");_output.push({tag: ["li", {"class": "page-item" + (page === this.data.pagination.current_page ? 'active' : '')}, false]});
_output.push(" ");_output.push({tag: ["a", {"class": "page-link", "href": "#", "data-page": (page)}, false]}); (() => { const result = page ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</a>");
_output.push(" "); _output.push("</li>");
}
_output.push(" "); }
_output.push(" "); } else {
_output.push(" ");
for (let i = 1; i <= 5; i++) {
_output.push(" ");_output.push({tag: ["li", {"class": "page-item" + (i === 1 ? 'active' : '')}, false]});
_output.push(" ");_output.push({tag: ["a", {"class": "page-link", "href": "#", "data-page": (i)}, false]}); (() => { const result = i ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</a>");
_output.push(" "); _output.push("</li>");
}
_output.push(" "); }
_output.push(" ");
_output.push({tag: ["li", {"class": "page-item" + (this.data.pagination?.current_page === this.data.pagination?.total_pages ? 'disabled' : '')}, false]});
_output.push(" ");_output.push({tag: ["a", {"class": "page-link", "href": "#", "id": "next_page" + ":" + this._cid, "data-id": "next_page"}, false]}); _output.push("Next"); _output.push("</a>");
_output.push(" "); _output.push("</li>");
_output.push("</ul>");
_output.push("</nav>");
_output.push("</div>");
_output.push("</div>");
}
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Sample_Datagrid_Component);
})();
/* === storage/rsx-tmp/jqhtml_9a27aa4290bb1e22.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/search_bar.jqhtml */ (function() {
'use strict';
const template_Search_Bar = {
_jqhtml_version: '2.2.185',
name: 'Search_Bar',
tag: 'div',
defaultAttributes: {"class": "input-group"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["span", {"class": "input-group-text"}, false]});
_output.push(" "); _output.push({comp: ["Icon", {"data-name": "search"}]});
_output.push(" "); _output.push("</span>");
_output.push({tag: ["input", {"type": "search", "class": "form-control", "placeholder": (this.args.placeholder || 'Search...'), "id": "input" + ":" + this._cid, "data-id": "input"}, true]}); _output.push("</input>");
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Search_Bar);
})();
/* === storage/rsx-tmp/jqhtml_82fa1779b5d52f06.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/search_button.jqhtml */ (function() {
'use strict';
const template_Search_Button = {
_jqhtml_version: '2.2.185',
name: 'Search_Button',
tag: 'button',
defaultAttributes: {"type": "button", "class": "btn btn-secondary"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-search"}, false]}); _output.push("</i>");
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Search_Button);
})();
/* === storage/rsx-tmp/jqhtml_90ce087c10b29f3c.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/search_input.jqhtml */ (function() {
'use strict';
const template_Search_Input = {
_jqhtml_version: '2.2.185',
name: 'Search_Input',
tag: 'input',
defaultAttributes: {"type": "search", "class": "form-control", "placeholder": "Search contacts...", "style": "width: 250px;"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Search_Input);
})();
/* === storage/rsx-tmp/jqhtml_87133ebd4afe5e36.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/searchable_select.jqhtml */ (function() {
'use strict';
const template_Searchable_Select = {
_jqhtml_version: '2.2.185',
name: 'Searchable_Select',
tag: 'div',
defaultAttributes: {"class": "dropdown"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); if (this.args.label) {
_output.push(" ");_output.push({tag: ["label", {"class": "form-label"}, false]}); (() => { const result = this.args.label ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</label>");
_output.push(" "); }
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-secondary dropdown-toggle w-100 text-start", "type": "button", "data-bs-toggle": "dropdown", "aria-expanded": "false", "id": "button" + ":" + this._cid, "data-id": "button"}, false]});
_output.push(" ");_output.push({tag: ["span", {"id": "selected_text" + ":" + this._cid, "data-id": "selected_text"}, false]}); (() => { const result = this.args.placeholder || 'Select an option' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</span>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["div", {"class": "dropdown-menu w-100", "id": "menu" + ":" + this._cid, "data-id": "menu"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "px-3 py-2"}, false]});
_output.push(" ");_output.push({tag: ["input", {"type": "search", "class": "form-control form-control-sm", "placeholder": "Search...", "id": "search" + ":" + this._cid, "data-id": "search"}, true]}); _output.push("</input>");
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"class": "dropdown-divider"}, false]}); _output.push("</div>");
_output.push(" ");_output.push({tag: ["div", {"id": "options" + ":" + this._cid, "data-id": "options", "style": "max-height: 250px; overflow-y: auto;"}, false]});
_output.push(" "); _output.push("<!-- Options populated via JavaScript -->");
_output.push(" "); _output.push("</div>");
_output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Searchable_Select);
})();
/* === storage/rsx-tmp/jqhtml_aacf254b7210322b.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/select_dropdown.jqhtml */ (function() {
'use strict';
const template_Select_Dropdown = {
_jqhtml_version: '2.2.185',
name: 'Select_Dropdown',
tag: 'select',
defaultAttributes: {"class": "form-select"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Select_Dropdown);
})();
/* === storage/rsx-tmp/jqhtml_146e3e3c9db514f9.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/sidebar_nav.jqhtml */ (function() {
'use strict';
const template_Sidebar_Nav = {
_jqhtml_version: '2.2.185',
name: 'Sidebar_Nav',
tag: 'nav',
defaultAttributes: {"class": "d-flex flex-column p-3 bg-light", "style": "width: 250px; min-height: 100vh;"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["a", {"href": "/", "class": "d-flex align-items-center mb-3 text-decoration-none"}, false]});
_output.push(" ");_output.push({tag: ["span", {"class": "fs-4 fw-bold"}, false]}); _output.push("PSM"); _output.push("</span>");
_output.push(" "); _output.push("</a>");
_output.push({tag: ["hr", {}, true]}); _output.push("</hr>");
_output.push(" ");_output.push({tag: ["ul", {"class": "nav nav-pills flex-column mb-auto", "id": "nav_items" + ":" + this._cid, "data-id": "nav_items"}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</ul>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Sidebar_Nav);
})();
/* === storage/rsx-tmp/jqhtml_dc81d680341fe1d9.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/simple_table_test.jqhtml */ (function() {
'use strict';
const template_Simple_Table_Test = {
_jqhtml_version: '2.2.185',
name: 'Simple_Table_Test',
tag: 'div',
defaultAttributes: {},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["table", {"class": "table"}, false]});
_output.push(" ");_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Test"); _output.push("</td>");
_output.push(" "); _output.push("</tr>");
_output.push("</table>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Simple_Table_Test);
})();
/* === storage/rsx-tmp/jqhtml_875974d23c25e5e2.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/sortable_column_header.jqhtml */ (function() {
'use strict';
const template_Sortable_Column_Header = {
_jqhtml_version: '2.2.185',
name: 'Sortable_Column_Header',
tag: 'th',
defaultAttributes: {"class": "user-select-none", "style": "cursor: pointer;"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex align-items-center justify-content-between"}, false]});
_output.push(" ");_output.push({tag: ["span", {}, false]}); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })(); _output.push("</span>");
_output.push(" ");_output.push({tag: ["span", {"class": "ms-2", "id": "sort_icon" + ":" + this._cid, "data-id": "sort_icon"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "text-muted"}, false]}); _output.push("⇅"); _output.push("</i>");
_output.push(" "); _output.push("</span>");
_output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Sortable_Column_Header);
})();
/* === storage/rsx-tmp/jqhtml_5724e547fb5ecdca.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/spinner.jqhtml */ (function() {
'use strict';
const template_Spinner = {
_jqhtml_version: '2.2.185',
name: 'Spinner',
tag: 'div',
defaultAttributes: {"class": "spinner-border", "role": "status"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["span", {"class": "visually-hidden"}, false]}); _output.push("Loading..."); _output.push("</span>");
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Spinner);
})();
/* === storage/rsx-tmp/jqhtml_d7e6ffd2a74afdea.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/stat_card.jqhtml */ (function() {
'use strict';
const template_Stat_Card = {
_jqhtml_version: '2.2.185',
name: 'Stat_Card',
tag: 'div',
defaultAttributes: {"class": "card text-center border-0 shadow-sm"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "card-body"}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Stat_Card);
})();
/* === storage/rsx-tmp/jqhtml_5c147c4272fcbdfc.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/status_badge.jqhtml */ (function() {
'use strict';
const template_Status_Badge = {
_jqhtml_version: '2.2.185',
name: 'Status_Badge',
tag: 'span',
defaultAttributes: {"class": "badge"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Status_Badge);
})();
/* === storage/rsx-tmp/jqhtml_8d3bc06fac256488.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/tab_content.jqhtml */ (function() {
'use strict';
const template_Tab_Content = {
_jqhtml_version: '2.2.185',
name: 'Tab_Content',
tag: 'div',
defaultAttributes: {"class": "tab-content mt-3"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Tab_Content);
})();
/* === storage/rsx-tmp/jqhtml_f657f12a0aa25bb7.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/table_body.jqhtml */ (function() {
'use strict';
const template_Table_Body = {
_jqhtml_version: '2.2.185',
name: 'Table_Body',
tag: 'tbody',
defaultAttributes: {},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Table_Body);
})();
/* === storage/rsx-tmp/jqhtml_f586647b2517ead3.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/table_headers.jqhtml */ (function() {
'use strict';
const template_Table_Headers = {
_jqhtml_version: '2.2.185',
name: 'Table_Headers',
tag: 'thead',
defaultAttributes: {},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["tr", {}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</tr>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Table_Headers);
})();
/* === storage/rsx-tmp/jqhtml_18d1bbdb5a50465a.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/table_pagination.jqhtml */ (function() {
'use strict';
const template_Table_Pagination = {
_jqhtml_version: '2.2.185',
name: 'Table_Pagination',
tag: 'div',
defaultAttributes: {"class": "d-flex justify-content-between align-items-center mt-3"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "text-muted small", "id": "info" + ":" + this._cid, "data-id": "info"}, false]});
_output.push(" "); _output.push(" Showing "); (() => { const result = this.args.start || 1 ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push(" to "); (() => { const result = this.args.end || 10 ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push(" of "); (() => { const result = this.args.total || 0 ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push(" entries "); _output.push("</div>");
_output.push(" ");_output.push({tag: ["nav", {"aria-label": "Table pagination"}, false]});
_output.push(" ");_output.push({tag: ["ul", {"class": "pagination mb-0", "id": "pagination" + ":" + this._cid, "data-id": "pagination"}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</ul>");
_output.push("</nav>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Table_Pagination);
})();
/* === storage/rsx-tmp/jqhtml_383242ee22658bf0.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/table.jqhtml */ (function() {
'use strict';
const template_Table = {
_jqhtml_version: '2.2.185',
name: 'Table',
tag: 'table',
defaultAttributes: {"class": "table table-hover"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Table);
})();
/* === storage/rsx-tmp/jqhtml_ed2ddbf29c859aa9.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/tabs.jqhtml */ (function() {
'use strict';
const template_Tabs = {
_jqhtml_version: '2.2.185',
name: 'Tabs',
tag: 'ul',
defaultAttributes: {"class": "nav nav-tabs"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Tabs);
})();
/* === storage/rsx-tmp/jqhtml_4150fd75011321be.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/tag_group.jqhtml */ (function() {
'use strict';
const template_Tag_Group = {
_jqhtml_version: '2.2.185',
name: 'Tag_Group',
tag: 'div',
defaultAttributes: {"class": "d-flex flex-wrap gap-1"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Tag_Group);
})();
/* === storage/rsx-tmp/jqhtml_a5dbed84a331830f.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/tag.jqhtml */ (function() {
'use strict';
const template_Tag = {
_jqhtml_version: '2.2.185',
name: 'Tag',
tag: 'span',
defaultAttributes: {"class": "badge rounded-pill bg-secondary me-1"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Tag);
})();
/* === storage/rsx-tmp/jqhtml_58a09a623e844c61.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/text_display.jqhtml */ (function() {
'use strict';
const template_Text_Display = {
_jqhtml_version: '2.2.185',
name: 'Text_Display',
tag: 'span',
defaultAttributes: {},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Text_Display);
})();
/* === storage/rsx-tmp/jqhtml_4ca4caa4aa2ac28a.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/textarea.jqhtml */ (function() {
'use strict';
const template_Textarea = {
_jqhtml_version: '2.2.185',
name: 'Textarea',
tag: 'textarea',
defaultAttributes: {"class": "form-control", "rows": "4"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Textarea);
})();
/* === storage/rsx-tmp/jqhtml_cfb5cfb28a80dd74.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/three_column_layout.jqhtml */ (function() {
'use strict';
const template_Three_Column_Layout = {
_jqhtml_version: '2.2.185',
name: 'Three_Column_Layout',
tag: 'div',
defaultAttributes: {"class": "row"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Three_Column_Layout);
})();
/* === storage/rsx-tmp/jqhtml_aa4c1ba17a301e31.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/time_picker.jqhtml */ (function() {
'use strict';
const template_Time_Picker = {
_jqhtml_version: '2.2.185',
name: 'Time_Picker',
tag: 'div',
defaultAttributes: {"class": "mb-3"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); if (this.args.label) {
_output.push(" ");_output.push({tag: ["label", {"class": "form-label"}, false]}); (() => { const result = this.args.label ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</label>");
_output.push(" "); }
_output.push(" ");_output.push({tag: ["div", {"class": "input-group"}, false]});
_output.push(" ");_output.push({tag: ["span", {"class": "input-group-text"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-clock"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</span>");
_output.push({tag: ["input", {"type": "time", "class": "form-control", "placeholder": (this.args.placeholder || ''), "id": "input" + ":" + this._cid, "data-id": "input"}, true]}); _output.push("</input>");
_output.push(" "); _output.push("</div>");
if (this.args.help) {
_output.push(" ");_output.push({tag: ["div", {"class": "form-text"}, false]}); (() => { const result = this.args.help ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</div>");
_output.push(" "); }
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Time_Picker);
})();
/* === storage/rsx-tmp/jqhtml_2031023f9f1c01f1.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/timeline.jqhtml */ (function() {
'use strict';
const template_Timeline = {
_jqhtml_version: '2.2.185',
name: 'Timeline',
tag: 'div',
defaultAttributes: {"class": "d-flex flex-column gap-3"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Timeline);
})();
/* === storage/rsx-tmp/jqhtml_12433da901e62b43.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/timestamp_display.jqhtml */ (function() {
'use strict';
const template_Timestamp_Display = {
_jqhtml_version: '2.2.185',
name: 'Timestamp_Display',
tag: 'small',
defaultAttributes: {"class": "text-muted d-block"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Timestamp_Display);
})();
/* === storage/rsx-tmp/jqhtml_98934efba78289b0.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/tooltip.jqhtml */ (function() {
'use strict';
const template_Tooltip = {
_jqhtml_version: '2.2.185',
name: 'Tooltip',
tag: 'span',
defaultAttributes: {"data-bs-toggle": "tooltip", "data-bs-placement": "top"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Tooltip);
})();
/* === storage/rsx-tmp/jqhtml_517d4f18a4791725.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/top_nav.jqhtml */ (function() {
'use strict';
const template_Top_Nav = {
_jqhtml_version: '2.2.185',
name: 'Top_Nav',
tag: 'nav',
defaultAttributes: {"class": "navbar navbar-expand-lg navbar-light bg-light"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "container-fluid"}, false]});
_output.push(" ");_output.push({tag: ["a", {"class": "navbar-brand", "href": "/"}, false]}); _output.push("PSM"); _output.push("</a>");
_output.push(" ");_output.push({tag: ["button", {"class": "navbar-toggler", "type": "button", "data-bs-toggle": "collapse", "data-bs-target": "#navbarNav", "aria-controls": "navbarNav", "aria-expanded": "false", "aria-label": "Toggle navigation"}, false]});
_output.push(" ");_output.push({tag: ["span", {"class": "navbar-toggler-icon"}, false]}); _output.push("</span>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["div", {"class": "collapse navbar-collapse", "id": "navbarNav"}, false]});
_output.push(" ");_output.push({tag: ["ul", {"class": "navbar-nav ms-auto", "id": "nav_items" + ":" + this._cid, "data-id": "nav_items"}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</ul>");
_output.push("</div>");
_output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Top_Nav);
})();
/* === storage/rsx-tmp/jqhtml_16475a3ae7842075.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/trend_indicator.jqhtml */ (function() {
'use strict';
const template_Trend_Indicator = {
_jqhtml_version: '2.2.185',
name: 'Trend_Indicator',
tag: 'span',
defaultAttributes: {},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Trend_Indicator);
})();
/* === storage/rsx-tmp/jqhtml_0e49800ae2b20a04.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/two_column_layout.jqhtml */ (function() {
'use strict';
const template_Two_Column_Layout = {
_jqhtml_version: '2.2.185',
name: 'Two_Column_Layout',
tag: 'div',
defaultAttributes: {"class": "row"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Two_Column_Layout);
})();
/* === storage/rsx-tmp/jqhtml_09b2f3fdf425ee42.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/user_avatar_dropdown.jqhtml */ (function() {
'use strict';
const template_User_Avatar_Dropdown = {
_jqhtml_version: '2.2.185',
name: 'User_Avatar_Dropdown',
tag: 'div',
defaultAttributes: {"class": "dropdown"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-link dropdown-toggle p-0 border-0", "type": "button", "data-bs-toggle": "dropdown", "aria-expanded": "false", "id": "toggle" + ":" + this._cid, "data-id": "toggle"}, false]});
_output.push(" "); _output.push({comp: ["Avatar", {"data-src": this.args.avatar_src, "data-name": this.args.user_name, "data-size": "sm"}]});
_output.push(" "); _output.push("</button>");
_output.push({tag: ["ul", {"class": "dropdown-menu dropdown-menu-end", "id": "menu" + ":" + this._cid, "data-id": "menu"}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</ul>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_User_Avatar_Dropdown);
})();
/* === storage/rsx-tmp/jqhtml_b75b5b5352e01ff2.js === */
/* Compiled from: rsx/theme/components/_archived/unfinished/users_data_table.jqhtml */ (function() {
'use strict';
const template_Users_Data_Table = {
_jqhtml_version: '2.2.185',
name: 'Users_Data_Table',
tag: 'div',
defaultAttributes: {"class": "card-body p-0"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "table-responsive"}, false]});
_output.push(" ");_output.push({tag: ["table", {"class": "table table-hover mb-0"}, false]});
_output.push(" ");_output.push({tag: ["thead", {}, false]});
_output.push(" ");_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["th", {"style": "width: 40px;"}, false]});
_output.push(" ");_output.push({tag: ["input", {"type": "checkbox", "class": "form-check-input", "id": "select-all"}, true]}); _output.push("</input>");
_output.push(" "); _output.push("</th>");
_output.push({tag: ["th", {}, false]}); _output.push("ID"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {}, false]}); _output.push("Name"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {}, false]}); _output.push("Email"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {}, false]}); _output.push("Role"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {}, false]}); _output.push("Department"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {}, false]}); _output.push("Status"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {}, false]}); _output.push("Last Login"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {}, false]}); _output.push("Joined"); _output.push("</th>");
_output.push(" ");_output.push({tag: ["th", {"style": "width: 100px;"}, false]}); _output.push("Actions"); _output.push("</th>");
_output.push(" "); _output.push("</tr>");
_output.push("</thead>");
_output.push({tag: ["tbody", {}, false]});
_output.push(" ");_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["input", {"type": "checkbox", "class": "form-check-input user-select"}, true]}); _output.push("</input>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("#U001"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex align-items-center"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "avatar-sm me-2"}, false]});
_output.push(" ");_output.push({tag: ["span", {"class": "avatar-initials"}, false]}); _output.push("JD"); _output.push("</span>");
_output.push(" "); _output.push("</div>");
_output.push(" John Doe "); _output.push("</div>");
_output.push(" "); _output.push("</td>");
_output.push({tag: ["td", {}, false]}); _output.push("john.doe@example.com"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-danger"}, false]}); _output.push("Admin"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Engineering"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-success"}, false]}); _output.push("Active"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("2 hours ago"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Jan 15, 2023"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-primary", "title": "View Profile"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-secondary", "title": "Edit"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-danger", "title": "Suspend"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-ban"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push("</div>");
_output.push("</td>");
_output.push("</tr>");
_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["input", {"type": "checkbox", "class": "form-check-input user-select"}, true]}); _output.push("</input>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("#U002"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex align-items-center"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "avatar-sm me-2"}, false]});
_output.push(" ");_output.push({tag: ["span", {"class": "avatar-initials"}, false]}); _output.push("JS"); _output.push("</span>");
_output.push(" "); _output.push("</div>");
_output.push(" Jane Smith "); _output.push("</div>");
_output.push(" "); _output.push("</td>");
_output.push({tag: ["td", {}, false]}); _output.push("jane.smith@example.com"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-primary"}, false]}); _output.push("Manager"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Marketing"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-success"}, false]}); _output.push("Active"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("1 day ago"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Feb 20, 2023"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-primary", "title": "View Profile"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-secondary", "title": "Edit"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-danger", "title": "Suspend"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-ban"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push("</div>");
_output.push("</td>");
_output.push("</tr>");
_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["input", {"type": "checkbox", "class": "form-check-input user-select"}, true]}); _output.push("</input>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("#U003"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex align-items-center"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "avatar-sm me-2"}, false]});
_output.push(" ");_output.push({tag: ["span", {"class": "avatar-initials"}, false]}); _output.push("MB"); _output.push("</span>");
_output.push(" "); _output.push("</div>");
_output.push(" Mike Brown "); _output.push("</div>");
_output.push(" "); _output.push("</td>");
_output.push({tag: ["td", {}, false]}); _output.push("mike.brown@example.com"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-secondary"}, false]}); _output.push("User"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Sales"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-warning"}, false]}); _output.push("Inactive"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("5 days ago"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Mar 10, 2023"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-primary", "title": "View Profile"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-secondary", "title": "Edit"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-success", "title": "Activate"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-check-circle"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push("</div>");
_output.push("</td>");
_output.push("</tr>");
_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["input", {"type": "checkbox", "class": "form-check-input user-select"}, true]}); _output.push("</input>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("#U004"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex align-items-center"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "avatar-sm me-2"}, false]});
_output.push(" ");_output.push({tag: ["span", {"class": "avatar-initials"}, false]}); _output.push("SW"); _output.push("</span>");
_output.push(" "); _output.push("</div>");
_output.push(" Sarah Wilson "); _output.push("</div>");
_output.push(" "); _output.push("</td>");
_output.push({tag: ["td", {}, false]}); _output.push("sarah.wilson@example.com"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-primary"}, false]}); _output.push("Manager"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("HR"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-success"}, false]}); _output.push("Active"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("3 hours ago"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Apr 05, 2023"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-primary", "title": "View Profile"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-secondary", "title": "Edit"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-danger", "title": "Suspend"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-ban"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push("</div>");
_output.push("</td>");
_output.push("</tr>");
_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["input", {"type": "checkbox", "class": "form-check-input user-select"}, true]}); _output.push("</input>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("#U005"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex align-items-center"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "avatar-sm me-2"}, false]});
_output.push(" ");_output.push({tag: ["span", {"class": "avatar-initials"}, false]}); _output.push("TJ"); _output.push("</span>");
_output.push(" "); _output.push("</div>");
_output.push(" Tom Johnson "); _output.push("</div>");
_output.push(" "); _output.push("</td>");
_output.push({tag: ["td", {}, false]}); _output.push("tom.j@example.com"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-secondary"}, false]}); _output.push("User"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Support"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-danger"}, false]}); _output.push("Suspended"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("2 weeks ago"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("May 12, 2023"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-primary", "title": "View Profile"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-secondary", "title": "Edit"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-success", "title": "Reactivate"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-arrow-clockwise"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push("</div>");
_output.push("</td>");
_output.push("</tr>");
_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["input", {"type": "checkbox", "class": "form-check-input user-select"}, true]}); _output.push("</input>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("#U006"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex align-items-center"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "avatar-sm me-2"}, false]});
_output.push(" ");_output.push({tag: ["span", {"class": "avatar-initials"}, false]}); _output.push("ED"); _output.push("</span>");
_output.push(" "); _output.push("</div>");
_output.push(" Emily Davis "); _output.push("</div>");
_output.push(" "); _output.push("</td>");
_output.push({tag: ["td", {}, false]}); _output.push("emily.d@example.com"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-danger"}, false]}); _output.push("Admin"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("IT"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-success"}, false]}); _output.push("Active"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Just now"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Jun 01, 2023"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-primary", "title": "View Profile"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-secondary", "title": "Edit"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-danger", "title": "Suspend"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-ban"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push("</div>");
_output.push("</td>");
_output.push("</tr>");
_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["input", {"type": "checkbox", "class": "form-check-input user-select"}, true]}); _output.push("</input>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("#U007"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex align-items-center"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "avatar-sm me-2"}, false]});
_output.push(" ");_output.push({tag: ["span", {"class": "avatar-initials"}, false]}); _output.push("CG"); _output.push("</span>");
_output.push(" "); _output.push("</div>");
_output.push(" Chris Garcia "); _output.push("</div>");
_output.push(" "); _output.push("</td>");
_output.push({tag: ["td", {}, false]}); _output.push("chris.g@example.com"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-secondary"}, false]}); _output.push("User"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Finance"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-success"}, false]}); _output.push("Active"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("6 hours ago"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Jul 15, 2023"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-primary", "title": "View Profile"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-secondary", "title": "Edit"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-danger", "title": "Suspend"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-ban"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push("</div>");
_output.push("</td>");
_output.push("</tr>");
_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["input", {"type": "checkbox", "class": "form-check-input user-select"}, true]}); _output.push("</input>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("#U008"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex align-items-center"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "avatar-sm me-2"}, false]});
_output.push(" ");_output.push({tag: ["span", {"class": "avatar-initials"}, false]}); _output.push("AM"); _output.push("</span>");
_output.push(" "); _output.push("</div>");
_output.push(" Ashley Martinez "); _output.push("</div>");
_output.push(" "); _output.push("</td>");
_output.push({tag: ["td", {}, false]}); _output.push("ashley.m@example.com"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-primary"}, false]}); _output.push("Manager"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Operations"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-success"}, false]}); _output.push("Active"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("12 hours ago"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Aug 20, 2023"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-primary", "title": "View Profile"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-secondary", "title": "Edit"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-danger", "title": "Suspend"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-ban"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push("</div>");
_output.push("</td>");
_output.push("</tr>");
_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["input", {"type": "checkbox", "class": "form-check-input user-select"}, true]}); _output.push("</input>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("#U009"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex align-items-center"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "avatar-sm me-2"}, false]});
_output.push(" ");_output.push({tag: ["span", {"class": "avatar-initials"}, false]}); _output.push("KL"); _output.push("</span>");
_output.push(" "); _output.push("</div>");
_output.push(" Kevin Lee "); _output.push("</div>");
_output.push(" "); _output.push("</td>");
_output.push({tag: ["td", {}, false]}); _output.push("kevin.lee@example.com"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-secondary"}, false]}); _output.push("User"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Design"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-success"}, false]}); _output.push("Active"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("1 day ago"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Sep 10, 2023"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-primary", "title": "View Profile"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-secondary", "title": "Edit"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-danger", "title": "Suspend"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-ban"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push("</div>");
_output.push("</td>");
_output.push("</tr>");
_output.push({tag: ["tr", {}, false]});
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["input", {"type": "checkbox", "class": "form-check-input user-select"}, true]}); _output.push("</input>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("#U010"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "d-flex align-items-center"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "avatar-sm me-2"}, false]});
_output.push(" ");_output.push({tag: ["span", {"class": "avatar-initials"}, false]}); _output.push("RW"); _output.push("</span>");
_output.push(" "); _output.push("</div>");
_output.push(" Rachel White "); _output.push("</div>");
_output.push(" "); _output.push("</td>");
_output.push({tag: ["td", {}, false]}); _output.push("rachel.w@example.com"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-secondary"}, false]}); _output.push("User"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Legal"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});_output.push({tag: ["span", {"class": "badge bg-warning"}, false]}); _output.push("Inactive"); _output.push("</span>"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("1 week ago"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]}); _output.push("Oct 05, 2023"); _output.push("</td>");
_output.push(" ");_output.push({tag: ["td", {}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "btn-group btn-group-sm"}, false]});
_output.push(" ");_output.push({tag: ["button", {"class": "btn btn-primary", "title": "View Profile"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-eye"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-secondary", "title": "Edit"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-pencil"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push({tag: ["button", {"class": "btn btn-success", "title": "Activate"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-check-circle"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</button>");
_output.push("</div>");
_output.push("</td>");
_output.push("</tr>");
_output.push("</tbody>");
_output.push("</table>");
_output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Users_Data_Table);
})();
/* === storage/rsx-tmp/jqhtml_4e0b9dea1b172d56.js === */
/* Compiled from: rsx/theme/components/modal/rsx_modal.jqhtml */ (function() {
'use strict';
const template_Rsx_Modal = {
_jqhtml_version: '2.2.185',
name: 'Rsx_Modal',
tag: 'div',
defaultAttributes: {},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "modal fade rsx-modal", "tabindex": "-1", "id": "modal" + ":" + this._cid, "data-id": "modal"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "modal-dialog", "id": "dialog" + ":" + this._cid, "data-id": "dialog"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "modal-content"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "modal-header", "id": "header" + ":" + this._cid, "data-id": "header"}, false]});
_output.push(" ");_output.push({tag: ["h5", {"class": "modal-title", "id": "title" + ":" + this._cid, "data-id": "title"}, false]}); _output.push("</h5>");
_output.push(" ");_output.push({tag: ["button", {"type": "button", "class": "btn-close", "id": "close_btn" + ":" + this._cid, "data-id": "close_btn", "data-bs-dismiss": "modal", "aria-label": "Close"}, false]}); _output.push("</button>");
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"class": "modal-body", "id": "body" + ":" + this._cid, "data-id": "body"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "modal-body-content", "id": "body_content" + ":" + this._cid, "data-id": "body_content"}, false]});
_output.push(" "); _output.push("<!-- Dynamic content inserted here -->");
_output.push(" "); _output.push("</div>");
_output.push("</div>");
_output.push({tag: ["div", {"class": "modal-footer", "id": "footer" + ":" + this._cid, "data-id": "footer"}, false]});
_output.push(" "); _output.push("<!-- Dynamic buttons inserted here -->");
_output.push(" "); _output.push("</div>");
_output.push("</div>");
_output.push("</div>");
_output.push("</div>");
_output.push({tag: ["div", {"class": "modal-backdrop fade", "id": "backdrop" + ":" + this._cid, "data-id": "backdrop"}, false]}); _output.push("</div>");
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Rsx_Modal);
})();
/* === storage/rsx-tmp/jqhtml_7217e9c37c215bd8.js === */
/* Compiled from: rsx/theme/components/page_elements/breadcrumb.jqhtml */ (function() {
'use strict';
const template_Breadcrumb = {
_jqhtml_version: '2.2.185',
name: 'Breadcrumb',
tag: 'nav',
defaultAttributes: {"aria-label": "breadcrumb"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["ol", {"class": "breadcrumb bg-transparent p-0 mb-0"}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</ol>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Breadcrumb);
})();
/* === storage/rsx-tmp/jqhtml_0437ab9d2970dd17.js === */
/* Compiled from: rsx/theme/components/page_elements/breadcrumb_item.jqhtml */ (function() {
'use strict';
const template_Breadcrumb_Item = {
_jqhtml_version: '2.2.185',
name: 'Breadcrumb_Item',
tag: 'li',
defaultAttributes: {"class": "breadcrumb-item"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); if (this.args.active) {
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); } else if (this.args.href) {
_output.push(" ");_output.push({tag: ["a", {"href": (this.args.href)}, false]}); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })(); _output.push("</a>");
_output.push(" "); } else {
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); }
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Breadcrumb_Item);
})();
/* === storage/rsx-tmp/jqhtml_796750a84323e25c.js === */
/* Compiled from: rsx/theme/components/page_elements/client_label.jqhtml */ (function() {
'use strict';
const template_Client_Label = {
_jqhtml_version: '2.2.185',
name: 'Client_Label',
tag: 'span',
defaultAttributes: {"class": "Widget"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");
_output.push({tag: ["i", {"class": "bi bi-building"}, false]}); _output.push("</i>");
_output.push(" "); if (this.data.loading) {
_output.push(" "); (() => { const result = this.args.placeholder || '------' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); } else if (this.data.client) {
_output.push(" "); (() => { const result = this.data.client.name ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push(" cadfdsa ");
} else {
_output.push(" ");_output.push({tag: ["span", {"class": "text-muted"}, false]}); _output.push("Unknown Client"); _output.push("</span>");
_output.push(" "); }
_output.push(" ");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Client_Label);
})();
/* === storage/rsx-tmp/jqhtml_84a4678f9228ae19.js === */
/* Compiled from: rsx/theme/components/page_elements/client_label_link.jqhtml */ (function() {
'use strict';
const template_Client_Label_Link = {
_jqhtml_version: '2.2.185',
name: 'Client_Label_Link',
tag: 'a',
defaultAttributes: {"class": "Widget"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");
_output.push({tag: ["i", {"class": "bi bi-building"}, false]}); _output.push("</i>");
_output.push(" "); if (this.data.loading) {
_output.push(" "); (() => { const result = this.args.placeholder || '------' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); } else if (this.data.client) {
_output.push(" "); (() => { const result = this.data.client.name ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); } else {
_output.push(" ");_output.push({tag: ["span", {"class": "text-muted"}, false]}); _output.push("Unknown Client"); _output.push("</span>");
_output.push(" "); }
_output.push(" ");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Client_Label_Link);
})();
/* === storage/rsx-tmp/jqhtml_1f6b5c0a2361546e.js === */
/* Compiled from: rsx/theme/components/inputs/text_input.jqhtml */ (function() {
'use strict';
const template_Text_Input = {
_jqhtml_version: '2.2.185',
name: 'Text_Input',
tag: 'div',
defaultAttributes: {"class": "Widget"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); if (this.args.type === 'textarea') {
_output.push(" ");_output.push({rawtag: ["textarea", Object.assign({}, {"id": "input" + ":" + this._cid, "data-id": "input", "class": "form-control", "rows": (this.args.rows || 3), "placeholder": (this.args.placeholder || '')}, ((this.args.disabled)) ? {"disabled": "true"} : {}), "undefined"]});
_output.push(" "); } else if (this.args.prefix || this.args.suffix) {
_output.push(" ");_output.push({tag: ["div", {"class": "input-group"}, false]});
_output.push(" "); if (this.args.prefix) {
_output.push(" ");_output.push({tag: ["span", {"class": "input-group-text"}, false]}); (() => { const result = this.args.prefix ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</span>");
_output.push(" "); }
_output.push(" ");_output.push({tag: ["input", Object.assign({}, Object.assign({}, Object.assign({}, Object.assign({}, {"id": "input" + ":" + this._cid, "data-id": "input", "type": (this.args.type || 'text'), "class": "form-control", "value": (this.data.value), "placeholder": (this.args.placeholder || '')}, ((this.args.min !== undefined)) ? {"min": (this.args.min)} : {}), ((this.args.max !== undefined)) ? {"max": (this.args.max)} : {}), ((this.args.maxlength)) ? {"maxlength": (this.args.maxlength)} : {}), ((this.args.disabled)) ? {"disabled": "true"} : {}), true]}); _output.push("</input>");
_output.push(" "); if (this.args.suffix) {
_output.push(" ");_output.push({tag: ["span", {"class": "input-group-text"}, false]}); (() => { const result = this.args.suffix ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</span>");
_output.push(" "); }
_output.push(" "); _output.push("</div>");
} else {
_output.push(" ");_output.push({tag: ["input", Object.assign({}, Object.assign({}, Object.assign({}, Object.assign({}, {"id": "input" + ":" + this._cid, "data-id": "input", "type": (this.args.type || 'text'), "class": "form-control", "value": (this.data.value), "placeholder": (this.args.placeholder || '')}, ((this.args.min !== undefined)) ? {"min": (this.args.min)} : {}), ((this.args.max !== undefined)) ? {"max": (this.args.max)} : {}), ((this.args.maxlength)) ? {"maxlength": (this.args.maxlength)} : {}), ((this.args.disabled)) ? {"disabled": "true"} : {}), true]}); _output.push("</input>");
_output.push(" "); }
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Text_Input);
})();
/* === storage/rsx-tmp/jqhtml_59c189b4fa652b8e.js === */
/* Compiled from: rsx/theme/components/inputs/select_input.jqhtml */ (function() {
'use strict';
const template_Select_Input = {
_jqhtml_version: '2.2.185',
name: 'Select_Input',
tag: 'div',
defaultAttributes: {"class": "Widget"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["select", Object.assign({}, {"id": "input" + ":" + this._cid, "data-id": "input"}, ((this.args.disabled)) ? {"disabled": "true"} : {}), false]});
_output.push(" "); if (this.args.placeholder) {
_output.push(" ");_output.push({tag: ["option", {"value": ""}, false]}); (() => { const result = this.args.placeholder ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</option>");
_output.push(" "); }
_output.push(" "); if (this.args.options) {
_output.push(" "); for (let opt of this.args.options) {
_output.push(" "); if (typeof opt === 'object') {
_output.push(" ");_output.push({tag: ["option", Object.assign({}, {"value": (opt.value)}, ((this.data.value == opt.value)) ? {"selected": "true"} : {}), false]}); (() => { const result = opt.label ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</option>");
_output.push(" "); } else {
_output.push(" ");_output.push({tag: ["option", Object.assign({}, {"value": (opt)}, ((this.data.value == opt)) ? {"selected": "true"} : {}), false]}); (() => { const result = opt ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</option>");
_output.push(" "); }
_output.push(" "); }
_output.push(" "); }
_output.push(" "); _output.push("</select>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Select_Input);
})();
/* === storage/rsx-tmp/jqhtml_3a30a5c5dfa4f0b9.js === */
/* Compiled from: rsx/theme/components/inputs/ajax_select_input.jqhtml */ (function() {
'use strict';
const template_Ajax_Select_Input = {
_jqhtml_version: '2.2.185',
name: 'Ajax_Select_Input',
tag: 'div',
defaultAttributes: {"class": "Widget"},
extends: 'Select_Input',
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["select", Object.assign({}, {"id": "input" + ":" + this._cid, "data-id": "input"}, ((this.args.disabled)) ? {"disabled": "true"} : {}), false]});
_output.push(" "); if (!this.data.select_values || this.data.select_values.length === 0) {
_output.push(" ");_output.push({tag: ["option", {"value": ""}, false]}); (() => { const result = this.args.placeholder || 'Please wait...' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</option>");
_output.push(" "); } else {
_output.push(" "); if (this.args.placeholder) {
_output.push(" ");_output.push({tag: ["option", {"value": ""}, false]}); (() => { const result = this.args.placeholder ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</option>");
_output.push(" "); }
_output.push(" "); for (let opt of this.data.select_values) {
_output.push(" "); if (typeof opt === 'object') {
_output.push(" ");_output.push({tag: ["option", Object.assign({}, {"value": (opt.value)}, ((this.data.value == opt.value)) ? {"selected": "true"} : {}), false]}); (() => { const result = opt.label ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</option>");
_output.push(" "); } else {
_output.push(" ");_output.push({tag: ["option", Object.assign({}, {"value": (opt)}, ((this.data.value == opt)) ? {"selected": "true"} : {}), false]}); (() => { const result = opt ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</option>");
_output.push(" "); }
_output.push(" "); }
_output.push(" "); }
_output.push(" "); _output.push("</select>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Ajax_Select_Input);
})();
/* === storage/rsx-tmp/jqhtml_d3f44e3bcb81a874.js === */
/* Compiled from: rsx/theme/components/inputs/checkbox_input.jqhtml */ (function() {
'use strict';
const template_Checkbox_Input = {
_jqhtml_version: '2.2.185',
name: 'Checkbox_Input',
tag: 'div',
defaultAttributes: {"class": "Widget"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "form-check"}, false]});
_output.push(" ");_output.push({tag: ["input", Object.assign({}, Object.assign({}, {"id": "input" + ":" + this._cid, "data-id": "input", "class": "form-check-input", "type": "checkbox"}, ((this.data.checked)) ? {"checked": "true"} : {}), ((this.args.disabled)) ? {"disabled": "true"} : {}), true]}); _output.push("</input>");
_output.push(" "); if (this.args.label) {
_output.push(" ");_output.push({tag: ["label", {"id": "label" + ":" + this._cid, "data-id": "label", "class": "form-check-label"}, false]});
_output.push(" "); (() => { const result = this.args.label ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); _output.push("</label>");
}
_output.push(" "); _output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Checkbox_Input);
})();
/* === storage/rsx-tmp/jqhtml_77d25c093236508a.js === */
/* Compiled from: rsx/theme/components/inputs/wysiwyg_input.jqhtml */ (function() {
'use strict';
const template_Wysiwyg_Input = {
_jqhtml_version: '2.2.185',
name: 'Wysiwyg_Input',
tag: 'div',
defaultAttributes: {"class": "Widget"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"id": "editor" + ":" + this._cid, "data-id": "editor", "style": "min-height: 200px; background: white;"}, false]}); _output.push("</div>");
_output.push(" ");_output.push({tag: ["input", {"type": "hidden", "id": "hidden_input" + ":" + this._cid, "data-id": "hidden_input"}, true]}); _output.push("</input>");
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Wysiwyg_Input);
})();
/* === storage/rsx-tmp/jqhtml_23e1143d0e1cd60c.js === */
/* Compiled from: rsx/theme/components/inputs/country_select_input.jqhtml */ (function() {
'use strict';
const template_Country_Select_Input = {
_jqhtml_version: '2.2.185',
name: 'Country_Select_Input',
tag: 'div',
defaultAttributes: {"class": "Widget"},
extends: 'Ajax_Select_Input',
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["select", Object.assign({}, {"id": "input" + ":" + this._cid, "data-id": "input"}, ((this.args.disabled)) ? {"disabled": "true"} : {}), false]});
_output.push(" "); if (!this.data.select_values || this.data.select_values.length === 0) {
_output.push(" ");_output.push({tag: ["option", {"value": ""}, false]}); (() => { const result = this.args.placeholder || 'Please wait...' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</option>");
_output.push(" "); } else {
_output.push(" "); if (this.args.placeholder) {
_output.push(" ");_output.push({tag: ["option", {"value": ""}, false]}); (() => { const result = this.args.placeholder ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</option>");
_output.push(" "); }
_output.push(" "); for (let opt of this.data.select_values) {
_output.push(" "); if (typeof opt === 'object') {
_output.push(" ");_output.push({tag: ["option", Object.assign({}, {"value": (opt.value)}, ((this.data.value == opt.value)) ? {"selected": "true"} : {}), false]}); (() => { const result = opt.label ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</option>");
_output.push(" "); } else {
_output.push(" ");_output.push({tag: ["option", Object.assign({}, {"value": (opt)}, ((this.data.value == opt)) ? {"selected": "true"} : {}), false]}); (() => { const result = opt ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</option>");
_output.push(" "); }
_output.push(" "); }
_output.push(" "); }
_output.push(" "); _output.push("</select>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Country_Select_Input);
})();
/* === storage/rsx-tmp/jqhtml_717fc745d391ec0b.js === */
/* Compiled from: rsx/theme/components/inputs/state_select_input.jqhtml */ (function() {
'use strict';
const template_State_Select_Input = {
_jqhtml_version: '2.2.185',
name: 'State_Select_Input',
tag: 'div',
defaultAttributes: {"class": "Widget"},
extends: 'Ajax_Select_Input',
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["select", Object.assign({}, {"id": "input" + ":" + this._cid, "data-id": "input"}, ((this.args.disabled || !this.data.country_code)) ? {"disabled": "true"} : {}), false]});
_output.push(" "); if (!this.data.select_values || this.data.select_values.length === 0) {
_output.push(" ");_output.push({tag: ["option", {"value": ""}, false]}); (() => { const result = this.args.placeholder || 'Select State...' ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</option>");
_output.push(" "); } else {
_output.push(" "); if (this.args.placeholder) {
_output.push(" ");_output.push({tag: ["option", {"value": ""}, false]}); (() => { const result = this.args.placeholder ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</option>");
_output.push(" "); }
_output.push(" "); for (let opt of this.data.select_values) {
_output.push(" "); if (typeof opt === 'object') {
_output.push(" ");_output.push({tag: ["option", Object.assign({}, {"value": (opt.value)}, ((this.data.value == opt.value)) ? {"selected": "true"} : {}), false]}); (() => { const result = opt.label ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</option>");
_output.push(" "); } else {
_output.push(" ");_output.push({tag: ["option", Object.assign({}, {"value": (opt)}, ((this.data.value == opt)) ? {"selected": "true"} : {}), false]}); (() => { const result = opt ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("</option>");
_output.push(" "); }
_output.push(" "); }
_output.push(" "); }
_output.push(" "); _output.push("</select>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_State_Select_Input);
})();
/* === storage/rsx-tmp/jqhtml_1bc3e8b1a237bb35.js === */
/* Compiled from: rsx/theme/components/inputs/profile_photo_input.jqhtml */ (function() {
'use strict';
const template_Profile_Photo_Input = {
_jqhtml_version: '2.2.185',
name: 'Profile_Photo_Input',
tag: 'div',
defaultAttributes: {"class": "Widget"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");
_output.push({tag: ["div", {"class": "d-flex align-items-center"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "position-relative"}, false]});
_output.push(" "); if (this.data.thumbnail_url) {
_output.push(" ");_output.push({tag: ["img", {"id": "photo" + ":" + this._cid, "data-id": "photo", "src": (this.data.thumbnail_url), "class": "rounded-circle me-3", "alt": "Profile Photo", "width": (this.args.width || 96), "height": (this.args.height || 96), "style": "opacity: 1;"}, true]}); _output.push("</img>");
_output.push(" "); } else {
_output.push(" ");_output.push({tag: ["div", {"id": "photo" + ":" + this._cid, "data-id": "photo", "class": "user-profile-icon me-3", "style": "width:" + (this.args.width || 96) + "px; height:" + (this.args.height || 96) + "px; display: flex; align-items: center; justify-content: center;"}, false]});
_output.push(" ");_output.push({tag: ["i", {"class": "bi bi-person-circle", "style": "font-size:" + (Math.round((this.args.width || 96) * 0.75)) + "px;"}, false]}); _output.push("</i>");
_output.push(" "); _output.push("</div>");
}
_output.push(" ");_output.push({tag: ["div", {"id": "spinner" + ":" + this._cid, "data-id": "spinner", "class": "position-absolute top-50 start-50 translate-middle d-none"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "spinner-border text-primary", "role": "status"}, false]});
_output.push(" ");_output.push({tag: ["span", {"class": "visually-hidden"}, false]}); _output.push("Uploading..."); _output.push("</span>");
_output.push(" "); _output.push("</div>");
_output.push("</div>");
_output.push("</div>");
_output.push({tag: ["div", {}, false]});
_output.push(" ");_output.push({tag: ["input", {"type": "file", "id": "file_input" + ":" + this._cid, "data-id": "file_input", "class": "d-none", "accept": (this.args.accept || 'image/jpeg,image/png,image/gif')}, true]}); _output.push("</input>");
_output.push(" ");_output.push({tag: ["button", {"type": "button", "id": "upload_btn" + ":" + this._cid, "data-id": "upload_btn", "class": "btn btn-sm btn-primary me-2"}, false]}); _output.push("Upload New Photo"); _output.push("</button>");
_output.push(" "); if (this.args.show_remove && this.data.attachment_key) {
_output.push(" ");_output.push({tag: ["button", {"type": "button", "id": "remove_btn" + ":" + this._cid, "data-id": "remove_btn", "class": "btn btn-sm btn-danger"}, false]}); _output.push("Remove"); _output.push("</button>");
_output.push(" "); }
_output.push(" ");_output.push({tag: ["div", {"class": "form-text mt-2"}, false]}); _output.push("JPG, PNG or GIF. Max size "); (() => { const result = this.args.max_size || 2 ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })(); _output.push("MB."); _output.push("</div>");
_output.push(" "); _output.push("</div>");
_output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Profile_Photo_Input);
})();
/* === storage/rsx-tmp/jqhtml_7e9b52d659877f0d.js === */
/* Compiled from: rsx/theme/components/forms/rsx_tabs.jqhtml */ (function() {
'use strict';
const template_Rsx_Tabs = {
_jqhtml_version: '2.2.185',
name: 'Rsx_Tabs',
tag: 'div',
defaultAttributes: {},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); _output.push("<!-- Tab Navigation -->");
_output.push(" ");_output.push({tag: ["ul", {"class": "nav nav-tabs", "role": "tablist", "id": "nav" + ":" + this._cid, "data-id": "nav"}, false]});
_output.push(" "); _output.push("<!-- Tab headers will be rendered by Rsx_Tab components -->");
_output.push(" "); _output.push("</ul>");
_output.push("<!-- Tab Content Container -->");
_output.push(" ");_output.push({tag: ["div", {"class": "tab-content mt-4", "id": "content" + ":" + this._cid, "data-id": "content"}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Rsx_Tabs);
})();
/* === storage/rsx-tmp/jqhtml_948e2845fa2cff99.js === */
/* Compiled from: rsx/theme/components/forms/rsx_tab.jqhtml */ (function() {
'use strict';
const template_Rsx_Tab = {
_jqhtml_version: '2.2.185',
name: 'Rsx_Tab',
tag: 'div',
defaultAttributes: {"class": "tab-pane fade", "role": "tabpanel"},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Rsx_Tab);
})();
/* === storage/rsx-tmp/jqhtml_dbf52270a0259e5e.js === */
/* Compiled from: rsx/theme/components/forms/rsx_form.jqhtml */ (function() {
'use strict';
const template_Rsx_Form = {
_jqhtml_version: '2.2.185',
name: 'Rsx_Form',
tag: 'form',
defaultAttributes: {},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");
_output.push({tag: ["div", {"id": "loader" + ":" + this._cid, "data-id": "loader", "class": "text-center py-5"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "spinner-border text-primary mb-3", "role": "status"}, false]});
_output.push(" ");_output.push({tag: ["span", {"class": "visually-hidden"}, false]}); _output.push("Loading..."); _output.push("</span>");
_output.push(" "); _output.push("</div>");
_output.push({tag: ["p", {"class": "text-muted"}, false]}); _output.push("Loading form..."); _output.push("</p>");
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"id": "form_content" + ":" + this._cid, "data-id": "form_content", "style": "display: none;"}, false]});
_output.push(" "); if (window.rsxapp.debug) {
_output.push(" ");
}
_output.push(" ");
_output.push({tag: ["div", {"id": "error" + ":" + this._cid, "data-id": "error"}, false]}); _output.push("</div>");
_output.push(" ");
(() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Rsx_Form);
})();
/* === storage/rsx-tmp/jqhtml_24af8013a9dcda8c.js === */
/* Compiled from: rsx/theme/components/forms/form_field_abstract.jqhtml */ (function() {
'use strict';
const template_Form_Field_Abstract = {
_jqhtml_version: '2.2.185',
name: 'Form_Field_Abstract',
tag: 'div',
defaultAttributes: {},
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Form_Field_Abstract);
})();
/* === storage/rsx-tmp/jqhtml_10786dec1aed77bb.js === */
/* Compiled from: rsx/theme/components/forms/form_field.jqhtml */ (function() {
'use strict';
const template_Form_Field = {
_jqhtml_version: '2.2.185',
name: 'Form_Field',
tag: 'div',
defaultAttributes: {"class": "form-group mb-3"},
extends: 'Form_Field_Abstract',
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");
if (this.args.label) {
_output.push(" ");_output.push({tag: ["label", {"class": "form-label", "id": "form_label" + ":" + this._cid, "data-id": "form_label"}, false]});
_output.push(" "); (() => { const result = this.args.label ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(result); } })();
_output.push(" "); if (this.args.required) {
_output.push(" ");_output.push({tag: ["span", {"class": "text-danger"}, false]}); _output.push("*"); _output.push("</span>");
_output.push(" "); }
_output.push(" "); _output.push("</label>");
}
_output.push(" ");
_output.push({tag: ["div", {"class": (this.has_error() ? 'is-invalid' : '')}, false]});
_output.push(" "); (() => { if (this.args._inner_html) { _output.push(this.args._inner_html); } else if (typeof content === 'function') { const [contentInstructions] = content.call(this); _output.push(['_content', contentInstructions]); } })();
_output.push(" "); _output.push("</div>");
if (this.has_error()) {
_output.push(" ");_output.push({tag: ["div", {"class": "invalid-feedback d-block"}, false]});
_output.push(" "); (() => { const result = this.get_error() ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); _output.push("</div>");
}
_output.push(" ");
if (this.args.help) {
_output.push(" ");_output.push({tag: ["small", {"class": "form-text text-muted d-block mt-1"}, false]});
_output.push(" "); (() => { const result = this.args.help ; if (Array.isArray(result)) { if (result.length === 2 && Array.isArray(result[0])) { _output.push(...result[0]); } else { _output.push(...result); } } else { _output.push(jqhtml.escape_html(result)); } })();
_output.push(" "); _output.push("</small>");
}
_output.push(" ");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Form_Field);
})();
/* === storage/rsx-tmp/jqhtml_df8486e42e28be4f.js === */
/* Compiled from: rsx/theme/components/forms/form_hidden_field.jqhtml */ (function() {
'use strict';
const template_Form_Hidden_Field = {
_jqhtml_version: '2.2.185',
name: 'Form_Hidden_Field',
tag: 'input',
defaultAttributes: {"type": "hidden", "class": "Widget"},
extends: 'Form_Field_Abstract',
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" "); return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Form_Hidden_Field);
})();
/* === storage/rsx-tmp/jqhtml_5e1e2e4a50922d32.js === */
/* Compiled from: rsx/theme/components/forms/pin_verification_form.jqhtml */ (function() {
'use strict';
const template_Pin_Verification_Form = {
_jqhtml_version: '2.2.185',
name: 'Pin_Verification_Form',
tag: 'div',
defaultAttributes: {},
extends: 'Rsx_Form',
render: function render(data, args, content, jqhtml) { let _output = []; const _cid = this._cid; const that = this;
_output.push(" ");_output.push({tag: ["div", {"class": "pin-verification-form"}, false]});
_output.push(" ");_output.push({tag: ["div", {"class": "pin-inputs d-flex justify-content-center gap-2 mb-3"}, false]});
_output.push(" ");_output.push({tag: ["input", {"id": "digit_0" + ":" + this._cid, "data-id": "digit_0", "type": "text", "class": "form-control pin-input text-center", "maxlength": "1", "inputmode": "numeric", "pattern": "[0-9]", "autocomplete": "off", "data-index": "0"}, true]}); _output.push("</input>");
_output.push(" ");_output.push({tag: ["input", {"id": "digit_1" + ":" + this._cid, "data-id": "digit_1", "type": "text", "class": "form-control pin-input text-center", "maxlength": "1", "inputmode": "numeric", "pattern": "[0-9]", "autocomplete": "off", "data-index": "1"}, true]}); _output.push("</input>");
_output.push(" ");_output.push({tag: ["input", {"id": "digit_2" + ":" + this._cid, "data-id": "digit_2", "type": "text", "class": "form-control pin-input text-center", "maxlength": "1", "inputmode": "numeric", "pattern": "[0-9]", "autocomplete": "off", "data-index": "2"}, true]}); _output.push("</input>");
_output.push(" ");_output.push({tag: ["input", {"id": "digit_3" + ":" + this._cid, "data-id": "digit_3", "type": "text", "class": "form-control pin-input text-center", "maxlength": "1", "inputmode": "numeric", "pattern": "[0-9]", "autocomplete": "off", "data-index": "3"}, true]}); _output.push("</input>");
_output.push(" ");_output.push({tag: ["input", {"id": "digit_4" + ":" + this._cid, "data-id": "digit_4", "type": "text", "class": "form-control pin-input text-center", "maxlength": "1", "inputmode": "numeric", "pattern": "[0-9]", "autocomplete": "off", "data-index": "4"}, true]}); _output.push("</input>");
_output.push(" ");_output.push({tag: ["input", {"id": "digit_5" + ":" + this._cid, "data-id": "digit_5", "type": "text", "class": "form-control pin-input text-center", "maxlength": "1", "inputmode": "numeric", "pattern": "[0-9]", "autocomplete": "off", "data-index": "5"}, true]}); _output.push("</input>");
_output.push(" "); _output.push("</div>");
_output.push({tag: ["div", {"id": "error_container" + ":" + this._cid, "data-id": "error_container", "class": "alert alert-danger", "style": "display: none;"}, false]}); _output.push("</div>");
_output.push(" ");
_output.push({tag: ["div", {"class": "text-center text-muted small"}, false]});
_output.push(" "); _output.push(" Enter the 6-digit PIN code "); _output.push("</div>");
_output.push(" "); _output.push("</div>");
return [_output, this]; },
dependencies: []
};
// Self-register with jqhtml runtime
// Must use window.jqhtml since we're in bundle scope
if (!window.jqhtml) {
throw new Error('FATAL: window.jqhtml is not defined. The jqhtml runtime must be loaded before registering templates.');
}
// Auto-register following standard jqhtml pattern
window.jqhtml.register_template(template_Pin_Verification_Form);
})();
/* === storage/rsx-tmp/bundle_Login_Bundle_5a1f8789.js === */
// JavaScript Manifest - Generated by BundleCompiler
// Registers all classes in this bundle for runtime introspection
Manifest._define([
[Manifest, "Manifest", null],
[Rsx_Behaviors, "Rsx_Behaviors", null],
[Rsx_Cache, "Rsx_Cache", null],
[Rsx_Init, "Rsx_Init", null],
[Rsx_Js_Model, "Rsx_Js_Model", null],
[Rsx_View_Transitions, "Rsx_View_Transitions", null],
[ReadWriteLock, "ReadWriteLock", null],
[Form_Utils, "Form_Utils", null],
[Debugger, "Debugger", null],
[Rsx_Jq_Helpers, "Rsx_Jq_Helpers", null],
[Rsx, "Rsx", null],
[Ajax, "Ajax", null],
[Component, "Component", _Base_Jqhtml_Component],
[Jqhtml_Integration, "Jqhtml_Integration", null],
[DataGrid_Abstract, "DataGrid_Abstract", Component],
[Activity_Feed, "Activity_Feed", Component],
[Actor_Reference, "Actor_Reference", Component],
[Advanced_Search_Panel, "Advanced_Search_Panel", Component],
[Alert_Banner, "Alert_Banner", Component],
[Avatar, "Avatar", Component],
[Blockquote, "Blockquote", Component],
[Breadcrumbs, "Breadcrumbs", Component],
[Bulk_Action_Bar, "Bulk_Action_Bar", Component],
[Bulk_Selection, "Bulk_Selection", Component],
[Button_Group, "Button_Group", Component],
[Button_Primary, "Button_Primary", Component],
[Button_Secondary, "Button_Secondary", Component],
[Button, "Button", Component],
[Calendar_Event, "Calendar_Event", Component],
[Calendar_Grid, "Calendar_Grid", Component],
[Card, "Card", Component],
[Chart_Component, "Chart_Component", Component],
[Checkbox, "Checkbox", Component],
[Code_Block, "Code_Block", Component],
[Column_Visibility_Toggle, "Column_Visibility_Toggle", Component],
[Comment_Thread, "Comment_Thread", Component],
[Date_Picker, "Date_Picker", Component],
[Dropdown_Menu, "Dropdown_Menu", Component],
[Empty_State, "Empty_State", Component],
[Export_Button, "Export_Button", Component],
[File_Upload, "File_Upload", Component],
[Filter_Bar, "Filter_Bar", Component],
[Form_Actions_Component, "Form_Actions_Component", Component],
[Form_Field_Group, "Form_Field_Group", Component],
[Form_Group_Component, "Form_Group_Component", Component],
[Form_Row_Component, "Form_Row_Component", Component],
[Form_Validation_Message, "Form_Validation_Message", Component],
[Gantt_Chart, "Gantt_Chart", Component],
[Icon_Button, "Icon_Button", Component],
[Icon_With_Label, "Icon_With_Label", Component],
[Icon_With_Text, "Icon_With_Text", Component],
[Icon, "Icon", Component],
[Info_Box, "Info_Box", Component],
[Inline_Edit_Field, "Inline_Edit_Field", Component],
[Input_With_Icon, "Input_With_Icon", Component],
[Input_With_Validation, "Input_With_Validation", Component],
[Input, "Input", Component],
[Kanban_Board, "Kanban_Board", Component],
[Link, "Link", Component],
[List, "List", Component],
[Loading_Skeleton, "Loading_Skeleton", Component],
[Metric_Card, "Metric_Card", Component],
[Mobile_Header, "Mobile_Header", Component],
[Modal_Dialog, "Modal_Dialog", Component],
[Multi_Select, "Multi_Select", Component],
[Notification_Badge, "Notification_Badge", Component],
[Notification_Dropdown, "Notification_Dropdown", Component],
[Overdue_Indicator, "Overdue_Indicator", Component],
[Page_Header, "Page_Header", Component],
[Page_Section, "Page_Section", Component],
[Page, "Page", Component],
[Popover, "Popover", Component],
[Progress_Bar, "Progress_Bar", Component],
[Radio_Button, "Radio_Button", Component],
[Rich_Text_Editor, "Rich_Text_Editor", Component],
[Row_Action_Menu, "Row_Action_Menu", Component],
[Sample_Datagrid_Component, "Sample_Datagrid_Component", Component],
[Search_Bar, "Search_Bar", Component],
[Searchable_Select, "Searchable_Select", Component],
[Select_Dropdown, "Select_Dropdown", Component],
[Sidebar_Nav, "Sidebar_Nav", Component],
[Sortable_Column_Header, "Sortable_Column_Header", Component],
[Spinner, "Spinner", Component],
[Stat_Card, "Stat_Card", Component],
[Status_Badge, "Status_Badge", Component],
[Tab_Content, "Tab_Content", Component],
[Table_Pagination, "Table_Pagination", Component],
[Table, "Table", Component],
[Tabs, "Tabs", Component],
[Tag_Group, "Tag_Group", Component],
[Tag, "Tag", Component],
[Text_Display, "Text_Display", Component],
[Textarea, "Textarea", Component],
[Three_Column_Layout, "Three_Column_Layout", Component],
[Time_Picker, "Time_Picker", Component],
[Timeline, "Timeline", Component],
[Timestamp_Display, "Timestamp_Display", Component],
[Tooltip, "Tooltip", Component],
[Top_Nav, "Top_Nav", Component],
[Trend_Indicator, "Trend_Indicator", Component],
[Two_Column_Layout, "Two_Column_Layout", Component],
[User_Avatar_Dropdown, "User_Avatar_Dropdown", Component],
[Modal_Abstract, "Modal_Abstract", null],
[Rsx_Modal, "Rsx_Modal", Component],
[Modal, "Modal", null],
[Breadcrumb_Item, "Breadcrumb_Item", Component],
[Client_Label_Link, "Client_Label_Link", Component],
[Client_Label, "Client_Label", Component],
[Form_Input_Abstract, "Form_Input_Abstract", Component],
[Text_Input, "Text_Input", Form_Input_Abstract],
[Checkbox_Input, "Checkbox_Input", Form_Input_Abstract],
[Wysiwyg_Input, "Wysiwyg_Input", Form_Input_Abstract],
[Select_Input, "Select_Input", Form_Input_Abstract],
[Ajax_Select_Input, "Ajax_Select_Input", Select_Input],
[Currency_Input, "Currency_Input", Text_Input],
[Phone_Text_Input, "Phone_Text_Input", Text_Input],
[State_Select_Input, "State_Select_Input", Ajax_Select_Input],
[Country_Select_Input, "Country_Select_Input", Ajax_Select_Input],
[Profile_Photo_Input, "Profile_Photo_Input", Form_Input_Abstract],
[Rsx_Tabs, "Rsx_Tabs", Component],
[Rsx_Tab, "Rsx_Tab", Component],
[Rsx_Form, "Rsx_Form", Component],
[Pin_Verification_Form, "Pin_Verification_Form", Rsx_Form],
[Form_Field_Abstract, "Form_Field_Abstract", Component],
[Form_Field, "Form_Field", Form_Field_Abstract],
[Form_Hidden_Field, "Form_Hidden_Field", Form_Field_Abstract],
[Signup_Index, "Signup_Index", null],
[Login_Index, "Login_Index", null],
[Accept_Invite_Index, "Accept_Invite_Index", null]
]);
/* === storage/rsx-tmp/bundle_Login_Bundle_4175a579.js === */
// RSX Route Definitions - Generated by BundleCompiler
// Provides route patterns for type-safe URL generation
Rsx._define_routes({
"Signup_Controller": {
"index": "/signup"
},
"Site_Selection_Controller": {
"index": "/login/site/:site_id"
},
"Login_Controller": {
"index": "/login",
"logout": "/logout"
},
"Accept_Invite_Controller": {
"index": "/accept-invite/:code"
}
});
/* === storage/rsx-tmp/bundle_Login_Bundle_e83e43d3.js === */
$(document).ready(async function() {
try {
console_debug('RSX_INIT', 'Document ready, starting Rsx._rsx_core_boot');
await Rsx._rsx_core_boot();
console_debug('RSX_INIT', 'Initialization complete');
} catch (error) {
console.error('[RSX_INIT] Initialization failed:', error);
console.error('[RSX_INIT] Stack:', error.stack);
throw error;
}
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0b3JhZ2UvcnN4LXRtcC9ucG1faW1wb3J0X2RlY2xhcmF0aW9uc185NWE2ZjYwMmM5ODAzNzYxMWI2NDBiMGI1MzQyODMwYi5qcyIsImFwcC9SU3BhZGUvQ29yZS9Kcy9kZWNvcmF0b3IuanMiLCJhcHAvUlNwYWRlL0NvcmUvSnMvYnJvd3Nlci5qcyIsImFwcC9SU3BhZGUvQ29yZS9Kcy9kYXRldGltZS5qcyIsImFwcC9SU3BhZGUvQ29yZS9Kcy9lcnJvci5qcyIsImFwcC9SU3BhZGUvQ29yZS9Kcy9oYXNoLmpzIiwiYXBwL1JTcGFkZS9Db3JlL0pzL011dGV4LmpzIiwiYXBwL1JTcGFkZS9Db3JlL0pzL2FzeW5jLmpzIiwiYXBwL1JTcGFkZS9Db3JlL0pzL2Z1bmN0aW9ucy5qcyIsImFwcC9SU3BhZGUvQ29yZS9Kcy9NYW5pZmVzdC5qcyIsImFwcC9SU3BhZGUvQ29yZS9Kcy9Sc3hfQmVoYXZpb3JzLmpzIiwiYXBwL1JTcGFkZS9Db3JlL0pzL1JzeF9DYWNoZS5qcyIsImFwcC9SU3BhZGUvQ29yZS9Kcy9Sc3hfSW5pdC5qcyIsImFwcC9SU3BhZGUvQ29yZS9Kcy9Sc3hfSnNfTW9kZWwuanMiLCJhcHAvUlNwYWRlL0NvcmUvSnMvUnN4X1ZpZXdfVHJhbnNpdGlvbnMuanMiLCJhcHAvUlNwYWRlL0NvcmUvSnMvUmVhZFdyaXRlTG9jay5qcyIsImFwcC9SU3BhZGUvQ29yZS9Kcy9Gb3JtX1V0aWxzLmpzIiwiYXBwL1JTcGFkZS9Db3JlL0pzL0RlYnVnZ2VyLmpzIiwiYXBwL1JTcGFkZS9Db3JlL0pzL1JzeF9KcV9IZWxwZXJzLmpzIiwiYXBwL1JTcGFkZS9Db3JlL0pzL1JzeC5qcyIsImFwcC9SU3BhZGUvQ29yZS9Kcy9BamF4LmpzIiwiYXBwL1JTcGFkZS9JbnRlZ3JhdGlvbnMvSnFodG1sL0pxaHRtbF9Db21wb25lbnQuanMiLCJhcHAvUlNwYWRlL0ludGVncmF0aW9ucy9KcWh0bWwvSnFodG1sX0ludGVncmF0aW9uLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvZGF0YWdyaWQvZGF0YWdyaWRfYWJzdHJhY3QuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9BY3Rpdml0eV9GZWVkLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvQWN0b3JfUmVmZXJlbmNlLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvQWR2YW5jZWRfU2VhcmNoX1BhbmVsLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvQWxlcnRfQmFubmVyLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvQXZhdGFyLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvQmxvY2txdW90ZS5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL19hcmNoaXZlZC91bmZpbmlzaGVkL0JyZWFkY3J1bWJzLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvQnVsa19BY3Rpb25fQmFyLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvQnVsa19TZWxlY3Rpb24uanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9idXR0b25fZ3JvdXAuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9idXR0b25fcHJpbWFyeS5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL19hcmNoaXZlZC91bmZpbmlzaGVkL2J1dHRvbl9zZWNvbmRhcnkuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9idXR0b24uanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9DYWxlbmRhcl9FdmVudC5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL19hcmNoaXZlZC91bmZpbmlzaGVkL0NhbGVuZGFyX0dyaWQuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9DYXJkLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvQ2hhcnRfQ29tcG9uZW50LmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvQ2hlY2tib3guanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9Db2RlX0Jsb2NrLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvQ29sdW1uX1Zpc2liaWxpdHlfVG9nZ2xlLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvQ29tbWVudF9UaHJlYWQuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9EYXRlX1BpY2tlci5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL19hcmNoaXZlZC91bmZpbmlzaGVkL0Ryb3Bkb3duX01lbnUuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9FbXB0eV9TdGF0ZS5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL19hcmNoaXZlZC91bmZpbmlzaGVkL0V4cG9ydF9CdXR0b24uanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9GaWxlX1VwbG9hZC5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL19hcmNoaXZlZC91bmZpbmlzaGVkL0ZpbHRlcl9CYXIuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9mb3JtX2FjdGlvbnNfY29tcG9uZW50LmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvRm9ybV9GaWVsZF9Hcm91cC5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL19hcmNoaXZlZC91bmZpbmlzaGVkL2Zvcm1fZ3JvdXBfY29tcG9uZW50LmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvZm9ybV9yb3dfY29tcG9uZW50LmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvRm9ybV9WYWxpZGF0aW9uX01lc3NhZ2UuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9HYW50dF9DaGFydC5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL19hcmNoaXZlZC91bmZpbmlzaGVkL2ljb25fYnV0dG9uLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvSWNvbl9XaXRoX0xhYmVsLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvSWNvbl9XaXRoX1RleHQuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9pY29uLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvSW5mb19Cb3guanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9JbmxpbmVfRWRpdF9GaWVsZC5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL19hcmNoaXZlZC91bmZpbmlzaGVkL0lucHV0X1dpdGhfSWNvbi5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL19hcmNoaXZlZC91bmZpbmlzaGVkL0lucHV0X1dpdGhfVmFsaWRhdGlvbi5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL19hcmNoaXZlZC91bmZpbmlzaGVkL0lucHV0LmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvS2FuYmFuX0JvYXJkLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvbGluay5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL19hcmNoaXZlZC91bmZpbmlzaGVkL0xpc3QuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9Mb2FkaW5nX1NrZWxldG9uLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvTWV0cmljX0NhcmQuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9Nb2JpbGVfSGVhZGVyLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvTW9kYWxfRGlhbG9nLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvTXVsdGlfU2VsZWN0LmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvTm90aWZpY2F0aW9uX0JhZGdlLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvTm90aWZpY2F0aW9uX0Ryb3Bkb3duLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvT3ZlcmR1ZV9JbmRpY2F0b3IuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9QYWdlX0hlYWRlci5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL19hcmNoaXZlZC91bmZpbmlzaGVkL3BhZ2Vfc2VjdGlvbi5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL19hcmNoaXZlZC91bmZpbmlzaGVkL3BhZ2UuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9Qb3BvdmVyLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvUHJvZ3Jlc3NfQmFyLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvUmFkaW9fQnV0dG9uLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvUmljaF9UZXh0X0VkaXRvci5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL19hcmNoaXZlZC91bmZpbmlzaGVkL1Jvd19BY3Rpb25fTWVudS5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL19hcmNoaXZlZC91bmZpbmlzaGVkL1NhbXBsZV9EYXRhZ3JpZF9Db21wb25lbnQuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9TZWFyY2hfQmFyLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvU2VhcmNoYWJsZV9TZWxlY3QuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9TZWxlY3RfRHJvcGRvd24uanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9TaWRlYmFyX05hdi5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL19hcmNoaXZlZC91bmZpbmlzaGVkL1NvcnRhYmxlX0NvbHVtbl9IZWFkZXIuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9TcGlubmVyLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvU3RhdF9DYXJkLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvU3RhdHVzX0JhZGdlLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvVGFiX0NvbnRlbnQuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9UYWJsZV9QYWdpbmF0aW9uLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvVGFibGUuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9UYWJzLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvVGFnX0dyb3VwLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvVGFnLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvdGV4dF9kaXNwbGF5LmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvVGV4dGFyZWEuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9UaHJlZV9Db2x1bW5fTGF5b3V0LmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvVGltZV9QaWNrZXIuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9UaW1lbGluZS5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL19hcmNoaXZlZC91bmZpbmlzaGVkL1RpbWVzdGFtcF9EaXNwbGF5LmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvVG9vbHRpcC5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL19hcmNoaXZlZC91bmZpbmlzaGVkL1RvcF9OYXYuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9UcmVuZF9JbmRpY2F0b3IuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9Ud29fQ29sdW1uX0xheW91dC5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL19hcmNoaXZlZC91bmZpbmlzaGVkL1VzZXJfQXZhdGFyX0Ryb3Bkb3duLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvbW9kYWwvbW9kYWxfYWJzdHJhY3QuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9tb2RhbC9yc3hfbW9kYWwuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9tb2RhbC9Nb2RhbC5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL3BhZ2VfZWxlbWVudHMvYnJlYWRjcnVtYl9pdGVtLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvcGFnZV9lbGVtZW50cy9jbGllbnRfbGFiZWxfbGluay5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL3BhZ2VfZWxlbWVudHMvY2xpZW50X2xhYmVsLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvaW5wdXRzL2Zvcm1faW5wdXRfYWJzdHJhY3QuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9pbnB1dHMvdGV4dF9pbnB1dC5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL2lucHV0cy9jaGVja2JveF9pbnB1dC5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL2lucHV0cy93eXNpd3lnX2lucHV0LmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvaW5wdXRzL3NlbGVjdF9pbnB1dC5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL2lucHV0cy9hamF4X3NlbGVjdF9pbnB1dC5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL2lucHV0cy9jdXJyZW5jeV9pbnB1dC5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL2lucHV0cy9waG9uZV90ZXh0X2lucHV0LmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvaW5wdXRzL3N0YXRlX3NlbGVjdF9pbnB1dC5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL2lucHV0cy9jb3VudHJ5X3NlbGVjdF9pbnB1dC5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL2lucHV0cy9wcm9maWxlX3Bob3RvX2lucHV0LmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvZm9ybXMvcnN4X3RhYnMuanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9mb3Jtcy9yc3hfdGFiLmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvZm9ybXMvcnN4X2Zvcm0uanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9mb3Jtcy9waW5fdmVyaWZpY2F0aW9uX2Zvcm0uanMiLCJyc3gvdGhlbWUvY29tcG9uZW50cy9mb3Jtcy9mb3JtX2ZpZWxkX2Fic3RyYWN0LmpzIiwicnN4L3RoZW1lL2NvbXBvbmVudHMvZm9ybXMvZm9ybV9maWVsZC5qcyIsInJzeC90aGVtZS9jb21wb25lbnRzL2Zvcm1zL2Zvcm1faGlkZGVuX2ZpZWxkLmpzIiwicnN4L2FwcC9sb2dpbi9zaWdudXAvc2lnbnVwX2luZGV4LmpzIiwicnN4L2FwcC9sb2dpbi9sb2dpbl9pbmRleC5qcyIsInJzeC9hcHAvbG9naW4vYWNjZXB0X2ludml0ZV9pbmRleC5qcyIsImRhdGFncmlkX2Fic3RyYWN0LmpxaHRtbCIsImFjdGlvbl9idXR0b25fZGVsZXRlLmpxaHRtbCIsImFjdGlvbl9idXR0b25fZWRpdC5qcWh0bWwiLCJhY3Rpb25fYnV0dG9uX3ZpZXcuanFodG1sIiwiYWN0aXZpdHlfZmVlZC5qcWh0bWwiLCJhY3Rvcl9yZWZlcmVuY2UuanFodG1sIiwiYWR2YW5jZWRfc2VhcmNoX3BhbmVsLmpxaHRtbCIsImFsZXJ0X2Jhbm5lci5qcWh0bWwiLCJhdmF0YXIuanFodG1sIiwiYmxvY2txdW90ZS5qcWh0bWwiLCJicmVhZGNydW1icy5qcWh0bWwiLCJidWxrX2FjdGlvbl9iYXIuanFodG1sIiwiYnVsa19zZWxlY3Rpb24uanFodG1sIiwiYnV0dG9uX2dyb3VwLmpxaHRtbCIsImJ1dHRvbl9wcmltYXJ5LmpxaHRtbCIsImJ1dHRvbl9zZWNvbmRhcnkuanFodG1sIiwiYnV0dG9uLmpxaHRtbCIsImNhbGVuZGFyX2V2ZW50LmpxaHRtbCIsImNhbGVuZGFyX2dyaWQuanFodG1sIiwiY2FyZF9mb290ZXIuanFodG1sIiwiY2FyZF9oZWFkZXIuanFodG1sIiwiY2FyZF90aXRsZS5qcWh0bWwiLCJjYXJkLmpxaHRtbCIsImNoYXJ0X2NvbXBvbmVudC5qcWh0bWwiLCJjaGVja2JveC5qcWh0bWwiLCJjb2RlX2Jsb2NrLmpxaHRtbCIsImNvbHVtbl92aXNpYmlsaXR5X3RvZ2dsZS5qcWh0bWwiLCJjb21tZW50X3RocmVhZC5qcWh0bWwiLCJjb250YWN0X2FjdGlvbnMuanFodG1sIiwiY29udGFjdF9yb3cuanFodG1sIiwiY29udGFjdHNfZGF0YV90YWJsZS5qcWh0bWwiLCJjb250YWN0c19saXN0X2NhcmQuanFodG1sIiwiZGF0ZV9waWNrZXIuanFodG1sIiwiZHJvcGRvd25fbWVudS5qcWh0bWwiLCJlbXB0eV9zdGF0ZS5qcWh0bWwiLCJleHBvcnRfYnV0dG9uLmpxaHRtbCIsImZpbGVfdXBsb2FkLmpxaHRtbCIsImZpbHRlcl9iYXIuanFodG1sIiwiZm9ybV9hY3Rpb25zX2NvbXBvbmVudC5qcWh0bWwiLCJmb3JtX2ZpZWxkX2dyb3VwLmpxaHRtbCIsImZvcm1fZ3JvdXBfY29tcG9uZW50LmpxaHRtbCIsImZvcm1fcm93X2NvbXBvbmVudC5qcWh0bWwiLCJmb3JtX3ZhbGlkYXRpb25fbWVzc2FnZS5qcWh0bWwiLCJnYW50dF9jaGFydC5qcWh0bWwiLCJpY29uX2J1dHRvbi5qcWh0bWwiLCJpY29uX3dpdGhfbGFiZWwuanFodG1sIiwiaWNvbl93aXRoX3RleHQuanFodG1sIiwiaWNvbi5qcWh0bWwiLCJpbmZvX2JveC5qcWh0bWwiLCJpbmxpbmVfZWRpdF9maWVsZC5qcWh0bWwiLCJpbnB1dF93aXRoX2ljb24uanFodG1sIiwiaW5wdXRfd2l0aF92YWxpZGF0aW9uLmpxaHRtbCIsImlucHV0LmpxaHRtbCIsImthbmJhbl9ib2FyZC5qcWh0bWwiLCJsaW5rLmpxaHRtbCIsImxpc3QuanFodG1sIiwibG9hZGluZ19za2VsZXRvbi5qcWh0bWwiLCJtZXRyaWNfY2FyZC5qcWh0bWwiLCJtb2JpbGVfaGVhZGVyLmpxaHRtbCIsIm1vZGFsX2RpYWxvZy5qcWh0bWwiLCJtdWx0aV9zZWxlY3QuanFodG1sIiwibm90aWZpY2F0aW9uX2JhZGdlLmpxaHRtbCIsIm5vdGlmaWNhdGlvbl9kcm9wZG93bi5qcWh0bWwiLCJvdmVyZHVlX2luZGljYXRvci5qcWh0bWwiLCJwYWdlX2hlYWRlcl9sZWZ0LmpxaHRtbCIsInBhZ2VfaGVhZGVyX3JpZ2h0LmpxaHRtbCIsInBhZ2VfaGVhZGVyLmpxaHRtbCIsInBhZ2Vfc2VjdGlvbi5qcWh0bWwiLCJwYWdlX3N1YnRpdGxlLmpxaHRtbCIsInBhZ2VfdGl0bGUuanFodG1sIiwicGFnZS5qcWh0bWwiLCJwYWdpbmF0aW9uX2NvbnRyb2xzLmpxaHRtbCIsInBhZ2luYXRpb25faW5mby5qcWh0bWwiLCJwb3BvdmVyLmpxaHRtbCIsInByb2dyZXNzX2Jhci5qcWh0bWwiLCJyYWRpb19idXR0b24uanFodG1sIiwicmVjb3JkX2NvdW50X2Rpc3BsYXkuanFodG1sIiwicmljaF90ZXh0X2VkaXRvci5qcWh0bWwiLCJyb3dfYWN0aW9uX21lbnUuanFodG1sIiwiU2FtcGxlX0RhdGFncmlkX0NvbXBvbmVudC5qcWh0bWwiLCJzZWFyY2hfYmFyLmpxaHRtbCIsInNlYXJjaF9idXR0b24uanFodG1sIiwic2VhcmNoX2lucHV0LmpxaHRtbCIsInNlYXJjaGFibGVfc2VsZWN0LmpxaHRtbCIsInNlbGVjdF9kcm9wZG93bi5qcWh0bWwiLCJzaWRlYmFyX25hdi5qcWh0bWwiLCJzaW1wbGVfdGFibGVfdGVzdC5qcWh0bWwiLCJzb3J0YWJsZV9jb2x1bW5faGVhZGVyLmpxaHRtbCIsInNwaW5uZXIuanFodG1sIiwic3RhdF9jYXJkLmpxaHRtbCIsInN0YXR1c19iYWRnZS5qcWh0bWwiLCJ0YWJfY29udGVudC5qcWh0bWwiLCJ0YWJsZV9ib2R5LmpxaHRtbCIsInRhYmxlX2hlYWRlcnMuanFodG1sIiwidGFibGVfcGFnaW5hdGlvbi5qcWh0bWwiLCJ0YWJsZS5qcWh0bWwiLCJ0YWJzLmpxaHRtbCIsInRhZ19ncm91cC5qcWh0bWwiLCJ0YWcuanFodG1sIiwidGV4dF9kaXNwbGF5LmpxaHRtbCIsInRleHRhcmVhLmpxaHRtbCIsInRocmVlX2NvbHVtbl9sYXlvdXQuanFodG1sIiwidGltZV9waWNrZXIuanFodG1sIiwidGltZWxpbmUuanFodG1sIiwidGltZXN0YW1wX2Rpc3BsYXkuanFodG1sIiwidG9vbHRpcC5qcWh0bWwiLCJ0b3BfbmF2LmpxaHRtbCIsInRyZW5kX2luZGljYXRvci5qcWh0bWwiLCJ0d29fY29sdW1uX2xheW91dC5qcWh0bWwiLCJ1c2VyX2F2YXRhcl9kcm9wZG93bi5qcWh0bWwiLCJ1c2Vyc19kYXRhX3RhYmxlLmpxaHRtbCIsInJzeF9tb2RhbC5qcWh0bWwiLCJicmVhZGNydW1iLmpxaHRtbCIsImJyZWFkY3J1bWJfaXRlbS5qcWh0bWwiLCJjbGllbnRfbGFiZWwuanFodG1sIiwiY2xpZW50X2xhYmVsX2xpbmsuanFodG1sIiwidGV4dF9pbnB1dC5qcWh0bWwiLCJzZWxlY3RfaW5wdXQuanFodG1sIiwiYWpheF9zZWxlY3RfaW5wdXQuanFodG1sIiwiY2hlY2tib3hfaW5wdXQuanFodG1sIiwid3lzaXd5Z19pbnB1dC5qcWh0bWwiLCJjb3VudHJ5X3NlbGVjdF9pbnB1dC5qcWh0bWwiLCJzdGF0ZV9zZWxlY3RfaW5wdXQuanFodG1sIiwicHJvZmlsZV9waG90b19pbnB1dC5qcWh0bWwiLCJyc3hfdGFicy5qcWh0bWwiLCJyc3hfdGFiLmpxaHRtbCIsInJzeF9mb3JtLmpxaHRtbCIsImZvcm1fZmllbGRfYWJzdHJhY3QuanFodG1sIiwiZm9ybV9maWVsZC5qcWh0bWwiLCJmb3JtX2hpZGRlbl9maWVsZC5qcWh0bWwiLCJwaW5fdmVyaWZpY2F0aW9uX2Zvcm0uanFodG1sIiwic3RvcmFnZS9yc3gtdG1wL2J1bmRsZV9Mb2dpbl9CdW5kbGVfNWExZjg3ODkuanMiLCJzdG9yYWdlL3JzeC10bXAvYnVuZGxlX0xvZ2luX0J1bmRsZV80MTc1YTU3OS5qcyIsInN0b3JhZ2UvcnN4LXRtcC9idW5kbGVfTG9naW5fQnVuZGxlX2U4M2U0M2QzLmpzIl0sIm5hbWVzIjpbImRlY29yYXRvciIsInZhbHVlIiwiaXNfbW9iaWxlIiwidGVzdCIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsIiQiLCJ3aW5kb3ciLCJ3aWR0aCIsImlzX2Rlc2t0b3AiLCJnZXRfb3MiLCJ1c2VyX2FnZW50IiwicGxhdGZvcm0iLCJtYWNvc19wbGF0Zm9ybXMiLCJ3aW5kb3dzX3BsYXRmb3JtcyIsImlvc19wbGF0Zm9ybXMiLCJvcyIsImlzX21vYmlsZV9kZXZpY2UiLCJpbmRleE9mIiwiaXNfY3Jhd2xlciIsImJvdF9wYXR0ZXJuIiwic2Nyb2xsX2ludG9fdmlld19pZl9uZWVkZWQiLCJ0YXJnZXQiLCIkdGFyZ2V0IiwiJHBhcmVudCIsInBhcmVudCIsInRhcmdldF90b3AiLCJwb3NpdGlvbiIsInRvcCIsInNjcm9sbFRvcCIsInRhcmdldF9oZWlnaHQiLCJvdXRlckhlaWdodCIsInBhcmVudF9oZWlnaHQiLCJoZWlnaHQiLCJzY3JvbGxfcG9zaXRpb24iLCJEZWJ1Z2dlciIsImNvbnNvbGVfZGVidWciLCJuZXdfc2Nyb2xsX3Bvc2l0aW9uIiwiTWF0aCIsIm1heCIsIm1pbiIsInNjcm9sbEhlaWdodCIsInNjcm9sbF9wYWdlX2ludG9fdmlld19pZl9uZWVkZWQiLCJvZmZzZXQiLCJ3aW5kb3dfaGVpZ2h0Iiwid2luZG93X3Njcm9sbF9wb3NpdGlvbiIsImFuaW1hdGUiLCJ3YWl0X2Zvcl9pbWFnZXMiLCJjYWxsYmFjayIsIiRpbWFnZXMiLCJ0b3RhbF9pbWFnZXMiLCJsZW5ndGgiLCJpbWFnZXNfbG9hZGVkIiwiZWFjaCIsImltZyIsIkltYWdlIiwib25sb2FkIiwib25lcnJvciIsInNyYyIsIiRuYnNwIiwiZXNjYXBlX2pxX3NlbGVjdG9yIiwiaWQiLCJyZXBsYWNlIiwidW5peF90aW1lIiwicm91bmQiLCJEYXRlIiwiZ2V0VGltZSIsInltZGhpc190b191bml4Iiwic3RyX2RhdGUiLCJkYXRlIiwiZXJyb3IiLCJzdHIiLCJlcnJvcl9jb2RlIiwidW5kZWYiLCJzdGF0dXMiLCJzaG91bGRudF9oYXBwZW4iLCJtZXNzYWdlIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiRXJyb3IiLCJzdGFjayIsInN0YWNrTGluZXMiLCJzcGxpdCIsImNhbGxlckluZm8iLCJjYWxsZXJMaW5lIiwibWF0Y2giLCJlcnJvck1lc3NhZ2UiLCJjb25zb2xlIiwicmVwZWF0IiwiZmF0YWxFcnJvciIsIm5hbWUiLCJoYXNoIiwidGhlX3ZhciIsImNhbGNfc2hhMSIsImlnbm9yZWRfa2V5cyIsImpzb25fc3RyaW5naWZ5X25vY2lyYyIsImNhY2hlIiwiSlNPTiIsInN0cmluZ2lmeSIsImtleSIsInYiLCJfY2FjaGVfa2V5IiwiX2hhc2hfa2V5IiwicHVzaCIsImZsYXRfdmFyIiwiX2ZsYXR0ZW4iLCJwcmVmaXgiLCJkZXB0aCIsImlzX29iamVjdCIsIkFic3RyYWN0IiwiayIsImhhc093blByb3BlcnR5IiwiaXNfYXJyYXkiLCJpIiwiZm9yZWFjaCIsImlzX2Z1bmN0aW9uIiwiaXNfbnVtZXJpYyIsIlN0cmluZyIsInNvcnRlciIsInNvcnQiLCJhIiwiYiIsImpzb24iLCJoYXNoZWQiLCJzaGExIiwiZGVlcF9lcXVhbCIsIm11dGV4IiwiZ2xvYmFsX2lkIiwiaW5zdGFuY2VfbXV0ZXhlcyIsIl9pbnN0YW5jZV9zdG9yYWdlIiwiV2Vha01hcCIsImdsb2JhbF9tdXRleGVzIiwiX2dsb2JhbF9zdG9yYWdlIiwiTWFwIiwiZ2V0X2luc3RhbmNlX211dGV4IiwiaW5zdGFuY2UiLCJtZXRob2RfbmFtZSIsImluc3RhbmNlX2xvY2tzIiwiZ2V0Iiwic2V0IiwibG9ja19zdGF0ZSIsImFjdGl2ZSIsInF1ZXVlIiwiZ2V0X2dsb2JhbF9tdXRleCIsInNjaGVkdWxlX25leHQiLCJmbiIsInJlc29sdmUiLCJyZWplY3QiLCJzaGlmdCIsIlByb21pc2UiLCJ0aGVuIiwiZmluYWxseSIsImFjcXVpcmVfbG9jayIsImRlc2NyaXB0b3IiLCJvcmlnaW5hbF9tZXRob2QiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImFwcGx5IiwiX2xlbjIiLCJfa2V5MiIsInNsZWVwIiwibWlsbGlzZWNvbmRzIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwic2V0VGltZW91dCIsImRlYm91bmNlIiwiY2FsbGJhY2tfb3JfZGVsYXkiLCJkZWxheSIsImltbWVkaWF0ZSIsImRlY29yYXRvcl9kZWxheSIsImRlY29yYXRvcl9pbW1lZGlhdGUiLCJjb250ZXh0Iiwia2luZCIsImRlYm91bmNlX2ltcGwiLCJydW5uaW5nIiwicXVldWVkIiwibGFzdF9lbmRfdGltZSIsInRpbWVyIiwibmV4dF9hcmdzIiwibmV4dF9jb250ZXh0IiwicmVzb2x2ZV9xdWV1ZSIsInJlamVjdF9xdWV1ZSIsInJ1bl9mdW5jdGlvbiIsInRoZXNlX3Jlc29sdmVzIiwidGhlc2VfcmVqZWN0cyIsInJlc3VsdCIsImVyciIsIm5vdyIsImNsZWFyVGltZW91dCIsImZpcnN0X2NhbGwiLCJzaW5jZSIsIkluZmluaXR5Iiwid2FpdCIsInJ3bG9jayIsImNiIiwiUmVhZFdyaXRlTG9jayIsImFjcXVpcmUiLCJyd2xvY2tfcmVhZCIsImFjcXVpcmVfcmVhZCIsInJ3bG9ja19mb3JjZV91bmxvY2siLCJmb3JjZV91bmxvY2siLCJyd2xvY2tfcGVuZGluZyIsInBlbmRpbmciLCJvYmoiLCJyZXN1bHRzIiwiaXNBcnJheSIsImZvckVhY2giLCJpbmRleCIsInByb21pc2VzIiwiZmlsdGVyIiwiYWxsIiwibiIsImlzTmFOIiwicGFyc2VGbG9hdCIsImlzRmluaXRlIiwiaXNfc3RyaW5nIiwicyIsImlzX2ludGVnZXIiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJpc19wcm9taXNlIiwiZnVuY3Rpb25fdG9fY2hlY2siLCJ0b1N0cmluZyIsImNhbGwiLCJpc19lbWFpbCIsImVtYWlsIiwicmVnZXgiLCJpc3NldCIsImVtcHR5Iiwib2JqZWN0IiwiZmxvYXQiLCJ2YWwiLCJwYXJzZWQiLCJpbnQiLCJwYXJzZUludCIsInZhbHVlX3VubGVzc19udW1lcmljX3N0cmluZ190aGVuX251bWVyaWNfdmFsdWUiLCJodG1sIiwiXyIsImVzY2FwZSIsIm5sMmJyIiwiaHRtbGJyIiwidXJsZW5jb2RlIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwidXJsZGVjb2RlIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwianNvbl9lbmNvZGUiLCJqc29uX2RlY29kZSIsInBhcnNlIiwiY2hhbm5lbCIsInZhbHVlcyIsInJlcGxhY2VfYWxsIiwic3RyaW5nIiwic2VhcmNoIiwiam9pbiIsInVjd29yZHMiLCJpbnB1dCIsIm1hcCIsIndvcmQiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwiY291bnQiLCJvIiwiYyIsImNsb25lIiwiRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJfX2Nsb25lIiwidGhhdCIsInRlbXAiLCJjbG9uZWQiLCJjb25zdHJ1Y3RvciIsIk9iamVjdCIsImFzc2lnbiIsImNvYWxlc2NlIiwiZnJvbSIsInJldHVybl92YWwiLCJhcmciLCJjc3ZfdG9fYXJyYXlfdHJpbSIsInN0cl9jc3YiLCJwYXJ0cyIsInJldCIsInBhcnQiLCJ0cmltIiwiTWFuaWZlc3QiLCJfZGVmaW5lIiwiaXRlbXMiLCJfY2xhc3NlcyIsIml0ZW0iLCJjbGFzc19vYmplY3QiLCJjbGFzc19uYW1lIiwiY2xhc3NfZXh0ZW5kcyIsImRlY29yYXRvcnMiLCJjbGFzcyIsImV4dGVuZHMiLCJfbmFtZSIsIl9leHRlbmRzIiwiX2RlY29yYXRvcnMiLCJfYnVpbGRfc3ViY2xhc3NfaW5kZXgiLCJfc3ViY2xhc3NfaW5kZXgiLCJjbGFzc2RhdGEiLCJjdXJyZW50X2NsYXNzX25hbWUiLCJjdXJyZW50X2NsYXNzZGF0YSIsImV4dGVuZHNfbmFtZSIsImluY2x1ZGVzIiwiZ2V0X2V4dGVuZGluZyIsImJhc2VfY2xhc3MiLCJiYXNlX2NsYXNzX29iamVjdCIsImdldF9jbGFzc19ieV9uYW1lIiwiY2xhc3NlcyIsImpzX2lzX3N1YmNsYXNzX29mIiwibG9jYWxlQ29tcGFyZSIsInN1YmNsYXNzIiwic3VwZXJjbGFzcyIsInN1YmNsYXNzX29iamVjdCIsInN1cGVyY2xhc3Nfb2JqZWN0IiwiY3VycmVudF9jbGFzcyIsImdldF9hbGxfY2xhc3NlcyIsImJ1aWxkX2tleSIsInJzeGFwcCIsImdldF9kZWNvcmF0b3JzIiwiY2xhc3NfaW5mbyIsIl90cmFuc2Zvcm1fZGVjb3JhdG9ycyIsImdldF9hbGxfZGVjb3JhdG9ycyIsImNvbXBhY3RfZGVjb3JhdG9ycyIsImhhc19kZWNvcmF0b3IiLCJkZWNvcmF0b3JfbmFtZSIsInNvbWUiLCJkIiwianNfZ2V0X3N1YmNsYXNzZXNfb2YiLCJiYXNlX2NsYXNzX25hbWUiLCJzdWJjbGFzc19uYW1lcyIsInN1YmNsYXNzX29iamVjdHMiLCJzdWJjbGFzc19uYW1lIiwibmFtZV9hIiwibmFtZV9iIiwiUnN4X0JlaGF2aW9ycyIsIl9vbl9mcmFtZXdvcmtfY29yZV9pbml0IiwiX2luaXRfaWdub3JlX2ludmFsaWRfYW5jaG9yX2xpbmtzIiwiX3RyaW1fY29waWVkX3RleHQiLCJkb2N1bWVudCIsIm9uIiwiZSIsIiRsaW5rIiwiaHJlZiIsImF0dHIiLCJpc0RlZmF1bHRQcmV2ZW50ZWQiLCJkYXRhIiwicHJldmVudERlZmF1bHQiLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJzdGFydHNXaXRoIiwidGFyZ2V0SWQiLCJzdWJzdHJpbmciLCJ0YXJnZXRFeGlzdHMiLCJnZXRFbGVtZW50QnlJZCIsInF1ZXJ5U2VsZWN0b3IiLCJhZGRFdmVudExpc3RlbmVyIiwiZXZlbnQiLCJzaGlmdEtleSIsInNlbGVjdGlvbiIsImdldFNlbGVjdGlvbiIsInNlbGVjdGVkX3RleHQiLCJjb250YWluZXIiLCJnZXRSYW5nZUF0IiwiY29tbW9uQW5jZXN0b3JDb250YWluZXIiLCJub2RlVHlwZSIsInBhcmVudE5vZGUiLCJjbG9zZXN0IiwidHJpbW1lZF90ZXh0IiwiY2xpcGJvYXJkRGF0YSIsInNldERhdGEiLCJsb2ciLCJSc3hfQ2FjaGUiLCJvbl9jb3JlX2RlZmluZSIsIkNvcmVfQ2FjaGUiLCJfY2FjaGVzIiwiZ2xvYmFsIiwiX2NhY2hlc19zZXQiLCJnZXRfaW5zdGFuY2UiLCJNYWluIiwiZGVidWciLCJrZXlfZW5jb2RlZCIsIl9lbmNvZGVrZXkiLCJnZXRfZ2xvYmFsIiwiZ2V0X3Nlc3Npb24iLCJfc3VwcG9ydHNTdG9yYWdlIiwicnMiLCJzZXNzaW9uU3RvcmFnZSIsImdldEl0ZW0iLCJzZXRfc2Vzc2lvbiIsIl90cnlhZ2FpbiIsInJlbW92ZUl0ZW0iLCJzZXRJdGVtIiwiX2lzT3V0T2ZTcGFjZSIsImNsZWFyIiwiX3Jlc2V0IiwiX19zdXBwb3J0c1N0b3JhZ2UiLCJleCIsIlJzeF9Jbml0IiwiUnN4IiwiaXNfcHJvZCIsIl9fZW52aXJvbm1lbnRfY2hlY2tzIiwic2NyaXB0cyIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwic2NyaXB0IiwiZGVmZXIiLCJyZWFzb24iLCJfcnN4X2NvcmVfYm9vdF9zdG9wIiwiUnN4X0pzX01vZGVsIiwiX19NT0RFTCIsIm1vZGVsRGF0YSIsImZldGNoIiwiQ3VycmVudENsYXNzIiwibW9kZWxOYW1lIiwicmVzcG9uc2UiLCJhamF4IiwidXJsIiwibWV0aG9kIiwiZGF0YVR5cGUiLCJfaW5zdGFudGlhdGVfbW9kZWxzX3JlY3Vyc2l2ZSIsImdldE1vZGVsTmFtZSIsInJlZnJlc2giLCJmcmVzaCIsInRvT2JqZWN0IiwidG9KU09OIiwiTW9kZWxDbGFzcyIsIlJzeF9WaWV3X1RyYW5zaXRpb25zIiwic3RhcnRWaWV3VHJhbnNpdGlvbiIsIl9pbmplY3RfdHJhbnNpdGlvbl9jc3MiLCJzdHlsZSIsImNyZWF0ZUVsZW1lbnQiLCJ0ZXh0Q29udGVudCIsImhlYWQiLCJhcHBlbmRDaGlsZCIsIl81MGFlNjA5ZV9hc3NlcnRDbGFzc0JyYW5kIiwiXzUwYWU2MDllX2dldF9sb2NrIiwid3JpdGVyX3EiLCJfNTBhZTYwOWVfc2NoZWR1bGUiLCJ3cml0ZXJfYWN0aXZlIiwicmVhZGVyX3EiLCJyZWFkZXJzIiwiX2xvY2tzIiwiZGVsZXRlIiwiXzUwYWU2MDllX1JlYWRXcml0ZUxvY2siLCJiYXRjaCIsInNwbGljZSIsIkZvcm1fVXRpbHMiLCJfb25fZnJhbWV3b3JrX2NvcmVfZGVmaW5lIiwicGFyYW1zIiwiYWpheF9zdWJtaXQiLCJvcHRpb25zIiwiJGVsZW1lbnQiLCJpcyIsImNvbnRyb2xsZXIiLCJhY3Rpb24iLCJBamF4IiwiYWpheF91cmxfdG9fY29udHJvbGxlcl9hY3Rpb24iLCJhcHBseV9mb3JtX2Vycm9ycyIsInBhcmVudF9zZWxlY3RvciIsImVycm9ycyIsInJlc2V0X2Zvcm1fZXJyb3JzIiwibm9ybWFsaXplZCIsIl9ub3JtYWxpemVfZXJyb3JzIiwiYW5pbWF0aW9ucyIsInR5cGUiLCJfYXBwbHlfZ2VuZXJhbF9lcnJvcnMiLCJkZWR1cGxpY2F0ZWQiLCJfZGVkdXBsaWNhdGVfZXJyb3JzIiwiX2FwcGx5X2ZpZWxkX2Vycm9ycyIsIm1hdGNoZWRfY291bnQiLCJrZXlzIiwidW5tYXRjaGVkIiwidW5tYXRjaGVkX2RlZHVwbGljYXRlZCIsInVubWF0Y2hlZF9jb3VudCIsInN1bW1hcnlfbXNnIiwic3VtbWFyeV9hbmltYXRpb25zIiwiX2FwcGx5X2NvbWJpbmVkX2Vycm9yIiwiJGVycm9yX2NvbnRhaW5lciIsImZpbmQiLCJmaXJzdCIsImNvbnRhaW5lcl90b3AiLCJmaXhlZF9oZWFkZXJfaGVpZ2h0IiwiX2dldF9maXhlZF9oZWFkZXJfaGVpZ2h0IiwidGFyZ2V0X3Njcm9sbCIsInJlc2V0IiwiZm9ybV9zZWxlY3RvciIsIiRmb3JtIiwidHJpZ2dlciIsInNlcmlhbGl6ZSIsInNlcmlhbGl6ZUFycmF5IiwiZm9ybV9kYXRhIiwib25fc3VjY2VzcyIsImRldGFpbHMiLCJvbl9lcnJvciIsInJlbW92ZSIsInJlbW92ZUNsYXNzIiwiZXZlcnkiLCJ1bndyYXBwZWQiLCJmaWVsZCIsIlNldCIsInNlZW4iLCJoYXMiLCJhZGQiLCJmaWVsZF9lcnJvcnMiLCJmaWVsZF9uYW1lIiwiZXJyb3JfbWVzc2FnZSIsIiRpbnB1dCIsIiRlcnJvciIsImFkZENsYXNzIiwiYXBwZW5kVG8iLCJoaWRlIiwiZmFkZUluIiwicHJvbWlzZSIsInVubWF0Y2hlZF9lcnJvcnMiLCIkYWxlcnQiLCJ0ZXh0IiwiJGxpc3QiLCJlcnJvcl9tc2ciLCJwcmVwZW5kVG8iLCJtZXNzYWdlcyIsIm1zZyIsImVycm9yX2xpc3QiLCJ0b3RhbF9oZWlnaHQiLCIkZWwiLCJjc3MiLCJvdXRlcldpZHRoIiwidmlld3BvcnRfd2lkdGgiLCJsb2dfYnJvd3Nlcl9lcnJvcnMiLCJfaGFuZGxlX2Jyb3dzZXJfZXJyb3IiLCJmaWxlbmFtZSIsImxpbmVubyIsImNvbG5vIiwib25fcmVmcmVzaCIsImVuYWJsZWQiLCJjb25maWciLCJmaWx0ZXJfbW9kZSIsInNwZWNpZmljIiwic3BlY2lmaWNfY2hhbm5lbCIsImNoYW5uZWxzIiwid2hpdGVsaXN0IiwiZmlsdGVyX2NoYW5uZWxzIiwiYmxhY2tsaXN0IiwidGltZXN0YW1wIiwidG9JU09TdHJpbmciLCJpbmNsdWRlX2xvY2F0aW9uIiwiaW5jbHVkZV9iYWNrdHJhY2UiLCJsb2NhdGlvbiIsImJhY2t0cmFjZSIsImxpbmUiLCJvdXRwdXRzIiwiYnJvd3NlciIsImluY2x1ZGVfYmVuY2htYXJrIiwiX2dldF90aW1lX3ByZWZpeCIsImNoYW5uZWxQcmVmaXgiLCJjb25zb2xlTWV0aG9kIiwibGFyYXZlbF9sb2ciLCJfYmF0Y2hfY29uc29sZV9tZXNzYWdlIiwibG9nX2Vycm9yIiwiZXJyb3JEYXRhIiwiX2Vycm9yX2NvdW50IiwiTUFYX0VSUk9SU19QRVJfUEFHRSIsIl9lcnJvcl9iYXRjaF9jb3VudCIsIk1BWF9FUlJPUl9CQVRDSEVTIiwiX2Vycm9yX2JhdGNoIiwiX2Vycm9yX3RpbWVyIiwiX2ZsdXNoX2Vycm9yX2JhdGNoIiwiREVCT1VOQ0VfTVMiLCJfY29uc29sZV9iYXRjaCIsIl9jb25zb2xlX3RpbWVyIiwiX2ZsdXNoX2NvbnNvbGVfYmF0Y2giLCJSb3V0ZSIsIl9zdGFydF90aW1lIiwiZWxhcHNlZCIsInRvRml4ZWQiLCJfMjdlMGU5ODZfZGVmaW5lUHJvcGVydHkiLCJSc3hfSnFfSGVscGVycyIsImV4aXN0cyIsImlzX3Zpc2libGUiLCJzY3JvbGxfdXBfdG8iLCJzcGVlZCIsImlzX2luX2RvbSIsImVfdG9wIiwic190b3AiLCJleHByIiwiZm9jdXMiLCJlbGVtIiwiYWN0aXZlRWxlbWVudCIsIl9jbGlja19uYXRpdmUiLCJjbGljayIsImhhbmRsZXIiLCJvcmlnaW5hbF9wcmV2ZW50RGVmYXVsdCIsImJpbmQiLCJ3YXJuIiwiY2xpY2tfYWxsb3dfZGVmYXVsdCIsIl9hbmNlc3RvciIsIkhUTUxvYmoiLCJwYXJlbnRFbGVtZW50IiwiZG9jdW1lbnRFbGVtZW50IiwiaXNfaW5fdmlld3BvcnQiLCJzY3JvbGx0b3AiLCJ0b3Bfb2ZfZWxlbWVudCIsImJvdHRvbV9vZl9lbGVtZW50IiwiYm90dG9tX29mX3NjcmVlbiIsImlubmVySGVpZ2h0IiwidG9wX29mX3NjcmVlbiIsInRhZ25hbWUiLCJwcm9wIiwidG9Mb3dlckNhc2UiLCJpc19leHRlcm5hbCIsImhvc3QiLCJsaW5rIiwiaG9zdG5hbWUiLCJjaGVja1ZhbGlkaXR5IiwicmVwb3J0VmFsaWRpdHkiLCJyZXF1ZXN0U3VibWl0IiwiY2xvc2VzdF9zaWJsaW5nIiwic2VsZWN0b3IiLCIkY3VycmVudCIsIiRmb3VuZCIsIm5hdGl2ZV9hamF4Iiwic2V0dGluZ3MiLCJyZXF1ZXN0X3VybCIsImlzX3JlbGF0aXZlIiwiaXNfc2FtZV9kb21haW4iLCJvcmlnaW4iLCJpc19sb2NhbF9yZXF1ZXN0IiwiX19sb2NhbF9pbnRlZ3JhdGlvbiIsImlzX2ZpbGVfdXBsb2FkIiwiZW5kc1dpdGgiLCJjb250cm9sbGVyX25hbWUiLCJhY3Rpb25fbmFtZSIsInVybF9tYXRjaCIsIl9pbml0X2V2ZW50cyIsIl9ldmVudF9oYW5kbGVycyIsIl90cmlnZ2VyZWRfZXZlbnRzIiwidHJpZ2dlcl9yZWZyZXNoIiwiQ29yZV9Mb2ciLCJpc19kZXYiLCJ1aWQiLCJfdWlkIiwiX2RlZmluZV9yb3V0ZXMiLCJyb3V0ZXMiLCJfcm91dGVzIiwicGFyYW1zX29iaiIsInBhdHRlcm4iLCJfZ2VuZXJhdGVfdXJsX2Zyb21fcGF0dGVybiIsInJlcXVpcmVkX3BhcmFtcyIsIm1hdGNoZXMiLCJtaXNzaW5nIiwicmVxdWlyZWQiLCJ1c2VkX3BhcmFtcyIsInBhcmFtX25hbWUiLCJlbmNvZGVkX3ZhbHVlIiwicXVlcnlfcGFyYW1zIiwicXVlcnlfc3RyaW5nIiwiZW50cmllcyIsIl9yZWYiLCJfcnN4X2NhbGxfYWxsX2NsYXNzZXMiLCJhbGxfY2xhc3NlcyIsImNsYXNzZXNfd2l0aF9tZXRob2QiLCJwcm9taXNlX3BpbGUiLCJyZXR1cm5fdmFsdWUiLCJfX3N0b3BwZWQiLCJfcnN4X2NvcmVfYm9vdCIsIl9fYm9vdGVkIiwicGhhc2VzIiwicGhhc2UiLCJfcGFyc2VfaGFzaCIsImhhc2hfc3RyaW5nIiwicGFpcnMiLCJwYWlyIiwiX3NlcmlhbGl6ZV9oYXNoIiwiZ2V0X2FsbF9wYWdlX3N0YXRlIiwiZ2V0X3BhZ2Vfc3RhdGUiLCJfc3RhdGUka2V5Iiwic3RhdGUiLCJzZXRfcGFnZV9zdGF0ZSIsIm5ld19oYXNoIiwicGF0aG5hbWUiLCJoaXN0b3J5IiwicmVwbGFjZVN0YXRlIiwic2V0X2FsbF9wYWdlX3N0YXRlIiwibmV3X3N0YXRlIiwicmVuZGVyX2Vycm9yIiwiJGNvbnRhaW5lciIsImZpbGUiLCJfZXNjYXBlX2h0bWwiLCJkaXYiLCJpbm5lckhUTUwiLCJfZTgyMTFmNWJfZGVmaW5lUHJvcGVydHkiLCJfcGVuZGluZ19jYWxscyIsIl9mbHVzaF90aW1lb3V0IiwiX2NhbGxfY291bnRlciIsIk1BWF9CQVRDSF9TSVpFIiwiX3RyYWNrZWRfcHJvbWlzZXMiLCJXZWFrU2V0IiwiTW9kYWwiLCJwYXRoIiwiYWpheF9kaXNhYmxlX2JhdGNoaW5nIiwiX2NhbGxfZGlyZWN0IiwiX2NhbGxfYmF0Y2giLCJjYWxsX2tleSIsIl9nZW5lcmF0ZV9jYWxsX2tleSIsImV4aXN0aW5nX2NhbGwiLCJpc19jb21wbGV0ZSIsImlzX2Vycm9yIiwiY2FsbGJhY2tzIiwiY2FsbF9pZCIsInBlbmRpbmdfY2FsbCIsInBlbmRpbmdfY291bnQiLCJfZmx1c2hfcGVuZGluZ19jYWxscyIsInN1Y2Nlc3MiLCJfc3VjY2VzcyIsInByb2Nlc3NlZF92YWx1ZSIsIl9hamF4X3JldHVybl92YWx1ZSIsImVycm9yX3R5cGUiLCJmYXRhbF9lcnJvcl9kYXRhIiwiZmF0YWxfZXJyb3IiLCJlbmRwb2ludCIsImF1dGhfZXJyb3IiLCJ1bmF1dGhfZXJyb3IiLCJmb3JtX2Vycm9yIiwiZ2VuZXJpY19lcnJvciIsInhociIsIl9leHRyYWN0X2Vycm9yX21lc3NhZ2UiLCJuZXR3b3JrX2Vycm9yIiwic3RhdHVzVGV4dCIsImNhbGxzX3RvX3NlbmQiLCJjYWxsX21hcCIsImJhdGNoX2NhbGxzIiwicmVzcG9uc2Vfa2V5IiwiY2FsbF9yZXNwb25zZSIsImVycm9yX2RldGFpbHMiLCJfcmVmMiIsInhocl9lcnJvciIsIl9yZWYzIiwic29ydGVkX3BhcmFtcyIsInJlc3BvbnNlSlNPTiIsInJlc3BvbnNlVGV4dCIsIkpxaHRtbF9Db21wb25lbnQiLCJfQmFzZV9KcWh0bWxfQ29tcG9uZW50IiwiSnFodG1sX0ludGVncmF0aW9uIiwiX29uX2ZyYW1ld29ya19tb2R1bGVzX2RlZmluZSIsImpxaHRtbF9jb21wb25lbnRzIiwiY29tcG9uZW50IiwianFodG1sIiwicmVnaXN0ZXJfY29tcG9uZW50IiwiX29uX2ZyYW1ld29ya19tb2R1bGVzX2luaXQiLCIkc2NvcGUiLCJpc190b3BfbGV2ZWwiLCJjb21wb25lbnRzX25lZWRpbmdfaW5pdCIsImNvbnRhaW5zIiwiY2xhc3NMaXN0IiwiY29tcG9uZW50X25hbWUiLCJjb21wb25lbnRfYXJncyIsImFyZ3Nfc3RyaW5nIiwicmVtb3ZlQXR0ciIsInJlbW92ZURhdGEiLCJjb21wb25lbnRfYXJnc19maWx0ZXJlZCIsIl9pbm5lcl9odG1sIiwiY29tcG9uZW50X3Byb21pc2UiLCJuZXN0ZWRfcHJvbWlzZXMiLCJnZXRfY29tcG9uZW50X25hbWVzIiwiaGFzX2NvbXBvbmVudCIsIkRhdGFHcmlkX0Fic3RyYWN0Iiwib25fY3JlYXRlIiwicm93cyIsImxvYWRpbmciLCJpc19lbXB0eSIsImxvYWRlZCIsInRvdGFsX3BhZ2VzIiwib25fcmVhZHkiLCJfdGhhdCRhcmdzJHBlcl9wYWdlIiwiX3RoYXQkYXJncyRzb3J0IiwiX3RoYXQkYXJncyRvcmRlciIsImRhdGFfc291cmNlIiwiZGVmYXVsdF9wYWdlIiwiZGVmYXVsdF9wZXJfcGFnZSIsInBlcl9wYWdlIiwiZGVmYXVsdF9zb3J0IiwiZGVmYXVsdF9vcmRlciIsIm9yZGVyIiwiZGVmYXVsdF9maWx0ZXIiLCJoYXNoX3BhZ2UiLCJfY2lkIiwiaGFzaF9zb3J0IiwiaGFzaF9vcmRlciIsImhhc2hfZmlsdGVyIiwicGFnZSIsInJlZ2lzdGVyX3JlbmRlcl9jYWxsYmFja3MiLCJyZWdpc3Rlcl9maWx0ZXJfaGFuZGxlcnMiLCIkZmlsdGVyIiwiJGlkIiwibWVhc3VyZV9hbmRfc2V0X2ZpeGVkX2hlaWdodCIsImxvYWRfcGFnZSIsInVwZGF0ZV9oZWFkZXIiLCJfbGFzdF9oZWFkZXJfc3RhdGUiLCJjdXJyZW50IiwicmVuZGVyIiwidXBkYXRlX3BhZ2luYXRpb24iLCJfbGFzdF9wYWdpbmF0aW9uX3N0YXRlIiwidG90YWwiLCJyZWNvcmRzIiwic2Nyb2xsX3RvX3RvcF9pZl9uZWVkZWQiLCIkcm93IiwiJGNvbCIsIiRjaGlsZHJlbiIsImNoaWxkcmVuIiwiJHRoIiwic29ydGJ5IiwiJGV4aXN0aW5nX2xpbmsiLCJjb250ZW50cyIsImVuZCIsImFycm93Iiwic29ydF9ieSIsImhhc0NsYXNzIiwiJGNsZWFyX2J0biIsImNsZWFyX2ZpbHRlciIsImNvbHVtbiIsImZpbHRlcl92YWx1ZSIsImZpbHRlcl9jaGFuZ2VkIiwiJGRhdGFncmlkIiwiZGF0YWdyaWRUb3AiLCJzY3JvbGxUbyIsImJlaGF2aW9yIiwiJHRib2R5IiwiJG1lYXN1cmVtZW50X3JvdyIsImFwcGVuZCIsInJvd19oZWlnaHQiLCJtaW5faGVpZ2h0IiwidGJvZHlfbWluX2hlaWdodCIsIkFjdGl2aXR5X0ZlZWQiLCJvbl9sb2FkIiwiYWN0aXZpdGllcyIsImF1dG9fcmVmcmVzaCIsInN0YXJ0X2F1dG9fcmVmcmVzaCIsImludGVydmFsIiwicmVmcmVzaF9pbnRlcnZhbCIsInJlZnJlc2hfdGltZXIiLCJzZXRJbnRlcnZhbCIsInJlbG9hZF9kYXRhIiwic3RvcF9hdXRvX3JlZnJlc2giLCJjbGVhckludGVydmFsIiwiQWN0b3JfUmVmZXJlbmNlIiwiQWR2YW5jZWRfU2VhcmNoX1BhbmVsIiwiY2F0ZWdvcmllcyIsInNldF9vcHRpb25zIiwidGFncyIsInBlcmZvcm1fc2VhcmNoIiwib25fY2xvc2UiLCJjcml0ZXJpYSIsImtleXdvcmRzIiwiZ2V0X3ZhbHVlIiwiY2F0ZWdvcnkiLCJmcm9tX2RhdGUiLCJ0b19kYXRlIiwiZXhhY3RfbWF0Y2giLCJvbl9zZWFyY2giLCJzZXRfdmFsdWUiLCJvbl9yZXNldCIsIkFsZXJ0X0Jhbm5lciIsImRpc21pc3NpYmxlIiwiQXZhdGFyIiwic2l6ZSIsInNpemVfbWFwIiwic2hvd19pbml0aWFscyIsImluaXRpYWxzIiwiJGRpdiIsInJlcGxhY2VXaXRoIiwiQmxvY2txdW90ZSIsIkJyZWFkY3J1bWJzIiwiQnVsa19BY3Rpb25fQmFyIiwiJHRhYmxlIiwic2V0X2NvdW50IiwiQnVsa19TZWxlY3Rpb24iLCIkY2hlY2tib3giLCJjaGVja2VkIiwib25fY2hhbmdlIiwiQnV0dG9uX0dyb3VwIiwiQnV0dG9uX1ByaW1hcnkiLCJCdXR0b25fU2Vjb25kYXJ5IiwiQnV0dG9uIiwiQ2FsZW5kYXJfRXZlbnQiLCJvbl9jbGljayIsIkNhbGVuZGFyX0dyaWQiLCJjdXJyZW50X2RhdGUiLCJyZW5kZXJfY2FsZW5kYXIiLCJzZXRNb250aCIsImdldE1vbnRoIiwieWVhciIsImdldEZ1bGxZZWFyIiwibW9udGgiLCJtb250aF9uYW1lcyIsImZpcnN0X2RheSIsImdldERheSIsImRheXNfaW5fbW9udGgiLCJnZXREYXRlIiwiZGF5IiwiJHRyIiwiaiIsIiR0ZCIsIiRkYXlfbnVtIiwidG9kYXkiLCJldmVudHMiLCJnZXRfZXZlbnRzX2Zvcl9kYXRlIiwiJGV2ZW50IiwidGl0bGUiLCJvbl9ldmVudF9jbGljayIsInBhZFN0YXJ0Iiwib25fZGF0ZV9jbGljayIsImRhdGVfc3RyIiwiQ2FyZCIsIkNoYXJ0X0NvbXBvbmVudCIsIkNoZWNrYm94IiwiZGlzYWJsZWQiLCJDb2RlX0Jsb2NrIiwiQ29sdW1uX1Zpc2liaWxpdHlfVG9nZ2xlIiwiY29sdW1ucyIsImJ1aWxkX21lbnUiLCIkbWVudSIsIiRsaSIsIiRsYWJlbCIsInZpc2libGUiLCJsYWJlbCIsInRvZ2dsZV9jb2x1bW4iLCJvbl90b2dnbGUiLCJ0YWJsZSIsInNob3ciLCJzZXRfY29sdW1ucyIsIkNvbW1lbnRfVGhyZWFkIiwiY29tbWVudHMiLCJzdWJtaXRfY29tbWVudCIsIiRjb21tZW50IiwiY29tbWVudF9pZCIsInNob3dfcmVwbHlfZm9ybSIsImVkaXRfY29tbWVudCIsImRlbGV0ZV9jb21tZW50Iiwib25fc3VibWl0Iiwib25fZWRpdCIsImNvbmZpcm0iLCJvbl9kZWxldGUiLCJEYXRlX1BpY2tlciIsInJlYWRvbmx5IiwiRHJvcGRvd25fTWVudSIsIiRjaGlsZCIsIkVtcHR5X1N0YXRlIiwiRXhwb3J0X0J1dHRvbiIsImZvcm1hdCIsImN1cnJlbnRUYXJnZXQiLCJleHBvcnRfZGF0YSIsIm9uX2V4cG9ydCIsImF1dG9fZXhwb3J0IiwiZXhwb3J0X3VybCIsImV4cG9ydF9jc3YiLCJleHBvcnRfanNvbiIsImhlYWRlcnMiLCJjc3YiLCJyb3ciLCJoZWFkZXIiLCJibG9iIiwiQmxvYiIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsIiRhIiwicmV2b2tlT2JqZWN0VVJMIiwiRmlsZV9VcGxvYWQiLCIkZHJvcF96b25lIiwiYWNjZXB0IiwibXVsdGlwbGUiLCJmaWxlcyIsImhhbmRsZV9maWxlcyIsInN0b3BQcm9wYWdhdGlvbiIsIm9yaWdpbmFsRXZlbnQiLCJkYXRhVHJhbnNmZXIiLCJtYXhfc2l6ZV9ieXRlcyIsImFsZXJ0IiwiZm9ybWF0X3NpemUiLCJzZWxlY3RlZF9maWxlIiwidXBsb2FkX3VybCIsInVwbG9hZCIsIm9uX3NlbGVjdCIsIkZvcm1EYXRhIiwiYm9keSIsIm9uX3VwbG9hZCIsIm9uX2NsZWFyIiwiZ2V0X2ZpbGUiLCJieXRlcyIsIkZpbHRlcl9CYXIiLCJhY3RpdmVfZmlsdGVycyIsInN0YXR1c19vcHRpb25zIiwiJHN0YXR1cyIsIm9wdCIsInNlYXJjaF90aW1lb3V0IiwiYWRkX2ZpbHRlciIsImFwcGx5X2ZpbHRlcnMiLCJjbGVhcl9maWx0ZXJzIiwidXBkYXRlX2ZpbHRlcl9kaXNwbGF5IiwiZGF0ZV9yYW5nZSIsInN0YXJ0X2RhdGUiLCJlbmRfZGF0ZSIsIm9uX2FwcGx5IiwiJHRhZ3MiLCIkdGFnIiwiJHJlbW92ZSIsImdldF9maWx0ZXJzIiwiRm9ybV9BY3Rpb25zX0NvbXBvbmVudCIsIm9uX2NsaWNrX2hlbGxvIiwiRm9ybV9GaWVsZF9Hcm91cCIsImNvbGxhcHNpYmxlIiwibWFrZV9jb2xsYXBzaWJsZSIsIiRoZWFkZXIiLCIkYm9keSIsImNvbGxhcHNlX2lkIiwicmFuZG9tIiwic3Vic3RyIiwiJHRvZ2dsZSIsIkZvcm1fR3JvdXBfQ29tcG9uZW50IiwiY29sX2NsYXNzIiwiRm9ybV9Sb3dfQ29tcG9uZW50IiwiRm9ybV9WYWxpZGF0aW9uX01lc3NhZ2UiLCJHYW50dF9DaGFydCIsInRhc2tzIiwibW9udGhzIiwiZ2VuZXJhdGVfbW9udGhzIiwiSWNvbl9CdXR0b24iLCJJY29uX1dpdGhfTGFiZWwiLCJJY29uX1dpdGhfVGV4dCIsIkljb24iLCJJbmZvX0JveCIsImNvbG9yIiwiSW5saW5lX0VkaXRfRmllbGQiLCJjdXJyZW50X3ZhbHVlIiwiZW50ZXJfZWRpdF9tb2RlIiwic2F2ZSIsImNhbmNlbCIsInNlbGVjdCIsImV4aXRfZWRpdF9tb2RlIiwibmV3X3ZhbHVlIiwib25fc2F2ZSIsInNob3dfc2F2aW5nIiwidXBkYXRlX2Rpc3BsYXkiLCJjYXRjaCIsImRpc3BsYXkiLCJwbGFjZWhvbGRlciIsIklucHV0X1dpdGhfSWNvbiIsIm9uX2lucHV0IiwiSW5wdXRfV2l0aF9WYWxpZGF0aW9uIiwidmFsaWRhdGUiLCJzZXRfdmFsaWQiLCJzZXRfZXJyb3IiLCIkc3VjY2VzcyIsImNsZWFyX3ZhbGlkYXRpb24iLCJJbnB1dCIsIkthbmJhbl9Cb2FyZCIsInNldHVwX2RyYWdfYW5kX2Ryb3AiLCJkcmFnZ2VkX2NhcmQiLCIkY2FyZCIsIiRjb2x1bW4iLCJvbl9tb3ZlIiwiY2FyZF9pZCIsImNvbHVtbl9pZCIsIkxpbmsiLCJMaXN0IiwiTG9hZGluZ19Ta2VsZXRvbiIsImxpbmVzIiwiJHNwYW4iLCJNZXRyaWNfQ2FyZCIsIk1vYmlsZV9IZWFkZXIiLCJNb2RhbF9EaWFsb2ciLCJtb2RhbCIsImJvb3RzdHJhcCIsIk11bHRpX1NlbGVjdCIsInNlbGVjdGVkX3ZhbHVlcyIsImFsbF9vcHRpb25zIiwicmVuZGVyX29wdGlvbnMiLCIkc2VhcmNoIiwiZmlsdGVyX29wdGlvbnMiLCJjbGVhcl9hbGwiLCJzZWxlY3RfYWxsIiwib3B0aW9uIiwidG9nZ2xlX29wdGlvbiIsInF1ZXJ5IiwiZmlsdGVyZWQiLCIkdGV4dCIsImVsIiwiTm90aWZpY2F0aW9uX0JhZGdlIiwiJGNvdW50IiwiTm90aWZpY2F0aW9uX0Ryb3Bkb3duIiwiT3ZlcmR1ZV9JbmRpY2F0b3IiLCJQYWdlX0hlYWRlciIsIlBhZ2VfU2VjdGlvbiIsIlBhZ2UiLCJQb3BvdmVyIiwiY29udGVudCIsIlByb2dyZXNzX0JhciIsIiRiYXIiLCJzaG93X3ZhbHVlIiwiUmFkaW9fQnV0dG9uIiwiUmljaF9UZXh0X0VkaXRvciIsIiRlZGl0b3IiLCJjb21tYW5kIiwicHJvbXB0IiwiZXhlY0NvbW1hbmQiLCJwbGFpbl90ZXh0X3Bhc3RlIiwiZ2V0RGF0YSIsImdldF90ZXh0IiwiUm93X0FjdGlvbl9NZW51Iiwid3JhcCIsIlNhbXBsZV9EYXRhZ3JpZF9Db21wb25lbnQiLCJhcGlfdXJsIiwiZ2VuZXJhdGVfc2FtcGxlX2RhdGEiLCJzZWxlY3RhYmxlIiwidXBkYXRlX3NlbGVjdGlvbl9jb3VudCIsImFsbG93X2RlbGV0ZSIsIiRidXR0b24iLCJjb25maXJtX2RlbGV0ZSIsInBhZ2luYXRpb24iLCJnb190b19wYWdlIiwiY3VycmVudF9wYWdlIiwic2VsZWN0ZWQiLCJnZXRfc2VsZWN0ZWRfaWRzIiwiaWRzIiwiY2hlY2tib3giLCJjbGVhcl9zZWxlY3Rpb24iLCJkZWxldGVfcm93Iiwic3RhdHVzZXMiLCJmaXJzdF9uYW1lcyIsImxhc3RfbmFtZXMiLCJjb21wYW5pZXMiLCJzaG93aW5nIiwiZmlyc3RfbmFtZSIsImZsb29yIiwibGFzdF9uYW1lIiwiY29tcGFueSIsInBob25lIiwic3RhdHVzX2NvbG9yIiwiY3JlYXRlZCIsInJhbmRvbV9kYXRlIiwiY2VpbCIsInRvIiwicGFnZXMiLCJTZWFyY2hfQmFyIiwiU2VhcmNoYWJsZV9TZWxlY3QiLCJzZWxlY3RlZF92YWx1ZSIsInNlbGVjdGVkX29wdGlvbiIsIiRpdGVtIiwic2VsZWN0X29wdGlvbiIsImRyb3Bkb3duIiwiRHJvcGRvd24iLCJnZXRJbnN0YW5jZSIsIlNlbGVjdF9Ecm9wZG93biIsIlNpZGViYXJfTmF2IiwiJG5hdl9pdGVtcyIsImN1cnJlbnRfcGF0aCIsIlNvcnRhYmxlX0NvbHVtbl9IZWFkZXIiLCJ0b2dnbGVfc29ydCIsInNldF9zb3J0IiwibmV4dCIsIm9uX3NvcnQiLCJkaXJlY3Rpb24iLCIkaWNvbiIsIlNwaW5uZXIiLCJTdGF0X0NhcmQiLCJTdGF0dXNfQmFkZ2UiLCJjb2xvcl9tYXAiLCJiZ19jbGFzcyIsIlRhYl9Db250ZW50IiwiVGFibGVfUGFnaW5hdGlvbiIsImdlbmVyYXRlX3BhZ2luYXRpb24iLCIkcGFnaW5hdGlvbiIsIiRwcmV2Iiwic3RhcnQiLCIkbmV4dCIsIlRhYmxlIiwidmFyaWFudCIsIlRhYnMiLCJUYWdfR3JvdXAiLCJUYWciLCJUZXh0X0Rpc3BsYXkiLCJUZXh0YXJlYSIsIlRocmVlX0NvbHVtbl9MYXlvdXQiLCJUaW1lX1BpY2tlciIsInN0ZXAiLCJUaW1lbGluZSIsIlRpbWVzdGFtcF9EaXNwbGF5IiwiVG9vbHRpcCIsInBsYWNlbWVudCIsIlRvcF9OYXYiLCIkbmF2IiwiVHJlbmRfSW5kaWNhdG9yIiwiaXNfcG9zaXRpdmUiLCJpc19uZWdhdGl2ZSIsIlR3b19Db2x1bW5fTGF5b3V0IiwiVXNlcl9BdmF0YXJfRHJvcGRvd24iLCJNb2RhbF9BYnN0cmFjdCIsIlJzeF9Nb2RhbCIsImJvZHlfY29udGVudCIsImJ1dHRvbnMiLCJjbG9zYWJsZSIsIm1heF93aWR0aCIsImNsb3NlX29uX3N1Ym1pdCIsInJlc3VsdF9wcm9taXNlIiwicmVzb2x2ZV9mbiIsIl9ic19tb2RhbCIsIl9yZXNpemVfaGFuZGxlciIsImNsb3NlIiwiX2FwcGx5X3NpemluZyIsImludGVybmFsX29wdGlvbnMiLCJza2lwX2JhY2tkcm9wIiwic2hvdWxkX2FuaW1hdGUiLCJpY29uIiwiX3NldF9ib2R5X2NvbnRlbnQiLCJfc2V0X2J1dHRvbnMiLCJfZmFkZV9pbiIsIl9mb2N1c19maXJzdF9pbnB1dCIsIiRjb250ZW50IiwiZXNjYXBlZCIsImpRdWVyeSIsIiRmb290ZXIiLCJidXR0b25fZGVmIiwiaGFkX2NhbGxiYWNrIiwidmlld3BvcnRfaGVpZ2h0Iiwidmlld3BvcnRfbGltaXQiLCJwcmVmZXJyZWRfd2lkdGgiLCJjb250ZW50X2hlaWdodCIsIm1heF9oZWlnaHQiLCJvZmZzZXRIZWlnaHQiLCIkZmlyc3RfaW5wdXQiLCJvZmYiLCJhcHBseV9lcnJvcnMiLCJfaW5pdCIsIl9pbml0aWFsaXplZCIsIl9iYWNrZHJvcCIsIl9nZXRfc2Nyb2xsYmFyX3dpZHRoIiwiJG91dGVyIiwidmlzaWJpbGl0eSIsIm92ZXJmbG93Iiwid2lkdGhfd2l0aF9zY3JvbGxiYXIiLCJvZmZzZXRXaWR0aCIsIiRpbm5lciIsIndpZHRoX3dpdGhvdXRfc2Nyb2xsYmFyIiwiX2xvY2tfYm9keV9zY3JvbGwiLCJfdW5sb2NrX3RpbWVvdXQiLCJfb3JpZ2luYWxfYm9keV9vdmVyZmxvdyIsIl9vcmlnaW5hbF9ib2R5X3BhZGRpbmciLCJoYXNfc2Nyb2xsYmFyIiwic2Nyb2xsYmFyX3dpZHRoIiwiY3VycmVudF9wYWRkaW5nIiwiX3VubG9ja19ib2R5X3Njcm9sbCIsIl9jdXJyZW50IiwiX3F1ZXVlIiwiX3Nob3dfYmFja2Ryb3AiLCJfaGlkZV9iYWNrZHJvcCIsIl9jcmVhdGVfbW9kYWwiLCIkbW9kYWxfZWxlbWVudCIsIm1vZGFsX2luc3RhbmNlIiwiZm9vdGVyIiwiX3Nob3dfbW9kYWwiLCJfcHJvY2Vzc19xdWV1ZSIsImJhY2tkcm9wX3Zpc2libGUiLCJ0aW1lX3NpbmNlX2xhc3RfY2xvc2UiLCJfbGFzdF9jbG9zZV90aW1lc3RhbXAiLCJpc19vcGVuIiwiZ2V0X2N1cnJlbnQiLCJ0aXRsZV9vcl9ib2R5IiwiYnV0dG9uX2xhYmVsIiwiZGVmYXVsdCIsImNvbmZpcm1fbGFiZWwiLCJjYW5jZWxfbGFiZWwiLCJkZWZhdWx0X3ZhbHVlIiwibXVsdGlsaW5lIiwiZGVmYXVsdHMiLCJmaW5hbF9vcHRpb25zIiwiZm9ybSIsInN1Ym1pdF9sYWJlbCIsIiRjb21wb25lbnRfY29udGFpbmVyIiwiY29tcG9uZW50X2luc3RhbmNlIiwidmFscyIsInN1Ym1pdCIsInVuY2xvc2FibGUiLCJjdXN0b20iLCJlcnJvcl9tZXNzYWdlcyIsInJlb3Blbl93aXRoX2Vycm9ycyIsIl9kMWY1YTNjYl9kZWZpbmVQcm9wZXJ0eSIsIkJyZWFkY3J1bWJfSXRlbSIsIkNsaWVudF9MYWJlbF9MaW5rIiwiY2xpZW50IiwiY2xpZW50X2lkIiwiRnJvbnRlbmRfQ29udGFjdHNfQ29udHJvbGxlciIsImdldF9jbGllbnQiLCJvbl9yZW5kZXIiLCJDbGllbnRfTGFiZWwiLCJGb3JtX0lucHV0X0Fic3RyYWN0Iiwic2VlZCIsIlRleHRfSW5wdXQiLCJzZWVkZXIiLCJDaGVja2JveF9JbnB1dCIsImNoZWNrZWRfdmFsdWUiLCJ1bmNoZWNrZWRfdmFsdWUiLCJpbnB1dF9pZCIsImlzX2NoZWNrZWQiLCJzaG91bGRfY2hlY2siLCJXeXNpd3lnX0lucHV0IiwicXVpbGwiLCJxdWlsbF9yZWFkeSIsIl9pbml0aWFsaXplX3F1aWxsIiwiUXVpbGwiLCJ0aGVtZSIsIm1vZHVsZXMiLCJ0b29sYmFyIiwicm9vdCIsInNhbXBsZV9jb250ZW50IiwiU2VsZWN0X0lucHV0IiwiZGVjb2RlZCIsImFsbG93RW1wdHlPcHRpb24iLCJjcmVhdGUiLCJtYXhPcHRpb25zIiwicGx1Z2lucyIsIm9uSW5pdGlhbGl6ZSIsImNvbnRyb2wiLCJ0b21fc2VsZWN0IiwiVG9tU2VsZWN0Iiwic2V0VmFsdWUiLCJnZXRWYWx1ZSIsInJhbmRvbV9pbmRleCIsInJhbmRvbV9vcHQiLCJyYW5kb21fdmFsdWUiLCJvbl9kZXN0cm95IiwiZGVzdHJveSIsIkFqYXhfU2VsZWN0X0lucHV0Iiwic2VsZWN0X3ZhbHVlcyIsIl9wZW5kaW5nX3ZhbHVlIiwib2siLCJDdXJyZW5jeV9JbnB1dCIsImFsbG93X2RlY2ltYWxzIiwic2hvd19zeW1ib2wiLCJjdXJyZW5jeV9zeW1ib2wiLCJfZm9ybWF0X2N1cnJlbmN5IiwiaW50ZWdlcl9wYXJ0IiwiZGVjaW1hbF9wYXJ0IiwiZm9ybWF0dGVkIiwiX2dldF9udW1lcmljX3ZhbHVlIiwiY2xlYW5lZCIsImRlY2ltYWxfY291bnQiLCJmaXJzdF9kZWNpbWFsIiwicmF3IiwibnVtZXJpYyIsImlucHV0X2VsZW1lbnQiLCJjdXJzb3JfcG9zIiwic2VsZWN0aW9uU3RhcnQiLCJjdXJzb3JfZW5kIiwic2VsZWN0aW9uRW5kIiwidmFsdWVfbGVuZ3RoIiwiY2hhcl9iZWZvcmUiLCJuZXdfbnVtZXJpYyIsIm5ld19sZW5ndGgiLCJzZXRTZWxlY3Rpb25SYW5nZSIsInN5bWJvbF9vZmZzZXQiLCJuZXdfY3Vyc29yIiwiaW5pdGlhbF92YWx1ZSIsIlBob25lX1RleHRfSW5wdXQiLCJfaXNfaW50ZXJuYXRpb25hbCIsIl9jaGVja19pbnRlcm5hdGlvbmFsX21vZGUiLCJfZm9ybWF0X3VzX3Bob25lIiwiZGlnaXRzIiwic3RyX3ZhbHVlIiwiZGlnaXRzX3RvX2Zvcm1hdCIsIl9sYXN0X2N1cnNvcl9wb3NpdGlvbiIsIm5ld19kaWdpdHMiLCJTdGF0ZV9TZWxlY3RfSW5wdXQiLCJjb3VudHJ5X2NvZGUiLCJSc3hfUmVmZXJlbmNlX0RhdGFfQ29udHJvbGxlciIsInN0YXRlcyIsImNvdW50cnkiLCJfc3RhdGVfY2FjaGUiLCJpc19uYSIsImRpc2FibGUiLCJzZXRfY291bnRyeV9jb2RlIiwiY3VycmVudF9jb3VudHJ5IiwicmVkcmF3IiwiY2FjaGVkX3ZhbHVlIiwidmFsdWVfZXhpc3RzIiwiZW5hYmxlIiwiQ291bnRyeV9TZWxlY3RfSW5wdXQiLCJjb3VudHJpZXMiLCJkZWZhdWx0X2NvdW50cnkiLCJkZWZhdWx0X2NvdW50cnlfY29kZSIsImRlZmF1bHRfY291bnRyeV9pbmRleCIsImZpbmRJbmRleCIsInVuc2hpZnQiLCJfdXBkYXRlX3N0YXRlX3NlbGVjdG9yIiwic3RhdGVfY29tcG9uZW50IiwiUHJvZmlsZV9QaG90b19JbnB1dCIsImF0dGFjaG1lbnRfa2V5IiwidGh1bWJuYWlsX3VybCIsInVwbG9hZF9waG90byIsInNob3dfcmVtb3ZlIiwicmVtb3ZlX3Bob3RvIiwibWF4X3NpemUiLCJwcm9jZXNzRGF0YSIsImNvbnRlbnRUeXBlIiwiYXR0YWNobWVudCIsIl94aHIkcmVzcG9uc2VKU09OIiwidXBkYXRlX3Bob3RvIiwiUnN4X1RhYnMiLCJ0YWJzIiwiYWN0aXZlX3RhYl9pZCIsIl9idWlsZF9uYXYiLCJ0YWJfaWQiLCJhY3RpdmF0ZV90YWIiLCJyZWdpc3Rlcl90YWIiLCJ0YWJfY29tcG9uZW50IiwidGFiIiwiaXNfYWN0aXZlIiwidCIsImhhbmRsZV92YWxpZGF0aW9uX2Vycm9ycyIsInRhYl9lcnJvcnMiLCJlcnJvcl9jb3VudCIsImNvdW50X2Vycm9ycyIsIiRiYWRnZSIsImZpcnN0X2Vycm9yZWRfdGFiIiwiY2xlYXJfZXJyb3JfYmFkZ2VzIiwiUnN4X1RhYiIsInRhYnNfY29udGFpbmVyIiwiZmllbGRzIiwiZWxlbWVudCIsImZpZWxkX2NvbXBvbmVudCIsIlJzeF9Gb3JtIiwidGFic19lbCIsInNoYWxsb3dGaW5kIiwiJHdpZGdldCIsIndpZGdldF9uYW1lIiwiZ2V0X2Vycm9yIiwiYWpheF91cmwiLCJyZWRpcmVjdCIsIlBpbl9WZXJpZmljYXRpb25fRm9ybSIsInBpbl9sZW5ndGgiLCJwaW4iLCJmaXJzdF9lbXB0eSIsIl9maW5kX2ZpcnN0X2VtcHR5X2luZGV4IiwiX2ZvY3VzX2lucHV0IiwiX2hhbmRsZV9wYXN0ZSIsInN0YXJ0X2luZGV4IiwicGFzdGUiLCJuZXh0X2luZGV4IiwiRm9ybV9GaWVsZF9BYnN0cmFjdCIsImhhc19lcnJvciIsIndpZGdldF9jb21wb25lbnQiLCJGb3JtX0ZpZWxkIiwiRm9ybV9IaWRkZW5fRmllbGQiLCJTaWdudXBfSW5kZXgiLCJ1c2VyX2pzb24iLCJ1c2VyIiwiTG9naW5fSW5kZXgiLCJvbl9hcHBfcmVhZHkiLCIkc3VibWl0X2J1dHRvbiIsIiRlbWFpbCIsIiRwYXNzd29yZCIsInBhc3N3b3JkIiwiQWNjZXB0X0ludml0ZV9JbmRleCIsImNvZGUiLCJBY2NlcHRfSW52aXRlX0NvbnRyb2xsZXIiLCJyZWRpcmVjdF91cmwiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsU0FBU0EsQ0FBQ0MsS0FBSyxFQUFFO0VBQ3RCLE9BQU9BLEtBQUs7QUFDaEI7Ozs7OztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNDLFNBQVNBLENBQUEsRUFBRztFQUNqQixJQUFJLGdFQUFnRSxDQUFDQyxJQUFJLENBQUNDLFNBQVMsQ0FBQ0MsU0FBUyxDQUFDLEVBQUU7SUFDNUYsT0FBTyxJQUFJO0VBQ2YsQ0FBQyxN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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUMxS0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDSEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDSEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDSEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQy9DQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNsRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNKQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDRkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDSEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0xBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ1RBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ05BO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNwQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDcENBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNMQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDTEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0pBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDUEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNQQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDRkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDSEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ1JBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDekVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDUEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDSEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUMxTUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0xBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDbkJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ1pBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDVkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ2hDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNqQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUN4Q0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDTkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ1hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ3BDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNoREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDSEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNKQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0pBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNqQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDbEJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDbkJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNGQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQzNDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDTEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNQQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNmQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDakJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDdEJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNSQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDdkJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNMQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDTEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0xBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDVkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0ZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUN4REE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ1hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUN2TkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDVEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDSEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0ZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNqQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDSEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDVEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNQQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDUkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDSEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0xBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNMQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ1ZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDbkJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDbkJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ0hBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ1pBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDOVVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDbENBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ2xCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNyQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ3RCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ3hCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUM1REE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDOUJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDdkNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ3hCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ2hCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNuQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNwQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUN0REE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQ2hDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQzVCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDeENBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FDbEJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUMzQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUNsQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDcklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHIiwiZmlsZSI6ImJ1bmRsZV9vdXRwdXRfTG9naW5fQnVuZGxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gTlBNIEltcG9ydCBEZWNsYXJhdGlvbnMgZm9yIEFwcCBCdW5kbGVcbi8vIEF1dG8tZ2VuZXJhdGVkIHRvIHByb3ZpZGUgTlBNIG1vZHVsZXMgdG8gYXBwIGJ1bmRsZSBzY29wZVxuLy8gQ2FjaGUga2V5OiA5NWE2ZjYwMmM5ODAzNzYxMWI2NDBiMGI1MzQyODMwYlxuXG5jb25zdCBqcWh0bWwgPSB3aW5kb3cuX3JzeF9ucG0uanFodG1sO1xuaWYgKCFqcWh0bWwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdSU1ggRnJhbWV3b3JrIEVycm9yOiBOUE0gbW9kdWxlIFwianFodG1sXCIgbm90IGZvdW5kLlxcbicgK1xuICAgICAgICAnRXhwZWN0ZWQgd2luZG93Ll9yc3hfbnBtLmpxaHRtbCB0byBiZSBkZWZpbmVkIGJ5IHRoZSB2ZW5kb3IgYnVuZGxlLidcbiAgICApO1xufVxuXG5jb25zdCBfQmFzZV9KcWh0bWxfQ29tcG9uZW50ID0gd2luZG93Ll9yc3hfbnBtLl9CYXNlX0pxaHRtbF9Db21wb25lbnQ7XG5pZiAoIV9CYXNlX0pxaHRtbF9Db21wb25lbnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdSU1ggRnJhbWV3b3JrIEVycm9yOiBOUE0gbW9kdWxlIFwiX0Jhc2VfSnFodG1sX0NvbXBvbmVudFwiIG5vdCBmb3VuZC5cXG4nICtcbiAgICAgICAgJ0V4cGVjdGVkIHdpbmRvdy5fcnN4X25wbS5fQmFzZV9KcWh0bWxfQ29tcG9uZW50IHRvIGJlIGRlZmluZWQgYnkgdGhlIHZlbmRvciBidW5kbGUuJ1xuICAgICk7XG59XG5cbi8vIENsZWFuIHVwIE5QTSBjb250YWluZXIgdG8gcHJldmVudCBjb25zb2xlIGFjY2Vzc1xuZGVsZXRlIHdpbmRvdy5fcnN4X25wbTtcbiIsIi8qKlxuICogRGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgbWFya3MgYSBmdW5jdGlvbiBhcyBhIGRlY29yYXRvciBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBXaGVuIGEgZnVuY3Rpb24gaGFzIEBkZWNvcmF0b3IgaW4gaXRzIEpTRG9jIGNvbW1lbnQsIGl0IHdoaXRlbGlzdHMgdGhhdCBmdW5jdGlvblxuICogdG8gYmUgdXNlZCBhcyBhIGRlY29yYXRvciBvbiBvdGhlciBtZXRob2RzIHRocm91Z2hvdXQgdGhlIGNvZGViYXNlLlxuICpcbiAqIFRoZSBmdW5jdGlvbiBpdHNlbGYgcGVyZm9ybXMgbm8gb3BlcmF0aW9uIC0gaXQgc2ltcGx5IHJldHVybnMgaXRzIGlucHV0IHVuY2hhbmdlZC5cbiAqIEl0cyBwdXJwb3NlIGlzIHB1cmVseSBhcyBhIG1hcmtlciBmb3IgdGhlIG1hbmlmZXN0IHZhbGlkYXRpb24gc3lzdGVtLlxuICpcbiAqIFVzYWdlOlxuICogICAvLyAvKipcbiAqICAgLy8gICogTXkgY3VzdG9tIGRlY29yYXRvciBpbXBsZW1lbnRhdGlvblxuICogICAvLyAgKiBAZGVjb3JhdG9yXG4gKiAgIC8vICAqXFwvXG4gKiAgIGZ1bmN0aW9uIG15X2N1c3RvbV9kZWNvcmF0b3IodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpIHtcbiAqICAgICAgIC8vIERlY29yYXRvciBpbXBsZW1lbnRhdGlvblxuICogICB9XG4gKlxuICogVGhpcyBhbGxvd3MgbXlfY3VzdG9tX2RlY29yYXRvciB0byBiZSB1c2VkIGFzIEBteV9jdXN0b21fZGVjb3JhdG9yIG9uIHN0YXRpYyBtZXRob2RzLlxuICpcbiAqIFRPRE86IFRoaXMgaXMgcHJvYmFibHkgbm8gbG9uZ2VyIG5lY2Vzc2FyeT8gbWF5YmU/XG4gKi9cbmZ1bmN0aW9uIGRlY29yYXRvcih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbn1cbiIsIi8qXG4gKiBCcm93c2VyIGFuZCBET00gdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRoZSBSU3BhZGUgZnJhbWV3b3JrLlxuICogVGhlc2UgZnVuY3Rpb25zIGhhbmRsZSBicm93c2VyIGRldGVjdGlvbiwgdmlld3BvcnQgdXRpbGl0aWVzLCBhbmQgRE9NIG1hbmlwdWxhdGlvbi5cbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCUk9XU0VSIERFVEVDVElPTlxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIERldGVjdHMgaWYgdXNlciBpcyBvbiBhIG1vYmlsZSBkZXZpY2Ugb3IgdXNpbmcgbW9iaWxlIHZpZXdwb3J0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb2JpbGUgZGV2aWNlIG9yIHZpZXdwb3J0IDwgOTkycHhcbiAqIEB0b2RvIEltcHJvdmUgdXNlciBhZ2VudCBkZXRlY3Rpb24gZm9yIGFsbCBtb2JpbGUgZGV2aWNlc1xuICovXG5mdW5jdGlvbiBpc19tb2JpbGUoKSB7XG4gICAgaWYgKC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCQod2luZG93KS53aWR0aCgpIDwgOTkyKSB7XG4gICAgICAgIC8vIDk5MnB4ID0gYm9vdHN0cmFwIDQgY29sLW1kLVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vKipcbiAqIERldGVjdHMgaWYgdXNlciBpcyBvbiBkZXNrdG9wIChub3QgbW9iaWxlKVxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgbm90IG1vYmlsZSBkZXZpY2Uvdmlld3BvcnRcbiAqL1xuZnVuY3Rpb24gaXNfZGVza3RvcCgpIHtcbiAgICByZXR1cm4gIWlzX21vYmlsZSgpO1xufVxuXG4vKipcbiAqIERldGVjdHMgdGhlIHVzZXIncyBvcGVyYXRpbmcgc3lzdGVtXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBPUyBuYW1lOiAnTWFjIE9TJywgJ2lQaG9uZScsICdpUGFkJywgJ1dpbmRvd3MnLCAnQW5kcm9pZC1QaG9uZScsICdBbmRyb2lkLVRhYmxldCcsICdMaW51eCcsIG9yICdVbmtub3duJ1xuICovXG5mdW5jdGlvbiBnZXRfb3MoKSB7XG4gICAgbGV0IHVzZXJfYWdlbnQgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICAgICAgcGxhdGZvcm0gPSB3aW5kb3cubmF2aWdhdG9yLnBsYXRmb3JtLFxuICAgICAgICBtYWNvc19wbGF0Zm9ybXMgPSBbJ01hY2ludG9zaCcsICdNYWNJbnRlbCcsICdNYWNQUEMnLCAnTWFjNjhLJ10sXG4gICAgICAgIHdpbmRvd3NfcGxhdGZvcm1zID0gWydXaW4zMicsICdXaW42NCcsICdXaW5kb3dzJywgJ1dpbkNFJ10sXG4gICAgICAgIGlvc19wbGF0Zm9ybXMgPSBbJ2lQaG9uZScsICdpUGFkJywgJ2lQb2QnXSxcbiAgICAgICAgb3MgPSBudWxsO1xuXG4gICAgbGV0IGlzX21vYmlsZV9kZXZpY2UgPSBpc19tb2JpbGUoKTtcblxuICAgIGlmIChtYWNvc19wbGF0Zm9ybXMuaW5kZXhPZihwbGF0Zm9ybSkgIT09IC0xKSB7XG4gICAgICAgIG9zID0gJ01hYyBPUyc7XG4gICAgfSBlbHNlIGlmIChpb3NfcGxhdGZvcm1zLmluZGV4T2YocGxhdGZvcm0pICE9PSAtMSAmJiBpc19tb2JpbGVfZGV2aWNlKSB7XG4gICAgICAgIG9zID0gJ2lQaG9uZSc7XG4gICAgfSBlbHNlIGlmIChpb3NfcGxhdGZvcm1zLmluZGV4T2YocGxhdGZvcm0pICE9PSAtMSAmJiAhaXNfbW9iaWxlX2RldmljZSkge1xuICAgICAgICBvcyA9ICdpUGFkJztcbiAgICB9IGVsc2UgaWYgKHdpbmRvd3NfcGxhdGZvcm1zLmluZGV4T2YocGxhdGZvcm0pICE9PSAtMSkge1xuICAgICAgICBvcyA9ICdXaW5kb3dzJztcbiAgICB9IGVsc2UgaWYgKC9BbmRyb2lkLy50ZXN0KHVzZXJfYWdlbnQpICYmIGlzX21vYmlsZV9kZXZpY2UpIHtcbiAgICAgICAgb3MgPSAnQW5kcm9pZC1QaG9uZSc7XG4gICAgfSBlbHNlIGlmICgvQW5kcm9pZC8udGVzdCh1c2VyX2FnZW50KSAmJiAhaXNfbW9iaWxlX2RldmljZSkge1xuICAgICAgICBvcyA9ICdBbmRyb2lkLVRhYmxldCc7XG4gICAgfSBlbHNlIGlmICghb3MgJiYgL0xpbnV4Ly50ZXN0KHBsYXRmb3JtKSkge1xuICAgICAgICBvcyA9ICdMaW51eCc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb3MgPSAnVW5rbm93bic7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9zO1xufVxuXG4vKipcbiAqIERldGVjdHMgaWYgdGhlIHVzZXIgYWdlbnQgaXMgYSB3ZWIgY3Jhd2xlci9ib3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHVzZXIgYWdlbnQgYXBwZWFycyB0byBiZSBhIGJvdC9jcmF3bGVyXG4gKi9cbmZ1bmN0aW9uIGlzX2NyYXdsZXIoKSB7XG4gICAgbGV0IHVzZXJfYWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50O1xuICAgIGxldCBib3RfcGF0dGVybiA9IC9ib3R8c3BpZGVyfGNyYXdsfHNsdXJwfGFyY2hpdmVyfHBpbmd8c2VhcmNofGRpZ3x0cmFja2VyfG1vbml0b3J8c25vb3B5fHlhaG9vfGJhaWR1fG1zbnxhc2t8dGVvbWF8YXhpb3MvaTtcblxuICAgIHJldHVybiBib3RfcGF0dGVybi50ZXN0KHVzZXJfYWdlbnQpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBET00gU0NST0xMSU5HIFVUSUxJVElFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFNjcm9sbHMgcGFyZW50IGNvbnRhaW5lciB0byBtYWtlIHRhcmdldCBlbGVtZW50IHZpc2libGUgaWYgbmVlZGVkXG4gKiBAcGFyYW0ge3N0cmluZ3xIVE1MRWxlbWVudHxqUXVlcnl9IHRhcmdldCAtIFRhcmdldCBlbGVtZW50IHRvIHNjcm9sbCBpbnRvIHZpZXdcbiAqL1xuZnVuY3Rpb24gc2Nyb2xsX2ludG9fdmlld19pZl9uZWVkZWQodGFyZ2V0KSB7XG4gICAgY29uc3QgJHRhcmdldCA9ICQodGFyZ2V0KTtcblxuICAgIC8vIEZpbmQgdGhlIGNsb3Nlc3QgcGFyZW50IHdpdGggb3ZlcmZsb3cteTogYXV0b1xuICAgIGNvbnN0ICRwYXJlbnQgPSAkdGFyZ2V0LnBhcmVudCgpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBhYnNvbHV0ZSB0b3AgcG9zaXRpb24gb2YgdGhlIHRhcmdldFxuICAgIGNvbnN0IHRhcmdldF90b3AgPSAkdGFyZ2V0LnBvc2l0aW9uKCkudG9wICsgJHBhcmVudC5zY3JvbGxUb3AoKTtcblxuICAgIGNvbnN0IHRhcmdldF9oZWlnaHQgPSAkdGFyZ2V0Lm91dGVySGVpZ2h0KCk7XG4gICAgY29uc3QgcGFyZW50X2hlaWdodCA9ICRwYXJlbnQuaGVpZ2h0KCk7XG4gICAgY29uc3Qgc2Nyb2xsX3Bvc2l0aW9uID0gJHBhcmVudC5zY3JvbGxUb3AoKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgaXMgb3V0IG9mIHZpZXdcbiAgICBpZiAodGFyZ2V0X3RvcCA8IHNjcm9sbF9wb3NpdGlvbiB8fCB0YXJnZXRfdG9wICsgdGFyZ2V0X2hlaWdodCA+IHNjcm9sbF9wb3NpdGlvbiArIHBhcmVudF9oZWlnaHQpIHtcbiAgICAgICAgRGVidWdnZXIuY29uc29sZV9kZWJ1ZygnVUknLCAnU2Nyb2xsaW5nIScsIHRhcmdldF90b3ApO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbmV3IHNjcm9sbCBwb3NpdGlvbiB0byBjZW50ZXIgdGhlIHRhcmdldFxuICAgICAgICBsZXQgbmV3X3Njcm9sbF9wb3NpdGlvbiA9IHRhcmdldF90b3AgKyB0YXJnZXRfaGVpZ2h0IC8gMiAtIHBhcmVudF9oZWlnaHQgLyAyO1xuXG4gICAgICAgIC8vIExpbWl0IHRoZSBzY3JvbGwgcG9zaXRpb24gYmV0d2VlbiAwIGFuZCB0aGUgbWF4aW11bSBzY3JvbGxhYmxlIGhlaWdodFxuICAgICAgICBuZXdfc2Nyb2xsX3Bvc2l0aW9uID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obmV3X3Njcm9sbF9wb3NpdGlvbiwgJHBhcmVudFswXS5zY3JvbGxIZWlnaHQgLSBwYXJlbnRfaGVpZ2h0KSk7XG5cbiAgICAgICAgLy8gU2Nyb2xsIHRoZSBwYXJlbnQgdG8gdGhlIG5ldyBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgJHBhcmVudC5zY3JvbGxUb3AobmV3X3Njcm9sbF9wb3NpdGlvbik7XG4gICAgfVxufVxuXG4vKipcbiAqIFNjcm9sbHMgcGFnZSB0byBtYWtlIHRhcmdldCBlbGVtZW50IHZpc2libGUgaWYgbmVlZGVkICh3aXRoIGFuaW1hdGlvbilcbiAqIEBwYXJhbSB7c3RyaW5nfEhUTUxFbGVtZW50fGpRdWVyeX0gdGFyZ2V0IC0gVGFyZ2V0IGVsZW1lbnQgdG8gc2Nyb2xsIGludG8gdmlld1xuICovXG5mdW5jdGlvbiBzY3JvbGxfcGFnZV9pbnRvX3ZpZXdfaWZfbmVlZGVkKHRhcmdldCkge1xuICAgIGNvbnN0ICR0YXJnZXQgPSAkKHRhcmdldCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGFic29sdXRlIHRvcCBwb3NpdGlvbiBvZiB0aGUgdGFyZ2V0IHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudFxuICAgIGNvbnN0IHRhcmdldF90b3AgPSAkdGFyZ2V0Lm9mZnNldCgpLnRvcDtcblxuICAgIGNvbnN0IHRhcmdldF9oZWlnaHQgPSAkdGFyZ2V0Lm91dGVySGVpZ2h0KCk7XG4gICAgY29uc3Qgd2luZG93X2hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTtcbiAgICBjb25zdCB3aW5kb3dfc2Nyb2xsX3Bvc2l0aW9uID0gJCh3aW5kb3cpLnNjcm9sbFRvcCgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHRhcmdldCBpcyBvdXQgb2Ygdmlld1xuICAgIGlmICh0YXJnZXRfdG9wIDwgd2luZG93X3Njcm9sbF9wb3NpdGlvbiB8fCB0YXJnZXRfdG9wICsgdGFyZ2V0X2hlaWdodCA+IHdpbmRvd19zY3JvbGxfcG9zaXRpb24gKyB3aW5kb3dfaGVpZ2h0KSB7XG4gICAgICAgIERlYnVnZ2VyLmNvbnNvbGVfZGVidWcoJ1VJJywgJ1Njcm9sbGluZyEnLCB0YXJnZXRfdG9wKTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG5ldyBzY3JvbGwgcG9zaXRpb24gdG8gY2VudGVyIHRoZSB0YXJnZXRcbiAgICAgICAgY29uc3QgbmV3X3Njcm9sbF9wb3NpdGlvbiA9IHRhcmdldF90b3AgKyB0YXJnZXRfaGVpZ2h0IC8gMiAtIHdpbmRvd19oZWlnaHQgLyAyO1xuXG4gICAgICAgIC8vIEFuaW1hdGUgdGhlIHNjcm9sbCB0byB0aGUgbmV3IHBvc2l0aW9uXG4gICAgICAgICQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogbmV3X3Njcm9sbF9wb3NpdGlvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAxMDAwXG4gICAgICAgICk7IC8vIGR1cmF0aW9uIG9mIHRoZSBzY3JvbGwgYW5pbWF0aW9uIGluIG1pbGxpc2Vjb25kc1xuICAgIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRE9NIFVUSUxJVElFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFdhaXRzIGZvciBhbGwgaW1hZ2VzIG9uIHRoZSBwYWdlIHRvIGxvYWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFsbCBpbWFnZXMgYXJlIGxvYWRlZFxuICovXG5mdW5jdGlvbiB3YWl0X2Zvcl9pbWFnZXMoY2FsbGJhY2spIHtcbiAgICBjb25zdCAkaW1hZ2VzID0gJCgnaW1nJyk7IC8vIEdldCBhbGwgaW1nIHRhZ3NcbiAgICBjb25zdCB0b3RhbF9pbWFnZXMgPSAkaW1hZ2VzLmxlbmd0aDtcbiAgICBsZXQgaW1hZ2VzX2xvYWRlZCA9IDA7XG5cbiAgICBpZiAodG90YWxfaW1hZ2VzID09PSAwKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7IC8vIGlmIHRoZXJlIGFyZSBubyBpbWFnZXMsIGltbWVkaWF0ZWx5IGNhbGwgdGhlIGNhbGxiYWNrXG4gICAgfVxuXG4gICAgJGltYWdlcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpbWFnZXNfbG9hZGVkKys7XG4gICAgICAgICAgICBpZiAoaW1hZ2VzX2xvYWRlZCA9PT0gdG90YWxfaW1hZ2VzKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTsgLy8gY2FsbCB0aGUgY2FsbGJhY2sgd2hlbiBhbGwgaW1hZ2VzIGFyZSBsb2FkZWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaW1nLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpbWFnZXNfbG9hZGVkKys7XG4gICAgICAgICAgICBpZiAoaW1hZ2VzX2xvYWRlZCA9PT0gdG90YWxfaW1hZ2VzKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTsgLy8gYWxzbyBjYWxsIHRoZSBjYWxsYmFjayBpZiBhbiBpbWFnZSBmYWlscyB0byBsb2FkXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGltZy5zcmMgPSB0aGlzLnNyYzsgLy8gdGhpcyB0cmlnZ2VycyB0aGUgbG9hZGluZ1xuICAgIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBqUXVlcnkgZWxlbWVudCBjb250YWluaW5nIGEgbm9uLWJyZWFraW5nIHNwYWNlXG4gKiBAcmV0dXJucyB7alF1ZXJ5fSBqUXVlcnkgc3BhbiBlbGVtZW50IHdpdGggJm5ic3A7XG4gKi9cbmZ1bmN0aW9uICRuYnNwKCkge1xuICAgIHJldHVybiAkKCc8c3Bhbj4mbmJzcDs8L3NwYW4+Jyk7XG59XG5cbi8qKlxuICogRXNjYXBlcyBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gYSBqUXVlcnkgc2VsZWN0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIEVsZW1lbnQgSUQgdG8gZXNjYXBlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBqUXVlcnkgc2VsZWN0b3Igc3RyaW5nIHdpdGggZXNjYXBlZCBzcGVjaWFsIGNoYXJhY3RlcnNcbiAqIEB3YXJuaW5nIE5vdCBzYWZlIGZvciBzZWN1cml0eS1jcml0aWNhbCBvcGVyYXRpb25zXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZV9qcV9zZWxlY3RvcihpZCkge1xuICAgIHJldHVybiAnIycgKyBpZC5yZXBsYWNlKC8oOnxcXC58XFxbfFxcXXwsfD18QCkvZywgJ1xcXFwkMScpO1xufSIsIi8qXG4gKiBEYXRlIGFuZCB0aW1lIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB0aGUgUlNwYWRlIGZyYW1ld29yay5cbiAqIFRoZXNlIGZ1bmN0aW9ucyBoYW5kbGUgZGF0ZS90aW1lIGNvbnZlcnNpb25zIGFuZCBVbml4IHRpbWVzdGFtcHMuXG4gKi9cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gREFURS9USU1FIFVUSUxJVElFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEdldHMgdGhlIGN1cnJlbnQgVW5peCB0aW1lc3RhbXAgKHNlY29uZHMgc2luY2UgZXBvY2gpXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBDdXJyZW50IFVuaXggdGltZXN0YW1wIGluIHNlY29uZHNcbiAqIEB0b2RvIENhbGN1bGF0ZSBiYXNlZCBvbiBzZXJ2ZXIgdGltZSBhdCBwYWdlIHJlbmRlclxuICogQHRvZG8gTW92ZSB0byBhIGRhdGUgbGlicmFyeVxuICovXG5mdW5jdGlvbiB1bml4X3RpbWUoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGRhdGUgc3RyaW5nIHRvIFVuaXggdGltZXN0YW1wXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyX2RhdGUgLSBEYXRlIHN0cmluZyAoWS1tLWQgSDppOnMgZm9ybWF0KVxuICogQHJldHVybnMge251bWJlcn0gVW5peCB0aW1lc3RhbXAgaW4gc2Vjb25kc1xuICovXG5mdW5jdGlvbiB5bWRoaXNfdG9fdW5peChzdHJfZGF0ZSkge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShzdHJfZGF0ZSk7XG4gICAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpIC8gMTAwMDtcbn0iLCIvKlxuICogRXJyb3IgaGFuZGxpbmcgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRoZSBSU3BhZGUgZnJhbWV3b3JrLlxuICogVGhlc2UgZnVuY3Rpb25zIGhhbmRsZSBlcnJvciBjcmVhdGlvbiBhbmQgZGVidWdnaW5nIHV0aWxpdGllcy5cbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFUlJPUiBIQU5ETElOR1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZXJyb3Igb2JqZWN0IGZyb20gYSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdH0gc3RyIC0gRXJyb3IgbWVzc2FnZSBvciBleGlzdGluZyBlcnJvciBvYmplY3RcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZXJyb3JfY29kZV0gLSBPcHRpb25hbCBlcnJvciBzdGF0dXMgY29kZVxuICogQHJldHVybnMge09iamVjdH0gRXJyb3Igb2JqZWN0IHdpdGggZXJyb3IgYW5kIHN0YXR1cyBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIGVycm9yKHN0ciwgZXJyb3JfY29kZSkge1xuICAgIGlmICh0eXBlb2Ygc3RyLmVycm9yICE9IHVuZGVmKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlcnJvcl9jb2RlID09IHVuZGVmKSB7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogc3RyLCBzdGF0dXM6IG51bGwgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBzdHIsIHN0YXR1czogZXJyb3JfY29kZSB9O1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIFNhbml0eSBjaGVjayBmYWlsdXJlIGhhbmRsZXIgZm9yIEphdmFTY3JpcHRcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhIHNhbml0eSBjaGVjayBmYWlscyAtIGkuZS4sIHdoZW4gdGhlIGNvZGVcbiAqIGVuY291bnRlcnMgYSBjb25kaXRpb24gdGhhdCBcInNob3VsZG4ndCBoYXBwZW5cIiBpZiBldmVyeXRoaW5nIGlzIHdvcmtpbmcgY29ycmVjdGx5LlxuICpcbiAqIFVubGlrZSBQSFAsIHdlIGNhbid0IHN0b3AgSmF2YVNjcmlwdCBleGVjdXRpb24sIGJ1dCB3ZSBjYW46XG4gKiAxLiBUaHJvdyBhbiBlcnJvciB0aGF0IHdpbGwgYmUgY2F1Z2h0IGJ5IGVycm9yIGhhbmRsZXJzXG4gKiAyLiBMb2cgYSBjbGVhciBlcnJvciB0byB0aGUgY29uc29sZVxuICogMy4gUHJvdmlkZSBzdGFjayB0cmFjZSBmb3IgZGVidWdnaW5nXG4gKlxuICogVXNlIHRoaXMgaW5zdGVhZCBvZiBzaWxlbnRseSByZXR1cm5pbmcgb3IgY29udGludWluZyB3aGVuIGVuY291bnRlcmluZyB1bmV4cGVjdGVkIGNvbmRpdGlvbnMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgT3B0aW9uYWwgc3BlY2lmaWMgbWVzc2FnZSBhYm91dCB3aGF0IHNob3VsZG4ndCBoYXZlIGhhcHBlbmVkXG4gKiBAdGhyb3dzIHtFcnJvcn0gQWx3YXlzIHRocm93cyB3aXRoIGxvY2F0aW9uIGFuZCBjb250ZXh0IGluZm9ybWF0aW9uXG4gKi9cbmZ1bmN0aW9uIHNob3VsZG50X2hhcHBlbihtZXNzYWdlID0gbnVsbCkge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgY29uc3Qgc3RhY2sgPSBlcnJvci5zdGFjayB8fCAnJztcbiAgICBjb25zdCBzdGFja0xpbmVzID0gc3RhY2suc3BsaXQoJ1xcbicpO1xuXG4gICAgLy8gR2V0IHRoZSBjYWxsZXIgbG9jYXRpb24gKHNraXAgdGhlIEVycm9yIGxpbmUgYW5kIHRoaXMgZnVuY3Rpb24pXG4gICAgbGV0IGNhbGxlckluZm8gPSAndW5rbm93biBsb2NhdGlvbic7XG4gICAgaWYgKHN0YWNrTGluZXMubGVuZ3RoID4gMikge1xuICAgICAgICBjb25zdCBjYWxsZXJMaW5lID0gc3RhY2tMaW5lc1syXSB8fCBzdGFja0xpbmVzWzFdIHx8ICcnO1xuICAgICAgICAvLyBFeHRyYWN0IGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZyb20gc3RhY2sgdHJhY2VcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBjYWxsZXJMaW5lLm1hdGNoKC9hdFxccysuKj9cXHMrXFwoKC4qPyk6KFxcZCspOihcXGQrKVxcKS8pIHx8IGNhbGxlckxpbmUubWF0Y2goL2F0XFxzKyguKj8pOihcXGQrKTooXFxkKykvKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBjYWxsZXJJbmZvID0gYCR7bWF0Y2hbMV19OiR7bWF0Y2hbMl19YDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxldCBlcnJvck1lc3NhZ2UgPSBgRmF0YWw6IHNob3VsZG50X2hhcHBlbigpIHdhcyBjYWxsZWQgYXQgJHtjYWxsZXJJbmZvfVxcbmA7XG4gICAgZXJyb3JNZXNzYWdlICs9ICdUaGlzIGluZGljYXRlcyBhIHNhbml0eSBjaGVjayBmYWlsZWQgLSB0aGUgY29kZSBpcyBub3QgYmVoYXZpbmcgYXMgZXhwZWN0ZWQuXFxuJztcblxuICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgIGVycm9yTWVzc2FnZSArPSBgRGV0YWlsczogJHttZXNzYWdlfVxcbmA7XG4gICAgfVxuXG4gICAgZXJyb3JNZXNzYWdlICs9ICdQbGVhc2UgdGhvcm91Z2hseSByZXZpZXcgdGhlIHJlbGF0ZWQgY29kZSB0byBkZXRlcm1pbmUgd2h5IHRoaXMgZXJyb3Igb2NjdXJyZWQuJztcblxuICAgIC8vIExvZyB0byBjb25zb2xlIHdpdGggZnVsbCB2aXNpYmlsaXR5XG4gICAgY29uc29sZS5lcnJvcignPScucmVwZWF0KDgwKSk7XG4gICAgY29uc29sZS5lcnJvcignU0FOSVRZIENIRUNLIEZBSUxVUkUnKTtcbiAgICBjb25zb2xlLmVycm9yKCc9Jy5yZXBlYXQoODApKTtcbiAgICBjb25zb2xlLmVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgY29uc29sZS5lcnJvcignU3RhY2sgdHJhY2U6Jywgc3RhY2spO1xuICAgIGNvbnNvbGUuZXJyb3IoJz0nLnJlcGVhdCg4MCkpO1xuXG4gICAgLy8gVGhyb3cgZXJyb3IgdG8gc3RvcCBleGVjdXRpb24gZmxvd1xuICAgIGNvbnN0IGZhdGFsRXJyb3IgPSBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICBmYXRhbEVycm9yLm5hbWUgPSAnU2FuaXR5Q2hlY2tGYWlsdXJlJztcbiAgICB0aHJvdyBmYXRhbEVycm9yO1xufSIsIi8qXG4gKiBIYXNoaW5nIGFuZCBjb21wYXJpc29uIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB0aGUgUlNwYWRlIGZyYW1ld29yay5cbiAqIFRoZXNlIGZ1bmN0aW9ucyBoYW5kbGUgb2JqZWN0IGhhc2hpbmcgYW5kIGRlZXAgY29tcGFyaXNvbi5cbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIQVNISU5HIEFORCBDT01QQVJJU09OXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgdW5pcXVlIGhhc2ggZm9yIGFueSB2YWx1ZSAoaGFuZGxlcyBvYmplY3RzLCBhcnJheXMsIGNpcmN1bGFyIHJlZmVyZW5jZXMpXG4gKiBAcGFyYW0geyp9IHRoZV92YXIgLSBWYWx1ZSB0byBoYXNoXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtjYWxjX3NoYTE9dHJ1ZV0gLSBJZiB0cnVlLCByZXR1cm5zIFNIQTEgaGFzaDsgaWYgZmFsc2UsIHJldHVybnMgSlNPTlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBbaWdub3JlZF9rZXlzPW51bGxdIC0gS2V5cyB0byBpZ25vcmUgd2hlbiBoYXNoaW5nIG9iamVjdHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFNIQTEgaGFzaCBvciBKU09OIHN0cmluZyBvZiB0aGUgdmFsdWVcbiAqL1xuZnVuY3Rpb24gaGFzaCh0aGVfdmFyLCBjYWxjX3NoYTEgPSB0cnVlLCBpZ25vcmVkX2tleXMgPSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiB0aGVfdmFyID09IHVuZGVmKSB7XG4gICAgICAgIHRoZV92YXIgPSAnX191bmRlZmluZWRfXyc7XG4gICAgfVxuXG4gICAgaWYgKGlnbm9yZWRfa2V5cyA9PT0gbnVsbCkge1xuICAgICAgICBpZ25vcmVkX2tleXMgPSBbJyQnXTtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0cyB2YWx1ZSB0byBqc29uLCBkaXNjYXJkaW5nIGNpcmN1bGFyIHJlZmVyZW5jZXNcbiAgICBsZXQganNvbl9zdHJpbmdpZnlfbm9jaXJjID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gW107XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgZnVuY3Rpb24gKGtleSwgdikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdGhlX3Zhci5fY2FjaGVfa2V5ID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhlX3Zhci5faGFzaF9rZXkoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGUuaW5kZXhPZih2KSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRHVwbGljYXRlIHJlZmVyZW5jZSBmb3VuZCwgZGlzY2FyZCBrZXlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYWNoZS5wdXNoKHYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBUdXJuIGV2ZXJ5IHByb3BlcnR5IGFuZCBhbGwgaXRzIGNoaWxkcmVuIGludG8gYSBzaW5nbGUgZGVwdGggYXJyYXkgb2YgdmFsdWVzIHRoYXQgd2UgY2FuIHRoZW5cbiAgICAvLyBzb3J0IGFuZCBoYXNoIGFzIGEgd2hvbGVcbiAgICBsZXQgZmxhdF92YXIgPSB7fTtcbiAgICBsZXQgX2ZsYXR0ZW4gPSBmdW5jdGlvbiAodGhlX3ZhciwgcHJlZml4LCBkZXB0aCA9IDApIHtcbiAgICAgICAgLy8gSWYgYSBjbGFzcyBvYmplY3QgaXMgcHJvdmlkZWQsIGNpcmN1bGFyIHJlZmVyZW5jZXMgY2FuIG1ha2UgdGhlIGNhbGwgc3RhY2sgcmVjdXJzaXZlLlxuICAgICAgICAvLyBGb3IgdGhlIHB1cnBvc2VzIG9mIGhvdyB0aGUgaGFzaCBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoaXMgc2hvdWxkIGJlIHN1ZmZpY2llbnQuXG4gICAgICAgIGlmIChkZXB0aCA+IDEwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEb2VzIG5vdCBhY2NvdW50IGZvciBkYXRlcyBpIHRoaW5rLi4uXG5cbiAgICAgICAgaWYgKGlzX29iamVjdCh0aGVfdmFyKSAmJiB0eXBlb2YgdGhlX3Zhci5fY2FjaGVfa2V5ID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIFVzZSBfY2FjaGVfa2V5IHRvIGhhc2ggY29tcG9uZW50c1xuICAgICAgICAgICAgZmxhdF92YXJbcHJlZml4XSA9IHRoZV92YXIuX2hhc2hfa2V5KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNfb2JqZWN0KHRoZV92YXIpICYmIHR5cGVvZiBBYnN0cmFjdCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhlX3ZhciBpbnN0YW5jZW9mIEFic3RyYWN0KSB7XG4gICAgICAgICAgICAvLyBTdHJpbmdpZnkgYWxsIGNsYXNzIG9iamVjdHNcbiAgICAgICAgICAgIGZsYXRfdmFyW3ByZWZpeF0gPSBqc29uX3N0cmluZ2lmeV9ub2NpcmModGhlX3Zhcik7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNfb2JqZWN0KHRoZV92YXIpKSB7XG4gICAgICAgICAgICAvLyBJdGVyYXRlIG90aGVyIG9iamVjdHNcbiAgICAgICAgICAgIGZsYXRfdmFyW3ByZWZpeF0gPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGsgaW4gdGhlX3Zhcikge1xuICAgICAgICAgICAgICAgIGlmICh0aGVfdmFyLmhhc093blByb3BlcnR5KGspICYmIGlnbm9yZWRfa2V5cy5pbmRleE9mKGspID09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIF9mbGF0dGVuKHRoZV92YXJba10sIHByZWZpeCArICcuLicgKyBrLCBkZXB0aCArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc19hcnJheSh0aGVfdmFyKSkge1xuICAgICAgICAgICAgLy8gSXRlcmF0ZSBhcnJheXNcbiAgICAgICAgICAgIGZsYXRfdmFyW3ByZWZpeF0gPSBbXTtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGZvcmVhY2godGhlX3ZhciwgKHYpID0+IHtcbiAgICAgICAgICAgICAgICBfZmxhdHRlbih2LCBwcmVmaXggKyAnLi4nICsgaSwgZGVwdGggKyAxKTtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChpc19mdW5jdGlvbih0aGVfdmFyKSkge1xuICAgICAgICAgICAgLy8gbm90aGluZ1xuICAgICAgICB9IGVsc2UgaWYgKCFpc19udW1lcmljKHRoZV92YXIpKSB7XG4gICAgICAgICAgICBmbGF0X3ZhcltwcmVmaXhdID0gU3RyaW5nKHRoZV92YXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmxhdF92YXJbcHJlZml4XSA9IHRoZV92YXI7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgX2ZsYXR0ZW4odGhlX3ZhciwgJ18nKTtcblxuICAgIGxldCBzb3J0ZXIgPSBbXTtcblxuICAgIGZvcmVhY2goZmxhdF92YXIsIGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICAgIHNvcnRlci5wdXNoKFtrLCB2XSk7XG4gICAgfSk7XG5cbiAgICBzb3J0ZXIuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gYVswXSA+IGJbMF07XG4gICAgfSk7XG5cbiAgICBsZXQganNvbiA9IEpTT04uc3RyaW5naWZ5KHNvcnRlcik7XG5cbiAgICBpZiAoY2FsY19zaGExKSB7XG4gICAgICAgIGxldCBoYXNoZWQgPSBzaGExLnNoYTEoanNvbik7XG4gICAgICAgIHJldHVybiBoYXNoZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxufVxuXG4vKipcbiAqIERlZXAgY29tcGFyaXNvbiBvZiB0d28gdmFsdWVzIChpZ25vcmVzIHByb3BlcnR5IG9yZGVyIGFuZCBmdW5jdGlvbnMpXG4gKiBAcGFyYW0geyp9IGEgLSBGaXJzdCB2YWx1ZSB0byBjb21wYXJlXG4gKiBAcGFyYW0geyp9IGIgLSBTZWNvbmQgdmFsdWUgdG8gY29tcGFyZVxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWVzIGFyZSBkZWVwbHkgZXF1YWxcbiAqL1xuZnVuY3Rpb24gZGVlcF9lcXVhbChhLCBiKSB7XG4gICAgcmV0dXJuIGhhc2goYSwgZmFsc2UpID09IGhhc2goYiwgZmFsc2UpO1xufSIsIi8qKlxuICogTXV0ZXggZGVjb3JhdG9yIGZvciBleGNsdXNpdmUgbWV0aG9kIGV4ZWN1dGlvblxuICpcbiAqIFdpdGhvdXQgYXJndW1lbnRzOiBQZXItaW5zdGFuY2UgbG9ja2luZyAoZWFjaCBvYmplY3QgaGFzIGl0cyBvd24gbG9jayBwZXIgbWV0aG9kKVxuICogICBAbXV0ZXhcbiAqICAgYXN5bmMgbXlfbWV0aG9kKCkgeyAuLi4gfVxuICpcbiAqIFdpdGggSUQgYXJndW1lbnQ6IEdsb2JhbCBsb2NraW5nIGJ5IElEIChhbGwgaW5zdGFuY2VzIHNoYXJlIHRoZSBsb2NrKVxuICogICBAbXV0ZXgoJ29wZXJhdGlvbl9uYW1lJylcbiAqICAgYXN5bmMgbXlfbWV0aG9kKCkgeyAuLi4gfVxuICpcbiAqIEBkZWNvcmF0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZ2xvYmFsX2lkXSAtIE9wdGlvbmFsIGdsb2JhbCBtdXRleCBJRCBmb3IgY3Jvc3MtaW5zdGFuY2UgbG9ja2luZ1xuICovXG5mdW5jdGlvbiBtdXRleChnbG9iYWxfaWQpIHtcbiAgICAvLyBTdG9yYWdlICh1c2luZyBJSUZFcyB0byBrZWVwIFdlYWtNYXAvTWFwIGluIGNsb3N1cmUgc2NvcGUpXG4gICAgY29uc3QgaW5zdGFuY2VfbXV0ZXhlcyA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCFtdXRleC5faW5zdGFuY2Vfc3RvcmFnZSkge1xuICAgICAgICAgICAgbXV0ZXguX2luc3RhbmNlX3N0b3JhZ2UgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtdXRleC5faW5zdGFuY2Vfc3RvcmFnZTtcbiAgICB9KSgpO1xuXG4gICAgY29uc3QgZ2xvYmFsX211dGV4ZXMgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghbXV0ZXguX2dsb2JhbF9zdG9yYWdlKSB7XG4gICAgICAgICAgICBtdXRleC5fZ2xvYmFsX3N0b3JhZ2UgPSBuZXcgTWFwKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG11dGV4Ll9nbG9iYWxfc3RvcmFnZTtcbiAgICB9KSgpO1xuXG4gICAgLyoqXG4gICAgICogR2V0IG9yIGNyZWF0ZSBhIG11dGV4IGZvciBhIHNwZWNpZmljIGluc3RhbmNlIGFuZCBtZXRob2RcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRfaW5zdGFuY2VfbXV0ZXgoaW5zdGFuY2UsIG1ldGhvZF9uYW1lKSB7XG4gICAgICAgIGxldCBpbnN0YW5jZV9sb2NrcyA9IGluc3RhbmNlX211dGV4ZXMuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgaWYgKCFpbnN0YW5jZV9sb2Nrcykge1xuICAgICAgICAgICAgaW5zdGFuY2VfbG9ja3MgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBpbnN0YW5jZV9tdXRleGVzLnNldChpbnN0YW5jZSwgaW5zdGFuY2VfbG9ja3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2tfc3RhdGUgPSBpbnN0YW5jZV9sb2Nrcy5nZXQobWV0aG9kX25hbWUpO1xuICAgICAgICBpZiAoIWxvY2tfc3RhdGUpIHtcbiAgICAgICAgICAgIGxvY2tfc3RhdGUgPSB7IGFjdGl2ZTogZmFsc2UsIHF1ZXVlOiBbXSB9O1xuICAgICAgICAgICAgaW5zdGFuY2VfbG9ja3Muc2V0KG1ldGhvZF9uYW1lLCBsb2NrX3N0YXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsb2NrX3N0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBvciBjcmVhdGUgYSBnbG9iYWwgbXV0ZXggYnkgSURcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRfZ2xvYmFsX211dGV4KGlkKSB7XG4gICAgICAgIGxldCBsb2NrX3N0YXRlID0gZ2xvYmFsX211dGV4ZXMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKCFsb2NrX3N0YXRlKSB7XG4gICAgICAgICAgICBsb2NrX3N0YXRlID0geyBhY3RpdmU6IGZhbHNlLCBxdWV1ZTogW10gfTtcbiAgICAgICAgICAgIGdsb2JhbF9tdXRleGVzLnNldChpZCwgbG9ja19zdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvY2tfc3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSB0aGUgbmV4dCBxdWV1ZWQgb3BlcmF0aW9uIGZvciBhIG11dGV4XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2NoZWR1bGVfbmV4dChsb2NrX3N0YXRlKSB7XG4gICAgICAgIGlmIChsb2NrX3N0YXRlLmFjdGl2ZSB8fCBsb2NrX3N0YXRlLnF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBmbiwgcmVzb2x2ZSwgcmVqZWN0IH0gPSBsb2NrX3N0YXRlLnF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIGxvY2tfc3RhdGUuYWN0aXZlID0gdHJ1ZTtcblxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgLnRoZW4oZm4pXG4gICAgICAgICAgICAudGhlbihyZXNvbHZlLCByZWplY3QpXG4gICAgICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9ja19zdGF0ZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBzY2hlZHVsZV9uZXh0KGxvY2tfc3RhdGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWNxdWlyZSBhIG11dGV4IGxvY2sgYW5kIGV4ZWN1dGUgY2FsbGJhY2tcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhY3F1aXJlX2xvY2sobG9ja19zdGF0ZSwgZm4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxvY2tfc3RhdGUucXVldWUucHVzaCh7IGZuLCByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICAgICAgICBzY2hlZHVsZV9uZXh0KGxvY2tfc3RhdGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBJZiBjYWxsZWQgd2l0aCBhbiBJRCBhcmd1bWVudDogQG11dGV4KCdpZCcpXG4gICAgaWYgKHR5cGVvZiBnbG9iYWxfaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih0YXJnZXQsIGtleSwgZGVzY3JpcHRvcikge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxfbWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcmlnaW5hbF9tZXRob2QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBtdXRleCBjYW4gb25seSBiZSBhcHBsaWVkIHRvIG1ldGhvZHMgKHRyaWVkIHRvIGFwcGx5IHRvICR7a2V5fSlgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2NrX3N0YXRlID0gZ2V0X2dsb2JhbF9tdXRleChnbG9iYWxfaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY3F1aXJlX2xvY2sobG9ja19zdGF0ZSwgKCkgPT4gb3JpZ2luYWxfbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIElmIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50czogQG11dGV4ICh0YXJnZXQgaXMgdGhlIGZpcnN0IGFyZ3VtZW50KVxuICAgIGNvbnN0IHRhcmdldCA9IGdsb2JhbF9pZDsgIC8vIEluIHRoaXMgY2FzZSwgZmlyc3QgYXJnIGlzIHRhcmdldFxuICAgIGNvbnN0IGtleSA9IGFyZ3VtZW50c1sxXTtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gYXJndW1lbnRzWzJdO1xuXG4gICAgY29uc3Qgb3JpZ2luYWxfbWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcblxuICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxfbWV0aG9kICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQG11dGV4IGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gbWV0aG9kcyAodHJpZWQgdG8gYXBwbHkgdG8gJHtrZXl9KWApO1xuICAgIH1cblxuICAgIGRlc2NyaXB0b3IudmFsdWUgPSBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IGxvY2tfc3RhdGUgPSBnZXRfaW5zdGFuY2VfbXV0ZXgodGhpcywga2V5KTtcbiAgICAgICAgcmV0dXJuIGFjcXVpcmVfbG9jayhsb2NrX3N0YXRlLCAoKSA9PiBvcmlnaW5hbF9tZXRob2QuYXBwbHkodGhpcywgYXJncykpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbn1cbiIsIi8qXG4gKiBBc3luYyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgdGhlIFJTcGFkZSBmcmFtZXdvcmsuXG4gKiBUaGVzZSBmdW5jdGlvbnMgaGFuZGxlIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLCBkZWxheXMsIGRlYm91bmNpbmcsIGFuZCBtdXRleGVzLlxuICovXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEFTWU5DIFVUSUxJVElFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFBhdXNlcyBleGVjdXRpb24gZm9yIHNwZWNpZmllZCBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbbWlsbGlzZWNvbmRzPTBdIC0gRGVsYXkgaW4gbWlsbGlzZWNvbmRzICgwIHVzZXMgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKVxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBkZWxheVxuICogQGV4YW1wbGUgYXdhaXQgc2xlZXAoMTAwMCk7IC8vIFdhaXQgMSBzZWNvbmRcbiAqL1xuZnVuY3Rpb24gc2xlZXAobWlsbGlzZWNvbmRzID0gMCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBpZiAobWlsbGlzZWNvbmRzID09IDAgJiYgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1pbGxpc2Vjb25kcyk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHdpdGggZXhjbHVzaXZpdHkgYW5kIHByb21pc2UgZmFuLWluXG4gKlxuICogVGhpcyBmdW5jdGlvbiwgd2hlbiBpbnZva2VkLCBpbW1lZGlhdGVseSBydW5zIHRoZSBjYWxsYmFjayBleGNsdXNpdmVseS5cbiAqIEZvciBzdWJzZXF1ZW50IGludm9jYXRpb25zLCBpdCBhcHBsaWVzIGEgZGVsYXkgYmVmb3JlIHJ1bm5pbmcgdGhlIGNhbGxiYWNrIGV4Y2x1c2l2ZWx5IGFnYWluLlxuICogVGhlIGRlbGF5IHN0YXJ0cyBhZnRlciB0aGUgY3VycmVudCBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHJlc29sdmVzLlxuICpcbiAqIElmICdkZWxheScgaXMgc2V0IHRvIDAsIHRoZSBmdW5jdGlvbiB3aWxsIG9ubHkgcHJldmVudCBlbnF1ZXVlaW5nIG11bHRpcGxlIGV4ZWN1dGlvbnMgb2YgdGhlXG4gKiBzYW1lIG1ldGhvZCBtb3JlIHRoYW4gb25jZSwgYnV0IHdpbGwgc3RpbGwgcnVuIHRoZW0gaW1tZWRpYXRlbHkgaW4gYW4gZXhjbHVzaXZlIHNlcXVlbnRpYWwgbWFubmVyLlxuICpcbiAqIFRoZSBtb3N0IHJlY2VudCBpbnZvY2F0aW9uIG9mIHRoZSBmdW5jdGlvbiB3aWxsIGJlIHRoZSBwYXJhbWV0ZXJzIHRoYXQgZ2V0IHBhc3NlZCB0byB0aGUgZnVuY3Rpb25cbiAqIHdoZW4gaXQgaW52b2tlcy5cbiAqXG4gKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBuZXh0IGV4Y2x1c2l2ZSBleGVjdXRpb24gY29tcGxldGVzLlxuICpcbiAqIFVzYWdlIGFzIGZ1bmN0aW9uOlxuICogICBjb25zdCBkZWJvdW5jZWRGbiA9IGRlYm91bmNlKG15RnVuY3Rpb24sIDI1MCk7XG4gKlxuICogVXNhZ2UgYXMgZGVjb3JhdG9yOlxuICogICBAZGVib3VuY2UoMjUwKVxuICogICBteU1ldGhvZCgpIHsgLi4uIH1cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufG51bWJlcn0gY2FsbGJhY2tfb3JfZGVsYXkgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIE9SIGRlbGF5IHdoZW4gdXNlZCBhcyBkZWNvcmF0b3JcbiAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheSBUaGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBzdWJzZXF1ZW50IGludm9jYXRpb25zXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGltbWVkaWF0ZSBpZiB0cnVlLCB0aGUgZmlyc3QgdGltZSB0aGUgYWN0aW9uIGlzIGNhbGxlZCwgdGhlIGNhbGxiYWNrIGV4ZWN1dGVzIGltbWVkaWF0ZWx5XG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCB3aGVuIGludm9rZWQsIHJ1bnMgdGhlIGNhbGxiYWNrIGltbWVkaWF0ZWx5IGFuZCBleGNsdXNpdmVseSxcbiAqXG4gKiBAZGVjb3JhdG9yXG4gKi9cbmZ1bmN0aW9uIGRlYm91bmNlKGNhbGxiYWNrX29yX2RlbGF5LCBkZWxheSwgaW1tZWRpYXRlID0gZmFsc2UpIHtcbiAgICAvLyBEZWNvcmF0b3IgdXNhZ2U6IEBkZWJvdW5jZSgyNTApIG9yIEBkZWJvdW5jZSgyNTAsIHRydWUpXG4gICAgLy8gRmlyc3QgYXJndW1lbnQgaXMgYSBudW1iZXIgKHRoZSBkZWxheSksIHJldHVybnMgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFja19vcl9kZWxheSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uc3QgZGVjb3JhdG9yX2RlbGF5ID0gY2FsbGJhY2tfb3JfZGVsYXk7XG4gICAgICAgIGNvbnN0IGRlY29yYXRvcl9pbW1lZGlhdGUgPSBkZWxheSB8fCBmYWxzZTtcblxuICAgICAgICAvLyBUQzM5IGRlY29yYXRvciBmb3JtOiByZWNlaXZlcyAodmFsdWUsIGNvbnRleHQpXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsdWUsIGNvbnRleHQpIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmtpbmQgPT09ICdtZXRob2QnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlYm91bmNlX2ltcGwodmFsdWUsIGRlY29yYXRvcl9kZWxheSwgZGVjb3JhdG9yX2ltbWVkaWF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRnVuY3Rpb24gdXNhZ2U6IGRlYm91bmNlKGZuLCAyNTApXG4gICAgLy8gRmlyc3QgYXJndW1lbnQgaXMgYSBmdW5jdGlvbiAodGhlIGNhbGxiYWNrKVxuICAgIGNvbnN0IGNhbGxiYWNrID0gY2FsbGJhY2tfb3JfZGVsYXk7XG4gICAgcmV0dXJuIGRlYm91bmNlX2ltcGwoY2FsbGJhY2ssIGRlbGF5LCBpbW1lZGlhdGUpO1xufVxuXG4vKipcbiAqIEludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIGRlYm91bmNlIGxvZ2ljXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWJvdW5jZV9pbXBsKGNhbGxiYWNrLCBkZWxheSwgaW1tZWRpYXRlID0gZmFsc2UpIHtcbiAgICBsZXQgcnVubmluZyA9IGZhbHNlO1xuICAgIGxldCBxdWV1ZWQgPSBmYWxzZTtcbiAgICBsZXQgbGFzdF9lbmRfdGltZSA9IDA7IC8vIHRpbWVzdGFtcCBvZiBsYXN0IGNvbXBsZXRlZCBydW5cbiAgICBsZXQgdGltZXIgPSBudWxsO1xuXG4gICAgbGV0IG5leHRfYXJncyA9IFtdO1xuICAgIGxldCBuZXh0X2NvbnRleHQgPSBudWxsO1xuICAgIGxldCByZXNvbHZlX3F1ZXVlID0gW107XG4gICAgbGV0IHJlamVjdF9xdWV1ZSA9IFtdO1xuXG4gICAgY29uc3QgcnVuX2Z1bmN0aW9uID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0aGVzZV9yZXNvbHZlcyA9IHJlc29sdmVfcXVldWU7XG4gICAgICAgIGNvbnN0IHRoZXNlX3JlamVjdHMgPSByZWplY3RfcXVldWU7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBuZXh0X2FyZ3M7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXh0X2NvbnRleHQ7XG5cbiAgICAgICAgcmVzb2x2ZV9xdWV1ZSA9IFtdO1xuICAgICAgICByZWplY3RfcXVldWUgPSBbXTtcbiAgICAgICAgbmV4dF9hcmdzID0gW107XG4gICAgICAgIG5leHRfY29udGV4dCA9IG51bGw7XG4gICAgICAgIHF1ZXVlZCA9IGZhbHNlO1xuICAgICAgICBydW5uaW5nID0gdHJ1ZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2FsbGJhY2suYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlc29sdmUgb2YgdGhlc2VfcmVzb2x2ZXMpIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlamVjdCBvZiB0aGVzZV9yZWplY3RzKSByZWplY3QoZXJyKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGxhc3RfZW5kX3RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgaWYgKHF1ZXVlZCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KHJ1bl9mdW5jdGlvbiwgTWF0aC5tYXgoZGVsYXksIDApKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICBuZXh0X2FyZ3MgPSBhcmdzO1xuICAgICAgICBuZXh0X2NvbnRleHQgPSB0aGlzO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlX3F1ZXVlLnB1c2gocmVzb2x2ZSk7XG4gICAgICAgICAgICByZWplY3RfcXVldWUucHVzaChyZWplY3QpO1xuXG4gICAgICAgICAgICAvLyBOb3RoaW5nIHJ1bm5pbmcgYW5kIG5vdGhpbmcgc2NoZWR1bGVkXG4gICAgICAgICAgICBpZiAoIXJ1bm5pbmcgJiYgIXRpbWVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RfY2FsbCA9IGxhc3RfZW5kX3RpbWUgPT09IDA7XG5cbiAgICAgICAgICAgICAgICBpZiAoaW1tZWRpYXRlICYmIGZpcnN0X2NhbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVuX2Z1bmN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzaW5jZSA9IGZpcnN0X2NhbGwgPyBJbmZpbml0eSA6IERhdGUubm93KCkgLSBsYXN0X2VuZF90aW1lO1xuICAgICAgICAgICAgICAgIGlmIChzaW5jZSA+PSBkZWxheSkge1xuICAgICAgICAgICAgICAgICAgICBydW5fZnVuY3Rpb24oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3YWl0ID0gTWF0aC5tYXgoZGVsYXkgLSBzaW5jZSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVyID0gc2V0VGltZW91dChydW5fZnVuY3Rpb24sIHdhaXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHdlJ3JlIGFscmVhZHkgcnVubmluZyBvciBhIHRpbWVyIGV4aXN0cywganVzdCBtYXJrIHF1ZXVlZC5cbiAgICAgICAgICAgIC8vIFRoZSBmaW5hbGx5e30gb2YgcnVuX2Z1bmN0aW9uIGhhbmRsZXMgc2NoZWR1bGluZyBhZnRlciBmdWxsIGRlbGF5LlxuICAgICAgICAgICAgcXVldWVkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUkVBRC1XUklURSBMT0NLIEZVTkNUSU9OUyAtIERlbGVnYXRlZCB0byBSZWFkV3JpdGVMb2NrIGNsYXNzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQWNxdWlyZSBhbiBleGNsdXNpdmUgd3JpdGUgbG9jayBieSBuYW1lLlxuICogT25seSBvbmUgd3JpdGVyIHJ1bnMgYXQgYSB0aW1lOyBibG9ja3MgcmVhZGVycyB1bnRpbCBmaW5pc2hlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0geygpID0+IGFueXxQcm9taXNlPGFueT59IGNiXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICovXG5mdW5jdGlvbiByd2xvY2sobmFtZSwgY2IpIHtcbiAgICByZXR1cm4gUmVhZFdyaXRlTG9jay5hY3F1aXJlKG5hbWUsIGNiKTtcbn1cblxuLyoqXG4gKiBBY3F1aXJlIGEgc2hhcmVkIHJlYWQgbG9jayBieSBuYW1lLlxuICogTXVsdGlwbGUgcmVhZGVycyBydW4gaW4gcGFyYWxsZWwsIGJ1dCByZWFkZXJzIGFyZSBibG9ja2VkIGJ5IHF1ZXVlZC9hY3RpdmUgd3JpdGVycy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0geygpID0+IGFueXxQcm9taXNlPGFueT59IGNiXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICovXG5mdW5jdGlvbiByd2xvY2tfcmVhZChuYW1lLCBjYikge1xuICAgIHJldHVybiBSZWFkV3JpdGVMb2NrLmFjcXVpcmVfcmVhZChuYW1lLCBjYik7XG59XG5cbi8qKlxuICogRm9yY2VmdWxseSBjbGVhciBhbGwgbG9ja3MgYW5kIHF1ZXVlcyBmb3IgYSBnaXZlbiBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqL1xuZnVuY3Rpb24gcndsb2NrX2ZvcmNlX3VubG9jayhuYW1lKSB7XG4gICAgUmVhZFdyaXRlTG9jay5mb3JjZV91bmxvY2sobmFtZSk7XG59XG5cbi8qKlxuICogSW5zcGVjdCBsb2NrIHN0YXRlIGZvciBkZWJ1Z2dpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge3tyZWFkZXJzOm51bWJlciwgd3JpdGVyX2FjdGl2ZTpib29sZWFuLCByZWFkZXJfcTpudW1iZXIsIHdyaXRlcl9xOm51bWJlcn19XG4gKi9cbmZ1bmN0aW9uIHJ3bG9ja19wZW5kaW5nKG5hbWUpIHtcbiAgICByZXR1cm4gUmVhZFdyaXRlTG9jay5wZW5kaW5nKG5hbWUpO1xufVxuIiwiLypcbiAqIENvcmUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRoZSBSU3BhZGUgZnJhbWV3b3JrLlxuICogVGhlc2UgZnVuY3Rpb25zIGhhbmRsZSB0eXBlIGNoZWNraW5nLCB0eXBlIGNvbnZlcnNpb24sIHN0cmluZyBtYW5pcHVsYXRpb24sXG4gKiBhbmQgb2JqZWN0L2FycmF5IHV0aWxpdGllcy4gVGhleSBtaXJyb3IgZnVuY3Rpb25hbGl0eSBmcm9tIFBIUCBmdW5jdGlvbnMuXG4gKlxuICogT3RoZXIgdXRpbGl0eSBmdW5jdGlvbnMgYXJlIG9yZ2FuaXplZCBpbjpcbiAqIC0gYXN5bmMuanM6IEFzeW5jIHV0aWxpdGllcyAoc2xlZXAsIGRlYm91bmNlLCBtdXRleClcbiAqIC0gYnJvd3Nlci5qczogQnJvd3Nlci9ET00gdXRpbGl0aWVzIChpc19tb2JpbGUsIHNjcm9sbCBmdW5jdGlvbnMpXG4gKiAtIGRhdGV0aW1lLmpzOiBEYXRlL3RpbWUgdXRpbGl0aWVzXG4gKiAtIGhhc2guanM6IEhhc2hpbmcgYW5kIGNvbXBhcmlzb25cbiAqIC0gZXJyb3IuanM6IEVycm9yIGhhbmRsaW5nXG4gKi9cblxuLy8gVG9kbzogdGVzdCB0aGF0IHByb2QgYnVpbGQgaWRlbnRpZmllcyBhbmQgcmVtb3ZlcyB1bmNhbGxlZCBmdW5jdGlvbnMgZnJvbSB0aGUgZmluYWwgYnVuZGxlLlxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDT05TVEFOVFMgQU5EIEhFTFBFUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gRGVmaW5lIGNvbW1vbmx5IHVzZWQgY29uc3RhbnRzXG5jb25zdCB1bmRlZiA9ICd1bmRlZmluZWQnO1xuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgYXJyYXlzIG9yIG9iamVjdHMgd2l0aCBwcm9taXNlIHN1cHBvcnRcbiAqXG4gKiBXb3JrcyB3aXRoIGJvdGggc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBjYWxsYmFja3MuIElmIHRoZSBjYWxsYmFja1xuICogcmV0dXJucyBwcm9taXNlcywgdGhleSBhcmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwgYW5kIHRoaXMgZnVuY3Rpb24gcmV0dXJuc1xuICogYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgcGFyYWxsZWwgdGFza3MgY29tcGxldGUuXG4gKlxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IG9iaiAtIENvbGxlY3Rpb24gdG8gaXRlcmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGl0ZW0gKHZhbHVlLCBrZXkpIC0gY2FuIGJlIGFzeW5jXG4gKiBAcmV0dXJucyB7UHJvbWlzZXx1bmRlZmluZWR9IFByb21pc2UgaWYgYW55IGNhbGxiYWNrcyByZXR1cm4gcHJvbWlzZXMsIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU3luY2hyb25vdXMgdXNhZ2VcbiAqIGZvcmVhY2goWzEsMiwzXSwgKHZhbCkgPT4gY29uc29sZS5sb2codmFsKSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFzeW5jaHJvbm91cyB1c2FnZSAtIHdhaXRzIGZvciBhbGwgdG8gY29tcGxldGVcbiAqIGF3YWl0IGZvcmVhY2goWzEsMiwzXSwgYXN5bmMgKHZhbCkgPT4ge1xuICogICAgIGF3YWl0IGZldGNoKCcvYXBpL3Byb2Nlc3MvJyArIHZhbCk7XG4gKiB9KTtcbiAqL1xuZnVuY3Rpb24gZm9yZWFjaChvYmosIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICBvYmouZm9yRWFjaCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goY2FsbGJhY2sodmFsdWUsIGluZGV4KSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChjYWxsYmFjayhvYmpba2V5XSwga2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgZm9yIHByb21pc2VzXG4gICAgY29uc3QgcHJvbWlzZXMgPSByZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiByZXN1bHQgJiYgdHlwZW9mIHJlc3VsdC50aGVuID09PSAnZnVuY3Rpb24nKTtcblxuICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgcHJvbWlzZXMsIHJldHVybiBQcm9taXNlLmFsbCB0byB3YWl0IGZvciBhbGwgdG8gY29tcGxldGVcbiAgICBpZiAocHJvbWlzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIH1cblxuICAgIC8vIE5vIHByb21pc2VzIHJldHVybmVkLCBzbyB3ZSdyZSBkb25lXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUWVBFIENIRUNLSU5HIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIG51bWVyaWNcbiAqIEBwYXJhbSB7Kn0gbiAtIFZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBmaW5pdGUgbnVtYmVyXG4gKi9cbmZ1bmN0aW9uIGlzX251bWVyaWMobikge1xuICAgIHJldHVybiAhaXNOYU4ocGFyc2VGbG9hdChuKSkgJiYgaXNGaW5pdGUobik7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYSBzdHJpbmdcbiAqIEBwYXJhbSB7Kn0gcyAtIFZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gaXNfc3RyaW5nKHMpIHtcbiAgICByZXR1cm4gdHlwZW9mIHMgPT0gJ3N0cmluZyc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYW4gaW50ZWdlclxuICogQHBhcmFtIHsqfSBuIC0gVmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyXG4gKi9cbmZ1bmN0aW9uIGlzX2ludGVnZXIobikge1xuICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKG4pO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIGEgcHJvbWlzZS1saWtlIG9iamVjdFxuICogQHBhcmFtIHsqfSBvYmogLSBWYWx1ZSB0byBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGhhcyBhIHRoZW4gbWV0aG9kXG4gKi9cbmZ1bmN0aW9uIGlzX3Byb21pc2Uob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT0gJ29iamVjdCcgJiYgdHlwZW9mIG9iai50aGVuID09ICdmdW5jdGlvbic7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYW4gYXJyYXlcbiAqIEBwYXJhbSB7Kn0gb2JqIC0gVmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBhcnJheVxuICovXG5mdW5jdGlvbiBpc19hcnJheShvYmopIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvYmopO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIGFuIG9iamVjdCAoZXhjbHVkZXMgbnVsbClcbiAqIEBwYXJhbSB7Kn0gb2JqIC0gVmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBvYmplY3QgYW5kIG5vdCBudWxsXG4gKi9cbmZ1bmN0aW9uIGlzX29iamVjdChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Kn0gZnVuY3Rpb25fdG9fY2hlY2sgLSBWYWx1ZSB0byBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gaXNfZnVuY3Rpb24oZnVuY3Rpb25fdG9fY2hlY2spIHtcbiAgICByZXR1cm4gZnVuY3Rpb25fdG9fY2hlY2sgJiYge30udG9TdHJpbmcuY2FsbChmdW5jdGlvbl90b19jaGVjaykgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgZW1haWwgYWRkcmVzc1xuICogVXNlcyBhIHByYWN0aWNhbCBSRkMgNTMyMiBjb21wbGlhbnQgcmVnZXggdGhhdCBtYXRjaGVzIDk5Ljk5JSBvZiByZWFsLXdvcmxkIGVtYWlsIGFkZHJlc3Nlc1xuICogQHBhcmFtIHtzdHJpbmd9IGVtYWlsIC0gRW1haWwgYWRkcmVzcyB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGVtYWlsIGFkZHJlc3NcbiAqL1xuZnVuY3Rpb24gaXNfZW1haWwoZW1haWwpIHtcbiAgICBpZiAoIWlzX3N0cmluZyhlbWFpbCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCByZWdleCA9IC9eW2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKyg/OlxcLlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXSspKkAoPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XFwuKStbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/JC9pO1xuICAgIHJldHVybiByZWdleC50ZXN0KGVtYWlsKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBkZWZpbmVkIChub3QgdW5kZWZpbmVkKVxuICogQHBhcmFtIHsqfSB2YWx1ZSAtIFZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBub3QgdW5kZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIGlzc2V0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSAhPSB1bmRlZjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBlbXB0eSAobnVsbCwgdW5kZWZpbmVkLCAwLCBcIlwiLCBlbXB0eSBhcnJheS9vYmplY3QpXG4gKiBAcGFyYW0geyp9IG9iamVjdCAtIFZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgY29uc2lkZXJlZCBlbXB0eVxuICovXG5mdW5jdGlvbiBlbXB0eShvYmplY3QpIHtcbiAgICBpZiAodHlwZW9mIG9iamVjdCA9PSB1bmRlZikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG9iamVjdCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmplY3QgPT0gJ3N0cmluZycgJiYgb2JqZWN0ID09ICcnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iamVjdCA9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID09IDA7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuICFvYmplY3QubGVuZ3RoO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iamVjdCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQga2V5IGluIG9iamVjdCkge1xuICAgICAgICBpZiAob2JqZWN0Lmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVFlQRSBDT05WRVJTSU9OIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENvbnZlcnRzIGEgdmFsdWUgdG8gYSBmbG9hdGluZyBwb2ludCBudW1iZXJcbiAqIFJldHVybnMgMCBmb3IgbnVsbCwgdW5kZWZpbmVkLCBOYU4sIG9yIG5vbi1udW1lcmljIHZhbHVlc1xuICogQHBhcmFtIHsqfSB2YWwgLSBWYWx1ZSB0byBjb252ZXJ0XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBGbG9hdGluZyBwb2ludCBudW1iZXJcbiAqL1xuZnVuY3Rpb24gZmxvYXQodmFsKSB7XG4gICAgLy8gSGFuZGxlIG51bGwsIHVuZGVmaW5lZCwgZW1wdHkgc3RyaW5nXG4gICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCB8fCB2YWwgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiAwLjA7XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIHBhcnNlIHRoZSB2YWx1ZVxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmxvYXQodmFsKTtcblxuICAgIC8vIENoZWNrIGZvciBOYU4gYW5kIHJldHVybiAwIGlmIHBhcnNpbmcgZmFpbGVkXG4gICAgcmV0dXJuIGlzTmFOKHBhcnNlZCkgPyAwLjAgOiBwYXJzZWQ7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSB2YWx1ZSB0byBhbiBpbnRlZ2VyXG4gKiBSZXR1cm5zIDAgZm9yIG51bGwsIHVuZGVmaW5lZCwgTmFOLCBvciBub24tbnVtZXJpYyB2YWx1ZXNcbiAqIEBwYXJhbSB7Kn0gdmFsIC0gVmFsdWUgdG8gY29udmVydFxuICogQHJldHVybnMge251bWJlcn0gSW50ZWdlciB2YWx1ZVxuICovXG5mdW5jdGlvbiBpbnQodmFsKSB7XG4gICAgLy8gSGFuZGxlIG51bGwsIHVuZGVmaW5lZCwgZW1wdHkgc3RyaW5nXG4gICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCB8fCB2YWwgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8vIFRyeSB0byBwYXJzZSB0aGUgdmFsdWVcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludCh2YWwsIDEwKTtcblxuICAgIC8vIENoZWNrIGZvciBOYU4gYW5kIHJldHVybiAwIGlmIHBhcnNpbmcgZmFpbGVkXG4gICAgcmV0dXJuIGlzTmFOKHBhcnNlZCkgPyAwIDogcGFyc2VkO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgdmFsdWUgdG8gYSBzdHJpbmdcbiAqIFJldHVybnMgZW1wdHkgc3RyaW5nIGZvciBudWxsIG9yIHVuZGVmaW5lZFxuICogQHBhcmFtIHsqfSB2YWwgLSBWYWx1ZSB0byBjb252ZXJ0XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTdHJpbmcgcmVwcmVzZW50YXRpb25cbiAqL1xuZnVuY3Rpb24gc3RyKHZhbCkge1xuICAgIC8vIEhhbmRsZSBudWxsIGFuZCB1bmRlZmluZWQgc3BlY2lhbGx5XG4gICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCB0byBzdHJpbmdcbiAgICByZXR1cm4gU3RyaW5nKHZhbCk7XG59XG5cbi8qKlxuICogQ29udmVydHMgbnVtZXJpYyBzdHJpbmdzIHRvIG51bWJlcnMsIHJldHVybnMgYWxsIG90aGVyIHZhbHVlcyB1bmNoYW5nZWRcbiAqIFVzZWQgd2hlbiB5b3UgbmVlZCB0byBlbnN1cmUgbnVtZXJpYyB0eXBlcyBidXQgZG9uJ3Qgd2FudCB0byBmb3JjZVxuICogY29udmVyc2lvbiBvZiBub24tbnVtZXJpYyB2YWx1ZXMgKHdoaWNoIHdvdWxkIGJlY29tZSAwKVxuICogQHBhcmFtIHsqfSB2YWwgLSBWYWx1ZSB0byBjb252ZXJ0XG4gKiBAcmV0dXJucyB7Kn0gTnVtYmVyIGlmIGlucHV0IHdhcyBudW1lcmljIHN0cmluZywgb3RoZXJ3aXNlIHVuY2hhbmdlZFxuICovXG5mdW5jdGlvbiB2YWx1ZV91bmxlc3NfbnVtZXJpY19zdHJpbmdfdGhlbl9udW1lcmljX3ZhbHVlKHZhbCkge1xuICAgIC8vIElmIGl0J3MgYWxyZWFkeSBhIG51bWJlciwgcmV0dXJuIGl0XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhIHN0cmluZyBhbmQgbnVtZXJpYywgY29udmVydCBpdFxuICAgIGlmIChpc19zdHJpbmcodmFsKSAmJiBpc19udW1lcmljKHZhbCkpIHtcbiAgICAgICAgLy8gVXNlIHBhcnNlRmxvYXQgdG8gaGFuZGxlIGJvdGggaW50ZWdlcnMgYW5kIGZsb2F0c1xuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWwpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBldmVyeXRoaW5nIGVsc2UgdW5jaGFuZ2VkIChudWxsLCBvYmplY3RzLCBub24tbnVtZXJpYyBzdHJpbmdzLCBldGMuKVxuICAgIHJldHVybiB2YWw7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNUUklORyBNQU5JUFVMQVRJT04gRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRXNjYXBlcyBIVE1MIHNwZWNpYWwgY2hhcmFjdGVycyAodXNlcyBMb2Rhc2ggZXNjYXBlKVxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFN0cmluZyB0byBlc2NhcGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEhUTUwtZXNjYXBlZCBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gaHRtbChzdHIpIHtcbiAgICByZXR1cm4gXy5lc2NhcGUoc3RyKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBuZXdsaW5lcyB0byBIVE1MIGxpbmUgYnJlYWtzXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gU3RyaW5nIHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFN0cmluZyB3aXRoIG5ld2xpbmVzIHJlcGxhY2VkIGJ5IDxiciAvPlxuICovXG5mdW5jdGlvbiBubDJicihzdHIpIHtcbiAgICBpZiAodHlwZW9mIHN0ciA9PT0gdW5kZWYgfHwgc3RyID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIChzdHIgKyAnJykucmVwbGFjZSgvKFtePlxcclxcbl0/KShcXHJcXG58XFxuXFxyfFxccnxcXG4pL2csICckMTxiciAvPiQyJyk7XG59XG5cbi8qKlxuICogRXNjYXBlcyBIVE1MIGFuZCBjb252ZXJ0cyBuZXdsaW5lcyB0byA8YnIgLz5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBTdHJpbmcgdG8gcHJvY2Vzc1xuICogQHJldHVybnMge3N0cmluZ30gSFRNTC1lc2NhcGVkIHN0cmluZyB3aXRoIGxpbmUgYnJlYWtzXG4gKi9cbmZ1bmN0aW9uIGh0bWxicihzdHIpIHtcbiAgICByZXR1cm4gbmwyYnIoaHRtbChzdHIpKTtcbn1cblxuLyoqXG4gKiBVUkwtZW5jb2RlcyBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFN0cmluZyB0byBlbmNvZGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFVSTC1lbmNvZGVkIHN0cmluZ1xuICovXG5mdW5jdGlvbiB1cmxlbmNvZGUoc3RyKSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpO1xufVxuXG4vKipcbiAqIFVSTC1kZWNvZGVzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gU3RyaW5nIHRvIGRlY29kZVxuICogQHJldHVybnMge3N0cmluZ30gVVJMLWRlY29kZWQgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIHVybGRlY29kZShzdHIpIHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0cik7XG59XG5cbi8qKlxuICogSlNPTi1lbmNvZGVzIGEgdmFsdWVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgLSBWYWx1ZSB0byBlbmNvZGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEpTT04gc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGpzb25fZW5jb2RlKHZhbHVlKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbn1cblxuLyoqXG4gKiBKU09OLWRlY29kZXMgYSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBKU09OIHN0cmluZyB0byBkZWNvZGVcbiAqIEByZXR1cm5zIHsqfSBEZWNvZGVkIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIGpzb25fZGVjb2RlKHN0cikge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHN0cik7XG59XG5cbi8qKlxuICogQ29uc29sZSBkZWJ1ZyBvdXRwdXQgd2l0aCBjaGFubmVsIGZpbHRlcmluZ1xuICogQWxpYXMgZm9yIERlYnVnZ2VyLmNvbnNvbGVfZGVidWdcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gRGVidWcgY2hhbm5lbCBuYW1lXG4gKiBAcGFyYW0gey4uLip9IHZhbHVlcyAtIFZhbHVlcyB0byBsb2dcbiAqL1xuZnVuY3Rpb24gY29uc29sZV9kZWJ1ZyhjaGFubmVsLCAuLi52YWx1ZXMpIHtcbiAgICBEZWJ1Z2dlci5jb25zb2xlX2RlYnVnKGNoYW5uZWwsIC4uLnZhbHVlcyk7XG59XG5cbi8qKlxuICogUmVwbGFjZXMgYWxsIG9jY3VycmVuY2VzIG9mIGEgc3Vic3RyaW5nIGluIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIC0gU3RyaW5nIHRvIHNlYXJjaCBpblxuICogQHBhcmFtIHtzdHJpbmd9IHNlYXJjaCAtIFN1YnN0cmluZyB0byBmaW5kXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVwbGFjZSAtIFJlcGxhY2VtZW50IHN1YnN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gU3RyaW5nIHdpdGggYWxsIG9jY3VycmVuY2VzIHJlcGxhY2VkXG4gKi9cbmZ1bmN0aW9uIHJlcGxhY2VfYWxsKHN0cmluZywgc2VhcmNoLCByZXBsYWNlKSB7XG4gICAgaWYgKCFpc19zdHJpbmcoc3RyaW5nKSkge1xuICAgICAgICBzdHJpbmcgPSBzdHJpbmcgKyAnJztcbiAgICB9XG4gICAgcmV0dXJuIHN0cmluZy5zcGxpdChzZWFyY2gpLmpvaW4ocmVwbGFjZSk7XG59XG5cbi8qKlxuICogQ2FwaXRhbGl6ZXMgdGhlIGZpcnN0IGxldHRlciBvZiBlYWNoIHdvcmRcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCAtIFN0cmluZyB0byBjYXBpdGFsaXplXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTdHJpbmcgd2l0aCBmaXJzdCBsZXR0ZXIgb2YgZWFjaCB3b3JkIGNhcGl0YWxpemVkXG4gKi9cbmZ1bmN0aW9uIHVjd29yZHMoaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXRcbiAgICAgICAgLnNwbGl0KCcgJylcbiAgICAgICAgLm1hcCgod29yZCkgPT4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSkpXG4gICAgICAgIC5qb2luKCcgJyk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE9CSkVDVCBBTkQgQVJSQVkgVVRJTElUSUVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ291bnRzIHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyBpbiBhbiBvYmplY3Qgb3IgZWxlbWVudHMgaW4gYW4gYXJyYXlcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBvIC0gT2JqZWN0IG9yIGFycmF5IHRvIGNvdW50XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBOdW1iZXIgb2Ygb3duIHByb3BlcnRpZXMvZWxlbWVudHNcbiAqL1xuZnVuY3Rpb24gY291bnQobykge1xuICAgIGxldCBjID0gMDtcbiAgICBmb3IgKGNvbnN0IGsgaW4gbykge1xuICAgICAgICBpZiAoby5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgKytjO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzaGFsbG93IGNsb25lIG9mIGFuIG9iamVjdCwgYXJyYXksIG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IG9iaiAtIFZhbHVlIHRvIGNsb25lXG4gKiBAcmV0dXJucyB7Kn0gQ2xvbmVkIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIGNsb25lKG9iaikge1xuICAgIGlmICh0eXBlb2YgRnVuY3Rpb24ucHJvdG90eXBlLl9fY2xvbmUgPT0gdW5kZWYpIHtcbiAgICAgICAgRnVuY3Rpb24ucHJvdG90eXBlLl9fY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvL2h0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE4MzM1ODgvamF2YXNjcmlwdC1jbG9uZS1hLWZ1bmN0aW9uXG4gICAgICAgICAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIGxldCB0ZW1wID0gZnVuY3Rpb24gY2xvbmVkKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGF0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBba2V5XSA9IHRoaXNba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGVtcDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBvYmouX19jbG9uZSgpO1xuICAgIH0gZWxzZSBpZiAob2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3RvciA9PSBBcnJheSkge1xuICAgICAgICByZXR1cm4gb2JqLnNsaWNlKDApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzcyODM2MC9ob3ctZG8taS1jb3JyZWN0bHktY2xvbmUtYS1qYXZhc2NyaXB0LW9iamVjdC8zMDA0Mjk0OCMzMDA0Mjk0OFxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb2JqKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3Qgbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlIGZyb20gYXJndW1lbnRzXG4gKiBAcGFyYW0gey4uLip9IGFyZ3VtZW50cyAtIFZhbHVlcyB0byBjaGVja1xuICogQHJldHVybnMgeyp9IEZpcnN0IG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZSwgb3IgbnVsbCBpZiBub25lIGZvdW5kXG4gKi9cbmZ1bmN0aW9uIGNvYWxlc2NlKCkge1xuICAgIGxldCBhcmdzID0gQXJyYXkuZnJvbShhcmd1bWVudHMpO1xuICAgIGxldCByZXR1cm5fdmFsID0gbnVsbDtcbiAgICBhcmdzLmZvckVhY2goZnVuY3Rpb24gKGFyZykge1xuICAgICAgICBpZiAocmV0dXJuX3ZhbCA9PT0gbnVsbCAmJiB0eXBlb2YgYXJnICE9IHVuZGVmICYmIGFyZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuX3ZhbCA9IGFyZztcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXR1cm5fdmFsO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIENTViBzdHJpbmcgdG8gYXJyYXksIHRyaW1taW5nIGVhY2ggZWxlbWVudFxuICogQHBhcmFtIHtzdHJpbmd9IHN0cl9jc3YgLSBDU1Ygc3RyaW5nIHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBBcnJheSBvZiB0cmltbWVkIHZhbHVlc1xuICogQHRvZG8gSGFuZGxlIHF1b3RlZC9lc2NhcGVkIGNoYXJhY3RlcnNcbiAqL1xuZnVuY3Rpb24gY3N2X3RvX2FycmF5X3RyaW0oc3RyX2Nzdikge1xuICAgIGNvbnN0IHBhcnRzID0gc3RyX2Nzdi5zcGxpdCgnLCcpO1xuICAgIGNvbnN0IHJldCA9IFtdO1xuICAgIGZvcmVhY2gocGFydHMsIChwYXJ0KSA9PiB7XG4gICAgICAgIHJldC5wdXNoKHBhcnQudHJpbSgpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmV0O1xufVxuIiwiLyoqXG4gKiBNYW5pZmVzdCAtIEphdmFTY3JpcHQgY2xhc3MgcmVnaXN0cnkgYW5kIG1ldGFkYXRhIHN5c3RlbVxuICpcbiAqIFRoaXMgY2xhc3MgbWFpbnRhaW5zIGEgcmVnaXN0cnkgb2YgYWxsIEphdmFTY3JpcHQgY2xhc3NlcyBpbiB0aGUgYnVuZGxlLFxuICogdHJhY2tpbmcgdGhlaXIgbmFtZXMgYW5kIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMuIEl0IHByb3ZpZGVzIHV0aWxpdGllc1xuICogZm9yIHdvcmtpbmcgd2l0aCBjbGFzcyBoaWVyYXJjaGllcyBhbmQgY2FsbGluZyBpbml0aWFsaXphdGlvbiBtZXRob2RzLlxuICovXG5jbGFzcyBNYW5pZmVzdCB7XG4gICAgLyoqXG4gICAgICogRGVmaW5lIGNsYXNzZXMgaW4gdGhlIG1hbmlmZXN0IChmcmFtZXdvcmsgaW50ZXJuYWwpXG4gICAgICogQHBhcmFtIHtBcnJheX0gaXRlbXMgLSBBcnJheSBvZiBjbGFzcyBkZWZpbml0aW9ucyBbW0NsYXNzLCBcIkNsYXNzTmFtZVwiLCBQYXJlbnRDbGFzcywgZGVjb3JhdG9yc10sIC4uLl1cbiAgICAgKi9cbiAgICBzdGF0aWMgX2RlZmluZShpdGVtcykge1xuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBjbGFzc2VzIG9iamVjdCBpZiBub3QgYWxyZWFkeSBkZWZpbmVkXG4gICAgICAgIGlmICh0eXBlb2YgTWFuaWZlc3QuX2NsYXNzZXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBNYW5pZmVzdC5fY2xhc3NlcyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJvY2VzcyBlYWNoIGNsYXNzIGRlZmluaXRpb25cbiAgICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgbGV0IGNsYXNzX29iamVjdCA9IGl0ZW1bMF07XG4gICAgICAgICAgICBsZXQgY2xhc3NfbmFtZSA9IGl0ZW1bMV07XG4gICAgICAgICAgICBsZXQgY2xhc3NfZXh0ZW5kcyA9IGl0ZW1bMl0gfHwgbnVsbDtcbiAgICAgICAgICAgIGxldCBkZWNvcmF0b3JzID0gaXRlbVszXSB8fCBudWxsO1xuXG4gICAgICAgICAgICAvLyBTdG9yZSB0aGUgY2xhc3MgaW5mb3JtYXRpb24gKHVzaW5nIG9iamVjdCB0byBhdm9pZCBkdXBsaWNhdGVzKVxuICAgICAgICAgICAgTWFuaWZlc3QuX2NsYXNzZXNbY2xhc3NfbmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgY2xhc3M6IGNsYXNzX29iamVjdCxcbiAgICAgICAgICAgICAgICBuYW1lOiBjbGFzc19uYW1lLFxuICAgICAgICAgICAgICAgIGV4dGVuZHM6IGNsYXNzX2V4dGVuZHMsXG4gICAgICAgICAgICAgICAgZGVjb3JhdG9yczogZGVjb3JhdG9ycywgIC8vIFN0b3JlIGNvbXBhY3QgZGVjb3JhdG9yIGRhdGFcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIEFkZCBtZXRhZGF0YSB0byB0aGUgY2xhc3Mgb2JqZWN0IGl0c2VsZlxuICAgICAgICAgICAgY2xhc3Nfb2JqZWN0Ll9uYW1lID0gY2xhc3NfbmFtZTtcbiAgICAgICAgICAgIGNsYXNzX29iamVjdC5fZXh0ZW5kcyA9IGNsYXNzX2V4dGVuZHM7XG4gICAgICAgICAgICBjbGFzc19vYmplY3QuX2RlY29yYXRvcnMgPSBkZWNvcmF0b3JzO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBCdWlsZCB0aGUgc3ViY2xhc3MgaW5kZXggYWZ0ZXIgYWxsIGNsYXNzZXMgYXJlIGRlZmluZWRcbiAgICAgICAgTWFuaWZlc3QuX2J1aWxkX3N1YmNsYXNzX2luZGV4KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGQgYW4gaW5kZXggb2Ygc3ViY2xhc3NlcyBmb3IgZWZmaWNpZW50IGxvb2t1cHNcbiAgICAgKiBUaGlzIGNyZWF0ZXMgYSBtYXBwaW5nIHdoZXJlIGVhY2ggY2xhc3MgbmFtZSBwb2ludHMgdG8gYW4gYXJyYXkgb2YgYWxsIGl0cyBzdWJjbGFzc2VzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzdGF0aWMgX2J1aWxkX3N1YmNsYXNzX2luZGV4KCkge1xuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBzdWJjbGFzcyBpbmRleFxuICAgICAgICBNYW5pZmVzdC5fc3ViY2xhc3NfaW5kZXggPSB7fTtcblxuICAgICAgICAvLyBTdGVwIHRocm91Z2ggZWFjaCBjbGFzcyBhbmQgd2FsayB1cCBpdHMgcGFyZW50IGNoYWluXG4gICAgICAgIGZvciAobGV0IGNsYXNzX25hbWUgaW4gTWFuaWZlc3QuX2NsYXNzZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzZGF0YSA9IE1hbmlmZXN0Ll9jbGFzc2VzW2NsYXNzX25hbWVdO1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRfY2xhc3NfbmFtZSA9IGNsYXNzX25hbWU7XG4gICAgICAgICAgICBsZXQgY3VycmVudF9jbGFzc2RhdGEgPSBjbGFzc2RhdGE7XG5cbiAgICAgICAgICAgIC8vIFdhbGsgdXAgdGhlIHBhcmVudCBjaGFpbiB1bnRpbCB3ZSByZWFjaCB0aGUgcm9vdFxuICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRfY2xhc3NkYXRhKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXh0ZW5kc19uYW1lID0gY3VycmVudF9jbGFzc2RhdGEuZXh0ZW5kcztcblxuICAgICAgICAgICAgICAgIGlmIChleHRlbmRzX25hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGFyZW50J3Mgc3ViY2xhc3MgYXJyYXkgaWYgbmVlZGVkXG4gICAgICAgICAgICAgICAgICAgIGlmICghTWFuaWZlc3QuX3N1YmNsYXNzX2luZGV4W2V4dGVuZHNfbmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0Ll9zdWJjbGFzc19pbmRleFtleHRlbmRzX25hbWVdID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhpcyBjbGFzcyB0byBpdHMgcGFyZW50J3Mgc3ViY2xhc3MgbGlzdFxuICAgICAgICAgICAgICAgICAgICBpZiAoIU1hbmlmZXN0Ll9zdWJjbGFzc19pbmRleFtleHRlbmRzX25hbWVdLmluY2x1ZGVzKGNsYXNzX25hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdC5fc3ViY2xhc3NfaW5kZXhbZXh0ZW5kc19uYW1lXS5wdXNoKGNsYXNzX25hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSB1cCB0byB0aGUgcGFyZW50J3MgbWV0YWRhdGEgKGlmIGl0IGV4aXN0cyBpbiBtYW5pZmVzdClcbiAgICAgICAgICAgICAgICAgICAgaWYgKE1hbmlmZXN0Ll9jbGFzc2VzW2V4dGVuZHNfbmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfY2xhc3NkYXRhID0gTWFuaWZlc3QuX2NsYXNzZXNbZXh0ZW5kc19uYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhcmVudCBub3QgaW4gbWFuaWZlc3QgKGUuZy4sIG5hdGl2ZSBKYXZhU2NyaXB0IGNsYXNzKSwgc3RvcCBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2NsYXNzZGF0YSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBObyBwYXJlbnQsIHdlJ3ZlIHJlYWNoZWQgdGhlIHJvb3RcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9jbGFzc2RhdGEgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgY2xhc3NlcyB0aGF0IGV4dGVuZCBhIGdpdmVuIGJhc2UgY2xhc3NcbiAgICAgKiBAcGFyYW0ge0NsYXNzfHN0cmluZ30gYmFzZV9jbGFzcyAtIFRoZSBiYXNlIGNsYXNzIChvYmplY3Qgb3IgbmFtZSBzdHJpbmcpIHRvIGNoZWNrIGZvclxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gQXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHtjbGFzc19uYW1lLCBjbGFzc19vYmplY3R9IGZvciBjbGFzc2VzIHRoYXQgZXh0ZW5kIHRoZSBiYXNlIGNsYXNzXG4gICAgICovXG4gICAgc3RhdGljIGdldF9leHRlbmRpbmcoYmFzZV9jbGFzcykge1xuICAgICAgICBpZiAoIU1hbmlmZXN0Ll9jbGFzc2VzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IHN0cmluZyB0byBjbGFzcyBvYmplY3QgaWYgbmVlZGVkXG4gICAgICAgIGxldCBiYXNlX2NsYXNzX29iamVjdCA9IGJhc2VfY2xhc3M7XG4gICAgICAgIGlmICh0eXBlb2YgYmFzZV9jbGFzcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGJhc2VfY2xhc3Nfb2JqZWN0ID0gTWFuaWZlc3QuZ2V0X2NsYXNzX2J5X25hbWUoYmFzZV9jbGFzcyk7XG4gICAgICAgICAgICBpZiAoIWJhc2VfY2xhc3Nfb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCYXNlIGNsYXNzIG5vdCBmb3VuZDogJHtiYXNlX2NsYXNzfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGNsYXNzX25hbWUgaW4gTWFuaWZlc3QuX2NsYXNzZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzZGF0YSA9IE1hbmlmZXN0Ll9jbGFzc2VzW2NsYXNzX25hbWVdO1xuICAgICAgICAgICAgaWYgKE1hbmlmZXN0LmpzX2lzX3N1YmNsYXNzX29mKGNsYXNzZGF0YS5jbGFzcywgYmFzZV9jbGFzc19vYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NfbmFtZTogY2xhc3NfbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3Nfb2JqZWN0OiBjbGFzc2RhdGEuY2xhc3MsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3J0IGFscGhhYmV0aWNhbGx5IGJ5IGNsYXNzIG5hbWUgdG8gZW5zdXJlIGRldGVybWluaXN0aWMgYmVoYXZpb3IgYW5kIHByZXZlbnQgcmFjZSBjb25kaXRpb24gYnVnc1xuICAgICAgICBjbGFzc2VzLnNvcnQoKGEsIGIpID0+IGEuY2xhc3NfbmFtZS5sb2NhbGVDb21wYXJlKGIuY2xhc3NfbmFtZSkpO1xuXG4gICAgICAgIHJldHVybiBjbGFzc2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgY2xhc3MgaXMgYSBzdWJjbGFzcyBvZiBhbm90aGVyIGNsYXNzXG4gICAgICogTWF0Y2hlcyBQSFAgTWFuaWZlc3Q6OmpzX2lzX3N1YmNsYXNzX29mKCkgc2lnbmF0dXJlIGFuZCBiZWhhdmlvclxuICAgICAqIEBwYXJhbSB7Q2xhc3N8c3RyaW5nfSBzdWJjbGFzcyAtIFRoZSBjaGlsZCBjbGFzcyAob2JqZWN0IG9yIG5hbWUpIHRvIGNoZWNrXG4gICAgICogQHBhcmFtIHtDbGFzc3xzdHJpbmd9IHN1cGVyY2xhc3MgLSBUaGUgcGFyZW50IGNsYXNzIChvYmplY3Qgb3IgbmFtZSkgdG8gY2hlY2sgYWdhaW5zdFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHN1YmNsYXNzIGV4dGVuZHMgc3VwZXJjbGFzcyAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSlcbiAgICAgKi9cbiAgICBzdGF0aWMganNfaXNfc3ViY2xhc3Nfb2Yoc3ViY2xhc3MsIHN1cGVyY2xhc3MpIHtcbiAgICAgICAgLy8gQ29udmVydCBzdHJpbmcgbmFtZXMgdG8gY2xhc3Mgb2JqZWN0c1xuICAgICAgICBsZXQgc3ViY2xhc3Nfb2JqZWN0ID0gc3ViY2xhc3M7XG4gICAgICAgIGlmICh0eXBlb2Ygc3ViY2xhc3MgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBzdWJjbGFzc19vYmplY3QgPSBNYW5pZmVzdC5nZXRfY2xhc3NfYnlfbmFtZShzdWJjbGFzcyk7XG4gICAgICAgICAgICBpZiAoIXN1YmNsYXNzX29iamVjdCkge1xuICAgICAgICAgICAgICAgIC8vIENhbid0IHJlc29sdmUgc3ViY2xhc3MgLSByZXR1cm4gZmFsc2UgcGVyIHNwZWNcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3VwZXJjbGFzc19vYmplY3QgPSBzdXBlcmNsYXNzO1xuICAgICAgICBpZiAodHlwZW9mIHN1cGVyY2xhc3MgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBzdXBlcmNsYXNzX29iamVjdCA9IE1hbmlmZXN0LmdldF9jbGFzc19ieV9uYW1lKHN1cGVyY2xhc3MpO1xuICAgICAgICAgICAgaWYgKCFzdXBlcmNsYXNzX29iamVjdCkge1xuICAgICAgICAgICAgICAgIC8vIENhbid0IHJlc29sdmUgc3VwZXJjbGFzcyAtIGZhaWwgbG91ZCBwZXIgc3BlY1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3VwZXJjbGFzcyBub3QgZm91bmQgaW4gbWFuaWZlc3Q6ICR7c3VwZXJjbGFzc31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsYXNzZXMgYXJlIG5vdCBzdWJjbGFzc2VzIG9mIHRoZW1zZWx2ZXNcbiAgICAgICAgaWYgKHN1YmNsYXNzX29iamVjdCA9PT0gc3VwZXJjbGFzc19vYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdhbGsgdXAgdGhlIGluaGVyaXRhbmNlIGNoYWluXG4gICAgICAgIGxldCBjdXJyZW50X2NsYXNzID0gc3ViY2xhc3Nfb2JqZWN0O1xuICAgICAgICB3aGlsZSAoY3VycmVudF9jbGFzcykge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRfY2xhc3MgPT09IHN1cGVyY2xhc3Nfb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBNb3ZlIHVwIHRvIHBhcmVudCBjbGFzc1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRfY2xhc3MuX2V4dGVuZHMpIHtcbiAgICAgICAgICAgICAgICAvLyBfZXh0ZW5kcyBtYXkgYmUgYSBzdHJpbmcgb3IgY2xhc3MgcmVmZXJlbmNlXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50X2NsYXNzLl9leHRlbmRzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2NsYXNzID0gTWFuaWZlc3QuZ2V0X2NsYXNzX2J5X25hbWUoY3VycmVudF9jbGFzcy5fZXh0ZW5kcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9jbGFzcyA9IGN1cnJlbnRfY2xhc3MuX2V4dGVuZHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50X2NsYXNzID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBjbGFzcyBieSBpdHMgbmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc19uYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNsYXNzXG4gICAgICogQHJldHVybnMge0NsYXNzfG51bGx9IFRoZSBjbGFzcyBvYmplY3Qgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0X2NsYXNzX2J5X25hbWUoY2xhc3NfbmFtZSkge1xuICAgICAgICBpZiAoIU1hbmlmZXN0Ll9jbGFzc2VzIHx8ICFNYW5pZmVzdC5fY2xhc3Nlc1tjbGFzc19uYW1lXSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gTWFuaWZlc3QuX2NsYXNzZXNbY2xhc3NfbmFtZV0uY2xhc3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCByZWdpc3RlcmVkIGNsYXNzZXNcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IEFycmF5IG9mIG9iamVjdHMgd2l0aCB7Y2xhc3NfbmFtZSwgY2xhc3Nfb2JqZWN0LCBleHRlbmRzfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRfYWxsX2NsYXNzZXMoKSB7XG4gICAgICAgIGlmICghTWFuaWZlc3QuX2NsYXNzZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgY2xhc3NfbmFtZSBpbiBNYW5pZmVzdC5fY2xhc3Nlcykge1xuICAgICAgICAgICAgY29uc3QgY2xhc3NkYXRhID0gTWFuaWZlc3QuX2NsYXNzZXNbY2xhc3NfbmFtZV07XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGNsYXNzX25hbWU6IGNsYXNzZGF0YS5uYW1lLFxuICAgICAgICAgICAgICAgIGNsYXNzX29iamVjdDogY2xhc3NkYXRhLmNsYXNzLFxuICAgICAgICAgICAgICAgIGV4dGVuZHM6IGNsYXNzZGF0YS5leHRlbmRzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3J0IGFscGhhYmV0aWNhbGx5IGJ5IGNsYXNzIG5hbWUgdG8gZW5zdXJlIGRldGVybWluaXN0aWMgYmVoYXZpb3IgYW5kIHByZXZlbnQgcmFjZSBjb25kaXRpb24gYnVnc1xuICAgICAgICByZXN1bHRzLnNvcnQoKGEsIGIpID0+IGEuY2xhc3NfbmFtZS5sb2NhbGVDb21wYXJlKGIuY2xhc3NfbmFtZSkpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYnVpbGQga2V5IGZyb20gdGhlIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgYnVpbGQga2V5IG9yIFwiTk9CVUlMRFwiIGlmIG5vdCBhdmFpbGFibGVcbiAgICAgKi9cbiAgICBzdGF0aWMgYnVpbGRfa2V5KCkge1xuICAgICAgICBpZiAod2luZG93LnJzeGFwcCAmJiB3aW5kb3cucnN4YXBwLmJ1aWxkX2tleSkge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5yc3hhcHAuYnVpbGRfa2V5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnTk9CVUlMRCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGRlY29yYXRvcnMgZm9yIGEgc3BlY2lmaWMgY2xhc3MgYW5kIG1ldGhvZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfENsYXNzfSBjbGFzc19uYW1lIC0gVGhlIGNsYXNzIG5hbWUgb3IgY2xhc3Mgb2JqZWN0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZF9uYW1lIC0gVGhlIG1ldGhvZCBuYW1lXG4gICAgICogQHJldHVybnMge0FycmF5fG51bGx9IEFycmF5IG9mIGRlY29yYXRvciBvYmplY3RzIG9yIG51bGwgaWYgbm9uZSBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRfZGVjb3JhdG9ycyhjbGFzc19uYW1lLCBtZXRob2RfbmFtZSkge1xuICAgICAgICAvLyBDb252ZXJ0IGNsYXNzIG9iamVjdCB0byBuYW1lIGlmIG5lZWRlZFxuICAgICAgICBpZiAodHlwZW9mIGNsYXNzX25hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjbGFzc19uYW1lID0gY2xhc3NfbmFtZS5fbmFtZSB8fCBjbGFzc19uYW1lLm5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGFzc19pbmZvID0gTWFuaWZlc3QuX2NsYXNzZXNbY2xhc3NfbmFtZV07XG4gICAgICAgIGlmICghY2xhc3NfaW5mbyB8fCAhY2xhc3NfaW5mby5kZWNvcmF0b3JzIHx8ICFjbGFzc19pbmZvLmRlY29yYXRvcnNbbWV0aG9kX25hbWVdKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYW5zZm9ybSBjb21wYWN0IGZvcm1hdCB0byBvYmplY3QgZm9ybWF0XG4gICAgICAgIHJldHVybiBNYW5pZmVzdC5fdHJhbnNmb3JtX2RlY29yYXRvcnMoY2xhc3NfaW5mby5kZWNvcmF0b3JzW21ldGhvZF9uYW1lXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBtZXRob2RzIHdpdGggZGVjb3JhdG9ycyBmb3IgYSBjbGFzc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfENsYXNzfSBjbGFzc19uYW1lIC0gVGhlIGNsYXNzIG5hbWUgb3IgY2xhc3Mgb2JqZWN0XG4gICAgICogQHJldHVybnMge09iamVjdH0gT2JqZWN0IHdpdGggbWV0aG9kIG5hbWVzIGFzIGtleXMgYW5kIGRlY29yYXRvciBhcnJheXMgYXMgdmFsdWVzXG4gICAgICovXG4gICAgc3RhdGljIGdldF9hbGxfZGVjb3JhdG9ycyhjbGFzc19uYW1lKSB7XG4gICAgICAgIC8vIENvbnZlcnQgY2xhc3Mgb2JqZWN0IHRvIG5hbWUgaWYgbmVlZGVkXG4gICAgICAgIGlmICh0eXBlb2YgY2xhc3NfbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNsYXNzX25hbWUgPSBjbGFzc19uYW1lLl9uYW1lIHx8IGNsYXNzX25hbWUubmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsYXNzX2luZm8gPSBNYW5pZmVzdC5fY2xhc3Nlc1tjbGFzc19uYW1lXTtcbiAgICAgICAgaWYgKCFjbGFzc19pbmZvIHx8ICFjbGFzc19pbmZvLmRlY29yYXRvcnMpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYW5zZm9ybSBhbGwgZGVjb3JhdG9ycyBmcm9tIGNvbXBhY3QgdG8gb2JqZWN0IGZvcm1hdFxuICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgbWV0aG9kX25hbWUgaW4gY2xhc3NfaW5mby5kZWNvcmF0b3JzKSB7XG4gICAgICAgICAgICByZXN1bHRbbWV0aG9kX25hbWVdID0gTWFuaWZlc3QuX3RyYW5zZm9ybV9kZWNvcmF0b3JzKGNsYXNzX2luZm8uZGVjb3JhdG9yc1ttZXRob2RfbmFtZV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIGNvbXBhY3QgZGVjb3JhdG9yIGZvcm1hdCB0byBvYmplY3QgZm9ybWF0XG4gICAgICogQHBhcmFtIHtBcnJheX0gY29tcGFjdF9kZWNvcmF0b3JzIC0gQXJyYXkgb2YgW25hbWUsIFthcmdzXV0gdHVwbGVzXG4gICAgICogQHJldHVybnMge0FycmF5fSBBcnJheSBvZiBkZWNvcmF0b3Igb2JqZWN0cyB3aXRoIG5hbWUgYW5kIGFyZ3VtZW50cyBwcm9wZXJ0aWVzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzdGF0aWMgX3RyYW5zZm9ybV9kZWNvcmF0b3JzKGNvbXBhY3RfZGVjb3JhdG9ycykge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29tcGFjdF9kZWNvcmF0b3JzKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbXBhY3RfZGVjb3JhdG9ycy5tYXAoZGVjb3JhdG9yID0+IHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRlY29yYXRvcikgJiYgZGVjb3JhdG9yLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogZGVjb3JhdG9yWzBdLFxuICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHM6IGRlY29yYXRvclsxXSB8fCBbXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBIYW5kbGUgbWFsZm9ybWVkIGRlY29yYXRvciBkYXRhXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6ICd1bmtub3duJyxcbiAgICAgICAgICAgICAgICBhcmd1bWVudHM6IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIG1ldGhvZCBoYXMgYSBzcGVjaWZpYyBkZWNvcmF0b3JcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xDbGFzc30gY2xhc3NfbmFtZSAtIFRoZSBjbGFzcyBuYW1lIG9yIGNsYXNzIG9iamVjdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RfbmFtZSAtIFRoZSBtZXRob2QgbmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZWNvcmF0b3JfbmFtZSAtIFRoZSBkZWNvcmF0b3IgbmFtZSB0byBjaGVjayBmb3JcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWV0aG9kIGhhcyB0aGUgZGVjb3JhdG9yXG4gICAgICovXG4gICAgc3RhdGljIGhhc19kZWNvcmF0b3IoY2xhc3NfbmFtZSwgbWV0aG9kX25hbWUsIGRlY29yYXRvcl9uYW1lKSB7XG4gICAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBNYW5pZmVzdC5nZXRfZGVjb3JhdG9ycyhjbGFzc19uYW1lLCBtZXRob2RfbmFtZSk7XG4gICAgICAgIGlmICghZGVjb3JhdG9ycykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlY29yYXRvcnMuc29tZShkID0+IGQubmFtZSA9PT0gZGVjb3JhdG9yX25hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgc3ViY2xhc3NlcyBvZiBhIGdpdmVuIGNsYXNzIHVzaW5nIHRoZSBwcmUtYnVpbHQgaW5kZXhcbiAgICAgKiBUaGlzIGlzIHRoZSBKYXZhU2NyaXB0IGVxdWl2YWxlbnQgb2YgUEhQJ3MgTWFuaWZlc3Q6OmpzX2dldF9zdWJjbGFzc2VzX29mKClcbiAgICAgKiBAcGFyYW0ge0NsYXNzfHN0cmluZ30gYmFzZV9jbGFzcyAtIFRoZSBiYXNlIGNsYXNzIChvYmplY3Qgb3IgbmFtZSBzdHJpbmcpIHRvIGdldCBzdWJjbGFzc2VzIG9mXG4gICAgICogQHJldHVybnMge0FycmF5PENsYXNzPn0gQXJyYXkgb2YgYWN0dWFsIGNsYXNzIG9iamVjdHMgdGhhdCBhcmUgc3ViY2xhc3NlcyBvZiB0aGUgYmFzZSBjbGFzc1xuICAgICAqL1xuICAgIHN0YXRpYyBqc19nZXRfc3ViY2xhc3Nlc19vZihiYXNlX2NsYXNzKSB7XG4gICAgICAgIC8vIEluaXRpYWxpemUgaW5kZXggaWYgbmVlZGVkXG4gICAgICAgIGlmICghTWFuaWZlc3QuX3N1YmNsYXNzX2luZGV4KSB7XG4gICAgICAgICAgICBNYW5pZmVzdC5fYnVpbGRfc3ViY2xhc3NfaW5kZXgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgY2xhc3Mgb2JqZWN0IHRvIG5hbWUgaWYgbmVlZGVkXG4gICAgICAgIGxldCBiYXNlX2NsYXNzX25hbWUgPSBiYXNlX2NsYXNzO1xuICAgICAgICBpZiAodHlwZW9mIGJhc2VfY2xhc3MgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBiYXNlX2NsYXNzX25hbWUgPSBiYXNlX2NsYXNzLl9uYW1lIHx8IGJhc2VfY2xhc3MubmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBiYXNlIGNsYXNzIGV4aXN0c1xuICAgICAgICBpZiAoIU1hbmlmZXN0Ll9jbGFzc2VzW2Jhc2VfY2xhc3NfbmFtZV0pIHtcbiAgICAgICAgICAgIC8vIEJhc2UgY2xhc3Mgbm90IGluIG1hbmlmZXN0IC0gcmV0dXJuIGVtcHR5IGFycmF5XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgc3ViY2xhc3MgbmFtZXMgZnJvbSB0aGUgaW5kZXhcbiAgICAgICAgY29uc3Qgc3ViY2xhc3NfbmFtZXMgPSBNYW5pZmVzdC5fc3ViY2xhc3NfaW5kZXhbYmFzZV9jbGFzc19uYW1lXSB8fCBbXTtcblxuICAgICAgICAvLyBDb252ZXJ0IG5hbWVzIHRvIGFjdHVhbCBjbGFzcyBvYmplY3RzXG4gICAgICAgIGNvbnN0IHN1YmNsYXNzX29iamVjdHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgc3ViY2xhc3NfbmFtZSBvZiBzdWJjbGFzc19uYW1lcykge1xuICAgICAgICAgICAgY29uc3QgY2xhc3NkYXRhID0gTWFuaWZlc3QuX2NsYXNzZXNbc3ViY2xhc3NfbmFtZV07XG4gICAgICAgICAgICBzdWJjbGFzc19vYmplY3RzLnB1c2goY2xhc3NkYXRhLmNsYXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNvcnQgYnkgY2xhc3MgbmFtZSBmb3IgZGV0ZXJtaW5pc3RpYyBiZWhhdmlvclxuICAgICAgICBzdWJjbGFzc19vYmplY3RzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWVfYSA9IGEuX25hbWUgfHwgYS5uYW1lO1xuICAgICAgICAgICAgY29uc3QgbmFtZV9iID0gYi5fbmFtZSB8fCBiLm5hbWU7XG4gICAgICAgICAgICByZXR1cm4gbmFtZV9hLmxvY2FsZUNvbXBhcmUobmFtZV9iKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHN1YmNsYXNzX29iamVjdHM7XG4gICAgfVxufVxuXG4vLyBSU1ggbWFuaWZlc3QgYXV0b21hdGljYWxseSBtYWtlcyBjbGFzc2VzIGdsb2JhbCAtIG5vIG1hbnVhbCBhc3NpZ25tZW50IG5lZWRlZFxuIiwiLyoqXG4gKiBSc3hfQmVoYXZpb3JzIC0gQ29yZSBGcmFtZXdvcmsgVXNlciBFeHBlcmllbmNlIEVuaGFuY2VtZW50c1xuICpcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYXV0b21hdGljIHF1YWxpdHktb2YtbGlmZSBiZWhhdmlvcnMgdGhhdCBpbXByb3ZlIHRoZSBkZWZhdWx0XG4gKiBicm93c2VyIGV4cGVyaWVuY2UgZm9yIFJTWCBhcHBsaWNhdGlvbnMuIFRoZXNlIGJlaGF2aW9ycyBhcmUgdHJhbnNwYXJlbnQgdG9cbiAqIGFwcGxpY2F0aW9uIGRldmVsb3BlcnMgYW5kIHJ1biBhdXRvbWF0aWNhbGx5IG9uIGZyYW1ld29yayBpbml0aWFsaXphdGlvbi5cbiAqXG4gKiBUaGVzZSBiZWhhdmlvcnMgdXNlIGpRdWVyeSBldmVudCBkZWxlZ2F0aW9uIHRvIGhhbmRsZSBib3RoIGV4aXN0aW5nIGFuZCBkeW5hbWljYWxseVxuICogYWRkZWQgY29udGVudC4gVGhleSBhcmUgaW1wbGVtZW50ZWQgd2l0aCBsb3cgcHJpb3JpdHkgdG8gYWxsb3cgYXBwbGljYXRpb24gY29kZSB0b1xuICogb3ZlcnJpZGUgZGVmYXVsdCBiZWhhdmlvcnMgd2hlbiBuZWVkZWQuXG4gKlxuICogQGludGVybmFsIEZyYW1ld29yayB1c2Ugb25seSAtIG5vdCBwYXJ0IG9mIHB1YmxpYyBBUElcbiAqL1xuY2xhc3MgUnN4X0JlaGF2aW9ycyB7XG4gICAgc3RhdGljIF9vbl9mcmFtZXdvcmtfY29yZV9pbml0KCkge1xuICAgICAgICBSc3hfQmVoYXZpb3JzLl9pbml0X2lnbm9yZV9pbnZhbGlkX2FuY2hvcl9saW5rcygpO1xuICAgICAgICBSc3hfQmVoYXZpb3JzLl90cmltX2NvcGllZF90ZXh0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogLSBBbmNob3IgbGluayBoYW5kbGluZzogUHJldmVudHMgYnJva2VuIFwiI1wiIGxpbmtzIGZyb20gY2F1c2luZyBwYWdlIGp1bXBzIG9yIFVSTCBjaGFuZ2VzXG4gICAgICogLSBJZ25vcmVzIFwiI1wiIChlbXB0eSBoYXNoKSB0byBwcmV2ZW50IHNjcm9sbC10by10b3AgYmVoYXZpb3JcbiAgICAgKiAtIElnbm9yZXMgXCIjcGxhY2Vob2xkZXIqXCIgbGlua3MgdXNlZCBhcyByb3V0ZSBwbGFjZWhvbGRlcnMgZHVyaW5nIGRldmVsb3BtZW50XG4gICAgICogLSBWYWxpZGF0ZXMgYW5jaG9yIHRhcmdldHMgZXhpc3QgYmVmb3JlIGFsbG93aW5nIG5hdmlnYXRpb25cbiAgICAgKiAtIFByZXNlcnZlcyBub3JtYWwgYW5jaG9yIGJlaGF2aW9yIHdoZW4gdGFyZ2V0cyBleGlzdFxuICAgICAqL1xuICAgIHN0YXRpYyBfaW5pdF9pZ25vcmVfaW52YWxpZF9hbmNob3JfbGlua3MoKSB7XG4gICAgICAgIHJldHVybjsgLy8gZGlzYWJsZWQgZm9yIG5vdyAtIG1ha2UgdGhpcyBpbnRvIGEgY29uZmlndXJhYmxlIG9wdGlvblxuXG4gICAgICAgIC8vIFVzZSBldmVudCBkZWxlZ2F0aW9uIG9uIGRvY3VtZW50IHRvIGhhbmRsZSBhbGwgY3VycmVudCBhbmQgZnV0dXJlIGFuY2hvciBjbGlja3NcbiAgICAgICAgLy8gVXNlIG1vdXNlZG93biBpbnN0ZWFkIG9mIGNsaWNrIHRvIHJ1biBiZWZvcmUgbW9zdCBhcHBsaWNhdGlvbiBoYW5kbGVyc1xuICAgICAgICAkKGRvY3VtZW50KS5vbignbW91c2Vkb3duJywgJ2FbaHJlZl49XCIjXCJdJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGNvbnN0ICRsaW5rID0gJCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGhyZWYgPSAkbGluay5hdHRyKCdocmVmJyk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGFub3RoZXIgaGFuZGxlciBoYXMgYWxyZWFkeSBwcmV2ZW50ZWQgZGVmYXVsdFxuICAgICAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFsbG93IGRhdGEtcnN4LWFsbG93LWhhc2ggYXR0cmlidXRlIHRvIGJ5cGFzcyB0aGlzIGJlaGF2aW9yXG4gICAgICAgICAgICBpZiAoJGxpbmsuZGF0YSgncnN4LWFsbG93LWhhc2gnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSGFuZGxlIGVtcHR5IGhhc2ggLSBwcmV2ZW50IHNjcm9sbCB0byB0b3BcbiAgICAgICAgICAgIGlmIChocmVmID09PSAnIycpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEhhbmRsZSBwbGFjZWhvbGRlciBsaW5rcyB1c2VkIGR1cmluZyBkZXZlbG9wbWVudFxuICAgICAgICAgICAgaWYgKGhyZWYuc3RhcnRzV2l0aCgnI3BsYWNlaG9sZGVyJykpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZvciBvdGhlciBoYXNoIGxpbmtzLCBjaGVjayBpZiB0YXJnZXQgZXhpc3RzXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRJZCA9IGhyZWYuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgaWYgKHRhcmdldElkKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGVsZW1lbnQgd2l0aCBtYXRjaGluZyBJRCBvciBuYW1lIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldEV4aXN0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhcmdldElkKSAhPT0gbnVsbCB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbbmFtZT1cIiR7dGFyZ2V0SWR9XCJdYCkgIT09IG51bGw7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldEV4aXN0cykge1xuICAgICAgICAgICAgICAgICAgICAvLyBUYXJnZXQgZG9lc24ndCBleGlzdCAtIHByZXZlbnQgbmF2aWdhdGlvblxuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVGFyZ2V0IGV4aXN0cyAtIGFsbG93IG5vcm1hbCBhbmNob3IgYmVoYXZpb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogLSBDb3B5IHRleHQgdHJpbW1pbmc6IEF1dG9tYXRpY2FsbHkgcmVtb3ZlcyBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSBjb3BpZWQgdGV4dFxuICAgICAqIC0gSG9sZCBTaGlmdCB0byBwcmVzZXJ2ZSB3aGl0ZXNwYWNlXG4gICAgICogLSBTa2lwcyB0cmltbWluZyBpbiBjb2RlIGJsb2NrcywgdGV4dGFyZWFzLCBhbmQgY29udGVudGVkaXRhYmxlIGVsZW1lbnRzXG4gICAgICovXG4gICAgc3RhdGljIF90cmltX2NvcGllZF90ZXh0KCkge1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjb3B5JywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAvLyBEb24ndCB0cmltIGlmIHVzZXIgaXMgaG9sZGluZyBTaGlmdCAoYWxsb3dzIGNvcHlpbmcgd2l0aCB3aGl0ZXNwYWNlIGlmIG5lZWRlZClcbiAgICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBsZXQgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgbGV0IHNlbGVjdGVkX3RleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgLy8gRG9uJ3QgdHJpbSBpZiBzZWxlY3Rpb24gaXMgZW1wdHlcbiAgICAgICAgICAgIGlmICghc2VsZWN0ZWRfdGV4dCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyBEb24ndCB0cmltIGlmIGNvcHlpbmcgZnJvbSBjb2RlIGJsb2NrcywgdGV4dGFyZWFzLCBvciBjb250ZW50LWVkaXRhYmxlIChwcmVzZXJ2ZSBmb3JtYXR0aW5nKVxuICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gMykgY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGU7IC8vIFRleHQgbm9kZSB0byBlbGVtZW50XG4gICAgICAgICAgICBpZiAoY29udGFpbmVyLmNsb3Nlc3QoJ3ByZSwgY29kZSwgLmNvZGUtYmxvY2ssIHRleHRhcmVhLCBbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXScpKSByZXR1cm47XG5cbiAgICAgICAgICAgIGxldCB0cmltbWVkX3RleHQgPSBzZWxlY3RlZF90ZXh0LnRyaW0oKTtcblxuICAgICAgICAgICAgLy8gT25seSBtb2RpZnkgaWYgdGhlcmUncyBhY3R1YWxseSB3aGl0ZXNwYWNlIHRvIHRyaW1cbiAgICAgICAgICAgIGlmICh0cmltbWVkX3RleHQgIT09IHNlbGVjdGVkX3RleHQgJiYgdHJpbW1lZF90ZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGV2ZW50LmNsaXBib2FyZERhdGEuc2V0RGF0YSgndGV4dC9wbGFpbicsIHRyaW1tZWRfdGV4dCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvcHk6IHRyaW1tZWQgd2hpdGVzcGFjZSBmcm9tIHNlbGVjdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCIvLyBTaW1wbGUga2V5IHZhbHVlIGNhY2hlLiAgQ2FuIG9ubHkgc3RvcmUgNTAwMCBlbnRyaWVzLCB3aWxsIHJlc2V0IGFmdGVyIDUwMDAgZW50cmllcy5cblxuLy8gVG9kbzoga2VlcCBsb2NhbCBjYWNoZSBjb25jZXB0IHRoZSBzYW1lLCByZXBsYWNlIGdsb2JhbCBjYWNoZSBjb25jZXB0IHdpdGggdGhlIG5vdiAyMDE5IHZlcnNpb24gb2Zcbi8vIHNlc3Npb24gY2FjaGUuICBVc2UgYSBzZXNzaW9uIGtleSAmIGJ1aWxkIGtleSB0byB0cmFjayBjYWNoZSBrZXlzIHNvIGNhY2hlZCB2YWx1ZXMgb25seSBsYXN0IHVudGlsIHVzZXIgbG9ncyBvdXQuXG4vLyByZXZpZXcgc2Vzc2lvbiBjb2RlIHRvIGVuc3VyZSB0aGF0IHNlc3Npb24ga2V5ICphbHdheXMqIHJvdGF0ZXMgb24gbG9nb3V0LiAgTWFrZSBzZXNzaW9uIGlkIGEgcHJvdGVjdGVkIHZhbHVlLlxuY2xhc3MgUnN4X0NhY2hlIHtcbiAgICBzdGF0aWMgb25fY29yZV9kZWZpbmUoKSB7XG4gICAgICAgIENvcmVfQ2FjaGUuX2NhY2hlcyA9IHtcbiAgICAgICAgICAgIGdsb2JhbDoge30sXG4gICAgICAgICAgICBpbnN0YW5jZToge30sXG4gICAgICAgIH07XG5cbiAgICAgICAgQ29yZV9DYWNoZS5fY2FjaGVzX3NldCA9IDA7XG4gICAgfVxuXG4gICAgLy8gQWxpYXMgZm9yIGdldF9pbnN0YW5jZVxuICAgIHN0YXRpYyBnZXQoa2V5KSB7XG4gICAgICAgIHJldHVybiBSc3hfQ2FjaGUuZ2V0X2luc3RhbmNlKGtleSk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyBmcm9tIHRoZSBwb29sIG9mIGNhY2hlZCBkYXRhIGZvciB0aGlzICdpbnN0YW5jZScuICBBbiBpbnN0YW5jZVxuICAgIC8vIGluIHRoaXMgY2FzZSBpcyBhIHZpcnR1YWwgcGFnZSBsb2FkIC8gbmF2aWdhdGlvbiBpbiB0aGUgU1BBLiAgQ2FsbCBNYWluLmxpYi5yZXNldCgpIHRvIHJlc2V0LlxuICAgIC8vIFJldHVybnMgbnVsbCBvbiBmYWlsdXJlXG4gICAgc3RhdGljIGdldF9pbnN0YW5jZShrZXkpIHtcbiAgICAgICAgaWYgKE1haW4uZGVidWcoJ25vX2FwaV9jYWNoZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBrZXlfZW5jb2RlZCA9IFJzeF9DYWNoZS5fZW5jb2Rla2V5KGtleSk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBDb3JlX0NhY2hlLl9jYWNoZXMuaW5zdGFuY2Vba2V5X2VuY29kZWRdICE9IHVuZGVmKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShDb3JlX0NhY2hlLl9jYWNoZXMuaW5zdGFuY2Vba2V5X2VuY29kZWRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgbnVsbCBvbiBmYWlsdXJlXG4gICAgLy8gUmV0dXJucyBhIGNhY2hlZCB2YWx1ZSBmcm9tIGdsb2JhbCBjYWNoZSAodW5pcXVlIHRvIHBhZ2UgbG9hZCwgc3Vydml2ZXMgcmVzZXQoKSlcbiAgICBzdGF0aWMgZ2V0X2dsb2JhbChrZXkpIHtcbiAgICAgICAgaWYgKE1haW4uZGVidWcoJ25vX2FwaV9jYWNoZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBrZXlfZW5jb2RlZCA9IFJzeF9DYWNoZS5fZW5jb2Rla2V5KGtleSk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBDb3JlX0NhY2hlLl9jYWNoZXMuZ2xvYmFsW2tleV9lbmNvZGVkXSAhPSB1bmRlZikge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoQ29yZV9DYWNoZS5fY2FjaGVzLmdsb2JhbFtrZXlfZW5jb2RlZF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gU2V0cyBhIHZhbHVlIGluIGluc3RhbmNlIGFuZCBnbG9iYWwgY2FjaGUgKG5vdCBzaGFyZWQgYmV0d2VlbiBicm93c2VyIHRhYnMpXG4gICAgc3RhdGljIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmIChNYWluLmRlYnVnKCdub19hcGlfY2FjaGUnKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gNjQgKiAxMDI0KSB7XG4gICAgICAgICAgICBEZWJ1Z2dlci5jb25zb2xlX2RlYnVnKCdDQUNIRScsICdXYXJuaW5nIC0gbm90IGNhY2hpbmcgbGFyZ2UgY2FjaGUgZW50cnknLCBrZXkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGtleV9lbmNvZGVkID0gUnN4X0NhY2hlLl9lbmNvZGVrZXkoa2V5KTtcblxuICAgICAgICBDb3JlX0NhY2hlLl9jYWNoZXMuZ2xvYmFsW2tleV9lbmNvZGVkXSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgQ29yZV9DYWNoZS5fY2FjaGVzLmluc3RhbmNlW2tleV9lbmNvZGVkXSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcblxuICAgICAgICAvLyBEZWJ1Z2dlci5jb25zb2xlX2RlYnVnKFwiQ0FDSEVcIiwgXCJTZXRcIiwga2V5LCB2YWx1ZSk7XG5cbiAgICAgICAgQ29yZV9DYWNoZS5fY2FjaGVzX3NldCsrO1xuXG4gICAgICAgIC8vIFJlc2V0IGNhY2hlIGFmdGVyIDUwMDAgaXRlbXMgc2V0XG4gICAgICAgIGlmIChDb3JlX0NhY2hlLl9jYWNoZXNfc2V0ID4gNTAwMCkge1xuICAgICAgICAgICAgLy8gR2V0IGFuIGFjY3VyYXRlIGNvdW50XG4gICAgICAgICAgICBDb3JlX0NhY2hlLl9jYWNoZXNfc2V0ID0gY291bnQoQ29yZV9DYWNoZS5fY2FjaGVzLmdsb2JhbCk7XG5cbiAgICAgICAgICAgIGlmIChDb3JlX0NhY2hlLl9jYWNoZXNfc2V0ID4gNTAwMCkge1xuICAgICAgICAgICAgICAgIENvcmVfQ2FjaGUuX2NhY2hlcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2U6IHt9LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgQ29yZV9DYWNoZS5fY2FjaGVzX3NldCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIG51bGwgb24gZmFpbHVyZVxuICAgIC8vIFJldHVybnMgYSBjYWNoZWQgdmFsdWUgZnJvbSBzZXNzaW9uIGNhY2hlIChzaGFyZWQgYmV0d2VlbiBicm93c2VyIHRhYnMpXG4gICAgc3RhdGljIGdldF9zZXNzaW9uKGtleSkge1xuICAgICAgICBpZiAoTWFpbi5kZWJ1Zygnbm9fYXBpX2NhY2hlJykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFSc3hfQ2FjaGUuX3N1cHBvcnRzU3RvcmFnZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBrZXlfZW5jb2RlZCA9IFJzeF9DYWNoZS5fZW5jb2Rla2V5KGtleSk7XG5cbiAgICAgICAgbGV0IHJzID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShrZXlfZW5jb2RlZCk7XG5cbiAgICAgICAgaWYgKCFlbXB0eShycykpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0cyBhIHZhbHVlIGluIHNlc3Npb24gY2FjaGUgKHNoYXJlZCBiZXR3ZWVuIGJyb3dzZXIgdGFicylcbiAgICBzdGF0aWMgc2V0X3Nlc3Npb24oa2V5LCB2YWx1ZSwgX3RyeWFnYWluID0gdHJ1ZSkge1xuICAgICAgICBpZiAoTWFpbi5kZWJ1Zygnbm9fYXBpX2NhY2hlJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiA2NCAqIDEwMjQpIHtcbiAgICAgICAgICAgIERlYnVnZ2VyLmNvbnNvbGVfZGVidWcoJ0NBQ0hFJywgJ1dhcm5pbmcgLSBub3QgY2FjaGluZyBsYXJnZSBjYWNoZSBlbnRyeScsIGtleSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIVJzeF9DYWNoZS5fc3VwcG9ydHNTdG9yYWdlKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGtleV9lbmNvZGVkID0gUnN4X0NhY2hlLl9lbmNvZGVrZXkoa2V5KTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShrZXlfZW5jb2RlZCk7XG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGtleV9lbmNvZGVkLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoUnN4X0NhY2hlLl9pc091dE9mU3BhY2UoZSkgJiYgc2Vzc2lvblN0b3JhZ2UubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICBpZiAoX3RyeWFnYWluKSB7XG4gICAgICAgICAgICAgICAgICAgIENvcmVfQ2FjaGUuc2V0X3Nlc3Npb24oa2V5LCB2YWx1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBfcmVzZXQoKSB7XG4gICAgICAgIENvcmVfQ2FjaGUuX2NhY2hlcy5pbnN0YW5jZSA9IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvciBnaXZlbiBrZXkgb2YgYW55IHR5cGUgaW5jbHVkaW5nIGFuIG9iamVjdCwgcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZ1xuICAgICAqIHRoZSBrZXkgdGhhdCB0aGUgY2FjaGVkIHZhbHVlIHNob3VsZCBiZSBzdG9yZWQgYXMgaW4gc2Vzc2lvbnN0b3JhZ2VcbiAgICAgKi9cbiAgICBzdGF0aWMgX2VuY29kZWtleShrZXkpIHtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gJ2NhY2hlXyc7XG5cbiAgICAgICAgLy8gU2Vzc2lvbiByZWltcGxlbWVudFxuICAgICAgICAvLyB2YXIgcHJlZml4ID0gXCJjYWNoZV9cIiArIFNwYS5zZXNzaW9uKCkudXNlcl9pZCgpICsgXCJfXCI7XG5cbiAgICAgICAgaWYgKGlzX3N0cmluZyhrZXkpICYmIGtleS5sZW5ndGggPCAxNTAgJiYga2V5LmluZGV4T2YoJyAnKSA9PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIE1hbmlmZXN0LmJ1aWxkX2tleSgpICsgJ18nICsga2V5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIGhhc2goW01hbmlmZXN0LmJ1aWxkX2tleSgpLCBrZXldKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERldGVybWluZXMgaWYgc2Vzc2lvblN0b3JhZ2UgaXMgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyO1xuICAgIC8vIHJlc3VsdCBpcyBjYWNoZWQgZm9yIGJldHRlciBwZXJmb3JtYW5jZSBpbnN0ZWFkIG9mIGJlaW5nIHJ1biBlYWNoIHRpbWUuXG4gICAgLy8gRmVhdHVyZSBkZXRlY3Rpb24gaXMgYmFzZWQgb24gaG93IE1vZGVybml6ciBkb2VzIGl0O1xuICAgIC8vIGl0J3Mgbm90IHN0cmFpZ2h0Zm9yd2FyZCBkdWUgdG8gRkY0IGlzc3Vlcy5cbiAgICAvLyBJdCdzIG5vdCBydW4gYXQgcGFyc2UtdGltZSBhcyBpdCB0YWtlcyAyMDBtcyBpbiBBbmRyb2lkLlxuICAgIC8vIENvZGUgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vcGFtZWxhZm94L2xzY2FjaGUvYmxvYi9tYXN0ZXIvbHNjYWNoZS5qcywgQXBhY2hlIExpY2Vuc2UgUGFtZWxhZm94XG4gICAgc3RhdGljIF9zdXBwb3J0c1N0b3JhZ2UoKSB7XG4gICAgICAgIGxldCBrZXkgPSAnX19jYWNoZXRlc3RfXyc7XG4gICAgICAgIGxldCB2YWx1ZSA9IGtleTtcblxuICAgICAgICBpZiAoUnN4X0NhY2hlLl9fc3VwcG9ydHNTdG9yYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSc3hfQ2FjaGUuX19zdXBwb3J0c1N0b3JhZ2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzb21lIGJyb3dzZXJzIHdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgeW91IHRyeSB0byBhY2Nlc3MgbG9jYWwgc3RvcmFnZSAoZS5nLiBicmF2ZSBicm93c2VyKVxuICAgICAgICAvLyBoZW5jZSBjaGVjayBpcyBpbnNpZGUgYSB0cnkvY2F0Y2hcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghc2Vzc2lvblN0b3JhZ2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgICAgIFJzeF9DYWNoZS5fX3N1cHBvcnRzU3RvcmFnZSA9IHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGhpdCB0aGUgbGltaXQsIGFuZCB3ZSBkb24ndCBoYXZlIGFuIGVtcHR5IHNlc3Npb25TdG9yYWdlIHRoZW4gaXQgbWVhbnMgd2UgaGF2ZSBzdXBwb3J0XG4gICAgICAgICAgICBpZiAoUnN4X0NhY2hlLl9pc091dE9mU3BhY2UoZSkgJiYgc2Vzc2lvblN0b3JhZ2UubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgUnN4X0NhY2hlLl9fc3VwcG9ydHNTdG9yYWdlID0gdHJ1ZTsgLy8ganVzdCBtYXhlZCBpdCBvdXQgYW5kIGV2ZW4gdGhlIHNldCB0ZXN0IGZhaWxlZC5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgUnN4X0NhY2hlLl9fc3VwcG9ydHNTdG9yYWdlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUnN4X0NhY2hlLl9fc3VwcG9ydHNTdG9yYWdlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHRvIHNldCBpZiB0aGUgZXJyb3IgaXMgdXMgZGVhbGluZyB3aXRoIGJlaW5nIG91dCBvZiBzcGFjZVxuICAgIHN0YXRpYyBfaXNPdXRPZlNwYWNlKGUpIHtcbiAgICAgICAgcmV0dXJuIGUgJiYgKGUubmFtZSA9PT0gJ1FVT1RBX0VYQ0VFREVEX0VSUicgfHwgZS5uYW1lID09PSAnTlNfRVJST1JfRE9NX1FVT1RBX1JFQUNIRUQnIHx8IGUubmFtZSA9PT0gJ1F1b3RhRXhjZWVkZWRFcnJvcicpO1xuICAgIH1cbn1cbiIsIi8qKlxuICogUnN4X0luaXQgLSBDb3JlIGZyYW1ld29yayBpbml0aWFsaXphdGlvbiBhbmQgZW52aXJvbm1lbnQgdmFsaWRhdGlvblxuICovXG5jbGFzcyBSc3hfSW5pdCB7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHZpYSBSc3guX3JzeF9jb3JlX2Jvb3RcbiAgICAgKiBJbml0aWFsaXplcyB0aGUgY29yZSBlbnZpcm9ubWVudCBhbmQgcnVucyBiYXNpYyBzYW5pdHkgY2hlY2tzXG4gICAgICovXG4gICAgc3RhdGljIF9vbl9mcmFtZXdvcmtfY29yZV9pbml0KCkge1xuICAgICAgICBpZiAoIVJzeC5pc19wcm9kKCkpIHtcbiAgICAgICAgICAgIFJzeF9Jbml0Ll9fZW52aXJvbm1lbnRfY2hlY2tzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCBjaGVja3MgdG8gZW5zdXJlIHByb3BlciBjb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgc3RhdGljIF9fZW52aXJvbm1lbnRfY2hlY2tzKCkge1xuICAgICAgICAvLyBGaW5kIGFsbCBzY3JpcHQgdGFncyBpbiB0aGUgRE9NXG4gICAgICAgIGNvbnN0IHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0Jyk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY3JpcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBzY3JpcHRzW2ldO1xuXG4gICAgICAgICAgICAvLyBTa2lwIGlubGluZSBzY3JpcHRzIChubyBzcmMgYXR0cmlidXRlKVxuICAgICAgICAgICAgaWYgKCFzY3JpcHQuc3JjKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHNjcmlwdCBoYXMgZGVmZXIgYXR0cmlidXRlXG4gICAgICAgICAgICBpZiAoIXNjcmlwdC5kZWZlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNyYyA9IHNjcmlwdC5zcmMgfHwgJyhpbmxpbmUgc2NyaXB0KSc7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhc29uID0gYEFsbCBzY3JpcHQgdGFncyB1c2VkIGluIGFuIFJTcGFkZSBwcm9qZWN0IG11c3QgaGF2ZSBkZWZlciBhdHRyaWJ1dGUuIEZvdW5kIHNjcmlwdCB3aXRob3V0IGRlZmVyOiAke3NyY31gO1xuXG4gICAgICAgICAgICAgICAgLy8gU3RvcCBmcmFtZXdvcmsgYm9vdCB3aXRoIHJlYXNvblxuICAgICAgICAgICAgICAgIFJzeC5fcnN4X2NvcmVfYm9vdF9zdG9wKHJlYXNvbik7XG5cbiAgICAgICAgICAgICAgICAvLyBBbHNvIGxvZyB0byBjb25zb2xlIGZvciB2aXNpYmlsaXR5XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgW1JTWCBCT09UIFNUT1BQRURdICR7cmVhc29ufWApO1xuXG4gICAgICAgICAgICAgICAgLy8gU3RvcCBjaGVja2luZyBhZnRlciBmaXJzdCB2aW9sYXRpb25cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59IiwiLy8gQEZJTEUtU1VCQ0xBU1MtMDEtRVhDRVBUSU9OXG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgSmF2YVNjcmlwdCBPUk0gbW9kZWxzXG4gKlxuICogUHJvdmlkZXMgY29yZSBmdW5jdGlvbmFsaXR5IGZvciBmZXRjaGluZyByZWNvcmRzIGZyb20gYmFja2VuZCBQSFAgbW9kZWxzLlxuICogQWxsIG1vZGVsIHN0dWJzIGdlbmVyYXRlZCBieSB0aGUgbWFuaWZlc3QgZXh0ZW5kIHRoaXMgYmFzZSBjbGFzcy5cbiAqXG4gKiBFeGFtcGxlIHVzYWdlOlxuICogICAvLyBGZXRjaCBzaW5nbGUgcmVjb3JkXG4gKiAgIGNvbnN0IHVzZXIgPSBhd2FpdCBVc2VyX01vZGVsLmZldGNoKDEyMyk7XG4gKlxuICogICAvLyBGZXRjaCBtdWx0aXBsZSByZWNvcmRzXG4gKiAgIGNvbnN0IHVzZXJzID0gYXdhaXQgVXNlcl9Nb2RlbC5mZXRjaChbMSwgMiwgM10pO1xuICpcbiAqICAgLy8gQ3JlYXRlIGluc3RhbmNlIHdpdGggZGF0YVxuICogICBjb25zdCB1c2VyID0gbmV3IFVzZXJfTW9kZWwoe2lkOiAxLCBuYW1lOiAnSm9obid9KTtcbiAqXG4gKiAgQEluc3RhbnRpYXRhYmxlXG4gKi9cbmNsYXNzIFJzeF9Kc19Nb2RlbCB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IgLSBJbml0aWFsaXplIG1vZGVsIGluc3RhbmNlIHdpdGggZGF0YVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBLZXktdmFsdWUgcGFpcnMgdG8gcG9wdWxhdGUgdGhlIG1vZGVsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZGF0YSA9IHt9KSB7XG4gICAgICAgIC8vIF9fTU9ERUwgU1lTVEVNOiBFbmFibGVzIGF1dG9tYXRpYyBPUk0gaW5zdGFudGlhdGlvbiB3aGVuIGZldGNoaW5nIGZyb20gUEhQIG1vZGVscy5cbiAgICAgICAgLy8gUEhQIG1vZGVscyBhZGQgXCJfX01PREVMXCI6IFwiQ2xhc3NOYW1lXCIgdG8gSlNPTiwgSmF2YVNjcmlwdCB1c2VzIGl0IHRvIGNyZWF0ZSBwcm9wZXIgaW5zdGFuY2VzLlxuICAgICAgICAvLyBUaGlzIHByb3ZpZGVzIHR5cGVkIG1vZGVsIG9iamVjdHMgaW5zdGVhZCBvZiBwbGFpbiBKU09OLCB3aXRoIG1ldGhvZHMgYW5kIHR5cGUgY2hlY2tpbmcuXG5cbiAgICAgICAgLy8gVGhpcyBjb25zdHJ1Y3RvciBmaWx0ZXJzIG91dCB0aGUgX19NT0RFTCBtYXJrZXIgdGhhdCB3YXMgdXNlZCB0byBpZGVudGlmeSB3aGljaCBjbGFzc1xuICAgICAgICAvLyB0byBpbnN0YW50aWF0ZSwga2VlcGluZyBvbmx5IHRoZSBhY3R1YWwgZGF0YSBwcm9wZXJ0aWVzIG9uIHRoZSBpbnN0YW5jZS5cbiAgICAgICAgY29uc3QgeyBfX01PREVMLCAuLi5tb2RlbERhdGEgfSA9IGRhdGE7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgbW9kZWxEYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCByZWNvcmQocykgZnJvbSB0aGUgYmFja2VuZCBtb2RlbFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgbWlycm9ycyB0aGUgUEhQIE1vZGVsOjpmZXRjaCgpIGZ1bmN0aW9uYWxpdHkuXG4gICAgICogVGhlIGJhY2tlbmQgbW9kZWwgbXVzdCBoYXZlIGEgZmV0Y2goKSBtZXRob2Qgd2l0aCB0aGVcbiAgICAgKiAjW0FqYXhfRW5kcG9pbnRfTW9kZWxfRmV0Y2hdIGFubm90YXRpb24gdG8gYmUgY2FsbGFibGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcnxBcnJheX0gaWQgLSBTaW5nbGUgSUQgb3IgYXJyYXkgb2YgSURzIHRvIGZldGNoXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IC0gU2luZ2xlIG1vZGVsIGluc3RhbmNlLCBhcnJheSBvZiBpbnN0YW5jZXMsIG9yIGZhbHNlXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIGZldGNoKGlkKSB7XG4gICAgICAgIGNvbnN0IEN1cnJlbnRDbGFzcyA9IHRoaXM7XG4gICAgICAgIC8vIEdldCB0aGUgbW9kZWwgY2xhc3MgbmFtZSBmcm9tIHRoZSBjdXJyZW50IGNsYXNzXG4gICAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IEN1cnJlbnRDbGFzcy5uYW1lO1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgJC5hamF4KHtcbiAgICAgICAgICAgIHVybDogYC9fZmV0Y2gvJHttb2RlbE5hbWV9YCxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgZGF0YTogeyBpZDogaWQgfSxcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEhhbmRsZSByZXNwb25zZSBiYXNlZCBvbiB0eXBlXG4gICAgICAgIGlmIChyZXNwb25zZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZSBfaW5zdGFudGlhdGVfbW9kZWxzX3JlY3Vyc2l2ZSB0byBoYW5kbGUgT1JNIGluc3RhbnRpYXRpb25cbiAgICAgICAgLy8gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IF9fTU9ERUwgcHJvcGVydGllcyBhbmQgY3JlYXRlIGFwcHJvcHJpYXRlIGluc3RhbmNlc1xuICAgICAgICByZXR1cm4gUnN4X0pzX01vZGVsLl9pbnN0YW50aWF0ZV9tb2RlbHNfcmVjdXJzaXZlKHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG1vZGVsIGNsYXNzIG5hbWVcbiAgICAgKiBVc2VkIGludGVybmFsbHkgZm9yIEFQSSBjYWxsc1xuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGNsYXNzIG5hbWVcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0TW9kZWxOYW1lKCkge1xuICAgICAgICBjb25zdCBDdXJyZW50Q2xhc3MgPSB0aGlzO1xuICAgICAgICByZXR1cm4gQ3VycmVudENsYXNzLm5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVmcmVzaCB0aGlzIGluc3RhbmNlIHdpdGggbGF0ZXN0IGRhdGEgZnJvbSBzZXJ2ZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBVcGRhdGVkIGluc3RhbmNlIG9yIGZhbHNlIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIGFzeW5jIHJlZnJlc2goKSB7XG4gICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgICAgICBpZiAoIXRoYXQuaWQpIHtcbiAgICAgICAgICAgIHNob3VsZG50X2hhcHBlbignQ2Fubm90IHJlZnJlc2ggbW9kZWwgd2l0aG91dCBpZCBwcm9wZXJ0eScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZnJlc2ggPSBhd2FpdCB0aGF0LmNvbnN0cnVjdG9yLmZldGNoKHRoYXQuaWQpO1xuXG4gICAgICAgIGlmIChmcmVzaCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGlzIGluc3RhbmNlIHdpdGggZnJlc2ggZGF0YVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoYXQsIGZyZXNoKTtcbiAgICAgICAgcmV0dXJuIHRoYXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBtb2RlbCBpbnN0YW5jZSB0byBwbGFpbiBvYmplY3RcbiAgICAgKiBVc2VmdWwgZm9yIHNlcmlhbGl6YXRpb24gb3Igc2VuZGluZyB0byBBUElzXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBQbGFpbiBvYmplY3QgcmVwcmVzZW50YXRpb25cbiAgICAgKi9cbiAgICB0b09iamVjdCgpIHtcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGF0KSB7XG4gICAgICAgICAgICBpZiAodGhhdC5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHR5cGVvZiB0aGF0W2tleV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBvYmpba2V5XSA9IHRoYXRba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgbW9kZWwgaW5zdGFuY2UgdG8gSlNPTiBzdHJpbmdcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IEpTT04gcmVwcmVzZW50YXRpb25cbiAgICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhhdC50b09iamVjdCgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWN1cnNpdmVseSBpbnN0YW50aWF0ZSBPUk0gbW9kZWxzIGluIHJlc3BvbnNlIGRhdGFcbiAgICAgKlxuICAgICAqIExvb2tzIGZvciBvYmplY3RzIHdpdGggX19NT0RFTCBwcm9wZXJ0eSBhbmQgaW5zdGFudGlhdGVzIHRoZSBhcHByb3ByaWF0ZVxuICAgICAqIEphdmFTY3JpcHQgbW9kZWwgY2xhc3MgaWYgaXQgZXhpc3RzIGluIHRoZSBnbG9iYWwgc2NvcGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IGRhdGEgLSBUaGUgZGF0YSB0byBwcm9jZXNzIChjYW4gYmUgYW55IHR5cGUpXG4gICAgICogQHJldHVybnMgeyp9IFRoZSBkYXRhIHdpdGggT1JNIG9iamVjdHMgaW5zdGFudGlhdGVkXG4gICAgICovXG4gICAgc3RhdGljIF9pbnN0YW50aWF0ZV9tb2RlbHNfcmVjdXJzaXZlKGRhdGEpIHtcbiAgICAgICAgLy8gX19NT0RFTCBTWVNURU06IEVuYWJsZXMgYXV0b21hdGljIE9STSBpbnN0YW50aWF0aW9uIHdoZW4gZmV0Y2hpbmcgZnJvbSBQSFAgbW9kZWxzLlxuICAgICAgICAvLyBQSFAgbW9kZWxzIGFkZCBcIl9fTU9ERUxcIjogXCJDbGFzc05hbWVcIiB0byBKU09OLCBKYXZhU2NyaXB0IHVzZXMgaXQgdG8gY3JlYXRlIHByb3BlciBpbnN0YW5jZXMuXG4gICAgICAgIC8vIFRoaXMgcHJvdmlkZXMgdHlwZWQgbW9kZWwgb2JqZWN0cyBpbnN0ZWFkIG9mIHBsYWluIEpTT04sIHdpdGggbWV0aG9kcyBhbmQgdHlwZSBjaGVja2luZy5cblxuICAgICAgICAvLyBUaGlzIHJlY3Vyc2l2ZSBwcm9jZXNzb3Igc2NhbnMgYWxsIEFQSSByZXNwb25zZSBkYXRhIGxvb2tpbmcgZm9yIF9fTU9ERUwgbWFya2Vycy5cbiAgICAgICAgLy8gV2hlbiBmb3VuZCwgaXQgYXR0ZW1wdHMgdG8gaW5zdGFudGlhdGUgdGhlIGFwcHJvcHJpYXRlIEphdmFTY3JpcHQgbW9kZWwgY2xhc3MsXG4gICAgICAgIC8vIGNvbnZlcnRpbmcge19fTU9ERUw6IFwiVXNlcl9Nb2RlbFwiLCBpZDogMSwgbmFtZTogXCJKb2huXCJ9IGludG8gbmV3IFVzZXJfTW9kZWwoey4uLn0pLlxuICAgICAgICAvLyBXb3JrcyByZWN1cnNpdmVseSB0aHJvdWdoIGFycmF5cyBhbmQgbmVzdGVkIG9iamVjdHMgdG8gaGFuZGxlIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzLlxuICAgICAgICAvLyBIYW5kbGUgbnVsbC91bmRlZmluZWRcbiAgICAgICAgaWYgKGRhdGEgPT09IG51bGwgfHwgZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBhcnJheXMgLSByZWN1cnNpdmVseSBwcm9jZXNzIGVhY2ggZWxlbWVudFxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGEubWFwKChpdGVtKSA9PiBSc3hfSnNfTW9kZWwuX2luc3RhbnRpYXRlX21vZGVsc19yZWN1cnNpdmUoaXRlbSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIG9iamVjdHNcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBvYmplY3QgaGFzIGEgX19NT0RFTCBwcm9wZXJ0eVxuICAgICAgICAgICAgaWYgKGRhdGEuX19NT0RFTCAmJiB0eXBlb2YgZGF0YS5fX01PREVMID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIC8vIFRyeSB0byBmaW5kIHRoZSBtb2RlbCBjbGFzcyBpbiB0aGUgZ2xvYmFsIHNjb3BlXG4gICAgICAgICAgICAgICAgY29uc3QgTW9kZWxDbGFzcyA9IHdpbmRvd1tkYXRhLl9fTU9ERUxdO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIG1vZGVsIGNsYXNzIGV4aXN0cyBhbmQgZXh0ZW5kcyBSc3hfSnNfTW9kZWwsIGluc3RhbnRpYXRlIGl0XG4gICAgICAgICAgICAgICAgLy8gRHluYW1pYyBtb2RlbCByZXNvbHV0aW9uIHJlcXVpcmVzIGNoZWNraW5nIGNsYXNzIGV4aXN0ZW5jZSAtIEBKUy1ERUZFTlNJVkUtMDEtRVhDRVBUSU9OXG4gICAgICAgICAgICAgICAgaWYgKE1vZGVsQ2xhc3MgJiYgTW9kZWxDbGFzcy5wcm90b3R5cGUgaW5zdGFuY2VvZiBSc3hfSnNfTW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbENsYXNzKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgcHJvY2VzcyBhbGwgb2JqZWN0IHByb3BlcnRpZXNcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBSc3hfSnNfTW9kZWwuX2luc3RhbnRpYXRlX21vZGVsc19yZWN1cnNpdmUoZGF0YVtrZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0dXJuIHByaW1pdGl2ZSB2YWx1ZXMgYXMtaXNcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxufVxuIiwiLyoqXG4gKiBWaWV3X1RyYW5zaXRpb25zIC0gU21vb3RoIHBhZ2UtdG8tcGFnZSB0cmFuc2l0aW9ucyB1c2luZyBWaWV3IFRyYW5zaXRpb25zIEFQSVxuICpcbiAqIEVuYWJsZXMgY3Jvc3MtZG9jdW1lbnQgdmlldyB0cmFuc2l0aW9ucyBzbyB0aGUgYnJvd3NlciBkb2Vzbid0IHBhaW50IHRoZSBuZXcgcGFnZVxuICogdW50aWwgaXQncyByZWFkeSwgY3JlYXRpbmcgc21vb3RoIGFuaW1hdGlvbnMgYmV0d2VlbiBwYWdlcy5cbiAqXG4gKiBGYWxscyBiYWNrIGdyYWNlZnVsbHkgaWYgVmlldyBUcmFuc2l0aW9ucyBBUEkgaXMgbm90IGF2YWlsYWJsZS5cbiAqL1xuY2xhc3MgUnN4X1ZpZXdfVHJhbnNpdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENhbGxlZCBkdXJpbmcgZnJhbWV3b3JrIGNvcmUgaW5pdCBwaGFzZVxuICAgICAqIENoZWNrcyBmb3IgVmlldyBUcmFuc2l0aW9ucyBBUEkgc3VwcG9ydCBhbmQgZW5hYmxlcyBpZiBhdmFpbGFibGVcbiAgICAgKi9cbiAgICBzdGF0aWMgX29uX2ZyYW1ld29ya19jb3JlX2luaXQoKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIFZpZXcgVHJhbnNpdGlvbnMgQVBJIGlzIHN1cHBvcnRlZFxuICAgICAgICBpZiAoIWRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgICAgIGNvbnNvbGVfZGVidWcoJ1ZJRVdfVFJBTlNJVElPTlMnLCAnVmlldyBUcmFuc2l0aW9ucyBBUEkgbm90IHN1cHBvcnRlZCwgc2tpcHBpbmcnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuYWJsZSBjcm9zcy1kb2N1bWVudCB2aWV3IHRyYW5zaXRpb25zIHZpYSBDU1NcbiAgICAgICAgUnN4X1ZpZXdfVHJhbnNpdGlvbnMuX2luamVjdF90cmFuc2l0aW9uX2NzcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluamVjdCBDU1MgdG8gZW5hYmxlIGNyb3NzLWRvY3VtZW50IHZpZXcgdHJhbnNpdGlvbnNcbiAgICAgKlxuICAgICAqIFRoZSBAdmlldy10cmFuc2l0aW9uIHsgbmF2aWdhdGlvbjogYXV0bzsgfSBydWxlIHRlbGxzIHRoZSBicm93c2VyIHRvOlxuICAgICAqIDEuIENhcHR1cmUgYSBzbmFwc2hvdCBvZiB0aGUgY3VycmVudCBwYWdlIGJlZm9yZSBuYXZpZ2F0aW9uXG4gICAgICogMi4gRmV0Y2ggdGhlIG5ldyBwYWdlXG4gICAgICogMy4gV2FpdCB1bnRpbCB0aGUgbmV3IHBhZ2UgaXMgZnVsbHkgbG9hZGVkIGFuZCBwYWludGVkIChkb2N1bWVudC5yZWFkeSlcbiAgICAgKiA0LiBBbmltYXRlIHNtb290aGx5IGJldHdlZW4gdGhlIHR3byBzdGF0ZXNcbiAgICAgKlxuICAgICAqIFRoaXMgcHJldmVudHMgdGhlIHdoaXRlIGZsYXNoIGR1cmluZyBuYXZpZ2F0aW9uIGFuZCBjcmVhdGVzIGFwcC1saWtlIHRyYW5zaXRpb25zLlxuICAgICAqL1xuICAgIHN0YXRpYyBfaW5qZWN0X3RyYW5zaXRpb25fY3NzKCkge1xuICAgICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG5cbiAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSBgXG4gICAgICAgICAgICBAdmlldy10cmFuc2l0aW9uIHtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uOiBhdXRvO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiBEaXNhYmxlIGFuaW1hdGlvbiAtIGluc3RhbnQgdHJhbnNpdGlvbiAqL1xuICAgICAgICAgICAgOjp2aWV3LXRyYW5zaXRpb24tZ3JvdXAoKiksXG4gICAgICAgICAgICA6OnZpZXctdHJhbnNpdGlvbi1vbGQoKiksXG4gICAgICAgICAgICA6OnZpZXctdHJhbnNpdGlvbi1uZXcoKikge1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIGA7XG5cbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgfVxufVxuIiwiLyoqXG4gKiBSZWFkV3JpdGVMb2NrIGltcGxlbWVudGF0aW9uIGZvciBSU3BhZGUgZnJhbWV3b3JrXG4gKiBQcm92aWRlcyBleGNsdXNpdmUgKHdyaXRlKSBhbmQgc2hhcmVkIChyZWFkKSBsb2NraW5nIG1lY2hhbmlzbXMgZm9yIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zXG4gKi9cbmNsYXNzIFJlYWRXcml0ZUxvY2sge1xuICAgIHN0YXRpYyAjbG9ja3MgPSBuZXcgTWFwKCk7XG5cbiAgICAvKipcbiAgICAgKiBHZXQgb3IgY3JlYXRlIGEgbG9jayBvYmplY3QgZm9yIGEgZ2l2ZW4gbmFtZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc3RhdGljICNnZXRfbG9jayhuYW1lKSB7XG4gICAgICAgIGxldCBzID0gdGhpcy4jbG9ja3MuZ2V0KG5hbWUpO1xuICAgICAgICBpZiAoIXMpIHtcbiAgICAgICAgICAgIHMgPSB7IHJlYWRlcnM6IDAsIHdyaXRlcl9hY3RpdmU6IGZhbHNlLCByZWFkZXJfcTogW10sIHdyaXRlcl9xOiBbXSB9O1xuICAgICAgICAgICAgdGhpcy4jbG9ja3Muc2V0KG5hbWUsIHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNjaGVkdWxlIHRoZSBuZXh0IG9wZXJhdGlvbiBmb3IgYSBsb2NrXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzdGF0aWMgI3NjaGVkdWxlKG5hbWUpIHtcbiAgICAgICAgY29uc3QgcyA9IHRoaXMuI2dldF9sb2NrKG5hbWUpO1xuICAgICAgICBpZiAocy53cml0ZXJfYWN0aXZlIHx8IHMucmVhZGVycyA+IDApIHJldHVybjtcblxuICAgICAgICAvLyBydW4gb25lIHdyaXRlciBpZiBxdWV1ZWRcbiAgICAgICAgaWYgKHMud3JpdGVyX3EubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgeyBjYiwgcmVzb2x2ZSwgcmVqZWN0IH0gPSBzLndyaXRlcl9xLnNoaWZ0KCk7XG4gICAgICAgICAgICBzLndyaXRlcl9hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgICAgICAudGhlbihjYilcbiAgICAgICAgICAgICAgICAudGhlbihyZXNvbHZlLCByZWplY3QpXG4gICAgICAgICAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzLndyaXRlcl9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jc2NoZWR1bGUobmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBvdGhlcndpc2UgcnVuIGFsbCBxdWV1ZWQgcmVhZGVycyBpbiBwYXJhbGxlbFxuICAgICAgICBpZiAocy5yZWFkZXJfcS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBiYXRjaCA9IHMucmVhZGVyX3Euc3BsaWNlKDApO1xuICAgICAgICAgICAgcy5yZWFkZXJzICs9IGJhdGNoLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgeyBjYiwgcmVzb2x2ZSwgcmVqZWN0IH0gb2YgYmF0Y2gpIHtcbiAgICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihjYilcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KVxuICAgICAgICAgICAgICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzLnJlYWRlcnMgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLnJlYWRlcnMgPT09IDApIHRoaXMuI3NjaGVkdWxlKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFjcXVpcmUgYW4gZXhjbHVzaXZlIG11dGV4IGxvY2sgYnkgbmFtZS5cbiAgICAgKiBPbmx5IG9uZSB3cml0ZXIgcnVucyBhdCBhIHRpbWU7IGJsb2NrcyByZWFkZXJzIHVudGlsIGZpbmlzaGVkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHsoKSA9PiBhbnl8UHJvbWlzZTxhbnk+fSBjYlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAgICovXG4gICAgc3RhdGljIGFjcXVpcmUobmFtZSwgY2IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLiNnZXRfbG9jayhuYW1lKTtcbiAgICAgICAgICAgIHMud3JpdGVyX3EucHVzaCh7IGNiLCByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICAgICAgICB0aGlzLiNzY2hlZHVsZShuYW1lKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWNxdWlyZSBhIHNoYXJlZCByZWFkIGxvY2sgYnkgbmFtZS5cbiAgICAgKiBNdWx0aXBsZSByZWFkZXJzIGNhbiBydW4gaW4gcGFyYWxsZWw7IGJsb2NrcyB3aGVuIHdyaXRlciBpcyBhY3RpdmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0geygpID0+IGFueXxQcm9taXNlPGFueT59IGNiXG4gICAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICAgKi9cbiAgICBzdGF0aWMgYWNxdWlyZV9yZWFkKG5hbWUsIGNiKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzID0gdGhpcy4jZ2V0X2xvY2sobmFtZSk7XG4gICAgICAgICAgICBpZiAocy53cml0ZXJfYWN0aXZlIHx8IHMud3JpdGVyX3EubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHMucmVhZGVyX3EucHVzaCh7IGNiLCByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuI3NjaGVkdWxlKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcy5yZWFkZXJzICs9IDE7XG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgICAgIC50aGVuKGNiKVxuICAgICAgICAgICAgICAgIC50aGVuKHJlc29sdmUsIHJlamVjdClcbiAgICAgICAgICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHMucmVhZGVycyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAocy5yZWFkZXJzID09PSAwKSB0aGlzLiNzY2hlZHVsZShuYW1lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yY2UtdW5sb2NrIGEgbXV0ZXggKHVzZSB3aXRoIGNhdXRpb24pLlxuICAgICAqIENvbXBsZXRlbHkgcmVtb3ZlcyB0aGUgbG9jayBzdGF0ZSwgcG90ZW50aWFsbHkgYnJlYWtpbmcgd2FpdGluZyBvcGVyYXRpb25zLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICovXG4gICAgc3RhdGljIGZvcmNlX3VubG9jayhuYW1lKSB7XG4gICAgICAgIHRoaXMuI2xvY2tzLmRlbGV0ZShuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgcGVuZGluZyBvcGVyYXRpb25zIG9uIGEgbXV0ZXguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJucyB7e3JlYWRlcnM6IG51bWJlciwgd3JpdGVyX2FjdGl2ZTogYm9vbGVhbiwgcmVhZGVyX3E6IG51bWJlciwgd3JpdGVyX3E6IG51bWJlcn19XG4gICAgICovXG4gICAgc3RhdGljIHBlbmRpbmcobmFtZSkge1xuICAgICAgICBjb25zdCBzID0gdGhpcy4jbG9ja3MuZ2V0KG5hbWUpO1xuICAgICAgICBpZiAoIXMpIHJldHVybiB7IHJlYWRlcnM6IDAsIHdyaXRlcl9hY3RpdmU6IGZhbHNlLCByZWFkZXJfcTogMCwgd3JpdGVyX3E6IDAgfTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlYWRlcnM6IHMucmVhZGVycyxcbiAgICAgICAgICAgIHdyaXRlcl9hY3RpdmU6IHMud3JpdGVyX2FjdGl2ZSxcbiAgICAgICAgICAgIHJlYWRlcl9xOiBzLnJlYWRlcl9xLmxlbmd0aCxcbiAgICAgICAgICAgIHdyaXRlcl9xOiBzLndyaXRlcl9xLmxlbmd0aFxuICAgICAgICB9O1xuICAgIH1cbn0iLCIvKipcbiAqIEZvcm0gdXRpbGl0aWVzIGZvciB2YWxpZGF0aW9uIGFuZCBlcnJvciBoYW5kbGluZ1xuICovXG5jbGFzcyBGb3JtX1V0aWxzIHtcbiAgICAvKipcbiAgICAgKiBGcmFtZXdvcmsgaW5pdGlhbGl6YXRpb24gaG9vayB0byByZWdpc3RlciBqUXVlcnkgcGx1Z2luXG4gICAgICogQ3JlYXRlcyAkLmZuLmFqYXhfc3VibWl0KCkgZm9yIGZvcm0gZWxlbWVudHNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHN0YXRpYyBfb25fZnJhbWV3b3JrX2NvcmVfZGVmaW5lKHBhcmFtcyA9IHt9KSB7XG4gICAgICAgICQuZm4uYWpheF9zdWJtaXQgPSBmdW5jdGlvbihvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0ICRlbGVtZW50ID0gJCh0aGlzKTtcblxuICAgICAgICAgICAgaWYgKCEkZWxlbWVudC5pcygnZm9ybScpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhamF4X3N1Ym1pdCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBmb3JtIGVsZW1lbnRzJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHVybCA9ICRlbGVtZW50LmF0dHIoJ2FjdGlvbicpO1xuICAgICAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Zvcm0gbXVzdCBoYXZlIGFuIGFjdGlvbiBhdHRyaWJ1dGUnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgeyBjb250cm9sbGVyLCBhY3Rpb24gfSA9IEFqYXguYWpheF91cmxfdG9fY29udHJvbGxlcl9hY3Rpb24odXJsKTtcblxuICAgICAgICAgICAgcmV0dXJuIEZvcm1fVXRpbHMuYWpheF9zdWJtaXQoJGVsZW1lbnQsIGNvbnRyb2xsZXIsIGFjdGlvbiwgb3B0aW9ucyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvd3MgZm9ybSB2YWxpZGF0aW9uIGVycm9yc1xuICAgICAqXG4gICAgICogUkVRVUlSRUQgSFRNTCBTVFJVQ1RVUkU6XG4gICAgICogRm9yIGlubGluZSBmaWVsZCBlcnJvcnMgdG8gZGlzcGxheSBwcm9wZXJseSwgZm9ybSBmaWVsZHMgbXVzdCBmb2xsb3cgdGhpcyBzdHJ1Y3R1cmU6XG4gICAgICpcbiAgICAgKiA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAqICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiIGZvcj1cImZpZWxkLW5hbWVcIj5GaWVsZCBMYWJlbDwvbGFiZWw+XG4gICAgICogICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImZpZWxkLW5hbWVcIiBuYW1lPVwiZmllbGQtbmFtZVwiIHR5cGU9XCJ0ZXh0XCI+XG4gICAgICogPC9kaXY+XG4gICAgICpcbiAgICAgKiBLZXkgcmVxdWlyZW1lbnRzOlxuICAgICAqIC0gV3JhcCBlYWNoIGZpZWxkIGluIGEgY29udGFpbmVyIHdpdGggY2xhc3MgXCJmb3JtLWdyb3VwXCIgKG9yIFwiZm9ybS1jaGVja1wiIC8gXCJpbnB1dC1ncm91cFwiKVxuICAgICAqIC0gSW5wdXQgbXVzdCBoYXZlIGEgXCJuYW1lXCIgYXR0cmlidXRlIG1hdGNoaW5nIHRoZSBlcnJvciBrZXlcbiAgICAgKiAtIFVzZSBcImZvcm0tY29udHJvbFwiIGNsYXNzIG9uIGlucHV0cyBmb3IgQm9vdHN0cmFwIDUgc3R5bGluZ1xuICAgICAqXG4gICAgICogQWNjZXB0cyB0aHJlZSBmb3JtYXRzOlxuICAgICAqIC0gU3RyaW5nOiBTaW5nbGUgZXJyb3Igc2hvd24gYXMgYWxlcnRcbiAgICAgKiAtIEFycmF5IG9mIHN0cmluZ3M6IE11bHRpcGxlIGVycm9ycyBzaG93biBhcyBidWxsZXRlZCBhbGVydFxuICAgICAqIC0gT2JqZWN0OiBGaWVsZCBuYW1lcyBtYXBwZWQgdG8gZXJyb3JzLCBzaG93biBpbmxpbmUgKHVubWF0Y2hlZCBzaG93biBhcyBhbGVydClcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJlbnRfc2VsZWN0b3IgLSBqUXVlcnkgc2VsZWN0b3IgZm9yIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0fEFycmF5fSBlcnJvcnMgLSBFcnJvciBtZXNzYWdlcyB0byBkaXNwbGF5XG4gICAgICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBhbmltYXRpb25zIGNvbXBsZXRlXG4gICAgICovXG4gICAgc3RhdGljIGFwcGx5X2Zvcm1fZXJyb3JzKHBhcmVudF9zZWxlY3RvciwgZXJyb3JzKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3JzKTtcblxuICAgICAgICBjb25zdCAkcGFyZW50ID0gJChwYXJlbnRfc2VsZWN0b3IpO1xuXG4gICAgICAgIC8vIFJlc2V0IHRoZSBmb3JtIGVycm9ycyBiZWZvcmUgYXBwbHlpbmcgbmV3IG9uZXNcbiAgICAgICAgRm9ybV9VdGlscy5yZXNldF9mb3JtX2Vycm9ycyhwYXJlbnRfc2VsZWN0b3IpO1xuXG4gICAgICAgIC8vIE5vcm1hbGl6ZSBpbnB1dCB0byBzdGFuZGFyZCBmb3JtYXRcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IEZvcm1fVXRpbHMuX25vcm1hbGl6ZV9lcnJvcnMoZXJyb3JzKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGxldCBhbmltYXRpb25zID0gW107XG5cbiAgICAgICAgICAgIGlmIChub3JtYWxpemVkLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgLy8gU2luZ2xlIGVycm9yIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICBhbmltYXRpb25zID0gRm9ybV9VdGlscy5fYXBwbHlfZ2VuZXJhbF9lcnJvcnMoJHBhcmVudCwgbm9ybWFsaXplZC5kYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9ybWFsaXplZC50eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgICAgICAgICAgLy8gQXJyYXkgb2YgZXJyb3IgbWVzc2FnZXNcbiAgICAgICAgICAgICAgICBjb25zdCBkZWR1cGxpY2F0ZWQgPSBGb3JtX1V0aWxzLl9kZWR1cGxpY2F0ZV9lcnJvcnMobm9ybWFsaXplZC5kYXRhKTtcbiAgICAgICAgICAgICAgICBhbmltYXRpb25zID0gRm9ybV9VdGlscy5fYXBwbHlfZ2VuZXJhbF9lcnJvcnMoJHBhcmVudCwgZGVkdXBsaWNhdGVkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9ybWFsaXplZC50eXBlID09PSAnZmllbGRzJykge1xuICAgICAgICAgICAgICAgIC8vIEZpZWxkLXNwZWNpZmljIGVycm9yc1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IEZvcm1fVXRpbHMuX2FwcGx5X2ZpZWxkX2Vycm9ycygkcGFyZW50LCBub3JtYWxpemVkLmRhdGEpO1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbnMgPSByZXN1bHQuYW5pbWF0aW9ucztcblxuICAgICAgICAgICAgICAgIC8vIENvdW50IG1hdGNoZWQgZmllbGRzXG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlZF9jb3VudCA9IE9iamVjdC5rZXlzKG5vcm1hbGl6ZWQuZGF0YSkubGVuZ3RoIC0gT2JqZWN0LmtleXMocmVzdWx0LnVubWF0Y2hlZCkubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVubWF0Y2hlZF9kZWR1cGxpY2F0ZWQgPSBGb3JtX1V0aWxzLl9kZWR1cGxpY2F0ZV9lcnJvcnMocmVzdWx0LnVubWF0Y2hlZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdW5tYXRjaGVkX2NvdW50ID0gT2JqZWN0LmtleXModW5tYXRjaGVkX2RlZHVwbGljYXRlZCkubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgLy8gU2hvdyBzdW1tYXJ5IGFsZXJ0IGlmIHRoZXJlIGFyZSBhbnkgZmllbGQgZXJyb3JzIChtYXRjaGVkIG9yIHVubWF0Y2hlZClcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZF9jb3VudCA+IDAgfHwgdW5tYXRjaGVkX2NvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBCdWlsZCBzdW1tYXJ5IG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN1bW1hcnlfbXNnID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkX2NvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeV9tc2cgPSBtYXRjaGVkX2NvdW50ID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnUGxlYXNlIGNvcnJlY3QgdGhlIGVycm9yIGhpZ2hsaWdodGVkIGJlbG93LidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdQbGVhc2UgY29ycmVjdCB0aGUgZXJyb3JzIGhpZ2hsaWdodGVkIGJlbG93Lic7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgdW5tYXRjaGVkIGVycm9ycywgYWRkIHRoZW0gYXMgYSBidWxsZXRlZCBsaXN0XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bm1hdGNoZWRfY291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdW1tYXJ5X2FuaW1hdGlvbnMgPSBGb3JtX1V0aWxzLl9hcHBseV9jb21iaW5lZF9lcnJvcigkcGFyZW50LCBzdW1tYXJ5X21zZywgdW5tYXRjaGVkX2RlZHVwbGljYXRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25zLnB1c2goLi4uc3VtbWFyeV9hbmltYXRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEp1c3QgdGhlIHN1bW1hcnkgbWVzc2FnZSwgbm8gdW5tYXRjaGVkIGVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VtbWFyeV9hbmltYXRpb25zID0gRm9ybV9VdGlscy5fYXBwbHlfZ2VuZXJhbF9lcnJvcnMoJHBhcmVudCwgc3VtbWFyeV9tc2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9ucy5wdXNoKC4uLnN1bW1hcnlfYW5pbWF0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlc29sdmUgdGhlIHByb21pc2Ugb25jZSBhbGwgYW5pbWF0aW9ucyBhcmUgY29tcGxldGVcbiAgICAgICAgICAgIFByb21pc2UuYWxsKGFuaW1hdGlvbnMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFNjcm9sbCB0byBlcnJvciBjb250YWluZXIgaWYgaXQgZXhpc3RzXG4gICAgICAgICAgICAgICAgY29uc3QgJGVycm9yX2NvbnRhaW5lciA9ICRwYXJlbnQuZmluZCgnW2RhdGEtaWQ9XCJlcnJvcl9jb250YWluZXJcIl0nKS5maXJzdCgpO1xuICAgICAgICAgICAgICAgIGlmICgkZXJyb3JfY29udGFpbmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyX3RvcCA9ICRlcnJvcl9jb250YWluZXIub2Zmc2V0KCkudG9wO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBmaXhlZCBoZWFkZXIgb2Zmc2V0XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpeGVkX2hlYWRlcl9oZWlnaHQgPSBGb3JtX1V0aWxzLl9nZXRfZml4ZWRfaGVhZGVyX2hlaWdodCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNjcm9sbCB0byBwb3NpdGlvbiBlcnJvciBjb250YWluZXIgMjBweCBiZWxvdyBhbnkgZml4ZWQgaGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRfc2Nyb2xsID0gY29udGFpbmVyX3RvcCAtIGZpeGVkX2hlYWRlcl9oZWlnaHQgLSAyMDtcbiAgICAgICAgICAgICAgICAgICAgJCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiB0YXJnZXRfc2Nyb2xsXG4gICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyBmb3JtIHZhbGlkYXRpb24gZXJyb3JzIGFuZCByZXNldHMgYWxsIGZvcm0gdmFsdWVzIHRvIGRlZmF1bHRzXG4gICAgICogQHBhcmFtIHtzdHJpbmd8alF1ZXJ5fSBmb3JtX3NlbGVjdG9yIC0galF1ZXJ5IHNlbGVjdG9yIG9yIGpRdWVyeSBvYmplY3QgZm9yIGZvcm0gZWxlbWVudFxuICAgICAqL1xuICAgIHN0YXRpYyByZXNldChmb3JtX3NlbGVjdG9yKSB7XG4gICAgICAgIGNvbnN0ICRmb3JtID0gdHlwZW9mIGZvcm1fc2VsZWN0b3IgPT09ICdzdHJpbmcnID8gJChmb3JtX3NlbGVjdG9yKSA6IGZvcm1fc2VsZWN0b3I7XG5cbiAgICAgICAgRm9ybV9VdGlscy5yZXNldF9mb3JtX2Vycm9ycyhmb3JtX3NlbGVjdG9yKTtcbiAgICAgICAgJGZvcm0udHJpZ2dlcigncmVzZXQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemVzIGZvcm0gZGF0YSBpbnRvIGtleS12YWx1ZSBvYmplY3RcbiAgICAgKiBSZXR1cm5zIGFsbCBpbnB1dCBlbGVtZW50cyB3aXRoIG5hbWUgYXR0cmlidXRlcyBhcyBvYmplY3QgcHJvcGVydGllc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfGpRdWVyeX0gZm9ybV9zZWxlY3RvciAtIGpRdWVyeSBzZWxlY3RvciBvciBqUXVlcnkgb2JqZWN0IGZvciBmb3JtIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBGb3JtIGRhdGEgYXMga2V5LXZhbHVlIHBhaXJzXG4gICAgICovXG4gICAgc3RhdGljIHNlcmlhbGl6ZShmb3JtX3NlbGVjdG9yKSB7XG4gICAgICAgIGNvbnN0ICRmb3JtID0gdHlwZW9mIGZvcm1fc2VsZWN0b3IgPT09ICdzdHJpbmcnID8gJChmb3JtX3NlbGVjdG9yKSA6IGZvcm1fc2VsZWN0b3I7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB7fTtcblxuICAgICAgICAkZm9ybS5zZXJpYWxpemVBcnJheSgpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGRhdGFbaXRlbS5uYW1lXSA9IGl0ZW0udmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN1Ym1pdHMgZm9ybSB0byBSU1ggY29udHJvbGxlciBhY3Rpb24gdmlhIEFKQVhcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xqUXVlcnl9IGZvcm1fc2VsZWN0b3IgLSBqUXVlcnkgc2VsZWN0b3Igb3IgalF1ZXJ5IG9iamVjdCBmb3IgZm9ybSBlbGVtZW50XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRyb2xsZXIgLSBDb250cm9sbGVyIGNsYXNzIG5hbWUgKGUuZy4sICdVc2VyX0NvbnRyb2xsZXInKVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb24gLSBBY3Rpb24gbWV0aG9kIG5hbWUgKGUuZy4sICdzYXZlX3Byb2ZpbGUnKVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiB7b25fc3VjY2VzczogZm4sIG9uX2Vycm9yOiBmbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggcmVzcG9uc2UgZGF0YVxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBhamF4X3N1Ym1pdChmb3JtX3NlbGVjdG9yLCBjb250cm9sbGVyLCBhY3Rpb24sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCAkZm9ybSA9IHR5cGVvZiBmb3JtX3NlbGVjdG9yID09PSAnc3RyaW5nJyA/ICQoZm9ybV9zZWxlY3RvcikgOiBmb3JtX3NlbGVjdG9yO1xuICAgICAgICBjb25zdCBmb3JtX2RhdGEgPSBGb3JtX1V0aWxzLnNlcmlhbGl6ZSgkZm9ybSk7XG5cbiAgICAgICAgRm9ybV9VdGlscy5yZXNldF9mb3JtX2Vycm9ycyhmb3JtX3NlbGVjdG9yKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBBamF4LmNhbGwoY29udHJvbGxlciwgYWN0aW9uLCBmb3JtX2RhdGEpO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5vbl9zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5vbl9zdWNjZXNzKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yLnR5cGUgPT09ICdmb3JtX2Vycm9yJyAmJiBlcnJvci5kZXRhaWxzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgRm9ybV9VdGlscy5hcHBseV9mb3JtX2Vycm9ycyhmb3JtX3NlbGVjdG9yLCBlcnJvci5kZXRhaWxzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgRm9ybV9VdGlscy5hcHBseV9mb3JtX2Vycm9ycyhmb3JtX3NlbGVjdG9yLCBlcnJvci5tZXNzYWdlIHx8ICdBbiBlcnJvciBvY2N1cnJlZCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5vbl9lcnJvcikge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMub25fZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgZm9ybSB2YWxpZGF0aW9uIGVycm9yc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJlbnRfc2VsZWN0b3IgLSBqUXVlcnkgc2VsZWN0b3IgZm9yIHBhcmVudCBlbGVtZW50XG4gICAgICovXG4gICAgc3RhdGljIHJlc2V0X2Zvcm1fZXJyb3JzKHBhcmVudF9zZWxlY3Rvcikge1xuICAgICAgICBjb25zdCAkcGFyZW50ID0gJChwYXJlbnRfc2VsZWN0b3IpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBmbGFzaCBtZXNzYWdlc1xuICAgICAgICAkKCcuZmxhc2gtbWVzc2FnZXMnKS5yZW1vdmUoKTtcblxuICAgICAgICAvLyBSZW1vdmUgYWxlcnQtZGFuZ2VyIG1lc3NhZ2VzXG4gICAgICAgICRwYXJlbnQuZmluZCgnLmFsZXJ0LWRhbmdlcicpLnJlbW92ZSgpO1xuXG4gICAgICAgIC8vIFJlbW92ZSB2YWxpZGF0aW9uIGVycm9yIGNsYXNzZXMgYW5kIHRleHQgZnJvbSBmb3JtIGVsZW1lbnRzXG4gICAgICAgICRwYXJlbnQuZmluZCgnLmlzLWludmFsaWQnKS5yZW1vdmVDbGFzcygnaXMtaW52YWxpZCcpO1xuICAgICAgICAkcGFyZW50LmZpbmQoJy5pbnZhbGlkLWZlZWRiYWNrJykucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemVzIGVycm9yIGlucHV0IGludG8gc3RhbmRhcmQgZm9ybWF0c1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdHxBcnJheX0gZXJyb3JzIC0gUmF3IGVycm9yIGlucHV0XG4gICAgICogQHJldHVybnMge09iamVjdH0gTm9ybWFsaXplZCBlcnJvcnMgYXMge3R5cGU6ICdzdHJpbmcnfCdhcnJheSd8J2ZpZWxkcycsIGRhdGE6IC4uLn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHN0YXRpYyBfbm9ybWFsaXplX2Vycm9ycyhlcnJvcnMpIHtcbiAgICAgICAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkXG4gICAgICAgIGlmICghZXJyb3JzKSB7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnc3RyaW5nJywgZGF0YTogJ0FuIGVycm9yIGhhcyBvY2N1cnJlZCcgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBzdHJpbmdcbiAgICAgICAgaWYgKHR5cGVvZiBlcnJvcnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnc3RyaW5nJywgZGF0YTogZXJyb3JzIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgYXJyYXlcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXJyb3JzKSkge1xuICAgICAgICAgICAgLy8gQXJyYXkgb2Ygc3RyaW5ncyAtIGdlbmVyYWwgZXJyb3JzXG4gICAgICAgICAgICBpZiAoZXJyb3JzLmV2ZXJ5KChlKSA9PiB0eXBlb2YgZSA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2FycmF5JywgZGF0YTogZXJyb3JzIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBcnJheSB3aXRoIG9iamVjdCBhcyBmaXJzdCBlbGVtZW50IC0gZXh0cmFjdCBpdFxuICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwICYmIHR5cGVvZiBlcnJvcnNbMF0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZvcm1fVXRpbHMuX25vcm1hbGl6ZV9lcnJvcnMoZXJyb3JzWzBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEVtcHR5IG9yIG1peGVkIGFycmF5XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnYXJyYXknLCBkYXRhOiBbXSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIG9iamVjdCAtIGNoZWNrIGZvciBMYXJhdmVsIHJlc3BvbnNlIHdyYXBwZXJcbiAgICAgICAgaWYgKHR5cGVvZiBlcnJvcnMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAvLyBVbndyYXAge2Vycm9yczogey4uLn19IG9yIHtlcnJvcjogey4uLn19XG4gICAgICAgICAgICBjb25zdCB1bndyYXBwZWQgPSBlcnJvcnMuZXJyb3JzIHx8IGVycm9ycy5lcnJvcjtcbiAgICAgICAgICAgIGlmICh1bndyYXBwZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRm9ybV9VdGlscy5fbm9ybWFsaXplX2Vycm9ycyh1bndyYXBwZWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDb252ZXJ0IExhcmF2ZWwgdmFsaWRhdG9yIGZvcm1hdCB7ZmllbGQ6IFttc2cxLCBtc2cyXX0gdG8ge2ZpZWxkOiBtc2cxfVxuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZCBpbiBlcnJvcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3JzLmhhc093blByb3BlcnR5KGZpZWxkKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVycm9yc1tmaWVsZF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkW2ZpZWxkXSA9IHZhbHVlWzBdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRbZmllbGRdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkW2ZpZWxkXSA9IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdmaWVsZHMnLCBkYXRhOiBub3JtYWxpemVkIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaW5hbCBjYXRjaC1hbGwqXG4gICAgICAgIHJldHVybiB7IHR5cGU6ICdzdHJpbmcnLCBkYXRhOiBTdHJpbmcoZXJyb3JzKSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgZHVwbGljYXRlIGVycm9yIG1lc3NhZ2VzIGZyb20gYXJyYXkgb3Igb2JqZWN0IHZhbHVlc1xuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBlcnJvcnMgLSBFcnJvcnMgdG8gZGVkdXBsaWNhdGVcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBEZWR1cGxpY2F0ZWQgZXJyb3JzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzdGF0aWMgX2RlZHVwbGljYXRlX2Vycm9ycyhlcnJvcnMpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXJyb3JzKSkge1xuICAgICAgICAgICAgcmV0dXJuIFsuLi5uZXcgU2V0KGVycm9ycyldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBlcnJvcnMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBlcnJvcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVycm9yc1trZXldO1xuICAgICAgICAgICAgICAgIGlmICghc2Vlbi5oYXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlZW4uYWRkKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIGZpZWxkLXNwZWNpZmljIHZhbGlkYXRpb24gZXJyb3JzIHRvIGZvcm0gaW5wdXRzXG4gICAgICogQHBhcmFtIHtqUXVlcnl9ICRwYXJlbnQgLSBQYXJlbnQgZWxlbWVudCBjb250YWluaW5nIGZvcm1cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZmllbGRfZXJyb3JzIC0gT2JqZWN0IG1hcHBpbmcgZmllbGQgbmFtZXMgdG8gZXJyb3IgbWVzc2FnZXNcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBPYmplY3QgY29udGFpbmluZyB7YW5pbWF0aW9uczogQXJyYXksIHVubWF0Y2hlZDogT2JqZWN0fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc3RhdGljIF9hcHBseV9maWVsZF9lcnJvcnMoJHBhcmVudCwgZmllbGRfZXJyb3JzKSB7XG4gICAgICAgIGNvbnN0IGFuaW1hdGlvbnMgPSBbXTtcbiAgICAgICAgY29uc3QgdW5tYXRjaGVkID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBmaWVsZF9uYW1lIGluIGZpZWxkX2Vycm9ycykge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JfbWVzc2FnZSA9IGZpZWxkX2Vycm9yc1tmaWVsZF9uYW1lXTtcbiAgICAgICAgICAgIGNvbnN0ICRpbnB1dCA9ICRwYXJlbnQuZmluZChgW25hbWU9XCIke2ZpZWxkX25hbWV9XCJdYCk7XG5cbiAgICAgICAgICAgIGlmICghJGlucHV0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHVubWF0Y2hlZFtmaWVsZF9uYW1lXSA9IGVycm9yX21lc3NhZ2U7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0ICRlcnJvciA9ICQoJzxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+PC9kaXY+JykuaHRtbChlcnJvcl9tZXNzYWdlKTtcbiAgICAgICAgICAgIGNvbnN0ICR0YXJnZXQgPSAkaW5wdXQuY2xvc2VzdCgnLmZvcm0tZ3JvdXAsIC5mb3JtLWNoZWNrLCAuaW5wdXQtZ3JvdXAnKTtcblxuICAgICAgICAgICAgaWYgKCEkdGFyZ2V0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHVubWF0Y2hlZFtmaWVsZF9uYW1lXSA9IGVycm9yX21lc3NhZ2U7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICRpbnB1dC5hZGRDbGFzcygnaXMtaW52YWxpZCcpO1xuICAgICAgICAgICAgJGVycm9yLmFwcGVuZFRvKCR0YXJnZXQpO1xuICAgICAgICAgICAgYW5pbWF0aW9ucy5wdXNoKCRlcnJvci5oaWRlKCkuZmFkZUluKDMwMCkucHJvbWlzZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGFuaW1hdGlvbnMsIHVubWF0Y2hlZCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgY29tYmluZWQgZXJyb3IgbWVzc2FnZSB3aXRoIHN1bW1hcnkgYW5kIHVubWF0Y2hlZCBmaWVsZCBlcnJvcnNcbiAgICAgKiBAcGFyYW0ge2pRdWVyeX0gJHBhcmVudCAtIFBhcmVudCBlbGVtZW50IGNvbnRhaW5pbmcgZm9ybVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdW1tYXJ5X21zZyAtIFN1bW1hcnkgbWVzc2FnZSAoZS5nLiwgXCJQbGVhc2UgY29ycmVjdCB0aGUgZXJyb3JzIGJlbG93XCIpXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHVubWF0Y2hlZF9lcnJvcnMgLSBPYmplY3Qgb2YgZmllbGQgZXJyb3JzIHRoYXQgY291bGRuJ3QgYmUgbWF0Y2hlZCB0byBmaWVsZHNcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IEFycmF5IG9mIGFuaW1hdGlvbiBwcm9taXNlc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc3RhdGljIF9hcHBseV9jb21iaW5lZF9lcnJvcigkcGFyZW50LCBzdW1tYXJ5X21zZywgdW5tYXRjaGVkX2Vycm9ycykge1xuICAgICAgICBjb25zdCBhbmltYXRpb25zID0gW107XG4gICAgICAgIGNvbnN0ICRlcnJvcl9jb250YWluZXIgPSAkcGFyZW50LmZpbmQoJ1tkYXRhLWlkPVwiZXJyb3JfY29udGFpbmVyXCJdJykuZmlyc3QoKTtcbiAgICAgICAgY29uc3QgJHRhcmdldCA9ICRlcnJvcl9jb250YWluZXIubGVuZ3RoID4gMCA/ICRlcnJvcl9jb250YWluZXIgOiAkcGFyZW50O1xuXG4gICAgICAgIC8vIENyZWF0ZSBhbGVydCB3aXRoIHN1bW1hcnkgbWVzc2FnZSBhbmQgYnVsbGV0ZWQgbGlzdCBvZiB1bm1hdGNoZWQgZXJyb3JzXG4gICAgICAgIGNvbnN0ICRhbGVydCA9ICQoJzxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIiByb2xlPVwiYWxlcnRcIj48L2Rpdj4nKTtcblxuICAgICAgICAvLyBBZGQgc3VtbWFyeSBtZXNzYWdlIGlmIHByb3ZpZGVkXG4gICAgICAgIGlmIChzdW1tYXJ5X21zZykge1xuICAgICAgICAgICAgJCgnPHAgY2xhc3M9XCJtYi0yXCI+PC9wPicpLnRleHQoc3VtbWFyeV9tc2cpLmFwcGVuZFRvKCRhbGVydCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgdW5tYXRjaGVkIGVycm9ycyBhcyBidWxsZXRlZCBsaXN0XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh1bm1hdGNoZWRfZXJyb3JzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCAkbGlzdCA9ICQoJzx1bCBjbGFzcz1cIm1iLTBcIj48L3VsPicpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZF9uYW1lIGluIHVubWF0Y2hlZF9lcnJvcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcl9tc2cgPSB1bm1hdGNoZWRfZXJyb3JzW2ZpZWxkX25hbWVdO1xuICAgICAgICAgICAgICAgICQoJzxsaT48L2xpPicpLmh0bWwoZXJyb3JfbXNnKS5hcHBlbmRUbygkbGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkbGlzdC5hcHBlbmRUbygkYWxlcnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCRlcnJvcl9jb250YWluZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYW5pbWF0aW9ucy5wdXNoKCRhbGVydC5oaWRlKCkuYXBwZW5kVG8oJHRhcmdldCkuZmFkZUluKDMwMCkucHJvbWlzZSgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFuaW1hdGlvbnMucHVzaCgkYWxlcnQuaGlkZSgpLnByZXBlbmRUbygkdGFyZ2V0KS5mYWRlSW4oMzAwKS5wcm9taXNlKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFuaW1hdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbGllcyBnZW5lcmFsIGVycm9yIG1lc3NhZ2VzIGFzIGFsZXJ0IGJveFxuICAgICAqIEBwYXJhbSB7alF1ZXJ5fSAkcGFyZW50IC0gUGFyZW50IGVsZW1lbnQgdG8gcHJlcGVuZCBhbGVydCB0b1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fSBtZXNzYWdlcyAtIEVycm9yIG1lc3NhZ2UocykgdG8gZGlzcGxheVxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gQXJyYXkgb2YgYW5pbWF0aW9uIHByb21pc2VzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzdGF0aWMgX2FwcGx5X2dlbmVyYWxfZXJyb3JzKCRwYXJlbnQsIG1lc3NhZ2VzKSB7XG4gICAgICAgIGNvbnN0IGFuaW1hdGlvbnMgPSBbXTtcblxuICAgICAgICAvLyBMb29rIGZvciBhIHNwZWNpZmljIGVycm9yIGNvbnRhaW5lciBkaXYgKGUuZy4sIGluIFJzeF9Gb3JtIGNvbXBvbmVudClcbiAgICAgICAgY29uc3QgJGVycm9yX2NvbnRhaW5lciA9ICRwYXJlbnQuZmluZCgnW2RhdGEtaWQ9XCJlcnJvcl9jb250YWluZXJcIl0nKS5maXJzdCgpO1xuICAgICAgICBjb25zdCAkdGFyZ2V0ID0gJGVycm9yX2NvbnRhaW5lci5sZW5ndGggPiAwID8gJGVycm9yX2NvbnRhaW5lciA6ICRwYXJlbnQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIC8vIFNpbmdsZSBlcnJvciAtIHNpbXBsZSBhbGVydCB3aXRob3V0IGxpc3RcbiAgICAgICAgICAgIGNvbnN0ICRhbGVydCA9ICQoJzxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIiByb2xlPVwiYWxlcnRcIj48L2Rpdj4nKS50ZXh0KG1lc3NhZ2VzKTtcbiAgICAgICAgICAgIGlmICgkZXJyb3JfY29udGFpbmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBhbmltYXRpb25zLnB1c2goJGFsZXJ0LmhpZGUoKS5hcHBlbmRUbygkdGFyZ2V0KS5mYWRlSW4oMzAwKS5wcm9taXNlKCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhbmltYXRpb25zLnB1c2goJGFsZXJ0LmhpZGUoKS5wcmVwZW5kVG8oJHRhcmdldCkuZmFkZUluKDMwMCkucHJvbWlzZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG1lc3NhZ2VzKSAmJiBtZXNzYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBNdWx0aXBsZSBlcnJvcnMgLSBidWxsZXRlZCBsaXN0XG4gICAgICAgICAgICBjb25zdCAkYWxlcnQgPSAkKCc8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIgcm9sZT1cImFsZXJ0XCI+PHVsIGNsYXNzPVwibWItMFwiPjwvdWw+PC9kaXY+Jyk7XG4gICAgICAgICAgICBjb25zdCAkbGlzdCA9ICRhbGVydC5maW5kKCd1bCcpO1xuXG4gICAgICAgICAgICBtZXNzYWdlcy5mb3JFYWNoKChtc2cpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKG1zZyArICcnKS50cmltKCkgfHwgJ0FuIGVycm9yIGhhcyBvY2N1cnJlZCc7XG4gICAgICAgICAgICAgICAgJCgnPGxpPjwvbGk+JykuaHRtbCh0ZXh0KS5hcHBlbmRUbygkbGlzdCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCRlcnJvcl9jb250YWluZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbnMucHVzaCgkYWxlcnQuaGlkZSgpLmFwcGVuZFRvKCR0YXJnZXQpLmZhZGVJbigzMDApLnByb21pc2UoKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbnMucHVzaCgkYWxlcnQuaGlkZSgpLnByZXBlbmRUbygkdGFyZ2V0KS5mYWRlSW4oMzAwKS5wcm9taXNlKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBtZXNzYWdlcyA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkobWVzc2FnZXMpKSB7XG4gICAgICAgICAgICAvLyBPYmplY3Qgb2YgdW5tYXRjaGVkIGZpZWxkIGVycm9ycyAtIGNvbnZlcnQgdG8gYXJyYXlcbiAgICAgICAgICAgIGNvbnN0IGVycm9yX2xpc3QgPSBPYmplY3QudmFsdWVzKG1lc3NhZ2VzKVxuICAgICAgICAgICAgICAgIC5tYXAoKHYpID0+IFN0cmluZyh2KS50cmltKCkpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigodikgPT4gdik7XG4gICAgICAgICAgICBpZiAoZXJyb3JfbGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZvcm1fVXRpbHMuX2FwcGx5X2dlbmVyYWxfZXJyb3JzKCRwYXJlbnQsIGVycm9yX2xpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFuaW1hdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgdG90YWwgaGVpZ2h0IG9mIGZpeGVkL3N0aWNreSBoZWFkZXJzIGF0IHRoZSB0b3Agb2YgdGhlIHBhZ2VcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUb3RhbCBoZWlnaHQgaW4gcGl4ZWxzIG9mIGZpeGVkIHRvcCBlbGVtZW50c1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc3RhdGljIF9nZXRfZml4ZWRfaGVhZGVyX2hlaWdodCgpIHtcbiAgICAgICAgbGV0IHRvdGFsX2hlaWdodCA9IDA7XG5cbiAgICAgICAgLy8gRmluZCBhbGwgZml4ZWQgb3Igc3RpY2t5IHBvc2l0aW9uZWQgZWxlbWVudHNcbiAgICAgICAgJCgnKicpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zdCAkZWwgPSAkKHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSAkZWwuY3NzKCdwb3NpdGlvbicpO1xuXG4gICAgICAgICAgICAvLyBPbmx5IGNoZWNrIGZpeGVkIG9yIHN0aWNreSBlbGVtZW50c1xuICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9PSAnZml4ZWQnICYmIHBvc2l0aW9uICE9PSAnc3RpY2t5Jykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZWxlbWVudCBpcyBwb3NpdGlvbmVkIGF0IG9yIG5lYXIgdGhlIHRvcFxuICAgICAgICAgICAgY29uc3QgdG9wID0gcGFyc2VJbnQoJGVsLmNzcygndG9wJykpIHx8IDA7XG4gICAgICAgICAgICBpZiAodG9wID4gNTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47IC8vIE5vdCBhIHRvcCBoZWFkZXJcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZWxlbWVudCBpcyB2aXNpYmxlXG4gICAgICAgICAgICBpZiAoISRlbC5pcygnOnZpc2libGUnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZWxlbWVudCBzcGFucyBzaWduaWZpY2FudCB3aWR0aCAobGlrZWx5IGEgaGVhZGVyL25hdmJhcilcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gJGVsLm91dGVyV2lkdGgoKTtcbiAgICAgICAgICAgIGNvbnN0IHZpZXdwb3J0X3dpZHRoID0gJCh3aW5kb3cpLndpZHRoKCk7XG4gICAgICAgICAgICBpZiAod2lkdGggPCB2aWV3cG9ydF93aWR0aCAqIDAuNSkge1xuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gVG9vIG5hcnJvdyB0byBiZSBhIGhlYWRlclxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgdGhpcyBlbGVtZW50J3MgaGVpZ2h0XG4gICAgICAgICAgICB0b3RhbF9oZWlnaHQgKz0gJGVsLm91dGVySGVpZ2h0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0b3RhbF9oZWlnaHQ7XG4gICAgfVxufVxuIiwiLyoqXG4gKiBEZWJ1Z2dlciBjbGFzcyBmb3IgY29uc29sZV9kZWJ1ZyBhbmQgYnJvd3NlciBlcnJvciBsb2dnaW5nXG4gKiBIYW5kbGVzIGJhdGNoZWQgc3VibWlzc2lvbiB0byBzZXJ2ZXIgd2hlbiBjb25maWd1cmVkXG4gKi9cbmNsYXNzIERlYnVnZ2VyIHtcbiAgICAvLyBCYXRjaGluZyBzdGF0ZSBmb3IgY29uc29sZV9kZWJ1ZyBtZXNzYWdlc1xuICAgIHN0YXRpYyBfY29uc29sZV9iYXRjaCA9IFtdO1xuICAgIHN0YXRpYyBfY29uc29sZV90aW1lciA9IG51bGw7XG4gICAgc3RhdGljIF9jb25zb2xlX2JhdGNoX2NvdW50ID0gMDtcblxuICAgIC8vIEJhdGNoaW5nIHN0YXRlIGZvciBlcnJvciBtZXNzYWdlc1xuICAgIHN0YXRpYyBfZXJyb3JfYmF0Y2ggPSBbXTtcbiAgICBzdGF0aWMgX2Vycm9yX3RpbWVyID0gbnVsbDtcbiAgICBzdGF0aWMgX2Vycm9yX2NvdW50ID0gMDtcbiAgICBzdGF0aWMgX2Vycm9yX2JhdGNoX2NvdW50ID0gMDtcblxuICAgIC8vIENvbnN0YW50c1xuICAgIHN0YXRpYyBERUJPVU5DRV9NUyA9IDIwMDA7XG4gICAgc3RhdGljIE1BWF9FUlJPUlNfUEVSX1BBR0UgPSAyMDtcbiAgICBzdGF0aWMgTUFYX0VSUk9SX0JBVENIRVMgPSA1O1xuXG4gICAgLy8gU3RvcmUgc3RhcnQgdGltZSBmb3IgYmVuY2htYXJraW5nXG4gICAgc3RhdGljIF9zdGFydF90aW1lID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgZnJhbWV3b3JrIGVycm9yIGhhbmRsaW5nXG4gICAgICogQ2FsbGVkIGR1cmluZyBmcmFtZXdvcmsgaW5pdGlhbGl6YXRpb25cbiAgICAgKi9cbiAgICBzdGF0aWMgX29uX2ZyYW1ld29ya19jb3JlX2luaXQoKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGJyb3dzZXIgZXJyb3IgbG9nZ2luZyBpcyBlbmFibGVkXG4gICAgICAgIGlmICh3aW5kb3cucnN4YXBwICYmIHdpbmRvdy5yc3hhcHAubG9nX2Jyb3dzZXJfZXJyb3JzKSB7XG4gICAgICAgICAgICAvLyBSZWdpc3RlciBnbG9iYWwgZXJyb3IgaGFuZGxlclxuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgRGVidWdnZXIuX2hhbmRsZV9icm93c2VyX2Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXZlbnQubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IGV2ZW50LmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICBsaW5lbm86IGV2ZW50LmxpbmVubyxcbiAgICAgICAgICAgICAgICAgICAgY29sbm86IGV2ZW50LmNvbG5vLFxuICAgICAgICAgICAgICAgICAgICBzdGFjazogZXZlbnQuZXJyb3IgPyBldmVudC5lcnJvci5zdGFjayA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gUmVnaXN0ZXIgdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIGhhbmRsZXJcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd1bmhhbmRsZWRyZWplY3Rpb24nLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBEZWJ1Z2dlci5faGFuZGxlX2Jyb3dzZXJfZXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBldmVudC5yZWFzb24gPyBldmVudC5yZWFzb24ubWVzc2FnZSB8fCBTdHJpbmcoZXZlbnQucmVhc29uKSA6ICdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICBzdGFjazogZXZlbnQucmVhc29uICYmIGV2ZW50LnJlYXNvbi5zdGFjayA/IGV2ZW50LnJlYXNvbi5zdGFjayA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICd1bmhhbmRsZWRyZWplY3Rpb24nLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWdpc3RlciB1aSByZWZyZXNoIGhhbmRsZXJcbiAgICAgICAgUnN4Lm9uKCdyZWZyZXNoJywgRGVidWdnZXIub25fcmVmcmVzaCk7XG4gICAgfVxuXG4gICAgLy8gSW4gZGV2IG1vZGUsIHNvbWUgdWkgZWxlbWVudHMgY2FuIGJlIGF1dG9tYXRpY2FsbHkgYXBwbGllZCB0byBhc3Npc3Qgd2l0aCBkZXZlbG9wbWVudFxuICAgIHN0YXRpYyBvbl9yZWZyZXNoKCkge1xuICAgICAgICBpZiAoIVJzeC5pc19wcm9kKCkpIHtcbiAgICAgICAgICAgIC8vIEFkZCBhbiB1bmRlcmxpbmUgMiBweCBibHVlIHRvIGFsbCBhIHRhZ3Mgd2l0aCBocmVmID09PSBcIiNcIiB1c2luZyBqcXVlcnlcbiAgICAgICAgICAgIC8vIFRvZG86IG1heWJlIHRoaXMgc2hvdWxkIGJlIGEgY29uZmlndXJhYmxlIGRlYnVnIG9wdGlvbj9cbiAgICAgICAgICAgIC8vICQoJ2FbaHJlZj1cIiNcIl0nKS5jc3Moe1xuICAgICAgICAgICAgLy8gICAgICdib3JkZXItYm90dG9tJzogJzJweCBzb2xpZCBibHVlJyxcbiAgICAgICAgICAgIC8vICAgICAndGV4dC1kZWNvcmF0aW9uJzogJ25vbmUnXG4gICAgICAgICAgICAvLyB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgY29uc29sZV9kZWJ1Z1xuICAgICAqIE1pcnJvcnMgUEhQIGZ1bmN0aW9uYWxpdHkgd2l0aCBiYXRjaGluZyBmb3IgTGFyYXZlbCBsb2dcbiAgICAgKi9cbiAgICBzdGF0aWMgY29uc29sZV9kZWJ1ZyhjaGFubmVsLCAuLi52YWx1ZXMpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgY29uc29sZV9kZWJ1ZyBpcyBlbmFibGVkXG4gICAgICAgIGlmICghd2luZG93LnJzeGFwcCB8fCAhd2luZG93LnJzeGFwcC5jb25zb2xlX2RlYnVnIHx8ICF3aW5kb3cucnN4YXBwLmNvbnNvbGVfZGVidWcuZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29uZmlnID0gd2luZG93LnJzeGFwcC5jb25zb2xlX2RlYnVnO1xuXG4gICAgICAgIC8vIE5vcm1hbGl6ZSBjaGFubmVsIG5hbWVcbiAgICAgICAgY2hhbm5lbCA9IFN0cmluZyhjaGFubmVsKVxuICAgICAgICAgICAgLnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgIC5yZXBsYWNlKC9bXFxbXFxdXS9nLCAnJyk7XG5cbiAgICAgICAgLy8gQXBwbHkgZmlsdGVyaW5nXG4gICAgICAgIGlmIChjb25maWcuZmlsdGVyX21vZGUgPT09ICdzcGVjaWZpYycpIHtcbiAgICAgICAgICAgIGNvbnN0IHNwZWNpZmljID0gY29uZmlnLnNwZWNpZmljX2NoYW5uZWw7XG4gICAgICAgICAgICBpZiAoc3BlY2lmaWMpIHtcbiAgICAgICAgICAgICAgICAvLyBTcGxpdCBjb21tYS1zZXBhcmF0ZWQgdmFsdWVzIGFuZCBub3JtYWxpemVcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFubmVscyA9IHNwZWNpZmljLnNwbGl0KCcsJykubWFwKChjKSA9PiBjLnRyaW0oKS50b1VwcGVyQ2FzZSgpKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNoYW5uZWxzLmluY2x1ZGVzKGNoYW5uZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLmZpbHRlcl9tb2RlID09PSAnd2hpdGVsaXN0Jykge1xuICAgICAgICAgICAgY29uc3Qgd2hpdGVsaXN0ID0gKGNvbmZpZy5maWx0ZXJfY2hhbm5lbHMgfHwgW10pLm1hcCgoYykgPT4gYy50b1VwcGVyQ2FzZSgpKTtcbiAgICAgICAgICAgIGlmICghd2hpdGVsaXN0LmluY2x1ZGVzKGNoYW5uZWwpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5maWx0ZXJfbW9kZSA9PT0gJ2JsYWNrbGlzdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGJsYWNrbGlzdCA9IChjb25maWcuZmlsdGVyX2NoYW5uZWxzIHx8IFtdKS5tYXAoKGMpID0+IGMudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgICBpZiAoYmxhY2tsaXN0LmluY2x1ZGVzKGNoYW5uZWwpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJlcGFyZSB0aGUgbWVzc2FnZVxuICAgICAgICBsZXQgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGNoYW5uZWw6IGNoYW5uZWwsXG4gICAgICAgICAgICB2YWx1ZXM6IHZhbHVlcyxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEFkZCBsb2NhdGlvbiBpZiBjb25maWd1cmVkXG4gICAgICAgIGlmIChjb25maWcuaW5jbHVkZV9sb2NhdGlvbiB8fCBjb25maWcuaW5jbHVkZV9iYWNrdHJhY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgICAgICAgICBjb25zdCBzdGFjayA9IGVycm9yLnN0YWNrIHx8ICcnO1xuICAgICAgICAgICAgY29uc3Qgc3RhY2tMaW5lcyA9IHN0YWNrLnNwbGl0KCdcXG4nKTtcblxuICAgICAgICAgICAgaWYgKGNvbmZpZy5pbmNsdWRlX2xvY2F0aW9uICYmIHN0YWNrTGluZXMubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgICAgIC8vIFNraXAgRXJyb3IgbGluZSBhbmQgdGhpcyBmdW5jdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxlckxpbmUgPSBzdGFja0xpbmVzWzJdIHx8ICcnO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gY2FsbGVyTGluZS5tYXRjaCgvYXRcXHMrLio/XFxzK1xcKCguKj8pOihcXGQrKTooXFxkKylcXCkvKSB8fCBjYWxsZXJMaW5lLm1hdGNoKC9hdFxccysoLio/KTooXFxkKyk6KFxcZCspLyk7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubG9jYXRpb24gPSBgJHttYXRjaFsxXX06JHttYXRjaFsyXX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbmZpZy5pbmNsdWRlX2JhY2t0cmFjZSkge1xuICAgICAgICAgICAgICAgIC8vIEluY2x1ZGUgZmlyc3QgNSBzdGFjayBmcmFtZXMsIHNraXBwaW5nIHRoaXMgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICBtZXNzYWdlLmJhY2t0cmFjZSA9IHN0YWNrTGluZXNcbiAgICAgICAgICAgICAgICAgICAgLnNsaWNlKDIsIDcpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE91dHB1dCB0byBicm93c2VyIGNvbnNvbGUgaWYgZW5hYmxlZFxuICAgICAgICBpZiAoY29uZmlnLm91dHB1dHMgJiYgY29uZmlnLm91dHB1dHMuYnJvd3Nlcikge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlnLmluY2x1ZGVfYmVuY2htYXJrID8gYFske0RlYnVnZ2VyLl9nZXRfdGltZV9wcmVmaXgoKX1dIGAgOiAnJztcbiAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxQcmVmaXggPSBgWyR7Y2hhbm5lbH1dYDtcblxuICAgICAgICAgICAgLy8gVXNlIGFwcHJvcHJpYXRlIGNvbnNvbGUgbWV0aG9kIGJhc2VkIG9uIGNoYW5uZWxcbiAgICAgICAgICAgIGxldCBjb25zb2xlTWV0aG9kID0gJ2xvZyc7XG4gICAgICAgICAgICBpZiAoY2hhbm5lbC5pbmNsdWRlcygnRVJST1InKSkgY29uc29sZU1ldGhvZCA9ICdlcnJvcic7XG4gICAgICAgICAgICBlbHNlIGlmIChjaGFubmVsLmluY2x1ZGVzKCdXQVJOJykpIGNvbnNvbGVNZXRob2QgPSAnd2Fybic7XG4gICAgICAgICAgICBlbHNlIGlmIChjaGFubmVsLmluY2x1ZGVzKCdJTkZPJykpIGNvbnNvbGVNZXRob2QgPSAnaW5mbyc7XG5cbiAgICAgICAgICAgIGNvbnNvbGVbY29uc29sZU1ldGhvZF0ocHJlZml4ICsgY2hhbm5lbFByZWZpeCwgLi4udmFsdWVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJhdGNoIGZvciBMYXJhdmVsIGxvZyBpZiBlbmFibGVkXG4gICAgICAgIGlmIChjb25maWcub3V0cHV0cyAmJiBjb25maWcub3V0cHV0cy5sYXJhdmVsX2xvZykge1xuICAgICAgICAgICAgRGVidWdnZXIuX2JhdGNoX2NvbnNvbGVfbWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvZyBhbiBlcnJvciB0byB0aGUgc2VydmVyXG4gICAgICogVXNlZCBtYW51YWxseSBvciBieSBBamF4IGVycm9yIGhhbmRsaW5nXG4gICAgICovXG4gICAgc3RhdGljIGxvZ19lcnJvcihlcnJvcikge1xuICAgICAgICAvLyBDaGVjayBpZiBicm93c2VyIGVycm9yIGxvZ2dpbmcgaXMgZW5hYmxlZFxuICAgICAgICBpZiAoIXdpbmRvdy5yc3hhcHAgfHwgIXdpbmRvdy5yc3hhcHAubG9nX2Jyb3dzZXJfZXJyb3JzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3JtYWxpemUgZXJyb3IgZm9ybWF0XG4gICAgICAgIGxldCBlcnJvckRhdGEgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVycm9yRGF0YS5tZXNzYWdlID0gZXJyb3I7XG4gICAgICAgICAgICBlcnJvckRhdGEudHlwZSA9ICdtYW51YWwnO1xuICAgICAgICB9IGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIGVycm9yRGF0YS5tZXNzYWdlID0gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgIGVycm9yRGF0YS5zdGFjayA9IGVycm9yLnN0YWNrO1xuICAgICAgICAgICAgZXJyb3JEYXRhLnR5cGUgPSAnZXhjZXB0aW9uJztcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBlcnJvckRhdGEgPSBlcnJvcjtcbiAgICAgICAgICAgIGlmICghZXJyb3JEYXRhLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBlcnJvckRhdGEudHlwZSA9ICdtYW51YWwnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgRGVidWdnZXIuX2hhbmRsZV9icm93c2VyX2Vycm9yKGVycm9yRGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWw6IEhhbmRsZSBicm93c2VyIGVycm9ycyB3aXRoIGJhdGNoaW5nXG4gICAgICovXG4gICAgc3RhdGljIF9oYW5kbGVfYnJvd3Nlcl9lcnJvcihlcnJvckRhdGEpIHtcbiAgICAgICAgLy8gQ2hlY2sgbGltaXRzXG4gICAgICAgIGlmIChEZWJ1Z2dlci5fZXJyb3JfY291bnQgPj0gRGVidWdnZXIuTUFYX0VSUk9SU19QRVJfUEFHRSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChEZWJ1Z2dlci5fZXJyb3JfYmF0Y2hfY291bnQgPj0gRGVidWdnZXIuTUFYX0VSUk9SX0JBVENIRVMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIERlYnVnZ2VyLl9lcnJvcl9jb3VudCsrO1xuXG4gICAgICAgIC8vIEFkZCBtZXRhZGF0YVxuICAgICAgICBlcnJvckRhdGEudXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICAgIGVycm9yRGF0YS51c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50O1xuICAgICAgICBlcnJvckRhdGEudGltZXN0YW1wID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXG4gICAgICAgIC8vIEFkZCB0byBiYXRjaFxuICAgICAgICBEZWJ1Z2dlci5fZXJyb3JfYmF0Y2gucHVzaChlcnJvckRhdGEpO1xuXG4gICAgICAgIC8vIENsZWFyIGV4aXN0aW5nIHRpbWVyXG4gICAgICAgIGlmIChEZWJ1Z2dlci5fZXJyb3JfdGltZXIpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChEZWJ1Z2dlci5fZXJyb3JfdGltZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IGRlYm91bmNlIHRpbWVyXG4gICAgICAgIERlYnVnZ2VyLl9lcnJvcl90aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgRGVidWdnZXIuX2ZsdXNoX2Vycm9yX2JhdGNoKCk7XG4gICAgICAgIH0sIERlYnVnZ2VyLkRFQk9VTkNFX01TKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbDogQmF0Y2ggY29uc29sZV9kZWJ1ZyBtZXNzYWdlcyBmb3IgTGFyYXZlbCBsb2dcbiAgICAgKi9cbiAgICBzdGF0aWMgX2JhdGNoX2NvbnNvbGVfbWVzc2FnZShtZXNzYWdlKSB7XG4gICAgICAgIERlYnVnZ2VyLl9jb25zb2xlX2JhdGNoLnB1c2gobWVzc2FnZSk7XG5cbiAgICAgICAgLy8gQ2xlYXIgZXhpc3RpbmcgdGltZXJcbiAgICAgICAgaWYgKERlYnVnZ2VyLl9jb25zb2xlX3RpbWVyKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoRGVidWdnZXIuX2NvbnNvbGVfdGltZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IGRlYm91bmNlIHRpbWVyXG4gICAgICAgIERlYnVnZ2VyLl9jb25zb2xlX3RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBEZWJ1Z2dlci5fZmx1c2hfY29uc29sZV9iYXRjaCgpO1xuICAgICAgICB9LCBEZWJ1Z2dlci5ERUJPVU5DRV9NUyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWw6IEZsdXNoIGNvbnNvbGVfZGVidWcgYmF0Y2ggdG8gc2VydmVyXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIF9mbHVzaF9jb25zb2xlX2JhdGNoKCkge1xuICAgICAgICBpZiAoRGVidWdnZXIuX2NvbnNvbGVfYmF0Y2gubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZXNzYWdlcyA9IERlYnVnZ2VyLl9jb25zb2xlX2JhdGNoO1xuICAgICAgICBEZWJ1Z2dlci5fY29uc29sZV9iYXRjaCA9IFtdO1xuICAgICAgICBEZWJ1Z2dlci5fY29uc29sZV90aW1lciA9IG51bGw7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBBamF4LmNhbGwoUnN4LlJvdXRlKCdEZWJ1Z2dlcl9Db250cm9sbGVyJywgJ2xvZ19jb25zb2xlX21lc3NhZ2VzJyksIHsgbWVzc2FnZXM6IG1lc3NhZ2VzIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gU2lsZW50bHkgZmFpbCAtIGRvbid0IGNyZWF0ZSBlcnJvciBsb29wXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc2VuZCBjb25zb2xlX2RlYnVnIG1lc3NhZ2VzIHRvIHNlcnZlcjonLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbDogRmx1c2ggZXJyb3IgYmF0Y2ggdG8gc2VydmVyXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIF9mbHVzaF9lcnJvcl9iYXRjaCgpIHtcbiAgICAgICAgaWYgKERlYnVnZ2VyLl9lcnJvcl9iYXRjaC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVycm9ycyA9IERlYnVnZ2VyLl9lcnJvcl9iYXRjaDtcbiAgICAgICAgRGVidWdnZXIuX2Vycm9yX2JhdGNoID0gW107XG4gICAgICAgIERlYnVnZ2VyLl9lcnJvcl90aW1lciA9IG51bGw7XG4gICAgICAgIERlYnVnZ2VyLl9lcnJvcl9iYXRjaF9jb3VudCsrO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gQWpheC5jYWxsKFJzeC5Sb3V0ZSgnRGVidWdnZXJfQ29udHJvbGxlcicsICdsb2dfYnJvd3Nlcl9lcnJvcnMnKSwgeyBlcnJvcnM6IGVycm9ycyB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIFNpbGVudGx5IGZhaWwgLSBkb24ndCBjcmVhdGUgZXJyb3IgbG9vcFxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHNlbmQgYnJvd3NlciBlcnJvcnMgdG8gc2VydmVyOicsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludGVybmFsOiBHZXQgdGltZSBwcmVmaXggZm9yIGJlbmNobWFya2luZ1xuICAgICAqL1xuICAgIHN0YXRpYyBfZ2V0X3RpbWVfcHJlZml4KCkge1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAoIURlYnVnZ2VyLl9zdGFydF90aW1lKSB7XG4gICAgICAgICAgICBEZWJ1Z2dlci5fc3RhcnRfdGltZSA9IG5vdztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGFwc2VkID0gbm93IC0gRGVidWdnZXIuX3N0YXJ0X3RpbWU7XG4gICAgICAgIHJldHVybiAoZWxhcHNlZCAvIDEwMDApLnRvRml4ZWQoMykgKyAncyc7XG4gICAgfVxufVxuIiwiLy8gQEpTLVRISVMtMDEtRVhDRVBUSU9OXG4vKipcbiAqIGpRdWVyeSBoZWxwZXIgZXh0ZW5zaW9ucyBmb3IgdGhlIFJTWCBmcmFtZXdvcmtcbiAqIFRoZXNlIGV4dGVuc2lvbnMgYWRkIHV0aWxpdHkgbWV0aG9kcyB0byBqUXVlcnkncyBwcm90b3R5cGVcbiAqIE5vdGU6ICd0aGlzJyByZWZlcmVuY2VzIGluIGpRdWVyeSBleHRlbnNpb25zIHJlZmVyIHRvIGpRdWVyeSBvYmplY3RzIGJ5IGRlc2lnblxuICovXG5jbGFzcyBSc3hfSnFfSGVscGVycyB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBqUXVlcnkgZXh0ZW5zaW9ucyB3aGVuIHRoZSBmcmFtZXdvcmsgY29yZSBpcyBkZWZpbmVkXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyBmcmFtZXdvcmsgaW5pdGlhbGl6YXRpb25cbiAgICAgKi9cbiAgICBzdGF0aWMgX29uX2ZyYW1ld29ya19jb3JlX2RlZmluZSgpIHtcbiAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIGpxdWVyeSBzZWxlY3RvciBtYXRjaGVkIGFuIGVsZW1lbnRcbiAgICAgICAgJC5mbi5leGlzdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPiAwO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBqcXVlcnkgZWxlbWVudCBpcyB2aXNpYmxlXG4gICAgICAgICQuZm4uaXNfdmlzaWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzKCc6dmlzaWJsZScpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFNjcm9sbHMgdG8gdGhlIHRhcmdldCBlbGVtZW50LCBvbmx5IHNjcm9sbHMgdXAuICBUb2RvOiBDcmVhdGUgYSB2ZXJzaW9uXG4gICAgICAgIC8vIG9mIHRoaXMgdGhhdCBhbHNvIHNjcm9sbHMgb25seSBkb3duLCBvciBib3RoXG4gICAgICAgICQuZm4uc2Nyb2xsX3VwX3RvID0gZnVuY3Rpb24gKHNwZWVkID0gMCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmV4aXN0cygpKSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKFwiQ291bGQgbm90IGZpbmQgdGFyZ2V0IGVsZW1lbnQgdG8gc2Nyb2xsIHRvXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzX2luX2RvbSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKFwiVGFyZ2V0IGVsZW1lbnQgZm9yIHNjcm9sbCBpcyBub3Qgb24gZG9tXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGVfdG9wID0gTWF0aC5yb3VuZCh0aGlzLm9mZnNldCgpLnRvcCk7XG4gICAgICAgICAgICBsZXQgc190b3AgPSAkKCdib2R5Jykuc2Nyb2xsVG9wKCk7XG4gICAgICAgICAgICBpZiAoZV90b3AgPCAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IHNfdG9wICsgZV90b3A7XG4gICAgICAgICAgICAgICAgJCgnaHRtbCwgYm9keScpLmFuaW1hdGUoXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogdGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzcGVlZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gJCgpLmlzKFwiOmZvY3VzXCIpIC0gY2hlY2sgaWYgZWxlbWVudCBoYXMgZm9jdXNcbiAgICAgICAgJC5leHByWyc6J10uZm9jdXMgPSBmdW5jdGlvbiAoZWxlbSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW0gPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFNhdmUgbmF0aXZlIGNsaWNrIGJlaGF2aW9yIGJlZm9yZSBvdmVycmlkZVxuICAgICAgICAkLmZuLl9jbGlja19uYXRpdmUgPSAkLmZuLmNsaWNrO1xuXG4gICAgICAgIC8vIE92ZXJyaWRlIC5jbGljaygpIHRvIGNhbGwgcHJldmVudERlZmF1bHQgYnkgZGVmYXVsdFxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGFjY2lkZW50YWwgcGFnZSBuYXZpZ2F0aW9uL2Zvcm0gc3VibWlzc2lvbiAtIHRoZSBjb3JyZWN0IGJlaGF2aW9yIDk1JSBvZiB0aGUgdGltZVxuICAgICAgICAkLmZuLmNsaWNrID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgICAgICAgIC8vIElmIG5vIGhhbmRsZXIgcHJvdmlkZWQsIHRyaWdnZXIgY2xpY2sgZXZlbnQgKGpRdWVyeSAuY2xpY2soKSB3aXRoIG5vIGFyZ3MpXG4gICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NsaWNrX25hdGl2ZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBdHRhY2ggY2xpY2sgaGFuZGxlciB3aXRoIGF1dG9tYXRpYyBwcmV2ZW50RGVmYXVsdFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBTYXZlIG9yaWdpbmFsIHByZXZlbnREZWZhdWx0XG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxfcHJldmVudERlZmF1bHQgPSBlLnByZXZlbnREZWZhdWx0LmJpbmQoZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBPdmVycmlkZSBwcmV2ZW50RGVmYXVsdCB0byBzaG93IHdhcm5pbmcgd2hlbiBjYWxsZWQgZXhwbGljaXRseVxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdldmVudC5wcmV2ZW50RGVmYXVsdCgpIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IFJTcGFkZSAuY2xpY2soKSBoYW5kbGVycyBhbmQgY2FuIGJlIHJlbW92ZWQuJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbF9wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAvLyBDYWxsIHByZXZlbnREZWZhdWx0IGJlZm9yZSBoYW5kbGVyXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxfcHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyLmNhbGwodGhpcywgZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBFc2NhcGUgaGF0Y2g6IGNsaWNrIGhhbmRsZXIgd2l0aG91dCBwcmV2ZW50RGVmYXVsdCBmb3IgdGhlIDUlIGNhc2VcbiAgICAgICAgJC5mbi5jbGlja19hbGxvd19kZWZhdWx0ID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY2xpY2tfbmF0aXZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2xpY2tfbmF0aXZlKGhhbmRsZXIpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUganF1ZXJ5IGVsZW1lbnQgZXhpc3RzIGluIGFuZCBpcyBhdHRhY2hlZCB0byB0aGUgRE9NXG4gICAgICAgICQuZm4uaXNfaW5fZG9tID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0ICRlbGVtZW50ID0gdGhpcztcbiAgICAgICAgICAgIGxldCBfYW5jZXN0b3IgPSBmdW5jdGlvbiAoSFRNTG9iaikge1xuICAgICAgICAgICAgICAgIHdoaWxlIChIVE1Mb2JqLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgSFRNTG9iaiA9IEhUTUxvYmoucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIEhUTUxvYmo7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIF9hbmNlc3RvcigkZWxlbWVudFswXSkgPT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBpbiB0aGUgdmlld3BvcnRcbiAgICAgICAgJC5mbi5pc19pbl92aWV3cG9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBzY3JvbGx0b3AgPSAkKHdpbmRvdykuc2Nyb2xsVG9wKCkgPiAwID8gJCh3aW5kb3cpLnNjcm9sbFRvcCgpIDogJCgnYm9keScpLnNjcm9sbFRvcCgpO1xuXG4gICAgICAgICAgICBsZXQgJGVsZW1lbnQgPSB0aGlzO1xuXG4gICAgICAgICAgICBjb25zdCB0b3Bfb2ZfZWxlbWVudCA9ICRlbGVtZW50Lm9mZnNldCgpLnRvcDtcbiAgICAgICAgICAgIGNvbnN0IGJvdHRvbV9vZl9lbGVtZW50ID0gJGVsZW1lbnQub2Zmc2V0KCkudG9wICsgJGVsZW1lbnQub3V0ZXJIZWlnaHQoKTtcbiAgICAgICAgICAgIGNvbnN0IGJvdHRvbV9vZl9zY3JlZW4gPSBzY3JvbGx0b3AgKyAkKHdpbmRvdykuaW5uZXJIZWlnaHQoKTtcbiAgICAgICAgICAgIGNvbnN0IHRvcF9vZl9zY3JlZW4gPSBzY3JvbGx0b3A7XG5cbiAgICAgICAgICAgIGlmIChib3R0b21fb2Zfc2NyZWVuID4gdG9wX29mX2VsZW1lbnQgJiYgdG9wX29mX3NjcmVlbiA8IGJvdHRvbV9vZl9lbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBHZXRzIHRoZSB0YWduYW1lIG9mIGEganF1ZXJ5IGVsZW1lbnRcbiAgICAgICAgJC5mbi50YWduYW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcCgndGFnTmFtZScpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIGEgaHJlZiBpcyBub3Qgc2FtZSBkb21haW5cbiAgICAgICAgJC5mbi5pc19leHRlcm5hbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGhvc3QgPSB3aW5kb3cubG9jYXRpb24uaG9zdDtcbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSAkKCc8YT4nLCB7XG4gICAgICAgICAgICAgICAgaHJlZjogdGhpcy5hdHRyKCdocmVmJyksXG4gICAgICAgICAgICB9KVswXS5ob3N0bmFtZTtcbiAgICAgICAgICAgIHJldHVybiBsaW5rICE9PSBob3N0O1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEhUTUw1IGZvcm0gdmFsaWRhdGlvbiB3cmFwcGVyc1xuICAgICAgICAkLmZuLmNoZWNrVmFsaWRpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzWzBdLmNoZWNrVmFsaWRpdHkoKTtcbiAgICAgICAgfTtcblxuICAgICAgICAkLmZuLnJlcG9ydFZhbGlkaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1swXS5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICB9O1xuXG4gICAgICAgICQuZm4ucmVxdWVzdFN1Ym1pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB0aGlzWzBdLnJlcXVlc3RTdWJtaXQoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEZpbmQgcmVsYXRlZCBjb21wb25lbnRzIGJ5IHNlYXJjaGluZyB1cCB0aGUgYW5jZXN0b3IgdHJlZVxuICAgICAgICAvLyBMaWtlIC5jbG9zZXN0KCkgYnV0IHNlYXJjaGVzIHdpdGhpbiBhbmNlc3RvcnMgaW5zdGVhZCBvZiBtYXRjaGluZyB0aGVtXG4gICAgICAgICQuZm4uY2xvc2VzdF9zaWJsaW5nID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgICAgICAgICBsZXQgJGN1cnJlbnQgPSB0aGlzO1xuICAgICAgICAgICAgbGV0ICRwYXJlbnQgPSAkY3VycmVudC5wYXJlbnQoKTtcblxuICAgICAgICAgICAgLy8gS2VlcCBnb2luZyB1cCB0aGUgdHJlZSB1bnRpbCB3ZSBoaXQgYm9keVxuICAgICAgICAgICAgd2hpbGUgKCRwYXJlbnQubGVuZ3RoID4gMCAmJiAhJHBhcmVudC5pcygnYm9keScpKSB7XG4gICAgICAgICAgICAgICAgLy8gU2VhcmNoIHdpdGhpbiB0aGlzIHBhcmVudCBmb3IgdGhlIHNlbGVjdG9yXG4gICAgICAgICAgICAgICAgbGV0ICRmb3VuZCA9ICRwYXJlbnQuZmluZChzZWxlY3Rvcik7XG4gICAgICAgICAgICAgICAgaWYgKCRmb3VuZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkZm91bmQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTW92ZSB1cCBvbmUgbGV2ZWxcbiAgICAgICAgICAgICAgICAkcGFyZW50ID0gJHBhcmVudC5wYXJlbnQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCBib2R5LCBzZWFyY2ggd2l0aGluIGJvZHkgYXMgd2VsbFxuICAgICAgICAgICAgaWYgKCRwYXJlbnQuaXMoJ2JvZHknKSkge1xuICAgICAgICAgICAgICAgIGxldCAkZm91bmQgPSAkcGFyZW50LmZpbmQoc2VsZWN0b3IpO1xuICAgICAgICAgICAgICAgIGlmICgkZm91bmQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGZvdW5kO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmV0dXJuIGVtcHR5IGpRdWVyeSBvYmplY3QgaWYgbm90aGluZyBmb3VuZFxuICAgICAgICAgICAgcmV0dXJuICQoKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBPdmVycmlkZSAkLmFqYXggdG8gcHJldmVudCBkaXJlY3QgQUpBWCBjYWxscyB0byBsb2NhbCBzZXJ2ZXJcbiAgICAgICAgLy8gRGV2ZWxvcGVycyBtdXN0IHVzZSB0aGUgQWpheCBlbmRwb2ludCBwYXR0ZXJuOiBhd2FpdCBDb250cm9sbGVyLm1ldGhvZChwYXJhbXMpXG4gICAgICAgIGNvbnN0IG5hdGl2ZV9hamF4ID0gJC5hamF4O1xuICAgICAgICAkLmFqYXggPSBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgYm90aCAkLmFqYXgodXJsLCBvcHRpb25zKSBhbmQgJC5hamF4KG9wdGlvbnMpIHNpZ25hdHVyZXNcbiAgICAgICAgICAgIGxldCBzZXR0aW5ncztcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHNldHRpbmdzID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgICAgICBzZXR0aW5ncy51cmwgPSB1cmw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldHRpbmdzID0gdXJsIHx8IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgbG9jYWwgcmVxdWVzdCAocmVsYXRpdmUgVVJMIG9yIHNhbWUgZG9tYWluKVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdF91cmwgPSBzZXR0aW5ncy51cmwgfHwgJyc7XG4gICAgICAgICAgICBjb25zdCBpc19yZWxhdGl2ZSA9ICFyZXF1ZXN0X3VybC5tYXRjaCgvXmh0dHBzPzpcXC9cXC8vKTtcbiAgICAgICAgICAgIGNvbnN0IGlzX3NhbWVfZG9tYWluID0gcmVxdWVzdF91cmwuc3RhcnRzV2l0aCh3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICAgICAgICAgIGNvbnN0IGlzX2xvY2FsX3JlcXVlc3QgPSBpc19yZWxhdGl2ZSB8fCBpc19zYW1lX2RvbWFpbjtcblxuICAgICAgICAgICAgLy8gQWxsb3cgZnJhbWV3b3JrIEFqYXguY2FsbCgpIHRvIGZ1bmN0aW9uXG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MuX19sb2NhbF9pbnRlZ3JhdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVfYWpheC5jYWxsKHRoaXMsIHNldHRpbmdzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWxsb3cgZmlsZSB1cGxvYWQgZW5kcG9pbnQgLSByZXF1aXJlcyBuYXRpdmUgJC5hamF4IGZvciBGb3JtRGF0YSBzdXBwb3J0XG4gICAgICAgICAgICBjb25zdCBpc19maWxlX3VwbG9hZCA9IHJlcXVlc3RfdXJsID09PSAnL191cGxvYWQnIHx8IHJlcXVlc3RfdXJsLmVuZHNXaXRoKCcvX3VwbG9hZCcpO1xuICAgICAgICAgICAgaWYgKGlzX2ZpbGVfdXBsb2FkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZV9hamF4LmNhbGwodGhpcywgc2V0dGluZ3MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBCbG9jayBsb2NhbCBBSkFYIHJlcXVlc3RzIHRoYXQgZG9uJ3QgdXNlIHRoZSBBamF4IGVuZHBvaW50IHBhdHRlcm5cbiAgICAgICAgICAgIGlmIChpc19sb2NhbF9yZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgLy8gVHJ5IHRvIHBhcnNlIGNvbnRyb2xsZXIgYW5kIGFjdGlvbiBmcm9tIFVSTFxuICAgICAgICAgICAgICAgIGxldCBjb250cm9sbGVyX25hbWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBhY3Rpb25fbmFtZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsX21hdGNoID0gcmVxdWVzdF91cmwubWF0Y2goL1xcL19yc3hfYXBpXFwvKFteXFwvXSspXFwvKFteXFwvXFw/XSspLyk7XG4gICAgICAgICAgICAgICAgaWYgKHVybF9tYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyX25hbWUgPSB1cmxfbWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbl9uYW1lID0gdXJsX21hdGNoWzJdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBlcnJvcl9tZXNzYWdlID0gJ0FKQVggcmVxdWVzdHMgdG8gbG9jYWxob3N0IHZpYSAkLmFqYXgoKSBhcmUgcHJvaGliaXRlZC5cXG5cXG4nO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXJfbmFtZSAmJiBhY3Rpb25fbmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlICs9IGBJbnN0ZWFkIG9mOlxcbmA7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgKz0gYCAgJC5hamF4KHt1cmw6ICcke3JlcXVlc3RfdXJsfScsIC4uLn0pXFxuXFxuYDtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSArPSBgVXNlOlxcbmA7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgKz0gYCAgYXdhaXQgJHtjb250cm9sbGVyX25hbWV9LiR7YWN0aW9uX25hbWV9KHBhcmFtZXRlcnMpXFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlICs9IGBVc2UgdGhlIEFqYXggZW5kcG9pbnQgcGF0dGVybjpcXG5gO1xuICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlICs9IGAgIGF3YWl0IENvbnRyb2xsZXJfTmFtZS5hY3Rpb25fbmFtZShwYXJhbWV0ZXJzKVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSArPSBgVGhlIGNvbnRyb2xsZXIgbWV0aG9kIG11c3QgaGF2ZSB0aGUgI1tBamF4X0VuZHBvaW50XSBhdHRyaWJ1dGUuYDtcblxuICAgICAgICAgICAgICAgIHNob3VsZG50X2hhcHBlbihlcnJvcl9tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWxsb3cgZXh0ZXJuYWwgcmVxdWVzdHMgKGRpZmZlcmVudCBkb21haW4pXG4gICAgICAgICAgICByZXR1cm4gbmF0aXZlX2FqYXguY2FsbCh0aGlzLCBzZXR0aW5ncyk7XG4gICAgICAgIH07XG4gICAgfVxufSIsIi8vIEBST1VURS1FWElTVFMtMDEtRVhDRVBUSU9OIC0gVGhpcyBmaWxlIGNvbnRhaW5zIGRvY3VtZW50YXRpb24gZXhhbXBsZXMgd2l0aCBmaWN0aW9uYWwgcm91dGUgbmFtZXNcblxuLyoqXG4gKiBSc3ggLSBDb3JlIEphdmFTY3JpcHQgUnVudGltZSBTeXN0ZW1cbiAqXG4gKiBUaGUgUnN4IGNsYXNzIGlzIHRoZSBjZW50cmFsIGh1YiBmb3IgdGhlIFJTWCBKYXZhU2NyaXB0IHJ1bnRpbWUsIHByb3ZpZGluZyBlc3NlbnRpYWxcbiAqIHN5c3RlbS1sZXZlbCB1dGlsaXRpZXMgdGhhdCBhbGwgb3RoZXIgZnJhbWV3b3JrIGNvbXBvbmVudHMgZGVwZW5kIG9uLiBJdCBzZXJ2ZXMgYXMgdGhlXG4gKiBmb3VuZGF0aW9uIGZvciB0aGUgY2xpZW50LXNpZGUgZnJhbWV3b3JrLCBoYW5kbGluZyBjb3JlIG9wZXJhdGlvbnMgdGhhdCBtdXN0IGJlIGdsb2JhbGx5XG4gKiBhY2Nlc3NpYmxlIGFuZCBjb25zaXN0ZW50bHkgYXZhaWxhYmxlLlxuICpcbiAqIENvcmUgUmVzcG9uc2liaWxpdGllczpcbiAqIC0gRXZlbnQgU3lzdGVtOiBBcHBsaWNhdGlvbi13aWRlIGV2ZW50IGJ1cyBmb3IgZnJhbWV3b3JrIGxpZmVjeWNsZSBhbmQgY3VzdG9tIGV2ZW50c1xuICogLSBFbnZpcm9ubWVudCBEZXRlY3Rpb246IFJ1bnRpbWUgZW52aXJvbm1lbnQgaWRlbnRpZmljYXRpb24gKGRldi9wcm9kdWN0aW9uKVxuICogLSBSb3V0ZSBNYW5hZ2VtZW50OiBUeXBlLXNhZmUgcm91dGUgZ2VuZXJhdGlvbiBhbmQgVVJMIGJ1aWxkaW5nXG4gKiAtIFVuaXF1ZSBJRCBHZW5lcmF0aW9uOiBDbGllbnQtc2lkZSB1bmlxdWUgaWRlbnRpZmllciBnZW5lcmF0aW9uXG4gKiAtIEZyYW1ld29yayBCb290c3RyYXA6IE11bHRpLXBoYXNlIGluaXRpYWxpemF0aW9uIG9yY2hlc3RyYXRpb25cbiAqIC0gTG9nZ2luZzogQ2VudHJhbGl6ZWQgbG9nZ2luZyBpbnRlcmZhY2UgKGRlbGVnYXRlcyB0byBjb25zb2xlX2RlYnVnKVxuICpcbiAqIFRoZSBSc3ggY2xhc3MgZGVsaWJlcmF0ZWx5IGtlZXBzIGl0cyBzY29wZSBsaW1pdGVkIHRvIGNvcmUgdXRpbGl0aWVzLiBBZHZhbmNlZCBmZWF0dXJlc1xuICogYXJlIGRlbGVnYXRlZCB0byBzcGVjaWFsaXplZCBjbGFzc2VzOlxuICogLSBNYW5pZmVzdCBvcGVyYXRpb25zIOKGkiBNYW5pZmVzdCBjbGFzc1xuICogLSBDYWNoaW5nIOKGkiBSc3hfQ2FjaGUgY2xhc3NcbiAqIC0gQUpBWC9BUEkgY2FsbHMg4oaSIEFqYXhfKiBjbGFzc2VzXG4gKiAtIFJvdXRlIHByb3hpZXMg4oaSIFJzeF9Sb3V0ZV9Qcm94eSBjbGFzc1xuICogLSBCZWhhdmlvcnMg4oaSIFJzeF9CZWhhdmlvcnMgY2xhc3NcbiAqXG4gKiBBbGwgbWV0aG9kcyBhcmUgc3RhdGljIC0gUnN4IGlzIG5ldmVyIGluc3RhbnRpYXRlZC4gSXQncyBhdmFpbGFibGUgZ2xvYmFsbHkgZnJvbSB0aGVcbiAqIG1vbWVudCBidW5kbGVzIGxvYWQgYW5kIHJlbWFpbnMgY29uc3RhbnQgdGhyb3VnaG91dCB0aGUgYXBwbGljYXRpb24gbGlmZWN5Y2xlLlxuICpcbiAqIFVzYWdlIEV4YW1wbGVzOlxuICogYGBgamF2YXNjcmlwdFxuICogLy8gRXZlbnQgc3lzdGVtXG4gKiBSc3gub24oJ2FwcF9yZWFkeScsICgpID0+IGNvbnNvbGUubG9nKCdBcHAgaW5pdGlhbGl6ZWQnKSk7XG4gKiBSc3gudHJpZ2dlcignY3VzdG9tX2V2ZW50Jywge2RhdGE6ICd2YWx1ZSd9KTtcbiAqXG4gKiAvLyBFbnZpcm9ubWVudCBkZXRlY3Rpb25cbiAqIGlmIChSc3guaXNfZGV2KCkpIHsgY29uc29sZS5sb2coJ0RldmVsb3BtZW50IG1vZGUnKTsgfVxuICpcbiAqIC8vIFJvdXRlIGdlbmVyYXRpb25cbiAqIGNvbnN0IHVybCA9IFJzeC5Sb3V0ZSgnQ29udHJvbGxlcicsICdhY3Rpb24nKS51cmwoKTtcbiAqXG4gKiAvLyBVbmlxdWUgSURzXG4gKiBjb25zdCB1bmlxdWVJZCA9IFJzeC51aWQoKTsgLy8gZS5nLiwgXCJyc3hfMTIzNDU2Nzg5MF8xXCJcbiAqIGBgYFxuICpcbiAqIEBzdGF0aWNcbiAqIEBnbG9iYWxcbiAqL1xuY2xhc3MgUnN4IHtcbiAgICAvLyBHZXRzIHNldCB0byB0cnVlIHRvIGludGVydXB0IHN0YXJ0dXAgc2VxdWVuY2VcbiAgICBzdGF0aWMgX19zdG9wcGVkID0gZmFsc2U7XG5cbiAgICAvLyBJbml0aWFsaXplIGV2ZW50IGhhbmRsZXJzIHN0b3JhZ2VcbiAgICBzdGF0aWMgX2luaXRfZXZlbnRzKCkge1xuICAgICAgICBpZiAodHlwZW9mIFJzeC5fZXZlbnRfaGFuZGxlcnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBSc3guX2V2ZW50X2hhbmRsZXJzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBSc3guX3RyaWdnZXJlZF9ldmVudHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBSc3guX3RyaWdnZXJlZF9ldmVudHMgPSB7fTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlZ2lzdGVyIGFuIGV2ZW50IGhhbmRsZXJcbiAgICBzdGF0aWMgb24oZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgICAgIFJzeC5faW5pdF9ldmVudHMoKTtcblxuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFSc3guX2V2ZW50X2hhbmRsZXJzW2V2ZW50XSkge1xuICAgICAgICAgICAgUnN4Ll9ldmVudF9oYW5kbGVyc1tldmVudF0gPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIFJzeC5fZXZlbnRfaGFuZGxlcnNbZXZlbnRdLnB1c2goY2FsbGJhY2spO1xuXG4gICAgICAgIC8vIElmIHRoaXMgZXZlbnQgd2FzIGFscmVhZHkgdHJpZ2dlcmVkLCBjYWxsIHRoZSBjYWxsYmFjayBpbW1lZGlhdGVseVxuICAgICAgICBpZiAoUnN4Ll90cmlnZ2VyZWRfZXZlbnRzW2V2ZW50XSkge1xuICAgICAgICAgICAgY29uc29sZV9kZWJ1ZygnUlNYX0lOSVQnLCAnVHJpZ2dlcmluZyAnICsgZXZlbnQgKyAnIGZvciBsYXRlIHJlZ2lzdGVyZWQgY2FsbGJhY2snKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKFJzeC5fdHJpZ2dlcmVkX2V2ZW50c1tldmVudF0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJpZ2dlciBhbiBldmVudCB3aXRoIG9wdGlvbmFsIGRhdGFcbiAgICBzdGF0aWMgdHJpZ2dlcihldmVudCwgZGF0YSA9IHt9KSB7XG4gICAgICAgIFJzeC5faW5pdF9ldmVudHMoKTtcblxuICAgICAgICAvLyBSZWNvcmQgdGhhdCB0aGlzIGV2ZW50IHdhcyB0cmlnZ2VyZWRcbiAgICAgICAgUnN4Ll90cmlnZ2VyZWRfZXZlbnRzW2V2ZW50XSA9IGRhdGE7XG5cbiAgICAgICAgaWYgKCFSc3guX2V2ZW50X2hhbmRsZXJzW2V2ZW50XSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZV9kZWJ1ZygnUlNYX0lOSVQnLCAnVHJpZ2dlcmluZyAnICsgZXZlbnQgKyAnIGZvciAnICsgUnN4Ll9ldmVudF9oYW5kbGVyc1tldmVudF0ubGVuZ3RoICsgJyBjYWxsYmFja3MnKTtcblxuICAgICAgICAvLyBDYWxsIGFsbCByZWdpc3RlcmVkIGhhbmRsZXJzIGZvciB0aGlzIGV2ZW50IGluIG9yZGVyXG4gICAgICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgUnN4Ll9ldmVudF9oYW5kbGVyc1tldmVudF0pIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWxpYXMgZm9yIHRyaWdnZXIucmVmcmVzaCgnJyksIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgbWFqb3IgVUkgdXBkYXRlcyB0byBhcHBseSBzdWNoIGVmZmVjdHMgYXNcbiAgICAvLyB1bmRlcmxpbmluZyBsaW5rcyB0byB1bmltcGxlbWVudGVkICMgcm91dGVzXG4gICAgc3RhdGljIHRyaWdnZXJfcmVmcmVzaCgpIHtcbiAgICAgICAgLy8gVXNlIFJzeC5vbigncmVmcmVzaCcsIGNhbGxiYWNrKTsgdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayBmb3IgcmVmcmVzaFxuICAgICAgICB0aGlzLnRyaWdnZXIoJ3JlZnJlc2gnKTtcbiAgICB9XG5cbiAgICAvLyBMb2cgdG8gc2VydmVyIHRoYXQgYW4gZXZlbnQgaGFwcGVuZWRcbiAgICBzdGF0aWMgbG9nKHR5cGUsIG1lc3NhZ2UgPSAnbm90aWNlJykge1xuICAgICAgICBDb3JlX0xvZy5sb2codHlwZSwgbWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBhcHAgaXMgYmVpbmcgcnVuIGluIGRldiBtb2RlXG4gICAgLy8gVGhpcyBzaG91bGQgYWZmZWN0IGNhY2hpbmcgYW5kIHNvbWUgZGVidWcgY2hlY2tzXG4gICAgc3RhdGljIGlzX2RldigpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5yc3hhcHAuZGVidWc7XG4gICAgfVxuXG4gICAgc3RhdGljIGlzX3Byb2QoKSB7XG4gICAgICAgIHJldHVybiAhd2luZG93LnJzeGFwcC5kZWJ1ZztcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZXMgYSB1bmlxdWUgbnVtYmVyIGZvciB0aGUgYXBwbGljYXRpb24gaW5zdGFuY2VcbiAgICBzdGF0aWMgdWlkKCkge1xuICAgICAgICBpZiAodHlwZW9mIFJzeC5fdWlkID09IHVuZGVmKSB7XG4gICAgICAgICAgICBSc3guX3VpZCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJzeC5fdWlkKys7XG4gICAgfVxuXG4gICAgLy8gU3RvcmFnZSBmb3Igcm91dGUgZGVmaW5pdGlvbnMgbG9hZGVkIGZyb20gYnVuZGxlc1xuICAgIHN0YXRpYyBfcm91dGVzID0ge307XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgcm91dGVzIGZyb20gYnVuZGxlZCBkYXRhXG4gICAgICogQ2FsbGVkIGJ5IGdlbmVyYXRlZCBKYXZhU2NyaXB0IGluIGJ1bmRsZXNcbiAgICAgKi9cbiAgICBzdGF0aWMgX2RlZmluZV9yb3V0ZXMocm91dGVzKSB7XG4gICAgICAgIC8vIE1lcmdlIHJvdXRlcyBpbnRvIHRoZSBnbG9iYWwgcm91dGUgc3RvcmFnZVxuICAgICAgICBmb3IgKGNvbnN0IGNsYXNzX25hbWUgaW4gcm91dGVzKSB7XG4gICAgICAgICAgICBpZiAoIVJzeC5fcm91dGVzW2NsYXNzX25hbWVdKSB7XG4gICAgICAgICAgICAgICAgUnN4Ll9yb3V0ZXNbY2xhc3NfbmFtZV0gPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgbWV0aG9kX25hbWUgaW4gcm91dGVzW2NsYXNzX25hbWVdKSB7XG4gICAgICAgICAgICAgICAgUnN4Ll9yb3V0ZXNbY2xhc3NfbmFtZV1bbWV0aG9kX25hbWVdID0gcm91dGVzW2NsYXNzX25hbWVdW21ldGhvZF9uYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIFVSTCBmb3IgYSBjb250cm9sbGVyIHJvdXRlXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBnZW5lcmF0ZXMgVVJMcyBmb3IgY29udHJvbGxlciBhY3Rpb25zIGJ5IGxvb2tpbmcgdXAgcm91dGUgcGF0dGVybnNcbiAgICAgKiBhbmQgcmVwbGFjaW5nIHBhcmFtZXRlcnMuIEl0IGhhbmRsZXMgYm90aCByZWd1bGFyIHJvdXRlcyBhbmQgQWpheCBlbmRwb2ludHMuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgcm91dGUgaXMgbm90IGZvdW5kIGluIHRoZSByb3V0ZSBkZWZpbml0aW9ucywgYSBkZWZhdWx0IHBhdHRlcm4gaXMgdXNlZDpcbiAgICAgKiBgL18ve2NvbnRyb2xsZXJ9L3thY3Rpb259YCB3aXRoIGFsbCBwYXJhbWV0ZXJzIGFwcGVuZGVkIGFzIHF1ZXJ5IHN0cmluZ3MuXG4gICAgICpcbiAgICAgKiBVc2FnZSBleGFtcGxlczpcbiAgICAgKiBgYGBqYXZhc2NyaXB0XG4gICAgICogLy8gU2ltcGxlIHJvdXRlIHdpdGhvdXQgcGFyYW1ldGVycyAoZGVmYXVsdHMgdG8gJ2luZGV4JyBhY3Rpb24pXG4gICAgICogY29uc3QgdXJsID0gUnN4LlJvdXRlKCdGcm9udGVuZF9JbmRleF9Db250cm9sbGVyJyk7XG4gICAgICogLy8gUmV0dXJuczogL2Rhc2hib2FyZFxuICAgICAqXG4gICAgICogLy8gUm91dGUgd2l0aCBleHBsaWNpdCBhY3Rpb25cbiAgICAgKiBjb25zdCB1cmwgPSBSc3guUm91dGUoJ0Zyb250ZW5kX0luZGV4X0NvbnRyb2xsZXInLCAnaW5kZXgnKTtcbiAgICAgKiAvLyBSZXR1cm5zOiAvZGFzaGJvYXJkXG4gICAgICpcbiAgICAgKiAvLyBSb3V0ZSB3aXRoIGludGVnZXIgcGFyYW1ldGVyIChzZXRzICdpZCcpXG4gICAgICogY29uc3QgdXJsID0gUnN4LlJvdXRlKCdGcm9udGVuZF9DbGllbnRfVmlld19Db250cm9sbGVyJywgJ3ZpZXcnLCAxMjMpO1xuICAgICAqIC8vIFJldHVybnM6IC9jbGllbnRzL3ZpZXcvMTIzXG4gICAgICpcbiAgICAgKiAvLyBSb3V0ZSB3aXRoIG5hbWVkIHBhcmFtZXRlcnMgKG9iamVjdClcbiAgICAgKiBjb25zdCB1cmwgPSBSc3guUm91dGUoJ0Zyb250ZW5kX0NsaWVudF9WaWV3X0NvbnRyb2xsZXInLCAndmlldycsIHtpZDogJ0MwMDEnfSk7XG4gICAgICogLy8gUmV0dXJuczogL2NsaWVudHMvdmlldy9DMDAxXG4gICAgICpcbiAgICAgKiAvLyBSb3V0ZSB3aXRoIHJlcXVpcmVkIGFuZCBxdWVyeSBwYXJhbWV0ZXJzXG4gICAgICogY29uc3QgdXJsID0gUnN4LlJvdXRlKCdGcm9udGVuZF9DbGllbnRfVmlld19Db250cm9sbGVyJywgJ3ZpZXcnLCB7XG4gICAgICogICAgIGlkOiAnQzAwMScsXG4gICAgICogICAgIHRhYjogJ2hpc3RvcnknXG4gICAgICogfSk7XG4gICAgICogLy8gUmV0dXJuczogL2NsaWVudHMvdmlldy9DMDAxP3RhYj1oaXN0b3J5XG4gICAgICpcbiAgICAgKiAvLyBSb3V0ZSBub3QgZm91bmQgLSB1c2VzIGRlZmF1bHQgcGF0dGVyblxuICAgICAqIGNvbnN0IHVybCA9IFJzeC5Sb3V0ZSgnVW5pbXBsZW1lbnRlZF9Db250cm9sbGVyJywgJ3NvbWVfYWN0aW9uJywge2ZvbzogJ2Jhcid9KTtcbiAgICAgKiAvLyBSZXR1cm5zOiAvXy9VbmltcGxlbWVudGVkX0NvbnRyb2xsZXIvc29tZV9hY3Rpb24/Zm9vPWJhclxuICAgICAqXG4gICAgICogLy8gUGxhY2Vob2xkZXIgcm91dGVcbiAgICAgKiBjb25zdCB1cmwgPSBSc3guUm91dGUoJ0Z1dHVyZV9Db250cm9sbGVyJywgJyNpbmRleCcpO1xuICAgICAqIC8vIFJldHVybnM6ICNcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc19uYW1lIFRoZSBjb250cm9sbGVyIGNsYXNzIG5hbWUgKGUuZy4sICdVc2VyX0NvbnRyb2xsZXInKVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbYWN0aW9uX25hbWU9J2luZGV4J10gVGhlIGFjdGlvbi9tZXRob2QgbmFtZSAoZGVmYXVsdHMgdG8gJ2luZGV4JykuIFVzZSAnI2FjdGlvbicgZm9yIHBsYWNlaG9sZGVycy5cbiAgICAgKiBAcGFyYW0ge251bWJlcnxPYmplY3R9IFtwYXJhbXM9bnVsbF0gUm91dGUgcGFyYW1ldGVycy4gSW50ZWdlciBzZXRzICdpZCcsIG9iamVjdCBwcm92aWRlcyBuYW1lZCBwYXJhbXMuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGdlbmVyYXRlZCBVUkxcbiAgICAgKi9cbiAgICBzdGF0aWMgUm91dGUoY2xhc3NfbmFtZSwgYWN0aW9uX25hbWUgPSAnaW5kZXgnLCBwYXJhbXMgPSBudWxsKSB7XG4gICAgICAgIC8vIE5vcm1hbGl6ZSBwYXJhbXMgdG8gb2JqZWN0XG4gICAgICAgIGxldCBwYXJhbXNfb2JqID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcGFyYW1zX29iaiA9IHsgaWQ6IHBhcmFtcyB9O1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcyAmJiB0eXBlb2YgcGFyYW1zID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcGFyYW1zX29iaiA9IHBhcmFtcztcbiAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMgIT09IG51bGwgJiYgcGFyYW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyYW1zIG11c3QgYmUgbnVtYmVyLCBvYmplY3QsIG9yIG51bGwnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBsYWNlaG9sZGVyIHJvdXRlOiBhY3Rpb24gc3RhcnRzIHdpdGggIyBtZWFucyB1bmltcGxlbWVudGVkL3NjYWZmb2xkaW5nXG4gICAgICAgIGlmIChhY3Rpb25fbmFtZS5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgICAgICAgIHJldHVybiAnIyc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiByb3V0ZSBleGlzdHMgaW4gZGVmaW5pdGlvbnNcbiAgICAgICAgbGV0IHBhdHRlcm47XG4gICAgICAgIGlmIChSc3guX3JvdXRlc1tjbGFzc19uYW1lXSAmJiBSc3guX3JvdXRlc1tjbGFzc19uYW1lXVthY3Rpb25fbmFtZV0pIHtcbiAgICAgICAgICAgIHBhdHRlcm4gPSBSc3guX3JvdXRlc1tjbGFzc19uYW1lXVthY3Rpb25fbmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBSb3V0ZSBub3QgZm91bmQgLSB1c2UgZGVmYXVsdCBwYXR0ZXJuIC9fL3tjb250cm9sbGVyfS97YWN0aW9ufVxuICAgICAgICAgICAgcGF0dGVybiA9IGAvXy8ke2NsYXNzX25hbWV9LyR7YWN0aW9uX25hbWV9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdlbmVyYXRlIFVSTCBmcm9tIHBhdHRlcm5cbiAgICAgICAgcmV0dXJuIFJzeC5fZ2VuZXJhdGVfdXJsX2Zyb21fcGF0dGVybihwYXR0ZXJuLCBwYXJhbXNfb2JqKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBVUkwgZnJvbSByb3V0ZSBwYXR0ZXJuIGJ5IHJlcGxhY2luZyBwYXJhbWV0ZXJzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVybiBUaGUgcm91dGUgcGF0dGVybiAoZS5nLiwgJy91c2Vycy86aWQvdmlldycpXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBQYXJhbWV0ZXJzIHRvIGZpbGwgaW50byB0aGUgcm91dGVcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIFVSTFxuICAgICAqL1xuICAgIHN0YXRpYyBfZ2VuZXJhdGVfdXJsX2Zyb21fcGF0dGVybihwYXR0ZXJuLCBwYXJhbXMpIHtcbiAgICAgICAgLy8gRXh0cmFjdCByZXF1aXJlZCBwYXJhbWV0ZXJzIGZyb20gdGhlIHBhdHRlcm5cbiAgICAgICAgY29uc3QgcmVxdWlyZWRfcGFyYW1zID0gW107XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSBwYXR0ZXJuLm1hdGNoKC86KFthLXpBLVpfXVthLXpBLVowLTlfXSopL2cpO1xuICAgICAgICBpZiAobWF0Y2hlcykge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSA6IHByZWZpeCBmcm9tIGVhY2ggbWF0Y2hcbiAgICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgICAgIHJlcXVpcmVkX3BhcmFtcy5wdXNoKG1hdGNoLnN1YnN0cmluZygxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgcmVxdWlyZWQgcGFyYW1ldGVyc1xuICAgICAgICBjb25zdCBtaXNzaW5nID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcmVxdWlyZWQgb2YgcmVxdWlyZWRfcGFyYW1zKSB7XG4gICAgICAgICAgICBpZiAoIShyZXF1aXJlZCBpbiBwYXJhbXMpKSB7XG4gICAgICAgICAgICAgICAgbWlzc2luZy5wdXNoKHJlcXVpcmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWlyZWQgcGFyYW1ldGVycyBbJHttaXNzaW5nLmpvaW4oJywgJyl9XSBhcmUgbWlzc2luZyBmb3Igcm91dGUgJHtwYXR0ZXJufWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnVpbGQgdGhlIFVSTCBieSByZXBsYWNpbmcgcGFyYW1ldGVyc1xuICAgICAgICBsZXQgdXJsID0gcGF0dGVybjtcbiAgICAgICAgY29uc3QgdXNlZF9wYXJhbXMgPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IHBhcmFtX25hbWUgb2YgcmVxdWlyZWRfcGFyYW1zKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtc1twYXJhbV9uYW1lXTtcbiAgICAgICAgICAgIC8vIFVSTCBlbmNvZGUgdGhlIHZhbHVlXG4gICAgICAgICAgICBjb25zdCBlbmNvZGVkX3ZhbHVlID0gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcbiAgICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlKCc6JyArIHBhcmFtX25hbWUsIGVuY29kZWRfdmFsdWUpO1xuICAgICAgICAgICAgdXNlZF9wYXJhbXNbcGFyYW1fbmFtZV0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29sbGVjdCBhbnkgZXh0cmEgcGFyYW1ldGVycyBmb3IgcXVlcnkgc3RyaW5nXG4gICAgICAgIGNvbnN0IHF1ZXJ5X3BhcmFtcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwYXJhbXMpIHtcbiAgICAgICAgICAgIGlmICghdXNlZF9wYXJhbXNba2V5XSkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5X3BhcmFtc1trZXldID0gcGFyYW1zW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBlbmQgcXVlcnkgc3RyaW5nIGlmIHRoZXJlIGFyZSBleHRyYSBwYXJhbWV0ZXJzXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhxdWVyeV9wYXJhbXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5X3N0cmluZyA9IE9iamVjdC5lbnRyaWVzKHF1ZXJ5X3BhcmFtcylcbiAgICAgICAgICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfT0ke2VuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSl9YClcbiAgICAgICAgICAgICAgICAuam9pbignJicpO1xuICAgICAgICAgICAgdXJsICs9ICc/JyArIHF1ZXJ5X3N0cmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWw6IENhbGwgYSBzcGVjaWZpYyBtZXRob2Qgb24gYWxsIGNsYXNzZXMgdGhhdCBoYXZlIGl0XG4gICAgICogQ29sbGVjdHMgcHJvbWlzZXMgZnJvbSByZXR1cm4gdmFsdWVzIGFuZCB3YWl0cyBmb3IgYWxsIHRvIHJlc29sdmVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kX25hbWUgVGhlIG1ldGhvZCBuYW1lIHRvIGNhbGwgb24gYWxsIGNsYXNzZXNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG1ldGhvZCBjYWxscyBjb21wbGV0ZVxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBfcnN4X2NhbGxfYWxsX2NsYXNzZXMobWV0aG9kX25hbWUpIHtcbiAgICAgICAgY29uc3QgYWxsX2NsYXNzZXMgPSBNYW5pZmVzdC5nZXRfYWxsX2NsYXNzZXMoKTtcbiAgICAgICAgY29uc3QgY2xhc3Nlc193aXRoX21ldGhvZCA9IFtdO1xuICAgICAgICBjb25zdCBwcm9taXNlX3BpbGUgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGNsYXNzX2luZm8gb2YgYWxsX2NsYXNzZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzX29iamVjdCA9IGNsYXNzX2luZm8uY2xhc3Nfb2JqZWN0O1xuICAgICAgICAgICAgY29uc3QgY2xhc3NfbmFtZSA9IGNsYXNzX2luZm8uY2xhc3NfbmFtZTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBjbGFzcyBoYXMgdGhlIG1ldGhvZCAoc3RhdGljIG1ldGhvZHMgYXJlIG9uIHRoZSBjbGFzcyBpdHNlbGYpXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNsYXNzX29iamVjdFttZXRob2RfbmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzX3dpdGhfbWV0aG9kLnB1c2goY2xhc3NfbmFtZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuX3ZhbHVlID0gYXdhaXQgY2xhc3Nfb2JqZWN0W21ldGhvZF9uYW1lXSgpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ29sbGVjdCBwcm9taXNlcyBmcm9tIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgICAgIGlmIChyZXR1cm5fdmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb21pc2VfcGlsZS5wdXNoKHJldHVybl92YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJldHVybl92YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHJldHVybl92YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZV9waWxlLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoUnN4Ll9fc3RvcHBlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNsYXNzZXNfd2l0aF9tZXRob2QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc29sZV9kZWJ1ZygnUlNYX0lOSVQnLCBgJHttZXRob2RfbmFtZX06ICR7Y2xhc3Nlc193aXRoX21ldGhvZC5sZW5ndGh9IGNsYXNzZXNgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEF3YWl0IGFsbCBwcm9taXNlcyBiZWZvcmUgcmV0dXJuaW5nXG4gICAgICAgIGlmIChwcm9taXNlX3BpbGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc29sZV9kZWJ1ZygnUlNYX0lOSVQnLCBgJHttZXRob2RfbmFtZX06IEF3YWl0aW5nICR7cHJvbWlzZV9waWxlLmxlbmd0aH0gcHJvbWlzZXNgKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VfcGlsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbDogRXhlY3V0ZSBtdWx0aS1waGFzZSBpbml0aWFsaXphdGlvbiBmb3IgYWxsIHJlZ2lzdGVyZWQgY2xhc3Nlc1xuICAgICAqIFRoaXMgcnVucyB2YXJpb3VzIGluaXRpYWxpemF0aW9uIHBoYXNlcyBpbiBvcmRlciB0byBwcm9wZXJseSBzZXQgdXAgdGhlIGFwcGxpY2F0aW9uXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBpbml0aWFsaXphdGlvbiBwaGFzZXMgY29tcGxldGVcbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgX3JzeF9jb3JlX2Jvb3QoKSB7XG4gICAgICAgIGlmIChSc3guX19ib290ZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JzeC5fcnN4X2NvcmVfYm9vdCBjYWxsZWQgbW9yZSB0aGFuIG9uY2UnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIFJzeC5fX2Jvb3RlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gR2V0IGFsbCByZWdpc3RlcmVkIGNsYXNzZXMgZnJvbSB0aGUgbWFuaWZlc3RcbiAgICAgICAgY29uc3QgYWxsX2NsYXNzZXMgPSBNYW5pZmVzdC5nZXRfYWxsX2NsYXNzZXMoKTtcblxuICAgICAgICBjb25zb2xlX2RlYnVnKCdSU1hfSU5JVCcsIGBTdGFydGluZyBfcnN4X2NvcmVfYm9vdCB3aXRoICR7YWxsX2NsYXNzZXMubGVuZ3RofSBjbGFzc2VzYCk7XG5cbiAgICAgICAgaWYgKCFhbGxfY2xhc3NlcyB8fCBhbGxfY2xhc3Nlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIE5vIGNsYXNzZXMgdG8gaW5pdGlhbGl6ZVxuICAgICAgICAgICAgc2hvdWxkbnRfaGFwcGVuKCdObyBjbGFzc2VzIHJlZ2lzdGVyZWQgaW4ganMgLSB0aGVyZSBzaG91bGQgYmUgYXQgbGVhc3QgdGhlIGNvcmUgZnJhbWV3b3JrIGNsYXNzZXMnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmluZSBpbml0aWFsaXphdGlvbiBwaGFzZXMgaW4gb3JkZXJcbiAgICAgICAgY29uc3QgcGhhc2VzID0gW1xuICAgICAgICAgICAgeyBldmVudDogJ2ZyYW1ld29ya19jb3JlX2RlZmluZScsIG1ldGhvZDogJ19vbl9mcmFtZXdvcmtfY29yZV9kZWZpbmUnIH0sXG4gICAgICAgICAgICB7IGV2ZW50OiAnZnJhbWV3b3JrX21vZHVsZXNfZGVmaW5lJywgbWV0aG9kOiAnX29uX2ZyYW1ld29ya19tb2R1bGVzX2RlZmluZScgfSxcbiAgICAgICAgICAgIHsgZXZlbnQ6ICdmcmFtZXdvcmtfY29yZV9pbml0JywgbWV0aG9kOiAnX29uX2ZyYW1ld29ya19jb3JlX2luaXQnIH0sXG4gICAgICAgICAgICB7IGV2ZW50OiAnYXBwX21vZHVsZXNfZGVmaW5lJywgbWV0aG9kOiAnb25fYXBwX21vZHVsZXNfZGVmaW5lJyB9LFxuICAgICAgICAgICAgeyBldmVudDogJ2FwcF9kZWZpbmUnLCBtZXRob2Q6ICdvbl9hcHBfZGVmaW5lJyB9LFxuICAgICAgICAgICAgeyBldmVudDogJ2ZyYW1ld29ya19tb2R1bGVzX2luaXQnLCBtZXRob2Q6ICdfb25fZnJhbWV3b3JrX21vZHVsZXNfaW5pdCcgfSxcbiAgICAgICAgICAgIHsgZXZlbnQ6ICdhcHBfbW9kdWxlc19pbml0JywgbWV0aG9kOiAnb25fYXBwX21vZHVsZXNfaW5pdCcgfSxcbiAgICAgICAgICAgIHsgZXZlbnQ6ICdhcHBfaW5pdCcsIG1ldGhvZDogJ29uX2FwcF9pbml0JyB9LFxuICAgICAgICAgICAgeyBldmVudDogJ2FwcF9yZWFkeScsIG1ldGhvZDogJ29uX2FwcF9yZWFkeScgfSxcbiAgICAgICAgXTtcblxuICAgICAgICAvLyBFeGVjdXRlIGVhY2ggcGhhc2UgaW4gb3JkZXJcbiAgICAgICAgZm9yIChjb25zdCBwaGFzZSBvZiBwaGFzZXMpIHtcbiAgICAgICAgICAgIGF3YWl0IFJzeC5fcnN4X2NhbGxfYWxsX2NsYXNzZXMocGhhc2UubWV0aG9kKTtcblxuICAgICAgICAgICAgaWYgKFJzeC5fX3N0b3BwZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFJzeC50cmlnZ2VyKHBoYXNlLmV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVpIHJlZnJlc2ggY2FsbGJhY2tzXG4gICAgICAgIFJzeC50cmlnZ2VyX3JlZnJlc2goKTtcblxuICAgICAgICAvLyBBbGwgcGhhc2VzIGNvbXBsZXRlXG4gICAgICAgIGNvbnNvbGVfZGVidWcoJ1JTWF9JTklUJywgJ0luaXRpYWxpemF0aW9uIGNvbXBsZXRlJyk7XG5cbiAgICAgICAgLy8gVE9ETzogRmluZCBhIGdvb2Qgd2FpdCB0byB3YWl0IGZvciBhbGwganFodG1sIGNvbXBvbmVudHMgdG8gbG9hZCwgdGhlbiB0cmlnZ2VyIG9uX3JlYWR5IGFuZCBvbigncmVhZHknKSBlbXVsYXRpbmcgdGhlIHRvcCBsZXZlbCBsYXN0IHN5bnRheCB0aGF0IGpxaHRtbCBjb21wb25lbnRzIG9wZXJhdGVhcywgYnV0IGFzIGEgc3RhbmRhcmQganMgY2xhc3MgKHN1Y2ggYXMgYSBwYWdlIGNsYXNzKS4gIFRoZSBiaWdnZXN0IHF1ZXN0aW9uIGlzLCBob3cgZG8gd2UgZWZmaWNpZW50bHkgY2hvb3NlIG9ubHkgdGhlIHRvcCBsZXZlbCBqcWh0bWwgY29tcG9uZW50cy4gIGRvIHdlIG9ubHkgY29uc2lkZXIgY29tcG9uZW50cyBjcmV0YWVkIGRpcmVjdGx5IG9uIGJsYWRlIHRlbXBsYXRlcz8gdGhhdCBzZWFtcyByZWFzb25hYmxlLi4uXG5cbiAgICAgICAgLy8gVHJpZ2dlciBfZGVidWdfcmVhZHkgZXZlbnQgLSB0aGlzIGlzIE9OTFkgZm9yIHRvb2xpbmcgbGlrZSByc3g6ZGVidWdcbiAgICAgICAgLy8gRE8gTk9UIHVzZSB0aGlzIGluIGFwcGxpY2F0aW9uIGNvZGUgLSB1c2Ugb25fYXBwX3JlYWR5KCkgcGhhc2UgaW5zdGVhZFxuICAgICAgICAvLyBUaGlzIGV2ZW50IGV4aXN0cyBzb2xlbHkgZm9yIGRlYnVnZ2luZyB0b29scyB0aGF0IG5lZWQgdG8gcnVuIGFmdGVyIGZ1bGwgaW5pdGlhbGl6YXRpb25cbiAgICAgICAgUnN4LnRyaWdnZXIoJ19kZWJ1Z19yZWFkeScpO1xuICAgIH1cblxuICAgIC8qIENhbGxpbmcgdGhpcyBzdG9wcyB0aGUgYm9vdCBwcm9jZXNzLiAqL1xuICAgIHN0YXRpYyBhc3luYyBfcnN4X2NvcmVfYm9vdF9zdG9wKHJlYXNvbikge1xuICAgICAgICBjb25zb2xlLmVycm9yKHJlYXNvbik7XG4gICAgICAgIFJzeC5fX3N0b3BwZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlIFVSTCBoYXNoIGludG8ga2V5LXZhbHVlIG9iamVjdFxuICAgICAqIEhhbmRsZXMgZm9ybWF0OiAja2V5PXZhbHVlJmtleTI9dmFsdWUyXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBQYXJzZWQgaGFzaCBwYXJhbWV0ZXJzXG4gICAgICovXG4gICAgc3RhdGljIF9wYXJzZV9oYXNoKCkge1xuICAgICAgICBjb25zdCBoYXNoID0gd2luZG93LmxvY2F0aW9uLmhhc2g7XG4gICAgICAgIGlmICghaGFzaCB8fCBoYXNoID09PSAnIycpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSBsZWFkaW5nICMgYW5kIHBhcnNlIGFzIHF1ZXJ5IHN0cmluZ1xuICAgICAgICBjb25zdCBoYXNoX3N0cmluZyA9IGhhc2guc3Vic3RyaW5nKDEpO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB7fTtcblxuICAgICAgICBjb25zdCBwYWlycyA9IGhhc2hfc3RyaW5nLnNwbGl0KCcmJyk7XG4gICAgICAgIGZvciAoY29uc3QgcGFpciBvZiBwYWlycykge1xuICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gcGFpci5zcGxpdCgnPScpO1xuICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgIHBhcmFtc1tkZWNvZGVVUklDb21wb25lbnQoa2V5KV0gPSB2YWx1ZSA/IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkgOiAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplIG9iamVjdCBpbnRvIFVSTCBoYXNoIGZvcm1hdFxuICAgICAqIFByb2R1Y2VzIGZvcm1hdDogI2tleT12YWx1ZSZrZXkyPXZhbHVlMlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBLZXktdmFsdWUgcGFpcnMgdG8gZW5jb2RlXG4gICAgICogQHJldHVybnMge3N0cmluZ30gRW5jb2RlZCBoYXNoIHN0cmluZyAod2l0aCBsZWFkaW5nICMsIG9yIGVtcHR5IHN0cmluZylcbiAgICAgKi9cbiAgICBzdGF0aWMgX3NlcmlhbGl6ZV9oYXNoKHBhcmFtcykge1xuICAgICAgICBjb25zdCBwYWlycyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwYXJhbXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1zW2tleV07XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBwYWlycy5wdXNoKGAke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfT0ke2VuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFpcnMubGVuZ3RoID4gMCA/ICcjJyArIHBhaXJzLmpvaW4oJyYnKSA6ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgcGFnZSBzdGF0ZSBmcm9tIFVSTCBoYXNoXG4gICAgICpcbiAgICAgKiBVc2FnZTpcbiAgICAgKiBgYGBqYXZhc2NyaXB0XG4gICAgICogY29uc3Qgc3RhdGUgPSBSc3guZ2V0X2FsbF9wYWdlX3N0YXRlKCk7XG4gICAgICogLy8gUmV0dXJuczoge2RnX3BhZ2U6ICcyJywgZGdfc29ydDogJ25hbWUnfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH0gQWxsIGhhc2ggcGFyYW1ldGVycyBhcyBrZXktdmFsdWUgcGFpcnNcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0X2FsbF9wYWdlX3N0YXRlKCkge1xuICAgICAgICByZXR1cm4gUnN4Ll9wYXJzZV9oYXNoKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHNpbmdsZSB2YWx1ZSBmcm9tIFVSTCBoYXNoIHN0YXRlXG4gICAgICpcbiAgICAgKiBVc2FnZTpcbiAgICAgKiBgYGBqYXZhc2NyaXB0XG4gICAgICogY29uc3QgcGFnZSA9IFJzeC5nZXRfcGFnZV9zdGF0ZSgnZGdfcGFnZScpO1xuICAgICAqIC8vIFJldHVybnM6ICcyJyBvciBudWxsIGlmIG5vdCBzZXRcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byByZXRyaWV2ZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH0gVGhlIHZhbHVlIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGdldF9wYWdlX3N0YXRlKGtleSkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IFJzeC5fcGFyc2VfaGFzaCgpO1xuICAgICAgICByZXR1cm4gc3RhdGVba2V5XSA/PyBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBzaW5nbGUgdmFsdWUgaW4gVVJMIGhhc2ggc3RhdGUgKHJlcGxhY2VzIGhpc3RvcnksIGRvZXNuJ3QgYWRkKVxuICAgICAqXG4gICAgICogVXNhZ2U6XG4gICAgICogYGBgamF2YXNjcmlwdFxuICAgICAqIFJzeC5zZXRfcGFnZV9zdGF0ZSgnZGdfcGFnZScsIDIpO1xuICAgICAqIC8vIFVSTCBiZWNvbWVzOiBodHRwOi8vZXhhbXBsZS5jb20vcGFnZSNkZ19wYWdlPTJcbiAgICAgKlxuICAgICAqIFJzeC5zZXRfcGFnZV9zdGF0ZSgnZGdfcGFnZScsIG51bGwpOyAvLyBSZW1vdmUga2V5XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gc2V0XG4gICAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfG51bGx9IHZhbHVlIFRoZSB2YWx1ZSAobnVsbC9lbXB0eSByZW1vdmVzIHRoZSBrZXkpXG4gICAgICovXG4gICAgc3RhdGljIHNldF9wYWdlX3N0YXRlKGtleSwgdmFsdWUpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBSc3guX3BhcnNlX2hhc2goKTtcblxuICAgICAgICAvLyBVcGRhdGUgb3IgcmVtb3ZlIHRoZSBrZXlcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICBkZWxldGUgc3RhdGVba2V5XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlW2tleV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIFVSTCB3aXRob3V0IGFkZGluZyBoaXN0b3J5XG4gICAgICAgIGNvbnN0IG5ld19oYXNoID0gUnN4Ll9zZXJpYWxpemVfaGFzaChzdGF0ZSk7XG4gICAgICAgIGNvbnN0IHVybCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggKyBuZXdfaGFzaDtcbiAgICAgICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgJycsIHVybCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG11bHRpcGxlIHZhbHVlcyBpbiBVUkwgaGFzaCBzdGF0ZSBhdCBvbmNlXG4gICAgICpcbiAgICAgKiBVc2FnZTpcbiAgICAgKiBgYGBqYXZhc2NyaXB0XG4gICAgICogUnN4LnNldF9hbGxfcGFnZV9zdGF0ZSh7ZGdfcGFnZTogMiwgZGdfc29ydDogJ25hbWUnfSk7XG4gICAgICogLy8gVVJMIGJlY29tZXM6IGh0dHA6Ly9leGFtcGxlLmNvbS9wYWdlI2RnX3BhZ2U9MiZkZ19zb3J0PW5hbWVcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuZXdfc3RhdGUgT2JqZWN0IHdpdGgga2V5LXZhbHVlIHBhaXJzIHRvIHNldFxuICAgICAqL1xuICAgIHN0YXRpYyBzZXRfYWxsX3BhZ2Vfc3RhdGUobmV3X3N0YXRlKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gUnN4Ll9wYXJzZV9oYXNoKCk7XG5cbiAgICAgICAgLy8gTWVyZ2UgbmV3IHN0YXRlXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG5ld19zdGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBuZXdfc3RhdGVba2V5XTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBzdGF0ZVtrZXldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdGF0ZVtrZXldID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBVUkwgd2l0aG91dCBhZGRpbmcgaGlzdG9yeVxuICAgICAgICBjb25zdCBuZXdfaGFzaCA9IFJzeC5fc2VyaWFsaXplX2hhc2goc3RhdGUpO1xuICAgICAgICBjb25zdCB1cmwgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoICsgbmV3X2hhc2g7XG4gICAgICAgIGhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsICcnLCB1cmwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlciBhbiBlcnJvciBpbiBhIERPTSBlbGVtZW50XG4gICAgICpcbiAgICAgKiBEaXNwbGF5cyBlcnJvcnMgZnJvbSBBamF4IGNhbGxzIGluIGEgc3RhbmRhcmRpemVkIGZvcm1hdC4gSGFuZGxlcyBkaWZmZXJlbnRcbiAgICAgKiBlcnJvciB0eXBlcyAoZmF0YWwsIHZhbGlkYXRpb24sIGF1dGgsIGdlbmVyaWMpIHdpdGggYXBwcm9wcmlhdGUgZm9ybWF0dGluZy5cbiAgICAgKlxuICAgICAqIFVzYWdlOlxuICAgICAqIGBgYGphdmFzY3JpcHRcbiAgICAgKiB0cnkge1xuICAgICAqICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBDb250cm9sbGVyLm1ldGhvZCgpO1xuICAgICAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICogICAgIFJzeC5yZW5kZXJfZXJyb3IoZXJyb3IsICcjZXJyb3JfY29udGFpbmVyJyk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHtFcnJvcnxPYmplY3R9IGVycm9yIC0gRXJyb3Igb2JqZWN0IGZyb20gQWpheCBjYWxsXG4gICAgICogQHBhcmFtIHtqUXVlcnl8c3RyaW5nfSBjb250YWluZXIgLSBqUXVlcnkgZWxlbWVudCBvciBzZWxlY3RvciBmb3IgZXJyb3IgZGlzcGxheVxuICAgICAqL1xuICAgIHN0YXRpYyByZW5kZXJfZXJyb3IoZXJyb3IsIGNvbnRhaW5lcikge1xuICAgICAgICBjb25zdCAkY29udGFpbmVyID0gJChjb250YWluZXIpO1xuXG4gICAgICAgIGlmICghJGNvbnRhaW5lci5leGlzdHMoKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignUnN4LnJlbmRlcl9lcnJvcjogQ29udGFpbmVyIG5vdCBmb3VuZCcsIGNvbnRhaW5lcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBleGlzdGluZyBjb250ZW50XG4gICAgICAgICRjb250YWluZXIuZW1wdHkoKTtcblxuICAgICAgICBsZXQgaHRtbCA9ICcnO1xuXG4gICAgICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgZXJyb3IgdHlwZXNcbiAgICAgICAgaWYgKGVycm9yLnR5cGUgPT09ICdmYXRhbCcgJiYgZXJyb3IuZGV0YWlscykge1xuICAgICAgICAgICAgLy8gRmF0YWwgUEhQIGVycm9yIHdpdGggZmlsZS9saW5lL2Vycm9yXG4gICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gZXJyb3IuZGV0YWlscztcbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBkZXRhaWxzLmZpbGUgfHwgJ1Vua25vd24gZmlsZSc7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gZGV0YWlscy5saW5lIHx8ICc/JztcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBkZXRhaWxzLmVycm9yIHx8IGVycm9yLm1lc3NhZ2UgfHwgJ0ZhdGFsIGVycm9yIG9jY3VycmVkJztcblxuICAgICAgICAgICAgaHRtbCA9IGBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIgcm9sZT1cImFsZXJ0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxoNT5VbmNhdWdodCBGYXRhbCBFcnJvciBpbiAke2ZpbGV9OiR7bGluZX06PC9oNT5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wXCI+JHtSc3guX2VzY2FwZV9odG1sKG1lc3NhZ2UpfTwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIGA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IudHlwZSA9PT0gJ2Zvcm1fZXJyb3InICYmIGVycm9yLmRldGFpbHMpIHtcbiAgICAgICAgICAgIC8vIFZhbGlkYXRpb24gZXJyb3JzIC0gc2hvdyB1bm1hdGNoZWQgZXJyb3JzIG9ubHlcbiAgICAgICAgICAgIC8vIChtYXRjaGVkIGVycm9ycyBzaG91bGQgYmUgaGFuZGxlZCBieSBGb3JtX1V0aWxzLmFwcGx5X2Zvcm1fZXJyb3JzKVxuICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gZXJyb3IuZGV0YWlscztcbiAgICAgICAgICAgIGNvbnN0IGVycm9yX2xpc3QgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZCBpbiBlcnJvcnMpIHtcbiAgICAgICAgICAgICAgICBlcnJvcl9saXN0LnB1c2goZXJyb3JzW2ZpZWxkXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlcnJvcl9saXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBodG1sID0gYFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiIHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGg1PlZhbGlkYXRpb24gRXJyb3JzOjwvaDU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJtYi0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtlcnJvcl9saXN0Lm1hcChlcnIgPT4gYDxsaT4ke1JzeC5fZXNjYXBlX2h0bWwoZXJyKX08L2xpPmApLmpvaW4oJycpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChlcnJvci50eXBlID09PSAnYXV0aF9yZXF1aXJlZCcgfHwgZXJyb3IudHlwZSA9PT0gJ3VuYXV0aG9yaXplZCcpIHtcbiAgICAgICAgICAgIC8vIEF1dGhlbnRpY2F0aW9uL2F1dGhvcml6YXRpb24gZXJyb3JzXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IubWVzc2FnZSB8fCAnQXV0aGVudGljYXRpb24gcmVxdWlyZWQnO1xuICAgICAgICAgICAgaHRtbCA9IGBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiIHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTBcIj4ke1JzeC5fZXNjYXBlX2h0bWwobWVzc2FnZSl9PC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYDtcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvci50eXBlID09PSAnbmV0d29yaycpIHtcbiAgICAgICAgICAgIC8vIE5ldHdvcmsgZXJyb3JzXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IubWVzc2FnZSB8fCAnVW5hYmxlIHRvIHJlYWNoIHNlcnZlci4gUGxlYXNlIGNoZWNrIHlvdXIgY29ubmVjdGlvbi4nO1xuICAgICAgICAgICAgaHRtbCA9IGBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIgcm9sZT1cImFsZXJ0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMFwiPiR7UnN4Ll9lc2NhcGVfaHRtbChtZXNzYWdlKX08L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gR2VuZXJpYy91bmtub3duIGVycm9yXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IubWVzc2FnZSB8fCBlcnJvci50b1N0cmluZygpIHx8ICdBbiB1bmtub3duIGVycm9yIG9jY3VycmVkJztcbiAgICAgICAgICAgIGh0bWwgPSBgXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlclwiIHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTBcIj4ke1JzeC5fZXNjYXBlX2h0bWwobWVzc2FnZSl9PC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYDtcbiAgICAgICAgfVxuXG4gICAgICAgICRjb250YWluZXIuaHRtbChodG1sKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc2NhcGUgSFRNTCB0byBwcmV2ZW50IFhTUyBpbiBlcnJvciBtZXNzYWdlc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc3RhdGljIF9lc2NhcGVfaHRtbCh0ZXh0KSB7XG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBkaXYudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgICAgICByZXR1cm4gZGl2LmlubmVySFRNTDtcbiAgICB9XG59XG4iLCIvLyBARklMRS1TVUJDTEFTUy0wMS1FWENFUFRJT05cblxuLyoqXG4gKiBDbGllbnQtc2lkZSBBamF4IGNsYXNzIGZvciBtYWtpbmcgQVBJIGNhbGxzIHRvIFJTWCBjb250cm9sbGVyc1xuICpcbiAqIEF1dG9tYXRpY2FsbHkgYmF0Y2hlcyBtdWx0aXBsZSBjYWxscyBpbnRvIHNpbmdsZSBIVFRQIHJlcXVlc3RzIHRvIHJlZHVjZSBuZXR3b3JrIG92ZXJoZWFkLlxuICogQmF0Y2hlcyB1cCB0byAyMCBjYWxscyBvciBmbHVzaGVzIGFmdGVyIHNldFRpbWVvdXQoMCkgZGVib3VuY2UuXG4gKi9cbmNsYXNzIEFqYXgge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgQWpheCBzeXN0ZW1cbiAgICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIGNsYXNzIGlzIGxvYWRlZFxuICAgICAqL1xuICAgIHN0YXRpYyBfb25fZnJhbWV3b3JrX2NvcmVfaW5pdCgpIHtcbiAgICAgICAgLy8gUXVldWUgb2YgcGVuZGluZyBjYWxscyB3YWl0aW5nIHRvIGJlIGJhdGNoZWRcbiAgICAgICAgQWpheC5fcGVuZGluZ19jYWxscyA9IHt9O1xuXG4gICAgICAgIC8vIFRpbWVyIGZvciBiYXRjaGluZyBmbHVzaFxuICAgICAgICBBamF4Ll9mbHVzaF90aW1lb3V0ID0gbnVsbDtcblxuICAgICAgICAvLyBDYWxsIGNvdW50ZXIgZm9yIGdlbmVyYXRpbmcgdW5pcXVlIGNhbGwgSURzXG4gICAgICAgIEFqYXguX2NhbGxfY291bnRlciA9IDA7XG5cbiAgICAgICAgLy8gTWF4aW11bSBiYXRjaCBzaXplIGJlZm9yZSBmb3JjaW5nIGltbWVkaWF0ZSBmbHVzaFxuICAgICAgICBBamF4Lk1BWF9CQVRDSF9TSVpFID0gMjA7XG5cbiAgICAgICAgLy8gRGVib3VuY2UgdGltZSBpbiBtaWxsaXNlY29uZHNcbiAgICAgICAgQWpheC5ERUJPVU5DRV9NUyA9IDA7XG5cbiAgICAgICAgLy8gVHJhY2sgcHJvbWlzZXMgZnJvbSBBamF4IGNhbGxzIHRvIGRldGVjdCB1bmNhdWdodCByZWplY3Rpb25zXG4gICAgICAgIEFqYXguX3RyYWNrZWRfcHJvbWlzZXMgPSBuZXcgV2Vha1NldCgpO1xuXG4gICAgICAgIC8vIFNldCB1cCBnbG9iYWwgdW5oYW5kbGVkIHJlamVjdGlvbiBoYW5kbGVyIGZvciBBamF4IGVycm9yc1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndW5oYW5kbGVkcmVqZWN0aW9uJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBPbmx5IGhhbmRsZSByZWplY3Rpb25zIGZyb20gQWpheCBwcm9taXNlc1xuICAgICAgICAgICAgaWYgKEFqYXguX3RyYWNrZWRfcHJvbWlzZXMuaGFzKGV2ZW50LnByb21pc2UpKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gUHJldmVudCBicm93c2VyJ3MgZGVmYXVsdCBcIlVuY2F1Z2h0IChpbiBwcm9taXNlKVwiIGVycm9yXG5cbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGV2ZW50LnJlYXNvbjtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmNhdWdodCBBamF4IGVycm9yOicsIGVycm9yKTtcblxuICAgICAgICAgICAgICAgIC8vIFNob3cgTW9kYWwuZXJyb3IoKSBmb3IgdW5jYXVnaHQgQWpheCBlcnJvcnNcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZGFsICE9PSAndW5kZWZpbmVkJyAmJiBNb2RhbC5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBNb2RhbC5lcnJvcihlcnJvciwgJ1VuY2F1Z2h0IEFqYXggRXJyb3InKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1ha2UgYW4gQUpBWCBjYWxsIHRvIGFuIFJTWCBjb250cm9sbGVyIGFjdGlvblxuICAgICAqXG4gICAgICogQWxsIGNhbGxzIGFyZSBhdXRvbWF0aWNhbGx5IGJhdGNoZWQgdW5sZXNzIHdpbmRvdy5yc3hhcHAuYWpheF9kaXNhYmxlX2JhdGNoaW5nIGlzIHRydWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R8ZnVuY3Rpb259IHVybCAtIFRoZSBBamF4IFVSTCAoZS5nLiwgJy9fYWpheC9Db250cm9sbGVyX05hbWUvYWN0aW9uX25hbWUnKSBvciBhbiBvYmplY3QvZnVuY3Rpb24gd2l0aCBhIC5wYXRoIHByb3BlcnR5XG4gICAgICogQHBhcmFtIHtvYmplY3R9IHBhcmFtcyAtIFBhcmFtZXRlcnMgdG8gc2VuZCB0byB0aGUgYWN0aW9uXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IC0gUmVzb2x2ZXMgd2l0aCB0aGUgcmV0dXJuIHZhbHVlLCByZWplY3RzIHdpdGggZXJyb3JcbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgY2FsbCh1cmwsIHBhcmFtcyA9IHt9KSB7XG4gICAgICAgIC8vIElmIHVybCBpcyBhbiBvYmplY3Qgb3IgZnVuY3Rpb24gd2l0aCBhIC5wYXRoIHByb3BlcnR5LCB1c2UgdGhhdCBhcyB0aGUgVVJMXG4gICAgICAgIGlmICh1cmwgJiYgdHlwZW9mIHVybCA9PT0gJ29iamVjdCcgJiYgdXJsLnBhdGgpIHtcbiAgICAgICAgICAgIHVybCA9IHVybC5wYXRoO1xuICAgICAgICB9IGVsc2UgaWYgKHVybCAmJiB0eXBlb2YgdXJsID09PSAnZnVuY3Rpb24nICYmIHVybC5wYXRoKSB7XG4gICAgICAgICAgICB1cmwgPSB1cmwucGF0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIHVybCBpcyBhIG5vbi1lbXB0eSBzdHJpbmdcbiAgICAgICAgaWYgKHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnIHx8IHVybC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWpheC5jYWxsKCkgcmVxdWlyZXMgYSBub24tZW1wdHkgc3RyaW5nIFVSTCBvciBhbiBvYmplY3QvZnVuY3Rpb24gd2l0aCBhIC5wYXRoIHByb3BlcnR5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeHRyYWN0IGNvbnRyb2xsZXIgYW5kIGFjdGlvbiBmcm9tIFVSTFxuICAgICAgICBjb25zdCB7IGNvbnRyb2xsZXIsIGFjdGlvbiB9ID0gQWpheC5hamF4X3VybF90b19jb250cm9sbGVyX2FjdGlvbih1cmwpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdBamF4OicsIGNvbnRyb2xsZXIsIGFjdGlvbiwgcGFyYW1zKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBiYXRjaGluZyBpcyBkaXNhYmxlZCBmb3IgZGVidWdnaW5nXG4gICAgICAgIGxldCBwcm9taXNlO1xuICAgICAgICBpZiAod2luZG93LnJzeGFwcCAmJiB3aW5kb3cucnN4YXBwLmFqYXhfZGlzYWJsZV9iYXRjaGluZykge1xuICAgICAgICAgICAgcHJvbWlzZSA9IEFqYXguX2NhbGxfZGlyZWN0KGNvbnRyb2xsZXIsIGFjdGlvbiwgcGFyYW1zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByb21pc2UgPSBBamF4Ll9jYWxsX2JhdGNoKGNvbnRyb2xsZXIsIGFjdGlvbiwgcGFyYW1zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYWNrIHRoaXMgcHJvbWlzZSBmb3IgdW5oYW5kbGVkIHJlamVjdGlvbiBkZXRlY3Rpb25cbiAgICAgICAgQWpheC5fdHJhY2tlZF9wcm9taXNlcy5hZGQocHJvbWlzZSk7XG5cbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZSBhIGJhdGNoZWQgQWpheCBjYWxsXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzdGF0aWMgX2NhbGxfYmF0Y2goY29udHJvbGxlciwgYWN0aW9uLCBwYXJhbXMgPSB7fSkge1xuICAgICAgICBjb25zb2xlLmxvZygnQWpheCBCYXRjaDonLCBjb250cm9sbGVyLCBhY3Rpb24sIHBhcmFtcyk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8vIEdlbmVyYXRlIGNhbGwga2V5IGZvciBkZWR1cGxpY2F0aW9uXG4gICAgICAgICAgICBjb25zdCBjYWxsX2tleSA9IEFqYXguX2dlbmVyYXRlX2NhbGxfa2V5KGNvbnRyb2xsZXIsIGFjdGlvbiwgcGFyYW1zKTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBleGFjdCBjYWxsIGlzIGFscmVhZHkgcGVuZGluZ1xuICAgICAgICAgICAgaWYgKEFqYXguX3BlbmRpbmdfY2FsbHNbY2FsbF9rZXldKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdfY2FsbCA9IEFqYXguX3BlbmRpbmdfY2FsbHNbY2FsbF9rZXldO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgY2FsbCBhbHJlYWR5IGNvbXBsZXRlZCAoY2FjaGVkKSwgcmV0dXJuIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nX2NhbGwuaXNfY29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nX2NhbGwuaXNfZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChleGlzdGluZ19jYWxsLmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZXhpc3RpbmdfY2FsbC5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDYWxsIGlzIHBlbmRpbmcsIGFkZCB0aGlzIHByb21pc2UgdG8gY2FsbGJhY2tzXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdfY2FsbC5jYWxsYmFja3MucHVzaCh7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgcGVuZGluZyBjYWxsXG4gICAgICAgICAgICBjb25zdCBjYWxsX2lkID0gQWpheC5fY2FsbF9jb3VudGVyKys7XG4gICAgICAgICAgICBjb25zdCBwZW5kaW5nX2NhbGwgPSB7XG4gICAgICAgICAgICAgICAgY2FsbF9pZDogY2FsbF9pZCxcbiAgICAgICAgICAgICAgICBjYWxsX2tleTogY2FsbF9rZXksXG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICBhY3Rpb246IGFjdGlvbixcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICAgICAgICBjYWxsYmFja3M6IFt7IHJlc29sdmUsIHJlamVjdCB9XSxcbiAgICAgICAgICAgICAgICBpc19jb21wbGV0ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNfZXJyb3I6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogbnVsbCxcbiAgICAgICAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIEFkZCB0byBwZW5kaW5nIHF1ZXVlXG4gICAgICAgICAgICBBamF4Ll9wZW5kaW5nX2NhbGxzW2NhbGxfa2V5XSA9IHBlbmRpbmdfY2FsbDtcblxuICAgICAgICAgICAgLy8gQ291bnQgcGVuZGluZyBjYWxsc1xuICAgICAgICAgICAgY29uc3QgcGVuZGluZ19jb3VudCA9IE9iamVjdC5rZXlzKEFqYXguX3BlbmRpbmdfY2FsbHMpLmZpbHRlcigoa2V5KSA9PiAhQWpheC5fcGVuZGluZ19jYWxsc1trZXldLmlzX2NvbXBsZXRlKS5sZW5ndGg7XG5cbiAgICAgICAgICAgIC8vIElmIHdlJ3ZlIGhpdCB0aGUgYmF0Y2ggc2l6ZSBsaW1pdCwgZmx1c2ggaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIGlmIChwZW5kaW5nX2NvdW50ID49IEFqYXguTUFYX0JBVENIX1NJWkUpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoQWpheC5fZmx1c2hfdGltZW91dCk7XG4gICAgICAgICAgICAgICAgQWpheC5fZmx1c2hfdGltZW91dCA9IG51bGw7XG4gICAgICAgICAgICAgICAgQWpheC5fZmx1c2hfcGVuZGluZ19jYWxscygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBTY2hlZHVsZSBiYXRjaCBmbHVzaCB3aXRoIGRlYm91bmNlXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KEFqYXguX2ZsdXNoX3RpbWVvdXQpO1xuICAgICAgICAgICAgICAgIEFqYXguX2ZsdXNoX3RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgQWpheC5fZmx1c2hfcGVuZGluZ19jYWxscygpO1xuICAgICAgICAgICAgICAgIH0sIEFqYXguREVCT1VOQ0VfTVMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYWtlIGEgZGlyZWN0IChub24tYmF0Y2hlZCkgQWpheCBjYWxsXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgX2NhbGxfZGlyZWN0KGNvbnRyb2xsZXIsIGFjdGlvbiwgcGFyYW1zID0ge30pIHtcbiAgICAgICAgLy8gQ29uc3RydWN0IFVSTCBmcm9tIGNvbnRyb2xsZXIgYW5kIGFjdGlvblxuICAgICAgICBjb25zdCB1cmwgPSBgL19hamF4LyR7Y29udHJvbGxlcn0vJHthY3Rpb259YDtcblxuICAgICAgICAvLyBMb2cgdGhlIEFKQVggY2FsbCB1c2luZyBjb25zb2xlX2RlYnVnXG4gICAgICAgIGlmICh0eXBlb2YgRGVidWdnZXIgIT09ICd1bmRlZmluZWQnICYmIERlYnVnZ2VyLmNvbnNvbGVfZGVidWcpIHtcbiAgICAgICAgICAgIERlYnVnZ2VyLmNvbnNvbGVfZGVidWcoJ0FKQVgnLCBgQ2FsbGluZyAke2NvbnRyb2xsZXJ9LiR7YWN0aW9ufSAodW5iYXRjaGVkKWAsIHBhcmFtcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBkYXRhOiBwYXJhbXMsXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgICAgICBfX2xvY2FsX2ludGVncmF0aW9uOiB0cnVlLCAvLyBCeXBhc3MgJC5hamF4IG92ZXJyaWRlXG4gICAgICAgICAgICAgICAgc3VjY2VzczogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBjb25zb2xlX2RlYnVnIG1lc3NhZ2VzXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5jb25zb2xlX2RlYnVnICYmIEFycmF5LmlzQXJyYXkocmVzcG9uc2UuY29uc29sZV9kZWJ1ZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmNvbnNvbGVfZGVidWcuZm9yRWFjaCgobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG1zZykgfHwgbXNnLmxlbmd0aCAhPT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29uc29sZV9kZWJ1ZyBtZXNzYWdlIGZvcm1hdCAtIGV4cGVjdGVkIFtjaGFubmVsLCBbYXJndW1lbnRzXV0nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW2NoYW5uZWwsIGFyZ3NdID0gbXNnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5uZWwsIC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcmVzcG9uc2Ugd2FzIHN1Y2Nlc3NmdWxcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLl9zdWNjZXNzID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBASlMtQUpBWC0wMi1FWENFUFRJT04gLSBVbndyYXAgc2VydmVyIHJlc3BvbnNlcyB3aXRoIF9hamF4X3JldHVybl92YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc2VkX3ZhbHVlID0gUnN4X0pzX01vZGVsLl9pbnN0YW50aWF0ZV9tb2RlbHNfcmVjdXJzaXZlKHJlc3BvbnNlLl9hamF4X3JldHVybl92YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHByb2Nlc3NlZF92YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgZXJyb3IgcmVzcG9uc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvcl90eXBlID0gcmVzcG9uc2UuZXJyb3JfdHlwZSB8fCAndW5rbm93bl9lcnJvcic7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFzb24gPSByZXNwb25zZS5yZWFzb24gfHwgJ1Vua25vd24gZXJyb3Igb2NjdXJyZWQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV0YWlscyA9IHJlc3BvbnNlLmRldGFpbHMgfHwge307XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBzcGVjaWZpYyBlcnJvciB0eXBlc1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlcnJvcl90eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZmF0YWwnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYXRhbCBQSFAgZXJyb3Igd2l0aCBmdWxsIGVycm9yIGRldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmF0YWxfZXJyb3JfZGF0YSA9IHJlc3BvbnNlLmVycm9yIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvcl9tZXNzYWdlID0gZmF0YWxfZXJyb3JfZGF0YS5lcnJvciB8fCAnRmF0YWwgZXJyb3Igb2NjdXJyZWQnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FqYXggZXJyb3IgcmVzcG9uc2UgZnJvbSBzZXJ2ZXI6JywgcmVzcG9uc2UuZXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZhdGFsX2Vycm9yID0gbmV3IEVycm9yKGVycm9yX21lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXRhbF9lcnJvci50eXBlID0gJ2ZhdGFsJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF0YWxfZXJyb3IuZGV0YWlscyA9IHJlc3BvbnNlLmVycm9yO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvZyB0byBzZXJ2ZXIgaWYgYnJvd3NlciBlcnJvciBsb2dnaW5nIGlzIGVuYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdnZXIubG9nX2Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBBamF4IEZhdGFsIEVycm9yOiAke2Vycm9yX21lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhamF4X2ZhdGFsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50OiB1cmwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiByZXNwb25zZS5lcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGZhdGFsX2Vycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyZXNwb25zZV9hdXRoX3JlcXVpcmVkJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgdXNlciBpcyBubyBsb25nZXIgYXV0aGVudGljYXRlZCwgdGhpcyBpcyBhIHBsYWNlaG9sZGVyIGZvciBmdXR1cmUgY29kZSB3aGljaCBoYW5kbGVzIHRoaXMgc2NlbmFyaW8uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRoX2Vycm9yID0gbmV3IEVycm9yKHJlYXNvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhfZXJyb3IudHlwZSA9ICdhdXRoX3JlcXVpcmVkJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9lcnJvci5kZXRhaWxzID0gZGV0YWlscztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGF1dGhfZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Jlc3BvbnNlX3VuYXV0aG9yaXplZCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhlIHVzZXIgaXMgdW5hdXRob3JpemVkIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb24sIHRoaXMgaXMgYSBwbGFjZWhvbGRlciBmb3IgZnV0dXJlIGNvZGUgd2hpY2ggaGFuZGxlcyB0aGlzIHNjZW5hcmlvLidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5hdXRoX2Vycm9yID0gbmV3IEVycm9yKHJlYXNvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuYXV0aF9lcnJvci50eXBlID0gJ3VuYXV0aG9yaXplZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuYXV0aF9lcnJvci5kZXRhaWxzID0gZGV0YWlscztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHVuYXV0aF9lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncmVzcG9uc2VfZm9ybV9lcnJvcic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1fZXJyb3IgPSBuZXcgRXJyb3IocmVhc29uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybV9lcnJvci50eXBlID0gJ2Zvcm1fZXJyb3InO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtX2Vycm9yLmRldGFpbHMgPSBkZXRhaWxzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZm9ybV9lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2VuZXJpY19lcnJvciA9IG5ldyBFcnJvcihyZWFzb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljX2Vycm9yLnR5cGUgPSBlcnJvcl90eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljX2Vycm9yLmRldGFpbHMgPSBkZXRhaWxzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZ2VuZXJpY19lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogKHhociwgc3RhdHVzLCBlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvcl9tZXNzYWdlID0gQWpheC5fZXh0cmFjdF9lcnJvcl9tZXNzYWdlKHhocik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtfZXJyb3IgPSBuZXcgRXJyb3IoZXJyb3JfbWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIG5ldHdvcmtfZXJyb3IudHlwZSA9ICduZXR3b3JrX2Vycm9yJztcbiAgICAgICAgICAgICAgICAgICAgbmV0d29ya19lcnJvci5zdGF0dXMgPSB4aHIuc3RhdHVzO1xuICAgICAgICAgICAgICAgICAgICBuZXR3b3JrX2Vycm9yLnN0YXR1c1RleHQgPSBzdGF0dXM7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTG9nIHNlcnZlciBlcnJvcnMgKDUwMCspIHRvIHRoZSBzZXJ2ZXIgaWYgYnJvd3NlciBlcnJvciBsb2dnaW5nIGlzIGVuYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPj0gNTAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z2dlci5sb2dfZXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBBamF4IFNlcnZlciBFcnJvciAke3hoci5zdGF0dXN9OiAke2Vycm9yX21lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYWpheF9zZXJ2ZXJfZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50OiB1cmwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiB4aHIuc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldHdvcmtfZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmx1c2ggYWxsIHBlbmRpbmcgY2FsbHMgYnkgc2VuZGluZyBiYXRjaCByZXF1ZXN0XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgX2ZsdXNoX3BlbmRpbmdfY2FsbHMoKSB7XG4gICAgICAgIC8vIENvbGxlY3QgYWxsIHBlbmRpbmcgY2FsbHNcbiAgICAgICAgY29uc3QgY2FsbHNfdG9fc2VuZCA9IFtdO1xuICAgICAgICBjb25zdCBjYWxsX21hcCA9IHt9OyAvLyBNYXAgY2FsbF9pZCB0byBwZW5kaW5nX2NhbGwgb2JqZWN0XG5cbiAgICAgICAgZm9yIChjb25zdCBjYWxsX2tleSBpbiBBamF4Ll9wZW5kaW5nX2NhbGxzKSB7XG4gICAgICAgICAgICBjb25zdCBwZW5kaW5nX2NhbGwgPSBBamF4Ll9wZW5kaW5nX2NhbGxzW2NhbGxfa2V5XTtcblxuICAgICAgICAgICAgaWYgKCFwZW5kaW5nX2NhbGwuaXNfY29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICBjYWxsc190b19zZW5kLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBjYWxsX2lkOiBwZW5kaW5nX2NhbGwuY2FsbF9pZCxcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcjogcGVuZGluZ19jYWxsLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogcGVuZGluZ19jYWxsLmFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBwZW5kaW5nX2NhbGwucGFyYW1zLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgY2FsbF9tYXBbcGVuZGluZ19jYWxsLmNhbGxfaWRdID0gcGVuZGluZ19jYWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90aGluZyB0byBzZW5kXG4gICAgICAgIGlmIChjYWxsc190b19zZW5kLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9nIGJhdGNoIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgaWYgKHR5cGVvZiBEZWJ1Z2dlciAhPT0gJ3VuZGVmaW5lZCcgJiYgRGVidWdnZXIuY29uc29sZV9kZWJ1Zykge1xuICAgICAgICAgICAgRGVidWdnZXIuY29uc29sZV9kZWJ1ZyhcbiAgICAgICAgICAgICAgICAnQUpBWF9CQVRDSCcsXG4gICAgICAgICAgICAgICAgYFNlbmRpbmcgYmF0Y2ggb2YgJHtjYWxsc190b19zZW5kLmxlbmd0aH0gY2FsbHNgLFxuICAgICAgICAgICAgICAgIGNhbGxzX3RvX3NlbmQubWFwKChjKSA9PiBgJHtjLmNvbnRyb2xsZXJ9LiR7Yy5hY3Rpb259YClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gU2VuZCBiYXRjaCByZXF1ZXN0XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0ICQuYWpheCh7XG4gICAgICAgICAgICAgICAgdXJsOiAnL19hamF4L19iYXRjaCcsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgZGF0YTogeyBiYXRjaF9jYWxsczogSlNPTi5zdHJpbmdpZnkoY2FsbHNfdG9fc2VuZCkgfSxcbiAgICAgICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgICAgICAgICAgIF9fbG9jYWxfaW50ZWdyYXRpb246IHRydWUsIC8vIEJ5cGFzcyAkLmFqYXggb3ZlcnJpZGVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBQcm9jZXNzIGJhdGNoIHJlc3BvbnNlXG4gICAgICAgICAgICAvLyBSZXNwb25zZSBmb3JtYXQ6IHsgQ18wOiB7c3VjY2VzcywgX2FqYXhfcmV0dXJuX3ZhbHVlfSwgQ18xOiB7Li4ufSwgLi4uIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Vfa2V5IGluIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZV9rZXkuc3RhcnRzV2l0aCgnQ18nKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjYWxsX2lkID0gcGFyc2VJbnQocmVzcG9uc2Vfa2V5LnN1YnN0cmluZygyKSwgMTApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxfcmVzcG9uc2UgPSByZXNwb25zZVtyZXNwb25zZV9rZXldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdfY2FsbCA9IGNhbGxfbWFwW2NhbGxfaWRdO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFwZW5kaW5nX2NhbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignUmVjZWl2ZWQgcmVzcG9uc2UgZm9yIHVua25vd24gY2FsbF9pZDonLCBjYWxsX2lkKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIGNvbnNvbGVfZGVidWcgbWVzc2FnZXMgaWYgcHJlc2VudFxuICAgICAgICAgICAgICAgIGlmIChjYWxsX3Jlc3BvbnNlLmNvbnNvbGVfZGVidWcgJiYgQXJyYXkuaXNBcnJheShjYWxsX3Jlc3BvbnNlLmNvbnNvbGVfZGVidWcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxfcmVzcG9uc2UuY29uc29sZV9kZWJ1Zy5mb3JFYWNoKChtc2cpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShtc2cpIHx8IG1zZy5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29uc29sZV9kZWJ1ZyBtZXNzYWdlIGZvcm1hdCAtIGV4cGVjdGVkIFtjaGFubmVsLCBbYXJndW1lbnRzXV0nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFtjaGFubmVsLCBhcmdzXSA9IG1zZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5uZWwsIC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBNYXJrIGNhbGwgYXMgY29tcGxldGVcbiAgICAgICAgICAgICAgICBwZW5kaW5nX2NhbGwuaXNfY29tcGxldGUgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgc3VjY2Vzc2Z1bFxuICAgICAgICAgICAgICAgIGlmIChjYWxsX3Jlc3BvbnNlLl9zdWNjZXNzID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEBKUy1BSkFYLTAyLUVYQ0VQVElPTiAtIEJhdGNoIHN5c3RlbSB1bndyYXBzIHNlcnZlciByZXNwb25zZXMgd2l0aCBfYWpheF9yZXR1cm5fdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc2VkX3ZhbHVlID0gUnN4X0pzX01vZGVsLl9pbnN0YW50aWF0ZV9tb2RlbHNfcmVjdXJzaXZlKGNhbGxfcmVzcG9uc2UuX2FqYXhfcmV0dXJuX3ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19jYWxsLnJlc3VsdCA9IHByb2Nlc3NlZF92YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBSZXNvbHZlIGFsbCBjYWxsYmFja3NcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19jYWxsLmNhbGxiYWNrcy5mb3JFYWNoKCh7IHJlc29sdmUgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShwcm9jZXNzZWRfdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JfdHlwZSA9IGNhbGxfcmVzcG9uc2UuZXJyb3JfdHlwZSB8fCAndW5rbm93bl9lcnJvcic7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlcnJvcl9tZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JfZGV0YWlscztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JfdHlwZSA9PT0gJ2ZhdGFsJyAmJiBjYWxsX3Jlc3BvbnNlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGYXRhbCBQSFAgZXJyb3Igd2l0aCBmdWxsIGVycm9yIGRldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZhdGFsX2Vycm9yX2RhdGEgPSBjYWxsX3Jlc3BvbnNlLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9IGZhdGFsX2Vycm9yX2RhdGEuZXJyb3IgfHwgJ0ZhdGFsIGVycm9yIG9jY3VycmVkJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2RldGFpbHMgPSBjYWxsX3Jlc3BvbnNlLmVycm9yO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdBamF4IGVycm9yIHJlc3BvbnNlIGZyb20gc2VydmVyOicsIGNhbGxfcmVzcG9uc2UuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXIgZXJyb3IgdHlwZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSBjYWxsX3Jlc3BvbnNlLnJlYXNvbiB8fCAnVW5rbm93biBlcnJvciBvY2N1cnJlZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9kZXRhaWxzID0gY2FsbF9yZXNwb25zZS5kZXRhaWxzIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoZXJyb3JfbWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLnR5cGUgPSBlcnJvcl90eXBlO1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5kZXRhaWxzID0gZXJyb3JfZGV0YWlscztcblxuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2NhbGwuaXNfZXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2NhbGwuZXJyb3IgPSBlcnJvcjtcblxuICAgICAgICAgICAgICAgICAgICAvLyBSZWplY3QgYWxsIGNhbGxiYWNrc1xuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX2NhbGwuY2FsbGJhY2tzLmZvckVhY2goKHsgcmVqZWN0IH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoeGhyX2Vycm9yKSB7XG4gICAgICAgICAgICAvLyBOZXR3b3JrIG9yIHNlcnZlciBlcnJvciAtIHJlamVjdCBhbGwgcGVuZGluZyBjYWxsc1xuICAgICAgICAgICAgY29uc3QgZXJyb3JfbWVzc2FnZSA9IEFqYXguX2V4dHJhY3RfZXJyb3JfbWVzc2FnZSh4aHJfZXJyb3IpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoZXJyb3JfbWVzc2FnZSk7XG4gICAgICAgICAgICBlcnJvci50eXBlID0gJ25ldHdvcmtfZXJyb3InO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNhbGxfaWQgaW4gY2FsbF9tYXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwZW5kaW5nX2NhbGwgPSBjYWxsX21hcFtjYWxsX2lkXTtcbiAgICAgICAgICAgICAgICBwZW5kaW5nX2NhbGwuaXNfY29tcGxldGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHBlbmRpbmdfY2FsbC5pc19lcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgcGVuZGluZ19jYWxsLmVycm9yID0gZXJyb3I7XG5cbiAgICAgICAgICAgICAgICBwZW5kaW5nX2NhbGwuY2FsbGJhY2tzLmZvckVhY2goKHsgcmVqZWN0IH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQmF0Y2ggQWpheCByZXF1ZXN0IGZhaWxlZDonLCBlcnJvcl9tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIGEgdW5pcXVlIGtleSBmb3IgZGVkdXBsaWNhdGluZyBjYWxsc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc3RhdGljIF9nZW5lcmF0ZV9jYWxsX2tleShjb250cm9sbGVyLCBhY3Rpb24sIHBhcmFtcykge1xuICAgICAgICAvLyBDcmVhdGUgYSBzdGFibGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjYWxsXG4gICAgICAgIC8vIFNvcnQgcGFyYW1zIGtleXMgZm9yIGNvbnNpc3RlbnQgaGFzaGluZ1xuICAgICAgICBjb25zdCBzb3J0ZWRfcGFyYW1zID0ge307XG4gICAgICAgIE9iamVjdC5rZXlzKHBhcmFtcylcbiAgICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgICAgIC5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICBzb3J0ZWRfcGFyYW1zW2tleV0gPSBwYXJhbXNba2V5XTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBgJHtjb250cm9sbGVyfTo6JHthY3Rpb259Ojoke0pTT04uc3RyaW5naWZ5KHNvcnRlZF9wYXJhbXMpfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdCBlcnJvciBtZXNzYWdlIGZyb20galF1ZXJ5IFhIUiBvYmplY3RcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHN0YXRpYyBfZXh0cmFjdF9lcnJvcl9tZXNzYWdlKHhocikge1xuICAgICAgICBpZiAoeGhyLnJlc3BvbnNlSlNPTiAmJiB4aHIucmVzcG9uc2VKU09OLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiB4aHIucmVzcG9uc2VKU09OLm1lc3NhZ2U7XG4gICAgICAgIH0gZWxzZSBpZiAoeGhyLnJlc3BvbnNlVGV4dCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIE5vdCBKU09OXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7eGhyLnN0YXR1c306ICR7eGhyLnN0YXR1c1RleHQgfHwgJ1Vua25vd24gZXJyb3InfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIGFuIEFKQVggVVJMIGludG8gY29udHJvbGxlciBhbmQgYWN0aW9uXG4gICAgICogU3VwcG9ydHMgYm90aCAvX2FqYXgvIGFuZCAvXy8gVVJMIHByZWZpeGVzXG4gICAgICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fGZ1bmN0aW9ufSB1cmwgLSBVUkwgaW4gZm9ybWF0ICcvX2FqYXgvQ29udHJvbGxlcl9OYW1lL2FjdGlvbl9uYW1lJyBvciAnL18vQ29udHJvbGxlcl9OYW1lL2FjdGlvbl9uYW1lJywgb3IgYW4gb2JqZWN0L2Z1bmN0aW9uIHdpdGggYSAucGF0aCBwcm9wZXJ0eVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE9iamVjdCB3aXRoIHtjb250cm9sbGVyOiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nfVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBVUkwgZG9lc24ndCBzdGFydCB3aXRoIC9fYWpheCBvciAvXyBvciBoYXMgaW52YWxpZCBzdHJ1Y3R1cmVcbiAgICAgKi9cbiAgICBzdGF0aWMgYWpheF91cmxfdG9fY29udHJvbGxlcl9hY3Rpb24odXJsKSB7XG4gICAgICAgIC8vIElmIHVybCBpcyBhbiBvYmplY3Qgb3IgZnVuY3Rpb24gd2l0aCBhIC5wYXRoIHByb3BlcnR5LCB1c2UgdGhhdCBhcyB0aGUgVVJMXG4gICAgICAgIGlmICh1cmwgJiYgdHlwZW9mIHVybCA9PT0gJ29iamVjdCcgJiYgdXJsLnBhdGgpIHtcbiAgICAgICAgICAgIHVybCA9IHVybC5wYXRoO1xuICAgICAgICB9IGVsc2UgaWYgKHVybCAmJiB0eXBlb2YgdXJsID09PSAnZnVuY3Rpb24nICYmIHVybC5wYXRoKSB7XG4gICAgICAgICAgICB1cmwgPSB1cmwucGF0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIHVybCBpcyBhIHN0cmluZ1xuICAgICAgICBpZiAodHlwZW9mIHVybCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVVJMIG11c3QgYmUgYSBzdHJpbmcgb3IgaGF2ZSBhIC5wYXRoIHByb3BlcnR5LCBnb3Q6ICR7dHlwZW9mIHVybH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdXJsLnN0YXJ0c1dpdGgoJy9fYWpheCcpICYmICF1cmwuc3RhcnRzV2l0aCgnL18vJykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVVJMIG11c3Qgc3RhcnQgd2l0aCAvX2FqYXggb3IgL18sIGdvdDogJHt1cmx9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJ0cyA9IHVybC5zcGxpdCgnLycpLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gJycpO1xuXG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgQUpBWCBVUkwgc3RydWN0dXJlOiAke3VybH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFKQVggVVJMIGhhcyB0b28gbWFueSBzZWdtZW50czogJHt1cmx9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gcGFydHNbMV07XG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IHBhcnRzWzJdIHx8ICdpbmRleCc7XG5cbiAgICAgICAgcmV0dXJuIHsgY29udHJvbGxlciwgYWN0aW9uIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXV0by1pbml0aWFsaXplIHN0YXRpYyBwcm9wZXJ0aWVzIHdoZW4gY2xhc3MgaXMgZmlyc3QgbG9hZGVkXG4gICAgICovXG4gICAgc3RhdGljIG9uX2NvcmVfZGVmaW5lKCkge1xuICAgICAgICBBamF4Ll9vbl9mcmFtZXdvcmtfY29yZV9pbml0KCk7XG4gICAgfVxufVxuIiwiLyoqXG4gKiBKcWh0bWxfQ29tcG9uZW50IC0gQmFzZSBjbGFzcyBmb3IgSlFIVE1MIGNvbXBvbmVudHMgaW4gUlNYIGZyYW1ld29ya1xuICpcbiAqIFRoaXMgY2xhc3Mgd3JhcHMgdGhlIGpxaHRtbC5Db21wb25lbnQgZnJvbSB0aGUgbnBtIHBhY2thZ2UgYW5kIHByb3ZpZGVzXG4gKiB0aGUgc3RhbmRhcmQgaW50ZXJmYWNlIGZvciBSU1ggY29tcG9uZW50cyBmb2xsb3dpbmcgdGhlIFVwcGVyX0Nhc2UgbmFtaW5nIGNvbnZlbnRpb24uXG4gKlxuICogX0Jhc2VfSnFodG1sX0NvbXBvbmVudCBpcyBpbXBvcnRlZCBmcm9tIG5wbSB2aWEgSnFodG1sX0J1bmRsZS5cbiAqXG4gKiBASW5zdGFudGlhdGFibGVcbiAqL1xuY2xhc3MgSnFodG1sX0NvbXBvbmVudCBleHRlbmRzIF9CYXNlX0pxaHRtbF9Db21wb25lbnQge31cblxuLy8gUlNYIG1hbmlmZXN0IGF1dG9tYXRpY2FsbHkgbWFrZXMgY2xhc3NlcyBnbG9iYWwgLSBubyBtYW51YWwgYXNzaWdubWVudCBuZWVkZWRcbiIsIi8qKlxuICogSlFIVE1MIEludGVncmF0aW9uIC0gQXV0b21hdGljIGNvbXBvbmVudCByZWdpc3RyYXRpb24gYW5kIGJpbmRpbmdcbiAqXG4gKiBUaGlzIG1vZHVsZSBhdXRvbWF0aWNhbGx5OlxuICogMS4gUmVnaXN0ZXJzIGNvbXBvbmVudCBjbGFzc2VzIHRoYXQgZXh0ZW5kIEpxaHRtbF9Db21wb25lbnRcbiAqIDIuIEJpbmRzIHRlbXBsYXRlcyB0byBjb21wb25lbnQgY2xhc3NlcyB3aGVuIG5hbWVzIG1hdGNoXG4gKiAzLiBFbmFibGVzICQoc2VsZWN0b3IpLmNvbXBvbmVudChcIkNvbXBvbmVudF9OYW1lXCIpIHN5bnRheFxuICovXG5jbGFzcyBKcWh0bWxfSW50ZWdyYXRpb24ge1xuICAgIC8qKlxuICAgICAqIENvbXBpbGVkIEpxaHRtbCB0ZW1wbGF0ZXMgc2VsZi1yZWdpc3Rlci4gIFRoZSBkZXZlbG9wZXIgKHRoZSBmcmFtZXdvcmsgaW4gdGhpcyBjYXNlKSBpcyBzdGlsbFxuICAgICAqIHJlc3BvbnNpYmxlIGZvciByZWdpc3RlcmluZyBlczYgY29tcG9uZW50IGNsYXNzZXMgd2l0aCBqcWh0bWwuICBUaGlzIGRvZXMgc28gYXQgYW4gZWFybHkgc3RhZ2VcbiAgICAgKiBvZiBmcmFtZXdvcmsgaW5pdC5cbiAgICAgKi9cbiAgICBzdGF0aWMgX29uX2ZyYW1ld29ya19tb2R1bGVzX2RlZmluZSgpIHtcbiAgICAgICAgbGV0IGpxaHRtbF9jb21wb25lbnRzID0gTWFuaWZlc3QuZ2V0X2V4dGVuZGluZygnSnFodG1sX0NvbXBvbmVudCcpO1xuXG4gICAgICAgIGNvbnNvbGVfZGVidWcoJ0pRSFRNTF9JTklUJywgJ1JlZ2lzdGVyaW5nICcgKyBqcWh0bWxfY29tcG9uZW50cy5sZW5ndGggKyAnIEpxaHRtbCBDb21wb25lbnRzJyk7XG5cbiAgICAgICAgZm9yIChsZXQgY29tcG9uZW50IG9mIGpxaHRtbF9jb21wb25lbnRzKSB7XG4gICAgICAgICAgICBqcWh0bWwucmVnaXN0ZXJfY29tcG9uZW50KGNvbXBvbmVudC5jbGFzc19uYW1lLCBjb21wb25lbnQuY2xhc3Nfb2JqZWN0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZyYW1ld29yayBtb2R1bGVzIGluaXQgcGhhc2UgLSBCaW5kIGNvbXBvbmVudHMgYW5kIGluaXRpYWxpemUgRE9NXG4gICAgICogVGhpcyBydW5zIGFmdGVyIHRlbXBsYXRlcyBhcmUgcmVnaXN0ZXJlZCB0byBiaW5kIGNvbXBvbmVudCBjbGFzc2VzXG4gICAgICogQHBhcmFtIHtqUXVlcnl9IFskc2NvcGVdIE9wdGlvbmFsIHNjb3BlIHRvIHNlYXJjaCB3aXRoaW4gKGRlZmF1bHRzIHRvIGJvZHkpXG4gICAgICogQHJldHVybnMge0FycmF5PFByb21pc2U+fHVuZGVmaW5lZH0gQXJyYXkgb2YgcHJvbWlzZXMgZm9yIHJlY3Vyc2l2ZSBjYWxscywgdW5kZWZpbmVkIGZvciB0b3AtbGV2ZWxcbiAgICAgKi9cbiAgICBzdGF0aWMgX29uX2ZyYW1ld29ya19tb2R1bGVzX2luaXQoJHNjb3BlKSB7XG4gICAgICAgIGNvbnN0IGlzX3RvcF9sZXZlbCA9ICEkc2NvcGU7XG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHNfbmVlZGluZ19pbml0ID0gKCRzY29wZSB8fCAkKCdib2R5JykpLmZpbmQoJy5KcWh0bWxfQ29tcG9uZW50X0luaXQnKTtcbiAgICAgICAgaWYgKGNvbXBvbmVudHNfbmVlZGluZ19pbml0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGVfZGVidWcoJ0pRSFRNTF9JTklUJywgYEluaXRpYWxpemluZyAke2NvbXBvbmVudHNfbmVlZGluZ19pbml0Lmxlbmd0aH0gRE9NIGNvbXBvbmVudHNgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXBvbmVudHNfbmVlZGluZ19pbml0LmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgJGVsZW1lbnQgPSAkKHRoaXMpO1xuXG4gICAgICAgICAgICAvLyBTa2lwIGlmIGVsZW1lbnQgaXMgbm8gbG9uZ2VyIGF0dGFjaGVkIHRvIHRoZSBkb2N1bWVudFxuICAgICAgICAgICAgLy8gKG1heSBoYXZlIGJlZW4gcmVtb3ZlZCBieSBhIHBhcmVudCBjb21wb25lbnQncyAuZW1wdHkoKSBjYWxsKVxuICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5jb250YWlucygkZWxlbWVudFswXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGFueSBwYXJlbnQgaGFzIEpxaHRtbF9Db21wb25lbnRfSW5pdCBjbGFzcyAtIHNraXAgbmVzdGVkIGNvbXBvbmVudHNcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSAkZWxlbWVudFswXS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdKcWh0bWxfQ29tcG9uZW50X0luaXQnKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIFNraXAgdGhpcyBlbGVtZW50LCBpdCdzIG5lc3RlZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50X25hbWUgPSAkZWxlbWVudC5hdHRyKCdkYXRhLWNvbXBvbmVudC1pbml0LW5hbWUnKTtcblxuICAgICAgICAgICAgLy8galF1ZXJ5J3MgLmRhdGEoKSBkb2Vzbid0IGF1dG8tcGFyc2UgSlNPTiAtIHdlIG5lZWQgdG8gcGFyc2UgaXQgbWFudWFsbHlcbiAgICAgICAgICAgIGxldCBjb21wb25lbnRfYXJncyA9IHt9O1xuICAgICAgICAgICAgY29uc3QgYXJnc19zdHJpbmcgPSAkZWxlbWVudC5hdHRyKCdkYXRhLWNvbXBvbmVudC1hcmdzJyk7XG5cbiAgICAgICAgICAgIC8vIFVuc2V0IGNvbXBvbmVudC0gcGhwIHNpZGUgaW5pdGlhbGl6YXRpb24gYXJncywgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZCBhcyBhIGNvbXBpb25lbnQgYXR0cmlidXRlXG4gICAgICAgICAgICAvLyBVbnNldHRpbmcgYWxzbyBwcmV2ZW50cyB1bmRlc2lyZWQgYWNjZXNzIHRvIHRoaXMgY29kZSBpbiBvdGhlciBwYXJ0cyBvZiB0aGUgcHJvZ3JhbSwgcHJldmVuaW5nIGFuXG4gICAgICAgICAgICAvLyB1bndhbnRlZCBmdXR1cmUgZGVwZW5kZW5jeSBvbiB0aGlzIHBhcmFkaWdtXG4gICAgICAgICAgICAkZWxlbWVudC5yZW1vdmVBdHRyKCdkYXRhLWNvbXBvbmVudC1pbml0LW5hbWUnKTtcbiAgICAgICAgICAgICRlbGVtZW50LnJlbW92ZUF0dHIoJ2RhdGEtY29tcG9uZW50LWFyZ3MnKTtcbiAgICAgICAgICAgICRlbGVtZW50LnJlbW92ZURhdGEoJ2NvbXBvbmVudC1pbml0LW5hbWUnKTtcbiAgICAgICAgICAgICRlbGVtZW50LnJlbW92ZURhdGEoJ2NvbXBvbmVudC1hcmdzJyk7XG5cbiAgICAgICAgICAgIGlmIChhcmdzX3N0cmluZykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF9hcmdzID0gSlNPTi5wYXJzZShhcmdzX3N0cmluZyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbSlFIVE1MIEludGVncmF0aW9uXSBGYWlsZWQgdG8gcGFyc2UgY29tcG9uZW50IGFyZ3MgZm9yICR7Y29tcG9uZW50X25hbWV9OmAsIGUpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRfYXJncyA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudF9uYW1lKSB7XG4gICAgICAgICAgICAgICAgLy8gVHJhbnNmb3JtICQgcHJlZml4ZWQga2V5cyB0byBkYXRhLSBhdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudF9hcmdzX2ZpbHRlcmVkID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29tcG9uZW50X2FyZ3MpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChrZXkuc3RhcnRzV2l0aCgnJCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudF9hcmdzX2ZpbHRlcmVkW2tleS5zdWJzdHJpbmcoMSldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIC8vIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoJ2RhdGEtJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF9hcmdzX2ZpbHRlcmVkW2tleS5zdWJzdHJpbmcoNSldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRfYXJnc19maWx0ZXJlZFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSBpbm5lciBIVE1MIGFzIHN0cmluZyBmb3IgbmVzdGVkIGNvbXBvbmVudCBwcm9jZXNzaW5nXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF9hcmdzX2ZpbHRlcmVkLl9pbm5lcl9odG1sID0gJGVsZW1lbnQuaHRtbCgpO1xuICAgICAgICAgICAgICAgICAgICAkZWxlbWVudC5lbXB0eSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgaW5pdCBjbGFzcyBiZWZvcmUgaW5zdGFudGlhdGlvbiB0byBwcmV2ZW50IHJlLWluaXRpYWxpemF0aW9uXG4gICAgICAgICAgICAgICAgICAgICRlbGVtZW50LnJlbW92ZUNsYXNzKCdKcWh0bWxfQ29tcG9uZW50X0luaXQnKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgcHJvbWlzZSBmb3IgdGhpcyBjb21wb25lbnQncyBpbml0aWFsaXphdGlvblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRfcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgalF1ZXJ5IGNvbXBvbmVudCBwbHVnaW4gdG8gY3JlYXRlIHRoZSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBsdWdpbiBoYW5kbGVzIGVsZW1lbnQgaW50ZXJuYWxseSwganVzdCBwYXNzIGFyZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgdXBkYXRlZCAkZWxlbWVudCBmcm9tXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29tcG9uZW50ID0gJGVsZW1lbnQuY29tcG9uZW50KGNvbXBvbmVudF9uYW1lLCBjb21wb25lbnRfYXJnc19maWx0ZXJlZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5vbigncmVuZGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbGxlY3QgcHJvbWlzZXMgZnJvbSBuZXN0ZWQgY29tcG9uZW50c1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0dGluZyB0aGUgdXBkYXRlZCBjb21wb25lbnQgaGVyZSAtIGlmIHRoZSB0YWcgbmFtZSB3YXMgbm90IGRpdiwgdGhlIGVsZW1lbnQgd291bGQgaGF2ZSBiZWVuIHJlY3JlYXRlZCwgc28gd2UgbmVlZCB0byBnZXQgdGhlIGVsZW1lbnQgc2V0IG9uIHRoZSBjb21wb25lbnQsIG5vdCBmcm9tIG91ciBlYXJsaWVyIHNlbGVjdG9yXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRfcHJvbWlzZXMgPSBKcWh0bWxfSW50ZWdyYXRpb24uX29uX2ZyYW1ld29ya19tb2R1bGVzX2luaXQoY29tcG9uZW50LiQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goLi4ubmVzdGVkX3Byb21pc2VzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgdGhpcyBjb21wb25lbnQncyBwcm9taXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkuJDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChjb21wb25lbnRfcHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgW0pRSFRNTCBJbnRlZ3JhdGlvbl0gRmFpbGVkIHRvIGluaXRpYWxpemUgY29tcG9uZW50ICR7Y29tcG9uZW50X25hbWV9OmAsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZGV0YWlsczonLCBlcnJvci5zdGFjayB8fCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUb3AtbGV2ZWwgY2FsbDogc3Bhd24gYXN5bmMgaGFuZGxlciB0byB3YWl0IGZvciBhbGwgcHJvbWlzZXMsIHRoZW4gdHJpZ2dlciBldmVudFxuICAgICAgICBpZiAoaXNfdG9wX2xldmVsKSB7XG4gICAgICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBSc3guX3JzeF9jYWxsX2FsbF9jbGFzc2VzKCdvbl9qcWh0bWxfcmVhZHknKTtcbiAgICAgICAgICAgICAgICBSc3gudHJpZ2dlcignanFodG1sX3JlYWR5Jyk7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVjdXJzaXZlIGNhbGw6IHJldHVybiBwcm9taXNlcyBmb3IgcGFyZW50IHRvIGNvbGxlY3RcbiAgICAgICAgcmV0dXJuIHByb21pc2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgcmVnaXN0ZXJlZCBjb21wb25lbnQgbmFtZXNcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gQXJyYXkgb2YgY29tcG9uZW50IG5hbWVzXG4gICAgICovXG4gICAgc3RhdGljIGdldF9jb21wb25lbnRfbmFtZXMoKSB7XG4gICAgICAgIHJldHVybiBqcWh0bWwuZ2V0X2NvbXBvbmVudF9uYW1lcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgY29tcG9uZW50IGlzIHJlZ2lzdGVyZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBDb21wb25lbnQgbmFtZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGNvbXBvbmVudCBpcyByZWdpc3RlcmVkXG4gICAgICovXG4gICAgc3RhdGljIGhhc19jb21wb25lbnQobmFtZSkge1xuICAgICAgICByZXR1cm4ganFodG1sLmhhc19jb21wb25lbnQobmFtZSk7XG4gICAgfVxufVxuXG4vLyBSU1ggbWFuaWZlc3QgYXV0b21hdGljYWxseSBtYWtlcyBjbGFzc2VzIGdsb2JhbCAtIG5vIG1hbnVhbCBhc3NpZ25tZW50IG5lZWRlZFxuIiwiLyoqXG4gKiBEYXRhR3JpZCBDb21wb25lbnQgKFBoYXNlIDEpXG4gKlxuICogRHVlIHRvIHRoZSBtb3JlIGR5bmFtaWMgbmF0dXJlIG9mIHRoaXMgY29tcG9uZW50LCB3ZSBhcmUgaGFuZGxpbmcgbG9hZCAvIHJlbmRlciBsaWZlY3ljbGVzXG4gKiBkaXJlY3RseSBpbiB0aGlzIGNsYXNzIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBvbl9sb2FkIGxpZmVjeWNsZSBldmVudFxuICpcbiAqICoqRmVhdHVyZXMqKjpcbiAqIC0gQWpheCBkYXRhIGZldGNoaW5nXG4gKiAtIFNvcnRpbmcgKGNsaWNrIGhlYWRlcnMpXG4gKiAtIFBhZ2luYXRpb24gKG5leHQvcHJldi9wYWdlIHNlbGVjdClcbiAqIC0gUm93IHNlbGVjdGlvbiAoY2hlY2tib3hlcylcbiAqIC0gQ1NWIGV4cG9ydCAoc2VsZWN0ZWQgcm93cywgY3VycmVudCBwYWdlKVxuICogLSBVUkwgc3RhdGUgc3luY2hyb25pemF0aW9uXG4gKlxuICogKipVc2FnZSoqOlxuICogYGBgaHRtbFxuICogPENvbnRhY3RzX0RhdGFHcmlkICRhcGk9XCJGcm9udGVuZF9Db250YWN0c19Db250cm9sbGVyXCIgLz5cbiAqIGBgYFxuICpcbiAqICoqUmVxdWlyZWQgQXJncyoqOlxuICogLSBgYXBpYCAtIENvbnRyb2xsZXIgY2xhc3MgbmFtZSB3aXRoIGRhdGFncmlkX2ZldGNoKCkgQWpheCBlbmRwb2ludFxuICpcbiAqICoqT3B0aW9uYWwgQXJncyoqOlxuICogLSBgcGVyX3BhZ2VgIC0gRGVmYXVsdCByb3dzIHBlciBwYWdlIChkZWZhdWx0OiAyNSlcbiAqIC0gYHNvcnRgIC0gRGVmYXVsdCBzb3J0IGNvbHVtbiAoZGVmYXVsdDogZmlyc3QgY29sdW1uKVxuICogLSBgb3JkZXJgIC0gRGVmYXVsdCBzb3J0IG9yZGVyIChkZWZhdWx0OiAnYXNjJylcbiAqL1xuY2xhc3MgRGF0YUdyaWRfQWJzdHJhY3QgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICAvLyBJbml0aWFsaXplIGRhdGEgYmVmb3JlIGZpcnN0IHJlbmRlclxuICAgIG9uX2NyZWF0ZSgpIHtcbiAgICAgICAgbGV0IHRoYXQgPSB0aGlzO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgZGF0YSBzdGF0ZSBpbW1lZGlhdGVseSBzbyB0ZW1wbGF0ZSBjYW4gcmVuZGVyXG4gICAgICAgIHRoYXQuZGF0YS5yb3dzID0gW107XG4gICAgICAgIHRoYXQuZGF0YS5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhhdC5kYXRhLmlzX2VtcHR5ID0gZmFsc2U7XG4gICAgICAgIHRoYXQuZGF0YS5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhhdC5kYXRhLnRvdGFsX3BhZ2VzID0gMDtcbiAgICB9XG5cbiAgICAvLyBDYWxscyB3aGVuIGRhdGFncmlkIGZpcnN0IGluaXRpYWxpemVkXG4gICAgYXN5bmMgb25fcmVhZHkoKSB7XG4gICAgICAgIGxldCB0aGF0ID0gdGhpcztcblxuICAgICAgICBpZiAoIXRoYXQuYXJncy5kYXRhX3NvdXJjZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRGF0YWdyaWQgJyArIHRoYXQuY29tcG9uZW50X25hbWUoKSArICcgcmVxdWlyZXMgYXJncy5kYXRhX3NvdXJjZSBzZXQgdG8gYSBBamF4X0VuZHBvaW50IG9iamVjdCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RvcmUgZGVmYXVsdHMgZm9yIGxhdGVyIGNvbXBhcmlzb25cbiAgICAgICAgdGhhdC5kYXRhLmRlZmF1bHRfcGFnZSA9IDE7XG4gICAgICAgIHRoYXQuZGF0YS5kZWZhdWx0X3Blcl9wYWdlID0gdGhhdC5hcmdzLnBlcl9wYWdlID8/IDE1O1xuICAgICAgICB0aGF0LmRhdGEuZGVmYXVsdF9zb3J0ID0gdGhhdC5hcmdzLnNvcnQgPz8gbnVsbDtcbiAgICAgICAgdGhhdC5kYXRhLmRlZmF1bHRfb3JkZXIgPSB0aGF0LmFyZ3Mub3JkZXIgPz8gJ2FzYyc7XG4gICAgICAgIHRoYXQuZGF0YS5kZWZhdWx0X2ZpbHRlciA9ICcnO1xuXG4gICAgICAgIC8vIFNldCBjb25maWd1cmVkIHZhbHVlc1xuICAgICAgICB0aGF0LmRhdGEucGVyX3BhZ2UgPSB0aGF0LmRhdGEuZGVmYXVsdF9wZXJfcGFnZTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHN0YXRlIGZyb20gVVJMIGhhc2ggaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHVzZSBkZWZhdWx0c1xuICAgICAgICBjb25zdCBoYXNoX3BhZ2UgPSBSc3guZ2V0X3BhZ2Vfc3RhdGUodGhhdC5fY2lkICsgJ19wYWdlJyk7XG4gICAgICAgIGNvbnN0IGhhc2hfc29ydCA9IFJzeC5nZXRfcGFnZV9zdGF0ZSh0aGF0Ll9jaWQgKyAnX3NvcnQnKTtcbiAgICAgICAgY29uc3QgaGFzaF9vcmRlciA9IFJzeC5nZXRfcGFnZV9zdGF0ZSh0aGF0Ll9jaWQgKyAnX29yZGVyJyk7XG4gICAgICAgIGNvbnN0IGhhc2hfZmlsdGVyID0gUnN4LmdldF9wYWdlX3N0YXRlKHRoYXQuX2NpZCArICdfZmlsdGVyJyk7XG5cbiAgICAgICAgdGhhdC5kYXRhLnBhZ2UgPSBoYXNoX3BhZ2UgPyBpbnQoaGFzaF9wYWdlKSA6IHRoYXQuZGF0YS5kZWZhdWx0X3BhZ2U7XG4gICAgICAgIHRoYXQuZGF0YS5zb3J0ID0gaGFzaF9zb3J0IHx8IHRoYXQuZGF0YS5kZWZhdWx0X3NvcnQ7XG4gICAgICAgIHRoYXQuZGF0YS5vcmRlciA9IGhhc2hfb3JkZXIgfHwgdGhhdC5kYXRhLmRlZmF1bHRfb3JkZXI7XG4gICAgICAgIHRoYXQuZGF0YS5maWx0ZXIgPSBoYXNoX2ZpbHRlciB8fCB0aGF0LmRhdGEuZGVmYXVsdF9maWx0ZXI7XG5cbiAgICAgICAgdGhhdC5yZWdpc3Rlcl9yZW5kZXJfY2FsbGJhY2tzKCk7XG4gICAgICAgIHRoYXQucmVnaXN0ZXJfZmlsdGVyX2hhbmRsZXJzKCk7XG5cbiAgICAgICAgLy8gSWYgaGFzaCBoYWQgYSBmaWx0ZXIgdmFsdWUsIHBvcHVsYXRlIHRoZSBmaWx0ZXIgaW5wdXRcbiAgICAgICAgaWYgKHRoYXQuZGF0YS5maWx0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0ICRmaWx0ZXIgPSB0aGF0LiRpZCgnZmlsdGVyX2lucHV0Jyk7XG4gICAgICAgICAgICBpZiAoJGZpbHRlciAmJiAkZmlsdGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAkZmlsdGVyLnZhbCh0aGF0LmRhdGEuZmlsdGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1lYXN1cmUgcm93IGhlaWdodCBhbmQgc2V0IGZpeGVkIHRib2R5IGhlaWdodCAoYWxsIGluIG9uZSBmcmFtZSlcbiAgICAgICAgYXdhaXQgdGhhdC5tZWFzdXJlX2FuZF9zZXRfZml4ZWRfaGVpZ2h0KCk7XG5cbiAgICAgICAgLy8gRmV0Y2ggdGhlIGluaXRpYWwgcGFnZSAocmVzcGVjdHMgaGFzaCBzdGF0ZSlcbiAgICAgICAgdGhhdC5sb2FkX3BhZ2UodGhhdC5kYXRhLnBhZ2UpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBoZWFkZXIgb25seSBpZiBzb3J0L29yZGVyIGNoYW5nZWRcbiAgICB1cGRhdGVfaGVhZGVyKCkge1xuICAgICAgICBsZXQgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgLy8gVHJhY2sgbGFzdCByZW5kZXJlZCBzdGF0ZVxuICAgICAgICBpZiAoIXRoYXQuX2xhc3RfaGVhZGVyX3N0YXRlKSB7XG4gICAgICAgICAgICB0aGF0Ll9sYXN0X2hlYWRlcl9zdGF0ZSA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudCA9IHtcbiAgICAgICAgICAgIHNvcnQ6IHRoYXQuZGF0YS5zb3J0LFxuICAgICAgICAgICAgb3JkZXI6IHRoYXQuZGF0YS5vcmRlcixcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBPbmx5IHJlbmRlciBpZiB2YWx1ZXMgY2hhbmdlZFxuICAgICAgICBpZiAodGhhdC5fbGFzdF9oZWFkZXJfc3RhdGUuc29ydCAhPT0gY3VycmVudC5zb3J0IHx8IHRoYXQuX2xhc3RfaGVhZGVyX3N0YXRlLm9yZGVyICE9PSBjdXJyZW50Lm9yZGVyKSB7XG4gICAgICAgICAgICB0aGF0Ll9sYXN0X2hlYWRlcl9zdGF0ZSA9IGN1cnJlbnQ7XG4gICAgICAgICAgICB0aGF0LmlkKCdkYXRhZ3JpZF90YWJsZV9oZWFkZXInKS5yZW5kZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBwYWdpbmF0aW9uIG9ubHkgaWYgdmFsdWVzIGNoYW5nZWRcbiAgICB1cGRhdGVfcGFnaW5hdGlvbigpIHtcbiAgICAgICAgbGV0IHRoYXQgPSB0aGlzO1xuXG4gICAgICAgIC8vIFRyYWNrIGxhc3QgcmVuZGVyZWQgc3RhdGVcbiAgICAgICAgaWYgKCF0aGF0Ll9sYXN0X3BhZ2luYXRpb25fc3RhdGUpIHtcbiAgICAgICAgICAgIHRoYXQuX2xhc3RfcGFnaW5hdGlvbl9zdGF0ZSA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudCA9IHtcbiAgICAgICAgICAgIHBhZ2U6IHRoYXQuZGF0YS5wYWdlLFxuICAgICAgICAgICAgcGVyX3BhZ2U6IHRoYXQuZGF0YS5wZXJfcGFnZSxcbiAgICAgICAgICAgIHRvdGFsOiB0aGF0LmRhdGEudG90YWwsXG4gICAgICAgICAgICB0b3RhbF9wYWdlczogdGhhdC5kYXRhLnRvdGFsX3BhZ2VzLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE9ubHkgcmVuZGVyIGlmIHZhbHVlcyBjaGFuZ2VkXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoYXQuX2xhc3RfcGFnaW5hdGlvbl9zdGF0ZS5wYWdlICE9PSBjdXJyZW50LnBhZ2UgfHxcbiAgICAgICAgICAgIHRoYXQuX2xhc3RfcGFnaW5hdGlvbl9zdGF0ZS5wZXJfcGFnZSAhPT0gY3VycmVudC5wZXJfcGFnZSB8fFxuICAgICAgICAgICAgdGhhdC5fbGFzdF9wYWdpbmF0aW9uX3N0YXRlLnRvdGFsICE9PSBjdXJyZW50LnRvdGFsIHx8XG4gICAgICAgICAgICB0aGF0Ll9sYXN0X3BhZ2luYXRpb25fc3RhdGUudG90YWxfcGFnZXMgIT09IGN1cnJlbnQudG90YWxfcGFnZXNcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGF0Ll9sYXN0X3BhZ2luYXRpb25fc3RhdGUgPSBjdXJyZW50O1xuICAgICAgICAgICAgdGhhdC5pZCgncGFnaW5hdGlvbl9pbmZvJykucmVuZGVyKCk7XG4gICAgICAgICAgICB0aGF0LmlkKCdwYWdpbmF0aW9uX2NvbnRyb2xzJykucmVuZGVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMb2FkIGRhdGEgZm9yIHNwZWNpZmllZCBwYWdlIGFuZCByZS1yZW5kZXIgZGF0YVxuICAgIGFzeW5jIGxvYWRfcGFnZShwYWdlKSB7XG4gICAgICAgIGxldCB0aGF0ID0gdGhpcztcblxuICAgICAgICAvLyBTZXQgbG9hZGluZyBzdGF0ZVxuICAgICAgICB0aGF0LmRhdGEubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoYXQuZGF0YS5wYWdlID0gcGFnZTtcblxuICAgICAgICAvLyBVcGRhdGUgVUkgd2l0aCByZXF1ZXN0ZWQgdmFsdWVzIChvcHRpbWlzdGljIHVwZGF0ZSlcbiAgICAgICAgdGhhdC51cGRhdGVfaGVhZGVyKCk7XG4gICAgICAgIHRoYXQudXBkYXRlX3BhZ2luYXRpb24oKTtcblxuICAgICAgICAvLyBPbmx5IHJlbmRlciBsb2FkaW5nIHN0YXRlIGlmIG5vIGRhdGEgeWV0IChpbml0aWFsIGxvYWQpXG4gICAgICAgIGlmICh0aGF0LmRhdGEucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoYXQuaWQoJ2RhdGFncmlkX3RhYmxlX2JvZHknKS5yZW5kZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgQWpheC5jYWxsKHRoYXQuYXJncy5kYXRhX3NvdXJjZSwge1xuICAgICAgICAgICAgcGFnZTogcGFnZSxcbiAgICAgICAgICAgIHBlcl9wYWdlOiB0aGF0LmRhdGEucGVyX3BhZ2UsXG4gICAgICAgICAgICBzb3J0OiB0aGF0LmRhdGEuc29ydCxcbiAgICAgICAgICAgIG9yZGVyOiB0aGF0LmRhdGEub3JkZXIsXG4gICAgICAgICAgICBmaWx0ZXI6IHRoYXQuZGF0YS5maWx0ZXIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBkYXRhXG4gICAgICAgIHRoYXQuZGF0YS5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoYXQuZGF0YS5sb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGF0LmRhdGEucm93cyA9IHJlc3BvbnNlLnJlY29yZHM7XG4gICAgICAgIHRoYXQuZGF0YS5wYWdlID0gcmVzcG9uc2UucGFnZTtcbiAgICAgICAgdGhhdC5kYXRhLnBlcl9wYWdlID0gcmVzcG9uc2UucGVyX3BhZ2U7XG4gICAgICAgIHRoYXQuZGF0YS50b3RhbCA9IHJlc3BvbnNlLnRvdGFsO1xuICAgICAgICB0aGF0LmRhdGEudG90YWxfcGFnZXMgPSByZXNwb25zZS50b3RhbF9wYWdlcztcbiAgICAgICAgdGhhdC5kYXRhLnNvcnQgPSByZXNwb25zZS5zb3J0O1xuICAgICAgICB0aGF0LmRhdGEub3JkZXIgPSByZXNwb25zZS5vcmRlcjtcbiAgICAgICAgdGhhdC5kYXRhLmlzX2VtcHR5ID0gcmVzcG9uc2UucmVjb3Jkcy5sZW5ndGggPT09IDA7XG5cbiAgICAgICAgLy8gUGVyc2lzdCBzdGF0ZSB0byBVUkwgaGFzaCBmb3IgYm9va21hcmtpbmcvc2hhcmluZ1xuICAgICAgICAvLyBPbmx5IHNldCB2YWx1ZXMgdGhhdCBkaWZmZXIgZnJvbSBkZWZhdWx0cyAobnVsbCByZW1vdmVzIHRoZSBrZXkpXG4gICAgICAgIGNvbnN0IHN0YXRlID0ge307XG4gICAgICAgIHN0YXRlW3RoYXQuX2NpZCArICdfcGFnZSddID0gdGhhdC5kYXRhLnBhZ2UgIT09IHRoYXQuZGF0YS5kZWZhdWx0X3BhZ2UgPyB0aGF0LmRhdGEucGFnZSA6IG51bGw7XG4gICAgICAgIHN0YXRlW3RoYXQuX2NpZCArICdfc29ydCddID0gdGhhdC5kYXRhLnNvcnQgIT09IHRoYXQuZGF0YS5kZWZhdWx0X3NvcnQgPyB0aGF0LmRhdGEuc29ydCA6IG51bGw7XG4gICAgICAgIHN0YXRlW3RoYXQuX2NpZCArICdfb3JkZXInXSA9IHRoYXQuZGF0YS5vcmRlciAhPT0gdGhhdC5kYXRhLmRlZmF1bHRfb3JkZXIgPyB0aGF0LmRhdGEub3JkZXIgOiBudWxsO1xuICAgICAgICBzdGF0ZVt0aGF0Ll9jaWQgKyAnX2ZpbHRlciddID0gdGhhdC5kYXRhLmZpbHRlciAhPT0gdGhhdC5kYXRhLmRlZmF1bHRfZmlsdGVyID8gdGhhdC5kYXRhLmZpbHRlciA6IG51bGw7XG5cbiAgICAgICAgUnN4LnNldF9hbGxfcGFnZV9zdGF0ZShzdGF0ZSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIFVJIHdpdGggc2VydmVyIHJlc3BvbnNlIChvbmx5IHJlbmRlcnMgaWYgY2hhbmdlZClcbiAgICAgICAgdGhhdC5pZCgnZGF0YWdyaWRfdGFibGVfYm9keScpLnJlbmRlcigpO1xuICAgICAgICB0aGF0LnVwZGF0ZV9oZWFkZXIoKTtcbiAgICAgICAgdGhhdC51cGRhdGVfcGFnaW5hdGlvbigpO1xuXG4gICAgICAgIC8vIFNjcm9sbCB0byB0b3Agb2YgZGF0YWdyaWQgaWYgaXQncyBub3QgY3VycmVudGx5IHZpc2libGVcbiAgICAgICAgdGhhdC5zY3JvbGxfdG9fdG9wX2lmX25lZWRlZCgpO1xuICAgIH1cblxuICAgIC8vIFRoZSBjYWxsYmFja3MgaW4gdGhpcyBmdW5jdGlvbiBmaXJlIGFmdGVyIGVhY2ggdGFyZ2V0ZWQgY29tcG9uZW50IHJlLXJlbmRlcnNcbiAgICByZWdpc3Rlcl9yZW5kZXJfY2FsbGJhY2tzKCkge1xuICAgICAgICBsZXQgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgLy8gQXR0YWNoIHJvdyBjbGljayBoYW5kbGVyIC0gcmUtcnVucyBldmVyeSB0aW1lIGRhdGFncmlkX3RhYmxlX2JvZHkgcmVuZGVyc1xuICAgICAgICB0aGF0LmlkKCdkYXRhZ3JpZF90YWJsZV9ib2R5Jykub24oJ3JlbmRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdER1RCX1InKTtcbiAgICAgICAgICAgIC8vIFN0ZXAgMTogV3JhcCBjZWxscyBpbiBkYXRhLWhyZWYgcm93cyB3aXRoIGFuY2hvciB0YWdzXG4gICAgICAgICAgICAkKHRoaXMpXG4gICAgICAgICAgICAgICAgLmZpbmQoJ3RyW2RhdGEtaHJlZl0nKVxuICAgICAgICAgICAgICAgIC5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0ICRyb3cgPSAkKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaHJlZiA9ICRyb3cuYXR0cignZGF0YS1ocmVmJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgJHJvdy5maW5kKCd0ZCcpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0ICRjb2wgPSAkKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gLy8gU2tpcCBpZiBjZWxsIGFscmVhZHkgY29udGFpbnMgaW50ZXJhY3RpdmUgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICgkY29sLmZpbmQoJ2EsIGJ1dHRvbiwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gLy8gV3JhcCBlbnRpcmUgY2VsbCBjb250ZW50cyBpbiBhbiBhbmNob3IgKHByZXNlcnZlIERPTSBub2RlcyBmb3IgY29tcG9uZW50IGxpZmVjeWNsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldCAkYW5jaG9yID0gJCgnPGE+Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGhyZWY6IGhyZWYsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgY2xhc3M6ICdkYXRhZ3JpZC1yb3ctbGluaydcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gLy8gTW92ZSBleGlzdGluZyBjaGlsZCBub2RlcyBpbnRvIGFuY2hvciAocHJlc2VydmVzIGNvbXBvbmVudHMgYW5kIHRoZWlyIHN0YXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gJGNvbC5jb250ZW50cygpLmFwcGVuZFRvKCRhbmNob3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gLy8gQWRkIGFuY2hvciB0byBjZWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAkY29sLmFwcGVuZCgkYW5jaG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIFN0ZXAgMjogRmluZCBhbGwgY2VsbHMgd2l0aCBzaW5nbGUgYW5jaG9yIGFzIG9ubHkgY2hpbGQgYW5kIGFwcGx5IGZ1bGwtd2lkdGggc3R5bGluZ1xuICAgICAgICAgICAgJCh0aGlzKVxuICAgICAgICAgICAgICAgIC5maW5kKCd0ZCcpXG4gICAgICAgICAgICAgICAgLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgJGNvbCA9ICQodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCAkY2hpbGRyZW4gPSAkY29sLmNoaWxkcmVuKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgY2VsbCBjb250YWlucyBleGFjdGx5IG9uZSBkaXJlY3QgY2hpbGQgdGhhdCBpcyBhbiBhbmNob3JcbiAgICAgICAgICAgICAgICAgICAgaWYgKCRjaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgJGNoaWxkcmVuLmZpcnN0KCkuaXMoJ2EnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGNsYXNzIHRvIHRyYW5zZmVyIHBhZGRpbmcgZnJvbSBjZWxsIHRvIGFuY2hvclxuICAgICAgICAgICAgICAgICAgICAgICAgJGNvbC5hZGRDbGFzcygnaGFzLWZ1bGwtbGluaycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGNlbGwgY29udGFpbnMgb25seSB0ZXh0IChubyBjaGlsZCBlbGVtZW50cylcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGNsYXNzIHRvIGFwcGx5IHZlcnRpY2FsIHBhZGRpbmcgdG8gdGV4dC1vbmx5IGNlbGxzXG4gICAgICAgICAgICAgICAgICAgICAgICAkY29sLmFkZENsYXNzKCdoYXMtb25seS10ZXh0Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQXR0YWNoIHNvcnRhYmxlIGhlYWRlciBjbGljayBoYW5kbGVyIC0gcmUtcnVucyBldmVyeSB0aW1lIGRhdGFncmlkX3RhYmxlX2hlYWRlciByZW5kZXJzXG4gICAgICAgIHRoYXQuaWQoJ2RhdGFncmlkX3RhYmxlX2hlYWRlcicpLm9uKCdyZW5kZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBUcmFuc2Zvcm0gdGhbZGF0YS1zb3J0YnldIGVsZW1lbnRzIGJ5IHdyYXBwaW5nIGNvbnRlbnRzIGluIGNsaWNrYWJsZSBsaW5rXG4gICAgICAgICAgICAkKHRoaXMpXG4gICAgICAgICAgICAgICAgLmZpbmQoJ3RoW2RhdGEtc29ydGJ5XScpXG4gICAgICAgICAgICAgICAgLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgJHRoID0gJCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNvcnRieSA9ICR0aC5hdHRyKCdkYXRhLXNvcnRieScpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEZpbmQgb3V0IHdoeSB0aGlzIG9uKCdyZW5kZXInKSBjYWxsYmFjayBpcyBiZWluZyBjYWxsZWQgdHdpY2Uvb24gYWxyZWFkeS1wcm9jZXNzZWQgSFRNTFxuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHVud3JhcCBsb2dpYyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IC0gdGVtcGxhdGUgc2hvdWxkIHJlbmRlciBmcmVzaCBlYWNoIHRpbWVcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG5vdywgdW53cmFwIGFscmVhZHktd3JhcHBlZCBjb250ZW50IHRvIHByZXZlbnQgZG91YmxlLXdyYXBwaW5nXG4gICAgICAgICAgICAgICAgICAgIGxldCAkZXhpc3RpbmdfbGluayA9ICR0aC5maW5kKCdhLnNvcnRhYmxlLWhlYWRlcicpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudHM7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkZXhpc3RpbmdfbGluay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVbndyYXAgLSBnZXQgdGhlIHRleHQgY29udGVudCB3aXRob3V0IHRoZSB3cmFwcGVyIGFuZCBhcnJvd3NcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gJGV4aXN0aW5nX2xpbmsuY2xvbmUoKS5maW5kKCdpLmJpJykucmVtb3ZlKCkuZW5kKCkuaHRtbCgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMgPSAkdGguaHRtbCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQnVpbGQgdGhlIGFycm93IGljb24gSFRNTCBpZiB0aGlzIGNvbHVtbiBpcyBjdXJyZW50bHkgc29ydGVkXG4gICAgICAgICAgICAgICAgICAgIGxldCBhcnJvdyA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5kYXRhLnNvcnQgPT09IHNvcnRieSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3cgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuZGF0YS5vcmRlciA9PT0gJ2Rlc2MnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJzxpIGNsYXNzPVwiYmkgYmktY2hldnJvbi11cCBtcy0xXCI+PC9pPidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnPGkgY2xhc3M9XCJiaSBiaS1jaGV2cm9uLWRvd24gbXMtMVwiPjwvaT4nO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBjb250ZW50cyB3aXRoIHdyYXBwZWQgbGluayAoZnJlc2ggd3JhcHBlciBldmVyeSB0aW1lKVxuICAgICAgICAgICAgICAgICAgICAkdGguaHRtbChgPGEgaHJlZj1cIiNcIiBjbGFzcz1cInNvcnRhYmxlLWhlYWRlclwiIGRhdGEtc29ydGJ5PVwiJHtzb3J0Ynl9XCI+JHtjb250ZW50c30ke2Fycm93fTwvYT5gKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gQXR0YWNoIGNsaWNrIGhhbmRsZXJzIHRvIHRoZSBzb3J0YWJsZSBsaW5rcyB3ZSBqdXN0IGNyZWF0ZWRcbiAgICAgICAgICAgICQodGhpcylcbiAgICAgICAgICAgICAgICAuZmluZCgnYS5zb3J0YWJsZS1oZWFkZXJbZGF0YS1zb3J0YnldJylcbiAgICAgICAgICAgICAgICAub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3J0YnkgPSAkKHRoaXMpLmF0dHIoJ2RhdGEtc29ydGJ5Jyk7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuc29ydF9ieShzb3J0YnkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBdHRhY2ggcGFnaW5hdGlvbiBjbGljayBoYW5kbGVyIC0gcmUtcnVucyBldmVyeSB0aW1lIHBhZ2luYXRpb25fY29udHJvbHMgcmVuZGVyc1xuICAgICAgICB0aGF0LmlkKCdwYWdpbmF0aW9uX2NvbnRyb2xzJykub24oJ3JlbmRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICQodGhpcylcbiAgICAgICAgICAgICAgICAuZmluZCgnLnBhZ2UtbGluaycpXG4gICAgICAgICAgICAgICAgLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCAkbGluayA9ICQodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSBpbnQoJGxpbmsuYXR0cignZGF0YS1wYWdlJykpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBkaXNhYmxlZC9lbGxpcHNpcyBjbGlja3NcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYWdlIHx8IGlzTmFOKHBhZ2UpIHx8ICRsaW5rLnBhcmVudCgpLmhhc0NsYXNzKCdkaXNhYmxlZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBMb2FkIHRoZSByZXF1ZXN0ZWQgcGFnZVxuICAgICAgICAgICAgICAgICAgICB0aGF0LmxvYWRfcGFnZShwYWdlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQXR0YWNoIGNsZWFyIGZpbHRlciBidXR0b24gaGFuZGxlciAtIHJlLXJ1bnMgZXZlcnkgdGltZSBkYXRhZ3JpZF90YWJsZV9ib2R5IHJlbmRlcnNcbiAgICAgICAgdGhhdC5pZCgnZGF0YWdyaWRfdGFibGVfYm9keScpLm9uKCdyZW5kZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCAkY2xlYXJfYnRuID0gdGhhdC4kaWQoJ2NsZWFyX2ZpbHRlcl9idG4nKTtcbiAgICAgICAgICAgIGlmICgkY2xlYXJfYnRuICYmICRjbGVhcl9idG4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICRjbGVhcl9idG4ub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGF0LmNsZWFyX2ZpbHRlcigpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTb3J0IGJ5IHNwZWNpZmllZCBjb2x1bW4sIHRvZ2dsaW5nIG9yZGVyIGlmIGFscmVhZHkgc29ydGVkIGJ5IHRoYXQgY29sdW1uXG4gICAgc29ydF9ieShjb2x1bW4pIHtcbiAgICAgICAgbGV0IHRoYXQgPSB0aGlzO1xuXG4gICAgICAgIC8vIFRvZ2dsZSBvcmRlciBpZiBjbGlja2luZyBzYW1lIGNvbHVtbiwgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gYXNjXG4gICAgICAgIGlmICh0aGF0LmRhdGEuc29ydCA9PT0gY29sdW1uKSB7XG4gICAgICAgICAgICB0aGF0LmRhdGEub3JkZXIgPSB0aGF0LmRhdGEub3JkZXIgPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGF0LmRhdGEuc29ydCA9IGNvbHVtbjtcbiAgICAgICAgICAgIHRoYXQuZGF0YS5vcmRlciA9ICdhc2MnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVsb2FkIGN1cnJlbnQgcGFnZSB3aXRoIG5ldyBzb3J0XG4gICAgICAgIHRoYXQuaWQoJ2RhdGFncmlkX3RhYmxlX2hlYWRlcicpLnJlbmRlcigpO1xuICAgICAgICB0aGF0LmxvYWRfcGFnZSh0aGF0LmRhdGEucGFnZSk7XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0ZXIgZmlsdGVyIGlucHV0IGhhbmRsZXJzXG4gICAgcmVnaXN0ZXJfZmlsdGVyX2hhbmRsZXJzKCkge1xuICAgICAgICBsZXQgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgLy8gRmluZCBmaWx0ZXIgaW5wdXQgYnkgY29tbW9uIGlkZW50aWZpZXJzXG4gICAgICAgIGxldCAkZmlsdGVyID0gdGhhdC4kaWQoJ2ZpbHRlcl9pbnB1dCcpO1xuICAgICAgICBpZiAoISRmaWx0ZXIgfHwgJGZpbHRlci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICRmaWx0ZXIgPSB0aGF0LiQuZmluZCgnaW5wdXRbdHlwZT1cInNlYXJjaFwiXSwgaW5wdXRbdHlwZT1cInRleHRcIl0uZmlsdGVyLWlucHV0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJGZpbHRlciAmJiAkZmlsdGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICRmaWx0ZXIub24oJ2lucHV0IGtleXVwJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcl92YWx1ZSA9ICQodGhpcykudmFsKCk7XG4gICAgICAgICAgICAgICAgdGhhdC5maWx0ZXJfY2hhbmdlZChmaWx0ZXJfdmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmaWx0ZXJfY2hhbmdlZChmaWx0ZXIpIHtcbiAgICAgICAgbGV0IHRoYXQgPSB0aGlzO1xuXG4gICAgICAgIHRoYXQuZGF0YS5maWx0ZXIgPSBmaWx0ZXI7XG4gICAgICAgIHRoYXQubG9hZF9wYWdlKDEpO1xuICAgIH1cblxuICAgIC8vIFNjcm9sbCB0byBkYXRhZ3JpZCB0b3AgaWYgdGhlIHRvcCBlZGdlIGlzIG5vdCBjdXJyZW50bHkgdmlzaWJsZSBpbiB2aWV3cG9ydFxuICAgIHNjcm9sbF90b190b3BfaWZfbmVlZGVkKCkge1xuICAgICAgICBsZXQgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgY29uc3QgJGRhdGFncmlkID0gdGhhdC4kO1xuICAgICAgICBjb25zdCBkYXRhZ3JpZFRvcCA9ICRkYXRhZ3JpZC5vZmZzZXQoKS50b3A7XG4gICAgICAgIGNvbnN0IHNjcm9sbFRvcCA9ICQod2luZG93KS5zY3JvbGxUb3AoKTtcblxuICAgICAgICAvLyBJZiBkYXRhZ3JpZCB0b3AgaXMgYWJvdmUgdGhlIGN1cnJlbnQgdmlld3BvcnQsIHNjcm9sbCB0byBzaG93IGl0XG4gICAgICAgIGlmIChkYXRhZ3JpZFRvcCA8IHNjcm9sbFRvcCkge1xuICAgICAgICAgICAgLy8gSWYgZGF0YWdyaWQgaXMgd2l0aGluIDMwMHB4IG9mIHBhZ2UgdG9wLCBzY3JvbGwgdG8gMFxuICAgICAgICAgICAgaWYgKGRhdGFncmlkVG9wIDw9IDMwMCkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7IHRvcDogMCwgYmVoYXZpb3I6ICdpbnN0YW50JyB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gU2Nyb2xsIHRvIDIwcHggYWJvdmUgZGF0YWdyaWRcbiAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oeyB0b3A6IGRhdGFncmlkVG9wIC0gMjAsIGJlaGF2aW9yOiAnaW5zdGFudCcgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNZWFzdXJlIGFjdHVhbCByb3cgaGVpZ2h0IGFuZCBzZXQgZml4ZWQgdGJvZHkgbWluLWhlaWdodFxuICAgIC8vIEFsbCBoYXBwZW5zIGluIG9uZSBhbmltYXRpb24gZnJhbWUgc28gdXNlciBkb2Vzbid0IHNlZSBpdFxuICAgIGFzeW5jIG1lYXN1cmVfYW5kX3NldF9maXhlZF9oZWlnaHQoKSB7XG4gICAgICAgIGxldCB0aGF0ID0gdGhpcztcblxuICAgICAgICAvLyBXYWl0IGZvciBuZXh0IGFuaW1hdGlvbiBmcmFtZSB0byBlbnN1cmUgRE9NIGlzIHJlYWR5XG4gICAgICAgIGF3YWl0IHNsZWVwKDApO1xuXG4gICAgICAgIGNvbnN0ICR0Ym9keSA9IHRoYXQuaWQoJ2RhdGFncmlkX3RhYmxlX2JvZHknKS4kO1xuXG4gICAgICAgIC8vIFRlbXBvcmFyaWx5IHJlbmRlciBhIHNpbmdsZSBtZWFzdXJlbWVudCByb3dcbiAgICAgICAgY29uc3QgJG1lYXN1cmVtZW50X3JvdyA9ICQoJzx0cj4nKS5jc3MoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJykuaHRtbCgnPHRkPk1lYXN1cmluZy4uLjwvdGQ+Jyk7XG4gICAgICAgICR0Ym9keS5hcHBlbmQoJG1lYXN1cmVtZW50X3Jvdyk7XG5cbiAgICAgICAgLy8gTWVhc3VyZSB0aGUgcm93IGhlaWdodFxuICAgICAgICBjb25zdCByb3dfaGVpZ2h0ID0gJG1lYXN1cmVtZW50X3Jvdy5vdXRlckhlaWdodCgpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBtZWFzdXJlbWVudCByb3dcbiAgICAgICAgJG1lYXN1cmVtZW50X3Jvdy5yZW1vdmUoKTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgYW5kIHNldCBtaW4taGVpZ2h0IGJhc2VkIG9uIHBlcl9wYWdlXG4gICAgICAgIGNvbnN0IG1pbl9oZWlnaHQgPSByb3dfaGVpZ2h0ICogdGhhdC5kYXRhLnBlcl9wYWdlO1xuICAgICAgICAkdGJvZHkuY3NzKCdtaW4taGVpZ2h0JywgbWluX2hlaWdodCArICdweCcpO1xuXG4gICAgICAgIC8vIFN0b3JlIGZvciBmdXR1cmUgcmVmZXJlbmNlXG4gICAgICAgIHRoYXQuZGF0YS5yb3dfaGVpZ2h0ID0gcm93X2hlaWdodDtcbiAgICAgICAgdGhhdC5kYXRhLnRib2R5X21pbl9oZWlnaHQgPSBtaW5faGVpZ2h0O1xuICAgIH1cblxuICAgIC8vIENsZWFyIGZpbHRlciBhbmQgcmVzZXQgdG8gcGFnZSAxXG4gICAgY2xlYXJfZmlsdGVyKCkge1xuICAgICAgICBsZXQgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgdGhhdC5kYXRhLmZpbHRlciA9ICcnO1xuXG4gICAgICAgIC8vIENsZWFyIHRoZSBmaWx0ZXIgaW5wdXRcbiAgICAgICAgY29uc3QgJGZpbHRlciA9IHRoYXQuJGlkKCdmaWx0ZXJfaW5wdXQnKTtcbiAgICAgICAgaWYgKCRmaWx0ZXIgJiYgJGZpbHRlci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAkZmlsdGVyLnZhbCgnJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWxvYWQgZnJvbSBwYWdlIDFcbiAgICAgICAgdGhhdC5sb2FkX3BhZ2UoMSk7XG4gICAgfVxufVxuIiwiY2xhc3MgQWN0aXZpdHlfRmVlZCBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIGFzeW5jIG9uX2xvYWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmFyZ3MuZGF0YV9zb3VyY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godGhpcy5hcmdzLmRhdGFfc291cmNlKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5hY3Rpdml0aWVzID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYXJncy5hY3Rpdml0aWVzKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEuYWN0aXZpdGllcyA9IHRoaXMuYXJncy5hY3Rpdml0aWVzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIC8vIE9wdGlvbmFsOiBBdXRvLXJlZnJlc2hcbiAgICAgICAgaWYgKHRoaXMuYXJncy5hdXRvX3JlZnJlc2gpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRfYXV0b19yZWZyZXNoKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGFydF9hdXRvX3JlZnJlc2goKSB7XG4gICAgICAgIGNvbnN0IGludGVydmFsID0gdGhpcy5hcmdzLnJlZnJlc2hfaW50ZXJ2YWwgfHwgMzAwMDA7IC8vIERlZmF1bHQgMzAgc2Vjb25kc1xuXG4gICAgICAgIHRoaXMucmVmcmVzaF90aW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVsb2FkX2RhdGEoKTtcbiAgICAgICAgfSwgaW50ZXJ2YWwpO1xuICAgIH1cblxuICAgIHN0b3BfYXV0b19yZWZyZXNoKCkge1xuICAgICAgICBpZiAodGhpcy5yZWZyZXNoX3RpbWVyKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMucmVmcmVzaF90aW1lcik7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hfdGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgcmVsb2FkX2RhdGEoKSB7XG4gICAgICAgIGlmICh0aGlzLmFyZ3MuZGF0YV9zb3VyY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godGhpcy5hcmdzLmRhdGFfc291cmNlKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5hY3Rpdml0aWVzID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImNsYXNzIEFjdG9yX1JlZmVyZW5jZSBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIC8vIFB1cmUgQm9vdHN0cmFwIHN0eWxpbmcgLSBubyBKYXZhU2NyaXB0IG5lZWRlZFxufVxuIiwiY2xhc3MgQWR2YW5jZWRfU2VhcmNoX1BhbmVsIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIC8vIFBvcHVsYXRlIGRyb3Bkb3ducyBpZiBwcm92aWRlZFxuICAgICAgICBpZiAodGhpcy5hcmdzLmNhdGVnb3JpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuJGlkKCdjYXRlZ29yeScpLnNldF9vcHRpb25zKHRoaXMuYXJncy5jYXRlZ29yaWVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFyZ3MudGFncykge1xuICAgICAgICAgICAgdGhpcy4kaWQoJ3RhZ3MnKS5zZXRfb3B0aW9ucyh0aGlzLmFyZ3MudGFncyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZWFyY2ggYnV0dG9uXG4gICAgICAgIHRoaXMuJGlkKCdzZWFyY2hfYnRuJykub24oJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMucGVyZm9ybV9zZWFyY2goKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVzZXQgYnV0dG9uXG4gICAgICAgIHRoaXMuJGlkKCdyZXNldF9idG4nKS5vbignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDbG9zZSBidXR0b25cbiAgICAgICAgdGhpcy4kaWQoJ2Nsb3NlX2J0bicpLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFyZ3Mub25fY2xvc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFyZ3Mub25fY2xvc2UoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kLmhpZGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRm9ybSBzdWJtaXRcbiAgICAgICAgdGhpcy4kaWQoJ3NlYXJjaF9mb3JtJykub24oJ3N1Ym1pdCcsIChlKSA9PiB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnBlcmZvcm1fc2VhcmNoKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHBlcmZvcm1fc2VhcmNoKCkge1xuICAgICAgICBjb25zdCBjcml0ZXJpYSA9IHtcbiAgICAgICAgICAgIGtleXdvcmRzOiB0aGlzLiRpZCgna2V5d29yZHMnKS5nZXRfdmFsdWUoKSxcbiAgICAgICAgICAgIGNhdGVnb3J5OiB0aGlzLiRpZCgnY2F0ZWdvcnknKS5nZXRfdmFsdWUoKSxcbiAgICAgICAgICAgIHRhZ3M6IHRoaXMuJGlkKCd0YWdzJykuZ2V0X3ZhbHVlKCksXG4gICAgICAgICAgICBmcm9tX2RhdGU6IHRoaXMuJGlkKCdmcm9tX2RhdGUnKS5nZXRfdmFsdWUoKSxcbiAgICAgICAgICAgIHRvX2RhdGU6IHRoaXMuJGlkKCd0b19kYXRlJykuZ2V0X3ZhbHVlKCksXG4gICAgICAgICAgICBzb3J0X2J5OiB0aGlzLiRpZCgnc29ydF9ieScpLnZhbCgpLFxuICAgICAgICAgICAgZXhhY3RfbWF0Y2g6IHRoaXMuJGlkKCdleGFjdF9tYXRjaCcpLmlzKCc6Y2hlY2tlZCcpXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUmVtb3ZlIGVtcHR5IHZhbHVlc1xuICAgICAgICBPYmplY3Qua2V5cyhjcml0ZXJpYSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjcml0ZXJpYVtrZXldIHx8IChpc19hcnJheShjcml0ZXJpYVtrZXldKSAmJiBjcml0ZXJpYVtrZXldLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgY3JpdGVyaWFba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuYXJncy5vbl9zZWFyY2gpIHtcbiAgICAgICAgICAgIHRoaXMuYXJncy5vbl9zZWFyY2goY3JpdGVyaWEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuJGlkKCdrZXl3b3JkcycpLnNldF92YWx1ZSgnJyk7XG4gICAgICAgIHRoaXMuJGlkKCdjYXRlZ29yeScpLnNldF92YWx1ZSgnJyk7XG4gICAgICAgIHRoaXMuJGlkKCd0YWdzJykuc2V0X3ZhbHVlKFtdKTtcbiAgICAgICAgdGhpcy4kaWQoJ2Zyb21fZGF0ZScpLnNldF92YWx1ZSgnJyk7XG4gICAgICAgIHRoaXMuJGlkKCd0b19kYXRlJykuc2V0X3ZhbHVlKCcnKTtcbiAgICAgICAgdGhpcy4kaWQoJ3NvcnRfYnknKS52YWwoJ3JlbGV2YW5jZScpO1xuICAgICAgICB0aGlzLiRpZCgnZXhhY3RfbWF0Y2gnKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xuXG4gICAgICAgIGlmICh0aGlzLmFyZ3Mub25fcmVzZXQpIHtcbiAgICAgICAgICAgIHRoaXMuYXJncy5vbl9yZXNldCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiY2xhc3MgQWxlcnRfQmFubmVyIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIC8vIEFwcGx5IHR5cGUgZnJvbSBhcmdzIChzdWNjZXNzLCBkYW5nZXIsIHdhcm5pbmcsIGluZm8pXG4gICAgICAgIGlmICh0aGlzLmFyZ3MudHlwZSkge1xuICAgICAgICAgICAgdGhpcy4kLnJlbW92ZUNsYXNzKCdhbGVydC1pbmZvJykuYWRkQ2xhc3MoYGFsZXJ0LSR7dGhpcy5hcmdzLnR5cGV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgZGlzbWlzc2libGUgaWYgbm90IG5lZWRlZFxuICAgICAgICBpZiAodGhpcy5hcmdzLmRpc21pc3NpYmxlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy4kLnJlbW92ZUNsYXNzKCdhbGVydC1kaXNtaXNzaWJsZScpO1xuICAgICAgICAgICAgdGhpcy4kLmZpbmQoJy5idG4tY2xvc2UnKS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImNsYXNzIEF2YXRhciBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBTZXQgc3JjIGZyb20gYXJnc1xuICAgICAgICBpZiAodGhpcy5hcmdzLnNyYykge1xuICAgICAgICAgICAgdGhpcy4kLmF0dHIoJ3NyYycsIHRoaXMuYXJncy5zcmMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHNpemUgKHhzLCBzbSwgbWQsIGxnLCB4bClcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuYXJncy5zaXplIHx8ICdtZCc7XG4gICAgICAgIGNvbnN0IHNpemVfbWFwID0ge1xuICAgICAgICAgICAgJ3hzJzogJzI0cHgnLFxuICAgICAgICAgICAgJ3NtJzogJzMycHgnLFxuICAgICAgICAgICAgJ21kJzogJzQ4cHgnLFxuICAgICAgICAgICAgJ2xnJzogJzY0cHgnLFxuICAgICAgICAgICAgJ3hsJzogJzk2cHgnXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy4kLmNzcyh7XG4gICAgICAgICAgICAnd2lkdGgnOiBzaXplX21hcFtzaXplXSxcbiAgICAgICAgICAgICdoZWlnaHQnOiBzaXplX21hcFtzaXplXSxcbiAgICAgICAgICAgICdvYmplY3QtZml0JzogJ2NvdmVyJ1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBbHRlcm5hdGl2ZSByZW5kZXJpbmc6IHNob3cgaW5pdGlhbHMgd2hlbiBubyBpbWFnZSBzb3VyY2UgcHJvdmlkZWRcbiAgICAgICAgaWYgKCF0aGlzLmFyZ3Muc3JjICYmIHRoaXMuYXJncy5uYW1lKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dfaW5pdGlhbHModGhpcy5hcmdzLm5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvd19pbml0aWFscyhuYW1lKSB7XG4gICAgICAgIC8vIENvbnZlcnQgaW1nIHRvIGRpdiB3aXRoIGluaXRpYWxzXG4gICAgICAgIGNvbnN0IGluaXRpYWxzID0gbmFtZS5zcGxpdCgnICcpLm1hcChuID0+IG5bMF0pLmpvaW4oJycpLnRvVXBwZXJDYXNlKCkuc2xpY2UoMCwgMik7XG4gICAgICAgIGNvbnN0ICRkaXYgPSAkKCc8ZGl2PicpXG4gICAgICAgICAgICAuYWRkQ2xhc3MoJ3JvdW5kZWQtY2lyY2xlIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBiZy1wcmltYXJ5IHRleHQtd2hpdGUgZnctYm9sZCcpXG4gICAgICAgICAgICAuY3NzKHtcbiAgICAgICAgICAgICAgICAnd2lkdGgnOiB0aGlzLiQuY3NzKCd3aWR0aCcpLFxuICAgICAgICAgICAgICAgICdoZWlnaHQnOiB0aGlzLiQuY3NzKCdoZWlnaHQnKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50ZXh0KGluaXRpYWxzKTtcblxuICAgICAgICB0aGlzLiQucmVwbGFjZVdpdGgoJGRpdik7XG4gICAgICAgIHRoaXMuJCA9ICRkaXY7XG4gICAgfVxufVxuIiwiY2xhc3MgQmxvY2txdW90ZSBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBObyBzcGVjaWFsIGJlaGF2aW9yXG4gICAgfVxufVxuIiwiY2xhc3MgQnJlYWRjcnVtYnMgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICAvLyBQbGFjZWhvbGRlciBjb21wb25lbnQgLSBjdXJyZW50bHkgZW1wdHkgaW4gZGFzaGJvYXJkIHVzYWdlXG59XG4iLCJjbGFzcyBCdWxrX0FjdGlvbl9CYXIgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgLy8gQ2xlYXIgc2VsZWN0aW9uIG9uIGNsb3NlXG4gICAgICAgIHRoaXMuJGlkKCdjbG9zZV9idG4nKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiQuaGlkZSgpO1xuICAgICAgICAgICAgLy8gVW5jaGVjayBhbGwgYm94ZXNcbiAgICAgICAgICAgIGNvbnN0ICR0YWJsZSA9IHRoaXMuJC5jbG9zZXN0KCcuY2FyZCcpLmZpbmQoJ3RhYmxlJyk7XG4gICAgICAgICAgICAkdGFibGUuZmluZCgnaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0X2NvdW50KGNvdW50KSB7XG4gICAgICAgIHRoaXMuJC5maW5kKCcuY291bnQnKS50ZXh0KGNvdW50KTtcbiAgICB9XG59XG4iLCJjbGFzcyBCdWxrX1NlbGVjdGlvbiBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICBjb25zdCAkY2hlY2tib3ggPSB0aGlzLiRpZCgnY2hlY2tib3gnKTtcblxuICAgICAgICAvLyBUb2dnbGUgYWxsIGNoZWNrYm94ZXMgaW4gdGFibGUgYm9keVxuICAgICAgICAkY2hlY2tib3gub24oJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjaGVja2VkID0gZS50YXJnZXQuY2hlY2tlZDtcbiAgICAgICAgICAgIGNvbnN0ICR0YWJsZSA9IHRoaXMuJC5jbG9zZXN0KCd0YWJsZScpO1xuICAgICAgICAgICAgJHRhYmxlLmZpbmQoJ3Rib2R5IGlucHV0W3R5cGU9XCJjaGVja2JveFwiXScpLnByb3AoJ2NoZWNrZWQnLCBjaGVja2VkKTtcblxuICAgICAgICAgICAgLy8gVHJpZ2dlciB1cGRhdGUgZXZlbnRcbiAgICAgICAgICAgIGlmICh0aGlzLmFyZ3Mub25fY2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcmdzLm9uX2NoYW5nZShjaGVja2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiY2xhc3MgQnV0dG9uX0dyb3VwIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgLy8gQ29udGFpbmVyIGZvciBncm91cGVkIGJ1dHRvbnMgd2l0aCBjb25uZWN0ZWQgYm9yZGVyc1xuICAgIC8vIEJvb3RzdHJhcCBidG4tZ3JvdXAgaGFuZGxlcyBhbGwgdmlzdWFsIGdyb3VwaW5nXG59XG4iLCJjbGFzcyBCdXR0b25fUHJpbWFyeSBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIC8vIFByaW1hcnkgYWN0aW9uIGJ1dHRvbiAtIGhpZ2hlc3QgdmlzdWFsIGhpZXJhcmNoeVxuICAgIC8vIEJvb3RzdHJhcCBidG4tcHJpbWFyeSBwcm92aWRlcyBhbGwgc3R5bGluZ1xufVxuIiwiY2xhc3MgQnV0dG9uX1NlY29uZGFyeSBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIC8vIFNlY29uZGFyeSBhY3Rpb24gYnV0dG9uIC0gbG93ZXIgcHJvbWluZW5jZSB0aGFuIHByaW1hcnlcbiAgICAvLyBCb290c3RyYXAgYnRuLXNlY29uZGFyeSBwcm92aWRlcyBncmF5IGNvbG9yIHNjaGVtZVxufVxuIiwiY2xhc3MgQnV0dG9uIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgLy8gQmFzZSBidXR0b24gY29tcG9uZW50IC0gbm8gc3BlY2lhbCBiZWhhdmlvciBuZWVkZWRcbiAgICAvLyBCb290c3RyYXAgaGFuZGxlcyBhbGwgc3RhdGVzIChob3ZlciwgYWN0aXZlLCBmb2N1cywgZGlzYWJsZWQpXG59XG4iLCJjbGFzcyBDYWxlbmRhcl9FdmVudCBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICBpZiAodGhpcy5hcmdzLm9uX2NsaWNrKSB7XG4gICAgICAgICAgICB0aGlzLiQub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYXJncy5vbl9jbGljayh0aGlzLmFyZ3MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIb3ZlciBlZmZlY3RcbiAgICAgICAgdGhpcy4kLm9uKCdtb3VzZWVudGVyJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4kLmFkZENsYXNzKCdzaGFkb3ctc20nKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy4kLm9uKCdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4kLnJlbW92ZUNsYXNzKCdzaGFkb3ctc20nKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiY2xhc3MgQ2FsZW5kYXJfR3JpZCBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRfZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRoaXMucmVuZGVyX2NhbGVuZGFyKCk7XG5cbiAgICAgICAgdGhpcy4kaWQoJ3ByZXZfYnRuJykub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50X2RhdGUuc2V0TW9udGgodGhpcy5jdXJyZW50X2RhdGUuZ2V0TW9udGgoKSAtIDEpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJfY2FsZW5kYXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy4kaWQoJ25leHRfYnRuJykub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50X2RhdGUuc2V0TW9udGgodGhpcy5jdXJyZW50X2RhdGUuZ2V0TW9udGgoKSArIDEpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJfY2FsZW5kYXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy4kaWQoJ3RvZGF5X2J0bicpLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudF9kYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyX2NhbGVuZGFyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbmRlcl9jYWxlbmRhcigpIHtcbiAgICAgICAgY29uc3QgeWVhciA9IHRoaXMuY3VycmVudF9kYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5jdXJyZW50X2RhdGUuZ2V0TW9udGgoKTtcblxuICAgICAgICAvLyBVcGRhdGUgdGl0bGVcbiAgICAgICAgY29uc3QgbW9udGhfbmFtZXMgPSBbJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLFxuICAgICAgICAgICAgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ107XG4gICAgICAgIHRoaXMuJGlkKCdtb250aF90aXRsZScpLnRleHQoYCR7bW9udGhfbmFtZXNbbW9udGhdfSAke3llYXJ9YCk7XG5cbiAgICAgICAgLy8gR2V0IGZpcnN0IGRheSBvZiBtb250aCBhbmQgdG90YWwgZGF5c1xuICAgICAgICBjb25zdCBmaXJzdF9kYXkgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSkuZ2V0RGF5KCk7XG4gICAgICAgIGNvbnN0IGRheXNfaW5fbW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIDApLmdldERhdGUoKTtcblxuICAgICAgICBjb25zdCAkdGJvZHkgPSB0aGlzLiRpZCgnY2FsZW5kYXJfYm9keScpO1xuICAgICAgICAkdGJvZHkuZW1wdHkoKTtcblxuICAgICAgICBsZXQgZGF5ID0gMTtcbiAgICAgICAgbGV0ICR0ciA9IG51bGw7XG5cbiAgICAgICAgLy8gQnVpbGQgY2FsZW5kYXIgZ3JpZFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgICAgICAgICAgJHRyID0gJCgnPHRyPicpO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDc7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0ICR0ZCA9ICQoJzx0ZD4nKS5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAnaGVpZ2h0JzogJzEwMHB4JyxcbiAgICAgICAgICAgICAgICAgICAgJ3ZlcnRpY2FsLWFsaWduJzogJ3RvcCcsXG4gICAgICAgICAgICAgICAgICAgICdwYWRkaW5nJzogJzhweCdcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChpID09PSAwICYmIGogPCBmaXJzdF9kYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRW1wdHkgY2VsbCBiZWZvcmUgbW9udGggc3RhcnRzXG4gICAgICAgICAgICAgICAgICAgICR0ZC5hZGRDbGFzcygnYmctbGlnaHQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRheSA+IGRheXNfaW5fbW9udGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRW1wdHkgY2VsbCBhZnRlciBtb250aCBlbmRzXG4gICAgICAgICAgICAgICAgICAgICR0ZC5hZGRDbGFzcygnYmctbGlnaHQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBEYXkgY2VsbFxuICAgICAgICAgICAgICAgICAgICBjb25zdCAkZGF5X251bSA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ2Z3LWJvbGQgbWItMicpLnRleHQoZGF5KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBIaWdobGlnaHQgdG9kYXlcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF5ID09PSB0b2RheS5nZXREYXRlKCkgJiYgbW9udGggPT09IHRvZGF5LmdldE1vbnRoKCkgJiYgeWVhciA9PT0gdG9kYXkuZ2V0RnVsbFllYXIoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGRheV9udW0uYWRkQ2xhc3MoJ3RleHQtcHJpbWFyeScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgJHRkLmFkZENsYXNzKCdib3JkZXItcHJpbWFyeScpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgJHRkLmFwcGVuZCgkZGF5X251bSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGV2ZW50cyBmb3IgdGhpcyBkYXkgaWYgcHJvdmlkZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXJncy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMuZ2V0X2V2ZW50c19mb3JfZGF0ZSh5ZWFyLCBtb250aCwgZGF5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5mb3JFYWNoKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkZXZlbnQgPSAkKCc8ZGl2PicpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnYmFkZ2UgYmctcHJpbWFyeSB0ZXh0LXRydW5jYXRlIHctMTAwIG1iLTEgdGV4dC1zdGFydCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jc3MoJ2N1cnNvcicsICdwb2ludGVyJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQoZXZlbnQudGl0bGUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50Lm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXJncy5vbl9ldmVudF9jbGljaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcmdzLm9uX2V2ZW50X2NsaWNrKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRkLmFwcGVuZCgkZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAkdGQuYXR0cignZGF0YS1kYXRlJywgYCR7eWVhcn0tJHtzdHIobW9udGggKyAxKS5wYWRTdGFydCgyLCAnMCcpfS0ke3N0cihkYXkpLnBhZFN0YXJ0KDIsICcwJyl9YCk7XG4gICAgICAgICAgICAgICAgICAgICR0ZC5jc3MoJ2N1cnNvcicsICdwb2ludGVyJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgJHRkLm9uKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hcmdzLm9uX2RhdGVfY2xpY2sgJiYgISQoZS50YXJnZXQpLmhhc0NsYXNzKCdiYWRnZScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcmdzLm9uX2RhdGVfY2xpY2soJHRkLmF0dHIoJ2RhdGEtZGF0ZScpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgZGF5Kys7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgJHRyLmFwcGVuZCgkdGQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAkdGJvZHkuYXBwZW5kKCR0cik7XG5cbiAgICAgICAgICAgIGlmIChkYXkgPiBkYXlzX2luX21vbnRoKSBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldF9ldmVudHNfZm9yX2RhdGUoeWVhciwgbW9udGgsIGRheSkge1xuICAgICAgICBpZiAoIXRoaXMuYXJncy5ldmVudHMpIHJldHVybiBbXTtcblxuICAgICAgICBjb25zdCBkYXRlX3N0ciA9IGAke3llYXJ9LSR7c3RyKG1vbnRoICsgMSkucGFkU3RhcnQoMiwgJzAnKX0tJHtzdHIoZGF5KS5wYWRTdGFydCgyLCAnMCcpfWA7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXJncy5ldmVudHMuZmlsdGVyKGV2ZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBldmVudC5kYXRlID09PSBkYXRlX3N0cjtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiLyoqXG4gKiBDYXJkIC0gQm9vdHN0cmFwIDUgQ29udGVudCBDb250YWluZXIgQ29tcG9uZW50XG4gKlxuICogUHVycG9zZTogUHJpbWFyeSBjb250ZW50IGNvbnRhaW5lciB1c2luZyBCb290c3RyYXAgLmNhcmQgY2xhc3NcbiAqIERlc2lnbjogUHVyZSBCb290c3RyYXAgLSBib3JkZXItMCB3aXRoIHNoYWRvdyBmb3IgbW9kZXJuIFZvbHQgYWVzdGhldGljXG4gKi9cbmNsYXNzIENhcmQgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICAvLyBDYXJkIGlzIGEgcHVyZSBjb250YWluZXIgY29tcG9uZW50IC0gbm8gbGlmZWN5Y2xlIG1ldGhvZHMgbmVlZGVkXG4gICAgLy8gQWxsIHN0eWxpbmcgY29tZXMgZnJvbSBCb290c3RyYXAgY2xhc3NlczogY2FyZCwgYm9yZGVyLTAsIHNoYWRvd1xufVxuIiwiY2xhc3MgQ2hhcnRfQ29tcG9uZW50IGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgLy8gUGxhY2Vob2xkZXIgY29tcG9uZW50IC0gbm8gZnVuY3Rpb25hbGl0eSB5ZXRcbn1cbiIsIi8qKlxuICogQ2hlY2tib3ggLSBCb290c3RyYXAgNSBDaGVja2JveCBJbnB1dCBDb21wb25lbnRcbiAqXG4gKiBQdXJwb3NlOiBTaW5nbGUgY2hlY2tib3ggZm9yIHllcy9ubywgdHJ1ZS9mYWxzZSBzZWxlY3Rpb25zXG4gKiBEZXNpZ246IEJvb3RzdHJhcCAuZm9ybS1jaGVjay1pbnB1dCBzdHlsaW5nXG4gKiBXcmFwcGVyOiBUeXBpY2FsbHkgdXNlZCB3aXRoaW4gPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIj4gZm9yIHByb3BlciBsYXlvdXRcbiAqL1xuY2xhc3MgQ2hlY2tib3ggZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgLy8gU2V0IGNoZWNrZWQgc3RhdGUgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKHRoaXMuYXJncy5jaGVja2VkKSB7XG4gICAgICAgICAgICB0aGlzLiQucHJvcCgnY2hlY2tlZCcsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHZhbHVlIGlmIHByb3ZpZGVkXG4gICAgICAgIGlmICh0aGlzLmFyZ3MudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuJC52YWwodGhpcy5hcmdzLnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBjdXN0b20gY2xhc3NlcyBpZiBwcm92aWRlZFxuICAgICAgICBpZiAodGhpcy5hcmdzLmNsYXNzKSB7XG4gICAgICAgICAgICB0aGlzLiQuYWRkQ2xhc3ModGhpcy5hcmdzLmNsYXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBkaXNhYmxlZCBzdGF0ZSBpZiBwcm92aWRlZFxuICAgICAgICBpZiAodGhpcy5hcmdzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLiQucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCByZXF1aXJlZCBhdHRyaWJ1dGUgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKHRoaXMuYXJncy5yZXF1aXJlZCkge1xuICAgICAgICAgICAgdGhpcy4kLnByb3AoJ3JlcXVpcmVkJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJjbGFzcyBDb2RlX0Jsb2NrIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIC8vIE5vIHNwZWNpYWwgYmVoYXZpb3IgKHN5bnRheCBoaWdobGlnaHRpbmcgY291bGQgYmUgYWRkZWQgbGF0ZXIpXG4gICAgfVxufVxuIiwiY2xhc3MgQ29sdW1uX1Zpc2liaWxpdHlfVG9nZ2xlIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIC8vIEJ1aWxkIGNvbHVtbiBjaGVja2JveGVzXG4gICAgICAgIGlmICh0aGlzLmFyZ3MuY29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5idWlsZF9tZW51KHRoaXMuYXJncy5jb2x1bW5zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJ1aWxkX21lbnUoY29sdW1ucykge1xuICAgICAgICBjb25zdCAkbWVudSA9IHRoaXMuJGlkKCdtZW51Jyk7XG4gICAgICAgICRtZW51LmVtcHR5KCk7XG5cbiAgICAgICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCAkbGkgPSAkKCc8bGk+Jyk7XG4gICAgICAgICAgICBjb25zdCAkbGFiZWwgPSAkKCc8bGFiZWw+JykuYWRkQ2xhc3MoJ2Ryb3Bkb3duLWl0ZW0nKTtcbiAgICAgICAgICAgIGNvbnN0ICRjaGVja2JveCA9ICQoJzxpbnB1dD4nKVxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZm9ybS1jaGVjay1pbnB1dCBtZS0yJylcbiAgICAgICAgICAgICAgICAuYXR0cigndHlwZScsICdjaGVja2JveCcpXG4gICAgICAgICAgICAgICAgLnByb3AoJ2NoZWNrZWQnLCBjb2x1bW4udmlzaWJsZSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2RhdGEtY29sdW1uLWluZGV4JywgaW5kZXgpO1xuXG4gICAgICAgICAgICAkbGFiZWwuYXBwZW5kKCRjaGVja2JveCkuYXBwZW5kKGNvbHVtbi5sYWJlbCB8fCBjb2x1bW4ubmFtZSk7XG4gICAgICAgICAgICAkbGkuYXBwZW5kKCRsYWJlbCk7XG4gICAgICAgICAgICAkbWVudS5hcHBlbmQoJGxpKTtcblxuICAgICAgICAgICAgJGNoZWNrYm94Lm9uKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlX2NvbHVtbihpbmRleCwgZS50YXJnZXQuY2hlY2tlZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdG9nZ2xlX2NvbHVtbihpbmRleCwgdmlzaWJsZSkge1xuICAgICAgICBpZiAodGhpcy5hcmdzLm9uX3RvZ2dsZSkge1xuICAgICAgICAgICAgdGhpcy5hcmdzLm9uX3RvZ2dsZShpbmRleCwgdmlzaWJsZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaW5kIHRhYmxlIGFuZCB0b2dnbGUgY29sdW1uIHZpc2liaWxpdHlcbiAgICAgICAgY29uc3QgJHRhYmxlID0gdGhpcy5hcmdzLnRhYmxlID8gJCh0aGlzLmFyZ3MudGFibGUpIDogdGhpcy4kLmNsb3Nlc3QoJy5jYXJkJykuZmluZCgndGFibGUnKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBgdGg6bnRoLWNoaWxkKCR7aW5kZXggKyAxfSksIHRkOm50aC1jaGlsZCgke2luZGV4ICsgMX0pYDtcblxuICAgICAgICBpZiAodmlzaWJsZSkge1xuICAgICAgICAgICAgJHRhYmxlLmZpbmQoc2VsZWN0b3IpLnNob3coKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICR0YWJsZS5maW5kKHNlbGVjdG9yKS5oaWRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRfY29sdW1ucyhjb2x1bW5zKSB7XG4gICAgICAgIHRoaXMuYnVpbGRfbWVudShjb2x1bW5zKTtcbiAgICB9XG59XG4iLCJjbGFzcyBDb21tZW50X1RocmVhZCBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIGFzeW5jIG9uX2xvYWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmFyZ3MuZGF0YV9zb3VyY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godGhpcy5hcmdzLmRhdGFfc291cmNlKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5jb21tZW50cyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmFyZ3MuY29tbWVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5jb21tZW50cyA9IHRoaXMuYXJncy5jb21tZW50cztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBTdWJtaXQgbmV3IGNvbW1lbnRcbiAgICAgICAgdGhpcy4kaWQoJ3N1Ym1pdF9idG4nKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdF9jb21tZW50KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlcGx5IGJ1dHRvbnNcbiAgICAgICAgdGhpcy4kLmZpbmQoJy5yZXBseS1idG4nKS5vbignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgJGNvbW1lbnQgPSAkKGUudGFyZ2V0KS5jbG9zZXN0KCdbZGF0YS1jb21tZW50LWlkXScpO1xuICAgICAgICAgICAgY29uc3QgY29tbWVudF9pZCA9ICRjb21tZW50LmF0dHIoJ2RhdGEtY29tbWVudC1pZCcpO1xuICAgICAgICAgICAgdGhpcy5zaG93X3JlcGx5X2Zvcm0oY29tbWVudF9pZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEVkaXQgYnV0dG9uc1xuICAgICAgICB0aGlzLiQuZmluZCgnLmVkaXQtYnRuJykub24oJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0ICRjb21tZW50ID0gJChlLnRhcmdldCkuY2xvc2VzdCgnW2RhdGEtY29tbWVudC1pZF0nKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRfaWQgPSAkY29tbWVudC5hdHRyKCdkYXRhLWNvbW1lbnQtaWQnKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdF9jb21tZW50KGNvbW1lbnRfaWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBEZWxldGUgYnV0dG9uc1xuICAgICAgICB0aGlzLiQuZmluZCgnLmRlbGV0ZS1idG4nKS5vbignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgJGNvbW1lbnQgPSAkKGUudGFyZ2V0KS5jbG9zZXN0KCdbZGF0YS1jb21tZW50LWlkXScpO1xuICAgICAgICAgICAgY29uc3QgY29tbWVudF9pZCA9ICRjb21tZW50LmF0dHIoJ2RhdGEtY29tbWVudC1pZCcpO1xuICAgICAgICAgICAgdGhpcy5kZWxldGVfY29tbWVudChjb21tZW50X2lkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc3VibWl0X2NvbW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLiRpZCgnY29tbWVudF9pbnB1dCcpLnZhbCgpLnRyaW0oKTtcbiAgICAgICAgaWYgKCF0ZXh0KSByZXR1cm47XG5cbiAgICAgICAgaWYgKHRoaXMuYXJncy5vbl9zdWJtaXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXJncy5vbl9zdWJtaXQodGV4dCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kaWQoJ2NvbW1lbnRfaW5wdXQnKS52YWwoJycpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVsb2FkX2RhdGEoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNob3dfcmVwbHlfZm9ybShjb21tZW50X2lkKSB7XG4gICAgICAgIC8vIFRPRE86IEltcGxlbWVudCByZXBseSBmb3JtIFVJXG4gICAgICAgIGNvbnNvbGUubG9nKCdSZXBseSB0byBjb21tZW50OicsIGNvbW1lbnRfaWQpO1xuICAgIH1cblxuICAgIGVkaXRfY29tbWVudChjb21tZW50X2lkKSB7XG4gICAgICAgIGlmICh0aGlzLmFyZ3Mub25fZWRpdCkge1xuICAgICAgICAgICAgdGhpcy5hcmdzLm9uX2VkaXQoY29tbWVudF9pZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGVfY29tbWVudChjb21tZW50X2lkKSB7XG4gICAgICAgIGlmICghY29uZmlybSgnRGVsZXRlIHRoaXMgY29tbWVudD8nKSkgcmV0dXJuO1xuXG4gICAgICAgIGlmICh0aGlzLmFyZ3Mub25fZGVsZXRlKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFyZ3Mub25fZGVsZXRlKGNvbW1lbnRfaWQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVsb2FkX2RhdGEoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHJlbG9hZF9kYXRhKCkge1xuICAgICAgICBpZiAodGhpcy5hcmdzLmRhdGFfc291cmNlKSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHRoaXMuYXJncy5kYXRhX3NvdXJjZSk7XG4gICAgICAgICAgICB0aGlzLmRhdGEuY29tbWVudHMgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiY2xhc3MgRGF0ZV9QaWNrZXIgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgY29uc3QgJGlucHV0ID0gdGhpcy4kaWQoJ2lucHV0Jyk7XG5cbiAgICAgICAgaWYgKHRoaXMuYXJncy52YWx1ZSkge1xuICAgICAgICAgICAgJGlucHV0LnZhbCh0aGlzLmFyZ3MudmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYXJncy5uYW1lKSB7XG4gICAgICAgICAgICAkaW5wdXQuYXR0cignbmFtZScsIHRoaXMuYXJncy5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFyZ3MubWluKSB7XG4gICAgICAgICAgICAkaW5wdXQuYXR0cignbWluJywgdGhpcy5hcmdzLm1pbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcmdzLm1heCkge1xuICAgICAgICAgICAgJGlucHV0LmF0dHIoJ21heCcsIHRoaXMuYXJncy5tYXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYXJncy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgJGlucHV0LnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcmdzLnJlYWRvbmx5KSB7XG4gICAgICAgICAgICAkaW5wdXQucHJvcCgncmVhZG9ubHknLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFyZ3MucmVxdWlyZWQpIHtcbiAgICAgICAgICAgICRpbnB1dC5wcm9wKCdyZXF1aXJlZCcsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYXJncy5vbl9jaGFuZ2UpIHtcbiAgICAgICAgICAgICRpbnB1dC5vbignY2hhbmdlJywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFyZ3Mub25fY2hhbmdlKGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0X3ZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4kaWQoJ2lucHV0JykudmFsKCk7XG4gICAgfVxuXG4gICAgc2V0X3ZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuJGlkKCdpbnB1dCcpLnZhbCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgZm9jdXMoKSB7XG4gICAgICAgIHRoaXMuJGlkKCdpbnB1dCcpLmZvY3VzKCk7XG4gICAgfVxufVxuIiwiY2xhc3MgRHJvcGRvd25fTWVudSBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBXcmFwIGJhcmUgdGV4dCBjaGlsZHJlbiBpbiA8bGk+PGE+IHN0cnVjdHVyZVxuICAgICAgICBjb25zdCAkbWVudSA9IHRoaXMuJGlkKCdtZW51Jyk7XG4gICAgICAgICRtZW51LmNoaWxkcmVuKCkuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNvbnN0ICRjaGlsZCA9ICQodGhpcyk7XG4gICAgICAgICAgICBpZiAoJGNoaWxkLnByb3AoJ3RhZ05hbWUnKSAhPT0gJ0xJJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSAkY2hpbGQudGV4dCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhyZWYgPSAkY2hpbGQuYXR0cignaHJlZicpIHx8ICcjJztcbiAgICAgICAgICAgICAgICBjb25zdCAkbGkgPSAkKCc8bGk+JykuYXBwZW5kKFxuICAgICAgICAgICAgICAgICAgICAkKCc8YT4nKS5hZGRDbGFzcygnZHJvcGRvd24taXRlbScpLmF0dHIoJ2hyZWYnLCBocmVmKS50ZXh0KHRleHQpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAkY2hpbGQucmVwbGFjZVdpdGgoJGxpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiY2xhc3MgRW1wdHlfU3RhdGUgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgLy8gTm8gc3BlY2lhbCBiZWhhdmlvclxuICAgIH1cbn1cbiIsImNsYXNzIEV4cG9ydF9CdXR0b24gZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgICAgIHRoaXMuJC5maW5kKCdbZGF0YS1mb3JtYXRdJykub24oJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdCA9ICQoZS5jdXJyZW50VGFyZ2V0KS5hdHRyKCdkYXRhLWZvcm1hdCcpO1xuICAgICAgICAgICAgdGhhdC5leHBvcnRfZGF0YShmb3JtYXQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBleHBvcnRfZGF0YShmb3JtYXQpIHtcbiAgICAgICAgaWYgKHRoaXMuYXJncy5vbl9leHBvcnQpIHtcbiAgICAgICAgICAgIC8vIEN1c3RvbSBleHBvcnQgaGFuZGxlclxuICAgICAgICAgICAgdGhpcy5hcmdzLm9uX2V4cG9ydChmb3JtYXQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYXJncy5kYXRhKSB7XG4gICAgICAgICAgICAvLyBBdXRvLWV4cG9ydCBwcm92aWRlZCBkYXRhXG4gICAgICAgICAgICB0aGlzLmF1dG9fZXhwb3J0KGZvcm1hdCwgdGhpcy5hcmdzLmRhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYXJncy5leHBvcnRfdXJsKSB7XG4gICAgICAgICAgICAvLyBGZXRjaCBleHBvcnQgZnJvbSBVUkxcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXJncy5leHBvcnRfdXJsfT9mb3JtYXQ9JHtmb3JtYXR9YDtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXV0b19leHBvcnQoZm9ybWF0LCBkYXRhKSB7XG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdjc3YnKSB7XG4gICAgICAgICAgICB0aGlzLmV4cG9ydF9jc3YoZGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwb3J0X2pzb24oZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0F1dG8tZXhwb3J0IG9ubHkgc3VwcG9ydHMgQ1NWIGFuZCBKU09OLiBJbXBsZW1lbnQgY3VzdG9tIGhhbmRsZXIgZm9yIG90aGVyIGZvcm1hdHMuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBleHBvcnRfY3N2KGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgQ1NWXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBPYmplY3Qua2V5cyhkYXRhWzBdKTtcbiAgICAgICAgbGV0IGNzdiA9IGhlYWRlcnMuam9pbignLCcpICsgJ1xcbic7XG5cbiAgICAgICAgZGF0YS5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBoZWFkZXJzLm1hcChoZWFkZXIgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcm93W2hlYWRlcl0gfHwgJyc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBcIiR7c3RyKHZhbHVlKS5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY3N2ICs9IHZhbHVlcy5qb2luKCcsJykgKyAnXFxuJztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRG93bmxvYWRcbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjc3ZdLCB7IHR5cGU6ICd0ZXh0L2NzdicgfSk7XG4gICAgICAgIGNvbnN0IHVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICBjb25zdCAkYSA9ICQoJzxhPicpO1xuICAgICAgICAkYS5hdHRyKCdocmVmJywgdXJsKTtcbiAgICAgICAgJGEuYXR0cignZG93bmxvYWQnLCBgZXhwb3J0XyR7RGF0ZS5ub3coKX0uY3N2YCk7XG4gICAgICAgICRhWzBdLmNsaWNrKCk7XG4gICAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgfVxuXG4gICAgZXhwb3J0X2pzb24oZGF0YSkge1xuICAgICAgICBjb25zdCBqc29uID0ganNvbl9lbmNvZGUoZGF0YSk7XG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbanNvbl0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICAgICAgICBjb25zdCB1cmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgICAgY29uc3QgJGEgPSAkKCc8YT4nKTtcbiAgICAgICAgJGEuYXR0cignaHJlZicsIHVybCk7XG4gICAgICAgICRhLmF0dHIoJ2Rvd25sb2FkJywgYGV4cG9ydF8ke0RhdGUubm93KCl9Lmpzb25gKTtcbiAgICAgICAgJGFbMF0uY2xpY2soKTtcbiAgICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICB9XG59XG4iLCJjbGFzcyBGaWxlX1VwbG9hZCBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICBjb25zdCAkaW5wdXQgPSB0aGlzLiRpZCgnZmlsZV9pbnB1dCcpO1xuICAgICAgICBjb25zdCAkZHJvcF96b25lID0gdGhpcy4kaWQoJ2Ryb3Bfem9uZScpO1xuXG4gICAgICAgIGlmICh0aGlzLmFyZ3MuYWNjZXB0KSB7XG4gICAgICAgICAgICAkaW5wdXQuYXR0cignYWNjZXB0JywgdGhpcy5hcmdzLmFjY2VwdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcmdzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICAkaW5wdXQuYXR0cignbXVsdGlwbGUnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsaWNrIHRvIHVwbG9hZFxuICAgICAgICAkZHJvcF96b25lLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICRpbnB1dC5jbGljaygpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBGaWxlIHNlbGVjdGVkXG4gICAgICAgICRpbnB1dC5vbignY2hhbmdlJywgKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gZS50YXJnZXQuZmlsZXM7XG4gICAgICAgICAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlX2ZpbGVzKGZpbGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRHJhZyBhbmQgZHJvcFxuICAgICAgICAkZHJvcF96b25lLm9uKCdkcmFnb3ZlcicsIChlKSA9PiB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgJGRyb3Bfem9uZS5hZGRDbGFzcygnYm9yZGVyLXByaW1hcnkgYmctbGlnaHQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJGRyb3Bfem9uZS5vbignZHJhZ2xlYXZlJywgKGUpID0+IHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAkZHJvcF96b25lLnJlbW92ZUNsYXNzKCdib3JkZXItcHJpbWFyeSBiZy1saWdodCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICAkZHJvcF96b25lLm9uKCdkcm9wJywgKGUpID0+IHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAkZHJvcF96b25lLnJlbW92ZUNsYXNzKCdib3JkZXItcHJpbWFyeSBiZy1saWdodCcpO1xuXG4gICAgICAgICAgICBjb25zdCBmaWxlcyA9IGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIuZmlsZXM7XG4gICAgICAgICAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlX2ZpbGVzKGZpbGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGJ1dHRvblxuICAgICAgICB0aGlzLiRpZCgncmVtb3ZlX2J0bicpLm9uKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBoYW5kbGVfZmlsZXMoZmlsZXMpIHtcbiAgICAgICAgY29uc3QgZmlsZSA9IGZpbGVzWzBdOyAvLyBTaW5nbGUgZmlsZSBmb3Igbm93XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZmlsZSBzaXplXG4gICAgICAgIGlmICh0aGlzLmFyZ3MubWF4X3NpemVfYnl0ZXMgJiYgZmlsZS5zaXplID4gdGhpcy5hcmdzLm1heF9zaXplX2J5dGVzKSB7XG4gICAgICAgICAgICBhbGVydChgRmlsZSBpcyB0b28gbGFyZ2UuIE1heCBzaXplIGlzICR7dGhpcy5mb3JtYXRfc2l6ZSh0aGlzLmFyZ3MubWF4X3NpemVfYnl0ZXMpfWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZF9maWxlID0gZmlsZTtcblxuICAgICAgICAvLyBTaG93IGZpbGUgaW5mb1xuICAgICAgICB0aGlzLiRpZCgncGxhY2Vob2xkZXInKS5oaWRlKCk7XG4gICAgICAgIHRoaXMuJGlkKCdmaWxlX2luZm8nKS5zaG93KCk7XG4gICAgICAgIHRoaXMuJGlkKCdmaWxlX25hbWUnKS50ZXh0KGZpbGUubmFtZSk7XG4gICAgICAgIHRoaXMuJGlkKCdmaWxlX3NpemUnKS50ZXh0KHRoaXMuZm9ybWF0X3NpemUoZmlsZS5zaXplKSk7XG5cbiAgICAgICAgLy8gQXV0by11cGxvYWQgaWYgZW5kcG9pbnQgcHJvdmlkZWRcbiAgICAgICAgaWYgKHRoaXMuYXJncy51cGxvYWRfdXJsKSB7XG4gICAgICAgICAgICB0aGlzLnVwbG9hZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpZ2dlciBjYWxsYmFja1xuICAgICAgICBpZiAodGhpcy5hcmdzLm9uX3NlbGVjdCkge1xuICAgICAgICAgICAgdGhpcy5hcmdzLm9uX3NlbGVjdChmaWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHVwbG9hZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkX2ZpbGUgfHwgIXRoaXMuYXJncy51cGxvYWRfdXJsKSByZXR1cm47XG5cbiAgICAgICAgLy8gU2hvdyBwcm9ncmVzc1xuICAgICAgICB0aGlzLiRpZCgnZmlsZV9pbmZvJykuaGlkZSgpO1xuICAgICAgICB0aGlzLiRpZCgncHJvZ3Jlc3MnKS5zaG93KCk7XG5cbiAgICAgICAgY29uc3QgZm9ybV9kYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgIGZvcm1fZGF0YS5hcHBlbmQoJ2ZpbGUnLCB0aGlzLnNlbGVjdGVkX2ZpbGUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHRoaXMuYXJncy51cGxvYWRfdXJsLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgYm9keTogZm9ybV9kYXRhXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAgICAgICAvLyBIaWRlIHByb2dyZXNzXG4gICAgICAgICAgICB0aGlzLiRpZCgncHJvZ3Jlc3MnKS5oaWRlKCk7XG4gICAgICAgICAgICB0aGlzLiRpZCgnZmlsZV9pbmZvJykuc2hvdygpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5hcmdzLm9uX3VwbG9hZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXJncy5vbl91cGxvYWQocmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGFsZXJ0KCdVcGxvYWQgZmFpbGVkOiAnICsgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB0aGlzLiRpZCgncHJvZ3Jlc3MnKS5oaWRlKCk7XG4gICAgICAgICAgICB0aGlzLiRpZCgncGxhY2Vob2xkZXInKS5zaG93KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZF9maWxlID0gbnVsbDtcbiAgICAgICAgdGhpcy4kaWQoJ2ZpbGVfaW5wdXQnKS52YWwoJycpO1xuICAgICAgICB0aGlzLiRpZCgnZmlsZV9pbmZvJykuaGlkZSgpO1xuICAgICAgICB0aGlzLiRpZCgncHJvZ3Jlc3MnKS5oaWRlKCk7XG4gICAgICAgIHRoaXMuJGlkKCdwbGFjZWhvbGRlcicpLnNob3coKTtcblxuICAgICAgICBpZiAodGhpcy5hcmdzLm9uX2NsZWFyKSB7XG4gICAgICAgICAgICB0aGlzLmFyZ3Mub25fY2xlYXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldF9maWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZF9maWxlO1xuICAgIH1cblxuICAgIGZvcm1hdF9zaXplKGJ5dGVzKSB7XG4gICAgICAgIGlmIChieXRlcyA8IDEwMjQpIHJldHVybiBieXRlcyArICcgQic7XG4gICAgICAgIGlmIChieXRlcyA8IDEwMjQgKiAxMDI0KSByZXR1cm4gKGJ5dGVzIC8gMTAyNCkudG9GaXhlZCgxKSArICcgS0InO1xuICAgICAgICByZXR1cm4gKGJ5dGVzIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCgxKSArICcgTUInO1xuICAgIH1cbn1cbiIsImNsYXNzIEZpbHRlcl9CYXIgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVfZmlsdGVycyA9IHt9O1xuXG4gICAgICAgIC8vIFBvcHVsYXRlIHN0YXR1cyBvcHRpb25zIGlmIHByb3ZpZGVkXG4gICAgICAgIGlmICh0aGlzLmFyZ3Muc3RhdHVzX29wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0ICRzdGF0dXMgPSB0aGlzLiRpZCgnc3RhdHVzJyk7XG4gICAgICAgICAgICB0aGlzLmFyZ3Muc3RhdHVzX29wdGlvbnMuZm9yRWFjaChvcHQgPT4ge1xuICAgICAgICAgICAgICAgICRzdGF0dXMuYXBwZW5kKCQoJzxvcHRpb24+JykudmFsKG9wdC52YWx1ZSkudGV4dChvcHQubGFiZWwpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGF0ZSByYW5nZSBjaGFuZ2UgaGFuZGxlclxuICAgICAgICB0aGlzLiRpZCgnZGF0ZV9yYW5nZScpLm9uKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUudGFyZ2V0LnZhbHVlID09PSAnY3VzdG9tJykge1xuICAgICAgICAgICAgICAgIHRoaXMuJGlkKCdjdXN0b21fZGF0ZXMnKS5zaG93KCk7XG4gICAgICAgICAgICAgICAgdGhpcy4kaWQoJ2N1c3RvbV9kYXRlc19lbmQnKS5zaG93KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuJGlkKCdjdXN0b21fZGF0ZXMnKS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy4kaWQoJ2N1c3RvbV9kYXRlc19lbmQnKS5oaWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNlYXJjaCB3aXRoIGRlYm91bmNlXG4gICAgICAgIGxldCBzZWFyY2hfdGltZW91dDtcbiAgICAgICAgdGhpcy4kaWQoJ3NlYXJjaCcpLiQuZmluZCgnaW5wdXQnKS5vbignaW5wdXQnLCAoZSkgPT4ge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHNlYXJjaF90aW1lb3V0KTtcbiAgICAgICAgICAgIHNlYXJjaF90aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRfZmlsdGVyKCdzZWFyY2gnLCBlLnRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBcHBseSBidXR0b25cbiAgICAgICAgdGhpcy4kaWQoJ2FwcGx5X2J0bicpLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlfZmlsdGVycygpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDbGVhciBidXR0b25cbiAgICAgICAgdGhpcy4kaWQoJ2NsZWFyX2J0bicpLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJfZmlsdGVycygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhZGRfZmlsdGVyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZV9maWx0ZXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmFjdGl2ZV9maWx0ZXJzW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVfZmlsdGVyX2Rpc3BsYXkoKTtcbiAgICB9XG5cbiAgICBhcHBseV9maWx0ZXJzKCkge1xuICAgICAgICAvLyBDb2xsZWN0IGFsbCBmaWx0ZXIgdmFsdWVzXG4gICAgICAgIGNvbnN0IHNlYXJjaCA9IHRoaXMuJGlkKCdzZWFyY2gnKS5nZXRfdmFsdWUoKTtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy4kaWQoJ3N0YXR1cycpLnZhbCgpO1xuICAgICAgICBjb25zdCBkYXRlX3JhbmdlID0gdGhpcy4kaWQoJ2RhdGVfcmFuZ2UnKS52YWwoKTtcblxuICAgICAgICB0aGlzLmFjdGl2ZV9maWx0ZXJzID0ge307XG5cbiAgICAgICAgaWYgKHNlYXJjaCkgdGhpcy5hY3RpdmVfZmlsdGVycy5zZWFyY2ggPSBzZWFyY2g7XG4gICAgICAgIGlmIChzdGF0dXMpIHRoaXMuYWN0aXZlX2ZpbHRlcnMuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICBpZiAoZGF0ZV9yYW5nZSkgdGhpcy5hY3RpdmVfZmlsdGVycy5kYXRlX3JhbmdlID0gZGF0ZV9yYW5nZTtcblxuICAgICAgICBpZiAoZGF0ZV9yYW5nZSA9PT0gJ2N1c3RvbScpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0X2RhdGUgPSB0aGlzLiRpZCgnc3RhcnRfZGF0ZScpLmdldF92YWx1ZSgpO1xuICAgICAgICAgICAgY29uc3QgZW5kX2RhdGUgPSB0aGlzLiRpZCgnZW5kX2RhdGUnKS5nZXRfdmFsdWUoKTtcbiAgICAgICAgICAgIGlmIChzdGFydF9kYXRlKSB0aGlzLmFjdGl2ZV9maWx0ZXJzLnN0YXJ0X2RhdGUgPSBzdGFydF9kYXRlO1xuICAgICAgICAgICAgaWYgKGVuZF9kYXRlKSB0aGlzLmFjdGl2ZV9maWx0ZXJzLmVuZF9kYXRlID0gZW5kX2RhdGU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZV9maWx0ZXJfZGlzcGxheSgpO1xuXG4gICAgICAgIGlmICh0aGlzLmFyZ3Mub25fYXBwbHkpIHtcbiAgICAgICAgICAgIHRoaXMuYXJncy5vbl9hcHBseSh0aGlzLmFjdGl2ZV9maWx0ZXJzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFyX2ZpbHRlcnMoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlX2ZpbHRlcnMgPSB7fTtcblxuICAgICAgICB0aGlzLiRpZCgnc2VhcmNoJykuc2V0X3ZhbHVlKCcnKTtcbiAgICAgICAgdGhpcy4kaWQoJ3N0YXR1cycpLnZhbCgnJyk7XG4gICAgICAgIHRoaXMuJGlkKCdkYXRlX3JhbmdlJykudmFsKCcnKTtcbiAgICAgICAgdGhpcy4kaWQoJ2N1c3RvbV9kYXRlcycpLmhpZGUoKTtcbiAgICAgICAgdGhpcy4kaWQoJ2N1c3RvbV9kYXRlc19lbmQnKS5oaWRlKCk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVfZmlsdGVyX2Rpc3BsYXkoKTtcblxuICAgICAgICBpZiAodGhpcy5hcmdzLm9uX2NsZWFyKSB7XG4gICAgICAgICAgICB0aGlzLmFyZ3Mub25fY2xlYXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZV9maWx0ZXJfZGlzcGxheSgpIHtcbiAgICAgICAgY29uc3QgY291bnQgPSBPYmplY3Qua2V5cyh0aGlzLmFjdGl2ZV9maWx0ZXJzKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0ICRjb250YWluZXIgPSB0aGlzLiRpZCgnYWN0aXZlX2ZpbHRlcnMnKTtcbiAgICAgICAgY29uc3QgJHRhZ3MgPSB0aGlzLiRpZCgnZmlsdGVyX3RhZ3MnKTtcblxuICAgICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICRjb250YWluZXIuaGlkZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgJGNvbnRhaW5lci5zaG93KCk7XG4gICAgICAgICR0YWdzLmVtcHR5KCk7XG5cbiAgICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMuYWN0aXZlX2ZpbHRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0ICR0YWcgPSAkKCc8c3Bhbj4nKS5hZGRDbGFzcygnYmFkZ2UgYmctcHJpbWFyeSBtZS0xJyk7XG4gICAgICAgICAgICAkdGFnLnRleHQoYCR7a2V5fTogJHt0aGlzLmFjdGl2ZV9maWx0ZXJzW2tleV19YCk7XG5cbiAgICAgICAgICAgIGNvbnN0ICRyZW1vdmUgPSAkKCc8aT4nKS5hZGRDbGFzcygnYmkgYmkteC1jaXJjbGUgbXMtMScpLmNzcygnY3Vyc29yJywgJ3BvaW50ZXInKTtcbiAgICAgICAgICAgICRyZW1vdmUub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmFjdGl2ZV9maWx0ZXJzW2tleV07XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVfZmlsdGVyX2Rpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGx5X2ZpbHRlcnMoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAkdGFnLmFwcGVuZCgkcmVtb3ZlKTtcbiAgICAgICAgICAgICR0YWdzLmFwcGVuZCgkdGFnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldF9maWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVfZmlsdGVycztcbiAgICB9XG59XG4iLCIvKipcbiAqIEZvcm1fQWN0aW9uc19Db21wb25lbnQgLSBKUUhUTUwgQ29tcG9uZW50XG4gKlxuICogTGlmZWN5Y2xlIG1ldGhvZHMgYXJlIGNhbGxlZCBpbiB0aGlzIG9yZGVyOlxuICogMS4gb25fY3JlYXRlKCkgLSBRdWljayBVSSBzZXR1cCwgcnVucyBib3R0b20tdXAgdGhyb3VnaCBjb21wb25lbnQgdHJlZVxuICogMi4gb25fbG9hZCgpIC0gRmV0Y2ggZGF0YSBmcm9tIEFQSXMgKHBhcmFsbGVsIGV4ZWN1dGlvbiwgbm8gRE9NIG1vZGlmaWNhdGlvbnMpXG4gKiAzLiBvbl9yZWFkeSgpIC0gQ29tcG9uZW50IGZ1bGx5IGluaXRpYWxpemVkLCBydW5zIGJvdHRvbS11cCB0aHJvdWdoIGNvbXBvbmVudCB0cmVlXG4gKi9cbmNsYXNzIEZvcm1fQWN0aW9uc19Db21wb25lbnQgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICAvKipcbiAgICAgKiBDYWxsZWQgYWZ0ZXIgcmVuZGVyLCBxdWljayBVSSBzZXR1cCAoYm90dG9tLXVwKVxuICAgICAqIFVzZSBmb3I6IEluaXRpYWwgc3RhdGUsIGV2ZW50IGJpbmRpbmdzLCBzaG93aW5nIGxvYWRpbmcgaW5kaWNhdG9yc1xuICAgICAqL1xuICAgIGFzeW5jIG9uX2NyZWF0ZSgpIHtcbiAgICAgICAgLy8gRXhhbXBsZTogdGhpcy4kaWQoJ2xvYWRpbmcnKS5zaG93KCk7XG4gICAgICAgIC8vIEV4YW1wbGU6IHRoaXMuJC5hZGRDbGFzcygnaW5pdGlhbGl6aW5nJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggZGF0YSBmcm9tIEFQSXMgKHBhcmFsbGVsLCBOTyBET00gbW9kaWZpY2F0aW9ucylcbiAgICAgKiBVc2UgZm9yOiBMb2FkaW5nIGRhdGEgZnJvbSBzZXJ2ZXIsIGZldGNoaW5nIGNvbmZpZ3VyYXRpb25zXG4gICAgICogV0FSTklORzogRG8gTk9UIG1vZGlmeSBET00gaGVyZSAtIG9ubHkgbG9hZCBkYXRhXG4gICAgICovXG4gICAgYXN5bmMgb25fbG9hZCgpIHtcbiAgICAgICAgLy8gRXhhbXBsZTogdGhpcy5kYXRhLnVzZXJzID0gYXdhaXQgVXNlcnNfQ29udHJvbGxlci5nZXRfdXNlcnNfYXBpKCk7XG4gICAgICAgIC8vIEV4YW1wbGU6IHRoaXMuZGF0YS5jb25maWcgPSBhd2FpdCB0aGlzLmxvYWRfY29uZmlnKCk7XG4gICAgICAgIC8vIFdBUk5JTkc6IERvIE5PVCBtb2RpZnkgRE9NIGhlcmUgLSBvbmx5IGxvYWQgZGF0YVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXBvbmVudCBmdWxseSBpbml0aWFsaXplZCAoYm90dG9tLXVwKVxuICAgICAqIFVzZSBmb3I6IEZpbmFsIFVJIHNldHVwLCBoaWRpbmcgbG9hZGluZyBpbmRpY2F0b3JzLCBzdGFydGluZyBhbmltYXRpb25zXG4gICAgICovXG4gICAgYXN5bmMgb25fcmVhZHkoKSB7XG4gICAgICAgIC8vIEV4YW1wbGU6IHRoaXMuJGlkKCdsb2FkaW5nJykuaGlkZSgpO1xuICAgICAgICAvLyBFeGFtcGxlOiB0aGlzLnNldHVwX2V2ZW50X2xpc3RlbmVycygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsaWNrIGhhbmRsZXIgZm9yIHRoZSBoZWxsbyBidXR0b25cbiAgICAgKiBSZWZlcmVuY2VkIGluIHRlbXBsYXRlIHZpYSBAY2xpY2s9dGhpcy5vbl9jbGlja19oZWxsb1xuICAgICAqL1xuICAgIG9uX2NsaWNrX2hlbGxvKCkge1xuICAgICAgICB0aGlzLiRpZCgnaW5uZXJfaHRtbCcpLmhpZGUoKTtcbiAgICAgICAgdGhpcy4kaWQoJ2hlbGxvX3dvcmxkJykuc2hvdygpO1xuICAgIH1cblxuICAgIC8vIEZvciBtb3JlIGluZm9ybWF0aW9uOiBwaHAgYXJ0aXNhbiByc3g6bWFuIGpxaHRtbFxufSIsImNsYXNzIEZvcm1fRmllbGRfR3JvdXAgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgLy8gT3B0aW9uYWw6IEFkZCBjb2xsYXBzaWJsZSBmdW5jdGlvbmFsaXR5XG4gICAgICAgIGlmICh0aGlzLmFyZ3MuY29sbGFwc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMubWFrZV9jb2xsYXBzaWJsZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbWFrZV9jb2xsYXBzaWJsZSgpIHtcbiAgICAgICAgY29uc3QgJGhlYWRlciA9IHRoaXMuJC5maW5kKCcuY2FyZC1oZWFkZXInKTtcbiAgICAgICAgY29uc3QgJGJvZHkgPSB0aGlzLiQuZmluZCgnLmNhcmQtYm9keScpO1xuICAgICAgICBjb25zdCBjb2xsYXBzZV9pZCA9ICdjb2xsYXBzZV8nICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpO1xuXG4gICAgICAgICRib2R5LmF0dHIoJ2lkJywgY29sbGFwc2VfaWQpLmFkZENsYXNzKCdjb2xsYXBzZSBzaG93Jyk7XG5cbiAgICAgICAgY29uc3QgJHRvZ2dsZSA9ICQoJzxidXR0b24+JylcbiAgICAgICAgICAgIC5hdHRyKCd0eXBlJywgJ2J1dHRvbicpXG4gICAgICAgICAgICAuYWRkQ2xhc3MoJ2J0biBidG4tbGluayBidG4tc20gZmxvYXQtZW5kIHRleHQtZGVjb3JhdGlvbi1ub25lJylcbiAgICAgICAgICAgIC5hdHRyKCdkYXRhLWJzLXRvZ2dsZScsICdjb2xsYXBzZScpXG4gICAgICAgICAgICAuYXR0cignZGF0YS1icy10YXJnZXQnLCAnIycgKyBjb2xsYXBzZV9pZClcbiAgICAgICAgICAgIC5odG1sKCc8aSBjbGFzcz1cImJpIGJpLWNoZXZyb24tdXBcIj48L2k+Jyk7XG5cbiAgICAgICAgJGhlYWRlci5maW5kKCdoNScpLmFwcGVuZCgkdG9nZ2xlKTtcblxuICAgICAgICAkYm9keS5vbignc2hvdy5icy5jb2xsYXBzZScsICgpID0+IHtcbiAgICAgICAgICAgICR0b2dnbGUuaHRtbCgnPGkgY2xhc3M9XCJiaSBiaS1jaGV2cm9uLXVwXCI+PC9pPicpO1xuICAgICAgICB9KTtcblxuICAgICAgICAkYm9keS5vbignaGlkZS5icy5jb2xsYXBzZScsICgpID0+IHtcbiAgICAgICAgICAgICR0b2dnbGUuaHRtbCgnPGkgY2xhc3M9XCJiaSBiaS1jaGV2cm9uLWRvd25cIj48L2k+Jyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIi8qKlxuICogRm9ybV9Hcm91cF9Db21wb25lbnQgLSBKUUhUTUwgQ29tcG9uZW50XG4gKlxuICogTGlmZWN5Y2xlIG1ldGhvZHMgYXJlIGNhbGxlZCBpbiB0aGlzIG9yZGVyOlxuICogMS4gb25fY3JlYXRlKCkgLSBRdWljayBVSSBzZXR1cCwgcnVucyBib3R0b20tdXAgdGhyb3VnaCBjb21wb25lbnQgdHJlZVxuICogMi4gb25fbG9hZCgpIC0gRmV0Y2ggZGF0YSBmcm9tIEFQSXMgKHBhcmFsbGVsIGV4ZWN1dGlvbiwgbm8gRE9NIG1vZGlmaWNhdGlvbnMpXG4gKiAzLiBvbl9yZWFkeSgpIC0gQ29tcG9uZW50IGZ1bGx5IGluaXRpYWxpemVkLCBydW5zIGJvdHRvbS11cCB0aHJvdWdoIGNvbXBvbmVudCB0cmVlXG4gKi9cbmNsYXNzIEZvcm1fR3JvdXBfQ29tcG9uZW50IGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGFmdGVyIHJlbmRlciwgcXVpY2sgVUkgc2V0dXAgKGJvdHRvbS11cClcbiAgICAgKiBVc2UgZm9yOiBJbml0aWFsIHN0YXRlLCBldmVudCBiaW5kaW5ncywgc2hvd2luZyBsb2FkaW5nIGluZGljYXRvcnNcbiAgICAgKi9cbiAgICBvbl9jcmVhdGUoKSB7XG4gICAgICAgIC8vIEFwcGx5IHJlc3BvbnNpdmUgY29sdW1uIGNsYXNzZXNcbiAgICAgICAgY29uc3QgY29sX2NsYXNzID0gdGhpcy5hcmdzLmNvbF9jbGFzcyB8fCAnY29sLTEyIGNvbC1tZC02IGNvbC14bC00JztcbiAgICAgICAgdGhpcy4kLmFkZENsYXNzKGNvbF9jbGFzcyArICcgbWItMycpO1xuICAgIH1cbn1cbiIsIi8qKlxuICogRm9ybV9Sb3dfQ29tcG9uZW50IC0gSlFIVE1MIENvbXBvbmVudFxuICpcbiAqIExpZmVjeWNsZSBtZXRob2RzIGFyZSBjYWxsZWQgaW4gdGhpcyBvcmRlcjpcbiAqIDEuIG9uX2NyZWF0ZSgpIC0gUXVpY2sgVUkgc2V0dXAsIHJ1bnMgYm90dG9tLXVwIHRocm91Z2ggY29tcG9uZW50IHRyZWVcbiAqIDIuIG9uX2xvYWQoKSAtIEZldGNoIGRhdGEgZnJvbSBBUElzIChwYXJhbGxlbCBleGVjdXRpb24sIG5vIERPTSBtb2RpZmljYXRpb25zKVxuICogMy4gb25fcmVhZHkoKSAtIENvbXBvbmVudCBmdWxseSBpbml0aWFsaXplZCwgcnVucyBib3R0b20tdXAgdGhyb3VnaCBjb21wb25lbnQgdHJlZVxuICovXG5jbGFzcyBGb3JtX1Jvd19Db21wb25lbnQgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICAvKipcbiAgICAgKiBDYWxsZWQgYWZ0ZXIgcmVuZGVyLCBxdWljayBVSSBzZXR1cCAoYm90dG9tLXVwKVxuICAgICAqIFVzZSBmb3I6IEluaXRpYWwgc3RhdGUsIGV2ZW50IGJpbmRpbmdzLCBzaG93aW5nIGxvYWRpbmcgaW5kaWNhdG9yc1xuICAgICAqL1xuICAgIGFzeW5jIG9uX2NyZWF0ZSgpIHtcbiAgICAgICAgLy8gRXhhbXBsZTogdGhpcy4kaWQoJ2xvYWRpbmcnKS5zaG93KCk7XG4gICAgICAgIC8vIEV4YW1wbGU6IHRoaXMuJC5hZGRDbGFzcygnaW5pdGlhbGl6aW5nJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggZGF0YSBmcm9tIEFQSXMgKHBhcmFsbGVsLCBOTyBET00gbW9kaWZpY2F0aW9ucylcbiAgICAgKiBVc2UgZm9yOiBMb2FkaW5nIGRhdGEgZnJvbSBzZXJ2ZXIsIGZldGNoaW5nIGNvbmZpZ3VyYXRpb25zXG4gICAgICogV0FSTklORzogRG8gTk9UIG1vZGlmeSBET00gaGVyZSAtIG9ubHkgbG9hZCBkYXRhXG4gICAgICovXG4gICAgYXN5bmMgb25fbG9hZCgpIHtcbiAgICAgICAgLy8gRXhhbXBsZTogdGhpcy5kYXRhLnVzZXJzID0gYXdhaXQgVXNlcnNfQ29udHJvbGxlci5nZXRfdXNlcnNfYXBpKCk7XG4gICAgICAgIC8vIEV4YW1wbGU6IHRoaXMuZGF0YS5jb25maWcgPSBhd2FpdCB0aGlzLmxvYWRfY29uZmlnKCk7XG4gICAgICAgIC8vIFdBUk5JTkc6IERvIE5PVCBtb2RpZnkgRE9NIGhlcmUgLSBvbmx5IGxvYWQgZGF0YVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXBvbmVudCBmdWxseSBpbml0aWFsaXplZCAoYm90dG9tLXVwKVxuICAgICAqIFVzZSBmb3I6IEZpbmFsIFVJIHNldHVwLCBoaWRpbmcgbG9hZGluZyBpbmRpY2F0b3JzLCBzdGFydGluZyBhbmltYXRpb25zXG4gICAgICovXG4gICAgYXN5bmMgb25fcmVhZHkoKSB7XG4gICAgICAgIC8vIEV4YW1wbGU6IHRoaXMuJGlkKCdsb2FkaW5nJykuaGlkZSgpO1xuICAgICAgICAvLyBFeGFtcGxlOiB0aGlzLnNldHVwX2V2ZW50X2xpc3RlbmVycygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsaWNrIGhhbmRsZXIgZm9yIHRoZSBoZWxsbyBidXR0b25cbiAgICAgKiBSZWZlcmVuY2VkIGluIHRlbXBsYXRlIHZpYSBAY2xpY2s9dGhpcy5vbl9jbGlja19oZWxsb1xuICAgICAqL1xuICAgIG9uX2NsaWNrX2hlbGxvKCkge1xuICAgICAgICB0aGlzLiRpZCgnaW5uZXJfaHRtbCcpLmhpZGUoKTtcbiAgICAgICAgdGhpcy4kaWQoJ2hlbGxvX3dvcmxkJykuc2hvdygpO1xuICAgIH1cblxuICAgIC8vIEZvciBtb3JlIGluZm9ybWF0aW9uOiBwaHAgYXJ0aXNhbiByc3g6bWFuIGpxaHRtbFxufSIsIi8qKlxuICogRm9ybV9WYWxpZGF0aW9uX01lc3NhZ2UgLSBCb290c3RyYXAgNSBWYWxpZGF0aW9uIEZlZWRiYWNrIENvbXBvbmVudFxuICpcbiAqIFB1cnBvc2U6IERpc3BsYXkgdmFsaWRhdGlvbiBmZWVkYmFjayBtZXNzYWdlcyAoc3VjY2Vzcy9lcnJvcikgYmVsb3cgZm9ybSBpbnB1dHNcbiAqIERlc2lnbjogQm9vdHN0cmFwIC5pbnZhbGlkLWZlZWRiYWNrIChkZWZhdWx0KSBvciAudmFsaWQtZmVlZGJhY2sgc3R5bGluZ1xuICogVmlzaWJpbGl0eTogT25seSBzaG93cyB3aGVuIHNpYmxpbmcgaW5wdXQgaGFzIC5pcy12YWxpZCBvciAuaXMtaW52YWxpZCBjbGFzc1xuICovXG5jbGFzcyBGb3JtX1ZhbGlkYXRpb25fTWVzc2FnZSBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBBZGQgY3VzdG9tIGNsYXNzZXMgaWYgcHJvdmlkZWQgKGUuZy4sIHN3aXRjaGluZyB0byB2YWxpZC1mZWVkYmFjaylcbiAgICAgICAgaWYgKHRoaXMuYXJncy5jbGFzcykge1xuICAgICAgICAgICAgLy8gUmVwbGFjZSBkZWZhdWx0IGludmFsaWQtZmVlZGJhY2sgd2l0aCBwcm92aWRlZCBjbGFzc1xuICAgICAgICAgICAgdGhpcy4kLnJlbW92ZUNsYXNzKCdpbnZhbGlkLWZlZWRiYWNrJyk7XG4gICAgICAgICAgICB0aGlzLiQuYWRkQ2xhc3ModGhpcy5hcmdzLmNsYXNzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImNsYXNzIEdhbnR0X0NoYXJ0IGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgYXN5bmMgb25fbG9hZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuYXJncy5kYXRhX3NvdXJjZSkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0aGlzLmFyZ3MuZGF0YV9zb3VyY2UpO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YS50YXNrcyA9IGRhdGEudGFza3M7XG4gICAgICAgICAgICB0aGlzLmRhdGEubW9udGhzID0gZGF0YS5tb250aHM7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hcmdzLnRhc2tzKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEudGFza3MgPSB0aGlzLmFyZ3MudGFza3M7XG4gICAgICAgICAgICB0aGlzLmRhdGEubW9udGhzID0gdGhpcy5hcmdzLm1vbnRocyB8fCB0aGlzLmdlbmVyYXRlX21vbnRocygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2VuZXJhdGVfbW9udGhzKCkge1xuICAgICAgICBjb25zdCBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ107XG4gICAgICAgIHJldHVybiBtb250aHM7XG4gICAgfVxufVxuIiwiY2xhc3MgSWNvbl9CdXR0b24gZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgLy8gQWRkIGFyaWEtbGFiZWwgZm9yIGFjY2Vzc2liaWxpdHkgKGljb24tb25seSBidXR0b25zIG5lZWQgbGFiZWxzKVxuICAgICAgICBpZiAodGhpcy5hcmdzLmxhYmVsKSB7XG4gICAgICAgICAgICB0aGlzLiQuYXR0cignYXJpYS1sYWJlbCcsIHRoaXMuYXJncy5sYWJlbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgdGl0bGUgZm9yIHRvb2x0aXAgb24gaG92ZXJcbiAgICAgICAgaWYgKHRoaXMuYXJncy50aXRsZSkge1xuICAgICAgICAgICAgdGhpcy4kLmF0dHIoJ3RpdGxlJywgdGhpcy5hcmdzLnRpdGxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN1cHBvcnQgY3VzdG9tIGJ1dHRvbiBjbGFzc2VzIChidG4tcHJpbWFyeSwgYnRuLWRhbmdlciwgZXRjLilcbiAgICAgICAgaWYgKHRoaXMuYXJncy5jbGFzcykge1xuICAgICAgICAgICAgdGhpcy4kLmFkZENsYXNzKHRoaXMuYXJncy5jbGFzcyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJjbGFzcyBJY29uX1dpdGhfTGFiZWwgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgLy8gTm8gc3BlY2lhbCBiZWhhdmlvclxuICAgIH1cbn1cbiIsImNsYXNzIEljb25fV2l0aF9UZXh0IGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgLy8gUHVyZSBCb290c3RyYXAgc3R5bGluZyAtIG5vIEphdmFTY3JpcHQgbmVlZGVkXG59XG4iLCJjbGFzcyBJY29uIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgLy8gU1ZHIGljb24gY29udGFpbmVyIHdpdGggc2l6ZSB2YXJpYW50c1xufVxuIiwiY2xhc3MgSW5mb19Cb3ggZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgLy8gQXBwbHkgY29sb3IgZnJvbSBhcmdzXG4gICAgICAgIGlmICh0aGlzLmFyZ3MuY29sb3IpIHtcbiAgICAgICAgICAgIHRoaXMuJC5yZW1vdmVDbGFzcygnYm9yZGVyLXByaW1hcnknKS5hZGRDbGFzcyhgYm9yZGVyLSR7dGhpcy5hcmdzLmNvbG9yfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiY2xhc3MgSW5saW5lX0VkaXRfRmllbGQgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50X3ZhbHVlID0gdGhpcy5hcmdzLnZhbHVlIHx8ICcnO1xuXG4gICAgICAgIC8vIEVudGVyIGVkaXQgbW9kZVxuICAgICAgICB0aGlzLiRpZCgnZGlzcGxheV9tb2RlJykub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbnRlcl9lZGl0X21vZGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU2F2ZVxuICAgICAgICB0aGlzLiRpZCgnc2F2ZV9idG4nKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNhdmUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ2FuY2VsXG4gICAgICAgIHRoaXMuJGlkKCdjYW5jZWxfYnRuJykub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWwoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU2F2ZSBvbiBFbnRlciwgY2FuY2VsIG9uIEVzY2FwZVxuICAgICAgICB0aGlzLiRpZCgnaW5wdXQnKS5vbigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBlbnRlcl9lZGl0X21vZGUoKSB7XG4gICAgICAgIGNvbnN0ICRpbnB1dCA9IHRoaXMuJGlkKCdpbnB1dCcpO1xuICAgICAgICAkaW5wdXQudmFsKHRoaXMuY3VycmVudF92YWx1ZSk7XG5cbiAgICAgICAgdGhpcy4kaWQoJ2Rpc3BsYXlfbW9kZScpLmhpZGUoKTtcbiAgICAgICAgdGhpcy4kaWQoJ2VkaXRfbW9kZScpLnNob3coKTtcblxuICAgICAgICAkaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgJGlucHV0LnNlbGVjdCgpO1xuICAgIH1cblxuICAgIGV4aXRfZWRpdF9tb2RlKCkge1xuICAgICAgICB0aGlzLiRpZCgnZWRpdF9tb2RlJykuaGlkZSgpO1xuICAgICAgICB0aGlzLiRpZCgnZGlzcGxheV9tb2RlJykuc2hvdygpO1xuICAgIH1cblxuICAgIHNhdmUoKSB7XG4gICAgICAgIGNvbnN0IG5ld192YWx1ZSA9IHRoaXMuJGlkKCdpbnB1dCcpLnZhbCgpO1xuXG4gICAgICAgIGlmIChuZXdfdmFsdWUgPT09IHRoaXMuY3VycmVudF92YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5leGl0X2VkaXRfbW9kZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpZ2dlciBjYWxsYmFja1xuICAgICAgICBpZiAodGhpcy5hcmdzLm9uX3NhdmUpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXJncy5vbl9zYXZlKG5ld192YWx1ZSwgdGhpcy5jdXJyZW50X3ZhbHVlKTtcblxuICAgICAgICAgICAgLy8gSWYgY2FsbGJhY2sgcmV0dXJucyBmYWxzZSwgZG9uJ3Qgc2F2ZVxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIGNhbGxiYWNrIHJldHVybnMgYSBwcm9taXNlLCB3YWl0IGZvciBpdFxuICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dfc2F2aW5nKCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRfdmFsdWUgPSBuZXdfdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlX2Rpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGl0X2VkaXRfbW9kZSgpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGl0X2VkaXRfbW9kZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3VycmVudF92YWx1ZSA9IG5ld192YWx1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVfZGlzcGxheSgpO1xuICAgICAgICB0aGlzLmV4aXRfZWRpdF9tb2RlKCk7XG4gICAgfVxuXG4gICAgY2FuY2VsKCkge1xuICAgICAgICB0aGlzLmV4aXRfZWRpdF9tb2RlKCk7XG4gICAgfVxuXG4gICAgdXBkYXRlX2Rpc3BsYXkoKSB7XG4gICAgICAgIGNvbnN0IGRpc3BsYXkgPSB0aGlzLmN1cnJlbnRfdmFsdWUgfHwgdGhpcy5hcmdzLnBsYWNlaG9sZGVyIHx8ICdDbGljayB0byBlZGl0JztcbiAgICAgICAgdGhpcy4kaWQoJ3ZhbHVlX2Rpc3BsYXknKS50ZXh0KGRpc3BsYXkpO1xuICAgIH1cblxuICAgIHNob3dfc2F2aW5nKCkge1xuICAgICAgICB0aGlzLiRpZCgnc2F2ZV9idG4nKS5wcm9wKCdkaXNhYmxlZCcsIHRydWUpLmh0bWwoJzxzcGFuIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgc3Bpbm5lci1ib3JkZXItc21cIj48L3NwYW4+Jyk7XG4gICAgICAgIHRoaXMuJGlkKCdjYW5jZWxfYnRuJykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICB9XG5cbiAgICBnZXRfdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRfdmFsdWU7XG4gICAgfVxuXG4gICAgc2V0X3ZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuY3VycmVudF92YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnVwZGF0ZV9kaXNwbGF5KCk7XG4gICAgfVxufVxuIiwiY2xhc3MgSW5wdXRfV2l0aF9JY29uIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIGNvbnN0ICRpbnB1dCA9IHRoaXMuJGlkKCdpbnB1dCcpO1xuXG4gICAgICAgIGlmICh0aGlzLmFyZ3MudmFsdWUpIHtcbiAgICAgICAgICAgICRpbnB1dC52YWwodGhpcy5hcmdzLnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFyZ3MubmFtZSkge1xuICAgICAgICAgICAgJGlucHV0LmF0dHIoJ25hbWUnLCB0aGlzLmFyZ3MubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcmdzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAkaW5wdXQucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFyZ3MucmVhZG9ubHkpIHtcbiAgICAgICAgICAgICRpbnB1dC5wcm9wKCdyZWFkb25seScsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYXJncy5vbl9jaGFuZ2UpIHtcbiAgICAgICAgICAgICRpbnB1dC5vbignY2hhbmdlJywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFyZ3Mub25fY2hhbmdlKGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYXJncy5vbl9pbnB1dCkge1xuICAgICAgICAgICAgJGlucHV0Lm9uKCdpbnB1dCcsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcmdzLm9uX2lucHV0KGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0X3ZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4kaWQoJ2lucHV0JykudmFsKCk7XG4gICAgfVxuXG4gICAgc2V0X3ZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuJGlkKCdpbnB1dCcpLnZhbCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgZm9jdXMoKSB7XG4gICAgICAgIHRoaXMuJGlkKCdpbnB1dCcpLmZvY3VzKCk7XG4gICAgfVxufVxuIiwiY2xhc3MgSW5wdXRfV2l0aF9WYWxpZGF0aW9uIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIGNvbnN0ICRpbnB1dCA9IHRoaXMuJGlkKCdpbnB1dCcpO1xuXG4gICAgICAgIGlmICh0aGlzLmFyZ3MudmFsdWUpIHtcbiAgICAgICAgICAgICRpbnB1dC52YWwodGhpcy5hcmdzLnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFyZ3MubmFtZSkge1xuICAgICAgICAgICAgJGlucHV0LmF0dHIoJ25hbWUnLCB0aGlzLmFyZ3MubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcmdzLnJlcXVpcmVkKSB7XG4gICAgICAgICAgICAkaW5wdXQucHJvcCgncmVxdWlyZWQnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFyZ3MuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICRpbnB1dC5wcm9wKCdkaXNhYmxlZCcsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYXJncy5yZWFkb25seSkge1xuICAgICAgICAgICAgJGlucHV0LnByb3AoJ3JlYWRvbmx5JywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWFsLXRpbWUgdmFsaWRhdGlvblxuICAgICAgICBpZiAodGhpcy5hcmdzLnZhbGlkYXRlKSB7XG4gICAgICAgICAgICAkaW5wdXQub24oJ2JsdXInLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICRpbnB1dC5vbignaW5wdXQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuJC5oYXNDbGFzcygnd2FzLXZhbGlkYXRlZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFyZ3Mub25fY2hhbmdlKSB7XG4gICAgICAgICAgICAkaW5wdXQub24oJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcmdzLm9uX2NoYW5nZShlLnRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhbGlkYXRlKCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuJGlkKCdpbnB1dCcpLnZhbCgpO1xuICAgICAgICBjb25zdCAkaW5wdXQgPSB0aGlzLiRpZCgnaW5wdXQnKTtcblxuICAgICAgICB0aGlzLiQuYWRkQ2xhc3MoJ3dhcy12YWxpZGF0ZWQnKTtcblxuICAgICAgICAvLyBSdW4gdmFsaWRhdGlvbiBmdW5jdGlvblxuICAgICAgICBpZiAodGhpcy5hcmdzLnZhbGlkYXRlKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFyZ3MudmFsaWRhdGUodmFsdWUpO1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB0cnVlIHx8IHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0X3ZhbGlkKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0X2Vycm9yKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmFzaWMgcmVxdWlyZWQgY2hlY2tcbiAgICAgICAgaWYgKHRoaXMuYXJncy5yZXF1aXJlZCAmJiAhdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0X2Vycm9yKCdUaGlzIGZpZWxkIGlzIHJlcXVpcmVkJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldF92YWxpZCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBzZXRfZXJyb3IobWVzc2FnZSkge1xuICAgICAgICBjb25zdCAkaW5wdXQgPSB0aGlzLiRpZCgnaW5wdXQnKTtcbiAgICAgICAgY29uc3QgJGVycm9yID0gdGhpcy4kaWQoJ2Vycm9yJyk7XG5cbiAgICAgICAgJGlucHV0LnJlbW92ZUNsYXNzKCdpcy12YWxpZCcpLmFkZENsYXNzKCdpcy1pbnZhbGlkJyk7XG4gICAgICAgICRlcnJvci50ZXh0KG1lc3NhZ2UpLmNzcygnZGlzcGxheScsICdibG9jaycpO1xuICAgICAgICB0aGlzLiRpZCgnc3VjY2VzcycpLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgfVxuXG4gICAgc2V0X3ZhbGlkKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgJGlucHV0ID0gdGhpcy4kaWQoJ2lucHV0Jyk7XG4gICAgICAgIGNvbnN0ICRzdWNjZXNzID0gdGhpcy4kaWQoJ3N1Y2Nlc3MnKTtcblxuICAgICAgICAkaW5wdXQucmVtb3ZlQ2xhc3MoJ2lzLWludmFsaWQnKS5hZGRDbGFzcygnaXMtdmFsaWQnKTtcbiAgICAgICAgdGhpcy4kaWQoJ2Vycm9yJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcblxuICAgICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICAgICAgJHN1Y2Nlc3MudGV4dChtZXNzYWdlKS5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICRzdWNjZXNzLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGVhcl92YWxpZGF0aW9uKCkge1xuICAgICAgICBjb25zdCAkaW5wdXQgPSB0aGlzLiRpZCgnaW5wdXQnKTtcbiAgICAgICAgJGlucHV0LnJlbW92ZUNsYXNzKCdpcy12YWxpZCBpcy1pbnZhbGlkJyk7XG4gICAgICAgIHRoaXMuJGlkKCdlcnJvcicpLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgIHRoaXMuJGlkKCdzdWNjZXNzJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgdGhpcy4kLnJlbW92ZUNsYXNzKCd3YXMtdmFsaWRhdGVkJyk7XG4gICAgfVxuXG4gICAgZ2V0X3ZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4kaWQoJ2lucHV0JykudmFsKCk7XG4gICAgfVxuXG4gICAgc2V0X3ZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuJGlkKCdpbnB1dCcpLnZhbCh2YWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLiQuaGFzQ2xhc3MoJ3dhcy12YWxpZGF0ZWQnKSkge1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9jdXMoKSB7XG4gICAgICAgIHRoaXMuJGlkKCdpbnB1dCcpLmZvY3VzKCk7XG4gICAgfVxufVxuIiwiLyoqXG4gKiBJbnB1dCAtIEJvb3RzdHJhcCA1IFRleHQgSW5wdXQgQ29tcG9uZW50XG4gKlxuICogUHVycG9zZTogU2luZ2xlLWxpbmUgdGV4dCBpbnB1dCBmaWVsZCBmb3IgdXNlciBkYXRhIGVudHJ5XG4gKiBEZXNpZ246IEJvb3RzdHJhcCAuZm9ybS1jb250cm9sIHN0eWxpbmdcbiAqIFR5cGVzOiB0ZXh0LCBlbWFpbCwgcGFzc3dvcmQsIG51bWJlciwgdGVsLCB1cmwsIGRhdGUsIGV0Yy5cbiAqL1xuY2xhc3MgSW5wdXQgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgLy8gU2V0IHR5cGUgYXR0cmlidXRlIGlmIHByb3ZpZGVkXG4gICAgICAgIGlmICh0aGlzLmFyZ3MudHlwZSkge1xuICAgICAgICAgICAgdGhpcy4kLmF0dHIoJ3R5cGUnLCB0aGlzLmFyZ3MudHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgcGxhY2Vob2xkZXIgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKHRoaXMuYXJncy5wbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgdGhpcy4kLmF0dHIoJ3BsYWNlaG9sZGVyJywgdGhpcy5hcmdzLnBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB2YWx1ZSBpZiBwcm92aWRlZFxuICAgICAgICBpZiAodGhpcy5hcmdzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLiQudmFsKHRoaXMuYXJncy52YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgY3VzdG9tIGNsYXNzZXMgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKHRoaXMuYXJncy5jbGFzcykge1xuICAgICAgICAgICAgdGhpcy4kLmFkZENsYXNzKHRoaXMuYXJncy5jbGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgZGlzYWJsZWQgc3RhdGUgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKHRoaXMuYXJncy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy4kLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgcmVxdWlyZWQgYXR0cmlidXRlIGlmIHByb3ZpZGVkXG4gICAgICAgIGlmICh0aGlzLmFyZ3MucmVxdWlyZWQpIHtcbiAgICAgICAgICAgIHRoaXMuJC5wcm9wKCdyZXF1aXJlZCcsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiY2xhc3MgS2FuYmFuX0JvYXJkIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgYXN5bmMgb25fbG9hZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuYXJncy5kYXRhX3NvdXJjZSkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0aGlzLmFyZ3MuZGF0YV9zb3VyY2UpO1xuICAgICAgICAgICAgdGhpcy5kYXRhLmNvbHVtbnMgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hcmdzLmNvbHVtbnMpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5jb2x1bW5zID0gdGhpcy5hcmdzLmNvbHVtbnM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgLy8gRHJhZyBhbmQgZHJvcCBmdW5jdGlvbmFsaXR5XG4gICAgICAgIHRoaXMuc2V0dXBfZHJhZ19hbmRfZHJvcCgpO1xuICAgIH1cblxuICAgIHNldHVwX2RyYWdfYW5kX2Ryb3AoKSB7XG4gICAgICAgIGxldCBkcmFnZ2VkX2NhcmQgPSBudWxsO1xuXG4gICAgICAgIC8vIE1ha2UgY2FyZHMgZHJhZ2dhYmxlXG4gICAgICAgIHRoaXMuJC5maW5kKCdbZGF0YS1jYXJkLWlkXScpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zdCAkY2FyZCA9ICQodGhpcyk7XG5cbiAgICAgICAgICAgICRjYXJkLm9uKCdkcmFnc3RhcnQnLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgZHJhZ2dlZF9jYXJkID0gdGhpcztcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmNzcygnb3BhY2l0eScsICcwLjUnKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAkY2FyZC5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmNzcygnb3BhY2l0eScsICcxJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTWFrZSBjb2x1bW5zIGRyb3BwYWJsZVxuICAgICAgICB0aGlzLiQuZmluZCgnW2RhdGEtY29sdW1uLWNhcmRzXScpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zdCAkY29sdW1uID0gJCh0aGlzKTtcblxuICAgICAgICAgICAgJGNvbHVtbi5vbignZHJhZ292ZXInLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICRjb2x1bW4uYWRkQ2xhc3MoJ2JnLWxpZ2h0Jyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgJGNvbHVtbi5vbignZHJhZ2xlYXZlJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICRjb2x1bW4ucmVtb3ZlQ2xhc3MoJ2JnLWxpZ2h0Jyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgJGNvbHVtbi5vbignZHJvcCcsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgJGNvbHVtbi5yZW1vdmVDbGFzcygnYmctbGlnaHQnKTtcblxuICAgICAgICAgICAgICAgIGlmIChkcmFnZ2VkX2NhcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgJGNvbHVtbi5hcHBlbmQoZHJhZ2dlZF9jYXJkKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFyZ3Mub25fbW92ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZF9pZCA9ICQoZHJhZ2dlZF9jYXJkKS5hdHRyKCdkYXRhLWNhcmQtaWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbl9pZCA9ICRjb2x1bW4uYXR0cignZGF0YS1jb2x1bW4tY2FyZHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXJncy5vbl9tb3ZlKGNhcmRfaWQsIGNvbHVtbl9pZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgIH1cbn1cbiIsImNsYXNzIExpbmsgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgLy8gU3VwcG9ydCAkaHJlZiBhdHRyaWJ1dGUgZm9yIGR5bmFtaWMgVVJMc1xuICAgICAgICBpZiAodGhpcy5hcmdzLmhyZWYpIHtcbiAgICAgICAgICAgIHRoaXMuJC5hdHRyKCdocmVmJywgdGhpcy5hcmdzLmhyZWYpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiY2xhc3MgTGlzdCBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBBZGQgbGlzdC1ncm91cC1pdGVtIGNsYXNzIHRvIGVhY2ggZGlyZWN0IGNoaWxkXG4gICAgICAgIHRoaXMuJC5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zdCAkZWxlbWVudCA9ICQodGhpcyk7XG4gICAgICAgICAgICAkZWxlbWVudC5hZGRDbGFzcygnbGlzdC1ncm91cC1pdGVtJyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImNsYXNzIExvYWRpbmdfU2tlbGV0b24gZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgLy8gQXBwbHkgbGluZXMgZnJvbSBhcmdzXG4gICAgICAgIGlmICh0aGlzLmFyZ3MubGluZXMpIHtcbiAgICAgICAgICAgIHRoaXMuJC5lbXB0eSgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmFyZ3MubGluZXM7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gMTIgLSAoaSAqIDIpO1xuICAgICAgICAgICAgICAgIGNvbnN0ICRzcGFuID0gJCgnPHNwYW4+JykuYWRkQ2xhc3MoYHBsYWNlaG9sZGVyIGNvbC0ke01hdGgubWF4KHdpZHRoLCA2KX1gKTtcbiAgICAgICAgICAgICAgICB0aGlzLiQuYXBwZW5kKCRzcGFuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImNsYXNzIE1ldHJpY19DYXJkIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgLy8gUHVyZSBjb250YWluZXIgLSBjaGlsZHJlbiBhbHJlYWR5IHN0eWxlZFxufVxuIiwiY2xhc3MgTW9iaWxlX0hlYWRlciBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBObyBzcGVjaWFsIGJlaGF2aW9yXG4gICAgfVxufVxuIiwiY2xhc3MgTW9kYWxfRGlhbG9nIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIC8vIEluaXRpYWxpemUgQm9vdHN0cmFwIG1vZGFsXG4gICAgICAgIHRoaXMubW9kYWwgPSBuZXcgYm9vdHN0cmFwLk1vZGFsKHRoaXMuJFswXSk7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5tb2RhbC5zaG93KCk7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5tb2RhbC5oaWRlKCk7XG4gICAgfVxufVxuIiwiY2xhc3MgTXVsdGlfU2VsZWN0IGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRfdmFsdWVzID0gdGhpcy5hcmdzLnZhbHVlIHx8IFtdO1xuICAgICAgICB0aGlzLmFsbF9vcHRpb25zID0gdGhpcy5hcmdzLm9wdGlvbnMgfHwgW107XG5cbiAgICAgICAgaWYgKHRoaXMuYWxsX29wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJfb3B0aW9ucyh0aGlzLmFsbF9vcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNlYXJjaCBmdW5jdGlvbmFsaXR5XG4gICAgICAgIGNvbnN0ICRzZWFyY2ggPSB0aGlzLiRpZCgnc2VhcmNoJyk7XG4gICAgICAgICRzZWFyY2gub24oJ2lucHV0JywgKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyX29wdGlvbnMoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBQcmV2ZW50IGRyb3Bkb3duIGNsb3NlIHdoZW4gY2xpY2tpbmcgaW5zaWRlXG4gICAgICAgIHRoaXMuJGlkKCdtZW51Jykub24oJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENsZWFyL1NlbGVjdCBhbGwgYnV0dG9uc1xuICAgICAgICB0aGlzLiRpZCgnY2xlYXJfYWxsJykub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbGVhcl9hbGwoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy4kaWQoJ3NlbGVjdF9hbGwnKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdF9hbGwoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGRpc3BsYXlcbiAgICAgICAgdGhpcy51cGRhdGVfZGlzcGxheSgpO1xuICAgIH1cblxuICAgIHJlbmRlcl9vcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgJGNvbnRhaW5lciA9IHRoaXMuJGlkKCdvcHRpb25zJyk7XG4gICAgICAgICRjb250YWluZXIuZW1wdHkoKTtcblxuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICRjb250YWluZXIuYXBwZW5kKCQoJzxkaXY+JykuYWRkQ2xhc3MoJ3B4LTMgcHktMiB0ZXh0LW11dGVkJykudGV4dCgnTm8gb3B0aW9ucyBmb3VuZCcpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgICAgICAgY29uc3QgJGxhYmVsID0gJCgnPGxhYmVsPicpLmFkZENsYXNzKCdkcm9wZG93bi1pdGVtIG1iLTAnKTtcbiAgICAgICAgICAgIGNvbnN0ICRjaGVja2JveCA9ICQoJzxpbnB1dD4nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd0eXBlJywgJ2NoZWNrYm94JylcbiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2Zvcm0tY2hlY2staW5wdXQgbWUtMicpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2RhdGEtdmFsdWUnLCBvcHRpb24udmFsdWUpXG4gICAgICAgICAgICAgICAgLnByb3AoJ2NoZWNrZWQnLCB0aGlzLnNlbGVjdGVkX3ZhbHVlcy5pbmNsdWRlcyhvcHRpb24udmFsdWUpKTtcblxuICAgICAgICAgICAgJGNoZWNrYm94Lm9uKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlX29wdGlvbihvcHRpb24udmFsdWUsIGUudGFyZ2V0LmNoZWNrZWQpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICRsYWJlbC5hcHBlbmQoJGNoZWNrYm94KS5hcHBlbmQob3B0aW9uLmxhYmVsKTtcbiAgICAgICAgICAgICRjb250YWluZXIuYXBwZW5kKCRsYWJlbCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZpbHRlcl9vcHRpb25zKHF1ZXJ5KSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gdGhpcy5hbGxfb3B0aW9ucy5maWx0ZXIob3B0ID0+XG4gICAgICAgICAgICBvcHQubGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnJlbmRlcl9vcHRpb25zKGZpbHRlcmVkKTtcbiAgICB9XG5cbiAgICB0b2dnbGVfb3B0aW9uKHZhbHVlLCBjaGVja2VkKSB7XG4gICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRfdmFsdWVzLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRfdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZF92YWx1ZXMgPSB0aGlzLnNlbGVjdGVkX3ZhbHVlcy5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZV9kaXNwbGF5KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYXJncy5vbl9jaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuYXJncy5vbl9jaGFuZ2UodGhpcy5zZWxlY3RlZF92YWx1ZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlX2Rpc3BsYXkoKSB7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5zZWxlY3RlZF92YWx1ZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCAkdGV4dCA9IHRoaXMuJGlkKCdzZWxlY3RlZF90ZXh0Jyk7XG5cbiAgICAgICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAkdGV4dC50ZXh0KHRoaXMuYXJncy5wbGFjZWhvbGRlciB8fCAnU2VsZWN0IG9wdGlvbnMnKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5hbGxfb3B0aW9ucy5maW5kKG9wdCA9PiBvcHQudmFsdWUgPT09IHRoaXMuc2VsZWN0ZWRfdmFsdWVzWzBdKTtcbiAgICAgICAgICAgICR0ZXh0LnRleHQob3B0aW9uID8gb3B0aW9uLmxhYmVsIDogJzEgc2VsZWN0ZWQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICR0ZXh0LnRleHQoYCR7Y291bnR9IHNlbGVjdGVkYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGVhcl9hbGwoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRfdmFsdWVzID0gW107XG4gICAgICAgIHRoaXMuJGlkKCdvcHRpb25zJykuZmluZCgnaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcbiAgICAgICAgdGhpcy51cGRhdGVfZGlzcGxheSgpO1xuXG4gICAgICAgIGlmICh0aGlzLmFyZ3Mub25fY2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLmFyZ3Mub25fY2hhbmdlKHRoaXMuc2VsZWN0ZWRfdmFsdWVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlbGVjdF9hbGwoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRfdmFsdWVzID0gdGhpcy5hbGxfb3B0aW9ucy5tYXAob3B0ID0+IG9wdC52YWx1ZSk7XG4gICAgICAgIHRoaXMuJGlkKCdvcHRpb25zJykuZmluZCgnaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJykucHJvcCgnY2hlY2tlZCcsIHRydWUpO1xuICAgICAgICB0aGlzLnVwZGF0ZV9kaXNwbGF5KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYXJncy5vbl9jaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuYXJncy5vbl9jaGFuZ2UodGhpcy5zZWxlY3RlZF92YWx1ZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0X3ZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZF92YWx1ZXM7XG4gICAgfVxuXG4gICAgc2V0X3ZhbHVlKHZhbHVlcykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkX3ZhbHVlcyA9IHZhbHVlcztcbiAgICAgICAgdGhpcy4kaWQoJ29wdGlvbnMnKS5maW5kKCdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0nKS5lYWNoKChpLCBlbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgJGVsID0gJChlbCk7XG4gICAgICAgICAgICAkZWwucHJvcCgnY2hlY2tlZCcsIHZhbHVlcy5pbmNsdWRlcygkZWwuYXR0cignZGF0YS12YWx1ZScpKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnVwZGF0ZV9kaXNwbGF5KCk7XG4gICAgfVxuXG4gICAgc2V0X29wdGlvbnMob3B0aW9ucykge1xuICAgICAgICB0aGlzLmFsbF9vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5yZW5kZXJfb3B0aW9ucyhvcHRpb25zKTtcbiAgICB9XG59XG4iLCJjbGFzcyBOb3RpZmljYXRpb25fQmFkZ2UgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgY29uc3QgJGNvdW50ID0gdGhpcy4kaWQoJ2NvdW50Jyk7XG4gICAgICAgIC8vIFVwZGF0ZSBjb3VudCBkeW5hbWljYWxseVxuICAgICAgICBpZiAodGhpcy5hcmdzLmNvdW50ID09PSAwIHx8IHRoaXMuYXJncy5jb3VudCA9PT0gJzAnKSB7XG4gICAgICAgICAgICAkY291bnQuaGlkZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0X2NvdW50KGNvdW50KSB7XG4gICAgICAgIGNvbnN0ICRjb3VudCA9IHRoaXMuJGlkKCdjb3VudCcpO1xuICAgICAgICAkY291bnQudGV4dChjb3VudCk7XG4gICAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgICAgICRjb3VudC5zaG93KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkY291bnQuaGlkZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiY2xhc3MgTm90aWZpY2F0aW9uX0Ryb3Bkb3duIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIC8vIE5vIHNwZWNpYWwgYmVoYXZpb3JcbiAgICB9XG59XG4iLCJjbGFzcyBPdmVyZHVlX0luZGljYXRvciBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIC8vIFB1cmUgQm9vdHN0cmFwIHN0eWxpbmcgLSBubyBKYXZhU2NyaXB0IG5lZWRlZFxufVxuIiwiLyoqXG4gKiBQYWdlX0hlYWRlciAtIEJvb3RzdHJhcCA1IFBhZ2UgQWN0aW9uIEJhciBDb21wb25lbnRcbiAqXG4gKiBQdXJwb3NlOiBUb3Agc2VjdGlvbiBvZiBwYWdlIGNvbnRhaW5pbmcgdGl0bGUsIGJyZWFkY3J1bWJzLCBhbmQgYWN0aW9uc1xuICogRGVzaWduOiBGbGV4Ym94IGxheW91dCB1c2luZyBCb290c3RyYXAgdXRpbGl0eSBjbGFzc2VzXG4gKiBMYXlvdXQ6IFRpdGxlL2JyZWFkY3J1bWJzIG9uIGxlZnQsIGFjdGlvbnMvYnV0dG9ucyBvbiByaWdodFxuICovXG5jbGFzcyBQYWdlX0hlYWRlciBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIC8vIFBhZ2VfSGVhZGVyIGlzIGEgcHVyZSBjb250YWluZXIgY29tcG9uZW50IC0gbm8gbGlmZWN5Y2xlIG1ldGhvZHMgbmVlZGVkXG4gICAgLy8gQWxsIGxheW91dCBmcm9tIEJvb3RzdHJhcCB1dGlsaXRpZXM6IGQtZmxleCwganVzdGlmeS1jb250ZW50LWJldHdlZW4sIGFsaWduLWl0ZW1zLWNlbnRlciwgcHktNFxufVxuIiwiY2xhc3MgUGFnZV9TZWN0aW9uIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgLy8gQ29udGVudCBzZWN0aW9uIHdpdGggc3BhY2luZyAtIG5vIHNwZWNpYWwgYmVoYXZpb3IgbmVlZGVkXG59XG4iLCJjbGFzcyBQYWdlIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgLy8gU2VtYW50aWMgcGFnZSBjb250YWluZXIgLSBubyBzcGVjaWFsIGJlaGF2aW9yIG5lZWRlZFxufVxuIiwiY2xhc3MgUG9wb3ZlciBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBTZXQgcG9wb3ZlciBjb250ZW50IGZyb20gYXJnc1xuICAgICAgICBpZiAodGhpcy5hcmdzLnRpdGxlKSB7XG4gICAgICAgICAgICB0aGlzLiQuYXR0cignZGF0YS1icy10aXRsZScsIHRoaXMuYXJncy50aXRsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcmdzLmNvbnRlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuJC5hdHRyKCdkYXRhLWJzLWNvbnRlbnQnLCB0aGlzLmFyZ3MuY29udGVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdHJpZ2dlciAoaG92ZXIsIGNsaWNrLCBmb2N1cylcbiAgICAgICAgdGhpcy4kLmF0dHIoJ2RhdGEtYnMtdHJpZ2dlcicsIHRoaXMuYXJncy50cmlnZ2VyIHx8ICdjbGljaycpO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgQm9vdHN0cmFwIHBvcG92ZXJcbiAgICAgICAgbmV3IGJvb3RzdHJhcC5Qb3BvdmVyKHRoaXMuJFswXSk7XG4gICAgfVxufVxuIiwiY2xhc3MgUHJvZ3Jlc3NfQmFyIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIGNvbnN0ICRiYXIgPSB0aGlzLiRpZCgnYmFyJyk7XG5cbiAgICAgICAgLy8gQXBwbHkgY29sb3IgZnJvbSBhcmdzXG4gICAgICAgIGlmICh0aGlzLmFyZ3MuY29sb3IpIHtcbiAgICAgICAgICAgICRiYXIuYWRkQ2xhc3MoYGJnLSR7dGhpcy5hcmdzLmNvbG9yfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2hvdyB2YWx1ZSB0ZXh0IGlmIHJlcXVlc3RlZFxuICAgICAgICBpZiAodGhpcy5hcmdzLnNob3dfdmFsdWUpIHtcbiAgICAgICAgICAgICRiYXIudGV4dChgJHt0aGlzLmFyZ3MudmFsdWUgfHwgMH0lYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRfdmFsdWUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgJGJhciA9IHRoaXMuJGlkKCdiYXInKTtcbiAgICAgICAgJGJhci5jc3MoJ3dpZHRoJywgYCR7dmFsdWV9JWApLmF0dHIoJ2FyaWEtdmFsdWVub3cnLCB2YWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLmFyZ3Muc2hvd192YWx1ZSkge1xuICAgICAgICAgICAgJGJhci50ZXh0KGAke3ZhbHVlfSVgKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKlxuICogUmFkaW9fQnV0dG9uIC0gQm9vdHN0cmFwIDUgUmFkaW8gSW5wdXQgQ29tcG9uZW50XG4gKlxuICogUHVycG9zZTogUmFkaW8gYnV0dG9uIGZvciBtdXR1YWxseSBleGNsdXNpdmUgc2VsZWN0aW9ucyB3aXRoaW4gYSBncm91cFxuICogRGVzaWduOiBCb290c3RyYXAgLmZvcm0tY2hlY2staW5wdXQgc3R5bGluZyB3aXRoIGNpcmN1bGFyIHNoYXBlXG4gKiBDUklUSUNBTDogQWxsIHJhZGlvcyBpbiBzYW1lIGdyb3VwIG11c3QgaGF2ZSBzYW1lIFwibmFtZVwiIGF0dHJpYnV0ZVxuICogV3JhcHBlcjogVHlwaWNhbGx5IHVzZWQgd2l0aGluIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCI+IGFuZCA8ZmllbGRzZXQ+XG4gKi9cbmNsYXNzIFJhZGlvX0J1dHRvbiBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBTZXQgbmFtZSBhdHRyaWJ1dGUgKENSSVRJQ0FMIGZvciBncm91cGluZylcbiAgICAgICAgaWYgKHRoaXMuYXJncy5uYW1lKSB7XG4gICAgICAgICAgICB0aGlzLiQuYXR0cignbmFtZScsIHRoaXMuYXJncy5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBjaGVja2VkIHN0YXRlIGlmIHByb3ZpZGVkXG4gICAgICAgIGlmICh0aGlzLmFyZ3MuY2hlY2tlZCkge1xuICAgICAgICAgICAgdGhpcy4kLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB2YWx1ZSBpZiBwcm92aWRlZFxuICAgICAgICBpZiAodGhpcy5hcmdzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLiQudmFsKHRoaXMuYXJncy52YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgY3VzdG9tIGNsYXNzZXMgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKHRoaXMuYXJncy5jbGFzcykge1xuICAgICAgICAgICAgdGhpcy4kLmFkZENsYXNzKHRoaXMuYXJncy5jbGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgZGlzYWJsZWQgc3RhdGUgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKHRoaXMuYXJncy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy4kLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgcmVxdWlyZWQgYXR0cmlidXRlIGlmIHByb3ZpZGVkXG4gICAgICAgIGlmICh0aGlzLmFyZ3MucmVxdWlyZWQpIHtcbiAgICAgICAgICAgIHRoaXMuJC5wcm9wKCdyZXF1aXJlZCcsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiY2xhc3MgUmljaF9UZXh0X0VkaXRvciBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICBjb25zdCAkZWRpdG9yID0gdGhpcy4kaWQoJ2VkaXRvcicpO1xuXG4gICAgICAgIC8vIFRvb2xiYXIgYnV0dG9uIGhhbmRsZXJzXG4gICAgICAgIHRoaXMuJGlkKCd0b29sYmFyJykuZmluZCgnW2RhdGEtY29tbWFuZF0nKS5vbignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgY29uc3QgY29tbWFuZCA9ICQoZS5jdXJyZW50VGFyZ2V0KS5hdHRyKCdkYXRhLWNvbW1hbmQnKTtcblxuICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT09ICdjcmVhdGVMaW5rJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IHByb21wdCgnRW50ZXIgVVJMOicpO1xuICAgICAgICAgICAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoY29tbWFuZCwgZmFsc2UsIHVybCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZChjb21tYW5kLCBmYWxzZSwgbnVsbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICRlZGl0b3IuZm9jdXMoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVHJhY2sgY2hhbmdlc1xuICAgICAgICAkZWRpdG9yLm9uKCdpbnB1dCcsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFyZ3Mub25fY2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcmdzLm9uX2NoYW5nZSh0aGlzLmdldF92YWx1ZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUHJldmVudCBkZWZhdWx0IGJlaGF2aW9yIG9uIHBhc3RlIChvcHRpb25hbCAtIGNhbiBiZSBjdXN0b21pemVkKVxuICAgICAgICAkZWRpdG9yLm9uKCdwYXN0ZScsIChlKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5hcmdzLnBsYWluX3RleHRfcGFzdGUpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQvcGxhaW4nKTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0VGV4dCcsIGZhbHNlLCB0ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0X3ZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4kaWQoJ2VkaXRvcicpLmh0bWwoKTtcbiAgICB9XG5cbiAgICBnZXRfdGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJGlkKCdlZGl0b3InKS50ZXh0KCk7XG4gICAgfVxuXG4gICAgc2V0X3ZhbHVlKGh0bWwpIHtcbiAgICAgICAgdGhpcy4kaWQoJ2VkaXRvcicpLmh0bWwoaHRtbCk7XG4gICAgfVxuXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuJGlkKCdlZGl0b3InKS5lbXB0eSgpO1xuICAgIH1cblxuICAgIGZvY3VzKCkge1xuICAgICAgICB0aGlzLiRpZCgnZWRpdG9yJykuZm9jdXMoKTtcbiAgICB9XG59XG4iLCJjbGFzcyBSb3dfQWN0aW9uX01lbnUgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgLy8gV3JhcCBjaGlsZHJlbiBpbiBkcm9wZG93biBzdHJ1Y3R1cmVcbiAgICAgICAgY29uc3QgJG1lbnUgPSB0aGlzLiRpZCgnbWVudScpO1xuICAgICAgICAkbWVudS5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zdCAkY2hpbGQgPSAkKHRoaXMpO1xuICAgICAgICAgICAgaWYgKCRjaGlsZC5wcm9wKCd0YWdOYW1lJykgIT09ICdMSScpIHtcbiAgICAgICAgICAgICAgICBpZiAoJGNoaWxkLnByb3AoJ3RhZ05hbWUnKSA9PT0gJ0hSJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCAkbGkgPSAkKCc8bGk+JykuYXBwZW5kKCQoJzxocj4nKS5hZGRDbGFzcygnZHJvcGRvd24tZGl2aWRlcicpKTtcbiAgICAgICAgICAgICAgICAgICAgJGNoaWxkLnJlcGxhY2VXaXRoKCRsaSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJGNoaWxkLmFkZENsYXNzKCdkcm9wZG93bi1pdGVtJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0ICRsaSA9ICQoJzxsaT4nKTtcbiAgICAgICAgICAgICAgICAgICAgJGNoaWxkLndyYXAoJGxpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIi8qKlxuICogU2FtcGxlX0RhdGFncmlkX0NvbXBvbmVudFxuICpcbiAqIEZ1bGwtZmVhdHVyZWQgZGF0YSB0YWJsZSB3aXRoOlxuICogLSBSb3cgc2VsZWN0aW9uIChjaGVja2JveGVzKVxuICogLSBQYWdpbmF0aW9uXG4gKiAtIFJvdyBhY3Rpb25zICh2aWV3LCBlZGl0LCBkZWxldGUpXG4gKiAtIExvYWRpbmcgc3RhdGVzIHdpdGggcGxhY2Vob2xkZXJzXG4gKiAtIEVtcHR5IHN0YXRlc1xuICpcbiAqIFVzYWdlOlxuICogPFNhbXBsZV9EYXRhZ3JpZF9Db21wb25lbnRcbiAqICAgJHRpdGxlPVwiQ2xpZW50IExpc3RcIlxuICogICAkZW50aXR5X25hbWU9XCJjbGllbnRzXCJcbiAqICAgJHNlbGVjdGFibGU9dHJ1ZVxuICogICAkcGFnaW5hdGlvbj10cnVlXG4gKiAgICRhbGxvd19kZWxldGU9dHJ1ZVxuICogICAkdmlld191cmw9XCIvY2xpZW50cy97aWR9XCJcbiAqICAgJGVkaXRfdXJsPVwiL2NsaWVudHMve2lkfS9lZGl0XCJcbiAqICAgJGFwaV91cmw9XCIvYXBpL2NsaWVudHNcIlxuICogICAkY29sdW1ucz1jb2x1bW5zX2RlZmluaXRpb25cbiAqIC8+XG4gKi9cbmNsYXNzIFNhbXBsZV9EYXRhZ3JpZF9Db21wb25lbnQgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcblxuICBhc3luYyBvbl9sb2FkKCkge1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgIC8vIElmIEFQSSBVUkwgcHJvdmlkZWQsIGZldGNoIGRhdGFcbiAgICBpZiAodGhhdC5hcmdzLmFwaV91cmwpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godGhhdC5hcmdzLmFwaV91cmwpO1xuICAgICAgdGhhdC5kYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBHZW5lcmF0ZSBzYW1wbGUgZGF0YSBmb3IgZGVtb25zdHJhdGlvblxuICAgICAgdGhhdC5kYXRhID0gdGhhdC5nZW5lcmF0ZV9zYW1wbGVfZGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIG9uX3JlYWR5KCkge1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgIC8vIFNlbGVjdCBhbGwgY2hlY2tib3hcbiAgICBpZiAodGhhdC5hcmdzLnNlbGVjdGFibGUpIHtcbiAgICAgIHRoYXQuJGlkKCdzZWxlY3RfYWxsJykub24oJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoZWNrZWQgPSBlLnRhcmdldC5jaGVja2VkO1xuICAgICAgICB0aGF0LiQuZmluZCgndGJvZHkgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJykucHJvcCgnY2hlY2tlZCcsIGNoZWNrZWQpO1xuICAgICAgICB0aGF0LnVwZGF0ZV9zZWxlY3Rpb25fY291bnQoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBJbmRpdmlkdWFsIHJvdyBjaGVja2JveGVzXG4gICAgICB0aGF0LiQuZmluZCgndGJvZHkgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJykub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgdGhhdC51cGRhdGVfc2VsZWN0aW9uX2NvdW50KCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEZWxldGUgYnV0dG9uc1xuICAgIGlmICh0aGF0LmFyZ3MuYWxsb3dfZGVsZXRlKSB7XG4gICAgICB0aGF0LiQuZmluZCgnYnV0dG9uW2RhdGEtaWRdJykub24oJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgY29uc3QgJGJ1dHRvbiA9ICQoZS5jdXJyZW50VGFyZ2V0KTtcbiAgICAgICAgY29uc3QgaWQgPSAkYnV0dG9uLmRhdGEoJ2lkJyk7XG4gICAgICAgIHRoYXQuY29uZmlybV9kZWxldGUoaWQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUGFnaW5hdGlvblxuICAgIGlmICh0aGF0LmFyZ3MucGFnaW5hdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgIHRoYXQuJGlkKCdwcmV2X3BhZ2UnKS5vbignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoYXQuZ29fdG9fcGFnZSh0aGF0LmRhdGEucGFnaW5hdGlvbi5jdXJyZW50X3BhZ2UgLSAxKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGF0LiRpZCgnbmV4dF9wYWdlJykub24oJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGF0LmdvX3RvX3BhZ2UodGhhdC5kYXRhLnBhZ2luYXRpb24uY3VycmVudF9wYWdlICsgMSk7XG4gICAgICB9KTtcblxuICAgICAgdGhhdC4kLmZpbmQoJy5wYWdlLWxpbmtbZGF0YS1wYWdlXScpLm9uKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgJGxpbmsgPSAkKGUuY3VycmVudFRhcmdldCk7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBpbnQoJGxpbmsuZGF0YSgncGFnZScpKTtcbiAgICAgICAgdGhhdC5nb190b19wYWdlKHBhZ2UpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBVSSB0byBzaG93IGhvdyBtYW55IHJvd3MgYXJlIHNlbGVjdGVkXG4gICAqL1xuICB1cGRhdGVfc2VsZWN0aW9uX2NvdW50KCkge1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhhdC4kLmZpbmQoJ3Rib2R5IGlucHV0W3R5cGU9XCJjaGVja2JveFwiXTpjaGVja2VkJykubGVuZ3RoO1xuXG4gICAgaWYgKHNlbGVjdGVkID4gMCkge1xuICAgICAgLy8gQ291bGQgc2hvdyBhIGJhbm5lcjogXCIzIGl0ZW1zIHNlbGVjdGVkXCJcbiAgICAgIGNvbnNvbGUubG9nKGAke3NlbGVjdGVkfSBpdGVtcyBzZWxlY3RlZGApO1xuXG4gICAgICAvLyBGaXJlIGV2ZW50IGZvciBwYXJlbnQgY29tcG9uZW50cyB0byBsaXN0ZW4gdG9cbiAgICAgIHRoYXQuJC50cmlnZ2VyKCdzZWxlY3Rpb246Y2hhbmdlZCcsIHsgY291bnQ6IHNlbGVjdGVkIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYXJyYXkgb2Ygc2VsZWN0ZWQgSURzXG4gICAqL1xuICBnZXRfc2VsZWN0ZWRfaWRzKCkge1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgIGNvbnN0IGlkcyA9IFtdO1xuICAgIHRoYXQuJC5maW5kKCd0Ym9keSBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06Y2hlY2tlZCcpLmVhY2goKGksIGNoZWNrYm94KSA9PiB7XG4gICAgICBjb25zdCAkY2hlY2tib3ggPSAkKGNoZWNrYm94KTtcbiAgICAgIGNvbnN0IGlkID0gJGNoZWNrYm94LmRhdGEoJ2lkJyk7XG4gICAgICBpZiAoaWQpIGlkcy5wdXNoKGlkKTtcbiAgICB9KTtcbiAgICByZXR1cm4gaWRzO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBzZWxlY3Rpb25zXG4gICAqL1xuICBjbGVhcl9zZWxlY3Rpb24oKSB7XG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgdGhhdC4kLmZpbmQoJ2lucHV0W3R5cGU9XCJjaGVja2JveFwiXScpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG4gICAgdGhhdC51cGRhdGVfc2VsZWN0aW9uX2NvdW50KCk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlybSBkZWxldGlvbiBvZiBhIHJvd1xuICAgKi9cbiAgY29uZmlybV9kZWxldGUoaWQpIHtcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICAvLyBJbiBhIHJlYWwgYXBwLCBzaG93IGEgQm9vdHN0cmFwIG1vZGFsXG4gICAgaWYgKGNvbmZpcm0oJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBpdGVtPycpKSB7XG4gICAgICB0aGF0LmRlbGV0ZV9yb3coaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSByb3cgKHdvdWxkIHR5cGljYWxseSBtYWtlIEFQSSBjYWxsKVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlX3JvdyhpZCkge1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgIHRyeSB7XG4gICAgICAvLyBNYWtlIEFQSSBjYWxsXG4gICAgICAvLyBhd2FpdCBmZXRjaChgJHt0aGF0LmFyZ3MuYXBpX3VybH0vJHtpZH1gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG5cbiAgICAgIC8vIFJlbW92ZSByb3cgZnJvbSBkYXRhXG4gICAgICB0aGF0LmRhdGEucm93cyA9IHRoYXQuZGF0YS5yb3dzLmZpbHRlcihyb3cgPT4gcm93LmlkICE9PSBpZCk7XG5cbiAgICAgIC8vIFJlLXJlbmRlciBjb21wb25lbnRcbiAgICAgIHRoYXQucmVmcmVzaCgpO1xuXG4gICAgICAvLyBTaG93IHN1Y2Nlc3MgbWVzc2FnZVxuICAgICAgY29uc29sZS5sb2coYERlbGV0ZWQgaXRlbSAke2lkfWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdEZWxldGUgZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIGFsZXJ0KCdGYWlsZWQgdG8gZGVsZXRlIGl0ZW0nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTmF2aWdhdGUgdG8gYSBzcGVjaWZpYyBwYWdlXG4gICAqL1xuICBhc3luYyBnb190b19wYWdlKHBhZ2UpIHtcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICBpZiAocGFnZSA8IDEgfHwgcGFnZSA+IHRoYXQuZGF0YS5wYWdpbmF0aW9uLnRvdGFsX3BhZ2VzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2hvdyBsb2FkaW5nIHN0YXRlXG4gICAgdGhhdC4kLmZpbmQoJ3Rib2R5JykuY3NzKCdvcGFjaXR5JywgJzAuNScpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEZldGNoIG5ldyBwYWdlXG4gICAgICBjb25zdCB1cmwgPSBgJHt0aGF0LmFyZ3MuYXBpX3VybH0/cGFnZT0ke3BhZ2V9YDtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgIHRoYXQuZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgLy8gUmUtcmVuZGVyXG4gICAgICB0aGF0LnJlZnJlc2goKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignUGFnaW5hdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgdGhhdC4kLmZpbmQoJ3Rib2R5JykuY3NzKCdvcGFjaXR5JywgJzEnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaCB0aGUgdGFibGUgKHJlbG9hZCBkYXRhIGFuZCByZS1yZW5kZXIpXG4gICAqL1xuICBhc3luYyByZWxvYWRfZGF0YSgpIHtcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICB0aGF0LmRhdGEgPSB7fTsgLy8gQ2xlYXIgZGF0YSB0byBzaG93IGxvYWRpbmcgc3RhdGVcbiAgICB0aGF0LnJlZnJlc2goKTtcblxuICAgIGF3YWl0IHRoYXQub25fbG9hZCgpO1xuICAgIHRoYXQucmVmcmVzaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHNhbXBsZSBkYXRhIGZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzXG4gICAqL1xuICBnZW5lcmF0ZV9zYW1wbGVfZGF0YSgpIHtcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICBjb25zdCBzdGF0dXNlcyA9IFtcbiAgICAgIHsgbGFiZWw6ICdBY3RpdmUnLCBjb2xvcjogJ3N1Y2Nlc3MnIH0sXG4gICAgICB7IGxhYmVsOiAnUGVuZGluZycsIGNvbG9yOiAnd2FybmluZycgfSxcbiAgICAgIHsgbGFiZWw6ICdJbmFjdGl2ZScsIGNvbG9yOiAnc2Vjb25kYXJ5JyB9LFxuICAgICAgeyBsYWJlbDogJ1N1c3BlbmRlZCcsIGNvbG9yOiAnZGFuZ2VyJyB9XG4gICAgXTtcblxuICAgIGNvbnN0IGZpcnN0X25hbWVzID0gWydKb2huJywgJ1NhcmFoJywgJ01pY2hhZWwnLCAnRW1pbHknLCAnRGF2aWQnLCAnTGlzYScsICdSb2JlcnQnLCAnSmVubmlmZXInLCAnV2lsbGlhbScsICdBbWFuZGEnXTtcbiAgICBjb25zdCBsYXN0X25hbWVzID0gWydTbWl0aCcsICdKb2huc29uJywgJ0Jyb3duJywgJ0dhcmNpYScsICdNYXJ0aW5leicsICdMZWUnLCAnQW5kZXJzb24nLCAnVGhvbXBzb24nLCAnV2hpdGUnLCAnRGF2aXMnXTtcbiAgICBjb25zdCBjb21wYW5pZXMgPSBbJ0FjbWUgQ29ycCcsICdUZWNoIFNvbHV0aW9ucycsICdHbG9iYWwgRW50ZXJwcmlzZXMnLCAnSW5ub3ZhdGlvbiBMYWJzJywgJ0RpZ2l0YWwgU3lzdGVtcycsICdDbG91ZCBTZXJ2aWNlcycsICdTbWFydCBJbmR1c3RyaWVzJywgJ0Z1dHVyZSBOZXR3b3JrcycsICdQcmltZSBDb25zdWx0aW5nJywgJ0VsaXRlIFBhcnRuZXJzJ107XG5cbiAgICBjb25zdCByb3dzID0gW107XG4gICAgY29uc3QgY291bnQgPSB0aGF0LmFyZ3Muc2hvd2luZyB8fCAxMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgY29uc3QgZmlyc3RfbmFtZSA9IGZpcnN0X25hbWVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGZpcnN0X25hbWVzLmxlbmd0aCldO1xuICAgICAgY29uc3QgbGFzdF9uYW1lID0gbGFzdF9uYW1lc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBsYXN0X25hbWVzLmxlbmd0aCldO1xuICAgICAgY29uc3QgY29tcGFueSA9IGNvbXBhbmllc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjb21wYW5pZXMubGVuZ3RoKV07XG4gICAgICBjb25zdCBzdGF0dXMgPSBzdGF0dXNlc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBzdGF0dXNlcy5sZW5ndGgpXTtcblxuICAgICAgcm93cy5wdXNoKHtcbiAgICAgICAgaWQ6IGBDJHtzdHIoaSArIDEpLnBhZFN0YXJ0KDMsICcwJyl9YCxcbiAgICAgICAgbmFtZTogYCR7Zmlyc3RfbmFtZX0gJHtsYXN0X25hbWV9YCxcbiAgICAgICAgY29tcGFueTogY29tcGFueSxcbiAgICAgICAgZW1haWw6IGAke2ZpcnN0X25hbWUudG9Mb3dlckNhc2UoKX0uJHtsYXN0X25hbWUudG9Mb3dlckNhc2UoKX1AJHtjb21wYW55LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnJyl9LmNvbWAsXG4gICAgICAgIHBob25lOiBgKDU1NSkgJHtzdHIoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogOTAwKSArIDEwMCl9LSR7c3RyKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDkwMDApICsgMTAwMCl9YCxcbiAgICAgICAgc3RhdHVzOiBzdGF0dXMubGFiZWwsXG4gICAgICAgIHN0YXR1c19jb2xvcjogc3RhdHVzLmNvbG9yLFxuICAgICAgICBjcmVhdGVkOiB0aGF0LnJhbmRvbV9kYXRlKClcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByb3dzOiByb3dzLFxuICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICBjdXJyZW50X3BhZ2U6IDEsXG4gICAgICAgIHRvdGFsX3BhZ2VzOiBNYXRoLmNlaWwoKHRoYXQuYXJncy50b3RhbCB8fCAxMDApIC8gY291bnQpLFxuICAgICAgICBmcm9tOiAxLFxuICAgICAgICB0bzogY291bnQsXG4gICAgICAgIHRvdGFsOiB0aGF0LmFyZ3MudG90YWwgfHwgMTAwLFxuICAgICAgICBwYWdlczogWzEsIDIsIDMsICcuLi4nLCBNYXRoLmNlaWwoKHRoYXQuYXJncy50b3RhbCB8fCAxMDApIC8gY291bnQpXVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgcmFuZG9tIGRhdGUgZm9yIHNhbXBsZSBkYXRhXG4gICAqL1xuICByYW5kb21fZGF0ZSgpIHtcbiAgICBjb25zdCBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ107XG4gICAgY29uc3QgbW9udGggPSBtb250aHNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTIpXTtcbiAgICBjb25zdCBkYXkgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyOCkgKyAxO1xuICAgIHJldHVybiBgJHttb250aH0gJHtzdHIoZGF5KS5wYWRTdGFydCgyLCAnMCcpfSwgMjAyNGA7XG4gIH1cbn1cbiIsImNsYXNzIFNlYXJjaF9CYXIgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgLy8gQmluZCBzZWFyY2ggZXZlbnRcbiAgICAgICAgY29uc3QgJGlucHV0ID0gdGhpcy4kaWQoJ2lucHV0Jyk7XG4gICAgICAgICRpbnB1dC5vbignaW5wdXQnLCAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXJncy5vbl9zZWFyY2gpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFyZ3Mub25fc2VhcmNoKGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiY2xhc3MgU2VhcmNoYWJsZV9TZWxlY3QgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZF92YWx1ZSA9IHRoaXMuYXJncy52YWx1ZSB8fCBudWxsO1xuICAgICAgICB0aGlzLmFsbF9vcHRpb25zID0gdGhpcy5hcmdzLm9wdGlvbnMgfHwgW107XG5cbiAgICAgICAgaWYgKHRoaXMuYWxsX29wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJfb3B0aW9ucyh0aGlzLmFsbF9vcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNlYXJjaCBmdW5jdGlvbmFsaXR5XG4gICAgICAgIGNvbnN0ICRzZWFyY2ggPSB0aGlzLiRpZCgnc2VhcmNoJyk7XG4gICAgICAgICRzZWFyY2gub24oJ2lucHV0JywgKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyX29wdGlvbnMoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBQcmV2ZW50IGRyb3Bkb3duIGNsb3NlIHdoZW4gY2xpY2tpbmcgc2VhcmNoIGlucHV0XG4gICAgICAgICRzZWFyY2gub24oJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzZWxlY3RlZCB0ZXh0IGlmIGluaXRpYWwgdmFsdWUgcHJvdmlkZWRcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRfdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkX29wdGlvbiA9IHRoaXMuYWxsX29wdGlvbnMuZmluZChvcHQgPT4gb3B0LnZhbHVlID09IHRoaXMuc2VsZWN0ZWRfdmFsdWUpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkX29wdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuJGlkKCdzZWxlY3RlZF90ZXh0JykudGV4dChzZWxlY3RlZF9vcHRpb24ubGFiZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyX29wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBjb25zdCAkY29udGFpbmVyID0gdGhpcy4kaWQoJ29wdGlvbnMnKTtcbiAgICAgICAgJGNvbnRhaW5lci5lbXB0eSgpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgJGNvbnRhaW5lci5hcHBlbmQoJCgnPGRpdj4nKS5hZGRDbGFzcygncHgtMyBweS0yIHRleHQtbXV0ZWQnKS50ZXh0KCdObyBvcHRpb25zIGZvdW5kJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiB7XG4gICAgICAgICAgICBjb25zdCAkaXRlbSA9ICQoJzxhPicpXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKCdkcm9wZG93bi1pdGVtJylcbiAgICAgICAgICAgICAgICAuYXR0cignaHJlZicsICcjJylcbiAgICAgICAgICAgICAgICAudGV4dChvcHRpb24ubGFiZWwpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2RhdGEtdmFsdWUnLCBvcHRpb24udmFsdWUpO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9uLnZhbHVlID09IHRoaXMuc2VsZWN0ZWRfdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAkaXRlbS5hZGRDbGFzcygnYWN0aXZlJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICRpdGVtLm9uKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0X29wdGlvbihvcHRpb24pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICRjb250YWluZXIuYXBwZW5kKCRpdGVtKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZmlsdGVyX29wdGlvbnMocXVlcnkpIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLmFsbF9vcHRpb25zLmZpbHRlcihvcHQgPT5cbiAgICAgICAgICAgIG9wdC5sYWJlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5LnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucmVuZGVyX29wdGlvbnMoZmlsdGVyZWQpO1xuICAgIH1cblxuICAgIHNlbGVjdF9vcHRpb24ob3B0aW9uKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRfdmFsdWUgPSBvcHRpb24udmFsdWU7XG4gICAgICAgIHRoaXMuJGlkKCdzZWxlY3RlZF90ZXh0JykudGV4dChvcHRpb24ubGFiZWwpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBhY3RpdmUgc3RhdGVcbiAgICAgICAgdGhpcy4kaWQoJ29wdGlvbnMnKS5maW5kKCcuZHJvcGRvd24taXRlbScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgdGhpcy4kaWQoJ29wdGlvbnMnKS5maW5kKGBbZGF0YS12YWx1ZT1cIiR7b3B0aW9uLnZhbHVlfVwiXWApLmFkZENsYXNzKCdhY3RpdmUnKTtcblxuICAgICAgICAvLyBDbG9zZSBkcm9wZG93blxuICAgICAgICBjb25zdCBkcm9wZG93biA9IGJvb3RzdHJhcC5Ecm9wZG93bi5nZXRJbnN0YW5jZSh0aGlzLiRpZCgnYnV0dG9uJylbMF0pO1xuICAgICAgICBpZiAoZHJvcGRvd24pIHtcbiAgICAgICAgICAgIGRyb3Bkb3duLmhpZGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFyIHNlYXJjaFxuICAgICAgICB0aGlzLiRpZCgnc2VhcmNoJykudmFsKCcnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJfb3B0aW9ucyh0aGlzLmFsbF9vcHRpb25zKTtcblxuICAgICAgICAvLyBUcmlnZ2VyIGNhbGxiYWNrXG4gICAgICAgIGlmICh0aGlzLmFyZ3Mub25fY2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLmFyZ3Mub25fY2hhbmdlKG9wdGlvbi52YWx1ZSwgb3B0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldF92YWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRfdmFsdWU7XG4gICAgfVxuXG4gICAgc2V0X3ZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRfdmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5hbGxfb3B0aW9ucy5maW5kKG9wdCA9PiBvcHQudmFsdWUgPT0gdmFsdWUpO1xuICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLiRpZCgnc2VsZWN0ZWRfdGV4dCcpLnRleHQob3B0aW9uLmxhYmVsKTtcbiAgICAgICAgICAgIHRoaXMuJGlkKCdvcHRpb25zJykuZmluZCgnLmRyb3Bkb3duLWl0ZW0nKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XG4gICAgICAgICAgICB0aGlzLiRpZCgnb3B0aW9ucycpLmZpbmQoYFtkYXRhLXZhbHVlPVwiJHt2YWx1ZX1cIl1gKS5hZGRDbGFzcygnYWN0aXZlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRfb3B0aW9ucyhvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuYWxsX29wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLnJlbmRlcl9vcHRpb25zKG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsIi8qKlxuICogU2VsZWN0X0Ryb3Bkb3duIC0gQm9vdHN0cmFwIDUgRHJvcGRvd24gU2VsZWN0aW9uIENvbXBvbmVudFxuICpcbiAqIFB1cnBvc2U6IERyb3Bkb3duIG1lbnUgZm9yIHNlbGVjdGluZyBvbmUgb3B0aW9uIGZyb20gYSBsaXN0XG4gKiBEZXNpZ246IEJvb3RzdHJhcCAuZm9ybS1zZWxlY3Qgc3R5bGluZyB3aXRoIGRyb3Bkb3duIGFycm93XG4gKiBDb250ZW50OiBDb250YWlucyA8b3B0aW9uPiBlbGVtZW50c1xuICovXG5jbGFzcyBTZWxlY3RfRHJvcGRvd24gZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgLy8gU2V0IHZhbHVlIGlmIHByb3ZpZGVkXG4gICAgICAgIGlmICh0aGlzLmFyZ3MudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuJC52YWwodGhpcy5hcmdzLnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBjdXN0b20gY2xhc3NlcyBpZiBwcm92aWRlZFxuICAgICAgICBpZiAodGhpcy5hcmdzLmNsYXNzKSB7XG4gICAgICAgICAgICB0aGlzLiQuYWRkQ2xhc3ModGhpcy5hcmdzLmNsYXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBkaXNhYmxlZCBzdGF0ZSBpZiBwcm92aWRlZFxuICAgICAgICBpZiAodGhpcy5hcmdzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLiQucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCByZXF1aXJlZCBhdHRyaWJ1dGUgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKHRoaXMuYXJncy5yZXF1aXJlZCkge1xuICAgICAgICAgICAgdGhpcy4kLnByb3AoJ3JlcXVpcmVkJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJjbGFzcyBTaWRlYmFyX05hdiBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBBdXRvLXdyYXAgY2hpbGRyZW4gaW4gbmF2IHN0cnVjdHVyZSBpZiBuZWVkZWRcbiAgICAgICAgY29uc3QgJG5hdl9pdGVtcyA9IHRoaXMuJGlkKCduYXZfaXRlbXMnKTtcbiAgICAgICAgJG5hdl9pdGVtcy5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zdCAkY2hpbGQgPSAkKHRoaXMpO1xuICAgICAgICAgICAgaWYgKCRjaGlsZC5wcm9wKCd0YWdOYW1lJykgIT09ICdMSScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCAkbGkgPSAkKCc8bGk+JykuYWRkQ2xhc3MoJ25hdi1pdGVtJyk7XG4gICAgICAgICAgICAgICAgJGNoaWxkLmFkZENsYXNzKCduYXYtbGluaycpO1xuICAgICAgICAgICAgICAgICRjaGlsZC53cmFwKCRsaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNldCBhY3RpdmUgc3RhdGUgYmFzZWQgb24gY3VycmVudCBVUkxcbiAgICAgICAgY29uc3QgY3VycmVudF9wYXRoID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgICAgICAkbmF2X2l0ZW1zLmZpbmQoJ2EubmF2LWxpbmsnKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY29uc3QgJGxpbmsgPSAkKHRoaXMpO1xuICAgICAgICAgICAgaWYgKCRsaW5rLmF0dHIoJ2hyZWYnKSA9PT0gY3VycmVudF9wYXRoKSB7XG4gICAgICAgICAgICAgICAgJGxpbmsuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJjbGFzcyBTb3J0YWJsZV9Db2x1bW5fSGVhZGVyIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIC8vIENsaWNrIHRvIHRvZ2dsZSBzb3J0XG4gICAgICAgIHRoaXMuJC5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZV9zb3J0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNldCBpbml0aWFsIHNvcnQgc3RhdGVcbiAgICAgICAgaWYgKHRoaXMuYXJncy5zb3J0KSB7XG4gICAgICAgICAgICB0aGlzLnNldF9zb3J0KHRoaXMuYXJncy5zb3J0KTsgLy8gJ2FzYycgb3IgJ2Rlc2MnXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b2dnbGVfc29ydCgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuJC5hdHRyKCdkYXRhLXNvcnQnKSB8fCAnbm9uZSc7XG4gICAgICAgIGNvbnN0IG5leHQgPSBjdXJyZW50ID09PSAnbm9uZScgPyAnYXNjJyA6IGN1cnJlbnQgPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYyc7XG4gICAgICAgIHRoaXMuc2V0X3NvcnQobmV4dCk7XG5cbiAgICAgICAgLy8gQ2FsbCBjYWxsYmFjayBpZiBwcm92aWRlZFxuICAgICAgICBpZiAodGhpcy5hcmdzLm9uX3NvcnQpIHtcbiAgICAgICAgICAgIHRoaXMuYXJncy5vbl9zb3J0KHRoaXMuYXJncy5jb2x1bW4sIG5leHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0X3NvcnQoZGlyZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuJC5hdHRyKCdkYXRhLXNvcnQnLCBkaXJlY3Rpb24pO1xuICAgICAgICBjb25zdCAkaWNvbiA9IHRoaXMuJGlkKCdzb3J0X2ljb24nKTtcblxuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAnYXNjJykge1xuICAgICAgICAgICAgJGljb24uaHRtbCgnPGkgY2xhc3M9XCJ0ZXh0LXByaW1hcnlcIj7ihpE8L2k+Jyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSAnZGVzYycpIHtcbiAgICAgICAgICAgICRpY29uLmh0bWwoJzxpIGNsYXNzPVwidGV4dC1wcmltYXJ5XCI+4oaTPC9pPicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJGljb24uaHRtbCgnPGkgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+4oeFPC9pPicpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiY2xhc3MgU3Bpbm5lciBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBBcHBseSBzaXplIChzbSlcbiAgICAgICAgaWYgKHRoaXMuYXJncy5zaXplID09PSAnc20nKSB7XG4gICAgICAgICAgICB0aGlzLiQuYWRkQ2xhc3MoJ3NwaW5uZXItYm9yZGVyLXNtJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBjb2xvclxuICAgICAgICBpZiAodGhpcy5hcmdzLmNvbG9yKSB7XG4gICAgICAgICAgICB0aGlzLiQuYWRkQ2xhc3MoYHRleHQtJHt0aGlzLmFyZ3MuY29sb3J9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJjbGFzcyBTdGF0X0NhcmQgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgLy8gTm8gc3BlY2lhbCBiZWhhdmlvclxuICAgIH1cbn1cbiIsImNsYXNzIFN0YXR1c19CYWRnZSBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBBcHBseSBjb2xvciBiYXNlZCBvbiBjb250ZW50IG9yIGFyZ3NcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5hcmdzLnN0YXR1cyB8fCB0aGlzLiQudGV4dCgpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIERlZmF1bHQgY29sb3IgbWFwcGluZ3NcbiAgICAgICAgY29uc3QgY29sb3JfbWFwID0ge1xuICAgICAgICAgICAgJ2FjdGl2ZSc6ICdiZy1zdWNjZXNzJyxcbiAgICAgICAgICAgICdwZW5kaW5nJzogJ2JnLXdhcm5pbmcnLFxuICAgICAgICAgICAgJ2NvbXBsZXRlZCc6ICdiZy1wcmltYXJ5JyxcbiAgICAgICAgICAgICdjYW5jZWxsZWQnOiAnYmctZGFuZ2VyJyxcbiAgICAgICAgICAgICdkcmFmdCc6ICdiZy1zZWNvbmRhcnknLFxuICAgICAgICAgICAgJ2FyY2hpdmVkJzogJ2JnLWRhcmsnXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgYmdfY2xhc3MgPSB0aGlzLmFyZ3MuYmdfY2xhc3MgfHwgY29sb3JfbWFwW3N0YXR1c10gfHwgJ2JnLXNlY29uZGFyeSc7XG4gICAgICAgIHRoaXMuJC5hZGRDbGFzcyhiZ19jbGFzcyk7XG4gICAgfVxufVxuIiwiY2xhc3MgVGFiX0NvbnRlbnQgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgLy8gRW5zdXJlIGNoaWxkcmVuIGhhdmUgdGFiLXBhbmUgY2xhc3NcbiAgICAgICAgdGhpcy4kLmNoaWxkcmVuKCkuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNvbnN0ICRjaGlsZCA9ICQodGhpcyk7XG4gICAgICAgICAgICAkY2hpbGQuYWRkQ2xhc3MoJ3RhYi1wYW5lIGZhZGUnKTtcblxuICAgICAgICAgICAgLy8gU2V0IGZpcnN0IHBhbmUgYXMgYWN0aXZlIGlmIG5vbmUgYWN0aXZlXG4gICAgICAgICAgICBpZiAoJGNoaWxkLnBhcmVudCgpLmZpbmQoJy50YWItcGFuZS5hY3RpdmUnKS5sZW5ndGggPT09IDAgJiYgJGNoaWxkLmluZGV4KCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAkY2hpbGQuYWRkQ2xhc3MoJ3Nob3cgYWN0aXZlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImNsYXNzIFRhYmxlX1BhZ2luYXRpb24gZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgLy8gR2VuZXJhdGUgcGFnaW5hdGlvbiBpZiBwYWdlcyBwcm92aWRlZCB2aWEgYXJnc1xuICAgICAgICBpZiAodGhpcy5hcmdzLmN1cnJlbnRfcGFnZSAmJiB0aGlzLmFyZ3MudG90YWxfcGFnZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVfcGFnaW5hdGlvbih0aGlzLmFyZ3MuY3VycmVudF9wYWdlLCB0aGlzLmFyZ3MudG90YWxfcGFnZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2VuZXJhdGVfcGFnaW5hdGlvbihjdXJyZW50LCB0b3RhbCkge1xuICAgICAgICBjb25zdCAkcGFnaW5hdGlvbiA9IHRoaXMuJGlkKCdwYWdpbmF0aW9uJyk7XG4gICAgICAgICRwYWdpbmF0aW9uLmVtcHR5KCk7XG5cbiAgICAgICAgLy8gUHJldmlvdXMgYnV0dG9uXG4gICAgICAgIGNvbnN0ICRwcmV2ID0gJCgnPGxpPicpLmFkZENsYXNzKCdwYWdlLWl0ZW0nICsgKGN1cnJlbnQgPT09IDEgPyAnIGRpc2FibGVkJyA6ICcnKSk7XG4gICAgICAgICRwcmV2LmFwcGVuZCgkKCc8YT4nKS5hZGRDbGFzcygncGFnZS1saW5rJykuYXR0cignaHJlZicsICcjJykudGV4dCgnUHJldmlvdXMnKSk7XG4gICAgICAgICRwYWdpbmF0aW9uLmFwcGVuZCgkcHJldik7XG5cbiAgICAgICAgLy8gUGFnZSBudW1iZXJzIChzaG93IDUgcGFnZXMgbWF4KVxuICAgICAgICBsZXQgc3RhcnQgPSBNYXRoLm1heCgxLCBjdXJyZW50IC0gMik7XG4gICAgICAgIGxldCBlbmQgPSBNYXRoLm1pbih0b3RhbCwgY3VycmVudCArIDIpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgJGxpID0gJCgnPGxpPicpLmFkZENsYXNzKCdwYWdlLWl0ZW0nICsgKGkgPT09IGN1cnJlbnQgPyAnIGFjdGl2ZScgOiAnJykpO1xuICAgICAgICAgICAgJGxpLmFwcGVuZCgkKCc8YT4nKS5hZGRDbGFzcygncGFnZS1saW5rJykuYXR0cignaHJlZicsICcjJykudGV4dChpKSk7XG4gICAgICAgICAgICAkcGFnaW5hdGlvbi5hcHBlbmQoJGxpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5leHQgYnV0dG9uXG4gICAgICAgIGNvbnN0ICRuZXh0ID0gJCgnPGxpPicpLmFkZENsYXNzKCdwYWdlLWl0ZW0nICsgKGN1cnJlbnQgPT09IHRvdGFsID8gJyBkaXNhYmxlZCcgOiAnJykpO1xuICAgICAgICAkbmV4dC5hcHBlbmQoJCgnPGE+JykuYWRkQ2xhc3MoJ3BhZ2UtbGluaycpLmF0dHIoJ2hyZWYnLCAnIycpLnRleHQoJ05leHQnKSk7XG4gICAgICAgICRwYWdpbmF0aW9uLmFwcGVuZCgkbmV4dCk7XG4gICAgfVxufVxuIiwiY2xhc3MgVGFibGUgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgLy8gQXBwbHkgdmFyaWFudCBmcm9tIGFyZ3NcbiAgICAgICAgaWYgKHRoaXMuYXJncy52YXJpYW50KSB7XG4gICAgICAgICAgICB0aGlzLiQuYWRkQ2xhc3MoYHRhYmxlLSR7dGhpcy5hcmdzLnZhcmlhbnR9YCk7IC8vIHN0cmlwZWQsIGJvcmRlcmVkLCBib3JkZXJsZXNzXG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBzaXplXG4gICAgICAgIGlmICh0aGlzLmFyZ3Muc2l6ZSA9PT0gJ3NtJykge1xuICAgICAgICAgICAgdGhpcy4kLmFkZENsYXNzKCd0YWJsZS1zbScpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiY2xhc3MgVGFicyBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBXcmFwIGNoaWxkcmVuIGluIG5hdi1pdGVtIHN0cnVjdHVyZVxuICAgICAgICB0aGlzLiQuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY29uc3QgJGNoaWxkID0gJCh0aGlzKTtcbiAgICAgICAgICAgIGlmICgkY2hpbGQucHJvcCgndGFnTmFtZScpICE9PSAnTEknKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgJGxpID0gJCgnPGxpPicpLmFkZENsYXNzKCduYXYtaXRlbScpO1xuICAgICAgICAgICAgICAgICRjaGlsZC5hZGRDbGFzcygnbmF2LWxpbmsnKTtcbiAgICAgICAgICAgICAgICAkY2hpbGQud3JhcCgkbGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTZXQgZmlyc3QgdGFiIGFzIGFjdGl2ZSBpZiBub25lIGFjdGl2ZVxuICAgICAgICBpZiAodGhpcy4kLmZpbmQoJy5uYXYtbGluay5hY3RpdmUnKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuJC5maW5kKCcubmF2LWxpbmsnKS5maXJzdCgpLmFkZENsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImNsYXNzIFRhZ19Hcm91cCBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBObyBzcGVjaWFsIGJlaGF2aW9yIG5lZWRlZFxuICAgIH1cbn1cbiIsImNsYXNzIFRhZyBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBBcHBseSBjb2xvciBmcm9tIGFyZ3NcbiAgICAgICAgaWYgKHRoaXMuYXJncy5jb2xvcikge1xuICAgICAgICAgICAgdGhpcy4kLnJlbW92ZUNsYXNzKCdiZy1zZWNvbmRhcnknKS5hZGRDbGFzcyhgYmctJHt0aGlzLmFyZ3MuY29sb3J9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJjbGFzcyBUZXh0X0Rpc3BsYXkgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICAvLyBHZW5lcmljIHRleHQgZGlzcGxheSAtIGluaGVyaXRzIEJvb3RzdHJhcCB0eXBvZ3JhcGh5XG59XG4iLCIvKipcbiAqIFRleHRhcmVhIC0gQm9vdHN0cmFwIDUgTXVsdGktbGluZSBUZXh0IElucHV0IENvbXBvbmVudFxuICpcbiAqIFB1cnBvc2U6IE11bHRpLWxpbmUgdGV4dCBpbnB1dCBmb3IgbG9uZ2VyIGNvbnRlbnQgbGlrZSBkZXNjcmlwdGlvbnMsIGNvbW1lbnRzLCBub3Rlc1xuICogRGVzaWduOiBCb290c3RyYXAgLmZvcm0tY29udHJvbCBzdHlsaW5nIChzYW1lIGFzIElucHV0KVxuICovXG5jbGFzcyBUZXh0YXJlYSBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBTZXQgcm93cyBpZiBwcm92aWRlZFxuICAgICAgICBpZiAodGhpcy5hcmdzLnJvd3MpIHtcbiAgICAgICAgICAgIHRoaXMuJC5hdHRyKCdyb3dzJywgdGhpcy5hcmdzLnJvd3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHBsYWNlaG9sZGVyIGlmIHByb3ZpZGVkXG4gICAgICAgIGlmICh0aGlzLmFyZ3MucGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuJC5hdHRyKCdwbGFjZWhvbGRlcicsIHRoaXMuYXJncy5wbGFjZWhvbGRlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdmFsdWUgaWYgcHJvdmlkZWQgKG92ZXJyaWRlcyBjb250ZW50KCkpXG4gICAgICAgIGlmICh0aGlzLmFyZ3MudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuJC52YWwodGhpcy5hcmdzLnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBjdXN0b20gY2xhc3NlcyBpZiBwcm92aWRlZFxuICAgICAgICBpZiAodGhpcy5hcmdzLmNsYXNzKSB7XG4gICAgICAgICAgICB0aGlzLiQuYWRkQ2xhc3ModGhpcy5hcmdzLmNsYXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBkaXNhYmxlZCBzdGF0ZSBpZiBwcm92aWRlZFxuICAgICAgICBpZiAodGhpcy5hcmdzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLiQucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCByZXF1aXJlZCBhdHRyaWJ1dGUgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKHRoaXMuYXJncy5yZXF1aXJlZCkge1xuICAgICAgICAgICAgdGhpcy4kLnByb3AoJ3JlcXVpcmVkJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJjbGFzcyBUaHJlZV9Db2x1bW5fTGF5b3V0IGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIC8vIFdyYXAgZWFjaCBkaXJlY3QgY2hpbGQgaW4gcmVzcG9uc2l2ZSBjb2x1bW4gY2xhc3Nlc1xuICAgICAgICB0aGlzLiQuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY29uc3QgJGVsZW1lbnQgPSAkKHRoaXMpO1xuICAgICAgICAgICAgJGVsZW1lbnQuYWRkQ2xhc3MoJ2NvbC0xMiBjb2wtbWQtNiBjb2wteGwtNCBtYi00Jyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImNsYXNzIFRpbWVfUGlja2VyIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIGNvbnN0ICRpbnB1dCA9IHRoaXMuJGlkKCdpbnB1dCcpO1xuXG4gICAgICAgIGlmICh0aGlzLmFyZ3MudmFsdWUpIHtcbiAgICAgICAgICAgICRpbnB1dC52YWwodGhpcy5hcmdzLnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFyZ3MubmFtZSkge1xuICAgICAgICAgICAgJGlucHV0LmF0dHIoJ25hbWUnLCB0aGlzLmFyZ3MubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcmdzLm1pbikge1xuICAgICAgICAgICAgJGlucHV0LmF0dHIoJ21pbicsIHRoaXMuYXJncy5taW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYXJncy5tYXgpIHtcbiAgICAgICAgICAgICRpbnB1dC5hdHRyKCdtYXgnLCB0aGlzLmFyZ3MubWF4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFyZ3Muc3RlcCkge1xuICAgICAgICAgICAgJGlucHV0LmF0dHIoJ3N0ZXAnLCB0aGlzLmFyZ3Muc3RlcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcmdzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAkaW5wdXQucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFyZ3MucmVhZG9ubHkpIHtcbiAgICAgICAgICAgICRpbnB1dC5wcm9wKCdyZWFkb25seScsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYXJncy5yZXF1aXJlZCkge1xuICAgICAgICAgICAgJGlucHV0LnByb3AoJ3JlcXVpcmVkJywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcmdzLm9uX2NoYW5nZSkge1xuICAgICAgICAgICAgJGlucHV0Lm9uKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYXJncy5vbl9jaGFuZ2UoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRfdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRpZCgnaW5wdXQnKS52YWwoKTtcbiAgICB9XG5cbiAgICBzZXRfdmFsdWUodmFsdWUpIHtcbiAgICAgICAgdGhpcy4kaWQoJ2lucHV0JykudmFsKHZhbHVlKTtcbiAgICB9XG5cbiAgICBmb2N1cygpIHtcbiAgICAgICAgdGhpcy4kaWQoJ2lucHV0JykuZm9jdXMoKTtcbiAgICB9XG59XG4iLCJjbGFzcyBUaW1lbGluZSBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIC8vIFB1cmUgQm9vdHN0cmFwIGZsZXhib3ggLSBubyBKYXZhU2NyaXB0IG5lZWRlZFxufVxuIiwiY2xhc3MgVGltZXN0YW1wX0Rpc3BsYXkgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICAvLyBQdXJlIEJvb3RzdHJhcCBzdHlsaW5nIC0gbm8gSmF2YVNjcmlwdCBuZWVkZWRcbn1cbiIsImNsYXNzIFRvb2x0aXAgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgLy8gU2V0IHRvb2x0aXAgdGV4dCBmcm9tIGFyZ3NcbiAgICAgICAgaWYgKHRoaXMuYXJncy50ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLiQuYXR0cignZGF0YS1icy10aXRsZScsIHRoaXMuYXJncy50ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBwbGFjZW1lbnRcbiAgICAgICAgaWYgKHRoaXMuYXJncy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuJC5hdHRyKCdkYXRhLWJzLXBsYWNlbWVudCcsIHRoaXMuYXJncy5wbGFjZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBCb290c3RyYXAgdG9vbHRpcFxuICAgICAgICBuZXcgYm9vdHN0cmFwLlRvb2x0aXAodGhpcy4kWzBdKTtcbiAgICB9XG59XG4iLCJjbGFzcyBUb3BfTmF2IGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIC8vIFdyYXAgY2hpbGRyZW4gaW4gbmF2IHN0cnVjdHVyZVxuICAgICAgICBjb25zdCAkbmF2ID0gdGhpcy4kaWQoJ25hdl9pdGVtcycpO1xuICAgICAgICAkbmF2LmNoaWxkcmVuKCkuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNvbnN0ICRjaGlsZCA9ICQodGhpcyk7XG4gICAgICAgICAgICBpZiAoJGNoaWxkLnByb3AoJ3RhZ05hbWUnKSAhPT0gJ0xJJykge1xuICAgICAgICAgICAgICAgIGNvbnN0ICRsaSA9ICQoJzxsaT4nKS5hZGRDbGFzcygnbmF2LWl0ZW0nKTtcbiAgICAgICAgICAgICAgICAkY2hpbGQuYWRkQ2xhc3MoJ25hdi1saW5rJyk7XG4gICAgICAgICAgICAgICAgJGNoaWxkLndyYXAoJGxpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiY2xhc3MgVHJlbmRfSW5kaWNhdG9yIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLiQudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgY29uc3QgaXNfcG9zaXRpdmUgPSB0ZXh0LnN0YXJ0c1dpdGgoJysnKTtcbiAgICAgICAgY29uc3QgaXNfbmVnYXRpdmUgPSB0ZXh0LnN0YXJ0c1dpdGgoJy0nKTtcblxuICAgICAgICBpZiAoaXNfcG9zaXRpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuJC5hZGRDbGFzcygndGV4dC1zdWNjZXNzIGZ3LWJvbGQnKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc19uZWdhdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy4kLmFkZENsYXNzKCd0ZXh0LWRhbmdlciBmdy1ib2xkJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiQuYWRkQ2xhc3MoJ3RleHQtbXV0ZWQgZnctYm9sZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4kLmFkZENsYXNzKCdkLWJsb2NrIG10LTEnKTtcbiAgICB9XG59XG4iLCJjbGFzcyBUd29fQ29sdW1uX0xheW91dCBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBXcmFwIGVhY2ggZGlyZWN0IGNoaWxkIGluIHJlc3BvbnNpdmUgY29sdW1uIGNsYXNzZXNcbiAgICAgICAgdGhpcy4kLmNoaWxkcmVuKCkuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNvbnN0ICRlbGVtZW50ID0gJCh0aGlzKTtcbiAgICAgICAgICAgICRlbGVtZW50LmFkZENsYXNzKCdjb2wtMTIgY29sLWxnLTYgbWItNCcpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJjbGFzcyBVc2VyX0F2YXRhcl9Ecm9wZG93biBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBFbnN1cmUgcHJvcGVyIGRyb3Bkb3duIGl0ZW0gc3RydWN0dXJlXG4gICAgICAgIGNvbnN0ICRtZW51ID0gdGhpcy4kaWQoJ21lbnUnKTtcbiAgICAgICAgJG1lbnUuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY29uc3QgJGNoaWxkID0gJCh0aGlzKTtcbiAgICAgICAgICAgIGlmICgkY2hpbGQucHJvcCgndGFnTmFtZScpICE9PSAnTEknKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgJGxpID0gJCgnPGxpPicpO1xuICAgICAgICAgICAgICAgIGlmICgkY2hpbGQucHJvcCgndGFnTmFtZScpID09PSAnSFInKSB7XG4gICAgICAgICAgICAgICAgICAgICRsaS5hcHBlbmQoJCgnPGhyPicpLmFkZENsYXNzKCdkcm9wZG93bi1kaXZpZGVyJykpO1xuICAgICAgICAgICAgICAgICAgICAkY2hpbGQucmVwbGFjZVdpdGgoJGxpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAkY2hpbGQuYWRkQ2xhc3MoJ2Ryb3Bkb3duLWl0ZW0nKTtcbiAgICAgICAgICAgICAgICAgICAgJGNoaWxkLndyYXAoJGxpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIi8qKlxuICogTW9kYWxfQWJzdHJhY3QgLSBCYXNlIGNsYXNzIGZvciBtb2RhbCBvcmNoZXN0cmF0aW9uIGNsYXNzZXNcbiAqXG4gKiAqKlBoaWxvc29waHkqKjpcbiAqIE1vZGFsIGNsYXNzZXMgYXJlIG9yY2hlc3RyYXRpb24gbGF5ZXJzIHRoYXQgbWFuYWdlIHRoZSBsaWZlY3ljbGUgb2Ygc2hvd2luZ1xuICogYSBtb2RhbCwgY29sbGVjdGluZyB1c2VyIGlucHV0LCBhbmQgcmV0dXJuaW5nIHJlc3VsdHMuIFRoZXkgZG8gTk9UIGNvbnRhaW5cbiAqIGZvcm0gdmFsaWRhdGlvbiBvciBidXNpbmVzcyBsb2dpYyAtIHRoYXQgYmVsb25ncyBpbiBqcWh0bWwgY29tcG9uZW50cyBhbmRcbiAqIGNvbnRyb2xsZXIgZW5kcG9pbnRzLlxuICpcbiAqICoqUHVycG9zZSoqOlxuICogLSBQcm92aWRlcyBhIGNvbW1vbiBiYXNlIGNsYXNzIGZvciB0eXBlIGlkZW50aWZpY2F0aW9uXG4gKiAtIEVuZm9yY2VzIGZpbGUgbmFtaW5nIGNvbnZlbnRpb25zIChtb2RhbCBjbGFzc2VzIGVuZCB3aXRoIF9Nb2RhbClcbiAqIC0gRG9jdW1lbnRzIHRoZSBtb2RhbCBjbGFzcyBwYXR0ZXJuXG4gKiAtIEVuYWJsZXMgZnJhbWV3b3JrLWxldmVsIGZlYXR1cmVzIChmdXR1cmU6IGRpc2NvdmVyeSwgdmFsaWRhdGlvbilcbiAqXG4gKiAqKlJlc3BvbnNpYmlsaXRpZXMgb2YgTW9kYWwgQ2xhc3NlcyoqOlxuICogLSBJbnZva2UgTW9kYWwuZm9ybSgpIC8gTW9kYWwuc2hvdygpIC8gTW9kYWwuY29uZmlybSgpIHdpdGggYXBwcm9wcmlhdGUgY29uZmlndXJhdGlvblxuICogLSBIYW5kbGUgbW9kYWwgbGlmZWN5Y2xlIChzaG93LCBzdWJtaXQsIGNhbmNlbCwgZXJyb3JzKVxuICogLSBSZXR1cm4gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggZGF0YSBvciBmYWxzZVxuICogLSBFbmNhcHN1bGF0ZSBtb2RhbC1zcGVjaWZpYyBVSSBsb2dpY1xuICpcbiAqICoqQ29udHJhY3QqKjpcbiAqIEFsbCBtb2RhbCBjbGFzc2VzIGV4dGVuZGluZyBNb2RhbF9BYnN0cmFjdCBtdXN0IGltcGxlbWVudDpcbiAqIC0gYHN0YXRpYyBhc3luYyBzaG93KHBhcmFtcylgOiBQcmltYXJ5IGVudHJ5IHBvaW50LCByZXR1cm5zIFByb21pc2VcbiAqXG4gKiAqKlJldHVybiBWYWx1ZXMqKjpcbiAqIC0gU3VjY2VzczogUmVzb2x2ZSB3aXRoIGRhdGEgb2JqZWN0IChlLmcuLCBjcmVhdGVkIHVzZXIgcmVjb3JkKVxuICogLSBDYW5jZWwvQ2xvc2U6IFJlc29sdmUgd2l0aCBmYWxzZVxuICogLSBFcnJvcjogU2hvdyBlcnJvciBpbiBtb2RhbCwga2VlcCBvcGVuLCBkb24ndCByZXNvbHZlIHVudGlsIHVzZXIgYWN0c1xuICpcbiAqICoqSW50ZWdyYXRpb24qKjpcbiAqIE1vZGFsIGNsYXNzZXMgdXNlIE1vZGFsLmpzIHN0YXRpYyBBUEkgKE1vZGFsLmZvcm0oKSwgTW9kYWwuc2hvdygpLCBldGMuKVxuICogYXMgYnVpbGRpbmcgYmxvY2tzLiBGb3JtIHZhbGlkYXRpb24gaGFuZGxlZCBieSBSc3hfRm9ybSBhbmQgRm9ybV9VdGlscy5cbiAqIFBhZ2UgSlMgb3JjaGVzdHJhdGVzIG1vZGFsIGZsb3cgYnV0IGRvZXNuJ3QgY29udGFpbiBtb2RhbCBVSSBsb2dpYy5cbiAqXG4gKiAqKlBhdHRlcm4gRXhhbXBsZXMqKjpcbiAqXG4gKiBTaW1wbGUgZm9ybSBtb2RhbDpcbiAqIGBgYFxuICogY2xhc3MgQWRkX1VzZXJfTW9kYWwgZXh0ZW5kcyBNb2RhbF9BYnN0cmFjdCB7XG4gKiAgICAgc3RhdGljIGFzeW5jIHNob3coKSB7XG4gKiAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IE1vZGFsLmZvcm0oe1xuICogICAgICAgICAgICAgdGl0bGU6ICdBZGQgVXNlcicsXG4gKiAgICAgICAgICAgICBjb21wb25lbnQ6ICdBZGRfVXNlcl9Nb2RhbF9Gb3JtJyxcbiAqICAgICAgICAgICAgIG9uX3N1Ym1pdDogYXN5bmMgKGZvcm0pID0+IHtcbiAqICAgICAgICAgICAgICAgICB0cnkge1xuICogICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBmb3JtLnZhbHMoKTtcbiAqICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgQ29udHJvbGxlci5hZGRfdXNlcih2YWx1ZXMpO1xuICogICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OyAvLyBDbG9zZSBtb2RhbCwgcmV0dXJuIGRhdGFcbiAqICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICogICAgICAgICAgICAgICAgICAgICBhd2FpdCBmb3JtLnJlbmRlcl9lcnJvcihlcnJvcik7XG4gKiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gS2VlcCBtb2RhbCBvcGVuXG4gKiAgICAgICAgICAgICAgICAgfVxuICogICAgICAgICAgICAgfSxcbiAqICAgICAgICAgfSk7XG4gKiAgICAgICAgIHJldHVybiByZXN1bHQgfHwgZmFsc2U7XG4gKiAgICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQ3VzdG9tIGNvbnRlbnQgbW9kYWw6XG4gKiBgYGBcbiAqIGNsYXNzIENvbmZpcm1fRGVsZXRlX01vZGFsIGV4dGVuZHMgTW9kYWxfQWJzdHJhY3Qge1xuICogICAgIHN0YXRpYyBhc3luYyBzaG93KHtpdGVtX25hbWV9KSB7XG4gKiAgICAgICAgIHJldHVybiBhd2FpdCBNb2RhbC5jb25maXJtKFxuICogICAgICAgICAgICAgJ0NvbmZpcm0gRGVsZXRlJyxcbiAqICAgICAgICAgICAgIGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICR7aXRlbV9uYW1lfT9gXG4gKiAgICAgICAgICk7XG4gKiAgICAgfVxuICogfVxuICogYGBgXG4gKlxuICogTW9kYWwgd2l0aCBiYWNrZW5kIGNhbGw6XG4gKiBgYGBcbiAqIGNsYXNzIFNlbmRfSW52aXRlX01vZGFsIGV4dGVuZHMgTW9kYWxfQWJzdHJhY3Qge1xuICogICAgIHN0YXRpYyBhc3luYyBzaG93KHVzZXJfaWQpIHtcbiAqICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgQ29udHJvbGxlci5zZW5kX2ludml0ZSh7dXNlcl9pZH0pO1xuICogICAgICAgICBpZiAocmVzdWx0Lmludml0ZV91cmwpIHtcbiAqICAgICAgICAgICAgIGF3YWl0IE1vZGFsLmFsZXJ0KCdJbnZpdGUgU2VudCcsIHJlc3VsdC5pbnZpdGVfdXJsKTtcbiAqICAgICAgICAgfVxuICogICAgICAgICByZXR1cm4gcmVzdWx0O1xuICogICAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqICoqVXNhZ2UgUGF0dGVybioqOlxuICogYGBgXG4gKiAvLyBQYWdlIEpTIG9yY2hlc3RyYXRlcyBmbG93LCBtb2RhbHMgaGFuZGxlIFVJXG4gKiBjb25zdCB1c2VyID0gYXdhaXQgQWRkX1VzZXJfTW9kYWwuc2hvdygpO1xuICogaWYgKHVzZXIpIHtcbiAqICAgICAkKCcuVXNlcnNfRGF0YUdyaWQnKS5jb21wb25lbnQoKS5yZWxvYWQoKTtcbiAqICAgICBhd2FpdCBTZW5kX1VzZXJfSW52aXRlX01vZGFsLnNob3codXNlci5pZCk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAqKkJlc3QgUHJhY3RpY2VzKio6XG4gKiAtIEtlZXAgbW9kYWwgY2xhc3NlcyBmb2N1c2VkOiBvbmUgbW9kYWwgPSBvbmUgY2xhc3NcbiAqIC0gUGFnZSBKUyBvcmNoZXN0cmF0ZXMgc2VxdWVuY2UsIG1vZGFsIGNsYXNzZXMgaGFuZGxlIGluZGl2aWR1YWwgbW9kYWxzXG4gKiAtIE1vZGFsIGNsYXNzZXMgZG9uJ3QgY2FsbCBlYWNoIG90aGVyIGRpcmVjdGx5XG4gKiAtIE1vZGFsIGNsYXNzZXMgZG9uJ3QgdXBkYXRlIFVJIChncmlkcywgbGlzdHMpIC0gcGFnZSBKUyBkb2VzIHRoYXRcbiAqIC0gVXNlIGRlc2NyaXB0aXZlIG5hbWVzIGVuZGluZyBpbiBfTW9kYWwgKEFkZF9Vc2VyX01vZGFsLCBTZW5kX0ludml0ZV9Nb2RhbClcbiAqIC0gUGxhY2UgZmVhdHVyZS1zcGVjaWZpYyBtb2RhbHMgaW4gZmVhdHVyZSBkaXJlY3RvcnlcbiAqIC0gUGxhY2UgcmV1c2FibGUgbW9kYWxzIGluIHRoZW1lL2NvbXBvbmVudHMvbW9kYWwvXG4gKlxuICogKipXaGVuIHRvIFVzZSBNb2RhbCBDbGFzc2VzKio6XG4gKiAtIE11bHRpLXN0ZXAgZm9ybXNcbiAqIC0gRm9ybXMgd2l0aCBjb21wbGV4IHZhbGlkYXRpb25cbiAqIC0gTW9kYWxzIGNhbGxlZCBmcm9tIG11bHRpcGxlIHBsYWNlc1xuICogLSBNb2RhbHMgd2l0aCBiYWNrZW5kIGludGVyYWN0aW9uc1xuICpcbiAqICoqV2hlbiBOT1QgdG8gVXNlIE1vZGFsIENsYXNzZXMqKjpcbiAqIC0gU2ltcGxlIGFsZXJ0czogYGF3YWl0IE1vZGFsLmFsZXJ0KCdTYXZlZCEnKWBcbiAqIC0gU2ltcGxlIGNvbmZpcm1hdGlvbnM6IGBpZiAoYXdhaXQgTW9kYWwuY29uZmlybSgnRGVsZXRlPycpKSB7Li4ufWBcbiAqIC0gT25lLW9mZiBwcm9tcHRzOiBgY29uc3QgbmFtZSA9IGF3YWl0IE1vZGFsLnByb21wdCgnRW50ZXIgbmFtZTonKWBcbiAqL1xuY2xhc3MgTW9kYWxfQWJzdHJhY3Qge1xuICAgIC8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3RydWN0dXJlIGFuZCBkb2N1bWVudGF0aW9uIGZvciBtb2RhbCBwYXR0ZXJucy5cbiAgICAvLyBDb25jcmV0ZSBtb2RhbCBjbGFzc2VzIGV4dGVuZCB0aGlzIGFuZCBpbXBsZW1lbnQgc3RhdGljIHNob3coKSBtZXRob2QuXG59XG4iLCIvKipcbiAqIFJzeF9Nb2RhbCBDb21wb25lbnRcbiAqXG4gKiBJbnN0YW5jZSBvZiBhIG1vZGFsIGRpYWxvZy4gSGFuZGxlcyBsaWZlY3ljbGUsIHNpemluZywgYW5kIHVzZXIgaW50ZXJhY3Rpb24uXG4gKiBUeXBpY2FsbHkgY3JlYXRlZCBhbmQgbWFuYWdlZCBieSB0aGUgTW9kYWwgc3RhdGljIEFQSSBjbGFzcy5cbiAqL1xuY2xhc3MgUnN4X01vZGFsIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgb25fY3JlYXRlKCkge1xuICAgICAgICB0aGlzLmRhdGEudGl0bGUgPSAnJztcbiAgICAgICAgdGhpcy5kYXRhLmJvZHlfY29udGVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuZGF0YS5idXR0b25zID0gW107XG4gICAgICAgIHRoaXMuZGF0YS5jbG9zYWJsZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGF0YS5tYXhfd2lkdGggPSA4MDA7XG4gICAgICAgIHRoaXMuZGF0YS5jbG9zZV9vbl9zdWJtaXQgPSB0cnVlO1xuICAgICAgICB0aGlzLmRhdGEuaXNfdmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRhdGEucmVzdWx0X3Byb21pc2UgPSBudWxsO1xuICAgICAgICB0aGlzLmRhdGEucmVzb2x2ZV9mbiA9IG51bGw7XG5cbiAgICAgICAgLy8gU3RvcmUgcmVmZXJlbmNlIHRvIGJvb3RzdHJhcCBtb2RhbCBpbnN0YW5jZVxuICAgICAgICB0aGlzLl9ic19tb2RhbCA9IG51bGw7XG4gICAgICAgIHRoaXMuX3Jlc2l6ZV9oYW5kbGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgLy8gU2V0IHVwIGNsb3NlIGJ1dHRvbiBoYW5kbGVyXG4gICAgICAgIHRoaXMuJGlkKCdjbG9zZV9idG4nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgaWYgKHRoYXQuZGF0YS5jbG9zYWJsZSkge1xuICAgICAgICAgICAgICAgIHRoYXQuY2xvc2UoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTZXQgdXAgYmFja2Ryb3AgY2xpY2sgaGFuZGxlclxuICAgICAgICB0aGlzLiRpZCgnYmFja2Ryb3AnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgaWYgKHRoYXQuZGF0YS5jbG9zYWJsZSAmJiBlLnRhcmdldCA9PT0gdGhpcykge1xuICAgICAgICAgICAgICAgIHRoYXQuY2xvc2UoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTZXQgdXAgRVNDIGtleSBoYW5kbGVyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKCdrZXlkb3duLnJzeF9tb2RhbF8nICsgdGhpcy5fY2lkLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJyAmJiB0aGF0LmRhdGEuY2xvc2FibGUgJiYgdGhhdC5kYXRhLmlzX3Zpc2libGUpIHtcbiAgICAgICAgICAgICAgICB0aGF0LmNsb3NlKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU2V0IHVwIHJlc2l6ZSBoYW5kbGVyXG4gICAgICAgIHRoaXMuX3Jlc2l6ZV9oYW5kbGVyID0gZGVib3VuY2UoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoYXQuZGF0YS5pc192aXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhhdC5fYXBwbHlfc2l6aW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMCk7XG5cbiAgICAgICAgJCh3aW5kb3cpLm9uKCdyZXNpemUucnN4X21vZGFsXycgKyB0aGlzLl9jaWQsIHRoaXMuX3Jlc2l6ZV9oYW5kbGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYW5kIHNob3cgdGhlIG1vZGFsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBNb2RhbCBvcHRpb25zICh0aXRsZSwgYm9keSwgYnV0dG9ucywgZXRjLilcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW50ZXJuYWxfb3B0aW9ucyAtIEludGVybmFsIG9wdGlvbnMgKHNraXBfYmFja2Ryb3AsIGFuaW1hdGUpXG4gICAgICovXG4gICAgYXN5bmMgc2hvdyhvcHRpb25zLCBpbnRlcm5hbF9vcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHNraXBfYmFja2Ryb3AgPSBpbnRlcm5hbF9vcHRpb25zLnNraXBfYmFja2Ryb3AgfHwgZmFsc2U7XG4gICAgICAgIGNvbnN0IHNob3VsZF9hbmltYXRlID0gaW50ZXJuYWxfb3B0aW9ucy5hbmltYXRlIHx8IGZhbHNlO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdbUnN4X01vZGFsXSBzaG93KCkgY2FsbGVkIHdpdGggb3B0aW9uczonLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBTdG9yZSBvcHRpb25zXG4gICAgICAgIHRoaXMuZGF0YS50aXRsZSA9IG9wdGlvbnMudGl0bGUgfHwgJyc7XG4gICAgICAgIHRoaXMuZGF0YS5jbG9zYWJsZSA9IG9wdGlvbnMuY2xvc2FibGUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY2xvc2FibGUgOiB0cnVlO1xuICAgICAgICB0aGlzLmRhdGEubWF4X3dpZHRoID0gb3B0aW9ucy5tYXhfd2lkdGggfHwgODAwO1xuICAgICAgICB0aGlzLmRhdGEuY2xvc2Vfb25fc3VibWl0ID0gb3B0aW9ucy5jbG9zZV9vbl9zdWJtaXQgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY2xvc2Vfb25fc3VibWl0IDogdHJ1ZTtcbiAgICAgICAgdGhpcy5kYXRhLmJ1dHRvbnMgPSBvcHRpb25zLmJ1dHRvbnMgfHwgW107XG4gICAgICAgIHRoaXMuZGF0YS5za2lwX2JhY2tkcm9wID0gc2tpcF9iYWNrZHJvcDtcbiAgICAgICAgdGhpcy5kYXRhLmljb24gPSBvcHRpb25zLmljb24gfHwgbnVsbDtcblxuICAgICAgICBjb25zb2xlLmxvZygnW1JzeF9Nb2RhbF0gU2V0dGluZyB0aXRsZSB0bzonLCB0aGlzLmRhdGEudGl0bGUpO1xuICAgICAgICBjb25zb2xlLmxvZygnW1JzeF9Nb2RhbF0gVGl0bGUgZWxlbWVudDonLCB0aGlzLiRpZCgndGl0bGUnKSk7XG5cbiAgICAgICAgLy8gU2V0IHRpdGxlXG4gICAgICAgIHRoaXMuJGlkKCd0aXRsZScpLnRleHQodGhpcy5kYXRhLnRpdGxlKTtcblxuICAgICAgICAvLyBTaG93L2hpZGUgY2xvc2UgYnV0dG9uIGJhc2VkIG9uIGNsb3NhYmxlXG4gICAgICAgIGlmICh0aGlzLmRhdGEuY2xvc2FibGUpIHtcbiAgICAgICAgICAgIHRoaXMuJGlkKCdjbG9zZV9idG4nKS5zaG93KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiRpZCgnY2xvc2VfYnRuJykuaGlkZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IGJvZHkgY29udGVudCAod2l0aCBvcHRpb25hbCBpY29uKVxuICAgICAgICB0aGlzLl9zZXRfYm9keV9jb250ZW50KG9wdGlvbnMuYm9keSwgdGhpcy5kYXRhLmljb24pO1xuXG4gICAgICAgIC8vIFNldCBidXR0b25zXG4gICAgICAgIHRoaXMuX3NldF9idXR0b25zKCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIHByb21pc2UgdGhhdCB3aWxsIHJlc29sdmUgd2hlbiBtb2RhbCBjbG9zZXNcbiAgICAgICAgY29uc3QgcmVzdWx0X3Byb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgdGhhdC5kYXRhLnJlc29sdmVfZm4gPSByZXNvbHZlO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTaG93IG1vZGFsIGFuZCBiYWNrZHJvcFxuICAgICAgICB0aGlzLmRhdGEuaXNfdmlzaWJsZSA9IHRydWU7XG5cbiAgICAgICAgLy8gQXBwZW5kIHRvIGJvZHkgc28gaXQncyBvbiB0b3AgKGRvbid0IGFwcGVuZCBiYWNrZHJvcCBpZiB1c2luZyBzaGFyZWQpXG4gICAgICAgIGlmICghc2tpcF9iYWNrZHJvcCkge1xuICAgICAgICAgICAgJCgnYm9keScpLmFwcGVuZCh0aGlzLiRpZCgnYmFja2Ryb3AnKSk7XG4gICAgICAgIH1cbiAgICAgICAgJCgnYm9keScpLmFwcGVuZCh0aGlzLiQpO1xuXG4gICAgICAgIC8vIEFwcGx5IHNpemluZyBiZWZvcmUgc2hvd2luZ1xuICAgICAgICB0aGlzLl9hcHBseV9zaXppbmcoKTtcblxuICAgICAgICAvLyBGYWRlIGluIG1vZGFsIChhbmQgYmFja2Ryb3AgaWYgbm90IHVzaW5nIHNoYXJlZClcbiAgICAgICAgYXdhaXQgdGhpcy5fZmFkZV9pbihzaG91bGRfYW5pbWF0ZSk7XG5cbiAgICAgICAgLy8gQXV0by1mb2N1cyBmaXJzdCBpbnB1dCBlbGVtZW50XG4gICAgICAgIHRoaXMuX2ZvY3VzX2ZpcnN0X2lucHV0KCk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdF9wcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBib2R5IGNvbnRlbnQgd2l0aCBvcHRpb25hbCBpY29uXG4gICAgICovXG4gICAgX3NldF9ib2R5X2NvbnRlbnQoYm9keSwgaWNvbikge1xuICAgICAgICBjb25zdCAkYm9keSA9IHRoaXMuJGlkKCdib2R5Jyk7XG4gICAgICAgICRib2R5LmVtcHR5KCk7XG5cbiAgICAgICAgLy8gSWYgaWNvbiBwcm92aWRlZCwgYWRkIGl0XG4gICAgICAgIGlmIChpY29uKSB7XG4gICAgICAgICAgICBjb25zdCAkaWNvbiA9ICQoYDxpIGNsYXNzPVwiYmkgYmktJHtpY29ufSBtb2RhbC1pY29uXCI+PC9pPmApO1xuICAgICAgICAgICAgJGJvZHkuYXBwZW5kKCRpY29uKTtcbiAgICAgICAgICAgICRib2R5LmFkZENsYXNzKCdoYXMtaWNvbicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJGJvZHkucmVtb3ZlQ2xhc3MoJ2hhcy1pY29uJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgb3IgY3JlYXRlIGJvZHkgY29udGVudCB3cmFwcGVyXG4gICAgICAgIGxldCAkY29udGVudCA9IHRoaXMuJGlkKCdib2R5X2NvbnRlbnQnKTtcbiAgICAgICAgaWYgKCEkY29udGVudC5leGlzdHMoKSkge1xuICAgICAgICAgICAgJGNvbnRlbnQgPSAkKCc8ZGl2IGNsYXNzPVwibW9kYWwtYm9keS1jb250ZW50XCI+PC9kaXY+Jyk7XG4gICAgICAgICAgICAkYm9keS5hcHBlbmQoJGNvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgLy8gVGV4dCBjb250ZW50IC0gZXNjYXBlIGFuZCBjb252ZXJ0IG5ld2xpbmVzXG4gICAgICAgICAgICBjb25zdCBlc2NhcGVkID0gJCgnPGRpdj4nKS50ZXh0KGJvZHkpLmh0bWwoKS5yZXBsYWNlKC9cXG4vZywgJzxicj4nKTtcbiAgICAgICAgICAgICRjb250ZW50Lmh0bWwoZXNjYXBlZCk7XG4gICAgICAgIH0gZWxzZSBpZiAoYm9keSBpbnN0YW5jZW9mIGpRdWVyeSkge1xuICAgICAgICAgICAgLy8galF1ZXJ5IGVsZW1lbnRcbiAgICAgICAgICAgICRjb250ZW50LmFwcGVuZChib2R5KTtcbiAgICAgICAgfSBlbHNlIGlmIChib2R5ICYmIHR5cGVvZiBib2R5ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgLy8gQXNzdW1lIGl0J3MgYSBqcWh0bWwgY29tcG9uZW50IGluc3RhbmNlXG4gICAgICAgICAgICAkY29udGVudC5hcHBlbmQoYm9keS4kKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBidXR0b25zIGluIGZvb3RlclxuICAgICAqL1xuICAgIF9zZXRfYnV0dG9ucygpIHtcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgICAgIGNvbnN0ICRmb290ZXIgPSB0aGlzLiRpZCgnZm9vdGVyJyk7XG4gICAgICAgICRmb290ZXIuZW1wdHkoKTtcblxuICAgICAgICBpZiAodGhpcy5kYXRhLmJ1dHRvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAkZm9vdGVyLmhpZGUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgICRmb290ZXIuc2hvdygpO1xuXG4gICAgICAgIGZvciAobGV0IGJ1dHRvbl9kZWYgb2YgdGhpcy5kYXRhLmJ1dHRvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0ICRidXR0b24gPSAkKCc8YnV0dG9uPicpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ3R5cGUnLCAnYnV0dG9uJylcbiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2J0bicpXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKGJ1dHRvbl9kZWYuY2xhc3MgfHwgJ2J0bi1zZWNvbmRhcnknKVxuICAgICAgICAgICAgICAgIC50ZXh0KGJ1dHRvbl9kZWYubGFiZWwgfHwgJ0J1dHRvbicpO1xuXG4gICAgICAgICAgICAkYnV0dG9uLm9uKCdjbGljaycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYnV0dG9uX2RlZi52YWx1ZTtcbiAgICAgICAgICAgICAgICBsZXQgaGFkX2NhbGxiYWNrID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBidXR0b24gaGFzIGEgY2FsbGJhY2ssIGNhbGwgaXQgYW5kIHVzZSByZXR1cm4gdmFsdWUgYXMgcmVzdWx0XG4gICAgICAgICAgICAgICAgaWYgKGJ1dHRvbl9kZWYuY2FsbGJhY2sgJiYgdHlwZW9mIGJ1dHRvbl9kZWYuY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFkX2NhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgYnV0dG9uX2RlZi5jYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElmIGNhbGxiYWNrIHJldHVybmVkIGZhbHNlLCBrZWVwIG1vZGFsIG9wZW4gKGJ1dCBub3QgaWYganVzdCBidXR0b24gdmFsdWUgaXMgZmFsc2UpXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UgJiYgaGFkX2NhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDbG9zZSBtb2RhbCB3aXRoIHJlc3VsdFxuICAgICAgICAgICAgICAgIHRoYXQuY2xvc2UocmVzdWx0KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAkZm9vdGVyLmFwcGVuZCgkYnV0dG9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSBhbmQgYXBwbHkgcmVzcG9uc2l2ZSBzaXppbmdcbiAgICAgKi9cbiAgICBfYXBwbHlfc2l6aW5nKCkge1xuICAgICAgICBjb25zdCB2aWV3cG9ydF93aWR0aCA9ICQod2luZG93KS53aWR0aCgpO1xuICAgICAgICBjb25zdCB2aWV3cG9ydF9oZWlnaHQgPSAkKHdpbmRvdykuaGVpZ2h0KCk7XG4gICAgICAgIGNvbnN0IGlzX21vYmlsZSA9IHZpZXdwb3J0X3dpZHRoIDwgNzY4O1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBtYXggd2lkdGggYmFzZWQgb24gdmlld3BvcnRcbiAgICAgICAgbGV0IG1heF93aWR0aCA9IHRoaXMuZGF0YS5tYXhfd2lkdGg7XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0X2xpbWl0ID0gaXNfbW9iaWxlID8gdmlld3BvcnRfd2lkdGggKiAwLjkgOiB2aWV3cG9ydF93aWR0aCAqIDAuODtcblxuICAgICAgICBtYXhfd2lkdGggPSBNYXRoLm1pbihtYXhfd2lkdGgsIHZpZXdwb3J0X2xpbWl0KTtcblxuICAgICAgICAvLyBUcnkgdG8gY29uc3RyYWluIHRvIDYwJSB3aWR0aCBmb3IgYmV0dGVyIHByb3BvcnRpb25zIG9uIGRlc2t0b3BcbiAgICAgICAgaWYgKCFpc19tb2JpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZlcnJlZF93aWR0aCA9IHZpZXdwb3J0X3dpZHRoICogMC42O1xuICAgICAgICAgICAgaWYgKHByZWZlcnJlZF93aWR0aCA8IG1heF93aWR0aCkge1xuICAgICAgICAgICAgICAgIG1heF93aWR0aCA9IHByZWZlcnJlZF93aWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IHdpZHRoXG4gICAgICAgIHRoaXMuJGlkKCdkaWFsb2cnKS5jc3MoJ21heC13aWR0aCcsIG1heF93aWR0aCArICdweCcpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGNvbnRlbnQgZXhjZWVkcyA4MCUgaGVpZ2h0XG4gICAgICAgIGNvbnN0IGNvbnRlbnRfaGVpZ2h0ID0gdGhpcy4kaWQoJ2RpYWxvZycpLm91dGVySGVpZ2h0KCk7XG4gICAgICAgIGNvbnN0IG1heF9oZWlnaHQgPSB2aWV3cG9ydF9oZWlnaHQgKiAwLjg7XG5cbiAgICAgICAgaWYgKGNvbnRlbnRfaGVpZ2h0ID4gbWF4X2hlaWdodCkge1xuICAgICAgICAgICAgLy8gRW5hYmxlIHNjcm9sbGluZ1xuICAgICAgICAgICAgdGhpcy4kaWQoJ2RpYWxvZycpLmNzcygnbWF4LWhlaWdodCcsIG1heF9oZWlnaHQgKyAncHgnKTtcbiAgICAgICAgICAgIHRoaXMuJGlkKCdib2R5JykuY3NzKHtcbiAgICAgICAgICAgICAgICAnb3ZlcmZsb3cteSc6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICAnbWF4LWhlaWdodCc6IG1heF9oZWlnaHQgLSAxNTAgKyAncHgnLCAvLyBBY2NvdW50IGZvciBoZWFkZXIvZm9vdGVyXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlc2V0IHNjcm9sbGluZ1xuICAgICAgICAgICAgdGhpcy4kaWQoJ2RpYWxvZycpLmNzcygnbWF4LWhlaWdodCcsICcnKTtcbiAgICAgICAgICAgIHRoaXMuJGlkKCdib2R5JykuY3NzKHtcbiAgICAgICAgICAgICAgICAnb3ZlcmZsb3cteSc6ICcnLFxuICAgICAgICAgICAgICAgICdtYXgtaGVpZ2h0JzogJycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1vYmlsZSBlZGdlIHNwYWNpbmdcbiAgICAgICAgaWYgKGlzX21vYmlsZSkge1xuICAgICAgICAgICAgdGhpcy4kaWQoJ2RpYWxvZycpLmNzcygnbWFyZ2luJywgJzUlJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiRpZCgnZGlhbG9nJykuY3NzKCdtYXJnaW4nLCAnMCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvdyBhbmltYXRpb24gKGluc3RhbnQgb3Igd2l0aCBmbHktaW4pXG4gICAgICogQHBhcmFtIHtib29sZWFufSBhbmltYXRlIC0gV2hldGhlciB0byBhbmltYXRlIHRoZSBtb2RhbCBlbnRyYW5jZVxuICAgICAqL1xuICAgIGFzeW5jIF9mYWRlX2luKGFuaW1hdGUgPSBmYWxzZSkge1xuICAgICAgICBpZiAoYW5pbWF0ZSkge1xuICAgICAgICAgICAgLy8gSW5pdGlhbCBzdGF0ZTogbW9kYWwgcG9zaXRpb25lZCBhYm92ZSBmaW5hbCBwb3NpdGlvblxuICAgICAgICAgICAgdGhpcy4kLmNzcygnZGlzcGxheScsICdmbGV4JykuY3NzKCdvcGFjaXR5JywgJzAnKTtcbiAgICAgICAgICAgIHRoaXMuJGlkKCdtb2RhbCcpLmNzcyh7XG4gICAgICAgICAgICAgICAgJ3RyYW5zZm9ybSc6ICd0cmFuc2xhdGUoMCwgLTUwcHgpJyxcbiAgICAgICAgICAgICAgICAnb3BhY2l0eSc6ICcwJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLiRpZCgnYmFja2Ryb3AnKS5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKS5hZGRDbGFzcygnc2hvdycpO1xuXG4gICAgICAgICAgICAvLyBGb3JjZSByZWZsb3dcbiAgICAgICAgICAgIHRoaXMuJGlkKCdtb2RhbCcpWzBdLm9mZnNldEhlaWdodDtcblxuICAgICAgICAgICAgLy8gVHJpZ2dlciBhbmltYXRpb25cbiAgICAgICAgICAgIHRoaXMuJGlkKCdtb2RhbCcpLmFkZENsYXNzKCdzaG93JykuY3NzKHtcbiAgICAgICAgICAgICAgICAndHJhbnNmb3JtJzogJ3RyYW5zbGF0ZSgwLCAwKScsXG4gICAgICAgICAgICAgICAgJ29wYWNpdHknOiAnMSdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy4kLmNzcygnb3BhY2l0eScsICcxJyk7XG5cbiAgICAgICAgICAgIC8vIFdhaXQgZm9yIGFuaW1hdGlvbiB0byBjb21wbGV0ZVxuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDE1MCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRGlzYWJsZSB0cmFuc2l0aW9ucyB0ZW1wb3JhcmlseSBmb3IgaW5zdGFudCBkaXNwbGF5XG4gICAgICAgICAgICB0aGlzLiRpZCgnZGlhbG9nJykuY3NzKCd0cmFuc2l0aW9uJywgJ25vbmUnKTtcblxuICAgICAgICAgICAgLy8gU2hvdyBtb2RhbCBhbmQgYmFja2Ryb3AgaW5zdGFudGx5XG4gICAgICAgICAgICB0aGlzLiQuY3NzKCdkaXNwbGF5JywgJ2ZsZXgnKS5jc3MoJ29wYWNpdHknLCAnMScpO1xuICAgICAgICAgICAgdGhpcy4kaWQoJ21vZGFsJykuYWRkQ2xhc3MoJ3Nob3cnKS5jc3MoJ29wYWNpdHknLCAnMScpO1xuICAgICAgICAgICAgdGhpcy4kaWQoJ2JhY2tkcm9wJykuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJykuYWRkQ2xhc3MoJ3Nob3cnKTtcblxuICAgICAgICAgICAgLy8gRm9yY2UgcmVmbG93IHRvIGFwcGx5IHRoZSBuby10cmFuc2l0aW9uIHN0YXRlXG4gICAgICAgICAgICB0aGlzLiRpZCgnZGlhbG9nJylbMF0ub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICAgICAgICAvLyBSZS1lbmFibGUgdHJhbnNpdGlvbnMgZm9yIGZ1dHVyZSBhbmltYXRpb25zXG4gICAgICAgICAgICB0aGlzLiRpZCgnZGlhbG9nJykuY3NzKCd0cmFuc2l0aW9uJywgJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvY3VzIHRoZSBmaXJzdCBpbnB1dCBlbGVtZW50IGluIHRoZSBtb2RhbFxuICAgICAqL1xuICAgIF9mb2N1c19maXJzdF9pbnB1dCgpIHtcbiAgICAgICAgLy8gRmluZCBmaXJzdCBpbnB1dC90ZXh0YXJlYS9zZWxlY3QgaW4gbW9kYWwgYm9keVxuICAgICAgICBjb25zdCAkZmlyc3RfaW5wdXQgPSB0aGlzLiRpZCgnYm9keScpLmZpbmQoJ2lucHV0Om5vdChbdHlwZT1cImhpZGRlblwiXSksIHRleHRhcmVhLCBzZWxlY3QnKS5maXJzdCgpO1xuICAgICAgICBpZiAoJGZpcnN0X2lucHV0LmV4aXN0cygpKSB7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICRmaXJzdF9pbnB1dC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIC8vIFNlbGVjdCB0ZXh0IGlmIGl0J3MgYW4gaW5wdXQgd2l0aCBleGlzdGluZyB2YWx1ZVxuICAgICAgICAgICAgICAgIGlmICgkZmlyc3RfaW5wdXQuaXMoJ2lucHV0W3R5cGU9XCJ0ZXh0XCJdLCBpbnB1dFt0eXBlPVwiZW1haWxcIl0nKSAmJiAkZmlyc3RfaW5wdXQudmFsKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgJGZpcnN0X2lucHV0LnNlbGVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2UgdGhlIG1vZGFsIGluc3RhbnRseVxuICAgICAqL1xuICAgIGFzeW5jIGNsb3NlKHJlc3VsdCkge1xuICAgICAgICBjb25zdCB0aGF0ID0gdGhpcztcblxuICAgICAgICAvLyBNYXJrIGFzIG5vdCB2aXNpYmxlXG4gICAgICAgIHRoaXMuZGF0YS5pc192aXNpYmxlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICAkKGRvY3VtZW50KS5vZmYoJ2tleWRvd24ucnN4X21vZGFsXycgKyB0aGlzLl9jaWQpO1xuICAgICAgICAkKHdpbmRvdykub2ZmKCdyZXNpemUucnN4X21vZGFsXycgKyB0aGlzLl9jaWQpO1xuXG4gICAgICAgIC8vIEhpZGUgaW5zdGFudGx5IChubyBmYWRlIG91dClcbiAgICAgICAgdGhpcy4kLmhpZGUoKTtcbiAgICAgICAgdGhpcy4kaWQoJ2JhY2tkcm9wJykuaGlkZSgpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBmcm9tIERPTVxuICAgICAgICB0aGlzLiQucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuJGlkKCdiYWNrZHJvcCcpLnJlbW92ZSgpO1xuXG4gICAgICAgIC8vIFJlc29sdmUgcHJvbWlzZVxuICAgICAgICBpZiAodGhpcy5kYXRhLnJlc29sdmVfZm4pIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5yZXNvbHZlX2ZuKHJlc3VsdCk7XG4gICAgICAgICAgICB0aGlzLmRhdGEucmVzb2x2ZV9mbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBseSB2YWxpZGF0aW9uIGVycm9ycyB0byBmb3JtIGZpZWxkcyBpbiBtb2RhbCBib2R5XG4gICAgICovXG4gICAgYXBwbHlfZXJyb3JzKGVycm9ycykge1xuICAgICAgICAvLyBVc2UgRm9ybV9VdGlscyB0byBhcHBseSBlcnJvcnMgdG8gZWxlbWVudHMgd2l0aGluIG1vZGFsIGJvZHlcbiAgICAgICAgRm9ybV9VdGlscy5hcHBseV9mb3JtX2Vycm9ycyh0aGlzLiRpZCgnYm9keScpLCBlcnJvcnMpO1xuICAgIH1cbn1cbiIsIi8qKlxuICogTW9kYWwgU3RhdGljIEFQSVxuICpcbiAqIFByaW1hcnkgaW50ZXJmYWNlIGZvciBkaXNwbGF5aW5nIG1vZGFscyB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbi5cbiAqIFByb3ZpZGVzIHNpbXBsZSBtZXRob2RzIGZvciBjb21tb24gZGlhbG9ncyBhbmQgZmxleGlibGUgb3B0aW9ucyBmb3IgY3VzdG9tIG1vZGFscy5cbiAqXG4gKiBVc2FnZTpcbiAqICAgYXdhaXQgTW9kYWwuYWxlcnQoXCJGaWxlIHNhdmVkXCIpXG4gKiAgIGlmIChhd2FpdCBNb2RhbC5jb25maXJtKFwiRGVsZXRlP1wiKSkgeyAuLi4gfVxuICogICBsZXQgbmFtZSA9IGF3YWl0IE1vZGFsLnByb21wdChcIkVudGVyIG5hbWU6XCIpXG4gKiAgIGxldCByZXN1bHQgPSBhd2FpdCBNb2RhbC5zaG93KHsgdGl0bGUsIGJvZHksIGJ1dHRvbnMgfSlcbiAqL1xuY2xhc3MgTW9kYWwge1xuICAgIC8vIEludGVybmFsIHN0YXRlXG4gICAgc3RhdGljIF9xdWV1ZSA9IFtdO1xuICAgIHN0YXRpYyBfY3VycmVudCA9IG51bGw7XG4gICAgc3RhdGljIF9pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIHN0YXRpYyBfYmFja2Ryb3AgPSBudWxsO1xuICAgIHN0YXRpYyBfb3JpZ2luYWxfYm9keV9vdmVyZmxvdyA9IG51bGw7XG4gICAgc3RhdGljIF9vcmlnaW5hbF9ib2R5X3BhZGRpbmcgPSBudWxsO1xuICAgIHN0YXRpYyBfdW5sb2NrX3RpbWVvdXQgPSBudWxsO1xuICAgIHN0YXRpYyBfbGFzdF9jbG9zZV90aW1lc3RhbXAgPSAwO1xuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBnbG9iYWwgaGFuZGxlcnMgKGNhbGxlZCBhdXRvbWF0aWNhbGx5IG9uIGZpcnN0IG1vZGFsKVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc3RhdGljIF9pbml0KCkge1xuICAgICAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIENyZWF0ZSBzaGFyZWQgYmFja2Ryb3AgZWxlbWVudFxuICAgICAgICB0aGlzLl9iYWNrZHJvcCA9ICQoJzxkaXYgY2xhc3M9XCJtb2RhbC1iYWNrZHJvcCBmYWRlXCI+PC9kaXY+Jyk7XG4gICAgICAgICQoJ2JvZHknKS5hcHBlbmQodGhpcy5fYmFja2Ryb3ApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSBzY3JvbGxiYXIgd2lkdGhcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICovXG4gICAgc3RhdGljIF9nZXRfc2Nyb2xsYmFyX3dpZHRoKCkge1xuICAgICAgICAvLyBDcmVhdGUgdGVtcG9yYXJ5IGVsZW1lbnQgdG8gbWVhc3VyZSBzY3JvbGxiYXIgd2lkdGhcbiAgICAgICAgY29uc3QgJG91dGVyID0gJCgnPGRpdj4nKS5jc3Moe1xuICAgICAgICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbicsXG4gICAgICAgICAgICBvdmVyZmxvdzogJ3Njcm9sbCcsXG4gICAgICAgICAgICB3aWR0aDogJzEwMHB4JyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgdG9wOiAnLTk5OTlweCcsXG4gICAgICAgIH0pO1xuICAgICAgICAkKCdib2R5JykuYXBwZW5kKCRvdXRlcik7XG5cbiAgICAgICAgY29uc3Qgd2lkdGhfd2l0aF9zY3JvbGxiYXIgPSAkb3V0ZXJbMF0ub2Zmc2V0V2lkdGg7XG5cbiAgICAgICAgY29uc3QgJGlubmVyID0gJCgnPGRpdj4nKS5jc3MoJ3dpZHRoJywgJzEwMCUnKTtcbiAgICAgICAgJG91dGVyLmFwcGVuZCgkaW5uZXIpO1xuXG4gICAgICAgIGNvbnN0IHdpZHRoX3dpdGhvdXRfc2Nyb2xsYmFyID0gJGlubmVyWzBdLm9mZnNldFdpZHRoO1xuXG4gICAgICAgICRvdXRlci5yZW1vdmUoKTtcblxuICAgICAgICByZXR1cm4gd2lkdGhfd2l0aF9zY3JvbGxiYXIgLSB3aWR0aF93aXRob3V0X3Njcm9sbGJhcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2NrIGJvZHkgc2Nyb2xsIGFuZCBjb21wZW5zYXRlIGZvciBzY3JvbGxiYXIgd2lkdGhcbiAgICAgKiBPbmx5IGxvY2tzIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSBzYXZlZCB0aGUgb3JpZ2luYWwgc3RhdGUgKGZpcnN0IG1vZGFsIGluIGNoYWluKVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc3RhdGljIF9sb2NrX2JvZHlfc2Nyb2xsKCkge1xuICAgICAgICAvLyBDYW5jZWwgYW55IHBlbmRpbmcgdW5sb2NrIHRpbWVvdXRcbiAgICAgICAgaWYgKHRoaXMuX3VubG9ja190aW1lb3V0KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdW5sb2NrX3RpbWVvdXQpO1xuICAgICAgICAgICAgdGhpcy5fdW5sb2NrX3RpbWVvdXQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBsb2NrIHNjcm9sbCBpZiB3ZSBoYXZlbid0IGFscmVhZHkgc2F2ZWQgc3RhdGUgKGZpcnN0IG1vZGFsKVxuICAgICAgICAvLyBUaGlzIGlzIHRoZSB0cnVlIGluZGljYXRvciAtIG5vdCBiYWNrZHJvcCB2aXNpYmlsaXR5IHdoaWNoIGNhbiBiZSB0cmFuc2l0aW9uYWxcbiAgICAgICAgaWYgKHRoaXMuX29yaWdpbmFsX2JvZHlfb3ZlcmZsb3cgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0ICRib2R5ID0gJCgnYm9keScpO1xuXG4gICAgICAgICAgICAvLyBTdG9yZSBvcmlnaW5hbCB2YWx1ZXNcbiAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsX2JvZHlfb3ZlcmZsb3cgPSAkYm9keS5jc3MoJ292ZXJmbG93Jyk7XG4gICAgICAgICAgICB0aGlzLl9vcmlnaW5hbF9ib2R5X3BhZGRpbmcgPSAkYm9keS5jc3MoJ3BhZGRpbmctcmlnaHQnKTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYm9keSBjdXJyZW50bHkgaGFzIHZlcnRpY2FsIHNjcm9sbFxuICAgICAgICAgICAgY29uc3QgaGFzX3Njcm9sbGJhciA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0ID4gd2luZG93LmlubmVySGVpZ2h0O1xuXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGEgc2Nyb2xsYmFyLCBhZGQgcGFkZGluZyB0byBjb21wZW5zYXRlIGZvciBpdHMgcmVtb3ZhbFxuICAgICAgICAgICAgaWYgKGhhc19zY3JvbGxiYXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxiYXJfd2lkdGggPSB0aGlzLl9nZXRfc2Nyb2xsYmFyX3dpZHRoKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudF9wYWRkaW5nID0gaW50KHRoaXMuX29yaWdpbmFsX2JvZHlfcGFkZGluZykgfHwgMDtcbiAgICAgICAgICAgICAgICAkYm9keS5jc3MoJ3BhZGRpbmctcmlnaHQnLCBjdXJyZW50X3BhZGRpbmcgKyBzY3JvbGxiYXJfd2lkdGggKyAncHgnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTG9jayBzY3JvbGxcbiAgICAgICAgICAgICRib2R5LmNzcygnb3ZlcmZsb3cnLCAnaGlkZGVuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbmxvY2sgYm9keSBzY3JvbGwgYW5kIHJlc3RvcmUgb3JpZ2luYWwgc3RhdGVcbiAgICAgKiBVc2VzIGRlbGF5ZWQgY2hlY2sgdG8gZW5zdXJlIG5vIG90aGVyIG1vZGFscyBhcmUgb3BlbmluZ1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc3RhdGljIF91bmxvY2tfYm9keV9zY3JvbGwoKSB7XG4gICAgICAgIC8vIENsZWFyIGFueSBleGlzdGluZyB0aW1lb3V0XG4gICAgICAgIGlmICh0aGlzLl91bmxvY2tfdGltZW91dCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3VubG9ja190aW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1pbmltYWwgZGVsYXkgYmVmb3JlIHVubG9ja2luZ1xuICAgICAgICB0aGlzLl91bmxvY2tfdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgLy8gRG91YmxlLWNoZWNrIG5vIG1vZGFsIGlzIGN1cnJlbnRseSBvcGVuIGFuZCBxdWV1ZSBpcyBlbXB0eVxuICAgICAgICAgICAgaWYgKCF0aGlzLl9jdXJyZW50ICYmIHRoaXMuX3F1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0ICRib2R5ID0gJCgnYm9keScpO1xuXG4gICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCB2YWx1ZXNcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fb3JpZ2luYWxfYm9keV9vdmVyZmxvdyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAkYm9keS5jc3MoJ292ZXJmbG93JywgdGhpcy5fb3JpZ2luYWxfYm9keV9vdmVyZmxvdyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsX2JvZHlfb3ZlcmZsb3cgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcmlnaW5hbF9ib2R5X3BhZGRpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgJGJvZHkuY3NzKCdwYWRkaW5nLXJpZ2h0JywgdGhpcy5fb3JpZ2luYWxfYm9keV9wYWRkaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3JpZ2luYWxfYm9keV9wYWRkaW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3VubG9ja190aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgfSwgNTApOyAvLyBNaW5pbWFsIHNhZmV0eSBidWZmZXJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93IHRoZSBzaGFyZWQgYmFja2Ryb3AgKGluc3RhbnQgLSBubyBhbmltYXRpb24pXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgX3Nob3dfYmFja2Ryb3AoKSB7XG4gICAgICAgIGlmICghdGhpcy5fYmFja2Ryb3AuaGFzQ2xhc3MoJ3Nob3cnKSkge1xuICAgICAgICAgICAgLy8gTG9jayBib2R5IHNjcm9sbCBiZWZvcmUgc2hvd2luZyBiYWNrZHJvcFxuICAgICAgICAgICAgdGhpcy5fbG9ja19ib2R5X3Njcm9sbCgpO1xuXG4gICAgICAgICAgICB0aGlzLl9iYWNrZHJvcC5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKS5hZGRDbGFzcygnc2hvdycpO1xuICAgICAgICAgICAgLy8gTm8gZGVsYXkgLSByZXR1cm4gaW1tZWRpYXRlbHlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhpZGUgdGhlIHNoYXJlZCBiYWNrZHJvcCAoaW5zdGFudCAtIG5vIGFuaW1hdGlvbilcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBfaGlkZV9iYWNrZHJvcCgpIHtcbiAgICAgICAgdGhpcy5fYmFja2Ryb3AucmVtb3ZlQ2xhc3MoJ3Nob3cnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuXG4gICAgICAgIC8vIFVubG9jayBib2R5IHNjcm9sbCBhZnRlciBiYWNrZHJvcCBpcyBoaWRkZW5cbiAgICAgICAgdGhpcy5fdW5sb2NrX2JvZHlfc2Nyb2xsKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IFJzeF9Nb2RhbCBpbnN0YW5jZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIF9jcmVhdGVfbW9kYWwoKSB7XG4gICAgICAgIC8vIENyZWF0ZSBtb2RhbCBjb21wb25lbnQgdXNpbmcgalF1ZXJ5IHBsdWdpblxuICAgICAgICBjb25zdCAkbW9kYWxfZWxlbWVudCA9ICQoJzxkaXY+Jyk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGNvbXBvbmVudCBpbnN0YW5jZSBkaXJlY3RseSAocmV0dXJucyB0aGUgY29tcG9uZW50KVxuICAgICAgICBjb25zdCBtb2RhbF9pbnN0YW5jZSA9ICRtb2RhbF9lbGVtZW50LmNvbXBvbmVudCgnUnN4X01vZGFsJywge30pO1xuXG4gICAgICAgIC8vIFdhaXQgZm9yIGNvbXBvbmVudCB0byBiZSBmdWxseSByZWFkeSAoRE9NIGVsZW1lbnRzIHF1ZXJ5YWJsZSlcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIG1vZGFsX2luc3RhbmNlLm9uKCdyZWFkeScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW01vZGFsXSBDb21wb25lbnQgcmVhZHksIGVsZW1lbnRzOicsIHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IG1vZGFsX2luc3RhbmNlLiRpZCgndGl0bGUnKS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IG1vZGFsX2luc3RhbmNlLiRpZCgnYm9keScpLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgZm9vdGVyOiBtb2RhbF9pbnN0YW5jZS4kaWQoJ2Zvb3RlcicpLmxlbmd0aCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG1vZGFsX2luc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3cgYSBtb2RhbCBhbmQgbWFuYWdlIHF1ZXVlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgX3Nob3dfbW9kYWwob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3F1ZXVlLnB1c2goeyBvcHRpb25zLCByZXNvbHZlIH0pO1xuXG4gICAgICAgICAgICAvLyBQcm9jZXNzIHF1ZXVlIGlmIG5vIG1vZGFsIGN1cnJlbnRseSBzaG93aW5nXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2N1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9jZXNzX3F1ZXVlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgdGhlIG1vZGFsIHF1ZXVlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgX3Byb2Nlc3NfcXVldWUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9xdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnQgPSBudWxsO1xuICAgICAgICAgICAgLy8gSGlkZSBiYWNrZHJvcCB3aGVuIHF1ZXVlIGlzIGVtcHR5XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9oaWRlX2JhY2tkcm9wKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IG9wdGlvbnMsIHJlc29sdmUgfSA9IHRoaXMuX3F1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgICAgLy8gRW5zdXJlIGluaXRpYWxpemVkXG4gICAgICAgIHRoaXMuX2luaXQoKTtcblxuICAgICAgICAvLyBTaG93IGJhY2tkcm9wIGlmIG5vdCBhbHJlYWR5IHZpc2libGUgKGluc3RhbnQgLSBubyBkZWxheSBiZXR3ZWVuIG1vZGFscylcbiAgICAgICAgY29uc3QgYmFja2Ryb3BfdmlzaWJsZSA9IHRoaXMuX2JhY2tkcm9wLmhhc0NsYXNzKCdzaG93Jyk7XG4gICAgICAgIGlmICghYmFja2Ryb3BfdmlzaWJsZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2hvd19iYWNrZHJvcCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGRlbGF5IGJldHdlZW4gc2VxdWVudGlhbCBtb2RhbHMgLSBpbW1lZGlhdGUgdHJhbnNpdGlvblxuXG4gICAgICAgIC8vIENyZWF0ZSBtb2RhbCBpbnN0YW5jZVxuICAgICAgICBjb25zdCBtb2RhbF9pbnN0YW5jZSA9IGF3YWl0IHRoaXMuX2NyZWF0ZV9tb2RhbCgpO1xuICAgICAgICB0aGlzLl9jdXJyZW50ID0gbW9kYWxfaW5zdGFuY2U7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBhbmltYXRlIGJhc2VkIG9uOlxuICAgICAgICAvLyAxLiBEZXNrdG9wIHZpZXdwb3J0ICg+PSAxMDAwcHgpXG4gICAgICAgIC8vIDIuIE1vcmUgdGhhbiAxIHNlY29uZCBzaW5jZSBsYXN0IG1vZGFsIGNsb3NlZFxuICAgICAgICBjb25zdCB2aWV3cG9ydF93aWR0aCA9ICQod2luZG93KS53aWR0aCgpO1xuICAgICAgICBjb25zdCBpc19kZXNrdG9wID0gdmlld3BvcnRfd2lkdGggPj0gMTAwMDtcbiAgICAgICAgY29uc3QgdGltZV9zaW5jZV9sYXN0X2Nsb3NlID0gRGF0ZS5ub3coKSAtIHRoaXMuX2xhc3RfY2xvc2VfdGltZXN0YW1wO1xuICAgICAgICBjb25zdCBzaG91bGRfYW5pbWF0ZSA9IGlzX2Rlc2t0b3AgJiYgdGltZV9zaW5jZV9sYXN0X2Nsb3NlID4gMTAwMDtcblxuICAgICAgICAvLyBTaG93IG1vZGFsIGFuZCB3YWl0IGZvciByZXN1bHQgKG1vZGFsIHdvbid0IGNyZWF0ZSBpdHMgb3duIGJhY2tkcm9wKVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtb2RhbF9pbnN0YW5jZS5zaG93KG9wdGlvbnMsIHsgc2tpcF9iYWNrZHJvcDogdHJ1ZSwgYW5pbWF0ZTogc2hvdWxkX2FuaW1hdGUgfSk7XG5cbiAgICAgICAgLy8gUmVjb3JkIGNsb3NlIHRpbWVzdGFtcCBCRUZPUkUgcmVzb2x2aW5nIChlbnN1cmVzIGl0J3Mgc2V0IGJlZm9yZSBuZXh0IG1vZGFsIGNhbiBzdGFydClcbiAgICAgICAgdGhpcy5fbGFzdF9jbG9zZV90aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIC8vIFJlc29sdmUgdGhlIHByb21pc2Ugd2l0aCB0aGUgcmVzdWx0XG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcblxuICAgICAgICAvLyBDbGVhciBjdXJyZW50IGFuZCBwcm9jZXNzIG5leHRcbiAgICAgICAgdGhpcy5fY3VycmVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NfcXVldWUoKTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIFN0YXRlIE1hbmFnZW1lbnQgTWV0aG9kc1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIG1vZGFsIGlzIGN1cnJlbnRseSBvcGVuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgc3RhdGljIGlzX29wZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50ICE9PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudGx5IG9wZW4gbW9kYWwgaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7UnN4X01vZGFsfG51bGx9XG4gICAgICovXG4gICAgc3RhdGljIGdldF9jdXJyZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZSBjbG9zZSB0aGUgY3VycmVudCBtb2RhbFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBjbG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2N1cnJlbnQuY2xvc2UoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbHkgdmFsaWRhdGlvbiBlcnJvcnMgdG8gdGhlIGN1cnJlbnQgbW9kYWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXJyb3JzIC0gRXJyb3Igb2JqZWN0IHtmaWVsZDogbWVzc2FnZX1cbiAgICAgKi9cbiAgICBzdGF0aWMgYXBwbHlfZXJyb3JzKGVycm9ycykge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudCkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudC5hcHBseV9lcnJvcnMoZXJyb3JzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gU2ltcGxlIERpYWxvZyBNZXRob2RzXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIFNob3cgYW4gYWxlcnQgZGlhbG9nXG4gICAgICogQHBhcmFtIHtzdHJpbmd8alF1ZXJ5fSB0aXRsZV9vcl9ib2R5IC0gTWVzc2FnZSAoaWYgb25seSAxIGFyZykgb3IgVGl0bGUgKGlmIDIgYXJncykuIENhbiBiZSBzdHJpbmcgb3IgalF1ZXJ5IGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd8alF1ZXJ5fSBib2R5IC0gTWVzc2FnZSBib2R5IChpZiAyIGFyZ3MpLiBDYW4gYmUgc3RyaW5nIG9yIGpRdWVyeSBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBidXR0b25fbGFiZWwgLSBCdXR0b24gdGV4dCAoZGVmYXVsdDogXCJPS1wiKVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBhbGVydCh0aXRsZV9vcl9ib2R5LCBib2R5ID0gbnVsbCwgYnV0dG9uX2xhYmVsID0gJ09LJykge1xuICAgICAgICBsZXQgdGl0bGUgPSAnTm90aWNlJztcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0aXRsZV9vcl9ib2R5O1xuXG4gICAgICAgIGlmIChib2R5ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aXRsZSA9IHRpdGxlX29yX2JvZHk7XG4gICAgICAgICAgICBtZXNzYWdlID0gYm9keTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuX3Nob3dfbW9kYWwoe1xuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICAgICAgYm9keTogbWVzc2FnZSxcbiAgICAgICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBidXR0b25fbGFiZWwsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjbGFzczogJ2J0bi1wcmltYXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY2xvc2Vfb25fc3VibWl0OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93IGEgY29uZmlybWF0aW9uIGRpYWxvZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfGpRdWVyeX0gdGl0bGVfb3JfYm9keSAtIE1lc3NhZ2UgKGlmIDEtMiBhcmdzKSBvciBUaXRsZSAoaWYgMy00IGFyZ3MpLiBDYW4gYmUgc3RyaW5nIG9yIGpRdWVyeSBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfGpRdWVyeX0gYm9keSAtIE1lc3NhZ2UgYm9keSAob3B0aW9uYWwpLiBDYW4gYmUgc3RyaW5nIG9yIGpRdWVyeSBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb25maXJtX2xhYmVsIC0gQ29uZmlybSBidXR0b24gdGV4dCAoZGVmYXVsdDogXCJDb25maXJtXCIpXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNhbmNlbF9sYWJlbCAtIENhbmNlbCBidXR0b24gdGV4dCAoZGVmYXVsdDogXCJDYW5jZWxcIilcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgY29uZmlybSh0aXRsZV9vcl9ib2R5LCBib2R5ID0gbnVsbCwgY29uZmlybV9sYWJlbCA9ICdDb25maXJtJywgY2FuY2VsX2xhYmVsID0gJ0NhbmNlbCcpIHtcbiAgICAgICAgbGV0IHRpdGxlID0gJ0NvbmZpcm0nO1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRpdGxlX29yX2JvZHk7XG5cbiAgICAgICAgaWYgKGJvZHkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRpdGxlID0gdGl0bGVfb3JfYm9keTtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBib2R5O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5fc2hvd19tb2RhbCh7XG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgICBib2R5OiBtZXNzYWdlLFxuICAgICAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGNhbmNlbF9sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBjbGFzczogJ2J0bi1zZWNvbmRhcnknLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogY29uZmlybV9sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzOiAnYnRuLXByaW1hcnknLFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgY2xvc2FibGU6IHRydWUsXG4gICAgICAgICAgICBjbG9zZV9vbl9zdWJtaXQ6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQgPT09IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvdyBhIHByb21wdCBkaWFsb2cgZm9yIHRleHQgaW5wdXRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xqUXVlcnl9IHRpdGxlX29yX2JvZHkgLSBNZXNzYWdlIChpZiAxLTMgYXJncykgb3IgVGl0bGUgKGlmIDQgYXJncykuIENhbiBiZSBzdHJpbmcgb3IgalF1ZXJ5IGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd8alF1ZXJ5fSBib2R5IC0gTWVzc2FnZSBib2R5IChvcHRpb25hbCkuIENhbiBiZSBzdHJpbmcgb3IgalF1ZXJ5IGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlZmF1bHRfdmFsdWUgLSBEZWZhdWx0IGlucHV0IHZhbHVlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBtdWx0aWxpbmUgLSBTaG93IHRleHRhcmVhIGluc3RlYWQgb2YgaW5wdXRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXJyb3IgLSBPcHRpb25hbCBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgYXMgdmFsaWRhdGlvbiBmZWVkYmFja1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ3xmYWxzZT59XG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIHByb21wdCh0aXRsZV9vcl9ib2R5LCBib2R5ID0gbnVsbCwgZGVmYXVsdF92YWx1ZSA9ICcnLCBtdWx0aWxpbmUgPSBmYWxzZSwgZXJyb3IgPSBudWxsKSB7XG4gICAgICAgIGxldCB0aXRsZSA9ICdJbnB1dCc7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGl0bGVfb3JfYm9keTtcblxuICAgICAgICAvLyBIYW5kbGUgb3ZlcmxvYWRlZCBhcmd1bWVudHNcbiAgICAgICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJyAmJiBib2R5ICE9PSAnJykge1xuICAgICAgICAgICAgdGl0bGUgPSB0aXRsZV9vcl9ib2R5O1xuICAgICAgICAgICAgbWVzc2FnZSA9IGJvZHk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgaW5wdXQgZWxlbWVudCB3aXRoIG1pbmltdW0gd2lkdGggY29uc3RyYWludHNcbiAgICAgICAgY29uc3QgJGlucHV0ID0gbXVsdGlsaW5lXG4gICAgICAgICAgICA/ICQoJzx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJvd3M9XCI0XCIgc3R5bGU9XCJtaW4td2lkdGg6IDMxNXB4O1wiPjwvdGV4dGFyZWE+JylcbiAgICAgICAgICAgIDogJCgnPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBzdHlsZT1cIm1pbi13aWR0aDogMjQ1cHg7XCI+Jyk7XG5cbiAgICAgICAgJGlucHV0LnZhbChkZWZhdWx0X3ZhbHVlKTtcblxuICAgICAgICAvLyBNYXJrIGFzIGludmFsaWQgaWYgdGhlcmUncyBhbiBlcnJvclxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICRpbnB1dC5hZGRDbGFzcygnaXMtaW52YWxpZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIGJvZHkgd2l0aCBtZXNzYWdlIGFuZCBpbnB1dFxuICAgICAgICBsZXQgJGJvZHk7XG4gICAgICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgalF1ZXJ5KSB7XG4gICAgICAgICAgICAvLyBJZiBtZXNzYWdlIGlzIGEgalF1ZXJ5IGVsZW1lbnQsIHVzZSBpdCBhcyB0aGUgY29udGFpbmVyIGFuZCBhcHBlbmQgaW5wdXRcbiAgICAgICAgICAgICRib2R5ID0gbWVzc2FnZS5hcHBlbmQoJGlucHV0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIG1lc3NhZ2UgaXMgYSBzdHJpbmcsIGNyZWF0ZSB3cmFwcGVyIHdpdGggdGV4dCBhbmQgaW5wdXQgKDM2cHggc3BhY2luZylcbiAgICAgICAgICAgICRib2R5ID0gJCgnPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj4nKS5hcHBlbmQoJCgnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDM2cHg7XCI+JykudGV4dChtZXNzYWdlKSkuYXBwZW5kKCRpbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgZXJyb3IgbWVzc2FnZSBpZiBwcm92aWRlZFxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0ICRlcnJvciA9ICQoJzxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIGQtYmxvY2tcIj48L2Rpdj4nKS50ZXh0KGVycm9yKTtcbiAgICAgICAgICAgICRib2R5LmFwcGVuZCgkZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5fc2hvd19tb2RhbCh7XG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgICBib2R5OiAkYm9keSxcbiAgICAgICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQ2FuY2VsJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBjbGFzczogJ2J0bi1zZWNvbmRhcnknLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1N1Ym1pdCcsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsLCAvLyBXaWxsIGJlIHJlcGxhY2VkIGJ5IGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzOiAnYnRuLXByaW1hcnknLFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRpbnB1dC52YWwoKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY2xvc2Vfb25fc3VibWl0OiB0cnVlLFxuICAgICAgICAgICAgbWF4X3dpZHRoOiA1MDAsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEZvY3VzIGFuZCBzZWxlY3QgaW5wdXQgYWZ0ZXIgbW9kYWwgc2hvd3NcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICRpbnB1dC5mb2N1cygpO1xuICAgICAgICAgICAgaWYgKCFtdWx0aWxpbmUpIHtcbiAgICAgICAgICAgICAgICAkaW5wdXQuc2VsZWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvdyBhbiBlcnJvciBkaWFsb2cgd2l0aCByZWQgYWxlcnQgc3R5bGluZ1xuICAgICAqXG4gICAgICogQ2FuIGFwcGVhciBvdmVyIG90aGVyIG1vZGFscyB0byBzaG93IGNyaXRpY2FsIHVuY2F1Z2h0IGV4Y2VwdGlvbnMuXG4gICAgICogVXNlZCBwcmltYXJpbHkgZm9yIEFqYXggZXJyb3JzIHRoYXQgd2VyZW4ndCBjYXVnaHQgYnkgYXBwbGljYXRpb24gY29kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfE9iamVjdH0gZXJyb3IgLSBFcnJvciBtZXNzYWdlIHN0cmluZywgRXJyb3Igb2JqZWN0LCBvciBzdHJ1Y3R1cmVkIGVycm9yXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gTW9kYWwgdGl0bGUgKGRlZmF1bHQ6IFwiRXJyb3JcIilcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgZXJyb3IoZXJyb3IsIHRpdGxlID0gJ0Vycm9yJykge1xuICAgICAgICBsZXQgbWVzc2FnZSA9ICcnO1xuXG4gICAgICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgZXJyb3IgdHlwZXNcbiAgICAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBlcnJvcjtcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gZXJyb3IubWVzc2FnZSB8fCBlcnJvci50b1N0cmluZygpO1xuICAgICAgICB9IGVsc2UgaWYgKGVycm9yICYmIGVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlO1xuICAgICAgICB9IGVsc2UgaWYgKGVycm9yICYmIGVycm9yLmVycm9yKSB7XG4gICAgICAgICAgICAvLyBGYXRhbCBlcnJvciB3aXRoIGRldGFpbHNcbiAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSBlcnJvci5lcnJvcjtcbiAgICAgICAgICAgIGlmIChkZXRhaWxzLmZpbGUgJiYgZGV0YWlscy5saW5lKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBVbmNhdWdodCBGYXRhbCBFcnJvciBpbiAke2RldGFpbHMuZmlsZX06JHtkZXRhaWxzLmxpbmV9OlxcblxcbiR7ZGV0YWlscy5lcnJvcn1gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gZGV0YWlscy5lcnJvciB8fCAnQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gJ0FuIHVua25vd24gZXJyb3Igb2NjdXJyZWQnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIGVycm9yIGJvZHkgd2l0aCByZWQgYWxlcnQgc3R5bGluZ1xuICAgICAgICBjb25zdCAkYm9keSA9ICQoJzxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXIgbWItMFwiIHJvbGU9XCJhbGVydFwiPicpLmFwcGVuZChcbiAgICAgICAgICAgICQoJzxwcmUgY2xhc3M9XCJtYi0wXCIgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IHdvcmQtd3JhcDogYnJlYWstd29yZDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgZm9udC1zaXplOiAwLjllbTtcIj4nKS50ZXh0KFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9zaG93X21vZGFsKHtcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgIGJvZHk6ICRib2R5LFxuICAgICAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdDbG9zZScsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjbGFzczogJ2J0bi1kYW5nZXInLFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgY2xvc2FibGU6IHRydWUsXG4gICAgICAgICAgICBjbG9zZV9vbl9zdWJtaXQ6IHRydWUsXG4gICAgICAgICAgICBtYXhfd2lkdGg6IDYwMCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBDdXN0b20gTW9kYWwgTWV0aG9kc1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBTaG93IGEgY3VzdG9tIG1vZGFsIHdpdGggc3BlY2lmaWVkIGNvbnRlbnQgYW5kIGJ1dHRvbnNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPCo+fVxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBzaG93KG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICAgICAgICB0aXRsZTogJ01vZGFsJyxcbiAgICAgICAgICAgIGJvZHk6ICcnLFxuICAgICAgICAgICAgYnV0dG9uczogW10sXG4gICAgICAgICAgICBtYXhfd2lkdGg6IDgwMCxcbiAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY2xvc2Vfb25fc3VibWl0OiB0cnVlLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGZpbmFsX29wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0cywgb3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3Nob3dfbW9kYWwoZmluYWxfb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvdyBhIG1vZGFsIHdpdGggYSBqcWh0bWwgZm9ybSBjb21wb25lbnRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmNvbXBvbmVudCAtIENvbXBvbmVudCBjbGFzcyBuYW1lXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMuY29tcG9uZW50X2FyZ3MgLSBBcmd1bWVudHMgdG8gcGFzcyB0byBjb21wb25lbnRcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLm9uX3N1Ym1pdCAtIENhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCBvbiBzdWJtaXQuIFJlY2VpdmVzIGZvcm0gY29tcG9uZW50IGluc3RhbmNlLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybiBmYWxzZSB0byBrZWVwIG1vZGFsIG9wZW4sIG9yIHJldHVybiBkYXRhIHRvIGNsb3NlIGFuZCByZXNvbHZlLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdHxmYWxzZT59XG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIGZvcm0ob3B0aW9ucykge1xuICAgICAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgICAgICAgIHRpdGxlOiAnRm9ybScsXG4gICAgICAgICAgICBjb21wb25lbnQ6IG51bGwsXG4gICAgICAgICAgICBjb21wb25lbnRfYXJnczoge30sXG4gICAgICAgICAgICBtYXhfd2lkdGg6IDgwMCxcbiAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlLFxuICAgICAgICAgICAgc3VibWl0X2xhYmVsOiAnU3VibWl0JyxcbiAgICAgICAgICAgIGNhbmNlbF9sYWJlbDogJ0NhbmNlbCcsXG4gICAgICAgICAgICBvbl9zdWJtaXQ6IG51bGwsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZmluYWxfb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRzLCBvcHRpb25zKTtcblxuICAgICAgICBpZiAoIWZpbmFsX29wdGlvbnMuY29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdNb2RhbC5mb3JtKCkgcmVxdWlyZXMgYSBjb21wb25lbnQnKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBjb21wb25lbnQgaW5zdGFuY2VcbiAgICAgICAgbGV0ICRjb21wb25lbnRfY29udGFpbmVyID0gJCgnPGRpdj4nKTtcbiAgICAgICAgbGV0IGNvbXBvbmVudF9pbnN0YW5jZSA9ICRjb21wb25lbnRfY29udGFpbmVyLmNvbXBvbmVudChmaW5hbF9vcHRpb25zLmNvbXBvbmVudCwgZmluYWxfb3B0aW9ucy5jb21wb25lbnRfYXJncyk7XG5cbiAgICAgICAgLy8gV2FpdCBmb3IgY29tcG9uZW50IHRvIGJlIHJlYWR5XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb21wb25lbnRfaW5zdGFuY2Uub24oJ3JlYWR5JywgKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRmluZCBhIGZvcm0gaW5zdGFuY2UgaWYgY29tcG9uZW50IGluc3RhbmNlIGRvZXNudCBoYXZlIC52YWxzKClcbiAgICAgICAgaWYgKCFjb21wb25lbnRfaW5zdGFuY2UudmFscykge1xuICAgICAgICAgICAgbGV0ICRmb3JtID0gY29tcG9uZW50X2luc3RhbmNlLiQuZmluZCgnLlJzeF9Gb3JtJyk7XG4gICAgICAgICAgICBpZiAoJGZvcm0uZXhpc3RzKCkpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRfaW5zdGFuY2UgPSAkZm9ybS5jb21wb25lbnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBidXR0b25zXG4gICAgICAgIGNvbnN0IGJ1dHRvbnMgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IGZpbmFsX29wdGlvbnMuY2FuY2VsX2xhYmVsLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjbGFzczogJ2J0bi1zZWNvbmRhcnknLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogZmluYWxfb3B0aW9ucy5zdWJtaXRfbGFiZWwsXG4gICAgICAgICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgY2xhc3M6ICdidG4tcHJpbWFyeScsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBvbl9zdWJtaXQgY2FsbGJhY2sgcHJvdmlkZWQsIHVzZSBpdFxuICAgICAgICAgICAgICAgICAgICBpZiAoZmluYWxfb3B0aW9ucy5vbl9zdWJtaXQgJiYgdHlwZW9mIGZpbmFsX29wdGlvbnMub25fc3VibWl0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaW5hbF9vcHRpb25zLm9uX3N1Ym1pdChjb21wb25lbnRfaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgY2FsbGJhY2sgcmV0dXJucyBudWxsL3VuZGVmaW5lZCwga2VlcCBtb2RhbCBvcGVuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIChpbmNsdWRpbmcgZmFsc2UpLCByZXR1cm4gdGhlIHJlc3VsdCB0byBjbG9zZSBtb2RhbFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIE5vIG9uX3N1Ym1pdCBjYWxsYmFjayAtIGdldCBmb3JtIGRhdGEgYW5kIGNsb3NlIG1vZGFsXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRfaW5zdGFuY2Uuc3VibWl0ICYmIHR5cGVvZiBjb21wb25lbnRfaW5zdGFuY2Uuc3VibWl0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgY29tcG9uZW50X2luc3RhbmNlLnN1Ym1pdCgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudF9pbnN0YW5jZS52YWxzICYmIHR5cGVvZiBjb21wb25lbnRfaW5zdGFuY2UudmFscyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudF9pbnN0YW5jZS52YWxzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0Zvcm0gY29tcG9uZW50IGhhcyBubyBzdWJtaXQoKSBvciB2YWxzKCkgbWV0aG9kJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9zaG93X21vZGFsKHtcbiAgICAgICAgICAgIHRpdGxlOiBmaW5hbF9vcHRpb25zLnRpdGxlLFxuICAgICAgICAgICAgYm9keTogY29tcG9uZW50X2luc3RhbmNlLiQsXG4gICAgICAgICAgICBidXR0b25zOiBidXR0b25zLFxuICAgICAgICAgICAgbWF4X3dpZHRoOiBmaW5hbF9vcHRpb25zLm1heF93aWR0aCxcbiAgICAgICAgICAgIGNsb3NhYmxlOiBmaW5hbF9vcHRpb25zLmNsb3NhYmxlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93IGFuIHVuY2xvc2FibGUgbW9kYWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVfb3JfYm9keVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBib2R5XG4gICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIHVuY2xvc2FibGUodGl0bGVfb3JfYm9keSwgYm9keSA9IG51bGwpIHtcbiAgICAgICAgbGV0IHRpdGxlID0gJ1BsZWFzZSBXYWl0JztcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0aXRsZV9vcl9ib2R5O1xuXG4gICAgICAgIGlmIChib2R5ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aXRsZSA9IHRpdGxlX29yX2JvZHk7XG4gICAgICAgICAgICBtZXNzYWdlID0gYm9keTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvbid0IHdhaXQgZm9yIHRoaXMgcHJvbWlzZSAtIGl0IG5ldmVyIHJlc29sdmVzIHVudGlsIGNsb3NlZCBtYW51YWxseVxuICAgICAgICB0aGlzLl9zaG93X21vZGFsKHtcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgIGJvZHk6IG1lc3NhZ2UsXG4gICAgICAgICAgICBidXR0b25zOiBbXSwgLy8gTm8gYnV0dG9uc1xuICAgICAgICAgICAgY2xvc2FibGU6IGZhbHNlLCAvLyBDYW4ndCBjbG9zZVxuICAgICAgICAgICAgY2xvc2Vfb25fc3VibWl0OiBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gV2FpdCBmb3IgbmV4dCBhbmltYXRpb24gZnJhbWUgZm9yIG1vZGFsIHRvIHJlbmRlclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZShyZXNvbHZlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvdyBhIG1vZGFsIHdpdGggY3VzdG9tIGpRdWVyeSBjb250ZW50XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTwqPn1cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgY3VzdG9tKG9wdGlvbnMpIHtcbiAgICAgICAgLy8gQWxpYXMgZm9yIHNob3coKSAtIHNhbWUgZnVuY3Rpb25hbGl0eVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zaG93KG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gSGVscGVyIE1ldGhvZHNcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogU2hvdyBhbiBlcnJvciBhbGVydFxuICAgICAqIEBwYXJhbSB7Kn0gZXJyb3JzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIGVycm9yKGVycm9ycywgdGl0bGUgPSAnRXJyb3InKSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gJ0FuIGVycm9yIG9jY3VycmVkJztcblxuICAgICAgICAvLyBIYW5kbGUgdmFyaW91cyBlcnJvciBmb3JtYXRzXG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3JzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgbWVzc2FnZSA9IGVycm9ycztcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvcnMgJiYgJ3Jlc3BvbnNlSlNPTicgaW4gZXJyb3JzICYmICdtZXNzYWdlJyBpbiBlcnJvcnMucmVzcG9uc2VKU09OKSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gZXJyb3JzLnJlc3BvbnNlSlNPTi5tZXNzYWdlO1xuICAgICAgICB9IGVsc2UgaWYgKGVycm9ycyAmJiAnbWVzc2FnZScgaW4gZXJyb3JzKSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gZXJyb3JzLm1lc3NhZ2U7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3JzICYmIHR5cGVvZiBlcnJvcnMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gZm9ybWF0IGVycm9yIG9iamVjdFxuICAgICAgICAgICAgY29uc3QgZXJyb3JfbWVzc2FnZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGVycm9ycykge1xuICAgICAgICAgICAgICAgIGlmIChpc19hcnJheShlcnJvcnNba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZXMucHVzaChlcnJvcnNba2V5XVswXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZXMucHVzaChlcnJvcnNba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yX21lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gZXJyb3JfbWVzc2FnZXMuam9pbignXFxuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLl9zaG93X21vZGFsKHtcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgIGJvZHk6IG1lc3NhZ2UsXG4gICAgICAgICAgICBpY29uOiAnZXhjbGFtYXRpb24tY2lyY2xlJyxcbiAgICAgICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnT0snLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M6ICdidG4tZGFuZ2VyJyxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY2xvc2Vfb25fc3VibWl0OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW9wZW4gY3VycmVudCBtb2RhbCB3aXRoIHZhbGlkYXRpb24gZXJyb3JzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVycm9yc1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyByZW9wZW5fd2l0aF9lcnJvcnMoZXJyb3JzKSB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50KSB7XG4gICAgICAgICAgICAvLyBNb2RhbCBpcyBzdGlsbCBvcGVuLCBqdXN0IGFwcGx5IGVycm9yc1xuICAgICAgICAgICAgdGhpcy5hcHBseV9lcnJvcnMoZXJyb3JzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignTm8gbW9kYWwgb3BlbiB0byBhcHBseSBlcnJvcnMgdG8nKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImNsYXNzIEJyZWFkY3J1bWJfSXRlbSBleHRlbmRzIEpxaHRtbF9Db21wb25lbnQge1xuICAgIG9uX2NyZWF0ZSgpIHtcbiAgICAgICAgLy8gUmVhZCBocmVmIGZyb20gSFRNTCBhdHRyaWJ1dGUgaWYgcHJlc2VudFxuICAgICAgICBjb25zdCBocmVmID0gdGhpcy4kLmF0dHIoJ2hyZWYnKTtcbiAgICAgICAgaWYgKGhyZWYpIHtcbiAgICAgICAgICAgIHRoaXMuYXJncy5ocmVmID0gaHJlZjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlYWQgYWN0aXZlIGZyb20gSFRNTCBhdHRyaWJ1dGUgaWYgcHJlc2VudFxuICAgICAgICBjb25zdCBhY3RpdmUgPSB0aGlzLiQuYXR0cignYWN0aXZlJyk7XG4gICAgICAgIGlmIChhY3RpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5hcmdzLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLiQuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgdGhpcy4kLmF0dHIoJ2FyaWEtY3VycmVudCcsICdwYWdlJyk7XG4gICAgICAgICAgICB0aGlzLiQucmVtb3ZlQXR0cignYWN0aXZlJyk7IC8vIFJlbW92ZSB0aGUgYXR0cmlidXRlIGFmdGVyIHJlYWRpbmdcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImNsYXNzIENsaWVudF9MYWJlbF9MaW5rIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgb25fY3JlYXRlKCkge1xuICAgICAgICB0aGlzLmRhdGEubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuZGF0YS5jbGllbnQgPSBudWxsO1xuXG4gICAgICAgIC8vIENvbnZlcnQgY2xpZW50X2lkIHRvIG51bWJlciBpZiBpdCdzIGEgbnVtZXJpYyBzdHJpbmdcbiAgICAgICAgaWYgKHRoaXMuYXJncy5jbGllbnRfaWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXJncy5jbGllbnRfaWQgPSB2YWx1ZV91bmxlc3NfbnVtZXJpY19zdHJpbmdfdGhlbl9udW1lcmljX3ZhbHVlKHRoaXMuYXJncy5jbGllbnRfaWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgb25fbG9hZCgpIHtcbiAgICAgICAgLy8gTG9hZCBjbGllbnQgZGF0YSBpZiB3ZSBoYXZlIGFuIElEXG4gICAgICAgIGlmICh0aGlzLmFyZ3MuY2xpZW50X2lkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jbGllbnQgPSBhd2FpdCBGcm9udGVuZF9Db250YWN0c19Db250cm9sbGVyLmdldF9jbGllbnQoe1xuICAgICAgICAgICAgICAgICAgICBjbGllbnRfaWQ6IHRoaXMuYXJncy5jbGllbnRfaWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgY2xpZW50OicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kYXRhLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uX3JlbmRlcigpIHtcbiAgICAgICAgLy8gU2V0IGhyZWYgZHluYW1pY2FsbHkgYWZ0ZXIgZWFjaCByZW5kZXJcbiAgICAgICAgaWYgKHRoaXMuYXJncy5jbGllbnRfaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGhyZWYgPSBSc3guUm91dGUoJ0Zyb250ZW5kX0NsaWVudHNfQ29udHJvbGxlcicsICd2aWV3JywgdGhpcy5hcmdzLmNsaWVudF9pZCk7XG4gICAgICAgICAgICB0aGlzLiQuYXR0cignaHJlZicsIGhyZWYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4kLmF0dHIoJ2hyZWYnLCAnIycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IG9yIHNldCB0aGUgY2xpZW50X2lkXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtjbGllbnRfaWRdIC0gSWYgcHJvdmlkZWQsIHNldHMgdGhlIGNsaWVudF9pZCBhbmQgcmVsb2Fkc1xuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEN1cnJlbnQgY2xpZW50X2lkIHdoZW4gY2FsbGVkIGFzIGdldHRlclxuICAgICAqL1xuICAgIHZhbChjbGllbnRfaWQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIEdldHRlclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJncy5jbGllbnRfaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBTZXR0ZXIgLSB1cGRhdGUgY2xpZW50X2lkIGFuZCByZWxvYWRcbiAgICAgICAgICAgIHRoaXMuYXJncy5jbGllbnRfaWQgPSB2YWx1ZV91bmxlc3NfbnVtZXJpY19zdHJpbmdfdGhlbl9udW1lcmljX3ZhbHVlKGNsaWVudF9pZCk7XG4gICAgICAgICAgICB0aGlzLmRhdGEubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmRhdGEuY2xpZW50ID0gbnVsbDtcblxuICAgICAgICAgICAgLy8gUmVsb2FkIGNsaWVudCBkYXRhIGFuZCByZS1yZW5kZXIgKG9uX3JlbmRlciB3aWxsIHVwZGF0ZSBocmVmKVxuICAgICAgICAgICAgdGhpcy5vbl9sb2FkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiY2xhc3MgQ2xpZW50X0xhYmVsIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgb25fY3JlYXRlKCkge1xuICAgICAgICB0aGlzLmRhdGEubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuZGF0YS5jbGllbnQgPSBudWxsO1xuXG4gICAgICAgIC8vIENvbnZlcnQgY2xpZW50X2lkIHRvIG51bWJlciBpZiBpdCdzIGEgbnVtZXJpYyBzdHJpbmdcbiAgICAgICAgaWYgKHRoaXMuYXJncy5jbGllbnRfaWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXJncy5jbGllbnRfaWQgPSB2YWx1ZV91bmxlc3NfbnVtZXJpY19zdHJpbmdfdGhlbl9udW1lcmljX3ZhbHVlKHRoaXMuYXJncy5jbGllbnRfaWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgb25fbG9hZCgpIHtcbiAgICAgICAgLy8gTG9hZCBjbGllbnQgZGF0YSBpZiB3ZSBoYXZlIGFuIElEXG4gICAgICAgIGlmICh0aGlzLmFyZ3MuY2xpZW50X2lkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jbGllbnQgPSBhd2FpdCBGcm9udGVuZF9Db250YWN0c19Db250cm9sbGVyLmdldF9jbGllbnQoe1xuICAgICAgICAgICAgICAgICAgICBjbGllbnRfaWQ6IHRoaXMuYXJncy5jbGllbnRfaWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgY2xpZW50OicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kYXRhLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBvciBzZXQgdGhlIGNsaWVudF9pZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbY2xpZW50X2lkXSAtIElmIHByb3ZpZGVkLCBzZXRzIHRoZSBjbGllbnRfaWQgYW5kIHJlbG9hZHNcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBDdXJyZW50IGNsaWVudF9pZCB3aGVuIGNhbGxlZCBhcyBnZXR0ZXJcbiAgICAgKi9cbiAgICB2YWwoY2xpZW50X2lkKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBHZXR0ZXJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFyZ3MuY2xpZW50X2lkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gU2V0dGVyIC0gdXBkYXRlIGNsaWVudF9pZCBhbmQgcmVsb2FkXG4gICAgICAgICAgICB0aGlzLmFyZ3MuY2xpZW50X2lkID0gdmFsdWVfdW5sZXNzX251bWVyaWNfc3RyaW5nX3RoZW5fbnVtZXJpY192YWx1ZShjbGllbnRfaWQpO1xuICAgICAgICAgICAgdGhpcy5kYXRhLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5kYXRhLmNsaWVudCA9IG51bGw7XG5cbiAgICAgICAgICAgIC8vIFJlbG9hZCBjbGllbnQgZGF0YSBhbmQgcmUtcmVuZGVyIChvbl9yZW5kZXIgd2lsbCB1cGRhdGUgaHJlZilcbiAgICAgICAgICAgIHRoaXMub25fbG9hZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKlxuICogRm9ybV9JbnB1dF9BYnN0cmFjdCAtIEJhc2UgY2xhc3MgZm9yIGFsbCBmb3JtIGlucHV0IHdpZGdldHNcbiAqXG4gKiBEZWZpbmVzIHRoZSBpbnRlcmZhY2UgdGhhdCBhbGwgZm9ybSB3aWRnZXRzIG11c3QgaW1wbGVtZW50LlxuICogVGhpcyBlbnN1cmVzIGNvbnNpc3RlbmN5IGFjcm9zcyBhbGwgaW5wdXQgdHlwZXMgKHRleHQsIHNlbGVjdCwgd3lzaXd5ZywgZXRjLilcbiAqXG4gKiBSRVFVSVJFRCBNRVRIT0RTIChtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMpOlxuICogLSB2YWwoKSAtIEdldCBjdXJyZW50IHZhbHVlIChubyBhcmd1bWVudHMpXG4gKiAtIHZhbCh2YWx1ZSkgLSBTZXQgdmFsdWUgKG9uZSBhcmd1bWVudClcbiAqIC0gc2VlZCgpIC0gRmlsbHMgdGhlIHdpZGdldCB3aXRoIHJhbmRvbSB0ZXN0IGRhdGEgKG9wdGlvbmFsKVxuICpcbiAqIEFsbCB3aWRnZXRzIG11c3Q6XG4gKiAtIEhhdmUgLldpZGdldCBDU1MgY2xhc3NcbiAqIC0gSGF2ZSBkYXRhLW5hbWUgYXR0cmlidXRlIHNldCBieSBGb3JtX0ZpZWxkXG4gKi9cbmNsYXNzIEZvcm1fSW5wdXRfQWJzdHJhY3QgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICAvKipcbiAgICAgKiB2YWwoKSAtIEdldCBvciBzZXQgdGhlIGN1cnJlbnQgdmFsdWVcbiAgICAgKiBTdWJjbGFzc2VzIE1VU1QgaW1wbGVtZW50IHRoaXMgbWV0aG9kXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IFt2YWx1ZV0gLSBJZiBwcm92aWRlZCwgc2V0cyB0aGUgdmFsdWUuIElmIG9taXR0ZWQsIHJldHVybnMgdGhlIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBUaGUgY3VycmVudCB2YWx1ZSB3aGVuIGNhbGxlZCBhcyBnZXR0ZXJcbiAgICAgKi9cbiAgICB2YWwodmFsdWUpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIEdldHRlclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0gbXVzdCBpbXBsZW1lbnQgdmFsKCkgZ2V0dGVyYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBTZXR0ZXJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IG11c3QgaW1wbGVtZW50IHZhbCh2YWx1ZSkgc2V0dGVyYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWVkIC0gRmlsbCB3aXRoIHJhbmRvbSB0ZXN0IGRhdGEgKG9wdGlvbmFsKVxuICAgICAqIFN1YmNsYXNzZXMgTUFZIGltcGxlbWVudCB0aGlzIG1ldGhvZFxuICAgICAqL1xuICAgIGFzeW5jIHNlZWQoKSB7XG4gICAgICAgIC8vIE9wdGlvbmFsIC0gd2lkZ2V0cyBjYW4gb3ZlcnJpZGUgaWYgdGhleSBzdXBwb3J0IHNlZWRpbmdcbiAgICB9XG59XG4iLCJjbGFzcyBUZXh0X0lucHV0IGV4dGVuZHMgRm9ybV9JbnB1dF9BYnN0cmFjdCB7XG4gICAgb25fY3JlYXRlKCkge1xuICAgICAgICB0aGlzLmRhdGEudmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB2YWwoKSAtIEdldCBvciBzZXQgdGhlIGlucHV0IHZhbHVlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt2YWx1ZV0gLSBJZiBwcm92aWRlZCwgc2V0cyB0aGUgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY3VycmVudCB2YWx1ZSB3aGVuIGNhbGxlZCBhcyBnZXR0ZXJcbiAgICAgKi9cbiAgICB2YWwodmFsdWUpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIEdldHRlclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGlkKCdpbnB1dCcpLnZhbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gU2V0dGVyXG4gICAgICAgICAgICB0aGlzLmRhdGEudmFsdWUgPSB2YWx1ZSB8fCAnJztcbiAgICAgICAgICAgIGlmICh0aGlzLiRpZCgnaW5wdXQnKS5leGlzdHMoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuJGlkKCdpbnB1dCcpLnZhbCh0aGlzLmRhdGEudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc2VlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuYXJncy5zZWVkZXIpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IEltcGxlbWVudCBSc3hfUmFuZG9tX1ZhbHVlcyBlbmRwb2ludFxuICAgICAgICAgICAgLy8gbGV0IHZhbHVlID0gYXdhaXQgUnN4X1JhbmRvbV9WYWx1ZXNbdGhpcy5hcmdzLnNlZWRlcl0oKTtcbiAgICAgICAgICAgIC8vIEZvciBub3csIGp1c3QgdXNlIHBsYWNlaG9sZGVyIHRleHRcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9ICdUZXN0ICcgKyAodGhpcy5hcmdzLnNlZWRlciB8fCAnVmFsdWUnKTtcbiAgICAgICAgICAgIHRoaXMudmFsKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImNsYXNzIENoZWNrYm94X0lucHV0IGV4dGVuZHMgRm9ybV9JbnB1dF9BYnN0cmFjdCB7XG4gICAgb25fY3JlYXRlKCkge1xuICAgICAgICB0aGlzLmRhdGEuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNoZWNrZWRfdmFsdWUgPSB0aGlzLmFyZ3MuY2hlY2tlZF92YWx1ZSB8fCAnMSc7XG4gICAgICAgIHRoaXMudW5jaGVja2VkX3ZhbHVlID0gdGhpcy5hcmdzLnVuY2hlY2tlZF92YWx1ZSB8fCAnMCc7XG4gICAgfVxuXG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIC8vIENvbm5lY3QgbGFiZWwgY2xpY2tzIHRvIGNoZWNrYm94XG4gICAgICAgIGNvbnN0ICRpbnB1dCA9IHRoaXMuJGlkKCdpbnB1dCcpO1xuICAgICAgICBjb25zdCAkbGFiZWwgPSB0aGlzLiRpZCgnbGFiZWwnKTtcblxuICAgICAgICBpZiAoJGxhYmVsLmV4aXN0cygpKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dF9pZCA9ICRpbnB1dC5hdHRyKCdpZCcpO1xuICAgICAgICAgICAgJGxhYmVsLmF0dHIoJ2ZvcicsIGlucHV0X2lkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHZhbCgpIC0gR2V0IG9yIHNldCB0aGUgY2hlY2tib3ggc3RhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xib29sZWFufSBbdmFsdWVdIC0gSWYgcHJvdmlkZWQsIHNldHMgdGhlIGNoZWNrZWQgc3RhdGVcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY2hlY2tlZF92YWx1ZSBvciB1bmNoZWNrZWRfdmFsdWUgd2hlbiBjYWxsZWQgYXMgZ2V0dGVyXG4gICAgICovXG4gICAgdmFsKHZhbHVlKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBHZXR0ZXJcbiAgICAgICAgICAgIGNvbnN0IGlzX2NoZWNrZWQgPSB0aGlzLiRpZCgnaW5wdXQnKS5wcm9wKCdjaGVja2VkJyk7XG4gICAgICAgICAgICByZXR1cm4gaXNfY2hlY2tlZCA/IHRoaXMuY2hlY2tlZF92YWx1ZSA6IHRoaXMudW5jaGVja2VkX3ZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gU2V0dGVyIC0gYWNjZXB0cyBib29sZWFuLCBjaGVja2VkX3ZhbHVlLCBvciB1bmNoZWNrZWRfdmFsdWVcbiAgICAgICAgICAgIGxldCBzaG91bGRfY2hlY2sgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgc2hvdWxkX2NoZWNrID0gdmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSB0aGlzLmNoZWNrZWRfdmFsdWUgfHwgdmFsdWUgPT09ICcxJyB8fCB2YWx1ZSA9PT0gMSB8fCB2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHNob3VsZF9jaGVjayA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZGF0YS5jaGVja2VkID0gc2hvdWxkX2NoZWNrO1xuICAgICAgICAgICAgaWYgKHRoaXMuJGlkKCdpbnB1dCcpLmV4aXN0cygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kaWQoJ2lucHV0JykucHJvcCgnY2hlY2tlZCcsIHNob3VsZF9jaGVjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBzZWVkKCkge1xuICAgICAgICAvLyBSYW5kb21seSBjaGVjayBvciB1bmNoZWNrXG4gICAgICAgIHRoaXMudmFsKE1hdGgucmFuZG9tKCkgPiAwLjUpO1xuICAgIH1cbn1cbiIsIi8qKlxuICogV3lzaXd5Z19JbnB1dCAtIFdZU0lXWUcgZWRpdG9yIHdpZGdldCB1c2luZyBRdWlsbFxuICpcbiAqIEltcGxlbWVudHMgdGhlIGZvcm0gd2lkZ2V0IGludGVyZmFjZTpcbiAqIC0gdmFsKCkgLSBHZXQvc2V0IEhUTUwgY29udGVudFxuICogLSBzZWVkKCkgLSBGaWxscyB3aXRoIHJhbmRvbSBjb250ZW50XG4gKi9cbmNsYXNzIFd5c2l3eWdfSW5wdXQgZXh0ZW5kcyBGb3JtX0lucHV0X0Fic3RyYWN0IHtcbiAgICBvbl9jcmVhdGUoKSB7XG4gICAgICAgIHRoaXMucXVpbGwgPSBudWxsO1xuICAgIH1cblxuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBXYWl0IGZvciBRdWlsbCB0byBiZSBsb2FkZWQsIHRoZW4gaW5pdGlhbGl6ZVxuICAgICAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICAgICAgcXVpbGxfcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGF0Ll9pbml0aWFsaXplX3F1aWxsKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9pbml0aWFsaXplX3F1aWxsKCkge1xuICAgICAgICAvLyBJbml0aWFsaXplIFF1aWxsIGVkaXRvclxuICAgICAgICB0aGlzLnF1aWxsID0gbmV3IFF1aWxsKHRoaXMuJGlkKCdlZGl0b3InKVswXSwge1xuICAgICAgICAgICAgdGhlbWU6ICdzbm93JyxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLmFyZ3MucGxhY2Vob2xkZXIgfHwgJ0VudGVyIHRleHQuLi4nLFxuICAgICAgICAgICAgbW9kdWxlczoge1xuICAgICAgICAgICAgICAgIHRvb2xiYXI6IFtcbiAgICAgICAgICAgICAgICAgICAgW3sgJ2hlYWRlcic6IFsxLCAyLCAzLCBmYWxzZV0gfV0sXG4gICAgICAgICAgICAgICAgICAgIFsnYm9sZCcsICdpdGFsaWMnLCAndW5kZXJsaW5lJywgJ3N0cmlrZSddLFxuICAgICAgICAgICAgICAgICAgICBbJ2Jsb2NrcXVvdGUnLCAnY29kZS1ibG9jayddLFxuICAgICAgICAgICAgICAgICAgICBbeyAnbGlzdCc6ICdvcmRlcmVkJ30sIHsgJ2xpc3QnOiAnYnVsbGV0JyB9XSxcbiAgICAgICAgICAgICAgICAgICAgW3sgJ2luZGVudCc6ICctMSd9LCB7ICdpbmRlbnQnOiAnKzEnIH1dLFxuICAgICAgICAgICAgICAgICAgICBbJ2xpbmsnLCAnaW1hZ2UnXSxcbiAgICAgICAgICAgICAgICAgICAgWydjbGVhbiddXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBVcGRhdGUgaGlkZGVuIGlucHV0IG9uIHRleHQgY2hhbmdlXG4gICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgICAgICB0aGlzLnF1aWxsLm9uKCd0ZXh0LWNoYW5nZScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhhdC4kaWQoJ2hpZGRlbl9pbnB1dCcpLnZhbCh0aGF0LnF1aWxsLnJvb3QuaW5uZXJIVE1MKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdmFsKCkgLSBHZXQgb3Igc2V0IEhUTUwgY29udGVudFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdIC0gSWYgcHJvdmlkZWQsIHNldHMgdGhlIEhUTUwgY29udGVudFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBIVE1MIGNvbnRlbnQgd2hlbiBjYWxsZWQgYXMgZ2V0dGVyXG4gICAgICovXG4gICAgdmFsKHZhbHVlKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBHZXR0ZXJcbiAgICAgICAgICAgIGlmICghdGhpcy5xdWlsbCkgcmV0dXJuICcnO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVpbGwucm9vdC5pbm5lckhUTUw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBTZXR0ZXJcbiAgICAgICAgICAgIGlmICghdGhpcy5xdWlsbCkge1xuICAgICAgICAgICAgICAgIC8vIFF1aWxsIG5vdCByZWFkeSB5ZXQsIHdhaXQgYW5kIHRyeSBhZ2FpblxuICAgICAgICAgICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhhdC52YWwodmFsdWUpLCAxMDApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWlsbC5yb290LmlubmVySFRNTCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMuJGlkKCdoaWRkZW5faW5wdXQnKS52YWwodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VlZCAtIEZpbGwgd2l0aCByYW5kb20gY29udGVudCBmb3IgdGVzdGluZ1xuICAgICAqL1xuICAgIGFzeW5jIHNlZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWlsbCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHNhbXBsZV9jb250ZW50ID0gYFxuICAgICAgICAgICAgPGgyPlNhbXBsZSBIZWFkaW5nPC9oMj5cbiAgICAgICAgICAgIDxwPlRoaXMgaXMgYSBzYW1wbGUgcGFyYWdyYXBoIHdpdGggPHN0cm9uZz5ib2xkIHRleHQ8L3N0cm9uZz4gYW5kIDxlbT5pdGFsaWMgdGV4dDwvZW0+LjwvcD5cbiAgICAgICAgICAgIDx1bD5cbiAgICAgICAgICAgICAgICA8bGk+Rmlyc3QgYnVsbGV0IHBvaW50PC9saT5cbiAgICAgICAgICAgICAgICA8bGk+U2Vjb25kIGJ1bGxldCBwb2ludDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpPlRoaXJkIGJ1bGxldCBwb2ludDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPHA+QW5vdGhlciBwYXJhZ3JhcGggd2l0aCA8YSBocmVmPVwiI1wiPmEgc2FtcGxlIGxpbms8L2E+LjwvcD5cbiAgICAgICAgYDtcblxuICAgICAgICB0aGlzLnZhbChzYW1wbGVfY29udGVudCk7XG4gICAgfVxufVxuIiwiY2xhc3MgU2VsZWN0X0lucHV0IGV4dGVuZHMgRm9ybV9JbnB1dF9BYnN0cmFjdCB7XG4gICAgb25fY3JlYXRlKCkge1xuICAgICAgICB0aGlzLmRhdGEudmFsdWUgPSAnJztcblxuICAgICAgICAvLyBQYXJzZSBvcHRpb25zIGlmIHBhc3NlZCBhcyBKU09OIHN0cmluZ1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYXJncy5vcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBEZWNvZGUgSFRNTCBlbnRpdGllcyBiZWZvcmUgcGFyc2luZyBKU09OXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBoYW5kbGVzIGNhc2VzIHdoZXJlIEpTT04gaXMgcGFzc2VkIHRocm91Z2ggQmxhZGUgeyEhICEhfSBzeW50YXhcbiAgICAgICAgICAgICAgICBjb25zdCBkZWNvZGVkID0gJCgnPHRleHRhcmVhPicpLmh0bWwodGhpcy5hcmdzLm9wdGlvbnMpLnRleHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFyZ3Mub3B0aW9ucyA9IGpzb25fZGVjb2RlKGRlY29kZWQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBvcHRpb25zIEpTT046JywgZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hcmdzLm9wdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgb2JqZWN0IG9wdGlvbnMgdG8gYXJyYXkgZm9ybWF0XG4gICAgICAgIGlmICh0aGlzLmFyZ3Mub3B0aW9ucyAmJiB0eXBlb2YgdGhpcy5hcmdzLm9wdGlvbnMgPT09ICdvYmplY3QnICYmICFpc19hcnJheSh0aGlzLmFyZ3Mub3B0aW9ucykpIHtcbiAgICAgICAgICAgIHRoaXMuYXJncy5vcHRpb25zID0gT2JqZWN0LmVudHJpZXModGhpcy5hcmdzLm9wdGlvbnMpLm1hcCgoW3ZhbHVlLCBsYWJlbF0pID0+ICh7dmFsdWUsIGxhYmVsfSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIC8vIEluaXRpYWxpemUgVG9tIFNlbGVjdFxuICAgICAgICBsZXQgY29uZmlnID0ge1xuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IHRoaXMuYXJncy5wbGFjZWhvbGRlciB8fCAnJyxcbiAgICAgICAgICAgIGFsbG93RW1wdHlPcHRpb246IHRydWUsXG4gICAgICAgICAgICBjcmVhdGU6IGZhbHNlLFxuICAgICAgICAgICAgbWF4T3B0aW9uczogbnVsbCwgIC8vIFNob3cgYWxsIG9wdGlvbnMgKGRlZmF1bHQgaXMgNTApXG4gICAgICAgICAgICBwbHVnaW5zOiBbJ2Ryb3Bkb3duX2lucHV0J10sICAvLyBFbmFibGUgc2VhcmNoIGluIGRyb3Bkb3duXG4gICAgICAgICAgICBvbkluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIC8vIEtlZXAgQm9vdHN0cmFwIGZvcm0tc2VsZWN0IGNsYXNzXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLmNsYXNzTGlzdC5hZGQoJ2Zvcm0tc2VsZWN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy50b21fc2VsZWN0ID0gbmV3IFRvbVNlbGVjdCh0aGlzLiRpZCgnaW5wdXQnKS5nZXQoMCksIGNvbmZpZyk7XG5cbiAgICAgICAgLy8gU2V0IGluaXRpYWwgdmFsdWUgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKHRoaXMuZGF0YS52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy50b21fc2VsZWN0LnNldFZhbHVlKHRoaXMuZGF0YS52YWx1ZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB2YWwoKSAtIEdldCBvciBzZXQgdGhlIHNlbGVjdGVkIHZhbHVlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt2YWx1ZV0gLSBJZiBwcm92aWRlZCwgc2V0cyB0aGUgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY3VycmVudCB2YWx1ZSB3aGVuIGNhbGxlZCBhcyBnZXR0ZXJcbiAgICAgKi9cbiAgICB2YWwodmFsdWUpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIEdldHRlclxuICAgICAgICAgICAgaWYgKHRoaXMudG9tX3NlbGVjdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvbV9zZWxlY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLiRpZCgnaW5wdXQnKS52YWwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFNldHRlclxuICAgICAgICAgICAgdGhpcy5kYXRhLnZhbHVlID0gdmFsdWUgfHwgJyc7XG4gICAgICAgICAgICBpZiAodGhpcy50b21fc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b21fc2VsZWN0LnNldFZhbHVlKHRoaXMuZGF0YS52YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuJGlkKCdpbnB1dCcpLmV4aXN0cygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kaWQoJ2lucHV0JykudmFsKHRoaXMuZGF0YS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBzZWVkKCkge1xuICAgICAgICBpZiAodGhpcy5hcmdzLnNlZWRlcikge1xuICAgICAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50IFJzeF9SYW5kb21fVmFsdWVzIGVuZHBvaW50XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSAnVGVzdCAnICsgKHRoaXMuYXJncy5zZWVkZXIgfHwgJ1ZhbHVlJyk7XG4gICAgICAgICAgICB0aGlzLnZhbCh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hcmdzLm9wdGlvbnMgJiYgdGhpcy5hcmdzLm9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gU2VsZWN0IHJhbmRvbSBvcHRpb25cbiAgICAgICAgICAgIGxldCByYW5kb21faW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB0aGlzLmFyZ3Mub3B0aW9ucy5sZW5ndGgpO1xuICAgICAgICAgICAgbGV0IHJhbmRvbV9vcHQgPSB0aGlzLmFyZ3Mub3B0aW9uc1tyYW5kb21faW5kZXhdO1xuICAgICAgICAgICAgbGV0IHJhbmRvbV92YWx1ZSA9IHR5cGVvZiByYW5kb21fb3B0ID09PSAnb2JqZWN0JyA/IHJhbmRvbV9vcHQudmFsdWUgOiByYW5kb21fb3B0O1xuICAgICAgICAgICAgdGhpcy52YWwocmFuZG9tX3ZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uX2Rlc3Ryb3koKSB7XG4gICAgICAgIC8vIENsZWFuIHVwIFRvbSBTZWxlY3QgaW5zdGFuY2VcbiAgICAgICAgaWYgKHRoaXMudG9tX3NlbGVjdCkge1xuICAgICAgICAgICAgdGhpcy50b21fc2VsZWN0LmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImNsYXNzIEFqYXhfU2VsZWN0X0lucHV0IGV4dGVuZHMgU2VsZWN0X0lucHV0IHtcbiAgICBvbl9jcmVhdGUoKSB7XG4gICAgICAgIC8vIEluaXRpYWxpemUgZW1wdHkgc2VsZWN0IHZhbHVlcyBhcnJheVxuICAgICAgICB0aGlzLmRhdGEuc2VsZWN0X3ZhbHVlcyA9IFtdO1xuXG4gICAgICAgIC8vIFN0b3JlIGZvciB2YWx1ZSBzZXQgYmVmb3JlIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlc1xuICAgICAgICB0aGlzLl9wZW5kaW5nX3ZhbHVlID0gbnVsbDtcblxuICAgICAgICAvLyBDYWxsIHBhcmVudCB0byBkbyBiYXNpYyBzZXR1cFxuICAgICAgICBzdXBlci5vbl9jcmVhdGUoKTtcbiAgICB9XG5cbiAgICBhc3luYyBvbl9sb2FkKCkge1xuICAgICAgICAvLyBMb2FkIG9wdGlvbnMgZnJvbSBBamF4IGVuZHBvaW50IGlmIHByb3ZpZGVkXG4gICAgICAgIGlmICh0aGlzLmFyZ3MuZGF0YSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHRoaXMuYXJncy5kYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCBlcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2VsZWN0X3ZhbHVlcyA9IGRhdGE7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHNlbGVjdCBvcHRpb25zOicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2VsZWN0X3ZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIC8vIENhbGwgcGFyZW50IHRvIGluaXRpYWxpemUgVG9tIFNlbGVjdFxuICAgICAgICBzdXBlci5vbl9yZWFkeSgpO1xuXG4gICAgICAgIC8vIElmIGEgdmFsdWUgd2FzIHNldCBiZWZvcmUgaW5pdGlhbGl6YXRpb24sIGFwcGx5IGl0IG5vd1xuICAgICAgICBpZiAodGhpcy5fcGVuZGluZ192YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudG9tX3NlbGVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9tX3NlbGVjdC5zZXRWYWx1ZSh0aGlzLl9wZW5kaW5nX3ZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy4kaWQoJ2lucHV0JykuZXhpc3RzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRpZCgnaW5wdXQnKS52YWwodGhpcy5fcGVuZGluZ192YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRhdGEudmFsdWUgPSB0aGlzLl9wZW5kaW5nX3ZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fcGVuZGluZ192YWx1ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB2YWwoKSAtIEdldCBvciBzZXQgdGhlIHNlbGVjdGVkIHZhbHVlXG4gICAgICogSGFuZGxlcyBjYWxscyBiZWZvcmUgVG9tIFNlbGVjdCBpbml0aWFsaXphdGlvbiBjb21wbGV0ZXNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ZhbHVlXSAtIElmIHByb3ZpZGVkLCBzZXRzIHRoZSB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjdXJyZW50IHZhbHVlIHdoZW4gY2FsbGVkIGFzIGdldHRlclxuICAgICAqL1xuICAgIHZhbCh2YWx1ZSkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gR2V0dGVyXG4gICAgICAgICAgICBpZiAodGhpcy50b21fc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZWQgLSBnZXQgZnJvbSBUb20gU2VsZWN0XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9tX3NlbGVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9wZW5kaW5nX3ZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gTm90IHlldCBpbml0aWFsaXplZCAtIHJldHVybiBwZW5kaW5nIHZhbHVlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BlbmRpbmdfdmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIC8vIFJldHVybiBkYXRhIHZhbHVlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFNldHRlclxuICAgICAgICAgICAgaWYgKHRoaXMudG9tX3NlbGVjdCkge1xuICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemVkIC0gc2V0IHZpYSBUb20gU2VsZWN0XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhLnZhbHVlID0gdmFsdWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgdGhpcy50b21fc2VsZWN0LnNldFZhbHVlKHRoaXMuZGF0YS52YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE5vdCB5ZXQgaW5pdGlhbGl6ZWQgLSBzdG9yZSBmb3IgbGF0ZXJcbiAgICAgICAgICAgICAgICB0aGlzLl9wZW5kaW5nX3ZhbHVlID0gdmFsdWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhLnZhbHVlID0gdmFsdWUgfHwgJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKipcbiAqIEN1cnJlbmN5X0lucHV0XG4gKlxuICogRXh0ZW5kcyBUZXh0X0lucHV0IHRvIHByb3ZpZGUgYXV0b21hdGljIGN1cnJlbmN5IGZvcm1hdHRpbmcuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEFkZHMgdGhvdXNhbmRzIHNlcGFyYXRvcnMgKGNvbW1hcykgZXZlcnkgMyBkaWdpdHNcbiAqIC0gT3B0aW9uYWwgY3VycmVuY3kgc3ltYm9sIHByZWZpeCAoZGVmYXVsdDogaGlkZGVuKVxuICogLSBPcHRpb25hbCBkZWNpbWFsIHN1cHBvcnQgKGRlZmF1bHQ6IGRpc2FibGVkKVxuICogLSBTbWFydCBiYWNrc3BhY2Ugb3ZlciBmb3JtYXR0aW5nIGNoYXJhY3RlcnNcbiAqIC0gTm8gbWlkLXN0cmluZyBmb3JtYXR0aW5nICh3YWl0cyBmb3IgYmx1cilcbiAqXG4gKiBBcmd1bWVudHM6XG4gKiAtICRhbGxvd19kZWNpbWFscyAtIEFsbG93IDIgZGVjaW1hbCBwbGFjZXMgKGRlZmF1bHQ6IGZhbHNlKVxuICogLSAkc2hvd19zeW1ib2wgLSBTaG93IGN1cnJlbmN5IHN5bWJvbCAoZGVmYXVsdDogZmFsc2UpXG4gKiAtICRjdXJyZW5jeV9zeW1ib2wgLSBDdXJyZW5jeSBzeW1ib2wgdG8gdXNlIChkZWZhdWx0OiBcIiRcIilcbiAqXG4gKiBVc2FnZTpcbiAqICAgPEN1cnJlbmN5X0lucHV0IC8+XG4gKiAgIDxDdXJyZW5jeV9JbnB1dCAkc2hvd19zeW1ib2w9dHJ1ZSAvPlxuICogICA8Q3VycmVuY3lfSW5wdXQgJGFsbG93X2RlY2ltYWxzPXRydWUgLz5cbiAqICAgPEN1cnJlbmN5X0lucHV0ICRzaG93X3N5bWJvbD10cnVlICRhbGxvd19kZWNpbWFscz10cnVlICRjdXJyZW5jeV9zeW1ib2w9XCLigqxcIiAvPlxuICpcbiAqIEJlaGF2aW9yOlxuICogLSBUeXBlIFwiMTIzNDU2N1wiIC0+IGRpc3BsYXlzIFwiMSwyMzQsNTY3XCIsIHZhbCgpIHJldHVybnMgXCIxMjM0NTY3XCJcbiAqIC0gVHlwZSBcIjEyMzQ1NjcuODlcIiAod2l0aCBkZWNpbWFscykgLT4gZGlzcGxheXMgXCIxLDIzNCw1NjcuODlcIiwgdmFsKCkgcmV0dXJucyBcIjEyMzQ1NjcuODlcIlxuICogLSBXaXRoIHN5bWJvbDogZGlzcGxheXMgXCIkMSwyMzQsNTY3XCIsIHZhbCgpIHN0aWxsIHJldHVybnMgXCIxMjM0NTY3XCJcbiAqL1xuY2xhc3MgQ3VycmVuY3lfSW5wdXQgZXh0ZW5kcyBUZXh0X0lucHV0IHtcbiAgICBvbl9jcmVhdGUoKSB7XG4gICAgICAgIHN1cGVyLm9uX2NyZWF0ZSgpO1xuXG4gICAgICAgIC8vIFNldCBkZWZhdWx0cyBmb3Igb3B0aW9uc1xuICAgICAgICBpZiAodGhpcy5hcmdzLmFsbG93X2RlY2ltYWxzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXJncy5hbGxvd19kZWNpbWFscyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFyZ3Muc2hvd19zeW1ib2wgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5hcmdzLnNob3dfc3ltYm9sID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYXJncy5jdXJyZW5jeV9zeW1ib2wgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5hcmdzLmN1cnJlbmN5X3N5bWJvbCA9ICckJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcm1hdCBjdXJyZW5jeSB3aXRoIGNvbW1hcyBhbmQgb3B0aW9uYWwgc3ltYm9sXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gTnVtZXJpYyB2YWx1ZSAobWF5IGluY2x1ZGUgZGVjaW1hbClcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBGb3JtYXR0ZWQgY3VycmVuY3kgc3RyaW5nXG4gICAgICovXG4gICAgX2Zvcm1hdF9jdXJyZW5jeSh2YWx1ZSkge1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTcGxpdCBpbnRvIGludGVnZXIgYW5kIGRlY2ltYWwgcGFydHNcbiAgICAgICAgbGV0IHBhcnRzID0gdmFsdWUuc3BsaXQoJy4nKTtcbiAgICAgICAgbGV0IGludGVnZXJfcGFydCA9IHBhcnRzWzBdO1xuICAgICAgICBsZXQgZGVjaW1hbF9wYXJ0ID0gcGFydHNbMV07XG5cbiAgICAgICAgLy8gQWRkIGNvbW1hcyB0byBpbnRlZ2VyIHBhcnRcbiAgICAgICAgaW50ZWdlcl9wYXJ0ID0gaW50ZWdlcl9wYXJ0LnJlcGxhY2UoL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csICcsJyk7XG5cbiAgICAgICAgLy8gUmVjb25zdHJ1Y3Qgd2l0aCBkZWNpbWFsIGlmIGFsbG93ZWRcbiAgICAgICAgbGV0IGZvcm1hdHRlZCA9IGludGVnZXJfcGFydDtcbiAgICAgICAgaWYgKHRoaXMuYXJncy5hbGxvd19kZWNpbWFscyAmJiBkZWNpbWFsX3BhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gTGltaXQgdG8gMiBkZWNpbWFsIHBsYWNlc1xuICAgICAgICAgICAgZGVjaW1hbF9wYXJ0ID0gZGVjaW1hbF9wYXJ0LnN1YnN0cigwLCAyKTtcbiAgICAgICAgICAgIGZvcm1hdHRlZCArPSAnLicgKyBkZWNpbWFsX3BhcnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgY3VycmVuY3kgc3ltYm9sIGlmIGVuYWJsZWRcbiAgICAgICAgaWYgKHRoaXMuYXJncy5zaG93X3N5bWJvbCkge1xuICAgICAgICAgICAgZm9ybWF0dGVkID0gdGhpcy5hcmdzLmN1cnJlbmN5X3N5bWJvbCArIGZvcm1hdHRlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtYXR0ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdCBudW1lcmljIHZhbHVlIGZyb20gZm9ybWF0dGVkIHN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXR0ZWQgLSBGb3JtYXR0ZWQgY3VycmVuY3kgc3RyaW5nXG4gICAgICogQHJldHVybnMge3N0cmluZ30gQ2xlYW4gbnVtZXJpYyB2YWx1ZSAoZGlnaXRzIGFuZCBkZWNpbWFsIG9ubHkpXG4gICAgICovXG4gICAgX2dldF9udW1lcmljX3ZhbHVlKGZvcm1hdHRlZCkge1xuICAgICAgICBpZiAoIWZvcm1hdHRlZCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIGN1cnJlbmN5IHN5bWJvbCBhbmQgY29tbWFzXG4gICAgICAgIGxldCBjbGVhbmVkID0gZm9ybWF0dGVkLnJlcGxhY2UoL1teMC05Ll0vZywgJycpO1xuXG4gICAgICAgIC8vIEVuc3VyZSBvbmx5IG9uZSBkZWNpbWFsIHBvaW50XG4gICAgICAgIGNvbnN0IGRlY2ltYWxfY291bnQgPSAoY2xlYW5lZC5tYXRjaCgvXFwuL2cpIHx8IFtdKS5sZW5ndGg7XG4gICAgICAgIGlmIChkZWNpbWFsX2NvdW50ID4gMSkge1xuICAgICAgICAgICAgLy8gS2VlcCBvbmx5IGZpcnN0IGRlY2ltYWwgcG9pbnRcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0X2RlY2ltYWwgPSBjbGVhbmVkLmluZGV4T2YoJy4nKTtcbiAgICAgICAgICAgIGNsZWFuZWQgPSBjbGVhbmVkLnN1YnN0cigwLCBmaXJzdF9kZWNpbWFsICsgMSkgKyBjbGVhbmVkLnN1YnN0cihmaXJzdF9kZWNpbWFsICsgMSkucmVwbGFjZSgvXFwuL2csICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjbGVhbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHZhbCgpIC0gR2V0IG9yIHNldCB0aGUgY3VycmVuY3kgdmFsdWVcbiAgICAgKiBHZXR0ZXIgcmV0dXJucyBudW1lcmljIHN0cmluZyAobm8gY29tbWFzLCBubyBzeW1ib2wpXG4gICAgICogU2V0dGVyIGFjY2VwdHMgYW55dGhpbmcgYW5kIGZvcm1hdHMgd2l0aCBjb21tYXMvc3ltYm9sXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt2YWx1ZV1cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHZhbCh2YWx1ZSkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gR2V0dGVyIC0gcmV0dXJuIG51bWVyaWMgdmFsdWUgb25seVxuICAgICAgICAgICAgY29uc3QgcmF3ID0gdGhpcy4kaWQoJ2lucHV0JykudmFsKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0X251bWVyaWNfdmFsdWUocmF3KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFNldHRlciAtIGZvcm1hdCBhbmQgZGlzcGxheVxuICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YS52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiRpZCgnaW5wdXQnKS5leGlzdHMoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRpZCgnaW5wdXQnKS52YWwoJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENsZWFuIHRoZSBpbnB1dCB2YWx1ZVxuICAgICAgICAgICAgY29uc3QgbnVtZXJpYyA9IHRoaXMuX2dldF9udW1lcmljX3ZhbHVlKHN0cih2YWx1ZSkpO1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gdGhpcy5fZm9ybWF0X2N1cnJlbmN5KG51bWVyaWMpO1xuXG4gICAgICAgICAgICB0aGlzLmRhdGEudmFsdWUgPSBmb3JtYXR0ZWQ7XG4gICAgICAgICAgICBpZiAodGhpcy4kaWQoJ2lucHV0JykuZXhpc3RzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRpZCgnaW5wdXQnKS52YWwoZm9ybWF0dGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICBzdXBlci5vbl9yZWFkeSgpO1xuXG4gICAgICAgIGNvbnN0ICRpbnB1dCA9IHRoaXMuJGlkKCdpbnB1dCcpO1xuXG4gICAgICAgIC8vIEhhbmRsZSBrZXlkb3duIHRvIGludGVyY2VwdCBiYWNrc3BhY2UgYXQgZW5kIG9mIHN0cmluZ1xuICAgICAgICAkaW5wdXQub24oJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmF3ID0gJGlucHV0LnZhbCgpO1xuXG4gICAgICAgICAgICAvLyBPbmx5IGhhbmRsZSBiYWNrc3BhY2Uga2V5XG4gICAgICAgICAgICBpZiAoZS5rZXkgIT09ICdCYWNrc3BhY2UnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpbnB1dF9lbGVtZW50ID0gJGlucHV0WzBdO1xuICAgICAgICAgICAgY29uc3QgY3Vyc29yX3BvcyA9IGlucHV0X2VsZW1lbnQuc2VsZWN0aW9uU3RhcnQ7XG4gICAgICAgICAgICBjb25zdCBjdXJzb3JfZW5kID0gaW5wdXRfZWxlbWVudC5zZWxlY3Rpb25FbmQ7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZV9sZW5ndGggPSByYXcubGVuZ3RoO1xuXG4gICAgICAgICAgICAvLyBPbmx5IGhhbmRsZSBpZiBjdXJzb3IgaXMgYXQgdGhlIGVuZCBhbmQgbm8gc2VsZWN0aW9uXG4gICAgICAgICAgICBpZiAoY3Vyc29yX3BvcyA9PT0gdmFsdWVfbGVuZ3RoICYmIGN1cnNvcl9wb3MgPT09IGN1cnNvcl9lbmQpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBjaGFyYWN0ZXIgYmVmb3JlIGN1cnNvciBpcyBub24tbnVtZXJpY1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3JfcG9zID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyX2JlZm9yZSA9IHJhdy5jaGFyQXQoY3Vyc29yX3BvcyAtIDEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIS9bMC05XS8udGVzdChjaGFyX2JlZm9yZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoYXJhY3RlciBiZWZvcmUgY3Vyc29yIGlzIG5vdCBhIGRpZ2l0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWxldGUgdGhlIGxhc3QgZGlnaXQgaW5zdGVhZFxuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBudW1lcmljID0gdGhpcy5fZ2V0X251bWVyaWNfdmFsdWUocmF3KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1lcmljLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbGFzdCBjaGFyYWN0ZXIgZnJvbSBudW1lcmljIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3X251bWVyaWMgPSBudW1lcmljLnN1YnN0cigwLCBudW1lcmljLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IHRoaXMuX2Zvcm1hdF9jdXJyZW5jeShuZXdfbnVtZXJpYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlucHV0LnZhbChmb3JtYXR0ZWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGxhY2UgY3Vyc29yIGF0IGVuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdfbGVuZ3RoID0gJGlucHV0LnZhbCgpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShuZXdfbGVuZ3RoLCBuZXdfbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSGFuZGxlIGlucHV0IGV2ZW50IGZvciBsaXZlIGZvcm1hdHRpbmdcbiAgICAgICAgJGlucHV0Lm9uKCdpbnB1dCcsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJhdyA9ICRpbnB1dC52YWwoKTtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0X2VsZW1lbnQgPSAkaW5wdXRbMF07XG4gICAgICAgICAgICBjb25zdCBjdXJzb3JfcG9zID0gaW5wdXRfZWxlbWVudC5zZWxlY3Rpb25TdGFydDtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlX2xlbmd0aCA9IHJhdy5sZW5ndGg7XG5cbiAgICAgICAgICAgIC8vIE9ubHkgYXBwbHkgbGl2ZSBmb3JtYXR0aW5nIGlmIGN1cnNvciBpcyBhdCB0aGUgZW5kXG4gICAgICAgICAgICBpZiAoY3Vyc29yX3BvcyA9PT0gdmFsdWVfbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gRXh0cmFjdCBudW1lcmljIHZhbHVlXG4gICAgICAgICAgICAgICAgbGV0IG51bWVyaWMgPSB0aGlzLl9nZXRfbnVtZXJpY192YWx1ZShyYXcpO1xuXG4gICAgICAgICAgICAgICAgLy8gTGltaXQgZGVjaW1hbCBwbGFjZXMgdG8gMiBpZiBkZWNpbWFscyBhbGxvd2VkXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXJncy5hbGxvd19kZWNpbWFscykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJ0cyA9IG51bWVyaWMuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzWzFdICYmIHBhcnRzWzFdLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWMgPSBwYXJ0c1swXSArICcuJyArIHBhcnRzWzFdLnN1YnN0cigwLCAyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEZvcm1hdCB0aGUgbnVtZXJpYyB2YWx1ZVxuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IHRoaXMuX2Zvcm1hdF9jdXJyZW5jeShudW1lcmljKTtcbiAgICAgICAgICAgICAgICAkaW5wdXQudmFsKGZvcm1hdHRlZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEN1cnNvciBpcyBub3QgYXQgZW5kIC0gdXNlciBpcyBlZGl0aW5nIGluIHRoZSBtaWRkbGVcbiAgICAgICAgICAgICAgICAvLyBEb24ndCBmb3JtYXQsIGp1c3QgY2xlYW4gaW52YWxpZCBjaGFyYWN0ZXJzXG4gICAgICAgICAgICAgICAgY29uc3QgbnVtZXJpYyA9IHRoaXMuX2dldF9udW1lcmljX3ZhbHVlKHJhdyk7XG5cbiAgICAgICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSBpZiB3ZSByZW1vdmVkIGludmFsaWQgY2hhcmFjdGVyc1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9mb3JtYXRfY3VycmVuY3kobnVtZXJpYykgIT09IHJhdykge1xuICAgICAgICAgICAgICAgICAgICAvLyBQcmVzZXJ2ZSBqdXN0IHRoZSBudW1lcmljIGNoYXJhY3RlcnNcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ltYm9sX29mZnNldCA9IHRoaXMuYXJncy5zaG93X3N5bWJvbCA/IHRoaXMuYXJncy5jdXJyZW5jeV9zeW1ib2wubGVuZ3RoIDogMDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW5lZCA9ICh0aGlzLmFyZ3Muc2hvd19zeW1ib2wgPyB0aGlzLmFyZ3MuY3VycmVuY3lfc3ltYm9sIDogJycpICsgbnVtZXJpYztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYW5lZCAhPT0gcmF3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkaW5wdXQudmFsKGNsZWFuZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gKGFwcHJveGltYXRlbHkpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdfY3Vyc29yID0gTWF0aC5taW4oY3Vyc29yX3BvcywgY2xlYW5lZC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShuZXdfY3Vyc29yLCBuZXdfY3Vyc29yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSGFuZGxlIGJsdXIgdG8gcmVmb3JtYXQgd2hlbiBkb25lIGVkaXRpbmdcbiAgICAgICAgJGlucHV0Lm9uKCdibHVyJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmF3ID0gJGlucHV0LnZhbCgpO1xuXG4gICAgICAgICAgICBpZiAoIXJhdykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVmb3JtYXQgdGhlIGVudGlyZSB2YWx1ZSBvbiBibHVyXG4gICAgICAgICAgICBjb25zdCBudW1lcmljID0gdGhpcy5fZ2V0X251bWVyaWNfdmFsdWUocmF3KTtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IHRoaXMuX2Zvcm1hdF9jdXJyZW5jeShudW1lcmljKTtcbiAgICAgICAgICAgICRpbnB1dC52YWwoZm9ybWF0dGVkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSGFuZGxlIGZvY3VzIHRvIHNlbGVjdCBhbGwgZm9yIGVhc3kgcmVwbGFjZW1lbnRcbiAgICAgICAgJGlucHV0Lm9uKCdmb2N1cycsICgpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICRpbnB1dFswXS5zZWxlY3QoKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIGZvcm1hdHRpbmcgaWYgdGhlcmUncyBhIHZhbHVlXG4gICAgICAgIGNvbnN0IGluaXRpYWxfdmFsdWUgPSAkaW5wdXQudmFsKCk7XG4gICAgICAgIGlmIChpbml0aWFsX3ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbChpbml0aWFsX3ZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKlxuICogUGhvbmVfVGV4dF9JbnB1dFxuICpcbiAqIEV4dGVuZHMgVGV4dF9JbnB1dCB0byBwcm92aWRlIGF1dG9tYXRpYyBwaG9uZSBudW1iZXIgZm9ybWF0dGluZy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gVVMgTW9kZSAoZGVmYXVsdCk6IEZvcm1hdHMgYXMgKFhYWCkgWFhYLVhYWFggb24gZXZlcnkga2V5c3Ryb2tlXG4gKiAtIEludGVybmF0aW9uYWwgTW9kZTogVHJpZ2dlcmVkIGJ5IHN0YXJ0aW5nIHdpdGggJysnLCBkaXNhYmxlcyBmb3JtYXR0aW5nXG4gKiAtIHZhbCgpIGdldHRlciByZXR1cm5zIGZvcm1hdHRlZCBzdHJpbmcgYXMgZGlzcGxheWVkXG4gKiAtIHZhbCgpIHNldHRlciBhY2NlcHRzIGFueSBmb3JtYXQgYW5kIGRpc3BsYXlzIGFwcHJvcHJpYXRlbHlcbiAqXG4gKiBVc2FnZTpcbiAqICAgPFBob25lX1RleHRfSW5wdXQgJHBsYWNlaG9sZGVyPVwiUGhvbmUgbnVtYmVyXCIgLz5cbiAqXG4gKiBCZWhhdmlvcjpcbiAqIC0gVHlwZSBcIjU1NTEyMzQ1NjdcIiAtPiBkaXNwbGF5cyBcIig1NTUpIDEyMy00NTY3XCIsIHZhbCgpIHJldHVybnMgXCIoNTU1KSAxMjMtNDU2N1wiXG4gKiAtIFR5cGUgXCIrNDQgMjAgNzEyMyA0NTY3XCIgLT4gZGlzcGxheXMgYXMgdHlwZWQsIHZhbCgpIHJldHVybnMgXCIrNDQgMjAgNzEyMyA0NTY3XCJcbiAqIC0gTGVhZGluZyBcIjFcIiBpcyBzdHJpcHBlZDogXCIxNTU1MTIzNDU2N1wiIC0+IFwiKDU1NSkgMTIzLTQ1NjdcIlxuICovXG5jbGFzcyBQaG9uZV9UZXh0X0lucHV0IGV4dGVuZHMgVGV4dF9JbnB1dCB7XG4gICAgb25fY3JlYXRlKCkge1xuICAgICAgICBzdXBlci5vbl9jcmVhdGUoKTtcbiAgICAgICAgdGhpcy5faXNfaW50ZXJuYXRpb25hbCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGlucHV0IGlzIGluIGludGVybmF0aW9uYWwgbW9kZSAoc3RhcnRzIHdpdGggKylcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBfY2hlY2tfaW50ZXJuYXRpb25hbF9tb2RlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAmJiBzdHIodmFsdWUpLmNoYXJBdCgwKSA9PT0gJysnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcm1hdCBVUyBwaG9uZSBudW1iZXIgYXMgKFhYWCkgWFhYLVhYWFhcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGlnaXRzIC0gQ2xlYW4gbnVtZXJpYyBzdHJpbmcgKHNob3VsZCBiZSAxMCBkaWdpdHMgb3IgbGVzcyBhZnRlciBwcm9jZXNzaW5nKVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IEZvcm1hdHRlZCBwaG9uZSBudW1iZXJcbiAgICAgKi9cbiAgICBfZm9ybWF0X3VzX3Bob25lKGRpZ2l0cykge1xuICAgICAgICAvLyBGb3JtYXQgYmFzZWQgb24gbGVuZ3RoIChhc3N1bWVzIGRpZ2l0cyBhcmUgYWxyZWFkeSBjbGVhbmVkIGFuZCBsaW1pdGVkIHRvIDEwKVxuICAgICAgICBpZiAoZGlnaXRzLmxlbmd0aCA+PSA2KSB7XG4gICAgICAgICAgICAvLyAoWFhYKSBYWFgtWFhYWFxuICAgICAgICAgICAgcmV0dXJuICcoJyArIGRpZ2l0cy5zdWJzdHIoMCwgMykgKyAnKSAnICsgZGlnaXRzLnN1YnN0cigzLCAzKSArICctJyArIGRpZ2l0cy5zdWJzdHIoNik7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlnaXRzLmxlbmd0aCA+PSAzKSB7XG4gICAgICAgICAgICAvLyAoWFhYKSBYWFhcbiAgICAgICAgICAgIHJldHVybiAnKCcgKyBkaWdpdHMuc3Vic3RyKDAsIDMpICsgJykgJyArIGRpZ2l0cy5zdWJzdHIoMyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlnaXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIChYWFxuICAgICAgICAgICAgcmV0dXJuICcoJyArIGRpZ2l0cztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkaWdpdHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdmFsKCkgLSBHZXQgb3Igc2V0IHRoZSBwaG9uZSBudW1iZXJcbiAgICAgKiBHZXR0ZXIgcmV0dXJucyBmb3JtYXR0ZWQgdmFsdWUgYXMgZGlzcGxheWVkICh3aXRoIHBhcmVucywgZGFzaGVzLCBldGMpXG4gICAgICogU2V0dGVyIGFjY2VwdHMgYW55dGhpbmcgYW5kIGZvcm1hdHMgYXBwcm9wcmlhdGVseVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICB2YWwodmFsdWUpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIEdldHRlciAtIHJldHVybiB0aGUgZm9ybWF0dGVkIHZhbHVlIGFzIGRpc3BsYXllZFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGlkKCdpbnB1dCcpLnZhbCgpIHx8ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gU2V0dGVyIC0gZm9ybWF0IGFuZCBkaXNwbGF5XG4gICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhLnZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuJGlkKCdpbnB1dCcpLmV4aXN0cygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGlkKCdpbnB1dCcpLnZhbCgnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3RyX3ZhbHVlID0gc3RyKHZhbHVlKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX2NoZWNrX2ludGVybmF0aW9uYWxfbW9kZShzdHJfdmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgLy8gSW50ZXJuYXRpb25hbCBtb2RlIC0gbm8gZm9ybWF0dGluZ1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YS52YWx1ZSA9IHN0cl92YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4kaWQoJ2lucHV0JykuZXhpc3RzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kaWQoJ2lucHV0JykudmFsKHN0cl92YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBVUyBtb2RlIC0gY2xlYW4gZGlnaXRzIGFuZCBmb3JtYXRcbiAgICAgICAgICAgICAgICBjb25zdCBkaWdpdHMgPSBzdHJfdmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKTtcblxuICAgICAgICAgICAgICAgIC8vIERldGVybWluZSB3aGljaCBkaWdpdHMgdG8gZm9ybWF0XG4gICAgICAgICAgICAgICAgbGV0IGRpZ2l0c190b19mb3JtYXQ7XG4gICAgICAgICAgICAgICAgaWYgKGRpZ2l0cy5sZW5ndGggPT09IDExICYmIGRpZ2l0cy5jaGFyQXQoMCkgPT09ICcxJyAmJiAvWzItOV0vLnRlc3QoZGlnaXRzLmNoYXJBdCgxKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RyaXAgVVMgY291bnRyeSBjb2RlXG4gICAgICAgICAgICAgICAgICAgIGRpZ2l0c190b19mb3JtYXQgPSBkaWdpdHMuc3Vic3RyKDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlnaXRzLmxlbmd0aCA+IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRha2UgZmlyc3QgMTBcbiAgICAgICAgICAgICAgICAgICAgZGlnaXRzX3RvX2Zvcm1hdCA9IGRpZ2l0cy5zdWJzdHIoMCwgMTApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFVzZSBhcy1pc1xuICAgICAgICAgICAgICAgICAgICBkaWdpdHNfdG9fZm9ybWF0ID0gZGlnaXRzO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IHRoaXMuX2Zvcm1hdF91c19waG9uZShkaWdpdHNfdG9fZm9ybWF0KTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEudmFsdWUgPSBmb3JtYXR0ZWQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuJGlkKCdpbnB1dCcpLmV4aXN0cygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGlkKCdpbnB1dCcpLnZhbChmb3JtYXR0ZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICBzdXBlci5vbl9yZWFkeSgpO1xuXG4gICAgICAgIGNvbnN0ICRpbnB1dCA9IHRoaXMuJGlkKCdpbnB1dCcpO1xuICAgICAgICBsZXQgX2xhc3RfY3Vyc29yX3Bvc2l0aW9uID0gbnVsbDtcblxuICAgICAgICAvLyBIYW5kbGUga2V5ZG93biB0byBpbnRlcmNlcHQgYmFja3NwYWNlIGF0IGVuZCBvZiBzdHJpbmdcbiAgICAgICAgJGlucHV0Lm9uKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJhdyA9ICRpbnB1dC52YWwoKTtcblxuICAgICAgICAgICAgLy8gU2tpcCBpZiBpbnRlcm5hdGlvbmFsIG1vZGVcbiAgICAgICAgICAgIGlmICh0aGlzLl9jaGVja19pbnRlcm5hdGlvbmFsX21vZGUocmF3KSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT25seSBoYW5kbGUgYmFja3NwYWNlIGtleVxuICAgICAgICAgICAgaWYgKGUua2V5ICE9PSAnQmFja3NwYWNlJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW5wdXRfZWxlbWVudCA9ICRpbnB1dFswXTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnNvcl9wb3MgPSBpbnB1dF9lbGVtZW50LnNlbGVjdGlvblN0YXJ0O1xuICAgICAgICAgICAgY29uc3QgY3Vyc29yX2VuZCA9IGlucHV0X2VsZW1lbnQuc2VsZWN0aW9uRW5kO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVfbGVuZ3RoID0gcmF3Lmxlbmd0aDtcblxuICAgICAgICAgICAgLy8gT25seSBoYW5kbGUgaWYgY3Vyc29yIGlzIGF0IHRoZSBlbmQgYW5kIG5vIHNlbGVjdGlvblxuICAgICAgICAgICAgaWYgKGN1cnNvcl9wb3MgPT09IHZhbHVlX2xlbmd0aCAmJiBjdXJzb3JfcG9zID09PSBjdXJzb3JfZW5kKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgY2hhcmFjdGVyIGJlZm9yZSBjdXJzb3IgaXMgbm9uLW51bWVyaWNcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yX3BvcyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcl9iZWZvcmUgPSByYXcuY2hhckF0KGN1cnNvcl9wb3MgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEvWzAtOV0vLnRlc3QoY2hhcl9iZWZvcmUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGFyYWN0ZXIgYmVmb3JlIGN1cnNvciBpcyBub3QgYSBkaWdpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVsZXRlIHRoZSBsYXN0IGRpZ2l0IGluc3RlYWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlnaXRzID0gcmF3LnJlcGxhY2UoL1teMC05XS9nLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlnaXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdfZGlnaXRzID0gZGlnaXRzLnN1YnN0cigwLCBkaWdpdHMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gdGhpcy5fZm9ybWF0X3VzX3Bob25lKG5ld19kaWdpdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbnB1dC52YWwoZm9ybWF0dGVkKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBsYWNlIGN1cnNvciBhdCBlbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3X2xlbmd0aCA9ICRpbnB1dC52YWwoKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2VsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UobmV3X2xlbmd0aCwgbmV3X2xlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEhhbmRsZSBpbnB1dCBldmVudCBmb3IgbGl2ZSBmb3JtYXR0aW5nXG4gICAgICAgICRpbnB1dC5vbignaW5wdXQnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByYXcgPSAkaW5wdXQudmFsKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9jaGVja19pbnRlcm5hdGlvbmFsX21vZGUocmF3KSkge1xuICAgICAgICAgICAgICAgIC8vIEludGVybmF0aW9uYWwgbW9kZSAtIGFsbG93IGFueXRoaW5nXG4gICAgICAgICAgICAgICAgdGhpcy5faXNfaW50ZXJuYXRpb25hbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gTm8gZm9ybWF0dGluZywgbm8gcmVzdHJpY3Rpb25zXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBVUyBtb2RlXG4gICAgICAgICAgICB0aGlzLl9pc19pbnRlcm5hdGlvbmFsID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGNvbnN0IGlucHV0X2VsZW1lbnQgPSAkaW5wdXRbMF07XG4gICAgICAgICAgICBjb25zdCBjdXJzb3JfcG9zID0gaW5wdXRfZWxlbWVudC5zZWxlY3Rpb25TdGFydDtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlX2xlbmd0aCA9IHJhdy5sZW5ndGg7XG5cbiAgICAgICAgICAgIC8vIE9ubHkgYXBwbHkgbGl2ZSBmb3JtYXR0aW5nIGlmIGN1cnNvciBpcyBhdCB0aGUgZW5kXG4gICAgICAgICAgICBpZiAoY3Vyc29yX3BvcyA9PT0gdmFsdWVfbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGFueSBub24tZGlnaXQsIG5vbi1mb3JtYXR0aW5nIGNoYXJhY3RlcnNcbiAgICAgICAgICAgICAgICBjb25zdCBjbGVhbmVkID0gcmF3LnJlcGxhY2UoL1teMC05XFxzXFwtKCldL2csICcnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaWdpdHMgPSBjbGVhbmVkLnJlcGxhY2UoL1teMC05XS9nLCAnJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggZGlnaXRzIHRvIGZvcm1hdFxuICAgICAgICAgICAgICAgIGxldCBkaWdpdHNfdG9fZm9ybWF0O1xuXG4gICAgICAgICAgICAgICAgaWYgKGRpZ2l0cy5sZW5ndGggPT09IDExICYmIGRpZ2l0cy5jaGFyQXQoMCkgPT09ICcxJyAmJiAvWzItOV0vLnRlc3QoZGlnaXRzLmNoYXJBdCgxKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRXhhY3RseSAxMSBkaWdpdHMgc3RhcnRpbmcgd2l0aCBcIjFcIiBmb2xsb3dlZCBieSB2YWxpZCBhcmVhIGNvZGUgZGlnaXQgKDItOSlcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIFVTIGNvdW50cnkgY29kZSAtIHN0cmlwIHRoZSBsZWFkaW5nIDFcbiAgICAgICAgICAgICAgICAgICAgZGlnaXRzX3RvX2Zvcm1hdCA9IGRpZ2l0cy5zdWJzdHIoMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaWdpdHMubGVuZ3RoID4gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW9yZSB0aGFuIDEwIGRpZ2l0cyAtIGp1c3QgdGFrZSB0aGUgZmlyc3QgMTAgYW5kIGlnbm9yZSB0aGUgcmVzdFxuICAgICAgICAgICAgICAgICAgICBkaWdpdHNfdG9fZm9ybWF0ID0gZGlnaXRzLnN1YnN0cigwLCAxMCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gMTAgb3IgZmV3ZXIgZGlnaXRzIC0gdXNlIGFzLWlzXG4gICAgICAgICAgICAgICAgICAgIGRpZ2l0c190b19mb3JtYXQgPSBkaWdpdHM7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRm9ybWF0IHRoZSBkaWdpdHNcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWQgPSB0aGlzLl9mb3JtYXRfdXNfcGhvbmUoZGlnaXRzX3RvX2Zvcm1hdCk7XG4gICAgICAgICAgICAgICAgJGlucHV0LnZhbChmb3JtYXR0ZWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBDdXJzb3IgaXMgbm90IGF0IGVuZCAtIHVzZXIgaXMgZWRpdGluZyBpbiB0aGUgbWlkZGxlXG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgZm9ybWF0LCBqdXN0IGNsZWFuIGludmFsaWQgY2hhcmFjdGVyc1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFuZWQgPSByYXcucmVwbGFjZSgvW14wLTlcXHNcXC0oKV0vZywgJycpO1xuICAgICAgICAgICAgICAgIGlmIChjbGVhbmVkICE9PSByYXcpIHtcbiAgICAgICAgICAgICAgICAgICAgJGlucHV0LnZhbChjbGVhbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBjdXJzb3IgcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgaW5wdXRfZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShjdXJzb3JfcG9zLCBjdXJzb3JfcG9zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEhhbmRsZSBibHVyIHRvIHJlZm9ybWF0IHdoZW4gZG9uZSBlZGl0aW5nXG4gICAgICAgICRpbnB1dC5vbignYmx1cicsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJhdyA9ICRpbnB1dC52YWwoKTtcblxuICAgICAgICAgICAgLy8gU2tpcCBpZiBpbnRlcm5hdGlvbmFsIG1vZGUgb3IgZW1wdHlcbiAgICAgICAgICAgIGlmICh0aGlzLl9jaGVja19pbnRlcm5hdGlvbmFsX21vZGUocmF3KSB8fCAhcmF3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZWZvcm1hdCB0aGUgZW50aXJlIHZhbHVlIG9uIGJsdXJcbiAgICAgICAgICAgIGNvbnN0IGRpZ2l0cyA9IHJhdy5yZXBsYWNlKC9bXjAtOV0vZywgJycpO1xuXG4gICAgICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggZGlnaXRzIHRvIGZvcm1hdFxuICAgICAgICAgICAgbGV0IGRpZ2l0c190b19mb3JtYXQ7XG5cbiAgICAgICAgICAgIGlmIChkaWdpdHMubGVuZ3RoID09PSAxMSAmJiBkaWdpdHMuY2hhckF0KDApID09PSAnMScgJiYgL1syLTldLy50ZXN0KGRpZ2l0cy5jaGFyQXQoMSkpKSB7XG4gICAgICAgICAgICAgICAgLy8gRXhhY3RseSAxMSBkaWdpdHMgc3RhcnRpbmcgd2l0aCBcIjFcIiBmb2xsb3dlZCBieSB2YWxpZCBhcmVhIGNvZGUgZGlnaXQgKDItOSlcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgVVMgY291bnRyeSBjb2RlIC0gc3RyaXAgdGhlIGxlYWRpbmcgMVxuICAgICAgICAgICAgICAgIGRpZ2l0c190b19mb3JtYXQgPSBkaWdpdHMuc3Vic3RyKDEpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkaWdpdHMubGVuZ3RoID4gMTApIHtcbiAgICAgICAgICAgICAgICAvLyBNb3JlIHRoYW4gMTAgZGlnaXRzIC0ganVzdCB0YWtlIHRoZSBmaXJzdCAxMFxuICAgICAgICAgICAgICAgIGRpZ2l0c190b19mb3JtYXQgPSBkaWdpdHMuc3Vic3RyKDAsIDEwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gMTAgb3IgZmV3ZXIgZGlnaXRzIC0gdXNlIGFzLWlzXG4gICAgICAgICAgICAgICAgZGlnaXRzX3RvX2Zvcm1hdCA9IGRpZ2l0cztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gdGhpcy5fZm9ybWF0X3VzX3Bob25lKGRpZ2l0c190b19mb3JtYXQpO1xuICAgICAgICAgICAgJGlucHV0LnZhbChmb3JtYXR0ZWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIGZvcm1hdHRpbmcgaWYgdGhlcmUncyBhIHZhbHVlXG4gICAgICAgIGNvbnN0IGluaXRpYWxfdmFsdWUgPSAkaW5wdXQudmFsKCk7XG4gICAgICAgIGlmIChpbml0aWFsX3ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbChpbml0aWFsX3ZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImNsYXNzIFN0YXRlX1NlbGVjdF9JbnB1dCBleHRlbmRzIEFqYXhfU2VsZWN0X0lucHV0IHtcbiAgICBhc3luYyBvbl9sb2FkKCkge1xuICAgICAgICAvLyBJbml0aWFsaXplIGNvdW50cnkgY29kZSBmcm9tIGFyZ3Mgb3IgZGVmYXVsdCB0byBVU1xuICAgICAgICBpZiAoIXRoaXMuZGF0YS5jb3VudHJ5X2NvZGUpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5jb3VudHJ5X2NvZGUgPSB0aGlzLmFyZ3MuY291bnRyeV9jb2RlIHx8ICdVUyc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2FkIHN0YXRlcyB2aWEgQWpheCBlbmRwb2ludCBpZiBjb3VudHJ5IGNvZGUgaXMgc2V0XG4gICAgICAgIGlmICh0aGlzLmRhdGEuY291bnRyeV9jb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEuc2VsZWN0X3ZhbHVlcyA9IGF3YWl0IFJzeF9SZWZlcmVuY2VfRGF0YV9Db250cm9sbGVyLnN0YXRlcyh7IGNvdW50cnk6IHRoaXMuZGF0YS5jb3VudHJ5X2NvZGUgfSk7XG5cbiAgICAgICAgICAgIC8vIElmIG5vIHN0YXRlcyByZXR1cm5lZCwgYWRkIE4vQSBvcHRpb25cbiAgICAgICAgICAgIGlmICghdGhpcy5kYXRhLnNlbGVjdF92YWx1ZXMgfHwgdGhpcy5kYXRhLnNlbGVjdF92YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNlbGVjdF92YWx1ZXMgPSBbeyB2YWx1ZTogJ04vQScsIGxhYmVsOiAnTi9BJyB9XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5zZWxlY3RfdmFsdWVzID0gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbl9jcmVhdGUoKSB7XG4gICAgICAgIC8vIFNldCBkZWZhdWx0IHBsYWNlaG9sZGVyIGlmIG5vdCBwcm92aWRlZFxuICAgICAgICBpZiAoIXRoaXMuYXJncy5wbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgdGhpcy5hcmdzLnBsYWNlaG9sZGVyID0gJ1NlbGVjdCBTdGF0ZS4uLic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbml0aWFsaXplIGNvdW50cnkgY29kZSBpbiBkYXRhXG4gICAgICAgIHRoaXMuZGF0YS5jb3VudHJ5X2NvZGUgPSB0aGlzLmFyZ3MuY291bnRyeV9jb2RlIHx8ICcnO1xuXG4gICAgICAgIC8vIENhY2hlIGZvciBzZWxlY3RlZCBzdGF0ZSBwZXIgY291bnRyeSBjb2RlXG4gICAgICAgIHRoaXMuX3N0YXRlX2NhY2hlID0ge307XG5cbiAgICAgICAgLy8gQ2FsbCBwYXJlbnQgdG8gaW5pdGlhbGl6ZSBBamF4X1NlbGVjdF9JbnB1dFxuICAgICAgICBzdXBlci5vbl9jcmVhdGUoKTtcbiAgICB9XG5cbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgLy8gQ2FsbCBwYXJlbnQgdG8gaW5pdGlhbGl6ZSBUb20gU2VsZWN0XG4gICAgICAgIHN1cGVyLm9uX3JlYWR5KCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBOL0EgY2FzZSAobm8gc3RhdGVzIGZvciBjb3VudHJ5KVxuICAgICAgICBjb25zdCBpc19uYSA9IHRoaXMuZGF0YS5zZWxlY3RfdmFsdWVzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmRhdGEuc2VsZWN0X3ZhbHVlc1swXS52YWx1ZSA9PT0gJ04vQSc7XG5cbiAgICAgICAgLy8gRGlzYWJsZSBpZiBubyBjb3VudHJ5IGNvZGUgb3IgTi9BIGNhc2VcbiAgICAgICAgaWYgKCghdGhpcy5kYXRhLmNvdW50cnlfY29kZSB8fCBpc19uYSkgJiYgdGhpcy50b21fc2VsZWN0KSB7XG4gICAgICAgICAgICB0aGlzLnRvbV9zZWxlY3QuZGlzYWJsZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHZhbHVlIHRvIE4vQSBpZiB0aGF0J3MgdGhlIG9ubHkgb3B0aW9uXG4gICAgICAgIGlmIChpc19uYSkge1xuICAgICAgICAgICAgdGhpcy52YWwoJ04vQScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGNvdW50cnkgY29kZSBhbmQgcmVsb2FkIHN0YXRlIGxpc3RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY291bnRyeV9jb2RlIC0gSVNPIGNvdW50cnkgY29kZSAoZS5nLiwgJ1VTJywgJ0NBJylcbiAgICAgKi9cbiAgICBhc3luYyBzZXRfY291bnRyeV9jb2RlKGNvdW50cnlfY29kZSkge1xuICAgICAgICAvLyBDYWNoZSB0aGUgY3VycmVudCB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgY291bnRyeSBiZWZvcmUgc3dpdGNoaW5nXG4gICAgICAgIGNvbnN0IGN1cnJlbnRfY291bnRyeSA9IHRoaXMuZGF0YS5jb3VudHJ5X2NvZGU7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRfdmFsdWUgPSB0aGlzLnZhbCgpO1xuICAgICAgICBpZiAoY3VycmVudF9jb3VudHJ5ICYmIGN1cnJlbnRfdmFsdWUgJiYgY3VycmVudF92YWx1ZSAhPT0gJ04vQScpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlX2NhY2hlW2N1cnJlbnRfY291bnRyeV0gPSBjdXJyZW50X3ZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGNvdW50cnkgY29kZVxuICAgICAgICB0aGlzLmRhdGEuY291bnRyeV9jb2RlID0gY291bnRyeV9jb2RlO1xuXG4gICAgICAgIC8vIERpc2FibGUgdGhlIHNlbGVjdG9yIHdoaWxlIGxvYWRpbmdcbiAgICAgICAgaWYgKHRoaXMudG9tX3NlbGVjdCkge1xuICAgICAgICAgICAgdGhpcy50b21fc2VsZWN0LmRpc2FibGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvYWQgbmV3IHN0YXRlIGxpc3RcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5zZWxlY3RfdmFsdWVzID0gYXdhaXQgUnN4X1JlZmVyZW5jZV9EYXRhX0NvbnRyb2xsZXIuc3RhdGVzKHsgY291bnRyeTogY291bnRyeV9jb2RlIH0pO1xuXG4gICAgICAgICAgICAvLyBSYWNlIGNvbmRpdGlvbiBjaGVjazogdmVyaWZ5IGNvdW50cnkgaGFzbid0IGNoYW5nZWQgZHVyaW5nIHRoZSByZXF1ZXN0XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhLmNvdW50cnlfY29kZSAhPT0gY291bnRyeV9jb2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gQ291bnRyeSBjaGFuZ2VkIHdoaWxlIHJlcXVlc3Qgd2FzIGluIGZsaWdodCAtIGlnbm9yZSB0aGlzIHJlc3BvbnNlXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiBubyBzdGF0ZXMgcmV0dXJuZWQsIGFkZCBOL0Egb3B0aW9uXG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0YS5zZWxlY3RfdmFsdWVzIHx8IHRoaXMuZGF0YS5zZWxlY3RfdmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zZWxlY3RfdmFsdWVzID0gW3sgdmFsdWU6ICdOL0EnLCBsYWJlbDogJ04vQScgfV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlLXJlbmRlciB0aGUgd2lkZ2V0IHdpdGggbmV3IHN0YXRlc1xuICAgICAgICAgICAgdGhpcy5yZWRyYXcoKTtcblxuICAgICAgICAgICAgLy8gUmUtaW5pdGlhbGl6ZSBUb20gU2VsZWN0IGFmdGVyIHJlZHJhd1xuICAgICAgICAgICAgaWYgKHRoaXMudG9tX3NlbGVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9tX3NlbGVjdC5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlLXJ1biBvbl9yZWFkeSB0byBzZXQgdXAgVG9tIFNlbGVjdCBhZ2FpblxuICAgICAgICAgICAgdGhpcy5vbl9yZWFkeSgpO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIE4vQSBjYXNlXG4gICAgICAgICAgICBjb25zdCBpc19uYSA9IHRoaXMuZGF0YS5zZWxlY3RfdmFsdWVzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmRhdGEuc2VsZWN0X3ZhbHVlc1swXS52YWx1ZSA9PT0gJ04vQSc7XG5cbiAgICAgICAgICAgIGlmIChpc19uYSkge1xuICAgICAgICAgICAgICAgIC8vIFNldCB0byBOL0EgYW5kIGtlZXAgZGlzYWJsZWRcbiAgICAgICAgICAgICAgICB0aGlzLnZhbCgnTi9BJyk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudG9tX3NlbGVjdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbV9zZWxlY3QuZGlzYWJsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVHJ5IHRvIHJlc3RvcmUgY2FjaGVkIHZhbHVlIGZvciB0aGlzIGNvdW50cnlcbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZWRfdmFsdWUgPSB0aGlzLl9zdGF0ZV9jYWNoZVtjb3VudHJ5X2NvZGVdO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlZF92YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZV9leGlzdHMgPSB0aGlzLmRhdGEuc2VsZWN0X3ZhbHVlcy5zb21lKChvcHQpID0+ICh0eXBlb2Ygb3B0ID09PSAnb2JqZWN0JyA/IG9wdC52YWx1ZSA6IG9wdCkgPT09IGNhY2hlZF92YWx1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlX2V4aXN0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWwoY2FjaGVkX3ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsKCcnKTsgLy8gQ2xlYXIgaWYgY2FjaGVkIHZhbHVlIG5vdCBpbiBuZXcgbGlzdFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWwoJycpOyAvLyBObyBjYWNoZWQgdmFsdWUgLSBsZWF2ZSBlbXB0eVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEVuYWJsZSB0aGUgd2lkZ2V0IG5vdyB0aGF0IHdlIGhhdmUgYSBjb3VudHJ5IHdpdGggc3RhdGVzXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudG9tX3NlbGVjdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbV9zZWxlY3QuZW5hYmxlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgc3RhdGVzIGZvciBjb3VudHJ5OicsIGNvdW50cnlfY29kZSwgZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5kYXRhLnNlbGVjdF92YWx1ZXMgPSBbXTtcblxuICAgICAgICAgICAgLy8gUmUtZW5hYmxlIGV2ZW4gb24gZXJyb3JcbiAgICAgICAgICAgIGlmICh0aGlzLnRvbV9zZWxlY3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvbV9zZWxlY3QuZW5hYmxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB2YWwoKSB0byB1cGRhdGUgY2FjaGUgd2hlbiB1c2VyIG1hbnVhbGx5IHNlbGVjdHMgYSBzdGF0ZVxuICAgICAqL1xuICAgIHZhbCh2YWx1ZSkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gR2V0dGVyIC0gdXNlIHBhcmVudCBpbXBsZW1lbnRhdGlvblxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnZhbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gU2V0dGVyIC0gdXBkYXRlIGNhY2hlIGFuZCBjYWxsIHBhcmVudFxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5jb3VudHJ5X2NvZGUgJiYgdmFsdWUgJiYgdmFsdWUgIT09ICdOL0EnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVfY2FjaGVbdGhpcy5kYXRhLmNvdW50cnlfY29kZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdXBlci52YWwodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiY2xhc3MgQ291bnRyeV9TZWxlY3RfSW5wdXQgZXh0ZW5kcyBBamF4X1NlbGVjdF9JbnB1dCB7XG4gICAgYXN5bmMgb25fbG9hZCgpIHtcbiAgICAgICAgLy8gTG9hZCBjb3VudHJpZXMgdmlhIEFqYXggZW5kcG9pbnQgaWYgZGF0YSBub3QgcHJvdmlkZWRcbiAgICAgICAgaWYgKCF0aGlzLmFyZ3MuZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhLnNlbGVjdF92YWx1ZXMgPSBhd2FpdCBSc3hfUmVmZXJlbmNlX0RhdGFfQ29udHJvbGxlci5jb3VudHJpZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFVzZSBwYXJlbnQgb25fbG9hZCBmb3IgY3VzdG9tIGRhdGEgZW5kcG9pbnRzXG4gICAgICAgICAgICBhd2FpdCBzdXBlci5vbl9sb2FkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW9yZGVyIHNlbGVjdF92YWx1ZXMgdG8gcHV0IGRlZmF1bHQgY291bnRyeSBmaXJzdCBpbiB0aGUgbGlzdFxuICAgICAgICBpZiAodGhpcy5hcmdzLmRlZmF1bHRfY291bnRyeSAmJiB0aGlzLmRhdGEuc2VsZWN0X3ZhbHVlcyAmJiBpc19hcnJheSh0aGlzLmRhdGEuc2VsZWN0X3ZhbHVlcykpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRfY291bnRyeV9jb2RlID0gdGhpcy5hcmdzLmRlZmF1bHRfY291bnRyeTtcblxuICAgICAgICAgICAgLy8gRmluZCB0aGUgZGVmYXVsdCBjb3VudHJ5IGluIHRoZSBhcnJheVxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdF9jb3VudHJ5X2luZGV4ID0gdGhpcy5kYXRhLnNlbGVjdF92YWx1ZXMuZmluZEluZGV4KFxuICAgICAgICAgICAgICAgIG9wdCA9PiAodHlwZW9mIG9wdCA9PT0gJ29iamVjdCcgPyBvcHQudmFsdWUgOiBvcHQpID09PSBkZWZhdWx0X2NvdW50cnlfY29kZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGRlZmF1bHRfY291bnRyeV9pbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgaXQgZnJvbSBpdHMgY3VycmVudCBwb3NpdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IFtkZWZhdWx0X2NvdW50cnldID0gdGhpcy5kYXRhLnNlbGVjdF92YWx1ZXMuc3BsaWNlKGRlZmF1bHRfY291bnRyeV9pbmRleCwgMSk7XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgaXQgdG8gdGhlIGJlZ2lubmluZ1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zZWxlY3RfdmFsdWVzLnVuc2hpZnQoZGVmYXVsdF9jb3VudHJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uX2NyZWF0ZSgpIHtcbiAgICAgICAgLy8gU2V0IGRlZmF1bHQgcGxhY2Vob2xkZXIgaWYgbm90IHByb3ZpZGVkXG4gICAgICAgIGlmICghdGhpcy5hcmdzLnBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICB0aGlzLmFyZ3MucGxhY2Vob2xkZXIgPSAnU2VsZWN0IENvdW50cnkuLi4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbCBwYXJlbnQgdG8gaW5pdGlhbGl6ZSBBamF4X1NlbGVjdF9JbnB1dFxuICAgICAgICBzdXBlci5vbl9jcmVhdGUoKTtcblxuICAgICAgICAvLyBIYW5kbGUgZGVmYXVsdCBjb3VudHJ5IHZhbHVlXG4gICAgICAgIGlmICh0aGlzLmFyZ3MuZGVmYXVsdF9jb3VudHJ5ICYmICF0aGlzLmRhdGEudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS52YWx1ZSA9IHRoaXMuYXJncy5kZWZhdWx0X2NvdW50cnk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgLy8gQ2FsbCBwYXJlbnQgdG8gaW5pdGlhbGl6ZSBUb20gU2VsZWN0XG4gICAgICAgIHN1cGVyLm9uX3JlYWR5KCk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHN0YXRlIHNlbGVjdG9yIHdpdGggaW5pdGlhbC9kZWZhdWx0IGNvdW50cnlcbiAgICAgICAgdGhpcy5fdXBkYXRlX3N0YXRlX3NlbGVjdG9yKCk7XG5cbiAgICAgICAgLy8gTGlzdGVuIGZvciBjb3VudHJ5IGNoYW5nZXMgYW5kIHVwZGF0ZSBzdGF0ZSBzZWxlY3RvclxuICAgICAgICBpZiAodGhpcy50b21fc2VsZWN0KSB7XG4gICAgICAgICAgICB0aGlzLnRvbV9zZWxlY3Qub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVfc3RhdGVfc2VsZWN0b3IoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCBTdGF0ZV9TZWxlY3RfSW5wdXQgc2libGluZyBhbmQgdXBkYXRlIGl0cyBjb3VudHJ5IGNvZGVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF91cGRhdGVfc3RhdGVfc2VsZWN0b3IoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRfY291bnRyeSA9IHRoaXMudmFsKCk7XG5cbiAgICAgICAgLy8gRmluZCBTdGF0ZV9TZWxlY3RfSW5wdXQgY29tcG9uZW50IHVzaW5nIGNsb3Nlc3Rfc2libGluZ1xuICAgICAgICBjb25zdCBzdGF0ZV9jb21wb25lbnQgPSB0aGlzLiQuY2xvc2VzdF9zaWJsaW5nKCcuU3RhdGVfU2VsZWN0X0lucHV0JykuY29tcG9uZW50KCk7XG5cbiAgICAgICAgaWYgKHN0YXRlX2NvbXBvbmVudCAmJiB0eXBlb2Ygc3RhdGVfY29tcG9uZW50LnNldF9jb3VudHJ5X2NvZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHN0YXRlX2NvbXBvbmVudC5zZXRfY291bnRyeV9jb2RlKGN1cnJlbnRfY291bnRyeSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKipcbiAqIFByb2ZpbGVfUGhvdG9fSW5wdXRcbiAqXG4gKiBQcm9maWxlIHBob3RvIHVwbG9hZCB3aWRnZXQgd2l0aCB0aHVtYm5haWwgZGlzcGxheSBhbmQgdXBsb2FkIGhhbmRsaW5nLlxuICogU2VlIHByb2ZpbGVfcGhvdG9faW5wdXQuanFodG1sIGZvciBmdWxsIGRvY3VtZW50YXRpb24uXG4gKlxuICogSmF2YVNjcmlwdCBSZXNwb25zaWJpbGl0aWVzOlxuICogLSBIYW5kbGUgZmlsZSBzZWxlY3Rpb24gYW5kIHVwbG9hZFxuICogLSBVcGRhdGUgdGh1bWJuYWlsIG9uIHN1Y2Nlc3NmdWwgdXBsb2FkXG4gKiAtIE1hbmFnZSBsb2FkaW5nIHN0YXRlIHdpdGggc3Bpbm5lclxuICogLSBQcm92aWRlIHZhbCgpIGdldHRlci9zZXR0ZXIgZm9yIGF0dGFjaG1lbnQga2V5XG4gKiAtIEhhbmRsZSByZW1vdmUgYnV0dG9uIGZ1bmN0aW9uYWxpdHlcbiAqL1xuY2xhc3MgUHJvZmlsZV9QaG90b19JbnB1dCBleHRlbmRzIEZvcm1fSW5wdXRfQWJzdHJhY3Qge1xuICAgIG9uX2NyZWF0ZSgpIHtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBkYXRhXG4gICAgICAgIHRoaXMuZGF0YS5hdHRhY2htZW50X2tleSA9ICcnO1xuICAgICAgICB0aGlzLmRhdGEudGh1bWJuYWlsX3VybCA9ICcnO1xuICAgIH1cblxuICAgIG9uX3JlbmRlcigpIHtcbiAgICAgICAgLy8gSGFuZGxlIHVwbG9hZCBidXR0b24gY2xpY2sgLSB0cmlnZ2VyIGhpZGRlbiBmaWxlIGlucHV0XG4gICAgICAgIHRoaXMuJGlkKCd1cGxvYWRfYnRuJykub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4kaWQoJ2ZpbGVfaW5wdXQnKS5jbGljaygpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBIYW5kbGUgZmlsZSBzZWxlY3Rpb25cbiAgICAgICAgdGhpcy4kaWQoJ2ZpbGVfaW5wdXQnKS5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsZSA9IHRoaXMuJGlkKCdmaWxlX2lucHV0JylbMF0uZmlsZXNbMF07XG4gICAgICAgICAgICBpZiAoIWZpbGUpIHJldHVybjtcblxuICAgICAgICAgICAgdGhpcy51cGxvYWRfcGhvdG8oZmlsZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEhhbmRsZSByZW1vdmUgYnV0dG9uXG4gICAgICAgIGlmICh0aGlzLmFyZ3Muc2hvd19yZW1vdmUpIHtcbiAgICAgICAgICAgIHRoaXMuJGlkKCdyZW1vdmVfYnRuJykub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlX3Bob3RvKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHZhbCgpIC0gR2V0IG9yIHNldCB0aGUgYXR0YWNobWVudCBrZXlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gLSBJZiBwcm92aWRlZCwgc2V0cyB0aGUgYXR0YWNobWVudCBrZXkgYW5kIHVwZGF0ZXMgdGh1bWJuYWlsXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGN1cnJlbnQgYXR0YWNobWVudCBrZXkgd2hlbiBjYWxsZWQgYXMgZ2V0dGVyXG4gICAgICovXG4gICAgdmFsKGtleSkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gR2V0dGVyIC0gcmV0dXJuIGF0dGFjaG1lbnQga2V5XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmF0dGFjaG1lbnRfa2V5IHx8ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gU2V0dGVyIC0gc2V0IGF0dGFjaG1lbnQga2V5IGFuZCB1cGRhdGUgdGh1bWJuYWlsXG4gICAgICAgICAgICB0aGlzLmRhdGEuYXR0YWNobWVudF9rZXkgPSBrZXkgfHwgJyc7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuYXR0YWNobWVudF9rZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZSB0aHVtYm5haWwgVVJMIGZyb20gYXR0YWNobWVudCBrZXlcbiAgICAgICAgICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuYXJncy53aWR0aCB8fCA5NjtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmFyZ3MuaGVpZ2h0IHx8IDk2O1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YS50aHVtYm5haWxfdXJsID0gYC9fdGh1bWJuYWlsLyR7dGhpcy5kYXRhLmF0dGFjaG1lbnRfa2V5fS9jb3Zlci8ke3dpZHRofS8ke2hlaWdodH1gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBObyBrZXkgLSBjbGVhciB0aHVtYm5haWxcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEudGh1bWJuYWlsX3VybCA9ICcnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnUmVyZW5kZXInKTtcbiAgICAgICAgICAgIC8vIFJlLXJlbmRlciB0byBzd2l0Y2ggYmV0d2VlbiBpY29uIGFuZCBpbWFnZVxuICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwbG9hZF9waG90byhmaWxlKSB7XG4gICAgICAgIC8vIFZhbGlkYXRlIGZpbGUgc2l6ZVxuICAgICAgICBjb25zdCBtYXhfc2l6ZSA9ICh0aGlzLmFyZ3MubWF4X3NpemUgfHwgMikgKiAxMDI0ICogMTAyNDsgLy8gQ29udmVydCBNQiB0byBieXRlc1xuICAgICAgICBpZiAoZmlsZS5zaXplID4gbWF4X3NpemUpIHtcbiAgICAgICAgICAgIGFsZXJ0KGBGaWxlIHNpemUgbXVzdCBiZSBsZXNzIHRoYW4gJHt0aGlzLmFyZ3MubWF4X3NpemUgfHwgMn1NQmApO1xuICAgICAgICAgICAgdGhpcy4kaWQoJ2ZpbGVfaW5wdXQnKS52YWwoJycpOyAvLyBDbGVhciBzZWxlY3Rpb25cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNob3cgc3Bpbm5lciwgZGltIGltYWdlXG4gICAgICAgIHRoaXMuJGlkKCdzcGlubmVyJykucmVtb3ZlQ2xhc3MoJ2Qtbm9uZScpO1xuICAgICAgICB0aGlzLiRpZCgncGhvdG8nKS5jc3MoJ29wYWNpdHknLCAnMC4zJyk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIEZvcm1EYXRhIGZvciBmaWxlIHVwbG9hZFxuICAgICAgICBjb25zdCBmb3JtX2RhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgZm9ybV9kYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUpO1xuICAgICAgICBmb3JtX2RhdGEuYXBwZW5kKCdzaXRlX2lkJywgJzEnKTsgLy8gVE9ETzogR2V0IGZyb20gc2Vzc2lvbi9jb25maWdcbiAgICAgICAgLy8gRG8gTk9UIHNldCBmaWxlYWJsZV90eXBlL2ZpbGVhYmxlX2NhdGVnb3J5IC0gZmlsZSB1cGxvYWRzIHVuYXR0YWNoZWRcbiAgICAgICAgLy8gVGhlIHBhcmVudCBmb3JtIHdpbGwgYXNzaWduIGl0IHZpYSBhdHRhY2hfdG8oKSBvbiBzYXZlXG5cbiAgICAgICAgLy8gVXBsb2FkIGZpbGUgdmlhIEFKQVhcbiAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgIHVybDogJy9fdXBsb2FkJyxcbiAgICAgICAgICAgIHR5cGU6ICdQT1NUJyxcbiAgICAgICAgICAgIGRhdGE6IGZvcm1fZGF0YSxcbiAgICAgICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBmYWxzZSxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdQcm9maWxlIHBob3RvIHVwbG9hZCBzdWNjZXNzZnVsOicsIHJlc3BvbnNlKTtcblxuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBhdHRhY2htZW50IGtleSAodGhpcyB3aWxsIGFsc28gdXBkYXRlIHRodW1ibmFpbClcbiAgICAgICAgICAgICAgICB0aGlzLnZhbChyZXNwb25zZS5hdHRhY2htZW50LmtleSk7XG5cbiAgICAgICAgICAgICAgICAvLyBIaWRlIHNwaW5uZXIsIHJlc3RvcmUgb3BhY2l0eVxuICAgICAgICAgICAgICAgIHRoaXMuJGlkKCdzcGlubmVyJykuYWRkQ2xhc3MoJ2Qtbm9uZScpO1xuICAgICAgICAgICAgICAgIHRoaXMuJGlkKCdwaG90bycpLmNzcygnb3BhY2l0eScsICcxJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBDbGVhciBmaWxlIGlucHV0IGZvciBmdXR1cmUgdXBsb2Fkc1xuICAgICAgICAgICAgICAgIHRoaXMuJGlkKCdmaWxlX2lucHV0JykudmFsKCcnKTtcblxuICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGV2ZW50IGZvciBmb3JtIHRyYWNraW5nXG4gICAgICAgICAgICAgICAgdGhpcy4kLnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiAoeGhyLCBzdGF0dXMsIGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignUHJvZmlsZSBwaG90byB1cGxvYWQgZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdSZXNwb25zZTonLCB4aHIucmVzcG9uc2VKU09OKTtcblxuICAgICAgICAgICAgICAgIC8vIEhpZGUgc3Bpbm5lciwgcmVzdG9yZSBvcGFjaXR5XG4gICAgICAgICAgICAgICAgdGhpcy4kaWQoJ3NwaW5uZXInKS5hZGRDbGFzcygnZC1ub25lJyk7XG4gICAgICAgICAgICAgICAgdGhpcy4kaWQoJ3Bob3RvJykuY3NzKCdvcGFjaXR5JywgJzEnKTtcblxuICAgICAgICAgICAgICAgIC8vIENsZWFyIGZpbGUgaW5wdXRcbiAgICAgICAgICAgICAgICB0aGlzLiRpZCgnZmlsZV9pbnB1dCcpLnZhbCgnJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBTaG93IGVycm9yIHRvIHVzZXJcbiAgICAgICAgICAgICAgICBhbGVydCgnVXBsb2FkIGZhaWxlZDogJyArICh4aHIucmVzcG9uc2VKU09OPy5lcnJvciB8fCBlcnJvcikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdXBkYXRlX3Bob3RvKCkge1xuICAgICAgICAvLyA8JSBpZiAodGhpcy5hcmdzLnNob3dfcmVtb3ZlICYmIHRoaXMuZGF0YS5hdHRhY2htZW50X2tleSkgeyAlPlxuICAgIH1cblxuICAgIHJlbW92ZV9waG90bygpIHtcbiAgICAgICAgLy8gQ2xlYXIgYXR0YWNobWVudCBrZXkgKHNldHMgdG8gcGxhY2Vob2xkZXIpXG4gICAgICAgIHRoaXMudmFsKCcnKTtcblxuICAgICAgICAvLyBUcmlnZ2VyIGNoYW5nZSBldmVudCBmb3IgZm9ybSB0cmFja2luZ1xuICAgICAgICB0aGlzLiQudHJpZ2dlcignY2hhbmdlJyk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2VlZCgpIHtcbiAgICAgICAgLy8gRm9yIHRlc3RpbmcgLSBzZXQgYSBwbGFjZWhvbGRlciBrZXlcbiAgICAgICAgLy8gSW4gcHJvZHVjdGlvbiwgdGhpcyB3b3VsZCB1c2UgYWN0dWFsIHRlc3QgZGF0YVxuICAgICAgICB0aGlzLnZhbCgnJyk7XG4gICAgfVxufVxuIiwiLyoqXG4gKiBSc3hfVGFic1xuICpcbiAqIFRhYiBjb250YWluZXIgY29tcG9uZW50IHdpdGggZm9ybS1hd2FyZSBlcnJvciBoYW5kbGluZyBpbnRlZ3JhdGlvbi5cbiAqIFNlZSByc3hfdGFicy5qcWh0bWwgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi5cbiAqXG4gKiBKYXZhU2NyaXB0IFJlc3BvbnNpYmlsaXRpZXM6XG4gKiAtIEJ1aWxkcyB0YWIgbmF2aWdhdGlvbiBkeW5hbWljYWxseSBmcm9tIHJlZ2lzdGVyZWQgUnN4X1RhYiBjaGlsZHJlblxuICogLSBNYW5hZ2VzIHRhYiBhY3RpdmF0aW9uIGFuZCBzd2l0Y2hpbmcgYmVoYXZpb3JcbiAqIC0gUGVyc2lzdHMgYWN0aXZlIHRhYiB0byBVUkwgaGFzaCBmb3IgYm9va21hcmtpbmdcbiAqIC0gSW50ZWdyYXRlcyB3aXRoIGZvcm0gdmFsaWRhdGlvbiB0byBzaG93IGVycm9yIGJhZGdlcyBvbiB0YWJzXG4gKiAtIEF1dG8tc3dpdGNoZXMgdG8gZmlyc3QgdGFiIHdpdGggZXJyb3JzIG9uIHZhbGlkYXRpb24gZmFpbHVyZVxuICogLSBQcm92aWRlcyBBUEkgZm9yIHBhcmVudCBmb3JtcyB0byByZXBvcnQgdmFsaWRhdGlvbiBlcnJvcnNcbiAqL1xuY2xhc3MgUnN4X1RhYnMgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9jcmVhdGUoKSB7XG4gICAgICAgIHRoaXMudGFicyA9IFtdOyAvLyBSZWdpc3RlcmVkIFJzeF9UYWIgY29tcG9uZW50c1xuICAgICAgICB0aGlzLmFjdGl2ZV90YWJfaWQgPSBudWxsO1xuICAgICAgICB0aGlzLmZvcm0gPSBudWxsO1xuICAgIH1cblxuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBGaW5kIHBhcmVudCBmb3JtIGlmIGl0IGV4aXN0c1xuICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmNsb3Nlc3QoJy5Sc3hfRm9ybScpO1xuXG4gICAgICAgIC8vIEJ1aWxkIHRhYiBuYXZpZ2F0aW9uIGZyb20gcmVnaXN0ZXJlZCB0YWJzXG4gICAgICAgIHRoaXMuX2J1aWxkX25hdigpO1xuXG4gICAgICAgIC8vIFJlc3RvcmUgYWN0aXZlIHRhYiBmcm9tIFVSTCBoYXNoIG9yIGFjdGl2YXRlIGZpcnN0IHRhYlxuICAgICAgICBjb25zdCBoYXNoID0gd2luZG93LmxvY2F0aW9uLmhhc2g7XG4gICAgICAgIGlmIChoYXNoKSB7XG4gICAgICAgICAgICBjb25zdCB0YWJfaWQgPSBoYXNoLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVfdGFiKHRhYl9pZCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50YWJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVfdGFiKHRoaXMudGFic1swXS5hcmdzLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBlcnNpc3QgYWN0aXZlIHRhYiB0byBVUkwgaGFzaFxuICAgICAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICAgICAgdGhpcy4kaWQoJ25hdicpLm9uKCdjbGljaycsICdhW2RhdGEtYnMtdG9nZ2xlPVwidGFiXCJdJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhYl9pZCA9ICQoZS5jdXJyZW50VGFyZ2V0KS5kYXRhKCd0YWItaWQnKTtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gJyMnICsgdGFiX2lkO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZWdpc3Rlcl90YWIodGFiX2NvbXBvbmVudCkge1xuICAgICAgICB0aGlzLnRhYnMucHVzaCh0YWJfY29tcG9uZW50KTtcbiAgICB9XG5cbiAgICBfYnVpbGRfbmF2KCkge1xuICAgICAgICBjb25zdCAkbmF2ID0gdGhpcy4kaWQoJ25hdicpO1xuICAgICAgICAkbmF2LmVtcHR5KCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRhYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHRhYiA9IHRoaXMudGFic1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGlzX2FjdGl2ZSA9IGkgPT09IDAgPyAnYWN0aXZlJyA6ICcnO1xuXG4gICAgICAgICAgICBjb25zdCAkbGkgPSAkKGBcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJuYXYtbGluayAke2lzX2FjdGl2ZX1cIlxuICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJzLXRvZ2dsZT1cInRhYlwiXG4gICAgICAgICAgICAgICAgICAgICAgIGhyZWY9XCIjJHt0YWIuYXJncy5pZH1cIlxuICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRhYi1pZD1cIiR7dGFiLmFyZ3MuaWR9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1zZWxlY3RlZD1cIiR7aSA9PT0gMCA/ICd0cnVlJyA6ICdmYWxzZSd9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInRhYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgJHt0YWIuYXJncy5pY29uID8gYDxpIGNsYXNzPVwiJHt0YWIuYXJncy5pY29ufVwiPjwvaT4gYCA6ICcnfVxuICAgICAgICAgICAgICAgICAgICAgICAgJHt0YWIuYXJncy5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctZGFuZ2VyIG1zLTJcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgZGF0YS1lcnJvci1iYWRnZT1cIiR7dGFiLmFyZ3MuaWR9XCI+MDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICBgKTtcblxuICAgICAgICAgICAgJG5hdi5hcHBlbmQoJGxpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFjdGl2YXRlX3RhYih0YWJfaWQpIHtcbiAgICAgICAgLy8gRmluZCB0aGUgdGFiXG4gICAgICAgIGNvbnN0IHRhYiA9IHRoaXMudGFicy5maW5kKCh0KSA9PiB0LmFyZ3MuaWQgPT09IHRhYl9pZCk7XG4gICAgICAgIGlmICghdGFiKSByZXR1cm47XG5cbiAgICAgICAgLy8gUmVtb3ZlIGFjdGl2ZSBzaG93IGZyb20gYWxsIHRhYiBwYW5lc1xuICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudGFicykge1xuICAgICAgICAgICAgdC4kLnJlbW92ZUNsYXNzKCdhY3RpdmUgc2hvdycpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGFjdGl2ZSBzaG93IHRvIHRoZSBzZWxlY3RlZCB0YWIgcGFuZVxuICAgICAgICB0YWIuJC5hZGRDbGFzcygnYWN0aXZlIHNob3cnKTtcblxuICAgICAgICAvLyBVcGRhdGUgQm9vdHN0cmFwIHRhYiBuYXZpZ2F0aW9uXG4gICAgICAgIHRoaXMuJGlkKCduYXYnKS5maW5kKCdhW2RhdGEtYnMtdG9nZ2xlPVwidGFiXCJdJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpLmF0dHIoJ2FyaWEtc2VsZWN0ZWQnLCAnZmFsc2UnKTtcbiAgICAgICAgdGhpcy4kaWQoJ25hdicpXG4gICAgICAgICAgICAuZmluZCgnYVtkYXRhLXRhYi1pZD1cIicgKyB0YWJfaWQgKyAnXCJdJylcbiAgICAgICAgICAgIC5hZGRDbGFzcygnYWN0aXZlJylcbiAgICAgICAgICAgIC5hdHRyKCdhcmlhLXNlbGVjdGVkJywgJ3RydWUnKTtcblxuICAgICAgICB0aGlzLmFjdGl2ZV90YWJfaWQgPSB0YWJfaWQ7XG4gICAgfVxuXG4gICAgaGFuZGxlX3ZhbGlkYXRpb25fZXJyb3JzKGVycm9ycykge1xuICAgICAgICAvLyBDb3VudCBlcnJvcnMgcGVyIHRhYlxuICAgICAgICBjb25zdCB0YWJfZXJyb3JzID0ge307XG5cbiAgICAgICAgZm9yIChsZXQgdGFiIG9mIHRoaXMudGFicykge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JfY291bnQgPSB0YWIuY291bnRfZXJyb3JzKGVycm9ycyk7XG4gICAgICAgICAgICB0YWJfZXJyb3JzW3RhYi5hcmdzLmlkXSA9IGVycm9yX2NvdW50O1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgYmFkZ2VcbiAgICAgICAgICAgIGNvbnN0ICRiYWRnZSA9IHRoaXMuJGlkKCduYXYnKS5maW5kKGBbZGF0YS1lcnJvci1iYWRnZT1cIiR7dGFiLmFyZ3MuaWR9XCJdYCk7XG4gICAgICAgICAgICBpZiAoZXJyb3JfY291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgJGJhZGdlLnRleHQoZXJyb3JfY291bnQpLnNob3coKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgJGJhZGdlLmhpZGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpbmQgZmlyc3QgdGFiIHdpdGggZXJyb3JzXG4gICAgICAgIGNvbnN0IGZpcnN0X2Vycm9yZWRfdGFiID0gdGhpcy50YWJzLmZpbmQoKHQpID0+IHRhYl9lcnJvcnNbdC5hcmdzLmlkXSA+IDApO1xuXG4gICAgICAgIC8vIFN3aXRjaCB0byBmaXJzdCBlcnJvcmVkIHRhYiBpZiBub3QgY3VycmVudGx5IG9uIGFuIGVycm9yZWQgdGFiXG4gICAgICAgIGlmIChmaXJzdF9lcnJvcmVkX3RhYiAmJiB0YWJfZXJyb3JzW3RoaXMuYWN0aXZlX3RhYl9pZF0gPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVfdGFiKGZpcnN0X2Vycm9yZWRfdGFiLmFyZ3MuaWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xlYXJfZXJyb3JfYmFkZ2VzKCkge1xuICAgICAgICB0aGlzLiRpZCgnbmF2JykuZmluZCgnW2RhdGEtZXJyb3ItYmFkZ2VdJykuaGlkZSgpO1xuICAgIH1cbn1cbiIsIi8qKlxuICogUnN4X1RhYlxuICpcbiAqIEluZGl2aWR1YWwgdGFiIHBhbmUgY29tcG9uZW50IHRoYXQgd29ya3Mgd2l0aCBSc3hfVGFicyBmb3IgZm9ybSB2YWxpZGF0aW9uLlxuICogU2VlIHJzeF90YWIuanFodG1sIGZvciBmdWxsIGRvY3VtZW50YXRpb24uXG4gKlxuICogSmF2YVNjcmlwdCBSZXNwb25zaWJpbGl0aWVzOlxuICogLSBBdXRvLXJlZ2lzdGVycyB3aXRoIHBhcmVudCBSc3hfVGFicyBjb21wb25lbnQgb24gY3JlYXRpb25cbiAqIC0gU2V0cyB0YWIgcGFuZSBJRCBhdHRyaWJ1dGUgZnJvbSAkaWQgYXJndW1lbnRcbiAqIC0gRGlzY292ZXJzIGFuZCB0cmFja3MgY2hpbGQgRm9ybV9GaWVsZCBjb21wb25lbnRzXG4gKiAtIENvdW50cyB2YWxpZGF0aW9uIGVycm9ycyB3aXRoaW4gdGhpcyB0YWIncyBmaWVsZHNcbiAqIC0gUHJvdmlkZXMgZXJyb3IgY291bnQgdG8gcGFyZW50IGZvciBiYWRnZSBkaXNwbGF5XG4gKi9cbmNsYXNzIFJzeF9UYWIgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9jcmVhdGUoKSB7XG4gICAgICAgIGxldCB0aGF0ID0gdGhpcztcblxuICAgICAgICAvLyBTZXQgdGhlIHRhYiBJRCBkeW5hbWljYWxseSBmcm9tIGFyZ3NcbiAgICAgICAgaWYgKHRoYXQuYXJncy5pZCkge1xuICAgICAgICAgICAgdGhhdC4kLmF0dHIoJ2lkJywgdGhhdC5hcmdzLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpbmQgcGFyZW50IFJzeF9UYWJzIGFuZCByZWdpc3RlclxuICAgICAgICB0aGF0LnRhYnNfY29udGFpbmVyID0gdGhhdC5jbG9zZXN0KCcuUnN4X1RhYnMnKTtcbiAgICAgICAgaWYgKHRoYXQudGFic19jb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoYXQudGFic19jb250YWluZXIucmVnaXN0ZXJfdGFiKHRoYXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RvcmUgcmVmZXJlbmNlIHRvIGFsbCBGb3JtX0ZpZWxkIGNvbXBvbmVudHMgd2l0aGluIHRoaXMgdGFiXG4gICAgICAgIHRoYXQuZmllbGRzID0gW107XG4gICAgfVxuXG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIGxldCB0aGF0ID0gdGhpcztcblxuICAgICAgICAvLyBGaW5kIGFsbCBGb3JtX0ZpZWxkIGNvbXBvbmVudHMgd2l0aGluIHRoaXMgdGFiXG4gICAgICAgIHRoYXQuJC5maW5kKCcuRm9ybV9GaWVsZCcpLmVhY2goKGluZGV4LCBlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZF9jb21wb25lbnQgPSAkKGVsZW1lbnQpLmNvbXBvbmVudCgpO1xuICAgICAgICAgICAgaWYgKGZpZWxkX2NvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIHRoYXQuZmllbGRzLnB1c2goZmllbGRfY29tcG9uZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ291bnQgdmFsaWRhdGlvbiBlcnJvcnMgaW4gRm9ybV9GaWVsZCBjb21wb25lbnRzIHdpdGhpbiB0aGlzIHRhYlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlcnJvcnMgLSBFcnJvciBvYmplY3QgZnJvbSBmb3JtIHZhbGlkYXRpb24ge2ZpZWxkX25hbWU6IGVycm9yX21lc3NhZ2V9XG4gICAgICogQHJldHVybnMge251bWJlcn0gQ291bnQgb2YgZXJyb3JzIGluIHRoaXMgdGFiXG4gICAgICovXG4gICAgY291bnRfZXJyb3JzKGVycm9ycykge1xuICAgICAgICBsZXQgdGhhdCA9IHRoaXM7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgZmllbGQgb2YgdGhhdC5maWVsZHMpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcnNbZmllbGQuYXJncy5uYW1lXSkge1xuICAgICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgfVxufVxuIiwiLyoqXG4gKiBSc3hfRm9ybVxuICpcbiAqIEZvcm0gY29udGFpbmVyIHdpdGggdmFsaWRhdGlvbiwgc3VibWlzc2lvbiwgYW5kIHdpZGdldCB2YWx1ZSBtYW5hZ2VtZW50LlxuICogU2VlIHJzeF9mb3JtLmpxaHRtbCBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLlxuICpcbiAqIEphdmFTY3JpcHQgUmVzcG9uc2liaWxpdGllczpcbiAqIC0gUGFyc2VzIGFuZCBzdG9yZXMgaW5pdGlhbCBmb3JtIGRhdGEgZnJvbSAkZGF0YSBhdHRyaWJ1dGUgKEpTT04gb3Igb2JqZWN0KVxuICogLSBEaXNjb3ZlcnMgYW5kIG1hbmFnZXMgY2hpbGQgV2lkZ2V0IGNvbXBvbmVudHMgdmlhIHZhbHMoKSBnZXR0ZXIvc2V0dGVyXG4gKiAtIEhhbmRsZXMgZm9ybSBzdWJtaXNzaW9uIHZpYSBBamF4IHRvIGNvbnRyb2xsZXIvbWV0aG9kIGVuZHBvaW50c1xuICogLSBBcHBsaWVzIHZhbGlkYXRpb24gZXJyb3JzIHRvIGZpZWxkcyB1c2luZyBGb3JtX1V0aWxzXG4gKiAtIEludGVncmF0ZXMgd2l0aCBSc3hfVGFicyBmb3IgdGFiLWF3YXJlIGVycm9yIGhhbmRsaW5nXG4gKiAtIFByb3ZpZGVzIHNlZWQoKSBmdW5jdGlvbmFsaXR5IGZvciBkZWJ1Zy90ZXN0aW5nXG4gKiAtIE1hbmFnZXMgZm9ybSBzdGF0ZSAodmFsdWVzLCBlcnJvcnMpIHRocm91Z2hvdXQgbGlmZWN5Y2xlXG4gKi9cbmNsYXNzIFJzeF9Gb3JtIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgb25fY3JlYXRlKCkge1xuICAgICAgICB0aGlzLmRhdGEudmFsdWVzID0ge307IC8vIEN1cnJlbnQgZm9ybSB2YWx1ZXMge25hbWU6IHZhbHVlfVxuICAgICAgICB0aGlzLmRhdGEuZXJyb3JzID0ge307IC8vIFZhbGlkYXRpb24gZXJyb3JzIHtuYW1lOiBlcnJvcl9tZXNzYWdlfVxuICAgICAgICB0aGlzLnRhYnMgPSBudWxsOyAvLyBSZWZlcmVuY2UgdG8gUnN4X1RhYnMgY29tcG9uZW50IGlmIHByZXNlbnRcblxuICAgICAgICAvLyBQYXJzZSBpbml0aWFsIGRhdGEgZnJvbSAkZGF0YSBhdHRyaWJ1dGUgKGUuZy4sIGZyb20gJGRhdGE9JGNsaWVudClcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmFyZ3MuZGF0YTtcblxuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIERlY29kZSBIVE1MIGVudGl0aWVzIGJlZm9yZSBwYXJzaW5nIEpTT05cbiAgICAgICAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgY2FzZXMgd2hlcmUgSlNPTiBpcyBwYXNzZWQgdGhyb3VnaCBCbGFkZSB7ISEgISF9IHN5bnRheFxuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29kZWQgPSAkKCc8dGV4dGFyZWE+JykuaHRtbChkYXRhKS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGpzb25fZGVjb2RlKGRlY29kZWQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Zvcm06IEZhaWxlZCB0byBwYXJzZSBkYXRhIEpTT04gc3RyaW5nJywgZSk7XG4gICAgICAgICAgICAgICAgZGF0YSA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEudmFsdWVzID0gZGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICBjb25zdCB0aGF0ID0gdGhpcztcblxuICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IGVycm9yIGNvbnRhaW5lciBleGlzdHNcbiAgICAgICAgaWYgKCF0aGlzLiRpZCgnZXJyb3InKS5leGlzdHMoKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy4kLmh0bWwoKSk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgJ1JzeF9Gb3JtIHJlcXVpcmVzIGFuIGVycm9yIGNvbnRhaW5lciB3aXRoICRpZD1cImVycm9yXCIuICcgK1xuICAgICAgICAgICAgICAgICAgICAnQWRkIDxkaXYgJGlkPVwiZXJyb3JcIj48L2Rpdj4gdG8geW91ciBmb3JtIHRlbXBsYXRlIGZvciBkaXNwbGF5aW5nIHZhbGlkYXRpb24gYW5kIGVycm9yIG1lc3NhZ2VzLidcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdXAgc2VlZCBidXR0b24gaGFuZGxlciBpZiBpbiBkZWJ1ZyBtb2RlXG4gICAgICAgIGlmICh3aW5kb3cucnN4YXBwLmRlYnVnICYmIHRoaXMuJGlkKCdzZWVkX2J0bicpLmV4aXN0cygpKSB7XG4gICAgICAgICAgICB0aGF0LiRpZCgnc2VlZF9idG4nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhhdC5zZWVkKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpbmQgY2hpbGQgUnN4X1RhYnMgY29tcG9uZW50IGlmIHByZXNlbnQgZm9yIGVycm9yIGhhbmRsaW5nIGludGVncmF0aW9uXG4gICAgICAgIGNvbnN0IHRhYnNfZWwgPSB0aGlzLiQuZmluZCgnLlJzeF9UYWJzJykuZmlyc3QoKTtcbiAgICAgICAgaWYgKHRhYnNfZWwubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGF0LnRhYnMgPSB0YWJzX2VsLmNvbXBvbmVudCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXV0b21hdGljYWxseSB3aXJlIGFsbCBzdWJtaXQgYnV0dG9ucyB0byBjYWxsIGZvcm0gc3VibWl0KClcbiAgICAgICAgdGhpcy4kLmZpbmQoJ2J1dHRvblt0eXBlPVwic3VibWl0XCJdJykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkKHRoaXMpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoYXQuc3VibWl0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTm90aWZ5IGFsbCBmaWVsZHMgdG8gbG9hZCB0aGVpciBpbml0aWFsIHZhbHVlc1xuICAgICAgICAvLyBUaGlzIGhhcHBlbnMgaW4gb25fcmVhZHkgdG8gZW5zdXJlIGFsbCBGb3JtX0ZpZWxkIGNoaWxkcmVuIGFyZSBpbml0aWFsaXplZFxuICAgICAgICB0aGlzLnZhbHModGhpcy5kYXRhLnZhbHVlcyk7XG5cbiAgICAgICAgLy8gSGlkZSBsb2FkaW5nIHNwaW5uZXIgYW5kIHNob3cgZm9ybSBjb250ZW50ICh3aXRob3V0IHJlLXJlbmRlcmluZylcbiAgICAgICAgdGhpcy4kaWQoJ2xvYWRlcicpLmhpZGUoKTtcbiAgICAgICAgdGhpcy4kaWQoJ2Zvcm1fY29udGVudCcpLnNob3coKTtcbiAgICB9XG5cbiAgICAvLyBHZXR0ZXIgb3Igc2V0dGVyIGZvciBhbGwgZm9ybSB2YWx1ZXMsIHNpbWlsYXIgdG8ganF1ZXJ5IHZhbFxuICAgIHZhbHModmFsdWVzKSB7XG4gICAgICAgIGlmICh2YWx1ZXMpIHtcbiAgICAgICAgICAgIC8vIFNldHRlclxuXG4gICAgICAgICAgICB0aGlzLiQuc2hhbGxvd0ZpbmQoJy5XaWRnZXQnKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgJHdpZGdldCA9ICQodGhpcyk7XG4gICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudCA9ICR3aWRnZXQuY29tcG9uZW50KCk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCAmJiAndmFsJyBpbiBjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZGdldF9uYW1lID0gJHdpZGdldC5kYXRhKCduYW1lJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3aWRnZXRfbmFtZSBpbiB2YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC52YWwodmFsdWVzW3dpZGdldF9uYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBHZXR0ZXJcbiAgICAgICAgICAgIGxldCBkYXRhID0ge307XG5cbiAgICAgICAgICAgIC8vIEdldCB3aWRnZXQgdmFsdWVzXG4gICAgICAgICAgICB0aGlzLiQuc2hhbGxvd0ZpbmQoJy5XaWRnZXQnKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgJHdpZGdldCA9ICQodGhpcyk7XG4gICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudCA9ICR3aWRnZXQuY29tcG9uZW50KCk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCAmJiAndmFsJyBpbiBjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZGdldF9uYW1lID0gJHdpZGdldC5kYXRhKCduYW1lJyk7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFbd2lkZ2V0X25hbWVdID0gY29tcG9uZW50LnZhbCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBBbHNvIGdldCByZWd1bGFyIGhpZGRlbiBpbnB1dHMgKG5vbi13aWRnZXQgaW5wdXRzKVxuICAgICAgICAgICAgdGhpcy4kLmZpbmQoJ2lucHV0W3R5cGU9XCJoaWRkZW5cIl1bbmFtZV0nKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgJGlucHV0ID0gJCh0aGlzKTtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9ICRpbnB1dC5hdHRyKCduYW1lJyk7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVtuYW1lXSA9ICRpbnB1dC52YWwoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRfZXJyb3IobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmVycm9yc1tuYW1lXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXIgYW4gZXJyb3IgaW4gdGhlIGZvcm0ncyBlcnJvciBjb250YWluZXJcbiAgICAgKlxuICAgICAqIEhhbmRsZXMgYm90aCBmaWVsZC1zcGVjaWZpYyB2YWxpZGF0aW9uIGVycm9ycyBhbmQgZ2VuZXJpYyBlcnJvcnMuXG4gICAgICogQ2FuIGJlIGNhbGxlZCBieSBleHRlcm5hbCBoYW5kbGVycyAoZS5nLiwgbW9kYWwgb25fc3VibWl0KSBvciBpbnRlcm5hbGx5XG4gICAgICogYnkgdGhlIGZvcm0ncyBvd24gc3VibWl0KCkgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtFcnJvcnxPYmplY3R9IGVycm9yIC0gRXJyb3Igb2JqZWN0IGZyb20gQWpheCBjYWxsXG4gICAgICovXG4gICAgYXN5bmMgcmVuZGVyX2Vycm9yKGVycm9yKSB7XG4gICAgICAgIC8vIEhhbmRsZSB2YWxpZGF0aW9uIGVycm9ycyAtIGFwcGx5IHRvIGZpZWxkc1xuICAgICAgICBpZiAoZXJyb3IudHlwZSA9PT0gJ2Zvcm1fZXJyb3InICYmIGVycm9yLmRldGFpbHMpIHtcbiAgICAgICAgICAgIGF3YWl0IEZvcm1fVXRpbHMuYXBwbHlfZm9ybV9lcnJvcnModGhpcy4kLCBlcnJvci5kZXRhaWxzKTtcblxuICAgICAgICAgICAgLy8gTm90aWZ5IHRhYnMgb2YgdmFsaWRhdGlvbiBlcnJvcnMgZm9yIGVycm9yIGJhZGdlcyBhbmQgYXV0by1zd2l0Y2hpbmdcbiAgICAgICAgICAgIGlmICh0aGlzLnRhYnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhYnMuaGFuZGxlX3ZhbGlkYXRpb25fZXJyb3JzKGVycm9yLmRldGFpbHMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGb3JtX1V0aWxzIGhhbmRsZXMgYWxsIHJlbmRlcmluZyAoaW5saW5lIGVycm9ycyArIHVubWF0Y2hlZCBlcnJvcnMgYWxlcnQpXG4gICAgICAgICAgICAvLyBEb24ndCBjYWxsIFJzeC5yZW5kZXJfZXJyb3IoKSB0byBhdm9pZCBkdXBsaWNhdGUgYWxlcnRzXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGb3Igbm9uLWZvcm0gZXJyb3JzIChmYXRhbCwgYXV0aCwgbmV0d29yaywgZXRjLiksIHJlbmRlciBpbiBmb3JtJ3MgZXJyb3IgY29udGFpbmVyXG4gICAgICAgIFJzeC5yZW5kZXJfZXJyb3IoZXJyb3IsIHRoaXMuJGlkKCdlcnJvcicpKTtcbiAgICB9XG5cbiAgICBhc3luYyBzdWJtaXQoKSB7XG4gICAgICAgIC8vIENsZWFyIGFueSBwcmV2aW91cyBlcnJvcnNcbiAgICAgICAgRm9ybV9VdGlscy5yZXNldF9mb3JtX2Vycm9ycyh0aGlzLiQpO1xuICAgICAgICB0aGlzLiRpZCgnZXJyb3InKS5lbXB0eSgpO1xuXG4gICAgICAgIC8vIENsZWFyIHRhYiBlcnJvciBiYWRnZXMgaWYgdGFicyBhcmUgcHJlc2VudFxuICAgICAgICBpZiAodGhpcy50YWJzKSB7XG4gICAgICAgICAgICB0aGlzLnRhYnMuY2xlYXJfZXJyb3JfYmFkZ2VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXJpYWxpemUgYWxsIGZpZWxkIHZhbHVlc1xuICAgICAgICBsZXQgdmFsdWVzID0gdGhpcy52YWxzKCk7XG5cbiAgICAgICAgLy8gQ2FsbCBzdWJtaXQgaGFuZGxlclxuICAgICAgICBpZiAoIXRoaXMuYXJncy5jb250cm9sbGVyIHx8ICF0aGlzLmFyZ3MubWV0aG9kKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGb3JtOiBObyBjb250cm9sbGVyL21ldGhvZCBwcm92aWRlZCcpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3JtIGNvbmZpZ3VyYXRpb24gZXJyb3I6IE1pc3NpbmcgY29udHJvbGxlciBvciBtZXRob2QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBCdWlsZCBBamF4IFVSTCBmcm9tIGNvbnRyb2xsZXIgYW5kIG1ldGhvZFxuICAgICAgICAgICAgY29uc3QgYWpheF91cmwgPSBgL19hamF4LyR7dGhpcy5hcmdzLmNvbnRyb2xsZXJ9LyR7dGhpcy5hcmdzLm1ldGhvZH1gO1xuXG4gICAgICAgICAgICAvLyBDYWxsIEFqYXggZW5kcG9pbnQgLSByZXNwb25zZSBpcyBkaXJlY3RseSB3aGF0IFBIUCByZXR1cm5lZFxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgQWpheC5jYWxsKGFqYXhfdXJsLCB2YWx1ZXMpO1xuXG4gICAgICAgICAgICAvLyBTdWNjZXNzISBIYW5kbGUgcmVzdWx0XG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5yZWRpcmVjdCkge1xuICAgICAgICAgICAgICAgIC8vIFJlZGlyZWN0IHRvIFVSTFxuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gcmVzdWx0LnJlZGlyZWN0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBTdWNjZXNzIHdpdGhvdXQgcmVkaXJlY3RcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRm9ybSBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5JywgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIFJlbmRlciBlcnJvciAoaGFuZGxlcyBib3RoIHZhbGlkYXRpb24gYW5kIGdlbmVyaWMgZXJyb3JzKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJfZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc2VlZCgpIHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgdGhpcy4kLnNoYWxsb3dGaW5kKCcuRm9ybV9GaWVsZCcpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGNvbXBvbmVudCA9ICQodGhpcykuY29tcG9uZW50KCk7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50ICYmICdzZWVkJyBpbiBjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGNvbXBvbmVudC5zZWVkKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIH1cbn1cbiIsIi8qKlxuICogUGluX1ZlcmlmaWNhdGlvbl9Gb3JtXG4gKlxuICogU3BlY2lhbGl6ZWQgNi1kaWdpdCBQSU4gZW50cnkgZm9ybSB3aXRoIGF1dG8tbmF2aWdhdGlvbiBiZXR3ZWVuIGlucHV0cy5cbiAqIFNlZSBwaW5fdmVyaWZpY2F0aW9uX2Zvcm0uanFodG1sIGZvciBmdWxsIGRvY3VtZW50YXRpb24uXG4gKlxuICogSmF2YVNjcmlwdCBSZXNwb25zaWJpbGl0aWVzOlxuICogLSBBdXRvLWFkdmFuY2VzIHRvIG5leHQgaW5wdXQgd2hlbiBkaWdpdCBpcyBlbnRlcmVkXG4gKiAtIFNtYXJ0IGJhY2tzcGFjZTogY2xlYXJzIGN1cnJlbnQgYm94IGFuZCBtb3ZlcyB0byBwcmV2aW91c1xuICogLSBQYXN0ZSBzdXBwb3J0OiBkaXN0cmlidXRlcyBwYXN0ZWQgZGlnaXRzIGFjcm9zcyBhbGwgNiBpbnB1dHNcbiAqIC0gQXJyb3cga2V5IG5hdmlnYXRpb24gYmV0d2VlbiBpbnB1dHNcbiAqIC0gTnVtZXJpYy1vbmx5IGlucHV0IHZhbGlkYXRpb25cbiAqIC0gU2VsZWN0LWFsbCBvbiBmb2N1cyBmb3IgZWFzeSBkaWdpdCByZXBsYWNlbWVudFxuICogLSBWYWxpZGF0ZXMgYWxsIDYgZGlnaXRzIGVudGVyZWQgYmVmb3JlIGFsbG93aW5nIHN1Ym1pc3Npb25cbiAqIC0gUHJvdmlkZXMgdmFsKCkgZ2V0dGVyL3NldHRlciBmb3IgcHJvZ3JhbW1hdGljIFBJTiBhY2Nlc3NcbiAqL1xuY2xhc3MgUGluX1ZlcmlmaWNhdGlvbl9Gb3JtIGV4dGVuZHMgUnN4X0Zvcm0ge1xuICAgIG9uX2NyZWF0ZSgpIHtcbiAgICAgICAgc3VwZXIub25fY3JlYXRlKCk7XG4gICAgICAgIHRoaXMucGluX2xlbmd0aCA9IDY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IG9yIHNldCB0aGUgUElOIHZhbHVlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt2YWx1ZV0gLSBJZiBwcm92aWRlZCwgc2V0cyB0aGUgUElOIChkaXN0cmlidXRlcyBhY3Jvc3MgaW5wdXRzKVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IEN1cnJlbnQgUElOIHZhbHVlIHdoZW4gY2FsbGVkIGFzIGdldHRlclxuICAgICAqL1xuICAgIHZhbCh2YWx1ZSkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gR2V0dGVyIC0gY29sbGVjdCBhbGwgZGlnaXRzXG4gICAgICAgICAgICBsZXQgcGluID0gJyc7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGluX2xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcGluICs9IHRoaXMuJGlkKGBkaWdpdF8ke2l9YCkudmFsKCkgfHwgJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGluO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gU2V0dGVyIC0gZGlzdHJpYnV0ZSBkaWdpdHMgYWNyb3NzIGlucHV0c1xuICAgICAgICAgICAgY29uc3QgZGlnaXRzID0gc3RyKHZhbHVlIHx8ICcnKS5yZXBsYWNlKC9bXjAtOV0vZywgJycpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBpbl9sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuJGlkKGBkaWdpdF8ke2l9YCkudmFsKGRpZ2l0c1tpXSB8fCAnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBGb2N1cyBmaXJzdCBlbXB0eSBpbnB1dCBvciBsYXN0IGlucHV0XG4gICAgICAgICAgICBjb25zdCBmaXJzdF9lbXB0eSA9IHRoaXMuX2ZpbmRfZmlyc3RfZW1wdHlfaW5kZXgoKTtcbiAgICAgICAgICAgIGlmIChmaXJzdF9lbXB0eSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRpZChgZGlnaXRfJHtmaXJzdF9lbXB0eX1gKVswXS5mb2N1cygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRpZChgZGlnaXRfJHt0aGlzLnBpbl9sZW5ndGggLSAxfWApWzBdLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIHRoZSBmaXJzdCBlbXB0eSBpbnB1dCBpbmRleFxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEluZGV4IG9mIGZpcnN0IGVtcHR5IGlucHV0LCBvciAtMSBpZiBhbGwgZmlsbGVkXG4gICAgICovXG4gICAgX2ZpbmRfZmlyc3RfZW1wdHlfaW5kZXgoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5waW5fbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy4kaWQoYGRpZ2l0XyR7aX1gKS52YWwoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIGZvY3VzIHRvIHNwZWNpZmljIGlucHV0IGluZGV4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gICAgICovXG4gICAgX2ZvY3VzX2lucHV0KGluZGV4KSB7XG4gICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5waW5fbGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCAkaW5wdXQgPSB0aGlzLiRpZChgZGlnaXRfJHtpbmRleH1gKTtcbiAgICAgICAgICAgIGlmICgkaW5wdXQuZXhpc3RzKCkpIHtcbiAgICAgICAgICAgICAgICAkaW5wdXRbMF0uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAvLyBTZWxlY3QgdGhlIGNvbnRlbnQgaWYgdGhlcmUgaXMgYW55XG4gICAgICAgICAgICAgICAgJGlucHV0WzBdLnNlbGVjdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHBhc3RlIGV2ZW50IC0gZGlzdHJpYnV0ZSBkaWdpdHMgYWNyb3NzIGlucHV0c1xuICAgICAqIEBwYXJhbSB7Q2xpcGJvYXJkRXZlbnR9IGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnRfaW5kZXhcbiAgICAgKi9cbiAgICBfaGFuZGxlX3Bhc3RlKGUsIHN0YXJ0X2luZGV4KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAvLyBHZXQgcGFzdGVkIGRhdGFcbiAgICAgICAgY29uc3QgcGFzdGUgPSAoZS5vcmlnaW5hbEV2ZW50IHx8IGUpLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xuICAgICAgICBjb25zdCBkaWdpdHMgPSBwYXN0ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpO1xuXG4gICAgICAgIGlmICghZGlnaXRzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEaXN0cmlidXRlIGRpZ2l0cyBzdGFydGluZyBmcm9tIGN1cnJlbnQgaW5wdXRcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaWdpdHMubGVuZ3RoICYmIChzdGFydF9pbmRleCArIGkpIDwgdGhpcy5waW5fbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuJGlkKGBkaWdpdF8ke3N0YXJ0X2luZGV4ICsgaX1gKS52YWwoZGlnaXRzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZvY3VzIG5leHQgZW1wdHkgaW5wdXQgb3IgbGFzdCBpbnB1dFxuICAgICAgICBjb25zdCBuZXh0X2luZGV4ID0gTWF0aC5taW4oc3RhcnRfaW5kZXggKyBkaWdpdHMubGVuZ3RoLCB0aGlzLnBpbl9sZW5ndGggLSAxKTtcbiAgICAgICAgdGhpcy5fZm9jdXNfaW5wdXQobmV4dF9pbmRleCk7XG4gICAgfVxuXG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIHN1cGVyLm9uX3JlYWR5KCk7XG5cbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgLy8gU2V0IHVwIGV2ZW50IGhhbmRsZXJzIGZvciBlYWNoIGlucHV0XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5waW5fbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0ICRpbnB1dCA9IHRoaXMuJGlkKGBkaWdpdF8ke2l9YCk7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGk7XG5cbiAgICAgICAgICAgIC8vIEhhbmRsZSBpbnB1dCBldmVudCAtIGF1dG8tYWR2YW5jZVxuICAgICAgICAgICAgJGlucHV0Lm9uKCdpbnB1dCcsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9ICQodGhpcykudmFsKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBPbmx5IGFsbG93IG51bWVyaWMgaW5wdXRcbiAgICAgICAgICAgICAgICBjb25zdCBudW1lcmljID0gdmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKTtcbiAgICAgICAgICAgICAgICBpZiAobnVtZXJpYyAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS52YWwobnVtZXJpYyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gSWYgbXVsdGlwbGUgZGlnaXRzIHdlcmUgZW50ZXJlZCAocGFzdGUpLCBkaXN0cmlidXRlIHRoZW1cbiAgICAgICAgICAgICAgICBpZiAobnVtZXJpYy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX2hhbmRsZV9wYXN0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdDogKCkgPT4ge30sXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcGJvYXJkRGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREYXRhOiAoKSA9PiBudW1lcmljXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBdXRvLWFkdmFuY2UgdG8gbmV4dCBpbnB1dCBpZiBkaWdpdCB3YXMgZW50ZXJlZFxuICAgICAgICAgICAgICAgIGlmIChudW1lcmljLmxlbmd0aCA9PT0gMSAmJiBpbmRleCA8IHRoYXQucGluX2xlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9jdXNfaW5wdXQoaW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gSGFuZGxlIGtleWRvd24gZm9yIGJhY2tzcGFjZVxuICAgICAgICAgICAgJGlucHV0Lm9uKCdrZXlkb3duJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIC8vIEJhY2tzcGFjZSBrZXlcbiAgICAgICAgICAgICAgICBpZiAoZS5rZXkgPT09ICdCYWNrc3BhY2UnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRfdmFsdWUgPSAkKHRoaXMpLnZhbCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGN1cnJlbnQgaW5wdXQgaXMgZW1wdHksIG1vdmUgdG8gcHJldmlvdXMgYW5kIGNsZWFyIGl0XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudF92YWx1ZSAmJiBpbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuJGlkKGBkaWdpdF8ke2luZGV4IC0gMX1gKS52YWwoJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9jdXNfaW5wdXQoaW5kZXggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBjdXJyZW50IGlucHV0IGhhcyB2YWx1ZSwgaXQgd2lsbCBiZSBjbGVhcmVkIGJ5IGRlZmF1bHQgYmVoYXZpb3JcbiAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHdlIHN0YXkgb24gY3VycmVudCBpbnB1dFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFycm93IGxlZnRcbiAgICAgICAgICAgICAgICBpZiAoZS5rZXkgPT09ICdBcnJvd0xlZnQnICYmIGluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX2ZvY3VzX2lucHV0KGluZGV4IC0gMSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQXJyb3cgcmlnaHRcbiAgICAgICAgICAgICAgICBpZiAoZS5rZXkgPT09ICdBcnJvd1JpZ2h0JyAmJiBpbmRleCA8IHRoYXQucGluX2xlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGF0Ll9mb2N1c19pbnB1dChpbmRleCArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBIYW5kbGUgcGFzdGUgZXZlbnRcbiAgICAgICAgICAgICRpbnB1dC5vbigncGFzdGUnLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgdGhhdC5faGFuZGxlX3Bhc3RlKGUsIGluZGV4KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBTZWxlY3QgYWxsIG9uIGZvY3VzIGZvciBlYXN5IHJlcGxhY2VtZW50XG4gICAgICAgICAgICAkaW5wdXQub24oJ2ZvY3VzJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzKVswXS5zZWxlY3QoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRm9jdXMgZmlyc3QgaW5wdXQgb24gbG9hZFxuICAgICAgICB0aGlzLl9mb2N1c19pbnB1dCgwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSBzdWJtaXQgdG8gdmFsaWRhdGUgUElOIGlzIGNvbXBsZXRlXG4gICAgICovXG4gICAgYXN5bmMgc3VibWl0KCkge1xuICAgICAgICBjb25zdCBwaW4gPSB0aGlzLnZhbCgpO1xuXG4gICAgICAgIC8vIENsZWFyIHByZXZpb3VzIGVycm9yc1xuICAgICAgICB0aGlzLiRpZCgnZXJyb3JfY29udGFpbmVyJykuaGlkZSgpLmVtcHR5KCk7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgUElOIGlzIDYgZGlnaXRzXG4gICAgICAgIGlmIChwaW4ubGVuZ3RoICE9PSB0aGlzLnBpbl9sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuJGlkKCdlcnJvcl9jb250YWluZXInKVxuICAgICAgICAgICAgICAgIC50ZXh0KCdQbGVhc2UgZW50ZXIgYWxsIDYgZGlnaXRzJylcbiAgICAgICAgICAgICAgICAuc2hvdygpO1xuXG4gICAgICAgICAgICAvLyBNYXJrIGlucHV0cyBhcyBpbnZhbGlkXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGluX2xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLiRpZChgZGlnaXRfJHtpfWApLnZhbCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGlkKGBkaWdpdF8ke2l9YCkuYWRkQ2xhc3MoJ2lzLWludmFsaWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSBpbnZhbGlkIGNsYXNzIGZyb20gYWxsIGlucHV0c1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGluX2xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLiRpZChgZGlnaXRfJHtpfWApLnJlbW92ZUNsYXNzKCdpcy1pbnZhbGlkJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsIHBhcmVudCBzdWJtaXQgKHdoaWNoIHdpbGwgdXNlIGNvbnRyb2xsZXIvbWV0aG9kIGlmIHByb3ZpZGVkKVxuICAgICAgICBhd2FpdCBzdXBlci5zdWJtaXQoKTtcbiAgICB9XG59XG4iLCIvKipcbiAqIEZvcm1fRmllbGRfQWJzdHJhY3RcbiAqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBmb3JtIGZpZWxkIHdyYXBwZXJzLiBQcm92aWRlcyBjb3JlIGZ1bmN0aW9uYWxpdHkgd2l0aG91dCB2aXN1YWwgZm9ybWF0dGluZy5cbiAqIFNlZSBmb3JtX2ZpZWxkX2Fic3RyYWN0LmpxaHRtbCBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLlxuICpcbiAqIEphdmFTY3JpcHQgUmVzcG9uc2liaWxpdGllczpcbiAqIC0gRGlzY292ZXJzIGFuZCBjb25maWd1cmVzIGNoaWxkIFdpZGdldCBjb21wb25lbnRcbiAqIC0gU2V0cyBkYXRhLW5hbWUgYXR0cmlidXRlIG9uIHdpZGdldCBmb3IgZm9ybSB2YWx1ZSBjb2xsZWN0aW9uXG4gKiAtIFNldHMgbmFtZSBhdHRyaWJ1dGUgb24gbmF0aXZlIGlucHV0cyBmb3IgRm9ybV9VdGlscyBjb21wYXRpYmlsaXR5XG4gKiAtIFdpcmVzIGxhYmVsICdmb3InIGF0dHJpYnV0ZSB0byBpbnB1dCBlbGVtZW50IElEIGZvciBhY2Nlc3NpYmlsaXR5IChpZiBsYWJlbCBleGlzdHMpXG4gKiAtIFByb3ZpZGVzIHNlZWQoKSBzdXBwb3J0IGZvciBkZWJ1Zy90ZXN0aW5nIGRhdGFcbiAqIC0gQnJpZGdlcyBiZXR3ZWVuIGZvcm0gdmFsaWRhdGlvbiBzdGF0ZSBhbmQgY2hpbGQgd2lkZ2V0XG4gKi9cbmNsYXNzIEZvcm1fRmllbGRfQWJzdHJhY3QgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9jcmVhdGUoKSB7XG4gICAgICAgIC8vIEZpbmQgcGFyZW50IGZvcm0gZm9yIGVycm9yIGRpc3BsYXlcbiAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5jbG9zZXN0KCcuUnN4X0Zvcm0nKTtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm0pIHtcbiAgICAgICAgICAgIHNob3VsZG50X2hhcHBlbignRm9ybV9GaWVsZF9BYnN0cmFjdCBtdXN0IGJlIGluc2lkZSBhIFJzeF9Gb3JtIGNvbXBvbmVudCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIC8vIEZpbmQgY2hpbGQgd2lkZ2V0IGFuZCBzZXQgaXRzIGRhdGEtbmFtZSBhdHRyaWJ1dGVcbiAgICAgICAgbGV0ICR3aWRnZXQgPSB0aGlzLiQuZmluZCgnLldpZGdldCcpLmZpcnN0KCk7XG5cbiAgICAgICAgaWYgKCEkd2lkZ2V0LmV4aXN0cygpKSB7XG4gICAgICAgICAgICBzaG91bGRudF9oYXBwZW4oXG4gICAgICAgICAgICAgICAgYEZvcm1fRmllbGRfQWJzdHJhY3QgXCIke3RoaXMuYXJncy5uYW1lfVwiIGhhcyBubyAuV2lkZ2V0IGNoaWxkLiBFdmVyeSBGb3JtX0ZpZWxkIG11c3QgY29udGFpbiBleGFjdGx5IG9uZSB3aWRnZXQgKFRleHRfSW5wdXQsIFd5c2l3eWdfSW5wdXQsIGV0Yy4pYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBkYXRhLW5hbWUgb24gdGhlIHdpZGdldCBzbyBSc3hfRm9ybSBjYW4gY29sbGVjdCB2YWx1ZXNcbiAgICAgICAgJHdpZGdldC5hdHRyKCdkYXRhLW5hbWUnLCB0aGlzLmFyZ3MubmFtZSk7XG5cbiAgICAgICAgbGV0ICRpbnB1dCA9IHRoaXMuJC5maW5kKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpLmZpcnN0KCk7XG4gICAgICAgIGlmICgkaW5wdXQuZXhpc3RzKCkpIHtcbiAgICAgICAgICAgIC8vIEFsc28gc2V0IG5hbWUgYXR0cmlidXRlIG9uIG5hdGl2ZSBpbnB1dHMgZm9yIEZvcm1fVXRpbHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgLy8gVG9kbzogY2xldmVyIHdheSB0byBkZWFsIHdpdGggdGhpcyBmb3Igbm9uIHN0YW5kYXJkIGlucHV0IGVsZW1lbnRzXG4gICAgICAgICAgICAkaW5wdXQuYXR0cignbmFtZScsIHRoaXMuYXJncy5uYW1lKTtcblxuICAgICAgICAgICAgLy8gU2V0IHRoZSBmb3IgZmllbGQgdG8gdGhlIGVsZW1lbnQgaWYgbGFiZWwgZXhpc3RzIChmb3IgY2hpbGQgY2xhc3NlcylcbiAgICAgICAgICAgIC8vIFRvZG86IGNsZXZlciB3YXkgdG8gZGVhbCB3aXRoIHRoaXMgZm9yIG5vbiBzdGFuZGFyZCBpbnB1dCBlbGVtZW50c1xuICAgICAgICAgICAgbGV0ICRsYWJlbCA9IHRoaXMuJGlkKCdmb3JtX2xhYmVsJyk7XG4gICAgICAgICAgICBpZiAoJGxhYmVsLmV4aXN0cygpKSB7XG4gICAgICAgICAgICAgICAgJGxhYmVsLmF0dHIoJ2ZvcicsICRpbnB1dC5hdHRyKCdpZCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldF9lcnJvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybS5nZXRfZXJyb3IodGhpcy5hcmdzLm5hbWUpO1xuICAgIH1cblxuICAgIGhhc19lcnJvcigpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5nZXRfZXJyb3IoKTtcbiAgICB9XG5cbiAgICBhc3luYyBzZWVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuYXJncy5zZWVkZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpbmQgY2hpbGQgd2lkZ2V0XG4gICAgICAgIGxldCAkd2lkZ2V0ID0gdGhpcy4kLmZpbmQoJy5XaWRnZXQnKS5maXJzdCgpO1xuICAgICAgICBpZiAoISR3aWRnZXQuZXhpc3RzKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB3aWRnZXRfY29tcG9uZW50ID0gJHdpZGdldC5jb21wb25lbnQoKTtcbiAgICAgICAgaWYgKCF3aWRnZXRfY29tcG9uZW50IHx8ICF3aWRnZXRfY29tcG9uZW50LnZhbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbCB0aGUgc2VlZGVyIGVuZHBvaW50IChBamF4IHJvdXRlIHJlZmVyZW5jZSBsaWtlIGZvcm0gJGFjdGlvbilcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGF3YWl0IEFqYXguY2FsbCh0aGlzLmFyZ3Muc2VlZGVyLCB7fSk7XG4gICAgICAgICAgICB3aWRnZXRfY29tcG9uZW50LnZhbCh2YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBTZWVkZXIgZXJyb3IgZm9yICR7dGhpcy5hcmdzLm5hbWV9OmAsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKlxuICogRm9ybV9GaWVsZFxuICpcbiAqIEZvcm0gZmllbGQgd3JhcHBlciB0aGF0IGFkZHMgbGFiZWxzLCBoZWxwIHRleHQsIGFuZCByZXF1aXJlZCBpbmRpY2F0b3JzLlxuICogU2VlIGZvcm1fZmllbGQuanFodG1sIGZvciBmdWxsIGRvY3VtZW50YXRpb24uXG4gKlxuICogRXh0ZW5kcyBGb3JtX0ZpZWxkX0Fic3RyYWN0IHRvIGluaGVyaXQgYWxsIGNvcmUgZnVuY3Rpb25hbGl0eS5cbiAqIFRoaXMgY2xhc3MgZXhpc3RzIHByaW1hcmlseSBmb3IgdGVtcGxhdGUgaW5oZXJpdGFuY2UgYW5kIGFueSBmdXR1cmVcbiAqIGZvcm1hdHRlZC1maWVsZC1zcGVjaWZpYyBiZWhhdmlvci5cbiAqL1xuY2xhc3MgRm9ybV9GaWVsZCBleHRlbmRzIEZvcm1fRmllbGRfQWJzdHJhY3Qge1xuICAgIC8vIEFsbCBmdW5jdGlvbmFsaXR5IGluaGVyaXRlZCBmcm9tIEZvcm1fRmllbGRfQWJzdHJhY3RcbiAgICAvLyBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBmb3JtYXR0ZWQgdmlzdWFsIHdyYXBwZXIgdmlhIGl0cyB0ZW1wbGF0ZVxufVxuIiwiLyoqXG4gKiBGb3JtX0hpZGRlbl9GaWVsZCAtIEhpZGRlbiBpbnB1dCBmaWVsZCBjb21wb25lbnRcbiAqXG4gKiBFeHRlbmRzIEZvcm1fRmllbGRfQWJzdHJhY3QgYnV0IElTIHRoZSBpbnB1dCBlbGVtZW50IGl0c2VsZiAodXNpbmcgdGFnPVwiaW5wdXRcIiB0eXBlPVwiaGlkZGVuXCIpLlxuICogU2VlIGZvcm1faGlkZGVuX2ZpZWxkLmpxaHRtbCBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLlxuICpcbiAqIEphdmFTY3JpcHQgUmVzcG9uc2liaWxpdGllczpcbiAqIC0gU2V0cyB2YWx1ZSBhdHRyaWJ1dGUgZHluYW1pY2FsbHkgaW4gb25fY3JlYXRlKClcbiAqIC0gT3ZlcnJpZGVzIG9uX3JlYWR5KCkgdG8gaGFuZGxlIHRoYXQgdGhpcy4kIElTIGJvdGggdGhlIHdpZGdldCBhbmQgdGhlIGlucHV0XG4gKiAtIFByb3ZpZGVzIHZhbCgpIG1ldGhvZCBmb3IgZ2V0dGluZy9zZXR0aW5nIHRoZSBoaWRkZW4gdmFsdWVcbiAqL1xuY2xhc3MgRm9ybV9IaWRkZW5fRmllbGQgZXh0ZW5kcyBGb3JtX0ZpZWxkX0Fic3RyYWN0IHtcbiAgICBvbl9jcmVhdGUoKSB7XG4gICAgICAgIC8vIENhbGwgcGFyZW50IHRvIHNldCB1cCBmb3JtIHJlZmVyZW5jZVxuICAgICAgICBzdXBlci5vbl9jcmVhdGUoKTtcblxuICAgICAgICAvLyBTZXQgaW5pdGlhbCB2YWx1ZSBhdHRyaWJ1dGUgKGNhbid0IGJlIGRvbmUgaW4gRGVmaW5lIHRhZylcbiAgICAgICAgdGhpcy4kLmF0dHIoJ3ZhbHVlJywgJycpO1xuICAgIH1cblxuICAgIG9uX3JlYWR5KCkge1xuICAgICAgICAvLyBPdmVycmlkZSBwYXJlbnQgb25fcmVhZHkoKSBiZWNhdXNlIHRoaXMuJCBJUyB0aGUgd2lkZ2V0IGFuZCB0aGUgaW5wdXRcbiAgICAgICAgLy8gU2V0IGRhdGEtbmFtZSBvbiB0aGlzLiQgKHdoaWNoIGlzIHRoZSBpbnB1dCBlbGVtZW50KVxuICAgICAgICB0aGlzLiQuYXR0cignZGF0YS1uYW1lJywgdGhpcy5hcmdzLm5hbWUpO1xuXG4gICAgICAgIC8vIFNldCBuYW1lIGF0dHJpYnV0ZSBvbiB0aGlzLiQgZm9yIEZvcm1fVXRpbHMgY29tcGF0aWJpbGl0eVxuICAgICAgICB0aGlzLiQuYXR0cignbmFtZScsIHRoaXMuYXJncy5uYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB2YWwoKSAtIEdldCBvciBzZXQgdGhlIGhpZGRlbiBpbnB1dCB2YWx1ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdIC0gSWYgcHJvdmlkZWQsIHNldHMgdGhlIHZhbHVlXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGN1cnJlbnQgdmFsdWUgd2hlbiBjYWxsZWQgYXMgZ2V0dGVyXG4gICAgICovXG4gICAgdmFsKHZhbHVlKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBHZXR0ZXIgLSB0aGlzLiQgaXMgdGhlIGlucHV0IGVsZW1lbnQgaXRzZWxmXG4gICAgICAgICAgICByZXR1cm4gdGhpcy4kLnZhbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gU2V0dGVyIC0gdXBkYXRlIHRoZSBpbnB1dCB2YWx1ZSBkaXJlY3RseSAodGhpcy4kIGlzIHRoZSBpbnB1dClcbiAgICAgICAgICAgIHRoaXMuJC52YWwodmFsdWUgfHwgJycpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyoqXG4gKiBTaWdudXBfSW5kZXhcbiAqXG4gKiBIYW5kbGVzIHNpZ251cCBmb3JtIHN1Y2Nlc3MgY2FsbGJhY2tcbiAqL1xuY2xhc3MgU2lnbnVwX0luZGV4IHtcbiAgICAvKipcbiAgICAgKiBIYW5kbGUgc3VjY2Vzc2Z1bCBzaWdudXBcbiAgICAgKiBTaG93cyB0aGUgY3JlYXRlZCB1c2VyIHJlY29yZCBhcyBKU09OIGFuZCBwcm92aWRlcyBuZXh0IHN0ZXBzXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIG9uX3N1Y2Nlc3MocmVzcG9uc2UpIHtcbiAgICAgICAgLy8gU2hvdyBzdWNjZXNzIG1lc3NhZ2Ugd2l0aCB1c2VyIGRhdGEgZm9yIG5vd1xuICAgICAgICAvLyBXaWxsIGV4cGFuZCB0byBlbWFpbCB2ZXJpZmljYXRpb24gZmxvdyBsYXRlclxuICAgICAgICBjb25zdCB1c2VyX2pzb24gPSBqc29uX2VuY29kZShyZXNwb25zZS51c2VyLCBudWxsLCAyKTtcblxuICAgICAgICBhd2FpdCBNb2RhbC5hbGVydChcbiAgICAgICAgICAgICdBY2NvdW50IENyZWF0ZWQnLFxuICAgICAgICAgICAgYFlvdXIgYWNjb3VudCBoYXMgYmVlbiBjcmVhdGVkIHN1Y2Nlc3NmdWxseSFcXG5cXG5Vc2VyIFJlY29yZDpcXG4ke3VzZXJfanNvbn1cXG5cXG4ke3Jlc3BvbnNlLm1lc3NhZ2UgfHwgJ1BsZWFzZSBjaGVjayB5b3VyIGVtYWlsIHRvIHZlcmlmeSB5b3VyIGFjY291bnQuJ31gXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmVkaXJlY3QgdG8gbG9naW4gcGFnZVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IFJzeC5Sb3V0ZSgnTG9naW5fQ29udHJvbGxlcicpO1xuICAgIH1cbn1cbiIsIi8qKlxuICogTG9naW4gZm9ybSBlbmhhbmNlbWVudFxuICpcbiAqIFByb3ZpZGVzIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gZm9yIHRoZSBsb2dpbiBmb3JtXG4gKi9cbmNsYXNzIExvZ2luX0luZGV4IHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSBsb2dpbiBwYWdlXG4gICAgICogVGhpcyBtZXRob2QgaXMgYXV0b21hdGljYWxseSBjYWxsZWQgYnkgUlNYIGZyYW1ld29yayBmb3IgYW55IGNsYXNzIHdpdGggYSBzdGF0aWMgb25fYXBwX3JlYWR5KCkgbWV0aG9kXG4gICAgICogTm8gbWFudWFsIHJlZ2lzdHJhdGlvbiBpcyByZXF1aXJlZFxuICAgICAqL1xuICAgIHN0YXRpYyBvbl9hcHBfcmVhZHkoKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIG9uIHRoaXMgc3BlY2lmaWMgcGFnZVxuICAgICAgICBpZiAoISQoJy5Mb2dpbl9JbmRleCcpLmV4aXN0cygpKSByZXR1cm47XG5cbiAgICAgICAgbGV0ICRmb3JtID0gJCgnI2xvZ2luLWZvcm0nKTtcbiAgICAgICAgbGV0ICRzdWJtaXRfYnV0dG9uID0gJCgnI2J0bi1zdWJtaXQnKTtcblxuICAgICAgICAvLyBBZGQgZm9ybSB2YWxpZGF0aW9uXG4gICAgICAgICRzdWJtaXRfYnV0dG9uLm9uKCdjbGljaycsIGFzeW5jIChlKSA9PiB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0ICRlbWFpbCA9ICRmb3JtLmZpbmQoJyNlbWFpbCcpO1xuICAgICAgICAgICAgY29uc3QgJHBhc3N3b3JkID0gJGZvcm0uZmluZCgnI3Bhc3N3b3JkJyk7XG5cbiAgICAgICAgICAgIC8vIEJ1aWxkIHZhbGlkYXRpb24gZXJyb3JzIG9iamVjdFxuICAgICAgICAgICAgY29uc3QgZXJyb3JzID0ge307XG5cbiAgICAgICAgICAgIGlmICghJGVtYWlsLnZhbCgpKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLmVtYWlsID0gJ0VtYWlsIGlzIHJlcXVpcmVkJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzX2VtYWlsKCRlbWFpbC52YWwoKSkpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMuZW1haWwgPSAnUGxlYXNlIGVudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzcyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghJHBhc3N3b3JkLnZhbCgpKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnBhc3N3b3JkID0gJ1Bhc3N3b3JkIGlzIHJlcXVpcmVkJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gZXJyb3JzLCBkaXNwbGF5IHRoZW1cbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBGb3JtX1V0aWxzLmFwcGx5X2Zvcm1fZXJyb3JzKCRmb3JtLCBlcnJvcnMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2xlYXIgYW55IHByZXZpb3VzIGVycm9ycyBhbmQgc3VibWl0IGZvcm1cbiAgICAgICAgICAgIEZvcm1fVXRpbHMucmVzZXRfZm9ybV9lcnJvcnMoJGZvcm0pO1xuXG4gICAgICAgICAgICAvLyBBbmQgYXdheSB3ZSBnb1xuICAgICAgICAgICAgJGZvcm0udHJpZ2dlcignc3VibWl0Jyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIi8qKlxuICogQWNjZXB0X0ludml0ZV9JbmRleFxuICpcbiAqIEhhbmRsZXMgaW52aXRhdGlvbiBhY2NlcHRhbmNlIHdvcmtmbG93XG4gKi9cbmNsYXNzIEFjY2VwdF9JbnZpdGVfSW5kZXgge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgd2hlbiBhcHAgaXMgcmVhZHlcbiAgICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSBieSBSU1ggZnJhbWV3b3JrXG4gICAgICovXG4gICAgc3RhdGljIG9uX2FwcF9yZWFkeSgpIHtcbiAgICAgICAgLy8gT25seSBpbml0aWFsaXplIGlmIHdlJ3JlIG9uIHRoaXMgdmlld1xuICAgICAgICBpZiAoISQoJy5BY2NlcHRfSW52aXRlX0luZGV4JykuZXhpc3RzKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJpbmQgYWNjZXB0IGJ1dHRvbiBjbGljayBoYW5kbGVyXG4gICAgICAgICQoJyNhY2NlcHQtYnRuJykuY2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29kZSA9ICQoJyNhY2NlcHQtYnRuJykuZGF0YSgnY29kZScpO1xuXG4gICAgICAgICAgICBpZiAoIWNvZGUpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBNb2RhbC5hbGVydCgnRXJyb3InLCAnTm8gaW52aXRhdGlvbiBjb2RlIGZvdW5kJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgQWNjZXB0X0ludml0ZV9Db250cm9sbGVyLmFjY2VwdCh7Y29kZTogY29kZX0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLl9zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlZGlyZWN0IHRvIHRoZSBzaXRlIGRhc2hib2FyZFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHJlc3BvbnNlLnJlZGlyZWN0X3VybDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBNb2RhbC5hbGVydCgnRXJyb3InLCByZXNwb25zZS5lcnJvciB8fCAnRmFpbGVkIHRvIGFjY2VwdCBpbnZpdGF0aW9uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBNb2RhbC5hbGVydCgnRXJyb3InLCAnQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgYWNjZXB0aW5nIHRoZSBpbnZpdGF0aW9uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIjwhLS1cbkNvbnRhY3RzX0RhdGFHcmlkXG5cbkN1c3RvbSBkYXRhZ3JpZCBmb3IgY29udGFjdHMgd2l0aCBzcGVjaWFsaXplZCByb3cgcmVuZGVyaW5nLlxuV3JhcHMgYmFzZSBEYXRhR3JpZCBjb21wb25lbnQuXG5cbkFSR1VNRU5UUzpcbiAgICAkYXBpIC0gQVBJIGNvbnRyb2xsZXIgY2xhc3Ncbi0tPlxuPERlZmluZTpEYXRhR3JpZF9BYnN0cmFjdCBjbGFzcz1cImNhcmQgRGF0YUdyaWRcIj5cblxuICAgIDxDYXJkX0hlYWRlcj5cbiAgICAgICAgPCU9IGNvbnRlbnQoJ0RHX0NhcmRfSGVhZGVyJyk7ICU+XG4gICAgPC9DYXJkX0hlYWRlcj5cblxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcC0wXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XG4gICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ob3ZlciBtYi0wXCI+XG4gICAgICAgICAgICAgICAgPHRoZWFkICRyZWRyYXdhYmxlICRpZD1cImRhdGFncmlkX3RhYmxlX2hlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8JT0gY29udGVudCgnREdfVGFibGVfSGVhZGVyJyk7ICU+XG4gICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICA8dGJvZHkgJHJlZHJhd2FibGUgJGlkPVwiZGF0YWdyaWRfdGFibGVfYm9keVwiIGNsYXNzPVwiPCU9ICh0aGlzLmRhdGEubG9hZGluZyAmJiB0aGlzLmRhdGEucm93cy5sZW5ndGggPT09IDApID8gJ2lzLWxvYWRpbmcnIDogKHRoaXMuZGF0YS5pc19lbXB0eSA/ICdpcy1lbXB0eScgOiAnJykgJT5cIj5cbiAgICAgICAgICAgICAgICAgICAgPCUgaWYgKHRoaXMuZGF0YS5sb2FkaW5nICYmIHRoaXMuZGF0YS5yb3dzLmxlbmd0aCA9PT0gMCkgeyAlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwibG9hZGluZy1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjk5OVwiIGNsYXNzPVwidGV4dC1jZW50ZXIgcHktNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgdGV4dC1wcmltYXJ5IG1iLTNcIiByb2xlPVwic3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPkxvYWRpbmcuLi48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbXV0ZWRcIj5Mb2FkaW5nLi4uPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8JSB9IGVsc2UgaWYgKHRoaXMuZGF0YS5pc19lbXB0eSkgeyAlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZW1wdHktcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCI5OTlcIiBjbGFzcz1cInRleHQtY2VudGVyIHB5LTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1pbmJveFwiIHN0eWxlPVwiZm9udC1zaXplOiAzcmVtOyBjb2xvcjogIzZjNzU3ZDtcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwlIGlmICh0aGlzLmRhdGEuZmlsdGVyKSB7ICU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbXV0ZWQgbXQtM1wiPk5vIHJlc3VsdHMgZm91bmQgZm9yIFwiPCU9IHRoaXMuZGF0YS5maWx0ZXIgJT5cIjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gJGlkPVwiY2xlYXJfZmlsdGVyX2J0blwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5IG10LTJcIj5DbGVhciBGaWx0ZXI8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCUgfSBlbHNlIHsgJT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1tdXRlZCBtdC0zXCI+Tm8gcmVzdWx0cyBmb3VuZDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCUgfSAlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8JSB9IGVsc2UgeyAlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCUgZm9yKGxldCByb3cgb2YgdGhpcy5kYXRhLnJvd3MpIHsgJT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8JT0gY29udGVudCgncm93Jywgcm93KTsgJT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICAgICAgICAgICAgPCUgfSAlPlxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxDYXJkX0Zvb3Rlcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93blwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBidG4tc20gZHJvcGRvd24tdG9nZ2xlXCIgdHlwZT1cImJ1dHRvblwiIGRhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIj5cbiAgICAgICAgICAgICAgICAgICAgQWN0aW9uc1xuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCI+RXhwb3J0IFNlbGVjdGVkPC9hPjwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDxsaT48YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiPkRlbGV0ZSBTZWxlY3RlZDwvYT48L2xpPlxuICAgICAgICAgICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aHIgY2xhc3M9XCJkcm9wZG93bi1kaXZpZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDxsaT48YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiPk1hcmsgYXMgQWN0aXZlPC9hPjwvbGk+XG4gICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPFBhZ2luYXRpb25fSW5mbyAkaWQ9XCJwYWdpbmF0aW9uX2luZm9cIj5cbiAgICAgICAgICAgICAgICA8JSBpZiAodGhpcy5kYXRhLnRvdGFsICYmIHRoaXMuZGF0YS5wYWdlICYmIHRoaXMuZGF0YS5wZXJfcGFnZSkgeyAlPlxuICAgICAgICAgICAgICAgICAgICA8JVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSAoKHRoaXMuZGF0YS5wYWdlIC0gMSkgKiB0aGlzLmRhdGEucGVyX3BhZ2UpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWluKHRoaXMuZGF0YS5wYWdlICogdGhpcy5kYXRhLnBlcl9wYWdlLCB0aGlzLmRhdGEudG90YWwpO1xuICAgICAgICAgICAgICAgICAgICAlPlxuICAgICAgICAgICAgICAgICAgICBTaG93aW5nIDwlPSBzdGFydCAlPiB0byA8JT0gZW5kICU+IG9mIDwlPSB0aGlzLmRhdGEudG90YWwgJT4gZW50cmllc1xuICAgICAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICAgIDwvUGFnaW5hdGlvbl9JbmZvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8UGFnaW5hdGlvbl9Db250cm9scyAkaWQ9XCJwYWdpbmF0aW9uX2NvbnRyb2xzXCI+XG4gICAgICAgICAgICA8JSBpZiAodGhpcy5kYXRhLnRvdGFsX3BhZ2VzICYmIHRoaXMuZGF0YS50b3RhbF9wYWdlcyA+IDEpIHsgJT5cbiAgICAgICAgICAgICAgICA8JVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50UGFnZSA9IHRoaXMuZGF0YS5wYWdlIHx8IDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsUGFnZXMgPSB0aGlzLmRhdGEudG90YWxfcGFnZXM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heFZpc2libGUgPSA3OyAvLyBNYXhpbXVtIHBhZ2UgbnVtYmVycyB0byBzaG93XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHBhZ2UgcmFuZ2UgdG8gZGlzcGxheVxuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnRQYWdlLCBlbmRQYWdlO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbFBhZ2VzIDw9IG1heFZpc2libGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3cgYWxsIHBhZ2VzIGlmIHRvdGFsIGlzIGxlc3MgdGhhbiBtYXhcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UGFnZSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRQYWdlID0gdG90YWxQYWdlcztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSByYW5nZSB3aXRoIGN1cnJlbnQgcGFnZSBuZWFyIGNlbnRlclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4UGFnZXNCZWZvcmVDdXJyZW50UGFnZSA9IE1hdGguZmxvb3IobWF4VmlzaWJsZSAvIDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4UGFnZXNBZnRlckN1cnJlbnRQYWdlID0gTWF0aC5jZWlsKG1heFZpc2libGUgLyAyKSAtIDE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UGFnZSA8PSBtYXhQYWdlc0JlZm9yZUN1cnJlbnRQYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVhciB0aGUgc3RhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBhZ2UgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFBhZ2UgPSBtYXhWaXNpYmxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50UGFnZSArIG1heFBhZ2VzQWZ0ZXJDdXJyZW50UGFnZSA+PSB0b3RhbFBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVhciB0aGUgZW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQYWdlID0gdG90YWxQYWdlcyAtIG1heFZpc2libGUgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFBhZ2UgPSB0b3RhbFBhZ2VzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGUgbWlkZGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQYWdlID0gY3VycmVudFBhZ2UgLSBtYXhQYWdlc0JlZm9yZUN1cnJlbnRQYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFBhZ2UgPSBjdXJyZW50UGFnZSArIG1heFBhZ2VzQWZ0ZXJDdXJyZW50UGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEdlbmVyYXRlIHBhZ2UgbnVtYmVycyBhcnJheVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRQYWdlOyBpIDw9IGVuZFBhZ2U7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZXMucHVzaChpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3dTdGFydEVsbGlwc2lzID0gc3RhcnRQYWdlID4gMTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvd0VuZEVsbGlwc2lzID0gZW5kUGFnZSA8IHRvdGFsUGFnZXM7XG4gICAgICAgICAgICAgICAgJT5cblxuICAgICAgICAgICAgICAgIDwlLS0gUHJldmlvdXMgYnV0dG9uIC0tJT5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwYWdlLWl0ZW0gPCU9IGN1cnJlbnRQYWdlID09PSAxID8gJ2Rpc2FibGVkJyA6ICcnICU+XCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwicGFnZS1saW5rXCIgaHJlZj1cIiNcIiBkYXRhLXBhZ2U9XCI8JT0gY3VycmVudFBhZ2UgLSAxICU+XCIgdGFiaW5kZXg9XCI8JT0gY3VycmVudFBhZ2UgPT09IDEgPyAnLTEnIDogJzAnICU+XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBQcmV2aW91c1xuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPC9saT5cblxuICAgICAgICAgICAgICAgIDwlLS0gRmlyc3QgcGFnZSArIGVsbGlwc2lzIC0tJT5cbiAgICAgICAgICAgICAgICA8JSBpZiAoc2hvd1N0YXJ0RWxsaXBzaXMpIHsgJT5cbiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicGFnZS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cInBhZ2UtbGlua1wiIGhyZWY9XCIjXCIgZGF0YS1wYWdlPVwiMVwiPjE8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInBhZ2UtaXRlbSBkaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWdlLWxpbmtcIj4uLi48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPCUgfSAlPlxuXG4gICAgICAgICAgICAgICAgPCUtLSBQYWdlIG51bWJlcnMgLS0lPlxuICAgICAgICAgICAgICAgIDwlIGZvciAobGV0IHBhZ2VOdW0gb2YgcGFnZXMpIHsgJT5cbiAgICAgICAgICAgICAgICAgICAgPCUgY29uc29sZS5sb2coXCJMb29wIGNoZWNrXCIsIHBhZ2VOdW0sIGN1cnJlbnRQYWdlKTsgJT5cbiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicGFnZS1pdGVtIDwlPSBwYWdlTnVtID09PSBjdXJyZW50UGFnZSA/ICdhY3RpdmUnIDogJycgJT5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwicGFnZS1saW5rXCIgaHJlZj1cIiNcIiBkYXRhLXBhZ2U9XCI8JT0gcGFnZU51bSAlPlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwlPSBwYWdlTnVtICU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPCUgfSAlPlxuXG4gICAgICAgICAgICAgICAgPCUtLSBFbGxpcHNpcyArIGxhc3QgcGFnZSAtLSU+XG4gICAgICAgICAgICAgICAgPCUgaWYgKHNob3dFbmRFbGxpcHNpcykgeyAlPlxuICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwYWdlLWl0ZW0gZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFnZS1saW5rXCI+Li4uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwYWdlLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwicGFnZS1saW5rXCIgaHJlZj1cIiNcIiBkYXRhLXBhZ2U9XCI8JT0gdG90YWxQYWdlcyAlPlwiPjwlPSB0b3RhbFBhZ2VzICU+PC9hPlxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDwlIH0gJT5cblxuICAgICAgICAgICAgICAgIDwlLS0gTmV4dCBidXR0b24gLS0lPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInBhZ2UtaXRlbSA8JT0gY3VycmVudFBhZ2UgPT09IHRvdGFsUGFnZXMgPyAnZGlzYWJsZWQnIDogJycgJT5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJwYWdlLWxpbmtcIiBocmVmPVwiI1wiIGRhdGEtcGFnZT1cIjwlPSBjdXJyZW50UGFnZSArIDEgJT5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIE5leHRcbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8JSB9ICU+XG4gICAgICAgIDwvUGFnaW5hdGlvbl9Db250cm9scz5cbiAgICA8L0NhcmRfRm9vdGVyPlxuXG48L0RlZmluZTpEYXRhR3JpZF9BYnN0cmFjdD4iLCI8RGVmaW5lOkFjdGlvbl9CdXR0b25fRGVsZXRlIHRhZz1cImJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGFuZ2VyXCIgdGl0bGU9XCJEZWxldGVcIj5cbiAgPGkgY2xhc3M9XCJiaSBiaS10cmFzaFwiPjwvaT5cbjwvRGVmaW5lOkFjdGlvbl9CdXR0b25fRGVsZXRlPlxuIiwiPERlZmluZTpBY3Rpb25fQnV0dG9uX0VkaXQgdGFnPVwiYVwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiB0aXRsZT1cIkVkaXRcIj5cbiAgPGkgY2xhc3M9XCJiaSBiaS1wZW5jaWxcIj48L2k+XG48L0RlZmluZTpBY3Rpb25fQnV0dG9uX0VkaXQ+XG4iLCI8RGVmaW5lOkFjdGlvbl9CdXR0b25fVmlldyB0YWc9XCJhXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiB0aXRsZT1cIlZpZXdcIj5cbiAgPGkgY2xhc3M9XCJiaSBiaS1leWVcIj48L2k+XG48L0RlZmluZTpBY3Rpb25fQnV0dG9uX1ZpZXc+XG4iLCI8RGVmaW5lOkFjdGl2aXR5X0ZlZWQgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIj5cbiAgPCUgaWYgKE9iamVjdC5rZXlzKHRoaXMuZGF0YSkubGVuZ3RoID09PSAwKSB7ICU+XG4gICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIHB5LTRcIj5cbiAgICAgIDxTcGlubmVyIC8+XG4gICAgICA8ZGl2IGNsYXNzPVwibXQtMiB0ZXh0LW11dGVkIHNtYWxsXCI+TG9hZGluZyBhY3Rpdml0eS4uLjwvZGl2PlxuICAgIDwvZGl2PlxuICA8JSB9IGVsc2UgaWYgKHRoaXMuZGF0YS5hY3Rpdml0aWVzICYmIHRoaXMuZGF0YS5hY3Rpdml0aWVzLmxlbmd0aCA9PT0gMCkgeyAlPlxuICAgIDxFbXB0eV9TdGF0ZVxuICAgICAgJGljb249XCJhY3Rpdml0eVwiXG4gICAgICAkdGl0bGU9XCJObyBhY3Rpdml0eSB5ZXRcIlxuICAgICAgJG1lc3NhZ2U9XCJBY3Rpdml0eSB3aWxsIGFwcGVhciBoZXJlXCJcbiAgICAvPlxuICA8JSB9IGVsc2UgeyAlPlxuICAgIDwlIGZvciAobGV0IGFjdGl2aXR5IG9mIHRoaXMuZGF0YS5hY3Rpdml0aWVzIHx8IFtdKSB7ICU+XG4gICAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGQtZmxleCBnYXAtMyBweS0zXCI+XG4gICAgICAgIDwlIGlmIChhY3Rpdml0eS5hdmF0YXIpIHsgJT5cbiAgICAgICAgICA8QXZhdGFyICRzcmM9YWN0aXZpdHkuYXZhdGFyICRzaXplPVwic21cIiAvPlxuICAgICAgICA8JSB9IGVsc2UgeyAlPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3VuZGVkLWNpcmNsZSBiZy1wcmltYXJ5IHRleHQtd2hpdGUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgc3R5bGU9XCJ3aWR0aDogMzJweDsgaGVpZ2h0OiAzMnB4OyBmbGV4LXNocmluazogMDtcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktPCU9IGFjdGl2aXR5Lmljb24gfHwgJ2FjdGl2aXR5JyAlPlwiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCUgfSAlPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTFcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLXN0YXJ0XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8c3Ryb25nPjwlPSBhY3Rpdml0eS51c2VyX25hbWUgJT48L3N0cm9uZz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkXCI+PCU9IGFjdGl2aXR5LmFjdGlvbiAlPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1tdXRlZFwiPjwlPSBhY3Rpdml0eS50aW1lX2FnbyAlPjwvc21hbGw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCUgaWYgKGFjdGl2aXR5LmRlc2NyaXB0aW9uKSB7ICU+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbCBtdC0xXCI+PCU9IGFjdGl2aXR5LmRlc2NyaXB0aW9uICU+PC9kaXY+XG4gICAgICAgICAgPCUgfSAlPlxuICAgICAgICAgIDwlIGlmIChhY3Rpdml0eS5tZXRhZGF0YSkgeyAlPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIj5cbiAgICAgICAgICAgICAgPCUgZm9yIChsZXQga2V5IGluIGFjdGl2aXR5Lm1ldGFkYXRhKSB7ICU+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1saWdodCB0ZXh0LWRhcmsgbWUtMVwiPlxuICAgICAgICAgICAgICAgICAgPCU9IGtleSAlPjogPCU9IGFjdGl2aXR5Lm1ldGFkYXRhW2tleV0gJT5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8JSB9ICU+XG4gIDwlIH0gJT5cbjwvRGVmaW5lOkFjdGl2aXR5X0ZlZWQ+XG4iLCI8RGVmaW5lOkFjdG9yX1JlZmVyZW5jZSB0YWc9XCJzbWFsbFwiIGNsYXNzPVwidGV4dC1tdXRlZCBkLWJsb2NrIG10LTFcIj5cbiAgPCU9IGNvbnRlbnQoKSAlPlxuPC9EZWZpbmU6QWN0b3JfUmVmZXJlbmNlPlxuIiwiPERlZmluZTpBZHZhbmNlZF9TZWFyY2hfUGFuZWwgY2xhc3M9XCJjYXJkXCI+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgPGg1IGNsYXNzPVwibWItMFwiPkFkdmFuY2VkIFNlYXJjaDwvaDU+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiAkaWQ9XCJjbG9zZV9idG5cIj48L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cbiAgICA8Zm9ybSAkaWQ9XCJzZWFyY2hfZm9ybVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxuICAgICAgICAgIDxJbnB1dF9XaXRoX1ZhbGlkYXRpb25cbiAgICAgICAgICAgICRsYWJlbD1cIktleXdvcmRzXCJcbiAgICAgICAgICAgICRwbGFjZWhvbGRlcj1cIlNlYXJjaCBrZXl3b3Jkcy4uLlwiXG4gICAgICAgICAgICAkbmFtZT1cImtleXdvcmRzXCJcbiAgICAgICAgICAgICRpZD1cImtleXdvcmRzXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgICAgICAgPFNlYXJjaGFibGVfU2VsZWN0XG4gICAgICAgICAgICAkbGFiZWw9XCJDYXRlZ29yeVwiXG4gICAgICAgICAgICAkcGxhY2Vob2xkZXI9XCJTZWxlY3QgY2F0ZWdvcnlcIlxuICAgICAgICAgICAgJGlkPVwiY2F0ZWdvcnlcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgICAgICA8TXVsdGlfU2VsZWN0XG4gICAgICAgICAgICAkbGFiZWw9XCJUYWdzXCJcbiAgICAgICAgICAgICRwbGFjZWhvbGRlcj1cIlNlbGVjdCB0YWdzXCJcbiAgICAgICAgICAgICRpZD1cInRhZ3NcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgICAgICA8RGF0ZV9QaWNrZXJcbiAgICAgICAgICAgICRsYWJlbD1cIkZyb20gRGF0ZVwiXG4gICAgICAgICAgICAkaWQ9XCJmcm9tX2RhdGVcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgICAgICA8RGF0ZV9QaWNrZXJcbiAgICAgICAgICAgICRsYWJlbD1cIlRvIERhdGVcIlxuICAgICAgICAgICAgJGlkPVwidG9fZGF0ZVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+U29ydCBCeTwvbGFiZWw+XG4gICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgJGlkPVwic29ydF9ieVwiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInJlbGV2YW5jZVwiPlJlbGV2YW5jZTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImRhdGVcIj5EYXRlPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwidGl0bGVcIj5UaXRsZTwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCI+XG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgJGlkPVwiZXhhY3RfbWF0Y2hcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIj5cbiAgICAgICAgICAgICAgRXhhY3QgbWF0Y2ggb25seVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Zvcm0+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XG4gICAgPEJ1dHRvbl9TZWNvbmRhcnkgJGlkPVwicmVzZXRfYnRuXCI+UmVzZXQ8L0J1dHRvbl9TZWNvbmRhcnk+XG4gICAgPEJ1dHRvbl9QcmltYXJ5ICRpZD1cInNlYXJjaF9idG5cIj5TZWFyY2g8L0J1dHRvbl9QcmltYXJ5PlxuICA8L2Rpdj5cbjwvRGVmaW5lOkFkdmFuY2VkX1NlYXJjaF9QYW5lbD5cbiIsIjxEZWZpbmU6QWxlcnRfQmFubmVyIGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBhbGVydC1kaXNtaXNzaWJsZSBmYWRlIHNob3dcIiByb2xlPVwiYWxlcnRcIj5cbiAgPCU9IGNvbnRlbnQoKSAlPlxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtYnMtZGlzbWlzcz1cImFsZXJ0XCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XG48L0RlZmluZTpBbGVydF9CYW5uZXI+XG4iLCI8RGVmaW5lOkF2YXRhciB0YWc9XCJpbWdcIiBjbGFzcz1cInJvdW5kZWQtY2lyY2xlXCIgYWx0PVwiVXNlciBhdmF0YXJcIj5cbjwvRGVmaW5lOkF2YXRhcj5cbiIsIjxEZWZpbmU6QmxvY2txdW90ZSB0YWc9XCJibG9ja3F1b3RlXCIgY2xhc3M9XCJibG9ja3F1b3RlXCI+XG4gIDwlPSBjb250ZW50KCkgJT5cbjwvRGVmaW5lOkJsb2NrcXVvdGU+XG4iLCI8RGVmaW5lOkJyZWFkY3J1bWJzIHRhZz1cIm5hdlwiIGFyaWEtbGFiZWw9XCJicmVhZGNydW1iXCI+XG4gIDxvbCBjbGFzcz1cImJyZWFkY3J1bWIgbWItMFwiPlxuICAgIDwlPSBjb250ZW50KCkgJT5cbiAgPC9vbD5cbjwvRGVmaW5lOkJyZWFkY3J1bWJzPlxuIiwiPERlZmluZTpCdWxrX0FjdGlvbl9CYXIgY2xhc3M9XCJhbGVydCBhbGVydC1wcmltYXJ5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbWItM1wiIHJvbGU9XCJhbGVydFwiPlxuICA8ZGl2PlxuICAgIDxzdHJvbmcgY2xhc3M9XCJjb3VudFwiPjA8L3N0cm9uZz4gaXRlbXMgc2VsZWN0ZWRcbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTJcIj5cbiAgICA8JT0gY29udGVudCgpICU+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiAkaWQ9XCJjbG9zZV9idG5cIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cbiAgPC9kaXY+XG48L0RlZmluZTpCdWxrX0FjdGlvbl9CYXI+XG4iLCI8RGVmaW5lOkJ1bGtfU2VsZWN0aW9uIGNsYXNzPVwiZm9ybS1jaGVja1wiPlxuICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCJcbiAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAkaWQ9XCJjaGVja2JveFwiXG4gICAgICAgICBhcmlhLWxhYmVsPVwiU2VsZWN0IGFsbFwiIC8+XG48L0RlZmluZTpCdWxrX1NlbGVjdGlvbj5cbiIsIjxEZWZpbmU6QnV0dG9uX0dyb3VwIGNsYXNzPVwiYnRuLWdyb3VwXCIgcm9sZT1cImdyb3VwXCI+XG4gIDwlPSBjb250ZW50KCkgJT5cbjwvRGVmaW5lOkJ1dHRvbl9Hcm91cD5cbiIsIjxEZWZpbmU6QnV0dG9uX1ByaW1hcnkgdGFnPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCI+XG4gIDwlPSBjb250ZW50KCkgJT5cbjwvRGVmaW5lOkJ1dHRvbl9QcmltYXJ5PlxuIiwiPERlZmluZTpCdXR0b25fU2Vjb25kYXJ5IHRhZz1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiB0eXBlPVwiYnV0dG9uXCI+XG4gIDwlPSBjb250ZW50KCkgJT5cbjwvRGVmaW5lOkJ1dHRvbl9TZWNvbmRhcnk+XG4iLCI8RGVmaW5lOkJ1dHRvbiB0YWc9XCJidXR0b25cIiBjbGFzcz1cImJ0blwiIHR5cGU9XCJidXR0b25cIj5cbiAgPCU9IGNvbnRlbnQoKSAlPlxuPC9EZWZpbmU6QnV0dG9uPlxuIiwiPERlZmluZTpDYWxlbmRhcl9FdmVudCBjbGFzcz1cImNhcmQgbWItMlwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiPlxuICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHAtMlwiPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtc3RhcnQgZ2FwLTJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJiZy08JT0gdGhpcy5hcmdzLmNvbG9yIHx8ICdwcmltYXJ5JyAlPiByb3VuZGVkXCIgc3R5bGU9XCJ3aWR0aDogNHB4OyBoZWlnaHQ6IDEwMCU7IG1pbi1oZWlnaHQ6IDQwcHg7XCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZ3LWJvbGQgc21hbGxcIj48JT0gdGhpcy5hcmdzLnRpdGxlICU+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCI+XG4gICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1jbG9jayBtZS0xXCI+PC9pPlxuICAgICAgICAgIDwlPSB0aGlzLmFyZ3MudGltZSAlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCUgaWYgKHRoaXMuYXJncy5sb2NhdGlvbikgeyAlPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWdlby1hbHQgbWUtMVwiPjwvaT5cbiAgICAgICAgICAgIDwlPSB0aGlzLmFyZ3MubG9jYXRpb24gJT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCUgfSAlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9EZWZpbmU6Q2FsZW5kYXJfRXZlbnQ+XG4iLCI8RGVmaW5lOkNhbGVuZGFyX0dyaWQgY2xhc3M9XCJjYXJkXCI+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBidG4tZ3JvdXAtc21cIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiAkaWQ9XCJwcmV2X2J0blwiPlxuICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWNoZXZyb24tbGVmdFwiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiICRpZD1cInRvZGF5X2J0blwiPlRvZGF5PC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgJGlkPVwibmV4dF9idG5cIj5cbiAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1jaGV2cm9uLXJpZ2h0XCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGg1IGNsYXNzPVwibWItMFwiICRpZD1cIm1vbnRoX3RpdGxlXCI+PC9oNT5cbiAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGJ0bi1ncm91cC1zbVwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIGRhdGEtdmlldz1cIm1vbnRoXCI+TW9udGg8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiBkYXRhLXZpZXc9XCJ3ZWVrXCI+V2VlazwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTBcIj5cbiAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ib3JkZXJlZCBtYi0wXCI+XG4gICAgICA8dGhlYWQgY2xhc3M9XCJ0YWJsZS1saWdodFwiPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5TdW48L3RoPlxuICAgICAgICAgIDx0aCBjbGFzcz1cInRleHQtY2VudGVyXCI+TW9uPC90aD5cbiAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlR1ZTwvdGg+XG4gICAgICAgICAgPHRoIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5XZWQ8L3RoPlxuICAgICAgICAgIDx0aCBjbGFzcz1cInRleHQtY2VudGVyXCI+VGh1PC90aD5cbiAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPkZyaTwvdGg+XG4gICAgICAgICAgPHRoIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5TYXQ8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keSAkaWQ9XCJjYWxlbmRhcl9ib2R5XCI+XG4gICAgICAgIDwhLS0gR2VuZXJhdGVkIHZpYSBKYXZhU2NyaXB0IC0tPlxuICAgICAgPC90Ym9keT5cbiAgICA8L3RhYmxlPlxuICA8L2Rpdj5cbjwvRGVmaW5lOkNhbGVuZGFyX0dyaWQ+XG4iLCI8RGVmaW5lOkNhcmRfRm9vdGVyIGNsYXNzPVwiY2FyZC1mb290ZXIgYmctbGlnaHRcIj5cbiAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICA8JT0gY29udGVudCgpICU+XG4gIDwvZGl2PlxuPC9EZWZpbmU6Q2FyZF9Gb290ZXI+XG4iLCI8RGVmaW5lOkNhcmRfSGVhZGVyIGNsYXNzPVwiY2FyZC1oZWFkZXIgYmctbGlnaHRcIj5cbiAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICA8JT0gY29udGVudCgpICU+XG4gIDwvZGl2PlxuPC9EZWZpbmU6Q2FyZF9IZWFkZXI+XG4iLCI8RGVmaW5lOkNhcmRfVGl0bGUgdGFnPVwiaDVcIiBjbGFzcz1cIm1iLTBcIj5cblxuICAgIDwlPSBjb250ZW50KCkgJT5cblxuPC9EZWZpbmU6Q2FyZF9UaXRsZT4iLCI8RGVmaW5lOkNhcmQgY2xhc3M9XCJjYXJkXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG4gICAgICAgIDwlPSBjb250ZW50KCkgJT5cbiAgICA8L2Rpdj5cblxuPC9EZWZpbmU6Q2FyZD5cbiIsIjxEZWZpbmU6Q2hhcnRfQ29tcG9uZW50IGNsYXNzPVwiY2hhcnQtcGxhY2Vob2xkZXIgYmctbGlnaHQgcm91bmRlZCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIHRleHQtbXV0ZWQgcC01XCI+XG4gICAgPGkgY2xhc3M9XCJiaSBiaS1ncmFwaC11cCBmcy0xIGQtYmxvY2sgbWItMlwiPjwvaT5cbiAgICA8cCBjbGFzcz1cIm1iLTBcIj5DaGFydCBDb21wb25lbnQ8L3A+XG4gICAgPHNtYWxsPlBsYWNlaG9sZGVyIGZvciBmdXR1cmUgY2hhcnQgaW50ZWdyYXRpb248L3NtYWxsPlxuICA8L2Rpdj5cbjwvRGVmaW5lOkNoYXJ0X0NvbXBvbmVudD5cbiIsIjxEZWZpbmU6Q2hlY2tib3ggdGFnPVwiaW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIj5cbjwvRGVmaW5lOkNoZWNrYm94PlxuIiwiPERlZmluZTpDb2RlX0Jsb2NrIHRhZz1cInByZVwiIGNsYXNzPVwicC0zIGJnLWRhcmsgdGV4dC1saWdodCByb3VuZGVkXCI+XG4gIDxjb2RlPjwlPSBjb250ZW50KCkgJT48L2NvZGU+XG48L0RlZmluZTpDb2RlX0Jsb2NrPlxuIiwiPERlZmluZTpDb2x1bW5fVmlzaWJpbGl0eV9Ub2dnbGUgY2xhc3M9XCJkcm9wZG93blwiPlxuICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtIGRyb3Bkb3duLXRvZ2dsZVwiIHR5cGU9XCJidXR0b25cIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCI+XG4gICAgPGkgY2xhc3M9XCJiaSBiaS1jb2x1bW5zXCI+PC9pPiBDb2x1bW5zXG4gIDwvYnV0dG9uPlxuICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51IGRyb3Bkb3duLW1lbnUtZW5kXCIgJGlkPVwibWVudVwiPlxuICAgIDwhLS0gRHluYW1pY2FsbHkgcG9wdWxhdGVkIHZpYSBKYXZhU2NyaXB0IC0tPlxuICA8L3VsPlxuPC9EZWZpbmU6Q29sdW1uX1Zpc2liaWxpdHlfVG9nZ2xlPlxuIiwiPERlZmluZTpDb21tZW50X1RocmVhZCBjbGFzcz1cImNhcmRcIj5cbiAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICA8aDUgY2xhc3M9XCJtYi0wXCI+Q29tbWVudHMgKDxzcGFuICRpZD1cImNvbW1lbnRfY291bnRcIj48JT0gKHRoaXMuZGF0YS5jb21tZW50cyB8fCBbXSkubGVuZ3RoICU+PC9zcGFuPik8L2g1PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxuICAgIDxkaXYgJGlkPVwiY29tbWVudHNcIj5cbiAgICAgIDwlIGlmIChPYmplY3Qua2V5cyh0aGlzLmRhdGEpLmxlbmd0aCA9PT0gMCkgeyAlPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgcHktNFwiPlxuICAgICAgICAgIDxTcGlubmVyIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPCUgfSBlbHNlIGlmICh0aGlzLmRhdGEuY29tbWVudHMgJiYgdGhpcy5kYXRhLmNvbW1lbnRzLmxlbmd0aCA9PT0gMCkgeyAlPlxuICAgICAgICA8RW1wdHlfU3RhdGVcbiAgICAgICAgICAkaWNvbj1cImNoYXQtbGVmdC10ZXh0XCJcbiAgICAgICAgICAkdGl0bGU9XCJObyBjb21tZW50cyB5ZXRcIlxuICAgICAgICAgICRtZXNzYWdlPVwiQmUgdGhlIGZpcnN0IHRvIGNvbW1lbnRcIlxuICAgICAgICAvPlxuICAgICAgPCUgfSBlbHNlIHsgJT5cbiAgICAgICAgPCUgZm9yIChsZXQgY29tbWVudCBvZiB0aGlzLmRhdGEuY29tbWVudHMgfHwgW10pIHsgJT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0zIG1iLTRcIiBkYXRhLWNvbW1lbnQtaWQ9XCI8JT0gY29tbWVudC5pZCAlPlwiPlxuICAgICAgICAgICAgPEF2YXRhciAkc3JjPWNvbW1lbnQuYXZhdGFyICRuYW1lPWNvbW1lbnQudXNlcl9uYW1lICRzaXplPVwic21cIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZy1saWdodCByb3VuZGVkIHAtM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtc3RhcnQgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgPHN0cm9uZz48JT0gY29tbWVudC51c2VyX25hbWUgJT48L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIj48JT0gY29tbWVudC50aW1lX2FnbyAlPjwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj48JT0gY29tbWVudC50ZXh0ICU+PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpbmsgYnRuLXNtIHAtMCBtZS0zIHJlcGx5LWJ0blwiPlJlcGx5PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPCUgaWYgKGNvbW1lbnQuY2FuX2VkaXQpIHsgJT5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpbmsgYnRuLXNtIHAtMCBtZS0zIGVkaXQtYnRuXCI+RWRpdDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICAgICAgICA8JSBpZiAoY29tbWVudC5jYW5fZGVsZXRlKSB7ICU+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1zbSBwLTAgdGV4dC1kYW5nZXIgZGVsZXRlLWJ0blwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwlIGlmIChjb21tZW50LnJlcGxpZXMgJiYgY29tbWVudC5yZXBsaWVzLmxlbmd0aCA+IDApIHsgJT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXMtNCBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICA8JSBmb3IgKGxldCByZXBseSBvZiBjb21tZW50LnJlcGxpZXMpIHsgJT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMyBtYi0zXCIgZGF0YS1jb21tZW50LWlkPVwiPCU9IHJlcGx5LmlkICU+XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPEF2YXRhciAkc3JjPXJlcGx5LmF2YXRhciAkbmFtZT1yZXBseS51c2VyX25hbWUgJHNpemU9XCJ4c1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmctbGlnaHQgcm91bmRlZCBwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1zdGFydCBtYi0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZyBjbGFzcz1cInNtYWxsXCI+PCU9IHJlcGx5LnVzZXJfbmFtZSAlPjwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIj48JT0gcmVwbHkudGltZV9hZ28gJT48L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtYWxsXCI+PCU9IHJlcGx5LnRleHQgJT48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPCUgfSAlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwlIH0gJT5cbiAgICAgIDwlIH0gJT5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTmV3IGNvbW1lbnQgZm9ybSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibXQtNCBwdC00IGJvcmRlci10b3BcIiAkaWQ9XCJuZXdfY29tbWVudF9mb3JtXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0zXCI+XG4gICAgICAgIDxBdmF0YXIgJHNyYz10aGlzLmFyZ3MuY3VycmVudF91c2VyX2F2YXRhciAkbmFtZT10aGlzLmFyZ3MuY3VycmVudF91c2VyX25hbWUgJHNpemU9XCJzbVwiIC8+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMVwiPlxuICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbCBtYi0yXCIgcm93cz1cIjNcIiBwbGFjZWhvbGRlcj1cIldyaXRlIGEgY29tbWVudC4uLlwiICRpZD1cImNvbW1lbnRfaW5wdXRcIj48L3RleHRhcmVhPlxuICAgICAgICAgIDxCdXR0b25fUHJpbWFyeSAkaWQ9XCJzdWJtaXRfYnRuXCI+UG9zdCBDb21tZW50PC9CdXR0b25fUHJpbWFyeT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L0RlZmluZTpDb21tZW50X1RocmVhZD5cbiIsIjxEZWZpbmU6Q29udGFjdF9BY3Rpb25zIHRhZz1cInRkXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGJ0bi1ncm91cC1zbVwiPlxuICAgICAgICA8JT0gY29udGVudCgpICU+XG4gICAgPC9kaXY+XG5cbjwvRGVmaW5lOkNvbnRhY3RfQWN0aW9ucz5cbiIsIjxEZWZpbmU6Q29udGFjdF9Sb3cgdGFnPVwidHJcIj5cbiAgPCU9IGNvbnRlbnQoKSAlPlxuPC9EZWZpbmU6Q29udGFjdF9Sb3c+XG4iLCI8RGVmaW5lOkNvbnRhY3RzX0RhdGFfVGFibGUgdGFnPVwiZGl2XCIgY2xhc3M9XCJjYXJkLWJvZHkgcC0wXCI+XG4gIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XG4gICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtaG92ZXIgbWItMFwiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDQwcHg7XCI+PGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIC8+PC90aD5cbiAgICAgICAgICA8dGg+SUQ8L3RoPlxuICAgICAgICAgIDx0aD5OYW1lPC90aD5cbiAgICAgICAgICA8dGg+RW1haWw8L3RoPlxuICAgICAgICAgIDx0aD5QaG9uZTwvdGg+XG4gICAgICAgICAgPHRoPkNvbXBhbnk8L3RoPlxuICAgICAgICAgIDx0aD5Sb2xlPC90aD5cbiAgICAgICAgICA8dGg+U3RhdHVzPC90aD5cbiAgICAgICAgICA8dGg+Q3JlYXRlZDwvdGg+XG4gICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDEwMHB4O1wiPkFjdGlvbnM8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keT5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0ZD48aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgLz48L3RkPlxuICAgICAgICAgIDx0ZD48YSBocmVmPVwiPCU9IFJzeC5Sb3V0ZSgnRnJvbnRlbmRfQ29udGFjdHNfVmlld19Db250cm9sbGVyJykgJT5cIj4jQ1QwMDE8L2E+PC90ZD5cbiAgICAgICAgICA8dGQ+PGEgaHJlZj1cIjwlPSBSc3guUm91dGUoJ0Zyb250ZW5kX0NvbnRhY3RzX1ZpZXdfQ29udHJvbGxlcicpICU+XCI+SmFuZSBTbWl0aDwvYT48L3RkPlxuICAgICAgICAgIDx0ZD48YSBocmVmPVwiPCU9IFJzeC5Sb3V0ZSgnRnJvbnRlbmRfQ29udGFjdHNfVmlld19Db250cm9sbGVyJykgJT5cIj5qYW5lQGFjbWUuY29tPC9hPjwvdGQ+XG4gICAgICAgICAgPHRkPig1NTUpIDEyMy00NTY3PC90ZD5cbiAgICAgICAgICA8dGQ+QWNtZSBDb3Jwb3JhdGlvbjwvdGQ+XG4gICAgICAgICAgPHRkPkNFTzwvdGQ+XG4gICAgICAgICAgPHRkPjxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctc3VjY2Vzc1wiPkFjdGl2ZTwvc3Bhbj48L3RkPlxuICAgICAgICAgIDx0ZD5KYW4gMTUsIDIwMjQ8L3RkPlxuICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgYnRuLWdyb3VwLXNtXCI+XG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgaHJlZj1cIjwlPSBSc3guUm91dGUoJ0Zyb250ZW5kX0NvbnRhY3RzX1ZpZXdfQ29udHJvbGxlcicpICU+XCIgdGl0bGU9XCJWaWV3XCI+PGkgY2xhc3M9XCJiaSBiaS1leWVcIj48L2k+PC9hPlxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgaHJlZj1cIiNcIiB0aXRsZT1cIkVkaXRcIj48aSBjbGFzcz1cImJpIGJpLXBlbmNpbFwiPjwvaT48L2E+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIHR5cGU9XCJidXR0b25cIiB0aXRsZT1cIkRlbGV0ZVwiPjxpIGNsYXNzPVwiYmkgYmktdHJhc2hcIj48L2k+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkPjxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiAvPjwvdGQ+XG4gICAgICAgICAgPHRkPiNDVDAwMjwvdGQ+XG4gICAgICAgICAgPHRkPkJvYiBKb2huc29uPC90ZD5cbiAgICAgICAgICA8dGQ+Ym9iQHRlY2hzb2x1dGlvbnMuaW88L3RkPlxuICAgICAgICAgIDx0ZD4oNTU1KSAyMzQtNTY3ODwvdGQ+XG4gICAgICAgICAgPHRkPlRlY2ggU29sdXRpb25zIEluYzwvdGQ+XG4gICAgICAgICAgPHRkPkNUTzwvdGQ+XG4gICAgICAgICAgPHRkPjxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctc3VjY2Vzc1wiPkFjdGl2ZTwvc3Bhbj48L3RkPlxuICAgICAgICAgIDx0ZD5KYW4gMTgsIDIwMjQ8L3RkPlxuICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgYnRuLWdyb3VwLXNtXCI+XG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgaHJlZj1cIjwlPSBSc3guUm91dGUoJ0Zyb250ZW5kX0NvbnRhY3RzX1ZpZXdfQ29udHJvbGxlcicpICU+XCIgdGl0bGU9XCJWaWV3XCI+PGkgY2xhc3M9XCJiaSBiaS1leWVcIj48L2k+PC9hPlxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgaHJlZj1cIiNcIiB0aXRsZT1cIkVkaXRcIj48aSBjbGFzcz1cImJpIGJpLXBlbmNpbFwiPjwvaT48L2E+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIHR5cGU9XCJidXR0b25cIiB0aXRsZT1cIkRlbGV0ZVwiPjxpIGNsYXNzPVwiYmkgYmktdHJhc2hcIj48L2k+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkPjxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiAvPjwvdGQ+XG4gICAgICAgICAgPHRkPiNDVDAwMzwvdGQ+XG4gICAgICAgICAgPHRkPlNhcmFoIFdpbHNvbjwvdGQ+XG4gICAgICAgICAgPHRkPnNhcmFoQGdsb2JhbGVudC5jb208L3RkPlxuICAgICAgICAgIDx0ZD4oNTU1KSAzNDUtNjc4OTwvdGQ+XG4gICAgICAgICAgPHRkPkdsb2JhbCBFbnRlcnByaXNlczwvdGQ+XG4gICAgICAgICAgPHRkPlByb2plY3QgTWFuYWdlcjwvdGQ+XG4gICAgICAgICAgPHRkPjxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctd2FybmluZ1wiPlBlbmRpbmc8L3NwYW4+PC90ZD5cbiAgICAgICAgICA8dGQ+RmViIDAyLCAyMDI0PC90ZD5cbiAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGJ0bi1ncm91cC1zbVwiPlxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIGhyZWY9XCI8JT0gUnN4LlJvdXRlKCdGcm9udGVuZF9Db250YWN0c19WaWV3X0NvbnRyb2xsZXInKSAlPlwiIHRpdGxlPVwiVmlld1wiPjxpIGNsYXNzPVwiYmkgYmktZXllXCI+PC9pPjwvYT5cbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIGhyZWY9XCIjXCIgdGl0bGU9XCJFZGl0XCI+PGkgY2xhc3M9XCJiaSBiaS1wZW5jaWxcIj48L2k+PC9hPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIiB0eXBlPVwiYnV0dG9uXCIgdGl0bGU9XCJEZWxldGVcIj48aSBjbGFzcz1cImJpIGJpLXRyYXNoXCI+PC9pPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0ZD48aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgLz48L3RkPlxuICAgICAgICAgIDx0ZD4jQ1QwMDQ8L3RkPlxuICAgICAgICAgIDx0ZD5NaWNoYWVsIEJyb3duPC90ZD5cbiAgICAgICAgICA8dGQ+bWJyb3duQGlubm92YXRpb24uY288L3RkPlxuICAgICAgICAgIDx0ZD4oNTU1KSA0NTYtNzg5MDwvdGQ+XG4gICAgICAgICAgPHRkPlN0YXJ0VXAgSW5ub3ZhdGlvbnM8L3RkPlxuICAgICAgICAgIDx0ZD5EZXZlbG9wZXI8L3RkPlxuICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz1cImJhZGdlIGJnLXN1Y2Nlc3NcIj5BY3RpdmU8L3NwYW4+PC90ZD5cbiAgICAgICAgICA8dGQ+RmViIDEwLCAyMDI0PC90ZD5cbiAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGJ0bi1ncm91cC1zbVwiPlxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIGhyZWY9XCI8JT0gUnN4LlJvdXRlKCdGcm9udGVuZF9Db250YWN0c19WaWV3X0NvbnRyb2xsZXInKSAlPlwiIHRpdGxlPVwiVmlld1wiPjxpIGNsYXNzPVwiYmkgYmktZXllXCI+PC9pPjwvYT5cbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIGhyZWY9XCIjXCIgdGl0bGU9XCJFZGl0XCI+PGkgY2xhc3M9XCJiaSBiaS1wZW5jaWxcIj48L2k+PC9hPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIiB0eXBlPVwiYnV0dG9uXCIgdGl0bGU9XCJEZWxldGVcIj48aSBjbGFzcz1cImJpIGJpLXRyYXNoXCI+PC9pPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0ZD48aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgLz48L3RkPlxuICAgICAgICAgIDx0ZD4jQ1QwMDU8L3RkPlxuICAgICAgICAgIDx0ZD5FbWlseSBEYXZpczwvdGQ+XG4gICAgICAgICAgPHRkPmVtaWx5QHdpbHNvbi5jb208L3RkPlxuICAgICAgICAgIDx0ZD4oNTU1KSA1NjctODkwMTwvdGQ+XG4gICAgICAgICAgPHRkPldpbHNvbiAmIEFzc29jaWF0ZXM8L3RkPlxuICAgICAgICAgIDx0ZD5NYXJrZXRpbmcgRGlyZWN0b3I8L3RkPlxuICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz1cImJhZGdlIGJnLWRhbmdlclwiPlN1c3BlbmRlZDwvc3Bhbj48L3RkPlxuICAgICAgICAgIDx0ZD5GZWIgMTUsIDIwMjQ8L3RkPlxuICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgYnRuLWdyb3VwLXNtXCI+XG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgaHJlZj1cIjwlPSBSc3guUm91dGUoJ0Zyb250ZW5kX0NvbnRhY3RzX1ZpZXdfQ29udHJvbGxlcicpICU+XCIgdGl0bGU9XCJWaWV3XCI+PGkgY2xhc3M9XCJiaSBiaS1leWVcIj48L2k+PC9hPlxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgaHJlZj1cIiNcIiB0aXRsZT1cIkVkaXRcIj48aSBjbGFzcz1cImJpIGJpLXBlbmNpbFwiPjwvaT48L2E+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIHR5cGU9XCJidXR0b25cIiB0aXRsZT1cIkRlbGV0ZVwiPjxpIGNsYXNzPVwiYmkgYmktdHJhc2hcIj48L2k+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkPjxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiAvPjwvdGQ+XG4gICAgICAgICAgPHRkPiNDVDAwNjwvdGQ+XG4gICAgICAgICAgPHRkPkRhdmlkIE1hcnRpbmV6PC90ZD5cbiAgICAgICAgICA8dGQ+ZGF2aWRAZG1wcHJvLmNvbTwvdGQ+XG4gICAgICAgICAgPHRkPig1NTUpIDY3OC05MDEyPC90ZD5cbiAgICAgICAgICA8dGQ+RGlnaXRhbCBNYXJrZXRpbmcgUHJvPC90ZD5cbiAgICAgICAgICA8dGQ+U2FsZXMgTWFuYWdlcjwvdGQ+XG4gICAgICAgICAgPHRkPjxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctc3VjY2Vzc1wiPkFjdGl2ZTwvc3Bhbj48L3RkPlxuICAgICAgICAgIDx0ZD5NYXIgMDEsIDIwMjQ8L3RkPlxuICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgYnRuLWdyb3VwLXNtXCI+XG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgaHJlZj1cIjwlPSBSc3guUm91dGUoJ0Zyb250ZW5kX0NvbnRhY3RzX1ZpZXdfQ29udHJvbGxlcicpICU+XCIgdGl0bGU9XCJWaWV3XCI+PGkgY2xhc3M9XCJiaSBiaS1leWVcIj48L2k+PC9hPlxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgaHJlZj1cIiNcIiB0aXRsZT1cIkVkaXRcIj48aSBjbGFzcz1cImJpIGJpLXBlbmNpbFwiPjwvaT48L2E+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIHR5cGU9XCJidXR0b25cIiB0aXRsZT1cIkRlbGV0ZVwiPjxpIGNsYXNzPVwiYmkgYmktdHJhc2hcIj48L2k+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkPjxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiAvPjwvdGQ+XG4gICAgICAgICAgPHRkPiNDVDAwNzwvdGQ+XG4gICAgICAgICAgPHRkPkplbm5pZmVyIEFuZGVyc29uPC90ZD5cbiAgICAgICAgICA8dGQ+amVubmlmZXJAYW5kZXJzb25pbmQubmV0PC90ZD5cbiAgICAgICAgICA8dGQ+KDU1NSkgNzg5LTAxMjM8L3RkPlxuICAgICAgICAgIDx0ZD5BbmRlcnNvbiBJbmR1c3RyaWVzPC90ZD5cbiAgICAgICAgICA8dGQ+Q0ZPPC90ZD5cbiAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1zdWNjZXNzXCI+QWN0aXZlPC9zcGFuPjwvdGQ+XG4gICAgICAgICAgPHRkPk1hciAwNSwgMjAyNDwvdGQ+XG4gICAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBidG4tZ3JvdXAtc21cIj5cbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBocmVmPVwiPCU9IFJzeC5Sb3V0ZSgnRnJvbnRlbmRfQ29udGFjdHNfVmlld19Db250cm9sbGVyJykgJT5cIiB0aXRsZT1cIlZpZXdcIj48aSBjbGFzcz1cImJpIGJpLWV5ZVwiPjwvaT48L2E+XG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiBocmVmPVwiI1wiIHRpdGxlPVwiRWRpdFwiPjxpIGNsYXNzPVwiYmkgYmktcGVuY2lsXCI+PC9pPjwvYT5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZGFuZ2VyXCIgdHlwZT1cImJ1dHRvblwiIHRpdGxlPVwiRGVsZXRlXCI+PGkgY2xhc3M9XCJiaSBiaS10cmFzaFwiPjwvaT48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGQ+PGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIC8+PC90ZD5cbiAgICAgICAgICA8dGQ+I0NUMDA4PC90ZD5cbiAgICAgICAgICA8dGQ+Um9iZXJ0IFRob21wc29uPC90ZD5cbiAgICAgICAgICA8dGQ+cm9iZXJ0QGNyZWF0aXZlc3R1ZGlvcy5jb208L3RkPlxuICAgICAgICAgIDx0ZD4oNTU1KSA4OTAtMTIzNDwvdGQ+XG4gICAgICAgICAgPHRkPkNyZWF0aXZlIFN0dWRpb3MgTExDPC90ZD5cbiAgICAgICAgICA8dGQ+QXJ0IERpcmVjdG9yPC90ZD5cbiAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9XCJiYWRnZSBiZy13YXJuaW5nXCI+UGVuZGluZzwvc3Bhbj48L3RkPlxuICAgICAgICAgIDx0ZD5NYXIgMTIsIDIwMjQ8L3RkPlxuICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgYnRuLWdyb3VwLXNtXCI+XG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgaHJlZj1cIjwlPSBSc3guUm91dGUoJ0Zyb250ZW5kX0NvbnRhY3RzX1ZpZXdfQ29udHJvbGxlcicpICU+XCIgdGl0bGU9XCJWaWV3XCI+PGkgY2xhc3M9XCJiaSBiaS1leWVcIj48L2k+PC9hPlxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgaHJlZj1cIiNcIiB0aXRsZT1cIkVkaXRcIj48aSBjbGFzcz1cImJpIGJpLXBlbmNpbFwiPjwvaT48L2E+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIHR5cGU9XCJidXR0b25cIiB0aXRsZT1cIkRlbGV0ZVwiPjxpIGNsYXNzPVwiYmkgYmktdHJhc2hcIj48L2k+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkPjxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiAvPjwvdGQ+XG4gICAgICAgICAgPHRkPiNDVDAwOTwvdGQ+XG4gICAgICAgICAgPHRkPkxpc2EgR2FyY2lhPC90ZD5cbiAgICAgICAgICA8dGQ+bGlzYUBnYXJjaWFjb25zdWx0LmNvbTwvdGQ+XG4gICAgICAgICAgPHRkPig1NTUpIDkwMS0yMzQ1PC90ZD5cbiAgICAgICAgICA8dGQ+R2FyY2lhIENvbnN1bHRpbmc8L3RkPlxuICAgICAgICAgIDx0ZD5Db25zdWx0YW50PC90ZD5cbiAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1zdWNjZXNzXCI+QWN0aXZlPC9zcGFuPjwvdGQ+XG4gICAgICAgICAgPHRkPk1hciAxOCwgMjAyNDwvdGQ+XG4gICAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBidG4tZ3JvdXAtc21cIj5cbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBocmVmPVwiPCU9IFJzeC5Sb3V0ZSgnRnJvbnRlbmRfQ29udGFjdHNfVmlld19Db250cm9sbGVyJykgJT5cIiB0aXRsZT1cIlZpZXdcIj48aSBjbGFzcz1cImJpIGJpLWV5ZVwiPjwvaT48L2E+XG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiBocmVmPVwiI1wiIHRpdGxlPVwiRWRpdFwiPjxpIGNsYXNzPVwiYmkgYmktcGVuY2lsXCI+PC9pPjwvYT5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZGFuZ2VyXCIgdHlwZT1cImJ1dHRvblwiIHRpdGxlPVwiRGVsZXRlXCI+PGkgY2xhc3M9XCJiaSBiaS10cmFzaFwiPjwvaT48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGQ+PGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIC8+PC90ZD5cbiAgICAgICAgICA8dGQ+I0NUMDEwPC90ZD5cbiAgICAgICAgICA8dGQ+Q2hyaXN0b3BoZXIgV2hpdGU8L3RkPlxuICAgICAgICAgIDx0ZD5jaHJpc0B3aGl0ZXBhcnRuZXJzLm9yZzwvdGQ+XG4gICAgICAgICAgPHRkPig1NTUpIDAxMi0zNDU2PC90ZD5cbiAgICAgICAgICA8dGQ+V2hpdGUgJiBQYXJ0bmVyczwvdGQ+XG4gICAgICAgICAgPHRkPlBhcnRuZXI8L3RkPlxuICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz1cImJhZGdlIGJnLXN1Y2Nlc3NcIj5BY3RpdmU8L3NwYW4+PC90ZD5cbiAgICAgICAgICA8dGQ+TWFyIDIyLCAyMDI0PC90ZD5cbiAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGJ0bi1ncm91cC1zbVwiPlxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIGhyZWY9XCI8JT0gUnN4LlJvdXRlKCdGcm9udGVuZF9Db250YWN0c19WaWV3X0NvbnRyb2xsZXInKSAlPlwiIHRpdGxlPVwiVmlld1wiPjxpIGNsYXNzPVwiYmkgYmktZXllXCI+PC9pPjwvYT5cbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIGhyZWY9XCIjXCIgdGl0bGU9XCJFZGl0XCI+PGkgY2xhc3M9XCJiaSBiaS1wZW5jaWxcIj48L2k+PC9hPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIiB0eXBlPVwiYnV0dG9uXCIgdGl0bGU9XCJEZWxldGVcIj48aSBjbGFzcz1cImJpIGJpLXRyYXNoXCI+PC9pPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5cbiAgPC9kaXY+XG48L0RlZmluZTpDb250YWN0c19EYXRhX1RhYmxlPlxuIiwiPERlZmluZTpDb250YWN0c19MaXN0X0NhcmQgdGFnPVwiZGl2XCIgY2xhc3M9XCJjYXJkXCI+XG5cbiAgICA8JT0gY29udGVudCgpICU+XG5cbjwvRGVmaW5lOkNvbnRhY3RzX0xpc3RfQ2FyZD5cbiIsIjxEZWZpbmU6RGF0ZV9QaWNrZXIgY2xhc3M9XCJtYi0zXCI+XG4gIDwlIGlmICh0aGlzLmFyZ3MubGFiZWwpIHsgJT5cbiAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+PCU9IHRoaXMuYXJncy5sYWJlbCAlPjwvbGFiZWw+XG4gIDwlIH0gJT5cbiAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCI+XG4gICAgICA8aSBjbGFzcz1cImJpIGJpLWNhbGVuZGFyXCI+PC9pPlxuICAgIDwvc3Bhbj5cbiAgICA8aW5wdXRcbiAgICAgIHR5cGU9XCJkYXRlXCJcbiAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiPCU9IHRoaXMuYXJncy5wbGFjZWhvbGRlciB8fCAnJyAlPlwiXG4gICAgICAkaWQ9XCJpbnB1dFwiXG4gICAgLz5cbiAgPC9kaXY+XG4gIDwlIGlmICh0aGlzLmFyZ3MuaGVscCkgeyAlPlxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLXRleHRcIj48JT0gdGhpcy5hcmdzLmhlbHAgJT48L2Rpdj5cbiAgPCUgfSAlPlxuPC9EZWZpbmU6RGF0ZV9QaWNrZXI+XG4iLCI8RGVmaW5lOkRyb3Bkb3duX01lbnUgY2xhc3M9XCJkcm9wZG93blwiPlxuICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgZHJvcGRvd24tdG9nZ2xlXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCJcbiAgICAgICAgICBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgICAgICRpZD1cInRvZ2dsZVwiPlxuICAgIDwlPSB0aGlzLmFyZ3MubGFiZWwgfHwgJ01lbnUnICU+XG4gIDwvYnV0dG9uPlxuICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgYXJpYS1sYWJlbGxlZGJ5PVwidG9nZ2xlXCIgJGlkPVwibWVudVwiPlxuICAgIDwlPSBjb250ZW50KCkgJT5cbiAgPC91bD5cbjwvRGVmaW5lOkRyb3Bkb3duX01lbnU+XG4iLCI8RGVmaW5lOkVtcHR5X1N0YXRlIGNsYXNzPVwidGV4dC1jZW50ZXIgcHktNVwiPlxuICA8ZGl2IGNsYXNzPVwibWItMyB0ZXh0LW11dGVkXCIgc3R5bGU9XCJmb250LXNpemU6IDNyZW07XCI+XG4gICAgPEljb24gJG5hbWU9KHRoaXMuYXJncy5pY29uIHx8ICdpbmJveCcpIC8+XG4gIDwvZGl2PlxuICA8aDUgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+PCU9IHRoaXMuYXJncy50aXRsZSB8fCAnTm8gaXRlbXMgZm91bmQnICU+PC9oNT5cbiAgPHAgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+PCU9IHRoaXMuYXJncy5tZXNzYWdlIHx8ICdHZXQgc3RhcnRlZCBieSBjcmVhdGluZyBhIG5ldyBpdGVtLicgJT48L3A+XG4gIDwlIGlmICh0aGlzLmFyZ3MuYWN0aW9uX2xhYmVsKSB7ICU+XG4gICAgPEJ1dHRvbl9QcmltYXJ5PjwlPSB0aGlzLmFyZ3MuYWN0aW9uX2xhYmVsICU+PC9CdXR0b25fUHJpbWFyeT5cbiAgPCUgfSAlPlxuPC9EZWZpbmU6RW1wdHlfU3RhdGU+XG4iLCI8RGVmaW5lOkV4cG9ydF9CdXR0b24gY2xhc3M9XCJkcm9wZG93blwiPlxuICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi08JT0gdGhpcy5hcmdzLnZhcmlhbnQgfHwgJ3ByaW1hcnknICU+IGRyb3Bkb3duLXRvZ2dsZVwiIHR5cGU9XCJidXR0b25cIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCI+XG4gICAgPGkgY2xhc3M9XCJiaSBiaS1kb3dubG9hZFwiPjwvaT5cbiAgICA8JT0gdGhpcy5hcmdzLmxhYmVsIHx8ICdFeHBvcnQnICU+XG4gIDwvYnV0dG9uPlxuICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XG4gICAgPGxpPlxuICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWZvcm1hdD1cImNzdlwiPlxuICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWZpbGV0eXBlLWNzdiBtZS0yXCI+PC9pPlxuICAgICAgICBFeHBvcnQgYXMgQ1NWXG4gICAgICA8L2E+XG4gICAgPC9saT5cbiAgICA8bGk+XG4gICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtZm9ybWF0PVwiZXhjZWxcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1maWxldHlwZS14bHN4IG1lLTJcIj48L2k+XG4gICAgICAgIEV4cG9ydCBhcyBFeGNlbFxuICAgICAgPC9hPlxuICAgIDwvbGk+XG4gICAgPGxpPlxuICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWZvcm1hdD1cInBkZlwiPlxuICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWZpbGV0eXBlLXBkZiBtZS0yXCI+PC9pPlxuICAgICAgICBFeHBvcnQgYXMgUERGXG4gICAgICA8L2E+XG4gICAgPC9saT5cbiAgICA8bGk+XG4gICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtZm9ybWF0PVwianNvblwiPlxuICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWZpbGV0eXBlLWpzb24gbWUtMlwiPjwvaT5cbiAgICAgICAgRXhwb3J0IGFzIEpTT05cbiAgICAgIDwvYT5cbiAgICA8L2xpPlxuICA8L3VsPlxuPC9EZWZpbmU6RXhwb3J0X0J1dHRvbj5cbiIsIjxEZWZpbmU6RmlsZV9VcGxvYWQgY2xhc3M9XCJtYi0zXCI+XG4gIDwlIGlmICh0aGlzLmFyZ3MubGFiZWwpIHsgJT5cbiAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+PCU9IHRoaXMuYXJncy5sYWJlbCAlPjwvbGFiZWw+XG4gIDwlIH0gJT5cbiAgPGRpdiBjbGFzcz1cImJvcmRlciByb3VuZGVkIHAtNCB0ZXh0LWNlbnRlclwiICRpZD1cImRyb3Bfem9uZVwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyB0cmFuc2l0aW9uOiBhbGwgMC4ycztcIj5cbiAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBjbGFzcz1cImQtbm9uZVwiICRpZD1cImZpbGVfaW5wdXRcIiAvPlxuICAgIDxkaXYgJGlkPVwicGxhY2Vob2xkZXJcIj5cbiAgICAgIDxpIGNsYXNzPVwiYmkgYmktY2xvdWQtdXBsb2FkIGZzLTEgdGV4dC1tdXRlZFwiPjwvaT5cbiAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1wcmltYXJ5XCI+Q2xpY2sgdG8gdXBsb2FkPC9zcGFuPiBvciBkcmFnIGFuZCBkcm9wXG4gICAgICA8L2Rpdj5cbiAgICAgIDwlIGlmICh0aGlzLmFyZ3MuYWNjZXB0KSB7ICU+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG10LTFcIj48JT0gdGhpcy5hcmdzLmFjY2VwdCAlPjwvZGl2PlxuICAgICAgPCUgfSAlPlxuICAgICAgPCUgaWYgKHRoaXMuYXJncy5tYXhfc2l6ZSkgeyAlPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPk1heCBzaXplOiA8JT0gdGhpcy5hcmdzLm1heF9zaXplICU+PC9kaXY+XG4gICAgICA8JSB9ICU+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAkaWQ9XCJmaWxlX2luZm9cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICA8aSBjbGFzcz1cImJpIGJpLWZpbGUtZWFybWFyayBmcy0xIHRleHQtc3VjY2Vzc1wiPjwvaT5cbiAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCIgJGlkPVwiZmlsZV9uYW1lXCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiICRpZD1cImZpbGVfc2l6ZVwiPjwvZGl2PlxuICAgICAgPEJ1dHRvbl9TZWNvbmRhcnkgJGlkPVwicmVtb3ZlX2J0blwiIGNsYXNzPVwibXQtMlwiPlJlbW92ZTwvQnV0dG9uX1NlY29uZGFyeT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICRpZD1cInByb2dyZXNzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgPFByb2dyZXNzX0JhciAkaWQ9XCJwcm9ncmVzc19iYXJcIiAvPlxuICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGwgbXQtMlwiPlVwbG9hZGluZy4uLjwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPCUgaWYgKHRoaXMuYXJncy5oZWxwKSB7ICU+XG4gICAgPGRpdiBjbGFzcz1cImZvcm0tdGV4dFwiPjwlPSB0aGlzLmFyZ3MuaGVscCAlPjwvZGl2PlxuICA8JSB9ICU+XG48L0RlZmluZTpGaWxlX1VwbG9hZD5cbiIsIjxEZWZpbmU6RmlsdGVyX0JhciBjbGFzcz1cImNhcmQgbWItM1wiPlxuICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG4gICAgPGRpdiBjbGFzcz1cInJvdyBnLTMgYWxpZ24taXRlbXMtZW5kXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG9cIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbCB0ZXh0LW11dGVkIG1iLTFcIj5TZWFyY2g8L2xhYmVsPlxuICAgICAgICA8SW5wdXRfV2l0aF9JY29uICRpY29uPVwic2VhcmNoXCIgJHBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCIgJGlkPVwic2VhcmNoXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGwgdGV4dC1tdXRlZCBtYi0xXCI+U3RhdHVzPC9sYWJlbD5cbiAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgJGlkPVwic3RhdHVzXCI+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkFsbDwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGwgdGV4dC1tdXRlZCBtYi0xXCI+RGF0ZSBSYW5nZTwvbGFiZWw+XG4gICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiICRpZD1cImRhdGVfcmFuZ2VcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+QWxsIFRpbWU8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwidG9kYXlcIj5Ub2RheTwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ3ZWVrXCI+VGhpcyBXZWVrPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm1vbnRoXCI+VGhpcyBNb250aDwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJjdXN0b21cIj5DdXN0b20gUmFuZ2U8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0b1wiICRpZD1cImN1c3RvbV9kYXRlc1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgPERhdGVfUGlja2VyICRpZD1cInN0YXJ0X2RhdGVcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG9cIiAkaWQ9XCJjdXN0b21fZGF0ZXNfZW5kXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8RGF0ZV9QaWNrZXIgJGlkPVwiZW5kX2RhdGVcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gbXMtYXV0b1wiPlxuICAgICAgICA8QnV0dG9uX1NlY29uZGFyeSAkaWQ9XCJjbGVhcl9idG5cIj5DbGVhciBGaWx0ZXJzPC9CdXR0b25fU2Vjb25kYXJ5PlxuICAgICAgICA8QnV0dG9uX1ByaW1hcnkgJGlkPVwiYXBwbHlfYnRuXCIgY2xhc3M9XCJtcy0yXCI+QXBwbHk8L0J1dHRvbl9QcmltYXJ5PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm10LTNcIiAkaWQ9XCJhY3RpdmVfZmlsdGVyc1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWQgbWUtMlwiPkFjdGl2ZSBmaWx0ZXJzOjwvc21hbGw+XG4gICAgICA8ZGl2IGNsYXNzPVwiZC1pbmxpbmUtYmxvY2tcIiAkaWQ9XCJmaWx0ZXJfdGFnc1wiPjwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvRGVmaW5lOkZpbHRlcl9CYXI+XG4iLCI8RGVmaW5lOkZvcm1fQWN0aW9uc19Db21wb25lbnQgdGFnPVwiZGl2XCIgY2xhc3M9XCJtdC0zXCI+XG4gIDwlIGlmICh0aGlzLmFyZ3MuY2FuY2VsX3VybCkgeyAlPlxuICAgIDxhIGhyZWY9XCI8JT0gdGhpcy5hcmdzLmNhbmNlbF91cmwgJT5cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCI+PCU9IHRoaXMuYXJncy5jYW5jZWxfdGV4dCB8fCAnQ2FuY2VsJyAlPjwvYT5cbiAgPCUgfSAlPlxuICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgdHlwZT1cInN1Ym1pdFwiPjwlPSB0aGlzLmFyZ3Muc3VibWl0X3RleHQgfHwgJ1NhdmUnICU+PC9idXR0b24+XG48L0RlZmluZTpGb3JtX0FjdGlvbnNfQ29tcG9uZW50PlxuIiwiPERlZmluZTpGb3JtX0ZpZWxkX0dyb3VwIGNsYXNzPVwiY2FyZCBtYi0zXCI+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlclwiPlxuICAgIDxoNSBjbGFzcz1cIm1iLTBcIj48JT0gdGhpcy5hcmdzLnRpdGxlIHx8ICdGb3JtIFNlY3Rpb24nICU+PC9oNT5cbiAgICA8JSBpZiAodGhpcy5hcmdzLmRlc2NyaXB0aW9uKSB7ICU+XG4gICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+PCU9IHRoaXMuYXJncy5kZXNjcmlwdGlvbiAlPjwvc21hbGw+XG4gICAgPCUgfSAlPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxuICAgIDwlPSBjb250ZW50KCkgJT5cbiAgPC9kaXY+XG48L0RlZmluZTpGb3JtX0ZpZWxkX0dyb3VwPlxuIiwiPERlZmluZTpGb3JtX0dyb3VwX0NvbXBvbmVudCB0YWc9XCJkaXZcIj5cbiAgPGRpdj5cbiAgICA8JSBpZiAodGhpcy5hcmdzLmxhYmVsKSB7ICU+XG4gICAgICA8bGFiZWwgZm9yPVwiPCU9IHRoaXMuYXJncy5pZCAlPlwiPjwlPSB0aGlzLmFyZ3MubGFiZWwgJT48L2xhYmVsPlxuICAgIDwlIH0gJT5cbiAgICA8JSBpZiAodGhpcy5hcmdzLnR5cGUgPT09ICdzZWxlY3QnKSB7ICU+XG4gICAgICA8JSBpZiAodGhpcy5hcmdzLnJlcXVpcmVkKSB7ICU+XG4gICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGlkPVwiPCU9IHRoaXMuYXJncy5pZCAlPlwiIHJlcXVpcmVkPlxuICAgICAgICAgIDwlIGlmICh0aGlzLmFyZ3MucGxhY2Vob2xkZXIpIHsgJT5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj48JT0gdGhpcy5hcmdzLnBsYWNlaG9sZGVyICU+PC9vcHRpb24+XG4gICAgICAgICAgPCUgfSAlPlxuICAgICAgICAgIDwlPSBjb250ZW50KCkgJT5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8JSB9IGVsc2UgeyAlPlxuICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBpZD1cIjwlPSB0aGlzLmFyZ3MuaWQgJT5cIj5cbiAgICAgICAgICA8JSBpZiAodGhpcy5hcmdzLnBsYWNlaG9sZGVyKSB7ICU+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+PCU9IHRoaXMuYXJncy5wbGFjZWhvbGRlciAlPjwvb3B0aW9uPlxuICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICA8JT0gY29udGVudCgpICU+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPCUgfSAlPlxuICAgIDwlIH0gZWxzZSBpZiAodGhpcy5hcmdzLnR5cGUgPT09ICd0ZXh0YXJlYScpIHsgJT5cbiAgICAgIDwlIGlmICh0aGlzLmFyZ3MucmVxdWlyZWQpIHsgJT5cbiAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCI8JT0gdGhpcy5hcmdzLmlkICU+XCIgcm93cz1cIjwlPSB0aGlzLmFyZ3Mucm93cyB8fCA0ICU+XCIgcGxhY2Vob2xkZXI9XCI8JT0gdGhpcy5hcmdzLnBsYWNlaG9sZGVyIHx8ICcnICU+XCIgcmVxdWlyZWQ+PC90ZXh0YXJlYT5cbiAgICAgIDwlIH0gZWxzZSB7ICU+XG4gICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiPCU9IHRoaXMuYXJncy5pZCAlPlwiIHJvd3M9XCI8JT0gdGhpcy5hcmdzLnJvd3MgfHwgNCAlPlwiIHBsYWNlaG9sZGVyPVwiPCU9IHRoaXMuYXJncy5wbGFjZWhvbGRlciB8fCAnJyAlPlwiPjwvdGV4dGFyZWE+XG4gICAgICA8JSB9ICU+XG4gICAgPCUgfSBlbHNlIHsgJT5cbiAgICAgIDwlIGlmICh0aGlzLmFyZ3MucmVxdWlyZWQpIHsgJT5cbiAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCI8JT0gdGhpcy5hcmdzLmlkICU+XCIgdHlwZT1cIjwlPSB0aGlzLmFyZ3MudHlwZSB8fCAndGV4dCcgJT5cIiBwbGFjZWhvbGRlcj1cIjwlPSB0aGlzLmFyZ3MucGxhY2Vob2xkZXIgfHwgJycgJT5cIiByZXF1aXJlZD5cbiAgICAgIDwlIH0gZWxzZSB7ICU+XG4gICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiPCU9IHRoaXMuYXJncy5pZCAlPlwiIHR5cGU9XCI8JT0gdGhpcy5hcmdzLnR5cGUgfHwgJ3RleHQnICU+XCIgcGxhY2Vob2xkZXI9XCI8JT0gdGhpcy5hcmdzLnBsYWNlaG9sZGVyIHx8ICcnICU+XCI+XG4gICAgICA8JSB9ICU+XG4gICAgPCUgfSAlPlxuICA8L2Rpdj5cbjwvRGVmaW5lOkZvcm1fR3JvdXBfQ29tcG9uZW50PlxuIiwiPERlZmluZTpGb3JtX1Jvd19Db21wb25lbnQgdGFnPVwiZGl2XCIgY2xhc3M9XCJyb3dcIj5cbiAgPCU9IGNvbnRlbnQoKSAlPlxuPC9EZWZpbmU6Rm9ybV9Sb3dfQ29tcG9uZW50PlxuIiwiPERlZmluZTpGb3JtX1ZhbGlkYXRpb25fTWVzc2FnZSBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cbiAgPCU9IGNvbnRlbnQoKSAlPlxuPC9EZWZpbmU6Rm9ybV9WYWxpZGF0aW9uX01lc3NhZ2U+XG4iLCI8RGVmaW5lOkdhbnR0X0NoYXJ0IGNsYXNzPVwiY2FyZFwiPlxuICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXJcIj5cbiAgICA8aDUgY2xhc3M9XCJtYi0wXCI+PCU9IHRoaXMuYXJncy50aXRsZSB8fCAnUHJvamVjdCBUaW1lbGluZScgJT48L2g1PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTBcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtYm9yZGVyZWQgbWItMFwiIHN0eWxlPVwidGFibGUtbGF5b3V0OiBmaXhlZDtcIj5cbiAgICAgICAgPHRoZWFkIGNsYXNzPVwidGFibGUtbGlnaHRcIj5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMjAwcHg7XCI+VGFzazwvdGg+XG4gICAgICAgICAgICA8JSBmb3IgKGxldCBtb250aCBvZiB0aGlzLmRhdGEubW9udGhzIHx8IFtdKSB7ICU+XG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cInRleHQtY2VudGVyIHNtYWxsXCI+PCU9IG1vbnRoICU+PC90aD5cbiAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgPCUgaWYgKE9iamVjdC5rZXlzKHRoaXMuZGF0YSkubGVuZ3RoID09PSAwKSB7ICU+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlciBweS01XCI+XG4gICAgICAgICAgICAgICAgPFNwaW5uZXIgLz5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPCUgfSBlbHNlIHsgJT5cbiAgICAgICAgICAgIDwlIGZvciAobGV0IHRhc2sgb2YgdGhpcy5kYXRhLnRhc2tzIHx8IFtdKSB7ICU+XG4gICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJhbGlnbi1taWRkbGVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy1ib2xkXCI+PCU9IHRhc2submFtZSAlPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPCUgaWYgKHRhc2suYXNzaWduZWUpIHsgJT5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1tdXRlZFwiPjwlPSB0YXNrLmFzc2lnbmVlICU+PC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDwlIGZvciAobGV0IGkgPSAwOyBpIDwgKHRoaXMuZGF0YS5tb250aHMgfHwgW10pLmxlbmd0aDsgaSsrKSB7ICU+XG4gICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJwLTEgYWxpZ24tbWlkZGxlXCI+XG4gICAgICAgICAgICAgICAgICAgIDwlIGlmICh0YXNrLnN0YXJ0X21vbnRoIDw9IGkgJiYgdGFzay5lbmRfbW9udGggPj0gaSkgeyAlPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZy08JT0gdGFzay5jb2xvciB8fCAncHJpbWFyeScgJT4gcm91bmRlZCBwLTIgdGV4dC13aGl0ZSBzbWFsbCB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCU9IHRhc2suc3RhcnRfbW9udGggPT09IGkgPyB0YXNrLm5hbWUgOiAnJyAlPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8JSB9ICU+XG4gICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICA8JSB9ICU+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvRGVmaW5lOkdhbnR0X0NoYXJ0PlxuIiwiPERlZmluZTpJY29uX0J1dHRvbiB0YWc9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgdHlwZT1cImJ1dHRvblwiPlxuICA8JT0gY29udGVudCgpICU+XG48L0RlZmluZTpJY29uX0J1dHRvbj5cbiIsIjxEZWZpbmU6SWNvbl9XaXRoX0xhYmVsIGNsYXNzPVwiZC1pbmxpbmUtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgPEljb24gJG5hbWU9KHRoaXMuYXJncy5pY29uKSAvPlxuICA8c3Bhbj48JT0gY29udGVudCgpICU+PC9zcGFuPlxuPC9EZWZpbmU6SWNvbl9XaXRoX0xhYmVsPlxuIiwiPERlZmluZTpJY29uX1dpdGhfVGV4dCBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcHktMlwiPlxuICA8aSBjbGFzcz1cImJpIGJpLWNpcmNsZS1maWxsIG1lLTIgdGV4dC1wcmltYXJ5XCIgc3R5bGU9XCJmb250LXNpemU6IDAuNXJlbTtcIj48L2k+XG4gIDxzcGFuIGNsYXNzPVwiZmxleC1ncm93LTFcIj48JT0gY29udGVudCgpICU+PC9zcGFuPlxuPC9EZWZpbmU6SWNvbl9XaXRoX1RleHQ+XG4iLCI8RGVmaW5lOkljb24gdGFnPVwic3ZnXCIgY2xhc3M9XCJpY29uIGljb24teHNcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgPCU9IGNvbnRlbnQoKSAlPlxuPC9EZWZpbmU6SWNvbj5cbiIsIjxEZWZpbmU6SW5mb19Cb3ggY2xhc3M9XCJwLTMgbWItMyBiZy1saWdodCBib3JkZXItc3RhcnQgYm9yZGVyLXByaW1hcnkgYm9yZGVyLTRcIj5cbiAgPCU9IGNvbnRlbnQoKSAlPlxuPC9EZWZpbmU6SW5mb19Cb3g+XG4iLCI8RGVmaW5lOklubGluZV9FZGl0X0ZpZWxkIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICA8ZGl2ICRpZD1cImRpc3BsYXlfbW9kZVwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgIDxzcGFuICRpZD1cInZhbHVlX2Rpc3BsYXlcIj48JT0gdGhpcy5hcmdzLnZhbHVlIHx8IHRoaXMuYXJncy5wbGFjZWhvbGRlciB8fCAnQ2xpY2sgdG8gZWRpdCcgJT48L3NwYW4+XG4gICAgPGkgY2xhc3M9XCJiaSBiaS1wZW5jaWwgdGV4dC1tdXRlZCBtcy0yXCI+PC9pPlxuICA8L2Rpdj5cbiAgPGRpdiAkaWQ9XCJlZGl0X21vZGVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtXCI+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiICRpZD1cImlucHV0XCIgLz5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiB0eXBlPVwiYnV0dG9uXCIgJGlkPVwic2F2ZV9idG5cIiB0aXRsZT1cIlNhdmVcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1jaGVjay1sZ1wiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgdHlwZT1cImJ1dHRvblwiICRpZD1cImNhbmNlbF9idG5cIiB0aXRsZT1cIkNhbmNlbFwiPlxuICAgICAgICA8aSBjbGFzcz1cImJpIGJpLXgtbGdcIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L0RlZmluZTpJbmxpbmVfRWRpdF9GaWVsZD5cbiIsIjxEZWZpbmU6SW5wdXRfV2l0aF9JY29uIGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgPCUgaWYgKHRoaXMuYXJncy5pY29uX3Bvc2l0aW9uICE9PSAnZW5kJykgeyAlPlxuICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dFwiPlxuICAgICAgPGkgY2xhc3M9XCJiaSBiaS08JT0gdGhpcy5hcmdzLmljb24gfHwgJ3NlYXJjaCcgJT5cIj48L2k+XG4gICAgPC9zcGFuPlxuICA8JSB9ICU+XG4gIDxpbnB1dFxuICAgIHR5cGU9XCI8JT0gdGhpcy5hcmdzLnR5cGUgfHwgJ3RleHQnICU+XCJcbiAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgcGxhY2Vob2xkZXI9XCI8JT0gdGhpcy5hcmdzLnBsYWNlaG9sZGVyIHx8ICcnICU+XCJcbiAgICAkaWQ9XCJpbnB1dFwiXG4gIC8+XG4gIDwlIGlmICh0aGlzLmFyZ3MuaWNvbl9wb3NpdGlvbiA9PT0gJ2VuZCcpIHsgJT5cbiAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIj5cbiAgICAgIDxpIGNsYXNzPVwiYmkgYmktPCU9IHRoaXMuYXJncy5pY29uIHx8ICdzZWFyY2gnICU+XCI+PC9pPlxuICAgIDwvc3Bhbj5cbiAgPCUgfSAlPlxuPC9EZWZpbmU6SW5wdXRfV2l0aF9JY29uPlxuIiwiPERlZmluZTpJbnB1dF9XaXRoX1ZhbGlkYXRpb24gY2xhc3M9XCJtYi0zXCI+XG4gIDwlIGlmICh0aGlzLmFyZ3MubGFiZWwpIHsgJT5cbiAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCIgJGlkPVwibGFiZWxcIj5cbiAgICAgIDwlPSB0aGlzLmFyZ3MubGFiZWwgJT5cbiAgICAgIDwlIGlmICh0aGlzLmFyZ3MucmVxdWlyZWQpIHsgJT48c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48JSB9ICU+XG4gICAgPC9sYWJlbD5cbiAgPCUgfSAlPlxuICA8aW5wdXRcbiAgICB0eXBlPVwiPCU9IHRoaXMuYXJncy50eXBlIHx8ICd0ZXh0JyAlPlwiXG4gICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgIHBsYWNlaG9sZGVyPVwiPCU9IHRoaXMuYXJncy5wbGFjZWhvbGRlciB8fCAnJyAlPlwiXG4gICAgJGlkPVwiaW5wdXRcIlxuICAvPlxuICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiICRpZD1cImVycm9yXCI+PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJ2YWxpZC1mZWVkYmFja1wiICRpZD1cInN1Y2Nlc3NcIj48L2Rpdj5cbiAgPCUgaWYgKHRoaXMuYXJncy5oZWxwKSB7ICU+XG4gICAgPGRpdiBjbGFzcz1cImZvcm0tdGV4dFwiPjwlPSB0aGlzLmFyZ3MuaGVscCAlPjwvZGl2PlxuICA8JSB9ICU+XG48L0RlZmluZTpJbnB1dF9XaXRoX1ZhbGlkYXRpb24+XG4iLCI8RGVmaW5lOklucHV0IHRhZz1cImlucHV0XCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuPC9EZWZpbmU6SW5wdXQ+XG4iLCI8RGVmaW5lOkthbmJhbl9Cb2FyZCBjbGFzcz1cImQtZmxleCBnYXAtM1wiIHN0eWxlPVwib3ZlcmZsb3cteDogYXV0bztcIj5cbiAgPCUgaWYgKE9iamVjdC5rZXlzKHRoaXMuZGF0YSkubGVuZ3RoID09PSAwKSB7ICU+XG4gICAgPGRpdiBjbGFzcz1cInctMTAwIHRleHQtY2VudGVyIHB5LTVcIj5cbiAgICAgIDxTcGlubmVyIC8+XG4gICAgPC9kaXY+XG4gIDwlIH0gZWxzZSB7ICU+XG4gICAgPCUgZm9yIChsZXQgY29sdW1uIG9mIHRoaXMuZGF0YS5jb2x1bW5zIHx8IFtdKSB7ICU+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiIHN0eWxlPVwibWluLXdpZHRoOiAzMDBweDsgbWF4LXdpZHRoOiAzMDBweDtcIiBkYXRhLWNvbHVtbi1pZD1cIjwlPSBjb2x1bW4uaWQgJT5cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGJnLWxpZ2h0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxoNiBjbGFzcz1cIm1iLTBcIj48JT0gY29sdW1uLnRpdGxlICU+PC9oNj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctc2Vjb25kYXJ5XCI+PCU9IGNvbHVtbi5jYXJkcy5sZW5ndGggJT48L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHAtMlwiIHN0eWxlPVwibWluLWhlaWdodDogNDAwcHg7IG1heC1oZWlnaHQ6IDYwMHB4OyBvdmVyZmxvdy15OiBhdXRvO1wiIGRhdGEtY29sdW1uLWNhcmRzPVwiPCU9IGNvbHVtbi5pZCAlPlwiPlxuICAgICAgICAgIDwlIGZvciAobGV0IGNhcmQgb2YgY29sdW1uLmNhcmRzKSB7ICU+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBtYi0yXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiIGRhdGEtY2FyZC1pZD1cIjwlPSBjYXJkLmlkICU+XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcC0zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LWJvbGQgbWItMlwiPjwlPSBjYXJkLnRpdGxlICU+PC9kaXY+XG4gICAgICAgICAgICAgICAgPCUgaWYgKGNhcmQuZGVzY3JpcHRpb24pIHsgJT5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG1iLTJcIj48JT0gY2FyZC5kZXNjcmlwdGlvbiAlPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICAgICAgICA8JSBpZiAoY2FyZC50YWdzICYmIGNhcmQudGFncy5sZW5ndGggPiAwKSB7ICU+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8JSBmb3IgKGxldCB0YWcgb2YgY2FyZC50YWdzKSB7ICU+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1saWdodCB0ZXh0LWRhcmsgbWUtMVwiPjwlPSB0YWcgJT48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICAgICAgICA8JSBpZiAoY2FyZC5hc3NpZ25lZSkgeyAlPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPEF2YXRhciAkbmFtZT1jYXJkLmFzc2lnbmVlICRzaXplPVwieHNcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+PCU9IGNhcmQuYXNzaWduZWUgJT48L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCUgfSAlPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8JSB9ICU+XG4gIDwlIH0gJT5cbjwvRGVmaW5lOkthbmJhbl9Cb2FyZD5cbiIsIjxEZWZpbmU6TGluayB0YWc9XCJhXCIgaHJlZj1cIiNcIj5cbiAgPCU9IGNvbnRlbnQoKSAlPlxuPC9EZWZpbmU6TGluaz5cbiIsIjxEZWZpbmU6TGlzdCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxuICA8JT0gY29udGVudCgpICU+XG48L0RlZmluZTpMaXN0PlxuIiwiPERlZmluZTpMb2FkaW5nX1NrZWxldG9uIGNsYXNzPVwicGxhY2Vob2xkZXItZ2xvd1wiPlxuICA8c3BhbiBjbGFzcz1cInBsYWNlaG9sZGVyIGNvbC0xMlwiPjwvc3Bhbj5cbiAgPHNwYW4gY2xhc3M9XCJwbGFjZWhvbGRlciBjb2wtMTBcIj48L3NwYW4+XG4gIDxzcGFuIGNsYXNzPVwicGxhY2Vob2xkZXIgY29sLThcIj48L3NwYW4+XG48L0RlZmluZTpMb2FkaW5nX1NrZWxldG9uPlxuIiwiPERlZmluZTpNZXRyaWNfQ2FyZCBjbGFzcz1cImNhcmQgIGgtMTAwXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHAtNFwiPlxuICAgICAgICA8JT0gY29udGVudCgpICU+XG4gICAgPC9kaXY+XG5cbjwvRGVmaW5lOk1ldHJpY19DYXJkPlxuIiwiPERlZmluZTpNb2JpbGVfSGVhZGVyIHRhZz1cImhlYWRlclwiIGNsYXNzPVwibmF2YmFyIG5hdmJhci1saWdodCBiZy1saWdodCBkLWxnLW5vbmVcIj5cbiAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuICAgIDxidXR0b24gY2xhc3M9XCJuYXZiYXItdG9nZ2xlclwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGRhdGEtYnMtdG9nZ2xlPVwib2ZmY2FudmFzXCJcbiAgICAgICAgICAgIGRhdGEtYnMtdGFyZ2V0PVwiI21vYmlsZVNpZGViYXJcIlxuICAgICAgICAgICAgYXJpYS1jb250cm9scz1cIm1vYmlsZVNpZGViYXJcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibmF2YmFyLXRvZ2dsZXItaWNvblwiPjwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8c3BhbiBjbGFzcz1cIm5hdmJhci1icmFuZCBtYi0wIGgxXCI+UFNNPC9zcGFuPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICA8JT0gY29udGVudCgpICU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9EZWZpbmU6TW9iaWxlX0hlYWRlcj5cbiIsIjxEZWZpbmU6TW9kYWxfRGlhbG9nIGNsYXNzPVwibW9kYWwgZmFkZVwiIHRhYmluZGV4PVwiLTFcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCIgJGlkPVwidGl0bGVcIj48JT0gdGhpcy5hcmdzLnRpdGxlIHx8ICdNb2RhbCcgJT48L2g1PlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgJGlkPVwiYm9keVwiPlxuICAgICAgICA8JT0gY29udGVudCgpICU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIiAkaWQ9XCJmb290ZXJcIj5cbiAgICAgICAgPEJ1dHRvbl9TZWNvbmRhcnkgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIj5DbG9zZTwvQnV0dG9uX1NlY29uZGFyeT5cbiAgICAgICAgPEJ1dHRvbl9QcmltYXJ5ICRpZD1cImNvbmZpcm1cIj5Db25maXJtPC9CdXR0b25fUHJpbWFyeT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvRGVmaW5lOk1vZGFsX0RpYWxvZz5cbiIsIjxEZWZpbmU6TXVsdGlfU2VsZWN0IGNsYXNzPVwiZHJvcGRvd25cIj5cbiAgPCUgaWYgKHRoaXMuYXJncy5sYWJlbCkgeyAlPlxuICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj48JT0gdGhpcy5hcmdzLmxhYmVsICU+PC9sYWJlbD5cbiAgPCUgfSAlPlxuICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgZHJvcGRvd24tdG9nZ2xlIHctMTAwIHRleHQtc3RhcnRcIiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiICRpZD1cImJ1dHRvblwiPlxuICAgIDxzcGFuICRpZD1cInNlbGVjdGVkX3RleHRcIj48JT0gdGhpcy5hcmdzLnBsYWNlaG9sZGVyIHx8ICdTZWxlY3Qgb3B0aW9ucycgJT48L3NwYW4+XG4gIDwvYnV0dG9uPlxuICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudSB3LTEwMFwiICRpZD1cIm1lbnVcIj5cbiAgICA8ZGl2IGNsYXNzPVwicHgtMyBweS0yXCI+XG4gICAgICA8aW5wdXQgdHlwZT1cInNlYXJjaFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCIgJGlkPVwic2VhcmNoXCI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWRpdmlkZXJcIj48L2Rpdj5cbiAgICA8ZGl2ICRpZD1cIm9wdGlvbnNcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDI1MHB4OyBvdmVyZmxvdy15OiBhdXRvO1wiPlxuICAgICAgPCEtLSBPcHRpb25zIHBvcHVsYXRlZCB2aWEgSmF2YVNjcmlwdCAtLT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tZGl2aWRlclwiPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJweC0zIHB5LTIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGluayBidG4tc20gcC0wXCIgJGlkPVwiY2xlYXJfYWxsXCI+Q2xlYXIgQWxsPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGluayBidG4tc20gcC0wXCIgJGlkPVwic2VsZWN0X2FsbFwiPlNlbGVjdCBBbGw8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L0RlZmluZTpNdWx0aV9TZWxlY3Q+XG4iLCI8RGVmaW5lOk5vdGlmaWNhdGlvbl9CYWRnZSB0YWc9XCJzcGFuXCIgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiPlxuICA8JT0gY29udGVudCgpICU+XG4gIDxzcGFuIGNsYXNzPVwicG9zaXRpb24tYWJzb2x1dGUgdG9wLTAgc3RhcnQtMTAwIHRyYW5zbGF0ZS1taWRkbGUgYmFkZ2Ugcm91bmRlZC1waWxsIGJnLWRhbmdlclwiXG4gICAgICAgICRpZD1cImNvdW50XCJcbiAgICAgICAgc3R5bGU9XCI8JT0gKHRoaXMuYXJncy5jb3VudCA+IDAgPyAnJyA6ICdkaXNwbGF5OiBub25lOycpICU+XCI+XG4gICAgPCU9IHRoaXMuYXJncy5jb3VudCB8fCAwICU+XG4gIDwvc3Bhbj5cbjwvRGVmaW5lOk5vdGlmaWNhdGlvbl9CYWRnZT5cbiIsIjxEZWZpbmU6Tm90aWZpY2F0aW9uX0Ryb3Bkb3duIGNsYXNzPVwiZHJvcGRvd25cIj5cbiAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGluayBwb3NpdGlvbi1yZWxhdGl2ZVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiXG4gICAgICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCI+XG4gICAgPEljb24gJG5hbWU9XCJiZWxsXCIgLz5cbiAgICA8JSBpZiAodGhpcy5hcmdzLnVucmVhZF9jb3VudCA+IDApIHsgJT5cbiAgICAgIDxzcGFuIGNsYXNzPVwicG9zaXRpb24tYWJzb2x1dGUgdG9wLTAgc3RhcnQtMTAwIHRyYW5zbGF0ZS1taWRkbGUgYmFkZ2Ugcm91bmRlZC1waWxsIGJnLWRhbmdlclwiPlxuICAgICAgICA8JT0gdGhpcy5hcmdzLnVucmVhZF9jb3VudCAlPlxuICAgICAgPC9zcGFuPlxuICAgIDwlIH0gJT5cbiAgPC9idXR0b24+XG4gIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51IGRyb3Bkb3duLW1lbnUtZW5kXCIgc3R5bGU9XCJ3aWR0aDogMzIwcHg7XCI+XG4gICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWhlYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImZ3LWJvbGRcIj5Ob3RpZmljYXRpb25zPC9zcGFuPlxuICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cInNtYWxsXCI+TWFyayBhbGwgcmVhZDwvYT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tZGl2aWRlclwiPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJvdmVyZmxvdy1hdXRvXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiA0MDBweDtcIj5cbiAgICAgIDwlPSBjb250ZW50KCkgJT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L0RlZmluZTpOb3RpZmljYXRpb25fRHJvcGRvd24+XG4iLCI8RGVmaW5lOk92ZXJkdWVfSW5kaWNhdG9yIHRhZz1cInNwYW5cIiBjbGFzcz1cImJhZGdlIGJnLXdhcm5pbmcgdGV4dC1kYXJrIGQtYmxvY2sgbXQtMVwiPlxuICA8JT0gY29udGVudCgpICU+XG48L0RlZmluZTpPdmVyZHVlX0luZGljYXRvcj5cbiIsIjxEZWZpbmU6UGFnZV9IZWFkZXJfTGVmdD5cbiAgPGRpdj5cbiAgICA8JT0gY29udGVudCgpICU+XG4gIDwvZGl2PlxuPC9EZWZpbmU6UGFnZV9IZWFkZXJfTGVmdD5cbiIsIjxEZWZpbmU6UGFnZV9IZWFkZXJfUmlnaHQgY2xhc3M9XCJkLWZsZXggZ2FwLTJcIj5cbiAgPCU9IGNvbnRlbnQoKSAlPlxuPC9EZWZpbmU6UGFnZV9IZWFkZXJfUmlnaHQ+XG4iLCI8RGVmaW5lOlBhZ2VfSGVhZGVyIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi00XCI+XG4gIDwlPSBjb250ZW50KCkgJT5cbjwvRGVmaW5lOlBhZ2VfSGVhZGVyPlxuIiwiPERlZmluZTpQYWdlX1NlY3Rpb24gY2xhc3M9XCJtYi00XCI+XG4gIDwlPSBjb250ZW50KCkgJT5cbjwvRGVmaW5lOlBhZ2VfU2VjdGlvbj5cbiIsIjxEZWZpbmU6UGFnZV9TdWJ0aXRsZSB0YWc9XCJwXCIgY2xhc3M9XCJ0ZXh0LW11dGVkIG1iLTBcIj5cbiAgPCU9IGNvbnRlbnQoKSAlPlxuPC9EZWZpbmU6UGFnZV9TdWJ0aXRsZT5cbiIsIjxEZWZpbmU6UGFnZV9UaXRsZSB0YWc9XCJoMVwiIGNsYXNzPVwiaDIgbWItMVwiPlxuICA8JT0gY29udGVudCgpICU+XG48L0RlZmluZTpQYWdlX1RpdGxlPlxuIiwiPERlZmluZTpQYWdlPlxuICA8JT0gY29udGVudCgpICU+XG48L0RlZmluZTpQYWdlPlxuIiwiPERlZmluZTpQYWdpbmF0aW9uX0NvbnRyb2xzIHRhZz1cIm5hdlwiIGFyaWEtbGFiZWw9XCJUYWJsZSBwYWdpbmF0aW9uXCI+XG4gIDx1bCBjbGFzcz1cInBhZ2luYXRpb24gcGFnaW5hdGlvbi1zbSBtYi0wXCI+XG4gICAgPCU9IGNvbnRlbnQoKSAlPlxuICA8L3VsPlxuPC9EZWZpbmU6UGFnaW5hdGlvbl9Db250cm9scz5cbiIsIjxEZWZpbmU6UGFnaW5hdGlvbl9JbmZvPlxuICA8ZGl2PlxuICAgIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIj48JT0gY29udGVudCgpICU+PC9zbWFsbD5cbiAgPC9kaXY+XG48L0RlZmluZTpQYWdpbmF0aW9uX0luZm8+XG4iLCI8RGVmaW5lOlBvcG92ZXIgdGFnPVwiYnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiBkYXRhLWJzLXRvZ2dsZT1cInBvcG92ZXJcIj5cbiAgPCU9IHRoaXMuYXJncy5sYWJlbCB8fCAnSW5mbycgJT5cbjwvRGVmaW5lOlBvcG92ZXI+XG4iLCI8RGVmaW5lOlByb2dyZXNzX0JhciBjbGFzcz1cInByb2dyZXNzXCI+XG4gIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIlxuICAgICAgIHJvbGU9XCJwcm9ncmVzc2JhclwiXG4gICAgICAgc3R5bGU9XCJ3aWR0aDogPCU9IHRoaXMuYXJncy52YWx1ZSB8fCAwICU+JVwiXG4gICAgICAgYXJpYS12YWx1ZW5vdz1cIjwlPSB0aGlzLmFyZ3MudmFsdWUgfHwgMCAlPlwiXG4gICAgICAgYXJpYS12YWx1ZW1pbj1cIjBcIlxuICAgICAgIGFyaWEtdmFsdWVtYXg9XCIxMDBcIlxuICAgICAgICRpZD1cImJhclwiPlxuICA8L2Rpdj5cbjwvRGVmaW5lOlByb2dyZXNzX0Jhcj5cbiIsIjxEZWZpbmU6UmFkaW9fQnV0dG9uIHRhZz1cImlucHV0XCIgdHlwZT1cInJhZGlvXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCI+XG48L0RlZmluZTpSYWRpb19CdXR0b24+XG4iLCI8RGVmaW5lOlJlY29yZF9Db3VudF9EaXNwbGF5IHRhZz1cInNtYWxsXCIgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XG4gIDwlPSBjb250ZW50KCkgJT5cbjwvRGVmaW5lOlJlY29yZF9Db3VudF9EaXNwbGF5PlxuIiwiPERlZmluZTpSaWNoX1RleHRfRWRpdG9yIGNsYXNzPVwibWItM1wiPlxuICA8JSBpZiAodGhpcy5hcmdzLmxhYmVsKSB7ICU+XG4gICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPjwlPSB0aGlzLmFyZ3MubGFiZWwgJT48L2xhYmVsPlxuICA8JSB9ICU+XG4gIDxkaXYgY2xhc3M9XCJib3JkZXIgcm91bmRlZFwiPlxuICAgIDxkaXYgY2xhc3M9XCJib3JkZXItYm90dG9tIGJnLWxpZ2h0IHAtMlwiICRpZD1cInRvb2xiYXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgYnRuLWdyb3VwLXNtIG1lLTJcIiByb2xlPVwiZ3JvdXBcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIGRhdGEtY29tbWFuZD1cImJvbGRcIiB0aXRsZT1cIkJvbGRcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLXR5cGUtYm9sZFwiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiBkYXRhLWNvbW1hbmQ9XCJpdGFsaWNcIiB0aXRsZT1cIkl0YWxpY1wiPlxuICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktdHlwZS1pdGFsaWNcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgZGF0YS1jb21tYW5kPVwidW5kZXJsaW5lXCIgdGl0bGU9XCJVbmRlcmxpbmVcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLXR5cGUtdW5kZXJsaW5lXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBidG4tZ3JvdXAtc20gbWUtMlwiIHJvbGU9XCJncm91cFwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgZGF0YS1jb21tYW5kPVwiaW5zZXJ0VW5vcmRlcmVkTGlzdFwiIHRpdGxlPVwiQnVsbGV0IExpc3RcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWxpc3QtdWxcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgZGF0YS1jb21tYW5kPVwiaW5zZXJ0T3JkZXJlZExpc3RcIiB0aXRsZT1cIk51bWJlcmVkIExpc3RcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWxpc3Qtb2xcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGJ0bi1ncm91cC1zbSBtZS0yXCIgcm9sZT1cImdyb3VwXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiBkYXRhLWNvbW1hbmQ9XCJqdXN0aWZ5TGVmdFwiIHRpdGxlPVwiQWxpZ24gTGVmdFwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktdGV4dC1sZWZ0XCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIGRhdGEtY29tbWFuZD1cImp1c3RpZnlDZW50ZXJcIiB0aXRsZT1cIkFsaWduIENlbnRlclwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktdGV4dC1jZW50ZXJcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgZGF0YS1jb21tYW5kPVwianVzdGlmeVJpZ2h0XCIgdGl0bGU9XCJBbGlnbiBSaWdodFwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktdGV4dC1yaWdodFwiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgYnRuLWdyb3VwLXNtXCIgcm9sZT1cImdyb3VwXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiBkYXRhLWNvbW1hbmQ9XCJjcmVhdGVMaW5rXCIgdGl0bGU9XCJJbnNlcnQgTGlua1wiPlxuICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktbGlua1wiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiBkYXRhLWNvbW1hbmQ9XCJ1bmxpbmtcIiB0aXRsZT1cIlJlbW92ZSBMaW5rXCI+XG4gICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1saW5rLTQ1ZGVnXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNvbnRlbnRlZGl0YWJsZT1cInRydWVcIlxuICAgICAgY2xhc3M9XCJwLTNcIlxuICAgICAgc3R5bGU9XCJtaW4taGVpZ2h0OiAyMDBweDsgbWF4LWhlaWdodDogNDAwcHg7IG92ZXJmbG93LXk6IGF1dG87XCJcbiAgICAgICRpZD1cImVkaXRvclwiXG4gICAgPjwlPSB0aGlzLmFyZ3MudmFsdWUgfHwgJycgJT48L2Rpdj5cbiAgPC9kaXY+XG4gIDwlIGlmICh0aGlzLmFyZ3MuaGVscCkgeyAlPlxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLXRleHRcIj48JT0gdGhpcy5hcmdzLmhlbHAgJT48L2Rpdj5cbiAgPCUgfSAlPlxuPC9EZWZpbmU6UmljaF9UZXh0X0VkaXRvcj5cbiIsIjxEZWZpbmU6Um93X0FjdGlvbl9NZW51IGNsYXNzPVwiZHJvcGRvd25cIj5cbiAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpbmsgdGV4dC1tdXRlZCBkcm9wZG93bi10b2dnbGVcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGRhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIlxuICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiPlxuICAgIOKLrlxuICA8L2J1dHRvbj5cbiAgPHVsIGNsYXNzPVwiZHJvcGRvd24tbWVudSBkcm9wZG93bi1tZW51LWVuZFwiICRpZD1cIm1lbnVcIj5cbiAgICA8JT0gY29udGVudCgpICU+XG4gIDwvdWw+XG48L0RlZmluZTpSb3dfQWN0aW9uX01lbnU+XG4iLCI8JS0tXG4gIFNhbXBsZSBEYXRhZ3JpZCBDb21wb25lbnRcbiAgRGVtb25zdHJhdGVzIGEgZnVsbC1mZWF0dXJlZCBkYXRhIHRhYmxlIHdpdGg6XG4gIC0gU2VsZWN0YWJsZSByb3dzXG4gIC0gQ29sdW1uIGhlYWRlcnNcbiAgLSBBY3Rpb24gYnV0dG9uc1xuICAtIFBhZ2luYXRpb25cbiAgLSBTdGF0dXMgYmFkZ2VzXG4gIC0gVXNpbmcgbG9vcHMgdG8gYXZvaWQgcmVwZXRpdGlvblxuLS0lPlxuXG48RGVmaW5lOlNhbXBsZV9EYXRhZ3JpZF9Db21wb25lbnQgY2xhc3M9XCJjYXJkXCI+XG4gIDwlLS0gQ2FyZCBIZWFkZXIgd2l0aCBUaXRsZSBhbmQgQ291bnQgLS0lPlxuICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgYmctbGlnaHRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgPGg1IGNsYXNzPVwibWItMFwiPjwlPSB0aGlzLmFyZ3MudGl0bGUgfHwgJ0RhdGEgVGFibGUnICU+PC9oNT5cbiAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIj5cbiAgICAgICAgU2hvd2luZyA8JT0gdGhpcy5hcmdzLnNob3dpbmcgfHwgMTAgJT4gb2YgPCU9IHRoaXMuYXJncy50b3RhbCB8fCAxMDAgJT4gPCU9IHRoaXMuYXJncy5lbnRpdHlfbmFtZSB8fCAnaXRlbXMnICU+XG4gICAgICA8L3NtYWxsPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8JS0tIFRhYmxlIC0tJT5cbiAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTBcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtaG92ZXIgbWItMFwiPlxuICAgICAgICA8JS0tIFRhYmxlIEhlYWRlciAtLSU+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8JSBpZiAodGhpcy5hcmdzLnNlbGVjdGFibGUpOiAlPlxuICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogNDBweDtcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgJGlkPVwic2VsZWN0X2FsbFwiIC8+XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8JSBlbmRpZjsgJT5cblxuICAgICAgICAgICAgPCUtLSBDb2x1bW4gSGVhZGVycyAoZnJvbSBhcmdzLmNvbHVtbnMgYXJyYXkpIC0tJT5cbiAgICAgICAgICAgIDwlIGlmICh0aGlzLmFyZ3MuY29sdW1ucyAmJiB0aGlzLmFyZ3MuY29sdW1ucy5sZW5ndGggPiAwKSB7ICU+XG4gICAgICAgICAgICAgIDwlIGZvciAobGV0IGNvbHVtbiBvZiB0aGlzLmFyZ3MuY29sdW1ucykgeyAlPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIjwlPSAoY29sdW1uLndpZHRoID8gJ3dpZHRoOiAnK2NvbHVtbi53aWR0aCA6ICcnKSAlPlwiPlxuICAgICAgICAgICAgICAgICAgPCU9IGNvbHVtbi5sYWJlbCAlPlxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICAgIDwlIH0gZWxzZSB7ICU+XG4gICAgICAgICAgICAgIDwlLS0gRGVmYXVsdCBjb2x1bW5zIGlmIG5vbmUgc3BlY2lmaWVkIC0tJT5cbiAgICAgICAgICAgICAgPHRoPklEPC90aD5cbiAgICAgICAgICAgICAgPHRoPk5hbWU8L3RoPlxuICAgICAgICAgICAgICA8dGg+Q29tcGFueTwvdGg+XG4gICAgICAgICAgICAgIDx0aD5FbWFpbDwvdGg+XG4gICAgICAgICAgICAgIDx0aD5QaG9uZTwvdGg+XG4gICAgICAgICAgICAgIDx0aD5TdGF0dXM8L3RoPlxuICAgICAgICAgICAgICA8dGg+Q3JlYXRlZDwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxMDBweDtcIj5BY3Rpb25zPC90aD5cbiAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuXG4gICAgICAgIDwlLS0gVGFibGUgQm9keSAtLSU+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICA8JS0tIENoZWNrIGlmIHdlIGhhdmUgcmVhbCBkYXRhIGxvYWRlZCAtLSU+XG4gICAgICAgICAgPCUgaWYgKE9iamVjdC5rZXlzKHRoaXMuZGF0YSkubGVuZ3RoID09PSAwKSB7ICU+XG4gICAgICAgICAgICA8JS0tIExvYWRpbmcgc3RhdGUgLSBnZW5lcmF0ZSBwbGFjZWhvbGRlciByb3dzIC0tJT5cbiAgICAgICAgICAgIDwlIGZvciAobGV0IGkgPSAwOyBpIDwgKHRoaXMuYXJncy5wbGFjZWhvbGRlcl9yb3dzIHx8IDEwKTsgaSsrKSB7ICU+XG4gICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICA8JSBpZiAodGhpcy5hcmdzLnNlbGVjdGFibGUpIHsgJT5cbiAgICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgZGlzYWJsZWQgLz48L3RkPlxuICAgICAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICAgICAgICA8JSBmb3IgKGxldCBqID0gMDsgaiA8ICh0aGlzLmFyZ3MuY29sdW1ucyA/IHRoaXMuYXJncy5jb2x1bW5zLmxlbmd0aCA6IDgpOyBqKyspIHsgJT5cbiAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBsYWNlaG9sZGVyLWdsb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsYWNlaG9sZGVyIGNvbC08JT0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogOCkgKyA0ICU+XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPCUgfSAlPlxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPCUgfSAlPlxuICAgICAgICAgIDwlIH0gZWxzZSBpZiAodGhpcy5kYXRhLnJvd3MgJiYgdGhpcy5kYXRhLnJvd3MubGVuZ3RoID4gMCkgeyAlPlxuICAgICAgICAgICAgPCUtLSBSZWFsIGRhdGEgcm93cyAtLSU+XG4gICAgICAgICAgICA8JSBmb3IgKGxldCByb3cgb2YgdGhpcy5kYXRhLnJvd3MpIHsgJT5cbiAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgIDwlIGlmICh0aGlzLmFyZ3Muc2VsZWN0YWJsZSkgeyAlPlxuICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiBkYXRhLWlkPVwiPCU9IHJvdy5pZCAlPlwiIC8+PC90ZD5cbiAgICAgICAgICAgICAgICA8JSB9ICU+XG5cbiAgICAgICAgICAgICAgICA8JS0tIFJlbmRlciBjZWxscyBiYXNlZCBvbiBjb2x1bW5zIGRlZmluaXRpb24gLS0lPlxuICAgICAgICAgICAgICAgIDwlIGlmICh0aGlzLmFyZ3MuY29sdW1ucykgeyAlPlxuICAgICAgICAgICAgICAgICAgPCUgZm9yIChsZXQgY29sdW1uIG9mIHRoaXMuYXJncy5jb2x1bW5zKSB7ICU+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8JSBpZiAoY29sdW1uLnR5cGUgPT09ICdiYWRnZScpIHsgJT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwlLS0gUmVuZGVyIGFzIGJhZGdlIC0tJT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctPCU9IHJvd1tjb2x1bW4uZmllbGQgKyAnX2NvbG9yJ10gfHwgJ3NlY29uZGFyeScgJT5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCU9IHJvd1tjb2x1bW4uZmllbGRdICU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPCUgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ2FjdGlvbnMnKSB7ICU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8JS0tIEFjdGlvbiBidXR0b25zIC0tJT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgYnRuLWdyb3VwLXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwlIGlmICh0aGlzLmFyZ3Mudmlld191cmwpIHsgJT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiPCU9IHRoaXMuYXJncy52aWV3X3VybC5yZXBsYWNlKCd7aWR9Jywgcm93LmlkKSAlPlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiVmlld1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1leWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8JSB9ICU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwlIGlmICh0aGlzLmFyZ3MuZWRpdF91cmwpIHsgJT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiPCU9IHRoaXMuYXJncy5lZGl0X3VybC5yZXBsYWNlKCd7aWR9Jywgcm93LmlkKSAlPlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJFZGl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLXBlbmNpbFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCUgaWYgKHRoaXMuYXJncy5hbGxvd19kZWxldGUpIHsgJT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1pZD1cIjwlPSByb3cuaWQgJT5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlkPVwiZGVsZXRlX2J1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkRlbGV0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS10cmFzaFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCUgfSAlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPCUgfSBlbHNlIHsgJT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwlLS0gUmVndWxhciB0ZXh0IGNlbGwgLS0lPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCU9IHJvd1tjb2x1bW4uZmllbGRdICU+XG4gICAgICAgICAgICAgICAgICAgICAgPCUgfSAlPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgPCUgfSAlPlxuICAgICAgICAgICAgICAgIDwlIH0gZWxzZSB7ICU+XG4gICAgICAgICAgICAgICAgICA8JS0tIERlZmF1bHQgY2VsbCByZW5kZXJpbmcgd2l0aG91dCBjb2x1bW4gZGVmaW5pdGlvbnMgLS0lPlxuICAgICAgICAgICAgICAgICAgPHRkPjwlPSByb3cuaWQgJT48L3RkPlxuICAgICAgICAgICAgICAgICAgPHRkPjwlPSByb3cubmFtZSAlPjwvdGQ+XG4gICAgICAgICAgICAgICAgICA8dGQ+PCU9IHJvdy5jb21wYW55ICU+PC90ZD5cbiAgICAgICAgICAgICAgICAgIDx0ZD48JT0gcm93LmVtYWlsICU+PC90ZD5cbiAgICAgICAgICAgICAgICAgIDx0ZD48JT0gcm93LnBob25lICU+PC90ZD5cbiAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiZy08JT0gcm93LnN0YXR1c19jb2xvciB8fCAnc3VjY2VzcycgJT5cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8JT0gcm93LnN0YXR1cyAlPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgPHRkPjwlPSByb3cuY3JlYXRlZCAlPjwvdGQ+XG4gICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgYnRuLWdyb3VwLXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIHRpdGxlPVwiVmlld1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1leWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgdGl0bGU9XCJFZGl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLXBlbmNpbFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIiB0aXRsZT1cIkRlbGV0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS10cmFzaFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICA8JSB9IGVsc2UgeyAlPlxuICAgICAgICAgICAgPCUtLSBFbXB0eSBzdGF0ZSAtLSU+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiPCU9ICh0aGlzLmFyZ3Muc2VsZWN0YWJsZSA/IDEgOiAwKSArICh0aGlzLmFyZ3MuY29sdW1ucyA/IHRoaXMuYXJncy5jb2x1bW5zLmxlbmd0aCA6IDgpICU+XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1jZW50ZXIgdGV4dC1tdXRlZCBweS01XCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1pbmJveCBmcy0xIGQtYmxvY2sgbWItMlwiPjwvaT5cbiAgICAgICAgICAgICAgICBObyA8JT0gdGhpcy5hcmdzLmVudGl0eV9uYW1lIHx8ICdpdGVtcycgJT4gZm91bmRcbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPCUgfSAlPlxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCUtLSBQYWdpbmF0aW9uIEZvb3RlciAtLSU+XG4gIDwlIGlmICh0aGlzLmFyZ3MucGFnaW5hdGlvbiAhPT0gZmFsc2UgJiYgT2JqZWN0LmtleXModGhpcy5kYXRhKS5sZW5ndGggPiAwKSB7ICU+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIGJnLWxpZ2h0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIj5cbiAgICAgICAgICAgIFNob3dpbmcgPCU9IHRoaXMuZGF0YS5wYWdpbmF0aW9uPy5mcm9tIHx8IDEgJT4gdG8gPCU9IHRoaXMuZGF0YS5wYWdpbmF0aW9uPy50byB8fCAxMCAlPlxuICAgICAgICAgICAgb2YgPCU9IHRoaXMuZGF0YS5wYWdpbmF0aW9uPy50b3RhbCB8fCAxMDAgJT4gZW50cmllc1xuICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmF2PlxuICAgICAgICAgIDx1bCBjbGFzcz1cInBhZ2luYXRpb24gcGFnaW5hdGlvbi1zbSBtYi0wXCI+XG4gICAgICAgICAgICA8JS0tIFByZXZpb3VzIEJ1dHRvbiAtLSU+XG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJwYWdlLWl0ZW0gPCU9IHRoaXMuZGF0YS5wYWdpbmF0aW9uPy5jdXJyZW50X3BhZ2UgPT09IDEgPyAnZGlzYWJsZWQnIDogJycgJT5cIj5cbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJwYWdlLWxpbmtcIiBocmVmPVwiI1wiIHRhYmluZGV4PVwiLTFcIiAkaWQ9XCJwcmV2X3BhZ2VcIj5QcmV2aW91czwvYT5cbiAgICAgICAgICAgIDwvbGk+XG5cbiAgICAgICAgICAgIDwlLS0gUGFnZSBOdW1iZXJzIC0tJT5cbiAgICAgICAgICAgIDwlIGlmICh0aGlzLmRhdGEucGFnaW5hdGlvbj8ucGFnZXMpIHsgJT5cbiAgICAgICAgICAgICAgPCUgZm9yIChsZXQgcGFnZSBvZiB0aGlzLmRhdGEucGFnaW5hdGlvbi5wYWdlcykgeyAlPlxuICAgICAgICAgICAgICAgIDwlIGlmIChwYWdlID09PSAnLi4uJykgeyAlPlxuICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicGFnZS1pdGVtIGRpc2FibGVkXCI+PGEgY2xhc3M9XCJwYWdlLWxpbmtcIiBocmVmPVwiI1wiPi4uLjwvYT48L2xpPlxuICAgICAgICAgICAgICAgIDwlIH0gZWxzZSB7ICU+XG4gICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwYWdlLWl0ZW0gPCU9IHBhZ2UgPT09IHRoaXMuZGF0YS5wYWdpbmF0aW9uLmN1cnJlbnRfcGFnZSA/ICdhY3RpdmUnIDogJycgJT5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJwYWdlLWxpbmtcIiBocmVmPVwiI1wiIGRhdGEtcGFnZT1cIjwlPSBwYWdlICU+XCI+PCU9IHBhZ2UgJT48L2E+XG4gICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICAgICAgPCUgfSAlPlxuICAgICAgICAgICAgPCUgfSBlbHNlIHsgJT5cbiAgICAgICAgICAgICAgPCUtLSBHZW5lcmF0ZSA1IHBhZ2UgYnV0dG9ucyBpZiBwYWdpbmF0aW9uIGRhdGEgbm90IGZ1bGx5IGxvYWRlZCAtLSU+XG4gICAgICAgICAgICAgIDwlIGZvciAobGV0IGkgPSAxOyBpIDw9IDU7IGkrKykgeyAlPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInBhZ2UtaXRlbSA8JT0gaSA9PT0gMSA/ICdhY3RpdmUnIDogJycgJT5cIj5cbiAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwicGFnZS1saW5rXCIgaHJlZj1cIiNcIiBkYXRhLXBhZ2U9XCI8JT0gaSAlPlwiPjwlPSBpICU+PC9hPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICAgIDwlIH0gJT5cblxuICAgICAgICAgICAgPCUtLSBOZXh0IEJ1dHRvbiAtLSU+XG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJwYWdlLWl0ZW0gPCU9IHRoaXMuZGF0YS5wYWdpbmF0aW9uPy5jdXJyZW50X3BhZ2UgPT09IHRoaXMuZGF0YS5wYWdpbmF0aW9uPy50b3RhbF9wYWdlcyA/ICdkaXNhYmxlZCcgOiAnJyAlPlwiPlxuICAgICAgICAgICAgICA8YSBjbGFzcz1cInBhZ2UtbGlua1wiIGhyZWY9XCIjXCIgJGlkPVwibmV4dF9wYWdlXCI+TmV4dDwvYT5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9uYXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPCUgfSAlPlxuPC9EZWZpbmU6U2FtcGxlX0RhdGFncmlkX0NvbXBvbmVudD5cbiIsIjxEZWZpbmU6U2VhcmNoX0JhciBjbGFzcz1cImlucHV0LWdyb3VwXCI+XG4gIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dFwiPlxuICAgIDxJY29uICRuYW1lPVwic2VhcmNoXCIgLz5cbiAgPC9zcGFuPlxuICA8aW5wdXQgdHlwZT1cInNlYXJjaFwiXG4gICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICBwbGFjZWhvbGRlcj1cIjwlPSB0aGlzLmFyZ3MucGxhY2Vob2xkZXIgfHwgJ1NlYXJjaC4uLicgJT5cIlxuICAgICAgICAgJGlkPVwiaW5wdXRcIiAvPlxuPC9EZWZpbmU6U2VhcmNoX0Jhcj5cbiIsIjxEZWZpbmU6U2VhcmNoX0J1dHRvbiB0YWc9XCJidXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiPlxuICA8aSBjbGFzcz1cImJpIGJpLXNlYXJjaFwiPjwvaT5cbjwvRGVmaW5lOlNlYXJjaF9CdXR0b24+XG4iLCI8RGVmaW5lOlNlYXJjaF9JbnB1dCB0YWc9XCJpbnB1dFwiIHR5cGU9XCJzZWFyY2hcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGNvbnRhY3RzLi4uXCIgc3R5bGU9XCJ3aWR0aDogMjUwcHg7XCI+XG48L0RlZmluZTpTZWFyY2hfSW5wdXQ+XG4iLCI8RGVmaW5lOlNlYXJjaGFibGVfU2VsZWN0IGNsYXNzPVwiZHJvcGRvd25cIj5cbiAgPCUgaWYgKHRoaXMuYXJncy5sYWJlbCkgeyAlPlxuICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj48JT0gdGhpcy5hcmdzLmxhYmVsICU+PC9sYWJlbD5cbiAgPCUgfSAlPlxuICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgZHJvcGRvd24tdG9nZ2xlIHctMTAwIHRleHQtc3RhcnRcIiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiICRpZD1cImJ1dHRvblwiPlxuICAgIDxzcGFuICRpZD1cInNlbGVjdGVkX3RleHRcIj48JT0gdGhpcy5hcmdzLnBsYWNlaG9sZGVyIHx8ICdTZWxlY3QgYW4gb3B0aW9uJyAlPjwvc3Bhbj5cbiAgPC9idXR0b24+XG4gIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51IHctMTAwXCIgJGlkPVwibWVudVwiPlxuICAgIDxkaXYgY2xhc3M9XCJweC0zIHB5LTJcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwic2VhcmNoXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIiAkaWQ9XCJzZWFyY2hcIj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tZGl2aWRlclwiPjwvZGl2PlxuICAgIDxkaXYgJGlkPVwib3B0aW9uc1wiIHN0eWxlPVwibWF4LWhlaWdodDogMjUwcHg7IG92ZXJmbG93LXk6IGF1dG87XCI+XG4gICAgICA8IS0tIE9wdGlvbnMgcG9wdWxhdGVkIHZpYSBKYXZhU2NyaXB0IC0tPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvRGVmaW5lOlNlYXJjaGFibGVfU2VsZWN0PlxuIiwiPERlZmluZTpTZWxlY3RfRHJvcGRvd24gdGFnPVwic2VsZWN0XCIgY2xhc3M9XCJmb3JtLXNlbGVjdFwiPlxuICA8JT0gY29udGVudCgpICU+XG48L0RlZmluZTpTZWxlY3RfRHJvcGRvd24+XG4iLCI8RGVmaW5lOlNpZGViYXJfTmF2IHRhZz1cIm5hdlwiIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIHAtMyBiZy1saWdodFwiIHN0eWxlPVwid2lkdGg6IDI1MHB4OyBtaW4taGVpZ2h0OiAxMDB2aDtcIj5cbiAgPGEgaHJlZj1cIi9cIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMyB0ZXh0LWRlY29yYXRpb24tbm9uZVwiPlxuICAgIDxzcGFuIGNsYXNzPVwiZnMtNCBmdy1ib2xkXCI+UFNNPC9zcGFuPlxuICA8L2E+XG4gIDxociAvPlxuICA8dWwgY2xhc3M9XCJuYXYgbmF2LXBpbGxzIGZsZXgtY29sdW1uIG1iLWF1dG9cIiAkaWQ9XCJuYXZfaXRlbXNcIj5cbiAgICA8JT0gY29udGVudCgpICU+XG4gIDwvdWw+XG48L0RlZmluZTpTaWRlYmFyX05hdj5cbiIsIjxEZWZpbmU6U2ltcGxlX1RhYmxlX1Rlc3Q+XG4gIDx0YWJsZSBjbGFzcz1cInRhYmxlXCI+XG4gICAgPHRyPlxuICAgICAgPHRkPlRlc3Q8L3RkPlxuICAgIDwvdHI+XG4gIDwvdGFibGU+XG48L0RlZmluZTpTaW1wbGVfVGFibGVfVGVzdD5cbiIsIjxEZWZpbmU6U29ydGFibGVfQ29sdW1uX0hlYWRlciB0YWc9XCJ0aFwiIGNsYXNzPVwidXNlci1zZWxlY3Qtbm9uZVwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiPlxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxuICAgIDxzcGFuPjwlPSBjb250ZW50KCkgJT48L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJtcy0yXCIgJGlkPVwic29ydF9pY29uXCI+XG4gICAgICA8aSBjbGFzcz1cInRleHQtbXV0ZWRcIj7ih4U8L2k+XG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cbjwvRGVmaW5lOlNvcnRhYmxlX0NvbHVtbl9IZWFkZXI+XG4iLCI8RGVmaW5lOlNwaW5uZXIgY2xhc3M9XCJzcGlubmVyLWJvcmRlclwiIHJvbGU9XCJzdGF0dXNcIj5cbiAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj5Mb2FkaW5nLi4uPC9zcGFuPlxuPC9EZWZpbmU6U3Bpbm5lcj5cbiIsIjxEZWZpbmU6U3RhdF9DYXJkIGNsYXNzPVwiY2FyZCB0ZXh0LWNlbnRlciBib3JkZXItMCBzaGFkb3ctc21cIj5cbiAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxuICAgIDwlPSBjb250ZW50KCkgJT5cbiAgPC9kaXY+XG48L0RlZmluZTpTdGF0X0NhcmQ+XG4iLCI8RGVmaW5lOlN0YXR1c19CYWRnZSB0YWc9XCJzcGFuXCIgY2xhc3M9XCJiYWRnZVwiPlxuICA8JT0gY29udGVudCgpICU+XG48L0RlZmluZTpTdGF0dXNfQmFkZ2U+XG4iLCI8RGVmaW5lOlRhYl9Db250ZW50IGNsYXNzPVwidGFiLWNvbnRlbnQgbXQtM1wiPlxuICA8JT0gY29udGVudCgpICU+XG48L0RlZmluZTpUYWJfQ29udGVudD5cbiIsIjxEZWZpbmU6VGFibGVfQm9keSB0YWc9XCJ0Ym9keVwiPlxuICA8JT0gY29udGVudCgpICU+XG48L0RlZmluZTpUYWJsZV9Cb2R5PlxuIiwiPERlZmluZTpUYWJsZV9IZWFkZXJzIHRhZz1cInRoZWFkXCI+XG4gIDx0cj5cbiAgICA8JT0gY29udGVudCgpICU+XG4gIDwvdHI+XG48L0RlZmluZTpUYWJsZV9IZWFkZXJzPlxuIiwiPERlZmluZTpUYWJsZV9QYWdpbmF0aW9uIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XG4gIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCIgJGlkPVwiaW5mb1wiPlxuICAgIFNob3dpbmcgPCU9IHRoaXMuYXJncy5zdGFydCB8fCAxICU+IHRvIDwlPSB0aGlzLmFyZ3MuZW5kIHx8IDEwICU+IG9mIDwlPSB0aGlzLmFyZ3MudG90YWwgfHwgMCAlPiBlbnRyaWVzXG4gIDwvZGl2PlxuICA8bmF2IGFyaWEtbGFiZWw9XCJUYWJsZSBwYWdpbmF0aW9uXCI+XG4gICAgPHVsIGNsYXNzPVwicGFnaW5hdGlvbiBtYi0wXCIgJGlkPVwicGFnaW5hdGlvblwiPlxuICAgICAgPCU9IGNvbnRlbnQoKSAlPlxuICAgIDwvdWw+XG4gIDwvbmF2PlxuPC9EZWZpbmU6VGFibGVfUGFnaW5hdGlvbj5cbiIsIjxEZWZpbmU6VGFibGUgdGFnPVwidGFibGVcIiBjbGFzcz1cInRhYmxlIHRhYmxlLWhvdmVyXCI+XG4gIDwlPSBjb250ZW50KCkgJT5cbjwvRGVmaW5lOlRhYmxlPlxuIiwiPERlZmluZTpUYWJzIHRhZz1cInVsXCIgY2xhc3M9XCJuYXYgbmF2LXRhYnNcIj5cbiAgPCU9IGNvbnRlbnQoKSAlPlxuPC9EZWZpbmU6VGFicz5cbiIsIjxEZWZpbmU6VGFnX0dyb3VwIGNsYXNzPVwiZC1mbGV4IGZsZXgtd3JhcCBnYXAtMVwiPlxuICA8JT0gY29udGVudCgpICU+XG48L0RlZmluZTpUYWdfR3JvdXA+XG4iLCI8RGVmaW5lOlRhZyB0YWc9XCJzcGFuXCIgY2xhc3M9XCJiYWRnZSByb3VuZGVkLXBpbGwgYmctc2Vjb25kYXJ5IG1lLTFcIj5cbiAgPCU9IGNvbnRlbnQoKSAlPlxuPC9EZWZpbmU6VGFnPlxuIiwiPERlZmluZTpUZXh0X0Rpc3BsYXkgdGFnPVwic3BhblwiPlxuICA8JT0gY29udGVudCgpICU+XG48L0RlZmluZTpUZXh0X0Rpc3BsYXk+XG4iLCI8RGVmaW5lOlRleHRhcmVhIHRhZz1cInRleHRhcmVhXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByb3dzPVwiNFwiPlxuICA8JT0gY29udGVudCgpICU+XG48L0RlZmluZTpUZXh0YXJlYT5cbiIsIjxEZWZpbmU6VGhyZWVfQ29sdW1uX0xheW91dCBjbGFzcz1cInJvd1wiPlxuICA8JT0gY29udGVudCgpICU+XG48L0RlZmluZTpUaHJlZV9Db2x1bW5fTGF5b3V0PlxuIiwiPERlZmluZTpUaW1lX1BpY2tlciBjbGFzcz1cIm1iLTNcIj5cbiAgPCUgaWYgKHRoaXMuYXJncy5sYWJlbCkgeyAlPlxuICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj48JT0gdGhpcy5hcmdzLmxhYmVsICU+PC9sYWJlbD5cbiAgPCUgfSAlPlxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIj5cbiAgICAgIDxpIGNsYXNzPVwiYmkgYmktY2xvY2tcIj48L2k+XG4gICAgPC9zcGFuPlxuICAgIDxpbnB1dFxuICAgICAgdHlwZT1cInRpbWVcIlxuICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgcGxhY2Vob2xkZXI9XCI8JT0gdGhpcy5hcmdzLnBsYWNlaG9sZGVyIHx8ICcnICU+XCJcbiAgICAgICRpZD1cImlucHV0XCJcbiAgICAvPlxuICA8L2Rpdj5cbiAgPCUgaWYgKHRoaXMuYXJncy5oZWxwKSB7ICU+XG4gICAgPGRpdiBjbGFzcz1cImZvcm0tdGV4dFwiPjwlPSB0aGlzLmFyZ3MuaGVscCAlPjwvZGl2PlxuICA8JSB9ICU+XG48L0RlZmluZTpUaW1lX1BpY2tlcj5cbiIsIjxEZWZpbmU6VGltZWxpbmUgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTNcIj5cbiAgPCU9IGNvbnRlbnQoKSAlPlxuPC9EZWZpbmU6VGltZWxpbmU+XG4iLCI8RGVmaW5lOlRpbWVzdGFtcF9EaXNwbGF5IHRhZz1cInNtYWxsXCIgY2xhc3M9XCJ0ZXh0LW11dGVkIGQtYmxvY2tcIj5cbiAgPCU9IGNvbnRlbnQoKSAlPlxuPC9EZWZpbmU6VGltZXN0YW1wX0Rpc3BsYXk+XG4iLCI8RGVmaW5lOlRvb2x0aXAgdGFnPVwic3BhblwiIGRhdGEtYnMtdG9nZ2xlPVwidG9vbHRpcFwiIGRhdGEtYnMtcGxhY2VtZW50PVwidG9wXCI+XG4gIDwlPSBjb250ZW50KCkgJT5cbjwvRGVmaW5lOlRvb2x0aXA+XG4iLCI8RGVmaW5lOlRvcF9OYXYgdGFnPVwibmF2XCIgY2xhc3M9XCJuYXZiYXIgbmF2YmFyLWV4cGFuZC1sZyBuYXZiYXItbGlnaHQgYmctbGlnaHRcIj5cbiAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuICAgIDxhIGNsYXNzPVwibmF2YmFyLWJyYW5kXCIgaHJlZj1cIi9cIj5QU008L2E+XG4gICAgPGJ1dHRvbiBjbGFzcz1cIm5hdmJhci10b2dnbGVyXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgZGF0YS1icy10b2dnbGU9XCJjb2xsYXBzZVwiXG4gICAgICAgICAgICBkYXRhLWJzLXRhcmdldD1cIiNuYXZiYXJOYXZcIlxuICAgICAgICAgICAgYXJpYS1jb250cm9scz1cIm5hdmJhck5hdlwiXG4gICAgICAgICAgICBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlRvZ2dsZSBuYXZpZ2F0aW9uXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm5hdmJhci10b2dnbGVyLWljb25cIj48L3NwYW4+XG4gICAgPC9idXR0b24+XG4gICAgPGRpdiBjbGFzcz1cImNvbGxhcHNlIG5hdmJhci1jb2xsYXBzZVwiIGlkPVwibmF2YmFyTmF2XCI+XG4gICAgICA8dWwgY2xhc3M9XCJuYXZiYXItbmF2IG1zLWF1dG9cIiAkaWQ9XCJuYXZfaXRlbXNcIj5cbiAgICAgICAgPCU9IGNvbnRlbnQoKSAlPlxuICAgICAgPC91bD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L0RlZmluZTpUb3BfTmF2PlxuIiwiPERlZmluZTpUcmVuZF9JbmRpY2F0b3IgdGFnPVwic3BhblwiPlxuICA8JT0gY29udGVudCgpICU+XG48L0RlZmluZTpUcmVuZF9JbmRpY2F0b3I+XG4iLCI8RGVmaW5lOlR3b19Db2x1bW5fTGF5b3V0IGNsYXNzPVwicm93XCI+XG4gIDwlPSBjb250ZW50KCkgJT5cbjwvRGVmaW5lOlR3b19Db2x1bW5fTGF5b3V0PlxuIiwiPERlZmluZTpVc2VyX0F2YXRhcl9Ecm9wZG93biBjbGFzcz1cImRyb3Bkb3duXCI+XG4gIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpbmsgZHJvcGRvd24tdG9nZ2xlIHAtMCBib3JkZXItMFwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiXG4gICAgICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCJcbiAgICAgICAgICAkaWQ9XCJ0b2dnbGVcIj5cbiAgICA8QXZhdGFyICRzcmM9KHRoaXMuYXJncy5hdmF0YXJfc3JjKSAkbmFtZT0odGhpcy5hcmdzLnVzZXJfbmFtZSkgJHNpemU9XCJzbVwiIC8+XG4gIDwvYnV0dG9uPlxuICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51IGRyb3Bkb3duLW1lbnUtZW5kXCIgJGlkPVwibWVudVwiPlxuICAgIDwlPSBjb250ZW50KCkgJT5cbiAgPC91bD5cbjwvRGVmaW5lOlVzZXJfQXZhdGFyX0Ryb3Bkb3duPlxuIiwiPERlZmluZTpVc2Vyc19EYXRhX1RhYmxlIHRhZz1cImRpdlwiIGNsYXNzPVwiY2FyZC1ib2R5IHAtMFwiPlxuICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLWhvdmVyIG1iLTBcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiA0MHB4O1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIGlkPVwic2VsZWN0LWFsbFwiPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPHRoPklEPC90aD5cbiAgICAgICAgICA8dGg+TmFtZTwvdGg+XG4gICAgICAgICAgPHRoPkVtYWlsPC90aD5cbiAgICAgICAgICA8dGg+Um9sZTwvdGg+XG4gICAgICAgICAgPHRoPkRlcGFydG1lbnQ8L3RoPlxuICAgICAgICAgIDx0aD5TdGF0dXM8L3RoPlxuICAgICAgICAgIDx0aD5MYXN0IExvZ2luPC90aD5cbiAgICAgICAgICA8dGg+Sm9pbmVkPC90aD5cbiAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTAwcHg7XCI+QWN0aW9uczwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgdXNlci1zZWxlY3RcIj48L3RkPlxuICAgICAgICAgIDx0ZD4jVTAwMTwvdGQ+XG4gICAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF2YXRhci1zbSBtZS0yXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdmF0YXItaW5pdGlhbHNcIj5KRDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIEpvaG4gRG9lXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZD5qb2huLmRvZUBleGFtcGxlLmNvbTwvdGQ+XG4gICAgICAgICAgPHRkPjxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctZGFuZ2VyXCI+QWRtaW48L3NwYW4+PC90ZD5cbiAgICAgICAgICA8dGQ+RW5naW5lZXJpbmc8L3RkPlxuICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz1cImJhZGdlIGJnLXN1Y2Nlc3NcIj5BY3RpdmU8L3NwYW4+PC90ZD5cbiAgICAgICAgICA8dGQ+MiBob3VycyBhZ288L3RkPlxuICAgICAgICAgIDx0ZD5KYW4gMTUsIDIwMjM8L3RkPlxuICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgYnRuLWdyb3VwLXNtXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiB0aXRsZT1cIlZpZXcgUHJvZmlsZVwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktZXllXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgdGl0bGU9XCJFZGl0XCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1wZW5jaWxcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIiB0aXRsZT1cIlN1c3BlbmRcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWJhblwiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgdXNlci1zZWxlY3RcIj48L3RkPlxuICAgICAgICAgIDx0ZD4jVTAwMjwvdGQ+XG4gICAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF2YXRhci1zbSBtZS0yXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdmF0YXItaW5pdGlhbHNcIj5KUzwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIEphbmUgU21pdGhcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkPmphbmUuc21pdGhAZXhhbXBsZS5jb208L3RkPlxuICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz1cImJhZGdlIGJnLXByaW1hcnlcIj5NYW5hZ2VyPC9zcGFuPjwvdGQ+XG4gICAgICAgICAgPHRkPk1hcmtldGluZzwvdGQ+XG4gICAgICAgICAgPHRkPjxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctc3VjY2Vzc1wiPkFjdGl2ZTwvc3Bhbj48L3RkPlxuICAgICAgICAgIDx0ZD4xIGRheSBhZ288L3RkPlxuICAgICAgICAgIDx0ZD5GZWIgMjAsIDIwMjM8L3RkPlxuICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgYnRuLWdyb3VwLXNtXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiB0aXRsZT1cIlZpZXcgUHJvZmlsZVwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktZXllXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgdGl0bGU9XCJFZGl0XCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1wZW5jaWxcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIiB0aXRsZT1cIlN1c3BlbmRcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWJhblwiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgdXNlci1zZWxlY3RcIj48L3RkPlxuICAgICAgICAgIDx0ZD4jVTAwMzwvdGQ+XG4gICAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF2YXRhci1zbSBtZS0yXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdmF0YXItaW5pdGlhbHNcIj5NQjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIE1pa2UgQnJvd25cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkPm1pa2UuYnJvd25AZXhhbXBsZS5jb208L3RkPlxuICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz1cImJhZGdlIGJnLXNlY29uZGFyeVwiPlVzZXI8L3NwYW4+PC90ZD5cbiAgICAgICAgICA8dGQ+U2FsZXM8L3RkPlxuICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz1cImJhZGdlIGJnLXdhcm5pbmdcIj5JbmFjdGl2ZTwvc3Bhbj48L3RkPlxuICAgICAgICAgIDx0ZD41IGRheXMgYWdvPC90ZD5cbiAgICAgICAgICA8dGQ+TWFyIDEwLCAyMDIzPC90ZD5cbiAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGJ0bi1ncm91cC1zbVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgdGl0bGU9XCJWaWV3IFByb2ZpbGVcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWV5ZVwiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIHRpdGxlPVwiRWRpdFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktcGVuY2lsXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc3VjY2Vzc1wiIHRpdGxlPVwiQWN0aXZhdGVcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWNoZWNrLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgdXNlci1zZWxlY3RcIj48L3RkPlxuICAgICAgICAgIDx0ZD4jVTAwNDwvdGQ+XG4gICAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF2YXRhci1zbSBtZS0yXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdmF0YXItaW5pdGlhbHNcIj5TVzwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIFNhcmFoIFdpbHNvblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQ+c2FyYWgud2lsc29uQGV4YW1wbGUuY29tPC90ZD5cbiAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1wcmltYXJ5XCI+TWFuYWdlcjwvc3Bhbj48L3RkPlxuICAgICAgICAgIDx0ZD5IUjwvdGQ+XG4gICAgICAgICAgPHRkPjxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctc3VjY2Vzc1wiPkFjdGl2ZTwvc3Bhbj48L3RkPlxuICAgICAgICAgIDx0ZD4zIGhvdXJzIGFnbzwvdGQ+XG4gICAgICAgICAgPHRkPkFwciAwNSwgMjAyMzwvdGQ+XG4gICAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBidG4tZ3JvdXAtc21cIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIHRpdGxlPVwiVmlldyBQcm9maWxlXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1leWVcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiB0aXRsZT1cIkVkaXRcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLXBlbmNpbFwiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIHRpdGxlPVwiU3VzcGVuZFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktYmFuXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCB1c2VyLXNlbGVjdFwiPjwvdGQ+XG4gICAgICAgICAgPHRkPiNVMDA1PC90ZD5cbiAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyLXNtIG1lLTJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF2YXRhci1pbml0aWFsc1wiPlRKPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgVG9tIEpvaG5zb25cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkPnRvbS5qQGV4YW1wbGUuY29tPC90ZD5cbiAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1zZWNvbmRhcnlcIj5Vc2VyPC9zcGFuPjwvdGQ+XG4gICAgICAgICAgPHRkPlN1cHBvcnQ8L3RkPlxuICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz1cImJhZGdlIGJnLWRhbmdlclwiPlN1c3BlbmRlZDwvc3Bhbj48L3RkPlxuICAgICAgICAgIDx0ZD4yIHdlZWtzIGFnbzwvdGQ+XG4gICAgICAgICAgPHRkPk1heSAxMiwgMjAyMzwvdGQ+XG4gICAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBidG4tZ3JvdXAtc21cIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIHRpdGxlPVwiVmlldyBQcm9maWxlXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1leWVcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiB0aXRsZT1cIkVkaXRcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLXBlbmNpbFwiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiB0aXRsZT1cIlJlYWN0aXZhdGVcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWFycm93LWNsb2Nrd2lzZVwiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgdXNlci1zZWxlY3RcIj48L3RkPlxuICAgICAgICAgIDx0ZD4jVTAwNjwvdGQ+XG4gICAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF2YXRhci1zbSBtZS0yXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdmF0YXItaW5pdGlhbHNcIj5FRDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIEVtaWx5IERhdmlzXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZD5lbWlseS5kQGV4YW1wbGUuY29tPC90ZD5cbiAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1kYW5nZXJcIj5BZG1pbjwvc3Bhbj48L3RkPlxuICAgICAgICAgIDx0ZD5JVDwvdGQ+XG4gICAgICAgICAgPHRkPjxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctc3VjY2Vzc1wiPkFjdGl2ZTwvc3Bhbj48L3RkPlxuICAgICAgICAgIDx0ZD5KdXN0IG5vdzwvdGQ+XG4gICAgICAgICAgPHRkPkp1biAwMSwgMjAyMzwvdGQ+XG4gICAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBidG4tZ3JvdXAtc21cIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIHRpdGxlPVwiVmlldyBQcm9maWxlXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1leWVcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiB0aXRsZT1cIkVkaXRcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLXBlbmNpbFwiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIHRpdGxlPVwiU3VzcGVuZFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktYmFuXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCB1c2VyLXNlbGVjdFwiPjwvdGQ+XG4gICAgICAgICAgPHRkPiNVMDA3PC90ZD5cbiAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyLXNtIG1lLTJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF2YXRhci1pbml0aWFsc1wiPkNHPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgQ2hyaXMgR2FyY2lhXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZD5jaHJpcy5nQGV4YW1wbGUuY29tPC90ZD5cbiAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1zZWNvbmRhcnlcIj5Vc2VyPC9zcGFuPjwvdGQ+XG4gICAgICAgICAgPHRkPkZpbmFuY2U8L3RkPlxuICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz1cImJhZGdlIGJnLXN1Y2Nlc3NcIj5BY3RpdmU8L3NwYW4+PC90ZD5cbiAgICAgICAgICA8dGQ+NiBob3VycyBhZ288L3RkPlxuICAgICAgICAgIDx0ZD5KdWwgMTUsIDIwMjM8L3RkPlxuICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgYnRuLWdyb3VwLXNtXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiB0aXRsZT1cIlZpZXcgUHJvZmlsZVwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktZXllXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgdGl0bGU9XCJFZGl0XCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1wZW5jaWxcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIiB0aXRsZT1cIlN1c3BlbmRcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWJhblwiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgdXNlci1zZWxlY3RcIj48L3RkPlxuICAgICAgICAgIDx0ZD4jVTAwODwvdGQ+XG4gICAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF2YXRhci1zbSBtZS0yXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdmF0YXItaW5pdGlhbHNcIj5BTTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIEFzaGxleSBNYXJ0aW5lelxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQ+YXNobGV5Lm1AZXhhbXBsZS5jb208L3RkPlxuICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz1cImJhZGdlIGJnLXByaW1hcnlcIj5NYW5hZ2VyPC9zcGFuPjwvdGQ+XG4gICAgICAgICAgPHRkPk9wZXJhdGlvbnM8L3RkPlxuICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz1cImJhZGdlIGJnLXN1Y2Nlc3NcIj5BY3RpdmU8L3NwYW4+PC90ZD5cbiAgICAgICAgICA8dGQ+MTIgaG91cnMgYWdvPC90ZD5cbiAgICAgICAgICA8dGQ+QXVnIDIwLCAyMDIzPC90ZD5cbiAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGJ0bi1ncm91cC1zbVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgdGl0bGU9XCJWaWV3IFByb2ZpbGVcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWV5ZVwiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIHRpdGxlPVwiRWRpdFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktcGVuY2lsXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZGFuZ2VyXCIgdGl0bGU9XCJTdXNwZW5kXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1iYW5cIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IHVzZXItc2VsZWN0XCI+PC90ZD5cbiAgICAgICAgICA8dGQ+I1UwMDk8L3RkPlxuICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdmF0YXItc20gbWUtMlwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXZhdGFyLWluaXRpYWxzXCI+S0w8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBLZXZpbiBMZWVcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkPmtldmluLmxlZUBleGFtcGxlLmNvbTwvdGQ+XG4gICAgICAgICAgPHRkPjxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctc2Vjb25kYXJ5XCI+VXNlcjwvc3Bhbj48L3RkPlxuICAgICAgICAgIDx0ZD5EZXNpZ248L3RkPlxuICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz1cImJhZGdlIGJnLXN1Y2Nlc3NcIj5BY3RpdmU8L3NwYW4+PC90ZD5cbiAgICAgICAgICA8dGQ+MSBkYXkgYWdvPC90ZD5cbiAgICAgICAgICA8dGQ+U2VwIDEwLCAyMDIzPC90ZD5cbiAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGJ0bi1ncm91cC1zbVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgdGl0bGU9XCJWaWV3IFByb2ZpbGVcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWV5ZVwiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIHRpdGxlPVwiRWRpdFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktcGVuY2lsXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZGFuZ2VyXCIgdGl0bGU9XCJTdXNwZW5kXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1iYW5cIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IHVzZXItc2VsZWN0XCI+PC90ZD5cbiAgICAgICAgICA8dGQ+I1UwMTA8L3RkPlxuICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdmF0YXItc20gbWUtMlwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXZhdGFyLWluaXRpYWxzXCI+Ulc8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBSYWNoZWwgV2hpdGVcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkPnJhY2hlbC53QGV4YW1wbGUuY29tPC90ZD5cbiAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1zZWNvbmRhcnlcIj5Vc2VyPC9zcGFuPjwvdGQ+XG4gICAgICAgICAgPHRkPkxlZ2FsPC90ZD5cbiAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9XCJiYWRnZSBiZy13YXJuaW5nXCI+SW5hY3RpdmU8L3NwYW4+PC90ZD5cbiAgICAgICAgICA8dGQ+MSB3ZWVrIGFnbzwvdGQ+XG4gICAgICAgICAgPHRkPk9jdCAwNSwgMjAyMzwvdGQ+XG4gICAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBidG4tZ3JvdXAtc21cIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIHRpdGxlPVwiVmlldyBQcm9maWxlXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1leWVcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiB0aXRsZT1cIkVkaXRcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLXBlbmNpbFwiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiB0aXRsZT1cIkFjdGl2YXRlXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS1jaGVjay1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5cbiAgPC9kaXY+XG48L0RlZmluZTpVc2Vyc19EYXRhX1RhYmxlPlxuIiwiPCEtLVxuUnN4X01vZGFsIENvbXBvbmVudFxuXG5CYXNlIG1vZGFsIGNvbXBvbmVudCBmb3IgZGlzcGxheWluZyBkaWFsb2dzLCBmb3JtcywgYW5kIGN1c3RvbSBjb250ZW50LlxuVXNlcyBCb290c3RyYXAgNSBtb2RhbCBhcyBmb3VuZGF0aW9uIHdpdGggY3VzdG9tIHNpemluZyBhbmQgYmVoYXZpb3IuXG5cbkFyZ3M6XG4tICR0aXRsZTogTW9kYWwgdGl0bGUgdGV4dFxuLSAkY2xvc2FibGU6IEFsbG93IEVTQy9iYWNrZHJvcC9YIHRvIGNsb3NlIChkZWZhdWx0OiB0cnVlKVxuLSAkbWF4X3dpZHRoOiBNYXhpbXVtIHdpZHRoIGluIHBpeGVscyAoZGVmYXVsdDogODAwKVxuXG5UaGUgbW9kYWwgYm9keSBhbmQgZm9vdGVyIGFyZSBwb3B1bGF0ZWQgZHluYW1pY2FsbHkgdmlhIHRoZSBNb2RhbC5qcyBBUEkuXG4tLT5cbjxEZWZpbmU6UnN4X01vZGFsPlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbCBmYWRlIHJzeC1tb2RhbFwiIHRhYmluZGV4PVwiLTFcIiAkaWQ9XCJtb2RhbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nXCIgJGlkPVwiZGlhbG9nXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIiAkaWQ9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiAkaWQ9XCJ0aXRsZVwiPjwvaDU+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgJGlkPVwiY2xvc2VfYnRuXCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiICRpZD1cImJvZHlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHktY29udGVudFwiICRpZD1cImJvZHlfY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEeW5hbWljIGNvbnRlbnQgaW5zZXJ0ZWQgaGVyZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiICRpZD1cImZvb3RlclwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIER5bmFtaWMgYnV0dG9ucyBpbnNlcnRlZCBoZXJlIC0tPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1iYWNrZHJvcCBmYWRlXCIgJGlkPVwiYmFja2Ryb3BcIj48L2Rpdj5cbjwvRGVmaW5lOlJzeF9Nb2RhbD5cbiIsIjwhLS1cbkJyZWFkY3J1bWJcblxuQnJlYWRjcnVtYiBuYXZpZ2F0aW9uIGNvbXBvbmVudCBmb2xsb3dpbmcgQm9vdHN0cmFwIDUgc3R5bGluZy5cblVzZXMgdHJhbnNwYXJlbnQgYmFja2dyb3VuZCBhbmQgbm8gcGFkZGluZyBmb3IgY2xlYW4gaW50ZWdyYXRpb24gd2l0aCBQYWdlX0hlYWRlci5cblxuVXNhZ2U6XG48QnJlYWRjcnVtYj5cbiAgPEJyZWFkY3J1bWJfSXRlbSBocmVmPVwiPCU9IFJzeC5Sb3V0ZSgnRnJvbnRlbmRfRGFzaGJvYXJkX0NvbnRyb2xsZXInKSAlPlwiPkRhc2hib2FyZDwvQnJlYWRjcnVtYl9JdGVtPlxuICA8QnJlYWRjcnVtYl9JdGVtIGhyZWY9XCI8JT0gUnN4LlJvdXRlKCdGcm9udGVuZF9DbGllbnRzX0NvbnRyb2xsZXInKSAlPlwiPkNsaWVudHM8L0JyZWFkY3J1bWJfSXRlbT5cbiAgPEJyZWFkY3J1bWJfSXRlbSBhY3RpdmU+VmlldzwvQnJlYWRjcnVtYl9JdGVtPlxuPC9CcmVhZGNydW1iPlxuLS0+XG48RGVmaW5lOkJyZWFkY3J1bWIgdGFnPVwibmF2XCIgYXJpYS1sYWJlbD1cImJyZWFkY3J1bWJcIj5cbiAgPG9sIGNsYXNzPVwiYnJlYWRjcnVtYiBiZy10cmFuc3BhcmVudCBwLTAgbWItMFwiPlxuICAgIDwlPSBjb250ZW50KCkgJT5cbiAgPC9vbD5cbjwvRGVmaW5lOkJyZWFkY3J1bWI+XG4iLCI8IS0tXG5CcmVhZGNydW1iX0l0ZW1cblxuSW5kaXZpZHVhbCBicmVhZGNydW1iIGl0ZW0uIENhbiBiZSBhIGxpbmsgb3IgYWN0aXZlIChjdXJyZW50IHBhZ2UpLlxuXG4kaHJlZiAtIE9wdGlvbmFsIGxpbmsgVVJMLiBJZiBvbWl0dGVkLCByZW5kZXJzIGFzIHBsYWluIHRleHQuXG4kYWN0aXZlIC0gQm9vbGVhbi4gSWYgdHJ1ZSwgcmVuZGVycyBhcyBhY3RpdmUgaXRlbSAoY3VycmVudCBwYWdlKS5cblxuVXNhZ2U6XG48QnJlYWRjcnVtYl9JdGVtIGhyZWY9XCI8JT0gUnN4LlJvdXRlKCdGcm9udGVuZF9EYXNoYm9hcmRfQ29udHJvbGxlcicpICU+XCI+RGFzaGJvYXJkPC9CcmVhZGNydW1iX0l0ZW0+XG48QnJlYWRjcnVtYl9JdGVtIGFjdGl2ZT5DdXJyZW50IFBhZ2U8L0JyZWFkY3J1bWJfSXRlbT5cbi0tPlxuPERlZmluZTpCcmVhZGNydW1iX0l0ZW0gdGFnPVwibGlcIiBjbGFzcz1cImJyZWFkY3J1bWItaXRlbVwiPlxuICA8JSBpZiAodGhpcy5hcmdzLmFjdGl2ZSkgeyAlPlxuICAgIDwlPSBjb250ZW50KCkgJT5cbiAgPCUgfSBlbHNlIGlmICh0aGlzLmFyZ3MuaHJlZikgeyAlPlxuICAgIDxhIGhyZWY9XCI8JT0gdGhpcy5hcmdzLmhyZWYgJT5cIj48JT0gY29udGVudCgpICU+PC9hPlxuICA8JSB9IGVsc2UgeyAlPlxuICAgIDwlPSBjb250ZW50KCkgJT5cbiAgPCUgfSAlPlxuPC9EZWZpbmU6QnJlYWRjcnVtYl9JdGVtPlxuIiwiPCEtLVxuRGlzcGxheXMgYSBjbGllbnQgbmFtZS5cbkxvYWRzIGNsaWVudCBkYXRhIHZpYSBBamF4IGFuZCBzaG93cyB0aGUgbmFtZSBvbmNlIGxvYWRlZC5cblxuJGNsaWVudF9pZCAtIENsaWVudCBJRCB0byBkaXNwbGF5XG4kcGxhY2Vob2xkZXIgLSBUZXh0IHRvIHNob3cgd2hpbGUgbG9hZGluZyAoZGVmYXVsdDogXCItLS0tLS1cIilcblxuV2lkZ2V0IGludGVyZmFjZTpcbi0gdmFsKCkgLSBHZXQgY3VycmVudCBjbGllbnRfaWRcbi0gdmFsKGlkKSAtIFNldCBuZXcgY2xpZW50X2lkIGFuZCByZWxvYWRcbi0tPlxuPERlZmluZTpDbGllbnRfTGFiZWwgdGFnPVwic3BhblwiIGNsYXNzPVwiV2lkZ2V0XCI+XG5cbiAgICA8aSBjbGFzcz1cImJpIGJpLWJ1aWxkaW5nXCI+PC9pPlxuICAgIDwlIGlmICh0aGlzLmRhdGEubG9hZGluZykgeyAlPlxuICAgICAgICA8JT0gdGhpcy5hcmdzLnBsYWNlaG9sZGVyIHx8ICctLS0tLS0nICU+XG4gICAgPCUgfSBlbHNlIGlmICh0aGlzLmRhdGEuY2xpZW50KSB7ICU+XG4gICAgICAgIDwlPSB0aGlzLmRhdGEuY2xpZW50Lm5hbWUgJT4gY2FkZmRzYVxuICAgIDwlIH0gZWxzZSB7ICU+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZFwiPlVua25vd24gQ2xpZW50PC9zcGFuPlxuICAgIDwlIH0gJT5cblxuPC9EZWZpbmU6Q2xpZW50X0xhYmVsPiIsIjwhLS1cbkNsaWVudF9MYWJlbF9MaW5rXG5cbkRpc3BsYXlzIGEgY2xpY2thYmxlIGNsaWVudCBuYW1lIHRoYXQgbGlua3MgdG8gdGhlIGNsaWVudCB2aWV3IHBhZ2UuXG5Mb2FkcyBjbGllbnQgZGF0YSB2aWEgQWpheCBhbmQgc2hvd3MgdGhlIG5hbWUgb25jZSBsb2FkZWQuXG5cbiRjbGllbnRfaWQgLSBDbGllbnQgSUQgdG8gZGlzcGxheVxuJHBsYWNlaG9sZGVyIC0gVGV4dCB0byBzaG93IHdoaWxlIGxvYWRpbmcgKGRlZmF1bHQ6IFwiLS0tLS0tXCIpXG5cbldpZGdldCBpbnRlcmZhY2U6XG4tIHZhbCgpIC0gR2V0IGN1cnJlbnQgY2xpZW50X2lkXG4tIHZhbChpZCkgLSBTZXQgbmV3IGNsaWVudF9pZCBhbmQgcmVsb2FkXG4tLT5cbjxEZWZpbmU6Q2xpZW50X0xhYmVsX0xpbmsgdGFnPVwiYVwiIGNsYXNzPVwiV2lkZ2V0XCI+XG5cbiAgICA8aSBjbGFzcz1cImJpIGJpLWJ1aWxkaW5nXCI+PC9pPlxuICAgIDwlIGlmICh0aGlzLmRhdGEubG9hZGluZykgeyAlPlxuICAgICAgICA8JT0gdGhpcy5hcmdzLnBsYWNlaG9sZGVyIHx8ICctLS0tLS0nICU+XG4gICAgPCUgfSBlbHNlIGlmICh0aGlzLmRhdGEuY2xpZW50KSB7ICU+XG4gICAgICAgIDwlPSB0aGlzLmRhdGEuY2xpZW50Lm5hbWUgJT5cbiAgICA8JSB9IGVsc2UgeyAlPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWRcIj5Vbmtub3duIENsaWVudDwvc3Bhbj5cbiAgICA8JSB9ICU+XG5cbjwvRGVmaW5lOkNsaWVudF9MYWJlbF9MaW5rPiIsIjwhLS1cblRleHRfSW5wdXRcblxuQmFzaWMgdGV4dCBpbnB1dCB3aWRnZXQuIFN1cHBvcnRzIHZhcmlvdXMgaW5wdXQgdHlwZXMgKHRleHQsIGVtYWlsLCB1cmwsIHRlbCwgbnVtYmVyLCB0ZXh0YXJlYSkuXG5cbiR0eXBlIC0gSW5wdXQgdHlwZSAoZGVmYXVsdDogdGV4dCkuIFVzZSBcInRleHRhcmVhXCIgZm9yIG11bHRpbGluZSB0ZXh0LlxuJHJvd3MgLSBOdW1iZXIgb2Ygcm93cyBmb3IgdGV4dGFyZWEgKGRlZmF1bHQ6IDMpXG4kcGxhY2Vob2xkZXIgLSBQbGFjZWhvbGRlciB0ZXh0XG4kcHJlZml4IC0gVGV4dCB0byBwcmVwZW5kIGJlZm9yZSBpbnB1dCAoY3JlYXRlcyBpbnB1dC1ncm91cClcbiRzdWZmaXggLSBUZXh0IHRvIGFwcGVuZCBhZnRlciBpbnB1dCAoY3JlYXRlcyBpbnB1dC1ncm91cClcbiRtaW4gLSBNaW5pbXVtIHZhbHVlIGZvciBudW1iZXIgaW5wdXRzXG4kbWF4IC0gTWF4aW11bSB2YWx1ZSBmb3IgbnVtYmVyIGlucHV0c1xuJG1heGxlbmd0aCAtIE1heGltdW0gbGVuZ3RoIGZvciB0ZXh0IGlucHV0c1xuJGRpc2FibGVkIC0gQm9vbGVhbiB0byBkaXNhYmxlIHRoZSBpbnB1dCAoc3RpbGwgcmV0dXJucyB2YWx1ZSB2aWEgdmFsKCkpXG4kc2VlZGVyIC0gU2VlZGVyIGZ1bmN0aW9uIG5hbWUgKGUuZy4sIFwiZmlyc3RfbmFtZVwiIGNhbGxzIFJzeF9SYW5kb21fVmFsdWVzLmZpcnN0X25hbWUoKSlcblxuVXNhZ2U6XG48VGV4dF9JbnB1dCAkdHlwZT1cImVtYWlsXCIgJHBsYWNlaG9sZGVyPVwidXNlckBleGFtcGxlLmNvbVwiIC8+XG48VGV4dF9JbnB1dCAkdHlwZT1cInVybFwiICRwbGFjZWhvbGRlcj1cImh0dHBzOi8vZXhhbXBsZS5jb21cIiAvPlxuPFRleHRfSW5wdXQgJHR5cGU9XCJ0ZXh0YXJlYVwiICRyb3dzPTUgLz5cbjxUZXh0X0lucHV0ICRwcmVmaXg9XCJAXCIgJHBsYWNlaG9sZGVyPVwidXNlcm5hbWVcIiAvPlxuPFRleHRfSW5wdXQgJHNlZWRlcj1cImNvbXBhbnlfbmFtZVwiIC8+XG4tLT5cbjxEZWZpbmU6VGV4dF9JbnB1dCBjbGFzcz1cIldpZGdldFwiPlxuICAgIDwlIGlmICh0aGlzLmFyZ3MudHlwZSA9PT0gJ3RleHRhcmVhJykgeyAlPlxuICAgICAgICA8dGV4dGFyZWEgJGlkPVwiaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgcm93cz1cIjwlPSB0aGlzLmFyZ3Mucm93cyB8fCAzICU+XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiPCU9IHRoaXMuYXJncy5wbGFjZWhvbGRlciB8fCAnJyAlPlwiXG4gICAgICAgICAgICAgICAgICA8JSBpZiAodGhpcy5hcmdzLmRpc2FibGVkKSB7ICU+ZGlzYWJsZWQ8JSB9ICU+PjwlPSB0aGlzLmRhdGEudmFsdWUgJT48L3RleHRhcmVhPlxuICAgIDwlIH0gZWxzZSBpZiAodGhpcy5hcmdzLnByZWZpeCB8fCB0aGlzLmFyZ3Muc3VmZml4KSB7ICU+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgPCUgaWYgKHRoaXMuYXJncy5wcmVmaXgpIHsgJT5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIj48JT0gdGhpcy5hcmdzLnByZWZpeCAlPjwvc3Bhbj5cbiAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICAgIDxpbnB1dCAkaWQ9XCJpbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgdHlwZT1cIjwlPSB0aGlzLmFyZ3MudHlwZSB8fCAndGV4dCcgJT5cIlxuICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIjwlPSB0aGlzLmRhdGEudmFsdWUgJT5cIlxuICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiPCU9IHRoaXMuYXJncy5wbGFjZWhvbGRlciB8fCAnJyAlPlwiXG4gICAgICAgICAgICAgICAgICAgPCUgaWYgKHRoaXMuYXJncy5taW4gIT09IHVuZGVmaW5lZCkgeyAlPm1pbj1cIjwlPSB0aGlzLmFyZ3MubWluICU+XCI8JSB9ICU+XG4gICAgICAgICAgICAgICAgICAgPCUgaWYgKHRoaXMuYXJncy5tYXggIT09IHVuZGVmaW5lZCkgeyAlPm1heD1cIjwlPSB0aGlzLmFyZ3MubWF4ICU+XCI8JSB9ICU+XG4gICAgICAgICAgICAgICAgICAgPCUgaWYgKHRoaXMuYXJncy5tYXhsZW5ndGgpIHsgJT5tYXhsZW5ndGg9XCI8JT0gdGhpcy5hcmdzLm1heGxlbmd0aCAlPlwiPCUgfSAlPlxuICAgICAgICAgICAgICAgICAgIDwlIGlmICh0aGlzLmFyZ3MuZGlzYWJsZWQpIHsgJT5kaXNhYmxlZDwlIH0gJT4gLz5cbiAgICAgICAgICAgIDwlIGlmICh0aGlzLmFyZ3Muc3VmZml4KSB7ICU+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCI+PCU9IHRoaXMuYXJncy5zdWZmaXggJT48L3NwYW4+XG4gICAgICAgICAgICA8JSB9ICU+XG4gICAgICAgIDwvZGl2PlxuICAgIDwlIH0gZWxzZSB7ICU+XG4gICAgICAgIDxpbnB1dCAkaWQ9XCJpbnB1dFwiXG4gICAgICAgICAgICAgICB0eXBlPVwiPCU9IHRoaXMuYXJncy50eXBlIHx8ICd0ZXh0JyAlPlwiXG4gICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICB2YWx1ZT1cIjwlPSB0aGlzLmRhdGEudmFsdWUgJT5cIlxuICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCI8JT0gdGhpcy5hcmdzLnBsYWNlaG9sZGVyIHx8ICcnICU+XCJcbiAgICAgICAgICAgICAgIDwlIGlmICh0aGlzLmFyZ3MubWluICE9PSB1bmRlZmluZWQpIHsgJT5taW49XCI8JT0gdGhpcy5hcmdzLm1pbiAlPlwiPCUgfSAlPlxuICAgICAgICAgICAgICAgPCUgaWYgKHRoaXMuYXJncy5tYXggIT09IHVuZGVmaW5lZCkgeyAlPm1heD1cIjwlPSB0aGlzLmFyZ3MubWF4ICU+XCI8JSB9ICU+XG4gICAgICAgICAgICAgICA8JSBpZiAodGhpcy5hcmdzLm1heGxlbmd0aCkgeyAlPm1heGxlbmd0aD1cIjwlPSB0aGlzLmFyZ3MubWF4bGVuZ3RoICU+XCI8JSB9ICU+XG4gICAgICAgICAgICAgICA8JSBpZiAodGhpcy5hcmdzLmRpc2FibGVkKSB7ICU+ZGlzYWJsZWQ8JSB9ICU+IC8+XG4gICAgPCUgfSAlPlxuPC9EZWZpbmU6VGV4dF9JbnB1dD5cbiIsIjwhLS1cblNlbGVjdF9JbnB1dFxuXG5Ecm9wZG93biBzZWxlY3Qgd2lkZ2V0IGZvciBmb3Jtcy5cblxuJG9wdGlvbnMgLSBBcnJheSBvZiBvcHRpb25zOiBbe3ZhbHVlOiAndmFsJywgbGFiZWw6ICdMYWJlbCd9LCAuLi5dIG9yIHNpbXBsZSBhcnJheSBbJ3ZhbDEnLCAndmFsMiddXG4kcGxhY2Vob2xkZXIgLSBQbGFjZWhvbGRlciBvcHRpb24gdGV4dCAoY3JlYXRlcyBlbXB0eSBvcHRpb24gYXQgdG9wKVxuJGRpc2FibGVkIC0gQm9vbGVhbiB0byBkaXNhYmxlIHRoZSBzZWxlY3QgKHN0aWxsIHJldHVybnMgdmFsdWUgdmlhIHZhbCgpKVxuJHNlZWRlciAtIFNlZWRlciBmdW5jdGlvbiBuYW1lIGZvciB0ZXN0IGRhdGFcblxuV2lkZ2V0IGludGVyZmFjZTpcbi0gdmFsKCkgLSBHZXQvc2V0IHNlbGVjdGVkIHZhbHVlXG4tIHNlZWQoKSAtIEZpbGxzIHdpdGggcmFuZG9tIHZhbHVlXG4tLT5cbjxEZWZpbmU6U2VsZWN0X0lucHV0IGNsYXNzPVwiV2lkZ2V0XCI+XG4gICAgPHNlbGVjdCAkaWQ9XCJpbnB1dFwiIDwlIGlmICh0aGlzLmFyZ3MuZGlzYWJsZWQpIHsgJT5kaXNhYmxlZDwlIH0gJT4+XG4gICAgICAgIDwlIGlmICh0aGlzLmFyZ3MucGxhY2Vob2xkZXIpIHsgJT5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj48JT0gdGhpcy5hcmdzLnBsYWNlaG9sZGVyICU+PC9vcHRpb24+XG4gICAgICAgIDwlIH0gJT5cbiAgICAgICAgPCUgaWYgKHRoaXMuYXJncy5vcHRpb25zKSB7ICU+XG4gICAgICAgICAgICA8JSBmb3IgKGxldCBvcHQgb2YgdGhpcy5hcmdzLm9wdGlvbnMpIHsgJT5cbiAgICAgICAgICAgICAgICA8JSBpZiAodHlwZW9mIG9wdCA9PT0gJ29iamVjdCcpIHsgJT5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjwlPSBvcHQudmFsdWUgJT5cIiA8JSBpZiAodGhpcy5kYXRhLnZhbHVlID09IG9wdC52YWx1ZSkgeyAlPnNlbGVjdGVkPCUgfSAlPj48JT0gb3B0LmxhYmVsICU+PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPCUgfSBlbHNlIHsgJT5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjwlPSBvcHQgJT5cIiA8JSBpZiAodGhpcy5kYXRhLnZhbHVlID09IG9wdCkgeyAlPnNlbGVjdGVkPCUgfSAlPj48JT0gb3B0ICU+PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPCUgfSAlPlxuICAgICAgICAgICAgPCUgfSAlPlxuICAgICAgICA8JSB9ICU+XG4gICAgPC9zZWxlY3Q+XG48L0RlZmluZTpTZWxlY3RfSW5wdXQ+XG4iLCI8IS0tXG5BamF4X1NlbGVjdF9JbnB1dFxuXG5Ecm9wZG93biBzZWxlY3Qgd2lkZ2V0IHRoYXQgbG9hZHMgb3B0aW9ucyB2aWEgQWpheC5cbkV4dGVuZHMgU2VsZWN0X0lucHV0IHdpdGggQWpheCBkYXRhIGxvYWRpbmcgY2FwYWJpbGl0eS5cblxuJGRhdGEgLSBBamF4IGVuZHBvaW50IFVSTCB0aGF0IHJldHVybnMgYXJyYXkgb2Ygb3B0aW9uc1xuJHBsYWNlaG9sZGVyIC0gUGxhY2Vob2xkZXIgb3B0aW9uIHRleHQgKGRlZmF1bHQ6IFwiUGxlYXNlIHdhaXQuLi5cIilcbiRkaXNhYmxlZCAtIEJvb2xlYW4gdG8gZGlzYWJsZSB0aGUgc2VsZWN0XG4kc2VlZGVyIC0gU2VlZGVyIGZ1bmN0aW9uIG5hbWUgZm9yIHRlc3QgZGF0YVxuXG5XaWRnZXQgaW50ZXJmYWNlOlxuLSB2YWwoKSAtIEdldC9zZXQgc2VsZWN0ZWQgdmFsdWUgKGhhbmRsZXMgcHJlLWluaXRpYWxpemF0aW9uIGNhbGxzKVxuLSBzZWVkKCkgLSBGaWxscyB3aXRoIHJhbmRvbSB2YWx1ZVxuXG5GZWF0dXJlczpcbi0gTG9hZHMgb3B0aW9ucyBhc3luY2hyb25vdXNseSBmcm9tIGVuZHBvaW50IGR1cmluZyBvbl9sb2FkKClcbi0gU2hvd3MgXCJQbGVhc2Ugd2FpdC4uLlwiIHdoaWxlIGxvYWRpbmdcbi0gSGFuZGxlcyB2YWwoKSBjYWxscyBiZWZvcmUgaW5pdGlhbGl6YXRpb24gY29tcGxldGVzXG4tIFJlLXJlbmRlcnMgd2l0aCBhY3R1YWwgb3B0aW9ucyBvbmNlIGxvYWRlZFxuLS0+XG48RGVmaW5lOkFqYXhfU2VsZWN0X0lucHV0IGV4dGVuZHM9XCJTZWxlY3RfSW5wdXRcIiBjbGFzcz1cIldpZGdldFwiPlxuICAgIDxzZWxlY3QgJGlkPVwiaW5wdXRcIiA8JSBpZiAodGhpcy5hcmdzLmRpc2FibGVkKSB7ICU+ZGlzYWJsZWQ8JSB9ICU+PlxuICAgICAgICA8JSBpZiAoIXRoaXMuZGF0YS5zZWxlY3RfdmFsdWVzIHx8IHRoaXMuZGF0YS5zZWxlY3RfdmFsdWVzLmxlbmd0aCA9PT0gMCkgeyAlPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPjwlPSB0aGlzLmFyZ3MucGxhY2Vob2xkZXIgfHwgJ1BsZWFzZSB3YWl0Li4uJyAlPjwvb3B0aW9uPlxuICAgICAgICA8JSB9IGVsc2UgeyAlPlxuICAgICAgICAgICAgPCUgaWYgKHRoaXMuYXJncy5wbGFjZWhvbGRlcikgeyAlPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj48JT0gdGhpcy5hcmdzLnBsYWNlaG9sZGVyICU+PC9vcHRpb24+XG4gICAgICAgICAgICA8JSB9ICU+XG4gICAgICAgICAgICA8JSBmb3IgKGxldCBvcHQgb2YgdGhpcy5kYXRhLnNlbGVjdF92YWx1ZXMpIHsgJT5cbiAgICAgICAgICAgICAgICA8JSBpZiAodHlwZW9mIG9wdCA9PT0gJ29iamVjdCcpIHsgJT5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjwlPSBvcHQudmFsdWUgJT5cIiA8JSBpZiAodGhpcy5kYXRhLnZhbHVlID09IG9wdC52YWx1ZSkgeyAlPnNlbGVjdGVkPCUgfSAlPj48JT0gb3B0LmxhYmVsICU+PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPCUgfSBlbHNlIHsgJT5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjwlPSBvcHQgJT5cIiA8JSBpZiAodGhpcy5kYXRhLnZhbHVlID09IG9wdCkgeyAlPnNlbGVjdGVkPCUgfSAlPj48JT0gb3B0ICU+PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPCUgfSAlPlxuICAgICAgICAgICAgPCUgfSAlPlxuICAgICAgICA8JSB9ICU+XG4gICAgPC9zZWxlY3Q+XG48L0RlZmluZTpBamF4X1NlbGVjdF9JbnB1dD5cbiIsIjwhLS1cbkNoZWNrYm94X0lucHV0XG5cbkNoZWNrYm94IHdpZGdldCBmb3IgZm9ybXMuXG5cbiRsYWJlbCAtIExhYmVsIHRleHQgdG8gZGlzcGxheSBuZXh0IHRvIGNoZWNrYm94XG4kY2hlY2tlZF92YWx1ZSAtIFZhbHVlIHdoZW4gY2hlY2tlZCAoZGVmYXVsdDogXCIxXCIpXG4kdW5jaGVja2VkX3ZhbHVlIC0gVmFsdWUgd2hlbiB1bmNoZWNrZWQgKGRlZmF1bHQ6IFwiMFwiKVxuJGRpc2FibGVkIC0gQm9vbGVhbiB0byBkaXNhYmxlIHRoZSBjaGVja2JveCAoc3RpbGwgcmV0dXJucyB2YWx1ZSB2aWEgdmFsKCkpXG5cbldpZGdldCBpbnRlcmZhY2U6XG4tIHZhbCgpIC0gR2V0L3NldCBjaGVja2VkIHN0YXRlIChyZXR1cm5zIGNoZWNrZWRfdmFsdWUgb3IgdW5jaGVja2VkX3ZhbHVlKVxuLSBzZWVkKCkgLSBSYW5kb21seSBjaGVja3MvdW5jaGVja3Ncbi0tPlxuPERlZmluZTpDaGVja2JveF9JbnB1dCBjbGFzcz1cIldpZGdldFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCI+XG4gICAgICAgIDxpbnB1dCAkaWQ9XCJpbnB1dFwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIDwlIGlmICh0aGlzLmRhdGEuY2hlY2tlZCkgeyAlPmNoZWNrZWQ8JSB9ICU+IDwlIGlmICh0aGlzLmFyZ3MuZGlzYWJsZWQpIHsgJT5kaXNhYmxlZDwlIH0gJT4+XG4gICAgICAgIDwlIGlmICh0aGlzLmFyZ3MubGFiZWwpIHsgJT5cbiAgICAgICAgICAgIDxsYWJlbCAkaWQ9XCJsYWJlbFwiIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiPlxuICAgICAgICAgICAgICAgIDwlPSB0aGlzLmFyZ3MubGFiZWwgJT5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwlIH0gJT5cbiAgICA8L2Rpdj5cbjwvRGVmaW5lOkNoZWNrYm94X0lucHV0PlxuIiwiPCEtLVxuV3lzaXd5Z19JbnB1dFxuXG5XWVNJV1lHIGVkaXRvciB3aWRnZXQgZm9yIGZvcm1zIHVzaW5nIFF1aWxsLlxuXG4kcGxhY2Vob2xkZXIgLSBQbGFjZWhvbGRlciB0ZXh0XG4kc2VlZGVyIC0gU2VlZGVyIGZ1bmN0aW9uIG5hbWUgZm9yIHRlc3QgZGF0YVxuXG5XaWRnZXQgaW50ZXJmYWNlOlxuLSB2YWwoKSAtIEdldC9zZXQgSFRNTCBjb250ZW50XG4tIHNlZWQoKSAtIEZpbGxzIHdpdGggcmFuZG9tIGNvbnRlbnRcbi0tPlxuPERlZmluZTpXeXNpd3lnX0lucHV0IGNsYXNzPVwiV2lkZ2V0XCI+XG4gICAgPGRpdiAkaWQ9XCJlZGl0b3JcIiBzdHlsZT1cIm1pbi1oZWlnaHQ6IDIwMHB4OyBiYWNrZ3JvdW5kOiB3aGl0ZTtcIj48L2Rpdj5cbiAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiICRpZD1cImhpZGRlbl9pbnB1dFwiIC8+XG48L0RlZmluZTpXeXNpd3lnX0lucHV0PlxuIiwiPCEtLVxuQ291bnRyeV9TZWxlY3RfSW5wdXRcblxuU3BlY2lhbGl6ZWQgc2VsZWN0IGZvciBjb3VudHJ5IGRyb3Bkb3ducyB3aXRoIGRlZmF1bHQgY291bnRyeSBzdXBwb3J0LlxuRXh0ZW5kcyBBamF4X1NlbGVjdF9JbnB1dCB3aXRoIGNvdW50cnktc3BlY2lmaWMgYmVoYXZpb3IuXG5cbiRkYXRhIC0gQWpheCBlbmRwb2ludCBmb3IgY291bnRyeSBkYXRhIChvcHRpb25hbCwgZGVmYXVsdHMgdG8gUnN4X1JlZmVyZW5jZV9EYXRhX0NvbnRyb2xsZXIuY291bnRyaWVzKCkpXG4kcGxhY2Vob2xkZXIgLSBQbGFjZWhvbGRlciB0ZXh0IChkZWZhdWx0OiBcIlNlbGVjdCBDb3VudHJ5Li4uXCIpXG4kZGVmYXVsdF9jb3VudHJ5IC0gRGVmYXVsdCBjb3VudHJ5IGNvZGUgKGUuZy4gXCJVU1wiKSB0byBwcmUtc2VsZWN0IGFuZCBtb3ZlIHRvIHRvcFxuJGRpc2FibGVkIC0gQm9vbGVhbiB0byBkaXNhYmxlIHRoZSBzZWxlY3RcblxuRmVhdHVyZXM6XG4tIExvYWRzIGNvdW50cnkgbGlzdCB2aWEgQWpheCBhdXRvbWF0aWNhbGx5XG4tIFByZS1zZWxlY3RzIGRlZmF1bHQgY291bnRyeSBpZiBubyB2YWx1ZSBzZXRcbi0gTW92ZXMgZGVmYXVsdCBjb3VudHJ5IHRvIHRvcCBvZiBsaXN0XG4tIEluaGVyaXRzIGFsbCBBamF4X1NlbGVjdF9JbnB1dCBiZWhhdmlvciAoVG9tIFNlbGVjdCwgc2VhcmNoLCBsb2FkaW5nIHN0YXRlcywgZXRjLilcbi0tPlxuPERlZmluZTpDb3VudHJ5X1NlbGVjdF9JbnB1dCBleHRlbmRzPVwiQWpheF9TZWxlY3RfSW5wdXRcIiBjbGFzcz1cIldpZGdldFwiPlxuICAgIDxzZWxlY3QgJGlkPVwiaW5wdXRcIiA8JSBpZiAodGhpcy5hcmdzLmRpc2FibGVkKSB7ICU+ZGlzYWJsZWQ8JSB9ICU+PlxuICAgICAgICA8JSBpZiAoIXRoaXMuZGF0YS5zZWxlY3RfdmFsdWVzIHx8IHRoaXMuZGF0YS5zZWxlY3RfdmFsdWVzLmxlbmd0aCA9PT0gMCkgeyAlPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPjwlPSB0aGlzLmFyZ3MucGxhY2Vob2xkZXIgfHwgJ1BsZWFzZSB3YWl0Li4uJyAlPjwvb3B0aW9uPlxuICAgICAgICA8JSB9IGVsc2UgeyAlPlxuICAgICAgICAgICAgPCUgaWYgKHRoaXMuYXJncy5wbGFjZWhvbGRlcikgeyAlPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj48JT0gdGhpcy5hcmdzLnBsYWNlaG9sZGVyICU+PC9vcHRpb24+XG4gICAgICAgICAgICA8JSB9ICU+XG4gICAgICAgICAgICA8JSBmb3IgKGxldCBvcHQgb2YgdGhpcy5kYXRhLnNlbGVjdF92YWx1ZXMpIHsgJT5cbiAgICAgICAgICAgICAgICA8JSBpZiAodHlwZW9mIG9wdCA9PT0gJ29iamVjdCcpIHsgJT5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjwlPSBvcHQudmFsdWUgJT5cIiA8JSBpZiAodGhpcy5kYXRhLnZhbHVlID09IG9wdC52YWx1ZSkgeyAlPnNlbGVjdGVkPCUgfSAlPj48JT0gb3B0LmxhYmVsICU+PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPCUgfSBlbHNlIHsgJT5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjwlPSBvcHQgJT5cIiA8JSBpZiAodGhpcy5kYXRhLnZhbHVlID09IG9wdCkgeyAlPnNlbGVjdGVkPCUgfSAlPj48JT0gb3B0ICU+PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPCUgfSAlPlxuICAgICAgICAgICAgPCUgfSAlPlxuICAgICAgICA8JSB9ICU+XG4gICAgPC9zZWxlY3Q+XG48L0RlZmluZTpDb3VudHJ5X1NlbGVjdF9JbnB1dD5cbiIsIjwhLS1cblN0YXRlX1NlbGVjdF9JbnB1dFxuXG5TcGVjaWFsaXplZCBzZWxlY3QgZm9yIHN0YXRlL3Byb3ZpbmNlL3JlZ2lvbiBkcm9wZG93bnMgd2l0aCBjb3VudHJ5LXNwZWNpZmljIGxpc3RzLlxuRXh0ZW5kcyBBamF4X1NlbGVjdF9JbnB1dCB3aXRoIHN0YXRlLXNwZWNpZmljIGJlaGF2aW9yLlxuXG4kZGF0YSAtIEFqYXggZW5kcG9pbnQgZm9yIHN0YXRlIGRhdGEgKG9wdGlvbmFsLCBkZWZhdWx0cyB0byBSc3hfUmVmZXJlbmNlX0RhdGFfQ29udHJvbGxlci5zdGF0ZXMoKSlcbiRwbGFjZWhvbGRlciAtIFBsYWNlaG9sZGVyIHRleHQgKGRlZmF1bHQ6IFwiU2VsZWN0IFN0YXRlLi4uXCIpXG4kY291bnRyeV9jb2RlIC0gSW5pdGlhbCBjb3VudHJ5IGNvZGUgKGUuZy4gXCJVU1wiKSB0byBsb2FkIHN0YXRlcyBmb3JcbiRkaXNhYmxlZCAtIEJvb2xlYW4gdG8gZGlzYWJsZSB0aGUgc2VsZWN0XG5cbkZlYXR1cmVzOlxuLSBMb2FkcyBzdGF0ZSBsaXN0IHZpYSBBamF4IGJhc2VkIG9uIGNvdW50cnkgY29kZVxuLSBzZXRfY291bnRyeV9jb2RlKGNvZGUpIG1ldGhvZCB0byBjaGFuZ2UgY291bnRyeSBhbmQgcmVsb2FkIHN0YXRlc1xuLSBSZW1haW5zIGRpc2FibGVkIHVudGlsIGNvdW50cnkgY29kZSBpcyBzZXRcbi0gUmV0YWlucyB2YWx1ZSBzZXQgdmlhIHZhbCgpIHVudGlsIHN0YXRlcyBsb2FkXG4tIEluaGVyaXRzIGFsbCBBamF4X1NlbGVjdF9JbnB1dCBiZWhhdmlvciAoVG9tIFNlbGVjdCwgc2VhcmNoLCBsb2FkaW5nIHN0YXRlcywgZXRjLilcbi0tPlxuPERlZmluZTpTdGF0ZV9TZWxlY3RfSW5wdXQgZXh0ZW5kcz1cIkFqYXhfU2VsZWN0X0lucHV0XCIgY2xhc3M9XCJXaWRnZXRcIj5cbiAgICA8c2VsZWN0ICRpZD1cImlucHV0XCIgPCUgaWYgKHRoaXMuYXJncy5kaXNhYmxlZCB8fCAhdGhpcy5kYXRhLmNvdW50cnlfY29kZSkgeyAlPmRpc2FibGVkPCUgfSAlPj5cbiAgICAgICAgPCUgaWYgKCF0aGlzLmRhdGEuc2VsZWN0X3ZhbHVlcyB8fCB0aGlzLmRhdGEuc2VsZWN0X3ZhbHVlcy5sZW5ndGggPT09IDApIHsgJT5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj48JT0gdGhpcy5hcmdzLnBsYWNlaG9sZGVyIHx8ICdTZWxlY3QgU3RhdGUuLi4nICU+PC9vcHRpb24+XG4gICAgICAgIDwlIH0gZWxzZSB7ICU+XG4gICAgICAgICAgICA8JSBpZiAodGhpcy5hcmdzLnBsYWNlaG9sZGVyKSB7ICU+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPjwlPSB0aGlzLmFyZ3MucGxhY2Vob2xkZXIgJT48L29wdGlvbj5cbiAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgICAgIDwlIGZvciAobGV0IG9wdCBvZiB0aGlzLmRhdGEuc2VsZWN0X3ZhbHVlcykgeyAlPlxuICAgICAgICAgICAgICAgIDwlIGlmICh0eXBlb2Ygb3B0ID09PSAnb2JqZWN0JykgeyAlPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiPCU9IG9wdC52YWx1ZSAlPlwiIDwlIGlmICh0aGlzLmRhdGEudmFsdWUgPT0gb3B0LnZhbHVlKSB7ICU+c2VsZWN0ZWQ8JSB9ICU+PjwlPSBvcHQubGFiZWwgJT48L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8JSB9IGVsc2UgeyAlPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiPCU9IG9wdCAlPlwiIDwlIGlmICh0aGlzLmRhdGEudmFsdWUgPT0gb3B0KSB7ICU+c2VsZWN0ZWQ8JSB9ICU+PjwlPSBvcHQgJT48L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8JSB9ICU+XG4gICAgICAgICAgICA8JSB9ICU+XG4gICAgICAgIDwlIH0gJT5cbiAgICA8L3NlbGVjdD5cbjwvRGVmaW5lOlN0YXRlX1NlbGVjdF9JbnB1dD5cbiIsIjwhLS1cblByb2ZpbGVfUGhvdG9fSW5wdXRcblxuUHJvZmlsZSBwaG90byB1cGxvYWQgd2lkZ2V0IHRoYXQgZGlzcGxheXMgYSB0aHVtYm5haWwgYW5kIHByb3ZpZGVzIHVwbG9hZCBmdW5jdGlvbmFsaXR5LlxuXG4kd2lkdGggLSBUaHVtYm5haWwgd2lkdGggaW4gcGl4ZWxzIChkZWZhdWx0OiA5NilcbiRoZWlnaHQgLSBUaHVtYm5haWwgaGVpZ2h0IGluIHBpeGVscyAoZGVmYXVsdDogOTYpXG4kYWNjZXB0IC0gRmlsZSB0eXBlcyB0byBhY2NlcHQgKGRlZmF1bHQ6IGltYWdlL2pwZWcsaW1hZ2UvcG5nLGltYWdlL2dpZilcbiRtYXhfc2l6ZSAtIE1heGltdW0gZmlsZSBzaXplIGluIE1CIChkZWZhdWx0OiAyKVxuJHBsYWNlaG9sZGVyIC0gUGxhY2Vob2xkZXIgaW1hZ2UgVVJMIHdoZW4gbm8gcGhvdG8gaXMgc2V0XG4kc2hvd19yZW1vdmUgLSBTaG93IHJlbW92ZSBidXR0b24gKGRlZmF1bHQ6IGZhbHNlKVxuXG5UaGUgd2lkZ2V0IHZhbHVlICh2aWEgdmFsKCkgZ2V0dGVyL3NldHRlcikgaXMgdGhlIGF0dGFjaG1lbnQga2V5LlxuXG5Vc2FnZTpcbjxGb3JtX0ZpZWxkICRuYW1lPVwicHJvZmlsZV9waG90b1wiICRsYWJlbD1cIlByb2ZpbGUgUGhvdG9cIj5cbiAgICA8UHJvZmlsZV9QaG90b19JbnB1dCAvPlxuPC9Gb3JtX0ZpZWxkPlxuXG48UHJvZmlsZV9QaG90b19JbnB1dCAkd2lkdGg9MTI4ICRoZWlnaHQ9MTI4ICRzaG93X3JlbW92ZT10cnVlIC8+XG4tLT5cbjxEZWZpbmU6UHJvZmlsZV9QaG90b19JbnB1dCBjbGFzcz1cIldpZGdldFwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlXCI+XG4gICAgICAgICAgICA8JSBpZiAodGhpcy5kYXRhLnRodW1ibmFpbF91cmwpIHsgJT5cbiAgICAgICAgICAgICAgICA8aW1nICRpZD1cInBob3RvXCJcbiAgICAgICAgICAgICAgICAgICAgc3JjPVwiPCU9IHRoaXMuZGF0YS50aHVtYm5haWxfdXJsICU+XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLWNpcmNsZSBtZS0zXCJcbiAgICAgICAgICAgICAgICAgICAgYWx0PVwiUHJvZmlsZSBQaG90b1wiXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiPCU9IHRoaXMuYXJncy53aWR0aCB8fCA5NiAlPlwiXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjwlPSB0aGlzLmFyZ3MuaGVpZ2h0IHx8IDk2ICU+XCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cIm9wYWNpdHk6IDE7XCI+XG4gICAgICAgICAgICA8JSB9IGVsc2UgeyAlPlxuICAgICAgICAgICAgICAgIDxkaXYgJGlkPVwicGhvdG9cIiBjbGFzcz1cInVzZXItcHJvZmlsZS1pY29uIG1lLTNcIiBzdHlsZT1cIndpZHRoOiA8JT0gdGhpcy5hcmdzLndpZHRoIHx8IDk2ICU+cHg7IGhlaWdodDogPCU9IHRoaXMuYXJncy5oZWlnaHQgfHwgOTYgJT5weDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktcGVyc29uLWNpcmNsZVwiIHN0eWxlPVwiZm9udC1zaXplOiA8JT0gTWF0aC5yb3VuZCgodGhpcy5hcmdzLndpZHRoIHx8IDk2KSAqIDAuNzUpICU+cHg7XCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCUgfSAlPlxuICAgICAgICAgICAgPGRpdiAkaWQ9XCJzcGlubmVyXCIgY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSB0b3AtNTAgc3RhcnQtNTAgdHJhbnNsYXRlLW1pZGRsZSBkLW5vbmVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgdGV4dC1wcmltYXJ5XCIgcm9sZT1cInN0YXR1c1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPlVwbG9hZGluZy4uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiICRpZD1cImZpbGVfaW5wdXRcIiBjbGFzcz1cImQtbm9uZVwiIGFjY2VwdD1cIjwlPSB0aGlzLmFyZ3MuYWNjZXB0IHx8ICdpbWFnZS9qcGVnLGltYWdlL3BuZyxpbWFnZS9naWYnICU+XCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAkaWQ9XCJ1cGxvYWRfYnRuXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5IG1lLTJcIj5VcGxvYWQgTmV3IFBob3RvPC9idXR0b24+XG4gICAgICAgICAgICA8JSBpZiAodGhpcy5hcmdzLnNob3dfcmVtb3ZlICYmIHRoaXMuZGF0YS5hdHRhY2htZW50X2tleSkgeyAlPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICRpZD1cInJlbW92ZV9idG5cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWRhbmdlclwiPlJlbW92ZTwvYnV0dG9uPlxuICAgICAgICAgICAgPCUgfSAlPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tdGV4dCBtdC0yXCI+SlBHLCBQTkcgb3IgR0lGLiBNYXggc2l6ZSA8JT0gdGhpcy5hcmdzLm1heF9zaXplIHx8IDIgJT5NQi48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbjwvRGVmaW5lOlByb2ZpbGVfUGhvdG9fSW5wdXQ+IiwiPCEtLVxuUnN4X1RhYnNcblxuRm9ybS1hd2FyZSB0YWIgY29udGFpbmVyIHRoYXQgbWFuYWdlcyB0YWIgbmF2aWdhdGlvbiBhbmQgZXJyb3Igc3RhdGVzLlxuXG5GZWF0dXJlczpcbi0gQXV0b21hdGljYWxseSBkZXRlY3RzIGVycm9ycyBpbiBjaGlsZCBSc3hfVGFiIGNvbXBvbmVudHNcbi0gU3dpdGNoZXMgdG8gZmlyc3QgdGFiIHdpdGggZXJyb3JzIG9uIHZhbGlkYXRpb24gZmFpbHVyZVxuLSBTaG93cyBlcnJvciBiYWRnZXMgb24gdGFiIGxhYmVsc1xuLSBQZXJzaXN0cyBhY3RpdmUgdGFiIHRvIFVSTCBoYXNoXG5cblVzYWdlOlxuPFJzeF9UYWJzPlxuICAgIDxSc3hfVGFiICRpZD1cImJhc2ljLWluZm9cIiAkbGFiZWw9XCJCYXNpYyBJbmZvcm1hdGlvblwiICRpY29uPVwiYmktYnVpbGRpbmdcIj5cbiAgICAgICAgPEZvcm1fRmllbGQgJG5hbWU9XCJuYW1lXCI+Li4uPC9Gb3JtX0ZpZWxkPlxuICAgIDwvUnN4X1RhYj5cbiAgICA8UnN4X1RhYiAkaWQ9XCJhZGRyZXNzXCIgJGxhYmVsPVwiQWRkcmVzc1wiICRpY29uPVwiYmktZ2VvLWFsdFwiPlxuICAgICAgICA8Rm9ybV9GaWVsZCAkbmFtZT1cInN0cmVldFwiPi4uLjwvRm9ybV9GaWVsZD5cbiAgICA8L1JzeF9UYWI+XG48L1JzeF9UYWJzPlxuLS0+XG48RGVmaW5lOlJzeF9UYWJzPlxuICAgIDwhLS0gVGFiIE5hdmlnYXRpb24gLS0+XG4gICAgPHVsIGNsYXNzPVwibmF2IG5hdi10YWJzXCIgcm9sZT1cInRhYmxpc3RcIiAkaWQ9XCJuYXZcIj5cbiAgICAgICAgPCEtLSBUYWIgaGVhZGVycyB3aWxsIGJlIHJlbmRlcmVkIGJ5IFJzeF9UYWIgY29tcG9uZW50cyAtLT5cbiAgICA8L3VsPlxuXG4gICAgPCEtLSBUYWIgQ29udGVudCBDb250YWluZXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cInRhYi1jb250ZW50IG10LTRcIiAkaWQ9XCJjb250ZW50XCI+XG4gICAgICAgIDwlPSBjb250ZW50KCkgJT5cbiAgICA8L2Rpdj5cbjwvRGVmaW5lOlJzeF9UYWJzPlxuIiwiPCEtLVxuUnN4X1RhYlxuXG5JbmRpdmlkdWFsIHRhYiBjb21wb25lbnQgdGhhdCBpbnRlZ3JhdGVzIHdpdGggUnN4X1RhYnMgZm9yIGZvcm0tYXdhcmUgZXJyb3IgaGFuZGxpbmcuXG5cbiRpZCAtIFRhYiBpZGVudGlmaWVyICh1c2VkIGZvciBVUkwgaGFzaCBhbmQgdGFyZ2V0aW5nKVxuJGxhYmVsIC0gVGFiIGxhYmVsIHRleHRcbiRpY29uIC0gT3B0aW9uYWwgQm9vdHN0cmFwIGljb24gY2xhc3MgKGUuZy4sIFwiYmktYnVpbGRpbmdcIilcblxuRmVhdHVyZXM6XG4tIEF1dG9tYXRpY2FsbHkgcmVnaXN0ZXJzIHdpdGggcGFyZW50IFJzeF9UYWJzIGNvbXBvbmVudFxuLSBDb3VudHMgdmFsaWRhdGlvbiBlcnJvcnMgaW4gY2hpbGQgRm9ybV9GaWVsZCBjb21wb25lbnRzXG4tIFJlbmRlcnMgYXMgQm9vdHN0cmFwIHRhYiBwYW5lXG4tIFdvcmtzIGluZGVwZW5kZW50bHkgb3Igd2l0aGluIFJzeF9UYWJzIGNvbnRhaW5lclxuXG5Vc2FnZTpcbjxSc3hfVGFicz5cbiAgICA8UnN4X1RhYiAkaWQ9XCJiYXNpYy1pbmZvXCIgJGxhYmVsPVwiQmFzaWMgSW5mb3JtYXRpb25cIiAkaWNvbj1cImJpLWJ1aWxkaW5nXCI+XG4gICAgICAgIDxGb3JtX0ZpZWxkICRuYW1lPVwibmFtZVwiPi4uLjwvRm9ybV9GaWVsZD5cbiAgICA8L1JzeF9UYWI+XG4gICAgPFJzeF9UYWIgJGlkPVwiYWRkcmVzc1wiICRsYWJlbD1cIkFkZHJlc3NcIiAkaWNvbj1cImJpLWdlby1hbHRcIj5cbiAgICAgICAgPEZvcm1fRmllbGQgJG5hbWU9XCJzdHJlZXRcIj4uLi48L0Zvcm1fRmllbGQ+XG4gICAgPC9Sc3hfVGFiPlxuPC9Sc3hfVGFicz5cbi0tPlxuPERlZmluZTpSc3hfVGFiIGNsYXNzPVwidGFiLXBhbmUgZmFkZVwiIHJvbGU9XCJ0YWJwYW5lbFwiPlxuICAgIDwlPSBjb250ZW50KCkgJT5cbjwvRGVmaW5lOlJzeF9UYWI+XG4iLCI8IS0tXG5Sc3hfRm9ybVxuXG5NYWluIGZvcm0gY29udGFpbmVyIHRoYXQgbWFuYWdlcyB3aWRnZXQgZGlzY292ZXJ5LCB2YWx1ZSBjb2xsZWN0aW9uLCBhbmQgc3VibWlzc2lvbi5cblxuJGRhdGEgLSBPYmplY3Qgd2l0aCBpbml0aWFsIGZvcm0gdmFsdWVzIChmb3IgZWRpdCBtb2RlKVxuJGFjdGlvbiAtIEFqYXggVVJMIG9yIGNvbnRyb2xsZXIgbWV0aG9kIHJlZmVyZW5jZSAoZS5nLiwgRnJvbnRlbmRfQ2xpZW50c19Db250cm9sbGVyLnNhdmUpXG5cblVzYWdlOlxuPFJzeF9Gb3JtICRkYXRhPSRjbGllbnQgJGFjdGlvbj1Gcm9udGVuZF9DbGllbnRzX0NvbnRyb2xsZXIuc2F2ZT5cbiAgICA8Rm9ybV9GaWVsZCAkbmFtZT1cIm5hbWVcIiAkbGFiZWw9XCJDb21wYW55IE5hbWVcIj5cbiAgICAgICAgPFRleHRfSW5wdXQgLz5cbiAgICA8L0Zvcm1fRmllbGQ+XG48L1JzeF9Gb3JtPlxuLS0+XG48RGVmaW5lOlJzeF9Gb3JtIHRhZz1cImZvcm1cIj5cblxuICAgIDxkaXYgJGlkPVwibG9hZGVyXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlciBweS01XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyLWJvcmRlciB0ZXh0LXByaW1hcnkgbWItM1wiIHJvbGU9XCJzdGF0dXNcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+TG9hZGluZy4uLjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwIGNsYXNzPVwidGV4dC1tdXRlZFwiPkxvYWRpbmcgZm9ybS4uLjwvcD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgJGlkPVwiZm9ybV9jb250ZW50XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8JSBpZiAod2luZG93LnJzeGFwcC5kZWJ1ZykgeyAlPlxuICAgICAgICAgICAgPCUtLSA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAkaWQ9XCJzZWVkX2J0blwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLXNodWZmbGVcIj48L2k+IEZpbGwgVGVzdCBEYXRhXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj4gLS0lPlxuICAgICAgICA8JSB9ICU+XG5cbiAgICAgICAgPGRpdiAkaWQ9XCJlcnJvclwiPjwvZGl2PlxuXG4gICAgICAgIDwlPSBjb250ZW50KCkgJT5cbiAgICA8L2Rpdj5cblxuPC9EZWZpbmU6UnN4X0Zvcm0+IiwiPCEtLVxuRm9ybV9GaWVsZF9BYnN0cmFjdFxuXG5BYnN0cmFjdCBiYXNlIGNvbXBvbmVudCBmb3IgZm9ybSBmaWVsZCB3cmFwcGVycy4gUHJvdmlkZXMgY29yZSBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgdmlzdWFsIGZvcm1hdHRpbmcuXG5FeHRlbmQgdGhpcyB0byBjcmVhdGUgY3VzdG9tIGZvcm0gZmllbGQgd3JhcHBlcnMgd2l0aCBkaWZmZXJlbnQgdmlzdWFsIHN0eWxlcy5cblxuJG5hbWUgLSBGaWVsZCBuYW1lIChyZXF1aXJlZCkgLSB1c2VkIGZvciBmb3JtIHNlcmlhbGl6YXRpb24gYW5kIGVycm9yIGRpc3BsYXlcbiRsYWJlbCAtIExhYmVsIHRleHQgKG9wdGlvbmFsKSAtIGF2YWlsYWJsZSBmb3IgY2hpbGQgY2xhc3NlcyB0byBkaXNwbGF5XG4kcmVxdWlyZWQgLSBCb29sZWFuIChvcHRpb25hbCkgLSBhdmFpbGFibGUgZm9yIGNoaWxkIGNsYXNzZXMgdG8gaW5kaWNhdGUgcmVxdWlyZWQgZmllbGRzXG4kaGVscCAtIEhlbHAgdGV4dCAob3B0aW9uYWwpIC0gYXZhaWxhYmxlIGZvciBjaGlsZCBjbGFzc2VzIHRvIGRpc3BsYXlcblxuQ2hpbGQgY29udGVudCBpcyB0aGUgZm9ybSB3aWRnZXQgKFRleHRfSW5wdXQsIFNlbGVjdF9JbnB1dCwgZXRjLilcblxuTm90ZTogVGhpcyBpcyBhbiBhYnN0cmFjdCBjb21wb25lbnQuIFVzZSBGb3JtX0ZpZWxkIGZvciBzdGFuZGFyZCBmb3JtYXR0ZWQgZmllbGRzLFxub3IgZXh0ZW5kIHRoaXMgdG8gY3JlYXRlIGN1c3RvbSBmaWVsZCB3cmFwcGVycy5cbi0tPlxuPERlZmluZTpGb3JtX0ZpZWxkX0Fic3RyYWN0PlxuICAgIDwlPSBjb250ZW50KCkgJT5cbjwvRGVmaW5lOkZvcm1fRmllbGRfQWJzdHJhY3Q+IiwiPCEtLVxuRm9ybV9GaWVsZFxuXG5XcmFwcGVyIGNvbXBvbmVudCB0aGF0IHByb3ZpZGVzIGNvbnNpc3RlbnQgbGFiZWwsIGhlbHAgdGV4dCwgYW5kIGVycm9yIGRpc3BsYXkgZm9yIGZvcm0gd2lkZ2V0cy5cblxuJG5hbWUgLSBGaWVsZCBuYW1lIChyZXF1aXJlZCkgLSB1c2VkIGZvciBmb3JtIHNlcmlhbGl6YXRpb24gYW5kIGVycm9yIGRpc3BsYXlcbiRsYWJlbCAtIExhYmVsIHRleHQgdG8gZGlzcGxheSBhYm92ZSB0aGUgZmllbGRcbiRyZXF1aXJlZCAtIEJvb2xlYW4gLSBpZiB0cnVlLCBzaG93cyByZWQgYXN0ZXJpc2sgbmV4dCB0byBsYWJlbFxuJGhlbHAgLSBIZWxwIHRleHQgdG8gZGlzcGxheSBiZWxvdyB0aGUgZmllbGRcblxuVXNhZ2U6XG48Rm9ybV9GaWVsZCAkbmFtZT1cImVtYWlsXCIgJGxhYmVsPVwiRW1haWwgQWRkcmVzc1wiICRyZXF1aXJlZD10cnVlICRoZWxwPVwiV2UnbGwgbmV2ZXIgc2hhcmUgeW91ciBlbWFpbFwiPlxuICAgIDxUZXh0X0lucHV0ICRwbGFjZWhvbGRlcj1cInVzZXJAZXhhbXBsZS5jb21cIiAvPlxuPC9Gb3JtX0ZpZWxkPlxuLS0+XG48RGVmaW5lOkZvcm1fRmllbGQgZXh0ZW5kcz1cIkZvcm1fRmllbGRfQWJzdHJhY3RcIiB0YWc9XCJkaXZcIiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItM1wiPlxuXG4gICAgPCUgaWYgKHRoaXMuYXJncy5sYWJlbCkgeyAlPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCIgJGlkPVwiZm9ybV9sYWJlbFwiPlxuICAgICAgICAgICAgPCUhPSB0aGlzLmFyZ3MubGFiZWwgJT5cbiAgICAgICAgICAgIDwlIGlmICh0aGlzLmFyZ3MucmVxdWlyZWQpIHsgJT5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgIDwlIH0gJT5cbiAgICAgICAgPC9sYWJlbD5cbiAgICA8JSB9ICU+XG5cbiAgICA8ZGl2IGNsYXNzPVwiPCU9IHRoaXMuaGFzX2Vycm9yKCkgPyAnaXMtaW52YWxpZCcgOiAnJyAlPlwiPlxuICAgICAgICA8JT0gY29udGVudCgpICU+XG4gICAgPC9kaXY+XG5cbiAgICA8JSBpZiAodGhpcy5oYXNfZXJyb3IoKSkgeyAlPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFjayBkLWJsb2NrXCI+XG4gICAgICAgICAgICA8JT0gdGhpcy5nZXRfZXJyb3IoKSAlPlxuICAgICAgICA8L2Rpdj5cbiAgICA8JSB9ICU+XG5cbiAgICA8JSBpZiAodGhpcy5hcmdzLmhlbHApIHsgJT5cbiAgICAgICAgPHNtYWxsIGNsYXNzPVwiZm9ybS10ZXh0IHRleHQtbXV0ZWQgZC1ibG9jayBtdC0xXCI+XG4gICAgICAgICAgICA8JT0gdGhpcy5hcmdzLmhlbHAgJT5cbiAgICAgICAgPC9zbWFsbD5cbiAgICA8JSB9ICU+XG5cbjwvRGVmaW5lOkZvcm1fRmllbGQ+XG4iLCI8IS0tXG5Gb3JtX0hpZGRlbl9GaWVsZFxuXG5IaWRkZW4gaW5wdXQgZmllbGQgY29tcG9uZW50LiBVbmxpa2Ugb3RoZXIgRm9ybV9GaWVsZF8qIGNvbXBvbmVudHMsIHRoaXMgY29tcG9uZW50XG5JUyBib3RoIHRoZSBmaWVsZCB3cmFwcGVyIEFORCB0aGUgaGlkZGVuIGlucHV0IGl0c2VsZi5cblxuJG5hbWUgLSBGaWVsZCBuYW1lIChyZXF1aXJlZCkgLSB1c2VkIGZvciBmb3JtIHNlcmlhbGl6YXRpb25cblxuVXNhZ2U6XG48Rm9ybV9IaWRkZW5fRmllbGQgJG5hbWU9XCJpZFwiIC8+XG5cblJlcGxhY2VzIHRoZSBwYXR0ZXJuOlxuPEZvcm1fRmllbGRfQWJzdHJhY3QgJG5hbWU9XCJpZFwiPlxuICA8SGlkZGVuX0lucHV0IC8+XG48L0Zvcm1fRmllbGRfQWJzdHJhY3Q+XG4tLT5cbjxEZWZpbmU6Rm9ybV9IaWRkZW5fRmllbGQgZXh0ZW5kcz1cIkZvcm1fRmllbGRfQWJzdHJhY3RcIiB0YWc9XCJpbnB1dFwiIHR5cGU9XCJoaWRkZW5cIiBjbGFzcz1cIldpZGdldFwiPlxuPC9EZWZpbmU6Rm9ybV9IaWRkZW5fRmllbGQ+XG4iLCI8IS0tXG5QaW5fVmVyaWZpY2F0aW9uX0Zvcm1cblxuNi1kaWdpdCBQSU4gZW50cnkgZm9ybSB3aXRoIGF1dG9tYXRpYyBuYXZpZ2F0aW9uIGJldHdlZW4gYm94ZXMuXG5cbkZlYXR1cmVzOlxuLSBBdXRvLWFkdmFuY2UgdG8gbmV4dCBib3ggd2hlbiBkaWdpdCBpcyBlbnRlcmVkXG4tIEJhY2tzcGFjZSBjbGVhcnMgY3VycmVudCBib3ggYW5kIG1vdmVzIHRvIHByZXZpb3VzXG4tIFBhc3RlIHN1cHBvcnQ6IGRpc3RyaWJ1dGVzIGRpZ2l0cyBhY3Jvc3MgYm94ZXNcbi0gVmFsaWRhdGVzIG51bWVyaWMgaW5wdXQgb25seVxuXG5Vc2FnZSBpbiBtb2RhbDpcbmNvbnN0IHJlc3VsdCA9IGF3YWl0IE1vZGFsLmZvcm0oe1xuICAgIHRpdGxlOiBcIkVudGVyIFBJTlwiLFxuICAgIGNvbXBvbmVudDogXCJQaW5fVmVyaWZpY2F0aW9uX0Zvcm1cIixcbiAgICBvbl9zdWJtaXQ6IGFzeW5jIChmb3JtKSA9PiB7XG4gICAgICAgIGNvbnN0IHBpbiA9IGZvcm0udmFsKCk7XG4gICAgICAgIGlmIChwaW4ubGVuZ3RoICE9PSA2KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEtlZXAgbW9kYWwgb3BlblxuICAgICAgICB9XG4gICAgICAgIC8vIFZlcmlmeSBQSU4uLi5cbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgcGluOiBwaW4gfTtcbiAgICB9XG59KTtcbi0tPlxuPERlZmluZTpQaW5fVmVyaWZpY2F0aW9uX0Zvcm0gZXh0ZW5kcz1cIlJzeF9Gb3JtXCI+XG4gICAgPGRpdiBjbGFzcz1cInBpbi12ZXJpZmljYXRpb24tZm9ybVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGluLWlucHV0cyBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBnYXAtMiBtYi0zXCI+XG4gICAgICAgICAgICA8aW5wdXQgJGlkPVwiZGlnaXRfMFwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcGluLWlucHV0IHRleHQtY2VudGVyXCIgbWF4bGVuZ3RoPVwiMVwiIGlucHV0bW9kZT1cIm51bWVyaWNcIiBwYXR0ZXJuPVwiWzAtOV1cIiBhdXRvY29tcGxldGU9XCJvZmZcIiBkYXRhLWluZGV4PVwiMFwiIC8+XG4gICAgICAgICAgICA8aW5wdXQgJGlkPVwiZGlnaXRfMVwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcGluLWlucHV0IHRleHQtY2VudGVyXCIgbWF4bGVuZ3RoPVwiMVwiIGlucHV0bW9kZT1cIm51bWVyaWNcIiBwYXR0ZXJuPVwiWzAtOV1cIiBhdXRvY29tcGxldGU9XCJvZmZcIiBkYXRhLWluZGV4PVwiMVwiIC8+XG4gICAgICAgICAgICA8aW5wdXQgJGlkPVwiZGlnaXRfMlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcGluLWlucHV0IHRleHQtY2VudGVyXCIgbWF4bGVuZ3RoPVwiMVwiIGlucHV0bW9kZT1cIm51bWVyaWNcIiBwYXR0ZXJuPVwiWzAtOV1cIiBhdXRvY29tcGxldGU9XCJvZmZcIiBkYXRhLWluZGV4PVwiMlwiIC8+XG4gICAgICAgICAgICA8aW5wdXQgJGlkPVwiZGlnaXRfM1wiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcGluLWlucHV0IHRleHQtY2VudGVyXCIgbWF4bGVuZ3RoPVwiMVwiIGlucHV0bW9kZT1cIm51bWVyaWNcIiBwYXR0ZXJuPVwiWzAtOV1cIiBhdXRvY29tcGxldGU9XCJvZmZcIiBkYXRhLWluZGV4PVwiM1wiIC8+XG4gICAgICAgICAgICA8aW5wdXQgJGlkPVwiZGlnaXRfNFwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcGluLWlucHV0IHRleHQtY2VudGVyXCIgbWF4bGVuZ3RoPVwiMVwiIGlucHV0bW9kZT1cIm51bWVyaWNcIiBwYXR0ZXJuPVwiWzAtOV1cIiBhdXRvY29tcGxldGU9XCJvZmZcIiBkYXRhLWluZGV4PVwiNFwiIC8+XG4gICAgICAgICAgICA8aW5wdXQgJGlkPVwiZGlnaXRfNVwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcGluLWlucHV0IHRleHQtY2VudGVyXCIgbWF4bGVuZ3RoPVwiMVwiIGlucHV0bW9kZT1cIm51bWVyaWNcIiBwYXR0ZXJuPVwiWzAtOV1cIiBhdXRvY29tcGxldGU9XCJvZmZcIiBkYXRhLWluZGV4PVwiNVwiIC8+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgJGlkPVwiZXJyb3JfY29udGFpbmVyXCIgZGF0YS1pZD1cImVycm9yX2NvbnRhaW5lclwiIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPjwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciB0ZXh0LW11dGVkIHNtYWxsXCI+XG4gICAgICAgICAgICBFbnRlciB0aGUgNi1kaWdpdCBQSU4gY29kZVxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvRGVmaW5lOlBpbl9WZXJpZmljYXRpb25fRm9ybT5cbiIsIi8vIEphdmFTY3JpcHQgTWFuaWZlc3QgLSBHZW5lcmF0ZWQgYnkgQnVuZGxlQ29tcGlsZXJcbi8vIFJlZ2lzdGVycyBhbGwgY2xhc3NlcyBpbiB0aGlzIGJ1bmRsZSBmb3IgcnVudGltZSBpbnRyb3NwZWN0aW9uXG5NYW5pZmVzdC5fZGVmaW5lKFtcbiAgICBbTWFuaWZlc3QsIFwiTWFuaWZlc3RcIiwgbnVsbF0sXG4gICAgW1JzeF9CZWhhdmlvcnMsIFwiUnN4X0JlaGF2aW9yc1wiLCBudWxsXSxcbiAgICBbUnN4X0NhY2hlLCBcIlJzeF9DYWNoZVwiLCBudWxsXSxcbiAgICBbUnN4X0luaXQsIFwiUnN4X0luaXRcIiwgbnVsbF0sXG4gICAgW1JzeF9Kc19Nb2RlbCwgXCJSc3hfSnNfTW9kZWxcIiwgbnVsbF0sXG4gICAgW1JzeF9WaWV3X1RyYW5zaXRpb25zLCBcIlJzeF9WaWV3X1RyYW5zaXRpb25zXCIsIG51bGxdLFxuICAgIFtSZWFkV3JpdGVMb2NrLCBcIlJlYWRXcml0ZUxvY2tcIiwgbnVsbF0sXG4gICAgW0Zvcm1fVXRpbHMsIFwiRm9ybV9VdGlsc1wiLCBudWxsXSxcbiAgICBbRGVidWdnZXIsIFwiRGVidWdnZXJcIiwgbnVsbF0sXG4gICAgW1JzeF9KcV9IZWxwZXJzLCBcIlJzeF9KcV9IZWxwZXJzXCIsIG51bGxdLFxuICAgIFtSc3gsIFwiUnN4XCIsIG51bGxdLFxuICAgIFtBamF4LCBcIkFqYXhcIiwgbnVsbF0sXG4gICAgW0pxaHRtbF9Db21wb25lbnQsIFwiSnFodG1sX0NvbXBvbmVudFwiLCBfQmFzZV9KcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbSnFodG1sX0ludGVncmF0aW9uLCBcIkpxaHRtbF9JbnRlZ3JhdGlvblwiLCBudWxsXSxcbiAgICBbRGF0YUdyaWRfQWJzdHJhY3QsIFwiRGF0YUdyaWRfQWJzdHJhY3RcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW0FjdGl2aXR5X0ZlZWQsIFwiQWN0aXZpdHlfRmVlZFwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbQWN0b3JfUmVmZXJlbmNlLCBcIkFjdG9yX1JlZmVyZW5jZVwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbQWR2YW5jZWRfU2VhcmNoX1BhbmVsLCBcIkFkdmFuY2VkX1NlYXJjaF9QYW5lbFwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbQWxlcnRfQmFubmVyLCBcIkFsZXJ0X0Jhbm5lclwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbQXZhdGFyLCBcIkF2YXRhclwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbQmxvY2txdW90ZSwgXCJCbG9ja3F1b3RlXCIsIEpxaHRtbF9Db21wb25lbnRdLFxuICAgIFtCcmVhZGNydW1icywgXCJCcmVhZGNydW1ic1wiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbQnVsa19BY3Rpb25fQmFyLCBcIkJ1bGtfQWN0aW9uX0JhclwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbQnVsa19TZWxlY3Rpb24sIFwiQnVsa19TZWxlY3Rpb25cIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW0J1dHRvbl9Hcm91cCwgXCJCdXR0b25fR3JvdXBcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW0J1dHRvbl9QcmltYXJ5LCBcIkJ1dHRvbl9QcmltYXJ5XCIsIEpxaHRtbF9Db21wb25lbnRdLFxuICAgIFtCdXR0b25fU2Vjb25kYXJ5LCBcIkJ1dHRvbl9TZWNvbmRhcnlcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW0J1dHRvbiwgXCJCdXR0b25cIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW0NhbGVuZGFyX0V2ZW50LCBcIkNhbGVuZGFyX0V2ZW50XCIsIEpxaHRtbF9Db21wb25lbnRdLFxuICAgIFtDYWxlbmRhcl9HcmlkLCBcIkNhbGVuZGFyX0dyaWRcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW0NhcmQsIFwiQ2FyZFwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbQ2hhcnRfQ29tcG9uZW50LCBcIkNoYXJ0X0NvbXBvbmVudFwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbQ2hlY2tib3gsIFwiQ2hlY2tib3hcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW0NvZGVfQmxvY2ssIFwiQ29kZV9CbG9ja1wiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbQ29sdW1uX1Zpc2liaWxpdHlfVG9nZ2xlLCBcIkNvbHVtbl9WaXNpYmlsaXR5X1RvZ2dsZVwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbQ29tbWVudF9UaHJlYWQsIFwiQ29tbWVudF9UaHJlYWRcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW0RhdGVfUGlja2VyLCBcIkRhdGVfUGlja2VyXCIsIEpxaHRtbF9Db21wb25lbnRdLFxuICAgIFtEcm9wZG93bl9NZW51LCBcIkRyb3Bkb3duX01lbnVcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW0VtcHR5X1N0YXRlLCBcIkVtcHR5X1N0YXRlXCIsIEpxaHRtbF9Db21wb25lbnRdLFxuICAgIFtFeHBvcnRfQnV0dG9uLCBcIkV4cG9ydF9CdXR0b25cIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW0ZpbGVfVXBsb2FkLCBcIkZpbGVfVXBsb2FkXCIsIEpxaHRtbF9Db21wb25lbnRdLFxuICAgIFtGaWx0ZXJfQmFyLCBcIkZpbHRlcl9CYXJcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW0Zvcm1fQWN0aW9uc19Db21wb25lbnQsIFwiRm9ybV9BY3Rpb25zX0NvbXBvbmVudFwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbRm9ybV9GaWVsZF9Hcm91cCwgXCJGb3JtX0ZpZWxkX0dyb3VwXCIsIEpxaHRtbF9Db21wb25lbnRdLFxuICAgIFtGb3JtX0dyb3VwX0NvbXBvbmVudCwgXCJGb3JtX0dyb3VwX0NvbXBvbmVudFwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbRm9ybV9Sb3dfQ29tcG9uZW50LCBcIkZvcm1fUm93X0NvbXBvbmVudFwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbRm9ybV9WYWxpZGF0aW9uX01lc3NhZ2UsIFwiRm9ybV9WYWxpZGF0aW9uX01lc3NhZ2VcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW0dhbnR0X0NoYXJ0LCBcIkdhbnR0X0NoYXJ0XCIsIEpxaHRtbF9Db21wb25lbnRdLFxuICAgIFtJY29uX0J1dHRvbiwgXCJJY29uX0J1dHRvblwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbSWNvbl9XaXRoX0xhYmVsLCBcIkljb25fV2l0aF9MYWJlbFwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbSWNvbl9XaXRoX1RleHQsIFwiSWNvbl9XaXRoX1RleHRcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW0ljb24sIFwiSWNvblwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbSW5mb19Cb3gsIFwiSW5mb19Cb3hcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW0lubGluZV9FZGl0X0ZpZWxkLCBcIklubGluZV9FZGl0X0ZpZWxkXCIsIEpxaHRtbF9Db21wb25lbnRdLFxuICAgIFtJbnB1dF9XaXRoX0ljb24sIFwiSW5wdXRfV2l0aF9JY29uXCIsIEpxaHRtbF9Db21wb25lbnRdLFxuICAgIFtJbnB1dF9XaXRoX1ZhbGlkYXRpb24sIFwiSW5wdXRfV2l0aF9WYWxpZGF0aW9uXCIsIEpxaHRtbF9Db21wb25lbnRdLFxuICAgIFtJbnB1dCwgXCJJbnB1dFwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbS2FuYmFuX0JvYXJkLCBcIkthbmJhbl9Cb2FyZFwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbTGluaywgXCJMaW5rXCIsIEpxaHRtbF9Db21wb25lbnRdLFxuICAgIFtMaXN0LCBcIkxpc3RcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW0xvYWRpbmdfU2tlbGV0b24sIFwiTG9hZGluZ19Ta2VsZXRvblwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbTWV0cmljX0NhcmQsIFwiTWV0cmljX0NhcmRcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW01vYmlsZV9IZWFkZXIsIFwiTW9iaWxlX0hlYWRlclwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbTW9kYWxfRGlhbG9nLCBcIk1vZGFsX0RpYWxvZ1wiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbTXVsdGlfU2VsZWN0LCBcIk11bHRpX1NlbGVjdFwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbTm90aWZpY2F0aW9uX0JhZGdlLCBcIk5vdGlmaWNhdGlvbl9CYWRnZVwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbTm90aWZpY2F0aW9uX0Ryb3Bkb3duLCBcIk5vdGlmaWNhdGlvbl9Ecm9wZG93blwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbT3ZlcmR1ZV9JbmRpY2F0b3IsIFwiT3ZlcmR1ZV9JbmRpY2F0b3JcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW1BhZ2VfSGVhZGVyLCBcIlBhZ2VfSGVhZGVyXCIsIEpxaHRtbF9Db21wb25lbnRdLFxuICAgIFtQYWdlX1NlY3Rpb24sIFwiUGFnZV9TZWN0aW9uXCIsIEpxaHRtbF9Db21wb25lbnRdLFxuICAgIFtQYWdlLCBcIlBhZ2VcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW1BvcG92ZXIsIFwiUG9wb3ZlclwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbUHJvZ3Jlc3NfQmFyLCBcIlByb2dyZXNzX0JhclwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbUmFkaW9fQnV0dG9uLCBcIlJhZGlvX0J1dHRvblwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbUmljaF9UZXh0X0VkaXRvciwgXCJSaWNoX1RleHRfRWRpdG9yXCIsIEpxaHRtbF9Db21wb25lbnRdLFxuICAgIFtSb3dfQWN0aW9uX01lbnUsIFwiUm93X0FjdGlvbl9NZW51XCIsIEpxaHRtbF9Db21wb25lbnRdLFxuICAgIFtTYW1wbGVfRGF0YWdyaWRfQ29tcG9uZW50LCBcIlNhbXBsZV9EYXRhZ3JpZF9Db21wb25lbnRcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW1NlYXJjaF9CYXIsIFwiU2VhcmNoX0JhclwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbU2VhcmNoYWJsZV9TZWxlY3QsIFwiU2VhcmNoYWJsZV9TZWxlY3RcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW1NlbGVjdF9Ecm9wZG93biwgXCJTZWxlY3RfRHJvcGRvd25cIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW1NpZGViYXJfTmF2LCBcIlNpZGViYXJfTmF2XCIsIEpxaHRtbF9Db21wb25lbnRdLFxuICAgIFtTb3J0YWJsZV9Db2x1bW5fSGVhZGVyLCBcIlNvcnRhYmxlX0NvbHVtbl9IZWFkZXJcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW1NwaW5uZXIsIFwiU3Bpbm5lclwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbU3RhdF9DYXJkLCBcIlN0YXRfQ2FyZFwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbU3RhdHVzX0JhZGdlLCBcIlN0YXR1c19CYWRnZVwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbVGFiX0NvbnRlbnQsIFwiVGFiX0NvbnRlbnRcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW1RhYmxlX1BhZ2luYXRpb24sIFwiVGFibGVfUGFnaW5hdGlvblwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbVGFibGUsIFwiVGFibGVcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW1RhYnMsIFwiVGFic1wiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbVGFnX0dyb3VwLCBcIlRhZ19Hcm91cFwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbVGFnLCBcIlRhZ1wiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbVGV4dF9EaXNwbGF5LCBcIlRleHRfRGlzcGxheVwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbVGV4dGFyZWEsIFwiVGV4dGFyZWFcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW1RocmVlX0NvbHVtbl9MYXlvdXQsIFwiVGhyZWVfQ29sdW1uX0xheW91dFwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbVGltZV9QaWNrZXIsIFwiVGltZV9QaWNrZXJcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW1RpbWVsaW5lLCBcIlRpbWVsaW5lXCIsIEpxaHRtbF9Db21wb25lbnRdLFxuICAgIFtUaW1lc3RhbXBfRGlzcGxheSwgXCJUaW1lc3RhbXBfRGlzcGxheVwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbVG9vbHRpcCwgXCJUb29sdGlwXCIsIEpxaHRtbF9Db21wb25lbnRdLFxuICAgIFtUb3BfTmF2LCBcIlRvcF9OYXZcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW1RyZW5kX0luZGljYXRvciwgXCJUcmVuZF9JbmRpY2F0b3JcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW1R3b19Db2x1bW5fTGF5b3V0LCBcIlR3b19Db2x1bW5fTGF5b3V0XCIsIEpxaHRtbF9Db21wb25lbnRdLFxuICAgIFtVc2VyX0F2YXRhcl9Ecm9wZG93biwgXCJVc2VyX0F2YXRhcl9Ecm9wZG93blwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbTW9kYWxfQWJzdHJhY3QsIFwiTW9kYWxfQWJzdHJhY3RcIiwgbnVsbF0sXG4gICAgW1JzeF9Nb2RhbCwgXCJSc3hfTW9kYWxcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW01vZGFsLCBcIk1vZGFsXCIsIG51bGxdLFxuICAgIFtCcmVhZGNydW1iX0l0ZW0sIFwiQnJlYWRjcnVtYl9JdGVtXCIsIEpxaHRtbF9Db21wb25lbnRdLFxuICAgIFtDbGllbnRfTGFiZWxfTGluaywgXCJDbGllbnRfTGFiZWxfTGlua1wiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbQ2xpZW50X0xhYmVsLCBcIkNsaWVudF9MYWJlbFwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbRm9ybV9JbnB1dF9BYnN0cmFjdCwgXCJGb3JtX0lucHV0X0Fic3RyYWN0XCIsIEpxaHRtbF9Db21wb25lbnRdLFxuICAgIFtUZXh0X0lucHV0LCBcIlRleHRfSW5wdXRcIiwgRm9ybV9JbnB1dF9BYnN0cmFjdF0sXG4gICAgW0NoZWNrYm94X0lucHV0LCBcIkNoZWNrYm94X0lucHV0XCIsIEZvcm1fSW5wdXRfQWJzdHJhY3RdLFxuICAgIFtXeXNpd3lnX0lucHV0LCBcIld5c2l3eWdfSW5wdXRcIiwgRm9ybV9JbnB1dF9BYnN0cmFjdF0sXG4gICAgW1NlbGVjdF9JbnB1dCwgXCJTZWxlY3RfSW5wdXRcIiwgRm9ybV9JbnB1dF9BYnN0cmFjdF0sXG4gICAgW0FqYXhfU2VsZWN0X0lucHV0LCBcIkFqYXhfU2VsZWN0X0lucHV0XCIsIFNlbGVjdF9JbnB1dF0sXG4gICAgW0N1cnJlbmN5X0lucHV0LCBcIkN1cnJlbmN5X0lucHV0XCIsIFRleHRfSW5wdXRdLFxuICAgIFtQaG9uZV9UZXh0X0lucHV0LCBcIlBob25lX1RleHRfSW5wdXRcIiwgVGV4dF9JbnB1dF0sXG4gICAgW1N0YXRlX1NlbGVjdF9JbnB1dCwgXCJTdGF0ZV9TZWxlY3RfSW5wdXRcIiwgQWpheF9TZWxlY3RfSW5wdXRdLFxuICAgIFtDb3VudHJ5X1NlbGVjdF9JbnB1dCwgXCJDb3VudHJ5X1NlbGVjdF9JbnB1dFwiLCBBamF4X1NlbGVjdF9JbnB1dF0sXG4gICAgW1Byb2ZpbGVfUGhvdG9fSW5wdXQsIFwiUHJvZmlsZV9QaG90b19JbnB1dFwiLCBGb3JtX0lucHV0X0Fic3RyYWN0XSxcbiAgICBbUnN4X1RhYnMsIFwiUnN4X1RhYnNcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW1JzeF9UYWIsIFwiUnN4X1RhYlwiLCBKcWh0bWxfQ29tcG9uZW50XSxcbiAgICBbUnN4X0Zvcm0sIFwiUnN4X0Zvcm1cIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW1Bpbl9WZXJpZmljYXRpb25fRm9ybSwgXCJQaW5fVmVyaWZpY2F0aW9uX0Zvcm1cIiwgUnN4X0Zvcm1dLFxuICAgIFtGb3JtX0ZpZWxkX0Fic3RyYWN0LCBcIkZvcm1fRmllbGRfQWJzdHJhY3RcIiwgSnFodG1sX0NvbXBvbmVudF0sXG4gICAgW0Zvcm1fRmllbGQsIFwiRm9ybV9GaWVsZFwiLCBGb3JtX0ZpZWxkX0Fic3RyYWN0XSxcbiAgICBbRm9ybV9IaWRkZW5fRmllbGQsIFwiRm9ybV9IaWRkZW5fRmllbGRcIiwgRm9ybV9GaWVsZF9BYnN0cmFjdF0sXG4gICAgW1NpZ251cF9JbmRleCwgXCJTaWdudXBfSW5kZXhcIiwgbnVsbF0sXG4gICAgW0xvZ2luX0luZGV4LCBcIkxvZ2luX0luZGV4XCIsIG51bGxdLFxuICAgIFtBY2NlcHRfSW52aXRlX0luZGV4LCBcIkFjY2VwdF9JbnZpdGVfSW5kZXhcIiwgbnVsbF1cbl0pO1xuXG4iLCIvLyBSU1ggUm91dGUgRGVmaW5pdGlvbnMgLSBHZW5lcmF0ZWQgYnkgQnVuZGxlQ29tcGlsZXJcbi8vIFByb3ZpZGVzIHJvdXRlIHBhdHRlcm5zIGZvciB0eXBlLXNhZmUgVVJMIGdlbmVyYXRpb25cblJzeC5fZGVmaW5lX3JvdXRlcyh7XG4gICAgXCJTaWdudXBfQ29udHJvbGxlclwiOiB7XG4gICAgICAgIFwiaW5kZXhcIjogXCIvc2lnbnVwXCJcbiAgICB9LFxuICAgIFwiU2l0ZV9TZWxlY3Rpb25fQ29udHJvbGxlclwiOiB7XG4gICAgICAgIFwiaW5kZXhcIjogXCIvbG9naW4vc2l0ZS86c2l0ZV9pZFwiXG4gICAgfSxcbiAgICBcIkxvZ2luX0NvbnRyb2xsZXJcIjoge1xuICAgICAgICBcImluZGV4XCI6IFwiL2xvZ2luXCIsXG4gICAgICAgIFwibG9nb3V0XCI6IFwiL2xvZ291dFwiXG4gICAgfSxcbiAgICBcIkFjY2VwdF9JbnZpdGVfQ29udHJvbGxlclwiOiB7XG4gICAgICAgIFwiaW5kZXhcIjogXCIvYWNjZXB0LWludml0ZS86Y29kZVwiXG4gICAgfVxufSk7XG4iLCIkKGRvY3VtZW50KS5yZWFkeShhc3luYyBmdW5jdGlvbigpIHtcbnRyeSB7XG5jb25zb2xlX2RlYnVnKCdSU1hfSU5JVCcsICdEb2N1bWVudCByZWFkeSwgc3RhcnRpbmcgUnN4Ll9yc3hfY29yZV9ib290Jyk7XG5hd2FpdCBSc3guX3JzeF9jb3JlX2Jvb3QoKTtcbmNvbnNvbGVfZGVidWcoJ1JTWF9JTklUJywgJ0luaXRpYWxpemF0aW9uIGNvbXBsZXRlJyk7XG59IGNhdGNoIChlcnJvcikge1xuY29uc29sZS5lcnJvcignW1JTWF9JTklUXSBJbml0aWFsaXphdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuY29uc29sZS5lcnJvcignW1JTWF9JTklUXSBTdGFjazonLCBlcnJvci5zdGFjayk7XG50aHJvdyBlcnJvcjtcbn1cbn0pOyJdLCJzb3VyY2VSb290IjoiIn0=