이윤영

Add two menu

...@@ -4,8 +4,10 @@ ...@@ -4,8 +4,10 @@
4 <component name="GradleSettings"> 4 <component name="GradleSettings">
5 <option name="linkedExternalProjectsSettings"> 5 <option name="linkedExternalProjectsSettings">
6 <GradleProjectSettings> 6 <GradleProjectSettings>
7 + <compositeConfiguration>
8 + <compositeBuild compositeDefinitionSource="SCRIPT" />
9 + </compositeConfiguration>
7 <option name="delegatedBuild" value="false" /> 10 <option name="delegatedBuild" value="false" />
8 - <option name="testRunner" value="PLATFORM" />
9 <option name="distributionType" value="DEFAULT_WRAPPED" /> 11 <option name="distributionType" value="DEFAULT_WRAPPED" />
10 <option name="externalProjectPath" value="$PROJECT_DIR$" /> 12 <option name="externalProjectPath" value="$PROJECT_DIR$" />
11 <option name="modules"> 13 <option name="modules">
...@@ -15,6 +17,7 @@ ...@@ -15,6 +17,7 @@
15 </set> 17 </set>
16 </option> 18 </option>
17 <option name="resolveModulePerSourceSet" value="false" /> 19 <option name="resolveModulePerSourceSet" value="false" />
20 + <option name="testRunner" value="PLATFORM" />
18 </GradleProjectSettings> 21 </GradleProjectSettings>
19 </option> 22 </option>
20 </component> 23 </component>
......
...@@ -36,6 +36,7 @@ public class DBHelper { ...@@ -36,6 +36,7 @@ public class DBHelper {
36 db.execSQL(Databases.CreateDB_AppUsage_WEEK._CREATE_AppUsage_WEEK); 36 db.execSQL(Databases.CreateDB_AppUsage_WEEK._CREATE_AppUsage_WEEK);
37 db.execSQL(Databases.CreateDB_AppUsage_DAY._CREATE_AppUsage_DAY); 37 db.execSQL(Databases.CreateDB_AppUsage_DAY._CREATE_AppUsage_DAY);
38 db.execSQL(Databases.CreateDB_PhoneInfo._CREATE_PhoneInfo); 38 db.execSQL(Databases.CreateDB_PhoneInfo._CREATE_PhoneInfo);
39 + db.execSQL(Databases.CreateDB_Document._CREATE_Document);
39 40
40 db.execSQL(CallLogDataBase.CreateDB._CREATE0); 41 db.execSQL(CallLogDataBase.CreateDB._CREATE0);
41 db.execSQL(ContactDataBase.CreateDB._CREATE0); 42 db.execSQL(ContactDataBase.CreateDB._CREATE0);
...@@ -57,6 +58,7 @@ public class DBHelper { ...@@ -57,6 +58,7 @@ public class DBHelper {
57 db.execSQL("DROP TABLE IF EXISTS " + Databases.CreateDB_AppUsage_WEEK.TABLE_NAME); 58 db.execSQL("DROP TABLE IF EXISTS " + Databases.CreateDB_AppUsage_WEEK.TABLE_NAME);
58 db.execSQL("DROP TABLE IF EXISTS " + Databases.CreateDB_AppUsage_DAY.TABLE_NAME); 59 db.execSQL("DROP TABLE IF EXISTS " + Databases.CreateDB_AppUsage_DAY.TABLE_NAME);
59 db.execSQL("DROP TABLE IF EXISTS " + Databases.CreateDB_PhoneInfo.TABLE_NAME); 60 db.execSQL("DROP TABLE IF EXISTS " + Databases.CreateDB_PhoneInfo.TABLE_NAME);
61 + db.execSQL("DROP TABLE IF EXISTS " + Databases.CreateDB_Document.TABLE_NAME);
60 62
61 db.execSQL("DROP TABLE IF EXISTS " + CallLogDataBase.CreateDB._TABLENAME0); 63 db.execSQL("DROP TABLE IF EXISTS " + CallLogDataBase.CreateDB._TABLENAME0);
62 db.execSQL("DROP TABLE IF EXISTS " + ContactDataBase.CreateDB._TABLENAME0); 64 db.execSQL("DROP TABLE IF EXISTS " + ContactDataBase.CreateDB._TABLENAME0);
...@@ -81,7 +83,7 @@ public class DBHelper { ...@@ -81,7 +83,7 @@ public class DBHelper {
81 } 83 }
82 84
83 public long insertPColumn(String title, int id, String date_added, String display_name 85 public long insertPColumn(String title, int id, String date_added, String display_name
84 - , String mime_type, String path, String latitude, String longitude){ 86 + , String mime_type, String path, String latitude, String longitude, String size){
85 ContentValues values = new ContentValues(); 87 ContentValues values = new ContentValues();
86 values.put(PhotoDataBase.CreateDB.TITLE, title); 88 values.put(PhotoDataBase.CreateDB.TITLE, title);
87 values.put(PhotoDataBase.CreateDB.ID, id); 89 values.put(PhotoDataBase.CreateDB.ID, id);
...@@ -91,12 +93,13 @@ public class DBHelper { ...@@ -91,12 +93,13 @@ public class DBHelper {
91 values.put(PhotoDataBase.CreateDB.PATH, path); 93 values.put(PhotoDataBase.CreateDB.PATH, path);
92 values.put(PhotoDataBase.CreateDB.LATITUDE, latitude); 94 values.put(PhotoDataBase.CreateDB.LATITUDE, latitude);
93 values.put(PhotoDataBase.CreateDB.LONGITUDE, longitude); 95 values.put(PhotoDataBase.CreateDB.LONGITUDE, longitude);
96 + values.put(PhotoDataBase.CreateDB.SIZE, size);
94 return mDB.insert(PhotoDataBase.CreateDB._TABLENAME0, null, values); 97 return mDB.insert(PhotoDataBase.CreateDB._TABLENAME0, null, values);
95 } 98 }
96 99
97 public long insertVColumn(String title, String date_added, String display_name, String mime_type 100 public long insertVColumn(String title, String date_added, String display_name, String mime_type
98 , String path, String latitude, String longitude, String album, String artist, String bookmark 101 , String path, String latitude, String longitude, String album, String artist, String bookmark
99 - ,String category, String description, String language, String resolution, String tags){ 102 + ,String category, String description, String language, String resolution, String tags, String size){
100 ContentValues values = new ContentValues(); 103 ContentValues values = new ContentValues();
101 values.put(VideoDataBase.CreateDB.TITLE, title); 104 values.put(VideoDataBase.CreateDB.TITLE, title);
102 values.put(VideoDataBase.CreateDB.DATE_ADDED, date_added); 105 values.put(VideoDataBase.CreateDB.DATE_ADDED, date_added);
...@@ -113,6 +116,7 @@ public class DBHelper { ...@@ -113,6 +116,7 @@ public class DBHelper {
113 values.put(VideoDataBase.CreateDB.LANGUAGE, language); 116 values.put(VideoDataBase.CreateDB.LANGUAGE, language);
114 values.put(VideoDataBase.CreateDB.RESOLUTION, resolution); 117 values.put(VideoDataBase.CreateDB.RESOLUTION, resolution);
115 values.put(VideoDataBase.CreateDB.TAGS, tags); 118 values.put(VideoDataBase.CreateDB.TAGS, tags);
119 + values.put(VideoDataBase.CreateDB.SIZE, size);
116 return mDB.insert(VideoDataBase.CreateDB._TABLENAME0, null, values); 120 return mDB.insert(VideoDataBase.CreateDB._TABLENAME0, null, values);
117 } 121 }
118 122
...@@ -167,9 +171,9 @@ public class DBHelper { ...@@ -167,9 +171,9 @@ public class DBHelper {
167 values.put(Databases.CreateDB_App.CELLULARUSAGE, cellularbytes); 171 values.put(Databases.CreateDB_App.CELLULARUSAGE, cellularbytes);
168 db.insert(Databases.CreateDB_App.TABLE_NAME, null, values); 172 db.insert(Databases.CreateDB_App.TABLE_NAME, null, values);
169 173
170 - Log.d("LogTest","addAppUsage"); 174 + //Log.d("LogTest","addAppUsage");
171 175
172 - Log.d("LogTest", String.valueOf(cellularbytes)); 176 + //Log.d("LogTest", String.valueOf(cellularbytes));
173 } 177 }
174 public void addAccountInfo(String accountname, String accounttype) { 178 public void addAccountInfo(String accountname, String accounttype) {
175 SQLiteDatabase db = mDBHelper.getWritableDatabase(); 179 SQLiteDatabase db = mDBHelper.getWritableDatabase();
...@@ -177,7 +181,21 @@ public class DBHelper { ...@@ -177,7 +181,21 @@ public class DBHelper {
177 values.put(Databases.CreateDB_AccountInfo.ACCOUNTNAME, accountname); 181 values.put(Databases.CreateDB_AccountInfo.ACCOUNTNAME, accountname);
178 values.put(Databases.CreateDB_AccountInfo.ACCOUNTTYPE, accounttype); 182 values.put(Databases.CreateDB_AccountInfo.ACCOUNTTYPE, accounttype);
179 db.insert(Databases.CreateDB_AccountInfo.TABLE_NAME, null, values); 183 db.insert(Databases.CreateDB_AccountInfo.TABLE_NAME, null, values);
180 - Log.d("LogTest","addAccountInfo"); 184 + //Log.d("LogTest","addAccountInfo");
185 + }
186 +
187 + public void addDocumentInfo(String name, String title, long date_added, long date_modified, String mime_type, String path, String size) {
188 + SQLiteDatabase db = mDBHelper.getWritableDatabase();
189 + ContentValues values = new ContentValues();
190 + values.put(Databases.CreateDB_Document.NAME, name);
191 + values.put(Databases.CreateDB_Document.TITLE, title);
192 + values.put(Databases.CreateDB_Document.DATE_ADDED, date_added);
193 + values.put(Databases.CreateDB_Document.DATE_MODIFIED, date_modified);
194 + values.put(Databases.CreateDB_Document.MIME_TYPE, mime_type);
195 + values.put(Databases.CreateDB_Document.PATH, path);
196 + values.put(Databases.CreateDB_Document.SIZE, size);
197 + db.insert(Databases.CreateDB_Document.TABLE_NAME, null, values);
198 + //Log.d("LogTest","addAccountInfo");
181 } 199 }
182 200
183 public void addAppUsage_YEAR(String packageName, long firsttimestamp, long lasttimestamp, 201 public void addAppUsage_YEAR(String packageName, long firsttimestamp, long lasttimestamp,
...@@ -190,7 +208,7 @@ public class DBHelper { ...@@ -190,7 +208,7 @@ public class DBHelper {
190 values.put(Databases.CreateDB_AppUsage_YEAR.LASTTIMEUSED, lasttimeused); 208 values.put(Databases.CreateDB_AppUsage_YEAR.LASTTIMEUSED, lasttimeused);
191 values.put(Databases.CreateDB_AppUsage_YEAR.TOTALTIMEFOREGROUND, totaltimeforeground); 209 values.put(Databases.CreateDB_AppUsage_YEAR.TOTALTIMEFOREGROUND, totaltimeforeground);
192 db.insert(Databases.CreateDB_AppUsage_YEAR.TABLE_NAME, null, values); 210 db.insert(Databases.CreateDB_AppUsage_YEAR.TABLE_NAME, null, values);
193 - Log.d("LogTest","addAppUsageYear"); 211 + //Log.d("LogTest","addAppUsageYear");
194 } 212 }
195 213
196 public void addAppUsage_MONTH(String packageName, long firsttimestamp, long lasttimestamp, 214 public void addAppUsage_MONTH(String packageName, long firsttimestamp, long lasttimestamp,
...@@ -203,7 +221,7 @@ public class DBHelper { ...@@ -203,7 +221,7 @@ public class DBHelper {
203 values.put(Databases.CreateDB_AppUsage_MONTH.LASTTIMEUSED, lasttimeused); 221 values.put(Databases.CreateDB_AppUsage_MONTH.LASTTIMEUSED, lasttimeused);
204 values.put(Databases.CreateDB_AppUsage_MONTH.TOTALTIMEFOREGROUND, totaltimeforeground); 222 values.put(Databases.CreateDB_AppUsage_MONTH.TOTALTIMEFOREGROUND, totaltimeforeground);
205 db.insert(Databases.CreateDB_AppUsage_MONTH.TABLE_NAME, null, values); 223 db.insert(Databases.CreateDB_AppUsage_MONTH.TABLE_NAME, null, values);
206 - Log.d("LogTest","addAppUsageMonth"); 224 + //Log.d("LogTest","addAppUsageMonth");
207 } 225 }
208 226
209 public void addAppUsage_WEEK(String packageName, long firsttimestamp, long lasttimestamp, 227 public void addAppUsage_WEEK(String packageName, long firsttimestamp, long lasttimestamp,
...@@ -216,7 +234,7 @@ public class DBHelper { ...@@ -216,7 +234,7 @@ public class DBHelper {
216 values.put(Databases.CreateDB_AppUsage_WEEK.LASTTIMEUSED, lasttimeused); 234 values.put(Databases.CreateDB_AppUsage_WEEK.LASTTIMEUSED, lasttimeused);
217 values.put(Databases.CreateDB_AppUsage_WEEK.TOTALTIMEFOREGROUND, totaltimeforeground); 235 values.put(Databases.CreateDB_AppUsage_WEEK.TOTALTIMEFOREGROUND, totaltimeforeground);
218 db.insert(Databases.CreateDB_AppUsage_WEEK.TABLE_NAME, null, values); 236 db.insert(Databases.CreateDB_AppUsage_WEEK.TABLE_NAME, null, values);
219 - Log.d("LogTest","addAppUsageWeek"); 237 + //Log.d("LogTest","addAppUsageWeek");
220 } 238 }
221 239
222 public void addAppUsage_DAY(String packageName, long firsttimestamp, long lasttimestamp, 240 public void addAppUsage_DAY(String packageName, long firsttimestamp, long lasttimestamp,
......
...@@ -8,6 +8,24 @@ import java.lang.reflect.Field; ...@@ -8,6 +8,24 @@ import java.lang.reflect.Field;
8 public final class Databases { 8 public final class Databases {
9 9
10 private Databases() {} 10 private Databases() {}
11 + public static final class CreateDB_Document implements BaseColumns {
12 + public static final String TABLE_NAME = "DocumentInfo";
13 + public static final String NAME = "name";
14 + public static final String TITLE = "title";
15 + public static final String DATE_ADDED = "date_added";
16 + public static final String DATE_MODIFIED = "date_modified";
17 + public static final String MIME_TYPE = "mime_type";
18 + public static final String PATH = "path";
19 + public static final String SIZE = "size";
20 + public static final String _CREATE_Document = "create table if not exists "+TABLE_NAME+"("
21 + +NAME+" text not null primary key, "
22 + +TITLE+" text not null , "
23 + +MIME_TYPE+" text not null , "
24 + +DATE_ADDED+" timestamp not null , "
25 + +DATE_MODIFIED+" timestamp not null , "
26 + +PATH+" text not null , "
27 + +SIZE+" text not null);";
28 + }
11 29
12 public static final class CreateDB_App implements BaseColumns { 30 public static final class CreateDB_App implements BaseColumns {
13 public static final String TABLE_NAME = "AppInfo"; 31 public static final String TABLE_NAME = "AppInfo";
......
...@@ -25,6 +25,7 @@ import android.net.Uri; ...@@ -25,6 +25,7 @@ import android.net.Uri;
25 import android.net.wifi.WifiConfiguration; 25 import android.net.wifi.WifiConfiguration;
26 import android.net.wifi.WifiManager; 26 import android.net.wifi.WifiManager;
27 import android.os.Bundle; 27 import android.os.Bundle;
28 +import android.os.Environment;
28 import android.os.Handler; 29 import android.os.Handler;
29 import android.provider.CalendarContract; 30 import android.provider.CalendarContract;
30 import android.provider.CallLog; 31 import android.provider.CallLog;
...@@ -34,10 +35,13 @@ import android.provider.Telephony; ...@@ -34,10 +35,13 @@ import android.provider.Telephony;
34 import android.telephony.TelephonyManager; 35 import android.telephony.TelephonyManager;
35 import android.util.Log; 36 import android.util.Log;
36 import android.widget.Toast; 37 import android.widget.Toast;
38 +
39 +import java.io.File;
37 import java.net.InetAddress; 40 import java.net.InetAddress;
38 import java.text.DateFormat; 41 import java.text.DateFormat;
39 import java.text.SimpleDateFormat; 42 import java.text.SimpleDateFormat;
40 import java.util.ArrayList; 43 import java.util.ArrayList;
44 +import java.util.Calendar;
41 import java.util.Date; 45 import java.util.Date;
42 import java.util.List; 46 import java.util.List;
43 import androidx.core.content.ContextCompat; 47 import androidx.core.content.ContextCompat;
...@@ -64,11 +68,13 @@ public class LoadingActivity extends Activity { ...@@ -64,11 +68,13 @@ public class LoadingActivity extends Activity {
64 setContentView(R.layout.activity_loading); 68 setContentView(R.layout.activity_loading);
65 69
66 try { 70 try {
67 - socket = IO.socket("http://172.30.1.40:3000/"); 71 + socket = IO.socket("http://192.168.0.8:3000/");
68 socket.connect(); 72 socket.connect();
73 + Log.i("SOCKET", "Connected");
69 74
70 }catch(Exception e){ 75 }catch(Exception e){
71 e.printStackTrace(); 76 e.printStackTrace();
77 + Log.i("SOCKET", "Not Connected");
72 } 78 }
73 79
74 startLoading(); 80 startLoading();
...@@ -84,54 +90,108 @@ public class LoadingActivity extends Activity { ...@@ -84,54 +90,108 @@ public class LoadingActivity extends Activity {
84 90
85 getPhoto(); 91 getPhoto();
86 alert("alert","photo"); 92 alert("alert","photo");
87 - Log.i("MYLOG", "DB HY Part:1/13"); 93 + Log.i("MYLOG", "DB HY Part:1/14");
88 getVideo(); 94 getVideo();
89 alert("alert","video"); 95 alert("alert","video");
90 - Log.i("MYLOG", "DB HY Part:2/13"); 96 + Log.i("MYLOG", "DB HY Part:2/14");
91 getAudio(); 97 getAudio();
92 alert("alert","audio"); 98 alert("alert","audio");
93 - Log.i("MYLOG", "DB HY Part:3/13"); 99 + Log.i("MYLOG", "DB HY Part:3/14");
94 getCalendarInfo(); 100 getCalendarInfo();
95 alert("alert","calendar"); 101 alert("alert","calendar");
96 - Log.i("MYLOG", "DB HY Part:4/13"); 102 + Log.i("MYLOG", "DB HY Part:4/14");
97 getNetworkInfo(); 103 getNetworkInfo();
98 alert("alert","network"); 104 alert("alert","network");
99 - Log.i("MYLOG", "DB HY Part:5/13"); 105 + Log.i("MYLOG", "DB HY Part:5/14");
100 106
101 getCallLog(); 107 getCallLog();
102 alert("alert","calllog"); 108 alert("alert","calllog");
103 - Log.i("MYLOG", "DB YM Part:6/13"); 109 + Log.i("MYLOG", "DB YM Part:6/14");
104 getContact(); 110 getContact();
105 alert("alert","contact"); 111 alert("alert","contact");
106 - Log.i("MYLOG", "DB YM Part:7/13"); 112 + Log.i("MYLOG", "DB YM Part:7/14");
107 getSMSMessage(); 113 getSMSMessage();
108 alert("alert","sms"); 114 alert("alert","sms");
109 - Log.i("MYLOG", "DB YM Part:8/13"); 115 + Log.i("MYLOG", "DB YM Part:8/14");
110 getWIFI(); 116 getWIFI();
111 alert("alert","wifi"); 117 alert("alert","wifi");
112 - Log.i("MYLOG", "DB YM Part:9/13"); 118 + Log.i("MYLOG", "DB YM Part:9/14");
113 119
114 getPhoneInfo(); 120 getPhoneInfo();
115 alert("alert","phoneinfo"); 121 alert("alert","phoneinfo");
116 - Log.i("MYLOG", "DB YY Part:10/13"); 122 + Log.i("MYLOG", "DB YY Part:10/14");
117 getAccountInfo(); 123 getAccountInfo();
118 alert("alert","accountinfo"); 124 alert("alert","accountinfo");
119 - Log.i("MYLOG", "DB YY Part:11/13"); 125 + Log.i("MYLOG", "DB YY Part:11/14");
120 getAppInfo(); 126 getAppInfo();
121 alert("alert","appinfo"); 127 alert("alert","appinfo");
122 - Log.i("MYLOG", "DB YY Part:12/13"); 128 + Log.i("MYLOG", "DB YY Part:12/14");
123 getUsageStats(); 129 getUsageStats();
124 alert("alert","usagestats"); 130 alert("alert","usagestats");
125 - Log.i("MYLOG", "DB YY Part:13/13"); 131 + Log.i("MYLOG", "DB YY Part:13/14");
126 - 132 + getDocument();
133 + Log.i("MYLOG", "DB YY Part:14/14");
127 dbHelper.close(); 134 dbHelper.close();
135 +
128 finish(); 136 finish();
129 137
130 alert("end", "end"); 138 alert("end", "end");
139 +
131 } 140 }
132 }, 2000); 141 }, 2000);
133 } 142 }
134 143
144 + public void getDocument() {
145 +
146 + String[] projection = {
147 + MediaStore.Files.FileColumns._ID,
148 + MediaStore.Files.FileColumns.MIME_TYPE,
149 + MediaStore.Files.FileColumns.DATE_ADDED,
150 + MediaStore.Files.FileColumns.DATE_MODIFIED,
151 + MediaStore.Files.FileColumns.DISPLAY_NAME,
152 + MediaStore.Files.FileColumns.TITLE,
153 + MediaStore.Files.FileColumns.SIZE,
154 + MediaStore.Files.FileColumns.DATA
155 + };
156 +
157 + String mimeType = "application/pdf";
158 +
159 + String whereClause = MediaStore.Files.FileColumns.MIME_TYPE + " IN ('" + mimeType + "')"
160 + + " OR " + MediaStore.Files.FileColumns.MIME_TYPE + " LIKE 'application/vnd%'";
161 + String orderBy = MediaStore.Files.FileColumns.SIZE + " DESC";
162 + Cursor cursor = getContentResolver().query(MediaStore.Files.getContentUri("external"),
163 + projection,
164 + whereClause,
165 + null,
166 + orderBy);
167 +
168 + int idCol = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID);
169 + int mimeCol = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.MIME_TYPE);
170 + int addedCol = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATE_ADDED);
171 + int modifiedCol = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATE_MODIFIED);
172 + int nameCol = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DISPLAY_NAME);
173 + int titleCol = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.TITLE);
174 + int sizeCol = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.SIZE);
175 + int dataCol = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA);
176 +
177 + if (cursor.moveToFirst()) {
178 + do {
179 + //Uri fileUri = Uri.withAppendedPath(MediaStore.Files.getContentUri("external"), cursor.getString(idCol));
180 + String mime = cursor.getString(mimeCol);
181 + long dateAdded = cursor.getLong(addedCol);
182 + long dateModified = cursor.getLong(modifiedCol);
183 + String name = cursor.getString(nameCol);
184 + String title = cursor.getString(titleCol);
185 + long size = cursor.getLong(sizeCol);
186 + String path = cursor.getString(dataCol);
187 +
188 + Log.i("documents", mime + ", " + dateAdded + ", " + dateModified + ", " + name + ", " + title + ", " + size + ", " + path);
189 + dbHelper.addDocumentInfo(cursor.getString(nameCol), cursor.getString(titleCol), cursor.getLong(addedCol)
190 + , cursor.getLong(modifiedCol), cursor.getString(mimeCol), cursor.getString(dataCol),String.valueOf(cursor.getLong(sizeCol)));
191 + } while (cursor.moveToNext());
192 + }
193 + }
194 +
135 public void getPhoto() { 195 public void getPhoto() {
136 Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 196 Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
137 197
...@@ -159,9 +219,13 @@ public class LoadingActivity extends Activity { ...@@ -159,9 +219,13 @@ public class LoadingActivity extends Activity {
159 photo.setLatitude(cursor.getString(6)); 219 photo.setLatitude(cursor.getString(6));
160 photo.setLongitude(cursor.getString(7)); 220 photo.setLongitude(cursor.getString(7));
161 221
222 +
223 + File f = new File(cursor.getString(5));
224 + long size = f.length();
225 +
162 dbHelper.insertPColumn(photo.getTitle(), photo.getId(), photo.getDate() 226 dbHelper.insertPColumn(photo.getTitle(), photo.getId(), photo.getDate()
163 , photo.getDisplayName(), photo.getType(), photo.getPath() 227 , photo.getDisplayName(), photo.getType(), photo.getPath()
164 - , photo.getLatitude(), photo.getLongitude()); 228 + , photo.getLatitude(), photo.getLongitude(),String.valueOf(size));
165 } 229 }
166 230
167 } 231 }
...@@ -208,10 +272,13 @@ public class LoadingActivity extends Activity { ...@@ -208,10 +272,13 @@ public class LoadingActivity extends Activity {
208 video.setMIME_type(cursor.getString(13)); 272 video.setMIME_type(cursor.getString(13));
209 video.setTitle(cursor.getString(14)); 273 video.setTitle(cursor.getString(14));
210 274
275 + File f = new File(cursor.getString(9));
276 + long size = f.length();
277 +
211 dbHelper.insertVColumn(video.getTitle(), video.getDate_added(), video.getDisplay_Name() 278 dbHelper.insertVColumn(video.getTitle(), video.getDate_added(), video.getDisplay_Name()
212 , video.getMIME_type(), video.getPath(), video.getLatitude(), video.getLongitude() 279 , video.getMIME_type(), video.getPath(), video.getLatitude(), video.getLongitude()
213 , video.getAlbum(), video.getArtist(), video.getBookmark(), video.getCategory() 280 , video.getAlbum(), video.getArtist(), video.getBookmark(), video.getCategory()
214 - , video.getDescription(), video.getLanguage(), video.getResolution(), video.getTags()); 281 + , video.getDescription(), video.getLanguage(), video.getResolution(), video.getTags(), String.valueOf(size));
215 } 282 }
216 } 283 }
217 284
...@@ -547,8 +614,8 @@ public class LoadingActivity extends Activity { ...@@ -547,8 +614,8 @@ public class LoadingActivity extends Activity {
547 for (UsageStats usagestat : queryUsageStats) { 614 for (UsageStats usagestat : queryUsageStats) {
548 dbHelper.addAppUsage_WEEK(usagestat.getPackageName(),usagestat.getFirstTimeStamp(), usagestat.getLastTimeStamp(),usagestat.getLastTimeUsed(), usagestat.getTotalTimeInForeground()); 615 dbHelper.addAppUsage_WEEK(usagestat.getPackageName(),usagestat.getFirstTimeStamp(), usagestat.getLastTimeStamp(),usagestat.getLastTimeUsed(), usagestat.getTotalTimeInForeground());
549 } 616 }
550 - 617 + queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, 0,
551 - queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, 0, System.currentTimeMillis()); 618 + System.currentTimeMillis());
552 for (UsageStats usagestat : queryUsageStats) { 619 for (UsageStats usagestat : queryUsageStats) {
553 dbHelper.addAppUsage_DAY(usagestat.getPackageName(),usagestat.getFirstTimeStamp(), usagestat.getLastTimeStamp(),usagestat.getLastTimeUsed(), usagestat.getTotalTimeInForeground()); 620 dbHelper.addAppUsage_DAY(usagestat.getPackageName(),usagestat.getFirstTimeStamp(), usagestat.getLastTimeStamp(),usagestat.getLastTimeUsed(), usagestat.getTotalTimeInForeground());
554 } 621 }
......
...@@ -12,6 +12,7 @@ public final class PhotoDataBase { ...@@ -12,6 +12,7 @@ public final class PhotoDataBase {
12 public static final String PATH = "path"; 12 public static final String PATH = "path";
13 public static final String LATITUDE = "latitude"; 13 public static final String LATITUDE = "latitude";
14 public static final String LONGITUDE = "longitude"; 14 public static final String LONGITUDE = "longitude";
15 + public static final String SIZE = "size";
15 public static final String _TABLENAME0 = "photo"; 16 public static final String _TABLENAME0 = "photo";
16 public static final String _CREATE0 = "create table if not exists "+_TABLENAME0+"(" 17 public static final String _CREATE0 = "create table if not exists "+_TABLENAME0+"("
17 +TITLE+" text not null primary key, " 18 +TITLE+" text not null primary key, "
...@@ -21,6 +22,7 @@ public final class PhotoDataBase { ...@@ -21,6 +22,7 @@ public final class PhotoDataBase {
21 +MIME_TYPE + " text not null," 22 +MIME_TYPE + " text not null,"
22 +PATH + " text not null," 23 +PATH + " text not null,"
23 +LATITUDE + " text," 24 +LATITUDE + " text,"
24 - +LONGITUDE + " text);"; 25 + +LONGITUDE + " text,"
26 + +SIZE + " text);";
25 } 27 }
26 } 28 }
......
...@@ -19,6 +19,7 @@ public final class VideoDataBase { ...@@ -19,6 +19,7 @@ public final class VideoDataBase {
19 public static final String DISPLAY_NAME = "display_name"; 19 public static final String DISPLAY_NAME = "display_name";
20 public static final String MIME_TYPE = "mime_type"; 20 public static final String MIME_TYPE = "mime_type";
21 public static final String TITLE = "title"; 21 public static final String TITLE = "title";
22 + public static final String SIZE = "size";
22 public static final String _TABLENAME0 = "video"; 23 public static final String _TABLENAME0 = "video";
23 public static final String _CREATE0 = "create table if not exists "+_TABLENAME0+"(" 24 public static final String _CREATE0 = "create table if not exists "+_TABLENAME0+"("
24 +TITLE+" text not null primary key, " 25 +TITLE+" text not null primary key, "
...@@ -35,6 +36,7 @@ public final class VideoDataBase { ...@@ -35,6 +36,7 @@ public final class VideoDataBase {
35 +DESCRIPTION + " text, " 36 +DESCRIPTION + " text, "
36 +LANGUAGE +" text, " 37 +LANGUAGE +" text, "
37 +RESOLUTION + " text, " 38 +RESOLUTION + " text, "
38 - +TAGS + " text);"; 39 + +TAGS + " text, "
40 + +SIZE+" text);";
39 } 41 }
40 } 42 }
......
1 +1
2 +com.example.dataextraction
3 +1
4 +29
5 +
6 +0
7 +1
8 +308201dd30820146020101300d06092a864886f70d010105050030373116301406035504030c0d416e64726f69642044656275673110300e060355040a0c07416e64726f6964310b3009060355040613025553301e170d3138303930363130323134335a170d3438303832393130323134335a30373116301406035504030c0d416e64726f69642044656275673110300e060355040a0c07416e64726f6964310b300906035504061302555330819f300d06092a864886f70d010101050003818d0030818902818100a6596a004a40dadfa9657fa99b49f80ae526fce07b27a97f61c2e43a53992b293743cf04277293e52c4ae6991f4d83cf43a8f94420da00836361a34cab6c82b99a8b4f54e4c29f425e05319884f1ef7fdedfd94fc315ff677b9c0e0c1bf438f200bd3ff70f610a0b5c735e4988850501e6386a54f306155e9c871c25b59de63d0203010001300d06092a864886f70d0101050500038181009967d07dc0402f932c6c7d6125165068feb0eb5d494ed3c74cba0bd09ad9c2a2f8faf12cf0341849dd622de0d23562f284fecca507e39f1f5983d6383b8cd2b0a1b9d007fcd0adf3fa51542639392e58b6438482ba0b543372cfc4363706bfbf7cc80120e28ad374893d9cd3b7a43a5fee221f7337d489c24b33f901f5e4477f
1 +.menu-header{
2 + line-height: 1;
3 +}
4 +.title-name {
5 + font-family: 'Born Ready Slanted';
6 + font-size: 40px;
7 +}
8 +.title-detail {
9 + font-family: '나눔바른고딕';
10 + font-size: 18px;
11 +}
12 +.title-back {
13 + font-family: '나눔바른고딕';
14 + font-size: 15px;
15 +}
16 +.nav-color{
17 + background-color: #4e73df;
18 +}
19 +.font-nanum{
20 + font-family: '나눔바른고딕';
21 +}
22 +#table {
23 + font-family: "나눔바른고딕";
24 + border-collapse: collapse;
25 + width: 100%;
26 + font-size: 10px;
27 +}
28 +
29 +#table td, #table th {
30 + border: 1px solid #ddd;
31 + padding: 8px;
32 +}
33 +
34 +#table tr:nth-child(even){background-color: #f2f2f2;}
35 +
36 +#table tr:hover {background-color: #ddd;}
37 +
38 +#table th {
39 + padding-top: 12px;
40 + padding-bottom: 12px;
41 + text-align: left;
42 + background-color: #9db5fc;
43 + color: black;
44 +}
...\ No newline at end of file ...\ No newline at end of file
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
17 #div_con2{ 17 #div_con2{
18 background-color:beige; 18 background-color:beige;
19 width:29%; 19 width:29%;
20 - height:600px; 20 + height:825px;
21 float:left; 21 float:left;
22 text-align : left; 22 text-align : left;
23 } 23 }
...@@ -92,4 +92,18 @@ h4{ ...@@ -92,4 +92,18 @@ h4{
92 #btn_group button:hover{ 92 #btn_group button:hover{
93 color:white; 93 color:white;
94 background-color: skyblue; 94 background-color: skyblue;
95 +}
96 +#btn_another button{
97 + border: 1px hidden black;
98 + background-color: skyblue;
99 + color: white;
100 + padding: 50px;
101 + display: table;
102 + margin-left: auto;
103 + margin-right: auto;
104 + margin-top: 10%;
105 +}
106 +#btn_another button:hover{
107 + color:black;
108 + background-color: rgba(0,0,0,0);
95 } 109 }
...\ No newline at end of file ...\ No newline at end of file
......
1 +.menu-header{
2 + line-height: 1;
3 +}
4 +.title-name {
5 + font-family: 'Born Ready Slanted';
6 + font-size: 40px;
7 +}
8 +.title-detail {
9 + font-family: '나눔바른고딕';
10 + font-size: 18px;
11 +}
12 +.title-back {
13 + font-family: '나눔바른고딕';
14 + font-size: 15px;
15 +}
16 +.nav-color{
17 + background-color: #4e73df;
18 +}
19 +.font-nanum{
20 + font-family: '나눔바른고딕';
21 +}
22 +.sort{
23 + font-family: '나눔바른고딕';
24 + font-size: 10px;
25 +}
26 +
27 +.filetype{
28 + font-family: '나눔바른고딕';
29 + font-size: 13px;
30 +}
31 +.media:hover {background-color: #ddd;}
32 +
33 +.table {
34 + font-family: "나눔바른고딕", Arial, Helvetica, sans-serif;
35 + border-collapse: collapse;
36 + width: 100%;
37 + }
38 +
39 + .table td, #table th {
40 + border: 1px solid #ddd;
41 + padding: 8px;
42 + }
43 +
44 + .table tr:nth-child(even){background-color: #f2f2f2;}
45 +
46 + .table tr:hover {background-color: #ddd;}
47 +
48 + .table th {
49 + padding-top: 12px;
50 + padding-bottom: 12px;
51 + text-align: left;
52 + background-color: #5782ff;
53 + color: white;
54 + }
...\ No newline at end of file ...\ No newline at end of file
...@@ -2,6 +2,12 @@ const { app, BrowserWindow, ipcMain, dialog } = require('electron') ...@@ -2,6 +2,12 @@ const { app, BrowserWindow, ipcMain, dialog } = require('electron')
2 const path = require('path') 2 const path = require('path')
3 const url = require('url') 3 const url = require('url')
4 const vision = require('@google-cloud/vision'); 4 const vision = require('@google-cloud/vision');
5 +var exec = require('child_process').exec, child;
6 +
7 +// Imports the Google Cloud Video Intelligence library + Node's fs library
8 +const video = require('@google-cloud/video-intelligence').v1;
9 +const fs = require('fs');
10 +const util = require('util');
5 11
6 // Keep a global reference of the window object, if you don't, the window will 12 // Keep a global reference of the window object, if you don't, the window will
7 // be closed automatically when the JavaScript object is garbage collected. 13 // be closed automatically when the JavaScript object is garbage collected.
...@@ -119,7 +125,211 @@ ipcMain.on("device-name", (e, arg) => { ...@@ -119,7 +125,211 @@ ipcMain.on("device-name", (e, arg) => {
119 var content = {path : path, name : name, labels : labels} 125 var content = {path : path, name : name, labels : labels}
120 label_result.push(content); 126 label_result.push(content);
121 } 127 }
128 +var video_label_result = new Array();
129 +var video_detect_result = new Array();
130 +
131 +ipcMain.on("video-analysis", async (e, arg) => {
132 + console.log(arg + "from menu_media");
133 + video_label_result = [];
134 + video_detect_result = [];
135 +
136 + await Promise.all(arg.map(async (value)=>{
137 + // await copy_file(value);
138 + // setTimeout(function() { }, 10000);
139 + await get_content_detection(value);
140 + // await get_videolabels(value);
141 + }))
142 + await Promise.all(arg.map(async (value)=>{
143 + // await copy_file(value);
144 + // setTimeout(function() { }, 10000);
145 + //await get_content_detection(value);
146 + await get_videolabels(value);
147 + }))
148 + var video_analysis_result = [video_label_result,video_detect_result];
149 + console.log(video_analysis_result);
150 + win.webContents.send("getvideodetail", video_analysis_result);
151 +
152 + //win.webContents.send("getvideodetail", [temp_label,temp_detect]);
153 +
154 +
155 +});
156 +
157 +function checkandcopy(arg){
158 + return new Promise(function(resolve, reject){
159 + setTimeout(function(){
160 + for(var i=0; i < arg.length; i++){
161 + cmd_pull = exec('adb pull '+arg[i]);
162 + }
163 + resolve(true);
164 + }, 1000)
165 + })
166 +}
167 +
168 +async function copy_file(path){
169 + return new Promise(function(resolve, reject){
170 + setTimeout(function(){
171 + cmd_pull = exec('adb pull '+path,function(error, stdout, stderr){
172 + if(error){
173 + console.log(error);
174 + }
175 + });
176 + resolve(true);
177 + }, 1000)
178 + })
179 +}
180 +
181 +
182 +
183 +function send_labels_to_menu_media(event){
184 + win.webContents.send("getvideodetail", 'response message');
185 +}
186 +
187 +async function get_videolabels(path){
188 + var video_name = path.split('/');
189 + video_name = video_name[video_name.length-1];
190 +
191 + // Creates a client
192 + const client = new video.VideoIntelligenceServiceClient();
193 +
194 + var video_path = __dirname+'\\' + video_name;
195 + var temp = video_path.split('\\');
196 + var beforeslice = '';
197 + for(var i = 0; i < temp.length; i++){
198 + beforeslice += temp[i] + '/';
199 + }
200 +
201 + const vpath = beforeslice.slice(0,-1);
202 + console.log(vpath);
203 + // Reads a local video file and converts it to base64
204 + const readFile = util.promisify(fs.readFile);
205 + const file = await readFile(vpath);
206 + const inputContent = file.toString('base64');
207 + console.log("video convert");
208 +
209 + // Constructs request
210 + const request = {
211 + inputContent: inputContent,
212 + features: ['LABEL_DETECTION'],
213 + };
214 +
215 + // Detects labels in a video
216 + const [operation] = await client.annotateVideo(request);
217 + console.log('Waiting for operation to complete...');
218 + const [operationResult] = await operation.promise();
219 + // Gets annotations for video
220 + const annotations = operationResult.annotationResults[0];
221 +
122 222
223 + const labels = annotations.segmentLabelAnnotations;
224 + console.log(labels);
225 + var content = {video : video_name,labels : []}
226 + labels.forEach(label => {
227 + console.log(`Label ${label.entity.description} occurs at:`);
228 + content['labels'].push(label.entity.description);
229 + content[label.entity.description] = [];
230 + label.segments.forEach(segment => {
231 + const time = segment.segment;
232 + if (time.startTimeOffset.seconds === undefined) {
233 + time.startTimeOffset.seconds = 0;
234 + }
235 + if (time.startTimeOffset.nanos === undefined) {
236 + time.startTimeOffset.nanos = 0;
237 + }
238 + if (time.endTimeOffset.seconds === undefined) {
239 + time.endTimeOffset.seconds = 0;
240 + }
241 + if (time.endTimeOffset.nanos === undefined) {
242 + time.endTimeOffset.nanos = 0;
243 + }
244 + console.log(
245 + `\tStart: ${time.startTimeOffset.seconds}` +
246 + `.${(time.startTimeOffset.nanos / 1e6).toFixed(0)}s`
247 + );
248 + console.log(
249 + `\tEnd: ${time.endTimeOffset.seconds}.` +
250 + `${(time.endTimeOffset.nanos / 1e6).toFixed(0)}s`
251 + );
252 + console.log(`\tConfidence: ${segment.confidence}`);
253 + var temp = [time.startTimeOffset.seconds + '.' + (time.startTimeOffset.nanos / 1e6).toFixed(0),
254 + time.endTimeOffset.seconds + '.' + (time.endTimeOffset.nanos / 1e6).toFixed(0),
255 + segment.confidence];
256 + content[label.entity.description].push(temp);
257 + });
258 + });
259 + console.log(content);
260 + video_label_result.push(content);
261 +}
262 +
263 +async function get_content_detection(path){
264 + var video_name = path.split('/');
265 + video_name = video_name[video_name.length-1];
266 +
267 + // Creates a client
268 + const client = new video.VideoIntelligenceServiceClient();
269 +
270 + var video_path = __dirname+'\\' + video_name;
271 + var temp = video_path.split('\\');
272 + var beforeslice = '';
273 + for(var i = 0; i < temp.length; i++){
274 + beforeslice += temp[i] + '/';
275 + }
276 +
277 + const vpath = beforeslice.slice(0,-1);
278 + console.log(vpath);
279 + // Reads a local video file and converts it to base64
280 + const readFile = util.promisify(fs.readFile);
281 + const file = await readFile(vpath);
282 + const inputContent = file.toString('base64');
283 + console.log("video convert");
284 +
285 + const request = {
286 + inputContent: inputContent,
287 + features: ['EXPLICIT_CONTENT_DETECTION'],
288 + };
289 +
290 + // Human-readable likelihoods
291 + const likelihoods = [
292 + 'UNKNOWN',
293 + 'VERY_UNLIKELY',
294 + 'UNLIKELY',
295 + 'POSSIBLE',
296 + 'LIKELY',
297 + 'VERY_LIKELY',
298 + ];
299 +
300 + // Detects unsafe content
301 + const [opertaion] = await client.annotateVideo(request);
302 + console.log('Waiting for operation to complete...');
303 + const [operationResult] = await opertaion.promise();
304 + // Gets unsafe content
305 + const explicitContentResults =
306 + operationResult.annotationResults[0].explicitAnnotation;
307 + console.log('Explicit annotation results:');
308 + var content = {video : video_name, likelihood : []}
309 + explicitContentResults.frames.forEach(result => {
310 + if (result.timeOffset === undefined) {
311 + result.timeOffset = {};
312 + }
313 + if (result.timeOffset.seconds === undefined) {
314 + result.timeOffset.seconds = 0;
315 + }
316 + if (result.timeOffset.nanos === undefined) {
317 + result.timeOffset.nanos = 0;
318 + }
319 + console.log(
320 + `\tTime: ${result.timeOffset.seconds}` +
321 + `.${(result.timeOffset.nanos / 1e6).toFixed(0)}s`
322 + );
323 + console.log(
324 + `\t\tPornography likelihood: ${likelihoods[result.pornographyLikelihood]}`
325 + );
326 + var temp = [result.timeOffset.seconds + '.' + (result.timeOffset.nanos / 1e6).toFixed(0),
327 + likelihoods[result.pornographyLikelihood]];
328 + content['likelihood'].push(temp);
329 + });
330 + console.log(content);
331 + video_detect_result.push(content);
332 +}
123 333
124 //detext unsafe image 334 //detext unsafe image
125 let detect_result = new Array(); 335 let detect_result = new Array();
...@@ -202,4 +412,4 @@ ipcMain.on("device-name", (e, arg) => { ...@@ -202,4 +412,4 @@ ipcMain.on("device-name", (e, arg) => {
202 }) 412 })
203 //이전에 사용한 photos 폴더 삭제 413 //이전에 사용한 photos 폴더 삭제
204 var rimraf = require("rimraf"); 414 var rimraf = require("rimraf");
205 -rimraf("./photos", function(){console.log("")});
...\ No newline at end of file ...\ No newline at end of file
415 +rimraf("./photos", function(){console.log("")});
......
...@@ -34,6 +34,14 @@ ...@@ -34,6 +34,14 @@
34 "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.1.tgz", 34 "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.1.tgz",
35 "integrity": "sha512-82EQzwrNauw1fkbUSr3f+50Bcq7g4h0XvLOk8C5e9ABkXYHei7ZPi9tiMMD7Vh3SfcdH97d1ibJ3KBWp2o1J+w==" 35 "integrity": "sha512-82EQzwrNauw1fkbUSr3f+50Bcq7g4h0XvLOk8C5e9ABkXYHei7ZPi9tiMMD7Vh3SfcdH97d1ibJ3KBWp2o1J+w=="
36 }, 36 },
37 + "@google-cloud/video-intelligence": {
38 + "version": "3.0.0",
39 + "resolved": "https://registry.npmjs.org/@google-cloud/video-intelligence/-/video-intelligence-3.0.0.tgz",
40 + "integrity": "sha512-ZkKBdWwO7CTm/zUwkSumdstR/CfHFdbkXT/OaDR3v/0+5M5qS4IaFnRbtbHKvKvgKzJJHleQ0E80DkTZsjI57g==",
41 + "requires": {
42 + "google-gax": "^2.1.0"
43 + }
44 + },
37 "@google-cloud/vision": { 45 "@google-cloud/vision": {
38 "version": "2.0.0", 46 "version": "2.0.0",
39 "resolved": "https://registry.npmjs.org/@google-cloud/vision/-/vision-2.0.0.tgz", 47 "resolved": "https://registry.npmjs.org/@google-cloud/vision/-/vision-2.0.0.tgz",
...@@ -498,6 +506,11 @@ ...@@ -498,6 +506,11 @@
498 "integrity": "sha512-BneGN0J9ke24lBRn44hVHNeDlrXRYF+VRp0HbSUNnEZahXGAysHZIqnf/hER6aabdBgzM4YOV4jrR8gj4Zfi0g==", 506 "integrity": "sha512-BneGN0J9ke24lBRn44hVHNeDlrXRYF+VRp0HbSUNnEZahXGAysHZIqnf/hER6aabdBgzM4YOV4jrR8gj4Zfi0g==",
499 "dev": true 507 "dev": true
500 }, 508 },
509 + "abbrev": {
510 + "version": "1.1.1",
511 + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
512 + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
513 + },
501 "abort-controller": { 514 "abort-controller": {
502 "version": "3.0.0", 515 "version": "3.0.0",
503 "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 516 "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
...@@ -554,6 +567,15 @@ ...@@ -554,6 +567,15 @@
554 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 567 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
555 "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 568 "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
556 }, 569 },
570 + "ansi-styles": {
571 + "version": "3.2.1",
572 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
573 + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
574 + "dev": true,
575 + "requires": {
576 + "color-convert": "^1.9.0"
577 + }
578 + },
557 "any-base": { 579 "any-base": {
558 "version": "1.1.0", 580 "version": "1.1.0",
559 "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", 581 "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz",
...@@ -851,6 +873,11 @@ ...@@ -851,6 +873,11 @@
851 "dev": true, 873 "dev": true,
852 "optional": true 874 "optional": true
853 }, 875 },
876 + "bootstrap-icons": {
877 + "version": "1.0.0-alpha4",
878 + "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.0.0-alpha4.tgz",
879 + "integrity": "sha512-UcpSUPsvUiW7ueBQfXZSgknJv/rj060dglhWIRPjkLjUWa32jMWqsLXO8tXY2od4Ew6cuh0BJ3f8VOhQPVY4mA=="
880 + },
854 "bplist-creator": { 881 "bplist-creator": {
855 "version": "0.0.8", 882 "version": "0.0.8",
856 "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", 883 "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz",
...@@ -942,11 +969,36 @@ ...@@ -942,11 +969,36 @@
942 "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", 969 "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
943 "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" 970 "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA="
944 }, 971 },
972 + "camelcase": {
973 + "version": "5.3.1",
974 + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
975 + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
976 + "dev": true
977 + },
945 "caseless": { 978 "caseless": {
946 "version": "0.12.0", 979 "version": "0.12.0",
947 "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 980 "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
948 "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 981 "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
949 }, 982 },
983 + "chalk": {
984 + "version": "2.4.2",
985 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
986 + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
987 + "dev": true,
988 + "requires": {
989 + "ansi-styles": "^3.2.1",
990 + "escape-string-regexp": "^1.0.5",
991 + "supports-color": "^5.3.0"
992 + },
993 + "dependencies": {
994 + "escape-string-regexp": {
995 + "version": "1.0.5",
996 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
997 + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
998 + "dev": true
999 + }
1000 + }
1001 + },
950 "chart.js": { 1002 "chart.js": {
951 "version": "2.9.3", 1003 "version": "2.9.3",
952 "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.9.3.tgz", 1004 "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.9.3.tgz",
...@@ -973,6 +1025,77 @@ ...@@ -973,6 +1025,77 @@
973 "color-name": "^1.0.0" 1025 "color-name": "^1.0.0"
974 } 1026 }
975 }, 1027 },
1028 + "chownr": {
1029 + "version": "1.1.4",
1030 + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
1031 + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
1032 + },
1033 + "cli-cursor": {
1034 + "version": "2.1.0",
1035 + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
1036 + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
1037 + "dev": true,
1038 + "requires": {
1039 + "restore-cursor": "^2.0.0"
1040 + }
1041 + },
1042 + "cli-spinners": {
1043 + "version": "2.3.0",
1044 + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.3.0.tgz",
1045 + "integrity": "sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w==",
1046 + "dev": true
1047 + },
1048 + "cliui": {
1049 + "version": "5.0.0",
1050 + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
1051 + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
1052 + "dev": true,
1053 + "requires": {
1054 + "string-width": "^3.1.0",
1055 + "strip-ansi": "^5.2.0",
1056 + "wrap-ansi": "^5.1.0"
1057 + },
1058 + "dependencies": {
1059 + "ansi-regex": {
1060 + "version": "4.1.0",
1061 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
1062 + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
1063 + "dev": true
1064 + },
1065 + "is-fullwidth-code-point": {
1066 + "version": "2.0.0",
1067 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
1068 + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
1069 + "dev": true
1070 + },
1071 + "string-width": {
1072 + "version": "3.1.0",
1073 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
1074 + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
1075 + "dev": true,
1076 + "requires": {
1077 + "emoji-regex": "^7.0.1",
1078 + "is-fullwidth-code-point": "^2.0.0",
1079 + "strip-ansi": "^5.1.0"
1080 + }
1081 + },
1082 + "strip-ansi": {
1083 + "version": "5.2.0",
1084 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
1085 + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
1086 + "dev": true,
1087 + "requires": {
1088 + "ansi-regex": "^4.1.0"
1089 + }
1090 + }
1091 + }
1092 + },
1093 + "clone": {
1094 + "version": "1.0.4",
1095 + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
1096 + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
1097 + "dev": true
1098 + },
976 "clone-response": { 1099 "clone-response": {
977 "version": "1.0.2", 1100 "version": "1.0.2",
978 "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", 1101 "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
...@@ -993,19 +1116,18 @@ ...@@ -993,19 +1116,18 @@
993 "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1116 "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
994 "requires": { 1117 "requires": {
995 "color-name": "1.1.3" 1118 "color-name": "1.1.3"
996 - },
997 - "dependencies": {
998 - "color-name": {
999 - "version": "1.1.3",
1000 - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
1001 - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
1002 - }
1003 } 1119 }
1004 }, 1120 },
1005 "color-name": { 1121 "color-name": {
1006 - "version": "1.1.4", 1122 + "version": "1.1.3",
1007 - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1123 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
1008 - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 1124 + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
1125 + },
1126 + "colors": {
1127 + "version": "1.4.0",
1128 + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
1129 + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
1130 + "dev": true
1009 }, 1131 },
1010 "combined-stream": { 1132 "combined-stream": {
1011 "version": "1.0.8", 1133 "version": "1.0.8",
...@@ -1133,6 +1255,12 @@ ...@@ -1133,6 +1255,12 @@
1133 "ms": "^2.1.1" 1255 "ms": "^2.1.1"
1134 } 1256 }
1135 }, 1257 },
1258 + "decamelize": {
1259 + "version": "1.2.0",
1260 + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
1261 + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
1262 + "dev": true
1263 + },
1136 "decompress-response": { 1264 "decompress-response": {
1137 "version": "3.3.0", 1265 "version": "3.3.0",
1138 "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 1266 "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
...@@ -1142,6 +1270,20 @@ ...@@ -1142,6 +1270,20 @@
1142 "mimic-response": "^1.0.0" 1270 "mimic-response": "^1.0.0"
1143 } 1271 }
1144 }, 1272 },
1273 + "deep-extend": {
1274 + "version": "0.6.0",
1275 + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
1276 + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
1277 + },
1278 + "defaults": {
1279 + "version": "1.0.3",
1280 + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
1281 + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
1282 + "dev": true,
1283 + "requires": {
1284 + "clone": "^1.0.2"
1285 + }
1286 + },
1145 "defer-to-connect": { 1287 "defer-to-connect": {
1146 "version": "1.1.3", 1288 "version": "1.1.3",
1147 "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", 1289 "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
...@@ -1168,6 +1310,11 @@ ...@@ -1168,6 +1310,11 @@
1168 "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 1310 "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
1169 "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 1311 "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
1170 }, 1312 },
1313 + "detect-libc": {
1314 + "version": "1.0.3",
1315 + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
1316 + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
1317 + },
1171 "detect-node": { 1318 "detect-node": {
1172 "version": "2.0.4", 1319 "version": "2.0.4",
1173 "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", 1320 "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
...@@ -1230,6 +1377,34 @@ ...@@ -1230,6 +1377,34 @@
1230 "extract-zip": "^1.0.3" 1377 "extract-zip": "^1.0.3"
1231 } 1378 }
1232 }, 1379 },
1380 + "electron-log": {
1381 + "version": "4.2.0",
1382 + "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-4.2.0.tgz",
1383 + "integrity": "sha512-Yy1X8iZEzoBA8pu5b7YU07dRHi1GPM9C5jLEOn87Uqtdc9rbe6KbvvQ/AAAtGvn4/GC3azRW/eeiSI4ZF+Hm2A=="
1384 + },
1385 + "electron-rebuild": {
1386 + "version": "1.11.0",
1387 + "resolved": "https://registry.npmjs.org/electron-rebuild/-/electron-rebuild-1.11.0.tgz",
1388 + "integrity": "sha512-cn6AqZBQBVtaEyj5jZW1/LOezZZ22PA1HvhEP7asvYPJ8PDF4i4UFt9be4i9T7xJKiSiomXvY5Fd+dSq3FXZxA==",
1389 + "dev": true,
1390 + "requires": {
1391 + "colors": "^1.3.3",
1392 + "debug": "^4.1.1",
1393 + "detect-libc": "^1.0.3",
1394 + "fs-extra": "^8.1.0",
1395 + "node-abi": "^2.11.0",
1396 + "node-gyp": "^6.0.1",
1397 + "ora": "^3.4.0",
1398 + "spawn-rx": "^3.0.0",
1399 + "yargs": "^14.2.0"
1400 + }
1401 + },
1402 + "emoji-regex": {
1403 + "version": "7.0.3",
1404 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
1405 + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
1406 + "dev": true
1407 + },
1233 "encodeurl": { 1408 "encodeurl": {
1234 "version": "1.0.2", 1409 "version": "1.0.2",
1235 "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1410 "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
...@@ -1400,6 +1575,15 @@ ...@@ -1400,6 +1575,15 @@
1400 "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", 1575 "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz",
1401 "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==" 1576 "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw=="
1402 }, 1577 },
1578 + "find-up": {
1579 + "version": "3.0.0",
1580 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
1581 + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
1582 + "dev": true,
1583 + "requires": {
1584 + "locate-path": "^3.0.0"
1585 + }
1586 + },
1403 "forever-agent": { 1587 "forever-agent": {
1404 "version": "0.6.1", 1588 "version": "0.6.1",
1405 "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 1589 "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
...@@ -1431,6 +1615,14 @@ ...@@ -1431,6 +1615,14 @@
1431 "universalify": "^0.1.0" 1615 "universalify": "^0.1.0"
1432 } 1616 }
1433 }, 1617 },
1618 + "fs-minipass": {
1619 + "version": "1.2.7",
1620 + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
1621 + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
1622 + "requires": {
1623 + "minipass": "^2.6.0"
1624 + }
1625 + },
1434 "fs.realpath": { 1626 "fs.realpath": {
1435 "version": "1.0.0", 1627 "version": "1.0.0",
1436 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1628 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
...@@ -1503,6 +1695,12 @@ ...@@ -1503,6 +1695,12 @@
1503 "json-bigint": "^0.3.0" 1695 "json-bigint": "^0.3.0"
1504 } 1696 }
1505 }, 1697 },
1698 + "get-caller-file": {
1699 + "version": "2.0.5",
1700 + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
1701 + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
1702 + "dev": true
1703 + },
1506 "get-stream": { 1704 "get-stream": {
1507 "version": "4.1.0", 1705 "version": "4.1.0",
1508 "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 1706 "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
...@@ -1598,9 +1796,9 @@ ...@@ -1598,9 +1796,9 @@
1598 } 1796 }
1599 }, 1797 },
1600 "google-gax": { 1798 "google-gax": {
1601 - "version": "2.6.1", 1799 + "version": "2.6.0",
1602 - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.6.1.tgz", 1800 + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.6.0.tgz",
1603 - "integrity": "sha512-AKQKfaaXCJhMrP4nniz/ei7j+uyqG7nNrGmQxDBIBtDMUbZUMnH0Kw8asts35vmciEV5UeIWfclVcAU+VaJptw==", 1801 + "integrity": "sha512-ALyNwrDkFMd5x+egpHVjX4BrWLbnC1XWcpKI7xdkYw4vpZlU+Yh/JrOPA93+uxKFmBy2LB564cJk/o7Yfbkubg==",
1604 "requires": { 1802 "requires": {
1605 "@grpc/grpc-js": "~1.0.0", 1803 "@grpc/grpc-js": "~1.0.0",
1606 "@grpc/proto-loader": "^0.5.1", 1804 "@grpc/proto-loader": "^0.5.1",
...@@ -1709,6 +1907,12 @@ ...@@ -1709,6 +1907,12 @@
1709 "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", 1907 "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
1710 "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" 1908 "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk="
1711 }, 1909 },
1910 + "has-flag": {
1911 + "version": "3.0.0",
1912 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1913 + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
1914 + "dev": true
1915 + },
1712 "has-unicode": { 1916 "has-unicode": {
1713 "version": "2.0.1", 1917 "version": "2.0.1",
1714 "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 1918 "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
...@@ -1739,11 +1943,27 @@ ...@@ -1739,11 +1943,27 @@
1739 "debug": "4" 1943 "debug": "4"
1740 } 1944 }
1741 }, 1945 },
1946 + "iconv-lite": {
1947 + "version": "0.4.24",
1948 + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1949 + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1950 + "requires": {
1951 + "safer-buffer": ">= 2.1.2 < 3"
1952 + }
1953 + },
1742 "ieee754": { 1954 "ieee754": {
1743 "version": "1.1.13", 1955 "version": "1.1.13",
1744 "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 1956 "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
1745 "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" 1957 "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
1746 }, 1958 },
1959 + "ignore-walk": {
1960 + "version": "3.0.3",
1961 + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz",
1962 + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==",
1963 + "requires": {
1964 + "minimatch": "^3.0.4"
1965 + }
1966 + },
1747 "indexof": { 1967 "indexof": {
1748 "version": "0.0.1", 1968 "version": "0.0.1",
1749 "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", 1969 "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
...@@ -1766,9 +1986,7 @@ ...@@ -1766,9 +1986,7 @@
1766 "ini": { 1986 "ini": {
1767 "version": "1.3.5", 1987 "version": "1.3.5",
1768 "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 1988 "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
1769 - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 1989 + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
1770 - "dev": true,
1771 - "optional": true
1772 }, 1990 },
1773 "is": { 1991 "is": {
1774 "version": "3.3.0", 1992 "version": "3.3.0",
...@@ -1984,11 +2202,27 @@ ...@@ -1984,11 +2202,27 @@
1984 "xtend": "^4.0.0" 2202 "xtend": "^4.0.0"
1985 } 2203 }
1986 }, 2204 },
2205 + "locate-path": {
2206 + "version": "3.0.0",
2207 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
2208 + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
2209 + "dev": true,
2210 + "requires": {
2211 + "p-locate": "^3.0.0",
2212 + "path-exists": "^3.0.0"
2213 + }
2214 + },
1987 "lodash": { 2215 "lodash": {
1988 "version": "4.17.15", 2216 "version": "4.17.15",
1989 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 2217 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
1990 "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" 2218 "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
1991 }, 2219 },
2220 + "lodash.assign": {
2221 + "version": "4.2.0",
2222 + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
2223 + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
2224 + "dev": true
2225 + },
1992 "lodash.at": { 2226 "lodash.at": {
1993 "version": "4.6.0", 2227 "version": "4.6.0",
1994 "resolved": "https://registry.npmjs.org/lodash.at/-/lodash.at-4.6.0.tgz", 2228 "resolved": "https://registry.npmjs.org/lodash.at/-/lodash.at-4.6.0.tgz",
...@@ -2029,6 +2263,15 @@ ...@@ -2029,6 +2263,15 @@
2029 "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", 2263 "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz",
2030 "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" 2264 "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg="
2031 }, 2265 },
2266 + "log-symbols": {
2267 + "version": "2.2.0",
2268 + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
2269 + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
2270 + "dev": true,
2271 + "requires": {
2272 + "chalk": "^2.0.1"
2273 + }
2274 + },
2032 "long": { 2275 "long": {
2033 "version": "4.0.0", 2276 "version": "4.0.0",
2034 "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 2277 "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
...@@ -2081,6 +2324,12 @@ ...@@ -2081,6 +2324,12 @@
2081 "mime-db": "1.43.0" 2324 "mime-db": "1.43.0"
2082 } 2325 }
2083 }, 2326 },
2327 + "mimic-fn": {
2328 + "version": "1.2.0",
2329 + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
2330 + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
2331 + "dev": true
2332 + },
2084 "mimic-response": { 2333 "mimic-response": {
2085 "version": "1.0.1", 2334 "version": "1.0.1",
2086 "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 2335 "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
...@@ -2108,6 +2357,23 @@ ...@@ -2108,6 +2357,23 @@
2108 "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 2357 "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
2109 "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 2358 "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
2110 }, 2359 },
2360 + "minipass": {
2361 + "version": "2.9.0",
2362 + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
2363 + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
2364 + "requires": {
2365 + "safe-buffer": "^5.1.2",
2366 + "yallist": "^3.0.0"
2367 + }
2368 + },
2369 + "minizlib": {
2370 + "version": "1.3.3",
2371 + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
2372 + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
2373 + "requires": {
2374 + "minipass": "^2.9.0"
2375 + }
2376 + },
2111 "mjpeg-server": { 2377 "mjpeg-server": {
2112 "version": "0.3.0", 2378 "version": "0.3.0",
2113 "resolved": "https://registry.npmjs.org/mjpeg-server/-/mjpeg-server-0.3.0.tgz", 2379 "resolved": "https://registry.npmjs.org/mjpeg-server/-/mjpeg-server-0.3.0.tgz",
...@@ -2174,16 +2440,58 @@ ...@@ -2174,16 +2440,58 @@
2174 "sqlstring": "2.3.1" 2440 "sqlstring": "2.3.1"
2175 } 2441 }
2176 }, 2442 },
2443 + "nan": {
2444 + "version": "2.14.1",
2445 + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz",
2446 + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw=="
2447 + },
2177 "ncp": { 2448 "ncp": {
2178 "version": "2.0.0", 2449 "version": "2.0.0",
2179 "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", 2450 "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz",
2180 "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=" 2451 "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M="
2181 }, 2452 },
2453 + "needle": {
2454 + "version": "2.5.0",
2455 + "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.0.tgz",
2456 + "integrity": "sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA==",
2457 + "requires": {
2458 + "debug": "^3.2.6",
2459 + "iconv-lite": "^0.4.4",
2460 + "sax": "^1.2.4"
2461 + },
2462 + "dependencies": {
2463 + "debug": {
2464 + "version": "3.2.6",
2465 + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
2466 + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
2467 + "requires": {
2468 + "ms": "^2.1.1"
2469 + }
2470 + }
2471 + }
2472 + },
2182 "negotiator": { 2473 "negotiator": {
2183 "version": "0.6.2", 2474 "version": "0.6.2",
2184 "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 2475 "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
2185 "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 2476 "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
2186 }, 2477 },
2478 + "node-abi": {
2479 + "version": "2.18.0",
2480 + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.18.0.tgz",
2481 + "integrity": "sha512-yi05ZoiuNNEbyT/xXfSySZE+yVnQW6fxPZuFbLyS1s6b5Kw3HzV2PHOM4XR+nsjzkHxByK+2Wg+yCQbe35l8dw==",
2482 + "dev": true,
2483 + "requires": {
2484 + "semver": "^5.4.1"
2485 + },
2486 + "dependencies": {
2487 + "semver": {
2488 + "version": "5.7.1",
2489 + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
2490 + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
2491 + "dev": true
2492 + }
2493 + }
2494 + },
2187 "node-adb": { 2495 "node-adb": {
2188 "version": "0.1.6", 2496 "version": "0.1.6",
2189 "resolved": "https://registry.npmjs.org/node-adb/-/node-adb-0.1.6.tgz", 2497 "resolved": "https://registry.npmjs.org/node-adb/-/node-adb-0.1.6.tgz",
...@@ -2199,6 +2507,92 @@ ...@@ -2199,6 +2507,92 @@
2199 "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.1.tgz", 2507 "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.1.tgz",
2200 "integrity": "sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ==" 2508 "integrity": "sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ=="
2201 }, 2509 },
2510 + "node-gyp": {
2511 + "version": "6.1.0",
2512 + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-6.1.0.tgz",
2513 + "integrity": "sha512-h4A2zDlOujeeaaTx06r4Vy+8MZ1679lU+wbCKDS4ZtvY2A37DESo37oejIw0mtmR3+rvNwts5B6Kpt1KrNYdNw==",
2514 + "dev": true,
2515 + "requires": {
2516 + "env-paths": "^2.2.0",
2517 + "glob": "^7.1.4",
2518 + "graceful-fs": "^4.2.2",
2519 + "mkdirp": "^0.5.1",
2520 + "nopt": "^4.0.1",
2521 + "npmlog": "^4.1.2",
2522 + "request": "^2.88.0",
2523 + "rimraf": "^2.6.3",
2524 + "semver": "^5.7.1",
2525 + "tar": "^4.4.12",
2526 + "which": "^1.3.1"
2527 + },
2528 + "dependencies": {
2529 + "rimraf": {
2530 + "version": "2.7.1",
2531 + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
2532 + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
2533 + "dev": true,
2534 + "requires": {
2535 + "glob": "^7.1.3"
2536 + }
2537 + },
2538 + "semver": {
2539 + "version": "5.7.1",
2540 + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
2541 + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
2542 + "dev": true
2543 + },
2544 + "which": {
2545 + "version": "1.3.1",
2546 + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
2547 + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
2548 + "dev": true,
2549 + "requires": {
2550 + "isexe": "^2.0.0"
2551 + }
2552 + }
2553 + }
2554 + },
2555 + "node-pre-gyp": {
2556 + "version": "0.11.0",
2557 + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz",
2558 + "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==",
2559 + "requires": {
2560 + "detect-libc": "^1.0.2",
2561 + "mkdirp": "^0.5.1",
2562 + "needle": "^2.2.1",
2563 + "nopt": "^4.0.1",
2564 + "npm-packlist": "^1.1.6",
2565 + "npmlog": "^4.0.2",
2566 + "rc": "^1.2.7",
2567 + "rimraf": "^2.6.1",
2568 + "semver": "^5.3.0",
2569 + "tar": "^4"
2570 + },
2571 + "dependencies": {
2572 + "rimraf": {
2573 + "version": "2.7.1",
2574 + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
2575 + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
2576 + "requires": {
2577 + "glob": "^7.1.3"
2578 + }
2579 + },
2580 + "semver": {
2581 + "version": "5.7.1",
2582 + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
2583 + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
2584 + }
2585 + }
2586 + },
2587 + "nopt": {
2588 + "version": "4.0.3",
2589 + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
2590 + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
2591 + "requires": {
2592 + "abbrev": "1",
2593 + "osenv": "^0.1.4"
2594 + }
2595 + },
2202 "normalize-path": { 2596 "normalize-path": {
2203 "version": "3.0.0", 2597 "version": "3.0.0",
2204 "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2598 "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
...@@ -2210,6 +2604,14 @@ ...@@ -2210,6 +2604,14 @@
2210 "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", 2604 "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
2211 "dev": true 2605 "dev": true
2212 }, 2606 },
2607 + "npm-bundled": {
2608 + "version": "1.1.1",
2609 + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz",
2610 + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==",
2611 + "requires": {
2612 + "npm-normalize-package-bin": "^1.0.1"
2613 + }
2614 + },
2213 "npm-conf": { 2615 "npm-conf": {
2214 "version": "1.1.3", 2616 "version": "1.1.3",
2215 "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", 2617 "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz",
...@@ -2221,6 +2623,21 @@ ...@@ -2221,6 +2623,21 @@
2221 "pify": "^3.0.0" 2623 "pify": "^3.0.0"
2222 } 2624 }
2223 }, 2625 },
2626 + "npm-normalize-package-bin": {
2627 + "version": "1.0.1",
2628 + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
2629 + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="
2630 + },
2631 + "npm-packlist": {
2632 + "version": "1.4.8",
2633 + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz",
2634 + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==",
2635 + "requires": {
2636 + "ignore-walk": "^3.0.1",
2637 + "npm-bundled": "^1.0.1",
2638 + "npm-normalize-package-bin": "^1.0.1"
2639 + }
2640 + },
2224 "npmlog": { 2641 "npmlog": {
2225 "version": "4.1.2", 2642 "version": "4.1.2",
2226 "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 2643 "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
...@@ -2272,12 +2689,95 @@ ...@@ -2272,12 +2689,95 @@
2272 "wrappy": "1" 2689 "wrappy": "1"
2273 } 2690 }
2274 }, 2691 },
2692 + "onetime": {
2693 + "version": "2.0.1",
2694 + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
2695 + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
2696 + "dev": true,
2697 + "requires": {
2698 + "mimic-fn": "^1.0.0"
2699 + }
2700 + },
2701 + "ora": {
2702 + "version": "3.4.0",
2703 + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz",
2704 + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==",
2705 + "dev": true,
2706 + "requires": {
2707 + "chalk": "^2.4.2",
2708 + "cli-cursor": "^2.1.0",
2709 + "cli-spinners": "^2.0.0",
2710 + "log-symbols": "^2.2.0",
2711 + "strip-ansi": "^5.2.0",
2712 + "wcwidth": "^1.0.1"
2713 + },
2714 + "dependencies": {
2715 + "ansi-regex": {
2716 + "version": "4.1.0",
2717 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
2718 + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
2719 + "dev": true
2720 + },
2721 + "strip-ansi": {
2722 + "version": "5.2.0",
2723 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
2724 + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
2725 + "dev": true,
2726 + "requires": {
2727 + "ansi-regex": "^4.1.0"
2728 + }
2729 + }
2730 + }
2731 + },
2732 + "os-homedir": {
2733 + "version": "1.0.2",
2734 + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
2735 + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
2736 + },
2737 + "os-tmpdir": {
2738 + "version": "1.0.2",
2739 + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
2740 + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
2741 + },
2742 + "osenv": {
2743 + "version": "0.1.5",
2744 + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
2745 + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
2746 + "requires": {
2747 + "os-homedir": "^1.0.0",
2748 + "os-tmpdir": "^1.0.0"
2749 + }
2750 + },
2275 "p-cancelable": { 2751 "p-cancelable": {
2276 "version": "1.1.0", 2752 "version": "1.1.0",
2277 "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", 2753 "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
2278 "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", 2754 "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
2279 "dev": true 2755 "dev": true
2280 }, 2756 },
2757 + "p-limit": {
2758 + "version": "2.3.0",
2759 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
2760 + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
2761 + "dev": true,
2762 + "requires": {
2763 + "p-try": "^2.0.0"
2764 + }
2765 + },
2766 + "p-locate": {
2767 + "version": "3.0.0",
2768 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
2769 + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
2770 + "dev": true,
2771 + "requires": {
2772 + "p-limit": "^2.0.0"
2773 + }
2774 + },
2775 + "p-try": {
2776 + "version": "2.2.0",
2777 + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
2778 + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
2779 + "dev": true
2780 + },
2281 "pako": { 2781 "pako": {
2282 "version": "1.0.11", 2782 "version": "1.0.11",
2283 "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 2783 "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
...@@ -2328,6 +2828,12 @@ ...@@ -2328,6 +2828,12 @@
2328 "better-assert": "~1.0.0" 2828 "better-assert": "~1.0.0"
2329 } 2829 }
2330 }, 2830 },
2831 + "path-exists": {
2832 + "version": "3.0.0",
2833 + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
2834 + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
2835 + "dev": true
2836 + },
2331 "path-is-absolute": { 2837 "path-is-absolute": {
2332 "version": "1.0.1", 2838 "version": "1.0.1",
2333 "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2839 "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
...@@ -2440,9 +2946,9 @@ ...@@ -2440,9 +2946,9 @@
2440 }, 2946 },
2441 "dependencies": { 2947 "dependencies": {
2442 "@types/node": { 2948 "@types/node": {
2443 - "version": "13.13.11", 2949 + "version": "13.13.10",
2444 - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.11.tgz", 2950 + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.10.tgz",
2445 - "integrity": "sha512-FX7mIFKfnGCfq10DGWNhfCNxhACEeqH5uulT6wRRA1KEt7zgLe0HdrAd9/QQkObDqp2Z0KEV3OAmNgs0lTx5tQ==" 2951 + "integrity": "sha512-J+FbkhLTcFstD7E5mVZDjYxa1VppwT2HALE6H3n2AnBSP8uiCQk0Pyr6BkJcP38dFV9WecoVJRJmFnl9ikIW7Q=="
2446 } 2952 }
2447 } 2953 }
2448 }, 2954 },
...@@ -2476,6 +2982,17 @@ ...@@ -2476,6 +2982,17 @@
2476 "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 2982 "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
2477 "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 2983 "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
2478 }, 2984 },
2985 + "rc": {
2986 + "version": "1.2.8",
2987 + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
2988 + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
2989 + "requires": {
2990 + "deep-extend": "^0.6.0",
2991 + "ini": "~1.3.0",
2992 + "minimist": "^1.2.0",
2993 + "strip-json-comments": "~2.0.1"
2994 + }
2995 + },
2479 "readable-stream": { 2996 "readable-stream": {
2480 "version": "2.3.7", 2997 "version": "2.3.7",
2481 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 2998 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
...@@ -2548,6 +3065,18 @@ ...@@ -2548,6 +3065,18 @@
2548 "lodash": "^4.17.15" 3065 "lodash": "^4.17.15"
2549 } 3066 }
2550 }, 3067 },
3068 + "require-directory": {
3069 + "version": "2.1.1",
3070 + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
3071 + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
3072 + "dev": true
3073 + },
3074 + "require-main-filename": {
3075 + "version": "2.0.0",
3076 + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
3077 + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
3078 + "dev": true
3079 + },
2551 "responselike": { 3080 "responselike": {
2552 "version": "1.0.2", 3081 "version": "1.0.2",
2553 "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", 3082 "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
...@@ -2557,6 +3086,16 @@ ...@@ -2557,6 +3086,16 @@
2557 "lowercase-keys": "^1.0.0" 3086 "lowercase-keys": "^1.0.0"
2558 } 3087 }
2559 }, 3088 },
3089 + "restore-cursor": {
3090 + "version": "2.0.0",
3091 + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
3092 + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
3093 + "dev": true,
3094 + "requires": {
3095 + "onetime": "^2.0.0",
3096 + "signal-exit": "^3.0.2"
3097 + }
3098 + },
2560 "retry-request": { 3099 "retry-request": {
2561 "version": "4.1.1", 3100 "version": "4.1.1",
2562 "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.1.tgz", 3101 "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.1.tgz",
...@@ -2589,6 +3128,15 @@ ...@@ -2589,6 +3128,15 @@
2589 "sprintf-js": "^1.1.2" 3128 "sprintf-js": "^1.1.2"
2590 } 3129 }
2591 }, 3130 },
3131 + "rxjs": {
3132 + "version": "6.5.5",
3133 + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
3134 + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
3135 + "dev": true,
3136 + "requires": {
3137 + "tslib": "^1.9.0"
3138 + }
3139 + },
2592 "safe-buffer": { 3140 "safe-buffer": {
2593 "version": "5.1.2", 3141 "version": "5.1.2",
2594 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 3142 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
...@@ -2751,6 +3299,34 @@ ...@@ -2751,6 +3299,34 @@
2751 "source-map": "^0.6.0" 3299 "source-map": "^0.6.0"
2752 } 3300 }
2753 }, 3301 },
3302 + "spawn-rx": {
3303 + "version": "3.0.0",
3304 + "resolved": "https://registry.npmjs.org/spawn-rx/-/spawn-rx-3.0.0.tgz",
3305 + "integrity": "sha512-dw4Ryg/KMNfkKa5ezAR5aZe9wNwPdKlnHEXtHOjVnyEDSPQyOpIPPRtcIiu7127SmtHhaCjw21yC43HliW0iIg==",
3306 + "dev": true,
3307 + "requires": {
3308 + "debug": "^2.5.1",
3309 + "lodash.assign": "^4.2.0",
3310 + "rxjs": "^6.3.1"
3311 + },
3312 + "dependencies": {
3313 + "debug": {
3314 + "version": "2.6.9",
3315 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
3316 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
3317 + "dev": true,
3318 + "requires": {
3319 + "ms": "2.0.0"
3320 + }
3321 + },
3322 + "ms": {
3323 + "version": "2.0.0",
3324 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
3325 + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
3326 + "dev": true
3327 + }
3328 + }
3329 + },
2754 "sprintf-js": { 3330 "sprintf-js": {
2755 "version": "1.1.2", 3331 "version": "1.1.2",
2756 "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", 3332 "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
...@@ -2758,6 +3334,15 @@ ...@@ -2758,6 +3334,15 @@
2758 "dev": true, 3334 "dev": true,
2759 "optional": true 3335 "optional": true
2760 }, 3336 },
3337 + "sqlite3": {
3338 + "version": "4.2.0",
3339 + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.2.0.tgz",
3340 + "integrity": "sha512-roEOz41hxui2Q7uYnWsjMOTry6TcNUNmp8audCx18gF10P2NknwdpF+E+HKvz/F2NvPKGGBF4NGc+ZPQ+AABwg==",
3341 + "requires": {
3342 + "nan": "^2.12.1",
3343 + "node-pre-gyp": "^0.11.0"
3344 + }
3345 + },
2761 "sqlstring": { 3346 "sqlstring": {
2762 "version": "2.3.1", 3347 "version": "2.3.1",
2763 "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", 3348 "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz",
...@@ -2829,6 +3414,11 @@ ...@@ -2829,6 +3414,11 @@
2829 "ansi-regex": "^2.0.0" 3414 "ansi-regex": "^2.0.0"
2830 } 3415 }
2831 }, 3416 },
3417 + "strip-json-comments": {
3418 + "version": "2.0.1",
3419 + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
3420 + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
3421 + },
2832 "sumchecker": { 3422 "sumchecker": {
2833 "version": "3.0.1", 3423 "version": "3.0.1",
2834 "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", 3424 "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz",
...@@ -2838,6 +3428,29 @@ ...@@ -2838,6 +3428,29 @@
2838 "debug": "^4.1.0" 3428 "debug": "^4.1.0"
2839 } 3429 }
2840 }, 3430 },
3431 + "supports-color": {
3432 + "version": "5.5.0",
3433 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
3434 + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
3435 + "dev": true,
3436 + "requires": {
3437 + "has-flag": "^3.0.0"
3438 + }
3439 + },
3440 + "tar": {
3441 + "version": "4.4.13",
3442 + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
3443 + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
3444 + "requires": {
3445 + "chownr": "^1.1.1",
3446 + "fs-minipass": "^1.2.5",
3447 + "minipass": "^2.8.6",
3448 + "minizlib": "^1.2.1",
3449 + "mkdirp": "^0.5.0",
3450 + "safe-buffer": "^5.1.2",
3451 + "yallist": "^3.0.3"
3452 + }
3453 + },
2841 "tar-stream": { 3454 "tar-stream": {
2842 "version": "2.1.2", 3455 "version": "2.1.2",
2843 "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", 3456 "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz",
...@@ -2925,6 +3538,12 @@ ...@@ -2925,6 +3538,12 @@
2925 "utf8-byte-length": "^1.0.1" 3538 "utf8-byte-length": "^1.0.1"
2926 } 3539 }
2927 }, 3540 },
3541 + "tslib": {
3542 + "version": "1.13.0",
3543 + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
3544 + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
3545 + "dev": true
3546 + },
2928 "tunnel": { 3547 "tunnel": {
2929 "version": "0.0.6", 3548 "version": "0.0.6",
2930 "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", 3549 "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
...@@ -3038,6 +3657,15 @@ ...@@ -3038,6 +3657,15 @@
3038 "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", 3657 "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz",
3039 "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==" 3658 "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ=="
3040 }, 3659 },
3660 + "wcwidth": {
3661 + "version": "1.0.1",
3662 + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
3663 + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
3664 + "dev": true,
3665 + "requires": {
3666 + "defaults": "^1.0.3"
3667 + }
3668 + },
3041 "which": { 3669 "which": {
3042 "version": "2.0.2", 3670 "version": "2.0.2",
3043 "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3671 "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
...@@ -3046,6 +3674,12 @@ ...@@ -3046,6 +3674,12 @@
3046 "isexe": "^2.0.0" 3674 "isexe": "^2.0.0"
3047 } 3675 }
3048 }, 3676 },
3677 + "which-module": {
3678 + "version": "2.0.0",
3679 + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
3680 + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
3681 + "dev": true
3682 + },
3049 "wide-align": { 3683 "wide-align": {
3050 "version": "1.1.3", 3684 "version": "1.1.3",
3051 "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 3685 "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
...@@ -3054,6 +3688,51 @@ ...@@ -3054,6 +3688,51 @@
3054 "string-width": "^1.0.2 || 2" 3688 "string-width": "^1.0.2 || 2"
3055 } 3689 }
3056 }, 3690 },
3691 + "wrap-ansi": {
3692 + "version": "5.1.0",
3693 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
3694 + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
3695 + "dev": true,
3696 + "requires": {
3697 + "ansi-styles": "^3.2.0",
3698 + "string-width": "^3.0.0",
3699 + "strip-ansi": "^5.0.0"
3700 + },
3701 + "dependencies": {
3702 + "ansi-regex": {
3703 + "version": "4.1.0",
3704 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
3705 + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
3706 + "dev": true
3707 + },
3708 + "is-fullwidth-code-point": {
3709 + "version": "2.0.0",
3710 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
3711 + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
3712 + "dev": true
3713 + },
3714 + "string-width": {
3715 + "version": "3.1.0",
3716 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
3717 + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
3718 + "dev": true,
3719 + "requires": {
3720 + "emoji-regex": "^7.0.1",
3721 + "is-fullwidth-code-point": "^2.0.0",
3722 + "strip-ansi": "^5.1.0"
3723 + }
3724 + },
3725 + "strip-ansi": {
3726 + "version": "5.2.0",
3727 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
3728 + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
3729 + "dev": true,
3730 + "requires": {
3731 + "ansi-regex": "^4.1.0"
3732 + }
3733 + }
3734 + }
3735 + },
3057 "wrappy": { 3736 "wrappy": {
3058 "version": "1.0.2", 3737 "version": "1.0.2",
3059 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3738 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
...@@ -3109,11 +3788,80 @@ ...@@ -3109,11 +3788,80 @@
3109 "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 3788 "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
3110 "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 3789 "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
3111 }, 3790 },
3791 + "y18n": {
3792 + "version": "4.0.0",
3793 + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
3794 + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
3795 + "dev": true
3796 + },
3112 "yallist": { 3797 "yallist": {
3113 "version": "3.1.1", 3798 "version": "3.1.1",
3114 "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 3799 "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
3115 "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 3800 "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
3116 }, 3801 },
3802 + "yargs": {
3803 + "version": "14.2.3",
3804 + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz",
3805 + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==",
3806 + "dev": true,
3807 + "requires": {
3808 + "cliui": "^5.0.0",
3809 + "decamelize": "^1.2.0",
3810 + "find-up": "^3.0.0",
3811 + "get-caller-file": "^2.0.1",
3812 + "require-directory": "^2.1.1",
3813 + "require-main-filename": "^2.0.0",
3814 + "set-blocking": "^2.0.0",
3815 + "string-width": "^3.0.0",
3816 + "which-module": "^2.0.0",
3817 + "y18n": "^4.0.0",
3818 + "yargs-parser": "^15.0.1"
3819 + },
3820 + "dependencies": {
3821 + "ansi-regex": {
3822 + "version": "4.1.0",
3823 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
3824 + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
3825 + "dev": true
3826 + },
3827 + "is-fullwidth-code-point": {
3828 + "version": "2.0.0",
3829 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
3830 + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
3831 + "dev": true
3832 + },
3833 + "string-width": {
3834 + "version": "3.1.0",
3835 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
3836 + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
3837 + "dev": true,
3838 + "requires": {
3839 + "emoji-regex": "^7.0.1",
3840 + "is-fullwidth-code-point": "^2.0.0",
3841 + "strip-ansi": "^5.1.0"
3842 + }
3843 + },
3844 + "strip-ansi": {
3845 + "version": "5.2.0",
3846 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
3847 + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
3848 + "dev": true,
3849 + "requires": {
3850 + "ansi-regex": "^4.1.0"
3851 + }
3852 + }
3853 + }
3854 + },
3855 + "yargs-parser": {
3856 + "version": "15.0.1",
3857 + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz",
3858 + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==",
3859 + "dev": true,
3860 + "requires": {
3861 + "camelcase": "^5.0.0",
3862 + "decamelize": "^1.2.0"
3863 + }
3864 + },
3117 "yauzl": { 3865 "yauzl": {
3118 "version": "2.10.0", 3866 "version": "2.10.0",
3119 "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 3867 "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
......
...@@ -4,24 +4,28 @@ ...@@ -4,24 +4,28 @@
4 "description": "", 4 "description": "",
5 "main": "main.js", 5 "main": "main.js",
6 "scripts": { 6 "scripts": {
7 - "start": "electron ." 7 + "start": "electron .",
8 + "rebuild": "electron-rebuild -f -w sqlite3"
8 }, 9 },
9 "author": "Hee <glwjd0414@khu.ac.kr>", 10 "author": "Hee <glwjd0414@khu.ac.kr>",
10 "license": "ISC", 11 "license": "ISC",
11 "devDependencies": { 12 "devDependencies": {
12 - "electron": "^8.2.0" 13 + "electron": "^8.2.0",
14 + "electron-rebuild": "^1.11.0"
13 }, 15 },
14 "dependencies": { 16 "dependencies": {
15 "@google-cloud/vision": "^2.0.0", 17 "@google-cloud/vision": "^2.0.0",
16 - "appium-adb": "^7.27.1",
17 "bootstrap-icons": "^1.0.0-alpha4", 18 "bootstrap-icons": "^1.0.0-alpha4",
18 "chart.js": "^2.9.3", 19 "chart.js": "^2.9.3",
20 + "@google-cloud/video-intelligence": "^3.0.0",
21 + "appium-adb": "^7.27.1",
22 + "electron-log": "^4.2.0",
19 "jQuery": "^1.7.4", 23 "jQuery": "^1.7.4",
20 - "jquery": "^3.5.0",
21 "mysql": "^2.18.1", 24 "mysql": "^2.18.1",
22 "node-adb": "^0.1.6", 25 "node-adb": "^0.1.6",
23 "python-shell": "^2.0.0", 26 "python-shell": "^2.0.0",
24 "rimraf": "^3.0.2", 27 "rimraf": "^3.0.2",
25 - "socket.io": "^2.3.0" 28 + "socket.io": "^2.3.0",
29 + "sqlite3": "^4.2.0"
26 } 30 }
27 } 31 }
......
1 +<!DOCTYPE html>
2 +<html lang="en">
3 +<head>
4 + <meta charset="UTF-8">
5 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 + <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
7 + <script src="https://cdn.jsdelivr.net/npm/chart.js@2.8.0"></script>
8 + <link rel="stylesheet" href="../assets/css/alldata.css">
9 + <title>Document</title>
10 +</head>
11 +<body>
12 + <header class="menu-header py-4">
13 + <div class="row pl-3 d-flex justify-content-start flex-nowrap align-items-end">
14 + <div class="col">
15 + <a class="title-name text-dark">All data</a>
16 + </div>
17 + <div div class="col-8">
18 + <a class="title-detail">추출 데이터 확인</a>
19 + </div>
20 + <div div class="col">
21 + <a class="title-back" href="menu.html" id="menu-out">나가기</a>
22 + </div>
23 + </div>
24 + </header>
25 + <div class="nav-scroller nav-color py-1 mb-2">
26 + <nav class="nav d-flex justify-content-around">
27 + <a class="p-2" href="#" style="color: whitesmoke" id="menu-info">INFO</a>
28 + <a class="p-2" href="#" style="color: whitesmoke" id="menu-calling">CALLING</a>
29 + <a class="p-2" href="#" style="color: whitesmoke" id="menu-photo">PHOTO</a>
30 + <a class="p-2" href="#" style="color: whitesmoke" id="menu-contact">CONTACT</a>
31 + <a class="p-2" href="#" style="color: whitesmoke" id="menu-video">VIDEO</a>
32 + <a class="p-2" href="#" style="color: whitesmoke" id="menu-sms">SMS</a>
33 + <a class="p-2" href="#" style="color: whitesmoke" id="menu-audio">AUDIO</a>
34 + <a class="p-2" href="#" style="color: whitesmoke" id="menu-document">DOCUMENT</a>
35 + <a class="p-2" href="#" style="color: whitesmoke" id="menu-calendar">CALENDAR</a>
36 + <a class="p-2" href="#" style="color: whitesmoke" id="menu-network">NETWORK</a>
37 + <a class="p-2" href="#" style="color: whitesmoke" id="menu-appinfo">APP INFO</a>
38 + <a class="p-2" href="#" style="color: whitesmoke" id="menu-wifi">WIFI</a>
39 + <a class="p-2" href="#" style="color: whitesmoke" id="menu-usagestats">USAGESTATS</a>
40 + </nav>
41 + </div>
42 + <div ids = "table_list">
43 + <table id="table">
44 + <tbody>
45 +
46 + </tbody>
47 + </table>
48 + </div>
49 + <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
50 + <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
51 + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
52 + <script src="alldata_menu.js"></script>
53 +</body>
54 +</html>
...\ No newline at end of file ...\ No newline at end of file
1 +const log = require('electron-log')
2 +const sqlite3 = require('sqlite3').verbose();
3 +
4 +document.addEventListener("DOMContentLoaded", function(){
5 + getInfoRows();
6 +});
7 +
8 +function el(selector) {
9 + return document.getElementById(selector);
10 +}
11 +el('menu-info').addEventListener('click', function(){
12 + // Get the mysql service
13 + getInfoRows();
14 +},false);
15 +
16 +el('menu-calling').addEventListener('click', function(){
17 + // Get the mysql service
18 + getCallingRows();
19 +},false);
20 +
21 +el('menu-photo').addEventListener('click', function(){
22 + // Get the mysql service
23 + getPhotoRows();
24 +},false);
25 +
26 +el('menu-contact').addEventListener('click', function(){
27 + // Get the mysql service
28 + getContactRows();
29 +},false);
30 +
31 +el('menu-video').addEventListener('click', function(){
32 + // Get the mysql service
33 + getVideoRows();
34 +},false);
35 +
36 +el('menu-sms').addEventListener('click', function(){
37 + // Get the mysql service
38 + getSmsRows();
39 +},false);
40 +
41 +el('menu-audio').addEventListener('click', function(){
42 + // Get the mysql service
43 + getAudioRows();
44 +},false);
45 +
46 +
47 +el('menu-document').addEventListener('click', function(){
48 + // Get the mysql service
49 + getDocumentRows();
50 +},false);
51 +
52 +el('menu-calendar').addEventListener('click', function(){
53 + // Get the mysql service
54 + getCalendarRows();
55 +},false);
56 +
57 +el('menu-network').addEventListener('click', function(){
58 + // Get the mysql service
59 + getNetworkRows();
60 +},false);
61 +
62 +el('menu-appinfo').addEventListener('click', function(){
63 + // Get the mysql service
64 + getAppinfoRows();
65 +},false);
66 +
67 +el('menu-wifi').addEventListener('click', function(){
68 + // Get the mysql service
69 + getWifiRows();
70 +},false);
71 +
72 +el('menu-usagestats').addEventListener('click', function(){
73 + // Get the mysql service
74 + getAppUsageRows();
75 +},false);
76 +
77 +
78 +function getInfoRows(){
79 + Promise.all([getphoneinfo(),getaccountinfo()]).then(function(value){
80 + log.info(value);
81 + var html = value[0] + value[1];
82 + document.querySelector('#table > tbody').innerHTML = html;
83 + });
84 +}
85 +
86 +function getCallingRows(){
87 + const db = new sqlite3.Database('InnerDatabase.db');
88 + var html = "<tr><th>Id</th>\
89 + <th>Type</th>\
90 + <th>Name</th>\
91 + <th>Number</th>\
92 + <th>Duration</th>\
93 + <th>Date</th>\
94 + </tr>"
95 + let sql = "SELECT * FROM calllog"
96 + db.all(sql, [], (err, rows) => {
97 + if (err) {
98 + log.err(err);
99 + throw err;
100 + }
101 +
102 + rows.forEach((row) => {
103 + html += `<tr>
104 + <td>${row.id}</td>
105 + <td>${row.type}</td>
106 + <td>${row.name}</td>
107 + <td>${row.number}</td>
108 + <td>${row.duration}</td>
109 + <td>${row.date}</td>
110 + </tr>`;
111 + });
112 + document.querySelector('#table > tbody').innerHTML = html;
113 + db.close();
114 + log.info("Query succesfully executed");
115 + });
116 +}
117 +
118 +function getPhotoRows(){
119 + const db = new sqlite3.Database('InnerDatabase.db');
120 + var html = "<tr><th>Title</th>\
121 + <th>Id</th>\
122 + <th>Date Added</th>\
123 + <th>Display Name</th>\
124 + <th>Mime type</th>\
125 + <th>Path</th>\
126 + <th>Latitude</th>\
127 + <th>Longitude</th>\
128 + <th>Size</th>\
129 + </tr>"
130 + let sql = "SELECT * FROM photo"
131 + db.all(sql, [], (err, rows) => {
132 + if (err) {
133 + log.err(err);
134 + throw err;
135 + }
136 +
137 + rows.forEach((row) => {
138 + html += `<tr>
139 + <td>${row.title}</td>
140 + <td>${row.id}</td>
141 + <td>${row.date_added}</td>
142 + <td>${row.display_name}</td>
143 + <td>${row.mime_type}</td>
144 + <td>${row.path}</td>
145 + <td>${row.latitude}</td>
146 + <td>${row.longitude}</td>
147 + <td>${row.size}</td>
148 + </tr>`;
149 + });
150 + document.querySelector('#table > tbody').innerHTML = html;
151 + db.close();
152 + log.info("Query succesfully executed");
153 + });
154 +}
155 +
156 +function getContactRows(){
157 + const db = new sqlite3.Database('InnerDatabase.db');
158 + var html = "<tr><th>Number</th>\
159 + <th>Name</th>\
160 + <th>Photo_id</th>\
161 + <th>Person_id</th>\
162 + </tr>"
163 + let sql = "SELECT * FROM contact"
164 + db.all(sql, [], (err, rows) => {
165 + if (err) {
166 + log.err(err);
167 + throw err;
168 + }
169 +
170 + rows.forEach((row) => {
171 + html += `<tr>
172 + <td>${row.number}</td>
173 + <td>${row.name}</td>
174 + <td>${row.photo_id}</td>
175 + <td>${row.person_id}</td>
176 + </tr>`;
177 + });
178 + document.querySelector('#table > tbody').innerHTML = html;
179 + db.close();
180 + log.info("Query succesfully executed");
181 + });
182 +}
183 +
184 +function getVideoRows(){
185 + const db = new sqlite3.Database('InnerDatabase.db');
186 + var html = "<tr><th>Title</th>\
187 + <th>Date Added</th>\
188 + <th>Display Name</th>\
189 + <th>Mime type</th>\
190 + <th>Path</th>\
191 + <th>Latitude</th>\
192 + <th>Longitude</th>\
193 + <th>Album</th>\
194 + <th>Artist</th>\
195 + <th>Bookmark</th>\
196 + <th>Category</th>\
197 + <th>Description</th>\
198 + <th>Language</th>\
199 + <th>Resolution</th>\
200 + <th>Tags</th>\
201 + <th>Size</th>\
202 + </tr>"
203 + let sql = "SELECT * FROM video"
204 + db.all(sql, [], (err, rows) => {
205 + if (err) {
206 + log.err(err);
207 + throw err;
208 + }
209 +
210 + rows.forEach((row) => {
211 + html += `<tr>
212 + <td>${row.title}</td>
213 + <td>${row.date_added}</td>
214 + <td>${row.display_name}</td>
215 + <td>${row.mime_type}</td>
216 + <td>${row.path}</td>
217 + <td>${row.latitude}</td>
218 + <td>${row.longitude}</td>
219 + <td>${row.album}</td>
220 + <td>${row.artist}</td>
221 + <td>${row.bookmark}</td>
222 + <td>${row.category}</td>
223 + <td>${row.description}</td>
224 + <td>${row.language}</td>
225 + <td>${row.resolution}</td>
226 + <td>${row.tags}</td>
227 + <td>${row.size}</td>
228 + </tr>`;
229 + });
230 + document.querySelector('#table > tbody').innerHTML = html;
231 + db.close();
232 + log.info("Query succesfully executed");
233 + });
234 +}
235 +
236 +function getSmsRows(){
237 + const db = new sqlite3.Database('InnerDatabase.db');
238 + var html = "<tr><th>Mid</th>\
239 + <th>Tid</th>\
240 + <th>Type</th>\
241 + <th>Address</th>\
242 + <th>Person</th>\
243 + <th>Creator</th>\
244 + <th>Date</th>\
245 + <th>Body</th>\
246 + <th>Read_c</th>\
247 + </tr>"
248 + let sql = "SELECT * FROM sms"
249 + db.all(sql, [], (err, rows) => {
250 + if (err) {
251 + log.err(err);
252 + throw err;
253 + }
254 +
255 + rows.forEach((row) => {
256 + html += `<tr>
257 + <td>${row.mid}</td>
258 + <td>${row.tid}</td>
259 + <td>${row.type}</td>
260 + <td>${row.address}</td>
261 + <td>${row.person}</td>
262 + <td>${row.creator}</td>
263 + <td>${row.date}</td>
264 + <td>${row.body}</td>
265 + <td>${row.read_c}</td>
266 + </tr>`;
267 + });
268 + document.querySelector('#table > tbody').innerHTML = html;
269 + db.close();
270 + log.info("Query succesfully executed");
271 + });
272 +}
273 +
274 +function getAudioRows(){
275 + const db = new sqlite3.Database('InnerDatabase.db');
276 + var html = "<tr><th>Title</th>\
277 + <th>Date Added</th>\
278 + <th>Mime type</th>\
279 + <th>Path</th>\
280 + <th>Album</th>\
281 + <th>Artist</th>\
282 + <th>Composer</th>\
283 + <th>Year</th>\
284 + <th>Size</th>\
285 + </tr>"
286 + let sql = "SELECT * FROM audio"
287 + db.all(sql, [], (err, rows) => {
288 + if (err) {
289 + log.err(err);
290 + throw err;
291 + }
292 +
293 + rows.forEach((row) => {
294 + html += `<tr>
295 + <td>${row.title}</td>
296 + <td>${row.date_added}</td>
297 + <td>${row.mime_type}</td>
298 + <td>${row.path}</td>
299 + <td>${row.album}</td>
300 + <td>${row.artist}</td>
301 + <td>${row.composer}</td>
302 + <td>${row.year}</td>
303 + <td>${row.size}</td>
304 + </tr>`;
305 + });
306 + document.querySelector('#table > tbody').innerHTML = html;
307 + db.close();
308 + log.info("Query succesfully executed");
309 + });
310 +}
311 +
312 +function getDocumentRows(){
313 + const db = new sqlite3.Database('InnerDatabase.db');
314 + var html = "<tr><th>Name</th>\
315 + <th>Title</th>\
316 + <th>Mime type</th>\
317 + <th>Date Added</th>\
318 + <th>Date Modified</th>\
319 + <th>Path</th>\
320 + <th>Size</th>\
321 + </tr>"
322 + let sql = "SELECT * FROM documentinfo"
323 + db.all(sql, [], (err, rows) => {
324 + if (err) {
325 + log.err(err);
326 + throw err;
327 + }
328 +
329 + rows.forEach((row) => {
330 + html += `<tr>
331 + <td>${row.name}</td>
332 + <td>${row.title}</td>
333 + <td>${row.mime_type}</td>
334 + <td>${row.date_added}</td>
335 + <td>${row.date_modified}</td>
336 + <td>${row.path}</td>
337 + <td>${row.size}</td>
338 + </tr>`;
339 + });
340 + document.querySelector('#table > tbody').innerHTML = html;
341 + db.close();
342 + log.info("Query succesfully executed");
343 + });
344 +}
345 +
346 +function getCalendarRows(){
347 + const db = new sqlite3.Database('InnerDatabase.db');
348 + var html = "<tr><th>Id</th>\
349 + <th>Title</th>\
350 + <th>Calendar Id</th>\
351 + <th>Event Location</th>\
352 + <th>Description</th>\
353 + <th>Dstart</th>\
354 + <th>Dend</th>\
355 + <th>Duration</th>\
356 + <th>All day</th>\
357 + <th>Display name</th>\
358 + <th>Account name</th>\
359 + <th>Owner name</th>\
360 + <th>Rrlue</th>\
361 + <th>Rdate</th>\
362 + </tr>"
363 + let sql = "SELECT * FROM calendar"
364 + db.all(sql, [], (err, rows) => {
365 + if (err) {
366 + log.err(err);
367 + throw err;
368 + }
369 +
370 + rows.forEach((row) => {
371 + html += `<tr>
372 + <td>${row.id}</td>
373 + <td>${row.title}</td>
374 + <td>${row.calendar_id}</td>
375 + <td>${row.event_location}</td>
376 + <td>${row.description}</td>
377 + <td>${row.dtstart}</td>
378 + <td>${row.dtend}</td>
379 + <td>${row.duration}</td>
380 + <td>${row.all_day}</td>
381 + <td>${row.display_name}</td>
382 + <td>${row.account_name}</td>
383 + <td>${row.owner_name}</td>
384 + <td>${row.rrlue}</td>
385 + <td>${row.rdate}</td>
386 + </tr>`;
387 + });
388 + document.querySelector('#table > tbody').innerHTML = html;
389 + db.close();
390 + log.info("Query succesfully executed");
391 + });
392 +}
393 +
394 +function getNetworkRows(){
395 + Promise.all([getandroidmetadata(),getinetAddress(),getlinkAddress(),getnetworkInfo(),getrouteInfo()]).then(function(value){
396 + log.info(value);
397 + var html = value[0] + value[1] + value[2] + value[3] + value[4];
398 + document.querySelector('#table > tbody').innerHTML = html;
399 + });
400 +}
401 +
402 +function getAppinfoRows(){
403 + const db = new sqlite3.Database('InnerDatabase.db');
404 + var html = "<tr><th>Packagename</th>\
405 + <th>Version</th>\
406 + <th>Name</th>\
407 + <th>First insatll</th>\
408 + <th>Last update</th>\
409 + <th>Wifi Usage</th>\
410 + <th>Cellular Usage</th>\
411 + </tr>"
412 + let sql = "SELECT * FROM appinfo"
413 + db.all(sql, [], (err, rows) => {
414 + if (err) {
415 + log.err(err);
416 + throw err;
417 + }
418 +
419 + rows.forEach((row) => {
420 + html += `<tr>
421 + <td>${row.packagename}</td>
422 + <td>${row.version}</td>
423 + <td>${row.name}</td>
424 + <td>${row.firstinstall}</td>
425 + <td>${row.lastupdate}</td>
426 + <td>${row.wifiusage}</td>
427 + <td>${row.cellularusage}</td>
428 + </tr>`;
429 + });
430 + document.querySelector('#table > tbody').innerHTML = html;
431 + db.close();
432 + log.info("Query succesfully executed");
433 + });
434 +}
435 +
436 +function getWifiRows(){
437 + const db = new sqlite3.Database('InnerDatabase.db');
438 + var html = "<tr><th>ID</th>\
439 + <th>Ssid</th>\
440 + <th>Bssid</th>\
441 + <th>Wepkeys</th>\
442 + </tr>"
443 + let sql = "SELECT * FROM wifi"
444 + db.all(sql, [], (err, rows) => {
445 + if (err) {
446 + log.err(err);
447 + throw err;
448 + }
449 +
450 + rows.forEach((row) => {
451 + html += `<tr>
452 + <td>${row.id}</td>
453 + <td>${row.ssid}</td>
454 + <td>${row.bssid}</td>
455 + <td>${row.wepkeys}</td>
456 + </tr>`;
457 + });
458 + document.querySelector('#table > tbody').innerHTML = html;
459 + db.close();
460 + log.info("Query succesfully executed");
461 + });
462 +}
463 +
464 +function getAppUsageRows(){
465 + const db = new sqlite3.Database('InnerDatabase.db');
466 + var html = "<tr><th>packagename</th>\
467 + <th>firsttimestamp</th>\
468 + <th>lasttimestamp</th>\
469 + <th>lasttimeused</th>\
470 + <th>totaltimeforeground</th>\
471 + </tr>"
472 + let sql = `select * from AppUsageDay
473 + union
474 + select * from AppUsageMonth
475 + union
476 + select * from AppUsageWeek
477 + union
478 + select * from AppUsageYear;`
479 + db.all(sql, [], (err, rows) => {
480 + if (err) {
481 + log.err(err);
482 + throw err;
483 + }
484 + const offset = new Date().getTimezoneOffset() * 60000;
485 + rows.forEach((row) => {
486 + html += `<tr>
487 + <td>${row.packagename}</td>
488 + <td>${row.firsttimestamp}</td>
489 + <td>${row.lasttimestamp}</td>
490 + <td>${row.lasttimeused}</td>
491 + <td>${row.totaltimeforeground}</td>
492 + </tr>`
493 + });
494 + db.close();
495 + document.querySelector('#table > tbody').innerHTML = html;
496 + log.info("Query succesfully executed");
497 + });
498 +}
499 +
500 +var getphoneinfo = function getPhoneinfo(){
501 + return new Promise(function(resolve, reject){
502 + setTimeout( function(){
503 + // var html = `<tr><th>Phone type</th><th>Software Number</th><th>Phone number</th>
504 + // <th>Subscribe id</th><th>Adid</th><th>Call state</th>
505 + // <th>Data state</th><th>Network type</th><th>Etwork countryis</th>
506 + // <th>Simcountryiso</th><th>Network operator</th><th>Sim operator</th>
507 + // <th>Network operator name</th><th>Sim operator name</th><th>Sim serial number</th>
508 + // <th>Simstate</th><th>Is networking Roming</th>
509 + // </tr>`;
510 + var html = `<tr><th>Phone type</th><th>Software Number</th><th>Phone number</th></tr>`;
511 + const db = new sqlite3.Database('InnerDatabase.db');
512 + let sql = "SELECT * FROM android_metadata";
513 + db.get(sql, [], (err, row) => {
514 + if (err) {
515 + log.err(err);
516 + throw err;
517 + }
518 + html += `<tr><td>${row.phonetype}</td><td>${row.softwarenumber}</td><td>${row.phonenumber}</td></tr>`
519 +
520 + html += `<tr><th>Subscribe id</th><th>Adid</th><th>Call state</th></tr>`
521 + html += `<tr><td>${row.subscriberid}</td><td>${row.adid}</td><td>${row.callstate}</td></tr>`
522 +
523 + html += `<tr><th>Data state</th><th>Network type</th><th>Etwork countryis</th></tr>`
524 + html += `<tr><td>${row.datastate}</td><td>${row.networktype}</td><td>${row.networkcountryiso}</td></tr>`
525 +
526 + html += `<tr><th>Simcountryiso</th><th>Network operator</th><th>Sim operator</th></tr>`
527 + html += `<tr><td>${row.simcountryiso}</td><td>${row.networkoperater}</td><td>${row.simoperator}</td></tr>`
528 +
529 + html += `<tr><th>Network operator name</th><th>Sim operator name</th><th>Sim serial number</th></tr>`
530 + html += `<tr><td>${row.networkoperatorname}</td><td>${row.simoperatorname}</td><td>${row.simserialnumber}</td></tr>`
531 +
532 + html += `<tr><th>Simstate</th><th>Is networking Roming</th></tr>`
533 + html += `<tr><td>${row.simstate}</td><td>${row.isnetworkroming}</td></tr>`
534 +
535 + db.close();
536 + resolve(html);
537 + });
538 + }, 1000)
539 + })
540 +}
541 +
542 +var getaccountinfo = function getAccountinfo(){
543 + return new Promise(function(resolve, reject){
544 + setTimeout( function(){
545 + var html = `<tr><th>Account name</th><th>Accounttype</th></tr>`;
546 + const db = new sqlite3.Database('InnerDatabase.db');
547 + let sql = "SELECT * FROM accountinfo";
548 + db.all(sql, [], (err, rows) => {
549 + if (err) {
550 + log.err(err);
551 + throw err;
552 + }
553 + rows.forEach((row) => {
554 + html += `<tr><td>${row.accountname}</td><td>${row.accounttype}</td></tr>`
555 + });
556 + db.close();
557 + resolve(html);
558 + });
559 + }, 1000)
560 + })
561 +}
562 +
563 +var getandroidmetadata = function getAM(){
564 + return new Promise(function(resolve, reject){
565 + setTimeout( function(){
566 + var html = `<tr><th>locale</th></tr>`;
567 + const db = new sqlite3.Database('networkDatabase.db');
568 + let sql = "SELECT * FROM android_metadata";
569 + db.get(sql, [], (err, row) => {
570 + if (err) {
571 + log.err(err);
572 + throw err;
573 + }
574 + html += `<tr><td>${row.locale}</td></tr>`
575 + db.close();
576 + resolve(html);
577 + });
578 + }, 1000)
579 + })
580 +}
581 +
582 +var getinetAddress = function getIA(){
583 + return new Promise(function(resolve, reject){
584 + setTimeout( function(){
585 + var html = `<tr><th>net_id</th><th>host_address</th></tr>`;
586 + const db = new sqlite3.Database('networkDatabase.db');
587 + let sql = "SELECT * FROM inetAddress";
588 + db.all(sql, [], (err, rows) => {
589 + if (err) {
590 + log.err(err);
591 + throw err;
592 + }
593 + rows.forEach((row) => {
594 + html += `<tr><td>${row.net_id}</td><td>${row.host_address}</td></tr>`
595 + });
596 + db.close();
597 + resolve(html);
598 + });
599 + }, 1000)
600 + })
601 +}
602 +
603 +var getlinkAddress = function getLA(){
604 + return new Promise(function(resolve, reject){
605 + setTimeout( function(){
606 + var html = `<tr><th>net_id</th><th>host_address</th><th>prefix_length</th></tr>`;
607 + const db = new sqlite3.Database('networkDatabase.db');
608 + let sql = "SELECT * FROM linkAddress";
609 + db.all(sql, [], (err, rows) => {
610 + if (err) {
611 + log.err(err);
612 + throw err;
613 + }
614 + rows.forEach((row) => {
615 + html += `<tr><td>${row.net_id}</td><td>${row.host_address}</td><td>${row.prefix_length}</td></tr>`
616 + });
617 + db.close();
618 + resolve(html);
619 + });
620 + }, 1000)
621 + })
622 +}
623 +
624 +var getnetworkInfo = function getNI(){
625 + return new Promise(function(resolve, reject){
626 + setTimeout( function(){
627 + var html = `<tr><th>net_id</th><th>domain</th><th>interface_name</th></tr>`;
628 + const db = new sqlite3.Database('networkDatabase.db');
629 + let sql = "SELECT * FROM network_info";
630 + db.all(sql, [], (err, rows) => {
631 + if (err) {
632 + log.err(err);
633 + throw err;
634 + }
635 + rows.forEach((row) => {
636 + html += `<tr><td>${row.net_id}</td><td>${row.domain}</td><td>${row.interface_name}</td></tr>`
637 + });
638 + db.close();
639 + resolve(html);
640 + });
641 + }, 1000)
642 + })
643 +}
644 +
645 +var getrouteInfo = function getRI(){
646 + return new Promise(function(resolve, reject){
647 + setTimeout( function(){
648 + var html = `<tr><th>net_id</th><th>destination</th><th>d_prefix</th><th>gateway</th><th>interface_name</th></tr>`;
649 + const db = new sqlite3.Database('networkDatabase.db');
650 + let sql = "SELECT * FROM routeinfo";
651 + db.all(sql, [], (err, rows) => {
652 + if (err) {
653 + log.err(err);
654 + throw err;
655 + }
656 + rows.forEach((row) => {
657 + html += `<tr><td>${row.net_id}</td><td>${row.destination}</td><td>${row.d_prefix}</td><td>${row.gateway}</td><td>${row.interface_name}</td></tr>`
658 + });
659 + db.close();
660 + resolve(html);
661 + });
662 + }, 1000)
663 + })
664 +}
...\ No newline at end of file ...\ No newline at end of file
...@@ -32,16 +32,16 @@ connect_btn.addEventListener("click", () => { ...@@ -32,16 +32,16 @@ connect_btn.addEventListener("click", () => {
32 /* 32 /*
33 var connection = mysql.createConnection({ 33 var connection = mysql.createConnection({
34 host:'localhost', 34 host:'localhost',
35 - user:'root', 35 + user: 'root',
36 - password:'1234' 36 + password: '1234'
37 }); 37 });
38 38
39 connection.connect(); 39 connection.connect();
40 */ 40 */
41 41
42 var mysql = { 42 var mysql = {
43 - user : 'root', 43 + user: 'root',
44 - password : '1234' 44 + password: '1234'
45 }; 45 };
46 46
47 function apkInstall(){ 47 function apkInstall(){
...@@ -77,6 +77,82 @@ function convertToMysql(){ ...@@ -77,6 +77,82 @@ function convertToMysql(){
77 }) 77 })
78 } 78 }
79 79
80 +// function extractDB () {
81 +// cmd_backup = exec('adb -s '+device+' backup com.example.dataextraction -f backup.dataextraction.ad', function(error, stdout, stderr){
82 +// cc.innerHTML="backup app";
83 +// setTimeout(function(){
84 +// cmd_unpack = exec('java -jar abe.jar unpack backup.dataextraction.ad dataextraction.tar',function(error, stdout, stderr){
85 +// cc.innerHTML="unpack backup";
86 +// cmd_unzip = exec('tar xvf dataextraction.tar', function(error, stdout, stderr){
87 +// cc.innerHTML="unzip tar";
88 +// cmd_moveIdb = fs.rename('apps/com.example.dataextraction/db/InnerDatabase.db', 'InnerDatabase.db', function(){
89 +// cc.innerHTML="move InnerDB File";
90 +// cmd_moveNdb = fs.rename('apps/com.example.dataextraction/db/networkDatabase.db', 'networkDatabase.db',function(){
91 +// cc.innerHTML="move NetworkDB File";
92 +// cmd_sqlIdb = exec('sqlite3 InnerDatabase.db .dump | python SQLiteToMysql.py > InnerDatabase.sql',function(error, stdout, stderr){
93 +// cc.innerHTML="make InnerDB SQL";
94 +// cmd_sqlNdb = exec('sqlite3 networkDatabase.db .dump | python SQLiteToMysql_network.py > networkDatabase.sql', function(error, stdout, stderr){
95 +// cc.innerHTML="make NetworkDB SQL";
96 +// cmd_makeIdb = exec('mysql -u'+mysql.user+' -p'+mysql.password+' -e "DROP DATABASE IF EXISTS DATAEXTRACTION;CREATE DATABASE DATAEXTRACTION CHARACTER SET utf8 COLLATE utf8_unicode_ci;USE DATAEXTRACTION;"',function(error, stdout, stderr){
97 +// cc.innerHTML="create InnerDB";
98 +// cmd_insertIdb = exec('mysql -u'+mysql.user+' -p'+mysql.password+' DATAEXTRACTION < InnerDatabase.sql',function(error, stdout, stderr){
99 +// cc.innerHTML="insert Data ; InnerDB";
100 +// cmd_makeNdb = exec('mysql -u'+mysql.user+' -p'+mysql.password+' -e "DROP DATABASE IF EXISTS DATAEXTRACTION_network;CREATE DATABASE DATAEXTRACTION_network;USE DATAEXTRACTION_network;"',function(error, stdout, stderr){
101 +// cc.innerHTML="create NetworkDB";
102 +// cmd_insertNdb = exec('mysql -u'+mysql.user+' -p'+mysql.password+' DATAEXTRACTION_network < networkDatabase.sql',function(error, stdout, stderr){
103 +// cc.innerHTML="insert Data ; NetworkDB";
104 +// cc.innerHTML="Data Extraction Complete !";
105 +// cc.innerHTML="Click 'NEXT' Button";
106 +// })
107 +// })
108 +// })
109 +// })
110 +// })
111 +// })
112 +// })
113 +// })
114 +// })
115 +// })
116 +// },7000);
117 +// });
118 +// //cmd_backup();
119 +// }
120 +
121 +// //db insert done
122 +// io.on('connection', function(socket){
123 +// var instanceId = socket.id;
124 +
125 +// socket.on('alert', function(data){
126 +// cc.innerHTML = data.comment+" db created";
127 +// })
128 +// socket.on('end', function(data){
129 +// cc.innerHTML="all databases created !";
130 +// extractDB();
131 +// })
132 +// })
133 +
134 +function convertToMysql(){
135 + cmd_sqlIdb = exec('sqlite3 InnerDatabase.db .dump | python SQLiteToMysql.py > InnerDatabase.sql',function(error, stdout, stderr){
136 + cc.innerHTML="make InnerDB SQL";
137 + cmd_sqlNdb = exec('sqlite3 networkDatabase.db .dump | python SQLiteToMysql_network.py > networkDatabase.sql', function(error, stdout, stderr){
138 + cc.innerHTML="make NetworkDB SQL";
139 + cmd_makeIdb = exec('mysql -u'+mysql.user+' -p'+mysql.password+' -e "DROP DATABASE IF EXISTS DATAEXTRACTION;CREATE DATABASE DATAEXTRACTION CHARACTER SET utf8 COLLATE utf8_unicode_ci;USE DATAEXTRACTION;"',function(error, stdout, stderr){
140 + cc.innerHTML="create InnerDB";
141 + cmd_insertIdb = exec('mysql -u'+mysql.user+' -p'+mysql.password+' DATAEXTRACTION < InnerDatabase.sql',function(error, stdout, stderr){
142 + cc.innerHTML="insert Data ; InnerDB";
143 + cmd_makeNdb = exec('mysql -u'+mysql.user+' -p'+mysql.password+' -e "DROP DATABASE IF EXISTS DATAEXTRACTION_network;CREATE DATABASE DATAEXTRACTION_network;USE DATAEXTRACTION_network;"',function(error, stdout, stderr){
144 + cc.innerHTML="create NetworkDB";
145 + cmd_insertNdb = exec('mysql -u'+mysql.user+' -p'+mysql.password+' DATAEXTRACTION_network < networkDatabase.sql',function(error, stdout, stderr){
146 + cc.innerHTML="insert Data ; NetworkDB";
147 + cc.innerHTML="Data Extraction Complete !";
148 + cc.innerHTML="Click 'NEXT' Button";
149 + })
150 + })
151 + })
152 + })
153 + })
154 + })
155 +}
80 function extractDB () { 156 function extractDB () {
81 cmd_backup = exec('adb -s '+device+' backup com.example.dataextraction -f backup.dataextraction.ad', function(error, stdout, stderr){ 157 cmd_backup = exec('adb -s '+device+' backup com.example.dataextraction -f backup.dataextraction.ad', function(error, stdout, stderr){
82 cc.innerHTML="backup app"; 158 cc.innerHTML="backup app";
...@@ -119,5 +195,7 @@ ipcRenderer.on("device", (e, arg) => { ...@@ -119,5 +195,7 @@ ipcRenderer.on("device", (e, arg) => {
119 //device.innerHTML = arg.toString(); 195 //device.innerHTML = arg.toString();
120 196
121 cc.innerHTML="DATA EXTRACTION START !"; 197 cc.innerHTML="DATA EXTRACTION START !";
122 - apkInstall(); 198 + // apkInstall();
199 + extractDB();
200 +
123 }); 201 });
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
18 <button id="btn" class="menu_alldata_nwide" onclick="menu_all();">All Data 18 <button id="btn" class="menu_alldata_nwide" onclick="menu_all();">All Data
19 <div id="menu_alldata_wide" style="display:none"> 19 <div id="menu_alldata_wide" style="display:none">
20 <br> 20 <br>
21 - <h2 onclick="location.href='menu0.html'">전체 데이터 보기</h2> 21 + <h2 onclick="location.href='alldata_menu.html'">전체 데이터 보기</h2>
22 <svg class="bi bi-arrow-right-circle" width="0.3em" height="0.3em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg" style="color:#4e73df" onclick="location.href='menu0.html'"> 22 <svg class="bi bi-arrow-right-circle" width="0.3em" height="0.3em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg" style="color:#4e73df" onclick="location.href='menu0.html'">
23 <path fill-rule="evenodd" d="M8 15A7 7 0 1 0 8 1a7 7 0 0 0 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z"/> 23 <path fill-rule="evenodd" d="M8 15A7 7 0 1 0 8 1a7 7 0 0 0 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z"/>
24 <path fill-rule="evenodd" d="M7.646 11.354a.5.5 0 0 1 0-.708L10.293 8 7.646 5.354a.5.5 0 1 1 .708-.708l3 3a.5.5 0 0 1 0 .708l-3 3a.5.5 0 0 1-.708 0z"/> 24 <path fill-rule="evenodd" d="M7.646 11.354a.5.5 0 0 1 0-.708L10.293 8 7.646 5.354a.5.5 0 1 1 .708-.708l3 3a.5.5 0 0 1 0 .708l-3 3a.5.5 0 0 1-.708 0z"/>
...@@ -72,7 +72,7 @@ ...@@ -72,7 +72,7 @@
72 <div id ="menu" class="menu_up"> 72 <div id ="menu" class="menu_up">
73 <div id="btn_group"> 73 <div id="btn_group">
74 <button id="btn" class="menu_analysis_menu3_nwide" onclick="menu_analysis_menu3();">Apps 74 <button id="btn" class="menu_analysis_menu3_nwide" onclick="menu_analysis_menu3();">Apps
75 - <div id="menu_analysis_menu3_wide" style="display:none" onclick="location.href='menu3.html'"> 75 + <div id="menu_analysis_menu3_wide" style="display:none" onclick="location.href='menu_apps.html'">
76 <h4>어플리케이션 사용 분석</h4> 76 <h4>어플리케이션 사용 분석</h4>
77 <div id="wide_location"> 77 <div id="wide_location">
78 <h2>어플 사용 분석</h2> 78 <h2>어플 사용 분석</h2>
...@@ -89,7 +89,7 @@ ...@@ -89,7 +89,7 @@
89 <div id ="menu"> 89 <div id ="menu">
90 <div id="btn_group"> 90 <div id="btn_group">
91 <button id="btn" class="menu_analysis_menu4_nwide" onclick="menu_analysis_menu4();">Media 91 <button id="btn" class="menu_analysis_menu4_nwide" onclick="menu_analysis_menu4();">Media
92 - <div id="menu_analysis_menu4_wide" style="display:none" onclick="location.href='menu4.html'"> 92 + <div id="menu_analysis_menu4_wide" style="display:none" onclick="location.href='menu_media.html'">
93 <h4>미디어 파일 저장공간 분석<br>비디오 분석</h4> 93 <h4>미디어 파일 저장공간 분석<br>비디오 분석</h4>
94 <div id="wide_location"> 94 <div id="wide_location">
95 <h2>미디어 분석</h2> 95 <h2>미디어 분석</h2>
......
1 +<!DOCTYPE html>
2 +<html lang="en">
3 +<head>
4 + <meta charset="UTF-8">
5 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 + <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
7 + <script src="https://cdn.jsdelivr.net/npm/chart.js@2.8.0"></script>
8 + <link rel="stylesheet" href="../assets/css/menu_apps.css">
9 + <title>Document</title>
10 +</head>
11 +<body>
12 +<div class="container">
13 + <header class="menu-header py-4">
14 + <div class="row d-flex justify-content-start flex-nowrap align-items-end">
15 + <div class="col">
16 + <a class="title-name text-dark">Apps</a>
17 + </div>
18 + <div div class="col-9">
19 + <a class="title-detail">앱 사용 정보 분석</a>
20 + </div>
21 + <div div class="col">
22 + <a class="title-back" href="menu.html" id="menu-info">뒤로가기</a>
23 + </div>
24 + </div>
25 + </header>
26 + <div class="nav-scroller nav-color py-1 mb-2">
27 + <nav class="nav d-flex justify-content-around">
28 + <a class="p-2" href="#" style="color: whitesmoke" onclick="openTap('App-List');">App List</a>
29 + <a class="p-2" href="#" style="color: whitesmoke" onclick="openTap('Deleted-App');">Deleted App</a>
30 + <a class="p-2" href="#" style="color: whitesmoke" onclick="openTap('Recent-Usage');">Recent Usage</a>
31 + </nav>
32 + </div>
33 + <div class="container">
34 + <div id="App-List" class="menu">
35 + <div class="row">
36 + <div class="col">
37 + <div class="my-3 p-3 bg-white rounded shadow-sm">
38 + <h6 class="border-bottom border-gray pb-2 mb-0 font-nanum">App List</h6>
39 + <div class="row sort justify-content-end">
40 + <a id="wifiusage" class="sort p-2 text-muted" href="#" onclick="getAppInfoList('wifiusage');">wifi 사용량순</a>
41 + <a id="cellularusage" class="sort p-2 text-muted" href="#" onclick="getAppInfoList('cellularusage');">cellular 사용량순</a>
42 + <a id="totaltime" class="sort p-2 text-muted" href="#" onclick="getAppInfoList('totaltime');" style="font-weight: bold;">실행 시간순</a>
43 + </div>
44 + <div id="applist">
45 +
46 + </div>
47 + </div>
48 + </div>
49 + <div class="col">
50 + <div class="my-3 p-3 bg-white rounded shadow-sm">
51 + <a id="appdetail_title" class="border-bottom border-gray pb-2 mb-0 font-nanum">App Detail</a>
52 + <div id="appdetails" class="detail_app font-nanum pt-2 pb-5">
53 + <h8 class="pt-3 pb-3 mb-0 font-italic">세부사항을 확인하려면 follow를 클릭하세요</h8>
54 + </div>
55 + <div id="pieChartdiv" class="pb-5">
56 + <canvas id="pieChart" style="max-width: 500px;"></canvas>
57 + </div>
58 + <div id="barchart_title" style="display: none;">
59 + <a class="pb-2 mb-0 font-nanum border-bottom border-gray">사용 시간대</a>
60 + </div>
61 + <div id="barChartdiv" class="pb-5">
62 + <canvas id="barChart"></canvas>
63 + </div>
64 + <div id = "apptimelist" class="font-nanum">
65 + </div>
66 + </div>
67 + </div>
68 + </div>
69 + </div>
70 +
71 +
72 + <div id="Deleted-App" class="menu" style="display:none">
73 + <div class="row">
74 + <div class="col">
75 + <div id="deletedapps" class="my-3 p-3 bg-white rounded shadow-sm">
76 + <h6 class="border-bottom border-gray pb-2 mb-0">Deleted Apps</h6>
77 + <div class="overflow-auto">
78 + <div id="deletedapplist" class="font-nanum">
79 +
80 + </div>
81 + </div>
82 + </div>
83 + </div>
84 + </div>
85 + </div>
86 +
87 +
88 + <div id="Recent-Usage" class="menu" style="display:none">
89 + <h6 class="border-bottom border-gray pb-2 mb-0">최근 10일 사용 분석</h6>
90 + <div class="row">
91 + <div class="col">
92 + <div id="day10analysis" class="my-3 p-3 bg-white rounded shadow-sm">
93 + <div id="pieCharttop10">
94 + <a class="border-bottom border-gray pb-2 mb-0 font-nanum">사용 시간 비율</a>
95 + <canvas id="pieChart10" width="350" height="350"></canvas>
96 + </div>
97 + </div>
98 + </div>
99 + <div class="col">
100 + <div id="top10list" class="my-3 p-3 bg-white rounded shadow-sm">
101 +
102 + </div>
103 + </div>
104 + </div>
105 + <div class="row">
106 + <div class="col">
107 + <div class="my-3 p-3 bg-white rounded shadow-sm">
108 + <a class="border-bottom border-gray pb-2 mb-0 font-nanum">일별 사용량</a>
109 + <canvas id="recent_bar" width="400" height="400"></canvas>
110 + </div>
111 + </div>
112 + <div class="col">
113 + <div class="my-3 p-3 bg-white rounded shadow-sm">
114 + <a class="border-bottom border-gray pb-2 mb-0 font-nanum">사용 어플</a>
115 + <div id="selectday"class="row sort justify-content-end">
116 +
117 + </div>
118 + <table id="day_use_list" class="font-nanum" style="font-size: 10;">
119 + <tbody>
120 +
121 + </tbody>
122 + </table>
123 + </div>
124 + </div>
125 + </div>
126 + </div>
127 + </div>
128 + </div>
129 +</div>
130 + <script src="menu_apps.js"></script>
131 + <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
132 + <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
133 + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
134 +</body>
135 +</html>
...\ No newline at end of file ...\ No newline at end of file
1 +const log = require('electron-log')
2 +const sqlite3 = require('sqlite3').verbose();
3 +const offset = new Date().getTimezoneOffset() * 60000;
4 +var mychart = null;
5 +function el(selector) {
6 + return document.getElementById(selector);
7 +}
8 +function cl(selector) {
9 + return document.getElementsByClassName(selector);
10 +}
11 +
12 +// window.onload=function(){
13 +// getAppInfoList();
14 +// getDeletedAppList();
15 +// }
16 +document.addEventListener("DOMContentLoaded", function(){
17 + getAppInfoList('totaltime');
18 + getDeletedAppList();
19 + getRecentUsage();
20 + });
21 +
22 +function openTap(tabName) {
23 + var i;
24 + var x = document.getElementsByClassName("menu");
25 + for (i = 0; i < x.length; i++) {
26 + x[i].style.display = "none"
27 + }
28 + document.getElementById(tabName).style.display = "block";
29 +}
30 +
31 +function testClick(tabName) {
32 + log.info("testclick")
33 +}
34 +
35 +
36 +function getAppInfoList(sort_column){
37 + const db = new sqlite3.Database('InnerDatabase.db');
38 + var html = ''
39 + let sql = `select Appinfo.name, Appinfo.packagename, Appinfo.wifiusage, Appinfo.cellularusage, sum(AppUsageYear.totaltimeforeground) totaltime from AppInfo, AppUsageYear\
40 + where Appinfo.packagename = AppUsageYear.packagename\
41 + GROUP BY AppUsageYear.packagename\
42 + ORDER BY ${sort_column} desc;`
43 + log.info("Query start");
44 + db.all(sql, [], (err, rows) => {
45 + if (err) {
46 + log.err(err);
47 + throw err;
48 + }
49 + const offset = new Date().getTimezoneOffset() * 60000;
50 + var wifi;
51 + var cell;
52 + var totaltime;
53 + rows.forEach((row) => {
54 + if(row.wifiusage){
55 + wifi = (row.wifiusage/1073741824).toFixed(2) + "GB";
56 + }
57 + else if(row.wifiusage > 1048576){
58 + wifi = (row.wifiusage/1048576).toFixed(2) + "MB";
59 + }
60 + else if(row.wifiusage > 1024){
61 + wifi = (row.wifiusage/1024).toFixed(2) + "KB";
62 + }
63 +
64 + if(row.cellularusage> 1073741824){
65 + cell = (row.cellularusage/1073741824).toFixed(2) + "GB";
66 + }
67 + else if(row.cellularusage > 1048576){
68 + cell = (row.cellularusage/1048576).toFixed(2) + "MB";
69 + }
70 + else if(row.cellularusage > 1024){
71 + cell = (row.cellularusage/1024).toFixed(2) + "KB";
72 + }
73 +
74 + if(row.totaltime> 3600000){
75 + totaltime = (row.totaltime/3600000).toFixed(2) + "Hour";
76 + }
77 + else if(row.totaltime > 60000){
78 + totaltime = (row.totaltime/60000).toFixed(2) + "Minute";
79 + }
80 + else if(row.totaltime > 1000){
81 + totaltime = (row.totaltime/1000).toFixed(2) + "Seconds";
82 + }
83 +
84 + html += `<div class="media pt-3 font-nanum rounded" onclick="getAppDetail('${row.packagename}');">
85 + <p class="media-body pb-3 mb-0 small lh-125 border-bottom border-gray">
86 + <a class="d-block font-weight-bolder">${row.name}</a>
87 + <a class="d-block">${row.packagename}</a>
88 + <a class="font-weight-bold">wifi usage</a>
89 + <a>${wifi}</a><br>
90 + <a class="font-weight-bold">cellular usage</a>
91 + <a>${cell}</a><br>
92 + <a>total time in foreground</a>
93 + <a>${totaltime}</a><br>
94 + </p>
95 + </div>`
96 + });
97 + document.querySelector('#applist').innerHTML = html;
98 + log.info("Query succesfully executed");
99 + });
100 + var i;
101 + var x = document.getElementsByClassName("sort");
102 + for (i = 0; i < x.length; i++) {
103 + x[i].style.fontWeight = "normal";
104 + }
105 + document.getElementById(sort_column).style.fontWeight = "bold";
106 +
107 + db.close();
108 + }
109 +
110 +function getDeletedAppList(){
111 + const db = new sqlite3.Database('InnerDatabase.db');
112 + var html = ''
113 + let sql = `SELECT AppUsageYear.lasttimeused, AppUsageYear.packagename, SUM(AppUsageYear.totaltimeforeground) as totaltime FROM AppUsageYear
114 + WHERE AppUsageYear.packagename NOT in (select Appinfo.packagename from AppInfo)
115 + GROUP BY AppUsageYear.packagename
116 + ORDER BY totaltime desc;`
117 + log.info("Query start");
118 + db.all(sql, [], (err, rows) => {
119 + if (err) {
120 + log.err(err);
121 + throw err;
122 + }
123 + rows.forEach((row) => {
124 + var totaltime;
125 + if(row.totaltime> 3600000){
126 + totaltime = (row.totaltime/3600000).toFixed(2) + "Hour";
127 + }
128 + else if(row.totaltime > 60000){
129 + totaltime = (row.totaltime/60000).toFixed(2) + "Minute";
130 + }
131 + else if(row.totaltime > 1000){
132 + totaltime = (row.totaltime/1000).toFixed(2) + "Seconds";
133 + }
134 + html += `<div class="media pt-3">
135 + <p class="media-body pb-3 mb-0 small lh-125 border-bottom border-gray">
136 + <strong class="d-block">${row.packagename}</strong>
137 + <a class="font-weight-bold">총 사용 시간</a>
138 + <a>${totaltime}</a><br>
139 + <a class="font-weight-bold">마지막 사용 시간</a>
140 + <a>${new Date(row.lasttimeused-offset).toISOString().replace(/T/, ' ').replace(/\..+/, '')}</a><br>
141 + <a href="https://play.google.com/store/apps/details?id=${row.packagename}" onclick="window.open(this.href); return false">Follow</a>
142 + </p>
143 + </div>
144 + `
145 + });
146 + document.querySelector('#deletedapplist').innerHTML = html;
147 + log.info("Query succesfully executed");
148 + });
149 + db.close();
150 + }
151 +
152 +function getRecentUsage(){
153 + Promise.all([draw_recent_piechart(),listtop10(),get_recent_dataset()]).then(function(value){
154 + log.info("getRecentUsage finished")
155 + });
156 +}
157 +
158 +function getAppDetail(packagename){
159 + Promise.all([drawpiechart(packagename),drawbarchart(packagename)]).then(function(value){
160 + log.info("getAppDetail finished")
161 + });
162 +}
163 +//Recent Usage 차트그리기
164 +var draw_recent_piechart = function drawRecentPieChart(){
165 + return new Promise(function(resolve, reject){
166 + setTimeout( function(){
167 + log.info("pie10 draw start");
168 + Promise.all([top10_day(),totaltimeday()]).then(function(value){
169 + log.info("pie10 draw start");
170 + var recent_labels = [];
171 + var recent_datasets = [];
172 + var except = 0;
173 + value[0].forEach((row) => {
174 + recent_labels.push(row.name);
175 + recent_datasets.push(row.totaltime);
176 + except += row.totaltime;
177 + });
178 + recent_labels.push("그 외");
179 + recent_datasets.push(value[1]-except);
180 + var ctxP = document.getElementById("pieChart10").getContext('2d');
181 + var myPieChart10 = new Chart(ctxP, {
182 + type: 'pie',
183 + data: {
184 + labels: recent_labels,
185 + datasets: [{
186 + data: recent_datasets,
187 + backgroundColor: ["#F7464A", "#46BFBD", "#FDB45C", "#9B59B6", "#2471A3", "#3498DB", "#F39C12","#16A085","#E91E63","#949FB1", "#4D5360"],
188 + hoverBackgroundColor: ["#FF5A5E", "#5AD3D1", "#FFC870", "#AF7AC5 ", "#2980B9","#5DADE2", "#F5B041","#45B39D","#EC407A","#A8B3C5", "#616774"]
189 + }]
190 + },
191 + options: {
192 + responsive: false
193 + }
194 + });
195 + log.info("pie10 chart draw draw draw")
196 + });
197 + resolve(true);
198 + }, 1000)
199 + })
200 +}
201 +
202 +var listtop10 = function listTop10(){
203 + return new Promise(function(resolve, reject){
204 + setTimeout( function(){
205 + log.info("listtop10 draw start");
206 + Promise.all([top10_day()]).then(function(value){
207 + log.info("listtop10 draw start");
208 + var html = `<a class="border-bottom border-gray pb-2 mb-0 font-nanum">사용 시간 Top10</a><br>`;
209 + var index = 1;
210 + value[0].forEach((row) => {
211 + html += `<div class="pl-1 pt-1"><a class="pb-1" style="font-size: 15px">${index}. ${row.name}</a><br></div>`;
212 + index++;
213 + });
214 + document.querySelector('#top10list').innerHTML = html;
215 + log.info("listtop10 chart draw draw draw")
216 + });
217 + resolve(true);
218 + }, 1000)
219 + })
220 +}
221 +
222 +//AppList 차트그리기
223 +var drawpiechart = function drawPieChart(packagename){
224 + return new Promise(function(resolve, reject){
225 + setTimeout( function(){
226 + var html = ''
227 + Promise.all([alltime(),totaltime(packagename),packagedetail(packagename),usedtime(packagename)]).then(function(value){
228 + document.querySelector('#pieChartdiv').innerHTML = '<a class="border-bottom border-gray pb-2 mb-0" style="font-family: \'나눔바른고딕\'">사용 시간 비율</a><canvas id="pieChart" style="max-width: 500px;"></canvas>'
229 + var wifi;
230 + var cell;
231 + var totaltime;
232 + document.querySelector('#appdetail_title').innerHTML = value[2].name;
233 + if(value[2].wifiusage){
234 + wifi = (value[2].wifiusage/1073741824).toFixed(2) + "GB";
235 + }
236 + else if(value[2].wifiusage > 1048576){
237 + wifi = (value[2].wifiusage/1048576).toFixed(2) + "MB";
238 + }
239 + else if(value[2].wifiusage > 1024){
240 + wifi = (value[2].wifiusage/1024).toFixed(2) + "KB";
241 + }
242 +
243 + if(value[2].cellularusage > 1073741824){
244 + cell = (value[2].cellularusage/1073741824).toFixed(2) + "GB";
245 + }
246 + else if(value[2].cellularusage > 1048576){
247 + cell = (value[2].cellularusage/1048576).toFixed(2) + "MB";
248 + }
249 + else if(value[2].cellularusage > 1024){
250 + cell = (value[2].cellularusage/1024).toFixed(2) + "KB";
251 + }
252 +
253 + if(value[2].totaltime> 3600000){
254 + totaltime = (value[2].totaltime/3600000).toFixed(2) + "Hour";
255 + }
256 + else if(value[2].totaltime > 60000){
257 + totaltime = (value[2].totaltime/60000).toFixed(2) + "Minute";
258 + }
259 + else if(row.totaltime > 1000){
260 + totaltime = (value[2].totaltime/1000).toFixed(2) + "Seconds";
261 + }
262 + html += `
263 + <a class="d-block text-muted" style="font-size: 13px; float: right">${value[2].packagename}</a>
264 + <a class="d-block text-muted" style="font-size: 13px">${value[2].version} ver</a>
265 + <a class="font-weight-bold" style="font-size: 13px">First Install</a>
266 + <a style="font-size: 13px">${new Date(value[2].firstinstall-offset).toISOString().replace(/T/, ' ').replace(/\..+/, '')}</a><br>
267 + <a class="font-weight-bold" style="font-size: 13px">Last Update</a>
268 + <a style="font-size: 13px">${new Date(value[2].lastupdate-offset).toISOString().replace(/T/, ' ').replace(/\..+/, '')}</a><br>
269 + <a class="font-weight-bold" style="font-size: 13px">Wifi Usage</a>
270 + <a style="font-size: 13px">${wifi}</a><br>
271 + <a class="font-weight-bold" style="font-size: 13px">Cellular Usage</a>
272 + <a style="font-size: 13px">${cell}</a><br>
273 + <a class="font-weight-bold" style="font-size: 13px">Total Time in Foreground</a>
274 + <a style="font-size: 13px">${totaltime}</a><br>`
275 + document.querySelector('#appdetails').innerHTML = html;
276 + var ctxP = document.getElementById("pieChart").getContext('2d');
277 + var myPieChart = new Chart(ctxP, {
278 + type: 'pie',
279 + data: {
280 + labels: [value[2].name,"그외 어플"],
281 + datasets: [{
282 + data: [value[1], value[0]-value[1]],
283 + backgroundColor: ["#F7464A","#949FB1"],
284 + hoverBackgroundColor: ["#FF5A5E","#A8B3C5"]
285 + }]
286 + },
287 + options: {
288 + responsive: true
289 + }
290 + });
291 + log.info("pie chart draw draw draw")
292 + });
293 + resolve(true);
294 + }, 1000)
295 + })
296 +}
297 +
298 +var drawbarchart = function drawBarChart(packagename){
299 + return new Promise(function(resolve, reject){
300 + setTimeout( function(){
301 + var timedataset = [0,0,0,0,0,0,0,0,0,0,0,0];
302 + var html1 = '<a class="pb-2 mb-0 font-nanum border-bottom border-gray">기간별 마지막 사용시간 리스트</a><br>';
303 + Promise.all([usedtime(packagename)]).then(function(value){
304 + log.info("bar chart draw draw draw")
305 + value[0].forEach((time) => {
306 + var hour = new Date(time-offset).getHours()
307 + switch(true){
308 + case (hour < 2) :
309 + timedataset[0] += 1;
310 + break;
311 + case (hour < 4) :
312 + timedataset[1] += 1;
313 + break;
314 + case (hour < 6) :
315 + timedataset[2] += 1;
316 + break;
317 + case (hour < 8) :
318 + timedataset[3] += 1;
319 + break;
320 + case (hour < 10) :
321 + timedataset[4] += 1;
322 + break;
323 + case (hour < 12) :
324 + timedataset[5] += 1;
325 + break;
326 + case (hour < 14) :
327 + timedataset[6] += 1;
328 + break;
329 + case (hour < 16) :
330 + timedataset[7] += 1;
331 + break;
332 + case (hour < 18) :
333 + timedataset[8] += 1;
334 + break;
335 + case (hour < 20) :
336 + timedataset[9] += 1;
337 + break;
338 + case (hour < 22) :
339 + timedataset[10] += 1;
340 + break;
341 + case (hour < 24) :
342 + timedataset[11] += 1;
343 + break;
344 + }
345 + });
346 + var ctx = document.getElementById("barChart").getContext('2d');
347 + var config = {
348 + type: 'bar',
349 + data: {
350 + labels: ["00-02","02-04","04-06","06-08","08-10","10-12","12-14","14-16","16-18","18-20","20-22","22-24"],
351 + datasets: [{
352 + label: '# of Last used time',
353 + data: timedataset,
354 + backgroundColor: [
355 + 'rgba(255, 99, 132, 0.2)','rgba(54, 162, 235, 0.2)','rgba(255, 206, 86, 0.2)','rgba(75, 192, 192, 0.2)','rgba(153, 102, 255, 0.2)','rgba(255, 159, 64, 0.2)',
356 + 'rgba(255, 99, 132, 0.2)','rgba(54, 162, 235, 0.2)','rgba(255, 206, 86, 0.2)','rgba(75, 192, 192, 0.2)','rgba(153, 102, 255, 0.2)','rgba(255, 159, 64, 0.2)'
357 + ],
358 + borderColor: [
359 + 'rgba(255,99,132,1)','rgba(54, 162, 235, 1)','rgba(255, 206, 86, 1)','rgba(75, 192, 192, 1)','rgba(153, 102, 255, 1)','rgba(255, 159, 64, 1)',
360 + 'rgba(255,99,132,1)','rgba(54, 162, 235, 1)','rgba(255, 206, 86, 1)','rgba(75, 192, 192, 1)','rgba(153, 102, 255, 1)','rgba(255, 159, 64, 1)'
361 + ],
362 + borderWidth: 1
363 + }]
364 + },
365 + options: {
366 + scales: {
367 + yAxes: [{
368 + ticks: {
369 + beginAtZero: true,
370 + stepSize:1
371 + }
372 + }]
373 + }
374 + }
375 + }
376 + if (mychart == null) {
377 + mychart = new Chart(ctx, config);
378 + log.info("bar chart create")
379 + } else {
380 + mychart.config = config;
381 + mychart.update();
382 + log.info("bar chart update")
383 + }
384 + value[0].forEach((time) => {
385 + html1 += `<a class="pl-1" style="font-size: 13px">${new Date(time-offset).toISOString().replace(/T/, ' ').replace(/\..+/, '')}</a><br>`;
386 + });
387 + document.querySelector('#apptimelist').innerHTML = html1;
388 + document.getElementById('barchart_title').style.display = "block";
389 + });
390 + resolve(true);
391 + }, 1000)
392 + })
393 +}
394 +
395 +var getbyte = function getB(byte){
396 + return new Promise(resolve =>
397 + setTimeout(() => {
398 + if(byte > 1073741824){
399 + resolve((byte/1073741824).toFixed(2) + "GB");
400 + log.info((byte/1073741824).toFixed(2) + "GB");
401 + }
402 + else if(byte > 1048576){
403 + resolve((byte/1048576).toFixed(2) + "MB");
404 + }
405 + else if(byte > 1024){
406 + resolve((byte/1024).toFixed(2) + "KB");
407 + }
408 + }, 1000)
409 + );
410 +}
411 +
412 +var alltime = function getAllTime(){
413 + return new Promise(function(resolve, reject){
414 + setTimeout( function(){
415 + const db = new sqlite3.Database('InnerDatabase.db');
416 + let sql = `select sum(AppUsageYear.totaltimeforeground) as alltime from AppUsageYear;`
417 + log.info("alltime Query start");
418 + db.get(sql, [], (err, row) => {
419 + if (err) {
420 + log.err(err);
421 + reject(err);
422 + throw err;
423 + }
424 + else{
425 + log.info("alltime Query succesfully executed");
426 + log.info(row.alltime);
427 + db.close();
428 + resolve(row.alltime);
429 + }
430 + });
431 + }, 1000)
432 + })
433 +}
434 +
435 +var totaltime = function getTotaltime(packagename){
436 + return new Promise(function(resolve, reject){
437 + setTimeout( function(){
438 + const db = new sqlite3.Database('InnerDatabase.db');
439 + log.info(packagename);
440 + let sql = `select sum(AppUsageYear.totaltimeforeground) as totaltime from AppUsageYear
441 + where packagename = "${packagename}";`
442 + log.info("totaltime Query start");
443 + db.get(sql, [], (err, row) => {
444 + if (err) {
445 + log.err(err);
446 + reject(err);
447 + throw err;
448 + }
449 + else{
450 + log.info("totaltime Query succesfully executed");
451 + log.info(row.totaltime);
452 + db.close();
453 + resolve(row.totaltime);
454 + }
455 + });
456 + }, 1000)
457 + })
458 +}
459 +
460 +var totaltimeday = function getTotaltimeDay(){
461 + return new Promise(function(resolve, reject){
462 + setTimeout( function(){
463 + const db = new sqlite3.Database('InnerDatabase.db');
464 + let sql = `select sum(AppUsageDay.totaltimeforeground) as totaltime from AppUsageDay;`
465 + log.info("totaltime Query start");
466 + db.get(sql, [], (err, row) => {
467 + if (err) {
468 + log.err(err);
469 + reject(err);
470 + throw err;
471 + }
472 + else{
473 + log.info("totaltime Query succesfully executed");
474 + log.info(row.totaltime);
475 + db.close();
476 + resolve(row.totaltime);
477 + }
478 + });
479 + }, 1000)
480 + })
481 +}
482 +
483 +var packagedetail = function getPackageDetail(packagename){
484 + return new Promise(function(resolve, reject){
485 + setTimeout( function(){
486 + const db = new sqlite3.Database('InnerDatabase.db');
487 + log.info(packagename);
488 + var sql = `select Appinfo.name, Appinfo.packagename, Appinfo.version, Appinfo.firstinstall, Appinfo.lastupdate, Appinfo.wifiusage, Appinfo.cellularusage, sum(AppUsageYear.totaltimeforeground) totaltime\
489 + from AppInfo left join AppUsageYear on AppInfo.packagename = AppUsageYear.packagename\
490 + WHERE Appinfo.packagename = "${packagename}"\
491 + GROUP BY AppUsageYear.packagename;`
492 + log.info("packagedetail Query start");
493 + db.get(sql, [], (err, row) => {
494 + if (err) {
495 + log.err(err);
496 + reject(err);
497 + throw err;
498 + }
499 + else{
500 + log.info("packagedetail Query succesfully executed");
501 + db.close();
502 + resolve(row);
503 + }
504 + });
505 + }, 1000)
506 + })
507 +}
508 +
509 +var usedtime = function getLasttimeused(packagename){
510 + return new Promise(function(resolve, reject){
511 + setTimeout( function(){
512 + const db = new sqlite3.Database('InnerDatabase.db');
513 + log.info(packagename);
514 + var timelist = [];
515 + var sql = `select lasttimeused from AppUsageYear\
516 + where packagename = "${packagename}" and lasttimeused != firsttimestamp\
517 + union\
518 + select lasttimeused from AppUsageMonth
519 + where packagename = "${packagename}" and lasttimeused != firsttimestamp\
520 + union\
521 + select lasttimeused from AppUsageWeek
522 + where packagename = "${packagename}" and lasttimeused != firsttimestamp\
523 + union\
524 + select lasttimeused from AppUsageDay\
525 + where packagename = "${packagename}" and lasttimeused != firsttimestamp;`
526 + log.info("usedtime Query start");
527 + db.all(sql, [], (err, rows) => {
528 + if (err) {
529 + log.err(err);
530 + reject(err);
531 + throw err;
532 + }
533 + rows.forEach((row) => {
534 + if(row.lasttimeused>1000000000000){
535 + timelist.push(row.lasttimeused);
536 + }
537 + });
538 + log.info("usedtime Query succesfully executed");
539 + log.info(timelist.length);
540 + resolve(timelist);
541 + });
542 + }, 1000)
543 + })
544 +}
545 +
546 +var top10_day = function getTop10(){
547 + return new Promise(function(resolve, reject){
548 + setTimeout( function(){
549 + const db = new sqlite3.Database('InnerDatabase.db');
550 + var timelist = [];
551 + var sql = `select Appinfo.name, Appinfo.packagename, sum(AppUsageDay.totaltimeforeground) totaltime from AppInfo, AppUsageDay
552 + where Appinfo.packagename = AppUsageDay.packagename
553 + GROUP BY AppUsageDay.packagename
554 + ORDER BY totaltime desc
555 + LIMIT 10;`
556 + log.info("getTop10 Query start");
557 + db.all(sql, [], (err, rows) => {
558 + if (err) {
559 + log.err(err);
560 + reject(err);
561 + throw err;
562 + }
563 + else{
564 + log.info("getTop10 Query succesfully executed");
565 + db.close();
566 + resolve(rows)
567 + }
568 + });
569 + }, 1000)
570 + })
571 +}
572 +function getdayusedapp(day){
573 + var date = (day > 9)? day : "0"+day;
574 + const db = new sqlite3.Database('InnerDatabase.db');
575 + var html = `<tr class="pb-2" style="font-size: 13px"><th>name</th><th>last time used</th><th>time</th></tr>`;
576 + var sql = `SELECT AppUsageDay.packagename,AppInfo.name, lasttimeused,totaltimeforeground,strftime('%d',datetime(firsttimestamp/1000, 'unixepoch', 'localtime')) as day FROM AppUsageDay, AppInfo
577 + where day = '${date}' and totaltimeforeground > 0 and AppInfo.packagename = AppUsageDay.packagename
578 + order by lasttimeused;`;
579 + log.info("getdayusedapp Query start");
580 + db.all(sql, [], (err, rows) => {
581 + if (err) {
582 + log.err(err);
583 + reject(err);
584 + throw err;
585 + }
586 + rows.forEach((row) => {
587 + var totaltime;
588 + if(row.totaltimeforeground> 3600000){
589 + totaltime = (row.totaltimeforeground/3600000).toFixed(2) + "h";
590 + }
591 + else if(row.totaltimeforeground > 60000){
592 + totaltime = (row.totaltimeforeground/60000).toFixed(2) + "m";
593 + }
594 + else if(row.totaltimeforeground > 1000){
595 + totaltime = (row.totaltimeforeground/1000).toFixed(2) + "s";
596 + }
597 + html += `<tr style="font-size: 13px"><td class="pr-4">${row.name}</td><td class="pr-4">${new Date(row.lasttimeused-offset).toISOString().replace(/T/, ' ').replace(/\..+/, '')}</td><td class="pr-1">${totaltime}</td></tr>`
598 + });
599 + document.querySelector('#day_use_list > tbody').innerHTML = html;
600 + });
601 + var i;
602 + var x = document.getElementsByClassName("sort");
603 + for (i = 0; i < x.length; i++) {
604 + x[i].style.fontWeight = "normal";
605 + }
606 + document.getElementById('day_'+day).style.fontWeight = "bold";
607 +}
608 +var get_recent_dataset = function getRecentDataset(){
609 + return new Promise(function(resolve, reject){
610 + setTimeout( function(){
611 + const db = new sqlite3.Database('InnerDatabase.db');
612 + var sql = `select firsttimestamp,lasttimestamp,sum(totaltimeforeground) as totaltime from AppUsageDay
613 + group by firsttimestamp;`
614 + db.all(sql, [], (err, rows) => {
615 + if (err) {
616 + log.err(err);
617 + reject(err);
618 + throw err;
619 + }
620 + var label_array = [];
621 + var bardataset = [];
622 + rows.forEach((row) => {
623 + var date = new Date(row.firsttimestamp-offset);
624 + label_array.push(date.getDate());
625 + bardataset.push(row.totaltime/3600000);
626 + document.getElementById('selectday').innerHTML += `<a id="day_${date.getDate()}" class="sort p-2 text-muted" onclick="getdayusedapp('${date.getDate()}');">${date.getDate()}</a>`;
627 + });
628 + db.close();
629 + var ctx = document.getElementById("recent_bar").getContext('2d');
630 + var config = {
631 + type: 'bar',
632 + data: {
633 + labels: label_array,
634 + datasets: [{
635 + label: 'Hour',
636 + data: bardataset,
637 + backgroundColor: [
638 + 'rgba(255, 99, 132, 0.2)','rgba(54, 162, 235, 0.2)','rgba(255, 206, 86, 0.2)','rgba(75, 192, 192, 0.2)','rgba(153, 102, 255, 0.2)','rgba(255, 159, 64, 0.2)',
639 + 'rgba(255, 99, 132, 0.2)','rgba(54, 162, 235, 0.2)','rgba(255, 206, 86, 0.2)','rgba(75, 192, 192, 0.2)'
640 + ],
641 + borderColor: [
642 + 'rgba(255,99,132,1)','rgba(54, 162, 235, 1)','rgba(255, 206, 86, 1)','rgba(75, 192, 192, 1)','rgba(153, 102, 255, 1)','rgba(255, 159, 64, 1)',
643 + 'rgba(255,99,132,1)','rgba(54, 162, 235, 1)','rgba(255, 206, 86, 1)','rgba(75, 192, 192, 1)'
644 + ],
645 + borderWidth: 1
646 + }]
647 + },
648 + options: {
649 + scales: {
650 + yAxes: [{
651 + ticks: {
652 + beginAtZero: true,
653 + }
654 + }]
655 + },
656 + responsive: false
657 + }
658 + }
659 + var myChart = new Chart(ctx, config);
660 + getdayusedapp(label_array[0]);
661 + });
662 + }, 1000)
663 + })
664 +}
665 +
666 +// var ctxP = document.getElementById("pieChart").getContext('2d');
667 +// var myPieChart = new Chart(ctxP, {
668 +// type: 'pie',
669 +// data: {
670 +// labels: ["Red", "Green", "Yellow", 보라 "Grey", "Dark Grey"],
671 +// datasets: [{
672 +// data: [300, 50, 100, 40, 120],
673 +// backgroundColor: ["#F7464A", "#46BFBD", "#FDB45C", "#949FB1", "#4D5360"],
674 +// hoverBackgroundColor: ["#FF5A5E", "#5AD3D1", "#FFC870", "#A8B3C5", "#616774"]
675 +// }]
676 +// },
677 +// options: {
678 +// responsive: true
679 +// }
680 +// });
681 +// db.close();
682 +
683 +
684 +// var options_main_stacked={
685 +// type: 'bar',
686 +// data: {
687 +// labels: label_text,
688 +// datasets:[{
689 +// label:label_data1_text,
690 +// data:label_data1,
691 +// backgroundColor:'rgba(255, 127, 80, 1)',
692 +// borderColor:'rgba(255, 127, 80, 1)',
693 +// type:"line",
694 +// fill: false
695 +// },
696 +// {
697 +// label:label_data2_text,
698 +// data:label_data2,
699 +// backgroundColor:'rgba(255, 206, 86, 0.2)',
700 +// },
701 +// {
702 +// label:label_data3_text,
703 +// data:label_data3,
704 +// backgroundColor:'rgba(75, 192, 192, 0.2)',
705 +// }]
706 +// },
707 +// options: options_stacked
708 +// };
...\ No newline at end of file ...\ No newline at end of file
1 +<!DOCTYPE html>
2 +<html lang="en">
3 +<head>
4 + <meta charset="UTF-8">
5 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 + <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
7 + <script src="https://cdn.jsdelivr.net/npm/chart.js@2.8.0"></script>
8 + <link rel="stylesheet" href="../assets/css/menu_apps.css">
9 + <title>Document</title>
10 +</head>
11 +<body>
12 +<div class="container">
13 + <header class="menu-header py-4">
14 + <div class="row d-flex justify-content-start flex-nowrap align-items-end">
15 + <div class="col">
16 + <a class="title-name text-dark">Media</a>
17 + </div>
18 + <div div class="col-9">
19 + <a class="title-detail">미디어 파일 분석</a>
20 + </div>
21 + <div div class="col">
22 + <a class="title-back" href="menu.html" id="menu-info">나가기</a>
23 + </div>
24 + </div>
25 + </header>
26 + <div class="nav-scroller nav-color py-1 mb-2">
27 + <nav class="nav d-flex justify-content-around">
28 + <a class="p-2" href="#" style="color: whitesmoke" onclick="openTap('Media-Strorage-Structure');">Media Strorage Structure</a>
29 + <a class="p-2" href="#" style="color: whitesmoke" onclick="openTap('Video-Analysis');">Video Analysis</a>
30 + </nav>
31 + </div>
32 + <div class="container">
33 + <div id="Media-Strorage-Structure" class="menu">
34 + <div class="row">
35 + <div class="col">
36 + <div class="my-3 p-3 bg-white rounded shadow-sm">
37 + <h6 class="border-bottom border-gray pb-2 mb-0">Media file 저장공간</h6>
38 + <div id="barChartdiv">
39 + <canvas id="pieChart"></canvas>
40 + </div>
41 + <div id="pie_datalist" class="w-75 pt-4">
42 + </div>
43 + </div>
44 + </div>
45 + <div class="col">
46 + <div class="my-3 p-3 bg-white rounded shadow-sm">
47 + <h6 class="border-bottom border-gray pb-2 mb-0">파일 구조 분석</h6>
48 + <div class="row justify-content-end">
49 + <a id="photo" class="filetype p-2 text-muted" href="#" onclick="getStorageStructure('photo');" style="font-weight: bold;">Image</a>
50 + <a id="video" class="filetype p-2 text-muted" href="#" onclick="getStorageStructure('video');">Video</a>
51 + <a id="audio" class="filetype p-2 text-muted" href="#" onclick="getStorageStructure('audio');">Audio</a>
52 + <a id="documentinfo" class="filetype p-2 text-muted" href="#" onclick="getStorageStructure('documentinfo');">Document</a>
53 + </div>
54 + <h8 id="struct_title" class="pt-3 pb-3 pl-1 mb-0 font-italic" style="font-size: 17px;">Image</h8>
55 + <div id="mediafile_struct">
56 + <div>
57 +
58 + </div>
59 + </div>
60 + </div>
61 + </div>
62 + </div>
63 + <div id="filelist_for_folder" class="row" style="display: none;">
64 + <div class="col">
65 + <div class="my-3 p-3 bg-white rounded shadow-sm">
66 + <h6 id='infilelist' class="border-bottom border-gray pb-2 mb-0 "></h6>
67 + <table id="filetable" class="table">
68 + <tbody>
69 +
70 + </tbody>
71 + </table>
72 + </div>
73 + </div>
74 + </div>
75 + </div>
76 +
77 + <div id="Video-Analysis" class="menu" style="display: none;">
78 + <div class="row">
79 + <div class="col">
80 + <div class="my-3 p-3 bg-white rounded shadow-sm">
81 + <h6 class="border-bottom border-gray pb-2 mb-0">Video 선택</h6>
82 + <div class="check_confirm d-flex justify-content-end p-1">
83 + <button id="temp_post" type="button" class="btn btn-sm btn-primary font-nanum">analysis start</button>
84 + </div>
85 + <table id="videotable" class="table">
86 + <tbody>
87 +
88 + </tbody>
89 + </table>
90 + </div>
91 + </div>
92 + </div>
93 + </div>
94 + <div id="Analysis-Detail" class="menu" style="display: none;">
95 + <div id ="va_list" class="bg-white rounded shadow-sm">
96 +
97 + </div>
98 + </div>
99 + </div>
100 +</div>
101 +
102 + <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
103 + <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
104 + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
105 + <script src="menu_media.js"></script>
106 + </body>
107 +</html>
...\ No newline at end of file ...\ No newline at end of file
1 +const { ipcRenderer } = require("electron");
2 +const log = require('electron-log')
3 +const sqlite3 = require('sqlite3').verbose();
4 +const offset = new Date().getTimezoneOffset() * 60000;
5 +var exec = require('child_process').exec, child;
6 +var mypiechart = null;
7 +
8 +
9 +
10 +
11 +function el(selector) {
12 + return document.getElementById(selector);
13 +}
14 +function cl(selector) {
15 + return document.getElementsByClassName(selector);
16 +}
17 +
18 +
19 +const videoanalysis = document.getElementById("temp_post");
20 +
21 +videoanalysis.addEventListener("click", ()=>{
22 + Promise.all([check()]).then(function(value){
23 + ipcRenderer.send(
24 + "video-analysis",
25 + value[0]
26 + );
27 + });
28 + // check().then(copy).then(result => {
29 + // ipcRenderer.send(
30 + // "video-analysis",
31 + // result
32 + // );
33 + // })
34 +});
35 +
36 +var check = function checkboxcheck(){
37 + return new Promise(function(resolve, reject){
38 + setTimeout(function(){
39 + var checkedValue = [];
40 + var inputElements = document.querySelectorAll('#blankCheckbox');
41 + for(var i=0; i < inputElements.length; i++){
42 + if(inputElements[i].checked){
43 + checkedValue.push(inputElements[i].value);
44 + log.info(inputElements[i].value);
45 + }
46 + }
47 + resolve(checkedValue);
48 + }, 1000)
49 + })
50 +}
51 +
52 +var copy = function copyfiles(values){
53 + return new Promise(function(resolve, reject){
54 + setTimeout(function(){
55 + values.forEach((value)=>{
56 + cmd_pull = exec('adb pull '+value,function(error, stdout, stderr){
57 + if(error){
58 + console.log(error);
59 + }
60 + });
61 + });
62 + resolve(values);
63 + }, 1000)
64 + })
65 +}
66 +
67 +
68 +ipcRenderer.on("getvideodetail", (e, arg) => {
69 + log.info(arg + " from main");
70 + Promise.all([popvideoanalysis(arg)]).then(function(value){
71 + log.info(value);
72 + value[0].forEach((pie) => {
73 + log.info("hello")
74 + var ctx = document.getElementById(pie[0]).getContext("2d");
75 + log.info("hello")
76 + new Chart(ctx, pie[1]);
77 + log.info(pie[0] +" dect pie chart create");
78 + })
79 + });
80 +});
81 +
82 +document.addEventListener("DOMContentLoaded", function(){
83 + getMediaChart();
84 + getStorageStructure('photo');
85 + video_list();
86 + });
87 +
88 +
89 +var popvideoanalysis = function popVideoAnalysis(arg){
90 + return new Promise(function(resolve, reject){
91 + setTimeout( function(){
92 + log.info("start popVideoAnalysis");
93 + document.querySelector('#va_list').innerHTML = '';
94 + var mydectpiechart = [];
95 + var x = document.getElementsByClassName("menu");
96 + for (i = 0; i < x.length; i++) {
97 + x[i].style.display = "none"
98 + }
99 + document.getElementById('Analysis-Detail').style.display = "block";
100 + for(var k =0; k < arg[0].length; k++)
101 + {
102 + var lb_dict = arg[0][k];
103 + var dt_dict = arg[1][k];
104 +
105 + var html_taglist = ``;
106 + var i,j;
107 + for(i=0; i < lb_dict['labels'].length; i++){
108 + var label_name = lb_dict['labels'][i];
109 + html_taglist += `<div class="font-nanum pb-1 pt-1" style="font-size: 14px;"><a style="font-weight: bold;">${label_name}<a><br>`;
110 + for(j=0; j<lb_dict[label_name].length; j++){
111 + var label_detail = lb_dict[label_name][j];
112 + html_taglist += `<p style="text-align: right;"><a class="pb-1s">${label_detail[0]}s ~ ${label_detail[1]} for ${label_detail[2].toFixed(2)} confidence</a><p>`;
113 + }
114 + html_taglist += '</div>'
115 + }
116 + var likelihood_index = {'UNKNOWN': 0,'VERY_UNLIKELY': 1,'UNLIKELY': 2,'POSSIBLE': 3,'LIKELY': 4,'VERY_LIKELY': 5};
117 + var det_dataset = [0,0,0,0,0,0]
118 +
119 + var html_detlist = ``;
120 + var i,j;
121 + for(i=0; i < dt_dict['likelihood'].length; i++){
122 + html_detlist += `<div class="font-nanum pb-2 pt-2" style="font-size: 14px; text-align: right;"><a>~ ${dt_dict['likelihood'][i][0]}s , ${dt_dict['likelihood'][i][1]}</a><div>`;
123 + det_dataset[likelihood_index[dt_dict['likelihood'][i][1]]] +=1;
124 + }
125 +
126 + log.info(det_dataset);
127 + var html = `<div class="bg-white rounded shadow-sm">
128 + <h6 class="border-bottom border-gray pl-2 pb-2 mb-0">${lb_dict['video']}</h6>
129 + <div class="row">
130 + <div class="col">
131 + <div class="my-3 p-3 bg-white rounded shadow-sm">
132 + <h6 class="border-bottom border-gray pb-2 mb-0">Tag</h6>
133 + <div id="taglist_${lb_dict['video']}" class="pt-2">
134 + ${html_taglist}
135 + </div>
136 + </div>
137 + </div>
138 + <div class="col">
139 + <div class="my-3 p-3 bg-white rounded shadow-sm">
140 + <h6 class="border-bottom border-gray pb-2 mb-0">Content Detection</h6>
141 + <div>
142 + <canvas id="det_piechart_${lb_dict['video']}"></canvas>
143 + </div>
144 + <div id="detectionlist_${lb_dict['video']}" class="pt-2">
145 + ${html_detlist}
146 + </div>
147 + </div>
148 + </div>
149 + </div>
150 + </div>`;
151 + document.querySelector('#va_list').innerHTML += html;
152 + // var ctx = document.getElementById('det_piechart_'+lb_dict['video']).getContext("2d");
153 + var config = {
154 + type: 'pie',
155 + data: {
156 + labels: ["UNKNOWN","VERY_UNLIKELY", "UNLIKELY","POSSIBLE", "LIKELY","VERY_LIKELY"],
157 + datasets: [{
158 + data: det_dataset,
159 + backgroundColor: ["#D3D3D3", "#C0C0C0", "#A9A9A9", "#FF3333","#FF0000","#CC0000"],
160 + hoverBackgroundColor: ["#D3D3D3", "#C0C0C0", "#A9A9A9", "#FF3333","#FF0000","#CC0000"]
161 + }]
162 + },
163 + options: {
164 + responsive: true,
165 + },
166 + }
167 + mydectpiechart.push(['det_piechart_'+lb_dict['video'],config]);
168 + // mydectpiechart[k] = new Chart(ctx, config);
169 + // log.info('det_piechart_'+lb_dict['video'] +" dect pie chart create");
170 + }
171 + resolve(mydectpiechart);
172 + }, 1000)
173 + })
174 +
175 +}
176 +
177 +function openTap(tabName) {
178 + var i;
179 + var x = document.getElementsByClassName("menu");
180 + for (i = 0; i < x.length; i++) {
181 + x[i].style.display = "none"
182 + }
183 + document.getElementById(tabName).style.display = "block";
184 + }
185 +
186 +function getMediaChart(){
187 + Promise.all([drawpiechart()]).then(function(value){
188 + log.info("getMediaChart finished")
189 + });
190 +}
191 +
192 +function getStorageStructure(filetype){
193 + document.querySelector('#mediafile_struct > div').innerHTML = '';
194 + document.querySelector('#filetable > tbody').innerHTML = '';
195 + document.getElementById('filelist_for_folder').style.display = "none";
196 + log.info("getStorageStructure start")
197 + Promise.all([file_struct(filetype)]).then(function(value){
198 + value[0].forEach((row) => {
199 + getByte(row.dirsize).then(function(bytedata) {
200 + document.querySelector('#mediafile_struct > div').innerHTML += `<div class="d-flex justify-content-between p-1"><a href="#" clase="folder_name" onclick="getFilelistinFolder('${row.dir}','${filetype}');" id="${row.dir}">${row.dir} </a><a></a>${bytedata}<br></div>`
201 + });
202 + });
203 + });
204 + var i;
205 + var x = document.getElementsByClassName("filetype");
206 + for (i = 0; i < x.length; i++) {
207 + x[i].style.fontWeight = "normal";
208 + }
209 + document.getElementById(filetype).style.fontWeight = "bold";
210 + switch(filetype){
211 + case 'photo':
212 + document.getElementById('struct_title').innerText = "Image";
213 + break;
214 + case 'video':
215 + document.getElementById('struct_title').innerText = "Video";
216 + break;
217 + case 'audio':
218 + document.getElementById('struct_title').innerText = "Audio";
219 + break;
220 + case 'documentinfo':
221 + document.getElementById('struct_title').innerText = "Document";
222 + break;
223 + }
224 +}
225 +
226 +function getFilelistinFolder(foldername,filetype){
227 + log.info("getFilelistinFolder start")
228 + document.querySelector('#filetable > tbody').innerHTML = `<tr><th>name</th>\
229 + <th>date_added</th>\
230 + <th>size</th>\
231 + </tr>`;
232 +
233 + Promise.all([fileinfolder(foldername, filetype)]).then(function(value){
234 + value[0].forEach((row) => {
235 + getByte(row.size).then(function(bytedata) {
236 + document.querySelector('#filetable > tbody').innerHTML += `<tr><td>${row.name}</td><td>${new Date(row.date_added*1000-offset).toISOString().replace(/T/, ' ').replace(/\..+/, '')}</td><td>${bytedata}</td></tr>`
237 + });
238 + });
239 + });
240 + document.getElementById('filelist_for_folder').style.display = "block";
241 +}
242 +
243 +var drawpiechart = function drawPieChart(){
244 + return new Promise(function(resolve, reject){
245 + setTimeout( function(){
246 + var html = ''
247 + Promise.all([filetype_all_size('photo'),filetype_all_size('video'),filetype_all_size('audio'),filetype_all_size('documentinfo')]).then(function(value){
248 + var ctx = document.getElementById("pieChart").getContext('2d');
249 + var config = {
250 + type: 'pie',
251 + data: {
252 + labels: ["Image", "Video", "Audio", "Documents"],
253 + datasets: [{
254 + data: [value[0], value[1], value[2], value[3]],
255 + backgroundColor: ["#F7464A", "#46BFBD", "#FDB45C", "#949FB1"],
256 + hoverBackgroundColor: ["#FF5A5E", "#5AD3D1", "#FFC870", "#A8B3C5"]
257 + }]
258 + },
259 + options: {
260 + responsive: true
261 + }
262 + }
263 + if (mypiechart == null) {
264 + mypiechart = new Chart(ctx, config);
265 + log.info("pie chart create")
266 + } else {
267 + mypiechart.config = config;
268 + mypiechart.update();
269 + log.info("pie chart update")
270 + }
271 + Promise.all([getByte(value[0]),getByte(value[1]),getByte(value[2]),getByte(value[3])]).then(function(b){
272 + var html = `<div class="d-flex justify-content-between pt-1 pb-1"><a style="font-weight: bold;">Image </a><a>${b[0]}</a></div>
273 + <div class="d-flex justify-content-between pt-1 pb-1"><a style="font-weight: bold;">Video </a><a>${b[1]}</a></div>
274 + <div class="d-flex justify-content-between pt-1 pb-1"><a style="font-weight: bold;">Audio </a><a>${b[2]}</a></div>
275 + <div class="d-flex justify-content-between pt-1 pb-1"><a style="font-weight: bold;">Document </a><a>${b[3]}</a></div>`
276 + document.querySelector('#pie_datalist').innerHTML = html;
277 + });
278 + });
279 + resolve(true);
280 + }, 1000)
281 + })
282 + }
283 +
284 +var getByte = function getB(byte){
285 + return new Promise(function(resolve, reject){
286 + setTimeout( function(){
287 + if(byte > 1073741824){
288 + resolve((byte/1073741824).toFixed(2) + "GB");
289 + }
290 + else if(byte > 1048576){
291 + resolve((byte/1048576).toFixed(2) + "MB");
292 + }
293 + else if(byte > 1024){
294 + resolve((byte/1024).toFixed(2) + "KB");
295 + }
296 + }, 1000)
297 + })
298 +}
299 +
300 +var filetype_all_size = function getAllAudioSize(filetype){
301 + return new Promise(function(resolve, reject){
302 + setTimeout( function(){
303 + const db = new sqlite3.Database('InnerDatabase.db');
304 + let sql = `select SUM(size) as totalsize from ${filetype};`
305 + log.info("filetype_all_size Query start");
306 + db.get(sql, [], (err, row) => {
307 + if (err) {
308 + log.err(err);
309 + reject(err);
310 + throw err;
311 + }
312 + else{
313 + log.info("filetype_all_size Query succesfully executed");
314 + db.close();
315 + resolve(row.totalsize);
316 + }
317 + });
318 + }, 1000)
319 + })
320 +}
321 +
322 +var file_struct = function getStruct(filetype){
323 + return new Promise(function(resolve, reject){
324 + setTimeout( function(){
325 + const db = new sqlite3.Database('InnerDatabase.db');
326 + let sql = `select replace(SUBSTR(rtrim(path, replace(path, '/', '')),1,LENGTH(rtrim(path, replace(path, '/', '')))-1), rtrim(SUBSTR(rtrim(path, replace(path, '/', '')),1,LENGTH(rtrim(path, replace(path, '/', '')))-1), replace(SUBSTR(rtrim(path, replace(path, '/', '')),1,LENGTH(rtrim(path, replace(path, '/', '')))-1), '/', '')), '') as dir, sum(size) as dirsize
327 + from ${filetype}
328 + group by dir;`
329 + log.info("file_struct Query start");
330 + db.all(sql, [], (err, rows) => {
331 + if (err) {
332 + log.err(err);
333 + reject(err);
334 + throw err;
335 + }
336 + else{
337 + log.info("file_struct Query succesfully executed");
338 + db.close();
339 + resolve(rows);
340 + }
341 + });
342 + }, 1000)
343 + })
344 +}
345 +
346 +var fileinfolder = function getFileinFolder(foldername,filetype){
347 + return new Promise(function(resolve, reject){
348 + setTimeout( function(){
349 + const db = new sqlite3.Database('InnerDatabase.db');
350 + let sql = '';
351 + switch(filetype){
352 + case 'photo':
353 + sql += `select display_name as name, date_added, path, size from ${filetype}
354 + where path LIKE '%${foldername}%';`
355 + document.querySelector('#infilelist').innerText = `Images in ${foldername}`;
356 + break;
357 + case 'video':
358 + sql += `select display_name as name, date_added, path, size from ${filetype}
359 + where path LIKE '%${foldername}%';`
360 + document.querySelector('#infilelist').innerText = `Videos in ${foldername}`;
361 + break;
362 + case 'audio':
363 + sql += `select title as name, date_added, path, size from ${filetype}
364 + where path LIKE '%${foldername}%';`
365 + document.querySelector('#infilelist').innerText = `Audios in ${foldername}`;
366 + break;
367 + case 'documentinfo':
368 + sql += `select name, date_added, path, size from ${filetype}
369 + where path LIKE '%${foldername}%';`
370 + document.querySelector('#infilelist').innerText = `Documents in ${foldername}`;
371 + break;
372 + }
373 + log.info("fileinfolder Query start");
374 + db.all(sql, [], (err, rows) => {
375 + if (err) {
376 + log.err(err);
377 + reject(err);
378 + throw err;
379 + }
380 + else{
381 + log.info("fileinfolder Query succesfully executed");
382 + db.close();
383 + resolve(rows);
384 + }
385 + });
386 + }, 1000)
387 + })
388 +}
389 +
390 +var video_list = function getVideolist(filetype){
391 + return new Promise(function(resolve, reject){
392 + setTimeout( function(){
393 + document.querySelector('#videotable > tbody').innerHTML = `<tr><th></th>
394 + <th>name</th>\
395 + <th>date_added</th>\
396 + <th>resolution</th>\
397 + <th>size</th>\
398 + </tr>`;
399 + const db = new sqlite3.Database('InnerDatabase.db');
400 + let sql = `select display_name as name, date_added, path, resolution, size
401 + from video;`
402 + log.info("video_list Query start");
403 + db.all(sql, [], (err, rows) => {
404 + if (err) {
405 + log.err(err);
406 + reject(err);
407 + throw err;
408 + }
409 + else{
410 + log.info("video_list Query succesfully executed");
411 + rows.forEach((row) => {
412 + getByte(row.size).then(function(bytedata) {
413 + document.querySelector('#videotable > tbody').innerHTML += `<tr><td><div class="form-check">
414 + <input class="form-check-input position-static" type="checkbox" id="blankCheckbox" value="${row.path}">
415 + </div></td>
416 + <td>${row.name}</td><td>${new Date(row.date_added*1000-offset).toISOString().replace(/T/, ' ').replace(/\..+/, '')}</td><td>${row.resolution}</td><td>${bytedata}</td></tr>`
417 + });
418 + });
419 + db.close();
420 + resolve(true);
421 + }
422 + });
423 + }, 1000)
424 + })
425 +}
...\ No newline at end of file ...\ No newline at end of file
1 +// Imports the Google Cloud Video Intelligence library + Node's fs library
2 +const video = require('@google-cloud/video-intelligence').v1;
3 +const fs = require('fs');
4 +const util = require('util');
5 +async function getinfo(){
6 + console.log('before client');
7 + // Creates a client
8 + const client = new video.VideoIntelligenceServiceClient();
9 + console.log('after client');
10 +
11 + /**
12 + * TODO(developer): Uncomment the following line before running the sample.
13 + */
14 + const path = 'C:/Users/yunyoung/Desktop/temp/2016104137/source/forensic_tool/20190525_113617.mp4';
15 +
16 + // Reads a local video file and converts it to base64
17 + const readFile = util.promisify(fs.readFile);
18 + const file = await readFile(path);
19 + const inputContent = file.toString('base64');
20 +
21 + // Constructs request
22 + const request = {
23 + inputContent: inputContent,
24 + features: ['LABEL_DETECTION'],
25 + };
26 +
27 + // Detects labels in a video
28 + const [operation] = await client.annotateVideo(request);
29 + console.log('Waiting for operation to complete...');
30 + const [operationResult] = await operation.promise();
31 + // Gets annotations for video
32 + const annotations = operationResult.annotationResults[0];
33 +
34 + const labels = annotations.segmentLabelAnnotations;
35 + labels.forEach(label => {
36 + console.log(`Label ${label.entity.description} occurs at:`);
37 + label.segments.forEach(segment => {
38 + const time = segment.segment;
39 + if (time.startTimeOffset.seconds === undefined) {
40 + time.startTimeOffset.seconds = 0;
41 + }
42 + if (time.startTimeOffset.nanos === undefined) {
43 + time.startTimeOffset.nanos = 0;
44 + }
45 + if (time.endTimeOffset.seconds === undefined) {
46 + time.endTimeOffset.seconds = 0;
47 + }
48 + if (time.endTimeOffset.nanos === undefined) {
49 + time.endTimeOffset.nanos = 0;
50 + }
51 + console.log(
52 + `\tStart: ${time.startTimeOffset.seconds}` +
53 + `.${(time.startTimeOffset.nanos / 1e6).toFixed(0)}s`
54 + );
55 + console.log(
56 + `\tEnd: ${time.endTimeOffset.seconds}.` +
57 + `${(time.endTimeOffset.nanos / 1e6).toFixed(0)}s`
58 + );
59 + console.log(`\tConfidence: ${segment.confidence}`);
60 + });
61 + });
62 +}
63 +//getinfo();
64 +//get_videosaftey();
65 +async function get_videosaftey(){
66 + // Imports the Google Cloud Video Intelligence library
67 + const video = require('@google-cloud/video-intelligence').v1;
68 + console.log('before client');
69 + // Creates a client
70 + const client = new video.VideoIntelligenceServiceClient();
71 + console.log('after client');
72 +
73 + /**
74 + * TODO(developer): Uncomment the following line before running the sample.
75 + */
76 + // const gcsUri = 'GCS URI of video to analyze, e.g. gs://my-bucket/my-video.mp4';
77 + const path = 'C:/Users/yunyoung/Videos/20190525_113617.mp4';
78 +
79 + // Reads a local video file and converts it to base64
80 + const readFile = util.promisify(fs.readFile);
81 + const file = await readFile(path);
82 + const inputContent = file.toString('base64');
83 +
84 + const request = {
85 + inputContent: inputContent,
86 + features: ['EXPLICIT_CONTENT_DETECTION'],
87 + };
88 +
89 + // Human-readable likelihoods
90 + const likelihoods = [
91 + 'UNKNOWN',
92 + 'VERY_UNLIKELY',
93 + 'UNLIKELY',
94 + 'POSSIBLE',
95 + 'LIKELY',
96 + 'VERY_LIKELY',
97 + ];
98 +
99 + // Detects unsafe content
100 + const [opertaion] = await client.annotateVideo(request);
101 + console.log('Waiting for operation to complete...');
102 + const [operationResult] = await opertaion.promise();
103 + // Gets unsafe content
104 + const explicitContentResults =
105 + operationResult.annotationResults[0].explicitAnnotation;
106 + console.log('Explicit annotation results:');
107 + explicitContentResults.frames.forEach(result => {
108 + if (result.timeOffset === undefined) {
109 + result.timeOffset = {};
110 + }
111 + if (result.timeOffset.seconds === undefined) {
112 + result.timeOffset.seconds = 0;
113 + }
114 + if (result.timeOffset.nanos === undefined) {
115 + result.timeOffset.nanos = 0;
116 + }
117 + console.log(
118 + `\tTime: ${result.timeOffset.seconds}` +
119 + `.${(result.timeOffset.nanos / 1e6).toFixed(0)}s`
120 + );
121 + console.log(
122 + `\t\tPornography likelihood: ${likelihoods[result.pornographyLikelihood]}`
123 + );
124 + });
125 +}
126 +
127 +// var ss = `C:\\Users\\yunyoung\\Desktop\\temp\\2016104137\\source\\forensic_tool\\20190215_152731.mp4`
128 +// var h = ss.split('\\');
129 +// var c = '';
130 +// for(var i = 0; i < h.length; i++){
131 +// c += h[i] + '/';
132 +// }
133 +// console.log(c);
134 +// const l = c.slice(0,-1);
135 +// console.log(l);
136 +// console.log(ss);
137 +// var hell = ss.replace('/\\/g','/');
138 +// console.log(hell);
139 +
140 +const labels = [['landmark',[['0.0','17.17'],['0.0','17.17'],['0.0','17.17']]],['tourist destination',[['0.0','17.17'],['0.0','17.17'],['0.0','17.17']]],['tourism',[['0.0','17.17'],['0.0','17.17'],['0.0','17.17']]],['historic site',[['0.0','17.17'],['0.0','17.17'],['0.0','17.17']]],['building',[['0.0','17.17'],['0.0','17.17'],['0.0','17.17']]]];
141 +console.log(labels);
142 +var content = {video : '2020',labels : []}
143 +labels.forEach(label => {
144 + content['labels'].push(label[0]);
145 + content[label[0]] = [];
146 + label[1].forEach(segment => {
147 + var temp = [segment[0],segment[1]];
148 + content[label[0]].push(temp);
149 + });
150 +});
151 +
152 +console.log(content);
153 +var array = content['labels'];
154 +
155 +array.forEach(label =>{
156 + for(var i = 0; i < content[label].length; i++){
157 + console.log(content[label][i]);
158 + }
159 +});
160 +
161 +var likelihood_index = {'UNKNOWN': 0,'VERY_UNLIKELY': 1,'UNLIKELY': 2,'POSSIBLE': 3,'LIKELY': 4,'VERY_LIKELY': 5};
162 + var det_dataset = [0,0,0,0,0,0]
163 +
164 + det_dataset[likelihood_index[dt_dict['likelihood'][i][1]]] +=1;
165 +
166 +var ctx = document.getElementById('det_piechart_'+lb_dict['video']);
167 + var config = {
168 + type: 'pie',
169 + data: {
170 + labels: ["UNKNOWN", "VERY_UNLIKELY", "UNLIKELY", "POSSIBLE","LIKELY",'VERY_LIKELY'],
171 + datasets: [{
172 + data: det_dataset,
173 + backgroundColor: ["#F7464A", "#46BFBD", "#FDB45C", "#949FB1"],
174 + hoverBackgroundColor: ["#FF5A5E", "#5AD3D1", "#FFC870", "#A8B3C5"]
175 + }]
176 + },
177 + options: {
178 + responsive: true
179 + }
180 + }
...\ No newline at end of file ...\ No newline at end of file