Files
rspade_system/storage-working/rsx-tmp/babel_50f0fc9efe7b37be76ec4433bd3979b7.js
root 9ebcc359ae Fix code quality violations and enhance ROUTE-EXISTS-01 rule
Implement JQHTML function cache ID system and fix bundle compilation
Implement underscore prefix for system tables
Fix JS syntax linter to support decorators and grant exception to Task system
SPA: Update planning docs and wishlists with remaining features
SPA: Document Navigation API abandonment and future enhancements
Implement SPA browser integration with History API (Phase 1)
Convert contacts view page to SPA action
Convert clients pages to SPA actions and document conversion procedure
SPA: Merge GET parameters and update documentation
Implement SPA route URL generation in JavaScript and PHP
Implement SPA bootstrap controller architecture
Add SPA routing manual page (rsx:man spa)
Add SPA routing documentation to CLAUDE.md
Phase 4 Complete: Client-side SPA routing implementation
Update get_routes() consumers for unified route structure
Complete SPA Phase 3: PHP-side route type detection and is_spa flag
Restore unified routes structure and Manifest_Query class
Refactor route indexing and add SPA infrastructure
Phase 3 Complete: SPA route registration in manifest
Implement SPA Phase 2: Extract router code and test decorators
Rename Jqhtml_Component to Component and complete SPA foundation setup

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-19 17:48:15 +00:00

254 lines
28 KiB
JavaScript
Executable File

