diff --git a/src/dev-center/index.html b/src/dev-center/index.html index 9ff66be3f..5c0a8219b 100644 --- a/src/dev-center/index.html +++ b/src/dev-center/index.html @@ -19,9 +19,6 @@ - - - `; const loading_spinner = ``; const drop_area_placeholder = `

Drop your app folder and files here to deploy.

HTML, JS, CSS, ...

`; const index_missing_error = `Please upload an 'index.html' file or if you're uploading a directory, make sure it contains an 'index.html' file at its root.`; -const lock_svg = - ''; - +const lock_svg = ''; // authUsername (async () => { - let user = await puter.auth.getUser(); + let user = await puter.auth.getUser(); - if (user?.username) { - authUsername = user.username; - } -})(); + if (user?.username) { + authUsername = user.username; + } +})() // source_path -if (URLParams.has("source_path")) { - source_path = URLParams.get("source_path"); +if (URLParams.has('source_path')) { + source_path = URLParams.get('source_path'); } else { - source_path = null; + source_path = null; } // domain and APIOrigin -if (URLParams.has("puter.domain")) { - domain = URLParams.get("puter.domain"); +if (URLParams.has('puter.domain')) { + domain = URLParams.get('puter.domain') } // static hosting domain -let static_hosting_domain = "puter.site"; -if (domain === "puter.localhost") { - static_hosting_domain = "site.puter.localhost"; +let static_hosting_domain = 'puter.site'; +if(domain === 'puter.localhost'){ + static_hosting_domain = 'site.puter.localhost'; } // add port to static_hosting_domain if provided -if (URLParams.has("puter.port") && URLParams.get("puter.port")) { - static_hosting_domain = - static_hosting_domain + `:` + html_encode(URLParams.get("puter.port")); +if (URLParams.has('puter.port') && URLParams.get('puter.port')) { + static_hosting_domain = static_hosting_domain + `:` + html_encode(URLParams.get('puter.port')); } // protocol -let protocol = "https"; -if ( - URLParams.has("puter.protocol") && - URLParams.get("puter.protocol") === "http" -) - protocol = "http"; +let protocol = 'https'; +if (URLParams.has('puter.protocol') && URLParams.get('puter.protocol') === 'http') + protocol = 'http'; // port -let port = ""; -if (URLParams.has("puter.port") && URLParams.get("puter.port")) { - port = html_encode(URLParams.get("puter.port")); +let port = ''; +if (URLParams.has('puter.port') && URLParams.get('puter.port')) { + port = html_encode(URLParams.get('puter.port')); } -$(document).ready(function() { - // initialize assets directory - initializeAssetsDirectory(); +$(document).ready(function () { + // initialize assets directory + initializeAssetsDirectory(); - $("#loading").show(); + $('#loading').show(); - setTimeout(async function() { - puter.ui.onLaunchedWithItems(async function(items) { - source_path = items[0].path; - // if source_path is provided, this means that the user is creating a new app/updating an existing app - // by deploying an existing Puter folder. So we create the app and deploy it. - if (source_path) { - // todo if there are no apps, go straight to creating a new app - $(".insta-deploy-modal").get(0).showModal(); - // set item name - $(".insta-deploy-item-name").html(html_encode(items[0].name)); - } - }); + setTimeout(async function () { + puter.ui.onLaunchedWithItems(async function (items) { + source_path = items[0].path; + // if source_path is provided, this means that the user is creating a new app/updating an existing app + // by deploying an existing Puter folder. So we create the app and deploy it. + if (source_path) { + // todo if there are no apps, go straight to creating a new app + $('.insta-deploy-modal').get(0).showModal(); + // set item name + $('.insta-deploy-item-name').html(html_encode(items[0].name)); + } + }) - // Get dev profile. This is only for puter.com for now as we don't have dev profiles in self-hosted Puter - if (domain === "puter.com") { - puter.apps.getDeveloperProfile(async function(dev_profile) { - developer = dev_profile; - if ( - dev_profile.approved_for_incentive_program && - !dev_profile.joined_incentive_program - ) { - $("#join-incentive-program").show(); + // Get dev profile. This is only for puter.com for now as we don't have dev profiles in self-hosted Puter + if(domain === 'puter.com'){ + puter.apps.getDeveloperProfile(async function (dev_profile) { + developer = dev_profile; + if (dev_profile.approved_for_incentive_program && !dev_profile.joined_incentive_program) { + $('#join-incentive-program').show(); + } + + // show earn money c2a only if dev is not approved for incentive program or has already joined + if (!dev_profile.approved_for_incentive_program || dev_profile.joined_incentive_program) { + puter.kv.get('earn-money-c2a-closed').then((value) => { + if (value?.result || value === true || value === "true") + return; + + $('#earn-money').get(0).showModal(); + }); + } + + // show payout method tab if dev has joined incentive program + if (dev_profile.joined_incentive_program) { + $('.tab-btn[data-tab="payout-method"]').show(); + $('#payout-method-email').html(dev_profile.paypal); + } + }) } + // Get apps + puter.apps.list().then((resp) => { + apps = resp; - // show earn money c2a only if dev is not approved for incentive program or has already joined - if ( - !dev_profile.approved_for_incentive_program || - dev_profile.joined_incentive_program - ) { - puter.kv.get("earn-money-c2a-closed").then((value) => { - if (value?.result || value === true || value === "true") return; + // hide loading + $('#loading').hide(); - $("#earn-money").get(0).showModal(); - }); - } - - // show payout method tab if dev has joined incentive program - if (dev_profile.joined_incentive_program) { - $('.tab-btn[data-tab="payout-method"]').show(); - $("#payout-method-email").html(dev_profile.paypal); - } - }); - } - // Get apps - puter.apps.list().then((resp) => { - apps = resp; - - // hide loading - $("#loading").hide(); - - // set apps - if (apps.length > 0) { - if (activeTab === "apps") { - $("#no-apps-notice").hide(); - $("#app-list").show(); - } - $(".app-card").remove(); - apps.forEach((app) => { - $("#app-list-table > tbody").append(generate_app_card(app)); - }); - count_apps(); - sort_apps(); - } else { - $("#no-apps-notice").show(); - } - }); - }, 1000); + // set apps + if (apps.length > 0) { + if (activeTab === 'apps') { + $('#no-apps-notice').hide(); + $('#app-list').show(); + } + $('.app-card').remove(); + apps.forEach(app => { + $('#app-list-table > tbody').append(generate_app_card(app)); + }); + count_apps(); + sort_apps(); + } else { + $('#no-apps-notice').show(); + } + }) + }, 1000); }); /** -* Refreshes the list of apps in the UI. -* -* @param {boolean} [show_loading=false] - Whether to show a loading indicator while refreshing. -* -*/ + * Refreshes the list of apps in the UI. + * + * @param {boolean} [show_loading=false] - Whether to show a loading indicator while refreshing. + * + */ function refresh_app_list(show_loading = false) { - if (show_loading) $("#loading").show(); - // get apps - setTimeout( - function() { - // uncheck the select all checkbox - $(".select-all-apps").prop("checked", false); + if (show_loading) + $('#loading').show(); + // get apps + setTimeout(function () { + // uncheck the select all checkbox + $('.select-all-apps').prop('checked', false); - puter.apps.list().then((apps_res) => { - $("#loading").hide(); - apps = apps_res; - if (apps.length > 0) { - if (activeTab === "apps") { - $("#no-apps-notice").hide(); - $("#app-list").show(); - } - $(".app-card").remove(); - apps.forEach((app) => { - $("#app-list-table > tbody").append(generate_app_card(app)); - }); - count_apps(); - sort_apps(); - } else { - $("#no-apps-notice").show(); - $("#app-list").hide(); - } - }); - }, - show_loading ? 1000 : 0 - ); + puter.apps.list().then((apps_res) => { + $('#loading').hide(); + apps = apps_res; + if (apps.length > 0) { + if (activeTab === 'apps') { + $('#no-apps-notice').hide(); + $('#app-list').show(); + } + $('.app-card').remove(); + apps.forEach(app => { + $('#app-list-table > tbody').append(generate_app_card(app)); + }); + count_apps(); + sort_apps(); + } else { + $('#no-apps-notice').show(); + $('#app-list').hide() + } + }) + }, show_loading ? 1000 : 0); } -$(document).on("click", ".tab-btn", function(e) { - $("section:not(.sidebar)").hide(); - $(".tab-btn").removeClass("active"); - $(this).addClass("active"); - $('section[data-tab="' + $(this).attr("data-tab") + '"]').show(); +$(document).on('click', '.tab-btn', function (e) { + $('section:not(.sidebar)').hide(); + $('.tab-btn').removeClass('active'); + $(this).addClass('active'); + $('section[data-tab="' + $(this).attr('data-tab') + '"]').show(); - // --------------------------------------------------------------- - // Apps tab - // --------------------------------------------------------------- - if ($(this).attr("data-tab") === "apps") { - refresh_app_list(); - activeTab = "apps"; - } - // --------------------------------------------------------------- - // Payout Method tab - // --------------------------------------------------------------- - else if ($(this).attr("data-tab") === "payout-method") { - activeTab = "payout-method"; - $("#loading").show(); - setTimeout(function() { - puter.apps.getDeveloperProfile(function(dev_profile) { - // show payout method tab if dev has joined incentive program - if (dev_profile.joined_incentive_program) { - $("#payout-method-email").html(dev_profile.paypal); - } - $("#loading").hide(); - if (activeTab === "payout-method") $("#tab-payout-method").show(); - }); - }, 1000); - } -}); + // --------------------------------------------------------------- + // Apps tab + // --------------------------------------------------------------- + if ($(this).attr('data-tab') === 'apps') { + refresh_app_list(); + activeTab = 'apps'; + } + // --------------------------------------------------------------- + // Payout Method tab + // --------------------------------------------------------------- + else if ($(this).attr('data-tab') === 'payout-method') { + activeTab = 'payout-method'; + $('#loading').show(); + setTimeout(function () { + puter.apps.getDeveloperProfile(function (dev_profile) { + // show payout method tab if dev has joined incentive program + if (dev_profile.joined_incentive_program) { + $('#payout-method-email').html(dev_profile.paypal); + } + $('#loading').hide(); + if (activeTab === 'payout-method') + $('#tab-payout-method').show(); + }) + }, 1000); + } +}) -$(document).on("click", ".create-an-app-btn", async function(e) { - let title = await puter.ui.prompt( - "Please enter a title for your app:", - "My Awesome App" - ); +$(document).on('click', '.create-an-app-btn', async function (e) { + let title = await puter.ui.prompt('Please enter a title for your app:', 'My Awesome App'); - if (title.length > 60) { - puter.ui.alert(`Title cannot be longer than 60.`, [ - { - label: "Ok", - }, - ]); - // todo go back to create an app prompt and prefill the title input with the title the user entered - return; - } else if (title) { - create_app(title); - } -}); + if (title.length > 60) { + puter.ui.alert(`Title cannot be longer than 60.`, [ + { + label: 'Ok', + }, + ]); + // todo go back to create an app prompt and prefill the title input with the title the user entered + return; + } + else if (title) { + create_app(title); + } +}) async function create_app(title, source_path = null, items = null) { - // name - let name = slugify(title, { - lower: true, - strict: true, - }); + // name + let name = slugify(title, { + lower: true, + strict: true, + }); - // icon - let icon = await getBase64ImageFromUrl("./img/app.svg"); + // icon + let icon = await getBase64ImageFromUrl('./img/app.svg'); - // open the 'Creting new app...' modal - let start_ts = Date.now(); - $(".new-app-modal").get(0).showModal(); + // open the 'Creting new app...' modal + let start_ts = Date.now(); + $('.new-app-modal').get(0).showModal(); - //---------------------------------------------------- - // Create app - //---------------------------------------------------- - puter.apps - .create({ - title: title, - name: name, - indexURL: "https://dev-center.puter.com/coming-soon.html", - icon: icon, - description: " ", - maximizeOnStart: false, - background: false, - dedupeName: true, - metadata: { - window_resizable: true, - credentialless: true, - }, - }) - .then(async (app) => { - let app_dir; - // ---------------------------------------------------- - // Create app directory in AppData - // ---------------------------------------------------- - app_dir = await puter.fs.mkdir( - `/${authUsername}/AppData/${dev_center_uid}/${app.uid}`, - { overwrite: true, recursive: true, rename: false } - ); - // ---------------------------------------------------- - // Create a router for the app with a fresh hostname - // ---------------------------------------------------- - let subdomain = name + "-" + Math.random().toString(36).substring(2); - await puter.hosting.create(subdomain, app_dir.path); - - // ---------------------------------------------------- - // Update the app with the new hostname - // ---------------------------------------------------- - puter.apps - .update(app.name, { - title: title, - indexURL: source_path - ? protocol + `://${subdomain}.` + static_hosting_domain - : "https://dev-center.puter.com/coming-soon.html", - icon: icon, - description: " ", - maximizeOnStart: false, - background: false, + //---------------------------------------------------- + // Create app + //---------------------------------------------------- + puter.apps.create({ + title: title, + name: name, + indexURL: 'https://dev-center.puter.com/coming-soon.html', + icon: icon, + description: ' ', + maximizeOnStart: false, + background: false, + dedupeName: true, + metadata: { + window_resizable: true, + credentialless: true, + }, + }) .then(async (app) => { - // refresh app list - puter.apps.list().then(async (resp) => { - apps = resp; - // Close the 'Creting new app...' modal - // but make sure it was shown for at least 2 seconds - setTimeout( - () => { - // open edit app section - edit_app_section(app.name); - // set drop area if source_path was provided or items were dropped - if (source_path || items) { - $(".drop-area").removeClass("drop-area-hover"); - $(".drop-area").addClass("drop-area-ready-to-deploy"); - } - $(".new-app-modal").get(0).close(); - // deploy app if source_path was provided - if (source_path) { - deploy(app, source_path); - } else if (items) { - deploy(app, items); - } - }, - Date.now() - start_ts > 2000 ? 1 : 2000 - (Date.now() - start_ts) + let app_dir; + // ---------------------------------------------------- + // Create app directory in AppData + // ---------------------------------------------------- + app_dir = await puter.fs.mkdir( + `/${authUsername}/AppData/${dev_center_uid}/${app.uid}`, + { overwrite: true, recursive: true, rename: false } ); - }); + // ---------------------------------------------------- + // Create a router for the app with a fresh hostname + // ---------------------------------------------------- + let subdomain = name + '-' + Math.random().toString(36).substring(2) + await puter.hosting.create(subdomain, app_dir.path); + + // ---------------------------------------------------- + // Update the app with the new hostname + // ---------------------------------------------------- + puter.apps.update(app.name, { + title: title, + indexURL: source_path ? protocol + `://${subdomain}.` + static_hosting_domain : 'https://dev-center.puter.com/coming-soon.html', + icon: icon, + description: ' ', + maximizeOnStart: false, + background: false, + }).then(async (app) => { + // refresh app list + puter.apps.list().then(async (resp) => { + apps = resp; + // Close the 'Creting new app...' modal + // but make sure it was shown for at least 2 seconds + setTimeout(() => { + // open edit app section + edit_app_section(app.name); + // set drop area if source_path was provided or items were dropped + if (source_path || items) { + $('.drop-area').removeClass('drop-area-hover'); + $('.drop-area').addClass('drop-area-ready-to-deploy'); + } + $('.new-app-modal').get(0).close(); + // deploy app if source_path was provided + if (source_path) { + deploy(app, source_path); + } else if (items) { + deploy(app, items); + } + }, (Date.now() - start_ts) > 2000 ? 1 : 2000 - (Date.now() - start_ts)); + }) + }).catch(async (err) => { + console.log(err); + }) + // ---------------------------------------------------- + // Create a "shortcut" on the desktop + // ---------------------------------------------------- + puter.fs.upload(new File([], app.title), + `/${authUsername}/Desktop`, + { + name: app.title, + dedupeName: true, + overwrite: false, + appUID: app.uid, + } + ) + }).catch(async (err) => { + $('#create-app-error').show(); + $('#create-app-error').html(err.message); + // scroll to top so that user sees error message + document.body.scrollTop = document.documentElement.scrollTop = 0; }) - .catch(async (err) => { - console.log(err); - }); - // ---------------------------------------------------- - // Create a "shortcut" on the desktop - // ---------------------------------------------------- - puter.fs.upload(new File([], app.title), `/${authUsername}/Desktop`, { - name: app.title, - dedupeName: true, - overwrite: false, - appUID: app.uid, - }); - }) - .catch(async (err) => { - $("#create-app-error").show(); - $("#create-app-error").html(err.message); - // scroll to top so that user sees error message - document.body.scrollTop = document.documentElement.scrollTop = 0; - }); } -$(document).on("click", ".deploy-btn", function(e) { - deploy(currently_editing_app, dropped_items); -}); -$(document).on("click", ".edit-app, .got-to-edit-app", function(e) { - const cur_app_name = $(this).attr("data-app-name"); - edit_app_section(cur_app_name); -}); +$(document).on('click', '.deploy-btn', function (e) { + deploy(currently_editing_app, dropped_items); +}) -$(document).on("click", ".delete-app", async function(e) { - let app_uid = $(this).attr("data-app-uid"); - let app_title = $(this).attr("data-app-title"); - let app_name = $(this).attr("data-app-name"); +$(document).on('click', '.edit-app, .got-to-edit-app', function (e) { + const cur_app_name = $(this).attr('data-app-name') + edit_app_section(cur_app_name); +}) - // get app - const app_data = await puter.apps.get(app_name); +$(document).on('click', '.delete-app', async function (e) { + let app_uid = $(this).attr('data-app-uid'); + let app_title = $(this).attr('data-app-title'); + let app_name = $(this).attr('data-app-name'); - if (app_data.metadata?.locked) { - puter.ui.alert( - `${app_data.title} is locked and cannot be deleted.`, - [ - { - label: "Ok", - }, - ], - { - type: "warning", - } + // get app + const app_data = await puter.apps.get(app_name); + + if(app_data.metadata?.locked){ + puter.ui.alert(`${app_data.title} is locked and cannot be deleted.`, [ + { + label: 'Ok', + }, + ], { + type: 'warning', + }); + return; + } + + // confirm delete + const alert_resp = await puter.ui.alert(`Are you sure you want to premanently delete ${html_encode(app_title)}?`, + [ + { + label: 'Yes, delete permanently', + value: 'delete', + type: 'danger', + }, + { + label: 'Cancel' + }, + ] ); - return; - } - // confirm delete - const alert_resp = await puter.ui.alert( - `Are you sure you want to premanently delete ${html_encode(app_title)}?`, - [ - { - label: "Yes, delete permanently", - value: "delete", - type: "danger", - }, - { - label: "Cancel", - }, - ] - ); + if (alert_resp === 'delete') { + let init_ts = Date.now(); + $('.deleting-app-modal')?.get(0)?.showModal(); + puter.apps.delete(app_name).then(async (app) => { + setTimeout(() => { + $('.deleting-app-modal')?.get(0)?.close(); + $(`.app-card[data-uid="${app_uid}"]`).fadeOut(200, function name(params) { + $(this).remove(); + if ($(`.app-card`).length === 0) { + $('section:not(.sidebar)').hide(); + $('#no-apps-notice').show(); + } else { + $('section:not(.sidebar)').hide(); + $('#app-list').show(); + } + count_apps(); + }); + }, + // make sure the modal was shown for at least 2 seconds + (Date.now() - init_ts) > 2000 ? 1 : 2000 - (Date.now() - init_ts)); - if (alert_resp === "delete") { - let init_ts = Date.now(); - $(".deleting-app-modal")?.get(0)?.showModal(); - puter.apps - .delete(app_name) - .then(async (app) => { - setTimeout( - () => { - $(".deleting-app-modal")?.get(0)?.close(); - $(`.app-card[data-uid="${app_uid}"]`).fadeOut( - 200, - function name(params) { - $(this).remove(); - if ($(`.app-card`).length === 0) { - $("section:not(.sidebar)").hide(); - $("#no-apps-notice").show(); - } else { - $("section:not(.sidebar)").hide(); - $("#app-list").show(); - } - count_apps(); - } - ); - }, - // make sure the modal was shown for at least 2 seconds - Date.now() - init_ts > 2000 ? 1 : 2000 - (Date.now() - init_ts) - ); + // get app directory + puter.fs.stat({ + path: `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, + returnSubdomains: true, + }).then(async (stat) => { + // delete subdomain associated with the app dir + puter.hosting.delete(stat.subdomains[0].subdomain) + // delete app directory + puter.fs.delete( + `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, + { recursive: true } + ) + }) + }).catch(async (err) => { + setTimeout(() => { - // get app directory - puter.fs - .stat({ - path: `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, - returnSubdomains: true, - }) - .then(async (stat) => { - // delete subdomain associated with the app dir - puter.hosting.delete(stat.subdomains[0].subdomain); - // delete app directory - puter.fs.delete( - `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, - { recursive: true } - ); - }); - }) - .catch(async (err) => { - setTimeout( - () => { - $(".deleting-app-modal")?.get(0)?.close(); - puter.ui.alert(err?.message, [ - { - label: "Ok", - }, - ]); - }, - // make sure the modal was shown for at least 2 seconds - Date.now() - init_ts > 2000 ? 1 : 2000 - (Date.now() - init_ts) - ); - }); - } -}); + $('.deleting-app-modal')?.get(0)?.close(); + puter.ui.alert(err?.message, [ + { + label: 'Ok', + }, + ]); + }, + // make sure the modal was shown for at least 2 seconds + (Date.now() - init_ts) > 2000 ? 1 : 2000 - (Date.now() - init_ts)); + }) + } +}) // generate app link function applink(app) { - return protocol + `://${domain}${port ? ":" + port : ""}/app/${app.name}`; + return protocol + `://${domain}${ port ? ':' + port : '' }/app/${app.name}`; } /** -* Generates the HTML for the app editing section. -* -* @param {Object} app - The app object containing details of the app to be edited. -* * -* @returns {string} HTML string for the app editing section. -* -* @description -* This function creates the HTML for the app editing interface, including: -* - App icon and title display -* - Options to open, add to desktop, or delete the app -* - Tabs for deployment and settings -* - Form fields for editing various app properties -* - Display of app statistics -* -* The generated HTML includes interactive elements and placeholders for -* dynamic content to be filled or updated by other functions. -* -* @example -* const appEditHTML = generate_edit_app_section(myAppObject); -* $('#edit-app').html(appEditHTML); -*/ + * Generates the HTML for the app editing section. + * + * @param {Object} app - The app object containing details of the app to be edited. + * * + * @returns {string} HTML string for the app editing section. + * + * @description + * This function creates the HTML for the app editing interface, including: + * - App icon and title display + * - Options to open, add to desktop, or delete the app + * - Tabs for deployment and settings + * - Form fields for editing various app properties + * - Display of app statistics + * + * The generated HTML includes interactive elements and placeholders for + * dynamic content to be filled or updated by other functions. + * + * @example + * const appEditHTML = generate_edit_app_section(myAppObject); + * $('#edit-app').html(appEditHTML); + */ function generate_edit_app_section(app) { if(app.result) @@ -591,60 +555,59 @@ function generate_edit_app_section(app) { -

A list of file type specifiers. For example if you include .txt your apps could be opened when a user clicks on a TXT file.

- - +

A comma-separated list of file type specifiers. For example if you include .txt, your apps could be opened when a user clicks on a TXT file.

+

Window

- +
- +
- +
- + - +
- + - +
- +
- +

Misc

- +

When locked, the app cannot be deleted. This is useful to prevent accidental deletion of important apps.

Advanced

- +

credentialless attribute for the iframe tag.

