diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..df7825d
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 639900d..7e5bdf8 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,5 +1,8 @@
+
+
+
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..da70b9f
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/software-dev.iml b/.idea/software-dev.iml
new file mode 100644
index 0000000..a66c9f3
--- /dev/null
+++ b/.idea/software-dev.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ArticleJavaServer/MySQLArticleDatabase/2020-05-02-pe-mysql-db-migrations.sql b/ArticleJavaServer/MySQLArticleDatabase/2020-05-02-pe-mysql-db-migrations.sql
new file mode 100644
index 0000000..7f767b3
--- /dev/null
+++ b/ArticleJavaServer/MySQLArticleDatabase/2020-05-02-pe-mysql-db-migrations.sql
@@ -0,0 +1,23 @@
+-- update article set published_date = null where published_date < 1587340800 or published_date > 1589932800;
+
+ALTER TABLE article CHANGE COLUMN published_date published_date timestamp default CURRENT_TIMESTAMP;
+ALTER TABLE article CHANGE COLUMN publish_date publish_date timestamp default CURRENT_TIMESTAMP;
+
+
+DROP TABLE IF EXISTS `buzz_job`;
+CREATE TABLE `buzz_job` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `start_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+ `end_date` timestamp NULL DEFAULT NULL,
+ `finished` tinyint NOT NULL DEFAULT 0,
+ `elapsed_seconds` int null default 0,
+ `query` mediumtext default NULL,
+ `articles_returned` integer default 0,
+ `articles_youtube` integer default 0,
+ `articles_700` integer default 0,
+ `articles_dropped` integer default 0,
+ `articles_created` integer default 0,
+ `articles_updated` integer default 0,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=969 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
diff --git a/ArticleJavaServer/MySQLArticleDatabase/2020-05-04-pe-mysql-db-migrations.sql b/ArticleJavaServer/MySQLArticleDatabase/2020-05-04-pe-mysql-db-migrations.sql
new file mode 100644
index 0000000..1ca9ee1
--- /dev/null
+++ b/ArticleJavaServer/MySQLArticleDatabase/2020-05-04-pe-mysql-db-migrations.sql
@@ -0,0 +1,12 @@
+DROP TABLE IF EXISTS `s3_job`;
+CREATE TABLE `s3_job` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `start_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+ `finished` tinyint NOT NULL DEFAULT 0,
+ `elapsed_seconds` int null default 0,
+ `articles_to_send` integer default 0,
+ `articles_sent` integer default 0,
+ `articles` mediumtext default null,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=969 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
diff --git a/ArticleJavaServer/MySQLArticleDatabase/2020-05-05-pe-mysql-db-migrations.sql b/ArticleJavaServer/MySQLArticleDatabase/2020-05-05-pe-mysql-db-migrations.sql
new file mode 100644
index 0000000..4887aa6
--- /dev/null
+++ b/ArticleJavaServer/MySQLArticleDatabase/2020-05-05-pe-mysql-db-migrations.sql
@@ -0,0 +1,63 @@
+DROP TABLE IF EXISTS `tag`;
+CREATE TABLE `tag` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `tag` varchar(20) default "",
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+DROP TABLE IF EXISTS `article_has_tag`;
+CREATE TABLE `article_has_tag` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `tag_id` int NOT NULL,
+ `article_id` int NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=4543 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+drop view if exists `article_tag_view`;
+CREATE VIEW `article_tag_view` AS
+select
+ `t`.`id` as `article_has_tag_id`,
+ `t`.`tag` AS `tag` ,
+ `aht`.`article_id` as `article_id`
+from
+ (`article_has_tag` `aht` join `tag` `t`)
+where
+ (`aht`.`tag_id` = `t`.`id`)
+order by
+ `t`.`tag` desc ;
+
+DROP TABLE IF EXISTS `buzz_query`;
+CREATE TABLE `buzz_query` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `query` text default null,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=4325 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+DROP TABLE IF EXISTS `query_has_tag`;
+CREATE TABLE `query_has_tag` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `tag_id` int NOT NULL,
+ `query_id` int NOT NULL,
+ `tag` char(50) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=2321 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+drop view if exists `query_tag_view`;
+CREATE VIEW `query_tag_view` AS
+select
+ `qht`.`id` as `id`,
+ `t`.`tag` AS `tag` ,
+ `qht`.`query_id` as `query_id`
+from
+ (`query_has_tag` `qht` join `tag` `t`)
+where
+ (`qht`.`tag_id` = `t`.`id`)
+order by
+ `t`.`tag` desc ;
+
+-- drop view if exists `article_current_status`;
+-- drop view if exists `article_sub_status_view`;
\ No newline at end of file
diff --git a/ArticleJavaServer/MySQLArticleDatabase/2020-06-10-pe-mysql-db-migrations-cumulative.sql b/ArticleJavaServer/MySQLArticleDatabase/2020-06-10-pe-mysql-db-migrations-cumulative.sql
new file mode 100644
index 0000000..da79e14
--- /dev/null
+++ b/ArticleJavaServer/MySQLArticleDatabase/2020-06-10-pe-mysql-db-migrations-cumulative.sql
@@ -0,0 +1,170 @@
+
+DROP VIEW IF EXISTS `article_status_view`;
+CREATE VIEW `article_status_view` AS select `ahs`.`id` AS `id`,`ahs`.`article_id` AS `article_id`,`ahs`.`date_changed` AS `date_changed`,`ahs`.`comment` AS `comment`,`ast`.`status_code` AS `status_code`,`ast`.`status_text` AS `status_text` from (`article_has_status` `ahs` join `article_status` `ast`) where (`ahs`.`article_status_id` = `ast`.`id`) order by `ahs`.`id` desc ;
+
+DROP VIEW IF EXISTS `article_sub_status_view`;
+CREATE VIEW `article_sub_status_view` AS select `article_has_status`.`article_id` AS `article_id`,max(`article_has_status`.`date_changed`) AS `MaxDateTime` from `article_has_status` group by `article_has_status`.`article_id`;
+
+DROP VIEW IF EXISTS `article_current_status`;
+CREATE VIEW `article_current_status` AS select `a`.`id` AS `id`,`a`.`title` AS `title`,`a`.`author` AS `author`,`a`.`url` AS `url`,`a`.`publish_date` AS `publish_date`,`a`.`article_text` AS `article_text`,`st`.`status_code` AS `status_code` from (((`article` `a` join `article_has_status` `ahs`) join `article_status` `st`) join `article_sub_status_view` `assv`) where ((`ahs`.`article_id` = `assv`.`article_id`) and (`ahs`.`date_changed` = `assv`.`MaxDateTime`) and (`a`.`id` = `assv`.`article_id`) and (`st`.`id` = `ahs`.`article_status_id`)) ;
+
+-- Dump completed on 2020-03-15 17:54:45
+-- update article set published_date = null where published_date < 1587340800 or published_date > 1589932800;
+
+ALTER TABLE article CHANGE COLUMN published_date published_date timestamp default CURRENT_TIMESTAMP;
+ALTER TABLE article CHANGE COLUMN publish_date publish_date timestamp default CURRENT_TIMESTAMP;
+
+
+DROP TABLE IF EXISTS `buzz_job`;
+CREATE TABLE `buzz_job` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `start_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+ `end_date` timestamp NULL DEFAULT NULL,
+ `finished` tinyint NOT NULL DEFAULT 0,
+ `elapsed_seconds` int null default 0,
+ `query` mediumtext default NULL,
+ `articles_returned` integer default 0,
+ `articles_youtube` integer default 0,
+ `articles_700` integer default 0,
+ `articles_dropped` integer default 0,
+ `articles_created` integer default 0,
+ `articles_updated` integer default 0,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=969 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+DROP TABLE IF EXISTS `s3_job`;
+CREATE TABLE `s3_job` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `start_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+ `finished` tinyint NOT NULL DEFAULT 0,
+ `elapsed_seconds` int null default 0,
+ `articles_to_send` integer default 0,
+ `articles_sent` integer default 0,
+ `articles` mediumtext default null,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=969 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+DROP TABLE IF EXISTS `tag`;
+CREATE TABLE `tag` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `tag` varchar(20) default "",
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+DROP TABLE IF EXISTS `article_has_tag`;
+CREATE TABLE `article_has_tag` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `tag_id` int NOT NULL,
+ `article_id` int NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=4543 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+drop view if exists `article_tag_view`;
+CREATE VIEW `article_tag_view` AS
+select
+ `t`.`id` as `article_has_tag_id`,
+ `t`.`tag` AS `tag` ,
+ `aht`.`article_id` as `article_id`
+from
+ (`article_has_tag` `aht` join `tag` `t`)
+where
+ (`aht`.`tag_id` = `t`.`id`)
+order by
+ `t`.`tag` desc ;
+
+DROP TABLE IF EXISTS `buzz_query`;
+CREATE TABLE `buzz_query` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `query` text default null,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=4325 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+DROP TABLE IF EXISTS `query_has_tag`;
+CREATE TABLE `query_has_tag` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `tag_id` int NOT NULL,
+ `query_id` int NOT NULL,
+ `tag` char(50) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=2321 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+drop view if exists `query_tag_view`;
+CREATE VIEW `query_tag_view` AS
+select
+ `qht`.`id` as `id`,
+ `t`.`tag` AS `tag` ,
+ `qht`.`query_id` as `query_id`
+from
+ (`query_has_tag` `qht` join `tag` `t`)
+where
+ (`qht`.`tag_id` = `t`.`id`)
+order by
+ `t`.`tag` desc ;
+
+-- drop view if exists `article_current_status`;
+-- drop view if exists `article_sub_status_view`;
+
+DROP TABLE IF EXISTS `update_job`;
+CREATE TABLE `update_job` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `start_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+ `end_date` timestamp NULL DEFAULT NULL,
+ `finished` tinyint NOT NULL DEFAULT 0,
+ `elapsed_seconds` int null default 0,
+ `articles_buzz` integer default 0,
+ `articles_user` integer default 0,
+ `articles_updated` integer default 0,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=969 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+
+alter table buzz_query
+add column
+ filename_tag varchar(20) null;
+
+alter table buzz_query
+add column
+ active_flag boolean;
+
+insert into buzz_query
+(id, query, filename_tag, active_flag)
+values
+(1, 'topic=coronavirus,covid&search_type=trending_now&hours=24&count=25&countries=United States', 'CovidArticles',true),
+(2, 'topic=Black Lives Matter,BLM&search_type=trending_now&hours=24&count=25&countries=United States', 'BLMArticles',true),
+(3, 'topic=Election 2020,US Election,Election&search_type=trending_now&hours=24&count=25&countries=United States', 'ElectionArticles',true)
+;
+
+alter table article
+add column
+ filename_tag varchar(20) null;
+
+insert into tag (id, tag) values (1, 'one'), (2, 'two'), (3, 'three');
+
+insert into article_has_tag (id, tag_id, article_id) values (1, 1, 1), (2, 2, 1), (3, 3, 1);
+
+update article set filename_tag = "CovidArticles" where id > 0;
+
+insert into buzz_query
+(id, query, filename_tag, active_flag)
+values
+(4, 'q=covid&num_days=365&result_type=evergreen_score&language=en', 'EvergreenCovidArticles',true);
+
+ALTER TABLE buzz_query CHANGE COLUMN filename_tag filename_tag text;
+
+update buzz_query set filename_tag = 'EvergreenCovidArticles' where filename_tag = 'EvergreenCovidArticl';
+
+update buzz_query set query = 'https://api.buzzsumo.com/search/trends.json?topic=coronavirus,covid&search_type=trending_now&hours=24&count=25&countries=United States' where filename_tag = 'CovidArticles';
+
+update buzz_query set query = 'https://api.buzzsumo.com/search/trends.json?topic=Black Lives Matter,BLM&search_type=trending_now&hours=24&count=25&countries=United States' where filename_tag = 'BLMArticles';
+
+update buzz_query set query = 'https://api.buzzsumo.com/search/trends.json?topic=Election 2020,US Election,Election&search_type=trending_now&hours=24&count=25&countries=United States' where filename_tag = 'ElectionArticles';
+
+update buzz_query set query = 'https://api.buzzsumo.com/search/articles.json?q=covid&num_days=365&result_type=evergreen_score&language=en' where filename_tag = 'EvergreenCovidArticles';
+
diff --git a/ArticleJavaServer/MySQLArticleDatabase/2020-06-10-pe-mysql-db-migrations.sql b/ArticleJavaServer/MySQLArticleDatabase/2020-06-10-pe-mysql-db-migrations.sql
new file mode 100644
index 0000000..8562f45
--- /dev/null
+++ b/ArticleJavaServer/MySQLArticleDatabase/2020-06-10-pe-mysql-db-migrations.sql
@@ -0,0 +1,13 @@
+DROP TABLE IF EXISTS `update_job`;
+CREATE TABLE `update_job` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `start_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+ `end_date` timestamp NULL DEFAULT NULL,
+ `finished` tinyint NOT NULL DEFAULT 0,
+ `elapsed_seconds` int null default 0,
+ `articles_buzz` integer default 0,
+ `articles_user` integer default 0,
+ `articles_updated` integer default 0,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=969 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
diff --git a/ArticleJavaServer/MySQLArticleDatabase/2020-06-25-pe-mysql-db-migrations.sql b/ArticleJavaServer/MySQLArticleDatabase/2020-06-25-pe-mysql-db-migrations.sql
new file mode 100644
index 0000000..8f6d645
--- /dev/null
+++ b/ArticleJavaServer/MySQLArticleDatabase/2020-06-25-pe-mysql-db-migrations.sql
@@ -0,0 +1,27 @@
+
+alter table buzz_query
+add column
+ filename_tag varchar(20) null;
+
+alter table buzz_query
+add column
+ active_flag boolean;
+
+insert into buzz_query
+(id, query, filename_tag, active_flag)
+values
+(1, 'topic=coronavirus,covid&search_type=trending_now&hours=24&count=25&countries=United States', 'CovidArticles',true),
+(2, 'topic=Black Lives Matter,BLM&search_type=trending_now&hours=24&count=25&countries=United States', 'BLMArticles',true),
+(3, 'topic=Election 2020,US Election,Election&search_type=trending_now&hours=24&count=25&countries=United States', 'ElectionArticles',true)
+;
+
+alter table article
+add column
+ filename_tag varchar(20) null;
+
+insert into tag (id, tag) values (1, 'one'), (2, 'two'), (3, 'three');
+
+insert into article_has_tag (id, tag_id, article_id) values (1, 1, 1), (2, 2, 1), (3, 3, 1);
+
+update article set filename_tag = "CovidArticles" where id > 0;
+
diff --git a/ArticleJavaServer/MySQLArticleDatabase/2020-06-30-pe-mysql-db-migrations.sql b/ArticleJavaServer/MySQLArticleDatabase/2020-06-30-pe-mysql-db-migrations.sql
new file mode 100644
index 0000000..fc32b7b
--- /dev/null
+++ b/ArticleJavaServer/MySQLArticleDatabase/2020-06-30-pe-mysql-db-migrations.sql
@@ -0,0 +1,3 @@
+alter table article
+add column
+ submit_count int null;
diff --git a/ArticleJavaServer/MySQLArticleDatabase/2020-09-10-pe-mysql-db-migrations.sql b/ArticleJavaServer/MySQLArticleDatabase/2020-09-10-pe-mysql-db-migrations.sql
new file mode 100644
index 0000000..bfbb5b1
--- /dev/null
+++ b/ArticleJavaServer/MySQLArticleDatabase/2020-09-10-pe-mysql-db-migrations.sql
@@ -0,0 +1,4 @@
+insert into buzz_query
+(id, query, filename_tag, active_flag)
+values
+(4, 'https://api.buzzsumo.com/search/articles.json?q=covid&num_days=365&result_type=evergreen_score&language=en', 'EvergreenCovidArticles',true);
diff --git a/ArticleJavaServer/MySQLArticleDatabase/2020-09-10b-update-buzz-query.sql b/ArticleJavaServer/MySQLArticleDatabase/2020-09-10b-update-buzz-query.sql
new file mode 100644
index 0000000..e9e28fe
--- /dev/null
+++ b/ArticleJavaServer/MySQLArticleDatabase/2020-09-10b-update-buzz-query.sql
@@ -0,0 +1 @@
+update buzz_query set query='q=covid&num_days=365&result_type=evergreen_score&language=en' where id = 4;
\ No newline at end of file
diff --git a/ArticleJavaServer/MySQLArticleDatabase/2020-09-30-pe-mysql-db-migrations.sql b/ArticleJavaServer/MySQLArticleDatabase/2020-09-30-pe-mysql-db-migrations.sql
new file mode 100644
index 0000000..50d2cd2
--- /dev/null
+++ b/ArticleJavaServer/MySQLArticleDatabase/2020-09-30-pe-mysql-db-migrations.sql
@@ -0,0 +1,19 @@
+ALTER TABLE buzz_query CHANGE COLUMN filename_tag filename_tag text;
+alter table article change column filename_tag filename_tag text;
+
+insert into buzz_query
+(id, query, filename_tag, active_flag)
+values
+(4, 'q=covid&num_days=365&result_type=evergreen_score&language=en', 'EvergreenCovidArticles',true);
+
+update buzz_query set filename_tag = 'EvergreenCovidArticles' where filename_tag = 'EvergreenCovidArticl';
+
+update buzz_query set query = 'https://api.buzzsumo.com/search/trends.json?topic=coronavirus,covid&search_type=trending_now&hours=24&count=25&countries=United States' where filename_tag = 'CovidArticles';
+
+update buzz_query set query = 'https://api.buzzsumo.com/search/trends.json?topic=Black Lives Matter,BLM&search_type=trending_now&hours=24&count=25&countries=United States' where filename_tag = 'BLMArticles';
+
+update buzz_query set query = 'https://api.buzzsumo.com/search/trends.json?topic=Election 2020,US Election,Election&search_type=trending_now&hours=24&count=25&countries=United States' where filename_tag = 'ElectionArticles';
+
+update buzz_query set query = 'https://api.buzzsumo.com/search/articles.json?q=covid&num_days=365&result_type=evergreen_score&language=en' where filename_tag = 'EvergreenCovidArticles';
+
+
diff --git a/ArticleJavaServer/MySQLArticleDatabase/2020-10-02-pe-mysql-db-migrations.sql b/ArticleJavaServer/MySQLArticleDatabase/2020-10-02-pe-mysql-db-migrations.sql
new file mode 100644
index 0000000..4521c37
--- /dev/null
+++ b/ArticleJavaServer/MySQLArticleDatabase/2020-10-02-pe-mysql-db-migrations.sql
@@ -0,0 +1,4 @@
+insert into buzz_query
+(id, query, filename_tag, active_flag)
+values
+(5, 'https://api.buzzsumo.com/search/trends.json?topic=coronavirus,covid&search_type=trending_now&hours=24&count=25&countries=United States', 'Covid2Articles',true);
diff --git a/ArticleJavaServer/MySQLArticleDatabase/2020-10-03-b-pe-mysql-db-migrations.sql b/ArticleJavaServer/MySQLArticleDatabase/2020-10-03-b-pe-mysql-db-migrations.sql
new file mode 100644
index 0000000..f7f6a76
--- /dev/null
+++ b/ArticleJavaServer/MySQLArticleDatabase/2020-10-03-b-pe-mysql-db-migrations.sql
@@ -0,0 +1,4 @@
+insert into buzz_query
+(id, query, filename_tag, active_flag)
+values
+(6, 'https://api.buzzsumo.com/search/trends.json?topic=coronavirus,covid&search_type=trending_now&hours=24&count=75&countries=United States', 'Covid2Articles',true);
diff --git a/ArticleJavaServer/MySQLArticleDatabase/2020-10-03-pe-mysql-db-migrations.sql b/ArticleJavaServer/MySQLArticleDatabase/2020-10-03-pe-mysql-db-migrations.sql
new file mode 100644
index 0000000..622cdf6
--- /dev/null
+++ b/ArticleJavaServer/MySQLArticleDatabase/2020-10-03-pe-mysql-db-migrations.sql
@@ -0,0 +1,2 @@
+delete from article where filename_tag like '%evergreen%' and publish_date > timestamp('2020-05-05');
+update article set filename_tag = 'Covid2EvergreenArticles' where filename_tag like '%evergreen%';
diff --git a/ArticleJavaServer/MySQLArticleDatabase/a-users.sql b/ArticleJavaServer/MySQLArticleDatabase/a-users.sql
deleted file mode 100644
index b5379b4..0000000
--- a/ArticleJavaServer/MySQLArticleDatabase/a-users.sql
+++ /dev/null
@@ -1,248 +0,0 @@
--- MySQL dump 10.13 Distrib 8.0.18, for Win64 (x86_64)
---
--- Host: localhost Database: publiceditor
--- ------------------------------------------------------
--- Server version 8.0.18
-
-/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
-/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
-/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
-/*!50503 SET NAMES utf8mb4 */;
-/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
-/*!40103 SET TIME_ZONE='+00:00' */;
-/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
-/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
-/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-
---
--- Current Database: `publiceditor`
---
-
-CREATE DATABASE /*!32312 IF NOT EXISTS*/ `publiceditor` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
-
-USE `publiceditor`;
-
---
--- Table structure for table `article`
---
-
-DROP TABLE IF EXISTS `article`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!50503 SET character_set_client = utf8mb4 */;
-CREATE TABLE `article` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `title` char(50) DEFAULT NULL,
- `author` char(50) DEFAULT NULL,
- `url` mediumtext,
- `publish_date` timestamp NULL DEFAULT NULL,
- `article_text` mediumtext,
- `author_name` char(50) DEFAULT NULL,
- `article_title` char(200) DEFAULT NULL,
- `article_amplifiers` varchar(500) DEFAULT NULL,
- `domain_name` char(100) DEFAULT NULL,
- `updated_at` int(11) DEFAULT NULL,
- `buzzsumo_article_id` int(11) DEFAULT NULL,
- `published_date` int(11) DEFAULT NULL,
- `total_shares` int(11) DEFAULT NULL,
- `thumbnail_url` char(200) DEFAULT NULL,
- `num_words` int(11) DEFAULT NULL,
- `alexa_rank` int(11) DEFAULT NULL,
- `twitter_shares` int(11) DEFAULT NULL,
- `love_count` int(11) DEFAULT NULL,
- `evergreen_score` double DEFAULT NULL,
- `total_reddit_engagements` int(11) DEFAULT NULL,
- `wow_count` int(11) DEFAULT NULL,
- `facebook_likes` int(11) DEFAULT NULL,
- `facebook_comments` int(11) DEFAULT NULL,
- `sad_count` int(11) DEFAULT NULL,
- `total_facebook_shares` int(11) DEFAULT NULL,
- `angry_count` int(11) DEFAULT NULL,
- `facebook_shares` int(11) DEFAULT NULL,
- `num_linking_domains` int(11) DEFAULT NULL,
- `haha_count` int(11) DEFAULT NULL,
- `vis_data` mediumtext,
- `tagworks_id` int(11) DEFAULT NULL,
- `article_hash` char(64) DEFAULT NULL,
- PRIMARY KEY (`id`),
- UNIQUE KEY `id` (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `article`
---
-
-LOCK TABLES `article` WRITE;
-/*!40000 ALTER TABLE `article` DISABLE KEYS */;
-INSERT INTO `article` VALUES (1,'the meaning of life','anonymous','www.life.com/meaning.htm','2012-01-01 15:00:00','Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.','ggggg','the meaning of life',NULL,NULL,234234234,234234234,234234234,3333,'',444,33,3333,44,0.55,444,55,666,777,44,44,44,44,44,44,NULL,NULL,NULL),(2,'the meaning of happiness','buddha','www.happinesstimes.com/happiness-meanng.html','2012-02-02 15:00:00','Scelerisque varius morbi enim nunc faucibus a. Laoreet id donec ultrices tincidunt arcu non sodales neque. Mi quis hendrerit dolor magna. Sapien eget mi proin sed libero enim. Nibh tortor id aliquet lectus. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Ipsum a arcu cursus vitae congue mauris rhoncus. Nunc vel risus commodo viverra maecenas accumsan lacus vel facilisis. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit. Faucibus ornare suspendisse sed nisi lacus. Mattis enim ut tellus elementum sagittis vitae et.',NULL,'the meaning of happiness',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(3,'','','https://www.google.com','2019-10-27 16:51:32','Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Nisl tincidunt eget nullam non nisi. Eu mi bibendum neque egestas congue quisque. Tortor at risus viverra adipiscing at in tellus integer feugiat. Vel turpis nunc eget lorem dolor. Massa massa ultricies mi quis hendrerit dolor magna eget est. Faucibus et molestie ac feugiat sed lectus vestibulum. Massa tincidunt dui ut ornare lectus sit amet. Vel eros donec ac odio tempor. Nec feugiat nisl pretium fusce id velit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque.',NULL,'hijklmnop hijklmnop',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(4,'','','www.washingtonpost.com/politics/as-warren-and-buttigieg-rise-the-democratic-presidential-race-is-competitive-and-fluid-a-washington-post-abc-news-poll-finds/2019/11/02/4b7aca3c-fccd-11e9-8906-ab6b60de9124_story.html','2019-11-11 04:28:28','With peak winds of 185 mph, Hurricane Dorian became the strongest storm on record to strike the Bahamas Sunday and among the top few most intense ever observed in the Atlantic Ocean. The Category 5 storm next threatens to bring hurricane force winds, coastal flooding and heavy rain to the east coast of Florida and Southeast U.S.\r\n\r\nDorian’s winds had only eased modestly, down to 180 mph at 11 p.m. Sunday, still generating “catastrophic conditions” in the northern Bahamas. The National Hurricane Center stated the storm made landfall on Grand Bahama Island at 11 p.m. after slamming into Great Abaco earlier in the day.\r\n\r\n“Dorian remains an incredibly powerful hurricane,” the Hurricane Center wrote.\r\n\r\nAs the storm closes in on Florida’s east coast, the National Hurricane Center has posted hurricane and storm surge warnings for some areas. The storm surge is the storm-driven rise in water above normally dry land at the coast:\r\n\r\nThe hurricane warning stretches from Jupiter Inlet (just north of West Palm Beach) to the Volusia/Brevard county line (just north of Titusville).\r\n\r\nThe storm surge warning spans from near West Palm Beach to Titusville. In some areas the surge could reach 4 to 7 feet, the Hurricane Center projects.\r\n\r\nThese warnings are focused on the period from Monday night through early Wednesday. Tropical storm-force winds could begin in south Florida as soon as Monday afternoon and continue into Tuesday and Wednesday, perhaps reaching hurricane-force Tuesday depending how close to the coast Dorian tracks.\r\n\r\nIn addition to the wind and surge, about to three to six inches of rain is projected along Florida’s east coast.\r\n\r\nAlthough the center of Dorian, containing its extreme Category 5 winds, may remain offshore Florida, its forecast track is so close to the coast that it necessitated warnings. “A small deviation to the left of the track could bring the intense core of the hurricane its dangerous winds closer to or onto the Florida coast,” the Hurricane Center wrote.\r\n\r\n\r\n\r\nHurricane Dorian on Sunday morning. (NOAA)\r\n\r\nBeyond Florida, Dorian will take aim at coastal Georgia and the Carolinas Wednesday through Friday. “There is an increasing likelihood of strong winds and dangerous storm surge along the coasts of Georgia, South Carolina, North Carolina later this week,” the Hurricane Center wrote. “Residents in these areas should continue to monitor the progress of Dorian and listen to advice given by local emergency officials.”\r\n\r\nEffects on the Bahamas\r\n\r\nWhile Florida and areas farther north await effects from the monster storm, a “catastrophic” scenario is unfolding in the northwestern Bahamas, where the storm’s eyewall, the ring of destructive winds around the center, struck Sunday. On Great Abaco, which suffered a direct hit, the Hurricane Center warned of a “life-threatening situation” into Sunday evening.\r\n\r\n[‘Pray for us’: Dorian snapping trees, tearing off roofs in the Bahamas]\r\n\r\nWatch #MarshHarbour go through the eye of #Dorian. Took 3 hours from western eyewall exit to now entering Southeast eyewall. #Bahamas pic.twitter.com/DcVKrA7SrB — Bill Karins (@BillKarins) September 1, 2019\r\n\r\nOn Sunday night, as the storm’s eyewall rammed into Grand Bahama Island, the storm was predicted to unleash wind gusts over 200 mph, along with storm surge flooding of 18 to 23 feet above normal tide levels. “These hazards will cause extreme destruction in the affected areas and will continue for several hours,” the Hurricane Center stated.\r\n\r\nThe eye of Hurricane Dorian is slowly approaching the eastern end of Grand Bahama Island Sunday evening as viewed from the Miami, Florida radar. pic.twitter.com/SNiOSAotoN — NWS Eastern Region (@NWSEastern) September 2, 2019\r\n\r\nThe storm’s core of devastating wind and torrential rain, totaling up to 30 inches, may sit for at least 24 hours over the northern Bahamas as steering currents in the atmosphere collapse, causing Dorian to meander slowly, if not stall outright, for a time.\r\n\r\nIn short, this is a storm that, depending on its exact track over the northern Bahamas, particularly Grand Bahama and the Abaco Islands, could reshape these locations for decades.\r\n\r\nAs of 11 p.m., the storm was 55 miles east of Freeport on Grand Bahama Island and was crawling west at 5 mph. The storm’s peak winds were 180 mph, and Dorian has maintained Category 4 and now Category 5 intensity for an unusually long period.\r\n\r\nStorms this powerful typically tend to undergo cycles that weaken their high-end winds for a time, but Dorian has somehow avoided this dynamic.\r\n\r\nThe threat to Florida and the Southeast\r\n\r\nAfter models run early Saturday shifted the storm track offshore Florida, some that were run late Saturday into Sunday shifted it back closer to the Florida coast.\r\n\r\nDorian has grown larger in size, which may have implications for the Florida forecast. Hurricane-force winds now extend outward up to 45 miles from the center and tropical-storm-force winds extend outward up to 140 miles (220 km). The latest forecast from the Hurricane Center calls for Dorian to remain a Category 5 storm until Monday night before slowly weakening, but remaining a formidable hurricane, as it moves close to Florida and northward to the Carolinas.\r\n\r\nBecause the storm is predicted to be a slow mover, effects from wind, rain and storm surge could be prolonged, lingering through the middle of next week on Florida’s east coast.\r\n\r\n[Incredible views of Category 5 Hurricane Dorian near peak intensity]\r\n\r\nIrrespective of the storm’s ultimate course near Florida’s east coast to the North Carolina Outer Banks — or even inland — significant coastal flooding is likely because of the force of Dorian’s winds and astronomically high or king tides.\r\n\r\nThe risk of a direct strike on Florida is less than it was a few days ago but has not been eliminated. Much depends on the strength of the high-pressure area that has been pushing Dorian west toward the northern Bahamas and Florida. The high acts as a blocking mechanism to prevent the storm from turning north out to sea, at least until the high diminishes in strength.\r\n\r\nMost models show steering currents collapsing as Dorian nears Florida because of a weakening of the high, before it gets scooped up by a dip in the jet stream approaching the East Coast and starts turning north.\r\n\r\n“The timing of the northwest or north turn is very critical in determining how close Dorian will get to the Florida peninsula on Tuesday and Wednesday,” the Hurricane Center wrote.\r\n\r\nSome models don’t turn the storm soon enough, continuing to track the storm close enough for damaging impacts in parts of the state. One trend in the models overnight on Saturday and Sunday afternoon has been to show a slightly stronger high that brings the center of Dorian farther west, closer to the Florida coast and the Southeast coast, before making the northward turn.\r\n\r\n\r\n\r\nGroup of simulations from American (blue) and European (red) computer models from Sunday afternoon for Tropical Storm Dorian. Each color strand represents a different model simulation with slightly altered input data. Note that the strands are clustered together where the forecast track is most confident but diverge where the course of the storm is less certain. The bold red line is the average of all of the European model simulations, while the bold blue one is the average of all the American model simulations. (StormVistaWxModels.com)\r\n\r\nIn a statement, the National Weather Service forecast office in Melbourne, Florida, said “The situation has become more serious, especially for the east central Florida coastal counties,” based on recent forecast guidance.\r\n\r\n\r\n\r\nThreat of different hazards in Florida from Dorian. (National Weather Service)\r\n\r\nThe latest storm surge forecast for Florida shows that if the peak surge occurs at the time of high tide, the area from the Volusia and Brevard County Line to Jupiter Inlet could see 4 to 7 feet of water above ground, while the region from Deerfield Beach to Jupiter Inlet experiences 2 to 4 feet.\r\n\r\nFarther north into coastal Georgia and the Carolinas, the forecast is also a nail-biter. Just small differences in where the storm starts to turn north and, eventually, northeast and the shape of the turn will determine where and whether Dorian makes landfall.\r\n\r\nScenarios involving a direct hit, a graze and a near miss appear equally likely based on available forecasts. As the Hurricane Center writes: “Residents in these areas should continue to monitor the progress of Dorian.”\r\n\r\nThe shape of the coastline from northern Florida through the Carolinas means there is a risk of significant storm-surge flooding there even if the storm’s center remains just offshore.\r\n\r\nHowever, unlike with notorious recent storms such as Matthew and Florence, it’s unlikely that the Carolinas will experience devastating rainfall amounts from Hurricane Dorian, as the storm will pick up forward speed on nearing the Carolinas.\r\n\r\n1 of 38 Full Screen Autoplay Close Skip Ad × Scenes from the path of Hurricane Dorian View Photos Dorian began brewing into one of the strongest hurricanes on record, prompting panicked preparations in Florida and north through the Carolinas. But it was the Bahamas that bore the brunt of the then Category 5 storm’s fury. Caption Dorian began brewing into one of the strongest hurricanes on record, prompting panicked preparations in Florida and north through the Carolinas. But it was the Bahamas that bore the brunt of the then Category 5 storm’s fury. Carolyn Van Houten/The Washington Post Buy Photo Wait 1 second to continue.\r\n\r\nThe storm in historical context\r\n\r\nDorian is tied for the second-strongest storm (as judged by its maximum sustained winds) ever recorded in the Atlantic Ocean, behind Hurricane Allen of 1980, and, after striking the northern Bahamas, tied with the 1935 Labor Day Hurricane for the title of the strongest Atlantic hurricane at landfall.\r\n\r\n[Hurricane Dorian has smashed all sorts of intensity records in the Atlantic Ocean]\r\n\r\nDorian is only the second Category 5 hurricane to make landfall in the Bahamas since 1983, according to Phil Klotzbach of Colorado State University. The only other is Hurricane Andrew in 1992. The international hurricane database goes back continuously only to 1983.\r\n\r\nThe storm’s peak sustained winds rank as the strongest so far north in the Atlantic Ocean east of Florida on record. Its pressure, which bottomed out at 910 millibars, is significantly lower than Hurricane Andrew’s when it made landfall in south Florida in 1992 (the lower the pressure, the stronger the storm).\r\n\r\nFour straight years.\r\n\r\n\r\n\r\nFive category five hurricanes.\r\n\r\n\r\n\r\nFive incredible eyes. pic.twitter.com/LeD1nnbRZb — Dakota Smith (@weatherdak) September 1, 2019\r\n\r\nWith Dorian attaining Category 5 strength, this is the first time since the start of the satellite era (in the 1960s) that Category 5 storms have developed in the tropical Atlantic in four straight years, according to Capital Weather Gang’s tropical weather expert Brian McNoldy.\r\n',NULL,'','','',0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,NULL,NULL),(27,'','Karoun Demirjian','https://www.washingtonpost.com/politics/senate-gop-defends-trump-despite-oath-to-be-impartial-impeachment-jurors/2019/12/15/1dd9ed8a-1f49-11ea-86f3-3b5019d451db_story.html','2019-12-15 18:48:43','“That’s in violation of the oath that they’re about to take, and it’s a complete subversion of the constitutional scheme,” Nadler said.\r\n\r\nAD\r\n\r\nSenators take an oath to “do impartial justice” at the start of any impeachment trial — but several Republican senators argued that impartiality doesn’t cover politics.\r\n\r\nAD\r\n\r\n“I am clearly made up my mind. I’m not trying to hide the fact that I have disdain for the accusations in the process,” Sen. Lindsey O. Graham (R-S.C.) said Sunday on CBS’s “Face the Nation.”\r\n\r\nGraham called “this whole thing” a “crock” and warned that Democrats were “weaponizing impeachment.”\r\n\r\n“I want to end it. I don’t want to legitimize it,” he said.\r\n\r\n“Senators are not required, like jurors in a criminal trial, to be sequestered, not to talk to anyone, not to coordinate. There’s no prohibition,” Sen. Ted Cruz (R-Tex.) said on “This Week,” calling impeachment “inherently a political exercise” and Trump’s impeachment a “partisan show trial.”\r\n\r\nAD\r\n\r\nSen. Rand Paul (R-Ky.), speaking Sunday on CNN’s “State of the Union,” also argued that there was nothing wrong with senators having already made up their minds. Calling impeachment an effort to “criminalize politics,” he noted that “we’re going to hear the evidence repeated, but we’re not going to hear any new evidence.”\r\n\r\nAD\r\n\r\nSenate GOP leaders have been telling allies that they want to limit the trial to a short proceeding, omitting any witnesses from testifying. That isn’t sitting well with House Democratic leaders, who contend that senators should use their trial to secure evidence and testimony that the White House prevented House investigators from accessing.\r\n\r\n“They don’t want the American people to see the facts,” House Intelligence Committee Chairman Adam B. Schiff (D-Calif.) said Sunday on ABC, appearing alongside Nadler.\r\n\r\nAD\r\n\r\n“They realize that what’s been presented in the House is already overwhelming, but that there’s more damning evidence to be had,” Schiff continued. “I hope that the senators will insist on getting the documents, on hearing from other witnesses, on making up their own mind, even if there are some senators who have decided out of their blind allegiance to this president that he can do nothing wrong.”\r\n\r\nAD\r\n\r\nNadler added that senators should “demand the testimony” of people like Secretary of State Mike Pompeo, acting White House chief of staff Mick Mulvaney and former national security adviser John Bolton, “who at the president’s instruction have refused to testify.”\r\n\r\nThere are some Senate Republicans who want to hear from witnesses at the trial. But they aren’t thinking about Pompeo, Mulvaney and Bolton; they’re thinking about the whistleblower and Hunter Biden.\r\n\r\nAD\r\n\r\n“You can be sure we’re going to allow the president to defend himself,” Cruz said, adding: “That means, I believe, if the president wants to call witnesses, if the president wants to call Hunter Biden or wants to call the whistleblower, the senate should allow the president to do so.”\r\n\r\nHunter Biden, son of former vice president Joe Biden, sat on the board of Ukrainian energy company Burisma for five years and was paid as much as $50,000 a month, despite having no expertise on the subject matter. As Democrats have made the case that Trump tried to use his office to pressure a foreign leader into announcing investigations against a political rival, several Republicans have rallied around the countercharge that Trump was right to be concerned about “corruption” involving the Bidens — though it does not appear that Joe Biden, who was closely involved in Ukraine policy, made any decisions to advantage the company.\r\n\r\nAD\r\n\r\n“I love Joe Biden, but none of us are above scrutiny,” Graham said Sunday, noting there were “legitimate concerns” about Hunter Biden’s activity. But he added that the Senate could look at all of those issues — as well as whatever new information Trump’s lawyer Rudolph W. Giuliani unearthed in his latest trip to Ukraine — “after impeachment” and should move ahead without witnesses.\r\n\r\nAD\r\n\r\nIt is not clear whether the senate will be forced to hold separate votes on witnesses — or if most of the GOP would hold rank in that situation. It takes 51 senators to approve a motion. There are 53 Republicans in the Senate, meaning the GOP can afford to lose no more than two senators on any motion for McConnell to fully control the course of the trial.\r\n\r\nPaul guessed that, ultimately, two Democratic senators would end up joining all Republicans in voting to acquit Trump, just as a handful of Democrats are expected to join the GOP in the House to vote against impeachment.\r\n\r\nAD\r\n\r\nPaul did not say who those two Democrats might be. At this point, some Democratic senators are taking pains to avoid committing to vote to convict the president, even if they are otherwise echoing House Democrats’ frustrations with the president’s actions.\r\n\r\nSen. Sherrod Brown (D-Ohio) said on “State of the Union” that Trump “did things Richard Nixon never did.” But he hedged when asked whether Trump’s transgressions rose to the need for removal, noting that senators should make that decision “based on the evidence.”\r\n\r\nAD\r\n',NULL,'Senate GOP defends Trump, despite oath to be impartial impeachment jurors','','washingtonpost.com',0,1711363848,0,582,NULL,NULL,156,182,0,0.86,72,0,160,101,0,0,0,328,3,0,NULL,NULL,NULL),(60,'','Rosalind S. Helderman','https://www.washingtonpost.com/politics/once-this-is-over-well-be-kings-how-lev-parnas-worked-his-way-into-trumps-world--and-now-is-rattling-it/2020/01/18/68542ff4-3940-11ea-9541-9107303481a4_story.html','2020-01-20 18:27:33','ffffffffffffff',NULL,'‘Once this is over, we’ll be kings’: How Lev Parnas worked his way into Trump’s world','','washingtonpost.com',0,1814934879,0,16224,NULL,NULL,166,4914,23,0.97,1553,244,5687,1506,37,0,374,9737,21,207,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',NULL,NULL);
-/*!40000 ALTER TABLE `article` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Temporary view structure for view `article_current_status`
---
-
-DROP TABLE IF EXISTS `article_current_status`;
-/*!50001 DROP VIEW IF EXISTS `article_current_status`*/;
-SET @saved_cs_client = @@character_set_client;
-/*!50503 SET character_set_client = utf8mb4 */;
-/*!50001 CREATE VIEW `article_current_status` AS SELECT
- 1 AS `id`,
- 1 AS `title`,
- 1 AS `author`,
- 1 AS `url`,
- 1 AS `publish_date`,
- 1 AS `article_text`,
- 1 AS `status_code`*/;
-SET character_set_client = @saved_cs_client;
-
---
--- Table structure for table `article_has_status`
---
-
-DROP TABLE IF EXISTS `article_has_status`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!50503 SET character_set_client = utf8mb4 */;
-CREATE TABLE `article_has_status` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `article_id` int(11) DEFAULT NULL,
- `article_status_id` int(11) DEFAULT NULL,
- `date_changed` timestamp NULL DEFAULT NULL,
- `comment` text,
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=62 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `article_has_status`
---
-
-LOCK TABLES `article_has_status` WRITE;
-/*!40000 ALTER TABLE `article_has_status` DISABLE KEYS */;
-INSERT INTO `article_has_status` VALUES (1,1,1,'2019-09-19 03:29:00','aaaaa'),(2,2,1,'2019-09-19 03:29:00','bbbbb'),(3,2,2,'2019-09-19 04:29:00','ccc'),(4,3,1,'2019-10-27 16:51:32',''),(5,4,2,'2019-11-11 04:28:28',''),(6,5,2,'2019-12-08 16:44:42',''),(7,6,2,'2019-12-08 16:48:06',''),(8,7,2,'2019-12-08 16:54:51',''),(9,8,2,'2019-12-08 16:56:29',''),(10,9,2,'2019-12-08 17:03:06',''),(11,10,2,'2019-12-08 17:04:50',''),(12,11,2,'2019-12-08 17:08:58',''),(13,12,2,'2019-12-08 17:31:14',''),(14,13,2,'2019-12-08 17:33:13',''),(15,14,2,'2019-12-08 17:42:57',''),(16,15,2,'2019-12-08 17:47:33',''),(17,16,2,'2019-12-08 17:48:38',''),(18,17,2,'2019-12-08 17:53:12',''),(19,18,2,'2019-12-08 17:54:27',''),(20,19,2,'2019-12-08 20:27:47',''),(21,20,2,'2019-12-08 20:29:28',''),(22,21,2,'2019-12-08 20:34:08',''),(23,22,2,'2019-12-08 20:36:53',''),(24,23,2,'2019-12-08 20:39:45',''),(25,24,2,'2019-12-08 20:42:18',''),(26,25,2,'2019-12-08 20:45:45',''),(27,26,2,'2019-12-15 18:43:43',''),(28,27,2,'2019-12-15 18:48:43',''),(29,28,2,'2019-12-22 17:30:34',''),(30,29,2,'2019-12-22 17:32:44',''),(31,30,2,'2019-12-22 17:35:39',''),(32,31,2,'2019-12-22 17:39:45',''),(33,32,2,'2019-12-22 17:42:14',''),(34,33,2,'2020-01-05 16:25:39',''),(35,34,2,'2020-01-05 16:53:18',''),(36,35,2,'2020-01-05 16:57:10',''),(37,36,2,'2020-01-05 16:58:41',''),(38,37,2,'2020-01-05 16:59:49',''),(39,38,2,'2020-01-05 17:19:38',''),(40,39,2,'2020-01-05 17:30:32',''),(41,40,2,'2020-01-05 17:32:27',''),(42,41,2,'2020-01-05 17:39:54',''),(43,42,2,'2020-01-11 17:55:39',''),(44,43,2,'2020-01-11 19:13:57',''),(45,44,2,'2020-01-11 19:52:29',''),(46,45,2,'2020-01-11 19:53:44',''),(47,46,2,'2020-01-11 19:56:04',''),(48,47,2,'2020-01-11 20:09:20',''),(49,48,2,'2020-01-11 20:12:19',''),(50,49,2,'2020-01-11 20:18:10',''),(51,50,2,'2020-01-11 20:21:16',''),(52,51,2,'2020-01-11 20:24:27',''),(53,52,2,'2020-01-11 20:29:25',''),(54,53,2,'2020-01-11 20:31:25',''),(55,54,2,'2020-01-11 20:31:37',''),(56,55,2,'2020-01-11 20:47:32',''),(57,56,2,'2020-01-11 20:49:01',''),(58,57,2,'2020-01-11 21:45:14',''),(59,58,2,'2020-01-12 18:16:09',''),(60,59,2,'2020-01-20 18:26:15',''),(61,60,2,'2020-01-20 18:27:33','');
-/*!40000 ALTER TABLE `article_has_status` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `article_status`
---
-
-DROP TABLE IF EXISTS `article_status`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!50503 SET character_set_client = utf8mb4 */;
-CREATE TABLE `article_status` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `status_code` char(10) DEFAULT NULL,
- `status_text` char(100) DEFAULT NULL,
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `article_status`
---
-
-LOCK TABLES `article_status` WRITE;
-/*!40000 ALTER TABLE `article_status` DISABLE KEYS */;
-INSERT INTO `article_status` VALUES (1,'BUZZ','Url From BuzzFeed'),(2,'USER','Url from User'),(3,'APPROVED','NICK Approved for tag works'),(4,'ERROR','Error');
-/*!40000 ALTER TABLE `article_status` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Temporary view structure for view `article_status_view`
---
-
-DROP TABLE IF EXISTS `article_status_view`;
-/*!50001 DROP VIEW IF EXISTS `article_status_view`*/;
-SET @saved_cs_client = @@character_set_client;
-/*!50503 SET character_set_client = utf8mb4 */;
-/*!50001 CREATE VIEW `article_status_view` AS SELECT
- 1 AS `id`,
- 1 AS `article_id`,
- 1 AS `date_changed`,
- 1 AS `comment`,
- 1 AS `status_code`,
- 1 AS `status_text`*/;
-SET character_set_client = @saved_cs_client;
-
---
--- Temporary view structure for view `article_sub_status_view`
---
-
-DROP TABLE IF EXISTS `article_sub_status_view`;
-/*!50001 DROP VIEW IF EXISTS `article_sub_status_view`*/;
-SET @saved_cs_client = @@character_set_client;
-/*!50503 SET character_set_client = utf8mb4 */;
-/*!50001 CREATE VIEW `article_sub_status_view` AS SELECT
- 1 AS `article_id`,
- 1 AS `MaxDateTime`*/;
-SET character_set_client = @saved_cs_client;
-
---
--- Current Database: `publiceditor`
---
-
-USE `publiceditor`;
-
---
--- Final view structure for view `article_current_status`
---
-
-/*!50001 DROP VIEW IF EXISTS `article_current_status`*/;
-/*!50001 SET @saved_cs_client = @@character_set_client */;
-/*!50001 SET @saved_cs_results = @@character_set_results */;
-/*!50001 SET @saved_col_connection = @@collation_connection */;
-/*!50001 SET character_set_client = cp850 */;
-/*!50001 SET character_set_results = cp850 */;
-/*!50001 SET collation_connection = cp850_general_ci */;
-/*!50001 CREATE ALGORITHM=UNDEFINED */
-/*!50001 VIEW `article_current_status` AS select `a`.`id` AS `id`,`a`.`title` AS `title`,`a`.`author` AS `author`,`a`.`url` AS `url`,`a`.`publish_date` AS `publish_date`,`a`.`article_text` AS `article_text`,`st`.`status_code` AS `status_code` from (((`article` `a` join `article_has_status` `ahs`) join `article_status` `st`) join `article_sub_status_view` `assv`) where ((`ahs`.`article_id` = `assv`.`article_id`) and (`ahs`.`date_changed` = `assv`.`MaxDateTime`) and (`a`.`id` = `assv`.`article_id`) and (`st`.`id` = `ahs`.`article_status_id`)) */;
-/*!50001 SET character_set_client = @saved_cs_client */;
-/*!50001 SET character_set_results = @saved_cs_results */;
-/*!50001 SET collation_connection = @saved_col_connection */;
-
---
--- Final view structure for view `article_status_view`
---
-
-/*!50001 DROP VIEW IF EXISTS `article_status_view`*/;
-/*!50001 SET @saved_cs_client = @@character_set_client */;
-/*!50001 SET @saved_cs_results = @@character_set_results */;
-/*!50001 SET @saved_col_connection = @@collation_connection */;
-/*!50001 SET character_set_client = utf8mb4 */;
-/*!50001 SET character_set_results = utf8mb4 */;
-/*!50001 SET collation_connection = utf8mb4_0900_ai_ci */;
-/*!50001 CREATE ALGORITHM=UNDEFINED */
-/*!50001 VIEW `article_status_view` AS select `ahs`.`id` AS `id`,`ahs`.`article_id` AS `article_id`,`ahs`.`date_changed` AS `date_changed`,`ahs`.`comment` AS `comment`,`ast`.`status_code` AS `status_code`,`ast`.`status_text` AS `status_text` from (`article_has_status` `ahs` join `article_status` `ast`) where (`ahs`.`article_status_id` = `ast`.`id`) order by `ahs`.`id` desc */;
-/*!50001 SET character_set_client = @saved_cs_client */;
-/*!50001 SET character_set_results = @saved_cs_results */;
-/*!50001 SET collation_connection = @saved_col_connection */;
-
---
--- Final view structure for view `article_sub_status_view`
---
-
-/*!50001 DROP VIEW IF EXISTS `article_sub_status_view`*/;
-/*!50001 SET @saved_cs_client = @@character_set_client */;
-/*!50001 SET @saved_cs_results = @@character_set_results */;
-/*!50001 SET @saved_col_connection = @@collation_connection */;
-/*!50001 SET character_set_client = cp850 */;
-/*!50001 SET character_set_results = cp850 */;
-/*!50001 SET collation_connection = cp850_general_ci */;
-/*!50001 CREATE ALGORITHM=UNDEFINED */
-/*!50001 VIEW `article_sub_status_view` AS select `article_has_status`.`article_id` AS `article_id`,max(`article_has_status`.`date_changed`) AS `MaxDateTime` from `article_has_status` group by `article_has_status`.`article_id` */;
-/*!50001 SET character_set_client = @saved_cs_client */;
-/*!50001 SET character_set_results = @saved_cs_results */;
-/*!50001 SET collation_connection = @saved_col_connection */;
-/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
-
-/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
-/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
-/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
-/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
-/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
-/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-
--- Dump completed on 2020-03-15 17:54:45
diff --git a/ArticleJavaServer/MySQLArticleDatabase/init_db.sh b/ArticleJavaServer/MySQLArticleDatabase/init_db.sh
index e47f142..9921f1b 100755
--- a/ArticleJavaServer/MySQLArticleDatabase/init_db.sh
+++ b/ArticleJavaServer/MySQLArticleDatabase/init_db.sh
@@ -7,8 +7,6 @@ user = ${MYSQL_ROOT_USER}
password = ${MYSQL_ROOT_PASSWORD}
EOF
chmod 0600 my.cnf
-echo "Initializing database '${MYSQL_DATABASE}' on host '${MYSQL_HOST}' with a-users.sql"
-mysql --defaults-extra-file=my.cnf -h ${MYSQL_HOST} ${MYSQL_DATABASE} < /docker-entrypoint-initdb.d/a-users.sql
echo "Initializing database '${MYSQL_DATABASE}' on host '${MYSQL_HOST}' with publiceditor-database-dump.sql"
mysql --defaults-extra-file=my.cnf -h ${MYSQL_HOST} ${MYSQL_DATABASE} < /docker-entrypoint-initdb.d/publiceditor-database-dump.sql
@@ -22,6 +20,7 @@ mysql --defaults-extra-file=my.cnf -h ${MYSQL_HOST} ${MYSQL_DATABASE} < /docker-
mysql --defaults-extra-file=my.cnf -h ${MYSQL_HOST} mysql <my.cnf
[mysql]
-user = ${MYSQL_ROOT_USER}
-password = ${MYSQL_ROOT_PASSWORD}
+user = ${MYSQL_USER}
+password = ${MYSQL_PASSWORD}
EOF
chmod 0600 my.cnf
mysql --defaults-extra-file=my.cnf -h ${MYSQL_HOST} ${MYSQL_DATABASE}
diff --git a/ArticleJavaServer/MySQLArticleDatabase/mysql_root.sh b/ArticleJavaServer/MySQLArticleDatabase/mysql_root.sh
new file mode 100755
index 0000000..92587a3
--- /dev/null
+++ b/ArticleJavaServer/MySQLArticleDatabase/mysql_root.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+# Mysql client login script
+set -e
+cat <my.cnf
+[mysql]
+user = ${MYSQL_ROOT_USER}
+password = ${MYSQL_ROOT_PASSWORD}
+EOF
+chmod 0600 my.cnf
+mysql --defaults-extra-file=my.cnf -h ${MYSQL_HOST} ${MYSQL_DATABASE}
diff --git a/ArticleJavaServer/MySQLArticleDatabase/publiceditor-database-dump.sql b/ArticleJavaServer/MySQLArticleDatabase/publiceditor-database-dump.sql
index b5379b4..db848ce 100644
--- a/ArticleJavaServer/MySQLArticleDatabase/publiceditor-database-dump.sql
+++ b/ArticleJavaServer/MySQLArticleDatabase/publiceditor-database-dump.sql
@@ -2,7 +2,7 @@
--
-- Host: localhost Database: publiceditor
-- ------------------------------------------------------
--- Server version 8.0.18
+-- Server version 8.0.18
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
@@ -43,7 +43,7 @@ CREATE TABLE `article` (
`domain_name` char(100) DEFAULT NULL,
`updated_at` int(11) DEFAULT NULL,
`buzzsumo_article_id` int(11) DEFAULT NULL,
- `published_date` int(11) DEFAULT NULL,
+ `published_date` timestamp DEFAULT NULL,
`total_shares` int(11) DEFAULT NULL,
`thumbnail_url` char(200) DEFAULT NULL,
`num_words` int(11) DEFAULT NULL,
@@ -64,18 +64,58 @@ CREATE TABLE `article` (
`vis_data` mediumtext,
`tagworks_id` int(11) DEFAULT NULL,
`article_hash` char(64) DEFAULT NULL,
+ `filename` text NULL DEFAULT NULL,
+ `submit_count` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
+-- TODO ADD COUNTER FIELD NUMERIC
+
--
-- Dumping data for table `article`
--
LOCK TABLES `article` WRITE;
/*!40000 ALTER TABLE `article` DISABLE KEYS */;
-INSERT INTO `article` VALUES (1,'the meaning of life','anonymous','www.life.com/meaning.htm','2012-01-01 15:00:00','Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.','ggggg','the meaning of life',NULL,NULL,234234234,234234234,234234234,3333,'',444,33,3333,44,0.55,444,55,666,777,44,44,44,44,44,44,NULL,NULL,NULL),(2,'the meaning of happiness','buddha','www.happinesstimes.com/happiness-meanng.html','2012-02-02 15:00:00','Scelerisque varius morbi enim nunc faucibus a. Laoreet id donec ultrices tincidunt arcu non sodales neque. Mi quis hendrerit dolor magna. Sapien eget mi proin sed libero enim. Nibh tortor id aliquet lectus. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Ipsum a arcu cursus vitae congue mauris rhoncus. Nunc vel risus commodo viverra maecenas accumsan lacus vel facilisis. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit. Faucibus ornare suspendisse sed nisi lacus. Mattis enim ut tellus elementum sagittis vitae et.',NULL,'the meaning of happiness',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(3,'','','https://www.google.com','2019-10-27 16:51:32','Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Nisl tincidunt eget nullam non nisi. Eu mi bibendum neque egestas congue quisque. Tortor at risus viverra adipiscing at in tellus integer feugiat. Vel turpis nunc eget lorem dolor. Massa massa ultricies mi quis hendrerit dolor magna eget est. Faucibus et molestie ac feugiat sed lectus vestibulum. Massa tincidunt dui ut ornare lectus sit amet. Vel eros donec ac odio tempor. Nec feugiat nisl pretium fusce id velit. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque.',NULL,'hijklmnop hijklmnop',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(4,'','','www.washingtonpost.com/politics/as-warren-and-buttigieg-rise-the-democratic-presidential-race-is-competitive-and-fluid-a-washington-post-abc-news-poll-finds/2019/11/02/4b7aca3c-fccd-11e9-8906-ab6b60de9124_story.html','2019-11-11 04:28:28','With peak winds of 185 mph, Hurricane Dorian became the strongest storm on record to strike the Bahamas Sunday and among the top few most intense ever observed in the Atlantic Ocean. The Category 5 storm next threatens to bring hurricane force winds, coastal flooding and heavy rain to the east coast of Florida and Southeast U.S.\r\n\r\nDorian’s winds had only eased modestly, down to 180 mph at 11 p.m. Sunday, still generating “catastrophic conditions” in the northern Bahamas. The National Hurricane Center stated the storm made landfall on Grand Bahama Island at 11 p.m. after slamming into Great Abaco earlier in the day.\r\n\r\n“Dorian remains an incredibly powerful hurricane,” the Hurricane Center wrote.\r\n\r\nAs the storm closes in on Florida’s east coast, the National Hurricane Center has posted hurricane and storm surge warnings for some areas. The storm surge is the storm-driven rise in water above normally dry land at the coast:\r\n\r\nThe hurricane warning stretches from Jupiter Inlet (just north of West Palm Beach) to the Volusia/Brevard county line (just north of Titusville).\r\n\r\nThe storm surge warning spans from near West Palm Beach to Titusville. In some areas the surge could reach 4 to 7 feet, the Hurricane Center projects.\r\n\r\nThese warnings are focused on the period from Monday night through early Wednesday. Tropical storm-force winds could begin in south Florida as soon as Monday afternoon and continue into Tuesday and Wednesday, perhaps reaching hurricane-force Tuesday depending how close to the coast Dorian tracks.\r\n\r\nIn addition to the wind and surge, about to three to six inches of rain is projected along Florida’s east coast.\r\n\r\nAlthough the center of Dorian, containing its extreme Category 5 winds, may remain offshore Florida, its forecast track is so close to the coast that it necessitated warnings. “A small deviation to the left of the track could bring the intense core of the hurricane its dangerous winds closer to or onto the Florida coast,” the Hurricane Center wrote.\r\n\r\n\r\n\r\nHurricane Dorian on Sunday morning. (NOAA)\r\n\r\nBeyond Florida, Dorian will take aim at coastal Georgia and the Carolinas Wednesday through Friday. “There is an increasing likelihood of strong winds and dangerous storm surge along the coasts of Georgia, South Carolina, North Carolina later this week,” the Hurricane Center wrote. “Residents in these areas should continue to monitor the progress of Dorian and listen to advice given by local emergency officials.”\r\n\r\nEffects on the Bahamas\r\n\r\nWhile Florida and areas farther north await effects from the monster storm, a “catastrophic” scenario is unfolding in the northwestern Bahamas, where the storm’s eyewall, the ring of destructive winds around the center, struck Sunday. On Great Abaco, which suffered a direct hit, the Hurricane Center warned of a “life-threatening situation” into Sunday evening.\r\n\r\n[‘Pray for us’: Dorian snapping trees, tearing off roofs in the Bahamas]\r\n\r\nWatch #MarshHarbour go through the eye of #Dorian. Took 3 hours from western eyewall exit to now entering Southeast eyewall. #Bahamas pic.twitter.com/DcVKrA7SrB — Bill Karins (@BillKarins) September 1, 2019\r\n\r\nOn Sunday night, as the storm’s eyewall rammed into Grand Bahama Island, the storm was predicted to unleash wind gusts over 200 mph, along with storm surge flooding of 18 to 23 feet above normal tide levels. “These hazards will cause extreme destruction in the affected areas and will continue for several hours,” the Hurricane Center stated.\r\n\r\nThe eye of Hurricane Dorian is slowly approaching the eastern end of Grand Bahama Island Sunday evening as viewed from the Miami, Florida radar. pic.twitter.com/SNiOSAotoN — NWS Eastern Region (@NWSEastern) September 2, 2019\r\n\r\nThe storm’s core of devastating wind and torrential rain, totaling up to 30 inches, may sit for at least 24 hours over the northern Bahamas as steering currents in the atmosphere collapse, causing Dorian to meander slowly, if not stall outright, for a time.\r\n\r\nIn short, this is a storm that, depending on its exact track over the northern Bahamas, particularly Grand Bahama and the Abaco Islands, could reshape these locations for decades.\r\n\r\nAs of 11 p.m., the storm was 55 miles east of Freeport on Grand Bahama Island and was crawling west at 5 mph. The storm’s peak winds were 180 mph, and Dorian has maintained Category 4 and now Category 5 intensity for an unusually long period.\r\n\r\nStorms this powerful typically tend to undergo cycles that weaken their high-end winds for a time, but Dorian has somehow avoided this dynamic.\r\n\r\nThe threat to Florida and the Southeast\r\n\r\nAfter models run early Saturday shifted the storm track offshore Florida, some that were run late Saturday into Sunday shifted it back closer to the Florida coast.\r\n\r\nDorian has grown larger in size, which may have implications for the Florida forecast. Hurricane-force winds now extend outward up to 45 miles from the center and tropical-storm-force winds extend outward up to 140 miles (220 km). The latest forecast from the Hurricane Center calls for Dorian to remain a Category 5 storm until Monday night before slowly weakening, but remaining a formidable hurricane, as it moves close to Florida and northward to the Carolinas.\r\n\r\nBecause the storm is predicted to be a slow mover, effects from wind, rain and storm surge could be prolonged, lingering through the middle of next week on Florida’s east coast.\r\n\r\n[Incredible views of Category 5 Hurricane Dorian near peak intensity]\r\n\r\nIrrespective of the storm’s ultimate course near Florida’s east coast to the North Carolina Outer Banks — or even inland — significant coastal flooding is likely because of the force of Dorian’s winds and astronomically high or king tides.\r\n\r\nThe risk of a direct strike on Florida is less than it was a few days ago but has not been eliminated. Much depends on the strength of the high-pressure area that has been pushing Dorian west toward the northern Bahamas and Florida. The high acts as a blocking mechanism to prevent the storm from turning north out to sea, at least until the high diminishes in strength.\r\n\r\nMost models show steering currents collapsing as Dorian nears Florida because of a weakening of the high, before it gets scooped up by a dip in the jet stream approaching the East Coast and starts turning north.\r\n\r\n“The timing of the northwest or north turn is very critical in determining how close Dorian will get to the Florida peninsula on Tuesday and Wednesday,” the Hurricane Center wrote.\r\n\r\nSome models don’t turn the storm soon enough, continuing to track the storm close enough for damaging impacts in parts of the state. One trend in the models overnight on Saturday and Sunday afternoon has been to show a slightly stronger high that brings the center of Dorian farther west, closer to the Florida coast and the Southeast coast, before making the northward turn.\r\n\r\n\r\n\r\nGroup of simulations from American (blue) and European (red) computer models from Sunday afternoon for Tropical Storm Dorian. Each color strand represents a different model simulation with slightly altered input data. Note that the strands are clustered together where the forecast track is most confident but diverge where the course of the storm is less certain. The bold red line is the average of all of the European model simulations, while the bold blue one is the average of all the American model simulations. (StormVistaWxModels.com)\r\n\r\nIn a statement, the National Weather Service forecast office in Melbourne, Florida, said “The situation has become more serious, especially for the east central Florida coastal counties,” based on recent forecast guidance.\r\n\r\n\r\n\r\nThreat of different hazards in Florida from Dorian. (National Weather Service)\r\n\r\nThe latest storm surge forecast for Florida shows that if the peak surge occurs at the time of high tide, the area from the Volusia and Brevard County Line to Jupiter Inlet could see 4 to 7 feet of water above ground, while the region from Deerfield Beach to Jupiter Inlet experiences 2 to 4 feet.\r\n\r\nFarther north into coastal Georgia and the Carolinas, the forecast is also a nail-biter. Just small differences in where the storm starts to turn north and, eventually, northeast and the shape of the turn will determine where and whether Dorian makes landfall.\r\n\r\nScenarios involving a direct hit, a graze and a near miss appear equally likely based on available forecasts. As the Hurricane Center writes: “Residents in these areas should continue to monitor the progress of Dorian.”\r\n\r\nThe shape of the coastline from northern Florida through the Carolinas means there is a risk of significant storm-surge flooding there even if the storm’s center remains just offshore.\r\n\r\nHowever, unlike with notorious recent storms such as Matthew and Florence, it’s unlikely that the Carolinas will experience devastating rainfall amounts from Hurricane Dorian, as the storm will pick up forward speed on nearing the Carolinas.\r\n\r\n1 of 38 Full Screen Autoplay Close Skip Ad × Scenes from the path of Hurricane Dorian View Photos Dorian began brewing into one of the strongest hurricanes on record, prompting panicked preparations in Florida and north through the Carolinas. But it was the Bahamas that bore the brunt of the then Category 5 storm’s fury. Caption Dorian began brewing into one of the strongest hurricanes on record, prompting panicked preparations in Florida and north through the Carolinas. But it was the Bahamas that bore the brunt of the then Category 5 storm’s fury. Carolyn Van Houten/The Washington Post Buy Photo Wait 1 second to continue.\r\n\r\nThe storm in historical context\r\n\r\nDorian is tied for the second-strongest storm (as judged by its maximum sustained winds) ever recorded in the Atlantic Ocean, behind Hurricane Allen of 1980, and, after striking the northern Bahamas, tied with the 1935 Labor Day Hurricane for the title of the strongest Atlantic hurricane at landfall.\r\n\r\n[Hurricane Dorian has smashed all sorts of intensity records in the Atlantic Ocean]\r\n\r\nDorian is only the second Category 5 hurricane to make landfall in the Bahamas since 1983, according to Phil Klotzbach of Colorado State University. The only other is Hurricane Andrew in 1992. The international hurricane database goes back continuously only to 1983.\r\n\r\nThe storm’s peak sustained winds rank as the strongest so far north in the Atlantic Ocean east of Florida on record. Its pressure, which bottomed out at 910 millibars, is significantly lower than Hurricane Andrew’s when it made landfall in south Florida in 1992 (the lower the pressure, the stronger the storm).\r\n\r\nFour straight years.\r\n\r\n\r\n\r\nFive category five hurricanes.\r\n\r\n\r\n\r\nFive incredible eyes. pic.twitter.com/LeD1nnbRZb — Dakota Smith (@weatherdak) September 1, 2019\r\n\r\nWith Dorian attaining Category 5 strength, this is the first time since the start of the satellite era (in the 1960s) that Category 5 storms have developed in the tropical Atlantic in four straight years, according to Capital Weather Gang’s tropical weather expert Brian McNoldy.\r\n',NULL,'','','',0,0,0,0,NULL,NULL,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NULL,NULL,NULL),(27,'','Karoun Demirjian','https://www.washingtonpost.com/politics/senate-gop-defends-trump-despite-oath-to-be-impartial-impeachment-jurors/2019/12/15/1dd9ed8a-1f49-11ea-86f3-3b5019d451db_story.html','2019-12-15 18:48:43','“That’s in violation of the oath that they’re about to take, and it’s a complete subversion of the constitutional scheme,” Nadler said.\r\n\r\nAD\r\n\r\nSenators take an oath to “do impartial justice” at the start of any impeachment trial — but several Republican senators argued that impartiality doesn’t cover politics.\r\n\r\nAD\r\n\r\n“I am clearly made up my mind. I’m not trying to hide the fact that I have disdain for the accusations in the process,” Sen. Lindsey O. Graham (R-S.C.) said Sunday on CBS’s “Face the Nation.”\r\n\r\nGraham called “this whole thing” a “crock” and warned that Democrats were “weaponizing impeachment.”\r\n\r\n“I want to end it. I don’t want to legitimize it,” he said.\r\n\r\n“Senators are not required, like jurors in a criminal trial, to be sequestered, not to talk to anyone, not to coordinate. There’s no prohibition,” Sen. Ted Cruz (R-Tex.) said on “This Week,” calling impeachment “inherently a political exercise” and Trump’s impeachment a “partisan show trial.”\r\n\r\nAD\r\n\r\nSen. Rand Paul (R-Ky.), speaking Sunday on CNN’s “State of the Union,” also argued that there was nothing wrong with senators having already made up their minds. Calling impeachment an effort to “criminalize politics,” he noted that “we’re going to hear the evidence repeated, but we’re not going to hear any new evidence.”\r\n\r\nAD\r\n\r\nSenate GOP leaders have been telling allies that they want to limit the trial to a short proceeding, omitting any witnesses from testifying. That isn’t sitting well with House Democratic leaders, who contend that senators should use their trial to secure evidence and testimony that the White House prevented House investigators from accessing.\r\n\r\n“They don’t want the American people to see the facts,” House Intelligence Committee Chairman Adam B. Schiff (D-Calif.) said Sunday on ABC, appearing alongside Nadler.\r\n\r\nAD\r\n\r\n“They realize that what’s been presented in the House is already overwhelming, but that there’s more damning evidence to be had,” Schiff continued. “I hope that the senators will insist on getting the documents, on hearing from other witnesses, on making up their own mind, even if there are some senators who have decided out of their blind allegiance to this president that he can do nothing wrong.”\r\n\r\nAD\r\n\r\nNadler added that senators should “demand the testimony” of people like Secretary of State Mike Pompeo, acting White House chief of staff Mick Mulvaney and former national security adviser John Bolton, “who at the president’s instruction have refused to testify.”\r\n\r\nThere are some Senate Republicans who want to hear from witnesses at the trial. But they aren’t thinking about Pompeo, Mulvaney and Bolton; they’re thinking about the whistleblower and Hunter Biden.\r\n\r\nAD\r\n\r\n“You can be sure we’re going to allow the president to defend himself,” Cruz said, adding: “That means, I believe, if the president wants to call witnesses, if the president wants to call Hunter Biden or wants to call the whistleblower, the senate should allow the president to do so.”\r\n\r\nHunter Biden, son of former vice president Joe Biden, sat on the board of Ukrainian energy company Burisma for five years and was paid as much as $50,000 a month, despite having no expertise on the subject matter. As Democrats have made the case that Trump tried to use his office to pressure a foreign leader into announcing investigations against a political rival, several Republicans have rallied around the countercharge that Trump was right to be concerned about “corruption” involving the Bidens — though it does not appear that Joe Biden, who was closely involved in Ukraine policy, made any decisions to advantage the company.\r\n\r\nAD\r\n\r\n“I love Joe Biden, but none of us are above scrutiny,” Graham said Sunday, noting there were “legitimate concerns” about Hunter Biden’s activity. But he added that the Senate could look at all of those issues — as well as whatever new information Trump’s lawyer Rudolph W. Giuliani unearthed in his latest trip to Ukraine — “after impeachment” and should move ahead without witnesses.\r\n\r\nAD\r\n\r\nIt is not clear whether the senate will be forced to hold separate votes on witnesses — or if most of the GOP would hold rank in that situation. It takes 51 senators to approve a motion. There are 53 Republicans in the Senate, meaning the GOP can afford to lose no more than two senators on any motion for McConnell to fully control the course of the trial.\r\n\r\nPaul guessed that, ultimately, two Democratic senators would end up joining all Republicans in voting to acquit Trump, just as a handful of Democrats are expected to join the GOP in the House to vote against impeachment.\r\n\r\nAD\r\n\r\nPaul did not say who those two Democrats might be. At this point, some Democratic senators are taking pains to avoid committing to vote to convict the president, even if they are otherwise echoing House Democrats’ frustrations with the president’s actions.\r\n\r\nSen. Sherrod Brown (D-Ohio) said on “State of the Union” that Trump “did things Richard Nixon never did.” But he hedged when asked whether Trump’s transgressions rose to the need for removal, noting that senators should make that decision “based on the evidence.”\r\n\r\nAD\r\n',NULL,'Senate GOP defends Trump, despite oath to be impartial impeachment jurors','','washingtonpost.com',0,1711363848,0,582,NULL,NULL,156,182,0,0.86,72,0,160,101,0,0,0,328,3,0,NULL,NULL,NULL),(60,'','Rosalind S. Helderman','https://www.washingtonpost.com/politics/once-this-is-over-well-be-kings-how-lev-parnas-worked-his-way-into-trumps-world--and-now-is-rattling-it/2020/01/18/68542ff4-3940-11ea-9541-9107303481a4_story.html','2020-01-20 18:27:33','ffffffffffffff',NULL,'‘Once this is over, we’ll be kings’: How Lev Parnas worked his way into Trump’s world','','washingtonpost.com',0,1814934879,0,16224,NULL,NULL,166,4914,23,0.97,1553,244,5687,1506,37,0,374,9737,21,207,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',NULL,NULL);
+INSERT INTO `article` VALUES
+(1
+,'title test'
+,'author test'
+,'www.life.com/meaning.htm'
+,'2012-01-01 15:00:00'
+,'Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident sunt in culpa qui officia deserunt mollit anim id est laborum.'
+,'author name test'
+,'article title test'
+,NULL
+,'www.life.com'
+,234234234
+,234234234
+,'2012-01-01 15:00:00'
+,3333
+,''
+,444
+,33
+,3333
+,44
+,0.55
+,444
+,55
+,666
+,777
+,44
+,44
+,44
+,44
+,44
+,44
+,NULL
+,NULL
+,NULL
+,NULL
+,0)
+;
/*!40000 ALTER TABLE `article` ENABLE KEYS */;
UNLOCK TABLES;
@@ -145,7 +185,12 @@ CREATE TABLE `article_status` (
LOCK TABLES `article_status` WRITE;
/*!40000 ALTER TABLE `article_status` DISABLE KEYS */;
-INSERT INTO `article_status` VALUES (1,'BUZZ','Url From BuzzFeed'),(2,'USER','Url from User'),(3,'APPROVED','NICK Approved for tag works'),(4,'ERROR','Error');
+INSERT INTO `article_status` VALUES
+(1,'BUZZ','Url From BuzzFeed'),
+(2,'USER','Url from User'),
+(3,'APPROVED','NICK Approved for tag works'),
+(4,'ERROR','Error'),
+(5,'SENT','Sent to Tagworks');
/*!40000 ALTER TABLE `article_status` ENABLE KEYS */;
UNLOCK TABLES;
@@ -246,3 +291,190 @@ USE `publiceditor`;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2020-03-15 17:54:45
+
+
+
+DROP VIEW IF EXISTS `article_status_view`;
+CREATE VIEW `article_status_view` AS select `ahs`.`id` AS `id`,`ahs`.`article_id` AS `article_id`,`ahs`.`date_changed` AS `date_changed`,`ahs`.`comment` AS `comment`,`ast`.`status_code` AS `status_code`,`ast`.`status_text` AS `status_text` from (`article_has_status` `ahs` join `article_status` `ast`) where (`ahs`.`article_status_id` = `ast`.`id`) order by `ahs`.`id` desc ;
+
+DROP VIEW IF EXISTS `article_sub_status_view`;
+CREATE VIEW `article_sub_status_view` AS select `article_has_status`.`article_id` AS `article_id`,max(`article_has_status`.`date_changed`) AS `MaxDateTime` from `article_has_status` group by `article_has_status`.`article_id`;
+
+DROP VIEW IF EXISTS `article_current_status`;
+CREATE VIEW `article_current_status` AS select `a`.`id` AS `id`,`a`.`title` AS `title`,`a`.`author` AS `author`,`a`.`url` AS `url`,`a`.`publish_date` AS `publish_date`,`a`.`article_text` AS `article_text`,`st`.`status_code` AS `status_code` from (((`article` `a` join `article_has_status` `ahs`) join `article_status` `st`) join `article_sub_status_view` `assv`) where ((`ahs`.`article_id` = `assv`.`article_id`) and (`ahs`.`date_changed` = `assv`.`MaxDateTime`) and (`a`.`id` = `assv`.`article_id`) and (`st`.`id` = `ahs`.`article_status_id`)) ;
+
+-- Dump completed on 2020-03-15 17:54:45
+-- update article set published_date = null where published_date < 1587340800 or published_date > 1589932800;
+
+ALTER TABLE article CHANGE COLUMN published_date published_date timestamp default CURRENT_TIMESTAMP;
+ALTER TABLE article CHANGE COLUMN publish_date publish_date timestamp default CURRENT_TIMESTAMP;
+
+
+DROP TABLE IF EXISTS `buzz_job`;
+CREATE TABLE `buzz_job` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `start_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+ `end_date` timestamp NULL DEFAULT NULL,
+ `finished` tinyint NOT NULL DEFAULT 0,
+ `elapsed_seconds` int null default 0,
+ `query` mediumtext default NULL,
+ `articles_returned` integer default 0,
+ `articles_youtube` integer default 0,
+ `articles_700` integer default 0,
+ `articles_dropped` integer default 0,
+ `articles_created` integer default 0,
+ `articles_updated` integer default 0,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=969 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+DROP TABLE IF EXISTS `s3_job`;
+CREATE TABLE `s3_job` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `start_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+ `finished` tinyint NOT NULL DEFAULT 0,
+ `elapsed_seconds` int null default 0,
+ `articles_to_send` integer default 0,
+ `articles_sent` integer default 0,
+ `articles` mediumtext default null,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=969 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+DROP TABLE IF EXISTS `tag`;
+CREATE TABLE `tag` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `tag` varchar(20) default "",
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+DROP TABLE IF EXISTS `article_has_tag`;
+CREATE TABLE `article_has_tag` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `tag_id` int NOT NULL,
+ `article_id` int NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=4543 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+drop view if exists `article_tag_view`;
+CREATE VIEW `article_tag_view` AS
+select
+ `t`.`id` as `article_has_tag_id`,
+ `t`.`tag` AS `tag` ,
+ `aht`.`article_id` as `article_id`
+from
+ (`article_has_tag` `aht` join `tag` `t`)
+where
+ (`aht`.`tag_id` = `t`.`id`)
+order by
+ `t`.`tag` desc ;
+
+DROP TABLE IF EXISTS `buzz_query`;
+CREATE TABLE `buzz_query` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `query` text default null,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=4325 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+DROP TABLE IF EXISTS `query_has_tag`;
+CREATE TABLE `query_has_tag` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `tag_id` int NOT NULL,
+ `query_id` int NOT NULL,
+ `tag` char(50) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=2321 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+drop view if exists `query_tag_view`;
+CREATE VIEW `query_tag_view` AS
+select
+ `qht`.`id` as `id`,
+ `t`.`tag` AS `tag` ,
+ `qht`.`query_id` as `query_id`
+from
+ (`query_has_tag` `qht` join `tag` `t`)
+where
+ (`qht`.`tag_id` = `t`.`id`)
+order by
+ `t`.`tag` desc ;
+
+-- drop view if exists `article_current_status`;
+-- drop view if exists `article_sub_status_view`;
+
+DROP TABLE IF EXISTS `update_job`;
+CREATE TABLE `update_job` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `start_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+ `end_date` timestamp NULL DEFAULT NULL,
+ `finished` tinyint NOT NULL DEFAULT 0,
+ `elapsed_seconds` int null default 0,
+ `articles_buzz` integer default 0,
+ `articles_user` integer default 0,
+ `articles_updated` integer default 0,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=969 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+
+
+alter table buzz_query
+add column
+ filename_tag varchar(20) null;
+
+alter table buzz_query
+add column
+ active_flag boolean;
+
+insert into buzz_query
+(id, query, filename_tag, active_flag)
+values
+(1, 'topic=coronavirus,covid&search_type=trending_now&hours=24&count=25&countries=United States', 'CovidArticles',true),
+(2, 'topic=Black Lives Matter,BLM&search_type=trending_now&hours=24&count=25&countries=United States', 'BLMArticles',true),
+(3, 'topic=Election 2020,US Election,Election&search_type=trending_now&hours=24&count=25&countries=United States', 'ElectionArticles',true)
+;
+
+alter table article
+add column
+ filename_tag varchar(20) null;
+
+insert into tag (id, tag) values (1, 'one'), (2, 'two'), (3, 'three');
+
+insert into article_has_tag (id, tag_id, article_id) values (1, 1, 1), (2, 2, 1), (3, 3, 1);
+
+update article set filename_tag = "CovidArticles" where id > 0;
+
+ALTER TABLE buzz_query CHANGE COLUMN filename_tag filename_tag text;
+alter table article change column filename_tag filename_tag text;
+
+insert into buzz_query
+(id, query, filename_tag, active_flag)
+values
+(4, 'q=covid&num_days=365&result_type=evergreen_score&language=en', 'EvergreenCovidArticles',true);
+
+update buzz_query set filename_tag = 'EvergreenCovidArticles' where filename_tag = 'EvergreenCovidArticl';
+
+update buzz_query set query = 'https://api.buzzsumo.com/search/trends.json?topic=coronavirus,covid&search_type=trending_now&hours=24&count=25&countries=United States' where filename_tag = 'CovidArticles';
+
+update buzz_query set query = 'https://api.buzzsumo.com/search/trends.json?topic=Black Lives Matter,BLM&search_type=trending_now&hours=24&count=25&countries=United States' where filename_tag = 'BLMArticles';
+
+update buzz_query set query = 'https://api.buzzsumo.com/search/trends.json?topic=Election 2020,US Election,Election&search_type=trending_now&hours=24&count=25&countries=United States' where filename_tag = 'ElectionArticles';
+
+update buzz_query set query = 'https://api.buzzsumo.com/search/articles.json?q=covid&num_days=365&result_type=evergreen_score&language=en' where filename_tag = 'EvergreenCovidArticles';
+
+insert into buzz_query
+(id, query, filename_tag, active_flag)
+values
+(5, 'https://api.buzzsumo.com/search/trends.json?topic=coronavirus,covid&search_type=trending_now&hours=24&count=25&countries=United States', 'Covid2Articles',true);
+
+update buzz_query set filename_tag = 'Covid2EvergreenArticles' where filename_tag = 'EvergreenCovidArticles';
+
+delete from article where filename_tag like '%evergreen%' and publish_date > timestamp('2020-05-05');
+update article set filename_tag = 'Covid2EvergreenArticles' where filename_tag like '%evergreen%';
+
+insert into buzz_query
+(id, query, filename_tag, active_flag)
+values
+(6, 'https://api.buzzsumo.com/search/trends.json?topic=coronavirus,covid&search_type=trending_now&hours=24&count=75&countries=United States', 'Covid2Articles',true);
diff --git a/ArticleJavaServer/demo/WebContent/index.html b/ArticleJavaServer/demo/WebContent/index.html
deleted file mode 100644
index be43482..0000000
--- a/ArticleJavaServer/demo/WebContent/index.html
+++ /dev/null
@@ -1 +0,0 @@
-
fffffffffff
\ No newline at end of file
diff --git a/ArticleJavaServer/demo/WebContent/static/3rdpartylicenses.txt b/ArticleJavaServer/demo/WebContent/static/3rdpartylicenses.txt
deleted file mode 100644
index fbc918d..0000000
--- a/ArticleJavaServer/demo/WebContent/static/3rdpartylicenses.txt
+++ /dev/null
@@ -1,314 +0,0 @@
-@angular-devkit/build-angular
-MIT
-The MIT License
-
-Copyright (c) 2017 Google, Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-
-@angular/common
-MIT
-
-@angular/core
-MIT
-
-@angular/forms
-MIT
-
-@angular/platform-browser
-MIT
-
-core-js
-MIT
-Copyright (c) 2014-2019 Denis Pushkarev
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-
-regenerator-runtime
-MIT
-MIT License
-
-Copyright (c) 2014-present, Facebook, Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-
-rxjs
-Apache-2.0
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-
-
-zone.js
-MIT
-The MIT License
-
-Copyright (c) 2016-2018 Google, Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/ArticleJavaServer/demo/WebContent/static/favicon.ico b/ArticleJavaServer/demo/WebContent/static/favicon.ico
deleted file mode 100644
index 997406a..0000000
Binary files a/ArticleJavaServer/demo/WebContent/static/favicon.ico and /dev/null differ
diff --git a/ArticleJavaServer/demo/WebContent/static/index.html b/ArticleJavaServer/demo/WebContent/static/index.html
deleted file mode 100644
index 0026845..0000000
--- a/ArticleJavaServer/demo/WebContent/static/index.html
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
- Peclient
-
-
-
-
-
-
-
-
diff --git a/ArticleJavaServer/demo/WebContent/static/main-es2015.4515243f32b3ca4fe3c4.js b/ArticleJavaServer/demo/WebContent/static/main-es2015.4515243f32b3ca4fe3c4.js
deleted file mode 100644
index 3b253f0..0000000
--- a/ArticleJavaServer/demo/WebContent/static/main-es2015.4515243f32b3ca4fe3c4.js
+++ /dev/null
@@ -1 +0,0 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{0:function(e,t,n){e.exports=n("zUnb")},zUnb:function(e,t,n){"use strict";function o(e){return"function"==typeof e}n.r(t);let r=!1;const i={Promise:void 0,set useDeprecatedSynchronousErrorHandling(e){if(e){const e=new Error;console.warn("DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n"+e.stack)}else r&&console.log("RxJS: Back to a better error behavior. Thank you. <3");r=e},get useDeprecatedSynchronousErrorHandling(){return r}};function s(e){setTimeout(()=>{throw e})}const a={closed:!0,next(e){},error(e){if(i.useDeprecatedSynchronousErrorHandling)throw e;s(e)},complete(){}},l=Array.isArray||(e=>e&&"number"==typeof e.length);function c(e){return null!==e&&"object"==typeof e}function d(e){return Error.call(this),this.message=e?`${e.length} errors occurred during unsubscription:\n${e.map((e,t)=>`${t+1}) ${e.toString()}`).join("\n ")}`:"",this.name="UnsubscriptionError",this.errors=e,this}d.prototype=Object.create(Error.prototype);const u=d;let h=(()=>{class e{constructor(e){this.closed=!1,this._parent=null,this._parents=null,this._subscriptions=null,e&&(this._unsubscribe=e)}unsubscribe(){let e,t=!1;if(this.closed)return;let{_parent:n,_parents:r,_unsubscribe:i,_subscriptions:s}=this;this.closed=!0,this._parent=null,this._parents=null,this._subscriptions=null;let a=-1,d=r?r.length:0;for(;n;)n.remove(this),n=++ae.concat(t instanceof u?t.errors:t),[])}const p="function"==typeof Symbol?Symbol("rxSubscriber"):"@@rxSubscriber_"+Math.random();class f extends h{constructor(e,t,n){switch(super(),this.syncErrorValue=null,this.syncErrorThrown=!1,this.syncErrorThrowable=!1,this.isStopped=!1,arguments.length){case 0:this.destination=a;break;case 1:if(!e){this.destination=a;break}if("object"==typeof e){e instanceof f?(this.syncErrorThrowable=e.syncErrorThrowable,this.destination=e,e.add(this)):(this.syncErrorThrowable=!0,this.destination=new m(this,e));break}default:this.syncErrorThrowable=!0,this.destination=new m(this,e,t,n)}}[p](){return this}static create(e,t,n){const o=new f(e,t,n);return o.syncErrorThrowable=!1,o}next(e){this.isStopped||this._next(e)}error(e){this.isStopped||(this.isStopped=!0,this._error(e))}complete(){this.isStopped||(this.isStopped=!0,this._complete())}unsubscribe(){this.closed||(this.isStopped=!0,super.unsubscribe())}_next(e){this.destination.next(e)}_error(e){this.destination.error(e),this.unsubscribe()}_complete(){this.destination.complete(),this.unsubscribe()}_unsubscribeAndRecycle(){const{_parent:e,_parents:t}=this;return this._parent=null,this._parents=null,this.unsubscribe(),this.closed=!1,this.isStopped=!1,this._parent=e,this._parents=t,this}}class m extends f{constructor(e,t,n,r){let i;super(),this._parentSubscriber=e;let s=this;o(t)?i=t:t&&(i=t.next,n=t.error,r=t.complete,t!==a&&(o((s=Object.create(t)).unsubscribe)&&this.add(s.unsubscribe.bind(s)),s.unsubscribe=this.unsubscribe.bind(this))),this._context=s,this._next=i,this._error=n,this._complete=r}next(e){if(!this.isStopped&&this._next){const{_parentSubscriber:t}=this;i.useDeprecatedSynchronousErrorHandling&&t.syncErrorThrowable?this.__tryOrSetError(t,this._next,e)&&this.unsubscribe():this.__tryOrUnsub(this._next,e)}}error(e){if(!this.isStopped){const{_parentSubscriber:t}=this,{useDeprecatedSynchronousErrorHandling:n}=i;if(this._error)n&&t.syncErrorThrowable?(this.__tryOrSetError(t,this._error,e),this.unsubscribe()):(this.__tryOrUnsub(this._error,e),this.unsubscribe());else if(t.syncErrorThrowable)n?(t.syncErrorValue=e,t.syncErrorThrown=!0):s(e),this.unsubscribe();else{if(this.unsubscribe(),n)throw e;s(e)}}}complete(){if(!this.isStopped){const{_parentSubscriber:e}=this;if(this._complete){const t=()=>this._complete.call(this._context);i.useDeprecatedSynchronousErrorHandling&&e.syncErrorThrowable?(this.__tryOrSetError(e,t),this.unsubscribe()):(this.__tryOrUnsub(t),this.unsubscribe())}else this.unsubscribe()}}__tryOrUnsub(e,t){try{e.call(this._context,t)}catch(n){if(this.unsubscribe(),i.useDeprecatedSynchronousErrorHandling)throw n;s(n)}}__tryOrSetError(e,t,n){if(!i.useDeprecatedSynchronousErrorHandling)throw new Error("bad call");try{t.call(this._context,n)}catch(o){return i.useDeprecatedSynchronousErrorHandling?(e.syncErrorValue=o,e.syncErrorThrown=!0,!0):(s(o),!0)}return!1}_unsubscribe(){const{_parentSubscriber:e}=this;this._context=null,this._parentSubscriber=null,e.unsubscribe()}}const _="function"==typeof Symbol&&Symbol.observable||"@@observable";let w=(()=>{class e{constructor(e){this._isScalar=!1,e&&(this._subscribe=e)}lift(t){const n=new e;return n.source=this,n.operator=t,n}subscribe(e,t,n){const{operator:o}=this,r=function(e,t,n){if(e){if(e instanceof f)return e;if(e[p])return e[p]()}return e||t||n?new f(e,t,n):new f(a)}(e,t,n);if(r.add(o?o.call(r,this.source):this.source||i.useDeprecatedSynchronousErrorHandling&&!r.syncErrorThrowable?this._subscribe(r):this._trySubscribe(r)),i.useDeprecatedSynchronousErrorHandling&&r.syncErrorThrowable&&(r.syncErrorThrowable=!1,r.syncErrorThrown))throw r.syncErrorValue;return r}_trySubscribe(e){try{return this._subscribe(e)}catch(t){i.useDeprecatedSynchronousErrorHandling&&(e.syncErrorThrown=!0,e.syncErrorValue=t),function(e){for(;e;){const{closed:t,destination:n,isStopped:o}=e;if(t||o)return!1;e=n&&n instanceof f?n:null}return!0}(e)?e.error(t):console.warn(t)}}forEach(e,t){return new(t=b(t))((t,n)=>{let o;o=this.subscribe(t=>{try{e(t)}catch(r){n(r),o&&o.unsubscribe()}},n,t)})}_subscribe(e){const{source:t}=this;return t&&t.subscribe(e)}[_](){return this}pipe(...e){return 0===e.length?this:((t=e)?1===t.length?t[0]:function(e){return t.reduce((e,t)=>t(e),e)}:function(){})(this);var t}toPromise(e){return new(e=b(e))((e,t)=>{let n;this.subscribe(e=>n=e,e=>t(e),()=>e(n))})}}return e.create=t=>new e(t),e})();function b(e){if(e||(e=i.Promise||Promise),!e)throw new Error("no Promise impl found");return e}function C(){return Error.call(this),this.message="object unsubscribed",this.name="ObjectUnsubscribedError",this}C.prototype=Object.create(Error.prototype);const y=C;class v extends h{constructor(e,t){super(),this.subject=e,this.subscriber=t,this.closed=!1}unsubscribe(){if(this.closed)return;this.closed=!0;const e=this.subject,t=e.observers;if(this.subject=null,!t||0===t.length||e.isStopped||e.closed)return;const n=t.indexOf(this.subscriber);-1!==n&&t.splice(n,1)}}class x extends f{constructor(e){super(e),this.destination=e}}let A=(()=>{class e extends w{constructor(){super(),this.observers=[],this.closed=!1,this.isStopped=!1,this.hasError=!1,this.thrownError=null}[p](){return new x(this)}lift(e){const t=new O(this,this);return t.operator=e,t}next(e){if(this.closed)throw new y;if(!this.isStopped){const{observers:t}=this,n=t.length,o=t.slice();for(let r=0;rnew O(e,t),e})();class O extends A{constructor(e,t){super(),this.destination=e,this.source=t}next(e){const{destination:t}=this;t&&t.next&&t.next(e)}error(e){const{destination:t}=this;t&&t.error&&this.destination.error(e)}complete(){const{destination:e}=this;e&&e.complete&&this.destination.complete()}_subscribe(e){const{source:t}=this;return t?this.source.subscribe(e):h.EMPTY}}function M(e){return e&&"function"==typeof e.schedule}class P extends f{constructor(e,t,n){super(),this.parent=e,this.outerValue=t,this.outerIndex=n,this.index=0}_next(e){this.parent.notifyNext(this.outerValue,e,this.outerIndex,this.index++,this)}_error(e){this.parent.notifyError(e,this),this.unsubscribe()}_complete(){this.parent.notifyComplete(this),this.unsubscribe()}}const E=e=>t=>{for(let n=0,o=e.length;nt=>(e.then(e=>{t.closed||(t.next(e),t.complete())},e=>t.error(e)).then(null,s),t);function T(){return"function"==typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator"}const S=T(),I=e=>t=>{const n=e[S]();for(;;){const e=n.next();if(e.done){t.complete();break}if(t.next(e.value),t.closed)break}return"function"==typeof n.return&&t.add(()=>{n.return&&n.return()}),t},N=e=>t=>{const n=e[_]();if("function"!=typeof n.subscribe)throw new TypeError("Provided object does not correctly implement Symbol.observable");return n.subscribe(t)},D=e=>e&&"number"==typeof e.length&&"function"!=typeof e;function V(e){return!!e&&"function"!=typeof e.subscribe&&"function"==typeof e.then}const R=e=>{if(e instanceof w)return t=>e._isScalar?(t.next(e.value),void t.complete()):e.subscribe(t);if(e&&"function"==typeof e[_])return N(e);if(D(e))return E(e);if(V(e))return k(e);if(e&&"function"==typeof e[S])return I(e);{const t=c(e)?"an invalid object":`'${e}'`;throw new TypeError(`You provided ${t} where a stream was expected.`+" You can provide an Observable, Promise, Array, or Iterable.")}};function F(e,t,n,o,r=new P(e,n,o)){if(!r.closed)return R(t)(r)}class j extends f{notifyNext(e,t,n,o,r){this.destination.next(t)}notifyError(e,t){this.destination.error(e)}notifyComplete(e){this.destination.complete()}}function z(e,t){return function(n){if("function"!=typeof e)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return n.lift(new B(e,t))}}class B{constructor(e,t){this.project=e,this.thisArg=t}call(e,t){return t.subscribe(new H(e,this.project,this.thisArg))}}class H extends f{constructor(e,t,n){super(e),this.project=t,this.count=0,this.thisArg=n||this}_next(e){let t;try{t=this.project.call(this.thisArg,e,this.count++)}catch(n){return void this.destination.error(n)}this.destination.next(t)}}function L(e,t){return new w(t?n=>{const o=new h;let r=0;return o.add(t.schedule(function(){r!==e.length?(n.next(e[r++]),n.closed||o.add(this.schedule())):n.complete()})),o}:E(e))}function U(e,t){if(!t)return e instanceof w?e:new w(R(e));if(null!=e){if(function(e){return e&&"function"==typeof e[_]}(e))return function(e,t){return new w(t?n=>{const o=new h;return o.add(t.schedule(()=>{const r=e[_]();o.add(r.subscribe({next(e){o.add(t.schedule(()=>n.next(e)))},error(e){o.add(t.schedule(()=>n.error(e)))},complete(){o.add(t.schedule(()=>n.complete()))}}))})),o}:N(e))}(e,t);if(V(e))return function(e,t){return new w(t?n=>{const o=new h;return o.add(t.schedule(()=>e.then(e=>{o.add(t.schedule(()=>{n.next(e),o.add(t.schedule(()=>n.complete()))}))},e=>{o.add(t.schedule(()=>n.error(e)))}))),o}:k(e))}(e,t);if(D(e))return L(e,t);if(function(e){return e&&"function"==typeof e[S]}(e)||"string"==typeof e)return function(e,t){if(!e)throw new Error("Iterable cannot be null");return new w(t?n=>{const o=new h;let r;return o.add(()=>{r&&"function"==typeof r.return&&r.return()}),o.add(t.schedule(()=>{r=e[S](),o.add(t.schedule(function(){if(n.closed)return;let e,t;try{const i=r.next();e=i.value,t=i.done}catch(o){return void n.error(o)}t?n.complete():(n.next(e),this.schedule())}))})),o}:I(e))}(e,t)}throw new TypeError((null!==e&&typeof e||e)+" is not observable")}function G(e,t,n=Number.POSITIVE_INFINITY){return"function"==typeof t?o=>o.pipe(G((n,o)=>U(e(n,o)).pipe(z((e,r)=>t(n,e,o,r))),n)):("number"==typeof t&&(n=t),t=>t.lift(new Q(e,n)))}class Q{constructor(e,t=Number.POSITIVE_INFINITY){this.project=e,this.concurrent=t}call(e,t){return t.subscribe(new Z(e,this.project,this.concurrent))}}class Z extends j{constructor(e,t,n=Number.POSITIVE_INFINITY){super(e),this.project=t,this.concurrent=n,this.hasCompleted=!1,this.buffer=[],this.active=0,this.index=0}_next(e){this.active0?this._next(t.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()}}function $(e){return e}function W(){return function(e){return e.lift(new q(e))}}class q{constructor(e){this.connectable=e}call(e,t){const{connectable:n}=this;n._refCount++;const o=new Y(e,n),r=t.subscribe(o);return o.closed||(o.connection=n.connect()),r}}class Y extends f{constructor(e,t){super(e),this.connectable=t}_unsubscribe(){const{connectable:e}=this;if(!e)return void(this.connection=null);this.connectable=null;const t=e._refCount;if(t<=0)return void(this.connection=null);if(e._refCount=t-1,t>1)return void(this.connection=null);const{connection:n}=this,o=e._connection;this.connection=null,!o||n&&o!==n||o.unsubscribe()}}const J=class extends w{constructor(e,t){super(),this.source=e,this.subjectFactory=t,this._refCount=0,this._isComplete=!1}_subscribe(e){return this.getSubject().subscribe(e)}getSubject(){const e=this._subject;return e&&!e.isStopped||(this._subject=this.subjectFactory()),this._subject}connect(){let e=this._connection;return e||(this._isComplete=!1,(e=this._connection=new h).add(this.source.subscribe(new X(this.getSubject(),this))),e.closed?(this._connection=null,e=h.EMPTY):this._connection=e),e}refCount(){return W()(this)}}.prototype,K={operator:{value:null},_refCount:{value:0,writable:!0},_subject:{value:null,writable:!0},_connection:{value:null,writable:!0},_subscribe:{value:J._subscribe},_isComplete:{value:J._isComplete,writable:!0},getSubject:{value:J.getSubject},connect:{value:J.connect},refCount:{value:J.refCount}};class X extends x{constructor(e,t){super(e),this.connectable=t}_error(e){this._unsubscribe(),super._error(e)}_complete(){this.connectable._isComplete=!0,this._unsubscribe(),super._complete()}_unsubscribe(){const e=this.connectable;if(e){this.connectable=null;const t=e._connection;e._refCount=0,e._subject=null,e._connection=null,t&&t.unsubscribe()}}}function ee(){return new A}const te="__parameters__";function ne(e,t,n){const o=function(e){return function(...t){if(e){const n=e(...t);for(const e in n)this[e]=n[e]}}}(t);function r(...e){if(this instanceof r)return o.apply(this,e),this;const t=new r(...e);return n.annotation=t,n;function n(e,n,o){const r=e.hasOwnProperty(te)?e[te]:Object.defineProperty(e,te,{value:[]})[te];for(;r.length<=o;)r.push(null);return(r[o]=r[o]||[]).push(t),e}}return n&&(r.prototype=Object.create(n.prototype)),r.prototype.ngMetadataName=e,r.annotationCls=r,r}const oe=ne("Inject",e=>({token:e})),re=ne("Optional"),ie=ne("Self"),se=ne("SkipSelf");var ae=function(e){return e[e.Default=0]="Default",e[e.Host=1]="Host",e[e.Self=2]="Self",e[e.SkipSelf=4]="SkipSelf",e[e.Optional=8]="Optional",e}({});function le(e){for(let t in e)if(e[t]===le)return t;throw Error("Could not find renamed property on target object.")}function ce(e){return{token:e.token,providedIn:e.providedIn||null,factory:e.factory,value:void 0}}function de(e){const t=e[ue];return t&&t.token===e?t:null}const ue=le({ngInjectableDef:le});function he(e){if("string"==typeof e)return e;if(e instanceof Array)return"["+e.map(he).join(", ")+"]";if(null==e)return""+e;if(e.overriddenName)return`${e.overriddenName}`;if(e.name)return`${e.name}`;const t=e.toString();if(null==t)return""+t;const n=t.indexOf("\n");return-1===n?t:t.substring(0,n)}const ge=le({__forward_ref__:le});function pe(e){return e.__forward_ref__=pe,e.toString=function(){return he(this())},e}function fe(e){const t=e;return"function"==typeof t&&t.hasOwnProperty(ge)&&t.__forward_ref__===pe?t():e}const me="undefined"!=typeof globalThis&&globalThis,_e="undefined"!=typeof window&&window,we="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,be="undefined"!=typeof global&&global,Ce=me||be||_e||we;class ye{constructor(e,t){this._desc=e,this.ngMetadataName="InjectionToken",this.ngInjectableDef=void 0,"number"==typeof t?this.__NG_ELEMENT_ID__=t:void 0!==t&&(this.ngInjectableDef=ce({token:this,providedIn:t.providedIn||"root",factory:t.factory}))}toString(){return`InjectionToken ${this._desc}`}}const ve=new ye("INJECTOR",-1),xe=new Object,Ae="ngTempTokenPath",Oe="ngTokenPath",Me=/\n/gm,Pe="\u0275",Ee="__source",ke=le({provide:String,useValue:le});let Te,Se=void 0;function Ie(e){const t=Se;return Se=e,t}function Ne(e,t=ae.Default){return(Te||function(e,t=ae.Default){if(void 0===Se)throw new Error("inject() must be called from an injection context");return null===Se?function(e,t,n){const o=de(e);if(o&&"root"==o.providedIn)return void 0===o.value?o.value=o.factory():o.value;if(n&ae.Optional)return null;throw new Error(`Injector: NOT_FOUND [${he(e)}]`)}(e,0,t):Se.get(e,t&ae.Optional?null:void 0,t)})(e,t)}class De{get(e,t=xe){if(t===xe){const t=new Error(`NullInjectorError: No provider for ${he(e)}!`);throw t.name="NullInjectorError",t}return t}}function Ve(e,t,n,o=null){e=e&&"\n"===e.charAt(0)&&e.charAt(1)==Pe?e.substr(2):e;let r=he(t);if(t instanceof Array)r=t.map(he).join(" -> ");else if("object"==typeof t){let e=[];for(let n in t)if(t.hasOwnProperty(n)){let o=t[n];e.push(n+":"+("string"==typeof o?JSON.stringify(o):he(o)))}r=`{${e.join(", ")}}`}return`${n}${o?"("+o+")":""}[${r}]: ${e.replace(Me,"\n ")}`}class Re{}class Fe{}function je(e,t,n){t>=e.length?e.push(n):e.splice(t,0,n)}function ze(e,t){return t>=e.length-1?e.pop():e.splice(t,1)[0]}const Be=function(){var e={Emulated:0,Native:1,None:2,ShadowDom:3};return e[e.Emulated]="Emulated",e[e.Native]="Native",e[e.None]="None",e[e.ShadowDom]="ShadowDom",e}(),He=(()=>("undefined"!=typeof requestAnimationFrame&&requestAnimationFrame||setTimeout).bind(Ce))(),Le="ngDebugContext",Ue="ngOriginalError",Ge="ngErrorLogger";function Qe(e){return e[Le]}function Ze(e){return e[Ue]}function $e(e,...t){e.error(...t)}class We{constructor(){this._console=console}handleError(e){const t=this._findOriginalError(e),n=this._findContext(e),o=function(e){return e[Ge]||$e}(e);o(this._console,"ERROR",e),t&&o(this._console,"ORIGINAL ERROR",t),n&&o(this._console,"ERROR CONTEXT",n)}_findContext(e){return e?Qe(e)?Qe(e):this._findContext(Ze(e)):null}_findOriginalError(e){let t=Ze(e);for(;t&&Ze(t);)t=Ze(t);return t}}let qe=!0,Ye=!1;function Je(){return Ye=!0,qe}class Ke{constructor(e){if(this.defaultDoc=e,this.inertDocument=this.defaultDoc.implementation.createHTMLDocument("sanitization-inert"),this.inertBodyElement=this.inertDocument.body,null==this.inertBodyElement){const e=this.inertDocument.createElement("html");this.inertDocument.appendChild(e),this.inertBodyElement=this.inertDocument.createElement("body"),e.appendChild(this.inertBodyElement)}this.inertBodyElement.innerHTML='',!this.inertBodyElement.querySelector||this.inertBodyElement.querySelector("svg")?(this.inertBodyElement.innerHTML='',!this.inertBodyElement.querySelector||this.inertBodyElement.querySelector("svg")?(this.inertBodyElement.innerHTML='