"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.$id('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.$id('prev_page').on('click', e => {
e.preventDefault();
that.go_to_page(that.data.pagination.current_page - 1);
});
that.$id('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`;
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTYW1wbGVfRGF0YWdyaWRfQ29tcG9uZW50IiwiSnFodG1sX0NvbXBvbmVudCIsIm9uX2xvYWQiLCJ0aGF0IiwiYXJncyIsImFwaV91cmwiLCJyZXNwb25zZSIsImZldGNoIiwiZGF0YSIsImpzb24iLCJnZW5lcmF0ZV9zYW1wbGVfZGF0YSIsIm9uX3JlYWR5Iiwic2VsZWN0YWJsZSIsIiRpZCIsIm9uIiwiZSIsImNoZWNrZWQiLCJ0YXJnZXQiLCIkIiwiZmluZCIsInByb3AiLCJ1cGRhdGVfc2VsZWN0aW9uX2NvdW50IiwiYWxsb3dfZGVsZXRlIiwiJGJ1dHRvbiIsImN1cnJlbnRUYXJnZXQiLCJpZCIsImNvbmZpcm1fZGVsZXRlIiwicGFnaW5hdGlvbiIsInByZXZlbnREZWZhdWx0IiwiZ29fdG9fcGFnZSIsImN1cnJlbnRfcGFnZSIsIiRsaW5rIiwicGFnZSIsImludCIsInNlbGVjdGVkIiwibGVuZ3RoIiwiY29uc29sZSIsImxvZyIsInRyaWdnZXIiLCJjb3VudCIsImdldF9zZWxlY3RlZF9pZHMiLCJpZHMiLCJlYWNoIiwiaSIsImNoZWNrYm94IiwiJGNoZWNrYm94IiwicHVzaCIsImNsZWFyX3NlbGVjdGlvbiIsImNvbmZpcm0iLCJkZWxldGVfcm93Iiwicm93cyIsImZpbHRlciIsInJvdyIsInJlZnJlc2giLCJlcnJvciIsImFsZXJ0IiwidG90YWxfcGFnZXMiLCJjc3MiLCJ1cmwiLCJyZWxvYWRfZGF0YSIsInN0YXR1c2VzIiwibGFiZWwiLCJjb2xvciIsImZpcnN0X25hbWVzIiwibGFzdF9uYW1lcyIsImNvbXBhbmllcyIsInNob3dpbmciLCJmaXJzdF9uYW1lIiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwibGFzdF9uYW1lIiwiY29tcGFueSIsInN0YXR1cyIsInN0ciIsInBhZFN0YXJ0IiwibmFtZSIsImVtYWlsIiwidG9Mb3dlckNhc2UiLCJyZXBsYWNlIiwicGhvbmUiLCJzdGF0dXNfY29sb3IiLCJjcmVhdGVkIiwicmFuZG9tX2RhdGUiLCJjZWlsIiwidG90YWwiLCJmcm9tIiwidG8iLCJwYWdlcyIsIm1vbnRocyIsIm1vbnRoIiwiZGF5Il0sInNvdXJjZXMiOlsicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvU2FtcGxlX0RhdGFncmlkX0NvbXBvbmVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNhbXBsZV9EYXRhZ3JpZF9Db21wb25lbnRcbiAqXG4gKiBGdWxsLWZlYXR1cmVkIGRhdGEgdGFibGUgd2l0aDpcbiAqIC0gUm93IHNlbGVjdGlvbiAoY2hlY2tib3hlcylcbiAqIC0gUGFnaW5hdGlvblxuICogLSBSb3cgYWN0aW9ucyAodmlldywgZWRpdCwgZGVsZXRlKVxuICogLSBMb2FkaW5nIHN0YXRlcyB3aXRoIHBsYWNlaG9sZGVyc1xuICogLSBFbXB0eSBzdGF0ZXNcbiAqXG4gKiBVc2FnZTpcbiAqIDxTYW1wbGVfRGF0YWdyaWRfQ29tcG9uZW50XG4gKiAgICR0aXRsZT1cIkNsaWVudCBMaXN0XCJcbiAqICAgJGVudGl0eV9uYW1lPVwiY2xpZW50c1wiXG4gKiAgICRzZWxlY3RhYmxlPXRydWVcbiAqICAgJHBhZ2luYXRpb249dHJ1ZVxuICogICAkYWxsb3dfZGVsZXRlPXRydWVcbiAqICAgJHZpZXdfdXJsPVwiL2NsaWVudHMve2lkfVwiXG4gKiAgICRlZGl0X3VybD1cIi9jbGllbnRzL3tpZH0vZWRpdFwiXG4gKiAgICRhcGlfdXJsPVwiL2FwaS9jbGllbnRzXCJcbiAqICAgJGNvbHVtbnM9Y29sdW1uc19kZWZpbml0aW9uXG4gKiAvPlxuICovXG5jbGFzcyBTYW1wbGVfRGF0YWdyaWRfQ29tcG9uZW50IGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG5cbiAgYXN5bmMgb25fbG9hZCgpIHtcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICAvLyBJZiBBUEkgVVJMIHByb3ZpZGVkLCBmZXRjaCBkYXRhXG4gICAgaWYgKHRoYXQuYXJncy5hcGlfdXJsKSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHRoYXQuYXJncy5hcGlfdXJsKTtcbiAgICAgIHRoYXQuZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gR2VuZXJhdGUgc2FtcGxlIGRhdGEgZm9yIGRlbW9uc3RyYXRpb25cbiAgICAgIHRoYXQuZGF0YSA9IHRoYXQuZ2VuZXJhdGVfc2FtcGxlX2RhdGEoKTtcbiAgICB9XG4gIH1cblxuICBvbl9yZWFkeSgpIHtcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICAvLyBTZWxlY3QgYWxsIGNoZWNrYm94XG4gICAgaWYgKHRoYXQuYXJncy5zZWxlY3RhYmxlKSB7XG4gICAgICB0aGF0LiRpZCgnc2VsZWN0X2FsbCcpLm9uKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgICAgICBjb25zdCBjaGVja2VkID0gZS50YXJnZXQuY2hlY2tlZDtcbiAgICAgICAgdGhhdC4kLmZpbmQoJ3Rib2R5IGlucHV0W3R5cGU9XCJjaGVja2JveFwiXScpLnByb3AoJ2NoZWNrZWQnLCBjaGVja2VkKTtcbiAgICAgICAgdGhhdC51cGRhdGVfc2VsZWN0aW9uX2NvdW50KCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gSW5kaXZpZHVhbCByb3cgY2hlY2tib3hlc1xuICAgICAgdGhhdC4kLmZpbmQoJ3Rib2R5IGlucHV0W3R5cGU9XCJjaGVja2JveFwiXScpLm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgIHRoYXQudXBkYXRlX3NlbGVjdGlvbl9jb3VudCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRGVsZXRlIGJ1dHRvbnNcbiAgICBpZiAodGhhdC5hcmdzLmFsbG93X2RlbGV0ZSkge1xuICAgICAgdGhhdC4kLmZpbmQoJ2J1dHRvbltkYXRhLWlkXScpLm9uKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgIGNvbnN0ICRidXR0b24gPSAkKGUuY3VycmVudFRhcmdldCk7XG4gICAgICAgIGNvbnN0IGlkID0gJGJ1dHRvbi5kYXRhKCdpZCcpO1xuICAgICAgICB0aGF0LmNvbmZpcm1fZGVsZXRlKGlkKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFBhZ2luYXRpb25cbiAgICBpZiAodGhhdC5hcmdzLnBhZ2luYXRpb24gIT09IGZhbHNlKSB7XG4gICAgICB0aGF0LiRpZCgncHJldl9wYWdlJykub24oJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGF0LmdvX3RvX3BhZ2UodGhhdC5kYXRhLnBhZ2luYXRpb24uY3VycmVudF9wYWdlIC0gMSk7XG4gICAgICB9KTtcblxuICAgICAgdGhhdC4kaWQoJ25leHRfcGFnZScpLm9uKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhhdC5nb190b19wYWdlKHRoYXQuZGF0YS5wYWdpbmF0aW9uLmN1cnJlbnRfcGFnZSArIDEpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoYXQuJC5maW5kKCcucGFnZS1saW5rW2RhdGEtcGFnZV0nKS5vbignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0ICRsaW5rID0gJChlLmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICBjb25zdCBwYWdlID0gaW50KCRsaW5rLmRhdGEoJ3BhZ2UnKSk7XG4gICAgICAgIHRoYXQuZ29fdG9fcGFnZShwYWdlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgVUkgdG8gc2hvdyBob3cgbWFueSByb3dzIGFyZSBzZWxlY3RlZFxuICAgKi9cbiAgdXBkYXRlX3NlbGVjdGlvbl9jb3VudCgpIHtcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoYXQuJC5maW5kKCd0Ym9keSBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06Y2hlY2tlZCcpLmxlbmd0aDtcblxuICAgIGlmIChzZWxlY3RlZCA+IDApIHtcbiAgICAgIC8vIENvdWxkIHNob3cgYSBiYW5uZXI6IFwiMyBpdGVtcyBzZWxlY3RlZFwiXG4gICAgICBjb25zb2xlLmxvZyhgJHtzZWxlY3RlZH0gaXRlbXMgc2VsZWN0ZWRgKTtcblxuICAgICAgLy8gRmlyZSBldmVudCBmb3IgcGFyZW50IGNvbXBvbmVudHMgdG8gbGlzdGVuIHRvXG4gICAgICB0aGF0LiQudHJpZ2dlcignc2VsZWN0aW9uOmNoYW5nZWQnLCB7IGNvdW50OiBzZWxlY3RlZCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFycmF5IG9mIHNlbGVjdGVkIElEc1xuICAgKi9cbiAgZ2V0X3NlbGVjdGVkX2lkcygpIHtcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICBjb25zdCBpZHMgPSBbXTtcbiAgICB0aGF0LiQuZmluZCgndGJvZHkgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmNoZWNrZWQnKS5lYWNoKChpLCBjaGVja2JveCkgPT4ge1xuICAgICAgY29uc3QgJGNoZWNrYm94ID0gJChjaGVja2JveCk7XG4gICAgICBjb25zdCBpZCA9ICRjaGVja2JveC5kYXRhKCdpZCcpO1xuICAgICAgaWYgKGlkKSBpZHMucHVzaChpZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGlkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgc2VsZWN0aW9uc1xuICAgKi9cbiAgY2xlYXJfc2VsZWN0aW9uKCkge1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgIHRoYXQuJC5maW5kKCdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0nKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xuICAgIHRoYXQudXBkYXRlX3NlbGVjdGlvbl9jb3VudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpcm0gZGVsZXRpb24gb2YgYSByb3dcbiAgICovXG4gIGNvbmZpcm1fZGVsZXRlKGlkKSB7XG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgLy8gSW4gYSByZWFsIGFwcCwgc2hvdyBhIEJvb3RzdHJhcCBtb2RhbFxuICAgIGlmIChjb25maXJtKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgaXRlbT8nKSkge1xuICAgICAgdGhhdC5kZWxldGVfcm93KGlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgcm93ICh3b3VsZCB0eXBpY2FsbHkgbWFrZSBBUEkgY2FsbClcbiAgICovXG4gIGFzeW5jIGRlbGV0ZV9yb3coaWQpIHtcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICB0cnkge1xuICAgICAgLy8gTWFrZSBBUEkgY2FsbFxuICAgICAgLy8gYXdhaXQgZmV0Y2goYCR7dGhhdC5hcmdzLmFwaV91cmx9LyR7aWR9YCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuXG4gICAgICAvLyBSZW1vdmUgcm93IGZyb20gZGF0YVxuICAgICAgdGhhdC5kYXRhLnJvd3MgPSB0aGF0LmRhdGEucm93cy5maWx0ZXIocm93ID0+IHJvdy5pZCAhPT0gaWQpO1xuXG4gICAgICAvLyBSZS1yZW5kZXIgY29tcG9uZW50XG4gICAgICB0aGF0LnJlZnJlc2goKTtcblxuICAgICAgLy8gU2hvdyBzdWNjZXNzIG1lc3NhZ2VcbiAgICAgIGNvbnNvbGUubG9nKGBEZWxldGVkIGl0ZW0gJHtpZH1gKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRGVsZXRlIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICBhbGVydCgnRmFpbGVkIHRvIGRlbGV0ZSBpdGVtJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlIHRvIGEgc3BlY2lmaWMgcGFnZVxuICAgKi9cbiAgYXN5bmMgZ29fdG9fcGFnZShwYWdlKSB7XG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2UgPiB0aGF0LmRhdGEucGFnaW5hdGlvbi50b3RhbF9wYWdlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNob3cgbG9hZGluZyBzdGF0ZVxuICAgIHRoYXQuJC5maW5kKCd0Ym9keScpLmNzcygnb3BhY2l0eScsICcwLjUnKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBGZXRjaCBuZXcgcGFnZVxuICAgICAgY29uc3QgdXJsID0gYCR7dGhhdC5hcmdzLmFwaV91cmx9P3BhZ2U9JHtwYWdlfWA7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICB0aGF0LmRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIC8vIFJlLXJlbmRlclxuICAgICAgdGhhdC5yZWZyZXNoKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1BhZ2luYXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHRoYXQuJC5maW5kKCd0Ym9keScpLmNzcygnb3BhY2l0eScsICcxJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggdGhlIHRhYmxlIChyZWxvYWQgZGF0YSBhbmQgcmUtcmVuZGVyKVxuICAgKi9cbiAgYXN5bmMgcmVsb2FkX2RhdGEoKSB7XG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgdGhhdC5kYXRhID0ge307IC8vIENsZWFyIGRhdGEgdG8gc2hvdyBsb2FkaW5nIHN0YXRlXG4gICAgdGhhdC5yZWZyZXNoKCk7XG5cbiAgICBhd2FpdCB0aGF0Lm9uX2xvYWQoKTtcbiAgICB0aGF0LnJlZnJlc2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBzYW1wbGUgZGF0YSBmb3IgZGVtb25zdHJhdGlvbiBwdXJwb3Nlc1xuICAgKi9cbiAgZ2VuZXJhdGVfc2FtcGxlX2RhdGEoKSB7XG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgY29uc3Qgc3RhdHVzZXMgPSBbXG4gICAgICB7IGxhYmVsOiAnQWN0aXZlJywgY29sb3I6ICdzdWNjZXNzJyB9LFxuICAgICAgeyBsYWJlbDogJ1BlbmRpbmcnLCBjb2xvcjogJ3dhcm5pbmcnIH0sXG4gICAgICB7IGxhYmVsOiAnSW5hY3RpdmUnLCBjb2xvcjogJ3NlY29uZGFyeScgfSxcbiAgICAgIHsgbGFiZWw6ICdTdXNwZW5kZWQnLCBjb2xvcjogJ2RhbmdlcicgfVxuICAgIF07XG5cbiAgICBjb25zdCBmaXJzdF9uYW1lcyA9IFsnSm9obicsICdTYXJhaCcsICdNaWNoYWVsJywgJ0VtaWx5JywgJ0RhdmlkJywgJ0xpc2EnLCAnUm9iZXJ0JywgJ0plbm5pZmVyJywgJ1dpbGxpYW0nLCAnQW1hbmRhJ107XG4gICAgY29uc3QgbGFzdF9uYW1lcyA9IFsnU21pdGgnLCAnSm9obnNvbicsICdCcm93bicsICdHYXJjaWEnLCAnTWFydGluZXonLCAnTGVlJywgJ0FuZGVyc29uJywgJ1Rob21wc29uJywgJ1doaXRlJywgJ0RhdmlzJ107XG4gICAgY29uc3QgY29tcGFuaWVzID0gWydBY21lIENvcnAnLCAnVGVjaCBTb2x1dGlvbnMnLCAnR2xvYmFsIEVudGVycHJpc2VzJywgJ0lubm92YXRpb24gTGFicycsICdEaWdpdGFsIFN5c3RlbXMnLCAnQ2xvdWQgU2VydmljZXMnLCAnU21hcnQgSW5kdXN0cmllcycsICdGdXR1cmUgTmV0d29ya3MnLCAnUHJpbWUgQ29uc3VsdGluZycsICdFbGl0ZSBQYXJ0bmVycyddO1xuXG4gICAgY29uc3Qgcm93cyA9IFtdO1xuICAgIGNvbnN0IGNvdW50ID0gdGhhdC5hcmdzLnNob3dpbmcgfHwgMTA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IGZpcnN0X25hbWUgPSBmaXJzdF9uYW1lc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBmaXJzdF9uYW1lcy5sZW5ndGgpXTtcbiAgICAgIGNvbnN0IGxhc3RfbmFtZSA9IGxhc3RfbmFtZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbGFzdF9uYW1lcy5sZW5ndGgpXTtcbiAgICAgIGNvbnN0IGNvbXBhbnkgPSBjb21wYW5pZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY29tcGFuaWVzLmxlbmd0aCldO1xuICAgICAgY29uc3Qgc3RhdHVzID0gc3RhdHVzZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogc3RhdHVzZXMubGVuZ3RoKV07XG5cbiAgICAgIHJvd3MucHVzaCh7XG4gICAgICAgIGlkOiBgQyR7c3RyKGkgKyAxKS5wYWRTdGFydCgzLCAnMCcpfWAsXG4gICAgICAgIG5hbWU6IGAke2ZpcnN0X25hbWV9ICR7bGFzdF9uYW1lfWAsXG4gICAgICAgIGNvbXBhbnk6IGNvbXBhbnksXG4gICAgICAgIGVtYWlsOiBgJHtmaXJzdF9uYW1lLnRvTG93ZXJDYXNlKCl9LiR7bGFzdF9uYW1lLnRvTG93ZXJDYXNlKCl9QCR7Y29tcGFueS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJycpfS5jb21gLFxuICAgICAgICBwaG9uZTogYCg1NTUpICR7c3RyKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDkwMCkgKyAxMDApfS0ke3N0cihNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA5MDAwKSArIDEwMDApfWAsXG4gICAgICAgIHN0YXR1czogc3RhdHVzLmxhYmVsLFxuICAgICAgICBzdGF0dXNfY29sb3I6IHN0YXR1cy5jb2xvcixcbiAgICAgICAgY3JlYXRlZDogdGhhdC5yYW5kb21fZGF0ZSgpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcm93czogcm93cyxcbiAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgY3VycmVudF9wYWdlOiAxLFxuICAgICAgICB0b3RhbF9wYWdlczogTWF0aC5jZWlsKCh0aGF0LmFyZ3MudG90YWwgfHwgMTAwKSAvIGNvdW50KSxcbiAgICAgICAgZnJvbTogMSxcbiAgICAgICAgdG86IGNvdW50LFxuICAgICAgICB0b3RhbDogdGhhdC5hcmdzLnRvdGFsIHx8IDEwMCxcbiAgICAgICAgcGFnZXM6IFsxLCAyLCAzLCAnLi4uJywgTWF0aC5jZWlsKCh0aGF0LmFyZ3MudG90YWwgfHwgMTAwKSAvIGNvdW50KV1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHJhbmRvbSBkYXRlIGZvciBzYW1wbGUgZGF0YVxuICAgKi9cbiAgcmFuZG9tX2RhdGUoKSB7XG4gICAgY29uc3QgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddO1xuICAgIGNvbnN0IG1vbnRoID0gbW9udGhzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEyKV07XG4gICAgY29uc3QgZGF5ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjgpICsgMTtcbiAgICByZXR1cm4gYCR7bW9udGh9ICR7c3RyKGRheSkucGFkU3RhcnQoMiwgJzAnKX0sIDIwMjRgO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU1BLHlCQUF5QixTQUFTQyxnQkFBZ0IsQ0FBQztFQUV2RCxNQUFNQyxPQUFPQSxDQUFBLEVBQUc7SUFDZCxNQUFNQyxJQUFJLEdBQUcsSUFBSTtJQUNqQjtJQUNBLElBQUlBLElBQUksQ0FBQ0MsSUFBSSxDQUFDQyxPQUFPLEVBQUU7TUFDckIsTUFBTUMsUUFBUSxHQUFHLE1BQU1DLEtBQUssQ0FBQ0osSUFBSSxDQUFDQyxJQUFJLENBQUNDLE9BQU8sQ0FBQztNQUMvQ0YsSUFBSSxDQUFDSyxJQUFJLEdBQUcsTUFBTUYsUUFBUSxDQUFDRyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDLE1BQU07TUFDTDtNQUNBTixJQUFJLENBQUNLLElBQUksR0FBR0wsSUFBSSxDQUFDTyxvQkFBb0Is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