@@ -654,8 +617,8 @@ function generate_edit_app_section(app) { - `; - return h; + ` + return h; } /* This function keeps track of the original values of the app before it is edited*/ @@ -798,30 +761,6 @@ async function edit_app_section(cur_app_name) { toggleSaveButton(); // Ensure Save button is initially disabled toggleResetButton(); // Ensure Reset button is initially disabled $('#edit-app').show(); - - const filetype_association_input = document.querySelector('textarea[id=edit-app-filetype-associations]'); - tagify = new Tagify(filetype_association_input, { - pattern: /\.(?:[a-z0-9]+)|(?:[a-z]+\/[a-z0-9.-]+)/, // pattern for filetype file like .pdf or MIME type like text/plain - delimiters: null, - whitelist: [ - // Document file types - ".doc", ".docx", ".pdf", ".txt", ".odt", ".rtf", ".tex", - // Spreadsheet file types - ".xls", ".xlsx", ".csv", ".ods", - // Image file types - ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".svg", ".webp", - // Video file types - ".mp4", ".avi", ".mov", ".wmv", ".mkv", ".flv", ".webm", - // Audio file types - ".mp3", ".wav", ".aac", ".flac", ".ogg", ".m4a", - // Code file types - ".js", ".ts", ".html", ".css", ".json", ".xml", ".php", ".py", ".java", ".cpp", - // Archive file types - ".zip", ".rar", ".7z", ".tar", ".gz", - // Other - ".exe", ".dll", ".iso" - ], - }) // -------------------------------------------------------- // Dragster @@ -958,404 +897,259 @@ async function edit_app_section(cur_app_name) { dropped_items = []; } - // enable deploy button - $(".deploy-btn").removeClass("disabled"); - } else { - puter.ui.alert( - `You need to have an index.html file in your deployment.`, - [ - { - label: "Ok", - }, - ] - ); - $(".drop-area").removeClass("drop-area-ready-to-deploy"); - $(".deploy-btn").addClass("disabled"); - dropped_items = []; - } - return; - } - // ---------------------------------------------------- - // Multiple Puter files dropped - // ---------------------------------------------------- - else if (items.length > 1) { - let hasIndexHtml = false; - for (let item of items) { - if (item.name.toLowerCase() === "index.html") { - hasIndexHtml = true; - break; + return false; } - } - if (hasIndexHtml) { - dropped_items = items; - $(".drop-area").removeClass("drop-area-hover"); - $(".drop-area").addClass("drop-area-ready-to-deploy"); - drop_area_content = `

${items.length} items

Ready to deploy 🚀

Cancel

`; - $(".drop-area").html(drop_area_content); + //----------------------------------------------------------------------------- + // Local items dropped + //----------------------------------------------------------------------------- + if (!e.dataTransfer || !e.dataTransfer.items || e.dataTransfer.items.length === 0) + return; + + // get dropped items + dropped_items = await puter.ui.getEntriesFromDataTransferItems(e.dataTransfer.items); + + // generate a flat array of full paths from the dropped items + let paths = []; + for (let item of dropped_items) { + paths.push('/' + (item.fullPath ?? item.filepath)); + } + + // generate a directory tree from the paths + let tree = generateDirTree(paths); + + dropped_items = setRootDirTree(tree, dropped_items); + + // alert if no index.html in root + if (!hasRootIndexHtml(tree)) { + puter.ui.alert(index_missing_error, [ + { + label: 'Ok', + }, + ]); + $('.drop-area').removeClass('drop-area-ready-to-deploy'); + $('.deploy-btn').addClass('disabled'); + dropped_items = []; + return; + } + + // Get all keys (directories and files) in the root + const rootKeys = Object.keys(tree); + + // generate a list of items in the root in the form of a string (e.g. /index.html, /css/style.css) with maximum of 3 items + let rootItems = ''; + + if (rootKeys.length === 1) + rootItems = rootKeys[0]; + else if (rootKeys.length === 2) + rootItems = rootKeys[0] + ', ' + rootKeys[1]; + else if (rootKeys.length === 3) + rootItems = rootKeys[0] + ', ' + rootKeys[1] + ', and' + rootKeys[1]; + else if (rootKeys.length > 3) + rootItems = rootKeys[0] + ', ' + rootKeys[1] + ', and ' + (rootKeys.length - 2) + ' more item' + (rootKeys.length - 2 > 1 ? 's' : ''); + + rootItems = html_encode(rootItems); + $('.drop-area').removeClass('drop-area-hover'); + $('.drop-area').addClass('drop-area-ready-to-deploy'); + drop_area_content = `

${rootItems}

Ready to deploy 🚀

Cancel

`; + $('.drop-area').html(drop_area_content); // enable deploy button - $(".deploy-btn").removeClass("disabled"); - } else { - puter.ui.alert( - `You need to have an index.html file in your deployment.`, - [ - { - label: "Ok", - }, - ] - ); - $(".drop-area").removeClass("drop-area-ready-to-deploy"); - $(".drop-area").removeClass("drop-area-hover"); - $(".deploy-btn").addClass("disabled"); - dropped_items = []; - } - return; + $('.deploy-btn').removeClass('disabled'); + + return false; } - // ---------------------------------------------------- - // One Puter directory dropped - // ---------------------------------------------------- - else if (items.length === 1 && items[0].isDirectory) { - let children = await puter.fs.readdir(items[0].path); - // check if index.html exists, if found, deploy entire directory - for (let child of children) { - if (child.name === "index.html") { - // deploy(currently_editing_app, items[0].path); - dropped_items = items[0].path; - let rootItems = ""; + }); - if (children.length === 1) rootItems = children[0].name; - else if (children.length === 2) - rootItems = children[0].name + ", " + children[1].name; - else if (children.length === 3) - rootItems = - children[0].name + - ", " + - children[1].name + - ", and" + - children[1].name; - else if (children.length > 3) - rootItems = - children[0].name + - ", " + - children[1].name + - ", and " + - (children.length - 2) + - " more item" + - (children.length - 2 > 1 ? "s" : ""); - - $(".drop-area").removeClass("drop-area-hover"); - $(".drop-area").addClass("drop-area-ready-to-deploy"); - drop_area_content = `

${rootItems}

Ready to deploy 🚀

Cancel

`; - $(".drop-area").html(drop_area_content); - - // enable deploy button - $(".deploy-btn").removeClass("disabled"); - return; - } - } - - // no index.html in directory - puter.ui.alert(index_missing_error, [ - { - label: "Ok", - }, - ]); - $(".drop-area").removeClass("drop-area-ready-to-deploy"); - $(".deploy-btn").addClass("disabled"); - dropped_items = []; - } - - return false; - } - - //----------------------------------------------------------------------------- - // Local items dropped - //----------------------------------------------------------------------------- - if ( - !e.dataTransfer || - !e.dataTransfer.items || - e.dataTransfer.items.length === 0 - ) - return; - - // get dropped items - dropped_items = await puter.ui.getEntriesFromDataTransferItems( - e.dataTransfer.items - ); - - // generate a flat array of full paths from the dropped items - let paths = []; - for (let item of dropped_items) { - paths.push("/" + (item.fullPath ?? item.filepath)); - } - - // generate a directory tree from the paths - let tree = generateDirTree(paths); - - dropped_items = setRootDirTree(tree, dropped_items); - - // alert if no index.html in root - if (!hasRootIndexHtml(tree)) { - puter.ui.alert(index_missing_error, [ - { - label: "Ok", - }, - ]); - $(".drop-area").removeClass("drop-area-ready-to-deploy"); - $(".deploy-btn").addClass("disabled"); - dropped_items = []; - return; - } - - // Get all keys (directories and files) in the root - const rootKeys = Object.keys(tree); - - // generate a list of items in the root in the form of a string (e.g. /index.html, /css/style.css) with maximum of 3 items - let rootItems = ""; - - if (rootKeys.length === 1) rootItems = rootKeys[0]; - else if (rootKeys.length === 2) - rootItems = rootKeys[0] + ", " + rootKeys[1]; - else if (rootKeys.length === 3) - rootItems = rootKeys[0] + ", " + rootKeys[1] + ", and" + rootKeys[1]; - else if (rootKeys.length > 3) - rootItems = - rootKeys[0] + - ", " + - rootKeys[1] + - ", and " + - (rootKeys.length - 2) + - " more item" + - (rootKeys.length - 2 > 1 ? "s" : ""); - - rootItems = html_encode(rootItems); - $(".drop-area").removeClass("drop-area-hover"); - $(".drop-area").addClass("drop-area-ready-to-deploy"); - drop_area_content = `

${rootItems}

Ready to deploy 🚀

Cancel

`; - $(".drop-area").html(drop_area_content); - - // enable deploy button - $(".deploy-btn").removeClass("disabled"); - - return false; - }, - }); - - // Focus on the first input - $("#edit-app-title").focus(); + // Focus on the first input + $('#edit-app-title').focus(); } -$(".jip-submit-btn").on("click", async function(e) { - const first_name = $("#jip-first-name").val(); - const last_name = $("#jip-last-name").val(); - const paypal = $("#jip-paypal").val(); - let error; +$('.jip-submit-btn').on('click', async function (e) { + const first_name = $('#jip-first-name').val(); + const last_name = $('#jip-last-name').val(); + const paypal = $('#jip-paypal').val(); + let error; - if (first_name === "" || last_name === "" || paypal === "") - error = `All fields are required.`; - else if (first_name.length > 100) - error = `First Name cannot be longer than ${100}.`; - else if (last_name.length > 100) - error = `Last Name cannot be longer than ${100}.`; - else if (paypal.length > 100) - error = `Paypal cannot be longer than ${100}.`; - // check if email is valid - else if (!validateEmail(paypal)) - error = `Paypal email must be a valid email address.`; + if (first_name === '' || last_name === '' || paypal === '') + error = `All fields are required.`; + else if (first_name.length > 100) + error = `First Name cannot be longer than ${100}.`; + else if (last_name.length > 100) + error = `Last Name cannot be longer than ${100}.`; + else if (paypal.length > 100) + error = `Paypal cannot be longer than ${100}.`; + // check if email is valid + else if (!validateEmail(paypal)) + error = `Paypal email must be a valid email address.`; - // error? - if (error) { - $("#jip-error").show(); - $("#jip-error").html(error); - document.body.scrollTop = document.documentElement.scrollTop = 0; - return; - } - - // disable submit button - $(".jip-submit-btn").prop("disabled", true); - - $.ajax({ - url: puter.APIOrigin + "/jip", - type: "POST", - async: true, - contentType: "application/json", - data: JSON.stringify({ - first_name: first_name, - last_name: last_name, - paypal: paypal, - }), - headers: { - Authorization: "Bearer " + puter.authToken, - }, - success: function() { - $("#jip-success").show(); - $("#jip-form").hide(); - //enable submit button - $(".jip-submit-btn").prop("disabled", false); - // update dev profile - $("#payout-method-email").html(paypal); - // show payout method tab - $('.tab-btn[data-tab="payout-method"]').show(); - }, - error: function(err) { - $("#jip-error").show(); - $("#jip-error").html(err.message); - // scroll to top so that user sees error message - document.body.scrollTop = document.documentElement.scrollTop = 0; - // enable submit button - $(".jip-submit-btn").prop("disabled", false); - }, - }); -}); - -$(document).on("click", ".edit-app-save-btn", async function(e) { - const title = $("#edit-app-title").val(); - const name = $("#edit-app-name").val(); - const index_url = $("#edit-app-index-url").val(); - const description = $("#edit-app-description").val(); - const uid = $("#edit-app-uid").val(); - const height = $("#edit-app-window-height").val(); - const width = $("#edit-app-window-width").val(); - const top = $("#edit-app-window-top").val(); - const left = $("#edit-app-window-left").val(); - const category = $("#edit-app-category").val(); - - let filetype_associations = $("#edit-app-filetype-associations").val(); - - let icon; - - let error; - - //validation - if (title === "") error = `Title is required.`; - else if (title.length > 60) - error = `Title cannot be longer than ${60}.`; - else if (name === "") error = `Name is required.`; - else if (name.length > 60) - error = `Name cannot be longer than ${60}.`; - else if (index_url === "") error = `Index URL is required.`; - else if (!name.match(/^[a-zA-Z0-9-_-]+$/)) - error = `Name can only contain letters, numbers, dash (-) and underscore (_).`; - else if (!is_valid_url(index_url)) - error = `Index URL must be a valid url.`; - else if ( - !index_url.toLowerCase().startsWith("https://") && - !index_url.toLowerCase().startsWith("http://") - ) - error = `Index URL must start with 'https://' or 'http://'.`; - // height must be a number - else if (isNaN(height)) - error = `Window Height must be a number.`; - // height must be greater than 0 - else if (height <= 0) - error = `Window Height must be greater than 0.`; - // width must be a number - else if (isNaN(width)) - error = `Window Width must be a number.`; - // width must be greater than 0 - else if (width <= 0) - error = `Window Width must be greater than 0.`; - // top must be a number - else if (top && isNaN(top)) - error = `Window Top must be a number.`; - // left must be a number - else if (left && isNaN(left)) - error = `Window Left must be a number.`; - // download icon from URL - else { - let icon_url = $("#edit-app-icon").attr("data-url"); - let icon_base64 = $("#edit-app-icon").attr("data-base64"); - - if (icon_base64) { - icon = icon_base64; - } else if (icon_url) { - icon = await getBase64ImageFromUrl(icon_url); - let app_max_icon_size = 5 * 1024 * 1024; - if (icon.length > app_max_icon_size) - error = `Icon cannot be larger than ${byte_format(app_max_icon_size)}`; - // make sure icon is an image - else if ( - !icon.startsWith("data:image/") && - !icon.startsWith("data:application/octet-stream") - ) - error = `Icon must be an image.`; - } else { - icon = null; - } - } - - - //parse filetype_associations and validations - // Tagify returns a JSON string, so we parse it into an array - filetype_associations = JSON.parse(filetype_associations); - - filetype_associations = filetype_associations.map((type) => { - const fileType = type.value; - - - if ( - !fileType || - fileType === "." || - fileType === "/" - ) { - error = `File Association Type must be valid.`; - return null; // Return null for invalid cases + // error? + if (error) { + $('#jip-error').show(); + $('#jip-error').html(error); + document.body.scrollTop = document.documentElement.scrollTop = 0; + return; } - const lower = fileType.toLocaleLowerCase(); + // disable submit button + $('.jip-submit-btn').prop('disabled', true); - if (fileType.includes("/")) { - return lower; - } else if (fileType.includes(".")) { - return "." + lower.split(".")[1]; - } else { - return "." + lower; + $.ajax({ + url: puter.APIOrigin + "/jip", + type: 'POST', + async: true, + contentType: "application/json", + data: JSON.stringify({ + first_name: first_name, + last_name: last_name, + paypal: paypal, + }), + headers: { + "Authorization": "Bearer " + puter.authToken + }, + success: function () { + $('#jip-success').show(); + $('#jip-form').hide(); + //enable submit button + $('.jip-submit-btn').prop('disabled', false); + // update dev profile + $('#payout-method-email').html(paypal); + // show payout method tab + $('.tab-btn[data-tab="payout-method"]').show(); + }, + error: function (err) { + $('#jip-error').show(); + $('#jip-error').html(err.message); + // scroll to top so that user sees error message + document.body.scrollTop = document.documentElement.scrollTop = 0; + // enable submit button + $('.jip-submit-btn').prop('disabled', false); + } + }) +}) + +$(document).on('click', '.edit-app-save-btn', async function (e) { + const title = $('#edit-app-title').val(); + const name = $('#edit-app-name').val(); + const index_url = $('#edit-app-index-url').val(); + const description = $('#edit-app-description').val(); + const uid = $('#edit-app-uid').val(); + const height = $('#edit-app-window-height').val(); + const width = $('#edit-app-window-width').val(); + const top = $('#edit-app-window-top').val(); + const left = $('#edit-app-window-left').val(); + const category = $('#edit-app-category').val(); + + let filetype_associations = $('#edit-app-filetype-associations').val(); + + let icon; + + let error; + + //validation + if (title === '') + error = `Title is required.`; + else if (title.length > 60) + error = `Title cannot be longer than ${60}.`; + else if (name === '') + error = `Name is required.`; + else if (name.length > 60) + error = `Name cannot be longer than ${60}.`; + else if (index_url === '') + error = `Index URL is required.`; + else if (!name.match(/^[a-zA-Z0-9-_-]+$/)) + error = `Name can only contain letters, numbers, dash (-) and underscore (_).`; + else if (!is_valid_url(index_url)) + error = `Index URL must be a valid url.`; + else if (!index_url.toLowerCase().startsWith('https://') && !index_url.toLowerCase().startsWith('http://')) + error = `Index URL must start with 'https://' or 'http://'.`; + // height must be a number + else if (isNaN(height)) + error = `Window Height must be a number.`; + // height must be greater than 0 + else if (height <= 0) + error = `Window Height must be greater than 0.`; + // width must be a number + else if (isNaN(width)) + error = `Window Width must be a number.`; + // width must be greater than 0 + else if (width <= 0) + error = `Window Width must be greater than 0.`; + // top must be a number + else if (top && isNaN(top)) + error = `Window Top must be a number.`; + // left must be a number + else if (left && isNaN(left)) + error = `Window Left must be a number.`; + + // download icon from URL + else { + let icon_url = $('#edit-app-icon').attr('data-url'); + let icon_base64 = $('#edit-app-icon').attr('data-base64'); + + if(icon_base64){ + icon = icon_base64; + }else if (icon_url) { + icon = await getBase64ImageFromUrl(icon_url); + let app_max_icon_size = 5 * 1024 * 1024; + if (icon.length > app_max_icon_size) + error = `Icon cannot be larger than ${byte_format(app_max_icon_size)}`; + // make sure icon is an image + else if (!icon.startsWith('data:image/') && !icon.startsWith('data:application/octet-stream')) + error = `Icon must be an image.`; + }else{ + icon = null; + } } - }).filter(Boolean); // Remove null or undefined values + // error? + if (error) { + $('#edit-app-error').show(); + $('#edit-app-error').html(error); + document.body.scrollTop = document.documentElement.scrollTop = 0; + return; + } - // error? - if (error) { - $("#edit-app-error").show(); - $("#edit-app-error").html(error); - document.body.scrollTop = document.documentElement.scrollTop = 0; - return; - } + // show working spinner + puter.ui.showSpinner(); - // show working spinner - puter.ui.showSpinner(); + // parse filetype_associations + filetype_associations = filetype_associations.split(',').map(element => element.trim()); + // disable submit button + $('.edit-app-save-btn').prop('disabled', true); + let socialImageUrl = null; + if ($('#edit-app-social-image').attr('data-base64')) { + socialImageUrl = await handleSocialImageUpload(name, $('#edit-app-social-image').attr('data-base64')); + } else if ($('#edit-app-social-image').attr('data-url')) { + socialImageUrl = $('#edit-app-social-image').attr('data-url'); + } + + puter.apps.update(currently_editing_app.name, { + title: title, + name: name, + indexURL: index_url, + icon: icon, + description: description, + maximizeOnStart: $('#edit-app-maximize-on-start').is(":checked"), + background: $('#edit-app-background').is(":checked"), + metadata: { + fullpage_on_landing: $('#edit-app-fullpage-on-landing').is(":checked"), + social_image: socialImageUrl, + category: category || null, + window_size: { + width: width ?? 800, + height: height ?? 600, + }, + window_position: { + top: top, + left: left, + }, + window_resizable: $('#edit-app-window-resizable').is(":checked"), + hide_titlebar: $('#edit-app-hide-titlebar').is(":checked"), + locked: $(`#edit-app-locked`).is(":checked") ?? false, + credentialless: $(`#edit-app-credentialless`).is(":checked") ?? true, - // disable submit button - $(".edit-app-save-btn").prop("disabled", true); - - let socialImageUrl = null; - if ($("#edit-app-social-image").attr("data-base64")) { - socialImageUrl = await handleSocialImageUpload( - name, - $("#edit-app-social-image").attr("data-base64") - ); - } else if ($("#edit-app-social-image").attr("data-url")) { - socialImageUrl = $("#edit-app-social-image").attr("data-url"); - } - - puter.apps - .update(currently_editing_app.name, { - title: title, - name: name, - indexURL: index_url, - icon: icon, - description: description, - maximizeOnStart: $("#edit-app-maximize-on-start").is(":checked"), - background: $("#edit-app-background").is(":checked"), - metadata: { - fullpage_on_landing: $("#edit-app-fullpage-on-landing").is(":checked"), - social_image: socialImageUrl, - category: category || null, - window_size: { - width: width ?? 800, - height: height ?? 600, }, filetypeAssociations: filetype_associations, }).then(async (app) => { @@ -1406,166 +1200,148 @@ $(document).on('click', '.open-app-btn', async function (e) { puter.ui.launchApp($(this).attr('data-app-name')) }) -$(document).on("click", ".open-app-btn", async function(e) { - puter.ui.launchApp($(this).attr("data-app-name")); -}); +$('#earn-money-c2a-close').click(async function (e) { + $('#earn-money').get(0).close(); + puter.kv.set('earn-money-c2a-closed', 'true') +}) -$("#earn-money-c2a-close").click(async function(e) { - $("#earn-money").get(0).close(); - puter.kv.set("earn-money-c2a-closed", "true"); -}); +$('#earn-money::backdrop').click(async function (e) { + alert(); + $('#earn-money').get(0).close(); + puter.kv.set('earn-money-c2a-closed', 'true') +}) -$("#earn-money::backdrop").click(async function(e) { - alert(); - $("#earn-money").get(0).close(); - puter.kv.set("earn-money-c2a-closed", "true"); -}); +$(document).on('click', '.edit-app-open-app-btn', async function (e) { + puter.ui.launchApp($(this).attr('data-app-name')) +}) -$(document).on("click", ".edit-app-open-app-btn", async function(e) { - puter.ui.launchApp($(this).attr("data-app-name")); -}); +$(document).on('click', '.delete-app-settings', async function (e) { + let app_uid = $(this).attr('data-app-uid'); + let app_name = $(this).attr('data-app-name'); + let app_title = $(this).attr('data-app-title'); -$(document).on("click", ".delete-app-settings", async function(e) { - let app_uid = $(this).attr("data-app-uid"); - let app_name = $(this).attr("data-app-name"); - let app_title = $(this).attr("data-app-title"); + // check if app is locked + const app_data = await puter.apps.get(app_name); - // check if app is locked - const app_data = await puter.apps.get(app_name); - - if (app_data.metadata?.locked) { - puter.ui.alert( - `${app_data.title} is locked and cannot be deleted.`, - [ - { - label: "Ok", - }, - ], - { - type: "warning", - } - ); - return; - } - - // confirm delete - const alert_resp = await puter.ui.alert( - `Are you sure you want to premanently delete ${html_encode(app_title)}?`, - [ - { - label: "Yes, delete permanently", - value: "delete", - type: "danger", - }, - { - label: "Cancel", - }, - ] - ); - - if (alert_resp === "delete") { - let init_ts = Date.now(); - $(".deleting-app-modal")?.get(0)?.showModal(); - puter.apps - .delete(app_name) - .then(async (app) => { - setTimeout( - () => { - $(".deleting-app-modal")?.get(0)?.close(); - $(".back-to-main-btn").trigger("click"); - }, - // make sure the modal was shown for at least 2 seconds - Date.now() - init_ts > 2000 ? 1 : 2000 - (Date.now() - init_ts) - ); - // get app directory - puter.fs - .stat({ - path: `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, - returnSubdomains: true, - }) - .then(async (stat) => { - // delete subdomain associated with the app dir - puter.hosting.delete(stat.subdomains[0].subdomain); - // delete app directory - puter.fs.delete( - `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, - { recursive: true } - ); - }); - }) - .catch(async (err) => { - setTimeout( - () => { - $(".deleting-app-modal")?.get(0)?.close(); - puter.ui.alert(err?.message, [ - { - label: "Ok", - }, - ]); - }, - Date.now() - init_ts > 2000 ? 1 : 2000 - (Date.now() - init_ts) - ); - }); - } -}); - -$(document).on("click", ".edit-app", async function(e) { - $("#edit-app-uid").val($(this).attr("data-app-uid")); -}); - -$(document).on("click", ".back-to-main-btn", function(e) { - $("section:not(.sidebar)").hide(); - $(".tab-btn").removeClass("active"); - $('.tab-btn[data-tab="apps"]').addClass("active"); - - // get apps - $("#loading").show(); - setTimeout(function() { - puter.apps.list().then((apps_res) => { - // uncheck the select all checkbox - $(".select-all-apps").prop("checked", false); - - $("#loading").hide(); - apps = apps_res; - if (apps.length > 0) { - if (activeTab === "apps") { - $("#no-apps-notice").hide(); - $("#app-list").show(); - } - $(".app-card").remove(); - apps.forEach((app) => { - $("#app-list-table > tbody").append(generate_app_card(app)); + if(app_data.metadata?.locked){ + puter.ui.alert(`${app_data.title} is locked and cannot be deleted.`, [ + { + label: 'Ok', + }, + ], { + type: 'warning', }); - count_apps(); - sort_apps(); - } else $("#no-apps-notice").show(); - }); - }, 1000); -}); + return; + } + + // confirm delete + const alert_resp = await puter.ui.alert(`Are you sure you want to premanently delete ${html_encode(app_title)}?`, + [ + { + label: 'Yes, delete permanently', + value: 'delete', + type: 'danger', + }, + { + label: 'Cancel' + }, + ] + ); + + if (alert_resp === 'delete') { + let init_ts = Date.now(); + $('.deleting-app-modal')?.get(0)?.showModal(); + puter.apps.delete(app_name).then(async (app) => { + setTimeout(() => { + $('.deleting-app-modal')?.get(0)?.close(); + $('.back-to-main-btn').trigger('click'); + }, + // make sure the modal was shown for at least 2 seconds + (Date.now() - init_ts) > 2000 ? 1 : 2000 - (Date.now() - init_ts)); + // get app directory + puter.fs.stat({ + path: `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, + returnSubdomains: true, + }).then(async (stat) => { + // delete subdomain associated with the app dir + puter.hosting.delete(stat.subdomains[0].subdomain) + // delete app directory + puter.fs.delete( + `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, + { recursive: true } + ) + }) + }).catch(async (err) => { + setTimeout(() => { + $('.deleting-app-modal')?.get(0)?.close(); + puter.ui.alert(err?.message, [ + { + label: 'Ok', + }, + ]); + }, + (Date.now() - init_ts) > 2000 ? 1 : (2000 - (Date.now() - init_ts))); + }) + } +}) + +$(document).on('click', '.edit-app', async function (e) { + $('#edit-app-uid').val($(this).attr('data-app-uid')); +}) + +$(document).on('click', '.back-to-main-btn', function (e) { + $('section:not(.sidebar)').hide(); + $('.tab-btn').removeClass('active'); + $('.tab-btn[data-tab="apps"]').addClass('active'); + + // get apps + $('#loading').show(); + setTimeout(function () { + puter.apps.list().then((apps_res) => { + // uncheck the select all checkbox + $('.select-all-apps').prop('checked', false); + + $('#loading').hide(); + apps = apps_res; + if (apps.length > 0) { + if (activeTab === 'apps') { + $('#no-apps-notice').hide(); + $('#app-list').show(); + } + $('.app-card').remove(); + apps.forEach(app => { + $('#app-list-table > tbody').append(generate_app_card(app)); + }); + count_apps(); + sort_apps(); + } else + $('#no-apps-notice').show(); + }) + }, 1000); +}) function count_apps() { - let count = 0; - $(".app-card").each(function() { - count++; - }); - $(".app-count").html(count); - return count; + let count = 0; + $('.app-card').each(function () { + count++; + }) + $('.app-count').html(count); + return count; } // https://stackoverflow.com/a/43467144/1764493 function is_valid_url(string) { - let url; + let url; - try { - url = new URL(string); - } catch (_) { - return false; - } + try { + url = new URL(string); + } catch (_) { + return false; + } - return url.protocol === "http:" || url.protocol === "https:"; + return url.protocol === "http:" || url.protocol === "https:"; } - $(document).on('click', '#edit-app-icon-delete', async function (e) { $('#edit-app-icon').css('background-image', ``); $('#edit-app-icon').removeAttr('data-url'); @@ -1576,31 +1352,26 @@ $(document).on('click', '#edit-app-icon-delete', async function (e) { toggleResetButton(); }) +$(document).on('click', '#edit-app-icon', async function (e) { + const res2 = await puter.ui.showOpenFilePicker({ + accept: "image/*", + }); -$(document).on("click", "#edit-app-icon", async function(e) { - const res2 = await puter.ui.showOpenFilePicker({ - accept: "image/*", - }); + const icon = await puter.fs.read(res2.path); + // convert blob to base64 + const reader = new FileReader(); + reader.readAsDataURL(icon); - const icon = await puter.fs.read(res2.path); - // convert blob to base64 - const reader = new FileReader(); - reader.readAsDataURL(icon); + reader.onloadend = function () { + let image = reader.result; + // Get file extension + let fileExtension = res2.name.split('.').pop(); - reader.onloadend = function() { - let image = reader.result; - // Get file extension - let fileExtension = res2.name.split(".").pop(); - - // Get MIME type - let mimeType = getMimeType(fileExtension); - - // Replace MIME type in the data URL - image = image.replace( - "data:application/octet-stream;base64", - `data:${mimeType};base64` - ); + // Get MIME type + let mimeType = getMimeType(fileExtension); + // Replace MIME type in the data URL + image = image.replace('data:application/octet-stream;base64', `data:${mimeType};base64`); $('#edit-app-icon').css('background-image', `url(${image})`); $('#edit-app-icon').attr('data-base64', image); @@ -1611,35 +1382,30 @@ $(document).on("click", "#edit-app-icon", async function(e) { } }) - async function getBase64ImageFromUrl(imageUrl) { - var res = await fetch(imageUrl); - var blob = await res.blob(); + var res = await fetch(imageUrl); + var blob = await res.blob(); - return new Promise((resolve, reject) => { - var reader = new FileReader(); - reader.addEventListener( - "load", - function() { - resolve(reader.result); - }, - false - ); + return new Promise((resolve, reject) => { + var reader = new FileReader(); + reader.addEventListener("load", function () { + resolve(reader.result); + }, false); - reader.onerror = () => { - return reject(this); - }; - reader.readAsDataURL(blob); - }); + reader.onerror = () => { + return reject(this); + }; + reader.readAsDataURL(blob); + }) } /** * Generates HTML for an individual app card in the app list. - * + * * @param {Object} app - The app object containing details of the app. - * * + * * * @returns {string} HTML string representing the app card. - * + * * @description * This function creates an HTML string for an app card, which includes: * - Checkbox for app selection @@ -1648,115 +1414,115 @@ async function getBase64ImageFromUrl(imageUrl) { * - Display of app statistics (user count, open count) * - Creation date * - Incentive program status badge (if applicable) - * + * * The generated HTML is designed to be inserted into the app list table. - * It includes data attributes for various interactive features and + * It includes data attributes for various interactive features and * event handling. - * + * * @example * const appCardHTML = generate_app_card(myAppObject); * $('#app-list-table > tbody').append(appCardHTML); */ function generate_app_card(app) { - let h = ``; - h += ``; - // check box - h += ``; - h += `
`; - h += ``; - h += `
`; - h += ``; - // App info - h += ``; - // Icon - h += `
`; - // Info - h += `
`; - // Title - h += `

${html_encode(app.title)}${app.metadata?.locked ? lock_svg : ""}

`; - // // Category - // if (app.metadata?.category) { - // const category = APP_CATEGORIES.find(c => c.id === app.metadata.category); - // if (category) { - // h += `
`; - // h += `${category.label}`; - // h += `
`; - // } - // } + let h = ``; + h += ``; + // check box + h += ``; + h += `
`; + h += ``; + h += `
`; + h += ``; + // App info + h += ``; + // Icon + h += `
`; + // Info + h += `
`; + // Title + h += `

${html_encode(app.title)}${app.metadata?.locked ? lock_svg : ''}

`; + // // Category + // if (app.metadata?.category) { + // const category = APP_CATEGORIES.find(c => c.id === app.metadata.category); + // if (category) { + // h += `
`; + // h += `${category.label}`; + // h += `
`; + // } + // } - // link - h += `${html_encode(applink(app))}`; + // link + h += `${html_encode(applink(app))}`; - // toolbar - h += `
`; + // toolbar + h += `
`; - // Open - h += `Open`; - h += ``; + // Open + h += `Open`; + h += ``; - // Settings - h += `Settings`; - h += ``; + // Settings + h += `Settings`; + h += ``; - // add to desktop - h += `Add Shortcut to Desktop`; - h += ``; + // add to desktop + h += `Add Shortcut to Desktop` + h += ``; - // Delete - h += `Delete`; - h += `
`; - h += ``; + // Delete + h += `Delete`; + h += `
`; + h += ``; - // users count - h += ``; - h += `${number_format((app.stats.referral_count ?? 0) + app.stats.user_count)}`; - h += ``; + // users count + h += ``; + h += `${number_format((app.stats.referral_count ?? 0) + app.stats.user_count)}`; + h += ``; - // opens - h += ``; - h += `${number_format(app.stats.open_count)}`; - h += ``; + // opens + h += ``; + h += `${number_format(app.stats.open_count)}`; + h += ``; - // Created - h += ``; - h += `${moment(app.created_at).format("MMM Do, YYYY")}`; - h += ``; + // Created + h += ``; + h += `${moment(app.created_at).format('MMM Do, YYYY')}`; + h += ``; - h += ``; - h += `
`; - // "Approved for listing" - h += ``; + h += ``; + h += `
`; + // "Approved for listing" + h += ``; - // "Approved for opening items" - h += ``; + // "Approved for opening items" + h += ``; - // "Approved for incentive program" - h += ``; - h += `
`; - h += ``; - h += ``; - return h; + // "Approved for incentive program" + h += ``; + h += `
`; + h += ``; + h += ``; + return h; } /** * Formats a binary-byte integer into the human-readable form with units. - * - * @param {integer} bytes - * @returns + * + * @param {integer} bytes + * @returns */ window.byte_format = (bytes) => { - const sizes = ["Bytes", "KB", "MB", "GB", "TB"]; - if (bytes === 0) return "0 Byte"; - const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024))); - return Math.round(bytes / Math.pow(1024, i), 2) + " " + sizes[i]; + const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']; + if (bytes === 0) return '0 Byte'; + const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024))); + return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i]; }; /** * check if a string is a valid email address */ function validateEmail(email) { - var re = /\S+@\S+\.\S+/; - return re.test(email); + var re = /\S+@\S+\.\S+/; + return re.test(email); } /** @@ -1770,904 +1536,864 @@ function validateEmail(email) { * @throws {TypeError} If the `number` parameter cannot be converted to a finite number, or if the `decimals` parameter is non-finite and cannot be converted to an absolute number. */ function number_format(number, decimals, dec_point, thousands_sep) { - // Strip all characters but numerical ones. - number = (number + "").replace(/[^0-9+\-Ee.]/g, ""); - var n = !isFinite(+number) ? 0 : +number, - prec = !isFinite(+decimals) ? 0 : Math.abs(decimals), - sep = typeof thousands_sep === "undefined" ? "," : thousands_sep, - dec = typeof dec_point === "undefined" ? "." : dec_point, - s = "", - toFixedFix = function(n, prec) { - var k = Math.pow(10, prec); - return "" + Math.round(n * k) / k; - }; - // Fix for IE parseFloat(0.55).toFixed(0) = 0; - s = (prec ? toFixedFix(n, prec) : "" + Math.round(n)).split("."); - if (s[0].length > 3) { - s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep); - } - if ((s[1] || "").length < prec) { - s[1] = s[1] || ""; - s[1] += new Array(prec - s[1].length + 1).join("0"); - } - return s.join(dec); + // Strip all characters but numerical ones. + number = (number + '').replace(/[^0-9+\-Ee.]/g, ''); + var n = !isFinite(+number) ? 0 : +number, + prec = !isFinite(+decimals) ? 0 : Math.abs(decimals), + sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep, + dec = (typeof dec_point === 'undefined') ? '.' : dec_point, + s = '', + toFixedFix = function (n, prec) { + var k = Math.pow(10, prec); + return '' + Math.round(n * k) / k; + }; + // Fix for IE parseFloat(0.55).toFixed(0) = 0; + s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.'); + if (s[0].length > 3) { + s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep); + } + if ((s[1] || '').length < prec) { + s[1] = s[1] || ''; + s[1] += new Array(prec - s[1].length + 1).join('0'); + } + return s.join(dec); } -$(document).on("click", ".close-message", function() { - $($(this).attr("data-target")).fadeOut(); +$(document).on('click', '.close-message', function () { + $($(this).attr('data-target')).fadeOut(); }); -$("th.sort").on("click", function(e) { - // determine what column to sort by - const sortByColumn = $(this).attr("data-column"); +$('th.sort').on('click', function (e) { + // determine what column to sort by + const sortByColumn = $(this).attr('data-column'); - // toggle sort direction - if (sortByColumn === sortBy) { - if (sortDirection === "asc") sortDirection = "desc"; - else sortDirection = "asc"; - } else { - sortBy = sortByColumn; - sortDirection = "desc"; - } + // toggle sort direction + if (sortByColumn === sortBy) { + if (sortDirection === 'asc') + sortDirection = 'desc'; + else + sortDirection = 'asc'; + } + else { + sortBy = sortByColumn; + sortDirection = 'desc'; + } - // update arrow - $(".sort-arrow").css("display", "none"); - $("#app-list-table").find("th").removeClass("sorted"); - $(this) - .find(".sort-arrow-" + sortDirection) - .css("display", "inline"); - $(this).addClass("sorted"); + // update arrow + $('.sort-arrow').css('display', 'none'); + $('#app-list-table').find('th').removeClass('sorted'); + $(this).find('.sort-arrow-' + sortDirection).css('display', 'inline'); + $(this).addClass('sorted'); - sort_apps(); + sort_apps(); }); function sort_apps() { - let sorted_apps; + let sorted_apps; - // sort - if (sortDirection === "asc") { - sorted_apps = apps.sort((a, b) => { - if (sortBy === "name") { - return a[sortBy].localeCompare(b[sortBy]); - } else if (sortBy === "created_at") { - return new Date(a[sortBy]) - new Date(b[sortBy]); - } else if (sortBy === "user_count" || sortBy === "open_count") { - return a.stats[sortBy] - b.stats[sortBy]; - } else { - a[sortBy] > b[sortBy] ? 1 : -1; - } + // sort + if (sortDirection === 'asc'){ + sorted_apps = apps.sort((a, b) => { + if(sortBy === 'name'){ + return a[sortBy].localeCompare(b[sortBy]); + }else if(sortBy === 'created_at'){ + return new Date(a[sortBy]) - new Date(b[sortBy]); + } else if(sortBy === 'user_count' || sortBy === 'open_count'){ + return a.stats[sortBy] - b.stats[sortBy]; + }else{ + a[sortBy] > b[sortBy] ? 1 : -1 + } + }); + }else{ + sorted_apps = apps.sort((a, b) => { + if(sortBy === 'name'){ + return b[sortBy].localeCompare(a[sortBy]); + }else if(sortBy === 'created_at'){ + return new Date(b[sortBy]) - new Date(a[sortBy]); + } else if(sortBy === 'user_count' || sortBy === 'open_count'){ + return b.stats[sortBy] - a.stats[sortBy]; + }else{ + b[sortBy] > a[sortBy] ? 1 : -1 + } + }); + } + // refresh app list + $('.app-card').remove(); + sorted_apps.forEach(app => { + $('#app-list-table > tbody').append(generate_app_card(app)); }); - } else { - sorted_apps = apps.sort((a, b) => { - if (sortBy === "name") { - return b[sortBy].localeCompare(a[sortBy]); - } else if (sortBy === "created_at") { - return new Date(b[sortBy]) - new Date(a[sortBy]); - } else if (sortBy === "user_count" || sortBy === "open_count") { - return b.stats[sortBy] - a.stats[sortBy]; - } else { - b[sortBy] > a[sortBy] ? 1 : -1; - } - }); - } - // refresh app list - $(".app-card").remove(); - sorted_apps.forEach((app) => { - $("#app-list-table > tbody").append(generate_app_card(app)); - }); - count_apps(); + count_apps(); - // show apps that match search_query and hide apps that don't - if (search_query) { // show apps that match search_query and hide apps that don't - apps.forEach((app) => { - if (app.title.toLowerCase().includes(search_query.toLowerCase())) { - $(`.app-card[data-name="${html_encode(app.name)}"]`).show(); - } else { - $(`.app-card[data-name="${html_encode(app.name)}"]`).hide(); - } - }); - } + if (search_query) { + // show apps that match search_query and hide apps that don't + apps.forEach((app) => { + if (app.title.toLowerCase().includes(search_query.toLowerCase())) { + $(`.app-card[data-name="${html_encode(app.name)}"]`).show(); + } else { + $(`.app-card[data-name="${html_encode(app.name)}"]`).hide(); + } + }) + } } -window.deploy = async function(app, items) { - let appdata_dir, current_app_dir; +window.deploy = async function (app, items) { + let appdata_dir, current_app_dir; - // disable deploy button - $(".deploy-btn").addClass("disabled"); + // disable deploy button + $('.deploy-btn').addClass('disabled'); - // change drop area text - $(".drop-area").html( - deploying_spinner + - '
Deploying (0%)
' - ); + // change drop area text + $('.drop-area').html(deploying_spinner + '
Deploying (0%)
'); - if ( - typeof items === "string" && - (items.startsWith("/") || items.startsWith("~")) - ) { - $(".drop-area").removeClass("drop-area-hover"); - $(".drop-area").addClass("drop-area-ready-to-deploy"); - } - - // -------------------------------------------------------------------- - // Get current directory, we need to delete the existing hostname - // later on - // -------------------------------------------------------------------- - try { - current_app_dir = await puter.fs.stat({ - path: `/${authUsername}/AppData/${dev_center_uid}/${app.uid ?? app.uuid}`, - returnSubdomains: true, - }); - } catch (err) { - console.log(err); - } - - // -------------------------------------------------------------------- - // Delete existing hostnames attached to this app directory if they exist - // -------------------------------------------------------------------- - if (current_app_dir?.subdomains.length > 0) { - for (let subdomain of current_app_dir?.subdomains) { - puter.hosting.delete(subdomain.subdomain); + if (typeof items === 'string' && (items.startsWith('/') || items.startsWith('~'))) { + $('.drop-area').removeClass('drop-area-hover'); + $('.drop-area').addClass('drop-area-ready-to-deploy'); } - } - - // -------------------------------------------------------------------- - // Delete existing app directory - // -------------------------------------------------------------------- - try { - await puter.fs.delete(current_app_dir.path); - } catch (err) { - console.log(err); - } - - // -------------------------------------------------------------------- - // Make an app directory under AppData - // if the directory already exists, it should be overwritten - // -------------------------------------------------------------------- - try { - appdata_dir = await puter.fs.mkdir( - // path - `/${authUsername}/AppData/${dev_center_uid}/${app.uid ?? app.uuid}`, - // options - { overwrite: true, recursive: true, rename: false } - ); - } catch (err) { - console.log(err); - } - - // -------------------------------------------------------------------- - // (A) One Puter Item: If 'items' is a string and starts with /, it's a path to a Puter item - // -------------------------------------------------------------------- - if ( - typeof items === "string" && - (items.startsWith("/") || items.startsWith("~")) - ) { - // perform stat on 'items' - const stat = await puter.fs.stat(items); // -------------------------------------------------------------------- - // Puter Directory + // Get current directory, we need to delete the existing hostname + // later on // -------------------------------------------------------------------- - // Perform readdir on 'items' - // todo there is apparently a bug in Puter where sometimes path is literally missing from the items - // returned by readdir. This is the 'path' that readdit didn't return a path for: "~/Desktop/particle-clicker-master" - if (stat.is_dir) { - const files = await puter.fs.readdir(items); - // copy the 'files' to the app directory - if (files.length > 0) { - for (let file of files) { - // perform copy - await puter.fs.copy(file.path, appdata_dir.path, { overwrite: true }); - // update progress - $(".deploy-percent").text( - `(${Math.round((files.indexOf(file) / files.length) * 100)}%)` - ); + try { + current_app_dir = await puter.fs.stat({ + path: `/${authUsername}/AppData/${dev_center_uid}/${app.uid ?? app.uuid}`, + returnSubdomains: true + }); + } catch (err) { + console.log(err); + } + + // -------------------------------------------------------------------- + // Delete existing hostnames attached to this app directory if they exist + // -------------------------------------------------------------------- + if (current_app_dir?.subdomains.length > 0) { + for (let subdomain of current_app_dir?.subdomains) { + puter.hosting.delete(subdomain.subdomain) } - } - } - // -------------------------------------------------------------------- - // Puter File - // -------------------------------------------------------------------- - else { - // copy the 'files' to the app directory - await puter.fs.copy(items, appdata_dir.path, { overwrite: true }); } - // generate new hostname with a random suffix - let hostname = `${currently_editing_app.name}-${(Math.random() + 1).toString(36).substring(7)}`; - // -------------------------------------------------------------------- - // Create a router for the app with the fresh hostname - // we change hostname every time to prevent caching issues + // Delete existing app directory // -------------------------------------------------------------------- - puter.hosting.create(hostname, appdata_dir.path).then(async (res) => { - // TODO this endpoint needs to be able to update only the specified fields - puter.apps.update(currently_editing_app.name, { - indexURL: protocol + `://${hostname}.` + static_hosting_domain, - title: currently_editing_app.title, - name: currently_editing_app.name, - icon: currently_editing_app.icon, - description: currently_editing_app.description, - maximizeOnStart: currently_editing_app.maximize_on_start, - background: currently_editing_app.background, - filetypeAssociations: currently_editing_app.filetype_associations, - }); - // set the 'Index URL' field for the 'Settings' tab - $("#edit-app-index-url").val( - protocol + `://${hostname}.` + static_hosting_domain - ); - // show success message - $(".deploy-success-msg").show(); - // reset drop area - reset_drop_area(); - }); - } - // -------------------------------------------------------------------- - // (B) Multiple Puter Items: If `items` is an Array `items[0]` has `uid` - // then it's a Puter Item Array. - // -------------------------------------------------------------------- - else if (Array.isArray(items) && items[0].uid) { - // If there's no index.html in the root, return - if (!hasRootIndexHtml) return; - - // copy the 'files' to the app directory - for (let item of items) { - // perform copy - await puter.fs.copy( - item.fullPath ? item.fullPath : item.path ? item.path : item.filepath, - appdata_dir.path, - { overwrite: true } - ); - // update progress - $(".deploy-percent").text( - `(${Math.round((items.indexOf(item) / items.length) * 100)}%)` - ); + try { + await puter.fs.delete(current_app_dir.path) + } catch (err) { + console.log(err); } - // generate new hostname with a random suffix - let hostname = `${currently_editing_app.name}-${(Math.random() + 1).toString(36).substring(7)}`; + // -------------------------------------------------------------------- + // Make an app directory under AppData + // if the directory already exists, it should be overwritten + // -------------------------------------------------------------------- + try { + appdata_dir = await puter.fs.mkdir( + // path + `/${authUsername}/AppData/${dev_center_uid}/${app.uid ?? app.uuid}`, + // options + { overwrite: true, recursive: true, rename: false } + ) + } catch (err) { + console.log(err); + } // -------------------------------------------------------------------- - // Create a router for the app with the fresh hostname - // we change hostname every time to prevent caching issues + // (A) One Puter Item: If 'items' is a string and starts with /, it's a path to a Puter item // -------------------------------------------------------------------- - puter.hosting.create(hostname, appdata_dir.path).then(async (res) => { - // TODO this endpoint needs to be able to update only the specified fields - puter.apps.update(currently_editing_app.name, { - indexURL: protocol + `://${hostname}.` + static_hosting_domain, - title: currently_editing_app.title, - name: currently_editing_app.name, - icon: currently_editing_app.icon, - description: currently_editing_app.description, - maximizeOnStart: currently_editing_app.maximize_on_start, - background: currently_editing_app.background, - filetypeAssociations: currently_editing_app.filetype_associations, - }); - // set the 'Index URL' field for the 'Settings' tab - $("#edit-app-index-url").val( - protocol + `://${hostname}.` + static_hosting_domain - ); - // show success message - $(".deploy-success-msg").show(); - // reset drop area - reset_drop_area(); - }); - } + if (typeof items === 'string' && (items.startsWith('/') || items.startsWith('~'))) { + // perform stat on 'items' + const stat = await puter.fs.stat(items); - // -------------------------------------------------------------------- - // (C) Local Items: Upload new deploy - // -------------------------------------------------------------------- - else { - puter.fs - .upload( - items, - `/${authUsername}/AppData/${dev_center_uid}/${currently_editing_app.uid}`, - { - dedupeName: false, - overwrite: false, - parsedDataTransferItems: true, - createMissingAncestors: true, - progress: function(operation_id, op_progress) { - $(".deploy-percent").text(`(${op_progress}%)`); - }, + // -------------------------------------------------------------------- + // Puter Directory + // -------------------------------------------------------------------- + // Perform readdir on 'items' + // todo there is apparently a bug in Puter where sometimes path is literally missing from the items + // returned by readdir. This is the 'path' that readdit didn't return a path for: "~/Desktop/particle-clicker-master" + if (stat.is_dir) { + const files = await puter.fs.readdir(items); + // copy the 'files' to the app directory + if (files.length > 0) { + for (let file of files) { + // perform copy + await puter.fs.copy( + file.path, + appdata_dir.path, + { overwrite: true } + ); + // update progress + $('.deploy-percent').text(`(${Math.round((files.indexOf(file) / files.length) * 100)}%)`); + } + } } - ) - .then(async (uploaded) => { - // new hostname + // -------------------------------------------------------------------- + // Puter File + // -------------------------------------------------------------------- + else { + // copy the 'files' to the app directory + await puter.fs.copy( + items, + appdata_dir.path, + { overwrite: true } + ); + } + + // generate new hostname with a random suffix let hostname = `${currently_editing_app.name}-${(Math.random() + 1).toString(36).substring(7)}`; - // ---------------------------------------- - // Create a router for the app with a fresh hostname + // -------------------------------------------------------------------- + // Create a router for the app with the fresh hostname // we change hostname every time to prevent caching issues - // ---------------------------------------- + // -------------------------------------------------------------------- puter.hosting.create(hostname, appdata_dir.path).then(async (res) => { - // TODO this endpoint needs to be able to update only the specified fields - puter.apps.update(currently_editing_app.name, { - indexURL: protocol + `://${hostname}.` + static_hosting_domain, - title: currently_editing_app.title, - name: currently_editing_app.name, - icon: currently_editing_app.icon, - description: currently_editing_app.description, - maximizeOnStart: currently_editing_app.maximize_on_start, - background: currently_editing_app.background, - filetypeAssociations: currently_editing_app.filetype_associations, - }); - // set the 'Index URL' field for the 'Settings' tab - $("#edit-app-index-url").val( - protocol + `://${hostname}.` + static_hosting_domain - ); - // show success message - $(".deploy-success-msg").show(); - // reset drop area - reset_drop_area(); - }); - }); - } -}; + // TODO this endpoint needs to be able to update only the specified fields + puter.apps.update(currently_editing_app.name, { + indexURL: protocol + `://${hostname}.` + static_hosting_domain, + title: currently_editing_app.title, + name: currently_editing_app.name, + icon: currently_editing_app.icon, + description: currently_editing_app.description, + maximizeOnStart: currently_editing_app.maximize_on_start, + background: currently_editing_app.background, + filetypeAssociations: currently_editing_app.filetype_associations, + }) + // set the 'Index URL' field for the 'Settings' tab + $('#edit-app-index-url').val(protocol + `://${hostname}.` + static_hosting_domain); + // show success message + $('.deploy-success-msg').show(); + // reset drop area + reset_drop_area(); + }) + } + // -------------------------------------------------------------------- + // (B) Multiple Puter Items: If `items` is an Array `items[0]` has `uid` + // then it's a Puter Item Array. + // -------------------------------------------------------------------- + else if (Array.isArray(items) && items[0].uid) { + // If there's no index.html in the root, return + if (!hasRootIndexHtml) + return; -$(document).on("click", ".section-tab-btn", function(e) { - // hide all tabs - $(".section-tab").hide(); - // show section - $('.section-tab[data-tab="' + $(this).attr("data-tab") + '"]').show(); - // remove active class from all tab buttons - $(".section-tab-btn").removeClass("active"); - // add active class to clicked tab button - $(this).addClass("active"); -}); + // copy the 'files' to the app directory + for (let item of items) { + // perform copy + await puter.fs.copy( + item.fullPath ? item.fullPath : item.path ? item.path : item.filepath, + appdata_dir.path, + { overwrite: true } + ); + // update progress + $('.deploy-percent').text(`(${Math.round((items.indexOf(item) / items.length) * 100)}%)`); + } + + // generate new hostname with a random suffix + let hostname = `${currently_editing_app.name}-${(Math.random() + 1).toString(36).substring(7)}`; + + // -------------------------------------------------------------------- + // Create a router for the app with the fresh hostname + // we change hostname every time to prevent caching issues + // -------------------------------------------------------------------- + puter.hosting.create(hostname, appdata_dir.path).then(async (res) => { + // TODO this endpoint needs to be able to update only the specified fields + puter.apps.update(currently_editing_app.name, { + indexURL: protocol + `://${hostname}.` + static_hosting_domain, + title: currently_editing_app.title, + name: currently_editing_app.name, + icon: currently_editing_app.icon, + description: currently_editing_app.description, + maximizeOnStart: currently_editing_app.maximize_on_start, + background: currently_editing_app.background, + filetypeAssociations: currently_editing_app.filetype_associations, + }) + // set the 'Index URL' field for the 'Settings' tab + $('#edit-app-index-url').val(protocol + `://${hostname}.` + static_hosting_domain); + // show success message + $('.deploy-success-msg').show(); + // reset drop area + reset_drop_area(); + }) + } + + // -------------------------------------------------------------------- + // (C) Local Items: Upload new deploy + // -------------------------------------------------------------------- + else { + puter.fs.upload( + items, + `/${authUsername}/AppData/${dev_center_uid}/${currently_editing_app.uid}`, + { + dedupeName: false, + overwrite: false, + parsedDataTransferItems: true, + createMissingAncestors: true, + progress: function (operation_id, op_progress) { + $('.deploy-percent').text(`(${op_progress}%)`); + }, + }).then(async (uploaded) => { + // new hostname + let hostname = `${currently_editing_app.name}-${(Math.random() + 1).toString(36).substring(7)}`; + + // ---------------------------------------- + // Create a router for the app with a fresh hostname + // we change hostname every time to prevent caching issues + // ---------------------------------------- + puter.hosting.create(hostname, appdata_dir.path).then(async (res) => { + // TODO this endpoint needs to be able to update only the specified fields + puter.apps.update(currently_editing_app.name, { + indexURL: protocol + `://${hostname}.` + static_hosting_domain, + title: currently_editing_app.title, + name: currently_editing_app.name, + icon: currently_editing_app.icon, + description: currently_editing_app.description, + maximizeOnStart: currently_editing_app.maximize_on_start, + background: currently_editing_app.background, + filetypeAssociations: currently_editing_app.filetype_associations, + }) + // set the 'Index URL' field for the 'Settings' tab + $('#edit-app-index-url').val(protocol + `://${hostname}.` + static_hosting_domain); + // show success message + $('.deploy-success-msg').show(); + // reset drop area + reset_drop_area() + }) + }) + } +} + +$(document).on('click', '.section-tab-btn', function (e) { + // hide all tabs + $('.section-tab').hide(); + // show section + $('.section-tab[data-tab="' + $(this).attr('data-tab') + '"]').show(); + // remove active class from all tab buttons + $('.section-tab-btn').removeClass('active'); + // add active class to clicked tab button + $(this).addClass('active'); +}) function generateDirTree(paths) { - const root = {}; + const root = {}; - for (let path of paths) { - let parts = path.split("/"); - let currentNode = root; - for (let part of parts) { - if (!part) continue; // skip empty parts, especially leading one - if (!currentNode[part]) { - currentNode[part] = {}; - } - currentNode = currentNode[part]; + for (let path of paths) { + let parts = path.split('/'); + let currentNode = root; + for (let part of parts) { + if (!part) continue; // skip empty parts, especially leading one + if (!currentNode[part]) { + currentNode[part] = {}; + } + currentNode = currentNode[part]; + } } - } - return root; + return root; } function setRootDirTree(tree, items) { - // Get all keys (directories and files) in the root - const rootKeys = Object.keys(tree); + // Get all keys (directories and files) in the root + const rootKeys = Object.keys(tree); - // If there's only one object in the root, check if it's non-empty and return it - if ( - rootKeys.length === 1 && - typeof tree[rootKeys[0]] === "object" && - Object.keys(tree[rootKeys[0]]).length > 0 - ) { - let newItems = []; - for (let item of items) { - if (item.fullPath) - item.finalPath = item.fullPath.replace(rootKeys[0], ""); - else if (item.path) item.path = item.path.replace(rootKeys[0], ""); - else item.filepath = item.filepath.replace(rootKeys[0], ""); + // If there's only one object in the root, check if it's non-empty and return it + if (rootKeys.length === 1 && typeof tree[rootKeys[0]] === 'object' && Object.keys(tree[rootKeys[0]]).length > 0) { + let newItems = []; + for (let item of items) { + if (item.fullPath) + item.finalPath = item.fullPath.replace(rootKeys[0], ''); + else if (item.path) + item.path = item.path.replace(rootKeys[0], ''); + else + item.filepath = item.filepath.replace(rootKeys[0], ''); - newItems.push(item); + newItems.push(item); + } + return newItems; + } else { + return items; } - return newItems; - } else { - return items; - } } function hasRootIndexHtml(tree) { - // Check if index.html exists in the root - if (tree["index.html"]) { - return true; - } + // Check if index.html exists in the root + if (tree['index.html']) { + return true; + } - // Get all keys (directories and files) in the root - const rootKeys = Object.keys(tree); + // Get all keys (directories and files) in the root + const rootKeys = Object.keys(tree); - // If there's only one directory in the root, check if index.html exists in that directory - if ( - rootKeys.length === 1 && - typeof tree[rootKeys[0]] === "object" && - tree[rootKeys[0]]["index.html"] - ) { - return true; - } + // If there's only one directory in the root, check if index.html exists in that directory + if (rootKeys.length === 1 && typeof tree[rootKeys[0]] === 'object' && tree[rootKeys[0]]['index.html']) { + return true; + } - return false; + return false; } -$(document).on("click", ".close-success-msg", function(e) { - $(this).closest("div").fadeOut(); -}); +$(document).on('click', '.close-success-msg', function (e) { + $(this).closest('div').fadeOut(); +}) -$(document).on("click", ".open-app", function(e) { - puter.ui.launchApp($(this).attr("data-app-name")); -}); +$(document).on('click', '.open-app', function (e) { + puter.ui.launchApp($(this).attr('data-app-name')); +}) -$(document).on("click", ".insta-deploy-to-new-app", async function(e) { - $(".insta-deploy-modal").get(0).close(); - let title = await puter.ui.prompt( - "Please enter a title for your app:", - "My Awesome App" - ); +$(document).on('click', '.insta-deploy-to-new-app', async function (e) { + $('.insta-deploy-modal').get(0).close(); + let title = await puter.ui.prompt('Please enter a title for your app:', 'My Awesome App'); - if (title.length > 60) { - puter.ui.alert(`Title cannot be longer than 60.`, [ - { - label: "Ok", - }, - ]); - // todo go back to create an app prompt and prefill the title input with the title the user entered - $(".insta-deploy-modal").get(0).showModal(); - } else if (title) { - if (source_path) { - create_app(title, source_path); - source_path = null; - } else { - create_app(title, null, dropped_items); - dropped_items = null; + if (title.length > 60) { + puter.ui.alert(`Title cannot be longer than 60.`, [ + { + label: 'Ok', + }, + ]); + // todo go back to create an app prompt and prefill the title input with the title the user entered + $('.insta-deploy-modal').get(0).showModal(); } - } else $(".insta-deploy-modal").get(0).showModal(); + else if (title) { + if (source_path) { + create_app(title, source_path); + source_path = null; + } else { + create_app(title, null, dropped_items); + dropped_items = null; + } + } else + $('.insta-deploy-modal').get(0).showModal(); - return; -}); + return; -$(document).on("click", ".insta-deploy-to-existing-app", function(e) { - $(".insta-deploy-modal").get(0).close(); - $(".insta-deploy-existing-app-select").get(0).showModal(); - $(".insta-deploy-existing-app-list").html( - `
${loading_spinner}
` - ); - puter.apps.list().then((apps) => { - setTimeout(() => { - $(".insta-deploy-existing-app-list").html(""); - if (apps.length === 0) - $(".insta-deploy-existing-app-list").html(` +}) + +$(document).on('click', '.insta-deploy-to-existing-app', function (e) { + $('.insta-deploy-modal').get(0).close(); + $('.insta-deploy-existing-app-select').get(0).showModal(); + $('.insta-deploy-existing-app-list').html(`
${loading_spinner}
`); + puter.apps.list().then((apps) => { + setTimeout(() => { + $('.insta-deploy-existing-app-list').html(''); + if (apps.length === 0) + $('.insta-deploy-existing-app-list').html(`
You have no existing apps.
`); - else { - for (let app of apps) { - $(".insta-deploy-existing-app-list").append( - `
- + else { + for (let app of apps) { + $('.insta-deploy-existing-app-list').append( + `
+ ${html_encode(app.title)}
${number_format((app.stats.referral_count ?? 0) + app.stats.user_count)} ${number_format(app.stats.open_count)}
` - ); - } - } - }, 500); - }); - - // todo reset .insta-deploy-existing-app-list on close -}); - -$(document).on("click", ".insta-deploy-app-selector", function(e) { - $(".insta-deploy-app-selector").removeClass("active"); - $(this).addClass("active"); - - // enable deploy button - $(".insta-deploy-existing-app-deploy-btn").removeClass("disabled"); -}); - -$(document).on("click", ".insta-deploy-existing-app-deploy-btn", function(e) { - $(".insta-deploy-existing-app-deploy-btn").addClass("disabled"); - $(".insta-deploy-existing-app-select")?.get(0)?.close(); - // load the 'App Settings' section - edit_app_section($(".insta-deploy-app-selector.active").attr("data-name")); - - $(".drop-area").removeClass("drop-area-hover"); - $(".drop-area").addClass("drop-area-ready-to-deploy"); - let drop_area_content = `

Ready to deploy 🚀

Cancel

`; - $(".drop-area").html(drop_area_content); - - // deploy - deploy({ uid: $(e.target).attr("data-uid") }, source_path ?? dropped_items); - $(".insta-deploy-existing-app-list").html(""); -}); - -$(document).on("click", ".insta-deploy-cancel", function(e) { - $(this).closest("dialog")?.get(0)?.close(); -}); -$(document).on("click", ".insta-deploy-existing-app-back", function(e) { - $(".insta-deploy-existing-app-select")?.get(0)?.close(); - $(".insta-deploy-modal")?.get(0)?.showModal(); - // disable deploy button - $(".insta-deploy-existing-app-deploy-btn").addClass("disabled"); - - // todo disable the 'an existing app' option if there are no existing apps -}); - -$(document).on("click", ".add-app-to-desktop", function(e) { - let app_title = $(this).attr("data-app-title"); - let app_uid = $(this).attr("data-app-uid"); - - puter.fs - .upload(new File([], app_title), `/${authUsername}/Desktop`, { - name: app_title, - dedupeName: true, - overwrite: false, - appUID: app_uid, + ); + } + } + }, 500); }) - .then(async (uploaded) => { - puter.ui.alert( - `${app_title} shortcut has been added to your desktop.`, - [ - { - label: "Ok", - type: "primary", - }, - ], + + // todo reset .insta-deploy-existing-app-list on close +}) + +$(document).on('click', '.insta-deploy-app-selector', function (e) { + $('.insta-deploy-app-selector').removeClass('active'); + $(this).addClass('active'); + + // enable deploy button + $('.insta-deploy-existing-app-deploy-btn').removeClass('disabled'); +}) + +$(document).on('click', '.insta-deploy-existing-app-deploy-btn', function (e) { + $('.insta-deploy-existing-app-deploy-btn').addClass('disabled'); + $('.insta-deploy-existing-app-select')?.get(0)?.close(); + // load the 'App Settings' section + edit_app_section($('.insta-deploy-app-selector.active').attr('data-name')); + + $('.drop-area').removeClass('drop-area-hover'); + $('.drop-area').addClass('drop-area-ready-to-deploy'); + let drop_area_content = `

Ready to deploy 🚀

Cancel

`; + $('.drop-area').html(drop_area_content); + + // deploy + deploy({ uid: $(e.target).attr('data-uid') }, source_path ?? dropped_items); + $('.insta-deploy-existing-app-list').html(''); +}) + +$(document).on('click', '.insta-deploy-cancel', function (e) { + $(this).closest('dialog')?.get(0)?.close(); +}) +$(document).on('click', '.insta-deploy-existing-app-back', function (e) { + $('.insta-deploy-existing-app-select')?.get(0)?.close(); + $('.insta-deploy-modal')?.get(0)?.showModal(); + // disable deploy button + $('.insta-deploy-existing-app-deploy-btn').addClass('disabled'); + + // todo disable the 'an existing app' option if there are no existing apps +}) + + +$(document).on('click', '.add-app-to-desktop', function (e) { + let app_title = $(this).attr('data-app-title'); + let app_uid = $(this).attr('data-app-uid'); + + puter.fs.upload( + new File([], app_title), + `/${authUsername}/Desktop`, { - type: "success", - } - ); - }); -}); + name: app_title, + dedupeName: true, + overwrite: false, + appUID: app_uid, + }).then(async (uploaded) => { + puter.ui.alert(`${app_title} shortcut has been added to your desktop.`, [ + { + label: 'Ok', + type: 'primary', + }, + ], { + type: 'success', + }); + }) + +}) function reset_drop_area() { - dropped_items = null; - $(".drop-area").html(drop_area_placeholder); - $(".drop-area").removeClass("drop-area-ready-to-deploy"); - $(".deploy-btn").addClass("disabled"); + dropped_items = null; + $('.drop-area').html(drop_area_placeholder); + $('.drop-area').removeClass('drop-area-ready-to-deploy'); + $('.deploy-btn').addClass('disabled'); } -$("body").on("dragover", function(event) { - // skip if the user is dragging something over the drop area - if ($(event.target).hasClass("drop-area")) return; +$('body').on('dragover', function (event) { + // skip if the user is dragging something over the drop area + if ($(event.target).hasClass('drop-area')) + return; - event.preventDefault(); // Prevent the default behavior - event.stopPropagation(); // Stop the event from propagating + event.preventDefault(); // Prevent the default behavior + event.stopPropagation(); // Stop the event from propagating }); // Developers can drop items anywhere on the page to deploy them -$("body").on("drop", async function(event) { - // skip if the user is dragging something over the drop area - if ($(event.target).hasClass("drop-area")) return; +$('body').on('drop', async function (event) { + // skip if the user is dragging something over the drop area + if ($(event.target).hasClass('drop-area')) + return; - // prevent default behavior - event.preventDefault(); - event.stopPropagation(); + // prevent default behavior + event.preventDefault(); + event.stopPropagation(); - // retrieve puter items from the event - if (event.detail?.items?.length > 0) { - dropped_items = event.detail.items; - source_path = dropped_items[0].path; - // by deploying an existing Puter folder. So we create the app and deploy it. - if (source_path) { - // todo if there are no apps, go straight to creating a new app - $(".insta-deploy-modal").get(0).showModal(); - // set item name - $(".insta-deploy-item-name").html(html_encode(dropped_items[0].name)); + // retrieve puter items from the event + if (event.detail?.items?.length > 0) { + dropped_items = event.detail.items; + source_path = dropped_items[0].path; + // by deploying an existing Puter folder. So we create the app and deploy it. + if (source_path) { + // todo if there are no apps, go straight to creating a new app + $('.insta-deploy-modal').get(0).showModal(); + // set item name + $('.insta-deploy-item-name').html(html_encode(dropped_items[0].name)); + } } - } - //----------------------------------------------------------------------------- - // Local items dropped - //----------------------------------------------------------------------------- - const e = event.originalEvent; - if ( - !e.dataTransfer || - !e.dataTransfer.items || - e.dataTransfer.items.length === 0 - ) - return; + //----------------------------------------------------------------------------- + // Local items dropped + //----------------------------------------------------------------------------- + const e = event.originalEvent; + if (!e.dataTransfer || !e.dataTransfer.items || e.dataTransfer.items.length === 0) + return; - // Get dropped items - dropped_items = await puter.ui.getEntriesFromDataTransferItems( - e.dataTransfer.items - ); + // Get dropped items + dropped_items = await puter.ui.getEntriesFromDataTransferItems(e.dataTransfer.items); - // Generate a flat array of full paths from the dropped items - let paths = []; - for (let item of dropped_items) { - paths.push("/" + (item.fullPath ?? item.filepath)); - } + // Generate a flat array of full paths from the dropped items + let paths = []; + for (let item of dropped_items) { + paths.push('/' + (item.fullPath ?? item.filepath)); + } - // Generate a directory tree from the paths - let tree = generateDirTree(paths); + // Generate a directory tree from the paths + let tree = generateDirTree(paths); - dropped_items = setRootDirTree(tree, dropped_items); + dropped_items = setRootDirTree(tree, dropped_items); - // Alert if no index.html in root - if (!hasRootIndexHtml(tree)) { - puter.ui.alert(index_missing_error, [ - { - label: "Ok", - }, - ]); - $(".drop-area").removeClass("drop-area-ready-to-deploy"); - $(".deploy-btn").addClass("disabled"); - dropped_items = []; - return; - } + // Alert if no index.html in root + if (!hasRootIndexHtml(tree)) { + puter.ui.alert(index_missing_error, [ + { + label: 'Ok', + }, + ]); + $('.drop-area').removeClass('drop-area-ready-to-deploy'); + $('.deploy-btn').addClass('disabled'); + dropped_items = []; + return; + } - // Get all keys (directories and files) in the root - const rootKeys = Object.keys(tree); + // Get all keys (directories and files) in the root + const rootKeys = Object.keys(tree); - // Generate a list of items in the root in the form of a string (e.g. /index.html, /css/style.css) with maximum of 3 items - let rootItems = ""; + // Generate a list of items in the root in the form of a string (e.g. /index.html, /css/style.css) with maximum of 3 items + let rootItems = ''; - if (rootKeys.length === 1) rootItems = rootKeys[0]; - else if (rootKeys.length === 2) rootItems = rootKeys[0] + ", " + rootKeys[1]; - else if (rootKeys.length === 3) - rootItems = rootKeys[0] + ", " + rootKeys[1] + ", and" + rootKeys[1]; - else if (rootKeys.length > 3) - rootItems = - rootKeys[0] + - ", " + - rootKeys[1] + - ", and " + - (rootKeys.length - 2) + - " more item" + - (rootKeys.length - 2 > 1 ? "s" : ""); + if (rootKeys.length === 1) + rootItems = rootKeys[0]; + else if (rootKeys.length === 2) + rootItems = rootKeys[0] + ', ' + rootKeys[1]; + else if (rootKeys.length === 3) + rootItems = rootKeys[0] + ', ' + rootKeys[1] + ', and' + rootKeys[1]; + else if (rootKeys.length > 3) + rootItems = rootKeys[0] + ', ' + rootKeys[1] + ', and ' + (rootKeys.length - 2) + ' more item' + (rootKeys.length - 2 > 1 ? 's' : ''); - // Show insta-deploy modal - $(".insta-deploy-modal").get(0)?.showModal(); + // Show insta-deploy modal + $('.insta-deploy-modal').get(0)?.showModal(); - // Set item name - $(".insta-deploy-item-name").html(html_encode(rootItems)); + // Set item name + $('.insta-deploy-item-name').html(html_encode(rootItems)); }); -$(".insta-deploy-existing-app-select").on("close", function(e) { - $(".insta-deploy-existing-app-list").html(""); -}); +$('.insta-deploy-existing-app-select').on('close', function (e) { + $('.insta-deploy-existing-app-list').html(''); +}) -$(".refresh-app-list").on("click", function(e) { - $(".loading-modal").get(0)?.showModal(); +$('.refresh-app-list').on('click', function (e) { + $('.loading-modal').get(0)?.showModal(); - puter.apps.list().then((resp) => { - setTimeout(() => { - apps = resp; + puter.apps.list().then((resp) => { + setTimeout(() => { + apps = resp; - $(".app-card").remove(); - apps.forEach((app) => { - $("#app-list-table > tbody").append(generate_app_card(app)); - }); + $('.app-card').remove(); + apps.forEach(app => { + $('#app-list-table > tbody').append(generate_app_card(app)); + }); - count_apps(); + count_apps(); - // preserve search query - if (search_query) { - // show apps that match search_query and hide apps that don't - apps.forEach((app) => { - if (app.title.toLowerCase().includes(search_query.toLowerCase())) { - $(`.app-card[data-name="${app.name}"]`).show(); - } else { - $(`.app-card[data-name="${app.name}"]`).hide(); - } - }); - } + // preserve search query + if (search_query) { + // show apps that match search_query and hide apps that don't + apps.forEach((app) => { + if (app.title.toLowerCase().includes(search_query.toLowerCase())) { + $(`.app-card[data-name="${app.name}"]`).show(); + } else { + $(`.app-card[data-name="${app.name}"]`).hide(); + } + }) + } - // preserve sort - sort_apps(); + // preserve sort + sort_apps(); - $(".loading-modal").get(0).close(); - }, 1000); - }); -}); + $('.loading-modal').get(0).close(); + }, 1000); + }) +}) -$(document).on("click", ".search", function(e) { - e.stopPropagation(); - e.preventDefault(); - // don't let click bubble up to window - e.stopImmediatePropagation(); -}); +$(document).on('click', '.search', function (e) { + e.stopPropagation(); + e.preventDefault(); + // don't let click bubble up to window + e.stopImmediatePropagation(); +}) -$(document).on( - "input change keyup keypress keydown paste cut", - ".search", - function(e) { +$(document).on('input change keyup keypress keydown paste cut', '.search', function (e) { // search apps for query search_query = $(this).val().toLowerCase(); - if (search_query === "") { - // hide 'clear search' button - $(".search-clear").hide(); - // show all apps again - $(`.app-card`).show(); + if (search_query === '') { + // hide 'clear search' button + $('.search-clear').hide(); + // show all apps again + $(`.app-card`).show(); } else { - // show 'clear search' button - $(".search-clear").show(); - // show apps that match search_query and hide apps that don't - apps.forEach((app) => { - if ( - app.title.toLowerCase().includes(search_query.toLowerCase()) || - app.name.toLowerCase().includes(search_query.toLowerCase()) || - app.description.toLowerCase().includes(search_query.toLowerCase()) || - app.uid.toLowerCase().includes(search_query.toLowerCase()) - ) { - $(`.app-card[data-name="${app.name}"]`).show(); - } else { - $(`.app-card[data-name="${app.name}"]`).hide(); - } - }); - } - } -); - -$(document).on("click", ".search-clear", function(e) { - $(".search").val(""); - $(".search").trigger("change"); - $(".search").focus(); - search_query = ""; -}); - -$(document).on("change", ".app-checkbox", function(e) { - // determine if select-all checkbox should be checked, indeterminate, or unchecked - if ($(".app-checkbox:checked").length === $(".app-checkbox").length) { - $(".select-all-apps").prop("indeterminate", false); - $(".select-all-apps").prop("checked", true); - } else if ($(".app-checkbox:checked").length > 0) { - $(".select-all-apps").prop("indeterminate", true); - $(".select-all-apps").prop("checked", false); - } else { - $(".select-all-apps").prop("indeterminate", false); - $(".select-all-apps").prop("checked", false); - } - - // activate row - if ($(this).is(":checked")) $(this).closest("tr").addClass("active"); - else $(this).closest("tr").removeClass("active"); - - // enable delete button if at least one checkbox is checked - if ($(".app-checkbox:checked").length > 0) - $(".delete-apps-btn").removeClass("disabled"); - else $(".delete-apps-btn").addClass("disabled"); -}); - -$(document).on("click", ".delete-apps-btn", async function(e) { - // show confirmation alert - let resp = await puter.ui.alert( - `Are you sure you want to delete the selected apps?`, - [ - { - label: "Delete", - type: "danger", - value: "delete", - }, - { - label: "Cancel", - }, - ], - { - type: "warning", - } - ); - - if (resp === "delete") { - // disable delete button - // $('.delete-apps-btn').addClass('disabled'); - - // show 'deleting' modal - $(".deleting-app-modal")?.get(0)?.showModal(); - - let start_ts = Date.now(); - const apps = $(".app-checkbox:checked").toArray(); - - // delete all checked apps - for (let app of apps) { - // get app uid - const app_uid = $(app).attr("data-app-uid"); - const app_name = $(app).attr("data-app-name"); - - // get app - const app_data = await puter.apps.get(app_name); - - if (app_data.metadata?.locked) { - if (apps.length === 1) { - puter.ui.alert( - `${app_data.title} is locked and cannot be deleted.`, - [ - { - label: "Ok", - }, - ], + // show 'clear search' button + $('.search-clear').show(); + // show apps that match search_query and hide apps that don't + apps.forEach((app) => { + if ( + app.title.toLowerCase().includes(search_query.toLowerCase()) + || app.name.toLowerCase().includes(search_query.toLowerCase()) + || app.description.toLowerCase().includes(search_query.toLowerCase()) + || app.uid.toLowerCase().includes(search_query.toLowerCase()) + ) { - type: "warning", + $(`.app-card[data-name="${app.name}"]`).show(); + } else { + $(`.app-card[data-name="${app.name}"]`).hide(); } - ); + }) + } +}) - break; - } +$(document).on('click', '.search-clear', function (e) { + $('.search').val(''); + $('.search').trigger('change'); + $('.search').focus(); + search_query = ''; +}) - let resp = await puter.ui.alert( - `${app_data.title} is locked and cannot be deleted.`, - [ - { - label: "Skip and Continue", - value: "Continue", - type: "primary", - }, - { - label: "Cancel", - }, - ], - { - type: "warning", - } - ); - - if (resp === "Cancel") break; - else if (resp === "Continue") continue; - else continue; - } - - // delete app - await puter.apps.delete(app_name); - - // remove app card - $(`.app-card[data-uid="${app_uid}"]`).fadeOut(200, function name(params) { - $(this).remove(); - if ($(`.app-card`).length === 0) { - $("section:not(.sidebar)").hide(); - $("#no-apps-notice").show(); - } else { - $("section:not(.sidebar)").hide(); - $("#app-list").show(); - } - count_apps(); - }); - - try { - // get app directory - const stat = await puter.fs.stat({ - path: `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, - returnSubdomains: true, - }); - // delete subdomain associated with the app directory - if (stat?.subdomains[0]?.subdomain) { - await puter.hosting.delete(stat.subdomains[0].subdomain); - } - // delete app directory - await puter.fs.delete( - `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, - { recursive: true } - ); - count_apps(); - } catch (err) { - console.log(err); - } +$(document).on('change', '.app-checkbox', function (e) { + // determine if select-all checkbox should be checked, indeterminate, or unchecked + if ($('.app-checkbox:checked').length === $('.app-checkbox').length) { + $('.select-all-apps').prop('indeterminate', false); + $('.select-all-apps').prop('checked', true); + } else if ($('.app-checkbox:checked').length > 0) { + $('.select-all-apps').prop('indeterminate', true); + $('.select-all-apps').prop('checked', false); + } + else { + $('.select-all-apps').prop('indeterminate', false); + $('.select-all-apps').prop('checked', false); } - // close 'deleting' modal - setTimeout( - () => { - $(".deleting-app-modal")?.get(0)?.close(); - if ($(".app-checkbox:checked").length === 0) { - // disable delete button - $(".delete-apps-btn").addClass("disabled"); - // reset the 'select all' checkbox - $(".select-all-apps").prop("indeterminate", false); - $(".select-all-apps").prop("checked", false); - } - }, - start_ts - Date.now() > 500 ? 0 : 500 - ); - } -}); + // activate row + if ($(this).is(':checked')) + $(this).closest('tr').addClass('active'); + else + $(this).closest('tr').removeClass('active'); -$(document).on("change", ".select-all-apps", function(e) { - if ($(this).is(":checked")) { - $(".app-checkbox").prop("checked", true); - $(".app-card").addClass("active"); - $(".delete-apps-btn").removeClass("disabled"); - } else { - $(".app-checkbox").prop("checked", false); - $(".app-card").removeClass("active"); - $(".delete-apps-btn").addClass("disabled"); - } -}); + // enable delete button if at least one checkbox is checked + if ($('.app-checkbox:checked').length > 0) + $('.delete-apps-btn').removeClass('disabled'); + else + $('.delete-apps-btn').addClass('disabled'); + +}) + +$(document).on('click', '.delete-apps-btn', async function (e) { + // show confirmation alert + let resp = await puter.ui.alert(`Are you sure you want to delete the selected apps?`, [ + { + label: 'Delete', + type: 'danger', + value: 'delete', + }, + { + label: 'Cancel', + }, + ], { + type: 'warning', + }); + + if (resp === 'delete') { + // disable delete button + // $('.delete-apps-btn').addClass('disabled'); + + // show 'deleting' modal + $('.deleting-app-modal')?.get(0)?.showModal(); + + let start_ts = Date.now(); + const apps = $('.app-checkbox:checked').toArray(); + + // delete all checked apps + for (let app of apps) { + // get app uid + const app_uid = $(app).attr('data-app-uid'); + const app_name = $(app).attr('data-app-name'); + + // get app + const app_data = await puter.apps.get(app_name); + + if(app_data.metadata?.locked){ + if(apps.length === 1){ + puter.ui.alert(`${app_data.title} is locked and cannot be deleted.`, [ + { + label: 'Ok', + }, + ], { + type: 'warning', + }); + + break; + } + + let resp = await puter.ui.alert(`${app_data.title} is locked and cannot be deleted.`, [ + { + label: 'Skip and Continue', + value: 'Continue', + type: 'primary' + }, + { + label: 'Cancel', + }, + ], { + type: 'warning', + }); + + if(resp === 'Cancel') + break; + else if(resp === 'Continue') + continue; + else + continue; + } + + // delete app + await puter.apps.delete(app_name) + + // remove app card + $(`.app-card[data-uid="${app_uid}"]`).fadeOut(200, function name(params) { + $(this).remove(); + if ($(`.app-card`).length === 0) { + $('section:not(.sidebar)').hide(); + $('#no-apps-notice').show(); + } else { + $('section:not(.sidebar)').hide(); + $('#app-list').show(); + } + count_apps(); + }); + + try{ + // get app directory + const stat = await puter.fs.stat({ + path: `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, + returnSubdomains: true + }); + // delete subdomain associated with the app directory + if(stat?.subdomains[0]?.subdomain){ + await puter.hosting.delete(stat.subdomains[0].subdomain) + } + // delete app directory + await puter.fs.delete( + `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, + { recursive: true } + ) + count_apps(); + } catch(err) { + console.log(err); + } + } + + // close 'deleting' modal + setTimeout(() => { + $('.deleting-app-modal')?.get(0)?.close(); + if($('.app-checkbox:checked').length === 0){ + // disable delete button + $('.delete-apps-btn').addClass('disabled'); + // reset the 'select all' checkbox + $('.select-all-apps').prop('indeterminate', false); + $('.select-all-apps').prop('checked', false); + } + }, (start_ts - Date.now()) > 500 ? 0 : 500); + } +}) + +$(document).on('change', '.select-all-apps', function (e) { + if ($(this).is(':checked')) { + $('.app-checkbox').prop('checked', true); + $('.app-card').addClass('active'); + $('.delete-apps-btn').removeClass('disabled'); + } else { + $('.app-checkbox').prop('checked', false); + $('.app-card').removeClass('active'); + $('.delete-apps-btn').addClass('disabled'); + } +}) /** * Get the MIME type for a given file extension. @@ -2676,131 +2402,105 @@ $(document).on("change", ".select-all-apps", function(e) { * @returns {string} The corresponding MIME type, or 'application/octet-stream' if not found. */ function getMimeType(extension) { - const mimeTypes = { - jpg: "image/jpeg", - jpeg: "image/jpeg", - png: "image/png", - gif: "image/gif", - bmp: "image/bmp", - webp: "image/webp", - svg: "image/svg+xml", - tiff: "image/tiff", - ico: "image/x-icon", - }; + const mimeTypes = { + jpg: 'image/jpeg', + jpeg: 'image/jpeg', + png: 'image/png', + gif: 'image/gif', + bmp: 'image/bmp', + webp: 'image/webp', + svg: 'image/svg+xml', + tiff: 'image/tiff', + ico: 'image/x-icon' + }; - // Remove leading dot if present and convert to lowercase - const cleanExtension = extension.replace(/^\./, "").toLowerCase(); + // Remove leading dot if present and convert to lowercase + const cleanExtension = extension.replace(/^\./, '').toLowerCase(); - // Return the MIME type if found, otherwise return 'application/octet-stream' - return mimeTypes[cleanExtension] || "application/octet-stream"; + // Return the MIME type if found, otherwise return 'application/octet-stream' + return mimeTypes[cleanExtension] || 'application/octet-stream'; } // if edit-app-maximize-on-start is checked, disable window size and position fields -$(document).on("change", "#edit-app-maximize-on-start", function(e) { - if ($(this).is(":checked")) { - $("#edit-app-window-width, #edit-app-window-height").prop("disabled", true); - $("#edit-app-window-top, #edit-app-window-left").prop("disabled", true); - } else { - $("#edit-app-window-width, #edit-app-window-height").prop( - "disabled", - false - ); - $("#edit-app-window-top, #edit-app-window-left").prop("disabled", false); - } -}); +$(document).on('change', '#edit-app-maximize-on-start', function (e) { + if ($(this).is(':checked')) { + $('#edit-app-window-width, #edit-app-window-height').prop('disabled', true); + $('#edit-app-window-top, #edit-app-window-left').prop('disabled', true); + } else { + $('#edit-app-window-width, #edit-app-window-height').prop('disabled', false); + $('#edit-app-window-top, #edit-app-window-left').prop('disabled', false); + } +}) -$(document).on("change", "#edit-app-background", function(e) { - if ($("#edit-app-background").is(":checked")) { - disable_window_settings(); - } else { - enable_window_settings(); - } -}); +$(document).on('change', '#edit-app-background', function (e) { + if($('#edit-app-background').is(":checked")){ + disable_window_settings() + }else{ + enable_window_settings() + } +}) -function disable_window_settings() { - $("#edit-app-maximize-on-start").prop("disabled", true); - $("#edit-app-fullpage-on-landing").prop("disabled", true); - $("#edit-app-window-width, #edit-app-window-height").prop("disabled", true); - $("#edit-app-window-top, #edit-app-window-left").prop("disabled", true); - $("#edit-app-window-resizable").prop("disabled", true); - $("#edit-app-hide-titlebar").prop("disabled", true); +function disable_window_settings(){ + $('#edit-app-maximize-on-start').prop('disabled', true); + $('#edit-app-fullpage-on-landing').prop('disabled', true); + $('#edit-app-window-width, #edit-app-window-height').prop('disabled', true); + $('#edit-app-window-top, #edit-app-window-left').prop('disabled', true); + $('#edit-app-window-resizable').prop('disabled', true); + $('#edit-app-hide-titlebar').prop('disabled', true); } -function enable_window_settings() { - $("#edit-app-maximize-on-start").prop("disabled", false); - $("#edit-app-fullpage-on-landing").prop("disabled", false); - $("#edit-app-window-width, #edit-app-window-height").prop("disabled", false); - $("#edit-app-window-top, #edit-app-window-left").prop("disabled", false); - $("#edit-app-window-resizable").prop("disabled", false); - $("#edit-app-hide-titlebar").prop("disabled", false); +function enable_window_settings(){ + $('#edit-app-maximize-on-start').prop('disabled', false); + $('#edit-app-fullpage-on-landing').prop('disabled', false); + $('#edit-app-window-width, #edit-app-window-height').prop('disabled', false); + $('#edit-app-window-top, #edit-app-window-left').prop('disabled', false); + $('#edit-app-window-resizable').prop('disabled', false); + $('#edit-app-hide-titlebar').prop('disabled', false); } -$(document).on("click", ".reset-deploy", function(e) { - reset_drop_area(); -}); +$(document).on('click', '.reset-deploy', function (e) { + reset_drop_area(); +}) -$(document).on("click", ".sidebar-toggle", function(e) { - $(".sidebar").toggleClass("open"); - $("body").toggleClass("sidebar-open"); -}); +$(document).on('click', '.sidebar-toggle', function (e) { + $('.sidebar').toggleClass('open'); + $('body').toggleClass('sidebar-open'); +}) async function initializeAssetsDirectory() { - try { - // Check if assets_url exists - const existingURL = await puter.kv.get("assets_url"); - if (!existingURL) { - // Create assets directory - const assetsDir = await puter.fs.mkdir( - `/${authUsername}/AppData/${dev_center_uid}/assets`, - { overwrite: false } - ); - - // Publish the directory - const hostname = `assets-${Math.random().toString(36).substring(2)}`; - const route = await puter.hosting.create(hostname, assetsDir.path); - - // Store the URL - await puter.kv.set("assets_url", `https://${hostname}.puter.site`); + try { + // Check if assets_url exists + const existingURL = await puter.kv.get('assets_url'); + if (!existingURL) { + // Create assets directory + const assetsDir = await puter.fs.mkdir( + `/${authUsername}/AppData/${dev_center_uid}/assets`, + { overwrite: false } + ); + + // Publish the directory + const hostname = `assets-${Math.random().toString(36).substring(2)}`; + const route = await puter.hosting.create(hostname, assetsDir.path); + + // Store the URL + await puter.kv.set('assets_url', `https://${hostname}.puter.site`); + } + } catch (err) { + console.error('Error initializing assets directory:', err); } - } catch (err) { - console.error("Error initializing assets directory:", err); - } } function generateSocialImageSection(app) { - return ` + return ` - Remove social image + Remove social image `; } -$(document).on("click", "#edit-app-social-image", async function(e) { - const res = await puter.ui.showOpenFilePicker({ - accept: "image/*", - }); - - const socialImage = await puter.fs.read(res.path); - // Convert blob to base64 for preview - const reader = new FileReader(); - reader.readAsDataURL(socialImage); - - reader.onloadend = function() { - let image = reader.result; - // Get file extension - let fileExtension = res.name.split(".").pop(); - // Get MIME type - let mimeType = getMimeType(fileExtension); - // Replace MIME type in the data URL - image = image.replace( - "data:application/octet-stream;base64", - `data:image/${mimeType};base64` - ); - $(document).on('click', '#edit-app-social-image', async function(e) { const res = await puter.ui.showOpenFilePicker({ @@ -2828,40 +2528,39 @@ $(document).on('click', '#edit-app-social-image', async function(e) { toggleSaveButton(); toggleResetButton(); } - }); -$(document).on("click", "#edit-app-social-image-delete", async function(e) { - $("#edit-app-social-image").css("background-image", ""); - $("#edit-app-social-image").removeAttr("data-url"); - $("#edit-app-social-image").removeAttr("data-base64"); - $("#edit-app-social-image-delete").hide(); +$(document).on('click', '#edit-app-social-image-delete', async function(e) { + $('#edit-app-social-image').css('background-image', ''); + $('#edit-app-social-image').removeAttr('data-url'); + $('#edit-app-social-image').removeAttr('data-base64'); + $('#edit-app-social-image-delete').hide(); }); async function handleSocialImageUpload(app_name, socialImageData) { - if (!socialImageData) return null; + if (!socialImageData) return null; - try { - const assets_url = await puter.kv.get("assets_url"); - if (!assets_url) throw new Error("Assets URL not found"); + try { + const assets_url = await puter.kv.get('assets_url'); + if (!assets_url) throw new Error('Assets URL not found'); - // Convert base64 to blob - const base64Response = await fetch(socialImageData); - const blob = await base64Response.blob(); + // Convert base64 to blob + const base64Response = await fetch(socialImageData); + const blob = await base64Response.blob(); - // Get assets directory path - const assetsDir = `/${authUsername}/AppData/${dev_center_uid}/assets`; + // Get assets directory path + const assetsDir = `/${authUsername}/AppData/${dev_center_uid}/assets`; + + // Upload new image + await puter.fs.upload( + new File([blob], `${app_name}.png`, { type: 'image/png' }), + assetsDir, + { overwrite: true } + ); - // Upload new image - await puter.fs.upload( - new File([blob], `${app_name}.png`, { type: "image/png" }), - assetsDir, - { overwrite: true } - ); - - return `${assets_url}/${app_name}.png`; - } catch (err) { - console.error("Error uploading social image:", err); - throw err; - } + return `${assets_url}/${app_name}.png`; + } catch (err) { + console.error('Error uploading social image:', err); + throw err; + } } diff --git a/src/dev-center/js/html-entities.js b/src/dev-center/js/html-entities.js index 150e74d0b..c233cb01e 100644 --- a/src/dev-center/js/html-entities.js +++ b/src/dev-center/js/html-entities.js @@ -1,4611 +1 @@ -(() => { - "use strict"; - var r, - e = { - 563: function (r, e, a) { - var t = - (this && this.__assign) || - function () { - return (t = - Object.assign || - function (r) { - for (var e, a = 1, t = arguments.length; a < t; a++) - for (var o in (e = arguments[a])) - Object.prototype.hasOwnProperty.call(e, o) && (r[o] = e[o]); - return r; - }).apply(this, arguments); - }; - Object.defineProperty(e, "__esModule", { value: !0 }); - var o = a(81), - c = a(687), - l = a(967), - s = t(t({}, o.namedReferences), { all: o.namedReferences.html5 }), - i = { - specialChars: /[<>'"&]/g, - nonAscii: - /(?:[<>'"&\u0080-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, - nonAsciiPrintable: - /(?:[<>'"&\x01-\x08\x11-\x15\x17-\x1F\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, - extensive: - /(?:[\x01-\x0c\x0e-\x1f\x21-\x2c\x2e-\x2f\x3a-\x40\x5b-\x60\x7b-\x7d\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, - }, - n = { mode: "specialChars", level: "all", numeric: "decimal" }; - e.encode = function (r, e) { - var a = - void 0 === (u = (c = void 0 === e ? n : e).mode) - ? "specialChars" - : u, - t = void 0 === (m = c.numeric) ? "decimal" : m, - o = c.level; - if (!r) return ""; - var c, - u, - p = i[a], - d = s[void 0 === o ? "all" : o].characters, - g = "hexadecimal" === t; - if (((p.lastIndex = 0), (c = p.exec(r)))) { - u = ""; - var m = 0; - do { - m !== c.index && (u += r.substring(m, c.index)); - var f = d[(o = c[0])]; - if (!f) { - var h = o.length > 1 ? l.getCodePoint(o, 0) : o.charCodeAt(0); - f = (g ? "&#x" + h.toString(16) : "&#" + h) + ";"; - } - (u += f), (m = c.index + o.length); - } while ((c = p.exec(r))); - m !== r.length && (u += r.substring(m)); - } else u = r; - return u; - }; - var u = { scope: "body", level: "all" }, - p = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);/g, - d = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+)[;=]?/g, - g = { - xml: { strict: p, attribute: d, body: o.bodyRegExps.xml }, - html4: { strict: p, attribute: d, body: o.bodyRegExps.html4 }, - html5: { strict: p, attribute: d, body: o.bodyRegExps.html5 }, - }, - m = t(t({}, g), { all: g.html5 }), - f = String.fromCharCode, - h = f(65533), - b = { level: "all" }; - (e.decodeEntity = function (r, e) { - var a = void 0 === (t = (void 0 === e ? b : e).level) ? "all" : t; - if (!r) return ""; - var t = r, - o = (r[r.length - 1], s[a].entities[r]); - if (o) t = o; - else if ("&" === r[0] && "#" === r[1]) { - var i = r[2], - n = - "x" == i || "X" == i - ? parseInt(r.substr(3), 16) - : parseInt(r.substr(2)); - t = - n >= 1114111 - ? h - : n > 65535 - ? l.fromCodePoint(n) - : f(c.numericUnicodeMap[n] || n); - } - return t; - }), - (e.decode = function (r, e) { - var a = void 0 === e ? u : e, - t = a.level, - o = void 0 === t ? "all" : t, - i = a.scope, - n = void 0 === i ? ("xml" === o ? "strict" : "body") : i; - if (!r) return ""; - var p = m[o][n], - d = s[o].entities, - g = "attribute" === n, - b = "strict" === n; - p.lastIndex = 0; - var v, - q = p.exec(r); - if (q) { - v = ""; - var y = 0; - do { - y !== q.index && (v += r.substring(y, q.index)); - var w = q[0], - x = w, - A = w[w.length - 1]; - if (g && "=" === A) x = w; - else if (b && ";" !== A) x = w; - else { - var E = d[w]; - if (E) x = E; - else if ("&" === w[0] && "#" === w[1]) { - var D = w[2], - k = - "x" == D || "X" == D - ? parseInt(w.substr(3), 16) - : parseInt(w.substr(2)); - x = - k >= 1114111 - ? h - : k > 65535 - ? l.fromCodePoint(k) - : f(c.numericUnicodeMap[k] || k); - } - } - (v += x), (y = q.index + w.length); - } while ((q = p.exec(r))); - y !== r.length && (v += r.substring(y)); - } else v = r; - return v; - }); - }, - 81: (r, e) => { - Object.defineProperty(e, "__esModule", { value: !0 }), - (e.bodyRegExps = { - xml: /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g, - html4: - /&(?:nbsp|iexcl|cent|pound|curren|yen|brvbar|sect|uml|copy|ordf|laquo|not|shy|reg|macr|deg|plusmn|sup2|sup3|acute|micro|para|middot|cedil|sup1|ordm|raquo|frac14|frac12|frac34|iquest|Agrave|Aacute|Acirc|Atilde|Auml|Aring|AElig|Ccedil|Egrave|Eacute|Ecirc|Euml|Igrave|Iacute|Icirc|Iuml|ETH|Ntilde|Ograve|Oacute|Ocirc|Otilde|Ouml|times|Oslash|Ugrave|Uacute|Ucirc|Uuml|Yacute|THORN|szlig|agrave|aacute|acirc|atilde|auml|aring|aelig|ccedil|egrave|eacute|ecirc|euml|igrave|iacute|icirc|iuml|eth|ntilde|ograve|oacute|ocirc|otilde|ouml|divide|oslash|ugrave|uacute|ucirc|uuml|yacute|thorn|yuml|quot|amp|lt|gt|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g, - html5: - /&(?:AElig|AMP|Aacute|Acirc|Agrave|Aring|Atilde|Auml|COPY|Ccedil|ETH|Eacute|Ecirc|Egrave|Euml|GT|Iacute|Icirc|Igrave|Iuml|LT|Ntilde|Oacute|Ocirc|Ograve|Oslash|Otilde|Ouml|QUOT|REG|THORN|Uacute|Ucirc|Ugrave|Uuml|Yacute|aacute|acirc|acute|aelig|agrave|amp|aring|atilde|auml|brvbar|ccedil|cedil|cent|copy|curren|deg|divide|eacute|ecirc|egrave|eth|euml|frac12|frac14|frac34|gt|iacute|icirc|iexcl|igrave|iquest|iuml|laquo|lt|macr|micro|middot|nbsp|not|ntilde|oacute|ocirc|ograve|ordf|ordm|oslash|otilde|ouml|para|plusmn|pound|quot|raquo|reg|sect|shy|sup1|sup2|sup3|szlig|thorn|times|uacute|ucirc|ugrave|uml|uuml|yacute|yen|yuml|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g, - }), - (e.namedReferences = { - xml: { - entities: { - "<": "<", - ">": ">", - """: '"', - "'": "'", - "&": "&", - }, - characters: { - "<": "<", - ">": ">", - '"': """, - "'": "'", - "&": "&", - }, - }, - html4: { - entities: { - "'": "'", - " ": " ", - " ": " ", - "¡": "¡", - "¡": "¡", - "¢": "¢", - "¢": "¢", - "£": "£", - "£": "£", - "¤": "¤", - "¤": "¤", - "¥": "¥", - "¥": "¥", - "¦": "¦", - "¦": "¦", - "§": "§", - "§": "§", - "¨": "¨", - "¨": "¨", - "©": "©", - "©": "©", - "ª": "ª", - "ª": "ª", - "«": "«", - "«": "«", - "¬": "¬", - "¬": "¬", - "­": "­", - "­": "­", - "®": "®", - "®": "®", - "¯": "¯", - "¯": "¯", - "°": "°", - "°": "°", - "±": "±", - "±": "±", - "²": "²", - "²": "²", - "³": "³", - "³": "³", - "´": "´", - "´": "´", - "µ": "µ", - "µ": "µ", - "¶": "¶", - "¶": "¶", - "·": "·", - "·": "·", - "¸": "¸", - "¸": "¸", - "¹": "¹", - "¹": "¹", - "º": "º", - "º": "º", - "»": "»", - "»": "»", - "¼": "¼", - "¼": "¼", - "½": "½", - "½": "½", - "¾": "¾", - "¾": "¾", - "¿": "¿", - "¿": "¿", - "À": "À", - "À": "À", - "Á": "Á", - "Á": "Á", - "Â": "Â", - "Â": "Â", - "Ã": "Ã", - "Ã": "Ã", - "Ä": "Ä", - "Ä": "Ä", - "Å": "Å", - "Å": "Å", - "Æ": "Æ", - "Æ": "Æ", - "Ç": "Ç", - "Ç": "Ç", - "È": "È", - "È": "È", - "É": "É", - "É": "É", - "Ê": "Ê", - "Ê": "Ê", - "Ë": "Ë", - "Ë": "Ë", - "Ì": "Ì", - "Ì": "Ì", - "Í": "Í", - "Í": "Í", - "Î": "Î", - "Î": "Î", - "Ï": "Ï", - "Ï": "Ï", - "Ð": "Ð", - "Ð": "Ð", - "Ñ": "Ñ", - "Ñ": "Ñ", - "Ò": "Ò", - "Ò": "Ò", - "Ó": "Ó", - "Ó": "Ó", - "Ô": "Ô", - "Ô": "Ô", - "Õ": "Õ", - "Õ": "Õ", - "Ö": "Ö", - "Ö": "Ö", - "×": "×", - "×": "×", - "Ø": "Ø", - "Ø": "Ø", - "Ù": "Ù", - "Ù": "Ù", - "Ú": "Ú", - "Ú": "Ú", - "Û": "Û", - "Û": "Û", - "Ü": "Ü", - "Ü": "Ü", - "Ý": "Ý", - "Ý": "Ý", - "Þ": "Þ", - "Þ": "Þ", - "ß": "ß", - "ß": "ß", - "à": "à", - "à": "à", - "á": "á", - "á": "á", - "â": "â", - "â": "â", - "ã": "ã", - "ã": "ã", - "ä": "ä", - "ä": "ä", - "å": "å", - "å": "å", - "æ": "æ", - "æ": "æ", - "ç": "ç", - "ç": "ç", - "è": "è", - "è": "è", - "é": "é", - "é": "é", - "ê": "ê", - "ê": "ê", - "ë": "ë", - "ë": "ë", - "ì": "ì", - "ì": "ì", - "í": "í", - "í": "í", - "î": "î", - "î": "î", - "ï": "ï", - "ï": "ï", - "ð": "ð", - "ð": "ð", - "ñ": "ñ", - "ñ": "ñ", - "ò": "ò", - "ò": "ò", - "ó": "ó", - "ó": "ó", - "ô": "ô", - "ô": "ô", - "õ": "õ", - "õ": "õ", - "ö": "ö", - "ö": "ö", - "÷": "÷", - "÷": "÷", - "ø": "ø", - "ø": "ø", - "ù": "ù", - "ù": "ù", - "ú": "ú", - "ú": "ú", - "û": "û", - "û": "û", - "ü": "ü", - "ü": "ü", - "ý": "ý", - "ý": "ý", - "þ": "þ", - "þ": "þ", - "ÿ": "ÿ", - "ÿ": "ÿ", - """: '"', - """: '"', - "&": "&", - "&": "&", - "<": "<", - "<": "<", - ">": ">", - ">": ">", - "Œ": "Œ", - "œ": "œ", - "Š": "Š", - "š": "š", - "Ÿ": "Ÿ", - "ˆ": "ˆ", - "˜": "˜", - " ": " ", - " ": " ", - " ": " ", - "‌": "‌", - "‍": "‍", - "‎": "‎", - "‏": "‏", - "–": "–", - "—": "—", - "‘": "‘", - "’": "’", - "‚": "‚", - "“": "“", - "”": "”", - "„": "„", - "†": "†", - "‡": "‡", - "‰": "‰", - "‹": "‹", - "›": "›", - "€": "€", - "ƒ": "ƒ", - "Α": "Α", - "Β": "Β", - "Γ": "Γ", - "Δ": "Δ", - "Ε": "Ε", - "Ζ": "Ζ", - "Η": "Η", - "Θ": "Θ", - "Ι": "Ι", - "Κ": "Κ", - "Λ": "Λ", - "Μ": "Μ", - "Ν": "Ν", - "Ξ": "Ξ", - "Ο": "Ο", - "Π": "Π", - "Ρ": "Ρ", - "Σ": "Σ", - "Τ": "Τ", - "Υ": "Υ", - "Φ": "Φ", - "Χ": "Χ", - "Ψ": "Ψ", - "Ω": "Ω", - "α": "α", - "β": "β", - "γ": "γ", - "δ": "δ", - "ε": "ε", - "ζ": "ζ", - "η": "η", - "θ": "θ", - "ι": "ι", - "κ": "κ", - "λ": "λ", - "μ": "μ", - "ν": "ν", - "ξ": "ξ", - "ο": "ο", - "π": "π", - "ρ": "ρ", - "ς": "ς", - "σ": "σ", - "τ": "τ", - "υ": "υ", - "φ": "φ", - "χ": "χ", - "ψ": "ψ", - "ω": "ω", - "ϑ": "ϑ", - "ϒ": "ϒ", - "ϖ": "ϖ", - "•": "•", - "…": "…", - "′": "′", - "″": "″", - "‾": "‾", - "⁄": "⁄", - "℘": "℘", - "ℑ": "ℑ", - "ℜ": "ℜ", - "™": "™", - "ℵ": "ℵ", - "←": "←", - "↑": "↑", - "→": "→", - "↓": "↓", - "↔": "↔", - "↵": "↵", - "⇐": "⇐", - "⇑": "⇑", - "⇒": "⇒", - "⇓": "⇓", - "⇔": "⇔", - "∀": "∀", - "∂": "∂", - "∃": "∃", - "∅": "∅", - "∇": "∇", - "∈": "∈", - "∉": "∉", - "∋": "∋", - "∏": "∏", - "∑": "∑", - "−": "−", - "∗": "∗", - "√": "√", - "∝": "∝", - "∞": "∞", - "∠": "∠", - "∧": "∧", - "∨": "∨", - "∩": "∩", - "∪": "∪", - "∫": "∫", - "∴": "∴", - "∼": "∼", - "≅": "≅", - "≈": "≈", - "≠": "≠", - "≡": "≡", - "≤": "≤", - "≥": "≥", - "⊂": "⊂", - "⊃": "⊃", - "⊄": "⊄", - "⊆": "⊆", - "⊇": "⊇", - "⊕": "⊕", - "⊗": "⊗", - "⊥": "⊥", - "⋅": "⋅", - "⌈": "⌈", - "⌉": "⌉", - "⌊": "⌊", - "⌋": "⌋", - "⟨": "〈", - "⟩": "〉", - "◊": "◊", - "♠": "♠", - "♣": "♣", - "♥": "♥", - "♦": "♦", - }, - characters: { - "'": "'", - " ": " ", - "¡": "¡", - "¢": "¢", - "£": "£", - "¤": "¤", - "¥": "¥", - "¦": "¦", - "§": "§", - "¨": "¨", - "©": "©", - ª: "ª", - "«": "«", - "¬": "¬", - "­": "­", - "®": "®", - "¯": "¯", - "°": "°", - "±": "±", - "²": "²", - "³": "³", - "´": "´", - µ: "µ", - "¶": "¶", - "·": "·", - "¸": "¸", - "¹": "¹", - º: "º", - "»": "»", - "¼": "¼", - "½": "½", - "¾": "¾", - "¿": "¿", - À: "À", - Á: "Á", - Â: "Â", - Ã: "Ã", - Ä: "Ä", - Å: "Å", - Æ: "Æ", - Ç: "Ç", - È: "È", - É: "É", - Ê: "Ê", - Ë: "Ë", - Ì: "Ì", - Í: "Í", - Î: "Î", - Ï: "Ï", - Ð: "Ð", - Ñ: "Ñ", - Ò: "Ò", - Ó: "Ó", - Ô: "Ô", - Õ: "Õ", - Ö: "Ö", - "×": "×", - Ø: "Ø", - Ù: "Ù", - Ú: "Ú", - Û: "Û", - Ü: "Ü", - Ý: "Ý", - Þ: "Þ", - ß: "ß", - à: "à", - á: "á", - â: "â", - ã: "ã", - ä: "ä", - å: "å", - æ: "æ", - ç: "ç", - è: "è", - é: "é", - ê: "ê", - ë: "ë", - ì: "ì", - í: "í", - î: "î", - ï: "ï", - ð: "ð", - ñ: "ñ", - ò: "ò", - ó: "ó", - ô: "ô", - õ: "õ", - ö: "ö", - "÷": "÷", - ø: "ø", - ù: "ù", - ú: "ú", - û: "û", - ü: "ü", - ý: "ý", - þ: "þ", - ÿ: "ÿ", - '"': """, - "&": "&", - "<": "<", - ">": ">", - Œ: "Œ", - œ: "œ", - Š: "Š", - š: "š", - Ÿ: "Ÿ", - ˆ: "ˆ", - "˜": "˜", - " ": " ", - " ": " ", - " ": " ", - "‌": "‌", - "‍": "‍", - "‎": "‎", - "‏": "‏", - "–": "–", - "—": "—", - "‘": "‘", - "’": "’", - "‚": "‚", - "“": "“", - "”": "”", - "„": "„", - "†": "†", - "‡": "‡", - "‰": "‰", - "‹": "‹", - "›": "›", - "€": "€", - ƒ: "ƒ", - Α: "Α", - Β: "Β", - Γ: "Γ", - Δ: "Δ", - Ε: "Ε", - Ζ: "Ζ", - Η: "Η", - Θ: "Θ", - Ι: "Ι", - Κ: "Κ", - Λ: "Λ", - Μ: "Μ", - Ν: "Ν", - Ξ: "Ξ", - Ο: "Ο", - Π: "Π", - Ρ: "Ρ", - Σ: "Σ", - Τ: "Τ", - Υ: "Υ", - Φ: "Φ", - Χ: "Χ", - Ψ: "Ψ", - Ω: "Ω", - α: "α", - β: "β", - γ: "γ", - δ: "δ", - ε: "ε", - ζ: "ζ", - η: "η", - θ: "θ", - ι: "ι", - κ: "κ", - λ: "λ", - μ: "μ", - ν: "ν", - ξ: "ξ", - ο: "ο", - π: "π", - ρ: "ρ", - ς: "ς", - σ: "σ", - τ: "τ", - υ: "υ", - φ: "φ", - χ: "χ", - ψ: "ψ", - ω: "ω", - ϑ: "ϑ", - ϒ: "ϒ", - ϖ: "ϖ", - "•": "•", - "…": "…", - "′": "′", - "″": "″", - "‾": "‾", - "⁄": "⁄", - ℘: "℘", - ℑ: "ℑ", - ℜ: "ℜ", - "™": "™", - ℵ: "ℵ", - "←": "←", - "↑": "↑", - "→": "→", - "↓": "↓", - "↔": "↔", - "↵": "↵", - "⇐": "⇐", - "⇑": "⇑", - "⇒": "⇒", - "⇓": "⇓", - "⇔": "⇔", - "∀": "∀", - "∂": "∂", - "∃": "∃", - "∅": "∅", - "∇": "∇", - "∈": "∈", - "∉": "∉", - "∋": "∋", - "∏": "∏", - "∑": "∑", - "−": "−", - "∗": "∗", - "√": "√", - "∝": "∝", - "∞": "∞", - "∠": "∠", - "∧": "∧", - "∨": "∨", - "∩": "∩", - "∪": "∪", - "∫": "∫", - "∴": "∴", - "∼": "∼", - "≅": "≅", - "≈": "≈", - "≠": "≠", - "≡": "≡", - "≤": "≤", - "≥": "≥", - "⊂": "⊂", - "⊃": "⊃", - "⊄": "⊄", - "⊆": "⊆", - "⊇": "⊇", - "⊕": "⊕", - "⊗": "⊗", - "⊥": "⊥", - "⋅": "⋅", - "⌈": "⌈", - "⌉": "⌉", - "⌊": "⌊", - "⌋": "⌋", - "〈": "⟨", - "〉": "⟩", - "◊": "◊", - "♠": "♠", - "♣": "♣", - "♥": "♥", - "♦": "♦", - }, - }, - html5: { - entities: { - "Æ": "Æ", - "Æ": "Æ", - "&": "&", - "&": "&", - "Á": "Á", - "Á": "Á", - "Ă": "Ă", - "Â": "Â", - "Â": "Â", - "А": "А", - "𝔄": "𝔄", - "À": "À", - "À": "À", - "Α": "Α", - "Ā": "Ā", - "⩓": "⩓", - "Ą": "Ą", - "𝔸": "𝔸", - "⁡": "⁡", - "Å": "Å", - "Å": "Å", - "𝒜": "𝒜", - "≔": "≔", - "Ã": "Ã", - "Ã": "Ã", - "Ä": "Ä", - "Ä": "Ä", - "∖": "∖", - "⫧": "⫧", - "⌆": "⌆", - "Б": "Б", - "∵": "∵", - "ℬ": "ℬ", - "Β": "Β", - "𝔅": "𝔅", - "𝔹": "𝔹", - "˘": "˘", - "ℬ": "ℬ", - "≎": "≎", - "Ч": "Ч", - "©": "©", - "©": "©", - "Ć": "Ć", - "⋒": "⋒", - "ⅅ": "ⅅ", - "ℭ": "ℭ", - "Č": "Č", - "Ç": "Ç", - "Ç": "Ç", - "Ĉ": "Ĉ", - "∰": "∰", - "Ċ": "Ċ", - "¸": "¸", - "·": "·", - "ℭ": "ℭ", - "Χ": "Χ", - "⊙": "⊙", - "⊖": "⊖", - "⊕": "⊕", - "⊗": "⊗", - "∲": "∲", - "”": "”", - "’": "’", - "∷": "∷", - "⩴": "⩴", - "≡": "≡", - "∯": "∯", - "∮": "∮", - "ℂ": "ℂ", - "∐": "∐", - "∳": "∳", - "⨯": "⨯", - "𝒞": "𝒞", - "⋓": "⋓", - "≍": "≍", - "ⅅ": "ⅅ", - "⤑": "⤑", - "Ђ": "Ђ", - "Ѕ": "Ѕ", - "Џ": "Џ", - "‡": "‡", - "↡": "↡", - "⫤": "⫤", - "Ď": "Ď", - "Д": "Д", - "∇": "∇", - "Δ": "Δ", - "𝔇": "𝔇", - "´": "´", - "˙": "˙", - "˝": "˝", - "`": "`", - "˜": "˜", - "⋄": "⋄", - "ⅆ": "ⅆ", - "𝔻": "𝔻", - "¨": "¨", - "⃜": "⃜", - "≐": "≐", - "∯": "∯", - "¨": "¨", - "⇓": "⇓", - "⇐": "⇐", - "⇔": "⇔", - "⫤": "⫤", - "⟸": "⟸", - "⟺": "⟺", - "⟹": "⟹", - "⇒": "⇒", - "⊨": "⊨", - "⇑": "⇑", - "⇕": "⇕", - "∥": "∥", - "↓": "↓", - "⤓": "⤓", - "⇵": "⇵", - "̑": "̑", - "⥐": "⥐", - "⥞": "⥞", - "↽": "↽", - "⥖": "⥖", - "⥟": "⥟", - "⇁": "⇁", - "⥗": "⥗", - "⊤": "⊤", - "↧": "↧", - "⇓": "⇓", - "𝒟": "𝒟", - "Đ": "Đ", - "Ŋ": "Ŋ", - "Ð": "Ð", - "Ð": "Ð", - "É": "É", - "É": "É", - "Ě": "Ě", - "Ê": "Ê", - "Ê": "Ê", - "Э": "Э", - "Ė": "Ė", - "𝔈": "𝔈", - "È": "È", - "È": "È", - "∈": "∈", - "Ē": "Ē", - "◻": "◻", - "▫": "▫", - "Ę": "Ę", - "𝔼": "𝔼", - "Ε": "Ε", - "⩵": "⩵", - "≂": "≂", - "⇌": "⇌", - "ℰ": "ℰ", - "⩳": "⩳", - "Η": "Η", - "Ë": "Ë", - "Ë": "Ë", - "∃": "∃", - "ⅇ": "ⅇ", - "Ф": "Ф", - "𝔉": "𝔉", - "◼": "◼", - "▪": "▪", - "𝔽": "𝔽", - "∀": "∀", - "ℱ": "ℱ", - "ℱ": "ℱ", - "Ѓ": "Ѓ", - ">": ">", - ">": ">", - "Γ": "Γ", - "Ϝ": "Ϝ", - "Ğ": "Ğ", - "Ģ": "Ģ", - "Ĝ": "Ĝ", - "Г": "Г", - "Ġ": "Ġ", - "𝔊": "𝔊", - "⋙": "⋙", - "𝔾": "𝔾", - "≥": "≥", - "⋛": "⋛", - "≧": "≧", - "⪢": "⪢", - "≷": "≷", - "⩾": "⩾", - "≳": "≳", - "𝒢": "𝒢", - "≫": "≫", - "Ъ": "Ъ", - "ˇ": "ˇ", - "^": "^", - "Ĥ": "Ĥ", - "ℌ": "ℌ", - "ℋ": "ℋ", - "ℍ": "ℍ", - "─": "─", - "ℋ": "ℋ", - "Ħ": "Ħ", - "≎": "≎", - "≏": "≏", - "Е": "Е", - "IJ": "IJ", - "Ё": "Ё", - "Í": "Í", - "Í": "Í", - "Î": "Î", - "Î": "Î", - "И": "И", - "İ": "İ", - "ℑ": "ℑ", - "Ì": "Ì", - "Ì": "Ì", - "ℑ": "ℑ", - "Ī": "Ī", - "ⅈ": "ⅈ", - "⇒": "⇒", - "∬": "∬", - "∫": "∫", - "⋂": "⋂", - "⁣": "⁣", - "⁢": "⁢", - "Į": "Į", - "𝕀": "𝕀", - "Ι": "Ι", - "ℐ": "ℐ", - "Ĩ": "Ĩ", - "І": "І", - "Ï": "Ï", - "Ï": "Ï", - "Ĵ": "Ĵ", - "Й": "Й", - "𝔍": "𝔍", - "𝕁": "𝕁", - "𝒥": "𝒥", - "Ј": "Ј", - "Є": "Є", - "Х": "Х", - "Ќ": "Ќ", - "Κ": "Κ", - "Ķ": "Ķ", - "К": "К", - "𝔎": "𝔎", - "𝕂": "𝕂", - "𝒦": "𝒦", - "Љ": "Љ", - "<": "<", - "<": "<", - "Ĺ": "Ĺ", - "Λ": "Λ", - "⟪": "⟪", - "ℒ": "ℒ", - "↞": "↞", - "Ľ": "Ľ", - "Ļ": "Ļ", - "Л": "Л", - "⟨": "⟨", - "←": "←", - "⇤": "⇤", - "⇆": "⇆", - "⌈": "⌈", - "⟦": "⟦", - "⥡": "⥡", - "⇃": "⇃", - "⥙": "⥙", - "⌊": "⌊", - "↔": "↔", - "⥎": "⥎", - "⊣": "⊣", - "↤": "↤", - "⥚": "⥚", - "⊲": "⊲", - "⧏": "⧏", - "⊴": "⊴", - "⥑": "⥑", - "⥠": "⥠", - "↿": "↿", - "⥘": "⥘", - "↼": "↼", - "⥒": "⥒", - "⇐": "⇐", - "⇔": "⇔", - "⋚": "⋚", - "≦": "≦", - "≶": "≶", - "⪡": "⪡", - "⩽": "⩽", - "≲": "≲", - "𝔏": "𝔏", - "⋘": "⋘", - "⇚": "⇚", - "Ŀ": "Ŀ", - "⟵": "⟵", - "⟷": "⟷", - "⟶": "⟶", - "⟸": "⟸", - "⟺": "⟺", - "⟹": "⟹", - "𝕃": "𝕃", - "↙": "↙", - "↘": "↘", - "ℒ": "ℒ", - "↰": "↰", - "Ł": "Ł", - "≪": "≪", - "⤅": "⤅", - "М": "М", - " ": " ", - "ℳ": "ℳ", - "𝔐": "𝔐", - "∓": "∓", - "𝕄": "𝕄", - "ℳ": "ℳ", - "Μ": "Μ", - "Њ": "Њ", - "Ń": "Ń", - "Ň": "Ň", - "Ņ": "Ņ", - "Н": "Н", - "​": "​", - "​": "​", - "​": "​", - "​": "​", - "≫": "≫", - "≪": "≪", - " ": "\n", - "𝔑": "𝔑", - "⁠": "⁠", - " ": " ", - "ℕ": "ℕ", - "⫬": "⫬", - "≢": "≢", - "≭": "≭", - "∦": "∦", - "∉": "∉", - "≠": "≠", - "≂̸": "≂̸", - "∄": "∄", - "≯": "≯", - "≱": "≱", - "≧̸": "≧̸", - "≫̸": "≫̸", - "≹": "≹", - "⩾̸": "⩾̸", - "≵": "≵", - "≎̸": "≎̸", - "≏̸": "≏̸", - "⋪": "⋪", - "⧏̸": "⧏̸", - "⋬": "⋬", - "≮": "≮", - "≰": "≰", - "≸": "≸", - "≪̸": "≪̸", - "⩽̸": "⩽̸", - "≴": "≴", - "⪢̸": "⪢̸", - "⪡̸": "⪡̸", - "⊀": "⊀", - "⪯̸": "⪯̸", - "⋠": "⋠", - "∌": "∌", - "⋫": "⋫", - "⧐̸": "⧐̸", - "⋭": "⋭", - "⊏̸": "⊏̸", - "⋢": "⋢", - "⊐̸": "⊐̸", - "⋣": "⋣", - "⊂⃒": "⊂⃒", - "⊈": "⊈", - "⊁": "⊁", - "⪰̸": "⪰̸", - "⋡": "⋡", - "≿̸": "≿̸", - "⊃⃒": "⊃⃒", - "⊉": "⊉", - "≁": "≁", - "≄": "≄", - "≇": "≇", - "≉": "≉", - "∤": "∤", - "𝒩": "𝒩", - "Ñ": "Ñ", - "Ñ": "Ñ", - "Ν": "Ν", - "Œ": "Œ", - "Ó": "Ó", - "Ó": "Ó", - "Ô": "Ô", - "Ô": "Ô", - "О": "О", - "Ő": "Ő", - "𝔒": "𝔒", - "Ò": "Ò", - "Ò": "Ò", - "Ō": "Ō", - "Ω": "Ω", - "Ο": "Ο", - "𝕆": "𝕆", - "“": "“", - "‘": "‘", - "⩔": "⩔", - "𝒪": "𝒪", - "Ø": "Ø", - "Ø": "Ø", - "Õ": "Õ", - "Õ": "Õ", - "⨷": "⨷", - "Ö": "Ö", - "Ö": "Ö", - "‾": "‾", - "⏞": "⏞", - "⎴": "⎴", - "⏜": "⏜", - "∂": "∂", - "П": "П", - "𝔓": "𝔓", - "Φ": "Φ", - "Π": "Π", - "±": "±", - "ℌ": "ℌ", - "ℙ": "ℙ", - "⪻": "⪻", - "≺": "≺", - "⪯": "⪯", - "≼": "≼", - "≾": "≾", - "″": "″", - "∏": "∏", - "∷": "∷", - "∝": "∝", - "𝒫": "𝒫", - "Ψ": "Ψ", - """: '"', - """: '"', - "𝔔": "𝔔", - "ℚ": "ℚ", - "𝒬": "𝒬", - "⤐": "⤐", - "®": "®", - "®": "®", - "Ŕ": "Ŕ", - "⟫": "⟫", - "↠": "↠", - "⤖": "⤖", - "Ř": "Ř", - "Ŗ": "Ŗ", - "Р": "Р", - "ℜ": "ℜ", - "∋": "∋", - "⇋": "⇋", - "⥯": "⥯", - "ℜ": "ℜ", - "Ρ": "Ρ", - "⟩": "⟩", - "→": "→", - "⇥": "⇥", - "⇄": "⇄", - "⌉": "⌉", - "⟧": "⟧", - "⥝": "⥝", - "⇂": "⇂", - "⥕": "⥕", - "⌋": "⌋", - "⊢": "⊢", - "↦": "↦", - "⥛": "⥛", - "⊳": "⊳", - "⧐": "⧐", - "⊵": "⊵", - "⥏": "⥏", - "⥜": "⥜", - "↾": "↾", - "⥔": "⥔", - "⇀": "⇀", - "⥓": "⥓", - "⇒": "⇒", - "ℝ": "ℝ", - "⥰": "⥰", - "⇛": "⇛", - "ℛ": "ℛ", - "↱": "↱", - "⧴": "⧴", - "Щ": "Щ", - "Ш": "Ш", - "Ь": "Ь", - "Ś": "Ś", - "⪼": "⪼", - "Š": "Š", - "Ş": "Ş", - "Ŝ": "Ŝ", - "С": "С", - "𝔖": "𝔖", - "↓": "↓", - "←": "←", - "→": "→", - "↑": "↑", - "Σ": "Σ", - "∘": "∘", - "𝕊": "𝕊", - "√": "√", - "□": "□", - "⊓": "⊓", - "⊏": "⊏", - "⊑": "⊑", - "⊐": "⊐", - "⊒": "⊒", - "⊔": "⊔", - "𝒮": "𝒮", - "⋆": "⋆", - "⋐": "⋐", - "⋐": "⋐", - "⊆": "⊆", - "≻": "≻", - "⪰": "⪰", - "≽": "≽", - "≿": "≿", - "∋": "∋", - "∑": "∑", - "⋑": "⋑", - "⊃": "⊃", - "⊇": "⊇", - "⋑": "⋑", - "Þ": "Þ", - "Þ": "Þ", - "™": "™", - "Ћ": "Ћ", - "Ц": "Ц", - " ": "\t", - "Τ": "Τ", - "Ť": "Ť", - "Ţ": "Ţ", - "Т": "Т", - "𝔗": "𝔗", - "∴": "∴", - "Θ": "Θ", - "  ": "  ", - " ": " ", - "∼": "∼", - "≃": "≃", - "≅": "≅", - "≈": "≈", - "𝕋": "𝕋", - "⃛": "⃛", - "𝒯": "𝒯", - "Ŧ": "Ŧ", - "Ú": "Ú", - "Ú": "Ú", - "↟": "↟", - "⥉": "⥉", - "Ў": "Ў", - "Ŭ": "Ŭ", - "Û": "Û", - "Û": "Û", - "У": "У", - "Ű": "Ű", - "𝔘": "𝔘", - "Ù": "Ù", - "Ù": "Ù", - "Ū": "Ū", - "_": "_", - "⏟": "⏟", - "⎵": "⎵", - "⏝": "⏝", - "⋃": "⋃", - "⊎": "⊎", - "Ų": "Ų", - "𝕌": "𝕌", - "↑": "↑", - "⤒": "⤒", - "⇅": "⇅", - "↕": "↕", - "⥮": "⥮", - "⊥": "⊥", - "↥": "↥", - "⇑": "⇑", - "⇕": "⇕", - "↖": "↖", - "↗": "↗", - "ϒ": "ϒ", - "Υ": "Υ", - "Ů": "Ů", - "𝒰": "𝒰", - "Ũ": "Ũ", - "Ü": "Ü", - "Ü": "Ü", - "⊫": "⊫", - "⫫": "⫫", - "В": "В", - "⊩": "⊩", - "⫦": "⫦", - "⋁": "⋁", - "‖": "‖", - "‖": "‖", - "∣": "∣", - "|": "|", - "❘": "❘", - "≀": "≀", - " ": " ", - "𝔙": "𝔙", - "𝕍": "𝕍", - "𝒱": "𝒱", - "⊪": "⊪", - "Ŵ": "Ŵ", - "⋀": "⋀", - "𝔚": "𝔚", - "𝕎": "𝕎", - "𝒲": "𝒲", - "𝔛": "𝔛", - "Ξ": "Ξ", - "𝕏": "𝕏", - "𝒳": "𝒳", - "Я": "Я", - "Ї": "Ї", - "Ю": "Ю", - "Ý": "Ý", - "Ý": "Ý", - "Ŷ": "Ŷ", - "Ы": "Ы", - "𝔜": "𝔜", - "𝕐": "𝕐", - "𝒴": "𝒴", - "Ÿ": "Ÿ", - "Ж": "Ж", - "Ź": "Ź", - "Ž": "Ž", - "З": "З", - "Ż": "Ż", - "​": "​", - "Ζ": "Ζ", - "ℨ": "ℨ", - "ℤ": "ℤ", - "𝒵": "𝒵", - "á": "á", - "á": "á", - "ă": "ă", - "∾": "∾", - "∾̳": "∾̳", - "∿": "∿", - "â": "â", - "â": "â", - "´": "´", - "´": "´", - "а": "а", - "æ": "æ", - "æ": "æ", - "⁡": "⁡", - "𝔞": "𝔞", - "à": "à", - "à": "à", - "ℵ": "ℵ", - "ℵ": "ℵ", - "α": "α", - "ā": "ā", - "⨿": "⨿", - "&": "&", - "&": "&", - "∧": "∧", - "⩕": "⩕", - "⩜": "⩜", - "⩘": "⩘", - "⩚": "⩚", - "∠": "∠", - "⦤": "⦤", - "∠": "∠", - "∡": "∡", - "⦨": "⦨", - "⦩": "⦩", - "⦪": "⦪", - "⦫": "⦫", - "⦬": "⦬", - "⦭": "⦭", - "⦮": "⦮", - "⦯": "⦯", - "∟": "∟", - "⊾": "⊾", - "⦝": "⦝", - "∢": "∢", - "Å": "Å", - "⍼": "⍼", - "ą": "ą", - "𝕒": "𝕒", - "≈": "≈", - "⩰": "⩰", - "⩯": "⩯", - "≊": "≊", - "≋": "≋", - "'": "'", - "≈": "≈", - "≊": "≊", - "å": "å", - "å": "å", - "𝒶": "𝒶", - "*": "*", - "≈": "≈", - "≍": "≍", - "ã": "ã", - "ã": "ã", - "ä": "ä", - "ä": "ä", - "∳": "∳", - "⨑": "⨑", - "⫭": "⫭", - "≌": "≌", - "϶": "϶", - "‵": "‵", - "∽": "∽", - "⋍": "⋍", - "⊽": "⊽", - "⌅": "⌅", - "⌅": "⌅", - "⎵": "⎵", - "⎶": "⎶", - "≌": "≌", - "б": "б", - "„": "„", - "∵": "∵", - "∵": "∵", - "⦰": "⦰", - "϶": "϶", - "ℬ": "ℬ", - "β": "β", - "ℶ": "ℶ", - "≬": "≬", - "𝔟": "𝔟", - "⋂": "⋂", - "◯": "◯", - "⋃": "⋃", - "⨀": "⨀", - "⨁": "⨁", - "⨂": "⨂", - "⨆": "⨆", - "★": "★", - "▽": "▽", - "△": "△", - "⨄": "⨄", - "⋁": "⋁", - "⋀": "⋀", - "⤍": "⤍", - "⧫": "⧫", - "▪": "▪", - "▴": "▴", - "▾": "▾", - "◂": "◂", - "▸": "▸", - "␣": "␣", - "▒": "▒", - "░": "░", - "▓": "▓", - "█": "█", - "=⃥": "=⃥", - "≡⃥": "≡⃥", - "⌐": "⌐", - "𝕓": "𝕓", - "⊥": "⊥", - "⊥": "⊥", - "⋈": "⋈", - "╗": "╗", - "╔": "╔", - "╖": "╖", - "╓": "╓", - "═": "═", - "╦": "╦", - "╩": "╩", - "╤": "╤", - "╧": "╧", - "╝": "╝", - "╚": "╚", - "╜": "╜", - "╙": "╙", - "║": "║", - "╬": "╬", - "╣": "╣", - "╠": "╠", - "╫": "╫", - "╢": "╢", - "╟": "╟", - "⧉": "⧉", - "╕": "╕", - "╒": "╒", - "┐": "┐", - "┌": "┌", - "─": "─", - "╥": "╥", - "╨": "╨", - "┬": "┬", - "┴": "┴", - "⊟": "⊟", - "⊞": "⊞", - "⊠": "⊠", - "╛": "╛", - "╘": "╘", - "┘": "┘", - "└": "└", - "│": "│", - "╪": "╪", - "╡": "╡", - "╞": "╞", - "┼": "┼", - "┤": "┤", - "├": "├", - "‵": "‵", - "˘": "˘", - "¦": "¦", - "¦": "¦", - "𝒷": "𝒷", - "⁏": "⁏", - "∽": "∽", - "⋍": "⋍", - "\": "\\", - "⧅": "⧅", - "⟈": "⟈", - "•": "•", - "•": "•", - "≎": "≎", - "⪮": "⪮", - "≏": "≏", - "≏": "≏", - "ć": "ć", - "∩": "∩", - "⩄": "⩄", - "⩉": "⩉", - "⩋": "⩋", - "⩇": "⩇", - "⩀": "⩀", - "∩︀": "∩︀", - "⁁": "⁁", - "ˇ": "ˇ", - "⩍": "⩍", - "č": "č", - "ç": "ç", - "ç": "ç", - "ĉ": "ĉ", - "⩌": "⩌", - "⩐": "⩐", - "ċ": "ċ", - "¸": "¸", - "¸": "¸", - "⦲": "⦲", - "¢": "¢", - "¢": "¢", - "·": "·", - "𝔠": "𝔠", - "ч": "ч", - "✓": "✓", - "✓": "✓", - "χ": "χ", - "○": "○", - "⧃": "⧃", - "ˆ": "ˆ", - "≗": "≗", - "↺": "↺", - "↻": "↻", - "®": "®", - "Ⓢ": "Ⓢ", - "⊛": "⊛", - "⊚": "⊚", - "⊝": "⊝", - "≗": "≗", - "⨐": "⨐", - "⫯": "⫯", - "⧂": "⧂", - "♣": "♣", - "♣": "♣", - ":": ":", - "≔": "≔", - "≔": "≔", - ",": ",", - "@": "@", - "∁": "∁", - "∘": "∘", - "∁": "∁", - "ℂ": "ℂ", - "≅": "≅", - "⩭": "⩭", - "∮": "∮", - "𝕔": "𝕔", - "∐": "∐", - "©": "©", - "©": "©", - "℗": "℗", - "↵": "↵", - "✗": "✗", - "𝒸": "𝒸", - "⫏": "⫏", - "⫑": "⫑", - "⫐": "⫐", - "⫒": "⫒", - "⋯": "⋯", - "⤸": "⤸", - "⤵": "⤵", - "⋞": "⋞", - "⋟": "⋟", - "↶": "↶", - "⤽": "⤽", - "∪": "∪", - "⩈": "⩈", - "⩆": "⩆", - "⩊": "⩊", - "⊍": "⊍", - "⩅": "⩅", - "∪︀": "∪︀", - "↷": "↷", - "⤼": "⤼", - "⋞": "⋞", - "⋟": "⋟", - "⋎": "⋎", - "⋏": "⋏", - "¤": "¤", - "¤": "¤", - "↶": "↶", - "↷": "↷", - "⋎": "⋎", - "⋏": "⋏", - "∲": "∲", - "∱": "∱", - "⌭": "⌭", - "⇓": "⇓", - "⥥": "⥥", - "†": "†", - "ℸ": "ℸ", - "↓": "↓", - "‐": "‐", - "⊣": "⊣", - "⤏": "⤏", - "˝": "˝", - "ď": "ď", - "д": "д", - "ⅆ": "ⅆ", - "‡": "‡", - "⇊": "⇊", - "⩷": "⩷", - "°": "°", - "°": "°", - "δ": "δ", - "⦱": "⦱", - "⥿": "⥿", - "𝔡": "𝔡", - "⇃": "⇃", - "⇂": "⇂", - "⋄": "⋄", - "⋄": "⋄", - "♦": "♦", - "♦": "♦", - "¨": "¨", - "ϝ": "ϝ", - "⋲": "⋲", - "÷": "÷", - "÷": "÷", - "÷": "÷", - "⋇": "⋇", - "⋇": "⋇", - "ђ": "ђ", - "⌞": "⌞", - "⌍": "⌍", - "$": "$", - "𝕕": "𝕕", - "˙": "˙", - "≐": "≐", - "≑": "≑", - "∸": "∸", - "∔": "∔", - "⊡": "⊡", - "⌆": "⌆", - "↓": "↓", - "⇊": "⇊", - "⇃": "⇃", - "⇂": "⇂", - "⤐": "⤐", - "⌟": "⌟", - "⌌": "⌌", - "𝒹": "𝒹", - "ѕ": "ѕ", - "⧶": "⧶", - "đ": "đ", - "⋱": "⋱", - "▿": "▿", - "▾": "▾", - "⇵": "⇵", - "⥯": "⥯", - "⦦": "⦦", - "џ": "џ", - "⟿": "⟿", - "⩷": "⩷", - "≑": "≑", - "é": "é", - "é": "é", - "⩮": "⩮", - "ě": "ě", - "≖": "≖", - "ê": "ê", - "ê": "ê", - "≕": "≕", - "э": "э", - "ė": "ė", - "ⅇ": "ⅇ", - "≒": "≒", - "𝔢": "𝔢", - "⪚": "⪚", - "è": "è", - "è": "è", - "⪖": "⪖", - "⪘": "⪘", - "⪙": "⪙", - "⏧": "⏧", - "ℓ": "ℓ", - "⪕": "⪕", - "⪗": "⪗", - "ē": "ē", - "∅": "∅", - "∅": "∅", - "∅": "∅", - " ": " ", - " ": " ", - " ": " ", - "ŋ": "ŋ", - " ": " ", - "ę": "ę", - "𝕖": "𝕖", - "⋕": "⋕", - "⧣": "⧣", - "⩱": "⩱", - "ε": "ε", - "ε": "ε", - "ϵ": "ϵ", - "≖": "≖", - "≕": "≕", - "≂": "≂", - "⪖": "⪖", - "⪕": "⪕", - "=": "=", - "≟": "≟", - "≡": "≡", - "⩸": "⩸", - "⧥": "⧥", - "≓": "≓", - "⥱": "⥱", - "ℯ": "ℯ", - "≐": "≐", - "≂": "≂", - "η": "η", - "ð": "ð", - "ð": "ð", - "ë": "ë", - "ë": "ë", - "€": "€", - "!": "!", - "∃": "∃", - "ℰ": "ℰ", - "ⅇ": "ⅇ", - "≒": "≒", - "ф": "ф", - "♀": "♀", - "ffi": "ffi", - "ff": "ff", - "ffl": "ffl", - "𝔣": "𝔣", - "fi": "fi", - "fj": "fj", - "♭": "♭", - "fl": "fl", - "▱": "▱", - "ƒ": "ƒ", - "𝕗": "𝕗", - "∀": "∀", - "⋔": "⋔", - "⫙": "⫙", - "⨍": "⨍", - "½": "½", - "½": "½", - "⅓": "⅓", - "¼": "¼", - "¼": "¼", - "⅕": "⅕", - "⅙": "⅙", - "⅛": "⅛", - "⅔": "⅔", - "⅖": "⅖", - "¾": "¾", - "¾": "¾", - "⅗": "⅗", - "⅜": "⅜", - "⅘": "⅘", - "⅚": "⅚", - "⅝": "⅝", - "⅞": "⅞", - "⁄": "⁄", - "⌢": "⌢", - "𝒻": "𝒻", - "≧": "≧", - "⪌": "⪌", - "ǵ": "ǵ", - "γ": "γ", - "ϝ": "ϝ", - "⪆": "⪆", - "ğ": "ğ", - "ĝ": "ĝ", - "г": "г", - "ġ": "ġ", - "≥": "≥", - "⋛": "⋛", - "≥": "≥", - "≧": "≧", - "⩾": "⩾", - "⩾": "⩾", - "⪩": "⪩", - "⪀": "⪀", - "⪂": "⪂", - "⪄": "⪄", - "⋛︀": "⋛︀", - "⪔": "⪔", - "𝔤": "𝔤", - "≫": "≫", - "⋙": "⋙", - "ℷ": "ℷ", - "ѓ": "ѓ", - "≷": "≷", - "⪒": "⪒", - "⪥": "⪥", - "⪤": "⪤", - "≩": "≩", - "⪊": "⪊", - "⪊": "⪊", - "⪈": "⪈", - "⪈": "⪈", - "≩": "≩", - "⋧": "⋧", - "𝕘": "𝕘", - "`": "`", - "ℊ": "ℊ", - "≳": "≳", - "⪎": "⪎", - "⪐": "⪐", - ">": ">", - ">": ">", - "⪧": "⪧", - "⩺": "⩺", - "⋗": "⋗", - "⦕": "⦕", - "⩼": "⩼", - "⪆": "⪆", - "⥸": "⥸", - "⋗": "⋗", - "⋛": "⋛", - "⪌": "⪌", - "≷": "≷", - "≳": "≳", - "≩︀": "≩︀", - "≩︀": "≩︀", - "⇔": "⇔", - " ": " ", - "½": "½", - "ℋ": "ℋ", - "ъ": "ъ", - "↔": "↔", - "⥈": "⥈", - "↭": "↭", - "ℏ": "ℏ", - "ĥ": "ĥ", - "♥": "♥", - "♥": "♥", - "…": "…", - "⊹": "⊹", - "𝔥": "𝔥", - "⤥": "⤥", - "⤦": "⤦", - "⇿": "⇿", - "∻": "∻", - "↩": "↩", - "↪": "↪", - "𝕙": "𝕙", - "―": "―", - "𝒽": "𝒽", - "ℏ": "ℏ", - "ħ": "ħ", - "⁃": "⁃", - "‐": "‐", - "í": "í", - "í": "í", - "⁣": "⁣", - "î": "î", - "î": "î", - "и": "и", - "е": "е", - "¡": "¡", - "¡": "¡", - "⇔": "⇔", - "𝔦": "𝔦", - "ì": "ì", - "ì": "ì", - "ⅈ": "ⅈ", - "⨌": "⨌", - "∭": "∭", - "⧜": "⧜", - "℩": "℩", - "ij": "ij", - "ī": "ī", - "ℑ": "ℑ", - "ℐ": "ℐ", - "ℑ": "ℑ", - "ı": "ı", - "⊷": "⊷", - "Ƶ": "Ƶ", - "∈": "∈", - "℅": "℅", - "∞": "∞", - "⧝": "⧝", - "ı": "ı", - "∫": "∫", - "⊺": "⊺", - "ℤ": "ℤ", - "⊺": "⊺", - "⨗": "⨗", - "⨼": "⨼", - "ё": "ё", - "į": "į", - "𝕚": "𝕚", - "ι": "ι", - "⨼": "⨼", - "¿": "¿", - "¿": "¿", - "𝒾": "𝒾", - "∈": "∈", - "⋹": "⋹", - "⋵": "⋵", - "⋴": "⋴", - "⋳": "⋳", - "∈": "∈", - "⁢": "⁢", - "ĩ": "ĩ", - "і": "і", - "ï": "ï", - "ï": "ï", - "ĵ": "ĵ", - "й": "й", - "𝔧": "𝔧", - "ȷ": "ȷ", - "𝕛": "𝕛", - "𝒿": "𝒿", - "ј": "ј", - "є": "є", - "κ": "κ", - "ϰ": "ϰ", - "ķ": "ķ", - "к": "к", - "𝔨": "𝔨", - "ĸ": "ĸ", - "х": "х", - "ќ": "ќ", - "𝕜": "𝕜", - "𝓀": "𝓀", - "⇚": "⇚", - "⇐": "⇐", - "⤛": "⤛", - "⤎": "⤎", - "≦": "≦", - "⪋": "⪋", - "⥢": "⥢", - "ĺ": "ĺ", - "⦴": "⦴", - "ℒ": "ℒ", - "λ": "λ", - "⟨": "⟨", - "⦑": "⦑", - "⟨": "⟨", - "⪅": "⪅", - "«": "«", - "«": "«", - "←": "←", - "⇤": "⇤", - "⤟": "⤟", - "⤝": "⤝", - "↩": "↩", - "↫": "↫", - "⤹": "⤹", - "⥳": "⥳", - "↢": "↢", - "⪫": "⪫", - "⤙": "⤙", - "⪭": "⪭", - "⪭︀": "⪭︀", - "⤌": "⤌", - "❲": "❲", - "{": "{", - "[": "[", - "⦋": "⦋", - "⦏": "⦏", - "⦍": "⦍", - "ľ": "ľ", - "ļ": "ļ", - "⌈": "⌈", - "{": "{", - "л": "л", - "⤶": "⤶", - "“": "“", - "„": "„", - "⥧": "⥧", - "⥋": "⥋", - "↲": "↲", - "≤": "≤", - "←": "←", - "↢": "↢", - "↽": "↽", - "↼": "↼", - "⇇": "⇇", - "↔": "↔", - "⇆": "⇆", - "⇋": "⇋", - "↭": "↭", - "⋋": "⋋", - "⋚": "⋚", - "≤": "≤", - "≦": "≦", - "⩽": "⩽", - "⩽": "⩽", - "⪨": "⪨", - "⩿": "⩿", - "⪁": "⪁", - "⪃": "⪃", - "⋚︀": "⋚︀", - "⪓": "⪓", - "⪅": "⪅", - "⋖": "⋖", - "⋚": "⋚", - "⪋": "⪋", - "≶": "≶", - "≲": "≲", - "⥼": "⥼", - "⌊": "⌊", - "𝔩": "𝔩", - "≶": "≶", - "⪑": "⪑", - "↽": "↽", - "↼": "↼", - "⥪": "⥪", - "▄": "▄", - "љ": "љ", - "≪": "≪", - "⇇": "⇇", - "⌞": "⌞", - "⥫": "⥫", - "◺": "◺", - "ŀ": "ŀ", - "⎰": "⎰", - "⎰": "⎰", - "≨": "≨", - "⪉": "⪉", - "⪉": "⪉", - "⪇": "⪇", - "⪇": "⪇", - "≨": "≨", - "⋦": "⋦", - "⟬": "⟬", - "⇽": "⇽", - "⟦": "⟦", - "⟵": "⟵", - "⟷": "⟷", - "⟼": "⟼", - "⟶": "⟶", - "↫": "↫", - "↬": "↬", - "⦅": "⦅", - "𝕝": "𝕝", - "⨭": "⨭", - "⨴": "⨴", - "∗": "∗", - "_": "_", - "◊": "◊", - "◊": "◊", - "⧫": "⧫", - "(": "(", - "⦓": "⦓", - "⇆": "⇆", - "⌟": "⌟", - "⇋": "⇋", - "⥭": "⥭", - "‎": "‎", - "⊿": "⊿", - "‹": "‹", - "𝓁": "𝓁", - "↰": "↰", - "≲": "≲", - "⪍": "⪍", - "⪏": "⪏", - "[": "[", - "‘": "‘", - "‚": "‚", - "ł": "ł", - "<": "<", - "<": "<", - "⪦": "⪦", - "⩹": "⩹", - "⋖": "⋖", - "⋋": "⋋", - "⋉": "⋉", - "⥶": "⥶", - "⩻": "⩻", - "⦖": "⦖", - "◃": "◃", - "⊴": "⊴", - "◂": "◂", - "⥊": "⥊", - "⥦": "⥦", - "≨︀": "≨︀", - "≨︀": "≨︀", - "∺": "∺", - "¯": "¯", - "¯": "¯", - "♂": "♂", - "✠": "✠", - "✠": "✠", - "↦": "↦", - "↦": "↦", - "↧": "↧", - "↤": "↤", - "↥": "↥", - "▮": "▮", - "⨩": "⨩", - "м": "м", - "—": "—", - "∡": "∡", - "𝔪": "𝔪", - "℧": "℧", - "µ": "µ", - "µ": "µ", - "∣": "∣", - "*": "*", - "⫰": "⫰", - "·": "·", - "·": "·", - "−": "−", - "⊟": "⊟", - "∸": "∸", - "⨪": "⨪", - "⫛": "⫛", - "…": "…", - "∓": "∓", - "⊧": "⊧", - "𝕞": "𝕞", - "∓": "∓", - "𝓂": "𝓂", - "∾": "∾", - "μ": "μ", - "⊸": "⊸", - "⊸": "⊸", - "⋙̸": "⋙̸", - "≫⃒": "≫⃒", - "≫̸": "≫̸", - "⇍": "⇍", - "⇎": "⇎", - "⋘̸": "⋘̸", - "≪⃒": "≪⃒", - "≪̸": "≪̸", - "⇏": "⇏", - "⊯": "⊯", - "⊮": "⊮", - "∇": "∇", - "ń": "ń", - "∠⃒": "∠⃒", - "≉": "≉", - "⩰̸": "⩰̸", - "≋̸": "≋̸", - "ʼn": "ʼn", - "≉": "≉", - "♮": "♮", - "♮": "♮", - "ℕ": "ℕ", - " ": " ", - " ": " ", - "≎̸": "≎̸", - "≏̸": "≏̸", - "⩃": "⩃", - "ň": "ň", - "ņ": "ņ", - "≇": "≇", - "⩭̸": "⩭̸", - "⩂": "⩂", - "н": "н", - "–": "–", - "≠": "≠", - "⇗": "⇗", - "⤤": "⤤", - "↗": "↗", - "↗": "↗", - "≐̸": "≐̸", - "≢": "≢", - "⤨": "⤨", - "≂̸": "≂̸", - "∄": "∄", - "∄": "∄", - "𝔫": "𝔫", - "≧̸": "≧̸", - "≱": "≱", - "≱": "≱", - "≧̸": "≧̸", - "⩾̸": "⩾̸", - "⩾̸": "⩾̸", - "≵": "≵", - "≯": "≯", - "≯": "≯", - "⇎": "⇎", - "↮": "↮", - "⫲": "⫲", - "∋": "∋", - "⋼": "⋼", - "⋺": "⋺", - "∋": "∋", - "њ": "њ", - "⇍": "⇍", - "≦̸": "≦̸", - "↚": "↚", - "‥": "‥", - "≰": "≰", - "↚": "↚", - "↮": "↮", - "≰": "≰", - "≦̸": "≦̸", - "⩽̸": "⩽̸", - "⩽̸": "⩽̸", - "≮": "≮", - "≴": "≴", - "≮": "≮", - "⋪": "⋪", - "⋬": "⋬", - "∤": "∤", - "𝕟": "𝕟", - "¬": "¬", - "¬": "¬", - "∉": "∉", - "⋹̸": "⋹̸", - "⋵̸": "⋵̸", - "∉": "∉", - "⋷": "⋷", - "⋶": "⋶", - "∌": "∌", - "∌": "∌", - "⋾": "⋾", - "⋽": "⋽", - "∦": "∦", - "∦": "∦", - "⫽⃥": "⫽⃥", - "∂̸": "∂̸", - "⨔": "⨔", - "⊀": "⊀", - "⋠": "⋠", - "⪯̸": "⪯̸", - "⊀": "⊀", - "⪯̸": "⪯̸", - "⇏": "⇏", - "↛": "↛", - "⤳̸": "⤳̸", - "↝̸": "↝̸", - "↛": "↛", - "⋫": "⋫", - "⋭": "⋭", - "⊁": "⊁", - "⋡": "⋡", - "⪰̸": "⪰̸", - "𝓃": "𝓃", - "∤": "∤", - "∦": "∦", - "≁": "≁", - "≄": "≄", - "≄": "≄", - "∤": "∤", - "∦": "∦", - "⋢": "⋢", - "⋣": "⋣", - "⊄": "⊄", - "⫅̸": "⫅̸", - "⊈": "⊈", - "⊂⃒": "⊂⃒", - "⊈": "⊈", - "⫅̸": "⫅̸", - "⊁": "⊁", - "⪰̸": "⪰̸", - "⊅": "⊅", - "⫆̸": "⫆̸", - "⊉": "⊉", - "⊃⃒": "⊃⃒", - "⊉": "⊉", - "⫆̸": "⫆̸", - "≹": "≹", - "ñ": "ñ", - "ñ": "ñ", - "≸": "≸", - "⋪": "⋪", - "⋬": "⋬", - "⋫": "⋫", - "⋭": "⋭", - "ν": "ν", - "#": "#", - "№": "№", - " ": " ", - "⊭": "⊭", - "⤄": "⤄", - "≍⃒": "≍⃒", - "⊬": "⊬", - "≥⃒": "≥⃒", - ">⃒": ">⃒", - "⧞": "⧞", - "⤂": "⤂", - "≤⃒": "≤⃒", - "<⃒": "<⃒", - "⊴⃒": "⊴⃒", - "⤃": "⤃", - "⊵⃒": "⊵⃒", - "∼⃒": "∼⃒", - "⇖": "⇖", - "⤣": "⤣", - "↖": "↖", - "↖": "↖", - "⤧": "⤧", - "Ⓢ": "Ⓢ", - "ó": "ó", - "ó": "ó", - "⊛": "⊛", - "⊚": "⊚", - "ô": "ô", - "ô": "ô", - "о": "о", - "⊝": "⊝", - "ő": "ő", - "⨸": "⨸", - "⊙": "⊙", - "⦼": "⦼", - "œ": "œ", - "⦿": "⦿", - "𝔬": "𝔬", - "˛": "˛", - "ò": "ò", - "ò": "ò", - "⧁": "⧁", - "⦵": "⦵", - "Ω": "Ω", - "∮": "∮", - "↺": "↺", - "⦾": "⦾", - "⦻": "⦻", - "‾": "‾", - "⧀": "⧀", - "ō": "ō", - "ω": "ω", - "ο": "ο", - "⦶": "⦶", - "⊖": "⊖", - "𝕠": "𝕠", - "⦷": "⦷", - "⦹": "⦹", - "⊕": "⊕", - "∨": "∨", - "↻": "↻", - "⩝": "⩝", - "ℴ": "ℴ", - "ℴ": "ℴ", - "ª": "ª", - "ª": "ª", - "º": "º", - "º": "º", - "⊶": "⊶", - "⩖": "⩖", - "⩗": "⩗", - "⩛": "⩛", - "ℴ": "ℴ", - "ø": "ø", - "ø": "ø", - "⊘": "⊘", - "õ": "õ", - "õ": "õ", - "⊗": "⊗", - "⨶": "⨶", - "ö": "ö", - "ö": "ö", - "⌽": "⌽", - "∥": "∥", - "¶": "¶", - "¶": "¶", - "∥": "∥", - "⫳": "⫳", - "⫽": "⫽", - "∂": "∂", - "п": "п", - "%": "%", - ".": ".", - "‰": "‰", - "⊥": "⊥", - "‱": "‱", - "𝔭": "𝔭", - "φ": "φ", - "ϕ": "ϕ", - "ℳ": "ℳ", - "☎": "☎", - "π": "π", - "⋔": "⋔", - "ϖ": "ϖ", - "ℏ": "ℏ", - "ℎ": "ℎ", - "ℏ": "ℏ", - "+": "+", - "⨣": "⨣", - "⊞": "⊞", - "⨢": "⨢", - "∔": "∔", - "⨥": "⨥", - "⩲": "⩲", - "±": "±", - "±": "±", - "⨦": "⨦", - "⨧": "⨧", - "±": "±", - "⨕": "⨕", - "𝕡": "𝕡", - "£": "£", - "£": "£", - "≺": "≺", - "⪳": "⪳", - "⪷": "⪷", - "≼": "≼", - "⪯": "⪯", - "≺": "≺", - "⪷": "⪷", - "≼": "≼", - "⪯": "⪯", - "⪹": "⪹", - "⪵": "⪵", - "⋨": "⋨", - "≾": "≾", - "′": "′", - "ℙ": "ℙ", - "⪵": "⪵", - "⪹": "⪹", - "⋨": "⋨", - "∏": "∏", - "⌮": "⌮", - "⌒": "⌒", - "⌓": "⌓", - "∝": "∝", - "∝": "∝", - "≾": "≾", - "⊰": "⊰", - "𝓅": "𝓅", - "ψ": "ψ", - " ": " ", - "𝔮": "𝔮", - "⨌": "⨌", - "𝕢": "𝕢", - "⁗": "⁗", - "𝓆": "𝓆", - "ℍ": "ℍ", - "⨖": "⨖", - "?": "?", - "≟": "≟", - """: '"', - """: '"', - "⇛": "⇛", - "⇒": "⇒", - "⤜": "⤜", - "⤏": "⤏", - "⥤": "⥤", - "∽̱": "∽̱", - "ŕ": "ŕ", - "√": "√", - "⦳": "⦳", - "⟩": "⟩", - "⦒": "⦒", - "⦥": "⦥", - "⟩": "⟩", - "»": "»", - "»": "»", - "→": "→", - "⥵": "⥵", - "⇥": "⇥", - "⤠": "⤠", - "⤳": "⤳", - "⤞": "⤞", - "↪": "↪", - "↬": "↬", - "⥅": "⥅", - "⥴": "⥴", - "↣": "↣", - "↝": "↝", - "⤚": "⤚", - "∶": "∶", - "ℚ": "ℚ", - "⤍": "⤍", - "❳": "❳", - "}": "}", - "]": "]", - "⦌": "⦌", - "⦎": "⦎", - "⦐": "⦐", - "ř": "ř", - "ŗ": "ŗ", - "⌉": "⌉", - "}": "}", - "р": "р", - "⤷": "⤷", - "⥩": "⥩", - "”": "”", - "”": "”", - "↳": "↳", - "ℜ": "ℜ", - "ℛ": "ℛ", - "ℜ": "ℜ", - "ℝ": "ℝ", - "▭": "▭", - "®": "®", - "®": "®", - "⥽": "⥽", - "⌋": "⌋", - "𝔯": "𝔯", - "⇁": "⇁", - "⇀": "⇀", - "⥬": "⥬", - "ρ": "ρ", - "ϱ": "ϱ", - "→": "→", - "↣": "↣", - "⇁": "⇁", - "⇀": "⇀", - "⇄": "⇄", - "⇌": "⇌", - "⇉": "⇉", - "↝": "↝", - "⋌": "⋌", - "˚": "˚", - "≓": "≓", - "⇄": "⇄", - "⇌": "⇌", - "‏": "‏", - "⎱": "⎱", - "⎱": "⎱", - "⫮": "⫮", - "⟭": "⟭", - "⇾": "⇾", - "⟧": "⟧", - "⦆": "⦆", - "𝕣": "𝕣", - "⨮": "⨮", - "⨵": "⨵", - ")": ")", - "⦔": "⦔", - "⨒": "⨒", - "⇉": "⇉", - "›": "›", - "𝓇": "𝓇", - "↱": "↱", - "]": "]", - "’": "’", - "’": "’", - "⋌": "⋌", - "⋊": "⋊", - "▹": "▹", - "⊵": "⊵", - "▸": "▸", - "⧎": "⧎", - "⥨": "⥨", - "℞": "℞", - "ś": "ś", - "‚": "‚", - "≻": "≻", - "⪴": "⪴", - "⪸": "⪸", - "š": "š", - "≽": "≽", - "⪰": "⪰", - "ş": "ş", - "ŝ": "ŝ", - "⪶": "⪶", - "⪺": "⪺", - "⋩": "⋩", - "⨓": "⨓", - "≿": "≿", - "с": "с", - "⋅": "⋅", - "⊡": "⊡", - "⩦": "⩦", - "⇘": "⇘", - "⤥": "⤥", - "↘": "↘", - "↘": "↘", - "§": "§", - "§": "§", - ";": ";", - "⤩": "⤩", - "∖": "∖", - "∖": "∖", - "✶": "✶", - "𝔰": "𝔰", - "⌢": "⌢", - "♯": "♯", - "щ": "щ", - "ш": "ш", - "∣": "∣", - "∥": "∥", - "­": "­", - "­": "­", - "σ": "σ", - "ς": "ς", - "ς": "ς", - "∼": "∼", - "⩪": "⩪", - "≃": "≃", - "≃": "≃", - "⪞": "⪞", - "⪠": "⪠", - "⪝": "⪝", - "⪟": "⪟", - "≆": "≆", - "⨤": "⨤", - "⥲": "⥲", - "←": "←", - "∖": "∖", - "⨳": "⨳", - "⧤": "⧤", - "∣": "∣", - "⌣": "⌣", - "⪪": "⪪", - "⪬": "⪬", - "⪬︀": "⪬︀", - "ь": "ь", - "/": "/", - "⧄": "⧄", - "⌿": "⌿", - "𝕤": "𝕤", - "♠": "♠", - "♠": "♠", - "∥": "∥", - "⊓": "⊓", - "⊓︀": "⊓︀", - "⊔": "⊔", - "⊔︀": "⊔︀", - "⊏": "⊏", - "⊑": "⊑", - "⊏": "⊏", - "⊑": "⊑", - "⊐": "⊐", - "⊒": "⊒", - "⊐": "⊐", - "⊒": "⊒", - "□": "□", - "□": "□", - "▪": "▪", - "▪": "▪", - "→": "→", - "𝓈": "𝓈", - "∖": "∖", - "⌣": "⌣", - "⋆": "⋆", - "☆": "☆", - "★": "★", - "ϵ": "ϵ", - "ϕ": "ϕ", - "¯": "¯", - "⊂": "⊂", - "⫅": "⫅", - "⪽": "⪽", - "⊆": "⊆", - "⫃": "⫃", - "⫁": "⫁", - "⫋": "⫋", - "⊊": "⊊", - "⪿": "⪿", - "⥹": "⥹", - "⊂": "⊂", - "⊆": "⊆", - "⫅": "⫅", - "⊊": "⊊", - "⫋": "⫋", - "⫇": "⫇", - "⫕": "⫕", - "⫓": "⫓", - "≻": "≻", - "⪸": "⪸", - "≽": "≽", - "⪰": "⪰", - "⪺": "⪺", - "⪶": "⪶", - "⋩": "⋩", - "≿": "≿", - "∑": "∑", - "♪": "♪", - "¹": "¹", - "¹": "¹", - "²": "²", - "²": "²", - "³": "³", - "³": "³", - "⊃": "⊃", - "⫆": "⫆", - "⪾": "⪾", - "⫘": "⫘", - "⊇": "⊇", - "⫄": "⫄", - "⟉": "⟉", - "⫗": "⫗", - "⥻": "⥻", - "⫂": "⫂", - "⫌": "⫌", - "⊋": "⊋", - "⫀": "⫀", - "⊃": "⊃", - "⊇": "⊇", - "⫆": "⫆", - "⊋": "⊋", - "⫌": "⫌", - "⫈": "⫈", - "⫔": "⫔", - "⫖": "⫖", - "⇙": "⇙", - "⤦": "⤦", - "↙": "↙", - "↙": "↙", - "⤪": "⤪", - "ß": "ß", - "ß": "ß", - "⌖": "⌖", - "τ": "τ", - "⎴": "⎴", - "ť": "ť", - "ţ": "ţ", - "т": "т", - "⃛": "⃛", - "⌕": "⌕", - "𝔱": "𝔱", - "∴": "∴", - "∴": "∴", - "θ": "θ", - "ϑ": "ϑ", - "ϑ": "ϑ", - "≈": "≈", - "∼": "∼", - " ": " ", - "≈": "≈", - "∼": "∼", - "þ": "þ", - "þ": "þ", - "˜": "˜", - "×": "×", - "×": "×", - "⊠": "⊠", - "⨱": "⨱", - "⨰": "⨰", - "∭": "∭", - "⤨": "⤨", - "⊤": "⊤", - "⌶": "⌶", - "⫱": "⫱", - "𝕥": "𝕥", - "⫚": "⫚", - "⤩": "⤩", - "‴": "‴", - "™": "™", - "▵": "▵", - "▿": "▿", - "◃": "◃", - "⊴": "⊴", - "≜": "≜", - "▹": "▹", - "⊵": "⊵", - "◬": "◬", - "≜": "≜", - "⨺": "⨺", - "⨹": "⨹", - "⧍": "⧍", - "⨻": "⨻", - "⏢": "⏢", - "𝓉": "𝓉", - "ц": "ц", - "ћ": "ћ", - "ŧ": "ŧ", - "≬": "≬", - "↞": "↞", - "↠": "↠", - "⇑": "⇑", - "⥣": "⥣", - "ú": "ú", - "ú": "ú", - "↑": "↑", - "ў": "ў", - "ŭ": "ŭ", - "û": "û", - "û": "û", - "у": "у", - "⇅": "⇅", - "ű": "ű", - "⥮": "⥮", - "⥾": "⥾", - "𝔲": "𝔲", - "ù": "ù", - "ù": "ù", - "↿": "↿", - "↾": "↾", - "▀": "▀", - "⌜": "⌜", - "⌜": "⌜", - "⌏": "⌏", - "◸": "◸", - "ū": "ū", - "¨": "¨", - "¨": "¨", - "ų": "ų", - "𝕦": "𝕦", - "↑": "↑", - "↕": "↕", - "↿": "↿", - "↾": "↾", - "⊎": "⊎", - "υ": "υ", - "ϒ": "ϒ", - "υ": "υ", - "⇈": "⇈", - "⌝": "⌝", - "⌝": "⌝", - "⌎": "⌎", - "ů": "ů", - "◹": "◹", - "𝓊": "𝓊", - "⋰": "⋰", - "ũ": "ũ", - "▵": "▵", - "▴": "▴", - "⇈": "⇈", - "ü": "ü", - "ü": "ü", - "⦧": "⦧", - "⇕": "⇕", - "⫨": "⫨", - "⫩": "⫩", - "⊨": "⊨", - "⦜": "⦜", - "ϵ": "ϵ", - "ϰ": "ϰ", - "∅": "∅", - "ϕ": "ϕ", - "ϖ": "ϖ", - "∝": "∝", - "↕": "↕", - "ϱ": "ϱ", - "ς": "ς", - "⊊︀": "⊊︀", - "⫋︀": "⫋︀", - "⊋︀": "⊋︀", - "⫌︀": "⫌︀", - "ϑ": "ϑ", - "⊲": "⊲", - "⊳": "⊳", - "в": "в", - "⊢": "⊢", - "∨": "∨", - "⊻": "⊻", - "≚": "≚", - "⋮": "⋮", - "|": "|", - "|": "|", - "𝔳": "𝔳", - "⊲": "⊲", - "⊂⃒": "⊂⃒", - "⊃⃒": "⊃⃒", - "𝕧": "𝕧", - "∝": "∝", - "⊳": "⊳", - "𝓋": "𝓋", - "⫋︀": "⫋︀", - "⊊︀": "⊊︀", - "⫌︀": "⫌︀", - "⊋︀": "⊋︀", - "⦚": "⦚", - "ŵ": "ŵ", - "⩟": "⩟", - "∧": "∧", - "≙": "≙", - "℘": "℘", - "𝔴": "𝔴", - "𝕨": "𝕨", - "℘": "℘", - "≀": "≀", - "≀": "≀", - "𝓌": "𝓌", - "⋂": "⋂", - "◯": "◯", - "⋃": "⋃", - "▽": "▽", - "𝔵": "𝔵", - "⟺": "⟺", - "⟷": "⟷", - "ξ": "ξ", - "⟸": "⟸", - "⟵": "⟵", - "⟼": "⟼", - "⋻": "⋻", - "⨀": "⨀", - "𝕩": "𝕩", - "⨁": "⨁", - "⨂": "⨂", - "⟹": "⟹", - "⟶": "⟶", - "𝓍": "𝓍", - "⨆": "⨆", - "⨄": "⨄", - "△": "△", - "⋁": "⋁", - "⋀": "⋀", - "ý": "ý", - "ý": "ý", - "я": "я", - "ŷ": "ŷ", - "ы": "ы", - "¥": "¥", - "¥": "¥", - "𝔶": "𝔶", - "ї": "ї", - "𝕪": "𝕪", - "𝓎": "𝓎", - "ю": "ю", - "ÿ": "ÿ", - "ÿ": "ÿ", - "ź": "ź", - "ž": "ž", - "з": "з", - "ż": "ż", - "ℨ": "ℨ", - "ζ": "ζ", - "𝔷": "𝔷", - "ж": "ж", - "⇝": "⇝", - "𝕫": "𝕫", - "𝓏": "𝓏", - "‍": "‍", - "‌": "‌", - }, - characters: { - Æ: "Æ", - "&": "&", - Á: "Á", - Ă: "Ă", - Â: "Â", - А: "А", - 𝔄: "𝔄", - À: "À", - Α: "Α", - Ā: "Ā", - "⩓": "⩓", - Ą: "Ą", - 𝔸: "𝔸", - "⁡": "⁡", - Å: "Å", - 𝒜: "𝒜", - "≔": "≔", - Ã: "Ã", - Ä: "Ä", - "∖": "∖", - "⫧": "⫧", - "⌆": "⌆", - Б: "Б", - "∵": "∵", - ℬ: "ℬ", - Β: "Β", - 𝔅: "𝔅", - 𝔹: "𝔹", - "˘": "˘", - "≎": "≎", - Ч: "Ч", - "©": "©", - Ć: "Ć", - "⋒": "⋒", - ⅅ: "ⅅ", - ℭ: "ℭ", - Č: "Č", - Ç: "Ç", - Ĉ: "Ĉ", - "∰": "∰", - Ċ: "Ċ", - "¸": "¸", - "·": "·", - Χ: "Χ", - "⊙": "⊙", - "⊖": "⊖", - "⊕": "⊕", - "⊗": "⊗", - "∲": "∲", - "”": "”", - "’": "’", - "∷": "∷", - "⩴": "⩴", - "≡": "≡", - "∯": "∯", - "∮": "∮", - ℂ: "ℂ", - "∐": "∐", - "∳": "∳", - "⨯": "⨯", - 𝒞: "𝒞", - "⋓": "⋓", - "≍": "≍", - "⤑": "⤑", - Ђ: "Ђ", - Ѕ: "Ѕ", - Џ: "Џ", - "‡": "‡", - "↡": "↡", - "⫤": "⫤", - Ď: "Ď", - Д: "Д", - "∇": "∇", - Δ: "Δ", - 𝔇: "𝔇", - "´": "´", - "˙": "˙", - "˝": "˝", - "`": "`", - "˜": "˜", - "⋄": "⋄", - ⅆ: "ⅆ", - 𝔻: "𝔻", - "¨": "¨", - "⃜": "⃜", - "≐": "≐", - "⇓": "⇓", - "⇐": "⇐", - "⇔": "⇔", - "⟸": "⟸", - "⟺": "⟺", - "⟹": "⟹", - "⇒": "⇒", - "⊨": "⊨", - "⇑": "⇑", - "⇕": "⇕", - "∥": "∥", - "↓": "↓", - "⤓": "⤓", - "⇵": "⇵", - "̑": "̑", - "⥐": "⥐", - "⥞": "⥞", - "↽": "↽", - "⥖": "⥖", - "⥟": "⥟", - "⇁": "⇁", - "⥗": "⥗", - "⊤": "⊤", - "↧": "↧", - 𝒟: "𝒟", - Đ: "Đ", - Ŋ: "Ŋ", - Ð: "Ð", - É: "É", - Ě: "Ě", - Ê: "Ê", - Э: "Э", - Ė: "Ė", - 𝔈: "𝔈", - È: "È", - "∈": "∈", - Ē: "Ē", - "◻": "◻", - "▫": "▫", - Ę: "Ę", - 𝔼: "𝔼", - Ε: "Ε", - "⩵": "⩵", - "≂": "≂", - "⇌": "⇌", - ℰ: "ℰ", - "⩳": "⩳", - Η: "Η", - Ë: "Ë", - "∃": "∃", - ⅇ: "ⅇ", - Ф: "Ф", - 𝔉: "𝔉", - "◼": "◼", - "▪": "▪", - 𝔽: "𝔽", - "∀": "∀", - ℱ: "ℱ", - Ѓ: "Ѓ", - ">": ">", - Γ: "Γ", - Ϝ: "Ϝ", - Ğ: "Ğ", - Ģ: "Ģ", - Ĝ: "Ĝ", - Г: "Г", - Ġ: "Ġ", - 𝔊: "𝔊", - "⋙": "⋙", - 𝔾: "𝔾", - "≥": "≥", - "⋛": "⋛", - "≧": "≧", - "⪢": "⪢", - "≷": "≷", - "⩾": "⩾", - "≳": "≳", - 𝒢: "𝒢", - "≫": "≫", - Ъ: "Ъ", - ˇ: "ˇ", - "^": "^", - Ĥ: "Ĥ", - ℌ: "ℌ", - ℋ: "ℋ", - ℍ: "ℍ", - "─": "─", - Ħ: "Ħ", - "≏": "≏", - Е: "Е", - IJ: "IJ", - Ё: "Ё", - Í: "Í", - Î: "Î", - И: "И", - İ: "İ", - ℑ: "ℑ", - Ì: "Ì", - Ī: "Ī", - ⅈ: "ⅈ", - "∬": "∬", - "∫": "∫", - "⋂": "⋂", - "⁣": "⁣", - "⁢": "⁢", - Į: "Į", - 𝕀: "𝕀", - Ι: "Ι", - ℐ: "ℐ", - Ĩ: "Ĩ", - І: "І", - Ï: "Ï", - Ĵ: "Ĵ", - Й: "Й", - 𝔍: "𝔍", - 𝕁: "𝕁", - 𝒥: "𝒥", - Ј: "Ј", - Є: "Є", - Х: "Х", - Ќ: "Ќ", - Κ: "Κ", - Ķ: "Ķ", - К: "К", - 𝔎: "𝔎", - 𝕂: "𝕂", - 𝒦: "𝒦", - Љ: "Љ", - "<": "<", - Ĺ: "Ĺ", - Λ: "Λ", - "⟪": "⟪", - ℒ: "ℒ", - "↞": "↞", - Ľ: "Ľ", - Ļ: "Ļ", - Л: "Л", - "⟨": "⟨", - "←": "←", - "⇤": "⇤", - "⇆": "⇆", - "⌈": "⌈", - "⟦": "⟦", - "⥡": "⥡", - "⇃": "⇃", - "⥙": "⥙", - "⌊": "⌊", - "↔": "↔", - "⥎": "⥎", - "⊣": "⊣", - "↤": "↤", - "⥚": "⥚", - "⊲": "⊲", - "⧏": "⧏", - "⊴": "⊴", - "⥑": "⥑", - "⥠": "⥠", - "↿": "↿", - "⥘": "⥘", - "↼": "↼", - "⥒": "⥒", - "⋚": "⋚", - "≦": "≦", - "≶": "≶", - "⪡": "⪡", - "⩽": "⩽", - "≲": "≲", - 𝔏: "𝔏", - "⋘": "⋘", - "⇚": "⇚", - Ŀ: "Ŀ", - "⟵": "⟵", - "⟷": "⟷", - "⟶": "⟶", - 𝕃: "𝕃", - "↙": "↙", - "↘": "↘", - "↰": "↰", - Ł: "Ł", - "≪": "≪", - "⤅": "⤅", - М: "М", - " ": " ", - ℳ: "ℳ", - 𝔐: "𝔐", - "∓": "∓", - 𝕄: "𝕄", - Μ: "Μ", - Њ: "Њ", - Ń: "Ń", - Ň: "Ň", - Ņ: "Ņ", - Н: "Н", - "​": "​", - "\n": " ", - 𝔑: "𝔑", - "⁠": "⁠", - " ": " ", - ℕ: "ℕ", - "⫬": "⫬", - "≢": "≢", - "≭": "≭", - "∦": "∦", - "∉": "∉", - "≠": "≠", - "≂̸": "≂̸", - "∄": "∄", - "≯": "≯", - "≱": "≱", - "≧̸": "≧̸", - "≫̸": "≫̸", - "≹": "≹", - "⩾̸": "⩾̸", - "≵": "≵", - "≎̸": "≎̸", - "≏̸": "≏̸", - "⋪": "⋪", - "⧏̸": "⧏̸", - "⋬": "⋬", - "≮": "≮", - "≰": "≰", - "≸": "≸", - "≪̸": "≪̸", - "⩽̸": "⩽̸", - "≴": "≴", - "⪢̸": "⪢̸", - "⪡̸": "⪡̸", - "⊀": "⊀", - "⪯̸": "⪯̸", - "⋠": "⋠", - "∌": "∌", - "⋫": "⋫", - "⧐̸": "⧐̸", - "⋭": "⋭", - "⊏̸": "⊏̸", - "⋢": "⋢", - "⊐̸": "⊐̸", - "⋣": "⋣", - "⊂⃒": "⊂⃒", - "⊈": "⊈", - "⊁": "⊁", - "⪰̸": "⪰̸", - "⋡": "⋡", - "≿̸": "≿̸", - "⊃⃒": "⊃⃒", - "⊉": "⊉", - "≁": "≁", - "≄": "≄", - "≇": "≇", - "≉": "≉", - "∤": "∤", - 𝒩: "𝒩", - Ñ: "Ñ", - Ν: "Ν", - Œ: "Œ", - Ó: "Ó", - Ô: "Ô", - О: "О", - Ő: "Ő", - 𝔒: "𝔒", - Ò: "Ò", - Ō: "Ō", - Ω: "Ω", - Ο: "Ο", - 𝕆: "𝕆", - "“": "“", - "‘": "‘", - "⩔": "⩔", - 𝒪: "𝒪", - Ø: "Ø", - Õ: "Õ", - "⨷": "⨷", - Ö: "Ö", - "‾": "‾", - "⏞": "⏞", - "⎴": "⎴", - "⏜": "⏜", - "∂": "∂", - П: "П", - 𝔓: "𝔓", - Φ: "Φ", - Π: "Π", - "±": "±", - ℙ: "ℙ", - "⪻": "⪻", - "≺": "≺", - "⪯": "⪯", - "≼": "≼", - "≾": "≾", - "″": "″", - "∏": "∏", - "∝": "∝", - 𝒫: "𝒫", - Ψ: "Ψ", - '"': """, - 𝔔: "𝔔", - ℚ: "ℚ", - 𝒬: "𝒬", - "⤐": "⤐", - "®": "®", - Ŕ: "Ŕ", - "⟫": "⟫", - "↠": "↠", - "⤖": "⤖", - Ř: "Ř", - Ŗ: "Ŗ", - Р: "Р", - ℜ: "ℜ", - "∋": "∋", - "⇋": "⇋", - "⥯": "⥯", - Ρ: "Ρ", - "⟩": "⟩", - "→": "→", - "⇥": "⇥", - "⇄": "⇄", - "⌉": "⌉", - "⟧": "⟧", - "⥝": "⥝", - "⇂": "⇂", - "⥕": "⥕", - "⌋": "⌋", - "⊢": "⊢", - "↦": "↦", - "⥛": "⥛", - "⊳": "⊳", - "⧐": "⧐", - "⊵": "⊵", - "⥏": "⥏", - "⥜": "⥜", - "↾": "↾", - "⥔": "⥔", - "⇀": "⇀", - "⥓": "⥓", - ℝ: "ℝ", - "⥰": "⥰", - "⇛": "⇛", - ℛ: "ℛ", - "↱": "↱", - "⧴": "⧴", - Щ: "Щ", - Ш: "Ш", - Ь: "Ь", - Ś: "Ś", - "⪼": "⪼", - Š: "Š", - Ş: "Ş", - Ŝ: "Ŝ", - С: "С", - 𝔖: "𝔖", - "↑": "↑", - Σ: "Σ", - "∘": "∘", - 𝕊: "𝕊", - "√": "√", - "□": "□", - "⊓": "⊓", - "⊏": "⊏", - "⊑": "⊑", - "⊐": "⊐", - "⊒": "⊒", - "⊔": "⊔", - 𝒮: "𝒮", - "⋆": "⋆", - "⋐": "⋐", - "⊆": "⊆", - "≻": "≻", - "⪰": "⪰", - "≽": "≽", - "≿": "≿", - "∑": "∑", - "⋑": "⋑", - "⊃": "⊃", - "⊇": "⊇", - Þ: "Þ", - "™": "™", - Ћ: "Ћ", - Ц: "Ц", - "\t": " ", - Τ: "Τ", - Ť: "Ť", - Ţ: "Ţ", - Т: "Т", - 𝔗: "𝔗", - "∴": "∴", - Θ: "Θ", - "  ": "  ", - " ": " ", - "∼": "∼", - "≃": "≃", - "≅": "≅", - "≈": "≈", - 𝕋: "𝕋", - "⃛": "⃛", - 𝒯: "𝒯", - Ŧ: "Ŧ", - Ú: "Ú", - "↟": "↟", - "⥉": "⥉", - Ў: "Ў", - Ŭ: "Ŭ", - Û: "Û", - У: "У", - Ű: "Ű", - 𝔘: "𝔘", - Ù: "Ù", - Ū: "Ū", - _: "_", - "⏟": "⏟", - "⎵": "⎵", - "⏝": "⏝", - "⋃": "⋃", - "⊎": "⊎", - Ų: "Ų", - 𝕌: "𝕌", - "⤒": "⤒", - "⇅": "⇅", - "↕": "↕", - "⥮": "⥮", - "⊥": "⊥", - "↥": "↥", - "↖": "↖", - "↗": "↗", - ϒ: "ϒ", - Υ: "Υ", - Ů: "Ů", - 𝒰: "𝒰", - Ũ: "Ũ", - Ü: "Ü", - "⊫": "⊫", - "⫫": "⫫", - В: "В", - "⊩": "⊩", - "⫦": "⫦", - "⋁": "⋁", - "‖": "‖", - "∣": "∣", - "|": "|", - "❘": "❘", - "≀": "≀", - " ": " ", - 𝔙: "𝔙", - 𝕍: "𝕍", - 𝒱: "𝒱", - "⊪": "⊪", - Ŵ: "Ŵ", - "⋀": "⋀", - 𝔚: "𝔚", - 𝕎: "𝕎", - 𝒲: "𝒲", - 𝔛: "𝔛", - Ξ: "Ξ", - 𝕏: "𝕏", - 𝒳: "𝒳", - Я: "Я", - Ї: "Ї", - Ю: "Ю", - Ý: "Ý", - Ŷ: "Ŷ", - Ы: "Ы", - 𝔜: "𝔜", - 𝕐: "𝕐", - 𝒴: "𝒴", - Ÿ: "Ÿ", - Ж: "Ж", - Ź: "Ź", - Ž: "Ž", - З: "З", - Ż: "Ż", - Ζ: "Ζ", - ℨ: "ℨ", - ℤ: "ℤ", - 𝒵: "𝒵", - á: "á", - ă: "ă", - "∾": "∾", - "∾̳": "∾̳", - "∿": "∿", - â: "â", - а: "а", - æ: "æ", - 𝔞: "𝔞", - à: "à", - ℵ: "ℵ", - α: "α", - ā: "ā", - "⨿": "⨿", - "∧": "∧", - "⩕": "⩕", - "⩜": "⩜", - "⩘": "⩘", - "⩚": "⩚", - "∠": "∠", - "⦤": "⦤", - "∡": "∡", - "⦨": "⦨", - "⦩": "⦩", - "⦪": "⦪", - "⦫": "⦫", - "⦬": "⦬", - "⦭": "⦭", - "⦮": "⦮", - "⦯": "⦯", - "∟": "∟", - "⊾": "⊾", - "⦝": "⦝", - "∢": "∢", - "⍼": "⍼", - ą: "ą", - 𝕒: "𝕒", - "⩰": "⩰", - "⩯": "⩯", - "≊": "≊", - "≋": "≋", - "'": "'", - å: "å", - 𝒶: "𝒶", - "*": "*", - ã: "ã", - ä: "ä", - "⨑": "⨑", - "⫭": "⫭", - "≌": "≌", - "϶": "϶", - "‵": "‵", - "∽": "∽", - "⋍": "⋍", - "⊽": "⊽", - "⌅": "⌅", - "⎶": "⎶", - б: "б", - "„": "„", - "⦰": "⦰", - β: "β", - ℶ: "ℶ", - "≬": "≬", - 𝔟: "𝔟", - "◯": "◯", - "⨀": "⨀", - "⨁": "⨁", - "⨂": "⨂", - "⨆": "⨆", - "★": "★", - "▽": "▽", - "△": "△", - "⨄": "⨄", - "⤍": "⤍", - "⧫": "⧫", - "▴": "▴", - "▾": "▾", - "◂": "◂", - "▸": "▸", - "␣": "␣", - "▒": "▒", - "░": "░", - "▓": "▓", - "█": "█", - "=⃥": "=⃥", - "≡⃥": "≡⃥", - "⌐": "⌐", - 𝕓: "𝕓", - "⋈": "⋈", - "╗": "╗", - "╔": "╔", - "╖": "╖", - "╓": "╓", - "═": "═", - "╦": "╦", - "╩": "╩", - "╤": "╤", - "╧": "╧", - "╝": "╝", - "╚": "╚", - "╜": "╜", - "╙": "╙", - "║": "║", - "╬": "╬", - "╣": "╣", - "╠": "╠", - "╫": "╫", - "╢": "╢", - "╟": "╟", - "⧉": "⧉", - "╕": "╕", - "╒": "╒", - "┐": "┐", - "┌": "┌", - "╥": "╥", - "╨": "╨", - "┬": "┬", - "┴": "┴", - "⊟": "⊟", - "⊞": "⊞", - "⊠": "⊠", - "╛": "╛", - "╘": "╘", - "┘": "┘", - "└": "└", - "│": "│", - "╪": "╪", - "╡": "╡", - "╞": "╞", - "┼": "┼", - "┤": "┤", - "├": "├", - "¦": "¦", - 𝒷: "𝒷", - "⁏": "⁏", - "\\": "\", - "⧅": "⧅", - "⟈": "⟈", - "•": "•", - "⪮": "⪮", - ć: "ć", - "∩": "∩", - "⩄": "⩄", - "⩉": "⩉", - "⩋": "⩋", - "⩇": "⩇", - "⩀": "⩀", - "∩︀": "∩︀", - "⁁": "⁁", - "⩍": "⩍", - č: "č", - ç: "ç", - ĉ: "ĉ", - "⩌": "⩌", - "⩐": "⩐", - ċ: "ċ", - "⦲": "⦲", - "¢": "¢", - 𝔠: "𝔠", - ч: "ч", - "✓": "✓", - χ: "χ", - "○": "○", - "⧃": "⧃", - ˆ: "ˆ", - "≗": "≗", - "↺": "↺", - "↻": "↻", - "Ⓢ": "Ⓢ", - "⊛": "⊛", - "⊚": "⊚", - "⊝": "⊝", - "⨐": "⨐", - "⫯": "⫯", - "⧂": "⧂", - "♣": "♣", - ":": ":", - ",": ",", - "@": "@", - "∁": "∁", - "⩭": "⩭", - 𝕔: "𝕔", - "℗": "℗", - "↵": "↵", - "✗": "✗", - 𝒸: "𝒸", - "⫏": "⫏", - "⫑": "⫑", - "⫐": "⫐", - "⫒": "⫒", - "⋯": "⋯", - "⤸": "⤸", - "⤵": "⤵", - "⋞": "⋞", - "⋟": "⋟", - "↶": "↶", - "⤽": "⤽", - "∪": "∪", - "⩈": "⩈", - "⩆": "⩆", - "⩊": "⩊", - "⊍": "⊍", - "⩅": "⩅", - "∪︀": "∪︀", - "↷": "↷", - "⤼": "⤼", - "⋎": "⋎", - "⋏": "⋏", - "¤": "¤", - "∱": "∱", - "⌭": "⌭", - "⥥": "⥥", - "†": "†", - ℸ: "ℸ", - "‐": "‐", - "⤏": "⤏", - ď: "ď", - д: "д", - "⇊": "⇊", - "⩷": "⩷", - "°": "°", - δ: "δ", - "⦱": "⦱", - "⥿": "⥿", - 𝔡: "𝔡", - "♦": "♦", - ϝ: "ϝ", - "⋲": "⋲", - "÷": "÷", - "⋇": "⋇", - ђ: "ђ", - "⌞": "⌞", - "⌍": "⌍", - $: "$", - 𝕕: "𝕕", - "≑": "≑", - "∸": "∸", - "∔": "∔", - "⊡": "⊡", - "⌟": "⌟", - "⌌": "⌌", - 𝒹: "𝒹", - ѕ: "ѕ", - "⧶": "⧶", - đ: "đ", - "⋱": "⋱", - "▿": "▿", - "⦦": "⦦", - џ: "џ", - "⟿": "⟿", - é: "é", - "⩮": "⩮", - ě: "ě", - "≖": "≖", - ê: "ê", - "≕": "≕", - э: "э", - ė: "ė", - "≒": "≒", - 𝔢: "𝔢", - "⪚": "⪚", - è: "è", - "⪖": "⪖", - "⪘": "⪘", - "⪙": "⪙", - "⏧": "⏧", - ℓ: "ℓ", - "⪕": "⪕", - "⪗": "⪗", - ē: "ē", - "∅": "∅", - " ": " ", - " ": " ", - " ": " ", - ŋ: "ŋ", - " ": " ", - ę: "ę", - 𝕖: "𝕖", - "⋕": "⋕", - "⧣": "⧣", - "⩱": "⩱", - ε: "ε", - ϵ: "ϵ", - "=": "=", - "≟": "≟", - "⩸": "⩸", - "⧥": "⧥", - "≓": "≓", - "⥱": "⥱", - ℯ: "ℯ", - η: "η", - ð: "ð", - ë: "ë", - "€": "€", - "!": "!", - ф: "ф", - "♀": "♀", - ffi: "ffi", - ff: "ff", - ffl: "ffl", - 𝔣: "𝔣", - fi: "fi", - fj: "fj", - "♭": "♭", - fl: "fl", - "▱": "▱", - ƒ: "ƒ", - 𝕗: "𝕗", - "⋔": "⋔", - "⫙": "⫙", - "⨍": "⨍", - "½": "½", - "⅓": "⅓", - "¼": "¼", - "⅕": "⅕", - "⅙": "⅙", - "⅛": "⅛", - "⅔": "⅔", - "⅖": "⅖", - "¾": "¾", - "⅗": "⅗", - "⅜": "⅜", - "⅘": "⅘", - "⅚": "⅚", - "⅝": "⅝", - "⅞": "⅞", - "⁄": "⁄", - "⌢": "⌢", - 𝒻: "𝒻", - "⪌": "⪌", - ǵ: "ǵ", - γ: "γ", - "⪆": "⪆", - ğ: "ğ", - ĝ: "ĝ", - г: "г", - ġ: "ġ", - "⪩": "⪩", - "⪀": "⪀", - "⪂": "⪂", - "⪄": "⪄", - "⋛︀": "⋛︀", - "⪔": "⪔", - 𝔤: "𝔤", - ℷ: "ℷ", - ѓ: "ѓ", - "⪒": "⪒", - "⪥": "⪥", - "⪤": "⪤", - "≩": "≩", - "⪊": "⪊", - "⪈": "⪈", - "⋧": "⋧", - 𝕘: "𝕘", - ℊ: "ℊ", - "⪎": "⪎", - "⪐": "⪐", - "⪧": "⪧", - "⩺": "⩺", - "⋗": "⋗", - "⦕": "⦕", - "⩼": "⩼", - "⥸": "⥸", - "≩︀": "≩︀", - ъ: "ъ", - "⥈": "⥈", - "↭": "↭", - ℏ: "ℏ", - ĥ: "ĥ", - "♥": "♥", - "…": "…", - "⊹": "⊹", - 𝔥: "𝔥", - "⤥": "⤥", - "⤦": "⤦", - "⇿": "⇿", - "∻": "∻", - "↩": "↩", - "↪": "↪", - 𝕙: "𝕙", - "―": "―", - 𝒽: "𝒽", - ħ: "ħ", - "⁃": "⁃", - í: "í", - î: "î", - и: "и", - е: "е", - "¡": "¡", - 𝔦: "𝔦", - ì: "ì", - "⨌": "⨌", - "∭": "∭", - "⧜": "⧜", - "℩": "℩", - ij: "ij", - ī: "ī", - ı: "ı", - "⊷": "⊷", - Ƶ: "Ƶ", - "℅": "℅", - "∞": "∞", - "⧝": "⧝", - "⊺": "⊺", - "⨗": "⨗", - "⨼": "⨼", - ё: "ё", - į: "į", - 𝕚: "𝕚", - ι: "ι", - "¿": "¿", - 𝒾: "𝒾", - "⋹": "⋹", - "⋵": "⋵", - "⋴": "⋴", - "⋳": "⋳", - ĩ: "ĩ", - і: "і", - ï: "ï", - ĵ: "ĵ", - й: "й", - 𝔧: "𝔧", - ȷ: "ȷ", - 𝕛: "𝕛", - 𝒿: "𝒿", - ј: "ј", - є: "є", - κ: "κ", - ϰ: "ϰ", - ķ: "ķ", - к: "к", - 𝔨: "𝔨", - ĸ: "ĸ", - х: "х", - ќ: "ќ", - 𝕜: "𝕜", - 𝓀: "𝓀", - "⤛": "⤛", - "⤎": "⤎", - "⪋": "⪋", - "⥢": "⥢", - ĺ: "ĺ", - "⦴": "⦴", - λ: "λ", - "⦑": "⦑", - "⪅": "⪅", - "«": "«", - "⤟": "⤟", - "⤝": "⤝", - "↫": "↫", - "⤹": "⤹", - "⥳": "⥳", - "↢": "↢", - "⪫": "⪫", - "⤙": "⤙", - "⪭": "⪭", - "⪭︀": "⪭︀", - "⤌": "⤌", - "❲": "❲", - "{": "{", - "[": "[", - "⦋": "⦋", - "⦏": "⦏", - "⦍": "⦍", - ľ: "ľ", - ļ: "ļ", - л: "л", - "⤶": "⤶", - "⥧": "⥧", - "⥋": "⥋", - "↲": "↲", - "≤": "≤", - "⇇": "⇇", - "⋋": "⋋", - "⪨": "⪨", - "⩿": "⩿", - "⪁": "⪁", - "⪃": "⪃", - "⋚︀": "⋚︀", - "⪓": "⪓", - "⋖": "⋖", - "⥼": "⥼", - 𝔩: "𝔩", - "⪑": "⪑", - "⥪": "⥪", - "▄": "▄", - љ: "љ", - "⥫": "⥫", - "◺": "◺", - ŀ: "ŀ", - "⎰": "⎰", - "≨": "≨", - "⪉": "⪉", - "⪇": "⪇", - "⋦": "⋦", - "⟬": "⟬", - "⇽": "⇽", - "⟼": "⟼", - "↬": "↬", - "⦅": "⦅", - 𝕝: "𝕝", - "⨭": "⨭", - "⨴": "⨴", - "∗": "∗", - "◊": "◊", - "(": "(", - "⦓": "⦓", - "⥭": "⥭", - "‎": "‎", - "⊿": "⊿", - "‹": "‹", - 𝓁: "𝓁", - "⪍": "⪍", - "⪏": "⪏", - "‚": "‚", - ł: "ł", - "⪦": "⪦", - "⩹": "⩹", - "⋉": "⋉", - "⥶": "⥶", - "⩻": "⩻", - "⦖": "⦖", - "◃": "◃", - "⥊": "⥊", - "⥦": "⥦", - "≨︀": "≨︀", - "∺": "∺", - "¯": "¯", - "♂": "♂", - "✠": "✠", - "▮": "▮", - "⨩": "⨩", - м: "м", - "—": "—", - 𝔪: "𝔪", - "℧": "℧", - µ: "µ", - "⫰": "⫰", - "−": "−", - "⨪": "⨪", - "⫛": "⫛", - "⊧": "⊧", - 𝕞: "𝕞", - 𝓂: "𝓂", - μ: "μ", - "⊸": "⊸", - "⋙̸": "⋙̸", - "≫⃒": "≫⃒", - "⇍": "⇍", - "⇎": "⇎", - "⋘̸": "⋘̸", - "≪⃒": "≪⃒", - "⇏": "⇏", - "⊯": "⊯", - "⊮": "⊮", - ń: "ń", - "∠⃒": "∠⃒", - "⩰̸": "⩰̸", - "≋̸": "≋̸", - ʼn: "ʼn", - "♮": "♮", - "⩃": "⩃", - ň: "ň", - ņ: "ņ", - "⩭̸": "⩭̸", - "⩂": "⩂", - н: "н", - "–": "–", - "⇗": "⇗", - "⤤": "⤤", - "≐̸": "≐̸", - "⤨": "⤨", - 𝔫: "𝔫", - "↮": "↮", - "⫲": "⫲", - "⋼": "⋼", - "⋺": "⋺", - њ: "њ", - "≦̸": "≦̸", - "↚": "↚", - "‥": "‥", - 𝕟: "𝕟", - "¬": "¬", - "⋹̸": "⋹̸", - "⋵̸": "⋵̸", - "⋷": "⋷", - "⋶": "⋶", - "⋾": "⋾", - "⋽": "⋽", - "⫽⃥": "⫽⃥", - "∂̸": "∂̸", - "⨔": "⨔", - "↛": "↛", - "⤳̸": "⤳̸", - "↝̸": "↝̸", - 𝓃: "𝓃", - "⊄": "⊄", - "⫅̸": "⫅̸", - "⊅": "⊅", - "⫆̸": "⫆̸", - ñ: "ñ", - ν: "ν", - "#": "#", - "№": "№", - " ": " ", - "⊭": "⊭", - "⤄": "⤄", - "≍⃒": "≍⃒", - "⊬": "⊬", - "≥⃒": "≥⃒", - ">⃒": ">⃒", - "⧞": "⧞", - "⤂": "⤂", - "≤⃒": "≤⃒", - "<⃒": "<⃒", - "⊴⃒": "⊴⃒", - "⤃": "⤃", - "⊵⃒": "⊵⃒", - "∼⃒": "∼⃒", - "⇖": "⇖", - "⤣": "⤣", - "⤧": "⤧", - ó: "ó", - ô: "ô", - о: "о", - ő: "ő", - "⨸": "⨸", - "⦼": "⦼", - œ: "œ", - "⦿": "⦿", - 𝔬: "𝔬", - "˛": "˛", - ò: "ò", - "⧁": "⧁", - "⦵": "⦵", - "⦾": "⦾", - "⦻": "⦻", - "⧀": "⧀", - ō: "ō", - ω: "ω", - ο: "ο", - "⦶": "⦶", - 𝕠: "𝕠", - "⦷": "⦷", - "⦹": "⦹", - "∨": "∨", - "⩝": "⩝", - ℴ: "ℴ", - ª: "ª", - º: "º", - "⊶": "⊶", - "⩖": "⩖", - "⩗": "⩗", - "⩛": "⩛", - ø: "ø", - "⊘": "⊘", - õ: "õ", - "⨶": "⨶", - ö: "ö", - "⌽": "⌽", - "¶": "¶", - "⫳": "⫳", - "⫽": "⫽", - п: "п", - "%": "%", - ".": ".", - "‰": "‰", - "‱": "‱", - 𝔭: "𝔭", - φ: "φ", - ϕ: "ϕ", - "☎": "☎", - π: "π", - ϖ: "ϖ", - ℎ: "ℎ", - "+": "+", - "⨣": "⨣", - "⨢": "⨢", - "⨥": "⨥", - "⩲": "⩲", - "⨦": "⨦", - "⨧": "⨧", - "⨕": "⨕", - 𝕡: "𝕡", - "£": "£", - "⪳": "⪳", - "⪷": "⪷", - "⪹": "⪹", - "⪵": "⪵", - "⋨": "⋨", - "′": "′", - "⌮": "⌮", - "⌒": "⌒", - "⌓": "⌓", - "⊰": "⊰", - 𝓅: "𝓅", - ψ: "ψ", - " ": " ", - 𝔮: "𝔮", - 𝕢: "𝕢", - "⁗": "⁗", - 𝓆: "𝓆", - "⨖": "⨖", - "?": "?", - "⤜": "⤜", - "⥤": "⥤", - "∽̱": "∽̱", - ŕ: "ŕ", - "⦳": "⦳", - "⦒": "⦒", - "⦥": "⦥", - "»": "»", - "⥵": "⥵", - "⤠": "⤠", - "⤳": "⤳", - "⤞": "⤞", - "⥅": "⥅", - "⥴": "⥴", - "↣": "↣", - "↝": "↝", - "⤚": "⤚", - "∶": "∶", - "❳": "❳", - "}": "}", - "]": "]", - "⦌": "⦌", - "⦎": "⦎", - "⦐": "⦐", - ř: "ř", - ŗ: "ŗ", - р: "р", - "⤷": "⤷", - "⥩": "⥩", - "↳": "↳", - "▭": "▭", - "⥽": "⥽", - 𝔯: "𝔯", - "⥬": "⥬", - ρ: "ρ", - ϱ: "ϱ", - "⇉": "⇉", - "⋌": "⋌", - "˚": "˚", - "‏": "‏", - "⎱": "⎱", - "⫮": "⫮", - "⟭": "⟭", - "⇾": "⇾", - "⦆": "⦆", - 𝕣: "𝕣", - "⨮": "⨮", - "⨵": "⨵", - ")": ")", - "⦔": "⦔", - "⨒": "⨒", - "›": "›", - 𝓇: "𝓇", - "⋊": "⋊", - "▹": "▹", - "⧎": "⧎", - "⥨": "⥨", - "℞": "℞", - ś: "ś", - "⪴": "⪴", - "⪸": "⪸", - š: "š", - ş: "ş", - ŝ: "ŝ", - "⪶": "⪶", - "⪺": "⪺", - "⋩": "⋩", - "⨓": "⨓", - с: "с", - "⋅": "⋅", - "⩦": "⩦", - "⇘": "⇘", - "§": "§", - ";": ";", - "⤩": "⤩", - "✶": "✶", - 𝔰: "𝔰", - "♯": "♯", - щ: "щ", - ш: "ш", - "­": "­", - σ: "σ", - ς: "ς", - "⩪": "⩪", - "⪞": "⪞", - "⪠": "⪠", - "⪝": "⪝", - "⪟": "⪟", - "≆": "≆", - "⨤": "⨤", - "⥲": "⥲", - "⨳": "⨳", - "⧤": "⧤", - "⌣": "⌣", - "⪪": "⪪", - "⪬": "⪬", - "⪬︀": "⪬︀", - ь: "ь", - "/": "/", - "⧄": "⧄", - "⌿": "⌿", - 𝕤: "𝕤", - "♠": "♠", - "⊓︀": "⊓︀", - "⊔︀": "⊔︀", - 𝓈: "𝓈", - "☆": "☆", - "⊂": "⊂", - "⫅": "⫅", - "⪽": "⪽", - "⫃": "⫃", - "⫁": "⫁", - "⫋": "⫋", - "⊊": "⊊", - "⪿": "⪿", - "⥹": "⥹", - "⫇": "⫇", - "⫕": "⫕", - "⫓": "⫓", - "♪": "♪", - "¹": "¹", - "²": "²", - "³": "³", - "⫆": "⫆", - "⪾": "⪾", - "⫘": "⫘", - "⫄": "⫄", - "⟉": "⟉", - "⫗": "⫗", - "⥻": "⥻", - "⫂": "⫂", - "⫌": "⫌", - "⊋": "⊋", - "⫀": "⫀", - "⫈": "⫈", - "⫔": "⫔", - "⫖": "⫖", - "⇙": "⇙", - "⤪": "⤪", - ß: "ß", - "⌖": "⌖", - τ: "τ", - ť: "ť", - ţ: "ţ", - т: "т", - "⌕": "⌕", - 𝔱: "𝔱", - θ: "θ", - ϑ: "ϑ", - þ: "þ", - "×": "×", - "⨱": "⨱", - "⨰": "⨰", - "⌶": "⌶", - "⫱": "⫱", - 𝕥: "𝕥", - "⫚": "⫚", - "‴": "‴", - "▵": "▵", - "≜": "≜", - "◬": "◬", - "⨺": "⨺", - "⨹": "⨹", - "⧍": "⧍", - "⨻": "⨻", - "⏢": "⏢", - 𝓉: "𝓉", - ц: "ц", - ћ: "ћ", - ŧ: "ŧ", - "⥣": "⥣", - ú: "ú", - ў: "ў", - ŭ: "ŭ", - û: "û", - у: "у", - ű: "ű", - "⥾": "⥾", - 𝔲: "𝔲", - ù: "ù", - "▀": "▀", - "⌜": "⌜", - "⌏": "⌏", - "◸": "◸", - ū: "ū", - ų: "ų", - 𝕦: "𝕦", - υ: "υ", - "⇈": "⇈", - "⌝": "⌝", - "⌎": "⌎", - ů: "ů", - "◹": "◹", - 𝓊: "𝓊", - "⋰": "⋰", - ũ: "ũ", - ü: "ü", - "⦧": "⦧", - "⫨": "⫨", - "⫩": "⫩", - "⦜": "⦜", - "⊊︀": "⊊︀", - "⫋︀": "⫋︀", - "⊋︀": "⊋︀", - "⫌︀": "⫌︀", - в: "в", - "⊻": "⊻", - "≚": "≚", - "⋮": "⋮", - 𝔳: "𝔳", - 𝕧: "𝕧", - 𝓋: "𝓋", - "⦚": "⦚", - ŵ: "ŵ", - "⩟": "⩟", - "≙": "≙", - ℘: "℘", - 𝔴: "𝔴", - 𝕨: "𝕨", - 𝓌: "𝓌", - 𝔵: "𝔵", - ξ: "ξ", - "⋻": "⋻", - 𝕩: "𝕩", - 𝓍: "𝓍", - ý: "ý", - я: "я", - ŷ: "ŷ", - ы: "ы", - "¥": "¥", - 𝔶: "𝔶", - ї: "ї", - 𝕪: "𝕪", - 𝓎: "𝓎", - ю: "ю", - ÿ: "ÿ", - ź: "ź", - ž: "ž", - з: "з", - ż: "ż", - ζ: "ζ", - 𝔷: "𝔷", - ж: "ж", - "⇝": "⇝", - 𝕫: "𝕫", - 𝓏: "𝓏", - "‍": "‍", - "‌": "‌", - }, - }, - }); - }, - 687: (r, e) => { - Object.defineProperty(e, "__esModule", { value: !0 }), - (e.numericUnicodeMap = { - 0: 65533, - 128: 8364, - 130: 8218, - 131: 402, - 132: 8222, - 133: 8230, - 134: 8224, - 135: 8225, - 136: 710, - 137: 8240, - 138: 352, - 139: 8249, - 140: 338, - 142: 381, - 145: 8216, - 146: 8217, - 147: 8220, - 148: 8221, - 149: 8226, - 150: 8211, - 151: 8212, - 152: 732, - 153: 8482, - 154: 353, - 155: 8250, - 156: 339, - 158: 382, - 159: 376, - }); - }, - 967: (r, e) => { - Object.defineProperty(e, "__esModule", { value: !0 }), - (e.fromCodePoint = - String.fromCodePoint || - function (r) { - return String.fromCharCode( - Math.floor((r - 65536) / 1024) + 55296, - ((r - 65536) % 1024) + 56320 - ); - }), - (e.getCodePoint = String.prototype.codePointAt - ? function (r, e) { - return r.codePointAt(e); - } - : function (r, e) { - return ( - 1024 * (r.charCodeAt(e) - 55296) + - r.charCodeAt(e + 1) - - 56320 + - 65536 - ); - }), - (e.highSurrogateFrom = 55296), - (e.highSurrogateTo = 56319); - }, - }, - a = {}; - function t(r) { - var o = a[r]; - if (void 0 !== o) return o.exports; - var c = (a[r] = { exports: {} }); - return e[r].call(c.exports, c, c.exports, t), c.exports; - } - (t.n = (r) => { - var e = r && r.__esModule ? () => r.default : () => r; - return t.d(e, { a: e }), e; - }), - (t.d = (r, e) => { - for (var a in e) - t.o(e, a) && - !t.o(r, a) && - Object.defineProperty(r, a, { enumerable: !0, get: e[a] }); - }), - (t.o = (r, e) => Object.prototype.hasOwnProperty.call(r, e)), - (r = t(563)), - (window.html_encode = r.encode), - (window.html_decode = r.decode); -})(); +(()=>{"use strict";var r,e={563:function(r,e,a){var t=this&&this.__assign||function(){return(t=Object.assign||function(r){for(var e,a=1,t=arguments.length;a'"&]/g,nonAscii:/(?:[<>'"&\u0080-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g,nonAsciiPrintable:/(?:[<>'"&\x01-\x08\x11-\x15\x17-\x1F\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g,extensive:/(?:[\x01-\x0c\x0e-\x1f\x21-\x2c\x2e-\x2f\x3a-\x40\x5b-\x60\x7b-\x7d\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g},n={mode:"specialChars",level:"all",numeric:"decimal"};e.encode=function(r,e){var a=void 0===(u=(c=void 0===e?n:e).mode)?"specialChars":u,t=void 0===(m=c.numeric)?"decimal":m,o=c.level;if(!r)return"";var c,u,p=i[a],d=s[void 0===o?"all":o].characters,g="hexadecimal"===t;if(p.lastIndex=0,c=p.exec(r)){u="";var m=0;do{m!==c.index&&(u+=r.substring(m,c.index));var f=d[o=c[0]];if(!f){var h=o.length>1?l.getCodePoint(o,0):o.charCodeAt(0);f=(g?"&#x"+h.toString(16):"&#"+h)+";"}u+=f,m=c.index+o.length}while(c=p.exec(r));m!==r.length&&(u+=r.substring(m))}else u=r;return u};var u={scope:"body",level:"all"},p=/&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);/g,d=/&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+)[;=]?/g,g={xml:{strict:p,attribute:d,body:o.bodyRegExps.xml},html4:{strict:p,attribute:d,body:o.bodyRegExps.html4},html5:{strict:p,attribute:d,body:o.bodyRegExps.html5}},m=t(t({},g),{all:g.html5}),f=String.fromCharCode,h=f(65533),b={level:"all"};e.decodeEntity=function(r,e){var a=void 0===(t=(void 0===e?b:e).level)?"all":t;if(!r)return"";var t=r,o=(r[r.length-1],s[a].entities[r]);if(o)t=o;else if("&"===r[0]&&"#"===r[1]){var i=r[2],n="x"==i||"X"==i?parseInt(r.substr(3),16):parseInt(r.substr(2));t=n>=1114111?h:n>65535?l.fromCodePoint(n):f(c.numericUnicodeMap[n]||n)}return t},e.decode=function(r,e){var a=void 0===e?u:e,t=a.level,o=void 0===t?"all":t,i=a.scope,n=void 0===i?"xml"===o?"strict":"body":i;if(!r)return"";var p=m[o][n],d=s[o].entities,g="attribute"===n,b="strict"===n;p.lastIndex=0;var v,q=p.exec(r);if(q){v="";var y=0;do{y!==q.index&&(v+=r.substring(y,q.index));var w=q[0],x=w,A=w[w.length-1];if(g&&"="===A)x=w;else if(b&&";"!==A)x=w;else{var E=d[w];if(E)x=E;else if("&"===w[0]&&"#"===w[1]){var D=w[2],k="x"==D||"X"==D?parseInt(w.substr(3),16):parseInt(w.substr(2));x=k>=1114111?h:k>65535?l.fromCodePoint(k):f(c.numericUnicodeMap[k]||k)}}v+=x,y=q.index+w.length}while(q=p.exec(r));y!==r.length&&(v+=r.substring(y))}else v=r;return v}},81:(r,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.bodyRegExps={xml:/&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html4:/&(?:nbsp|iexcl|cent|pound|curren|yen|brvbar|sect|uml|copy|ordf|laquo|not|shy|reg|macr|deg|plusmn|sup2|sup3|acute|micro|para|middot|cedil|sup1|ordm|raquo|frac14|frac12|frac34|iquest|Agrave|Aacute|Acirc|Atilde|Auml|Aring|AElig|Ccedil|Egrave|Eacute|Ecirc|Euml|Igrave|Iacute|Icirc|Iuml|ETH|Ntilde|Ograve|Oacute|Ocirc|Otilde|Ouml|times|Oslash|Ugrave|Uacute|Ucirc|Uuml|Yacute|THORN|szlig|agrave|aacute|acirc|atilde|auml|aring|aelig|ccedil|egrave|eacute|ecirc|euml|igrave|iacute|icirc|iuml|eth|ntilde|ograve|oacute|ocirc|otilde|ouml|divide|oslash|ugrave|uacute|ucirc|uuml|yacute|thorn|yuml|quot|amp|lt|gt|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g,html5:/&(?:AElig|AMP|Aacute|Acirc|Agrave|Aring|Atilde|Auml|COPY|Ccedil|ETH|Eacute|Ecirc|Egrave|Euml|GT|Iacute|Icirc|Igrave|Iuml|LT|Ntilde|Oacute|Ocirc|Ograve|Oslash|Otilde|Ouml|QUOT|REG|THORN|Uacute|Ucirc|Ugrave|Uuml|Yacute|aacute|acirc|acute|aelig|agrave|amp|aring|atilde|auml|brvbar|ccedil|cedil|cent|copy|curren|deg|divide|eacute|ecirc|egrave|eth|euml|frac12|frac14|frac34|gt|iacute|icirc|iexcl|igrave|iquest|iuml|laquo|lt|macr|micro|middot|nbsp|not|ntilde|oacute|ocirc|ograve|ordf|ordm|oslash|otilde|ouml|para|plusmn|pound|quot|raquo|reg|sect|shy|sup1|sup2|sup3|szlig|thorn|times|uacute|ucirc|ugrave|uml|uuml|yacute|yen|yuml|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g},e.namedReferences={xml:{entities:{"<":"<",">":">",""":'"',"'":"'","&":"&"},characters:{"<":"<",">":">",'"':""","'":"'","&":"&"}},html4:{entities:{"'":"'"," ":" "," ":" ","¡":"¡","¡":"¡","¢":"¢","¢":"¢","£":"£","£":"£","¤":"¤","¤":"¤","¥":"¥","¥":"¥","¦":"¦","¦":"¦","§":"§","§":"§","¨":"¨","¨":"¨","©":"©","©":"©","ª":"ª","ª":"ª","«":"«","«":"«","¬":"¬","¬":"¬","­":"­","­":"­","®":"®","®":"®","¯":"¯","¯":"¯","°":"°","°":"°","±":"±","±":"±","²":"²","²":"²","³":"³","³":"³","´":"´","´":"´","µ":"µ","µ":"µ","¶":"¶","¶":"¶","·":"·","·":"·","¸":"¸","¸":"¸","¹":"¹","¹":"¹","º":"º","º":"º","»":"»","»":"»","¼":"¼","¼":"¼","½":"½","½":"½","¾":"¾","¾":"¾","¿":"¿","¿":"¿","À":"À","À":"À","Á":"Á","Á":"Á","Â":"Â","Â":"Â","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","Å":"Å","Å":"Å","Æ":"Æ","Æ":"Æ","Ç":"Ç","Ç":"Ç","È":"È","È":"È","É":"É","É":"É","Ê":"Ê","Ê":"Ê","Ë":"Ë","Ë":"Ë","Ì":"Ì","Ì":"Ì","Í":"Í","Í":"Í","Î":"Î","Î":"Î","Ï":"Ï","Ï":"Ï","Ð":"Ð","Ð":"Ð","Ñ":"Ñ","Ñ":"Ñ","Ò":"Ò","Ò":"Ò","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","Õ":"Õ","Õ":"Õ","Ö":"Ö","Ö":"Ö","×":"×","×":"×","Ø":"Ø","Ø":"Ø","Ù":"Ù","Ù":"Ù","Ú":"Ú","Ú":"Ú","Û":"Û","Û":"Û","Ü":"Ü","Ü":"Ü","Ý":"Ý","Ý":"Ý","Þ":"Þ","Þ":"Þ","ß":"ß","ß":"ß","à":"à","à":"à","á":"á","á":"á","â":"â","â":"â","ã":"ã","ã":"ã","ä":"ä","ä":"ä","å":"å","å":"å","æ":"æ","æ":"æ","ç":"ç","ç":"ç","è":"è","è":"è","é":"é","é":"é","ê":"ê","ê":"ê","ë":"ë","ë":"ë","ì":"ì","ì":"ì","í":"í","í":"í","î":"î","î":"î","ï":"ï","ï":"ï","ð":"ð","ð":"ð","ñ":"ñ","ñ":"ñ","ò":"ò","ò":"ò","ó":"ó","ó":"ó","ô":"ô","ô":"ô","õ":"õ","õ":"õ","ö":"ö","ö":"ö","÷":"÷","÷":"÷","ø":"ø","ø":"ø","ù":"ù","ù":"ù","ú":"ú","ú":"ú","û":"û","û":"û","ü":"ü","ü":"ü","ý":"ý","ý":"ý","þ":"þ","þ":"þ","ÿ":"ÿ","ÿ":"ÿ",""":'"',""":'"',"&":"&","&":"&","<":"<","<":"<",">":">",">":">","Œ":"Œ","œ":"œ","Š":"Š","š":"š","Ÿ":"Ÿ","ˆ":"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€","ƒ":"ƒ","Α":"Α","Β":"Β","Γ":"Γ","Δ":"Δ","Ε":"Ε","Ζ":"Ζ","Η":"Η","Θ":"Θ","Ι":"Ι","Κ":"Κ","Λ":"Λ","Μ":"Μ","Ν":"Ν","Ξ":"Ξ","Ο":"Ο","Π":"Π","Ρ":"Ρ","Σ":"Σ","Τ":"Τ","Υ":"Υ","Φ":"Φ","Χ":"Χ","Ψ":"Ψ","Ω":"Ω","α":"α","β":"β","γ":"γ","δ":"δ","ε":"ε","ζ":"ζ","η":"η","θ":"θ","ι":"ι","κ":"κ","λ":"λ","μ":"μ","ν":"ν","ξ":"ξ","ο":"ο","π":"π","ρ":"ρ","ς":"ς","σ":"σ","τ":"τ","υ":"υ","φ":"φ","χ":"χ","ψ":"ψ","ω":"ω","ϑ":"ϑ","ϒ":"ϒ","ϖ":"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄","℘":"℘","ℑ":"ℑ","ℜ":"ℜ","™":"™","ℵ":"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","⟨":"〈","⟩":"〉","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"},characters:{"'":"'"," ":" ","¡":"¡","¢":"¢","£":"£","¤":"¤","¥":"¥","¦":"¦","§":"§","¨":"¨","©":"©",ª:"ª","«":"«","¬":"¬","­":"­","®":"®","¯":"¯","°":"°","±":"±","²":"²","³":"³","´":"´",µ:"µ","¶":"¶","·":"·","¸":"¸","¹":"¹",º:"º","»":"»","¼":"¼","½":"½","¾":"¾","¿":"¿",À:"À",Á:"Á",Â:"Â",Ã:"Ã",Ä:"Ä",Å:"Å",Æ:"Æ",Ç:"Ç",È:"È",É:"É",Ê:"Ê",Ë:"Ë",Ì:"Ì",Í:"Í",Î:"Î",Ï:"Ï",Ð:"Ð",Ñ:"Ñ",Ò:"Ò",Ó:"Ó",Ô:"Ô",Õ:"Õ",Ö:"Ö","×":"×",Ø:"Ø",Ù:"Ù",Ú:"Ú",Û:"Û",Ü:"Ü",Ý:"Ý",Þ:"Þ",ß:"ß",à:"à",á:"á",â:"â",ã:"ã",ä:"ä",å:"å",æ:"æ",ç:"ç",è:"è",é:"é",ê:"ê",ë:"ë",ì:"ì",í:"í",î:"î",ï:"ï",ð:"ð",ñ:"ñ",ò:"ò",ó:"ó",ô:"ô",õ:"õ",ö:"ö","÷":"÷",ø:"ø",ù:"ù",ú:"ú",û:"û",ü:"ü",ý:"ý",þ:"þ",ÿ:"ÿ",'"':""","&":"&","<":"<",">":">",Œ:"Œ",œ:"œ",Š:"Š",š:"š",Ÿ:"Ÿ",ˆ:"ˆ","˜":"˜"," ":" "," ":" "," ":" ","‌":"‌","‍":"‍","‎":"‎","‏":"‏","–":"–","—":"—","‘":"‘","’":"’","‚":"‚","“":"“","”":"”","„":"„","†":"†","‡":"‡","‰":"‰","‹":"‹","›":"›","€":"€",ƒ:"ƒ",Α:"Α",Β:"Β",Γ:"Γ",Δ:"Δ",Ε:"Ε",Ζ:"Ζ",Η:"Η",Θ:"Θ",Ι:"Ι",Κ:"Κ",Λ:"Λ",Μ:"Μ",Ν:"Ν",Ξ:"Ξ",Ο:"Ο",Π:"Π",Ρ:"Ρ",Σ:"Σ",Τ:"Τ",Υ:"Υ",Φ:"Φ",Χ:"Χ",Ψ:"Ψ",Ω:"Ω",α:"α",β:"β",γ:"γ",δ:"δ",ε:"ε",ζ:"ζ",η:"η",θ:"θ",ι:"ι",κ:"κ",λ:"λ",μ:"μ",ν:"ν",ξ:"ξ",ο:"ο",π:"π",ρ:"ρ",ς:"ς",σ:"σ",τ:"τ",υ:"υ",φ:"φ",χ:"χ",ψ:"ψ",ω:"ω",ϑ:"ϑ",ϒ:"ϒ",ϖ:"ϖ","•":"•","…":"…","′":"′","″":"″","‾":"‾","⁄":"⁄",℘:"℘",ℑ:"ℑ",ℜ:"ℜ","™":"™",ℵ:"ℵ","←":"←","↑":"↑","→":"→","↓":"↓","↔":"↔","↵":"↵","⇐":"⇐","⇑":"⇑","⇒":"⇒","⇓":"⇓","⇔":"⇔","∀":"∀","∂":"∂","∃":"∃","∅":"∅","∇":"∇","∈":"∈","∉":"∉","∋":"∋","∏":"∏","∑":"∑","−":"−","∗":"∗","√":"√","∝":"∝","∞":"∞","∠":"∠","∧":"∧","∨":"∨","∩":"∩","∪":"∪","∫":"∫","∴":"∴","∼":"∼","≅":"≅","≈":"≈","≠":"≠","≡":"≡","≤":"≤","≥":"≥","⊂":"⊂","⊃":"⊃","⊄":"⊄","⊆":"⊆","⊇":"⊇","⊕":"⊕","⊗":"⊗","⊥":"⊥","⋅":"⋅","⌈":"⌈","⌉":"⌉","⌊":"⌊","⌋":"⌋","〈":"⟨","〉":"⟩","◊":"◊","♠":"♠","♣":"♣","♥":"♥","♦":"♦"}},html5:{entities:{"Æ":"Æ","Æ":"Æ","&":"&","&":"&","Á":"Á","Á":"Á","Ă":"Ă","Â":"Â","Â":"Â","А":"А","𝔄":"𝔄","À":"À","À":"À","Α":"Α","Ā":"Ā","⩓":"⩓","Ą":"Ą","𝔸":"𝔸","⁡":"⁡","Å":"Å","Å":"Å","𝒜":"𝒜","≔":"≔","Ã":"Ã","Ã":"Ã","Ä":"Ä","Ä":"Ä","∖":"∖","⫧":"⫧","⌆":"⌆","Б":"Б","∵":"∵","ℬ":"ℬ","Β":"Β","𝔅":"𝔅","𝔹":"𝔹","˘":"˘","ℬ":"ℬ","≎":"≎","Ч":"Ч","©":"©","©":"©","Ć":"Ć","⋒":"⋒","ⅅ":"ⅅ","ℭ":"ℭ","Č":"Č","Ç":"Ç","Ç":"Ç","Ĉ":"Ĉ","∰":"∰","Ċ":"Ċ","¸":"¸","·":"·","ℭ":"ℭ","Χ":"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮","ℂ":"ℂ","∐":"∐","∳":"∳","⨯":"⨯","𝒞":"𝒞","⋓":"⋓","≍":"≍","ⅅ":"ⅅ","⤑":"⤑","Ђ":"Ђ","Ѕ":"Ѕ","Џ":"Џ","‡":"‡","↡":"↡","⫤":"⫤","Ď":"Ď","Д":"Д","∇":"∇","Δ":"Δ","𝔇":"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄","ⅆ":"ⅆ","𝔻":"𝔻","¨":"¨","⃜":"⃜","≐":"≐","∯":"∯","¨":"¨","⇓":"⇓","⇐":"⇐","⇔":"⇔","⫤":"⫤","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧","⇓":"⇓","𝒟":"𝒟","Đ":"Đ","Ŋ":"Ŋ","Ð":"Ð","Ð":"Ð","É":"É","É":"É","Ě":"Ě","Ê":"Ê","Ê":"Ê","Э":"Э","Ė":"Ė","𝔈":"𝔈","È":"È","È":"È","∈":"∈","Ē":"Ē","◻":"◻","▫":"▫","Ę":"Ę","𝔼":"𝔼","Ε":"Ε","⩵":"⩵","≂":"≂","⇌":"⇌","ℰ":"ℰ","⩳":"⩳","Η":"Η","Ë":"Ë","Ë":"Ë","∃":"∃","ⅇ":"ⅇ","Ф":"Ф","𝔉":"𝔉","◼":"◼","▪":"▪","𝔽":"𝔽","∀":"∀","ℱ":"ℱ","ℱ":"ℱ","Ѓ":"Ѓ",">":">",">":">","Γ":"Γ","Ϝ":"Ϝ","Ğ":"Ğ","Ģ":"Ģ","Ĝ":"Ĝ","Г":"Г","Ġ":"Ġ","𝔊":"𝔊","⋙":"⋙","𝔾":"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳","𝒢":"𝒢","≫":"≫","Ъ":"Ъ","ˇ":"ˇ","^":"^","Ĥ":"Ĥ","ℌ":"ℌ","ℋ":"ℋ","ℍ":"ℍ","─":"─","ℋ":"ℋ","Ħ":"Ħ","≎":"≎","≏":"≏","Е":"Е","IJ":"IJ","Ё":"Ё","Í":"Í","Í":"Í","Î":"Î","Î":"Î","И":"И","İ":"İ","ℑ":"ℑ","Ì":"Ì","Ì":"Ì","ℑ":"ℑ","Ī":"Ī","ⅈ":"ⅈ","⇒":"⇒","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢","Į":"Į","𝕀":"𝕀","Ι":"Ι","ℐ":"ℐ","Ĩ":"Ĩ","І":"І","Ï":"Ï","Ï":"Ï","Ĵ":"Ĵ","Й":"Й","𝔍":"𝔍","𝕁":"𝕁","𝒥":"𝒥","Ј":"Ј","Є":"Є","Х":"Х","Ќ":"Ќ","Κ":"Κ","Ķ":"Ķ","К":"К","𝔎":"𝔎","𝕂":"𝕂","𝒦":"𝒦","Љ":"Љ","<":"<","<":"<","Ĺ":"Ĺ","Λ":"Λ","⟪":"⟪","ℒ":"ℒ","↞":"↞","Ľ":"Ľ","Ļ":"Ļ","Л":"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⇐":"⇐","⇔":"⇔","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲","𝔏":"𝔏","⋘":"⋘","⇚":"⇚","Ŀ":"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶","⟸":"⟸","⟺":"⟺","⟹":"⟹","𝕃":"𝕃","↙":"↙","↘":"↘","ℒ":"ℒ","↰":"↰","Ł":"Ł","≪":"≪","⤅":"⤅","М":"М"," ":" ","ℳ":"ℳ","𝔐":"𝔐","∓":"∓","𝕄":"𝕄","ℳ":"ℳ","Μ":"Μ","Њ":"Њ","Ń":"Ń","Ň":"Ň","Ņ":"Ņ","Н":"Н","​":"​","​":"​","​":"​","​":"​","≫":"≫","≪":"≪"," ":"\n","𝔑":"𝔑","⁠":"⁠"," ":" ","ℕ":"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤","𝒩":"𝒩","Ñ":"Ñ","Ñ":"Ñ","Ν":"Ν","Œ":"Œ","Ó":"Ó","Ó":"Ó","Ô":"Ô","Ô":"Ô","О":"О","Ő":"Ő","𝔒":"𝔒","Ò":"Ò","Ò":"Ò","Ō":"Ō","Ω":"Ω","Ο":"Ο","𝕆":"𝕆","“":"“","‘":"‘","⩔":"⩔","𝒪":"𝒪","Ø":"Ø","Ø":"Ø","Õ":"Õ","Õ":"Õ","⨷":"⨷","Ö":"Ö","Ö":"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂","П":"П","𝔓":"𝔓","Φ":"Φ","Π":"Π","±":"±","ℌ":"ℌ","ℙ":"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∷":"∷","∝":"∝","𝒫":"𝒫","Ψ":"Ψ",""":'"',""":'"',"𝔔":"𝔔","ℚ":"ℚ","𝒬":"𝒬","⤐":"⤐","®":"®","®":"®","Ŕ":"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖","Ř":"Ř","Ŗ":"Ŗ","Р":"Р","ℜ":"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯","ℜ":"ℜ","Ρ":"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓","⇒":"⇒","ℝ":"ℝ","⥰":"⥰","⇛":"⇛","ℛ":"ℛ","↱":"↱","⧴":"⧴","Щ":"Щ","Ш":"Ш","Ь":"Ь","Ś":"Ś","⪼":"⪼","Š":"Š","Ş":"Ş","Ŝ":"Ŝ","С":"С","𝔖":"𝔖","↓":"↓","←":"←","→":"→","↑":"↑","Σ":"Σ","∘":"∘","𝕊":"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔","𝒮":"𝒮","⋆":"⋆","⋐":"⋐","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∋":"∋","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇","⋑":"⋑","Þ":"Þ","Þ":"Þ","™":"™","Ћ":"Ћ","Ц":"Ц"," ":"\t","Τ":"Τ","Ť":"Ť","Ţ":"Ţ","Т":"Т","𝔗":"𝔗","∴":"∴","Θ":"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈","𝕋":"𝕋","⃛":"⃛","𝒯":"𝒯","Ŧ":"Ŧ","Ú":"Ú","Ú":"Ú","↟":"↟","⥉":"⥉","Ў":"Ў","Ŭ":"Ŭ","Û":"Û","Û":"Û","У":"У","Ű":"Ű","𝔘":"𝔘","Ù":"Ù","Ù":"Ù","Ū":"Ū","_":"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎","Ų":"Ų","𝕌":"𝕌","↑":"↑","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","⇑":"⇑","⇕":"⇕","↖":"↖","↗":"↗","ϒ":"ϒ","Υ":"Υ","Ů":"Ů","𝒰":"𝒰","Ũ":"Ũ","Ü":"Ü","Ü":"Ü","⊫":"⊫","⫫":"⫫","В":"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ","𝔙":"𝔙","𝕍":"𝕍","𝒱":"𝒱","⊪":"⊪","Ŵ":"Ŵ","⋀":"⋀","𝔚":"𝔚","𝕎":"𝕎","𝒲":"𝒲","𝔛":"𝔛","Ξ":"Ξ","𝕏":"𝕏","𝒳":"𝒳","Я":"Я","Ї":"Ї","Ю":"Ю","Ý":"Ý","Ý":"Ý","Ŷ":"Ŷ","Ы":"Ы","𝔜":"𝔜","𝕐":"𝕐","𝒴":"𝒴","Ÿ":"Ÿ","Ж":"Ж","Ź":"Ź","Ž":"Ž","З":"З","Ż":"Ż","​":"​","Ζ":"Ζ","ℨ":"ℨ","ℤ":"ℤ","𝒵":"𝒵","á":"á","á":"á","ă":"ă","∾":"∾","∾̳":"∾̳","∿":"∿","â":"â","â":"â","´":"´","´":"´","а":"а","æ":"æ","æ":"æ","⁡":"⁡","𝔞":"𝔞","à":"à","à":"à","ℵ":"ℵ","ℵ":"ℵ","α":"α","ā":"ā","⨿":"⨿","&":"&","&":"&","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∠":"∠","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","Å":"Å","⍼":"⍼","ą":"ą","𝕒":"𝕒","≈":"≈","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'","≈":"≈","≊":"≊","å":"å","å":"å","𝒶":"𝒶","*":"*","≈":"≈","≍":"≍","ã":"ã","ã":"ã","ä":"ä","ä":"ä","∳":"∳","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⌅":"⌅","⎵":"⎵","⎶":"⎶","≌":"≌","б":"б","„":"„","∵":"∵","∵":"∵","⦰":"⦰","϶":"϶","ℬ":"ℬ","β":"β","ℶ":"ℶ","≬":"≬","𝔟":"𝔟","⋂":"⋂","◯":"◯","⋃":"⋃","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⋁":"⋁","⋀":"⋀","⤍":"⤍","⧫":"⧫","▪":"▪","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐","𝕓":"𝕓","⊥":"⊥","⊥":"⊥","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","─":"─","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","‵":"‵","˘":"˘","¦":"¦","¦":"¦","𝒷":"𝒷","⁏":"⁏","∽":"∽","⋍":"⋍","\":"\\","⧅":"⧅","⟈":"⟈","•":"•","•":"•","≎":"≎","⪮":"⪮","≏":"≏","≏":"≏","ć":"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","ˇ":"ˇ","⩍":"⩍","č":"č","ç":"ç","ç":"ç","ĉ":"ĉ","⩌":"⩌","⩐":"⩐","ċ":"ċ","¸":"¸","¸":"¸","⦲":"⦲","¢":"¢","¢":"¢","·":"·","𝔠":"𝔠","ч":"ч","✓":"✓","✓":"✓","χ":"χ","○":"○","⧃":"⧃","ˆ":"ˆ","≗":"≗","↺":"↺","↻":"↻","®":"®","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","≗":"≗","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣","♣":"♣",":":":","≔":"≔","≔":"≔",",":",","@":"@","∁":"∁","∘":"∘","∁":"∁","ℂ":"ℂ","≅":"≅","⩭":"⩭","∮":"∮","𝕔":"𝕔","∐":"∐","©":"©","©":"©","℗":"℗","↵":"↵","✗":"✗","𝒸":"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋞":"⋞","⋟":"⋟","⋎":"⋎","⋏":"⋏","¤":"¤","¤":"¤","↶":"↶","↷":"↷","⋎":"⋎","⋏":"⋏","∲":"∲","∱":"∱","⌭":"⌭","⇓":"⇓","⥥":"⥥","†":"†","ℸ":"ℸ","↓":"↓","‐":"‐","⊣":"⊣","⤏":"⤏","˝":"˝","ď":"ď","д":"д","ⅆ":"ⅆ","‡":"‡","⇊":"⇊","⩷":"⩷","°":"°","°":"°","δ":"δ","⦱":"⦱","⥿":"⥿","𝔡":"𝔡","⇃":"⇃","⇂":"⇂","⋄":"⋄","⋄":"⋄","♦":"♦","♦":"♦","¨":"¨","ϝ":"ϝ","⋲":"⋲","÷":"÷","÷":"÷","÷":"÷","⋇":"⋇","⋇":"⋇","ђ":"ђ","⌞":"⌞","⌍":"⌍","$":"$","𝕕":"𝕕","˙":"˙","≐":"≐","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌆":"⌆","↓":"↓","⇊":"⇊","⇃":"⇃","⇂":"⇂","⤐":"⤐","⌟":"⌟","⌌":"⌌","𝒹":"𝒹","ѕ":"ѕ","⧶":"⧶","đ":"đ","⋱":"⋱","▿":"▿","▾":"▾","⇵":"⇵","⥯":"⥯","⦦":"⦦","џ":"џ","⟿":"⟿","⩷":"⩷","≑":"≑","é":"é","é":"é","⩮":"⩮","ě":"ě","≖":"≖","ê":"ê","ê":"ê","≕":"≕","э":"э","ė":"ė","ⅇ":"ⅇ","≒":"≒","𝔢":"𝔢","⪚":"⪚","è":"è","è":"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧","ℓ":"ℓ","⪕":"⪕","⪗":"⪗","ē":"ē","∅":"∅","∅":"∅","∅":"∅"," ":" "," ":" "," ":" ","ŋ":"ŋ"," ":" ","ę":"ę","𝕖":"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱","ε":"ε","ε":"ε","ϵ":"ϵ","≖":"≖","≕":"≕","≂":"≂","⪖":"⪖","⪕":"⪕","=":"=","≟":"≟","≡":"≡","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱","ℯ":"ℯ","≐":"≐","≂":"≂","η":"η","ð":"ð","ð":"ð","ë":"ë","ë":"ë","€":"€","!":"!","∃":"∃","ℰ":"ℰ","ⅇ":"ⅇ","≒":"≒","ф":"ф","♀":"♀","ffi":"ffi","ff":"ff","ffl":"ffl","𝔣":"𝔣","fi":"fi","fj":"fj","♭":"♭","fl":"fl","▱":"▱","ƒ":"ƒ","𝕗":"𝕗","∀":"∀","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","½":"½","⅓":"⅓","¼":"¼","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢","𝒻":"𝒻","≧":"≧","⪌":"⪌","ǵ":"ǵ","γ":"γ","ϝ":"ϝ","⪆":"⪆","ğ":"ğ","ĝ":"ĝ","г":"г","ġ":"ġ","≥":"≥","⋛":"⋛","≥":"≥","≧":"≧","⩾":"⩾","⩾":"⩾","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔","𝔤":"𝔤","≫":"≫","⋙":"⋙","ℷ":"ℷ","ѓ":"ѓ","≷":"≷","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪊":"⪊","⪈":"⪈","⪈":"⪈","≩":"≩","⋧":"⋧","𝕘":"𝕘","`":"`","ℊ":"ℊ","≳":"≳","⪎":"⪎","⪐":"⪐",">":">",">":">","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⪆":"⪆","⥸":"⥸","⋗":"⋗","⋛":"⋛","⪌":"⪌","≷":"≷","≳":"≳","≩︀":"≩︀","≩︀":"≩︀","⇔":"⇔"," ":" ","½":"½","ℋ":"ℋ","ъ":"ъ","↔":"↔","⥈":"⥈","↭":"↭","ℏ":"ℏ","ĥ":"ĥ","♥":"♥","♥":"♥","…":"…","⊹":"⊹","𝔥":"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪","𝕙":"𝕙","―":"―","𝒽":"𝒽","ℏ":"ℏ","ħ":"ħ","⁃":"⁃","‐":"‐","í":"í","í":"í","⁣":"⁣","î":"î","î":"î","и":"и","е":"е","¡":"¡","¡":"¡","⇔":"⇔","𝔦":"𝔦","ì":"ì","ì":"ì","ⅈ":"ⅈ","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩","ij":"ij","ī":"ī","ℑ":"ℑ","ℐ":"ℐ","ℑ":"ℑ","ı":"ı","⊷":"⊷","Ƶ":"Ƶ","∈":"∈","℅":"℅","∞":"∞","⧝":"⧝","ı":"ı","∫":"∫","⊺":"⊺","ℤ":"ℤ","⊺":"⊺","⨗":"⨗","⨼":"⨼","ё":"ё","į":"į","𝕚":"𝕚","ι":"ι","⨼":"⨼","¿":"¿","¿":"¿","𝒾":"𝒾","∈":"∈","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳","∈":"∈","⁢":"⁢","ĩ":"ĩ","і":"і","ï":"ï","ï":"ï","ĵ":"ĵ","й":"й","𝔧":"𝔧","ȷ":"ȷ","𝕛":"𝕛","𝒿":"𝒿","ј":"ј","є":"є","κ":"κ","ϰ":"ϰ","ķ":"ķ","к":"к","𝔨":"𝔨","ĸ":"ĸ","х":"х","ќ":"ќ","𝕜":"𝕜","𝓀":"𝓀","⇚":"⇚","⇐":"⇐","⤛":"⤛","⤎":"⤎","≦":"≦","⪋":"⪋","⥢":"⥢","ĺ":"ĺ","⦴":"⦴","ℒ":"ℒ","λ":"λ","⟨":"⟨","⦑":"⦑","⟨":"⟨","⪅":"⪅","«":"«","«":"«","←":"←","⇤":"⇤","⤟":"⤟","⤝":"⤝","↩":"↩","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍","ľ":"ľ","ļ":"ļ","⌈":"⌈","{":"{","л":"л","⤶":"⤶","“":"“","„":"„","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","←":"←","↢":"↢","↽":"↽","↼":"↼","⇇":"⇇","↔":"↔","⇆":"⇆","⇋":"⇋","↭":"↭","⋋":"⋋","⋚":"⋚","≤":"≤","≦":"≦","⩽":"⩽","⩽":"⩽","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⪅":"⪅","⋖":"⋖","⋚":"⋚","⪋":"⪋","≶":"≶","≲":"≲","⥼":"⥼","⌊":"⌊","𝔩":"𝔩","≶":"≶","⪑":"⪑","↽":"↽","↼":"↼","⥪":"⥪","▄":"▄","љ":"љ","≪":"≪","⇇":"⇇","⌞":"⌞","⥫":"⥫","◺":"◺","ŀ":"ŀ","⎰":"⎰","⎰":"⎰","≨":"≨","⪉":"⪉","⪉":"⪉","⪇":"⪇","⪇":"⪇","≨":"≨","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟦":"⟦","⟵":"⟵","⟷":"⟷","⟼":"⟼","⟶":"⟶","↫":"↫","↬":"↬","⦅":"⦅","𝕝":"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","_":"_","◊":"◊","◊":"◊","⧫":"⧫","(":"(","⦓":"⦓","⇆":"⇆","⌟":"⌟","⇋":"⇋","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹","𝓁":"𝓁","↰":"↰","≲":"≲","⪍":"⪍","⪏":"⪏","[":"[","‘":"‘","‚":"‚","ł":"ł","<":"<","<":"<","⪦":"⪦","⩹":"⩹","⋖":"⋖","⋋":"⋋","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⊴":"⊴","◂":"◂","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","≨︀":"≨︀","∺":"∺","¯":"¯","¯":"¯","♂":"♂","✠":"✠","✠":"✠","↦":"↦","↦":"↦","↧":"↧","↤":"↤","↥":"↥","▮":"▮","⨩":"⨩","м":"м","—":"—","∡":"∡","𝔪":"𝔪","℧":"℧","µ":"µ","µ":"µ","∣":"∣","*":"*","⫰":"⫰","·":"·","·":"·","−":"−","⊟":"⊟","∸":"∸","⨪":"⨪","⫛":"⫛","…":"…","∓":"∓","⊧":"⊧","𝕞":"𝕞","∓":"∓","𝓂":"𝓂","∾":"∾","μ":"μ","⊸":"⊸","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","≫̸":"≫̸","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","≪̸":"≪̸","⇏":"⇏","⊯":"⊯","⊮":"⊮","∇":"∇","ń":"ń","∠⃒":"∠⃒","≉":"≉","⩰̸":"⩰̸","≋̸":"≋̸","ʼn":"ʼn","≉":"≉","♮":"♮","♮":"♮","ℕ":"ℕ"," ":" "," ":" ","≎̸":"≎̸","≏̸":"≏̸","⩃":"⩃","ň":"ň","ņ":"ņ","≇":"≇","⩭̸":"⩭̸","⩂":"⩂","н":"н","–":"–","≠":"≠","⇗":"⇗","⤤":"⤤","↗":"↗","↗":"↗","≐̸":"≐̸","≢":"≢","⤨":"⤨","≂̸":"≂̸","∄":"∄","∄":"∄","𝔫":"𝔫","≧̸":"≧̸","≱":"≱","≱":"≱","≧̸":"≧̸","⩾̸":"⩾̸","⩾̸":"⩾̸","≵":"≵","≯":"≯","≯":"≯","⇎":"⇎","↮":"↮","⫲":"⫲","∋":"∋","⋼":"⋼","⋺":"⋺","∋":"∋","њ":"њ","⇍":"⇍","≦̸":"≦̸","↚":"↚","‥":"‥","≰":"≰","↚":"↚","↮":"↮","≰":"≰","≦̸":"≦̸","⩽̸":"⩽̸","⩽̸":"⩽̸","≮":"≮","≴":"≴","≮":"≮","⋪":"⋪","⋬":"⋬","∤":"∤","𝕟":"𝕟","¬":"¬","¬":"¬","∉":"∉","⋹̸":"⋹̸","⋵̸":"⋵̸","∉":"∉","⋷":"⋷","⋶":"⋶","∌":"∌","∌":"∌","⋾":"⋾","⋽":"⋽","∦":"∦","∦":"∦","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","⊀":"⊀","⋠":"⋠","⪯̸":"⪯̸","⊀":"⊀","⪯̸":"⪯̸","⇏":"⇏","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸","↛":"↛","⋫":"⋫","⋭":"⋭","⊁":"⊁","⋡":"⋡","⪰̸":"⪰̸","𝓃":"𝓃","∤":"∤","∦":"∦","≁":"≁","≄":"≄","≄":"≄","∤":"∤","∦":"∦","⋢":"⋢","⋣":"⋣","⊄":"⊄","⫅̸":"⫅̸","⊈":"⊈","⊂⃒":"⊂⃒","⊈":"⊈","⫅̸":"⫅̸","⊁":"⊁","⪰̸":"⪰̸","⊅":"⊅","⫆̸":"⫆̸","⊉":"⊉","⊃⃒":"⊃⃒","⊉":"⊉","⫆̸":"⫆̸","≹":"≹","ñ":"ñ","ñ":"ñ","≸":"≸","⋪":"⋪","⋬":"⋬","⋫":"⋫","⋭":"⋭","ν":"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","↖":"↖","↖":"↖","⤧":"⤧","Ⓢ":"Ⓢ","ó":"ó","ó":"ó","⊛":"⊛","⊚":"⊚","ô":"ô","ô":"ô","о":"о","⊝":"⊝","ő":"ő","⨸":"⨸","⊙":"⊙","⦼":"⦼","œ":"œ","⦿":"⦿","𝔬":"𝔬","˛":"˛","ò":"ò","ò":"ò","⧁":"⧁","⦵":"⦵","Ω":"Ω","∮":"∮","↺":"↺","⦾":"⦾","⦻":"⦻","‾":"‾","⧀":"⧀","ō":"ō","ω":"ω","ο":"ο","⦶":"⦶","⊖":"⊖","𝕠":"𝕠","⦷":"⦷","⦹":"⦹","⊕":"⊕","∨":"∨","↻":"↻","⩝":"⩝","ℴ":"ℴ","ℴ":"ℴ","ª":"ª","ª":"ª","º":"º","º":"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛","ℴ":"ℴ","ø":"ø","ø":"ø","⊘":"⊘","õ":"õ","õ":"õ","⊗":"⊗","⨶":"⨶","ö":"ö","ö":"ö","⌽":"⌽","∥":"∥","¶":"¶","¶":"¶","∥":"∥","⫳":"⫳","⫽":"⫽","∂":"∂","п":"п","%":"%",".":".","‰":"‰","⊥":"⊥","‱":"‱","𝔭":"𝔭","φ":"φ","ϕ":"ϕ","ℳ":"ℳ","☎":"☎","π":"π","⋔":"⋔","ϖ":"ϖ","ℏ":"ℏ","ℎ":"ℎ","ℏ":"ℏ","+":"+","⨣":"⨣","⊞":"⊞","⨢":"⨢","∔":"∔","⨥":"⨥","⩲":"⩲","±":"±","±":"±","⨦":"⨦","⨧":"⨧","±":"±","⨕":"⨕","𝕡":"𝕡","£":"£","£":"£","≺":"≺","⪳":"⪳","⪷":"⪷","≼":"≼","⪯":"⪯","≺":"≺","⪷":"⪷","≼":"≼","⪯":"⪯","⪹":"⪹","⪵":"⪵","⋨":"⋨","≾":"≾","′":"′","ℙ":"ℙ","⪵":"⪵","⪹":"⪹","⋨":"⋨","∏":"∏","⌮":"⌮","⌒":"⌒","⌓":"⌓","∝":"∝","∝":"∝","≾":"≾","⊰":"⊰","𝓅":"𝓅","ψ":"ψ"," ":" ","𝔮":"𝔮","⨌":"⨌","𝕢":"𝕢","⁗":"⁗","𝓆":"𝓆","ℍ":"ℍ","⨖":"⨖","?":"?","≟":"≟",""":'"',""":'"',"⇛":"⇛","⇒":"⇒","⤜":"⤜","⤏":"⤏","⥤":"⥤","∽̱":"∽̱","ŕ":"ŕ","√":"√","⦳":"⦳","⟩":"⟩","⦒":"⦒","⦥":"⦥","⟩":"⟩","»":"»","»":"»","→":"→","⥵":"⥵","⇥":"⇥","⤠":"⤠","⤳":"⤳","⤞":"⤞","↪":"↪","↬":"↬","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","ℚ":"ℚ","⤍":"⤍","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐","ř":"ř","ŗ":"ŗ","⌉":"⌉","}":"}","р":"р","⤷":"⤷","⥩":"⥩","”":"”","”":"”","↳":"↳","ℜ":"ℜ","ℛ":"ℛ","ℜ":"ℜ","ℝ":"ℝ","▭":"▭","®":"®","®":"®","⥽":"⥽","⌋":"⌋","𝔯":"𝔯","⇁":"⇁","⇀":"⇀","⥬":"⥬","ρ":"ρ","ϱ":"ϱ","→":"→","↣":"↣","⇁":"⇁","⇀":"⇀","⇄":"⇄","⇌":"⇌","⇉":"⇉","↝":"↝","⋌":"⋌","˚":"˚","≓":"≓","⇄":"⇄","⇌":"⇌","‏":"‏","⎱":"⎱","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⟧":"⟧","⦆":"⦆","𝕣":"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","⇉":"⇉","›":"›","𝓇":"𝓇","↱":"↱","]":"]","’":"’","’":"’","⋌":"⋌","⋊":"⋊","▹":"▹","⊵":"⊵","▸":"▸","⧎":"⧎","⥨":"⥨","℞":"℞","ś":"ś","‚":"‚","≻":"≻","⪴":"⪴","⪸":"⪸","š":"š","≽":"≽","⪰":"⪰","ş":"ş","ŝ":"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓","≿":"≿","с":"с","⋅":"⋅","⊡":"⊡","⩦":"⩦","⇘":"⇘","⤥":"⤥","↘":"↘","↘":"↘","§":"§","§":"§",";":";","⤩":"⤩","∖":"∖","∖":"∖","✶":"✶","𝔰":"𝔰","⌢":"⌢","♯":"♯","щ":"щ","ш":"ш","∣":"∣","∥":"∥","­":"­","­":"­","σ":"σ","ς":"ς","ς":"ς","∼":"∼","⩪":"⩪","≃":"≃","≃":"≃","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","←":"←","∖":"∖","⨳":"⨳","⧤":"⧤","∣":"∣","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀","ь":"ь","/":"/","⧄":"⧄","⌿":"⌿","𝕤":"𝕤","♠":"♠","♠":"♠","∥":"∥","⊓":"⊓","⊓︀":"⊓︀","⊔":"⊔","⊔︀":"⊔︀","⊏":"⊏","⊑":"⊑","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊐":"⊐","⊒":"⊒","□":"□","□":"□","▪":"▪","▪":"▪","→":"→","𝓈":"𝓈","∖":"∖","⌣":"⌣","⋆":"⋆","☆":"☆","★":"★","ϵ":"ϵ","ϕ":"ϕ","¯":"¯","⊂":"⊂","⫅":"⫅","⪽":"⪽","⊆":"⊆","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⊂":"⊂","⊆":"⊆","⫅":"⫅","⊊":"⊊","⫋":"⫋","⫇":"⫇","⫕":"⫕","⫓":"⫓","≻":"≻","⪸":"⪸","≽":"≽","⪰":"⪰","⪺":"⪺","⪶":"⪶","⋩":"⋩","≿":"≿","∑":"∑","♪":"♪","¹":"¹","¹":"¹","²":"²","²":"²","³":"³","³":"³","⊃":"⊃","⫆":"⫆","⪾":"⪾","⫘":"⫘","⊇":"⊇","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⊃":"⊃","⊇":"⊇","⫆":"⫆","⊋":"⊋","⫌":"⫌","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤦":"⤦","↙":"↙","↙":"↙","⤪":"⤪","ß":"ß","ß":"ß","⌖":"⌖","τ":"τ","⎴":"⎴","ť":"ť","ţ":"ţ","т":"т","⃛":"⃛","⌕":"⌕","𝔱":"𝔱","∴":"∴","∴":"∴","θ":"θ","ϑ":"ϑ","ϑ":"ϑ","≈":"≈","∼":"∼"," ":" ","≈":"≈","∼":"∼","þ":"þ","þ":"þ","˜":"˜","×":"×","×":"×","⊠":"⊠","⨱":"⨱","⨰":"⨰","∭":"∭","⤨":"⤨","⊤":"⊤","⌶":"⌶","⫱":"⫱","𝕥":"𝕥","⫚":"⫚","⤩":"⤩","‴":"‴","™":"™","▵":"▵","▿":"▿","◃":"◃","⊴":"⊴","≜":"≜","▹":"▹","⊵":"⊵","◬":"◬","≜":"≜","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢","𝓉":"𝓉","ц":"ц","ћ":"ћ","ŧ":"ŧ","≬":"≬","↞":"↞","↠":"↠","⇑":"⇑","⥣":"⥣","ú":"ú","ú":"ú","↑":"↑","ў":"ў","ŭ":"ŭ","û":"û","û":"û","у":"у","⇅":"⇅","ű":"ű","⥮":"⥮","⥾":"⥾","𝔲":"𝔲","ù":"ù","ù":"ù","↿":"↿","↾":"↾","▀":"▀","⌜":"⌜","⌜":"⌜","⌏":"⌏","◸":"◸","ū":"ū","¨":"¨","¨":"¨","ų":"ų","𝕦":"𝕦","↑":"↑","↕":"↕","↿":"↿","↾":"↾","⊎":"⊎","υ":"υ","ϒ":"ϒ","υ":"υ","⇈":"⇈","⌝":"⌝","⌝":"⌝","⌎":"⌎","ů":"ů","◹":"◹","𝓊":"𝓊","⋰":"⋰","ũ":"ũ","▵":"▵","▴":"▴","⇈":"⇈","ü":"ü","ü":"ü","⦧":"⦧","⇕":"⇕","⫨":"⫨","⫩":"⫩","⊨":"⊨","⦜":"⦜","ϵ":"ϵ","ϰ":"ϰ","∅":"∅","ϕ":"ϕ","ϖ":"ϖ","∝":"∝","↕":"↕","ϱ":"ϱ","ς":"ς","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀","ϑ":"ϑ","⊲":"⊲","⊳":"⊳","в":"в","⊢":"⊢","∨":"∨","⊻":"⊻","≚":"≚","⋮":"⋮","|":"|","|":"|","𝔳":"𝔳","⊲":"⊲","⊂⃒":"⊂⃒","⊃⃒":"⊃⃒","𝕧":"𝕧","∝":"∝","⊳":"⊳","𝓋":"𝓋","⫋︀":"⫋︀","⊊︀":"⊊︀","⫌︀":"⫌︀","⊋︀":"⊋︀","⦚":"⦚","ŵ":"ŵ","⩟":"⩟","∧":"∧","≙":"≙","℘":"℘","𝔴":"𝔴","𝕨":"𝕨","℘":"℘","≀":"≀","≀":"≀","𝓌":"𝓌","⋂":"⋂","◯":"◯","⋃":"⋃","▽":"▽","𝔵":"𝔵","⟺":"⟺","⟷":"⟷","ξ":"ξ","⟸":"⟸","⟵":"⟵","⟼":"⟼","⋻":"⋻","⨀":"⨀","𝕩":"𝕩","⨁":"⨁","⨂":"⨂","⟹":"⟹","⟶":"⟶","𝓍":"𝓍","⨆":"⨆","⨄":"⨄","△":"△","⋁":"⋁","⋀":"⋀","ý":"ý","ý":"ý","я":"я","ŷ":"ŷ","ы":"ы","¥":"¥","¥":"¥","𝔶":"𝔶","ї":"ї","𝕪":"𝕪","𝓎":"𝓎","ю":"ю","ÿ":"ÿ","ÿ":"ÿ","ź":"ź","ž":"ž","з":"з","ż":"ż","ℨ":"ℨ","ζ":"ζ","𝔷":"𝔷","ж":"ж","⇝":"⇝","𝕫":"𝕫","𝓏":"𝓏","‍":"‍","‌":"‌"},characters:{Æ:"Æ","&":"&",Á:"Á",Ă:"Ă",Â:"Â",А:"А",𝔄:"𝔄",À:"À",Α:"Α",Ā:"Ā","⩓":"⩓",Ą:"Ą",𝔸:"𝔸","⁡":"⁡",Å:"Å",𝒜:"𝒜","≔":"≔",Ã:"Ã",Ä:"Ä","∖":"∖","⫧":"⫧","⌆":"⌆",Б:"Б","∵":"∵",ℬ:"ℬ",Β:"Β",𝔅:"𝔅",𝔹:"𝔹","˘":"˘","≎":"≎",Ч:"Ч","©":"©",Ć:"Ć","⋒":"⋒",ⅅ:"ⅅ",ℭ:"ℭ",Č:"Č",Ç:"Ç",Ĉ:"Ĉ","∰":"∰",Ċ:"Ċ","¸":"¸","·":"·",Χ:"Χ","⊙":"⊙","⊖":"⊖","⊕":"⊕","⊗":"⊗","∲":"∲","”":"”","’":"’","∷":"∷","⩴":"⩴","≡":"≡","∯":"∯","∮":"∮",ℂ:"ℂ","∐":"∐","∳":"∳","⨯":"⨯",𝒞:"𝒞","⋓":"⋓","≍":"≍","⤑":"⤑",Ђ:"Ђ",Ѕ:"Ѕ",Џ:"Џ","‡":"‡","↡":"↡","⫤":"⫤",Ď:"Ď",Д:"Д","∇":"∇",Δ:"Δ",𝔇:"𝔇","´":"´","˙":"˙","˝":"˝","`":"`","˜":"˜","⋄":"⋄",ⅆ:"ⅆ",𝔻:"𝔻","¨":"¨","⃜":"⃜","≐":"≐","⇓":"⇓","⇐":"⇐","⇔":"⇔","⟸":"⟸","⟺":"⟺","⟹":"⟹","⇒":"⇒","⊨":"⊨","⇑":"⇑","⇕":"⇕","∥":"∥","↓":"↓","⤓":"⤓","⇵":"⇵","̑":"̑","⥐":"⥐","⥞":"⥞","↽":"↽","⥖":"⥖","⥟":"⥟","⇁":"⇁","⥗":"⥗","⊤":"⊤","↧":"↧",𝒟:"𝒟",Đ:"Đ",Ŋ:"Ŋ",Ð:"Ð",É:"É",Ě:"Ě",Ê:"Ê",Э:"Э",Ė:"Ė",𝔈:"𝔈",È:"È","∈":"∈",Ē:"Ē","◻":"◻","▫":"▫",Ę:"Ę",𝔼:"𝔼",Ε:"Ε","⩵":"⩵","≂":"≂","⇌":"⇌",ℰ:"ℰ","⩳":"⩳",Η:"Η",Ë:"Ë","∃":"∃",ⅇ:"ⅇ",Ф:"Ф",𝔉:"𝔉","◼":"◼","▪":"▪",𝔽:"𝔽","∀":"∀",ℱ:"ℱ",Ѓ:"Ѓ",">":">",Γ:"Γ",Ϝ:"Ϝ",Ğ:"Ğ",Ģ:"Ģ",Ĝ:"Ĝ",Г:"Г",Ġ:"Ġ",𝔊:"𝔊","⋙":"⋙",𝔾:"𝔾","≥":"≥","⋛":"⋛","≧":"≧","⪢":"⪢","≷":"≷","⩾":"⩾","≳":"≳",𝒢:"𝒢","≫":"≫",Ъ:"Ъ",ˇ:"ˇ","^":"^",Ĥ:"Ĥ",ℌ:"ℌ",ℋ:"ℋ",ℍ:"ℍ","─":"─",Ħ:"Ħ","≏":"≏",Е:"Е",IJ:"IJ",Ё:"Ё",Í:"Í",Î:"Î",И:"И",İ:"İ",ℑ:"ℑ",Ì:"Ì",Ī:"Ī",ⅈ:"ⅈ","∬":"∬","∫":"∫","⋂":"⋂","⁣":"⁣","⁢":"⁢",Į:"Į",𝕀:"𝕀",Ι:"Ι",ℐ:"ℐ",Ĩ:"Ĩ",І:"І",Ï:"Ï",Ĵ:"Ĵ",Й:"Й",𝔍:"𝔍",𝕁:"𝕁",𝒥:"𝒥",Ј:"Ј",Є:"Є",Х:"Х",Ќ:"Ќ",Κ:"Κ",Ķ:"Ķ",К:"К",𝔎:"𝔎",𝕂:"𝕂",𝒦:"𝒦",Љ:"Љ","<":"<",Ĺ:"Ĺ",Λ:"Λ","⟪":"⟪",ℒ:"ℒ","↞":"↞",Ľ:"Ľ",Ļ:"Ļ",Л:"Л","⟨":"⟨","←":"←","⇤":"⇤","⇆":"⇆","⌈":"⌈","⟦":"⟦","⥡":"⥡","⇃":"⇃","⥙":"⥙","⌊":"⌊","↔":"↔","⥎":"⥎","⊣":"⊣","↤":"↤","⥚":"⥚","⊲":"⊲","⧏":"⧏","⊴":"⊴","⥑":"⥑","⥠":"⥠","↿":"↿","⥘":"⥘","↼":"↼","⥒":"⥒","⋚":"⋚","≦":"≦","≶":"≶","⪡":"⪡","⩽":"⩽","≲":"≲",𝔏:"𝔏","⋘":"⋘","⇚":"⇚",Ŀ:"Ŀ","⟵":"⟵","⟷":"⟷","⟶":"⟶",𝕃:"𝕃","↙":"↙","↘":"↘","↰":"↰",Ł:"Ł","≪":"≪","⤅":"⤅",М:"М"," ":" ",ℳ:"ℳ",𝔐:"𝔐","∓":"∓",𝕄:"𝕄",Μ:"Μ",Њ:"Њ",Ń:"Ń",Ň:"Ň",Ņ:"Ņ",Н:"Н","​":"​","\n":" ",𝔑:"𝔑","⁠":"⁠"," ":" ",ℕ:"ℕ","⫬":"⫬","≢":"≢","≭":"≭","∦":"∦","∉":"∉","≠":"≠","≂̸":"≂̸","∄":"∄","≯":"≯","≱":"≱","≧̸":"≧̸","≫̸":"≫̸","≹":"≹","⩾̸":"⩾̸","≵":"≵","≎̸":"≎̸","≏̸":"≏̸","⋪":"⋪","⧏̸":"⧏̸","⋬":"⋬","≮":"≮","≰":"≰","≸":"≸","≪̸":"≪̸","⩽̸":"⩽̸","≴":"≴","⪢̸":"⪢̸","⪡̸":"⪡̸","⊀":"⊀","⪯̸":"⪯̸","⋠":"⋠","∌":"∌","⋫":"⋫","⧐̸":"⧐̸","⋭":"⋭","⊏̸":"⊏̸","⋢":"⋢","⊐̸":"⊐̸","⋣":"⋣","⊂⃒":"⊂⃒","⊈":"⊈","⊁":"⊁","⪰̸":"⪰̸","⋡":"⋡","≿̸":"≿̸","⊃⃒":"⊃⃒","⊉":"⊉","≁":"≁","≄":"≄","≇":"≇","≉":"≉","∤":"∤",𝒩:"𝒩",Ñ:"Ñ",Ν:"Ν",Œ:"Œ",Ó:"Ó",Ô:"Ô",О:"О",Ő:"Ő",𝔒:"𝔒",Ò:"Ò",Ō:"Ō",Ω:"Ω",Ο:"Ο",𝕆:"𝕆","“":"“","‘":"‘","⩔":"⩔",𝒪:"𝒪",Ø:"Ø",Õ:"Õ","⨷":"⨷",Ö:"Ö","‾":"‾","⏞":"⏞","⎴":"⎴","⏜":"⏜","∂":"∂",П:"П",𝔓:"𝔓",Φ:"Φ",Π:"Π","±":"±",ℙ:"ℙ","⪻":"⪻","≺":"≺","⪯":"⪯","≼":"≼","≾":"≾","″":"″","∏":"∏","∝":"∝",𝒫:"𝒫",Ψ:"Ψ",'"':""",𝔔:"𝔔",ℚ:"ℚ",𝒬:"𝒬","⤐":"⤐","®":"®",Ŕ:"Ŕ","⟫":"⟫","↠":"↠","⤖":"⤖",Ř:"Ř",Ŗ:"Ŗ",Р:"Р",ℜ:"ℜ","∋":"∋","⇋":"⇋","⥯":"⥯",Ρ:"Ρ","⟩":"⟩","→":"→","⇥":"⇥","⇄":"⇄","⌉":"⌉","⟧":"⟧","⥝":"⥝","⇂":"⇂","⥕":"⥕","⌋":"⌋","⊢":"⊢","↦":"↦","⥛":"⥛","⊳":"⊳","⧐":"⧐","⊵":"⊵","⥏":"⥏","⥜":"⥜","↾":"↾","⥔":"⥔","⇀":"⇀","⥓":"⥓",ℝ:"ℝ","⥰":"⥰","⇛":"⇛",ℛ:"ℛ","↱":"↱","⧴":"⧴",Щ:"Щ",Ш:"Ш",Ь:"Ь",Ś:"Ś","⪼":"⪼",Š:"Š",Ş:"Ş",Ŝ:"Ŝ",С:"С",𝔖:"𝔖","↑":"↑",Σ:"Σ","∘":"∘",𝕊:"𝕊","√":"√","□":"□","⊓":"⊓","⊏":"⊏","⊑":"⊑","⊐":"⊐","⊒":"⊒","⊔":"⊔",𝒮:"𝒮","⋆":"⋆","⋐":"⋐","⊆":"⊆","≻":"≻","⪰":"⪰","≽":"≽","≿":"≿","∑":"∑","⋑":"⋑","⊃":"⊃","⊇":"⊇",Þ:"Þ","™":"™",Ћ:"Ћ",Ц:"Ц","\t":" ",Τ:"Τ",Ť:"Ť",Ţ:"Ţ",Т:"Т",𝔗:"𝔗","∴":"∴",Θ:"Θ","  ":"  "," ":" ","∼":"∼","≃":"≃","≅":"≅","≈":"≈",𝕋:"𝕋","⃛":"⃛",𝒯:"𝒯",Ŧ:"Ŧ",Ú:"Ú","↟":"↟","⥉":"⥉",Ў:"Ў",Ŭ:"Ŭ",Û:"Û",У:"У",Ű:"Ű",𝔘:"𝔘",Ù:"Ù",Ū:"Ū",_:"_","⏟":"⏟","⎵":"⎵","⏝":"⏝","⋃":"⋃","⊎":"⊎",Ų:"Ų",𝕌:"𝕌","⤒":"⤒","⇅":"⇅","↕":"↕","⥮":"⥮","⊥":"⊥","↥":"↥","↖":"↖","↗":"↗",ϒ:"ϒ",Υ:"Υ",Ů:"Ů",𝒰:"𝒰",Ũ:"Ũ",Ü:"Ü","⊫":"⊫","⫫":"⫫",В:"В","⊩":"⊩","⫦":"⫦","⋁":"⋁","‖":"‖","∣":"∣","|":"|","❘":"❘","≀":"≀"," ":" ",𝔙:"𝔙",𝕍:"𝕍",𝒱:"𝒱","⊪":"⊪",Ŵ:"Ŵ","⋀":"⋀",𝔚:"𝔚",𝕎:"𝕎",𝒲:"𝒲",𝔛:"𝔛",Ξ:"Ξ",𝕏:"𝕏",𝒳:"𝒳",Я:"Я",Ї:"Ї",Ю:"Ю",Ý:"Ý",Ŷ:"Ŷ",Ы:"Ы",𝔜:"𝔜",𝕐:"𝕐",𝒴:"𝒴",Ÿ:"Ÿ",Ж:"Ж",Ź:"Ź",Ž:"Ž",З:"З",Ż:"Ż",Ζ:"Ζ",ℨ:"ℨ",ℤ:"ℤ",𝒵:"𝒵",á:"á",ă:"ă","∾":"∾","∾̳":"∾̳","∿":"∿",â:"â",а:"а",æ:"æ",𝔞:"𝔞",à:"à",ℵ:"ℵ",α:"α",ā:"ā","⨿":"⨿","∧":"∧","⩕":"⩕","⩜":"⩜","⩘":"⩘","⩚":"⩚","∠":"∠","⦤":"⦤","∡":"∡","⦨":"⦨","⦩":"⦩","⦪":"⦪","⦫":"⦫","⦬":"⦬","⦭":"⦭","⦮":"⦮","⦯":"⦯","∟":"∟","⊾":"⊾","⦝":"⦝","∢":"∢","⍼":"⍼",ą:"ą",𝕒:"𝕒","⩰":"⩰","⩯":"⩯","≊":"≊","≋":"≋","'":"'",å:"å",𝒶:"𝒶","*":"*",ã:"ã",ä:"ä","⨑":"⨑","⫭":"⫭","≌":"≌","϶":"϶","‵":"‵","∽":"∽","⋍":"⋍","⊽":"⊽","⌅":"⌅","⎶":"⎶",б:"б","„":"„","⦰":"⦰",β:"β",ℶ:"ℶ","≬":"≬",𝔟:"𝔟","◯":"◯","⨀":"⨀","⨁":"⨁","⨂":"⨂","⨆":"⨆","★":"★","▽":"▽","△":"△","⨄":"⨄","⤍":"⤍","⧫":"⧫","▴":"▴","▾":"▾","◂":"◂","▸":"▸","␣":"␣","▒":"▒","░":"░","▓":"▓","█":"█","=⃥":"=⃥","≡⃥":"≡⃥","⌐":"⌐",𝕓:"𝕓","⋈":"⋈","╗":"╗","╔":"╔","╖":"╖","╓":"╓","═":"═","╦":"╦","╩":"╩","╤":"╤","╧":"╧","╝":"╝","╚":"╚","╜":"╜","╙":"╙","║":"║","╬":"╬","╣":"╣","╠":"╠","╫":"╫","╢":"╢","╟":"╟","⧉":"⧉","╕":"╕","╒":"╒","┐":"┐","┌":"┌","╥":"╥","╨":"╨","┬":"┬","┴":"┴","⊟":"⊟","⊞":"⊞","⊠":"⊠","╛":"╛","╘":"╘","┘":"┘","└":"└","│":"│","╪":"╪","╡":"╡","╞":"╞","┼":"┼","┤":"┤","├":"├","¦":"¦",𝒷:"𝒷","⁏":"⁏","\\":"\","⧅":"⧅","⟈":"⟈","•":"•","⪮":"⪮",ć:"ć","∩":"∩","⩄":"⩄","⩉":"⩉","⩋":"⩋","⩇":"⩇","⩀":"⩀","∩︀":"∩︀","⁁":"⁁","⩍":"⩍",č:"č",ç:"ç",ĉ:"ĉ","⩌":"⩌","⩐":"⩐",ċ:"ċ","⦲":"⦲","¢":"¢",𝔠:"𝔠",ч:"ч","✓":"✓",χ:"χ","○":"○","⧃":"⧃",ˆ:"ˆ","≗":"≗","↺":"↺","↻":"↻","Ⓢ":"Ⓢ","⊛":"⊛","⊚":"⊚","⊝":"⊝","⨐":"⨐","⫯":"⫯","⧂":"⧂","♣":"♣",":":":",",":",","@":"@","∁":"∁","⩭":"⩭",𝕔:"𝕔","℗":"℗","↵":"↵","✗":"✗",𝒸:"𝒸","⫏":"⫏","⫑":"⫑","⫐":"⫐","⫒":"⫒","⋯":"⋯","⤸":"⤸","⤵":"⤵","⋞":"⋞","⋟":"⋟","↶":"↶","⤽":"⤽","∪":"∪","⩈":"⩈","⩆":"⩆","⩊":"⩊","⊍":"⊍","⩅":"⩅","∪︀":"∪︀","↷":"↷","⤼":"⤼","⋎":"⋎","⋏":"⋏","¤":"¤","∱":"∱","⌭":"⌭","⥥":"⥥","†":"†",ℸ:"ℸ","‐":"‐","⤏":"⤏",ď:"ď",д:"д","⇊":"⇊","⩷":"⩷","°":"°",δ:"δ","⦱":"⦱","⥿":"⥿",𝔡:"𝔡","♦":"♦",ϝ:"ϝ","⋲":"⋲","÷":"÷","⋇":"⋇",ђ:"ђ","⌞":"⌞","⌍":"⌍",$:"$",𝕕:"𝕕","≑":"≑","∸":"∸","∔":"∔","⊡":"⊡","⌟":"⌟","⌌":"⌌",𝒹:"𝒹",ѕ:"ѕ","⧶":"⧶",đ:"đ","⋱":"⋱","▿":"▿","⦦":"⦦",џ:"џ","⟿":"⟿",é:"é","⩮":"⩮",ě:"ě","≖":"≖",ê:"ê","≕":"≕",э:"э",ė:"ė","≒":"≒",𝔢:"𝔢","⪚":"⪚",è:"è","⪖":"⪖","⪘":"⪘","⪙":"⪙","⏧":"⏧",ℓ:"ℓ","⪕":"⪕","⪗":"⪗",ē:"ē","∅":"∅"," ":" "," ":" "," ":" ",ŋ:"ŋ"," ":" ",ę:"ę",𝕖:"𝕖","⋕":"⋕","⧣":"⧣","⩱":"⩱",ε:"ε",ϵ:"ϵ","=":"=","≟":"≟","⩸":"⩸","⧥":"⧥","≓":"≓","⥱":"⥱",ℯ:"ℯ",η:"η",ð:"ð",ë:"ë","€":"€","!":"!",ф:"ф","♀":"♀",ffi:"ffi",ff:"ff",ffl:"ffl",𝔣:"𝔣",fi:"fi",fj:"fj","♭":"♭",fl:"fl","▱":"▱",ƒ:"ƒ",𝕗:"𝕗","⋔":"⋔","⫙":"⫙","⨍":"⨍","½":"½","⅓":"⅓","¼":"¼","⅕":"⅕","⅙":"⅙","⅛":"⅛","⅔":"⅔","⅖":"⅖","¾":"¾","⅗":"⅗","⅜":"⅜","⅘":"⅘","⅚":"⅚","⅝":"⅝","⅞":"⅞","⁄":"⁄","⌢":"⌢",𝒻:"𝒻","⪌":"⪌",ǵ:"ǵ",γ:"γ","⪆":"⪆",ğ:"ğ",ĝ:"ĝ",г:"г",ġ:"ġ","⪩":"⪩","⪀":"⪀","⪂":"⪂","⪄":"⪄","⋛︀":"⋛︀","⪔":"⪔",𝔤:"𝔤",ℷ:"ℷ",ѓ:"ѓ","⪒":"⪒","⪥":"⪥","⪤":"⪤","≩":"≩","⪊":"⪊","⪈":"⪈","⋧":"⋧",𝕘:"𝕘",ℊ:"ℊ","⪎":"⪎","⪐":"⪐","⪧":"⪧","⩺":"⩺","⋗":"⋗","⦕":"⦕","⩼":"⩼","⥸":"⥸","≩︀":"≩︀",ъ:"ъ","⥈":"⥈","↭":"↭",ℏ:"ℏ",ĥ:"ĥ","♥":"♥","…":"…","⊹":"⊹",𝔥:"𝔥","⤥":"⤥","⤦":"⤦","⇿":"⇿","∻":"∻","↩":"↩","↪":"↪",𝕙:"𝕙","―":"―",𝒽:"𝒽",ħ:"ħ","⁃":"⁃",í:"í",î:"î",и:"и",е:"е","¡":"¡",𝔦:"𝔦",ì:"ì","⨌":"⨌","∭":"∭","⧜":"⧜","℩":"℩",ij:"ij",ī:"ī",ı:"ı","⊷":"⊷",Ƶ:"Ƶ","℅":"℅","∞":"∞","⧝":"⧝","⊺":"⊺","⨗":"⨗","⨼":"⨼",ё:"ё",į:"į",𝕚:"𝕚",ι:"ι","¿":"¿",𝒾:"𝒾","⋹":"⋹","⋵":"⋵","⋴":"⋴","⋳":"⋳",ĩ:"ĩ",і:"і",ï:"ï",ĵ:"ĵ",й:"й",𝔧:"𝔧",ȷ:"ȷ",𝕛:"𝕛",𝒿:"𝒿",ј:"ј",є:"є",κ:"κ",ϰ:"ϰ",ķ:"ķ",к:"к",𝔨:"𝔨",ĸ:"ĸ",х:"х",ќ:"ќ",𝕜:"𝕜",𝓀:"𝓀","⤛":"⤛","⤎":"⤎","⪋":"⪋","⥢":"⥢",ĺ:"ĺ","⦴":"⦴",λ:"λ","⦑":"⦑","⪅":"⪅","«":"«","⤟":"⤟","⤝":"⤝","↫":"↫","⤹":"⤹","⥳":"⥳","↢":"↢","⪫":"⪫","⤙":"⤙","⪭":"⪭","⪭︀":"⪭︀","⤌":"⤌","❲":"❲","{":"{","[":"[","⦋":"⦋","⦏":"⦏","⦍":"⦍",ľ:"ľ",ļ:"ļ",л:"л","⤶":"⤶","⥧":"⥧","⥋":"⥋","↲":"↲","≤":"≤","⇇":"⇇","⋋":"⋋","⪨":"⪨","⩿":"⩿","⪁":"⪁","⪃":"⪃","⋚︀":"⋚︀","⪓":"⪓","⋖":"⋖","⥼":"⥼",𝔩:"𝔩","⪑":"⪑","⥪":"⥪","▄":"▄",љ:"љ","⥫":"⥫","◺":"◺",ŀ:"ŀ","⎰":"⎰","≨":"≨","⪉":"⪉","⪇":"⪇","⋦":"⋦","⟬":"⟬","⇽":"⇽","⟼":"⟼","↬":"↬","⦅":"⦅",𝕝:"𝕝","⨭":"⨭","⨴":"⨴","∗":"∗","◊":"◊","(":"(","⦓":"⦓","⥭":"⥭","‎":"‎","⊿":"⊿","‹":"‹",𝓁:"𝓁","⪍":"⪍","⪏":"⪏","‚":"‚",ł:"ł","⪦":"⪦","⩹":"⩹","⋉":"⋉","⥶":"⥶","⩻":"⩻","⦖":"⦖","◃":"◃","⥊":"⥊","⥦":"⥦","≨︀":"≨︀","∺":"∺","¯":"¯","♂":"♂","✠":"✠","▮":"▮","⨩":"⨩",м:"м","—":"—",𝔪:"𝔪","℧":"℧",µ:"µ","⫰":"⫰","−":"−","⨪":"⨪","⫛":"⫛","⊧":"⊧",𝕞:"𝕞",𝓂:"𝓂",μ:"μ","⊸":"⊸","⋙̸":"⋙̸","≫⃒":"≫⃒","⇍":"⇍","⇎":"⇎","⋘̸":"⋘̸","≪⃒":"≪⃒","⇏":"⇏","⊯":"⊯","⊮":"⊮",ń:"ń","∠⃒":"∠⃒","⩰̸":"⩰̸","≋̸":"≋̸",ʼn:"ʼn","♮":"♮","⩃":"⩃",ň:"ň",ņ:"ņ","⩭̸":"⩭̸","⩂":"⩂",н:"н","–":"–","⇗":"⇗","⤤":"⤤","≐̸":"≐̸","⤨":"⤨",𝔫:"𝔫","↮":"↮","⫲":"⫲","⋼":"⋼","⋺":"⋺",њ:"њ","≦̸":"≦̸","↚":"↚","‥":"‥",𝕟:"𝕟","¬":"¬","⋹̸":"⋹̸","⋵̸":"⋵̸","⋷":"⋷","⋶":"⋶","⋾":"⋾","⋽":"⋽","⫽⃥":"⫽⃥","∂̸":"∂̸","⨔":"⨔","↛":"↛","⤳̸":"⤳̸","↝̸":"↝̸",𝓃:"𝓃","⊄":"⊄","⫅̸":"⫅̸","⊅":"⊅","⫆̸":"⫆̸",ñ:"ñ",ν:"ν","#":"#","№":"№"," ":" ","⊭":"⊭","⤄":"⤄","≍⃒":"≍⃒","⊬":"⊬","≥⃒":"≥⃒",">⃒":">⃒","⧞":"⧞","⤂":"⤂","≤⃒":"≤⃒","<⃒":"<⃒","⊴⃒":"⊴⃒","⤃":"⤃","⊵⃒":"⊵⃒","∼⃒":"∼⃒","⇖":"⇖","⤣":"⤣","⤧":"⤧",ó:"ó",ô:"ô",о:"о",ő:"ő","⨸":"⨸","⦼":"⦼",œ:"œ","⦿":"⦿",𝔬:"𝔬","˛":"˛",ò:"ò","⧁":"⧁","⦵":"⦵","⦾":"⦾","⦻":"⦻","⧀":"⧀",ō:"ō",ω:"ω",ο:"ο","⦶":"⦶",𝕠:"𝕠","⦷":"⦷","⦹":"⦹","∨":"∨","⩝":"⩝",ℴ:"ℴ",ª:"ª",º:"º","⊶":"⊶","⩖":"⩖","⩗":"⩗","⩛":"⩛",ø:"ø","⊘":"⊘",õ:"õ","⨶":"⨶",ö:"ö","⌽":"⌽","¶":"¶","⫳":"⫳","⫽":"⫽",п:"п","%":"%",".":".","‰":"‰","‱":"‱",𝔭:"𝔭",φ:"φ",ϕ:"ϕ","☎":"☎",π:"π",ϖ:"ϖ",ℎ:"ℎ","+":"+","⨣":"⨣","⨢":"⨢","⨥":"⨥","⩲":"⩲","⨦":"⨦","⨧":"⨧","⨕":"⨕",𝕡:"𝕡","£":"£","⪳":"⪳","⪷":"⪷","⪹":"⪹","⪵":"⪵","⋨":"⋨","′":"′","⌮":"⌮","⌒":"⌒","⌓":"⌓","⊰":"⊰",𝓅:"𝓅",ψ:"ψ"," ":" ",𝔮:"𝔮",𝕢:"𝕢","⁗":"⁗",𝓆:"𝓆","⨖":"⨖","?":"?","⤜":"⤜","⥤":"⥤","∽̱":"∽̱",ŕ:"ŕ","⦳":"⦳","⦒":"⦒","⦥":"⦥","»":"»","⥵":"⥵","⤠":"⤠","⤳":"⤳","⤞":"⤞","⥅":"⥅","⥴":"⥴","↣":"↣","↝":"↝","⤚":"⤚","∶":"∶","❳":"❳","}":"}","]":"]","⦌":"⦌","⦎":"⦎","⦐":"⦐",ř:"ř",ŗ:"ŗ",р:"р","⤷":"⤷","⥩":"⥩","↳":"↳","▭":"▭","⥽":"⥽",𝔯:"𝔯","⥬":"⥬",ρ:"ρ",ϱ:"ϱ","⇉":"⇉","⋌":"⋌","˚":"˚","‏":"‏","⎱":"⎱","⫮":"⫮","⟭":"⟭","⇾":"⇾","⦆":"⦆",𝕣:"𝕣","⨮":"⨮","⨵":"⨵",")":")","⦔":"⦔","⨒":"⨒","›":"›",𝓇:"𝓇","⋊":"⋊","▹":"▹","⧎":"⧎","⥨":"⥨","℞":"℞",ś:"ś","⪴":"⪴","⪸":"⪸",š:"š",ş:"ş",ŝ:"ŝ","⪶":"⪶","⪺":"⪺","⋩":"⋩","⨓":"⨓",с:"с","⋅":"⋅","⩦":"⩦","⇘":"⇘","§":"§",";":";","⤩":"⤩","✶":"✶",𝔰:"𝔰","♯":"♯",щ:"щ",ш:"ш","­":"­",σ:"σ",ς:"ς","⩪":"⩪","⪞":"⪞","⪠":"⪠","⪝":"⪝","⪟":"⪟","≆":"≆","⨤":"⨤","⥲":"⥲","⨳":"⨳","⧤":"⧤","⌣":"⌣","⪪":"⪪","⪬":"⪬","⪬︀":"⪬︀",ь:"ь","/":"/","⧄":"⧄","⌿":"⌿",𝕤:"𝕤","♠":"♠","⊓︀":"⊓︀","⊔︀":"⊔︀",𝓈:"𝓈","☆":"☆","⊂":"⊂","⫅":"⫅","⪽":"⪽","⫃":"⫃","⫁":"⫁","⫋":"⫋","⊊":"⊊","⪿":"⪿","⥹":"⥹","⫇":"⫇","⫕":"⫕","⫓":"⫓","♪":"♪","¹":"¹","²":"²","³":"³","⫆":"⫆","⪾":"⪾","⫘":"⫘","⫄":"⫄","⟉":"⟉","⫗":"⫗","⥻":"⥻","⫂":"⫂","⫌":"⫌","⊋":"⊋","⫀":"⫀","⫈":"⫈","⫔":"⫔","⫖":"⫖","⇙":"⇙","⤪":"⤪",ß:"ß","⌖":"⌖",τ:"τ",ť:"ť",ţ:"ţ",т:"т","⌕":"⌕",𝔱:"𝔱",θ:"θ",ϑ:"ϑ",þ:"þ","×":"×","⨱":"⨱","⨰":"⨰","⌶":"⌶","⫱":"⫱",𝕥:"𝕥","⫚":"⫚","‴":"‴","▵":"▵","≜":"≜","◬":"◬","⨺":"⨺","⨹":"⨹","⧍":"⧍","⨻":"⨻","⏢":"⏢",𝓉:"𝓉",ц:"ц",ћ:"ћ",ŧ:"ŧ","⥣":"⥣",ú:"ú",ў:"ў",ŭ:"ŭ",û:"û",у:"у",ű:"ű","⥾":"⥾",𝔲:"𝔲",ù:"ù","▀":"▀","⌜":"⌜","⌏":"⌏","◸":"◸",ū:"ū",ų:"ų",𝕦:"𝕦",υ:"υ","⇈":"⇈","⌝":"⌝","⌎":"⌎",ů:"ů","◹":"◹",𝓊:"𝓊","⋰":"⋰",ũ:"ũ",ü:"ü","⦧":"⦧","⫨":"⫨","⫩":"⫩","⦜":"⦜","⊊︀":"⊊︀","⫋︀":"⫋︀","⊋︀":"⊋︀","⫌︀":"⫌︀",в:"в","⊻":"⊻","≚":"≚","⋮":"⋮",𝔳:"𝔳",𝕧:"𝕧",𝓋:"𝓋","⦚":"⦚",ŵ:"ŵ","⩟":"⩟","≙":"≙",℘:"℘",𝔴:"𝔴",𝕨:"𝕨",𝓌:"𝓌",𝔵:"𝔵",ξ:"ξ","⋻":"⋻",𝕩:"𝕩",𝓍:"𝓍",ý:"ý",я:"я",ŷ:"ŷ",ы:"ы","¥":"¥",𝔶:"𝔶",ї:"ї",𝕪:"𝕪",𝓎:"𝓎",ю:"ю",ÿ:"ÿ",ź:"ź",ž:"ž",з:"з",ż:"ż",ζ:"ζ",𝔷:"𝔷",ж:"ж","⇝":"⇝",𝕫:"𝕫",𝓏:"𝓏","‍":"‍","‌":"‌"}}}},687:(r,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.numericUnicodeMap={0:65533,128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376}},967:(r,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.fromCodePoint=String.fromCodePoint||function(r){return String.fromCharCode(Math.floor((r-65536)/1024)+55296,(r-65536)%1024+56320)},e.getCodePoint=String.prototype.codePointAt?function(r,e){return r.codePointAt(e)}:function(r,e){return 1024*(r.charCodeAt(e)-55296)+r.charCodeAt(e+1)-56320+65536},e.highSurrogateFrom=55296,e.highSurrogateTo=56319}},a={};function t(r){var o=a[r];if(void 0!==o)return o.exports;var c=a[r]={exports:{}};return e[r].call(c.exports,c,c.exports,t),c.exports}t.n=r=>{var e=r&&r.__esModule?()=>r.default:()=>r;return t.d(e,{a:e}),e},t.d=(r,e)=>{for(var a in e)t.o(e,a)&&!t.o(r,a)&&Object.defineProperty(r,a,{enumerable:!0,get:e[a]})},t.o=(r,e)=>Object.prototype.hasOwnProperty.call(r,e),r=t(563),window.html_encode=r.encode,window.html_decode=r.decode})(); \ No newline at end of file