From d00369f052217a327ae9ca226c713fd01a034621 Mon Sep 17 00:00:00 2001 From: KyMAN <0kyman0@gmail.com> Date: Wed, 31 Jan 2024 14:05:17 +0100 Subject: [PATCH] fix: Migrating project to the new Gitea Host. --- .gitignore | 3 + Artbook/logo.svg | 94 ++++++ Artbook/logo.xcf | Bin 0 -> 38464 bytes PHP/CSV2SQL.Secrets.php | 10 + Public/css/CSV2SQL.icons.css | 2 + Public/ecma/CSV2SQL.MySQL.ecma.js | 236 ++++++++++++++ Public/ecma/CSV2SQL.SQLServer.ecma.js | 245 +++++++++++++++ Public/ecma/CSV2SQL.ecma.js | 429 ++++++++++++++++++++++++++ Public/images/CSV2SQL-180.webp | Bin 0 -> 7924 bytes Public/images/CSV2SQL-192.webp | Bin 0 -> 7878 bytes Public/images/CSV2SQL-270.webp | Bin 0 -> 9746 bytes Public/images/CSV2SQL-32.webp | Bin 0 -> 1692 bytes Public/images/CSV2SQL-512.webp | Bin 0 -> 10826 bytes Public/images/CSV2SQL.webp | Bin 0 -> 10826 bytes Public/images/logo-180.png | Bin 0 -> 16016 bytes Public/images/logo-192.png | Bin 0 -> 13014 bytes Public/images/logo-270.png | Bin 0 -> 12705 bytes Public/images/logo-32.png | Bin 0 -> 2086 bytes Public/images/logo-512.png | Bin 0 -> 7201 bytes Public/images/logo.png | Bin 0 -> 7201 bytes Public/index.php | 103 +++++++ Public/json/CSV2SQL.i18n.english.json | 153 +++++++++ Public/json/CSV2SQL.i18n.espanol.json | 3 + Public/json/CSV2SQL.i18n.galego.json | 3 + Public/json/CSV2SQL.i18n.nihongo.json | 3 + Public/json/CSV2SQL.i18n.russkiy.json | 3 + Public/json/CSV2SQL.routes.json | 3 + Public/json/CSV2SQL.settings.json | 39 +++ Public/json/CSV2SQL.views.json | 31 ++ Public/scss/CSV2SQL.css | 4 + Public/scss/CSV2SQL.css.map | 7 + Public/scss/CSV2SQL.scss | 5 + 32 files changed, 1376 insertions(+) create mode 100755 .gitignore create mode 100755 Artbook/logo.svg create mode 100755 Artbook/logo.xcf create mode 100755 PHP/CSV2SQL.Secrets.php create mode 100755 Public/css/CSV2SQL.icons.css create mode 100755 Public/ecma/CSV2SQL.MySQL.ecma.js create mode 100755 Public/ecma/CSV2SQL.SQLServer.ecma.js create mode 100755 Public/ecma/CSV2SQL.ecma.js create mode 100755 Public/images/CSV2SQL-180.webp create mode 100755 Public/images/CSV2SQL-192.webp create mode 100755 Public/images/CSV2SQL-270.webp create mode 100755 Public/images/CSV2SQL-32.webp create mode 100755 Public/images/CSV2SQL-512.webp create mode 100755 Public/images/CSV2SQL.webp create mode 100755 Public/images/logo-180.png create mode 100755 Public/images/logo-192.png create mode 100755 Public/images/logo-270.png create mode 100755 Public/images/logo-32.png create mode 100755 Public/images/logo-512.png create mode 100755 Public/images/logo.png create mode 100755 Public/index.php create mode 100755 Public/json/CSV2SQL.i18n.english.json create mode 100755 Public/json/CSV2SQL.i18n.espanol.json create mode 100755 Public/json/CSV2SQL.i18n.galego.json create mode 100755 Public/json/CSV2SQL.i18n.nihongo.json create mode 100755 Public/json/CSV2SQL.i18n.russkiy.json create mode 100755 Public/json/CSV2SQL.routes.json create mode 100755 Public/json/CSV2SQL.settings.json create mode 100755 Public/json/CSV2SQL.views.json create mode 100755 Public/scss/CSV2SQL.css create mode 100755 Public/scss/CSV2SQL.css.map create mode 100755 Public/scss/CSV2SQL.scss diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..69a66f6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +Data +Public/data +CSV2SQL.apache2.conf diff --git a/Artbook/logo.svg b/Artbook/logo.svg new file mode 100755 index 0000000..774f308 --- /dev/null +++ b/Artbook/logo.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/Artbook/logo.xcf b/Artbook/logo.xcf new file mode 100755 index 0000000000000000000000000000000000000000..874cb22e3866e4ee59f5d8461a253de32ccaf13b GIT binary patch literal 38464 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 {}; + + this.start = callback => { + + const end = status => csv2sql.is_function(callback) && callback(status); + + if(started){ + end(false); + return false; + }; + started = true; + + tab = csv2sql.settings_get(["mysql_tabulation", "tabulation"]); + + self.add_reserved_words(csv2sql.settings_get("default_mysql_reserved_words"), () => { + self.add_reserved_words(csv2sql.settings_get("mysql_reserved_words"), () => { + end(true); + }); + }); + + return true; + }; + + this.add_reserved_words = (inputs, callback) => { + + let loaded = 0; + const total = (csv2sql.is_array(inputs) ? inputs : csv2sql.is_string(inputs) ? inputs = [inputs] : inputs = []).length, + end = () => ++ loaded == total && csv2sql.is_function(callback) && callback(); + + if(total){ + for(let i = 0; i < total; i ++){ + if(csv2sql.is_array(inputs[i])) + self.add_reserved_words(inputs[i], end); + else if(csv2sql.is_string(inputs[i]) && inputs[i]){ + if(['[', '{'].includes(inputs[i].trim()[0])){ + try{ + self.add_reserved_words(csv2sql.json_decode(inputs[i]), end); + }catch(exception){ + end(); + }; + continue; + }; + if(/^[a-z0-9_]+$/.test(inputs[i])){ + !reserved_words.includes(inputs[i]) && reserved_words.push(inputs[i]); + end(); + continue; + }; + csv2sql.ajax.get(inputs[i], response => { + try{ + self.add_reserved_words(csv2sql.json_decode(response), end); + }catch(exception){ + end(); + }; + }); + }else + end(); + }; + }else{ + loaded --; + end(); + }; + + }; + + const word = this.word = name => reserved_words.includes(name) ? "`" + name + "`" : name; + + this.database_creator = name => ( + "create database if not exists " + word(name) + " character set utf8mb4 collate utf8mb4_general_ci;\n" + + "use " + word(name) + ";" + ); + + this.table_remover = data => tab + tab + "drop table if exists " + word(data.table) + ";"; + + const attributes = attribute => ( + attribute.type == "varchar" ? attribute.length[0] == attribute.length[1] ? "char" : "varchar" : + attribute.type + ) + ( + attribute.type == "varchar" ? "(" + attribute.length[1] + ")" : + "" + ) + (attribute.null ? "" : " not null"); + + this.table_creator = data => { + + let sql = ""; + + data.id_attribute && (sql += "\n" + tab + tab + tab + "id integer not null auto_increment"); + + data.order.forEach(key => { + + const attribute = data.attributes[key]; + + sql += (sql ? "," : "") + "\n" + tab + tab + tab + word(key) + " " + attributes(attribute); + + }); + + data.deleted_attribute && (sql += ",\n" + tab + tab + tab + "deleted datetime"); + data.date_in_attribute && (sql += ",\n" + tab + tab + tab + "date_in datetime not null default now()"); + data.date_out_attribute && (sql += ",\n" + tab + tab + tab + "date_out datetime"); + + data.id_attribute && (sql += ",\n" + tab + tab + tab + "constraint " + csv2sql.to_snake(data.table) + "_id primary key(id)"); + + return tab + tab + "create table if not exists " + word(data.table) + "(" + sql + "\n" + tab + tab + ");" + }; + + this.table_updater = data => { + + let sql = ""; + + data.order.forEach(key => { + + const attribute = data.attributes[key]; + + sql += ((sql ? "\n\n" : "") + + tab + tab + "if (select 1 from information_schema.columns where table_schema = '" + data.database + "' && table_name = '" + data.table + "' && column_name = '" + key + "' limit 1) is null then \n" + + tab + tab + tab + "alter table " + word(data.table) + " add column " + word(key) + " " + attributes(attribute) + ";\n" + + tab + tab + "end if;" + ); + + }); + + data.deleted_attribute && (sql += ("\n\n" + + tab + tab + "if (select 1 from information_schema.columns where table_schema = '" + data.database + "' && table_name = '" + data.table + "' && column_name = 'deleted' limit 1) is null then \n" + + tab + tab + tab + "alter table " + word(data.table) + " add column deleted datetime;\n" + + tab + tab + "end if;" + )); + data.date_in_attribute && (sql += ("\n\n" + + tab + tab + "if (select 1 from information_schema.columns where table_schema = '" + data.database + "' && table_name = '" + data.table + "' && column_name = 'date_in' limit 1) is null then \n" + + tab + tab + tab + "alter table " + word(data.table) + " add column date_in datetime not null default now();\n" + + tab + tab + "end if;" + )); + data.date_out_attribute && (sql += ("\n\n" + + tab + tab + "if (select 1 from information_schema.columns where table_schema = '" + data.database + "' && table_name = '" + data.table + "' && column_name = 'date_out' limit 1) is null then \n" + + tab + tab + tab + "alter table " + word(data.table) + " add column date_out datetime;\n" + + tab + tab + "end if;" + )); + + return sql; + }; + + this.create_filler = data => { + + const header = "insert into " + word(data.table) + "(" + data.order.map(key => word(key)).join(", ") + ") values"; + let sql = ""; + + if(data.uniques.length){}else{ + + data.data.forEach(tuple => { + + let tuple_sql = ""; + + data.order.forEach(key => tuple_sql += (tuple_sql ? ", " : "") + ( + csv2sql.null_or_undefined(tuple[key]) ? "null" : + ["integer", "bigint", "float"].includes(data.attributes[key].type) ? tuple[key] : + ["bool"].includes(data.attributes[key].type) ? tuple[key] ? "true" : "false" : + "'" + tuple[key].replace(/([\\''])/g, "\\$1") + "'" + )); + + sql += (sql ? "," : "") + "\n" + tab + tab + tab + "(" + tuple_sql + ")"; + + }); + + sql = tab + tab + header + sql + ";"; + + }; + + return sql; + }; + + this.create_file = variables => { + + let sql = "", + callers = ""; + const key = variables.key ? variables.key + "_" : ""; + + sql += ( + (variables.creator_database ? variables.creator_database : "use " + word(variables.database) + ";") + "\n\n" + + "delimiter ;^" + ); + + if(variables.remover_tables){ + sql += ("\n\n" + + tab + "drop procedure if exists csv2sql_" + key + "tables_remove;^\n" + + tab + "create procedure csv2sql_" + key + "tables_remove() begin \n\n" + + variables.remover_tables + "\n\n" + + tab + "end;^" + ); + callers += "\n" + tab + "call csv2sql_" + key + "tables_remove();^"; + }; + + if(variables.creator_tables){ + sql += ("\n\n" + + tab + "drop procedure if exists csv2sql_" + key + "tables_create;^\n" + + tab + "create procedure csv2sql_" + key + "tables_create() begin \n\n" + + variables.creator_tables + "\n\n" + + tab + "end;^" + ); + callers += "\n" + tab + "call csv2sql_" + key + "tables_create();^"; + }; + + if(variables.updater_tables){ + sql += ("\n\n" + + tab + "drop procedure if exists csv2sql_" + key + "tables_update;^\n" + + tab + "create procedure csv2sql_" + key + "tables_update() begin \n\n" + + variables.updater_tables + "\n\n" + + tab + "end;^" + ); + callers += "\n" + tab + "call csv2sql_" + key + "tables_update();^"; + }; + + if(variables.filler_tables){ + sql += ("\n\n" + + tab + "drop procedure if exists csv2sql_" + key + "tables_fill;^\n" + + tab + "create procedure csv2sql_" + key + "tables_fill() begin \n\n" + + variables.filler_tables + "\n\n" + + tab + "end;^" + ); + callers += "\n" + tab + "call csv2sql_" + key + "tables_fill();^"; + }; + + callers && (sql += "\n" + callers); + + sql += "\n\ndelimiter ;"; + + return sql; + }; + + construct(); + +}; \ No newline at end of file diff --git a/Public/ecma/CSV2SQL.SQLServer.ecma.js b/Public/ecma/CSV2SQL.SQLServer.ecma.js new file mode 100755 index 0000000..035832c --- /dev/null +++ b/Public/ecma/CSV2SQL.SQLServer.ecma.js @@ -0,0 +1,245 @@ +CSV2SQL.SQLServer = function(csv2sql, input){ + + const self = this, + reserved_words = []; + let started = false, + tab; + + const construct = () => {}; + + this.start = callback => { + + const end = status => csv2sql.is_function(callback) && callback(status); + + if(started){ + end(false); + return false; + }; + started = true; + + tab = csv2sql.settings_get(["mysql_tabulation", "tabulation"]); + + self.add_reserved_words(csv2sql.settings_get("default_sql_server_reserved_words"), () => { + self.add_reserved_words(csv2sql.settings_get("sql_server_reserved_words"), () => { + end(true); + }); + }); + + return true; + }; + + this.add_reserved_words = (inputs, callback) => { + + let loaded = 0; + const total = (csv2sql.is_array(inputs) ? inputs : csv2sql.is_string(inputs) ? inputs = [inputs] : inputs = []).length, + end = () => ++ loaded == total && csv2sql.is_function(callback) && callback(); + + if(total){ + for(let i = 0; i < total; i ++){ + if(csv2sql.is_array(inputs[i])) + self.add_reserved_words(inputs[i], end); + else if(csv2sql.is_string(inputs[i]) && inputs[i]){ + if(['[', '{'].includes(inputs[i].trim()[0])){ + try{ + self.add_reserved_words(csv2sql.json_decode(inputs[i]), end); + }catch(exception){ + end(); + }; + continue; + }; + if(/^[a-z0-9_]+$/.test(inputs[i])){ + !reserved_words.includes(inputs[i]) && reserved_words.push(inputs[i]); + end(); + continue; + }; + csv2sql.ajax.get(inputs[i], response => { + try{ + self.add_reserved_words(csv2sql.json_decode(response), end); + }catch(exception){ + end(); + }; + }); + }else + end(); + }; + }else{ + loaded --; + end(); + }; + + }; + + const word = this.word = name => reserved_words.includes(name) ? "[" + name + "]" : name; + + this.database_creator = name => ( + "if (select top 1 1 from sys.databases where name = '" + name + "') is null create database " + word(name) + "\n" + + "go\n" + + "use " + word(name) + ); + + this.table_remover = data => tab + "if object_id(N'dbo." + data.table + "', N'U') is not null drop table dbo." + word(data.table); + + const attributes = attribute => ( + attribute.type == "varchar" ? attribute.length[0] == attribute.length[1] ? "char" : "varchar" : + attribute.type == "bool" ? "bit" : + attribute.type + ) + ( + attribute.type == "varchar" ? "(" + attribute.length[1] + ")" : + "" + ) + (attribute.null ? "" : " not null"); + + this.table_creator = data => { + + let sql = ""; + + data.id_attribute && (sql += "\n" + tab + tab + "id integer not null identity(1, 1)"); + + data.order.forEach(key => { + + const attribute = data.attributes[key]; + + sql += (sql ? "," : "") + "\n" + tab + tab + word(key) + " " + attributes(attribute); + + }); + + data.deleted_attribute && (sql += ",\n" + tab + tab + "deleted datetime"); + data.date_in_attribute && (sql += ",\n" + tab + tab + "date_in datetime not null constraint " + csv2sql.to_snake(data.table) + "_date_in default getdate()"); + data.date_out_attribute && (sql += ",\n" + tab + tab + "date_out datetime"); + + data.id_attribute && (sql += ",\n" + tab + tab + "constraint " + csv2sql.to_snake(data.table) + "_id primary key(id)"); + + return tab + "if object_id(N'dbo." + data.table + "', N'U') is null create table dbo." + word(data.table) + "(" + sql + "\n" + tab + ")" + }; + + this.table_updater = data => { + + let sql = ""; + + data.order.forEach(key => { + + const attribute = data.attributes[key]; + + sql += ((sql ? "\n\n" : "") + + tab + "if (select top 1 1 from information_schema.columns where table_catalog = '" + data.database + "' and table_name = '" + data.table + "' and column_name = '" + key + "') is null \n" + + tab + tab + "alter table " + word(data.table) + " add " + word(key) + " " + attributes(attribute) + ); + + }); + + data.deleted_attribute && (sql += ("\n\n" + + tab + "if (select top 1 1 from information_schema.columns where table_catalog = '" + data.database + "' and table_name = '" + data.table + "' and column_name = 'deleted') is null \n" + + tab + tab + "alter table " + word(data.table) + " add deleted datetime" + )); + data.date_in_attribute && (sql += ("\n\n" + + tab + "if (select top 1 1 from information_schema.columns where table_catalog = '" + data.database + "' and table_name = '" + data.table + "' and column_name = 'date_in') is null \n" + + tab + tab + "alter table " + word(data.table) + " add date_in datetime not null constraint " + csv2sql.to_snake(data.table) + "_date_in default getdate()" + )); + data.date_out_attribute && (sql += ("\n\n" + + tab + "if (select top 1 1 from information_schema.columns where table_catalog = '" + data.database + "' and table_name = '" + data.table + "' and column_name = 'date_out') is null \n" + + tab + tab + "alter table " + word(data.table) + " add date_out datetime" + )); + + return sql; + }; + + this.create_filler = data => { + + const header = "insert into dbo." + word(data.table) + "(" + data.order.map(key => word(key)).join(", ") + ") values"; + let sql = ""; + + if(data.uniques.length){}else{ + + let subsql = ""; + const division = csv2sql.settings_get("sql_server_insert_division"); + + data.data.forEach((tuple, i) => { + + let tuple_sql = ""; + + if(!(i % division)){ + subsql && (sql += (sql ? "\n" : "") + tab + header + subsql); + subsql = ""; + }; + + data.order.forEach(key => tuple_sql += (tuple_sql ? ", " : "") + ( + tuple[key] === null ? "null" : + ["integer", "bigint", "float"].includes(data.attributes[key].type) ? tuple[key] : + ["bool"].includes(data.attributes[key].type) ? tuple[key] ? "1" : "0" : + "'" + tuple[key].replace(/'/, "''") + "'" + )); + + subsql += (subsql ? "," : "") + "\n" + tab + tab + "(" + tuple_sql + ")"; + + }); + + subsql && (sql += (sql ? "\n" : "") + tab + header + subsql); + + }; + + return sql; + }; + + this.create_file = variables => { + + let sql = "", + callers = ""; + const key = variables.key ? variables.key + "_" : ""; + + sql += variables.creator_database ? variables.creator_database : "use " + word(variables.database); + + if(variables.remover_tables){ + sql += ("\n\n" + + "if object_id(N'dbo.csv2sql_" + key + "tables_remove', N'P') is not null drop procedure dbo.csv2sql_" + key + "tables_remove\n" + + "go\n" + + "create procedure dbo.csv2sql_" + key + "tables_remove as begin \n\n" + + variables.remover_tables + "\n\n" + + "end\n" + + "go" + ); + callers += "\nexecute dbo.csv2sql_" + key + "tables_remove"; + }; + + if(variables.creator_tables){ + sql += ("\n\n" + + "if object_id(N'dbo.csv2sql_" + key + "tables_create', N'P') is not null drop procedure dbo.csv2sql_" + key + "tables_create\n" + + "go\n" + + "create procedure dbo.csv2sql_" + key + "tables_create as begin \n\n" + + variables.creator_tables + "\n\n" + + "end\n" + + "go" + ); + callers += "\nexecute dbo.csv2sql_" + key + "tables_create"; + }; + + if(variables.updater_tables){ + sql += ("\n\n" + + "if object_id(N'dbo.csv2sql_" + key + "tables_update', N'P') is not null drop procedure dbo.csv2sql_" + key + "tables_update\n" + + "go\n" + + "create procedure dbo.csv2sql_" + key + "tables_update as begin \n\n" + + variables.updater_tables + "\n\n" + + "end\n" + + "go" + ); + callers += "\nexecute dbo.csv2sql_" + key + "tables_update"; + }; + + if(variables.filler_tables){ + sql += ("\n\n" + + "if object_id(N'dbo.csv2sql_" + key + "tables_fill', N'P') is not null drop procedure dbo.csv2sql_" + key + "tables_fill\n" + + "go\n" + + "create procedure dbo.csv2sql_" + key + "tables_fill as begin \n\n" + + variables.filler_tables + "\n\n" + + "end\n" + + "go" + ); + callers += "\nexecute dbo.csv2sql_" + key + "tables_fill"; + }; + + callers && (sql += "\n" + callers); + + return sql; + }; + + construct(); + +}; \ No newline at end of file diff --git a/Public/ecma/CSV2SQL.ecma.js b/Public/ecma/CSV2SQL.ecma.js new file mode 100755 index 0000000..cb68a0d --- /dev/null +++ b/Public/ecma/CSV2SQL.ecma.js @@ -0,0 +1,429 @@ +CSV2SQL = function(anp, input){ + + const self = this; + let started = false; + + let mysql = this.mysql; + let sql_server = this.sql_server; + + const construct = () => { + + CSV2SQL.MySQL && (mysql = self.mysql = new CSV2SQL.MySQL(self, input)); + CSV2SQL.SQLServer && (sql_server = self.sql_server = new CSV2SQL.SQLServer(self, input)); + + }; + + this.start = callback => { + + const end = status => csv2sql.is_function(callback) && callback(status); + + if(started){ + end(false); + return; + }; + started = true; + + self.launch(self, ["mysql", "sql_server"], () => { + end(true); + }); + + return true; + }; + + this.create_subforms = item => { + + const default_database = self.item_self.querySelector("[name=default_database]").value, + creator_database = self.item_self.querySelector("[name=default_creator_database]").checked, + remover_tables = self.item_self.querySelector("[name=default_remover_tables]").checked, + creator_tables = self.item_self.querySelector("[name=default_creator_tables]").checked, + updater_tables = self.item_self.querySelector("[name=default_updater_tables]").checked, + filler_tables = self.item_self.querySelector("[name=default_filler_tables]").checked, + uniques = self.item_self.querySelector("[name=default_uniques]").value, + id_attribute = self.item_self.querySelector("[name=default_id_attribute]").checked, + deleted_attribute = self.item_self.querySelector("[name=default_deleted_attribute]").checked, + date_in_attribute = self.item_self.querySelector("[name=default_date_in_attribute]").checked, + date_out_attribute = self.item_self.querySelector("[name=default_date_out_attribute]").checked, + fill_last_attribute = self.item_self.querySelector("[name=default_fill_last_attribute]").checked, + files = self.comp.files.get(item), + container = self.item_self.querySelector(".field[data-i18n=files_data] .content"); + + (self.comp.files.get(item) || []).forEach((file, i) => { + + if(file){ + + if(container.querySelector("[data-i='" + i + "']")) + return; + + const block = container.appendChild(document.createElement("div")); + let html; + + block.innerHTML = html = self.comp.forms.create({ + i18n : "file_data", + variables : { + i : i, + mime : file.mime, + name : file.name, + size : file.size + }, + structure : [ + {name : "database", type : "text", value : default_database}, + {name : "table", type : "text", value : (file.name[0].toUpperCase() + file.name.replace(/\.csv$/i, "").substr(1)).replace(/[^a-z0-9]+([a-z])?/gi, (...arguments) => (arguments[1] || "").toUpperCase())}, + {name : "creator_database", type : "checkbox", checked : creator_database}, + {name : "remover_tables", type : "checkbox", checked : remover_tables}, + {name : "creator_tables", type : "checkbox", checked : creator_tables}, + {name : "updater_tables", type : "checkbox", checked : updater_tables}, + {name : "filler_tables", type : "checkbox", checked : filler_tables}, + {name : "uniques", type : "text", value : uniques, multiline : true}, + {name : "id_attribute", type : "checkbox", checked : id_attribute}, + {name : "deleted_attribute", type : "checkbox", checked : deleted_attribute}, + {name : "date_in_attribute", type : "checkbox", checked : date_in_attribute}, + {name : "date_out_attribute", type : "checkbox", checked : date_out_attribute}, + {name : "fill_last_attribute", type : "checkbox", checked : fill_last_attribute} + ] + }); + block.setAttribute("data-i", i); + + }else{ + + const subform = container.querySelector("[data-i='" + i + "']"); + + subform && subform.remove(); + + }; + + }); + + }; + + const get_files_data = values => { + + const data = [], + default_database = csv2sql.item_self.querySelector("[name=default_database]").value; + + values.files.forEach((file, i) => { + if(!file) + return; + + const subform = csv2sql.item_self.querySelector(".field[data-i18n=files_data] .content [data-i='" + i + "']"), + fill_last_attribute = subform.querySelector("[name=fill_last_attribute]").checked; + + if(!subform) + return; + + const table = [], + tuples = csv2sql.utf8_decode(csv2sql.base64_decode(file.data)).split(/[\r\n]+/), + attributes = {}, + order = []; + let subdata = {}; + + tuples[0].replace(/(^|,)(\s*"([^"]+)"|([^,]+))?/gm, (...arguments) => { + + const name = arguments[3] || arguments[4] || ""; + + order.push(name); + attributes[name] = { + null : false, + type : "unknown", + length : [Number.MAX_SAFE_INTEGER, 0] + }; + + }); + + tuples.slice(1).forEach((tuple, k) => { + if(!tuple) + return; + + let j = 0; + + table.push({}); + + tuple.replace(/(^|,)(\s*"([^"]+)"|([^,]+))?/gm, (...arguments) => { + + let value = arguments[3] || arguments[4] || "", + name = order[j]; + const length = value.length, + type = ( + value == "NULL" ? "null" : + /^[0-9]+$/.test(value) && value.length < 13 ? "integer" : + /^[0-9]+$/.test(value) && value.length < 19 ? "bigint" : + /^(([0-9]+)?\.[0-9]+|[0-9]+\.)$/.test(value) && value.length < 18 ? "float" : + /^(true|false)$/i.test(value) ? "boolean" : + "varchar" + ), + is_null = value == "NULL"; + + if(!name){ + if(fill_last_attribute){ + name = order[order.length - 1]; + value = table[k][name] + "," + value; + }else{ + order.push(name = "column_" + j); + attributes[name] = { + type : "unknown", + length : [Number.MAX_SAFE_INTEGER, 0] + }; + // console.log([k, name, value]); + }; + }; + + if(!is_null){ + length < attributes[name].length[0] && (attributes[name].length[0] = length); + length > attributes[name].length[1] && (attributes[name].length[1] = length); + }; + + is_null && !attributes[name].null && (attributes[name].null = true); + + switch(attributes[name].type){ + case "unknown": + type != "null" && (attributes[name].type = type); + break; + case "integer": + ["float", "varchar"].includes(type) && (attributes[name].type = type); + break; + case "float": + case "boolean": + ["varchar"].includes(type) && (attributes[name].type = type); + break; + }; + + table[k][name] = value == "NULL" ? null : value; + + j ++; + + }); + + }); + + subdata = { + database : subform.querySelector("[name=database]").value || default_database, + table : subform.querySelector("[name=table]").value, + file_name : file.name, + data : table, + attributes : attributes, + order : order, + creator_database : values.files_data[i].creator_database, + uniques : (values.uniques + " " + values.files_data[i].uniques).trim() + }; + subdata.uniques = subdata.uniques ? subdata.uniques.split(/(\s|[\r\n])+/) : []; + + [ + "creator_database", "remover_tables", "creator_tables", + "updater_tables", "filler_tables", "id_attribute", + "deleted_attribute", "date_in_attribute", "date_out_attribute" + ].forEach(key => subdata[key] = values.files_data[i][key]); + + data.push(subdata); + + }); + + return data; + }; + + this.validate_string = (string, empty) => ( + string === undefined ? 1 << 0 : + string === null ? 1 << 1 : + !csv2sql.is_string(string) ? 1 << 2 : + !empty && !string ? 1 << 3 : + 0); + + this.validate_string_messages = key => [ + key + "_undefined", + key + "_null", + key + "_not_string", + key + "_empty" + ]; + + this.validate_files = (files, empty) => ( + files === undefined ? 1 << 0 : + files === null ? 1 << 1 : + !csv2sql.is_array(files) ? 1 << 2 : + !empty && !files.length ? 1 << 3 : + 0); + + this.validate_files_messages = key => [ + key + "_undefined", + key + "_null", + key + "_not_files", + key + "_empty" + ]; + + this.validate_bool = value => ( + value === undefined ? 1 << 0 : + value === null ? 1 << 1 : + !csv2sql.is_bool(value) ? 1 << 2 : + 0); + + this.validate_bool_messages = key => [ + key + "_undefined", + key + "_null", + key + "_not_bool" + ]; + + const validate = (values, conditions) => { + + const messages = ["exception"]; + let error = "", + i = 1, + ok; + + try{ + + conditions.forEach(([key, type, empty, extra]) => { + + const new_messages = self["validate_" + type + "_messages"](key), + new_error = self["validate_" + type](values[key], empty); + + error = csv2sql.errors.set(error, new_error, i, 0); + [].push.apply(messages, new_messages); + + i += new_messages.length; + + !new_error && extra && extra.forEach(([invalid, message]) => { + error = csv2sql.errors.set(error, invalid ? 1 << 0 : 0, i ++, 0); + messages.push(message); + }); + + }); + + }catch(exception){ + csv2sql.settings_get("process_exception_print") && console.error(exception); + ok = false; + error = csv2sql.errors.set(error, 1 << 0, 0, 0); + }; + + return [ok, error, messages]; + }; + + const process = item => { + + const [values, form] = csv2sql.comp.forms.get_values(item); + let [ok, error, messages] = validate(values, [ + ["default_database", "string", true], + ["type", "string", false, [ + [!["mysql", "sqlserver"].includes(values.type), "type_unkown"] + ]], + ["default_creator_database", "bool"], + ["default_remover_tables", "bool"], + ["default_creator_tables", "bool"], + ["default_updater_tables", "bool"], + ["default_filler_tables", "bool"], + ["default_uniques", "string", true], + ["default_id_attribute", "bool"], + ["default_deleted_attribute", "bool"], + ["default_date_in_attribute", "bool"], + ["default_date_out_attribute", "bool"], + ["default_fill_last_attribute", "bool"], + ["files", "files", false], + ["file_name", "string", true] + ]); + + if(ok = csv2sql.errors.validate(form, error, "main_menu_error", messages)){ + + values.files_data = {}; + + form.querySelectorAll(".field[data-i18n=files_data] .structure").forEach(structure => { + + const i_key = structure.parentNode.parentNode.getAttribute("data-i"), + [subvalues, subform] = csv2sql.comp.forms.get_values(structure, true); + let [subok, suberror, submessages] = validate(values, [ + ["database", "string", true, [ + [!values.default_database && !subvalues.database, "database_name_required"] + ]], + ["table", "string", false], + ["creator_database", "bool"], + ["remover_tables", "bool"], + ["creator_tables", "bool"], + ["updater_tables", "bool"], + ["filler_tables", "bool"], + ["uniques", "string", true], + ["id_attribute", "bool"], + ["deleted_attribute", "bool"], + ["date_in_attribute", "bool"], + ["date_out_attribute", "bool"], + ["fill_last_attribute", "bool"] + ]); + + subok = csv2sql.errors.validate(structure.parentNode, suberror, "file_menu_error", submessages, null, {file_name : values.files[i_key].name}); + + !subok && (ok = false); + + values.files_data[i_key] = subvalues; + + }); + + }; + + return [ok, values, form]; + }; + + this.download_files = (item, event) => { + + const [ok, values, form] = process(item); + + if(ok){ + + const zip = new JSZip(), + engine = self[values.type == "mysql" ? "mysql" : "sql_server"]; + + get_files_data(values).forEach(file => { + + zip.file(file.file_name.replace(/\.csv$/i, "." + (values.type == "mysql" ? "my" : "transact") + ".sql"), engine.create_file({ + database : file.database, + creator_database : file.creator_database ? engine.database_creator(file.database) : null, + remover_tables : file.remover_tables ? engine.table_remover(file) : null, + creator_tables : file.creator_tables ? engine.table_creator(file) : null, + updater_tables : file.updater_tables ? engine.table_updater(file) : null, + filler_tables : file.filler_tables ? engine.create_filler(file) : null, + key : self.to_snake(file.table) + })); + + }); + + console.log([values, get_files_data(values)]); + + // self.jszip_download(zip, values.file_name + ".zip"); + + }; + + }; + + this.download_one_file = (item, event) => { + + const [ok, values, form] = process(item); + + if(ok){ + + const engine = self[values.type == "mysql" ? "mysql" : "sql_server"]; + let creator = "", + remover = "", + updater = "", + filler = ""; + + get_files_data(values).forEach(file => { + file.remover_tables && (remover += (remover ? "\n" : "") + engine.table_remover(file)); + file.creator_tables && (creator += (creator ? "\n\n" : "") + engine.table_creator(file)); + file.updater_tables && (updater += (updater ? "\n\n" : "") + engine.table_updater(file)); + file.filler_tables && (filler += (filler ? "\n\n" : "") + engine.create_filler(file)); + }); + + self.download(engine.create_file({ + database : values.default_database, + creator_database : values.default_creator_database ? engine.database_creator(values.default_database) : null, + remover_tables : remover || null, + creator_tables : creator || null, + updater_tables : updater || null, + filler_tables : filler || null + }), "text/plain", values.file_name + "." + (values.type == "mysql" ? "my" : "transact") + ".sql"); + + }; + + }; + + this.to_snake = string => string.replace(/[^a-zA-Z0-9]+([a-zA-Z0-9])|([A-Z0-9]+)/g, (...arguments) => ( + arguments[1] ? "_" + arguments[1] : + "_" + arguments[2] + )).toLowerCase().replace(/^_+|_+$/g, ""); + + construct(); + +}; \ No newline at end of file diff --git a/Public/images/CSV2SQL-180.webp b/Public/images/CSV2SQL-180.webp new file mode 100755 index 0000000000000000000000000000000000000000..c6761af110b33c7459bd6ad0074672e8a60e93ab GIT binary patch literal 7924 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 o5wfa+gASkgSmj6Cm!@*Z&HG0y6vRDy68tn|W($ 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 literal 0 HcmV?d00001 diff --git a/Public/images/CSV2SQL.webp b/Public/images/CSV2SQL.webp new file mode 100755 index 0000000000000000000000000000000000000000..49ccd0eaac3311fdfe620bd0995e11158cc60bcd GIT binary patch literal 10826 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 literal 0 HcmV?d00001 diff --git a/Public/images/logo-180.png b/Public/images/logo-180.png new file mode 100755 index 0000000000000000000000000000000000000000..c5301f3f9730c133e85c2919fcedee1d56b5684d GIT binary patch literal 16016 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
_52P0b($ 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 literal 0 HcmV?d00001 diff --git a/Public/images/logo-192.png b/Public/images/logo-192.png new file mode 100755 index 0000000000000000000000000000000000000000..fdbe153ea42f26c7d42185b4b24d11eb3166634a GIT binary patch literal 13014 zcmW-o1z1#F7lrRghm@p<)PQtLmvnat64G7LEh+UOgLH~?Bi)S>5=w(K(w&n3@#hhF z97nkKo^$qI>s{MOH5J*%m`^bw2zo3pC#3S2Qc_J`Qj*Hq z)ydMv-U5Oc;{D@A(Mjg%cJ9Sw*H#d(K`VNg>myBRd|*~^IQDNC*Sy3 zGfzcbQncY=R~cRlIamZ@u7)0eW8clbeQy;W`^NG=ekGQq7QF*g9Zs!Po7JLR+fVH4 zhC2LCE;@GZQ|&JT-&Pf|S~aO~2g8ZuC7#llPpC^jCN{0L%}e<{7SP=zwtDqz9WkJd zLiheE(j%q2WSQg)-=wdz~B7 zvuBUYEC!8Ey*!OQogT7mE-#VN1Y8@$5)*{LvY?tO%1VK+;N!1kOCb1y;Vk$19R#t_ z{`-V^<%@ZM7t!40m8H=(A7MO(bBDM6mjGTObCcF{lXP-$uyAyPBwa1ux>=Z0dD^&H zQ_0FJtLeVSA%P$&NM7odme<_Azo(bh;b{iE{+j_8;wA7fjnv@_W4e?-GP>`H@ z*Tr^Qy=>U-3rq$vTCX-@wnxFA7#OIX-1L!)UHvWV5o}iy3d3| zJlF9p)i$mPevpxSC-e;()~_;wiC!%ut*@_py@?173!~=a)4gp$6&Hf)ew6D%!c1hH zBHV^l10rQY!%QqJz5h`N34axvsx-z$P&HNK+`tX$R^=v+G4ar;VB$(TI>aj3qOoaN zk&dm$GPO=iM*h~kK^71m0YPwgw}fgcHg;5F4RWWj%k4tbyYJt>7mWv0>z7+kS5WBJ z*`h!K5X}bW@*kq*&i6=K=s7Y5&dwaCr>Au_i;p;WQBYBv+bDUR7FjIsvnO!94;BRa zdwVAoI{Y5)E?rTM;HYv63MGl}iOX|x#D|dM7^Nb%wyYbNS`~ba@0_PAjW>VrExob3 ztM)#%9DrgYVWy_0Ugta7tWQ{U@J%w?eZ9OI)2^mVDR+M6D?Z~gmn*-BFb|UHhjJ5> zl5A6#r4gtIQt)zSTg#*^QE!LN9Y<4B(=)LEzw*lv@Ww$1O3BKqum}$PFw4)wQ|s|E zFa#F7BFCmJCM6?-TBww&@xq^qEC-((f{2NU!FSwmra=}7yBthp_B-lA+uggPLu#Zn zI=Eh0UN%8SLo4OWgqGc*xah>rp;Ajq)zrUX71ijSkP90#GgeRdcKt ziHT{bs33K9_3y*OTG`jAof6R1dV(q*KEC=Fu8v@SXf!(T-^zTJj95Kd=|Rxsp(8i& zQ1p34scE2Lld2^YjIhh;PZo^KeLYpgm*Wx-Gl(W;O^J{HY!N(NVn=g+e5}sgTCE@E z+4}+C(bsAKLcpHs-(2j!e)FcxBKQ&+sm!3ELgSE_kT5Un?xD1OyUuRd>8WK;$osVUq}tbqI?2<)4Acl_l!BTx3^n6wQz0p4)%gD9V)YKGFf5DMVp%=1mx@+7aD`i>EEXMU)@Bm7P7Q=8p>&(vjU9Cij zoMh(VfaUKlH|_}VQ97#j$qq6Po*H3S$~@5V`u6~ebWSfW=%J)fpR7}tF~Y7MHgJ-` zPSrpw((L00%e%e3y`yOi>0vI*yDWEyVO{MSKSaH>oBEEQG-SQaf}S@ z?d@%Eu~lzGObm7mIUml=`S&_L=qU>ss|MGRNO21J}X%Z?v0c!+FL(ww67+ zw3H29UCcZEGOeCzH~W67mGLdExsuo2Q97vKsX2=nM4UHiEor`jF z)oEIdPT#0qhOAS{YHiyeLx%7w9q&cW82nS2bc3`Ik1H<`fkCgF2KUfRx9j_y?${i; zva*86DP5j>9Ms~mukoZE{o7e`=;2$AR3&gokO$c2wrx9uV2Gm9PRRH2VA3OBKGoWs z{*9`nxOkADL0X8ZJ#V^z|FxU^Od^N-bAD%Wp;H4nUZNY;#7M`4B7>oi)`oSzbisCk z$Lr?M!Qor4ee+t4DXVyEMunsmLj+T7kV$TBIgbiT?h2w-UMYeHw&jQWa5RtJl|hmH-A*bmz6i^01l)5R9WiOggjzeE?hw< z5UID-`*cESxl)gB4{udXavG!eW?P^>(w`90*mfvF$HICN<)Vntoj`UzTJDnRLUwU+ z(VrV7z^r7_P|p3_Jw2^khP+?<$$4*v)7N_mP4s z2Tnx^3ux@cI~P0=pM|+IU_7iwv-5u9kii;o<~&tQ{&OAs^re;o3-K{0mN@RYK>UxU z_E+D0f02u4;dyHvvW(A=buKL#`^7+271SI-|0zGbOrN9u{S2-()8bi)7wAZpT9QPj zk}0TNSuQS!;r+lSO@$%CtY(0ao%rN>vG+OxI=-Ij?(WW*d~s!`U8<|VLnS38g}!>I zbkdq8fkPp}>*NXyDv{^|gkJXWTV?u}h;Zkv?I zD>b!`RQGb_Gw+r=VUJAI)YL-EfBf1)S3A^8kBr*=X3dy6r!1cg8~wljf0GV;OvWWepz1Fx zC--4)!dsu6xRIKvwJ4|54K#_=|M!uG{K#5ZrwPXgzt0w}!m3%qjHfWha_MMd7FO0t zt}Zbt*dgfG@=E7=dl)aam!J5ZZK+4J@_(I88&NpQ-I66^dmWc^a)?X!H{Iw0Egna$ zUd$kYUO6Qp;fqCZp9D504o*_9cAVusIzmi7tYMXviYf@w)6*-m2>zBQs@CzLgJPgZ zW2M~h$t=guU%%>bbHhbH+rE_kCYp=t?!cxQn+ZQ-5 z;KC2Lr@>eAc6?158X8Zv=X%l{bt{cndyq}@+XC*I;i8_B181m+a=EO@cQ#3kW2K8g zTIi{%<&=^p^hQ2;0mt_V8m25MCuR5Z-LX@6qH6c|?_YiT6vk`g0&N#|q)>#CPMng4 z1|mdTvVNzbvr}9|ccF~3Jd1!WAfZXtj$0!`A0$SyqH=Pm_Le$2VnSZ0^E&)Hzj`dhajLqme@`rW zzkO50JcFYixqX0Z8`Rr(WqK~!823(0pY6>)LBo9>+Gl#~waKj>q}J_Uq`N(*ME?Zn z#JKyr8zDItOj@f))~JyG%|%~j$9>ddoA31CyU@^3t@Ne}qc)~uRW9+q<^BD~(S5<- z%1qY3$J=&~B8?gSeRvMZLRYZP@`lAIP_h;RZuUV1eFZ*ZMMhf=+oQL(wrmCJfkayc zjVPILOJ1R>>drT<4$Z>ORbYKnw+^xbCr5*GvEG5)jx!9T#gBj(w5E_44-qTw7a9PyhIslce+W4x2M{ zPc5%r0W}lNyma^K8>al6oS~zgos(Z5T8h3@7I_zYb>-zU?=M)YmY5b=`$(YEn#c5T zv8{3KKcR_;#|lG}L!(aBdZGDSm_azu$cJ~Cg6)cyu}{hE%mrCnx7chy*US z%bwS4tv~idWaN03BPNx>_uGoz@YYu0 zmbP4+ZTavJ_sjSPaKqRXf)gr=QLRf|CLEwzX45AWYh3;q7{K>MFNC@2MoYH&UiPPQ zTj3EAg>`mzrcFH-MH;IKZ`mddBD1V{t>GYP27&Js8j6hlTv$(a<)xOa7Vrk>=;-3| z@&gvoXJ`c02!jMY_CD0s^3>Y=Dkv~6<_i*i={G6_vxgnE!RJxCAs`_=!gMY6se=fh zeM0qcBO{|p*D>y=v7l+0fj_{40w52VH5OEE(9rMHaTlH?;!DHNPYO=^OB#$wqOIXn z?#X8LQl0X#TxqQ1%8Yw*Oe9il)K5uCg52(?k#@Z-MuzK~n^+QJNIA4Yztk2Oe9pGs zPfTdJ?avXRhJ5bdI{|8kY|&Q3PV0wr$yLqC7YKljU* zefrh8tgAiZ6x)iua|F!K&(DN6{hy;*@I7qP597lOsw-gS*6-8XzT$z}Aaik-oR-rO zA(yQ&>IIK^2ampm-$jofRqL^g=+GHkXcH#H@dc^Eq$JinjBq4i3v6zz8!Z8lM&C|} z3NqDwctiv(A78^;?x0!w{u1rdqfR7TYYR(u2-V5yP(PbUj)s8&U0PbY3DReZaw)39 zp%4prCgO8er0()PleyeO9fp_l;l0ibFA3k&+32J1Y*utzWm|6x<*y-r+|Jzg{-L4L zshf@wQt=N&^9@eALiOtEd-^bOYiovGTX_~XHW@iNbSzBF3ZzCPUhXe^klW$n?}{g( z;o&r5Vjb=HZLhe^DnlKt7H~UBA!Vo(S_mA2vf!O zehGcvQ4CfFt5Q_PijR-~J}^++fo;N-TJ>&IWx;dFUq5U*F3;d6GB9VWkuS13lZ^xZ zws0{Ukubjk$LwQjY9ugR)8A%|_zyN1dyR}XpCaR{rf|SyzTkt4Z;&k`!$u_}Au08o z$uwPT^;U}(06%4Gx{^{Z*ZcI3UaMDiO{Hkr^=;nCC09@&l9%R|Mo$E8<*b@U9bXZH zlm4%A!xj(yN)<$_%1`6e@&!!o>cfkpY8Y-L)HUS z3MU<1*bCLH^}c8lLy=~6`Dt&;0UTRg{kIC0@kBZ9yHi*9H-~l$J7d6Ko$XGmwk*^m zoA8igUwmNqq<--NZS7m!x3rgbBRzk3kJGDg&bP*qJMYiEEG(_X`u$m^+U6HMx=RfxD%Ojw0@r8TA&$SBSN;<^ z_*dymJT#Ay#!xzW0TBp5=8zUP11e|I^JJ1)oPt_+#U$=j3JV7(T;nH0@Ol$w>ktfA zAND69Z`R(@$mscWxxu%>ET0l1I-FkxYmsqro9rF8xw;9jm&p*Klaa-E%;N3cuj`m{ zyX$*=xgpSmyfVD=tE%uoPhnwV8iYBs2WdflY@eDJ6w=V_C~RzOw#Gh7w$1G;=<49hKJ{(u#oPO`!J9^36zi=p zEU|c8QwyiS-9y9T&U1iz_OIz!4Rnr6+nRnjA;2a#VZ2W*Ed1}t zIyVn&Zf-^ZqutypYinCFOs)kRPT@o{`}UvvPHCQfZ#a?{rZ{8J8bn||I>|9%sa7*P zoSREi_`|gNlih_ugJb60#PrsWoC_5;=LF#9O0jCJ7>ZZ;Md_<7Y+*BolY_zD{;N zX@0oB>HF+9^VN9%Gx80RIB8IEY*P=~QSdDFfyNcUvgS4>p@5@&yO@aqW0^ zN5H7QVcX93JBjp>SDi|`Kz;laelV-@#%;AXQs%XnGw8>2nQzDW7U5!3vjU5fTxuE? zzqx|g2Uty!7yV9^lS9(e(n_9J$*U}|<)}Qn1?-6D>FVYA`6N9vapP+jTjT-Uj7AlJ zHhT7!bj||w^`9QL-#8YAkP{H(3VmrZfj<9zS(5qyipcoIFBR<$Va1u(MJq{aDEhC_U#!vFT_7 z=SEJc3H9HMn$(Ouk^xB{dYpuT-r-@Th@0!Hs|oV%rDk_#W%?)OI;AyG%B;fD2<_`K zktWl=D6UJtKdDv|$$rfK?`_E|AO@Z@M4t6v4mY*y`n-kh_%Oon?LE|z3zbTmI4QI3WP5i^WI2vXIoh1x?4hF%Pf)$2@sTpRunjZ}u!5Qf ztI6MD5gxy1MOhbto|g<&1hqf>(1e0vgk4E&>QZ$N%J}<^Au84JKwSc2*xTPvBP!ai zlt}sNHZn4@5m2cKAC`}D8X7#CR&`8G zb1!zc;pdNb=yt?$k1C~3r}P7oSYFc%XSJL1jAn}&_q)38OfUj1suSlifowr9@M--E z{7}Q(UboozmU%YVaA8*k!3n2?3n+Op@~@?U!dp;Ka8j5Z@U_DVpoFmD!l%!kj5@Ey z@(B(~5Y!o!`{+(RTG^oV<1w7e|2pwAs}hp;9olfZ0`4W zBYERKW#%fK%K~%JXP33sZd%1(Q2OtkuzccqAYJv^c42l!mGmEAPc}h^0)Du2Vc|_u zQc|;mfZlGE9t%&Z5(^{a+kgPkwY4=e5|VFYV`G>GnG>wS!Wp1tf1QewL8O+PMYhQW zNS|mTxa9|laU7yoh&~;zj3=DeXQJo zPp@3Z%hz{a^UE~y$?56J#s&(o7nwqy!Ei2a?)c2iSU{uA1`u?U&4F%iJUV51D>>|p zdblQEb4`%yySE(@N5x>I^nBerBzqT{`FPS{xBh28Lt1Z7hAfn-6kJU{#QYvPsIwlY ziFq#a6j+N!=aol}O&i3??u5OE31uEXcwPby>kMk?+19w^;Tb#h+#i(Qu(cHtrd5*M ztOhtEF0rTEe*#jxhV6c-#({Tr2De9_pQLE$b_iLGJgd;J8%%XO4>Pq1W@0FaCctw_ zgmGrQ_$B0E?0=qk;qzO4bZ~I>`h0iy6V>ilkdDk@h|$u9^!4@mOqJUs?xdH1{!{(| zNpsN*pOTv7U{P?&MxLU`|7#aNNR{R8^R#AM#BFRCM>7O^wtp3#0>E2|;KINy#Xp+R zRCPI7A5d|(>8lsh5ph9AMlQP9HK=O|W%^Zb4)Jk|$0Vf6FXw7}#h@WIs*!Nhe3KvR zW6Z|DupCb-dzJlg`)w_9acOC36yP*|_KKb;;H8v$9o}@~*C5w+uK>1B>rn z{rrRz5C}Mu7dp}z2{zRSV590Rctwd`aIF9NWBUCg^~D{mbh5-U{6U*QMBtpF9X#c= z)m46%RVfe!Wl&R7gUG;@eB9U9mz#rQ%<fMbUVOcx)7MLeWATMgNQfNhu6}U* zKYscI{|P@p;gI4A^4-7gK-vQR7ZW5FH^c4rvs}X&0-868$dF{>xF`QH(1)vux<=zh zOPKX@oe^)D|J$Efcc|8r3T6e=CgS(z-_uQ6M#f?d3wu?N{rpJh`|@sc2wc&t&Vz?97La`8LEWSM z8ln5q%v~y)*0Z0Aa~$IDE8yu^_~LOKJv}{jU#qOU6s#=?28>@eaqT{BQjm%6iHdum zZu_aZYB+(1o!5N9hOnp)l8$7;$KZSSN2#1hE?lZP6}C80uzz%N@^!v7+iMl0ATMug zpo@fXR9@)wRv)%*=a~=XfUKOTk}L5*AtA|oPrHv}%J7GRg-iL3%YMXO`Kd4}#CBTT ze%w!P+wb_<>gi&G6D82w`j)t_G^4N3Qr+jdFJO8`6*;;_-hE^)i63Khk}=D-a!NdX zb|vGbCNKRHJ6g_eqg68ayNZg6xcvFOj!fG2To8C7K`{CfG&S&oF0 zq}tv;5?vEv30@1f)HF1?8q-+#g|)R>L&8twjMU4_aOC9WR{%wDFIVQ|0{z{dS~;PiYr`f=y=MaIDfLq~WR`Z?mtpl61rgk;ZG2q5?h^TmAVlJiPt^ zpLPaty+WbyC0Y!R%H`)uClwn5iBj^OFRZSbUhK~|EEE+2D^`=27fKx6H#^9otB%)F zBo)CGqdq;58%i`3mO?1$+FFx5I6Ars8u)%>(B18=+sz9>!88E@fw@XCHmkr<^I+L$ zO7Ny8Hbb&di?uKkqh+uSyg>ka!oub&=Sb%rr*jOCBx2UldTm~eUac!WeHFj%fe^}Q z>)jYiZZaPrP)Xrkh=755RF?sa)L9l=X%kg9obJp38{q#OT<76Qdl0(8VQ zC3;=v5Z+z4MpK%{j4v{(OMVzMd7=++grRq^Py6M;`_se%1M=_E+?@49PQUf{n*w{l zMb)3l-SMOqGU&1r0w-0+Nbd`qshQb$o3AG*Ov^w_O+RtZu(0)l1^$^Ge$UGDRihGZ zUZw1N=})ZAFGPP=S9&7ea-{-N;&S=hQ%JA;4c$JV#WHW-QWq$t23rgz*&z9}M*xmM z!#G+al`Q~2l{cdG)_!TGG9}owvAKErcQd1J0iO;yRNMNksfBcVhF`hGW$1B5B`NoEir}^VF!1YOR}$C{mZP! z@)b#Z<;_#E7%GgD$eoA3BiAc6fj|=Wr4az z4K=kOZmW^y!28X>DxhnbHqYG7+ZZ(qI&JHAvRc5g8!vm!4b`8m6&DvbvylOO31aaN z(b1)eq9A9b11i5jm*V7^y?kGQI)wp>N$}2th?-w1e4z(who2K%weCvAPxJv*;RSMh zzO+FO01E&7QWe`DwrKveek$lct@|QKt{z(+Y;GsstJrsMvcy$wde z)_udndj=sc1r^El^z{d^NZ2OqOm))*b<6a+5C{U14V`6o#4FoT0PR{zZc4?|rS+%K zPdSiLQE31gO=dUNNk0T|qNuU)sss9nKm@0xkeXXqBmx9W$8_B(3H^aJ>V7|i#=t4Q zVQKXH>k6hUs00Ma$a(Fn9ts3K+Y3#AGT54LV3&}P;BZ{vk01_m;>8Jc zO10UIe7;UOF^Gy9@xe7JpaV&QAZ%z~`uZSF^co%HcY2M^pRb#@p>9a{m4-RLOV7e%DJ zdW?!hLqqd1At5C2{xmy9$g`qZ4b`NSSOBHoEwBoVp8U+iaDDd<1_2?#z`!szckl&v zrg=di!`QLmI$ZgtY1QPu)$7Y+3n( zU+EMtAGm2~x-$|IXuENQwuOh7Zc{}UWdCNS1)+4lwAdIxJ;D`{H}48Y>DM*(C&D6T z>9nhCEAR#DM&-+kjS`2XS61eH5!+p3HA(|WSwK8`mhL&NiQ*>%xcpcfGbGm^37$Wr z{Pgr@(`ME?;>S8lT-q(iHK4+}1}=rM+?+=L%~)eLPG1)Yb*g9fr0BW(B)YM%TZ(DpgUIm$l zo)|^?{O1AUw1uj-A(HC$?vwympWO3KPY@n^tdSBDl?e&y527QJg|k0;FfC_Kf$GgiKo6P0#M5W?AMGmqs`&e z9#C8zZfoHIxEb5eJlsfF^p<}XJSQgZ2c^*3inlFsMG~Pop+q&DLqnb^q^6QLL!z)l zVi=JPil_7LRQU$#_u;gcij}CxEC`%xR01HpLXt3m8D0Y9o-5KUvksV3OLOxvYaT&G zdS>29BVE&vA$6;W8u9DFDSp5^J?KV0{3(?BpsdYg8t_H0pos6+=EjB#ATzhOr=y0~ zLKxLn0R8w-$79Kvj^|1vjusx*#TqBxo7H=ObV#mh^lF2%E9X@RzxRo`=*5f~5vOF9 zuKCImQ8lBuJkMlV(x)Y2xGw|E_rs_cd)~UZ|14Wx9$Y0$I2B;PaxJ|)`p1}wQ7IOw z28i4n%K%8(gxN$H%7;{t^pNM-Dv(fdp6RXh)_wl`8Rr!fsGBt{*!&n?g;@HexaooZ z7S{RbogJ_Rqj7ei?dRTovb3`L0vPJWJDRI};eRROVe2W*bDtumyTeNptpAQRl{$51 zJW|;e72GPfPRmq+1m*ryvy^WkHRDbHdoskX%lKG8YnDK#(&$Gbv#u*>aJQEo5Bv3o zRX|R=0weMNK(y?2PZFzvpm0Nt)(dCEjTH!4Ms{dbb)Pa<4CjHNr7z&{zu&(PMhO(V# zQppQ334py>8~$$=2#7@CcYk8IyT!^v|HEY01$D98nkOn? zrxHGyKWUpkYp*kH@DY2Nk+~C$x6RhtXd1>Dkx17_&*wH`@Vh&JOP~QbX!N;=&&;W% zk3Kjcn^*J0;)uU@NIAIr;P(09>zn^a96<b_UT4a zayGBS({Nl$N2>!)v;LW-bU2}*OxtA@dc9k;Y7`O>Fu)#>3b?}CZw`dc_hmbE)J6m1 zM0_vgqE5w`$1vP6RH41e(&WW5&&2f`Q;(sMk@_Voa0fnYsQZaL%Nrn^$_BfC4VdcG zq@;e|gQmiMt4qE`uMhzL|Nm-g>OgStqqa`k>;xKMXS4=g1Vl>e7FB@nw9=gd#dB zYLznZmO6Uf8xM&^M^|t>jkDw7-naZ+dJ)w_lFw1yh*hv!#?^YQHli0tld1T{#|6EJ z^iH9~DE{g}?uE)LjJol6-+!5VPcc{EOMe{>?;J>Y@%KAz9DiskxSdIAb!2(tZLD<} z)F9UEQ8pKQ5RLtt4BSIfCWt0s?=O2@Gl&-)JP*6YOn1TpazEtk%q_Wt9Kc2d0&#M? z;)HyJZ+|a8`JT@{tYXR4)7Bypr0~P2r4jZbD?6RfY3hLFL;k(2vZxZ0yn_rzAxPyo$|pw6jHq2W z)~=aLE7wrC>EoYxfw+Ch`bEhEUqP`{xyuA|f_ZleBnUYrrB9(-)XZIWJL9kG?O!(~ zC4#uvsKw*QYeKzd1gm4vVvMlgm2;f;1Awmt@Z%AoL+k9C=&#W?>{c*Q5I<#z_|_kk zFw(~YLvMG(AepJI(w#{TcByUk2E{o8hz+NT6VjcDo^zR_|4Y9>w%x2D=*g&XFg?;s zP)=Ytk5`B6wm^K%;7H~BiHYs{FTU9I2M{YWc_Q?xO~X7~8R%x~nd%7Pw(+D|=fM>J zY)5i{h%M(fI09?4HC8q}PYng4;@8#tFxO;HQ0WL*z9(XLm=7RIcKCc)gUoX@QbvuB z#~-F_Oll?vfqDi4^Ys7xuV)F1y*0GfiNWGZj2)UNciuFxPdc&`}9A_~qeJrKhj2 z%yz)twS4fY7KjUrHdguf8R+ThT>+j-q{nXCss^dXyNCNbVfP(E)eQd6g=*9MptGxH z3ic(uP(Aq`PphP$u=+2igXiu8YcqK>z=JR}{Bi3_JKO^R5>~;%q}rChWxlCIMhG!L#6z`CtA0E6`>noIPOv zvml@$U4*$b1r-%Fx3Q6QDd2_`!23$J0_tbWWsn3!h}5|^TT=}{lDx^e7T=YjlaG+s z5fz9+4m@=K?1Y->#k5#{|^LE0C}X2e3f&CfhcqKbF2>7e5P(>4OC3z*2PRvW9PAy1gCTc|BO$Egz2)Z)(T^8o;HQlR+GlF;GcLs8$;J-IO^3p0& J6%r=F{{zb3Bntol literal 0 HcmV?d00001 diff --git a/Public/images/logo-270.png b/Public/images/logo-270.png new file mode 100755 index 0000000000000000000000000000000000000000..432fb2446fd60509ac22f2d9b0a4451c12c242aa GIT binary patch literal 12705 zcmX9^1yEG&*S|EtgUrxSf=gnu3%RwX3^} zwVk6C1TiKBB#Fp(iIex3XcjZG;dtZiyvrBV!%JCX)MgEh7}v3#>f9LTur-(0FeFF$ z9U4XztBpo%V?<$yB5{n=J=LQyCZl*~qG5}_-svW`wCKOkjudVk|Jiy3InO>dNrArm zt(go~o20myB%GR^OY^lAvHLN($>s6MIeTwi+sM6uq~e%m@N2pps}?i->Sukg*s}kM zx}|B;MO~T8zK-{pH4Cwcj5oAS;8$i%ZG|10>u_nU*{zip*ni;IFw)_7 zano_|n*PQRWL8tkX49qAx3#qH3vr)^Um4OgUyQK-qov&j$aHr@d-pC zh^UPrv3m*hM+hHto{M@|a_Hd5M%E;NB>f@?Ho$7F2U3Ice|?ey*ijgTUJpS9v`T2x6!G_d@V3 z7V`!lqIoK)$e?W@KEbA=MnoD>0U!P6DFgGAa&dC9a`uFz+^x(!tt_d1>^yC$HGfbz4Aa&0d;6fLTC(%msxF11qLHV>1`q0nvig? zh5Ab{A|egV(-;C7acWHI7WoEN*3i7*fl%~tHAzf`;4|*c`}-uJ^`VU=p-WYcqsuqL zNa@WUg91m_3z|zF#=$-2wVsL)L}QP>a!B3Ucn_(fhl(d@kVq%U9pFnhT0u36c*s?3 ztWgC$K}V=H^yo(%(QrlDPTLow=zMBVgV&)9cQ3P9Lc)zp-8HSxB%~pBDMW7CX8jHP z_Wjm%D3Rvs>WVJHA#l6|HeB6N^e% zB19L*c)5idhX@R+StO&}rmi)TIONbzOK$bYhx@6OBynj;xKv>%+;JF}&;MdScuOoS zj4*ix5|56KKKu1@q_lH=KrO5bMcgmuJs66rsyG>KHsJpdkwc8^>z zj%Q<#C#p?GT!Hind}-PLR8c|UNsBP}a+2Vwv8YZtVJLN}K(O`tO3 zUNPn34@IE7zd6?olS4A;>YDnn_r+?E@%i)TMW-p9ofrs#bY_AgX#uTS&-qFcGvwB^^#{`uU}LMk92V6WNm5kdNm zL&s!_hpx3X{rJR$+x4l{S8k#(+BB(?lhL?wzx&uo8X@M7-l>@YGhnPFOR@k=TM z9&@IMjC4moI~ic9?r`L*^8&GWerc+%ZaZ0;q*&M~f~(1!IO?+;K-?9DYg29x{-}9g zLrpChJbPF}PaYcOTCKMGvPv2!f<BQAqEC(YO7Z>Z_*ni0dXA%|7IsE<@$m=`V*hNdwcx&NWLqaa9c;OroqkNIlponH^ zWfj2-qQ|Nm(*)%c#r8~Dix($jXvtv`v6?2Tfrv;Nz@RgsXq8Mp>=Cg?;emmH8Fv^~ zf_y55u)W>g)rs$V{3}Evk(?fLSL7rtRHV5EhZ4VEtw-NteU{!Zn4i)K2&5bR(aXp< z6tS1_O6}&34ksWZQ%V$jXxbOwMx%O*$8}AuqPhms;vlt!f*hKb|86@|^PJt}TU=RL z8T=>u`~L9nkM~DSe}{!Aa`jk=ib_i4vedP-wL5Kj6vb}z@WSVtTWYin$h{XqklccOdgT^U1cQY{9Re~W}-kQcJi%3Q*w=E z=W}>xrqxulhfPd;{3Zs`C%Zqt((Ok{i1sDg^+F=h;Eb~Uei^S^C{tsbX+*3nEg1>l zAmC%0+1AwmKw>_adKZKJLqTLHjVr8`f%V9Cck(m)Y9~|udusH0(@sQf+c*lLR2HPc z%2YXmF50`~e#-(v7M)VbFat8y*Q-ebi>b#7OiWDmf%krqsDm7JY`;r8!_bta&`2}+ zoXl-&?l5qB@a&xC>hqhL_^YxczJ-kGngkSUh4X>SKOWnbS-vr9@ib$orB)sM$f1iU z%Y+oRiR;Uw^Ow`=@@z%v@1G&fP+5Gbu+7)LbWELv7JUhpJfzJ(P!%#n16nlHQ@D6w z50O!2xpJPKp3-dnxYI>z_yfa66)WLrx(gkjX6tNT^1wPjhajPG3x~4yba$(P%6Z-V zMY3QMzudBzn8SDjr<4 z#^bfCReTc19Er+exZ{b{)Qlg;%%XimR#4d5U3?UzOsW3vf zWB#HIx?Z8^&m|z#Al=uPbalFatfMu5p8N4b5;Yt|WpBFD!nTHnlG0#f#qDBW4>clA zj#0>`78cZDkxee_?(R-PVy>vHT!c-=$H@a@W$<-;7uM(U{k|6=4;xj#!9FE9R~7{+ zjL`N;NH|)s6ZEkEmMXME9nES*98!deTpwy^h{%%%)Jq~=d)}eQAq3xKy{a%((+Xyh zulS`4sgPHe-A7kGH4VNswXdPU zB$uXxNS>H}(y%gfwH?6BNwAWM?2ZpyTBn|#)AaP@Sqyr--yiIZv9(oRp%`0?y}db` zcwOGvMg4UHR#6j*3g4y>h<%kggoPGwT!e&*r4}ZK(G^DMJnCySJkG+*OoAb}I#%+U zir1IN)VJmb3hDiSq)SRqo;*1lmBQr`hM8f<8@s0(85s@X9dqi>PwAReq9$5Wa#~&M zhjQd0>D;3!bPOAuJ{%(ZkF^Ky^TxRELtMk8<*N%zI?uJP)jy3NE zT%cn+GX8X4Y^jZ6VkyewGWITK&WvYi$StwIJ>M%qP2|rhvqC}Q5tn{U#%9pb?nx2g z7g4ST=Rw4dC!TF);a@%3c>lVrbDcR7jYVzrN-R>=70q>bG(QYXZ%f}A;iNobQpgVx zwt8n!J{7aQZ96iYV)eM)bD2r&`s*nx00wa;Gc*KNO)& zDzVpd=5>g+g=fiV>*%;|Vm@Q2eYn3Z?<^GU3M(ci9qHH8c=JX;w}sQ;jqt^c#lG3V zDF#o@Mgv3Advgnm&!BkhkL4|VYc}ZQWheY4thd-Rhfu>hI|K+nag$)x=vUf@705!? zIU*MQAyU)vR#Tz`_P(}mD-ap9NiR?F(? zrPG2o#UYnNl#Dr-Oi8FN^HHDb8y@E znFR0u7!!k$qW~uRhkDmlNzbFDc2%TbJ0_5Lo%N9G@ruM(5+au5PA;EAL*esDP4`ho zi6N{B=N;lu>O8N#X?%o4fI?uEI#m>`GBO*+K@*=;y8e!caa?K>1{1hF#`q(UBaROI zM;V1nB|DhPhUEQND3^F)*E2jaBG;Ed(d=C_NvIH3s9B<_ZKQMffrGlhuo>xfj_`jq zHt4~=t{(`SSJGbEBv{+>cdpkj;GUkIf;kOlerOkHj>#{S7M40>?;hX_xE#i9^6Kj9 zt2j7SbQM1lrZG-{n*H>&Pl52T~XBo{_RPjJ{DSsCm$m%-xK(9|>%@YyLNSUXw% z*|~mq{Wk=$@7%GI6*cOkhK9yd(5c7vZXII2-zwrz_9apQBuPS!zIsjsI(t%BL_EAq z*vT*U7{-B?xE%DD{SRq`n-Bc@r4=e$+jz4_BmB)HGHS@W5D5*3lOI3@HN`rckqZHy ztd-iv;T}i6n}f#X|DA-fC@u~Qv}b#hAuRau&(zlKu|m23;Tq18orw~(U$_$Ceg8FM z=86Ugnywu8@vyyK<>m*N7?d_<)8Ay6o@)Q1cwk^4btgXKl!Y%Rf2em?`sUzAG!=QN z6F;;M!piLpdg(6X^% zUteE4x>eMu$+MTgR#1@8(Mg>fHVTZ2B%qX@MChQ0f+8$0uUM*@5N(FDB-VT5k;clp zf13owgOgru+-YlTlZd|M|IK(E3dF19Rd8X)l)Jt835TB5bK?aXq=yKpKTLo6XBOkcAcn5+o z+AE%*hqs`-m2gO3K+2s&XtHg&a?rkOq+Gd9<=bf|(;a(4zn3z~)CKSUTTkP%K+Orb z&}*(9cTfq?71@wH)&(NosvBnTGpOog;8K}3%f`k=p2B;2!@Wf` z>1Pn%$)gO!J}?t47PnzT(f0{oz0B97PYRn+0yiQ3rH%P$o*GW!8!;}boxb#&Y=3FW0unsop;D=`~X`LvBH8u zr;1AEDrE*GosyCgkFWtXsoxlNMPjSNVDOvsy)NrIF1B67E_$6J5)(rf1_m@-vAde8 zWdKc97MeZ2**Cy?Y=-Fy&P*dz-t|PWDvWrwJz5=Y?O6j#6=|eqZHx}T z^WFTsJm`FP$^r(ZtQj=tZ#XQD+D?4JcK&v4EmzLL!ZNtWrXXPCv*^{dmE%tywDsqY zIiOc9OWEdrs>;&RZ`N$E5uF|-&=MvmwOIAOASVi+%EKh2KFyEgbm&0YMaS|=N?j3{ z#2_|d^5H%BwJhdG1H6-d2}!hah)^o4Ug$Fh)jNrdw6tL4F+s0g0@ZB6b2*vVget4L zLfQDx9`le{$KE1^_x0Y5q>8! z^UUOWN!5fQb&&c?9L_bcP!ocj{MWd=9F_Kudg91l;edO==xaO>gch^U1a46|oOAKZ<-d5+bknou<@~=h?P;S!wC$czpDU48<4R1R{ytzcFGTu=4a6aYI|U zO#N_!!%EY;e$&v}XAS(21>_J426#J6Tld0reJJx48dRZIhZ=M}XkyBpZW;9)(n2DU zlP;7D&@c=#a*- zaEM~H3$@F20O7{5cRf~o9|qcNM7sCkLUd^<7iHXdvMJ9YZA!Dq1XIFEa~E7dY=GUvdHh=aLaT{kx_ zdetm=TbuA!wXAz=SdaN<``Is6EeX1q2mcMt{wHt)NagYU<+6j|v?(VwEv?io86z`> zbzS;P0r+_@naj%NN0Z1g+eu{XNk@-2KXzEWMX-I|kRm?K>G3xk8KYMI@4x>t2IS37 z^5fxt?z#~@=1iZ%e%T<}e{C|2coU2CVEaFv#s8>%%QYg!qvzk-*40*{Tf#id*~oz=E^83iyn5ojCiL1|f8aiAodt1%ilm2Ub#wKdVb zEh;FWVT{w0pCao(9cD|Np6-Ql_-N+kXFgStCfZ5lb6)t#hD24gwr1YU%`McxCocVc zfWo#xzq$N}`=UxZw-v^V7ccC%2Z&AHj$Lm}k@oR5Wv+D*P*A8qrEP774Y4##u`k{I zmk@!3WXa;DX%jYPk@x*Uf9r+zSHE-n#hMJ^H(#t_ZW^lQZwX07-!{$h_q=rzMv|V? zVdnvXbIa1iA>S7uU9H5PL>6;D^I{{4t@2oKA7u0DRay$XbkLj#e#%a8 zR8KvHla986f{*bVX@=v~lH1j>*|2iz#j8g+J}uApMNp^PRY$$&3o0kh_CUc%=7`tQ z>`9FjmyS=tnQQgo=;`e(`^pbX!cIsy)L8+Lw%J+ntI&$?R<=*mssB5jO8rg4WmK3Gr zleX`~uvEGJ>TdEC;N+(vAq~BvclYNjE-M?j9=a$@*jp~0I>n_BBsi(rUj8n&xv{Yw z9Xun27)NN2(EgECPs8DcDEVCO-&k09z3Ya(HXSLo_q+O1>6MJ&>1*lgJv~n!FdOIU zY+lcV(Xg<@dhgFjfTlk2tX4D%{y^V9uaLuT?zveo93$+yuudMF95AYDE_b(%@Ofob>R~l$ab;y?H7t8x zAXG`NKJrvOtNV(In#QQ%ryi&?9*;lDH-M#tVvvAIV$7OIZ%>bUiE6gtSH3h#{27&yi8XGK5V(o|0k3kd=;F17!~yvluUxFcf%y>h z0g0dC+EEO`4EA2~eE=Y>u&m5k*#+d;lV|kXqRZbO&N=j=%D+0z7q~2cTWZ=ghx!n* zkf|xs978fzHW<23wSN5uwN>=#6U~bkGIq6O5H&qLDu`PL5EM4PC7`L`AR zKQWEj-rcWsa7H_(3l>g4`h<8THumoQj~Y0Jdfni(5|kBiS^f06e%_`uQ7j4&yWsKh zDG|k5Ak%7Q9TkmBh!G5*2Y|#NACsx@!wYo_;t_6BWkQ@p9%O9C1;Dd#)F- z5`H4faR;-sySDs=26*FKV9#fH$_yHv!FUTR{Bm|MPYi~9H}7x5!pj>u1QLXWJgpEO zWh%bEPhnVV_qJs-s+V4>=_Rxbb(g2FnX@~K@F+ag59Q)GG8)cL&e zb+O~sD5~*N^+Mrvw;4t0dH6PQv$!OJueV*s^QC#dv7;Ys?O>u#0`P_?4x;yMM)e(h zTd+ac;zP|_JvU@%8S?FLc4%&Hww?X*f|;3_AjpP?RNcr38-mr_;{URK3FOlDF|VJV zH~xshQpRsLN)SAKTB05fCHo#e<-WARdHU?x*!Q5IV&`~g3emSD;32Es+*m_Vlc;Ta ztlz)#{Ta!vzO7_5TDu2w-9HseX0^^TWl=z?&V0 z27{)l!wnf}yS1;$7iZ7?6TaLbBt*TfJ<S0acQ4aWF3jxSogh^H9Z)946iimq5V3 zU;BJ>6!bWs!eCGK1dw`Ks|2T?sY9o{{PqWDe}SHu2xw4%j)XG3X61LAp$r+I?YkBM zhu{_)izv2uy5V&ezeK?81vb2IclqI>QSk6a^+p9bf|{unIidUq28JtjH&G^l^>OUR zZQJqysXNIpJ_7pp8c1QDJx!Y266xa7_du7dGoLM}!{wdGE&~ak$xTtA9 zeEhf$1e8r>A1QiG73f>B(#L|bGQ~jxC!%12JZr^QVq)J_o4Z<#dn(Y8`UK-$suJvv z@mAd_@GE`13c%>Sb`P|R@xB36$;<|93r#eZ04Qq>SF!!$bEPmD}h *=Um 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 Qod5s;07*qoM6N<$f{O_FcmMzZ literal 0 HcmV?d00001 diff --git a/Public/images/logo-512.png b/Public/images/logo-512.png new file mode 100755 index 0000000000000000000000000000000000000000..aa9f3562e033998b902c8004530f3f335a0eea57 GIT binary patch literal 7201 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 literal 0 HcmV?d00001 diff --git a/Public/images/logo.png b/Public/images/logo.png new file mode 100755 index 0000000000000000000000000000000000000000..c1b97e7b139f410579bd9543f4b796779beae33f GIT binary patch literal 7201 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 gae^Nt0AO9g5suo=uA5!tQN( "CSV2SQL", + "language" => "es", + "language_code" => "es_ES", + "license_text" => "© 2022-2023 CopyLeft. GPLv3", + "url" => AnPBuilder::get_host(), + "description" => "Aplicación Web orientada a migrar ficheros CSV a SQL.", + "keywords" => "csv,sql,mariadb,sqlserver,transact,mysql", + "since" => 20230209, + "version" => 20230209, + "kstats" => "1fGQBj6KGMzua8u9zasfhWTmU2jbjuJpCWwCBJvkzhWTnXFipxHZyAu3V", + "extension" => "webp", + "key" => "csv2sql", + "root" => "/^(\\/(index\\.php)?)?\\/?$/", + "domain" => preg_replace('/^csv2sql\.(.+)$/', "$1", $_SERVER["HTTP_HOST"]), + "script" => AnPBuilder::get_cache(function(){ ?> function(){ + + foreach([] as $file) + if(file_exists($file)) + include $file; + + $csv2sql = new AnP([ + "root_paths" => [ + "/mnt/d/git/CSV2SQL", + "/mnt/d/git/CSV2SQL/Public", + "/mnt/d/git/AnP", + "/mnt/d/git/AnP/Public" + ], + "settings_files" => "/JSON/CSV2SQL.php.settings.json", + "routes_files" => "/JSON/CSV2SQL.php.routes.json", + "routes_root" => "/app", + "secrets" => [ + class_exists('\AnP\Secrets') && property_exists('\AnP\Secrets', "settings") ? \AnP\Secrets::settings : [], + class_exists('\CSV2SQL\Secrets') && property_exists('\CSV2SQL\Secrets', "settings") ? \CSV2SQL\Secrets::settings : [], + ] + ]); + + } + ]); diff --git a/Public/json/CSV2SQL.i18n.english.json b/Public/json/CSV2SQL.i18n.english.json new file mode 100755 index 0000000..307d1cf --- /dev/null +++ b/Public/json/CSV2SQL.i18n.english.json @@ -0,0 +1,153 @@ +{ + "english" : { + "files_csv" : "CSV files", + "files_csv_text" : [ + "For convert the CSV files to SQL, please, fill in the next form ", + "and select your local CSV files, and then fill in their subforms." + ], + "default_database" : "The default database", + "default_database_description" : [ + "Choose a default database name for files that not set their own ", + "database." + ], + "type" : "Type", + "type_description" : "Choose the SQL type.", + "default_creator_database" : "Database creator", + "default_creator_database_description" : [ + "Check it if you want create the Database in each SQL archive if ", + "it is not exists by default." + ], + "default_remover_tables" : "Tables remover", + "default_remover_tables_description" : [ + "Check it if you want a tables remover for each CSV file by ", + "default." + ], + "default_creator_tables" : "Tables creator", + "default_creator_tables_description" : [ + "Check it if you want a tables creator for each CSV file by ", + "default." + ], + "default_updater_tables" : "Tables updater", + "default_updater_tables_description" : [ + "Check it if you want a tables attributes updater for each CSV ", + "file by default." + ], + "default_filler_tables" : "Tables filler", + "default_filler_tables_description" : [ + "Check it if you want a tables filler for each CSV file by ", + "default. If you don't check it, any data will be migrated." + ], + "default_uniques" : "Default uniques attributes", + "default_uniques_description" : [ + "In this text box, please, write all default attributes names ", + "that will not be repeated where saving the data separated by a ", + "white space (space, tabulation, new line, etc). If you empty ", + "this field, all data will be saved." + ], + "default_id_attribute" : "ID attribute", + "default_id_attribute_description" : [ + "Check it if you want create the ID auto increment attribute for ", + "each table." + ], + "default_deleted_attribute" : "Deleted attribute", + "default_deleted_attribute_description" : [ + "Check it if you want create the 'deleted' datetime attribute for ", + "each table for detecting a logical user delete." + ], + "default_date_in_attribute" : "Date in attribute", + "default_date_in_attribute_description" : [ + "Check it if you want create the 'date_in' datetime attribute for ", + "each table for registering when was created each register." + ], + "default_date_out_attribute" : "Date out attribute", + "default_date_out_attribute_description" : [ + "Check it if you want create the 'date_out' datetime attribute ", + "for each table for detecting a logical administrator delete." + ], + "default_fill_last_attribute" : "Fill the last attribute", + "default_fill_last_attribute_description" : [ + "Check it if you want fill with unkown columns into last known ", + "attribute by default." + ], + "files" : "Files", + "files_description" : [ + "Select the CSV files that you want convert to SQL." + ], + "files_data" : "Files data", + "files_data_description" : [ + "Here you will have all subforms for each file that you load here." + ], + "database" : "Database", + "database_description" : "Database name for this table.", + "table" : "Table", + "table_description" : "The table name into database.", + "creator_database" : "Database creator", + "creator_database_description" : [ + "Check it if you want create the Database for this file if it is ", + "not exists." + ], + "remover_tables" : "Tables remover", + "remover_tables_description" : [ + "Check it if you want a table remover for this CSV file." + ], + "creator_tables" : "Tables creator", + "creator_tables_description" : [ + "Check it if you want a table creator for this CSV file." + ], + "updater_tables" : "Tables updater", + "updater_tables_description" : [ + "Check it if you want a table attributes updater for this CSV ", + "file." + ], + "filler_tables" : "Tables filler", + "filler_tables_description" : [ + "Check it if you want a tables filler for this CSV file. If you ", + "don't check it, any data will be migrated." + ], + "uniques" : "Uniques attributes", + "uniques_description" : [ + "In this text box, please, write all default attributes names ", + "that will not be repeated where saving the data separated by a ", + "white space (space, tabulation, new line, etc). If you empty ", + "this field, all data will be saved." + ], + "id_attribute" : "ID attribute", + "id_attribute_description" : [ + "Check it if you want create the ID auto increment attribute." + ], + "deleted_attribute" : "Deleted attribute", + "deleted_attribute_description" : [ + "Check it if you want create the 'deleted' datetime attribute for ", + "detecting a logical user delete." + ], + "date_in_attribute" : "Date in attribute", + "date_in_attribute_description" : [ + "Check it if you want create the 'date_in' datetime attribute for ", + "registering when was created each register." + ], + "date_out_attribute" : "Date out attribute", + "date_out_attribute_description" : [ + "Check it if you want create the 'date_out' datetime attribute ", + "for detecting a logical administrator delete." + ], + "fill_last_attribute" : "Fill the last attribute", + "fill_last_attribute_description" : [ + "Check it if you want fill with unkown columns into last known ", + "attribute." + ], + "file_data" : "{name}", + "file_data_text" : "Data for the '{name}' file.", + "file_name" : "File name", + "file_name_description" : "The result file name for saving it.", + "download_files" : "Save files (ZIP)", + "download_one_file" : "Save all in one file", + "main_menu_error" : [ + "There was any error with code '{code}' while getting and ", + "validating the main form data.{list}" + ], + "file_menu_error" : [ + "There was any error with code '{code}' while getting and ", + "validating the file '{file_name}' data.{list}" + ] + } +} \ No newline at end of file diff --git a/Public/json/CSV2SQL.i18n.espanol.json b/Public/json/CSV2SQL.i18n.espanol.json new file mode 100755 index 0000000..17be9e2 --- /dev/null +++ b/Public/json/CSV2SQL.i18n.espanol.json @@ -0,0 +1,3 @@ +{ + "espanol" : {} +} \ No newline at end of file diff --git a/Public/json/CSV2SQL.i18n.galego.json b/Public/json/CSV2SQL.i18n.galego.json new file mode 100755 index 0000000..8761660 --- /dev/null +++ b/Public/json/CSV2SQL.i18n.galego.json @@ -0,0 +1,3 @@ +{ + "galego" : {} +} \ No newline at end of file diff --git a/Public/json/CSV2SQL.i18n.nihongo.json b/Public/json/CSV2SQL.i18n.nihongo.json new file mode 100755 index 0000000..118b7cb --- /dev/null +++ b/Public/json/CSV2SQL.i18n.nihongo.json @@ -0,0 +1,3 @@ +{ + "nihongo" : {} +} \ No newline at end of file diff --git a/Public/json/CSV2SQL.i18n.russkiy.json b/Public/json/CSV2SQL.i18n.russkiy.json new file mode 100755 index 0000000..1923ac4 --- /dev/null +++ b/Public/json/CSV2SQL.i18n.russkiy.json @@ -0,0 +1,3 @@ +{ + "russkiy" : {} +} \ No newline at end of file diff --git a/Public/json/CSV2SQL.routes.json b/Public/json/CSV2SQL.routes.json new file mode 100755 index 0000000..36165ee --- /dev/null +++ b/Public/json/CSV2SQL.routes.json @@ -0,0 +1,3 @@ +[ + "/ files_csv_view" +] \ No newline at end of file diff --git a/Public/json/CSV2SQL.settings.json b/Public/json/CSV2SQL.settings.json new file mode 100755 index 0000000..be89570 --- /dev/null +++ b/Public/json/CSV2SQL.settings.json @@ -0,0 +1,39 @@ +[ + + ["ANP", { + "application_name" : "CSV2SQL", + "application_url" : "https://csv2sql.k3y.pw/", + "application_git" : "https://git.k3y.pw/KyMAN/CSV2SQL", + "application_logo" : "/images/CSV2SQL.webp", + "default_avatar" : "https://anp.k3y.pw/images/AnP.png", + "i18n_files" : [ + "/json/CSV2SQL.i18n.english.json", + "/json/CSV2SQL.i18n.espanol.json", + "/json/CSV2SQL.i18n.galego.json", + "/json/CSV2SQL.i18n.nihongo.json", + "/json/CSV2SQL.i18n.russkiy.json" + ], + "default_language" : "espanol", + "views_files" : "/json/CSV2SQL.views.json", + "routes_files" : "/json/CSV2SQL.routes.json", + "class" : "csv2sql", + "main_menu_items" : [ + {"i18n" : "documentation", "icon" : "documentation", "url" : "https://csv2sql.k3y.pw/doc"}, + {"i18n" : "git", "icon" : "git", "url" : "https://git.k3y.pw/KyMAN/CSV2SQL"} + ], + "cells" : 80, + "minimum_font_size" : 14, + "allow_users" : false, + "allow_geolocation" : false, + "allow_breadcrumb" : false + }, "ANP"], + + ["CSV2SQL", { + "default_sql_server_reserved_words" : [], + "process_exception_print" : true, + "mysql_tabulation" : " ", + "sql_server_tabulation" : "\t", + "sql_server_insert_division" : 900 + }, "CSV2SQL"] + +] \ No newline at end of file diff --git a/Public/json/CSV2SQL.views.json b/Public/json/CSV2SQL.views.json new file mode 100755 index 0000000..590bc12 --- /dev/null +++ b/Public/json/CSV2SQL.views.json @@ -0,0 +1,31 @@ +{ + "files_csv_view" : { + "type" : "form", + "i18n" : "files_csv", + "structure" : [ + {"name" : "default_database", "type" : "text"}, + {"name" : "type", "type" : "selector", "options" : [ + {"name" : "SQL Server", "value" : "sqlserver"}, + {"name" : "MySQL/MariaDB", "value" : "mysql", "selected" : true} + ]}, + {"name" : "default_creator_database", "type" : "checkbox", "checked" : true}, + {"name" : "default_remover_tables", "type" : "checkbox", "checked" : true}, + {"name" : "default_creator_tables", "type" : "checkbox", "checked" : true}, + {"name" : "default_updater_tables", "type" : "checkbox", "checked" : true}, + {"name" : "default_filler_tables", "type" : "checkbox", "checked" : true}, + {"name" : "default_uniques", "type" : "text", "multiline" : true}, + {"name" : "default_id_attribute", "type" : "checkbox", "checked" : true}, + {"name" : "default_deleted_attribute", "type" : "checkbox", "checked" : false}, + {"name" : "default_date_in_attribute", "type" : "checkbox", "checked" : true}, + {"name" : "default_date_out_attribute", "type" : "checkbox", "checked" : true}, + {"name" : "default_fill_last_attribute", "type" : "checkbox", "checked" : true}, + {"name" : "files", "type" : "file", "multiple" : true, "onchange" : "{object_name}.create_subforms(this, event);", "accept" : ".csv"}, + {"name" : "files_data"}, + {"name" : "file_name", "type" : "text", "value" : "csv2sql"} + ], + "buttons" : [ + {"i18n" : "download_files", "icon" : "download_files", "onclick" : "{object_name}.download_files(this, event);"}, + {"i18n" : "download_one_file", "icon" : "download_one_file", "onclick" : "{object_name}.download_one_file(this, event);"} + ] + } +} \ No newline at end of file diff --git a/Public/scss/CSV2SQL.css b/Public/scss/CSV2SQL.css new file mode 100755 index 0000000..2eff65b --- /dev/null +++ b/Public/scss/CSV2SQL.css @@ -0,0 +1,4 @@ +.csv2sql .field[data-i18n=files_data] .buttons { + display: none; } + +/*# sourceMappingURL=CSV2SQL.css.map */ diff --git a/Public/scss/CSV2SQL.css.map b/Public/scss/CSV2SQL.css.map new file mode 100755 index 0000000..8d268f3 --- /dev/null +++ b/Public/scss/CSV2SQL.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AAEI,8CAAqC;EAAC,OAAO,EAAG,IAAI", +"sources": ["CSV2SQL.scss"], +"names": [], +"file": "CSV2SQL.css" +} diff --git a/Public/scss/CSV2SQL.scss b/Public/scss/CSV2SQL.scss new file mode 100755 index 0000000..75b30b9 --- /dev/null +++ b/Public/scss/CSV2SQL.scss @@ -0,0 +1,5 @@ +.csv2sql{ + + .field[data-i18n=files_data] .buttons{display : none;} + +}