commit 371cbce20237e0306cd0bc9d53be494f456d83d6 Author: zogzog Date: Tue Mar 24 07:17:48 2026 +0100 initial commit diff --git a/app.py b/app.py new file mode 100644 index 0000000..26cfcd2 --- /dev/null +++ b/app.py @@ -0,0 +1,687 @@ +""" +PC Monitor - Serveur Flask pour monitoring hardware +Supporte plusieurs plugins: LibreHardwareMonitor, HWiNFO, Plexamp, etc. +""" +from flask import Flask, render_template, jsonify, request +import json +import os +import subprocess +from threading import Thread +import time + +# Import du système de plugins +from plugins import get_plugin, get_available_plugins, PLUGINS +from plugins import get_media_plugin, get_available_media_plugins, MEDIA_PLUGINS + +app = Flask(__name__) +app.config['SECRET_KEY'] = 'votre-cle-secrete-ici' + +# Fichiers de configuration +CONFIG_FILE = 'config.json' + +# Plugins actifs (initialisés au démarrage) +active_plugin = None +plexamp_plugin = None + +# Configuration par défaut +DEFAULT_CONFIG = { + "active_plugin": "librehardwaremonitor", + "theme": "dark", + "apps": [], + "apps_tab": "", + "plugins": { + "librehardwaremonitor": { + "host": "127.0.0.1", + "port": 8085 + }, + "hwinfo": { + "host": "127.0.0.1", + "port": 60000 + } + }, + "media": { + "plexamp": { + "enabled": False, + "host": "127.0.0.1", + "port": 32400, + "token": "" + } + } +} + +DEFAULT_PLUGIN_CONFIG = { + "tabs": [ + { + "id": "tab1", + "name": "Général", + "sensors": [] + } + ] +} + + +# ==================== Gestion de la configuration ==================== + +def load_config(): + """Charge la configuration globale""" + if os.path.exists(CONFIG_FILE): + try: + with open(CONFIG_FILE, 'r', encoding='utf-8') as f: + config = json.load(f) + # Fusionner avec les valeurs par défaut + for key, value in DEFAULT_CONFIG.items(): + if key not in config: + config[key] = value + return config + except Exception as e: + print(f"Erreur chargement config: {e}") + return DEFAULT_CONFIG.copy() + return DEFAULT_CONFIG.copy() + + +def save_config(config): + """Sauvegarde la configuration globale""" + with open(CONFIG_FILE, 'w', encoding='utf-8') as f: + json.dump(config, f, indent=2, ensure_ascii=False) + + +def get_plugin_config_file(plugin_id): + """Retourne le nom du fichier de config pour un plugin""" + return f'config_{plugin_id}.json' + + +def load_plugin_config(plugin_id): + """Charge la configuration spécifique à un plugin""" + config_file = get_plugin_config_file(plugin_id) + if os.path.exists(config_file): + try: + with open(config_file, 'r', encoding='utf-8') as f: + return json.load(f) + except Exception as e: + print(f"Erreur chargement config plugin {plugin_id}: {e}") + return DEFAULT_PLUGIN_CONFIG.copy() + return DEFAULT_PLUGIN_CONFIG.copy() + + +def save_plugin_config(plugin_id, config): + """Sauvegarde la configuration spécifique à un plugin""" + config_file = get_plugin_config_file(plugin_id) + with open(config_file, 'w', encoding='utf-8') as f: + json.dump(config, f, indent=2, ensure_ascii=False) + + +def get_merged_config(): + """ + Retourne une config fusionnée (global + plugin actif) + Pour compatibilité avec le code existant + """ + global_config = load_config() + plugin_id = global_config.get('active_plugin', 'librehardwaremonitor') + plugin_config = load_plugin_config(plugin_id) + + # Fusionner + merged = global_config.copy() + merged['tabs'] = plugin_config.get('tabs', []) + + return merged + + +def save_merged_config(config): + """ + Sauvegarde une config fusionnée + Sépare les données globales et plugin + """ + global_config = load_config() + plugin_id = global_config.get('active_plugin', 'librehardwaremonitor') + + # Extraire les données plugin + plugin_config = { + 'tabs': config.get('tabs', []) + } + + # Mettre à jour la config globale + global_config['theme'] = config.get('theme', 'dark') + global_config['apps'] = config.get('apps', []) + global_config['apps_tab'] = config.get('apps_tab', '') + + # Sauvegarder les deux + save_config(global_config) + save_plugin_config(plugin_id, plugin_config) + + +# ==================== Gestion du plugin actif ==================== + +def init_plugin(): + """Initialise le plugin actif""" + global active_plugin + + config = load_config() + plugin_id = config.get('active_plugin', 'librehardwaremonitor') + plugin_config = config.get('plugins', {}).get(plugin_id, {}) + + try: + active_plugin = get_plugin(plugin_id, plugin_config) + print(f"Plugin initialisé: {active_plugin.get_name()}") + except Exception as e: + print(f"Erreur initialisation plugin {plugin_id}: {e}") + # Fallback sur LHM + active_plugin = get_plugin('librehardwaremonitor', {'host': '127.0.0.1', 'port': 8085}) + + +def switch_plugin(plugin_id): + """Change le plugin actif""" + global active_plugin + + config = load_config() + plugin_config = config.get('plugins', {}).get(plugin_id, {}) + + try: + active_plugin = get_plugin(plugin_id, plugin_config) + config['active_plugin'] = plugin_id + save_config(config) + print(f"Plugin changé: {active_plugin.get_name()}") + return True + except Exception as e: + print(f"Erreur changement plugin: {e}") + return False + + +# ==================== Thread d'historique ==================== + +def update_history_loop(): + """Boucle pour mettre à jour l'historique des capteurs""" + global active_plugin + + while True: + if active_plugin: + try: + data = active_plugin.get_data() + if data: + sensors = active_plugin.parse_sensors(data) + active_plugin.update_history(sensors) + except Exception as e: + print(f"Erreur update history: {e}") + time.sleep(1) + + +# ==================== Routes Pages ==================== + +@app.route('/') +def index(): + """Page d'accueil - redirige vers dashboard""" + return render_template('dashboard.html') + + +@app.route('/admin') +def admin(): + """Page d'administration""" + return render_template('admin.html') + + +@app.route('/dashboard') +def dashboard(): + """Page de dashboard""" + return render_template('dashboard.html') + + +# ==================== API Plugins ==================== + +@app.route('/api/plugins') +def api_plugins_list(): + """Liste des plugins disponibles""" + plugins = get_available_plugins() + config = load_config() + active_id = config.get('active_plugin', 'librehardwaremonitor') + + # Ajouter l'état actif + for plugin in plugins: + plugin['active'] = plugin['id'] == active_id + plugin['config'] = config.get('plugins', {}).get(plugin['id'], {}) + + return jsonify(plugins) + + +@app.route('/api/plugins/active') +def api_plugins_active(): + """Retourne le plugin actif""" + global active_plugin + + if not active_plugin: + return jsonify({'error': 'Aucun plugin actif'}), 500 + + config = load_config() + plugin_id = active_plugin.get_id() + + return jsonify({ + 'id': plugin_id, + 'name': active_plugin.get_name(), + 'config': config.get('plugins', {}).get(plugin_id, {}) + }) + + +@app.route('/api/plugins/switch', methods=['POST']) +def api_plugins_switch(): + """Change le plugin actif""" + data = request.get_json() + plugin_id = data.get('plugin_id') + + if not plugin_id or plugin_id not in PLUGINS: + return jsonify({'success': False, 'error': 'Plugin invalide'}), 400 + + if switch_plugin(plugin_id): + return jsonify({'success': True, 'message': f'Plugin changé: {plugin_id}'}) + else: + return jsonify({'success': False, 'error': 'Erreur changement plugin'}), 500 + + +@app.route('/api/plugins/config', methods=['POST']) +def api_plugins_config(): + """Met à jour la configuration d'un plugin""" + data = request.get_json() + plugin_id = data.get('plugin_id') + plugin_config = data.get('config', {}) + + if not plugin_id: + return jsonify({'success': False, 'error': 'Plugin ID requis'}), 400 + + config = load_config() + + if 'plugins' not in config: + config['plugins'] = {} + + config['plugins'][plugin_id] = plugin_config + save_config(config) + + # Si c'est le plugin actif, le réinitialiser + if active_plugin and active_plugin.get_id() == plugin_id: + init_plugin() + + return jsonify({'success': True, 'message': 'Configuration mise à jour'}) + + +@app.route('/api/plugins/test', methods=['POST']) +def api_plugins_test(): + """Teste la connexion d'un plugin""" + data = request.get_json() + plugin_id = data.get('plugin_id') + plugin_config = data.get('config', {}) + + if not plugin_id or plugin_id not in PLUGINS: + return jsonify({'success': False, 'error': 'Plugin invalide'}), 400 + + try: + # Créer une instance temporaire pour tester + test_plugin = get_plugin(plugin_id, plugin_config) + result = test_plugin.test_connection() + return jsonify(result) + except Exception as e: + return jsonify({'success': False, 'error': str(e)}), 500 + + +# ==================== API Capteurs (compatible) ==================== + +@app.route('/api/lhm/sensors') +def api_lhm_sensors(): + """Retourne la liste complète de tous les capteurs""" + global active_plugin + + if not active_plugin: + return jsonify({"error": "Aucun plugin actif"}), 500 + + data = active_plugin.get_data() + if not data: + return jsonify({"error": "Impossible de récupérer les données"}), 500 + + sensors = active_plugin.parse_sensors(data) + + # Grouper par catégorie + grouped = {} + for sensor in sensors: + category = sensor.get('category', 'Autre') + if category not in grouped: + grouped[category] = [] + grouped[category].append(sensor) + + return jsonify(grouped) + + +@app.route('/api/lhm/hierarchy') +def api_lhm_hierarchy(): + """Retourne la structure hiérarchique complète des capteurs""" + global active_plugin + + if not active_plugin: + return jsonify({"error": "Aucun plugin actif"}), 500 + + hierarchy = active_plugin.get_hierarchy() + if not hierarchy: + return jsonify({"error": "Impossible de récupérer les données"}), 500 + + return jsonify(hierarchy) + + +@app.route('/api/lhm/data') +def api_lhm_data(): + """Retourne les données actuelles des capteurs sélectionnés""" + global active_plugin + + if not active_plugin: + return jsonify({"error": "Aucun plugin actif"}), 500 + + config = get_merged_config() + data = active_plugin.get_data() + + if not data: + return jsonify({"error": "Impossible de récupérer les données"}), 500 + + all_sensors = active_plugin.parse_sensors(data) + + # Créer un dictionnaire pour lookup rapide + sensor_dict = {s['id']: s for s in all_sensors} + + # Organiser par onglets + result = { + "tabs": [], + "timestamp": time.time() + } + + for tab in config.get('tabs', []): + tab_data = { + "id": tab['id'], + "name": tab['name'], + "sensors": [] + } + + for sensor_config in tab.get('sensors', []): + sensor_id = sensor_config['id'] + if sensor_id in sensor_dict: + sensor = sensor_dict[sensor_id].copy() + sensor['show_graph'] = sensor_config.get('show_graph', False) + sensor['viz_type'] = sensor_config.get('viz_type', 'line') + sensor['card_size'] = sensor_config.get('card_size', 'medium') + sensor['font_family'] = sensor_config.get('font_family', 'system') + sensor['font_bold'] = sensor_config.get('font_bold', True) + sensor['font_size'] = sensor_config.get('font_size', 'small') + sensor['hide_value_mobile'] = sensor_config.get('hide_value_mobile', False) + sensor['show_type_badge'] = sensor_config.get('show_type_badge', True) + sensor['gauge_options'] = sensor_config.get('gauge_options', {}) + sensor['chart_options'] = sensor_config.get('chart_options', {}) + tab_data['sensors'].append(sensor) + + result['tabs'].append(tab_data) + + return jsonify(result) + + +@app.route('/api/lhm/history/') +def api_lhm_history(sensor_id): + """Retourne l'historique d'un capteur pour le graphique""" + global active_plugin + + if not active_plugin: + return jsonify({"error": "Aucun plugin actif"}), 500 + + # Reconstruire l'ID complet + if not sensor_id.startswith('/'): + sensor_id = '/' + sensor_id + + count = request.args.get('count', 60, type=int) + history = active_plugin.get_history(sensor_id, count) + + return jsonify({ + "sensor_id": sensor_id, + "values": history, + "count": len(history) + }) + + +# ==================== API Configuration ==================== + +@app.route('/api/config') +def api_config_get(): + """Récupère la configuration actuelle (fusionnée)""" + config = get_merged_config() + return jsonify(config) + + +@app.route('/api/config', methods=['POST']) +def api_config_save(): + """Sauvegarde la configuration""" + try: + config = request.get_json() + save_merged_config(config) + return jsonify({"success": True, "message": "Configuration sauvegardée"}) + except Exception as e: + return jsonify({"success": False, "error": str(e)}), 500 + + +# ==================== API Applications ==================== + +@app.route('/api/apps') +def api_apps_list(): + """Liste des applications configurées""" + config = load_config() + return jsonify(config.get('apps', [])) + + +@app.route('/api/apps/launch/', methods=['POST']) +def api_apps_launch(app_id): + """Lance une application""" + config = load_config() + apps = config.get('apps', []) + + if app_id < 0 or app_id >= len(apps): + return jsonify({"success": False, "error": "Application non trouvée"}), 404 + + app_config = apps[app_id] + + try: + subprocess.Popen(app_config['path'], shell=True) + return jsonify({"success": True, "message": f"{app_config['name']} lancée"}) + except Exception as e: + return jsonify({"success": False, "error": str(e)}), 500 + + +# ==================== API Plexamp ==================== + +def init_plexamp(): + """Initialise le plugin Plexamp si configuré""" + global plexamp_plugin + + config = load_config() + plexamp_config = config.get('media', {}).get('plexamp', {}) + + if plexamp_config.get('enabled') and plexamp_config.get('token'): + try: + plexamp_plugin = get_media_plugin('plexamp', plexamp_config) + print(f"Plexamp initialisé sur {plexamp_config.get('host')}:{plexamp_config.get('port')}") + except Exception as e: + print(f"Erreur initialisation Plexamp: {e}") + plexamp_plugin = None + else: + plexamp_plugin = None + + +@app.route('/api/plexamp/status') +def api_plexamp_status(): + """Retourne l'état actuel de lecture Plexamp""" + global plexamp_plugin + + if not plexamp_plugin: + return jsonify({"enabled": False, "error": "Plexamp non configuré"}) + + now_playing = plexamp_plugin.get_now_playing() + + if not now_playing: + return jsonify({"enabled": True, "playing": False, "state": "unknown"}) + + # Ajouter l'URL complète de l'artwork + if now_playing.get('thumb'): + now_playing['artwork_url'] = plexamp_plugin.get_artwork_url(now_playing['thumb']) + + now_playing['enabled'] = True + return jsonify(now_playing) + + +@app.route('/api/plexamp/play', methods=['POST']) +def api_plexamp_play(): + """Reprend la lecture""" + global plexamp_plugin + + if not plexamp_plugin: + return jsonify({"success": False, "error": "Plexamp non configuré"}), 400 + + success = plexamp_plugin.play() + return jsonify({"success": success}) + + +@app.route('/api/plexamp/pause', methods=['POST']) +def api_plexamp_pause(): + """Met en pause""" + global plexamp_plugin + + if not plexamp_plugin: + return jsonify({"success": False, "error": "Plexamp non configuré"}), 400 + + success = plexamp_plugin.pause() + return jsonify({"success": success}) + + +@app.route('/api/plexamp/playpause', methods=['POST']) +def api_plexamp_playpause(): + """Toggle play/pause""" + global plexamp_plugin + + if not plexamp_plugin: + return jsonify({"success": False, "error": "Plexamp non configuré"}), 400 + + success = plexamp_plugin.play_pause() + return jsonify({"success": success}) + + +@app.route('/api/plexamp/next', methods=['POST']) +def api_plexamp_next(): + """Piste suivante""" + global plexamp_plugin + + if not plexamp_plugin: + return jsonify({"success": False, "error": "Plexamp non configuré"}), 400 + + success = plexamp_plugin.next_track() + return jsonify({"success": success}) + + +@app.route('/api/plexamp/prev', methods=['POST']) +def api_plexamp_prev(): + """Piste précédente""" + global plexamp_plugin + + if not plexamp_plugin: + return jsonify({"success": False, "error": "Plexamp non configuré"}), 400 + + success = plexamp_plugin.prev_track() + return jsonify({"success": success}) + + +@app.route('/api/plexamp/seek', methods=['POST']) +def api_plexamp_seek(): + """Aller à une position""" + global plexamp_plugin + + if not plexamp_plugin: + return jsonify({"success": False, "error": "Plexamp non configuré"}), 400 + + data = request.get_json() + position = data.get('position', 0) + + success = plexamp_plugin.seek(int(position)) + return jsonify({"success": success}) + + +@app.route('/api/plexamp/config', methods=['GET']) +def api_plexamp_config_get(): + """Récupère la config Plexamp""" + config = load_config() + plexamp_config = config.get('media', {}).get('plexamp', {}) + # Ne pas renvoyer le token complet pour la sécurité + safe_config = { + 'enabled': plexamp_config.get('enabled', False), + 'host': plexamp_config.get('host', '127.0.0.1'), + 'port': plexamp_config.get('port', 32400), + 'has_token': bool(plexamp_config.get('token')) + } + return jsonify(safe_config) + + +@app.route('/api/plexamp/config', methods=['POST']) +def api_plexamp_config_save(): + """Sauvegarde la config Plexamp""" + global plexamp_plugin + + data = request.get_json() + config = load_config() + + if 'media' not in config: + config['media'] = {} + + config['media']['plexamp'] = { + 'enabled': data.get('enabled', False), + 'host': data.get('host', '127.0.0.1'), + 'port': data.get('port', 32400), + 'token': data.get('token', '') + } + + save_config(config) + + # Réinitialiser le plugin + init_plexamp() + + return jsonify({"success": True, "message": "Configuration Plexamp sauvegardée"}) + + +@app.route('/api/plexamp/test', methods=['POST']) +def api_plexamp_test(): + """Teste la connexion Plexamp""" + data = request.get_json() + + try: + test_plugin = get_media_plugin('plexamp', data) + result = test_plugin.test_connection() + return jsonify(result) + except Exception as e: + return jsonify({"success": False, "error": str(e)}) + + +# ==================== Démarrage ==================== + +if __name__ == '__main__': + # Initialiser les plugins + init_plugin() + init_plexamp() + + # Démarrer le thread d'historique + history_thread = Thread(target=update_history_loop, daemon=True) + history_thread.start() + + config = load_config() + plugin_id = config.get('active_plugin', 'librehardwaremonitor') + plugin_config = config.get('plugins', {}).get(plugin_id, {}) + plexamp_config = config.get('media', {}).get('plexamp', {}) + + print("=" * 60) + print("PC Monitor - Serveur de monitoring v1.2.2") + print("=" * 60) + print(f"Plugin actif: {plugin_id}") + print(f"Hôte: {plugin_config.get('host', '127.0.0.1')}") + print(f"Port: {plugin_config.get('port', 'N/A')}") + print("-" * 60) + if plexamp_config.get('enabled'): + print(f"Plexamp: activé ({plexamp_config.get('host')}:{plexamp_config.get('port')})") + else: + print("Plexamp: désactivé") + print("-" * 60) + print(f"Admin: http://localhost:5000/admin") + print(f"Dashboard: http://localhost:5000/dashboard") + print("=" * 60) + + app.run(host='0.0.0.0', port=5000, debug=True) diff --git a/config.json b/config.json new file mode 100644 index 0000000..672f643 --- /dev/null +++ b/config.json @@ -0,0 +1,30 @@ +{ + "active_plugin": "hwinfo", + "theme": "dark", + "apps": [ + { + "icon": "🚀", + "name": "plex", + "path": "C:\\Users\\tech\\AppData\\Local\\Programs\\Plexamp\\Plexamp.exe" + } + ], + "apps_tab": "tab1770970837781", + "plugins": { + "librehardwaremonitor": { + "host": "127.0.0.1", + "port": 8085 + }, + "hwinfo": { + "host": "127.0.0.1", + "port": 60000 + } + }, + "media": { + "plexamp": { + "enabled": true, + "host": "192.168.1.235", + "port": 32400, + "token": "ihycwfjqNtqndjWbziko" + } + } +} \ No newline at end of file diff --git a/config_hwinfo.json b/config_hwinfo.json new file mode 100644 index 0000000..c54854a --- /dev/null +++ b/config_hwinfo.json @@ -0,0 +1,135 @@ +{ + "tabs": [ + { + "id": "tab1", + "name": "Général", + "sensors": [ + { + "id": "/hwinfo/GPU_0__NVIDIA_GeForce_RTX_3080_Ti__MSI_RTX_3080_Ti_Ventus_3x_OC_Limite_de_performance_-_Thermique", + "name": "Limite de performance - Thermique", + "show_graph": false, + "type": "percentage", + "viz_type": "none" + }, + { + "id": "/hwinfo/Windows_Hardware_Errors_(WHEA)_Total_des_erreurs", + "name": "Total des erreurs", + "show_graph": false, + "type": "generic", + "viz_type": "none" + }, + { + "id": "/hwinfo/CPU_0__Intel_Core_i5-14600KF__DTS_CPU_Entier", + "name": "CPU Entier", + "show_graph": false, + "type": "temperature", + "viz_type": "none" + }, + { + "id": "/hwinfo/CPU_0__Intel_Core_i5-14600KF__DTS_Étranglement_thermique_de_paquet_anneau", + "name": "Étranglement thermique de paquet/anneau", + "show_graph": false, + "type": "percentage", + "viz_type": "none" + }, + { + "card_size": "xs", + "chart_options": { + "height": "xs" + }, + "font_bold": false, + "font_family": "opensans", + "font_size": "xs", + "hide_value_mobile": false, + "id": "/hwinfo/GPU_0__NVIDIA_GeForce_RTX_3080_Ti__MSI_RTX_3080_Ti_Ventus_3x_OC_Température_GPU", + "name": "Température GPU", + "show_graph": true, + "show_type_badge": false, + "type": "temperature", + "viz_type": "line" + }, + { + "card_size": "xs", + "chart_options": { + "height": "xs" + }, + "font_bold": false, + "font_family": "opensans", + "font_size": "small", + "hide_value_mobile": false, + "id": "/hwinfo/0_134217729_Mémoire_virtuelle_disponible", + "name": "Mémoire virtuelle disponible", + "show_graph": true, + "show_type_badge": false, + "type": "generic", + "viz_type": "line" + }, + { + "card_size": "tiny", + "font_bold": false, + "font_family": "opensans", + "font_size": "xs", + "hide_value_mobile": false, + "id": "/hwinfo/0_134217730_Charge_de_mémoire_virtuelle", + "name": "Charge de mémoire virtuelle", + "show_graph": false, + "show_type_badge": false, + "type": "percentage", + "viz_type": "none" + }, + { + "card_size": "xs", + "font_bold": false, + "font_family": "opensans", + "font_size": "xs", + "hide_value_mobile": false, + "id": "/hwinfo/2_134217740_Étranglement_thermique_de_paquet_anneau", + "name": "Étranglement thermique de paquet/anneau", + "show_graph": false, + "show_type_badge": false, + "type": "generic", + "viz_type": "none" + }, + { + "card_size": "xs", + "font_bold": false, + "font_family": "opensans", + "font_size": "xs", + "gauge_options": { + "show_value": true, + "size": "xs", + "style": "semicircle" + }, + "hide_value_mobile": false, + "id": "/hwinfo/22_16777216_Diode_thermique_GPU", + "name": "Diode thermique GPU", + "show_graph": true, + "show_type_badge": false, + "type": "temperature", + "viz_type": "gauge" + }, + { + "card_size": "xs", + "chart_options": { + "height": "xs" + }, + "font_bold": false, + "font_family": "opensans", + "font_size": "xs", + "hide_value_mobile": false, + "id": "/hwinfo/2_16777470_CPU_Entier", + "name": "CPU Entier", + "show_graph": true, + "show_type_badge": false, + "type": "temperature", + "viz_type": "line" + } + ] + }, + { + "id": "tab1770970837781", + "name": "apps", + "sensors": [] + } + ] +} \ No newline at end of file diff --git a/config_librehardwaremonitor.json b/config_librehardwaremonitor.json new file mode 100644 index 0000000..b1e7b91 --- /dev/null +++ b/config_librehardwaremonitor.json @@ -0,0 +1,240 @@ +{ + "tabs": [ + { + "id": "tab1", + "name": "Général", + "sensors": [ + { + "card_size": "tiny", + "font_bold": false, + "font_family": "opensans", + "font_size": "tiny", + "hide_value_mobile": false, + "id": "/lpc/nct6687d/0/fan/0", + "name": "CPU Fan", + "show_graph": false, + "show_type_badge": false, + "type": "fan", + "viz_type": "none" + }, + { + "card_size": "tiny", + "font_bold": false, + "font_family": "opensans", + "font_size": "tiny", + "gauge_options": { + "show_value": false, + "size": "xs", + "style": "semicircle" + }, + "hide_value_mobile": false, + "id": "/intelcpu/0/power/0", + "name": "CPU Package", + "show_graph": false, + "show_type_badge": false, + "type": "power", + "viz_type": "none" + }, + { + "card_size": "xs", + "font_bold": false, + "font_family": "opensans", + "font_size": "xs", + "hide_value_mobile": false, + "id": "/intelcpu/0/load/0", + "name": "CPU Total", + "show_graph": false, + "show_type_badge": false, + "type": "percentage", + "viz_type": "none" + }, + { + "card_size": "xs", + "font_bold": false, + "font_family": "system", + "font_size": "xs", + "hide_value_mobile": false, + "id": "/ram/load/0", + "name": "Memory", + "show_graph": false, + "show_type_badge": false, + "type": "percentage", + "viz_type": "none" + }, + { + "card_size": "xs", + "font_bold": false, + "font_family": "system", + "font_size": "small", + "hide_value_mobile": false, + "id": "/vram/data/2", + "name": "Memory Used", + "show_graph": false, + "show_type_badge": false, + "type": "memory", + "viz_type": "none" + }, + { + "card_size": "xs", + "chart_options": { + "height": "xs" + }, + "font_bold": true, + "font_family": "opensans", + "font_size": "large", + "hide_value_mobile": false, + "id": "/gpu-nvidia/0/power/0", + "name": "GPU Package", + "show_graph": true, + "show_type_badge": false, + "type": "power", + "viz_type": "line" + }, + { + "card_size": "small", + "chart_options": { + "height": "xs" + }, + "font_bold": false, + "font_family": "opensans", + "font_size": "xs", + "gauge_options": { + "show_value": false, + "size": "xs", + "style": "arc" + }, + "hide_value_mobile": false, + "id": "/gpu-nvidia/0/clock/4", + "name": "GPU Memory", + "show_graph": true, + "show_type_badge": false, + "type": "frequency", + "viz_type": "line" + }, + { + "card_size": "xs", + "chart_options": { + "height": "xs" + }, + "font_bold": false, + "font_family": "system", + "font_size": "xs", + "hide_value_mobile": false, + "id": "/lpc/nct6687d/0/temperature/0", + "name": "CPU", + "show_graph": true, + "show_type_badge": false, + "type": "temperature", + "viz_type": "line" + }, + { + "card_size": "xs", + "font_bold": false, + "font_family": "opensans", + "font_size": "small", + "gauge_options": { + "show_value": false, + "size": "tiny", + "style": "arc" + }, + "hide_value_mobile": false, + "id": "/gpu-nvidia/0/clock/0", + "name": "GPU Core", + "show_graph": true, + "show_type_badge": false, + "type": "frequency", + "viz_type": "gauge" + }, + { + "card_size": "xs", + "font_bold": false, + "font_family": "roboto", + "font_size": "xs", + "gauge_options": { + "show_value": false, + "size": "tiny", + "style": "arc" + }, + "hide_value_mobile": false, + "id": "/gpu-nvidia/0/temperature/0", + "name": "GPU Core", + "show_graph": true, + "show_type_badge": false, + "type": "temperature", + "viz_type": "gauge" + }, + { + "card_size": "tiny", + "font_bold": true, + "font_family": "opensans", + "font_size": "tiny", + "gauge_options": { + "show_value": false, + "size": "xs", + "style": "semicircle" + }, + "hide_value_mobile": false, + "id": "/gpu-nvidia/0/smalldata/1", + "name": "GPU Memory Used", + "show_graph": false, + "show_type_badge": false, + "type": "memory", + "viz_type": "none" + }, + { + "card_size": "xs", + "chart_options": { + "height": "xs" + }, + "font_bold": false, + "font_family": "opensans", + "font_size": "tiny", + "hide_value_mobile": false, + "id": "/nic/%7BD712B4D3-745F-4969-BC51-728433D0605D%7D/load/1", + "name": "Network Utilization", + "show_graph": true, + "show_type_badge": false, + "type": "percentage", + "viz_type": "line" + }, + { + "card_size": "xs", + "chart_options": { + "height": "xs" + }, + "font_bold": false, + "font_family": "opensans", + "font_size": "small", + "hide_value_mobile": false, + "id": "/nic/%7BD712B4D3-745F-4969-BC51-728433D0605D%7D/throughput/7", + "name": "Upload Speed", + "show_graph": true, + "show_type_badge": false, + "type": "percentage", + "viz_type": "line" + }, + { + "card_size": "xs", + "chart_options": { + "height": "xs" + }, + "font_bold": false, + "font_family": "opensans", + "font_size": "small", + "hide_value_mobile": false, + "id": "/nic/%7BD712B4D3-745F-4969-BC51-728433D0605D%7D/throughput/8", + "name": "Download Speed", + "show_graph": true, + "show_type_badge": false, + "type": "percentage", + "viz_type": "line" + } + ] + }, + { + "id": "tab2", + "name": "Application", + "sensors": [] + } + ] +} \ No newline at end of file diff --git a/diagnostic.py b/diagnostic.py new file mode 100644 index 0000000..d1383a5 --- /dev/null +++ b/diagnostic.py @@ -0,0 +1,113 @@ +""" +Script de diagnostic pour tester la connexion à LibreHardwareMonitor +""" +import socket +import urllib.request +import sys + +print("=" * 60) +print("DIAGNOSTIC DE CONNEXION À LIBREHARDWAREMONITOR") +print("=" * 60) + +# Test 1: Résolution DNS de localhost +print("\n[1] Résolution DNS de 'localhost'...") +try: + ip = socket.gethostbyname('localhost') + print(f" ✅ localhost résolu en: {ip}") +except Exception as e: + print(f" ❌ Erreur: {e}") + +# Test 2: Vérifier toutes les adresses pour localhost +print("\n[2] Toutes les adresses pour 'localhost'...") +try: + infos = socket.getaddrinfo('localhost', 8085) + for info in infos: + print(f" → {info[0].name}: {info[4]}") +except Exception as e: + print(f" ❌ Erreur: {e}") + +# Test 3: Connexion socket directe sur 127.0.0.1 +print("\n[3] Test connexion socket sur 127.0.0.1:8085...") +try: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(5) + result = sock.connect_ex(('127.0.0.1', 8085)) + sock.close() + if result == 0: + print(" ✅ Port 8085 ouvert sur 127.0.0.1") + else: + print(f" ❌ Port fermé (code: {result})") +except Exception as e: + print(f" ❌ Erreur: {e}") + +# Test 4: Connexion socket directe sur localhost +print("\n[4] Test connexion socket sur localhost:8085...") +try: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(5) + result = sock.connect_ex(('localhost', 8085)) + sock.close() + if result == 0: + print(" ✅ Port 8085 ouvert sur localhost") + else: + print(f" ❌ Port fermé (code: {result})") +except Exception as e: + print(f" ❌ Erreur: {e}") + +# Test 5: Requête HTTP avec urllib (sans requests) +print("\n[5] Test HTTP avec urllib sur 127.0.0.1...") +try: + req = urllib.request.urlopen('http://127.0.0.1:8085/data.json', timeout=5) + data = req.read() + print(f" ✅ Réponse reçue! ({len(data)} bytes)") + print(f" Début: {data[:100]}...") +except Exception as e: + print(f" ❌ Erreur: {e}") + +# Test 6: Requête HTTP avec urllib sur localhost +print("\n[6] Test HTTP avec urllib sur localhost...") +try: + req = urllib.request.urlopen('http://localhost:8085/data.json', timeout=5) + data = req.read() + print(f" ✅ Réponse reçue! ({len(data)} bytes)") +except Exception as e: + print(f" ❌ Erreur: {e}") + +# Test 7: Requête avec requests (si disponible) +print("\n[7] Test HTTP avec requests sur 127.0.0.1...") +try: + import requests + resp = requests.get('http://127.0.0.1:8085/data.json', timeout=5) + print(f" ✅ Réponse reçue! Status: {resp.status_code}, {len(resp.content)} bytes") +except ImportError: + print(" ⚠️ Module requests non installé") +except Exception as e: + print(f" ❌ Erreur: {e}") + +# Test 8: Requête avec requests sur localhost +print("\n[8] Test HTTP avec requests sur localhost...") +try: + import requests + resp = requests.get('http://localhost:8085/data.json', timeout=5) + print(f" ✅ Réponse reçue! Status: {resp.status_code}") +except ImportError: + print(" ⚠️ Module requests non installé") +except Exception as e: + print(f" ❌ Erreur: {e}") + +print("\n" + "=" * 60) +print("RECOMMANDATION:") +print("=" * 60) +print(""" +Si les tests 3-4 échouent mais que le navigateur fonctionne: + → Vérifiez le pare-feu Windows (autorisez Python) + +Si les tests avec 127.0.0.1 réussissent mais localhost échoue: + → Problème IPv6, utilisez 127.0.0.1 dans la config + +Si tout échoue sauf le navigateur: + → Un proxy ou antivirus bloque peut-être Python + → Essayez de désactiver temporairement l'antivirus +""") + +input("\nAppuyez sur Entrée pour fermer...") diff --git a/output/Pc-monitor/Pc-monitor.exe b/output/Pc-monitor/Pc-monitor.exe new file mode 100644 index 0000000..e11a2ac Binary files /dev/null and b/output/Pc-monitor/Pc-monitor.exe differ diff --git a/output/Pc-monitor/_internal/MarkupSafe-3.0.2.dist-info/INSTALLER b/output/Pc-monitor/_internal/MarkupSafe-3.0.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/output/Pc-monitor/_internal/MarkupSafe-3.0.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/output/Pc-monitor/_internal/MarkupSafe-3.0.2.dist-info/LICENSE.txt b/output/Pc-monitor/_internal/MarkupSafe-3.0.2.dist-info/LICENSE.txt new file mode 100644 index 0000000..9d227a0 --- /dev/null +++ b/output/Pc-monitor/_internal/MarkupSafe-3.0.2.dist-info/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/output/Pc-monitor/_internal/MarkupSafe-3.0.2.dist-info/METADATA b/output/Pc-monitor/_internal/MarkupSafe-3.0.2.dist-info/METADATA new file mode 100644 index 0000000..82261f2 --- /dev/null +++ b/output/Pc-monitor/_internal/MarkupSafe-3.0.2.dist-info/METADATA @@ -0,0 +1,92 @@ +Metadata-Version: 2.1 +Name: MarkupSafe +Version: 3.0.2 +Summary: Safely add untrusted strings to HTML/XML markup. +Maintainer-email: Pallets +License: Copyright 2010 Pallets + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://markupsafe.palletsprojects.com/ +Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/ +Project-URL: Source, https://github.com/pallets/markupsafe/ +Project-URL: Chat, https://discord.gg/pallets +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Classifier: Typing :: Typed +Requires-Python: >=3.9 +Description-Content-Type: text/markdown +License-File: LICENSE.txt + +# MarkupSafe + +MarkupSafe implements a text object that escapes characters so it is +safe to use in HTML and XML. Characters that have special meanings are +replaced so that they display as the actual characters. This mitigates +injection attacks, meaning untrusted user input can safely be displayed +on a page. + + +## Examples + +```pycon +>>> from markupsafe import Markup, escape + +>>> # escape replaces special characters and wraps in Markup +>>> escape("") +Markup('<script>alert(document.cookie);</script>') + +>>> # wrap in Markup to mark text "safe" and prevent escaping +>>> Markup("Hello") +Markup('hello') + +>>> escape(Markup("Hello")) +Markup('hello') + +>>> # Markup is a str subclass +>>> # methods and operators escape their arguments +>>> template = Markup("Hello {name}") +>>> template.format(name='"World"') +Markup('Hello "World"') +``` + +## Donate + +The Pallets organization develops and supports MarkupSafe and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +[please donate today][]. + +[please donate today]: https://palletsprojects.com/donate diff --git a/output/Pc-monitor/_internal/MarkupSafe-3.0.2.dist-info/RECORD b/output/Pc-monitor/_internal/MarkupSafe-3.0.2.dist-info/RECORD new file mode 100644 index 0000000..85747e6 --- /dev/null +++ b/output/Pc-monitor/_internal/MarkupSafe-3.0.2.dist-info/RECORD @@ -0,0 +1,14 @@ +MarkupSafe-3.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +MarkupSafe-3.0.2.dist-info/LICENSE.txt,sha256=RjHsDbX9kKVH4zaBcmTGeYIUM4FG-KyUtKV_lu6MnsQ,1503 +MarkupSafe-3.0.2.dist-info/METADATA,sha256=nhoabjupBG41j_JxPCJ3ylgrZ6Fx8oMCFbiLF9Kafqc,4067 +MarkupSafe-3.0.2.dist-info/RECORD,, +MarkupSafe-3.0.2.dist-info/WHEEL,sha256=-v_yZ08fSknsoT62oIKG9wp1eCBV9_ao2rO4BeIReTY,101 +MarkupSafe-3.0.2.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 +markupsafe/__init__.py,sha256=pREerPwvinB62tNCMOwqxBS2YHV6R52Wcq1d-rB4Z5o,13609 +markupsafe/__pycache__/__init__.cpython-313.pyc,, +markupsafe/__pycache__/_native.cpython-313.pyc,, +markupsafe/_native.py,sha256=2ptkJ40yCcp9kq3L1NqpgjfpZB-obniYKFFKUOkHh4Q,218 +markupsafe/_speedups.c,sha256=SglUjn40ti9YgQAO--OgkSyv9tXq9vvaHyVhQows4Ok,4353 +markupsafe/_speedups.cp313-win_amd64.pyd,sha256=7MA12j0aUiSeNpFy-98h_pPSqgCpLeRacgp3I-j00Yo,13312 +markupsafe/_speedups.pyi,sha256=LSDmXYOefH4HVpAXuL8sl7AttLw0oXh1njVoVZp2wqQ,42 +markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/output/Pc-monitor/_internal/MarkupSafe-3.0.2.dist-info/WHEEL b/output/Pc-monitor/_internal/MarkupSafe-3.0.2.dist-info/WHEEL new file mode 100644 index 0000000..8f7c5e9 --- /dev/null +++ b/output/Pc-monitor/_internal/MarkupSafe-3.0.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.2.0) +Root-Is-Purelib: false +Tag: cp313-cp313-win_amd64 + diff --git a/output/Pc-monitor/_internal/MarkupSafe-3.0.2.dist-info/top_level.txt b/output/Pc-monitor/_internal/MarkupSafe-3.0.2.dist-info/top_level.txt new file mode 100644 index 0000000..75bf729 --- /dev/null +++ b/output/Pc-monitor/_internal/MarkupSafe-3.0.2.dist-info/top_level.txt @@ -0,0 +1 @@ +markupsafe diff --git a/output/Pc-monitor/_internal/VCRUNTIME140.dll b/output/Pc-monitor/_internal/VCRUNTIME140.dll new file mode 100644 index 0000000..411009b Binary files /dev/null and b/output/Pc-monitor/_internal/VCRUNTIME140.dll differ diff --git a/output/Pc-monitor/_internal/VCRUNTIME140_1.dll b/output/Pc-monitor/_internal/VCRUNTIME140_1.dll new file mode 100644 index 0000000..2071f28 Binary files /dev/null and b/output/Pc-monitor/_internal/VCRUNTIME140_1.dll differ diff --git a/output/Pc-monitor/_internal/_asyncio.pyd b/output/Pc-monitor/_internal/_asyncio.pyd new file mode 100644 index 0000000..c978a77 Binary files /dev/null and b/output/Pc-monitor/_internal/_asyncio.pyd differ diff --git a/output/Pc-monitor/_internal/_bz2.pyd b/output/Pc-monitor/_internal/_bz2.pyd new file mode 100644 index 0000000..41d028d Binary files /dev/null and b/output/Pc-monitor/_internal/_bz2.pyd differ diff --git a/output/Pc-monitor/_internal/_ctypes.pyd b/output/Pc-monitor/_internal/_ctypes.pyd new file mode 100644 index 0000000..3b252c8 Binary files /dev/null and b/output/Pc-monitor/_internal/_ctypes.pyd differ diff --git a/output/Pc-monitor/_internal/_decimal.pyd b/output/Pc-monitor/_internal/_decimal.pyd new file mode 100644 index 0000000..f56a562 Binary files /dev/null and b/output/Pc-monitor/_internal/_decimal.pyd differ diff --git a/output/Pc-monitor/_internal/_hashlib.pyd b/output/Pc-monitor/_internal/_hashlib.pyd new file mode 100644 index 0000000..8490f2c Binary files /dev/null and b/output/Pc-monitor/_internal/_hashlib.pyd differ diff --git a/output/Pc-monitor/_internal/_lzma.pyd b/output/Pc-monitor/_internal/_lzma.pyd new file mode 100644 index 0000000..a09953b Binary files /dev/null and b/output/Pc-monitor/_internal/_lzma.pyd differ diff --git a/output/Pc-monitor/_internal/_multiprocessing.pyd b/output/Pc-monitor/_internal/_multiprocessing.pyd new file mode 100644 index 0000000..3eb1f3f Binary files /dev/null and b/output/Pc-monitor/_internal/_multiprocessing.pyd differ diff --git a/output/Pc-monitor/_internal/_overlapped.pyd b/output/Pc-monitor/_internal/_overlapped.pyd new file mode 100644 index 0000000..06553cc Binary files /dev/null and b/output/Pc-monitor/_internal/_overlapped.pyd differ diff --git a/output/Pc-monitor/_internal/_queue.pyd b/output/Pc-monitor/_internal/_queue.pyd new file mode 100644 index 0000000..eef740f Binary files /dev/null and b/output/Pc-monitor/_internal/_queue.pyd differ diff --git a/output/Pc-monitor/_internal/_socket.pyd b/output/Pc-monitor/_internal/_socket.pyd new file mode 100644 index 0000000..a09b9f0 Binary files /dev/null and b/output/Pc-monitor/_internal/_socket.pyd differ diff --git a/output/Pc-monitor/_internal/_ssl.pyd b/output/Pc-monitor/_internal/_ssl.pyd new file mode 100644 index 0000000..68eda16 Binary files /dev/null and b/output/Pc-monitor/_internal/_ssl.pyd differ diff --git a/output/Pc-monitor/_internal/_uuid.pyd b/output/Pc-monitor/_internal/_uuid.pyd new file mode 100644 index 0000000..a42e0a4 Binary files /dev/null and b/output/Pc-monitor/_internal/_uuid.pyd differ diff --git a/output/Pc-monitor/_internal/_wmi.pyd b/output/Pc-monitor/_internal/_wmi.pyd new file mode 100644 index 0000000..44a66e1 Binary files /dev/null and b/output/Pc-monitor/_internal/_wmi.pyd differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-console-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-console-l1-1-0.dll new file mode 100644 index 0000000..279ff50 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-console-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-datetime-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-datetime-l1-1-0.dll new file mode 100644 index 0000000..f8eb932 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-datetime-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-debug-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-debug-l1-1-0.dll new file mode 100644 index 0000000..4d9df62 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-debug-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-errorhandling-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-errorhandling-l1-1-0.dll new file mode 100644 index 0000000..9dfd7d6 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-errorhandling-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-fibers-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-fibers-l1-1-0.dll new file mode 100644 index 0000000..a305516 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-fibers-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-file-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-file-l1-1-0.dll new file mode 100644 index 0000000..a94e902 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-file-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-file-l1-2-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-file-l1-2-0.dll new file mode 100644 index 0000000..be00843 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-file-l1-2-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-file-l2-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-file-l2-1-0.dll new file mode 100644 index 0000000..9246b98 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-file-l2-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-handle-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-handle-l1-1-0.dll new file mode 100644 index 0000000..94d47cc Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-handle-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-heap-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-heap-l1-1-0.dll new file mode 100644 index 0000000..b32a209 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-heap-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-interlocked-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-interlocked-l1-1-0.dll new file mode 100644 index 0000000..fdfcbd7 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-interlocked-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-libraryloader-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-libraryloader-l1-1-0.dll new file mode 100644 index 0000000..48ce96f Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-libraryloader-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-localization-l1-2-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-localization-l1-2-0.dll new file mode 100644 index 0000000..534628e Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-localization-l1-2-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-memory-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-memory-l1-1-0.dll new file mode 100644 index 0000000..8097655 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-memory-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-namedpipe-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-namedpipe-l1-1-0.dll new file mode 100644 index 0000000..c39f26d Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-namedpipe-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-processenvironment-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-processenvironment-l1-1-0.dll new file mode 100644 index 0000000..ef06485 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-processenvironment-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-processthreads-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-processthreads-l1-1-0.dll new file mode 100644 index 0000000..239a61f Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-processthreads-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-processthreads-l1-1-1.dll b/output/Pc-monitor/_internal/api-ms-win-core-processthreads-l1-1-1.dll new file mode 100644 index 0000000..8fcc71c Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-processthreads-l1-1-1.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-profile-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-profile-l1-1-0.dll new file mode 100644 index 0000000..2f4c7e5 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-profile-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-rtlsupport-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-rtlsupport-l1-1-0.dll new file mode 100644 index 0000000..31494d5 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-rtlsupport-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-string-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-string-l1-1-0.dll new file mode 100644 index 0000000..ba71873 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-string-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-synch-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-synch-l1-1-0.dll new file mode 100644 index 0000000..31e9a10 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-synch-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-synch-l1-2-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-synch-l1-2-0.dll new file mode 100644 index 0000000..1f196d1 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-synch-l1-2-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-sysinfo-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-sysinfo-l1-1-0.dll new file mode 100644 index 0000000..47d75e6 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-sysinfo-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-timezone-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-timezone-l1-1-0.dll new file mode 100644 index 0000000..2824efd Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-timezone-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-core-util-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-core-util-l1-1-0.dll new file mode 100644 index 0000000..38c160f Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-core-util-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-crt-conio-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-crt-conio-l1-1-0.dll new file mode 100644 index 0000000..df3dd17 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-crt-conio-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-crt-convert-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-crt-convert-l1-1-0.dll new file mode 100644 index 0000000..af864b3 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-crt-convert-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-crt-environment-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-crt-environment-l1-1-0.dll new file mode 100644 index 0000000..e896a68 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-crt-environment-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-crt-filesystem-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-crt-filesystem-l1-1-0.dll new file mode 100644 index 0000000..94658ad Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-crt-filesystem-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-crt-heap-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-crt-heap-l1-1-0.dll new file mode 100644 index 0000000..ada5d50 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-crt-heap-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-crt-locale-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-crt-locale-l1-1-0.dll new file mode 100644 index 0000000..3dfa0e3 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-crt-locale-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-crt-math-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-crt-math-l1-1-0.dll new file mode 100644 index 0000000..5557f57 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-crt-math-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-crt-process-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-crt-process-l1-1-0.dll new file mode 100644 index 0000000..cd0480d Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-crt-process-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-crt-runtime-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-crt-runtime-l1-1-0.dll new file mode 100644 index 0000000..7aa2d6b Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-crt-runtime-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-crt-stdio-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-crt-stdio-l1-1-0.dll new file mode 100644 index 0000000..e9a21f1 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-crt-stdio-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-crt-string-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-crt-string-l1-1-0.dll new file mode 100644 index 0000000..da316e0 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-crt-string-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-crt-time-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-crt-time-l1-1-0.dll new file mode 100644 index 0000000..e6d3183 Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-crt-time-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/api-ms-win-crt-utility-l1-1-0.dll b/output/Pc-monitor/_internal/api-ms-win-crt-utility-l1-1-0.dll new file mode 100644 index 0000000..9dc8b8b Binary files /dev/null and b/output/Pc-monitor/_internal/api-ms-win-crt-utility-l1-1-0.dll differ diff --git a/output/Pc-monitor/_internal/base_library.zip b/output/Pc-monitor/_internal/base_library.zip new file mode 100644 index 0000000..b19d925 Binary files /dev/null and b/output/Pc-monitor/_internal/base_library.zip differ diff --git a/output/Pc-monitor/_internal/certifi/cacert.pem b/output/Pc-monitor/_internal/certifi/cacert.pem new file mode 100644 index 0000000..9d409da --- /dev/null +++ b/output/Pc-monitor/_internal/certifi/cacert.pem @@ -0,0 +1,4635 @@ + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln +biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF +MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT +d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 +76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ +bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c +6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE +emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd +MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt +MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y +MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y +FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi +aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM +gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB +qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 +lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn +8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 +45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO +UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 +O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC +bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv +GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a +77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC +hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 +92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp +Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w +ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt +Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 +MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 +ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD +VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j +b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq +scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO +xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H +LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX +uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD +yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ +JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q +rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN +BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L +hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB +QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ +HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu +Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg +QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB +BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA +A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb +laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 +awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo +JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw +LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT +VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk +LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb +UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ +QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ +naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls +QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Label: "ACCVRAIZ1" +# Serial: 6828503384748696800 +# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA Global Root CA" +# Serial: 3262 +# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 1 G3" +# Serial: 687049649626669250736271037606554624078720034195 +# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2 G3" +# Serial: 390156079458959257446133169266079962026824725800 +# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE ++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3 G3" +# Serial: 268090761170461462463995952157327242137089239581 +# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Label: "IdenTrust Commercial Root CA 1" +# Serial: 13298821034946342390520003877796839426 +# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU ++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 ++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Label: "IdenTrust Public Sector Root CA 1" +# Serial: 13298821034946342390521976156843933698 +# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 ++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G2" +# Serial: 1246989352 +# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - EC1" +# Serial: 51543124481930649114116133369 +# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +# Label: "CFCA EV ROOT" +# Serial: 407555286 +# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GB CA" +# Serial: 157768595616588414422159278966750757568 +# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d +# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed +# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt +MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg +Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i +YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x +CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG +b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 +HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx +WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX +1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk +u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P +99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r +M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB +BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh +cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 +gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO +ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf +aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Label: "SZAFIR ROOT CA2" +# Serial: 357043034767186914217277344587386743377558296292 +# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 +# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de +# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 +ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw +NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L +cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg +Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN +QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT +3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw +3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 +3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 +BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN +XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF +AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw +8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG +nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP +oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy +d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg +LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA 2" +# Serial: 44979900017204383099463764357512596969 +# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 +# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 +# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB +gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu +QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG +A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz +OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ +VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 +b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA +DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn +0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB +OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE +fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E +Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m +o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i +sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW +OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez +Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS +adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n +3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ +F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf +CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 +XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm +djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ +WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb +AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq +P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko +b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj +XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P +5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi +DrW5viSP +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce +# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 +# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix +DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k +IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT +N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v +dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG +A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh +ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx +QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA +4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 +AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 +4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C +ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV +9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD +gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 +Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq +NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko +LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd +ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I +XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI +M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot +9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V +Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea +j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh +X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ +l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf +bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 +pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK +e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 +vm9qp/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef +# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 +# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN +BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl +bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv +b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ +BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj +YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 +MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 +dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg +QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa +jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi +C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep +lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof +TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Label: "AC RAIZ FNMT-RCM" +# Serial: 485876308206448804701554682760554759 +# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d +# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 +# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx +CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ +WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ +BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG +Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ +yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf +BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz +WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF +tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z +374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC +IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL +mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 +wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS +MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 +ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet +UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H +YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 +LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 +RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM +LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf +77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N +JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm +fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp +6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp +1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B +9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok +RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv +uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 1 O=Amazon +# Subject: CN=Amazon Root CA 1 O=Amazon +# Label: "Amazon Root CA 1" +# Serial: 143266978916655856878034712317230054538369994 +# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 +# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 +# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +rqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 2 O=Amazon +# Subject: CN=Amazon Root CA 2 O=Amazon +# Label: "Amazon Root CA 2" +# Serial: 143266982885963551818349160658925006970653239 +# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 +# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a +# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 ++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +4PsJYGw= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 3 O=Amazon +# Subject: CN=Amazon Root CA 3 O=Amazon +# Label: "Amazon Root CA 3" +# Serial: 143266986699090766294700635381230934788665930 +# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 +# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e +# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +YyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 4 O=Amazon +# Subject: CN=Amazon Root CA 4 O=Amazon +# Label: "Amazon Root CA 4" +# Serial: 143266989758080763974105200630763877849284878 +# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd +# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be +# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +# Serial: 1 +# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Label: "GDCA TrustAUTH R5 ROOT" +# Serial: 9009899650740120186 +# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 +# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 +# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE +BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 +MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w +HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj +Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj +TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u +KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj +qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm +MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 +ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP +zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk +L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC +jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA +HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC +AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm +DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 +COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry +L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf +JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg +IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io +2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV +09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ +XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq +T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe +MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Label: "SSL.com Root Certification Authority RSA" +# Serial: 8875640296558310041 +# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 +# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb +# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE +BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK +DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz +OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R +xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX +qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC +C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 +6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh +/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF +YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E +JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc +US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 +ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm ++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi +M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G +A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV +cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc +Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs +PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ +q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 +cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr +a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I +H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y +K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu +nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf +oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY +Ic2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com Root Certification Authority ECC" +# Serial: 8495723813297216424 +# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e +# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a +# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz +WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 +b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS +b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI +7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg +CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD +VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T +kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ +gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority RSA R2" +# Serial: 6248227494352943350 +# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 +# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a +# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV +BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE +CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy +MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G +A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD +DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq +M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf +OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa +4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 +HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR +aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA +b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ +Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV +PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO +pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu +UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY +MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 +9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW +s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 +Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg +cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM +79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz +/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt +ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm +Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK +QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ +w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi +S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 +mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority ECC" +# Serial: 3182246526754555285 +# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 +# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d +# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx +NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv +bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA +VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku +WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX +5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ +ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg +h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Label: "GlobalSign Root CA - R6" +# Serial: 1417766617973444989252670301619537 +# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae +# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 +# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg +MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx +MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET +MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI +xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k +ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD +aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw +LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw +1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX +k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 +SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h +bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n +WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY +rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce +MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu +bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt +Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 +55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj +vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf +cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz +oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp +nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs +pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v +JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R +8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 +5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GC CA" +# Serial: 44084345621038548146064804565436152554 +# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 +# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 +# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw +CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 +bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg +Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ +BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu +ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS +b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni +eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W +p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T +rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV +57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg +Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +# Issuer: CN=UCA Global G2 Root O=UniTrust +# Subject: CN=UCA Global G2 Root O=UniTrust +# Label: "UCA Global G2 Root" +# Serial: 124779693093741543919145257850076631279 +# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 +# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a +# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH +bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x +CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds +b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr +b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 +kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm +VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R +VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc +C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj +tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY +D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv +j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl +NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 +iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP +O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV +ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj +L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl +1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU +b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV +PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj +y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb +EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg +DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI ++Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy +YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX +UB+K+wb1whnw0A== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Extended Validation Root O=UniTrust +# Subject: CN=UCA Extended Validation Root O=UniTrust +# Label: "UCA Extended Validation Root" +# Serial: 106100277556486529736699587978573607008 +# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 +# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a +# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF +eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx +MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV +BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog +D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS +sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop +O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk +sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi +c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj +VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz +KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ +TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G +sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs +1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD +fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN +l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ +VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 +c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp +4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s +t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj +2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO +vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C +xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx +cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM +fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax +-----END CERTIFICATE----- + +# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Label: "Certigna Root CA" +# Serial: 269714418870597844693661054334862075617 +# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 +# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 +# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw +WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw +MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x +MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD +VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX +BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO +ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M +CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu +I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm +TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh +C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf +ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz +IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT +Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k +JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 +hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB +GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov +L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo +dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr +aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq +hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L +6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG +HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 +0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB +lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi +o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 +gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v +faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 +Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh +jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw +3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign Root CA - G1" +# Serial: 235931866688319308814040 +# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac +# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c +# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD +VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU +ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH +MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO +MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv +Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz +f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO +8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq +d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM +tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt +Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB +o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x +PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM +wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d +GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH +6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby +RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign ECC Root CA - G3" +# Serial: 287880440101571086945156 +# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 +# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 +# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG +EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo +bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ +TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s +b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 +WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS +fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB +zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq +hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB +CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD ++JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Label: "emSign Root CA - C1" +# Serial: 825510296613316004955058 +# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 +# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 +# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG +A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg +SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v +dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ +BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ +HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH +3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH +GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c +xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 +aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq +TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 +/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 +kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG +YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT ++xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo +WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Label: "emSign ECC Root CA - C3" +# Serial: 582948710642506000014504 +# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 +# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 +# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG +EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx +IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND +IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci +MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti +sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O +BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB +Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c +3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J +0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Label: "Hongkong Post Root CA 3" +# Serial: 46170865288971385588281144162979347873371282084 +# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 +# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 +# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 +-----BEGIN CERTIFICATE----- +MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQEL +BQAwbzELMAkGA1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJ +SG9uZyBLb25nMRYwFAYDVQQKEw1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25n +a29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2MDMwMjI5NDZaFw00MjA2MDMwMjI5 +NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtvbmcxEjAQBgNVBAcT +CUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMXSG9u +Z2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCziNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFO +dem1p+/l6TWZ5Mwc50tfjTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mI +VoBc+L0sPOFMV4i707mV78vH9toxdCim5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV +9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOesL4jpNrcyCse2m5FHomY +2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj0mRiikKY +vLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+Tt +bNe/JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZb +x39ri1UbSsUgYT2uy1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+ +l2oBlKN8W4UdKjk60FSh0Tlxnf0h+bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YK +TE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsGxVd7GYYKecsAyVKvQv83j+Gj +Hno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwIDAQABo2MwYTAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e +i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEw +DQYJKoZIhvcNAQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG +7BJ8dNVI0lkUmcDrudHr9EgwW62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCk +MpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWldy8joRTnU+kLBEUx3XZL7av9YROXr +gZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov+BS5gLNdTaqX4fnk +GMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDceqFS +3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJm +Ozj/2ZQw9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+ +l6mc1X5VTMbeRRAc6uk7nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6c +JfTzPV4e0hz5sy229zdcxsshTrD3mUcYhcErulWuBurQB7Lcq9CClnXO0lD+mefP +L5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB60PZ2Pierc+xYw5F9KBa +LJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fqdBb9HxEG +mpv0 +-----END CERTIFICATE----- + +# Issuer: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation +# Subject: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation +# Label: "Microsoft ECC Root Certificate Authority 2017" +# Serial: 136839042543790627607696632466672567020 +# MD5 Fingerprint: dd:a1:03:e6:4a:93:10:d1:bf:f0:19:42:cb:fe:ed:67 +# SHA1 Fingerprint: 99:9a:64:c3:7f:f4:7d:9f:ab:95:f1:47:69:89:14:60:ee:c4:c3:c5 +# SHA256 Fingerprint: 35:8d:f3:9d:76:4a:f9:e1:b7:66:e9:c9:72:df:35:2e:e1:5c:fa:c2:27:af:6a:d1:d7:0e:8e:4a:6e:dc:ba:02 +-----BEGIN CERTIFICATE----- +MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD +VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw +MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV +UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy +b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR +ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb +hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3 +FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV +L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB +iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= +-----END CERTIFICATE----- + +# Issuer: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation +# Subject: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation +# Label: "Microsoft RSA Root Certificate Authority 2017" +# Serial: 40975477897264996090493496164228220339 +# MD5 Fingerprint: 10:ff:00:ff:cf:c9:f8:c7:7a:c0:ee:35:8e:c9:0f:47 +# SHA1 Fingerprint: 73:a5:e6:4a:3b:ff:83:16:ff:0e:dc:cc:61:8a:90:6e:4e:ae:4d:74 +# SHA256 Fingerprint: c7:41:f7:0f:4b:2a:8d:88:bf:2e:71:c1:41:22:ef:53:ef:10:eb:a0:cf:a5:e6:4c:fa:20:f4:18:85:30:73:e0 +-----BEGIN CERTIFICATE----- +MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl +MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw +NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG +EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N +aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ +Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0 +ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1 +HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm +gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ +jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc +aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG +YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6 +W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K +UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH ++FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q +W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC +LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC +gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6 +tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh +SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2 +TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3 +pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR +xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp +GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9 +dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN +AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB +RA+GsCyRxj3qrg+E +-----END CERTIFICATE----- + +# Issuer: CN=e-Szigno Root CA 2017 O=Microsec Ltd. +# Subject: CN=e-Szigno Root CA 2017 O=Microsec Ltd. +# Label: "e-Szigno Root CA 2017" +# Serial: 411379200276854331539784714 +# MD5 Fingerprint: de:1f:f6:9e:84:ae:a7:b4:21:ce:1e:58:7d:d1:84:98 +# SHA1 Fingerprint: 89:d4:83:03:4f:9e:9a:48:80:5f:72:37:d4:a9:a6:ef:cb:7c:1f:d1 +# SHA256 Fingerprint: be:b0:0b:30:83:9b:9b:c3:2c:32:e4:44:79:05:95:06:41:f2:64:21:b1:5e:d0:89:19:8b:51:8a:e2:ea:1b:99 +-----BEGIN CERTIFICATE----- +MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV +BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk +LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv +b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ +BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg +THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v +IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv +xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H +Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB +eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo +jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ ++efcMQ== +-----END CERTIFICATE----- + +# Issuer: O=CERTSIGN SA OU=certSIGN ROOT CA G2 +# Subject: O=CERTSIGN SA OU=certSIGN ROOT CA G2 +# Label: "certSIGN Root CA G2" +# Serial: 313609486401300475190 +# MD5 Fingerprint: 8c:f1:75:8a:c6:19:cf:94:b7:f7:65:20:87:c3:97:c7 +# SHA1 Fingerprint: 26:f9:93:b4:ed:3d:28:27:b0:b9:4b:a7:e9:15:1d:a3:8d:92:e5:32 +# SHA256 Fingerprint: 65:7c:fe:2f:a7:3f:aa:38:46:25:71:f3:32:a2:36:3a:46:fc:e7:02:09:51:71:07:02:cd:fb:b6:ee:da:33:05 +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV +BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g +Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ +BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ +R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF +dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw +vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ +uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp +n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs +cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW +xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P +rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF +DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx +DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy +LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C +eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ +d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq +kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC +b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl +qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0 +OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c +NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk +ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO +pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj +03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk +PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE +1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX +QRBdJ3NghVdJIgc= +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global Certification Authority" +# Serial: 1846098327275375458322922162 +# MD5 Fingerprint: f8:1c:18:2d:2f:ba:5f:6d:a1:6c:bc:c7:ab:91:c7:0e +# SHA1 Fingerprint: 2f:8f:36:4f:e1:58:97:44:21:59:87:a5:2a:9a:d0:69:95:26:7f:b5 +# SHA256 Fingerprint: 97:55:20:15:f5:dd:fc:3c:87:88:c0:06:94:45:55:40:88:94:45:00:84:f1:00:86:70:86:bc:1a:2b:b5:8d:c8 +-----BEGIN CERTIFICATE----- +MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQsw +CQYDVQQGEwJVUzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28x +ITAfBgNVBAoMGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1 +c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMx +OTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJVUzERMA8GA1UECAwI +SWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +ALldUShLPDeS0YLOvR29zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0Xzn +swuvCAAJWX/NKSqIk4cXGIDtiLK0thAfLdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu +7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4BqstTnoApTAbqOl5F2brz8 +1Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9oWN0EACyW +80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotP +JqX+OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1l +RtzuzWniTY+HKE40Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfw +hI0Vcnyh78zyiGG69Gm7DIwLdVcEuE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10 +coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm+9jaJXLE9gCxInm943xZYkqc +BW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqjifLJS3tBEW1n +twiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1Ud +DwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W +0OhUKDtkLSGm+J1WE2pIPU/HPinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfe +uyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0HZJDmHvUqoai7PF35owgLEQzxPy0Q +lG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla4gt5kNdXElE1GYhB +aCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5RvbbE +sLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPT +MaCm/zjdzyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qe +qu5AvzSxnI9O4fKSTx+O856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxh +VicGaeVyQYHTtgGJoC86cnn+OjC/QezHYj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8 +h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu3R3y4G5OBVixwJAWKqQ9 +EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP29FpHOTK +yeC2nOnOcXHebD8WpHk= +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global ECC P256 Certification Authority" +# Serial: 4151900041497450638097112925 +# MD5 Fingerprint: 5b:44:e3:8d:5d:36:86:26:e8:0d:05:d2:59:a7:83:54 +# SHA1 Fingerprint: b4:90:82:dd:45:0c:be:8b:5b:b1:66:d3:e2:a4:08:26:cd:ed:42:cf +# SHA256 Fingerprint: 94:5b:bc:82:5e:a5:54:f4:89:d1:fd:51:a7:3d:df:2e:a6:24:ac:70:19:a0:52:05:22:5c:22:a7:8c:cf:a8:b4 +-----BEGIN CERTIFICATE----- +MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf +BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 +YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x +NzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYDVQQGEwJVUzERMA8G +A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 +d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF +Q0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqG +SM49AwEHA0IABH77bOYj43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoN +FWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqmP62jQzBBMA8GA1UdEwEB/wQFMAMBAf8w +DwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt0UrrdaVKEJmzsaGLSvcw +CgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjzRM4q3wgh +DDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global ECC P384 Certification Authority" +# Serial: 2704997926503831671788816187 +# MD5 Fingerprint: ea:cf:60:c4:3b:b9:15:29:40:a1:97:ed:78:27:93:d6 +# SHA1 Fingerprint: e7:f3:a3:c8:cf:6f:c3:04:2e:6d:0e:67:32:c5:9e:68:95:0d:5e:d2 +# SHA256 Fingerprint: 55:90:38:59:c8:c0:c3:eb:b8:75:9e:ce:4e:25:57:22:5f:f5:75:8b:bd:38:eb:d4:82:76:60:1e:1b:d5:80:97 +-----BEGIN CERTIFICATE----- +MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf +BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 +YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x +NzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYDVQQGEwJVUzERMA8G +A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 +d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF +Q0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuB +BAAiA2IABGvaDXU1CDFHBa5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJ +j9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr/TklZvFe/oyujUF5nQlgziip04pt89ZF +1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNVHQ8BAf8EBQMDBwYAMB0G +A1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNnADBkAjA3 +AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsC +MGclCrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVu +Sw== +-----END CERTIFICATE----- + +# Issuer: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. +# Subject: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. +# Label: "NAVER Global Root Certification Authority" +# Serial: 9013692873798656336226253319739695165984492813 +# MD5 Fingerprint: c8:7e:41:f6:25:3b:f5:09:b3:17:e8:46:3d:bf:d0:9b +# SHA1 Fingerprint: 8f:6b:f2:a9:27:4a:da:14:a0:c4:f4:8e:61:27:f9:c0:1e:78:5d:d1 +# SHA256 Fingerprint: 88:f4:38:dc:f8:ff:d1:fa:8f:42:91:15:ff:e5:f8:2a:e1:e0:6e:0c:70:c3:75:fa:ad:71:7b:34:a4:9e:72:65 +-----BEGIN CERTIFICATE----- +MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEM +BQAwaTELMAkGA1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRG +T1JNIENvcnAuMTIwMAYDVQQDDClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4NDJaFw0zNzA4MTgyMzU5NTlaMGkx +CzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVTUyBQTEFURk9STSBD +b3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVA +iQqrDZBbUGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH +38dq6SZeWYp34+hInDEW+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lE +HoSTGEq0n+USZGnQJoViAbbJAh2+g1G7XNr4rRVqmfeSVPc0W+m/6imBEtRTkZaz +kVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2aacp+yPOiNgSnABIqKYP +szuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4Yb8Obtoq +vC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHf +nZ3zVHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaG +YQ5fG8Ir4ozVu53BA0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo +0es+nPxdGoMuK8u180SdOqcXYZaicdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3a +CJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejyYhbLgGvtPe31HzClrkvJE+2K +AQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNVHQ4EFgQU0p+I +36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoN +qo0hV4/GPnrK21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatj +cu3cvuzHV+YwIHHW1xDBE1UBjCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm ++LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bxhYTeodoS76TiEJd6eN4MUZeoIUCL +hr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTgE34h5prCy8VCZLQe +lHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTHD8z7 +p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8 +piKCk5XQA76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLR +LBT/DShycpWbXgnbiUSYqqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX +5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oGI/hGoiLtk/bdmuYqh7GYVPEi92tF4+KO +dh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmgkpzNNIaRkPpkUZ3+/uul +9XXeifdy +-----END CERTIFICATE----- + +# Issuer: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres +# Subject: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres +# Label: "AC RAIZ FNMT-RCM SERVIDORES SEGUROS" +# Serial: 131542671362353147877283741781055151509 +# MD5 Fingerprint: 19:36:9c:52:03:2f:d2:d1:bb:23:cc:dd:1e:12:55:bb +# SHA1 Fingerprint: 62:ff:d9:9e:c0:65:0d:03:ce:75:93:d2:ed:3f:2d:32:c9:e3:e5:4a +# SHA256 Fingerprint: 55:41:53:b1:3d:2c:f9:dd:b7:53:bf:be:1a:4e:0a:e0:8d:0a:a4:18:70:58:fe:60:a2:b8:62:b2:e4:b8:7b:cb +-----BEGIN CERTIFICATE----- +MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQsw +CQYDVQQGEwJFUzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgw +FgYDVQRhDA9WQVRFUy1RMjgyNjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1S +Q00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4MTIyMDA5MzczM1oXDTQzMTIyMDA5 +MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQtUkNNMQ4wDAYDVQQL +DAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNBQyBS +QUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LH +sbI6GA60XYyzZl2hNPk2LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oK +Um8BA06Oi6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqGSM49BAMDA2kAMGYCMQCu +SuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoDzBOQn5IC +MQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJy +v+c= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign Root R46 O=GlobalSign nv-sa +# Subject: CN=GlobalSign Root R46 O=GlobalSign nv-sa +# Label: "GlobalSign Root R46" +# Serial: 1552617688466950547958867513931858518042577 +# MD5 Fingerprint: c4:14:30:e4:fa:66:43:94:2a:6a:1b:24:5f:19:d0:ef +# SHA1 Fingerprint: 53:a2:b0:4b:ca:6b:d6:45:e6:39:8a:8e:c4:0d:d2:bf:77:c3:a2:90 +# SHA256 Fingerprint: 4f:a3:12:6d:8d:3a:11:d1:c4:85:5a:4f:80:7c:ba:d6:cf:91:9d:3a:5a:88:b0:3b:ea:2c:63:72:d9:3c:40:c9 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUA +MEYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYD +VQQDExNHbG9iYWxTaWduIFJvb3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMy +MDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt +c2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08EsCVeJ +OaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQG +vGIFAha/r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud +316HCkD7rRlr+/fKYIje2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo +0q3v84RLHIf8E6M6cqJaESvWJ3En7YEtbWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSE +y132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvjK8Cd+RTyG/FWaha/LIWF +zXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD412lPFzYE ++cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCN +I/onccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzs +x2sZy/N78CsHpdlseVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqa +ByFrgY/bxFn63iLABJzjqls2k+g9vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC +4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEMBQADggIBAHx4 +7PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg +JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti +2kM3S+LGteWygxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIk +pnnpHs6i58FZFZ8d4kuaPp92CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRF +FRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZmOUdkLG5NrmJ7v2B0GbhWrJKsFjLt +rWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qqJZ4d16GLuc1CLgSk +ZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwyeqiv5 +u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP +4vkYxboznxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6 +N3ec592kD3ZDZopD8p/7DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3 +vouXsXgxT7PntgMTzlSdriVZzH81Xwj3QEUxeCp6 +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign Root E46 O=GlobalSign nv-sa +# Subject: CN=GlobalSign Root E46 O=GlobalSign nv-sa +# Label: "GlobalSign Root E46" +# Serial: 1552617690338932563915843282459653771421763 +# MD5 Fingerprint: b5:b8:66:ed:de:08:83:e3:c9:e2:01:34:06:ac:51:6f +# SHA1 Fingerprint: 39:b4:6c:d5:fe:80:06:eb:e2:2f:4a:bb:08:33:a0:af:db:b9:dd:84 +# SHA256 Fingerprint: cb:b9:c4:4d:84:b8:04:3e:10:50:ea:31:a6:9f:51:49:55:d7:bf:d2:e2:c6:b4:93:01:01:9a:d6:1d:9f:50:58 +-----BEGIN CERTIFICATE----- +MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYx +CzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQD +ExNHbG9iYWxTaWduIFJvb3QgRTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAw +MDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex +HDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkBjtjq +R+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGdd +yXqBPCCjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ +7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZkvLtoURMMA/cVi4RguYv/Uo7njLwcAjA8 ++RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A= +-----END CERTIFICATE----- + +# Issuer: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH +# Subject: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH +# Label: "GLOBALTRUST 2020" +# Serial: 109160994242082918454945253 +# MD5 Fingerprint: 8a:c7:6f:cb:6d:e3:cc:a2:f1:7c:83:fa:0e:78:d7:e8 +# SHA1 Fingerprint: d0:67:c1:13:51:01:0c:aa:d0:c7:6a:65:37:31:16:26:4f:53:71:a2 +# SHA256 Fingerprint: 9a:29:6a:51:82:d1:d4:51:a2:e3:7f:43:9b:74:da:af:a2:67:52:33:29:f9:0f:9a:0d:20:07:c3:34:e2:3c:9a +-----BEGIN CERTIFICATE----- +MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkG +A1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkw +FwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYx +MDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9u +aXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMIICIjANBgkq +hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWiD59b +RatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9Z +YybNpyrOVPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3 +QWPKzv9pj2gOlTblzLmMCcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPw +yJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCmfecqQjuCgGOlYx8ZzHyyZqjC0203b+J+ +BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKAA1GqtH6qRNdDYfOiaxaJ +SaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9ORJitHHmkH +r96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj0 +4KlGDfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9Me +dKZssCz3AwyIDMvUclOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIw +q7ejMZdnrY8XD2zHc+0klGvIg5rQmjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2 +nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1UdIwQYMBaAFNwu +H9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA +VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJC +XtzoRlgHNQIw4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd +6IwPS3BD0IL/qMy/pJTAvoe9iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf ++I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS8cE54+X1+NZK3TTN+2/BT+MAi1bi +kvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2HcqtbepBEX4tdJP7 +wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxSvTOB +TI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6C +MUO+1918oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn +4rnvyOL2NSl6dPrFf4IFYqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+I +aFvowdlxfv1k7/9nR4hYJS8+hge9+6jlgqispdNpQ80xiEmEU5LAsTkbOYMBMMTy +qfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== +-----END CERTIFICATE----- + +# Issuer: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz +# Subject: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz +# Label: "ANF Secure Server Root CA" +# Serial: 996390341000653745 +# MD5 Fingerprint: 26:a6:44:5a:d9:af:4e:2f:b2:1d:b6:65:b0:4e:e8:96 +# SHA1 Fingerprint: 5b:6e:68:d0:cc:15:b6:a0:5f:1e:c1:5f:ae:02:fc:6b:2f:5d:6f:74 +# SHA256 Fingerprint: fb:8f:ec:75:91:69:b9:10:6b:1e:51:16:44:c6:18:c5:13:04:37:3f:6c:06:43:08:8d:8b:ef:fd:1b:99:75:99 +-----BEGIN CERTIFICATE----- +MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNV +BAUTCUc2MzI4NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlk +YWQgZGUgQ2VydGlmaWNhY2lvbjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNV +BAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3QgQ0EwHhcNMTkwOTA0MTAwMDM4WhcN +MzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEwMQswCQYDVQQGEwJF +UzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQwEgYD +VQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9v +dCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCj +cqQZAZ2cC4Ffc0m6p6zzBE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9q +yGFOtibBTI3/TO80sh9l2Ll49a2pcbnvT1gdpd50IJeh7WhM3pIXS7yr/2WanvtH +2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcvB2VSAKduyK9o7PQUlrZX +H1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXsezx76W0OL +zc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyR +p1RMVwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQz +W7i1o0TJrH93PB0j7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/ +SiOL9V8BY9KHcyi1Swr1+KuCLH5zJTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJn +LNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe8TZBAQIvfXOn3kLMTOmJDVb3 +n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVOHj1tyRRM4y5B +u8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj +o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AgEATh65isagmD9uw2nAalxJUqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L +9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzxj6ptBZNscsdW699QIyjlRRA96Gej +rw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDtdD+4E5UGUcjohybK +pFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM5gf0 +vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjq +OknkJjCb5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ +/zo1PqVUSlJZS2Db7v54EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ9 +2zg/LFis6ELhDtjTO0wugumDLmsx2d1Hhk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI ++PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGyg77FGr8H6lnco4g175x2 +MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3r5+qPeoo +tt7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw= +-----END CERTIFICATE----- + +# Issuer: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Subject: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Label: "Certum EC-384 CA" +# Serial: 160250656287871593594747141429395092468 +# MD5 Fingerprint: b6:65:b3:96:60:97:12:a1:ec:4e:e1:3d:a3:c6:c9:f1 +# SHA1 Fingerprint: f3:3e:78:3c:ac:df:f4:a2:cc:ac:67:55:69:56:d7:e5:16:3c:e1:ed +# SHA256 Fingerprint: 6b:32:80:85:62:53:18:aa:50:d1:73:c9:8d:8b:da:09:d5:7e:27:41:3d:11:4c:f7:87:a0:f5:d0:6c:03:0c:f6 +-----BEGIN CERTIFICATE----- +MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQsw +CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScw +JQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMT +EENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2MDcyNDU0WhcNNDMwMzI2MDcyNDU0 +WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBT +LkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAX +BgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATE +KI6rGFtqvm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7Tm +Fy8as10CW4kjPMIRBSqniBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68Kj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI0GZnQkdjrzife81r1HfS+8 +EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjADVS2m5hjEfO/J +UG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0QoSZ/6vn +nvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Root CA" +# Serial: 40870380103424195783807378461123655149 +# MD5 Fingerprint: 51:e1:c2:e7:fe:4c:84:af:59:0e:2f:f4:54:6f:ea:29 +# SHA1 Fingerprint: c8:83:44:c0:18:ae:9f:cc:f1:87:b7:8f:22:d1:c5:d7:45:84:ba:e5 +# SHA256 Fingerprint: fe:76:96:57:38:55:77:3e:37:a9:5e:7a:d4:d9:cc:96:c3:01:57:c1:5d:31:76:5b:a9:b1:57:04:e1:ae:78:fd +-----BEGIN CERTIFICATE----- +MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6 +MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEu +MScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNV +BAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwHhcNMTgwMzE2MTIxMDEzWhcNNDMw +MzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEg +U3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZ +n0EGze2jusDbCSzBfN8pfktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/q +p1x4EaTByIVcJdPTsuclzxFUl6s1wB52HO8AU5853BSlLCIls3Jy/I2z5T4IHhQq +NwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2fJmItdUDmj0VDT06qKhF +8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGtg/BKEiJ3 +HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGa +mqi4NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi +7VdNIuJGmj8PkTQkfVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSF +ytKAQd8FqKPVhJBPC/PgP5sZ0jeJP/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0P +qafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSYnjYJdmZm/Bo/6khUHL4wvYBQ +v3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHKHRzQ+8S1h9E6 +Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1 +vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQAD +ggIBAEii1QALLtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4 +WxmB82M+w85bj/UvXgF2Ez8sALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvo +zMrnadyHncI013nR03e4qllY/p0m+jiGPp2Kh2RX5Rc64vmNueMzeMGQ2Ljdt4NR +5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8CYyqOhNf6DR5UMEQ +GfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA4kZf +5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq +0Uc9NneoWWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7D +P78v3DSk+yshzWePS/Tj6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTM +qJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmTOPQD8rv7gmsHINFSH5pkAnuYZttcTVoP +0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZckbxJF0WddCajJFdr60qZf +E2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb +-----END CERTIFICATE----- + +# Issuer: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique +# Subject: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique +# Label: "TunTrust Root CA" +# Serial: 108534058042236574382096126452369648152337120275 +# MD5 Fingerprint: 85:13:b9:90:5b:36:5c:b6:5e:b8:5a:f8:e0:31:57:b4 +# SHA1 Fingerprint: cf:e9:70:84:0f:e0:73:0f:9d:f6:0c:7f:2c:4b:ee:20:46:34:9c:bb +# SHA256 Fingerprint: 2e:44:10:2a:b5:8c:b8:54:19:45:1c:8e:19:d9:ac:f3:66:2c:af:bc:61:4b:6a:53:96:0a:30:f7:d0:e2:eb:41 +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQEL +BQAwYTELMAkGA1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUg +Q2VydGlmaWNhdGlvbiBFbGVjdHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJv +b3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQwNDI2MDg1NzU2WjBhMQswCQYDVQQG +EwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBDZXJ0aWZpY2F0aW9u +IEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZ +n56eY+hz2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd +2JQDoOw05TDENX37Jk0bbjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgF +VwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZ +GoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAdgjH8KcwAWJeRTIAAHDOF +li/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViWVSHbhlnU +r8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2 +eY8fTpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIb +MlEsPvLfe/ZdeikZjuXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISg +jwBUFfyRbVinljvrS5YnzWuioYasDXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB +7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwSVXAkPcvCFDVDXSdOvsC9qnyW +5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI04Y+oXNZtPdE +ITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 +90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+z +xiD2BkewhpMl0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYu +QEkHDVneixCwSQXi/5E/S7fdAo74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4 +FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRYYdZ2vyJ/0Adqp2RT8JeNnYA/u8EH +22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJpadbGNjHh/PqAulxP +xOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65xxBzn +dFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5 +Xc0yGYuPjCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7b +nV2UqL1g52KAdoGDDIzMMEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQ +CvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9zZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZH +u/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3rAZ3r2OvEhJn7wAzMMujj +d9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= +-----END CERTIFICATE----- + +# Issuer: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Subject: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Label: "HARICA TLS RSA Root CA 2021" +# Serial: 76817823531813593706434026085292783742 +# MD5 Fingerprint: 65:47:9b:58:86:dd:2c:f0:fc:a2:84:1f:1e:96:c4:91 +# SHA1 Fingerprint: 02:2d:05:82:fa:88:ce:14:0c:06:79:de:7f:14:10:e9:45:d7:a5:6d +# SHA256 Fingerprint: d9:5d:0e:8e:da:79:52:5b:f9:be:b1:1b:14:d2:10:0d:32:94:98:5f:0c:62:d9:fa:bd:9c:d9:99:ec:cb:7b:1d +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBs +MQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0Eg +Um9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUzOFoXDTQ1MDIxMzEwNTUzN1owbDEL +MAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNBIFJv +b3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569l +mwVnlskNJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE +4VGC/6zStGndLuwRo0Xua2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uv +a9of08WRiFukiZLRgeaMOVig1mlDqa2YUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4M +pbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K5FrZx40d/JiZ+yykgmvw +Kh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEvdmn8kN3b +LW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcY +AuUR0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqB +AGMUuTNe3QvboEUHGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYq +E613TBoYm5EPWNgGVMWX+Ko/IIqmhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHr +W2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQCPxrvrNQKlr9qEgYRtaQQJKQ +CoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAU +X15QvWiWkKQUEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3 +f5Z2EMVGpdAgS1D0NTsY9FVqQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxaja +H6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxDQpSbIPDRzbLrLFPCU3hKTwSUQZqP +JzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcRj88YxeMn/ibvBZ3P +zzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5vZSt +jBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0 +/L5H9MG0qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pT +BGIBnfHAT+7hOtSLIBD6Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79 +aPib8qXPMThcFarmlwDB31qlpzmq6YR/PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YW +xw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnnkf3/W9b3raYvAwtt41dU +63ZTGI0RmLo= +-----END CERTIFICATE----- + +# Issuer: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Subject: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Label: "HARICA TLS ECC Root CA 2021" +# Serial: 137515985548005187474074462014555733966 +# MD5 Fingerprint: ae:f7:4c:e5:66:35:d1:b7:9b:8c:22:93:74:d3:4b:b0 +# SHA1 Fingerprint: bc:b0:c1:9d:e9:98:92:70:19:38:57:e9:8d:a7:b4:5d:6e:ee:01:48 +# SHA256 Fingerprint: 3f:99:cc:47:4a:cf:ce:4d:fe:d5:87:94:66:5e:47:8d:15:47:73:9f:2e:78:0f:1b:b4:ca:9b:13:30:97:d4:01 +-----BEGIN CERTIFICATE----- +MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQsw +CQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2Vh +cmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9v +dCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoXDTQ1MDIxMzExMDEwOVowbDELMAkG +A1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJvb3Qg +Q0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7 +KKrxcm1lAEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9Y +STHMmE5gEYd103KUkE+bECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQD +AgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAircJRQO9gcS3ujwLEXQNw +SaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygN +nxS2PFOiTAZpffpskcYqSUXm7LcT4Tps +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 1977337328857672817 +# MD5 Fingerprint: 4e:6e:9b:54:4c:ca:b7:fa:48:e4:90:b1:15:4b:1c:a3 +# SHA1 Fingerprint: 0b:be:c2:27:22:49:cb:39:aa:db:35:5c:53:e3:8c:ae:78:ff:b6:fe +# SHA256 Fingerprint: 57:de:05:83:ef:d2:b2:6e:03:61:da:99:da:9d:f4:64:8d:ef:7e:e8:44:1c:3b:72:8a:fa:9b:cd:e0:f9:b2:6a +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1 +MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1UdDgQWBBRlzeurNR4APn7VdMAc +tHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4wgZswgZgGBFUd +IAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j +b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABC +AG8AbgBhAG4AbwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAw +ADEANzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9m +iWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL4QjbEwj4KKE1soCzC1HA01aajTNF +Sa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDbLIpgD7dvlAceHabJ +hfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1ilI45P +Vf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZE +EAEeiGaPcjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV +1aUsIC+nmCjuRfzxuIgALI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2t +CsvMo2ebKHTEm9caPARYpoKdrcd7b/+Alun4jWq9GJAd/0kakFI3ky88Al2CdgtR +5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH9IBk9W6VULgRfhVwOEqw +f9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpfNIbnYrX9 +ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNK +GbqEZycPvEJdvSRUDewdcAZfpLz6IHxV +-----END CERTIFICATE----- + +# Issuer: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. +# Subject: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. +# Label: "vTrus ECC Root CA" +# Serial: 630369271402956006249506845124680065938238527194 +# MD5 Fingerprint: de:4b:c1:f5:52:8c:9b:43:e1:3e:8f:55:54:17:8d:85 +# SHA1 Fingerprint: f6:9c:db:b0:fc:f6:02:13:b6:52:32:a6:a3:91:3f:16:70:da:c3:e1 +# SHA256 Fingerprint: 30:fb:ba:2c:32:23:8e:2a:98:54:7a:f9:79:31:e5:50:42:8b:9b:3f:1c:8e:eb:66:33:dc:fa:86:c5:b2:7d:d3 +-----BEGIN CERTIFICATE----- +MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMw +RzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAY +BgNVBAMTEXZUcnVzIEVDQyBSb290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDcz +MTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28u +LEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+cToL0 +v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUd +e4BdS49nTPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIw +V53dVvHH4+m4SVBrm2nDb+zDfSXkV5UTQJtS0zvzQBm8JsctBp61ezaf9SXUY2sA +AjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQLYgmRWAD5Tfs0aNoJrSEG +GJTO +-----END CERTIFICATE----- + +# Issuer: CN=vTrus Root CA O=iTrusChina Co.,Ltd. +# Subject: CN=vTrus Root CA O=iTrusChina Co.,Ltd. +# Label: "vTrus Root CA" +# Serial: 387574501246983434957692974888460947164905180485 +# MD5 Fingerprint: b8:c9:37:df:fa:6b:31:84:64:c5:ea:11:6a:1b:75:fc +# SHA1 Fingerprint: 84:1a:69:fb:f5:cd:1a:25:34:13:3d:e3:f8:fc:b8:99:d0:c9:14:b7 +# SHA256 Fingerprint: 8a:71:de:65:59:33:6f:42:6c:26:e5:38:80:d0:0d:88:a1:8d:a4:c6:a9:1f:0d:cb:61:94:e2:06:c5:c9:63:87 +-----BEGIN CERTIFICATE----- +MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQEL +BQAwQzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4x +FjAUBgNVBAMTDXZUcnVzIFJvb3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMx +MDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoGA1UEChMTaVRydXNDaGluYSBDby4s +THRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZotsSKYc +IrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykU +AyyNJJrIZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+ +GrPSbcKvdmaVayqwlHeFXgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z9 +8Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KAYPxMvDVTAWqXcoKv8R1w6Jz1717CbMdH +flqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70kLJrxLT5ZOrpGgrIDajt +J8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2AXPKBlim +0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZN +pGvu/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQ +UqqzApVg+QxMaPnu1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHW +OXSuTEGC2/KmSNGzm/MzqvOmwMVO9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMB +AAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYgscasGrz2iTAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAKbqSSaet +8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd +nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1j +bhd47F18iMjrjld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvM +Kar5CKXiNxTKsbhm7xqC5PD48acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIiv +TDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJnxDHO2zTlJQNgJXtxmOTAGytfdELS +S8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554WgicEFOwE30z9J4nfr +I8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4sEb9 +b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNB +UvupLnKWnyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1P +Ti07NEPhmg4NpGaXutIcSkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929ven +sBxXVsFy6K2ir40zSbofitzmdHxghm+Hl3s= +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X2 O=Internet Security Research Group +# Subject: CN=ISRG Root X2 O=Internet Security Research Group +# Label: "ISRG Root X2" +# Serial: 87493402998870891108772069816698636114 +# MD5 Fingerprint: d3:9e:c4:1e:23:3c:a6:df:cf:a3:7e:6d:e0:14:e6:e5 +# SHA1 Fingerprint: bd:b1:b9:3c:d5:97:8d:45:c6:26:14:55:f8:db:95:c7:5a:d1:53:af +# SHA256 Fingerprint: 69:72:9b:8e:15:a8:6e:fc:17:7a:57:af:b7:17:1d:fc:64:ad:d2:8c:2f:ca:8c:f1:50:7e:34:45:3c:cb:14:70 +-----BEGIN CERTIFICATE----- +MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw +CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg +R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00 +MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT +ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw +EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW ++1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9 +ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI +zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW +tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1 +/q4AaOeMSQ+2b1tbFfLn +-----END CERTIFICATE----- + +# Issuer: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. +# Subject: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. +# Label: "HiPKI Root CA - G1" +# Serial: 60966262342023497858655262305426234976 +# MD5 Fingerprint: 69:45:df:16:65:4b:e8:68:9a:8f:76:5f:ff:80:9e:d3 +# SHA1 Fingerprint: 6a:92:e4:a8:ee:1b:ec:96:45:37:e3:29:57:49:cd:96:e3:e5:d2:60 +# SHA256 Fingerprint: f0:15:ce:3c:c2:39:bf:ef:06:4b:e9:f1:d2:c4:17:e1:a0:26:4a:0a:94:be:1f:0c:8d:12:18:64:eb:69:49:cc +-----BEGIN CERTIFICATE----- +MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBP +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xGzAZBgNVBAMMEkhpUEtJIFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRa +Fw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3 +YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kgUm9vdCBDQSAtIEcx +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0o9Qw +qNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twv +Vcg3Px+kwJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6 +lZgRZq2XNdZ1AYDgr/SEYYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnz +Qs7ZngyzsHeXZJzA9KMuH5UHsBffMNsAGJZMoYFL3QRtU6M9/Aes1MU3guvklQgZ +KILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfdhSi8MEyr48KxRURHH+CK +FgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj1jOXTyFj +HluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDr +y+K49a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ +/W3c1pzAtH2lsN0/Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgM +a/aOEmem8rJY5AIJEzypuxC00jBF8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6 +fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQDAgGGMA0GCSqG +SIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi +7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqc +SE5XCV0vrPSltJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6Fza +ZsT0pPBWGTMpWmWSBUdGSquEwx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9Tc +XzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07QJNBAsNB1CI69aO4I1258EHBGG3zg +iLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv5wiZqAxeJoBF1Pho +L5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+GpzjLrF +Ne85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wr +kkVbbiVghUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+ +vhV4nYWBSipX3tUZQ9rbyltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQU +YDksswBVLuT1sw5XxJFBAJw/6KXf6vb/yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 159662223612894884239637590694 +# MD5 Fingerprint: 26:29:f8:6d:e1:88:bf:a2:65:7f:aa:c4:cd:0f:7f:fc +# SHA1 Fingerprint: 6b:a0:b0:98:e1:71:ef:5a:ad:fe:48:15:80:77:10:f4:bd:6f:0b:28 +# SHA256 Fingerprint: b0:85:d7:0b:96:4f:19:1a:73:e4:af:0d:54:ae:7a:0e:07:aa:fd:af:9b:71:dd:08:62:13:8a:b7:32:5a:24:a2 +-----BEGIN CERTIFICATE----- +MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYD +VQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgw +MTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0g +UjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wWTAT +BgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkWymOx +uYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNV +HQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/ ++wpu+74zyTyjhNUwCgYIKoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147 +bmF0774BxL4YSFlhgjICICadVGNA3jdgUM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 159662320309726417404178440727 +# MD5 Fingerprint: 05:fe:d0:bf:71:a8:a3:76:63:da:01:e0:d8:52:dc:40 +# SHA1 Fingerprint: e5:8c:1c:c4:91:3b:38:63:4b:e9:10:6e:e3:ad:8e:6b:9d:d9:81:4a +# SHA256 Fingerprint: d9:47:43:2a:bd:e7:b7:fa:90:fc:2e:6b:59:10:1b:12:80:e0:e1:c7:e4:e4:0f:a3:c6:88:7f:ff:57:a7:f4:cf +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo +27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w +Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw +TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl +qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH +szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8 +Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk +MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 +wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p +aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN +VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID +AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb +C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe +QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy +h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4 +7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J +ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef +MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/ +Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT +6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ +0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm +2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb +bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R2 O=Google Trust Services LLC +# Subject: CN=GTS Root R2 O=Google Trust Services LLC +# Label: "GTS Root R2" +# Serial: 159662449406622349769042896298 +# MD5 Fingerprint: 1e:39:c0:53:e6:1e:29:82:0b:ca:52:55:36:5d:57:dc +# SHA1 Fingerprint: 9a:44:49:76:32:db:de:fa:d0:bc:fb:5a:7b:17:bd:9e:56:09:24:94 +# SHA256 Fingerprint: 8d:25:cd:97:22:9d:bf:70:35:6b:da:4e:b3:cc:73:40:31:e2:4c:f0:0f:af:cf:d3:2d:c7:6e:b5:84:1c:7e:a8 +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3LvCvpt +nfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY +6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAu +MC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7k +RXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWg +f9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1mKPV ++3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K8Yzo +dDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW +Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKa +G73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCq +gc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwID +AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBAB/Kzt3H +vqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 +0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyC +B19m3H0Q/gxhswWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2u +NmSRXbBoGOqKYcl3qJfEycel/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMg +yALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVnjWQye+mew4K6Ki3pHrTgSAai/Gev +HyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y59PYjJbigapordwj6 +xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M7YNR +TOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924Sg +JPFI/2R80L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV +7LXTWtiBmelDGDfrs7vRWGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl +6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjWHYbL +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R3 O=Google Trust Services LLC +# Subject: CN=GTS Root R3 O=Google Trust Services LLC +# Label: "GTS Root R3" +# Serial: 159662495401136852707857743206 +# MD5 Fingerprint: 3e:e7:9d:58:02:94:46:51:94:e5:e0:22:4a:8b:e7:73 +# SHA1 Fingerprint: ed:e5:71:80:2b:c8:92:b9:5b:83:3c:d2:32:68:3f:09:cd:a0:1e:46 +# SHA256 Fingerprint: 34:d8:a7:3e:e2:08:d9:bc:db:0d:95:65:20:93:4b:4e:40:e6:94:82:59:6e:8b:6f:73:c8:42:6b:01:0a:6f:48 +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYD +VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG +A1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw +WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz +IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout736G +jOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL2 +4CejQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7 +VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azTL818+FsuVbu/3ZL3pAzcMeGiAjEA/Jdm +ZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV11RZt+cRLInUue4X +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 159662532700760215368942768210 +# MD5 Fingerprint: 43:96:83:77:19:4d:76:b3:9d:65:52:e4:1d:22:a5:e8 +# SHA1 Fingerprint: 77:d3:03:67:b5:e0:0c:15:f6:0c:38:61:df:7c:e1:3b:92:46:4d:47 +# SHA256 Fingerprint: 34:9d:fa:40:58:c5:e2:63:12:3b:39:8a:e7:95:57:3c:4e:13:13:c8:3f:e6:8f:93:55:6c:d5:e8:03:1b:3c:7d +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD +VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG +A1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw +WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz +IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi +QHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR +HYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D +9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8 +p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD +-----END CERTIFICATE----- + +# Issuer: CN=Telia Root CA v2 O=Telia Finland Oyj +# Subject: CN=Telia Root CA v2 O=Telia Finland Oyj +# Label: "Telia Root CA v2" +# Serial: 7288924052977061235122729490515358 +# MD5 Fingerprint: 0e:8f:ac:aa:82:df:85:b1:f4:dc:10:1c:fc:99:d9:48 +# SHA1 Fingerprint: b9:99:cd:d1:73:50:8a:c4:47:05:08:9c:8c:88:fb:be:a0:2b:40:cd +# SHA256 Fingerprint: 24:2b:69:74:2f:cb:1e:5b:2a:bf:98:89:8b:94:57:21:87:54:4e:5b:4d:99:11:78:65:73:62:1f:6a:74:b8:2c +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQx +CzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UE +AwwQVGVsaWEgUm9vdCBDQSB2MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1 +NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZ +MBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ76zBq +AMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9 +vVYiQJ3q9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9 +lRdU2HhE8Qx3FZLgmEKnpNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTOD +n3WhUidhOPFZPY5Q4L15POdslv5e2QJltI5c0BE0312/UqeBAMN/mUWZFdUXyApT +7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW5olWK8jjfN7j/4nlNW4o +6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNrRBH0pUPC +TEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6 +WT0EBXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63R +DolUK5X6wK0dmBR4M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZI +pEYslOqodmJHixBTB0hXbOKSTbauBcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGj +YzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7Wxy+G2CQ5MB0GA1UdDgQWBBRy +rOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ +8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi +0f6X+J8wfBj5tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMM +A8iZGok1GTzTyVR8qPAs5m4HeW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBS +SRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+Cy748fdHif64W1lZYudogsYMVoe+K +TTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygCQMez2P2ccGrGKMOF +6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15h2Er +3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMt +Ty3EHD70sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pT +VmBds9hCG1xLEooc6+t9xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAW +ysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQraVplI/owd8k+BsHMYeB2F326CjYSlKA +rBPuUBQemMc= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH +# Subject: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH +# Label: "D-TRUST BR Root CA 1 2020" +# Serial: 165870826978392376648679885835942448534 +# MD5 Fingerprint: b5:aa:4b:d5:ed:f7:e3:55:2e:8f:72:0a:f3:75:b8:ed +# SHA1 Fingerprint: 1f:5b:98:f0:e3:b5:f7:74:3c:ed:e6:b0:36:7d:32:cd:f4:09:41:67 +# SHA256 Fingerprint: e5:9a:aa:81:60:09:c2:2b:ff:5b:25:ba:d3:7d:f3:06:f0:49:79:7c:1f:81:d8:5a:b0:89:e6:57:bd:8f:00:44 +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQsw +CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS +VVNUIEJSIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5 +NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG +A1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB +BAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7dPYS +zuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0 +QVK5buXuQqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/ +VbNafAkl1bK6CKBrqx9tMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g +PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2JyX3Jvb3Rf +Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l +dC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 +c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO +PQQDAwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFW +wKrY7RjEsK70PvomAjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHV +dWNbFJWcHwHP2NVypw87 +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH +# Subject: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH +# Label: "D-TRUST EV Root CA 1 2020" +# Serial: 126288379621884218666039612629459926992 +# MD5 Fingerprint: 8c:2d:9d:70:9f:48:99:11:06:11:fb:e9:cb:30:c0:6e +# SHA1 Fingerprint: 61:db:8c:21:59:69:03:90:d8:7c:9c:12:86:54:cf:9d:3d:f4:dd:07 +# SHA256 Fingerprint: 08:17:0d:1a:a3:64:53:90:1a:2f:95:92:45:e3:47:db:0c:8d:37:ab:aa:bc:56:b8:1a:a1:00:dc:95:89:70:db +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQsw +CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS +VVNUIEVWIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5 +NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG +A1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB +BAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8ZRCC +/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rD +wpdhQntJraOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3 +OqQo5FD4pPfsazK2/umLMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g +PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2V2X3Jvb3Rf +Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l +dC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 +c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO +PQQDAwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CA +y/m0sRtW9XLS/BnRAjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJb +gfM0agPnIjhQW+0ZT0MW +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc. +# Subject: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc. +# Label: "DigiCert TLS ECC P384 Root G5" +# Serial: 13129116028163249804115411775095713523 +# MD5 Fingerprint: d3:71:04:6a:43:1c:db:a6:59:e1:a8:a3:aa:c5:71:ed +# SHA1 Fingerprint: 17:f3:de:5e:9f:0f:19:e9:8e:f6:1f:32:26:6e:20:c4:07:ae:30:ee +# SHA256 Fingerprint: 01:8e:13:f0:77:25:32:cf:80:9b:d1:b1:72:81:86:72:83:fc:48:c6:e1:3b:e9:c6:98:12:85:4a:49:0c:1b:05 +-----BEGIN CERTIFICATE----- +MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURp +Z2lDZXJ0IFRMUyBFQ0MgUDM4NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2 +MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJ +bmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQgUm9vdCBHNTB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1TzvdlHJS +7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp +0zVozptjn4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICIS +B4CIfBFqMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49 +BAMDA2gAMGUCMQCJao1H5+z8blUD2WdsJk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQ +LgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIxAJSdYsiJvRmEFOml+wG4 +DXZDjC5Ty3zfDBeWUA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc. +# Subject: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc. +# Label: "DigiCert TLS RSA4096 Root G5" +# Serial: 11930366277458970227240571539258396554 +# MD5 Fingerprint: ac:fe:f7:34:96:a9:f2:b3:b4:12:4b:e4:27:41:6f:e1 +# SHA1 Fingerprint: a7:88:49:dc:5d:7c:75:8c:8c:de:39:98:56:b3:aa:d0:b2:a5:71:35 +# SHA256 Fingerprint: 37:1a:00:dc:05:33:b3:72:1a:7e:eb:40:e8:41:9e:70:79:9d:2b:0a:0f:2c:1d:80:69:31:65:f7:ce:c4:ad:75 +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBN +MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMT +HERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcN +NDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs +IEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS87IE+ +ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG0 +2C+JFvuUAT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgp +wgscONyfMXdcvyej/Cestyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZM +pG2T6T867jp8nVid9E6P/DsjyG244gXazOvswzH016cpVIDPRFtMbzCe88zdH5RD +nU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnVDdXifBBiqmvwPXbzP6Po +sMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9qTXeXAaDx +Zre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cd +Lvvyz6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvX +KyY//SovcfXWJL5/MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNe +XoVPzthwiHvOAbWWl9fNff2C+MIkwcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPL +tgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4EFgQUUTMc7TZArxfTJc1paPKv +TiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN +AQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw +GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7H +PNtQOa27PShNlnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLF +O4uJ+DQtpBflF+aZfTCIITfNMBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQ +REtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/u4cnYiWB39yhL/btp/96j1EuMPik +AdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9GOUrYU9DzLjtxpdRv +/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh47a+ +p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilw +MUc/dNAUFvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WF +qUITVuwhd4GTWgzqltlJyqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCK +ovfepEWFJqgejF0pW8hL2JpqA15w8oVPbEtoL8pU9ozaMv7Da4M/OMZ+ +-----END CERTIFICATE----- + +# Issuer: CN=Certainly Root R1 O=Certainly +# Subject: CN=Certainly Root R1 O=Certainly +# Label: "Certainly Root R1" +# Serial: 188833316161142517227353805653483829216 +# MD5 Fingerprint: 07:70:d4:3e:82:87:a0:fa:33:36:13:f4:fa:33:e7:12 +# SHA1 Fingerprint: a0:50:ee:0f:28:71:f4:27:b2:12:6d:6f:50:96:25:ba:cc:86:42:af +# SHA256 Fingerprint: 77:b8:2c:d8:64:4c:43:05:f7:ac:c5:cb:15:6b:45:67:50:04:03:3d:51:c6:0c:62:02:a8:e0:c3:34:67:d3:a0 +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAw +PTELMAkGA1UEBhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2Vy +dGFpbmx5IFJvb3QgUjEwHhcNMjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9 +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0 +YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANA2 +1B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O5MQT +vqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbed +aFySpvXl8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b0 +1C7jcvk2xusVtyWMOvwlDbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5 +r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGIXsXwClTNSaa/ApzSRKft43jvRl5tcdF5 +cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkNKPl6I7ENPT2a/Z2B7yyQ +wHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQAjeZjOVJ +6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA +2CnbrlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyH +Wyf5QBGenDPBt+U1VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMR +eiFPCyEQtkA6qyI6BJyLm4SGcprSp6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB +/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTgqj8ljZ9EXME66C6u +d0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAszHQNTVfSVcOQr +PbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d +8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi +1wrykXprOQ4vMMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrd +rRT90+7iIgXr0PK3aBLXWopBGsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9di +taY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+gjwN/KUD+nsa2UUeYNrEjvn8K8l7 +lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgHJBu6haEaBQmAupVj +yTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7fpYn +Kx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLy +yCwzk5Iwx06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5n +wXARPbv0+Em34yaXOp/SX3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6 +OV+KmalBWQewLK8= +-----END CERTIFICATE----- + +# Issuer: CN=Certainly Root E1 O=Certainly +# Subject: CN=Certainly Root E1 O=Certainly +# Label: "Certainly Root E1" +# Serial: 8168531406727139161245376702891150584 +# MD5 Fingerprint: 0a:9e:ca:cd:3e:52:50:c6:36:f3:4b:a3:ed:a7:53:e9 +# SHA1 Fingerprint: f9:e1:6d:dc:01:89:cf:d5:82:45:63:3e:c5:37:7d:c2:eb:93:6f:2b +# SHA256 Fingerprint: b4:58:5f:22:e4:ac:75:6a:4e:86:12:a1:36:1c:5d:9d:03:1a:93:fd:84:fe:bb:77:8f:a3:06:8b:0f:c4:2d:c2 +-----BEGIN CERTIFICATE----- +MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQsw +CQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlu +bHkgUm9vdCBFMTAeFw0yMTA0MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJ +BgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlubHkxGjAYBgNVBAMTEUNlcnRhaW5s +eSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4fxzf7flHh4axpMCK ++IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9YBk2 +QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4 +hevIIgcwCgYIKoZIzj0EAwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozm +ut6Dacpps6kFtZaSF4fC0urQe87YQVt8rgIwRt7qy12a7DLCZRawTDBcMPPaTnOG +BtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR +-----END CERTIFICATE----- + +# Issuer: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. +# Subject: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. +# Label: "Security Communication ECC RootCA1" +# Serial: 15446673492073852651 +# MD5 Fingerprint: 7e:43:b0:92:68:ec:05:43:4c:98:ab:5d:35:2e:7e:86 +# SHA1 Fingerprint: b8:0e:26:a9:bf:d2:b2:3b:c0:ef:46:c9:ba:c7:bb:f6:1d:0d:41:41 +# SHA256 Fingerprint: e7:4f:bd:a5:5b:d5:64:c4:73:a3:6b:44:1a:a7:99:c8:a6:8e:07:74:40:e8:28:8b:9f:a1:e5:0e:4b:ba:ca:11 +-----BEGIN CERTIFICATE----- +MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYT +AkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYD +VQQDEyJTZWN1cml0eSBDb21tdW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYx +NjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTELMAkGA1UEBhMCSlAxJTAjBgNVBAoT +HFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNVBAMTIlNlY3VyaXR5 +IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+Cnnfdl +dB9sELLo5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpK +ULGjQjBAMB0GA1UdDgQWBBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu +9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3LsnNdo4gIxwwCMQDAqy0O +be0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70eN9k= +-----END CERTIFICATE----- + +# Issuer: CN=BJCA Global Root CA1 O=BEIJING CERTIFICATE AUTHORITY +# Subject: CN=BJCA Global Root CA1 O=BEIJING CERTIFICATE AUTHORITY +# Label: "BJCA Global Root CA1" +# Serial: 113562791157148395269083148143378328608 +# MD5 Fingerprint: 42:32:99:76:43:33:36:24:35:07:82:9b:28:f9:d0:90 +# SHA1 Fingerprint: d5:ec:8d:7b:4c:ba:79:f4:e7:e8:cb:9d:6b:ae:77:83:10:03:21:6a +# SHA256 Fingerprint: f3:89:6f:88:fe:7c:0a:88:27:66:a7:fa:6a:d2:74:9f:b5:7a:7f:3e:98:fb:76:9c:1f:a7:b0:9c:2c:44:d5:ae +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBU +MQswCQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRI +T1JJVFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAz +MTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJF +SUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2Jh +bCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFmCL3Z +xRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZ +spDyRhySsTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O5 +58dnJCNPYwpj9mZ9S1WnP3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgR +at7GGPZHOiJBhyL8xIkoVNiMpTAK+BcWyqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll +5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRjeulumijWML3mG90Vr4Tq +nMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNnMoH1V6XK +V0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/ +pj+bOT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZO +z2nxbkRs1CTqjSShGL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXn +jSXWgXSHRtQpdaJCbPdzied9v3pKH9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+ +WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMBAAGjQjBAMB0GA1UdDgQWBBTF +7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 +YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3Kli +awLwQ8hOnThJdMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u ++2D2/VnGKhs/I0qUJDAnyIm860Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88 +X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuhTaRjAv04l5U/BXCga99igUOLtFkN +SoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW4AB+dAb/OMRyHdOo +P2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmpGQrI ++pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRz +znfSxqxx4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9 +eVzYH6Eze9mCUAyTF6ps3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2 +YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4SSPfSKcOYKMryMguTjClPPGAyzQWWYezy +r/6zcCwupvI= +-----END CERTIFICATE----- + +# Issuer: CN=BJCA Global Root CA2 O=BEIJING CERTIFICATE AUTHORITY +# Subject: CN=BJCA Global Root CA2 O=BEIJING CERTIFICATE AUTHORITY +# Label: "BJCA Global Root CA2" +# Serial: 58605626836079930195615843123109055211 +# MD5 Fingerprint: 5e:0a:f6:47:5f:a6:14:e8:11:01:95:3f:4d:01:eb:3c +# SHA1 Fingerprint: f4:27:86:eb:6e:b8:6d:88:31:67:02:fb:ba:66:a4:53:00:aa:7a:a6 +# SHA256 Fingerprint: 57:4d:f6:93:1e:27:80:39:66:7b:72:0a:fd:c1:60:0f:c2:7e:b6:6d:d3:09:29:79:fb:73:85:64:87:21:28:82 +-----BEGIN CERTIFICATE----- +MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQsw +CQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJ +VFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgy +MVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJ +TkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2JhbCBS +b290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jlSR9B +IgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK+ ++kpRuDCK/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJK +sVF/BvDRgh9Obl+rg/xI1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA +94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8gUXOQwKhbYdDFUDn9hf7B +43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== +-----END CERTIFICATE----- + +# Issuer: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited +# Subject: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited +# Label: "Sectigo Public Server Authentication Root E46" +# Serial: 88989738453351742415770396670917916916 +# MD5 Fingerprint: 28:23:f8:b2:98:5c:37:16:3b:3e:46:13:4e:b0:b3:01 +# SHA1 Fingerprint: ec:8a:39:6c:40:f0:2e:bc:42:75:d4:9f:ab:1c:1a:5b:67:be:d2:9a +# SHA256 Fingerprint: c9:0f:26:f0:fb:1b:40:18:b2:22:27:51:9b:5c:a2:b5:3e:2c:a5:b3:be:5c:f1:8e:fe:1b:ef:47:38:0c:53:83 +-----BEGIN CERTIFICATE----- +MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQsw +CQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T +ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcN +MjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYG +A1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT +ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccC +WvkEN/U0NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+ +6xnOQ6OjQjBAMB0GA1UdDgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8B +Af8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNnADBkAjAn7qRa +qCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RHlAFWovgzJQxC36oCMB3q +4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21USAGKcw== +-----END CERTIFICATE----- + +# Issuer: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited +# Subject: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited +# Label: "Sectigo Public Server Authentication Root R46" +# Serial: 156256931880233212765902055439220583700 +# MD5 Fingerprint: 32:10:09:52:00:d5:7e:6c:43:df:15:c0:b1:16:93:e5 +# SHA1 Fingerprint: ad:98:f9:f3:e4:7d:75:3b:65:d4:82:b3:a4:52:17:bb:6e:f5:e4:38 +# SHA256 Fingerprint: 7b:b6:47:a6:2a:ee:ac:88:bf:25:7a:a5:22:d0:1f:fe:a3:95:e0:ab:45:c7:3f:93:f6:56:54:ec:38:f2:5a:06 +-----BEGIN CERTIFICATE----- +MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBf +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQD +Ey1TZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYw +HhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEY +MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1Ymxp +YyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDa +ef0rty2k1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnz +SDBh+oF8HqcIStw+KxwfGExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xf +iOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMPFF1bFOdLvt30yNoDN9HWOaEhUTCDsG3X +ME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vuZDCQOc2TZYEhMbUjUDM3 +IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5QazYw6A3OAS +VYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgE +SJ/AwSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu ++Zd4KKTIRJLpfSYFplhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt +8uaZFURww3y8nDnAtOFr94MlI1fZEoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+L +HaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW6aWWrL3DkJiy4Pmi1KZHQ3xt +zwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWIIUkwDgYDVR0P +AQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c +mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQ +YKlJfp/imTYpE0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52 +gDY9hAaLMyZlbcp+nv4fjFg4exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZA +Fv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M0ejf5lG5Nkc/kLnHvALcWxxPDkjB +JYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI84HxZmduTILA7rpX +DhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9mpFui +TdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5 +dHn5HrwdVw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65 +LvKRRFHQV80MNNVIIb/bE/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp +0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmmJ1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAY +QqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation +# Subject: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation +# Label: "SSL.com TLS RSA Root CA 2022" +# Serial: 148535279242832292258835760425842727825 +# MD5 Fingerprint: d8:4e:c6:59:30:d8:fe:a0:d6:7a:5a:2c:2c:69:78:da +# SHA1 Fingerprint: ec:2c:83:40:72:af:26:95:10:ff:0e:f2:03:ee:31:70:f6:78:9d:ca +# SHA256 Fingerprint: 8f:af:7d:2e:2c:b4:70:9b:b8:e0:b3:36:66:bf:75:a5:dd:45:b5:de:48:0f:8e:a8:d4:bf:e6:be:bc:17:f2:ed +-----BEGIN CERTIFICATE----- +MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBO +MQswCQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQD +DBxTU0wuY29tIFRMUyBSU0EgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloX +DTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jw +b3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJvb3QgQ0EgMjAyMjCC +AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u9nTP +L3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OY +t6/wNr/y7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0ins +S657Lb85/bRi3pZ7QcacoOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3 +PnxEX4MN8/HdIGkWCVDi1FW24IBydm5MR7d1VVm0U3TZlMZBrViKMWYPHqIbKUBO +L9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDGD6C1vBdOSHtRwvzpXGk3 +R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEWTO6Af77w +dr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS ++YCk8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYS +d66UNHsef8JmAOSqg+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoG +AtUjHBPW6dvbxrB6y3snm/vg1UYk7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2f +gTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j +BBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsuN+7jhHonLs0Z +NbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt +hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsM +QtfhWsSWTVTNj8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvf +R4iyrT7gJ4eLSYwfqUdYe5byiB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJ +DPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjUo3KUQyxi4U5cMj29TH0ZR6LDSeeW +P4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqoENjwuSfr98t67wVy +lrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7EgkaibMOlq +bLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2w +AgDHbICivRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3q +r5nsLFR+jM4uElZI7xc7P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sji +Mho6/4UIyYOf8kpIEFR3N+2ivEC+5BB09+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU +98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation +# Subject: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation +# Label: "SSL.com TLS ECC Root CA 2022" +# Serial: 26605119622390491762507526719404364228 +# MD5 Fingerprint: 99:d7:5c:f1:51:36:cc:e9:ce:d9:19:2e:77:71:56:c5 +# SHA1 Fingerprint: 9f:5f:d9:1a:54:6d:f5:0c:71:f0:ee:7a:bd:17:49:98:84:73:e2:39 +# SHA256 Fingerprint: c3:2f:fd:9f:46:f9:36:d1:6c:36:73:99:09:59:43:4b:9a:d6:0a:af:bb:9e:7c:f3:36:54:f1:44:cc:1b:a1:43 +-----BEGIN CERTIFICATE----- +MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQsw +CQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxT +U0wuY29tIFRMUyBFQ0MgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2 +MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3Jh +dGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3QgQ0EgMjAyMjB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWyJGYm +acCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFN +SeR7T5v15wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME +GDAWgBSJjy+j6CugFFR781a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NW +uCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp +15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w7deedWo1dlJF4AIxAMeN +b0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5Zn6g6g== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos +# Subject: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos +# Label: "Atos TrustedRoot Root CA ECC TLS 2021" +# Serial: 81873346711060652204712539181482831616 +# MD5 Fingerprint: 16:9f:ad:f1:70:ad:79:d6:ed:29:b4:d1:c5:79:70:a8 +# SHA1 Fingerprint: 9e:bc:75:10:42:b3:02:f3:81:f4:f7:30:62:d4:8f:c3:a7:51:b2:dd +# SHA256 Fingerprint: b2:fa:e5:3e:14:cc:d7:ab:92:12:06:47:01:ae:27:9c:1d:89:88:fa:cb:77:5f:a8:a0:08:91:4e:66:39:88:a8 +-----BEGIN CERTIFICATE----- +MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4w +LAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0w +CwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0 +MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBF +Q0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMHYwEAYHKoZI +zj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6KDP/X +tXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4 +AjJn8ZQSb+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2 +KCXWfeBmmnoJsmo7jjPXNtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMD +aAAwZQIwW5kp85wxtolrbNa9d+F851F+uDrNozZffPc8dz7kUK2o59JZDCaOMDtu +CCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGYa3cpetskz2VAv9LcjBHo +9H1/IISpQuQo +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos +# Subject: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos +# Label: "Atos TrustedRoot Root CA RSA TLS 2021" +# Serial: 111436099570196163832749341232207667876 +# MD5 Fingerprint: d4:d3:46:b8:9a:c0:9c:76:5d:9e:3a:c3:b9:99:31:d2 +# SHA1 Fingerprint: 18:52:3b:0d:06:37:e4:d6:3a:df:23:e4:98:fb:5b:16:fb:86:74:48 +# SHA256 Fingerprint: 81:a9:08:8e:a5:9f:b3:64:c5:48:a6:f8:55:59:09:9b:6f:04:05:ef:bf:18:e5:32:4e:c9:f4:57:ba:00:11:2f +-----BEGIN CERTIFICATE----- +MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBM +MS4wLAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIx +MQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00 +MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBD +QSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BBl01Z +4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYv +Ye+W/CBGvevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZ +kmGbzSoXfduP9LVq6hdKZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDs +GY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt0xU6kGpn8bRrZtkh68rZYnxGEFzedUln +nkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVKPNe0OwANwI8f4UDErmwh +3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMYsluMWuPD +0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzy +geBYBr3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8 +ANSbhqRAvNncTFd+rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezB +c6eUWsuSZIKmAMFwoW4sKeFYV+xafJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lI +pw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +dEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +DAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS +4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPs +o0UvFJ/1TCplQ3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJ +qM7F78PRreBrAwA0JrRUITWXAdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuyw +xfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9GslA9hGCZcbUztVdF5kJHdWoOsAgM +rr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2VktafcxBPTy+av5EzH4 +AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9qTFsR +0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuY +o7Ey7Nmj1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5 +dDTedk+SKlOxJTnbPP/lPqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcE +oji2jbDwN/zIIX8/syQbPYtuzE2wFg2WHYMfRsCbvUOZ58SWLs5fyQ== +-----END CERTIFICATE----- + +# Issuer: CN=TrustAsia Global Root CA G3 O=TrustAsia Technologies, Inc. +# Subject: CN=TrustAsia Global Root CA G3 O=TrustAsia Technologies, Inc. +# Label: "TrustAsia Global Root CA G3" +# Serial: 576386314500428537169965010905813481816650257167 +# MD5 Fingerprint: 30:42:1b:b7:bb:81:75:35:e4:16:4f:53:d2:94:de:04 +# SHA1 Fingerprint: 63:cf:b6:c1:27:2b:56:e4:88:8e:1c:23:9a:b6:2e:81:47:24:c3:c7 +# SHA256 Fingerprint: e0:d3:22:6a:eb:11:63:c2:e4:8f:f9:be:3b:50:b4:c6:43:1b:e7:bb:1e:ac:c5:c3:6b:5d:5e:c5:09:03:9a:08 +-----BEGIN CERTIFICATE----- +MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEM +BQAwWjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dp +ZXMsIEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAe +Fw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEwMTlaMFoxCzAJBgNVBAYTAkNOMSUw +IwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtU +cnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNS +T1QY4SxzlZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqK +AtCWHwDNBSHvBm3dIZwZQ0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1 +nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/VP68czH5GX6zfZBCK70bwkPAPLfSIC7Ep +qq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1AgdB4SQXMeJNnKziyhWTXA +yB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm9WAPzJMs +hH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gX +zhqcD0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAv +kV34PmVACxmZySYgWmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msT +f9FkPz2ccEblooV7WIQn3MSAPmeamseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jA +uPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCFTIcQcf+eQxuulXUtgQIDAQAB +o2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj7zjKsK5Xf/Ih +MBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E +BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4 +wM8zAQLpw6o1D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2 +XFNFV1pF1AWZLy4jVe5jaN/TG3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1 +JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNjduMNhXJEIlU/HHzp/LgV6FL6qj6j +ITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstlcHboCoWASzY9M/eV +VHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys+TIx +xHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1on +AX1daBli2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d +7XB4tmBZrOFdRWOPyN9yaFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2Ntjj +gKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsASZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV ++Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFRJQJ6+N1rZdVtTTDIZbpo +FGWsJwt0ivKH +-----END CERTIFICATE----- + +# Issuer: CN=TrustAsia Global Root CA G4 O=TrustAsia Technologies, Inc. +# Subject: CN=TrustAsia Global Root CA G4 O=TrustAsia Technologies, Inc. +# Label: "TrustAsia Global Root CA G4" +# Serial: 451799571007117016466790293371524403291602933463 +# MD5 Fingerprint: 54:dd:b2:d7:5f:d8:3e:ed:7c:e0:0b:2e:cc:ed:eb:eb +# SHA1 Fingerprint: 57:73:a5:61:5d:80:b2:e6:ac:38:82:fc:68:07:31:ac:9f:b5:92:5a +# SHA256 Fingerprint: be:4b:56:cb:50:56:c0:13:6a:52:6d:f4:44:50:8d:aa:36:a0:b5:4f:42:e4:ac:38:f7:2a:f4:70:e4:79:65:4c +-----BEGIN CERTIFICATE----- +MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMw +WjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs +IEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0y +MTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJaMFoxCzAJBgNVBAYTAkNOMSUwIwYD +VQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtUcnVz +dEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATx +s8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbw +LxYI+hW8m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJij +YzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mD +pm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/pDHel4NZg6ZvccveMA4GA1UdDwEB/wQE +AwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AAbbd+NvBNEU/zy4k6LHiR +UKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xkdUfFVZDj +/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA== +-----END CERTIFICATE----- + +# Issuer: CN=CommScope Public Trust ECC Root-01 O=CommScope +# Subject: CN=CommScope Public Trust ECC Root-01 O=CommScope +# Label: "CommScope Public Trust ECC Root-01" +# Serial: 385011430473757362783587124273108818652468453534 +# MD5 Fingerprint: 3a:40:a7:fc:03:8c:9c:38:79:2f:3a:a2:6c:b6:0a:16 +# SHA1 Fingerprint: 07:86:c0:d8:dd:8e:c0:80:98:06:98:d0:58:7a:ef:de:a6:cc:a2:5d +# SHA256 Fingerprint: 11:43:7c:da:7b:b4:5e:41:36:5f:45:b3:9a:38:98:6b:0d:e0:0d:ef:34:8e:0c:7b:b0:87:36:33:80:0b:c3:8b +-----BEGIN CERTIFICATE----- +MIICHTCCAaOgAwIBAgIUQ3CCd89NXTTxyq4yLzf39H91oJ4wCgYIKoZIzj0EAwMw +TjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29t +bVNjb3BlIFB1YmxpYyBUcnVzdCBFQ0MgUm9vdC0wMTAeFw0yMTA0MjgxNzM1NDNa +Fw00NjA0MjgxNzM1NDJaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2Nv +cGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgRUNDIFJvb3QtMDEw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAARLNumuV16ocNfQj3Rid8NeeqrltqLxeP0C +flfdkXmcbLlSiFS8LwS+uM32ENEp7LXQoMPwiXAZu1FlxUOcw5tjnSCDPgYLpkJE +hRGnSjot6dZoL0hOUysHP029uax3OVejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSOB2LAUN3GGQYARnQE9/OufXVNMDAKBggq +hkjOPQQDAwNoADBlAjEAnDPfQeMjqEI2Jpc1XHvr20v4qotzVRVcrHgpD7oh2MSg +2NED3W3ROT3Ek2DS43KyAjB8xX6I01D1HiXo+k515liWpDVfG2XqYZpwI7UNo5uS +Um9poIyNStDuiw7LR47QjRE= +-----END CERTIFICATE----- + +# Issuer: CN=CommScope Public Trust ECC Root-02 O=CommScope +# Subject: CN=CommScope Public Trust ECC Root-02 O=CommScope +# Label: "CommScope Public Trust ECC Root-02" +# Serial: 234015080301808452132356021271193974922492992893 +# MD5 Fingerprint: 59:b0:44:d5:65:4d:b8:5c:55:19:92:02:b6:d1:94:b2 +# SHA1 Fingerprint: 3c:3f:ef:57:0f:fe:65:93:86:9e:a0:fe:b0:f6:ed:8e:d1:13:c7:e5 +# SHA256 Fingerprint: 2f:fb:7f:81:3b:bb:b3:c8:9a:b4:e8:16:2d:0f:16:d7:15:09:a8:30:cc:9d:73:c2:62:e5:14:08:75:d1:ad:4a +-----BEGIN CERTIFICATE----- +MIICHDCCAaOgAwIBAgIUKP2ZYEFHpgE6yhR7H+/5aAiDXX0wCgYIKoZIzj0EAwMw +TjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29t +bVNjb3BlIFB1YmxpYyBUcnVzdCBFQ0MgUm9vdC0wMjAeFw0yMTA0MjgxNzQ0NTRa +Fw00NjA0MjgxNzQ0NTNaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2Nv +cGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgRUNDIFJvb3QtMDIw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAR4MIHoYx7l63FRD/cHB8o5mXxO1Q/MMDAL +j2aTPs+9xYa9+bG3tD60B8jzljHz7aRP+KNOjSkVWLjVb3/ubCK1sK9IRQq9qEmU +v4RDsNuESgMjGWdqb8FuvAY5N9GIIvejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTmGHX/72DehKT1RsfeSlXjMjZ59TAKBggq +hkjOPQQDAwNnADBkAjAmc0l6tqvmSfR9Uj/UQQSugEODZXW5hYA4O9Zv5JOGq4/n +ich/m35rChJVYaoR4HkCMHfoMXGsPHED1oQmHhS48zs73u1Z/GtMMH9ZzkXpc2AV +mkzw5l4lIhVtwodZ0LKOag== +-----END CERTIFICATE----- + +# Issuer: CN=CommScope Public Trust RSA Root-01 O=CommScope +# Subject: CN=CommScope Public Trust RSA Root-01 O=CommScope +# Label: "CommScope Public Trust RSA Root-01" +# Serial: 354030733275608256394402989253558293562031411421 +# MD5 Fingerprint: 0e:b4:15:bc:87:63:5d:5d:02:73:d4:26:38:68:73:d8 +# SHA1 Fingerprint: 6d:0a:5f:f7:b4:23:06:b4:85:b3:b7:97:64:fc:ac:75:f5:33:f2:93 +# SHA256 Fingerprint: 02:bd:f9:6e:2a:45:dd:9b:f1:8f:c7:e1:db:df:21:a0:37:9b:a3:c9:c2:61:03:44:cf:d8:d6:06:fe:c1:ed:81 +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIUPgNJgXUWdDGOTKvVxZAplsU5EN0wDQYJKoZIhvcNAQEL +BQAwTjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwi +Q29tbVNjb3BlIFB1YmxpYyBUcnVzdCBSU0EgUm9vdC0wMTAeFw0yMTA0MjgxNjQ1 +NTRaFw00NjA0MjgxNjQ1NTNaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21t +U2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgUlNBIFJvb3Qt +MDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwSGWjDR1C45FtnYSk +YZYSwu3D2iM0GXb26v1VWvZVAVMP8syMl0+5UMuzAURWlv2bKOx7dAvnQmtVzslh +suitQDy6uUEKBU8bJoWPQ7VAtYXR1HHcg0Hz9kXHgKKEUJdGzqAMxGBWBB0HW0al +DrJLpA6lfO741GIDuZNqihS4cPgugkY4Iw50x2tBt9Apo52AsH53k2NC+zSDO3Oj +WiE260f6GBfZumbCk6SP/F2krfxQapWsvCQz0b2If4b19bJzKo98rwjyGpg/qYFl +P8GMicWWMJoKz/TUyDTtnS+8jTiGU+6Xn6myY5QXjQ/cZip8UlF1y5mO6D1cv547 +KI2DAg+pn3LiLCuz3GaXAEDQpFSOm117RTYm1nJD68/A6g3czhLmfTifBSeolz7p +UcZsBSjBAg/pGG3svZwG1KdJ9FQFa2ww8esD1eo9anbCyxooSU1/ZOD6K9pzg4H/ +kQO9lLvkuI6cMmPNn7togbGEW682v3fuHX/3SZtS7NJ3Wn2RnU3COS3kuoL4b/JO +Hg9O5j9ZpSPcPYeoKFgo0fEbNttPxP/hjFtyjMcmAyejOQoBqsCyMWCDIqFPEgkB +Ea801M/XrmLTBQe0MXXgDW1XT2mH+VepuhX2yFJtocucH+X8eKg1mp9BFM6ltM6U +CBwJrVbl2rZJmkrqYxhTnCwuwwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUN12mmnQywsL5x6YVEFm45P3luG0wDQYJ +KoZIhvcNAQELBQADggIBAK+nz97/4L1CjU3lIpbfaOp9TSp90K09FlxD533Ahuh6 +NWPxzIHIxgvoLlI1pKZJkGNRrDSsBTtXAOnTYtPZKdVUvhwQkZyybf5Z/Xn36lbQ +nmhUQo8mUuJM3y+Xpi/SB5io82BdS5pYV4jvguX6r2yBS5KPQJqTRlnLX3gWsWc+ +QgvfKNmwrZggvkN80V4aCRckjXtdlemrwWCrWxhkgPut4AZ9HcpZuPN4KWfGVh2v +trV0KnahP/t1MJ+UXjulYPPLXAziDslg+MkfFoom3ecnf+slpoq9uC02EJqxWE2a +aE9gVOX2RhOOiKy8IUISrcZKiX2bwdgt6ZYD9KJ0DLwAHb/WNyVntHKLr4W96ioD +j8z7PEQkguIBpQtZtjSNMgsSDesnwv1B10A8ckYpwIzqug/xBpMu95yo9GA+o/E4 +Xo4TwbM6l4c/ksp4qRyv0LAbJh6+cOx69TOY6lz/KwsETkPdY34Op054A5U+1C0w +lREQKC6/oAI+/15Z0wUOlV9TRe9rh9VIzRamloPh37MG88EU26fsHItdkJANclHn +YfkUyq+Dj7+vsQpZXdxc1+SWrVtgHdqul7I52Qb1dgAT+GhMIbA1xNxVssnBQVoc +icCMb3SgazNNtQEo/a2tiRc7ppqEvOuM6sRxJKi6KfkIsidWNTJf6jn7MZrVGczw +-----END CERTIFICATE----- + +# Issuer: CN=CommScope Public Trust RSA Root-02 O=CommScope +# Subject: CN=CommScope Public Trust RSA Root-02 O=CommScope +# Label: "CommScope Public Trust RSA Root-02" +# Serial: 480062499834624527752716769107743131258796508494 +# MD5 Fingerprint: e1:29:f9:62:7b:76:e2:96:6d:f3:d4:d7:0f:ae:1f:aa +# SHA1 Fingerprint: ea:b0:e2:52:1b:89:93:4c:11:68:f2:d8:9a:ac:22:4c:a3:8a:57:ae +# SHA256 Fingerprint: ff:e9:43:d7:93:42:4b:4f:7c:44:0c:1c:3d:64:8d:53:63:f3:4b:82:dc:87:aa:7a:9f:11:8f:c5:de:e1:01:f1 +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIUVBa/O345lXGN0aoApYYNK496BU4wDQYJKoZIhvcNAQEL +BQAwTjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwi +Q29tbVNjb3BlIFB1YmxpYyBUcnVzdCBSU0EgUm9vdC0wMjAeFw0yMTA0MjgxNzE2 +NDNaFw00NjA0MjgxNzE2NDJaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21t +U2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgUlNBIFJvb3Qt +MDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDh+g77aAASyE3VrCLE +NQE7xVTlWXZjpX/rwcRqmL0yjReA61260WI9JSMZNRTpf4mnG2I81lDnNJUDMrG0 +kyI9p+Kx7eZ7Ti6Hmw0zdQreqjXnfuU2mKKuJZ6VszKWpCtYHu8//mI0SFHRtI1C +rWDaSWqVcN3SAOLMV2MCe5bdSZdbkk6V0/nLKR8YSvgBKtJjCW4k6YnS5cciTNxz +hkcAqg2Ijq6FfUrpuzNPDlJwnZXjfG2WWy09X6GDRl224yW4fKcZgBzqZUPckXk2 +LHR88mcGyYnJ27/aaL8j7dxrrSiDeS/sOKUNNwFnJ5rpM9kzXzehxfCrPfp4sOcs +n/Y+n2Dg70jpkEUeBVF4GiwSLFworA2iI540jwXmojPOEXcT1A6kHkIfhs1w/tku +FT0du7jyU1fbzMZ0KZwYszZ1OC4PVKH4kh+Jlk+71O6d6Ts2QrUKOyrUZHk2EOH5 +kQMreyBUzQ0ZGshBMjTRsJnhkB4BQDa1t/qp5Xd1pCKBXbCL5CcSD1SIxtuFdOa3 +wNemKfrb3vOTlycEVS8KbzfFPROvCgCpLIscgSjX74Yxqa7ybrjKaixUR9gqiC6v +wQcQeKwRoi9C8DfF8rhW3Q5iLc4tVn5V8qdE9isy9COoR+jUKgF4z2rDN6ieZdIs +5fq6M8EGRPbmz6UNp2YINIos8wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUR9DnsSL/nSz12Vdgs7GxcJXvYXowDQYJ +KoZIhvcNAQELBQADggIBAIZpsU0v6Z9PIpNojuQhmaPORVMbc0RTAIFhzTHjCLqB +KCh6krm2qMhDnscTJk3C2OVVnJJdUNjCK9v+5qiXz1I6JMNlZFxHMaNlNRPDk7n3 ++VGXu6TwYofF1gbTl4MgqX67tiHCpQ2EAOHyJxCDut0DgdXdaMNmEMjRdrSzbyme +APnCKfWxkxlSaRosTKCL4BWaMS/TiJVZbuXEs1DIFAhKm4sTg7GkcrI7djNB3Nyq +pgdvHSQSn8h2vS/ZjvQs7rfSOBAkNlEv41xdgSGn2rtO/+YHqP65DSdsu3BaVXoT +6fEqSWnHX4dXTEN5bTpl6TBcQe7rd6VzEojov32u5cSoHw2OHG1QAk8mGEPej1WF +sQs3BWDJVTkSBKEqz3EWnzZRSb9wO55nnPt7eck5HHisd5FUmrh1CoFSl+NmYWvt +PjgelmFV4ZFUjO2MJB+ByRCac5krFk5yAD9UG/iNuovnFNa2RU9g7Jauwy8CTl2d +lklyALKrdVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670 +v64fG9PiO/yzcnMcmyiQiRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17O +rg3bhzjlP1v9mxnhMUF6cKojawHhRUzNlM47ni3niAIi9G7oyOzWPPO5std3eqx7 +-----END CERTIFICATE----- + +# Issuer: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH +# Subject: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH +# Label: "Telekom Security TLS ECC Root 2020" +# Serial: 72082518505882327255703894282316633856 +# MD5 Fingerprint: c1:ab:fe:6a:10:2c:03:8d:bc:1c:22:32:c0:85:a7:fd +# SHA1 Fingerprint: c0:f8:96:c5:a9:3b:01:06:21:07:da:18:42:48:bc:e9:9d:88:d5:ec +# SHA256 Fingerprint: 57:8a:f4:de:d0:85:3f:4e:59:98:db:4a:ea:f9:cb:ea:8d:94:5f:60:b6:20:a3:8d:1a:3c:13:b2:bc:7b:a8:e1 +-----BEGIN CERTIFICATE----- +MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQsw +CQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBH +bWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIw +MB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIzNTk1OVowYzELMAkGA1UEBhMCREUx +JzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkGA1UE +AwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/O +tdKPD/M12kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDP +f8iAC8GXs7s1J8nCG6NCMEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6f +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cA +MGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZMo7k+5Dck2TOrbRBR2Di +z6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdUga/sf+Rn +27iQ7t0l +-----END CERTIFICATE----- + +# Issuer: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH +# Subject: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH +# Label: "Telekom Security TLS RSA Root 2023" +# Serial: 44676229530606711399881795178081572759 +# MD5 Fingerprint: bf:5b:eb:54:40:cd:48:71:c4:20:8d:7d:de:0a:42:f2 +# SHA1 Fingerprint: 54:d3:ac:b3:bd:57:56:f6:85:9d:ce:e5:c3:21:e2:d4:ad:83:d0:93 +# SHA256 Fingerprint: ef:c6:5c:ad:bb:59:ad:b6:ef:e8:4d:a2:23:11:b3:56:24:b7:1b:3b:1e:a0:da:8b:66:55:17:4e:c8:97:86:46 +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBj +MQswCQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0 +eSBHbWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAy +MDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMyNzIzNTk1OVowYzELMAkGA1UEBhMC +REUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkG +A1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9 +cUD/h3VCKSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHV +cp6R+SPWcHu79ZvB7JPPGeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMA +U6DksquDOFczJZSfvkgdmOGjup5czQRxUX11eKvzWarE4GC+j4NSuHUaQTXtvPM6 +Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWol8hHD/BeEIvnHRz+sTug +BTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9FIS3R/qy +8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73J +co4vzLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg +8qKrBC7m8kwOFjQgrIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8 +rFEz0ciD0cmfHdRHNCk+y7AO+oMLKFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12 +mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7SWWO/gLCMk3PLNaaZlSJhZQNg ++y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtqeX +gj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2 +p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQ +pGv7qHBFfLp+sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm +9S3ul0A8Yute1hTWjOKWi0FpkzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErw +M807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy/SKE8YXJN3nptT+/XOR0so8RYgDd +GGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4mZqTuXNnQkYRIer+ +CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtzaL1t +xKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+ +w6jv/naaoqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aK +L4x35bcF7DvB7L6Gs4a8wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+lj +X273CXE2whJdV/LItM3z7gLfEdxquVeEHVlNjM7IDiPCtyaaEBRx/pOyiriA8A4Q +ntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0o82bNSQ3+pCTE4FCxpgm +dTdmQRCsu/WU48IxK63nI1bMNSWSs1A= +-----END CERTIFICATE----- + +# Issuer: CN=FIRMAPROFESIONAL CA ROOT-A WEB O=Firmaprofesional SA +# Subject: CN=FIRMAPROFESIONAL CA ROOT-A WEB O=Firmaprofesional SA +# Label: "FIRMAPROFESIONAL CA ROOT-A WEB" +# Serial: 65916896770016886708751106294915943533 +# MD5 Fingerprint: 82:b2:ad:45:00:82:b0:66:63:f8:5f:c3:67:4e:ce:a3 +# SHA1 Fingerprint: a8:31:11:74:a6:14:15:0d:ca:77:dd:0e:e4:0c:5d:58:fc:a0:72:a5 +# SHA256 Fingerprint: be:f2:56:da:f2:6e:9c:69:bd:ec:16:02:35:97:98:f3:ca:f7:18:21:a0:3e:01:82:57:c5:3c:65:61:7f:3d:4a +-----BEGIN CERTIFICATE----- +MIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQsw +CQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UE +YQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENB +IFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2WhcNNDcwMzMxMDkwMTM2WjBuMQsw +CQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UE +YQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENB +IFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zf +e9MEkVz6iMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6C +cyvHZpsKjECcfIr28jlgst7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FDY1w8ndYn81LsF7Kpryz3dvgwHQYDVR0O +BBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO +PQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgLcFBTApFw +hVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dG +XSaQpYXFuXqUPoeovQA= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA CYBER Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA CYBER Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA CYBER Root CA" +# Serial: 85076849864375384482682434040119489222 +# MD5 Fingerprint: 0b:33:a0:97:52:95:d4:a9:fd:bb:db:6e:a3:55:5b:51 +# SHA1 Fingerprint: f6:b1:1c:1a:83:38:e9:7b:db:b3:a8:c8:33:24:e0:2d:9c:7f:26:66 +# SHA256 Fingerprint: 3f:63:bb:28:14:be:17:4e:c8:b6:43:9c:f0:8d:6d:56:f0:b7:c4:05:88:3a:56:48:a3:34:42:4d:6b:3e:c5:58 +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQ +MQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290 +IENBMRswGQYDVQQDExJUV0NBIENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5 +WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FO +LUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NBIENZQkVSIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1sTs6P +40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxF +avcokPFhV8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/ +34bKS1PE2Y2yHer43CdTo0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684i +JkXXYJndzk834H/nY62wuFm40AZoNWDTNq5xQwTxaWV4fPMf88oon1oglWa0zbfu +j3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK/c/WMw+f+5eesRycnupf +Xtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkHIuNZW0CP +2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDA +S9TMfAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDA +oS/xUgXJP+92ZuJF2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzC +kHDXShi8fgGwsOsVHkQGzaRP6AzRwyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW +5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83QOGt4A1WNzAd +BgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB +AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0t +tGlTITVX1olNc79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn +68xDiBaiA9a5F/gZbG0jAn/xX9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNn +TKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDRIG4kqIQnoVesqlVYL9zZyvpoBJ7t +RCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq/p1hvIbZv97Tujqx +f36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0RFxbI +Qh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz +8ppy6rBePm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4 +NxKfKjLji7gh7MMrZQzvIt6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzX +xeSDwWrruoBa3lwtcHb4yOWHh8qgnaHlIhInD0Q9HWzq1MKLL295q39QpsQZp6F6 +t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign Root CA12 O=Cybertrust Japan Co., Ltd. +# Subject: CN=SecureSign Root CA12 O=Cybertrust Japan Co., Ltd. +# Label: "SecureSign Root CA12" +# Serial: 587887345431707215246142177076162061960426065942 +# MD5 Fingerprint: c6:89:ca:64:42:9b:62:08:49:0b:1e:7f:e9:07:3d:e8 +# SHA1 Fingerprint: 7a:22:1e:3d:de:1b:06:ac:9e:c8:47:70:16:8e:3c:e5:f7:6b:06:f4 +# SHA256 Fingerprint: 3f:03:4b:b5:70:4d:44:b2:d0:85:45:a0:20:57:de:93:eb:f3:90:5f:ce:72:1a:cb:c7:30:c0:6d:da:ee:90:4e +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u +LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgw +NTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD +eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS +b290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3emhF +KxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mt +p7JIKwccJ/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zd +J1M3s6oYwlkm7Fsf0uZlfO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gur +FzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBFEaCeVESE99g2zvVQR9wsMJvuwPWW0v4J +hscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1UefNzFJM3IFTQy2VYzxV4+K +h9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsF +AAOCAQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6Ld +mmQOmFxv3Y67ilQiLUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJ +mBClnW8Zt7vPemVV2zfrPIpyMpcemik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA +8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPSvWKErI4cqc1avTc7bgoitPQV +55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhgaaaI5gdka9at/ +yOPiZwud9AzqVN/Ssq+xIvEg37xEHA== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign Root CA14 O=Cybertrust Japan Co., Ltd. +# Subject: CN=SecureSign Root CA14 O=Cybertrust Japan Co., Ltd. +# Label: "SecureSign Root CA14" +# Serial: 575790784512929437950770173562378038616896959179 +# MD5 Fingerprint: 71:0d:72:fa:92:19:65:5e:89:04:ac:16:33:f0:bc:d5 +# SHA1 Fingerprint: dd:50:c0:f7:79:b3:64:2e:74:a2:b8:9d:9f:d3:40:dd:bb:f0:f2:4f +# SHA256 Fingerprint: 4b:00:9c:10:34:49:4f:9a:b5:6b:ba:3b:a1:d6:27:31:fc:4d:20:d8:95:5a:dc:ec:10:a9:25:60:72:61:e3:38 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEM +BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u +LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgw +NzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD +eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS +b290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh1oq/ +FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOg +vlIfX8xnbacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy +6pJxaeQp8E+BgQQ8sqVb1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo +/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9J +kdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOEkJTRX45zGRBdAuVwpcAQ +0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSxjVIHvXib +y8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac +18izju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs +0Wq2XSqypWa9a4X0dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIAB +SMbHdPTGrMNASRZhdCyvjG817XsYAFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVL +ApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeqYR3r6/wtbyPk +86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E +rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ib +ed87hwriZLoAymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopT +zfFP7ELyk+OZpDc8h7hi2/DsHzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHS +DCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPGFrojutzdfhrGe0K22VoF3Jpf1d+4 +2kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6qnsb58Nn4DSEC5MUo +FlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/OfVy +K4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6 +dB7h7sxaOgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtl +Lor6CZpO2oYofaphNdgOpygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB +365jJ6UeTo3cKXhZ+PmhIIynJkBugnLNeLLIjzwec+fBH7/PzqUqm9tEZDKgu39c +JRNItX+S +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign Root CA15 O=Cybertrust Japan Co., Ltd. +# Subject: CN=SecureSign Root CA15 O=Cybertrust Japan Co., Ltd. +# Label: "SecureSign Root CA15" +# Serial: 126083514594751269499665114766174399806381178503 +# MD5 Fingerprint: 13:30:fc:c4:62:a6:a9:de:b5:c1:68:af:b5:d2:31:47 +# SHA1 Fingerprint: cb:ba:83:c8:c1:5a:5d:f1:f9:73:6f:ca:d7:ef:28:13:06:4a:07:7d +# SHA256 Fingerprint: e7:78:f0:f0:95:fe:84:37:29:cd:1a:00:82:17:9e:53:14:a9:c2:91:44:28:05:e1:fb:1d:8f:b6:b8:88:6c:3a +-----BEGIN CERTIFICATE----- +MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMw +UTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBM +dGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMy +NTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpDeWJl +cnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBSb290 +IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5GdCx4 +wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSR +ZHX+AezB2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT +9DAKBggqhkjOPQQDAwNoADBlAjEA2S6Jfl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp +4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJSwdLZrWeqrqgHkHZAXQ6 +bkU6iYAZezKYVWOr62Nuk22rGwlgMU4= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST BR Root CA 2 2023 O=D-Trust GmbH +# Subject: CN=D-TRUST BR Root CA 2 2023 O=D-Trust GmbH +# Label: "D-TRUST BR Root CA 2 2023" +# Serial: 153168538924886464690566649552453098598 +# MD5 Fingerprint: e1:09:ed:d3:60:d4:56:1b:47:1f:b7:0c:5f:1b:5f:85 +# SHA1 Fingerprint: 2d:b0:70:ee:71:94:af:69:68:17:db:79:ce:58:9f:a0:6b:96:f7:87 +# SHA256 Fingerprint: 05:52:e6:f8:3f:df:65:e8:fa:96:70:e6:66:df:28:a4:e2:13:40:b5:10:cb:e5:25:66:f9:7c:4f:b9:4b:2b:d1 +-----BEGIN CERTIFICATE----- +MIIFqTCCA5GgAwIBAgIQczswBEhb2U14LnNLyaHcZjANBgkqhkiG9w0BAQ0FADBI +MQswCQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlE +LVRSVVNUIEJSIFJvb3QgQ0EgMiAyMDIzMB4XDTIzMDUwOTA4NTYzMVoXDTM4MDUw +OTA4NTYzMFowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEi +MCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDIgMjAyMzCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAK7/CVmRgApKaOYkP7in5Mg6CjoWzckjYaCTcfKr +i3OPoGdlYNJUa2NRb0kz4HIHE304zQaSBylSa053bATTlfrdTIzZXcFhfUvnKLNE +gXtRr90zsWh81k5M/itoucpmacTsXld/9w3HnDY25QdgrMBM6ghs7wZ8T1soegj8 +k12b9py0i4a6Ibn08OhZWiihNIQaJZG2tY/vsvmA+vk9PBFy2OMvhnbFeSzBqZCT +Rphny4NqoFAjpzv2gTng7fC5v2Xx2Mt6++9zA84A9H3X4F07ZrjcjrqDy4d2A/wl +2ecjbwb9Z/Pg/4S8R7+1FhhGaRTMBffb00msa8yr5LULQyReS2tNZ9/WtT5PeB+U +cSTq3nD88ZP+npNa5JRal1QMNXtfbO4AHyTsA7oC9Xb0n9Sa7YUsOCIvx9gvdhFP +/Wxc6PWOJ4d/GUohR5AdeY0cW/jPSoXk7bNbjb7EZChdQcRurDhaTyN0dKkSw/bS +uREVMweR2Ds3OmMwBtHFIjYoYiMQ4EbMl6zWK11kJNXuHA7e+whadSr2Y23OC0K+ +0bpwHJwh5Q8xaRfX/Aq03u2AnMuStIv13lmiWAmlY0cL4UEyNEHZmrHZqLAbWt4N +DfTisl01gLmB1IRpkQLLddCNxbU9CZEJjxShFHR5PtbJFR2kWVki3PaKRT08EtY+ +XTIvAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUZ5Dw1t61 +GNVGKX5cq/ieCLxklRAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRCMEAwPqA8oDqG +OGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfYnJfcm9vdF9jYV8y +XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQA097N3U9swFrktpSHxQCF16+tI +FoE9c+CeJyrrd6kTpGoKWloUMz1oH4Guaf2Mn2VsNELZLdB/eBaxOqwjMa1ef67n +riv6uvw8l5VAk1/DLQOj7aRvU9f6QA4w9QAgLABMjDu0ox+2v5Eyq6+SmNMW5tTR +VFxDWy6u71cqqLRvpO8NVhTaIasgdp4D/Ca4nj8+AybmTNudX0KEPUUDAxxZiMrc +LmEkWqTqJwtzEr5SswrPMhfiHocaFpVIbVrg0M8JkiZmkdijYQ6qgYF/6FKC0ULn +4B0Y+qSFNueG4A3rvNTJ1jxD8V1Jbn6Bm2m1iWKPiFLY1/4nwSPFyysCu7Ff/vtD +hQNGvl3GyiEm/9cCnnRK3PgTFbGBVzbLZVzRHTF36SXDw7IyN9XxmAnkbWOACKsG +koHU6XCPpz+y7YaMgmo1yEJagtFSGkUPFaUA8JR7ZSdXOUPPfH/mvTWze/EZTN46 +ls/pdu4D58JDUjxqgejBWoC9EV2Ta/vH5mQ/u2kc6d0li690yVRAysuTEwrt+2aS +Ecr1wPrYg1UDfNPFIkZ1cGt5SAYqgpq/5usWDiJFAbzdNpQ0qTUmiteXue4Icr80 +knCDgKs4qllo3UCkGJCy89UDyibK79XH4I9TjvAA46jtn/mtd+ArY0+ew+43u3gJ +hJ65bvspmZDogNOfJA== +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST EV Root CA 2 2023 O=D-Trust GmbH +# Subject: CN=D-TRUST EV Root CA 2 2023 O=D-Trust GmbH +# Label: "D-TRUST EV Root CA 2 2023" +# Serial: 139766439402180512324132425437959641711 +# MD5 Fingerprint: 96:b4:78:09:f0:09:cb:77:eb:bb:1b:4d:6f:36:bc:b6 +# SHA1 Fingerprint: a5:5b:d8:47:6c:8f:19:f7:4c:f4:6d:6b:b6:c2:79:82:22:df:54:8b +# SHA256 Fingerprint: 8e:82:21:b2:e7:d4:00:78:36:a1:67:2f:0d:cc:29:9c:33:bc:07:d3:16:f1:32:fa:1a:20:6d:58:71:50:f1:ce +-----BEGIN CERTIFICATE----- +MIIFqTCCA5GgAwIBAgIQaSYJfoBLTKCnjHhiU19abzANBgkqhkiG9w0BAQ0FADBI +MQswCQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlE +LVRSVVNUIEVWIFJvb3QgQ0EgMiAyMDIzMB4XDTIzMDUwOTA5MTAzM1oXDTM4MDUw +OTA5MTAzMlowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEi +MCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDIgMjAyMzCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBANiOo4mAC7JXUtypU0w3uX9jFxPvp1sjW2l1sJkK +F8GLxNuo4MwxusLyzV3pt/gdr2rElYfXR8mV2IIEUD2BCP/kPbOx1sWy/YgJ25yE +7CUXFId/MHibaljJtnMoPDT3mfd/06b4HEV8rSyMlD/YZxBTfiLNTiVR8CUkNRFe +EMbsh2aJgWi6zCudR3Mfvc2RpHJqnKIbGKBv7FD0fUDCqDDPvXPIEysQEx6Lmqg6 +lHPTGGkKSv/BAQP/eX+1SH977ugpbzZMlWGG2Pmic4ruri+W7mjNPU0oQvlFKzIb +RlUWaqZLKfm7lVa/Rh3sHZMdwGWyH6FDrlaeoLGPaxK3YG14C8qKXO0elg6DpkiV +jTujIcSuWMYAsoS0I6SWhjW42J7YrDRJmGOVxcttSEfi8i4YHtAxq9107PncjLgc +jmgjutDzUNzPZY9zOjLHfP7KgiJPvo5iR2blzYfi6NUPGJ/lBHJLRjwQ8kTCZFZx +TnXonMkmdMV9WdEKWw9t/p51HBjGGjp82A0EzM23RWV6sY+4roRIPrN6TagD4uJ+ +ARZZaBhDM7DS3LAaQzXupdqpRlyuhoFBAUp0JuyfBr/CBTdkdXgpaP3F9ev+R/nk +hbDhezGdpn9yo7nELC7MmVcOIQxFAZRl62UJxmMiCzNJkkg8/M3OsD6Onov4/knF +NXJHAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqvyREBuH +kV8Wub9PS5FeAByxMoAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRCMEAwPqA8oDqG +OGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfZXZfcm9vdF9jYV8y +XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQCTy6UfmRHsmg1fLBWTxj++EI14 +QvBukEdHjqOSMo1wj/Zbjb6JzkcBahsgIIlbyIIQbODnmaprxiqgYzWRaoUlrRc4 +pZt+UPJ26oUFKidBK7GB0aL2QHWpDsvxVUjY7NHss+jOFKE17MJeNRqrphYBBo7q +3C+jisosketSjl8MmxfPy3MHGcRqwnNU73xDUmPBEcrCRbH0O1P1aa4846XerOhU +t7KR/aypH/KH5BfGSah82ApB9PI+53c0BFLd6IHyTS9URZ0V4U/M5d40VxDJI3IX +cI1QcB9WbMy5/zpaT2N6w25lBx2Eof+pDGOJbbJAiDnXH3dotfyc1dZnaVuodNv8 +ifYbMvekJKZ2t0dT741Jj6m2g1qllpBFYfXeA08mD6iL8AOWsKwV0HFaanuU5nCT +2vFp4LJiTZ6P/4mdm13NRemUAiKN4DV/6PEEeXFsVIP4M7kFMhtYVRFP0OUnR3Hs +7dpn1mKmS00PaaLJvOwiS5THaJQXfuKOKD62xur1NGyfN4gHONuGcfrNlUhDbqNP +gofXNJhuS5N5YHVpD/Aa1VP6IQzCP+k/HxiMkl14p3ZnGbuy6n/pcAlWVqOwDAst +Nl7F6cTVg8uGF5csbBNvh1qvSaYd2804BC5f4ko1Di1L+KIkBI3Y4WNeApI02phh +XBxvWHZks/wCuPWdCg== +-----END CERTIFICATE----- diff --git a/output/Pc-monitor/_internal/certifi/py.typed b/output/Pc-monitor/_internal/certifi/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/output/Pc-monitor/_internal/charset_normalizer/md.cp313-win_amd64.pyd b/output/Pc-monitor/_internal/charset_normalizer/md.cp313-win_amd64.pyd new file mode 100644 index 0000000..f94917f Binary files /dev/null and b/output/Pc-monitor/_internal/charset_normalizer/md.cp313-win_amd64.pyd differ diff --git a/output/Pc-monitor/_internal/charset_normalizer/md__mypyc.cp313-win_amd64.pyd b/output/Pc-monitor/_internal/charset_normalizer/md__mypyc.cp313-win_amd64.pyd new file mode 100644 index 0000000..4835b89 Binary files /dev/null and b/output/Pc-monitor/_internal/charset_normalizer/md__mypyc.cp313-win_amd64.pyd differ diff --git a/output/Pc-monitor/_internal/click-8.2.1.dist-info/INSTALLER b/output/Pc-monitor/_internal/click-8.2.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/output/Pc-monitor/_internal/click-8.2.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/output/Pc-monitor/_internal/click-8.2.1.dist-info/METADATA b/output/Pc-monitor/_internal/click-8.2.1.dist-info/METADATA new file mode 100644 index 0000000..e6c05af --- /dev/null +++ b/output/Pc-monitor/_internal/click-8.2.1.dist-info/METADATA @@ -0,0 +1,82 @@ +Metadata-Version: 2.4 +Name: click +Version: 8.2.1 +Summary: Composable command line interface toolkit +Maintainer-email: Pallets +Requires-Python: >=3.10 +Description-Content-Type: text/markdown +License-Expression: BSD-3-Clause +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Typing :: Typed +License-File: LICENSE.txt +Requires-Dist: colorama; platform_system == 'Windows' +Project-URL: Changes, https://click.palletsprojects.com/page/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://click.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Source, https://github.com/pallets/click/ + +# $ click_ + +Click is a Python package for creating beautiful command line interfaces +in a composable way with as little code as necessary. It's the "Command +Line Interface Creation Kit". It's highly configurable but comes with +sensible defaults out of the box. + +It aims to make the process of writing command line tools quick and fun +while also preventing any frustration caused by the inability to +implement an intended CLI API. + +Click in three points: + +- Arbitrary nesting of commands +- Automatic help page generation +- Supports lazy loading of subcommands at runtime + + +## A Simple Example + +```python +import click + +@click.command() +@click.option("--count", default=1, help="Number of greetings.") +@click.option("--name", prompt="Your name", help="The person to greet.") +def hello(count, name): + """Simple program that greets NAME for a total of COUNT times.""" + for _ in range(count): + click.echo(f"Hello, {name}!") + +if __name__ == '__main__': + hello() +``` + +``` +$ python hello.py --count=3 +Your name: Click +Hello, Click! +Hello, Click! +Hello, Click! +``` + + +## Donate + +The Pallets organization develops and supports Click and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, [please +donate today][]. + +[please donate today]: https://palletsprojects.com/donate + +## Contributing + +See our [detailed contributing documentation][contrib] for many ways to +contribute, including reporting issues, requesting features, asking or answering +questions, and making PRs. + +[contrib]: https://palletsprojects.com/contributing/ + diff --git a/output/Pc-monitor/_internal/click-8.2.1.dist-info/RECORD b/output/Pc-monitor/_internal/click-8.2.1.dist-info/RECORD new file mode 100644 index 0000000..e8997cd --- /dev/null +++ b/output/Pc-monitor/_internal/click-8.2.1.dist-info/RECORD @@ -0,0 +1,38 @@ +click-8.2.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +click-8.2.1.dist-info/METADATA,sha256=dI1MbhHTLoKD2tNCCGnx9rK2gok23HDNylFeLKdLSik,2471 +click-8.2.1.dist-info/RECORD,, +click-8.2.1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82 +click-8.2.1.dist-info/licenses/LICENSE.txt,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 +click/__init__.py,sha256=6YyS1aeyknZ0LYweWozNZy0A9nZ_11wmYIhv3cbQrYo,4473 +click/__pycache__/__init__.cpython-313.pyc,, +click/__pycache__/_compat.cpython-313.pyc,, +click/__pycache__/_termui_impl.cpython-313.pyc,, +click/__pycache__/_textwrap.cpython-313.pyc,, +click/__pycache__/_winconsole.cpython-313.pyc,, +click/__pycache__/core.cpython-313.pyc,, +click/__pycache__/decorators.cpython-313.pyc,, +click/__pycache__/exceptions.cpython-313.pyc,, +click/__pycache__/formatting.cpython-313.pyc,, +click/__pycache__/globals.cpython-313.pyc,, +click/__pycache__/parser.cpython-313.pyc,, +click/__pycache__/shell_completion.cpython-313.pyc,, +click/__pycache__/termui.cpython-313.pyc,, +click/__pycache__/testing.cpython-313.pyc,, +click/__pycache__/types.cpython-313.pyc,, +click/__pycache__/utils.cpython-313.pyc,, +click/_compat.py,sha256=v3xBZkFbvA1BXPRkFfBJc6-pIwPI7345m-kQEnpVAs4,18693 +click/_termui_impl.py,sha256=ASXhLi9IQIc0Js9KQSS-3-SLZcPet3VqysBf9WgbbpI,26712 +click/_textwrap.py,sha256=BOae0RQ6vg3FkNgSJyOoGzG1meGMxJ_ukWVZKx_v-0o,1400 +click/_winconsole.py,sha256=_vxUuUaxwBhoR0vUWCNuHY8VUefiMdCIyU2SXPqoF-A,8465 +click/core.py,sha256=gUhpNS9cFBGdEXXdisGVG-eRvGf49RTyFagxulqwdFw,117343 +click/decorators.py,sha256=5P7abhJtAQYp_KHgjUvhMv464ERwOzrv2enNknlwHyQ,18461 +click/exceptions.py,sha256=1rdtXgHJ1b3OjGkN-UpXB9t_HCBihJvh_DtpmLmwn9s,9891 +click/formatting.py,sha256=Bhqx4QXdKQ9W4WKknIwj5KPKFmtduGOuGq1yw_THLZ8,9726 +click/globals.py,sha256=gM-Nh6A4M0HB_SgkaF5M4ncGGMDHc_flHXu9_oh4GEU,1923 +click/parser.py,sha256=nU1Ah2p11q29ul1vNdU9swPo_PUuKrxU6YXToi71q1c,18979 +click/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +click/shell_completion.py,sha256=CQSGdjgun4ORbOZrXP0CVhEtPx4knsufOkRsDiK64cM,19857 +click/termui.py,sha256=vAYrKC2a7f_NfEIhAThEVYfa__ib5XQbTSCGtJlABRA,30847 +click/testing.py,sha256=2eLdAaCJCGToP5Tw-XN8JjrDb3wbJIfARxg3d0crW5M,18702 +click/types.py,sha256=KBTRxN28cR1VZ5mb9iJX98MQSw_p9SGzljqfEI8z5Tw,38389 +click/utils.py,sha256=b1Mm-usEDBHtEwcPltPIn3zSK4nw2KTp5GC7_oSTlLo,20245 diff --git a/output/Pc-monitor/_internal/click-8.2.1.dist-info/WHEEL b/output/Pc-monitor/_internal/click-8.2.1.dist-info/WHEEL new file mode 100644 index 0000000..d8b9936 --- /dev/null +++ b/output/Pc-monitor/_internal/click-8.2.1.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.12.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/output/Pc-monitor/_internal/click-8.2.1.dist-info/licenses/LICENSE.txt b/output/Pc-monitor/_internal/click-8.2.1.dist-info/licenses/LICENSE.txt new file mode 100644 index 0000000..d12a849 --- /dev/null +++ b/output/Pc-monitor/_internal/click-8.2.1.dist-info/licenses/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2014 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/output/Pc-monitor/_internal/flask-3.0.0.dist-info/INSTALLER b/output/Pc-monitor/_internal/flask-3.0.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/output/Pc-monitor/_internal/flask-3.0.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/output/Pc-monitor/_internal/flask-3.0.0.dist-info/LICENSE.rst b/output/Pc-monitor/_internal/flask-3.0.0.dist-info/LICENSE.rst new file mode 100644 index 0000000..9d227a0 --- /dev/null +++ b/output/Pc-monitor/_internal/flask-3.0.0.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/output/Pc-monitor/_internal/flask-3.0.0.dist-info/METADATA b/output/Pc-monitor/_internal/flask-3.0.0.dist-info/METADATA new file mode 100644 index 0000000..b802e93 --- /dev/null +++ b/output/Pc-monitor/_internal/flask-3.0.0.dist-info/METADATA @@ -0,0 +1,116 @@ +Metadata-Version: 2.1 +Name: Flask +Version: 3.0.0 +Summary: A simple framework for building complex web applications. +Maintainer-email: Pallets +Requires-Python: >=3.8 +Description-Content-Type: text/x-rst +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Framework :: Flask +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Requires-Dist: Werkzeug>=3.0.0 +Requires-Dist: Jinja2>=3.1.2 +Requires-Dist: itsdangerous>=2.1.2 +Requires-Dist: click>=8.1.3 +Requires-Dist: blinker>=1.6.2 +Requires-Dist: importlib-metadata>=3.6.0; python_version < '3.10' +Requires-Dist: asgiref>=3.2 ; extra == "async" +Requires-Dist: python-dotenv ; extra == "dotenv" +Project-URL: Changes, https://flask.palletsprojects.com/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://flask.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Issue Tracker, https://github.com/pallets/flask/issues/ +Project-URL: Source Code, https://github.com/pallets/flask/ +Provides-Extra: async +Provides-Extra: dotenv + +Flask +===== + +Flask is a lightweight `WSGI`_ web application framework. It is designed +to make getting started quick and easy, with the ability to scale up to +complex applications. It began as a simple wrapper around `Werkzeug`_ +and `Jinja`_ and has become one of the most popular Python web +application frameworks. + +Flask offers suggestions, but doesn't enforce any dependencies or +project layout. It is up to the developer to choose the tools and +libraries they want to use. There are many extensions provided by the +community that make adding new functionality easy. + +.. _WSGI: https://wsgi.readthedocs.io/ +.. _Werkzeug: https://werkzeug.palletsprojects.com/ +.. _Jinja: https://jinja.palletsprojects.com/ + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U Flask + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +A Simple Example +---------------- + +.. code-block:: python + + # save this as app.py + from flask import Flask + + app = Flask(__name__) + + @app.route("/") + def hello(): + return "Hello, World!" + +.. code-block:: text + + $ flask run + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) + + +Contributing +------------ + +For guidance on setting up a development environment and how to make a +contribution to Flask, see the `contributing guidelines`_. + +.. _contributing guidelines: https://github.com/pallets/flask/blob/main/CONTRIBUTING.rst + + +Donate +------ + +The Pallets organization develops and supports Flask and the libraries +it uses. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://flask.palletsprojects.com/ +- Changes: https://flask.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/Flask/ +- Source Code: https://github.com/pallets/flask/ +- Issue Tracker: https://github.com/pallets/flask/issues/ +- Chat: https://discord.gg/pallets + diff --git a/output/Pc-monitor/_internal/flask-3.0.0.dist-info/RECORD b/output/Pc-monitor/_internal/flask-3.0.0.dist-info/RECORD new file mode 100644 index 0000000..c49f67b --- /dev/null +++ b/output/Pc-monitor/_internal/flask-3.0.0.dist-info/RECORD @@ -0,0 +1,58 @@ +../../Scripts/flask.exe,sha256=ND9f0z8XN9fqR_S6jQEm-9esibL5LMMT-NWKLivt0pI,108381 +flask-3.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +flask-3.0.0.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +flask-3.0.0.dist-info/METADATA,sha256=02XP69VTiwn5blcRgHcyuSQ2cLTuJFV8FXw2x4QnxKo,3588 +flask-3.0.0.dist-info/RECORD,, +flask-3.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask-3.0.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +flask-3.0.0.dist-info/entry_points.txt,sha256=bBP7hTOS5fz9zLtC7sPofBZAlMkEvBxu7KqS6l5lvc4,40 +flask/__init__.py,sha256=6xMqdVA0FIQ2U1KVaGX3lzNCdXPzoHPaa0hvQCNcfSk,2625 +flask/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30 +flask/__pycache__/__init__.cpython-313.pyc,, +flask/__pycache__/__main__.cpython-313.pyc,, +flask/__pycache__/app.cpython-313.pyc,, +flask/__pycache__/blueprints.cpython-313.pyc,, +flask/__pycache__/cli.cpython-313.pyc,, +flask/__pycache__/config.cpython-313.pyc,, +flask/__pycache__/ctx.cpython-313.pyc,, +flask/__pycache__/debughelpers.cpython-313.pyc,, +flask/__pycache__/globals.cpython-313.pyc,, +flask/__pycache__/helpers.cpython-313.pyc,, +flask/__pycache__/logging.cpython-313.pyc,, +flask/__pycache__/sessions.cpython-313.pyc,, +flask/__pycache__/signals.cpython-313.pyc,, +flask/__pycache__/templating.cpython-313.pyc,, +flask/__pycache__/testing.cpython-313.pyc,, +flask/__pycache__/typing.cpython-313.pyc,, +flask/__pycache__/views.cpython-313.pyc,, +flask/__pycache__/wrappers.cpython-313.pyc,, +flask/app.py,sha256=voUkc9xk9B039AhVrU21GDpsQ6wqrr-NobqLx8fURfQ,59201 +flask/blueprints.py,sha256=zO8bLO9Xy1aVD92bDmzihutjVEXf8xdDaVfiy7c--Ck,3129 +flask/cli.py,sha256=PDwZCfPagi5GUzb-D6dEN7y20gWiVAg3ejRnxBKNHPA,33821 +flask/config.py,sha256=YZSZ-xpFj1iW1B1Kj1iDhpc5s7pHncloiRLqXhsU7Hs,12856 +flask/ctx.py,sha256=x2kGzUXtPzVyi2YSKrU_PV1AvtxTmh2iRdriJRTSPGM,14841 +flask/debughelpers.py,sha256=WKzD2FNTSimNSwCJVLr9_fFo1f2VlTWB5EZ6lmR5bwE,5548 +flask/globals.py,sha256=XdQZmStBmPIs8t93tjx6pO7Bm3gobAaONWkFcUHaGas,1713 +flask/helpers.py,sha256=ynEoMB7fdF5Y1P-ngxMjZDZWfrJ4St-9OGZZsTcUwx8,22992 +flask/json/__init__.py,sha256=pdtpoK2b0b1u7Sxbx3feM7VWhsI20l1yGAvbYWxaxvc,5572 +flask/json/__pycache__/__init__.cpython-313.pyc,, +flask/json/__pycache__/provider.cpython-313.pyc,, +flask/json/__pycache__/tag.cpython-313.pyc,, +flask/json/provider.py,sha256=VBKSK75t3OsTvZ3N10B3Fsu7-NdpfrGYcl41goQJ3q8,7640 +flask/json/tag.py,sha256=ihb7QWrNEr0YC3KD4TolZbftgSPCuLk7FAvK49huYC0,8871 +flask/logging.py,sha256=VcdJgW4Axm5l_-7vXLQjRTL0eckaMks7Ya_HaoDm0wg,2330 +flask/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask/sansio/README.md,sha256=-0X1tECnilmz1cogx-YhNw5d7guK7GKrq_DEV2OzlU0,228 +flask/sansio/__pycache__/app.cpython-313.pyc,, +flask/sansio/__pycache__/blueprints.cpython-313.pyc,, +flask/sansio/__pycache__/scaffold.cpython-313.pyc,, +flask/sansio/app.py,sha256=nZWCFMOW8qK95Ck9UvDzxvswQr-coLJhIFaa_OVobCc,37977 +flask/sansio/blueprints.py,sha256=caskVI1Zf3mM5msevK5-tWy3VqX_A8mlB0KGNyRx5_0,24319 +flask/sansio/scaffold.py,sha256=-Cus0cVS4PmLof4qLvfjSQzk4AKsLqPR6LBpv6ALw3Y,30580 +flask/sessions.py,sha256=rFH2QKXG24dEazkKGxAHqUpAUh_30hDHrddhVYgAcY0,14169 +flask/signals.py,sha256=V7lMUww7CqgJ2ThUBn1PiatZtQanOyt7OZpu2GZI-34,750 +flask/templating.py,sha256=EtL8CE5z2aefdR1I-TWYVNg0cSuXBqz_lvOGKeggktk,7538 +flask/testing.py,sha256=h7AinggrMgGzKlDN66VfB0JjWW4Z1U_OD6FyjqBNiYM,10017 +flask/typing.py,sha256=2pGlhSaZqJVJOoh-QdH-20QVzl2r-zLXyP8otXfCCs4,3156 +flask/views.py,sha256=V5hOGZLx0Bn99QGcM6mh5x_uM-MypVT0-RysEFU84jc,6789 +flask/wrappers.py,sha256=PhMp3teK3SnEmIdog59cO_DHiZ9Btn0qI1EifrTdwP8,5709 diff --git a/output/Pc-monitor/_internal/flask-3.0.0.dist-info/REQUESTED b/output/Pc-monitor/_internal/flask-3.0.0.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/output/Pc-monitor/_internal/flask-3.0.0.dist-info/WHEEL b/output/Pc-monitor/_internal/flask-3.0.0.dist-info/WHEEL new file mode 100644 index 0000000..3b5e64b --- /dev/null +++ b/output/Pc-monitor/_internal/flask-3.0.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.9.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/output/Pc-monitor/_internal/flask-3.0.0.dist-info/entry_points.txt b/output/Pc-monitor/_internal/flask-3.0.0.dist-info/entry_points.txt new file mode 100644 index 0000000..eec6733 --- /dev/null +++ b/output/Pc-monitor/_internal/flask-3.0.0.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +flask=flask.cli:main + diff --git a/output/Pc-monitor/_internal/itsdangerous-2.2.0.dist-info/INSTALLER b/output/Pc-monitor/_internal/itsdangerous-2.2.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/output/Pc-monitor/_internal/itsdangerous-2.2.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/output/Pc-monitor/_internal/itsdangerous-2.2.0.dist-info/LICENSE.txt b/output/Pc-monitor/_internal/itsdangerous-2.2.0.dist-info/LICENSE.txt new file mode 100644 index 0000000..7b190ca --- /dev/null +++ b/output/Pc-monitor/_internal/itsdangerous-2.2.0.dist-info/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2011 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/output/Pc-monitor/_internal/itsdangerous-2.2.0.dist-info/METADATA b/output/Pc-monitor/_internal/itsdangerous-2.2.0.dist-info/METADATA new file mode 100644 index 0000000..ddf5464 --- /dev/null +++ b/output/Pc-monitor/_internal/itsdangerous-2.2.0.dist-info/METADATA @@ -0,0 +1,60 @@ +Metadata-Version: 2.1 +Name: itsdangerous +Version: 2.2.0 +Summary: Safely pass data to untrusted environments and back. +Maintainer-email: Pallets +Requires-Python: >=3.8 +Description-Content-Type: text/markdown +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Typing :: Typed +Project-URL: Changes, https://itsdangerous.palletsprojects.com/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://itsdangerous.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Source, https://github.com/pallets/itsdangerous/ + +# ItsDangerous + +... so better sign this + +Various helpers to pass data to untrusted environments and to get it +back safe and sound. Data is cryptographically signed to ensure that a +token has not been tampered with. + +It's possible to customize how data is serialized. Data is compressed as +needed. A timestamp can be added and verified automatically while +loading a token. + + +## A Simple Example + +Here's how you could generate a token for transmitting a user's id and +name between web requests. + +```python +from itsdangerous import URLSafeSerializer +auth_s = URLSafeSerializer("secret key", "auth") +token = auth_s.dumps({"id": 5, "name": "itsdangerous"}) + +print(token) +# eyJpZCI6NSwibmFtZSI6Iml0c2Rhbmdlcm91cyJ9.6YP6T0BaO67XP--9UzTrmurXSmg + +data = auth_s.loads(token) +print(data["name"]) +# itsdangerous +``` + + +## Donate + +The Pallets organization develops and supports ItsDangerous and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +[please donate today][]. + +[please donate today]: https://palletsprojects.com/donate + diff --git a/output/Pc-monitor/_internal/itsdangerous-2.2.0.dist-info/RECORD b/output/Pc-monitor/_internal/itsdangerous-2.2.0.dist-info/RECORD new file mode 100644 index 0000000..db2ef47 --- /dev/null +++ b/output/Pc-monitor/_internal/itsdangerous-2.2.0.dist-info/RECORD @@ -0,0 +1,22 @@ +itsdangerous-2.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +itsdangerous-2.2.0.dist-info/LICENSE.txt,sha256=Y68JiRtr6K0aQlLtQ68PTvun_JSOIoNnvtfzxa4LCdc,1475 +itsdangerous-2.2.0.dist-info/METADATA,sha256=0rk0-1ZwihuU5DnwJVwPWoEI4yWOyCexih3JyZHblhE,1924 +itsdangerous-2.2.0.dist-info/RECORD,, +itsdangerous-2.2.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +itsdangerous/__init__.py,sha256=4SK75sCe29xbRgQE1ZQtMHnKUuZYAf3bSpZOrff1IAY,1427 +itsdangerous/__pycache__/__init__.cpython-313.pyc,, +itsdangerous/__pycache__/_json.cpython-313.pyc,, +itsdangerous/__pycache__/encoding.cpython-313.pyc,, +itsdangerous/__pycache__/exc.cpython-313.pyc,, +itsdangerous/__pycache__/serializer.cpython-313.pyc,, +itsdangerous/__pycache__/signer.cpython-313.pyc,, +itsdangerous/__pycache__/timed.cpython-313.pyc,, +itsdangerous/__pycache__/url_safe.cpython-313.pyc,, +itsdangerous/_json.py,sha256=wPQGmge2yZ9328EHKF6gadGeyGYCJQKxtU-iLKE6UnA,473 +itsdangerous/encoding.py,sha256=wwTz5q_3zLcaAdunk6_vSoStwGqYWe307Zl_U87aRFM,1409 +itsdangerous/exc.py,sha256=Rr3exo0MRFEcPZltwecyK16VV1bE2K9_F1-d-ljcUn4,3201 +itsdangerous/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +itsdangerous/serializer.py,sha256=PmdwADLqkSyQLZ0jOKAgDsAW4k_H0TlA71Ei3z0C5aI,15601 +itsdangerous/signer.py,sha256=YO0CV7NBvHA6j549REHJFUjUojw2pHqwcUpQnU7yNYQ,9647 +itsdangerous/timed.py,sha256=6RvDMqNumGMxf0-HlpaZdN9PUQQmRvrQGplKhxuivUs,8083 +itsdangerous/url_safe.py,sha256=az4e5fXi_vs-YbWj8YZwn4wiVKfeD--GEKRT5Ueu4P4,2505 diff --git a/output/Pc-monitor/_internal/itsdangerous-2.2.0.dist-info/WHEEL b/output/Pc-monitor/_internal/itsdangerous-2.2.0.dist-info/WHEEL new file mode 100644 index 0000000..3b5e64b --- /dev/null +++ b/output/Pc-monitor/_internal/itsdangerous-2.2.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.9.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/output/Pc-monitor/_internal/libcrypto-3.dll b/output/Pc-monitor/_internal/libcrypto-3.dll new file mode 100644 index 0000000..66f64d0 Binary files /dev/null and b/output/Pc-monitor/_internal/libcrypto-3.dll differ diff --git a/output/Pc-monitor/_internal/libffi-8.dll b/output/Pc-monitor/_internal/libffi-8.dll new file mode 100644 index 0000000..8ebbbe8 Binary files /dev/null and b/output/Pc-monitor/_internal/libffi-8.dll differ diff --git a/output/Pc-monitor/_internal/libssl-3.dll b/output/Pc-monitor/_internal/libssl-3.dll new file mode 100644 index 0000000..0a9394c Binary files /dev/null and b/output/Pc-monitor/_internal/libssl-3.dll differ diff --git a/output/Pc-monitor/_internal/markupsafe/_speedups.cp313-win_amd64.pyd b/output/Pc-monitor/_internal/markupsafe/_speedups.cp313-win_amd64.pyd new file mode 100644 index 0000000..014e46d Binary files /dev/null and b/output/Pc-monitor/_internal/markupsafe/_speedups.cp313-win_amd64.pyd differ diff --git a/output/Pc-monitor/_internal/plugins/__init__.py b/output/Pc-monitor/_internal/plugins/__init__.py new file mode 100644 index 0000000..aad41b5 --- /dev/null +++ b/output/Pc-monitor/_internal/plugins/__init__.py @@ -0,0 +1,35 @@ +# Plugins pour PC Monitor +from .base import BasePlugin +from .librehardwaremonitor import LibreHardwareMonitorPlugin +from .hwinfo import HWiNFOPlugin + +# Registry des plugins disponibles +PLUGINS = { + 'librehardwaremonitor': LibreHardwareMonitorPlugin, + 'hwinfo': HWiNFOPlugin +} + +def get_plugin(name: str, config: dict) -> BasePlugin: + """Retourne une instance du plugin demandé""" + if name not in PLUGINS: + raise ValueError(f"Plugin inconnu: {name}") + return PLUGINS[name](config) + +def get_available_plugins() -> list: + """Retourne la liste des plugins disponibles""" + return [ + { + 'id': 'librehardwaremonitor', + 'name': 'LibreHardwareMonitor', + 'description': 'Open source, API REST intégrée', + 'default_port': 8085, + 'website': 'https://github.com/LibreHardwareMonitor/LibreHardwareMonitor' + }, + { + 'id': 'hwinfo', + 'name': 'HWiNFO + RemoteHWInfo', + 'description': 'HWiNFO avec RemoteHWInfo (github.com/Demion/remotehwinfo)', + 'default_port': 60000, + 'website': 'https://github.com/Demion/remotehwinfo' + } + ] diff --git a/output/Pc-monitor/_internal/plugins/__pycache__/__init__.cpython-313.pyc b/output/Pc-monitor/_internal/plugins/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000..555873a Binary files /dev/null and b/output/Pc-monitor/_internal/plugins/__pycache__/__init__.cpython-313.pyc differ diff --git a/output/Pc-monitor/_internal/plugins/__pycache__/base.cpython-313.pyc b/output/Pc-monitor/_internal/plugins/__pycache__/base.cpython-313.pyc new file mode 100644 index 0000000..6096cb9 Binary files /dev/null and b/output/Pc-monitor/_internal/plugins/__pycache__/base.cpython-313.pyc differ diff --git a/output/Pc-monitor/_internal/plugins/__pycache__/hwinfo.cpython-313.pyc b/output/Pc-monitor/_internal/plugins/__pycache__/hwinfo.cpython-313.pyc new file mode 100644 index 0000000..72f14df Binary files /dev/null and b/output/Pc-monitor/_internal/plugins/__pycache__/hwinfo.cpython-313.pyc differ diff --git a/output/Pc-monitor/_internal/plugins/__pycache__/librehardwaremonitor.cpython-313.pyc b/output/Pc-monitor/_internal/plugins/__pycache__/librehardwaremonitor.cpython-313.pyc new file mode 100644 index 0000000..af4e8e5 Binary files /dev/null and b/output/Pc-monitor/_internal/plugins/__pycache__/librehardwaremonitor.cpython-313.pyc differ diff --git a/output/Pc-monitor/_internal/plugins/base.py b/output/Pc-monitor/_internal/plugins/base.py new file mode 100644 index 0000000..dd59afa --- /dev/null +++ b/output/Pc-monitor/_internal/plugins/base.py @@ -0,0 +1,151 @@ +""" +Classe de base pour tous les plugins de monitoring +""" +from abc import ABC, abstractmethod +from typing import Optional, List, Dict, Any + + +class BasePlugin(ABC): + """Classe abstraite définissant l'interface des plugins""" + + def __init__(self, config: dict): + """ + Initialise le plugin avec sa configuration + + Args: + config: Configuration du plugin (host, port, etc.) + """ + self.host = config.get('host', '127.0.0.1') + self.port = config.get('port', self.get_default_port()) + self.config = config + + @abstractmethod + def get_id(self) -> str: + """Retourne l'identifiant unique du plugin""" + pass + + @abstractmethod + def get_name(self) -> str: + """Retourne le nom affichable du plugin""" + pass + + @abstractmethod + def get_default_port(self) -> int: + """Retourne le port par défaut""" + pass + + @abstractmethod + def test_connection(self) -> Dict[str, Any]: + """ + Teste la connexion au logiciel de monitoring + + Returns: + dict avec 'success' (bool), 'message' (str), et optionnellement 'version' + """ + pass + + @abstractmethod + def get_data(self) -> Optional[dict]: + """ + Récupère les données brutes du logiciel de monitoring + + Returns: + Données brutes ou None si erreur + """ + pass + + @abstractmethod + def get_hierarchy(self) -> List[dict]: + """ + Récupère la hiérarchie des capteurs (pour l'admin) + + Returns: + Liste de hardware avec leurs capteurs + """ + pass + + @abstractmethod + def parse_sensors(self, data: dict) -> List[dict]: + """ + Parse les données brutes en liste standardisée de capteurs + + Args: + data: Données brutes du logiciel + + Returns: + Liste de capteurs au format standardisé: + [ + { + 'id': str, # Identifiant unique + 'name': str, # Nom du capteur + 'value': str, # Valeur formatée (ex: "45 °C") + 'raw_value': float, # Valeur numérique + 'type': str, # Type (temperature, load, voltage, etc.) + 'unit': str, # Unité (°C, %, MHz, etc.) + 'hardware': str, # Nom du hardware parent + 'hardware_type': str # Type de hardware (CPU, GPU, etc.) + }, + ... + ] + """ + pass + + def get_base_url(self) -> str: + """Retourne l'URL de base pour les requêtes""" + return f"http://{self.host}:{self.port}" + + def get_sensor_type(self, unit: str, name: str = '') -> str: + """ + Détermine le type de capteur à partir de l'unité et du nom + + Args: + unit: Unité du capteur + name: Nom du capteur (pour affiner la détection) + + Returns: + Type standardisé du capteur + """ + unit_lower = unit.lower() if unit else '' + name_lower = name.lower() if name else '' + + # Détection par unité + if '°c' in unit_lower or '°f' in unit_lower: + return 'temperature' + elif '%' in unit_lower: + if 'load' in name_lower or 'usage' in name_lower: + return 'load' + return 'percentage' + elif 'mhz' in unit_lower or 'ghz' in unit_lower: + return 'frequency' + elif 'rpm' in unit_lower: + return 'fan' + elif 'w' in unit_lower and 'wh' not in unit_lower: + return 'power' + elif 'v' in unit_lower and 'mv' not in unit_lower: + return 'voltage' + elif 'mv' in unit_lower: + return 'voltage' + elif 'mb' in unit_lower or 'gb' in unit_lower or 'kb' in unit_lower: + return 'data' + elif 'mb/s' in unit_lower or 'kb/s' in unit_lower or 'gb/s' in unit_lower: + return 'throughput' + elif 'a' in unit_lower: + return 'current' + elif 'wh' in unit_lower: + return 'energy' + + # Détection par nom si unité non reconnue + if 'temp' in name_lower or 'temperature' in name_lower: + return 'temperature' + elif 'fan' in name_lower: + return 'fan' + elif 'clock' in name_lower or 'freq' in name_lower: + return 'frequency' + elif 'load' in name_lower or 'usage' in name_lower: + return 'load' + elif 'power' in name_lower: + return 'power' + elif 'voltage' in name_lower or 'vcore' in name_lower: + return 'voltage' + + return 'generic' diff --git a/output/Pc-monitor/_internal/plugins/hwinfo.py b/output/Pc-monitor/_internal/plugins/hwinfo.py new file mode 100644 index 0000000..58b4bbf --- /dev/null +++ b/output/Pc-monitor/_internal/plugins/hwinfo.py @@ -0,0 +1,274 @@ +""" +Plugin pour HWiNFO via RemoteHWInfo (Demion) +https://github.com/Demion/remotehwinfo + +Format JSON RemoteHWInfo: +{ + "hwinfo": { + "sensors": [ + {"entryIndex": 0, "sensorNameUser": "System", ...}, + {"entryIndex": 1, "sensorNameUser": "CPU [#0]: Intel Core i7", ...} + ], + "readings": [ + {"sensorIndex": 0, "labelUser": "Memory Load", "value": 45.5, "unit": "%", ...}, + {"sensorIndex": 1, "labelUser": "CPU Temp", "value": 65.0, "unit": "°C", ...} + ] + } +} +""" +import requests +from typing import Dict, List, Optional, Any +from .base import BasePlugin + + +class HWiNFOPlugin(BasePlugin): + """Plugin pour HWiNFO via RemoteHWInfo""" + + def __init__(self, config: dict): + super().__init__(config) + self.history = {} + self.max_history = 120 + + def get_id(self) -> str: + return 'hwinfo' + + def get_name(self) -> str: + return 'HWiNFO' + + def get_default_port(self) -> int: + return 60000 + + def get_base_url(self) -> str: + """Retourne l'URL de l'API RemoteHWInfo""" + return f"http://{self.host}:{self.port}/json.json" + + def test_connection(self) -> Dict[str, Any]: + """Teste la connexion à RemoteHWInfo""" + try: + url = self.get_base_url() + response = requests.get(url, timeout=5) + response.raise_for_status() + + data = response.json() + + # Vérifier le format RemoteHWInfo + if 'hwinfo' not in data: + return { + 'success': False, + 'message': 'Format invalide. Vérifiez que RemoteHWInfo est lancé.' + } + + hwinfo = data['hwinfo'] + sensor_count = len(hwinfo.get('sensors', [])) + reading_count = len(hwinfo.get('readings', [])) + + return { + 'success': True, + 'message': f'Connecté - {sensor_count} capteurs, {reading_count} lectures', + 'version': 'RemoteHWInfo', + 'sensor_count': reading_count + } + + except requests.exceptions.ConnectionError: + return { + 'success': False, + 'message': f'Impossible de se connecter à {self.get_base_url()}. Vérifiez que RemoteHWInfo est lancé.' + } + except requests.exceptions.Timeout: + return { + 'success': False, + 'message': 'Timeout - Le serveur ne répond pas' + } + except Exception as e: + return { + 'success': False, + 'message': f'Erreur: {str(e)}' + } + + def get_data(self) -> Optional[Dict]: + """Récupère les données JSON depuis RemoteHWInfo""" + try: + url = self.get_base_url() + response = requests.get(url, timeout=5) + response.raise_for_status() + + data = response.json() + + if 'hwinfo' in data: + return data['hwinfo'] + + return None + + except Exception as e: + print(f"Erreur HWiNFO get_data: {e}") + return None + + def get_hierarchy(self) -> List[dict]: + """Récupère la hiérarchie des capteurs pour l'admin""" + data = self.get_data() + if not data: + return [] + + return self._build_hierarchy(data) + + def _build_hierarchy(self, data: Dict) -> List[dict]: + """Construit la hiérarchie des capteurs""" + sensors = data.get('sensors', []) + readings = data.get('readings', []) + + # Créer un dictionnaire des sensors par index + sensor_map = {} + for sensor in sensors: + idx = sensor.get('entryIndex', 0) + sensor_map[idx] = { + 'name': sensor.get('sensorNameUser', sensor.get('sensorNameOriginal', 'Unknown')), + 'value': '', + 'id': '', + 'level': 0, + 'type': 'group', + 'children': [] + } + + # Ajouter les readings aux sensors correspondants + for reading in readings: + sensor_idx = reading.get('sensorIndex', 0) + + if sensor_idx not in sensor_map: + continue + + label = reading.get('labelUser', reading.get('labelOriginal', 'Unknown')) + value = reading.get('value', 0) + unit = reading.get('unit', '') + + # Générer un ID unique + sensor_id = self._generate_sensor_id(sensor_idx, reading.get('readingId', 0), label) + + # Formater la valeur + if isinstance(value, float): + if value == int(value): + formatted_value = f"{int(value)} {unit}".strip() + else: + formatted_value = f"{value:.2f} {unit}".strip() + else: + formatted_value = f"{value} {unit}".strip() + + reading_entry = { + 'name': label, + 'value': formatted_value, + 'id': sensor_id, + 'level': 1, + 'type': self.get_sensor_type(unit, label), + 'children': [] + } + + sensor_map[sensor_idx]['children'].append(reading_entry) + + # Retourner seulement les sensors qui ont des readings + return [s for s in sensor_map.values() if s['children']] + + def parse_sensors(self, data: Dict) -> List[Dict]: + """Parse les données et retourne une liste plate de capteurs""" + sensors_list = [] + + if not data: + return sensors_list + + sensors = data.get('sensors', []) + readings = data.get('readings', []) + + # Créer un dictionnaire des sensors par index + sensor_names = {} + for sensor in sensors: + idx = sensor.get('entryIndex', 0) + sensor_names[idx] = sensor.get('sensorNameUser', sensor.get('sensorNameOriginal', 'Unknown')) + + # Parser chaque reading + for reading in readings: + sensor_idx = reading.get('sensorIndex', 0) + hardware_name = sensor_names.get(sensor_idx, 'Unknown') + + label = reading.get('labelUser', reading.get('labelOriginal', 'Unknown')) + value = reading.get('value', 0) + unit = reading.get('unit', '') + + # Générer un ID unique + sensor_id = self._generate_sensor_id(sensor_idx, reading.get('readingId', 0), label) + + # Formater la valeur + if isinstance(value, float): + if value == int(value): + formatted_value = f"{int(value)} {unit}".strip() + else: + formatted_value = f"{value:.2f} {unit}".strip() + else: + formatted_value = f"{value} {unit}".strip() + + sensor_type = self.get_sensor_type(unit, label) + hardware_type = self._guess_hardware_type(hardware_name) + + sensor = { + 'id': sensor_id, + 'name': label, + 'value': formatted_value, + 'raw_value': float(value) if value else 0.0, + 'type': sensor_type, + 'unit': unit, + 'hardware': hardware_name, + 'hardware_type': hardware_type, + 'category': hardware_name, + 'path': f"{hardware_name}/{label}", + } + sensors_list.append(sensor) + + return sensors_list + + def _generate_sensor_id(self, sensor_idx: int, reading_id: int, label: str) -> str: + """Génère un ID unique pour un capteur""" + # Nettoyer le label pour l'ID + clean_label = label.replace(' ', '_').replace('[', '').replace(']', '') + clean_label = clean_label.replace('#', '').replace(':', '_').replace('/', '_') + return f"/hwinfo/{sensor_idx}_{reading_id}_{clean_label}" + + def _guess_hardware_type(self, sensor_name: str) -> str: + """Devine le type de hardware basé sur le nom du sensor""" + name_lower = sensor_name.lower() + + if 'cpu' in name_lower or 'processor' in name_lower: + return 'CPU' + elif 'gpu' in name_lower or 'graphics' in name_lower or 'radeon' in name_lower or 'geforce' in name_lower: + return 'GPU' + elif 'memory' in name_lower or 'ram' in name_lower or 'dimm' in name_lower: + return 'RAM' + elif 'drive' in name_lower or 'disk' in name_lower or 'ssd' in name_lower or 'hdd' in name_lower or 's.m.a.r.t' in name_lower: + return 'Storage' + elif 'network' in name_lower or 'ethernet' in name_lower or 'wifi' in name_lower or 'réseau' in name_lower: + return 'Network' + elif 'system' in name_lower or 'système' in name_lower: + return 'System' + else: + return 'Other' + + # === Gestion de l'historique === + + def update_history(self, sensors: List[Dict]): + """Met à jour l'historique des capteurs pour les graphiques""" + for sensor in sensors: + sensor_id = sensor.get("id", "") + if not sensor_id: + continue + + raw_value = sensor.get("raw_value", 0.0) + + if sensor_id not in self.history: + self.history[sensor_id] = [] + + self.history[sensor_id].append(raw_value) + + if len(self.history[sensor_id]) > self.max_history: + self.history[sensor_id] = self.history[sensor_id][-self.max_history:] + + def get_history(self, sensor_id: str, count: int = 60) -> List[float]: + """Récupère l'historique d'un capteur""" + if sensor_id not in self.history: + return [] + return self.history[sensor_id][-count:] diff --git a/output/Pc-monitor/_internal/plugins/librehardwaremonitor.py b/output/Pc-monitor/_internal/plugins/librehardwaremonitor.py new file mode 100644 index 0000000..06f04aa --- /dev/null +++ b/output/Pc-monitor/_internal/plugins/librehardwaremonitor.py @@ -0,0 +1,266 @@ +""" +Plugin pour LibreHardwareMonitor +Utilise l'API REST intégrée de LHM (port 8085 par défaut) +""" +import requests +from typing import Dict, List, Optional, Any +from .base import BasePlugin + + +class LibreHardwareMonitorPlugin(BasePlugin): + """Plugin pour LibreHardwareMonitor""" + + def __init__(self, config: dict): + super().__init__(config) + self.history = {} + self.max_history = 120 # 2 minutes à 1 sample/sec + + def get_id(self) -> str: + return 'librehardwaremonitor' + + def get_name(self) -> str: + return 'LibreHardwareMonitor' + + def get_default_port(self) -> int: + return 8085 + + def test_connection(self) -> Dict[str, Any]: + """Teste la connexion à LibreHardwareMonitor""" + try: + url = f"{self.get_base_url()}/data.json" + response = requests.get(url, timeout=5) + response.raise_for_status() + + data = response.json() + + # Extraire la version si disponible + version = "Inconnue" + if data and "Text" in data: + version = data.get("Text", "LibreHardwareMonitor") + + # Compter les capteurs + sensors = self.parse_sensors(data) + + return { + 'success': True, + 'message': f'Connecté - {len(sensors)} capteurs détectés', + 'version': version, + 'sensor_count': len(sensors) + } + + except requests.exceptions.ConnectionError: + return { + 'success': False, + 'message': f'Impossible de se connecter à {self.get_base_url()}. Vérifiez que LibreHardwareMonitor est lancé avec le serveur web activé.' + } + except requests.exceptions.Timeout: + return { + 'success': False, + 'message': 'Timeout - Le serveur ne répond pas' + } + except Exception as e: + return { + 'success': False, + 'message': f'Erreur: {str(e)}' + } + + def get_data(self) -> Optional[Dict]: + """Récupère les données JSON depuis LHM Remote Server""" + try: + url = f"{self.get_base_url()}/data.json" + response = requests.get(url, timeout=5) + response.raise_for_status() + return response.json() + except Exception as e: + print(f"Erreur LHM get_data: {e}") + return None + + def get_hierarchy(self) -> List[dict]: + """Récupère la hiérarchie des capteurs pour l'admin""" + data = self.get_data() + if not data: + return [] + + return self._build_hierarchy(data) + + def _build_hierarchy(self, data: Dict) -> List[dict]: + """Construit la hiérarchie des capteurs""" + if not data or "Children" not in data: + return [] + + def build_tree(node, level=0): + node_text = node.get("Text", "") + node_value = node.get("Value", "") + sensor_id = node.get("SensorId", "") + + result = { + "name": node_text, + "value": node_value, + "id": sensor_id, + "level": level, + "type": self._guess_sensor_type(node_text, node_value) if node_value else "group", + "children": [] + } + + if "Children" in node and node["Children"]: + for child in node["Children"]: + result["children"].append(build_tree(child, level + 1)) + + return result + + tree = [] + for child in data.get("Children", []): + tree.append(build_tree(child)) + + return tree + + def parse_sensors(self, data: Dict) -> List[Dict]: + """Parse les données et retourne une liste plate de capteurs""" + sensors = [] + + if not data or "Children" not in data: + return sensors + + def extract_sensors(node, parent_name="", hardware_name="", hardware_type=""): + node_text = node.get("Text", "") + current_path = f"{parent_name}/{node_text}" if parent_name else node_text + + # Détecter le type de hardware au niveau 1 + if not hardware_name and "Children" in node: + hw_type = self._guess_hardware_type(node_text) + hardware_name = node_text + hardware_type = hw_type + + # Si le nœud a une valeur, c'est un capteur + if "Value" in node and node["Value"]: + sensor_id = node.get("SensorId", "") + if not sensor_id: + sensor_id = f"{current_path}".replace(" ", "-").lower() + + value_str = node.get("Value", "") + raw_value = self._extract_numeric_value(value_str) + unit = self._extract_unit(value_str) + sensor_type = self._guess_sensor_type(node_text, value_str) + + sensor = { + "id": sensor_id, + "name": node_text, + "value": value_str, + "raw_value": raw_value, + "type": sensor_type, + "unit": unit, + "hardware": hardware_name, + "hardware_type": hardware_type, + "category": parent_name.split("/")[0] if "/" in parent_name else parent_name, + "path": current_path, + "min": node.get("Min", ""), + "max": node.get("Max", ""), + } + sensors.append(sensor) + + # Parcourir les enfants récursivement + if "Children" in node: + for child in node["Children"]: + extract_sensors(child, current_path, hardware_name, hardware_type) + + for child in data.get("Children", []): + extract_sensors(child) + + return sensors + + def _guess_hardware_type(self, name: str) -> str: + """Devine le type de hardware basé sur le nom""" + name_lower = name.lower() + + if 'cpu' in name_lower or 'processor' in name_lower: + return 'CPU' + elif 'gpu' in name_lower or 'graphics' in name_lower or 'nvidia' in name_lower or 'amd' in name_lower or 'radeon' in name_lower or 'geforce' in name_lower: + return 'GPU' + elif 'memory' in name_lower or 'ram' in name_lower: + return 'RAM' + elif 'motherboard' in name_lower or 'mainboard' in name_lower: + return 'Motherboard' + elif 'storage' in name_lower or 'disk' in name_lower or 'ssd' in name_lower or 'hdd' in name_lower or 'nvme' in name_lower: + return 'Storage' + elif 'network' in name_lower or 'ethernet' in name_lower or 'wifi' in name_lower: + return 'Network' + elif 'battery' in name_lower: + return 'Battery' + else: + return 'Other' + + def _guess_sensor_type(self, name: str, value: str) -> str: + """Devine le type de capteur basé sur le nom et la valeur""" + name_lower = name.lower() + value_lower = value.lower() + + if "°c" in value_lower or "temperature" in name_lower or "temp" in name_lower: + return "temperature" + elif "%" in value or "load" in name_lower or "usage" in name_lower: + return "percentage" + elif "rpm" in value_lower or "fan" in name_lower: + return "fan" + elif "mhz" in value_lower or "ghz" in value_lower or "clock" in name_lower: + return "frequency" + elif "w" in value_lower and "wh" not in value_lower: + return "power" + elif "v" in value_lower: + return "voltage" + elif "gb" in value_lower or "mb" in value_lower or "memory" in name_lower: + return "memory" + else: + return "generic" + + def _extract_numeric_value(self, value_str: str) -> float: + """Extrait la valeur numérique d'une chaîne""" + try: + # Enlever tous les caractères non numériques sauf le point et la virgule + clean = value_str.replace("°C", "").replace("%", "").replace("V", "").replace("W", "") + clean = clean.replace("MHz", "").replace("GHz", "").replace("GB", "").replace("MB", "") + clean = clean.replace("RPM", "").replace(" ", "").replace(",", ".").strip() + + if clean: + return float(clean) + except (ValueError, AttributeError): + pass + return 0.0 + + def _extract_unit(self, value_str: str) -> str: + """Extrait l'unité d'une valeur""" + value_str = value_str.strip() + + units = ['°C', '°F', '%', 'MHz', 'GHz', 'GB', 'MB', 'KB', 'RPM', 'W', 'V', 'A', 'GB/s', 'MB/s'] + for unit in units: + if unit in value_str: + return unit + return '' + + # === Gestion de l'historique === + + def update_history(self, sensors: List[Dict]): + """Met à jour l'historique des capteurs pour les graphiques""" + for sensor in sensors: + sensor_id = sensor.get("id", "") + if not sensor_id: + continue + + raw_value = sensor.get("raw_value") + if raw_value is None: + raw_value = self._extract_numeric_value(sensor.get("value", "")) + + if raw_value == 0.0 and "0" not in sensor.get("value", ""): + continue + + if sensor_id not in self.history: + self.history[sensor_id] = [] + + self.history[sensor_id].append(raw_value) + + if len(self.history[sensor_id]) > self.max_history: + self.history[sensor_id] = self.history[sensor_id][-self.max_history:] + + def get_history(self, sensor_id: str, count: int = 60) -> List[float]: + """Récupère l'historique d'un capteur""" + if sensor_id not in self.history: + return [] + return self.history[sensor_id][-count:] diff --git a/output/Pc-monitor/_internal/pyexpat.pyd b/output/Pc-monitor/_internal/pyexpat.pyd new file mode 100644 index 0000000..61d2f84 Binary files /dev/null and b/output/Pc-monitor/_internal/pyexpat.pyd differ diff --git a/output/Pc-monitor/_internal/python3.dll b/output/Pc-monitor/_internal/python3.dll new file mode 100644 index 0000000..32a0ee1 Binary files /dev/null and b/output/Pc-monitor/_internal/python3.dll differ diff --git a/output/Pc-monitor/_internal/python313.dll b/output/Pc-monitor/_internal/python313.dll new file mode 100644 index 0000000..dc40862 Binary files /dev/null and b/output/Pc-monitor/_internal/python313.dll differ diff --git a/output/Pc-monitor/_internal/select.pyd b/output/Pc-monitor/_internal/select.pyd new file mode 100644 index 0000000..3bc1536 Binary files /dev/null and b/output/Pc-monitor/_internal/select.pyd differ diff --git a/output/Pc-monitor/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/INSTALLER b/output/Pc-monitor/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/output/Pc-monitor/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/output/Pc-monitor/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/LICENSE b/output/Pc-monitor/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/output/Pc-monitor/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/output/Pc-monitor/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/METADATA b/output/Pc-monitor/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/METADATA new file mode 100644 index 0000000..85513e8 --- /dev/null +++ b/output/Pc-monitor/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/METADATA @@ -0,0 +1,129 @@ +Metadata-Version: 2.1 +Name: importlib_metadata +Version: 8.0.0 +Summary: Read metadata from Python packages +Author-email: "Jason R. Coombs" +Project-URL: Source, https://github.com/python/importlib_metadata +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Requires-Python: >=3.8 +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: zipp >=0.5 +Requires-Dist: typing-extensions >=3.6.4 ; python_version < "3.8" +Provides-Extra: doc +Requires-Dist: sphinx >=3.5 ; extra == 'doc' +Requires-Dist: jaraco.packaging >=9.3 ; extra == 'doc' +Requires-Dist: rst.linker >=1.9 ; extra == 'doc' +Requires-Dist: furo ; extra == 'doc' +Requires-Dist: sphinx-lint ; extra == 'doc' +Requires-Dist: jaraco.tidelift >=1.4 ; extra == 'doc' +Provides-Extra: perf +Requires-Dist: ipython ; extra == 'perf' +Provides-Extra: test +Requires-Dist: pytest !=8.1.*,>=6 ; extra == 'test' +Requires-Dist: pytest-checkdocs >=2.4 ; extra == 'test' +Requires-Dist: pytest-cov ; extra == 'test' +Requires-Dist: pytest-mypy ; extra == 'test' +Requires-Dist: pytest-enabler >=2.2 ; extra == 'test' +Requires-Dist: pytest-ruff >=0.2.1 ; extra == 'test' +Requires-Dist: packaging ; extra == 'test' +Requires-Dist: pyfakefs ; extra == 'test' +Requires-Dist: flufl.flake8 ; extra == 'test' +Requires-Dist: pytest-perf >=0.9.2 ; extra == 'test' +Requires-Dist: jaraco.test >=5.4 ; extra == 'test' +Requires-Dist: importlib-resources >=1.3 ; (python_version < "3.9") and extra == 'test' + +.. image:: https://img.shields.io/pypi/v/importlib_metadata.svg + :target: https://pypi.org/project/importlib_metadata + +.. image:: https://img.shields.io/pypi/pyversions/importlib_metadata.svg + +.. image:: https://github.com/python/importlib_metadata/actions/workflows/main.yml/badge.svg + :target: https://github.com/python/importlib_metadata/actions?query=workflow%3A%22tests%22 + :alt: tests + +.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json + :target: https://github.com/astral-sh/ruff + :alt: Ruff + +.. image:: https://readthedocs.org/projects/importlib-metadata/badge/?version=latest + :target: https://importlib-metadata.readthedocs.io/en/latest/?badge=latest + +.. image:: https://img.shields.io/badge/skeleton-2024-informational + :target: https://blog.jaraco.com/skeleton + +.. image:: https://tidelift.com/badges/package/pypi/importlib-metadata + :target: https://tidelift.com/subscription/pkg/pypi-importlib-metadata?utm_source=pypi-importlib-metadata&utm_medium=readme + +Library to access the metadata for a Python package. + +This package supplies third-party access to the functionality of +`importlib.metadata `_ +including improvements added to subsequent Python versions. + + +Compatibility +============= + +New features are introduced in this third-party library and later merged +into CPython. The following table indicates which versions of this library +were contributed to different versions in the standard library: + +.. list-table:: + :header-rows: 1 + + * - importlib_metadata + - stdlib + * - 7.0 + - 3.13 + * - 6.5 + - 3.12 + * - 4.13 + - 3.11 + * - 4.6 + - 3.10 + * - 1.4 + - 3.8 + + +Usage +===== + +See the `online documentation `_ +for usage details. + +`Finder authors +`_ can +also add support for custom package installers. See the above documentation +for details. + + +Caveats +======= + +This project primarily supports third-party packages installed by PyPA +tools (or other conforming packages). It does not support: + +- Packages in the stdlib. +- Packages installed without metadata. + +Project details +=============== + + * Project home: https://github.com/python/importlib_metadata + * Report bugs at: https://github.com/python/importlib_metadata/issues + * Code hosting: https://github.com/python/importlib_metadata + * Documentation: https://importlib-metadata.readthedocs.io/ + +For Enterprise +============== + +Available as part of the Tidelift Subscription. + +This project and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use. + +`Learn more `_. diff --git a/output/Pc-monitor/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/RECORD b/output/Pc-monitor/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/RECORD new file mode 100644 index 0000000..17296a8 --- /dev/null +++ b/output/Pc-monitor/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/RECORD @@ -0,0 +1,32 @@ +importlib_metadata-8.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +importlib_metadata-8.0.0.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358 +importlib_metadata-8.0.0.dist-info/METADATA,sha256=anuQ7_7h4J1bSEzfcjIBakPi2cyVQ7y7jklLHsBeH1k,4648 +importlib_metadata-8.0.0.dist-info/RECORD,, +importlib_metadata-8.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_metadata-8.0.0.dist-info/WHEEL,sha256=mguMlWGMX-VHnMpKOjjQidIo1ssRlCFu4a4mBpz1s2M,91 +importlib_metadata-8.0.0.dist-info/top_level.txt,sha256=CO3fD9yylANiXkrMo4qHLV_mqXL2sC5JFKgt1yWAT-A,19 +importlib_metadata/__init__.py,sha256=tZNB-23h8Bixi9uCrQqj9Yf0aeC--Josdy3IZRIQeB0,33798 +importlib_metadata/__pycache__/__init__.cpython-312.pyc,, +importlib_metadata/__pycache__/_adapters.cpython-312.pyc,, +importlib_metadata/__pycache__/_collections.cpython-312.pyc,, +importlib_metadata/__pycache__/_compat.cpython-312.pyc,, +importlib_metadata/__pycache__/_functools.cpython-312.pyc,, +importlib_metadata/__pycache__/_itertools.cpython-312.pyc,, +importlib_metadata/__pycache__/_meta.cpython-312.pyc,, +importlib_metadata/__pycache__/_text.cpython-312.pyc,, +importlib_metadata/__pycache__/diagnose.cpython-312.pyc,, +importlib_metadata/_adapters.py,sha256=rIhWTwBvYA1bV7i-5FfVX38qEXDTXFeS5cb5xJtP3ks,2317 +importlib_metadata/_collections.py,sha256=CJ0OTCHIjWA0ZIVS4voORAsn2R4R2cQBEtPsZEJpASY,743 +importlib_metadata/_compat.py,sha256=73QKrN9KNoaZzhbX5yPCCZa-FaALwXe8TPlDR72JgBU,1314 +importlib_metadata/_functools.py,sha256=PsY2-4rrKX4RVeRC1oGp1lB1pmC9eKN88_f-bD9uOoA,2895 +importlib_metadata/_itertools.py,sha256=cvr_2v8BRbxcIl5x5ldfqdHjhI8Yi8s8yk50G_nm6jQ,2068 +importlib_metadata/_meta.py,sha256=nxZ7C8GVlcBFAKWyVOn_dn7ot_twBcbm1NmvjIetBHI,1801 +importlib_metadata/_text.py,sha256=HCsFksZpJLeTP3NEk_ngrAeXVRRtTrtyh9eOABoRP4A,2166 +importlib_metadata/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_metadata/compat/__pycache__/__init__.cpython-312.pyc,, +importlib_metadata/compat/__pycache__/py311.cpython-312.pyc,, +importlib_metadata/compat/__pycache__/py39.cpython-312.pyc,, +importlib_metadata/compat/py311.py,sha256=uqm-K-uohyj1042TH4a9Er_I5o7667DvulcD-gC_fSA,608 +importlib_metadata/compat/py39.py,sha256=cPkMv6-0ilK-0Jw_Tkn0xYbOKJZc4WJKQHow0c2T44w,1102 +importlib_metadata/diagnose.py,sha256=nkSRMiowlmkhLYhKhvCg9glmt_11Cox-EmLzEbqYTa8,379 +importlib_metadata/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/output/Pc-monitor/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/REQUESTED b/output/Pc-monitor/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/output/Pc-monitor/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/WHEEL b/output/Pc-monitor/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/WHEEL new file mode 100644 index 0000000..edf4ec7 --- /dev/null +++ b/output/Pc-monitor/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (70.1.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/output/Pc-monitor/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/top_level.txt b/output/Pc-monitor/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/top_level.txt new file mode 100644 index 0000000..bbb0754 --- /dev/null +++ b/output/Pc-monitor/_internal/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/top_level.txt @@ -0,0 +1 @@ +importlib_metadata diff --git a/output/Pc-monitor/_internal/setuptools/_vendor/jaraco/text/Lorem ipsum.txt b/output/Pc-monitor/_internal/setuptools/_vendor/jaraco/text/Lorem ipsum.txt new file mode 100644 index 0000000..986f944 --- /dev/null +++ b/output/Pc-monitor/_internal/setuptools/_vendor/jaraco/text/Lorem ipsum.txt @@ -0,0 +1,2 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra, est eros bibendum elit, nec luctus magna felis sollicitudin mauris. Integer in mauris eu nibh euismod gravida. Duis ac tellus et risus vulputate vehicula. Donec lobortis risus a elit. Etiam tempor. Ut ullamcorper, ligula eu tempor congue, eros est euismod turpis, id tincidunt sapien risus a quam. Maecenas fermentum consequat mi. Donec fermentum. Pellentesque malesuada nulla a mi. Duis sapien sem, aliquet nec, commodo eget, consequat quis, neque. Aliquam faucibus, elit ut dictum aliquet, felis nisl adipiscing sapien, sed malesuada diam lacus eget erat. Cras mollis scelerisque nunc. Nullam arcu. Aliquam consequat. Curabitur augue lorem, dapibus quis, laoreet et, pretium ac, nisi. Aenean magna nisl, mollis quis, molestie eu, feugiat in, orci. In hac habitasse platea dictumst. diff --git a/output/Pc-monitor/_internal/static/css/admin.css b/output/Pc-monitor/_internal/static/css/admin.css new file mode 100644 index 0000000..7e99d03 --- /dev/null +++ b/output/Pc-monitor/_internal/static/css/admin.css @@ -0,0 +1,961 @@ +/* === Variables CSS pour thèmes === */ +:root[data-theme="dark"] { + --bg-primary: #1a1a1a; + --bg-secondary: #2a2a2a; + --bg-tertiary: #3a3a3a; + --text-primary: #e0e0e0; + --text-secondary: #a0a0a0; + --accent: #4a9eff; + --accent-hover: #3a8eef; + --success: #4caf50; + --warning: #ff9800; + --danger: #f44336; + --border: #404040; +} + +:root[data-theme="light"] { + --bg-primary: #ffffff; + --bg-secondary: #f5f5f5; + --bg-tertiary: #e0e0e0; + --text-primary: #1a1a1a; + --text-secondary: #606060; + --accent: #2196f3; + --accent-hover: #1976d2; + --success: #4caf50; + --warning: #ff9800; + --danger: #f44336; + --border: #d0d0d0; +} + +:root[data-theme="blue"] { + --bg-primary: #0d1117; + --bg-secondary: #161b22; + --bg-tertiary: #21262d; + --text-primary: #c9d1d9; + --text-secondary: #8b949e; + --accent: #58a6ff; + --accent-hover: #4896ef; + --success: #3fb950; + --warning: #d29922; + --danger: #f85149; + --border: #30363d; +} + +/* === Reset === */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; + background: var(--bg-primary); + color: var(--text-primary); + line-height: 1.6; +} + +/* === Container === */ +.container { + max-width: 1400px; + margin: 0 auto; + padding: 20px; + padding-top: 0; /* Le header gère son propre padding */ +} + +/* === Header === */ +header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 30px; + padding: 20px 0; + border-bottom: 2px solid var(--border); + /* Header fixe */ + position: sticky; + top: 0; + background: var(--bg-primary); + z-index: 100; + /* Effet de flou pour un look moderne */ + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); +} + +header h1 { + font-size: 28px; + font-weight: 600; +} + +.header-actions { + display: flex; + gap: 10px; +} + +/* === Buttons === */ +.btn { + padding: 10px 20px; + border: none; + border-radius: 8px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: all 0.2s; + text-decoration: none; + display: inline-block; +} + +.btn-primary { + background: var(--accent); + color: white; +} + +.btn-primary:hover { + background: var(--accent-hover); + transform: translateY(-2px); +} + +.btn-secondary { + background: var(--bg-tertiary); + color: var(--text-primary); +} + +.btn-secondary:hover { + background: var(--border); +} + +.btn-danger { + background: var(--danger); + color: white; +} + +.btn-danger:hover { + background: #d32f2f; +} + +/* === Navigation sections === */ +.sections-nav { + display: flex; + gap: 10px; + margin-bottom: 30px; + border-bottom: 2px solid var(--border); + overflow-x: auto; +} + +.section-tab { + padding: 12px 24px; + background: transparent; + border: none; + border-bottom: 3px solid transparent; + color: var(--text-secondary); + cursor: pointer; + font-size: 15px; + font-weight: 500; + transition: all 0.2s; + white-space: nowrap; +} + +.section-tab:hover { + color: var(--text-primary); + background: var(--bg-secondary); +} + +.section-tab.active { + color: var(--accent); + border-bottom-color: var(--accent); +} + +/* === Sections === */ +.config-section { + display: none; +} + +.config-section.active { + display: block; +} + +.config-section h2 { + font-size: 24px; + margin-bottom: 10px; +} + +.help-text { + color: var(--text-secondary); + margin-bottom: 20px; +} + +/* === Sensors Section === */ +.sensors-container { + background: var(--bg-secondary); + border-radius: 12px; + padding: 20px; +} + +#sensors-loading { + text-align: center; + padding: 40px; + color: var(--text-secondary); +} + +.sensor-category { + margin-bottom: 25px; +} + +.category-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 12px 15px; + background: var(--bg-tertiary); + border-radius: 8px; + margin-bottom: 10px; + cursor: pointer; + user-select: none; +} + +.category-header:hover { + background: var(--border); +} + +.category-title { + font-size: 16px; + font-weight: 600; +} + +.category-count { + background: var(--accent); + color: white; + padding: 2px 10px; + border-radius: 12px; + font-size: 12px; +} + +.sensors-grid { + display: flex; + flex-direction: column; + gap: 8px; + padding: 0; +} + +.sensor-item { + background: var(--bg-tertiary); + padding: 10px 12px; + border-radius: 6px; + display: flex; + align-items: center; + gap: 12px; + transition: all 0.2s; +} + +.sensor-item:hover { + background: var(--border); +} + +/* === Groupes hiérarchiques === */ +.sensor-group { + margin-bottom: 15px; +} + +.group-header { + display: flex; + align-items: center; + gap: 10px; + padding: 10px 12px; + background: var(--bg-tertiary); + border-radius: 6px; + cursor: pointer; + user-select: none; + transition: all 0.2s; +} + +.group-header:hover { + background: var(--border); +} + +.group-toggle { + font-size: 12px; + color: var(--text-secondary); + transition: transform 0.2s; +} + +.group-icon { + font-size: 18px; +} + +.group-name { + flex: 1; + font-weight: 500; + font-size: 15px; +} + +.group-count { + background: var(--accent); + color: white; + padding: 2px 8px; + border-radius: 10px; + font-size: 11px; +} + +.group-children { + margin-top: 8px; + padding-left: 10px; + border-left: 2px solid var(--border); +} + +/* Niveau 1 : Composants principaux (CPU, GPU, etc.) */ +.sensor-group[data-level="1"] .group-header { + background: var(--bg-secondary); + padding: 12px 15px; + border: 1px solid var(--border); +} + +.sensor-group[data-level="1"] .group-name { + font-size: 16px; + font-weight: 600; +} + +/* Niveau 2+ : Catégories de capteurs */ +.sensor-group[data-level="2"] .group-header { + background: var(--bg-tertiary); +} + +.sensor-group[data-level="3"] .group-header { + background: var(--bg-primary); + border: 1px solid var(--border); +} + +.sensor-checkbox { + width: 20px; + height: 20px; + cursor: pointer; +} + +.sensor-info { + flex: 1; +} + +.sensor-name { + font-weight: 500; + margin-bottom: 2px; +} + +.sensor-value { + font-size: 13px; + color: var(--text-secondary); +} + +.sensor-type { + display: inline-block; + padding: 2px 8px; + border-radius: 4px; + font-size: 11px; + background: var(--bg-primary); +} + +.sensor-options { + display: flex; + gap: 10px; + align-items: center; +} + +.sensor-options select { + background: var(--bg-primary); + color: var(--text-primary); + border: 1px solid var(--border); + border-radius: 6px; + padding: 5px 10px; + font-size: 12px; +} + +.sensor-options label { + display: flex; + align-items: center; + gap: 5px; + font-size: 12px; + color: var(--text-secondary); +} + +/* === Tabs Section === */ +.tabs-manager { + background: var(--bg-secondary); + border-radius: 12px; + padding: 20px; +} + +.tabs-list { + margin-bottom: 20px; +} + +.tab-item { + background: var(--bg-tertiary); + padding: 15px; + border-radius: 8px; + margin-bottom: 10px; + display: flex; + align-items: center; + gap: 15px; +} + +.tab-handle { + cursor: move; + font-size: 20px; +} + +.tab-item input { + flex: 1; + background: var(--bg-primary); + border: 1px solid var(--border); + border-radius: 6px; + padding: 8px 12px; + color: var(--text-primary); + font-size: 14px; +} + +.tab-sensors-count { + color: var(--text-secondary); + font-size: 13px; +} + +/* === Apps Section === */ +.apps-list { + background: var(--bg-secondary); + border-radius: 12px; + padding: 20px; + margin-bottom: 20px; +} + +.app-item { + background: var(--bg-tertiary); + padding: 15px; + border-radius: 8px; + margin-bottom: 10px; + display: grid; + grid-template-columns: 60px 1fr 1fr 100px auto; + gap: 15px; + align-items: center; +} + +.app-item input { + background: var(--bg-primary); + border: 1px solid var(--border); + border-radius: 6px; + padding: 8px 12px; + color: var(--text-primary); + font-size: 14px; +} + +.app-icon-input { + text-align: center; + font-size: 24px; +} + +/* === Theme Section === */ +.theme-selector { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); + gap: 15px; + background: var(--bg-secondary); + border-radius: 12px; + padding: 20px; +} + +.theme-selector label { + cursor: pointer; +} + +.theme-selector input[type="radio"] { + display: none; +} + +.theme-option { + text-align: center; + padding: 15px; + border-radius: 8px; + border: 2px solid transparent; + transition: all 0.2s; +} + +.theme-selector input[type="radio"]:checked + .theme-option { + border-color: var(--accent); + background: var(--bg-tertiary); +} + +.theme-preview { + width: 100%; + height: 80px; + border-radius: 6px; + margin-bottom: 10px; +} + +.theme-dark { background: linear-gradient(135deg, #1a1a1a 0%, #2a2a2a 100%); } +.theme-light { background: linear-gradient(135deg, #ffffff 0%, #f5f5f5 100%); } +.theme-blue { background: linear-gradient(135deg, #0d1117 0%, #161b22 100%); } + +/* === Notification === */ +.notification { + position: fixed; + bottom: 20px; + right: 20px; + padding: 15px 25px; + border-radius: 8px; + background: var(--success); + color: white; + font-weight: 500; + transform: translateY(100px); + opacity: 0; + transition: all 0.3s; + z-index: 1000; +} + +.notification.show { + transform: translateY(0); + opacity: 1; +} + +.notification.error { + background: var(--danger); +} + +/* === Responsive === */ +@media (max-width: 768px) { + .sensors-grid { + grid-template-columns: 1fr; + } + + .app-item { + grid-template-columns: 1fr; + } + + .sections-nav { + gap: 5px; + } + + .section-tab { + padding: 10px 15px; + font-size: 13px; + } +} + +/* === Configuration Button === */ +.sensor-config-btn { + background: var(--bg-primary); + border: 1px solid var(--border); + border-radius: 6px; + padding: 5px 10px; + cursor: pointer; + font-size: 14px; + transition: all 0.2s; +} + +.sensor-config-btn:hover:not(:disabled) { + background: var(--accent); + color: white; +} + +.sensor-config-btn:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +/* === Modal === */ +.modal { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.7); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; +} + +.modal-content { + background: var(--bg-secondary); + border-radius: 12px; + width: 90%; + max-width: 500px; + max-height: 90vh; + overflow: auto; + box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5); +} + +.modal-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 20px; + border-bottom: 1px solid var(--border); +} + +.modal-header h3 { + font-size: 18px; + font-weight: 600; +} + +.modal-close { + background: none; + border: none; + font-size: 28px; + color: var(--text-secondary); + cursor: pointer; + line-height: 1; + padding: 0; + width: 30px; + height: 30px; +} + +.modal-close:hover { + color: var(--danger); +} + +.modal-body { + padding: 20px; +} + +.config-group { + margin-bottom: 20px; +} + +.config-group h4 { + font-size: 16px; + margin-bottom: 15px; + color: var(--accent); +} + +.config-group label { + display: block; + margin-bottom: 8px; + font-weight: 500; + font-size: 14px; +} + +.config-group select { + width: 100%; + padding: 10px; + background: var(--bg-primary); + border: 1px solid var(--border); + border-radius: 6px; + color: var(--text-primary); + font-size: 14px; + margin-bottom: 15px; +} + +.config-group input[type="checkbox"] { + margin-right: 8px; +} + +.modal-footer { + display: flex; + justify-content: flex-end; + gap: 10px; + padding: 20px; + border-top: 1px solid var(--border); +} + +.modal-cancel { + background: var(--bg-tertiary); +} + +.modal-cancel:hover { + background: var(--border); +} + +/* === Section Ordre des capteurs === */ +#order-tabs-container { + display: flex; + flex-direction: column; + gap: 20px; +} + +.order-tab-section { + background: var(--bg-secondary); + border-radius: 10px; + padding: 15px; + border: 1px solid var(--border); +} + +.order-tab-section h3 { + margin-bottom: 15px; + color: var(--accent); + font-size: 16px; + display: flex; + align-items: center; + gap: 8px; +} + +.order-sensors-list { + display: flex; + flex-direction: column; + gap: 8px; + min-height: 50px; +} + +.order-sensor-item { + display: flex; + align-items: center; + gap: 12px; + padding: 12px 15px; + background: var(--bg-tertiary); + border-radius: 8px; + cursor: grab; + transition: all 0.2s; + border: 1px solid transparent; +} + +.order-sensor-item:hover { + border-color: var(--accent); + background: var(--bg-primary); +} + +.order-sensor-item:active { + cursor: grabbing; +} + +.order-sensor-item.sortable-ghost { + opacity: 0.4; + background: var(--accent); +} + +.order-sensor-item.sortable-chosen { + border-color: var(--accent); + box-shadow: 0 4px 12px rgba(74, 158, 255, 0.3); +} + +.order-sensor-handle { + color: var(--text-secondary); + font-size: 18px; + cursor: grab; +} + +.order-sensor-handle:active { + cursor: grabbing; +} + +.order-sensor-info { + flex: 1; + display: flex; + flex-direction: column; + gap: 2px; +} + +.order-sensor-name { + font-weight: 500; + color: var(--text-primary); +} + +.order-sensor-details { + font-size: 12px; + color: var(--text-secondary); + display: flex; + gap: 10px; +} + +.order-sensor-number { + background: var(--accent); + color: white; + width: 24px; + height: 24px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; + font-weight: 600; +} + +.order-empty-message { + color: var(--text-secondary); + font-style: italic; + text-align: center; + padding: 20px; +} + +/* === Section Plugin === */ +.plugin-selector { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 15px; + margin-bottom: 25px; +} + +.plugin-card { + background: var(--bg-secondary); + border: 2px solid var(--border); + border-radius: 12px; + padding: 20px; + cursor: pointer; + transition: all 0.2s ease; +} + +.plugin-card:hover { + border-color: var(--accent); + transform: translateY(-2px); +} + +.plugin-card.active { + border-color: var(--accent); + background: var(--bg-tertiary); +} + +.plugin-card.active::before { + content: '✓'; + position: absolute; + top: 10px; + right: 10px; + background: var(--accent); + color: white; + width: 24px; + height: 24px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 14px; + font-weight: bold; +} + +.plugin-card { + position: relative; +} + +.plugin-card-header { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 10px; +} + +.plugin-icon { + font-size: 28px; +} + +.plugin-name { + font-size: 18px; + font-weight: 600; + color: var(--text-primary); +} + +.plugin-description { + font-size: 13px; + color: var(--text-secondary); + margin-bottom: 10px; +} + +.plugin-meta { + font-size: 12px; + color: var(--text-secondary); +} + +.plugin-meta a { + color: var(--accent); + text-decoration: none; +} + +.plugin-meta a:hover { + text-decoration: underline; +} + +.plugin-config { + background: var(--bg-secondary); + border-radius: 12px; + padding: 20px; + margin-bottom: 20px; +} + +.plugin-config h3 { + margin-bottom: 15px; + font-size: 16px; + color: var(--text-primary); +} + +.plugin-config .config-group { + margin-bottom: 15px; +} + +.plugin-config .config-group label { + display: block; + margin-bottom: 5px; + font-size: 13px; + color: var(--text-secondary); +} + +.plugin-config .config-group input { + width: 100%; + max-width: 300px; + padding: 10px 12px; + background: var(--bg-tertiary); + border: 1px solid var(--border); + border-radius: 6px; + color: var(--text-primary); + font-size: 14px; +} + +.plugin-config .config-group input:focus { + outline: none; + border-color: var(--accent); +} + +.plugin-actions { + display: flex; + align-items: center; + gap: 15px; + margin-top: 20px; +} + +#connection-status { + font-size: 14px; + display: flex; + align-items: center; + gap: 8px; +} + +#connection-status.success { + color: var(--success); +} + +#connection-status.error { + color: var(--danger); +} + +#connection-status.loading { + color: var(--text-secondary); +} + +.plugin-info { + background: var(--bg-secondary); + border-radius: 12px; + padding: 20px; + border-left: 4px solid var(--accent); +} + +.plugin-info h4 { + font-size: 14px; + margin-bottom: 10px; + color: var(--text-primary); +} + +.plugin-info p { + font-size: 13px; + color: var(--text-secondary); + line-height: 1.6; +} + +.plugin-info ul { + margin-top: 10px; + margin-left: 20px; + font-size: 13px; + color: var(--text-secondary); +} + +.plugin-info ul li { + margin-bottom: 5px; +} + +.plugin-info code { + background: var(--bg-tertiary); + padding: 2px 6px; + border-radius: 4px; + font-family: monospace; + font-size: 12px; +} diff --git a/output/Pc-monitor/_internal/static/css/dashboard.css b/output/Pc-monitor/_internal/static/css/dashboard.css new file mode 100644 index 0000000..a61073d --- /dev/null +++ b/output/Pc-monitor/_internal/static/css/dashboard.css @@ -0,0 +1,1088 @@ +/* === Variables CSS (héritées de admin.css) === */ +:root[data-theme="dark"] { + --bg-primary: #1a1a1a; + --bg-secondary: #2a2a2a; + --bg-tertiary: #3a3a3a; + --text-primary: #e0e0e0; + --text-secondary: #a0a0a0; + --accent: #4a9eff; + --accent-hover: #3a8eef; + --success: #4caf50; + --warning: #ff9800; + --danger: #f44336; + --border: #404040; + --temp-cold: #4a9eff; + --temp-warm: #ff9800; + --temp-hot: #f44336; +} + +:root[data-theme="light"] { + --bg-primary: #ffffff; + --bg-secondary: #f5f5f5; + --bg-tertiary: #e0e0e0; + --text-primary: #1a1a1a; + --text-secondary: #606060; + --accent: #2196f3; + --accent-hover: #1976d2; + --success: #4caf50; + --warning: #ff9800; + --danger: #f44336; + --border: #d0d0d0; + --temp-cold: #2196f3; + --temp-warm: #ff9800; + --temp-hot: #f44336; +} + +:root[data-theme="blue"] { + --bg-primary: #0d1117; + --bg-secondary: #161b22; + --bg-tertiary: #21262d; + --text-primary: #c9d1d9; + --text-secondary: #8b949e; + --accent: #58a6ff; + --accent-hover: #4896ef; + --success: #3fb950; + --warning: #d29922; + --danger: #f85149; + --border: #30363d; + --temp-cold: #58a6ff; + --temp-warm: #d29922; + --temp-hot: #f85149; +} + +/* === Reset === */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; + background: var(--bg-primary); + color: var(--text-primary); + line-height: 1.6; + overflow-x: hidden; +} + +/* === Font Families === */ +.font-family-system { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; +} + +.font-family-roboto { + font-family: 'Roboto', sans-serif; +} + +.font-family-opensans { + font-family: 'Open Sans', sans-serif; +} + +.font-family-lato { + font-family: 'Lato', sans-serif; +} + +.font-family-montserrat { + font-family: 'Montserrat', sans-serif; +} + +.font-family-poppins { + font-family: 'Poppins', sans-serif; +} + +.font-family-inter { + font-family: 'Inter', sans-serif; +} + +.font-family-mono { + font-family: 'Share Tech Mono', 'Consolas', 'Monaco', monospace; +} + +.font-family-digital { + font-family: 'Orbitron', 'Share Tech Mono', monospace; + letter-spacing: 1px; +} + +/* === Font Weight === */ +.font-bold { + font-weight: 700; +} + +.font-bold .sensor-name { + font-weight: 600; +} + +.font-bold .sensor-value { + font-weight: 700; +} + +.font-normal { + font-weight: 400; +} + +.font-normal .sensor-name { + font-weight: 400; +} + +.font-normal .sensor-value { + font-weight: 500; +} + +/* === Container === */ +.container { + max-width: 100%; + height: 100vh; + display: flex; + flex-direction: column; + padding: 15px; +} + +/* === Header === */ +header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 20px; + padding-bottom: 15px; + border-bottom: 2px solid var(--border); + flex-shrink: 0; +} + +header h1 { + font-size: 24px; + font-weight: 600; +} + +.header-actions { + display: flex; + align-items: center; + gap: 15px; +} + +#last-update { + font-size: 13px; + color: var(--text-secondary); +} + +.btn { + padding: 8px 16px; + border: none; + border-radius: 8px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: all 0.2s; + text-decoration: none; + display: inline-block; +} + +.btn-secondary { + background: var(--bg-tertiary); + color: var(--text-primary); +} + +.btn-secondary:hover { + background: var(--border); +} + +.btn-primary { + background: var(--accent); + color: white; +} + +.btn-primary:hover { + background: var(--accent-hover); +} + +/* === Tabs Navigation === */ +.tabs-nav { + display: flex; + gap: 10px; + margin-bottom: 20px; + border-bottom: 2px solid var(--border); + flex-shrink: 0; + overflow-x: auto; +} + +.tab-button { + padding: 12px 24px; + background: transparent; + border: none; + border-bottom: 3px solid transparent; + color: var(--text-secondary); + cursor: pointer; + font-size: 15px; + font-weight: 500; + transition: all 0.2s; + white-space: nowrap; +} + +.tab-button:hover { + color: var(--text-primary); + background: var(--bg-secondary); +} + +.tab-button.active { + color: var(--accent); + border-bottom-color: var(--accent); +} + +/* === Tabs Content === */ +.tabs-content { + flex: 1; + overflow-y: auto; +} + +.tab-pane { + display: none; +} + +.tab-pane.active { + display: block; +} + +/* === Sensors Grid === */ +.sensors-grid { + display: grid; + grid-template-columns: repeat(12, 1fr); + gap: 15px; + margin-bottom: 20px; +} + +/* === Sensor Card === */ +.sensor-card { + background: var(--bg-secondary); + border-radius: 12px; + padding: 15px; + border: 1px solid var(--border); + transition: all 0.2s; +} + +/* Tailles de cartes (grille 12 colonnes) */ +.sensor-card.card-tiny { + grid-column: span 1; /* 1/12 = 8.3% */ +} + +.sensor-card.card-xs { + grid-column: span 2; /* 2/12 = 16.7% */ +} + +.sensor-card.card-small { + grid-column: span 3; /* 3/12 = 25% */ +} + +.sensor-card.card-medium { + grid-column: span 4; /* 4/12 = 33.3% */ +} + +.sensor-card.card-large { + grid-column: span 6; /* 6/12 = 50% */ +} + +.sensor-card.card-xl { + grid-column: span 8; /* 8/12 = 66.7% */ +} + +.sensor-card:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); +} + +.sensor-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 10px; +} + +.sensor-name { + font-size: 14px; + color: var(--text-secondary); + font-weight: 500; +} + +.sensor-type-badge { + font-size: 11px; + padding: 3px 8px; + border-radius: 4px; + background: var(--bg-tertiary); + color: var(--text-secondary); +} + +.sensor-value { + font-size: 32px; + font-weight: 600; + margin-bottom: 10px; +} + +/* Couleurs selon le type */ +.sensor-value.temperature { + color: var(--temp-warm); +} + +.sensor-value.temperature.cold { + color: var(--temp-cold); +} + +.sensor-value.temperature.hot { + color: var(--temp-hot); +} + +.sensor-value.percentage { + color: var(--accent); +} + +.sensor-value.percentage.high { + color: var(--warning); +} + +.sensor-value.percentage.critical { + color: var(--danger); +} + +.sensor-value.fan { + color: var(--success); +} + +.sensor-value.power { + color: var(--warning); +} + +/* === Sensor Chart (Canvas directement dans la carte) === */ +.sensor-chart { + width: 100% !important; + height: 120px !important; + max-height: 120px; + margin-top: 10px; + display: block; +} + +/* Hauteurs de graphiques personnalisées */ +.sensor-chart.chart-tiny { + height: 50px !important; + max-height: 50px; + margin-top: 6px; +} + +.sensor-chart.chart-xs { + height: 70px !important; + max-height: 70px; + margin-top: 8px; +} + +.sensor-chart.chart-small { + height: 90px !important; + max-height: 90px; + margin-top: 8px; +} + +.sensor-chart.chart-medium { + height: 120px !important; + max-height: 120px; +} + +.sensor-chart.chart-large { + height: 180px !important; + max-height: 180px; +} + +/* === Sensor Gauge (Canvas directement dans la carte) === */ +.sensor-gauge { + width: 100% !important; + max-width: 180px; + height: 180px !important; + max-height: 180px; + margin: 10px auto 0; + display: block; +} + +/* Tailles de jauges personnalisées */ +.sensor-gauge.gauge-tiny { + max-width: 60px; + width: 60px !important; + height: 60px !important; + max-height: 60px; + margin-top: 6px; +} + +.sensor-gauge.gauge-xs { + max-width: 90px; + width: 90px !important; + height: 90px !important; + max-height: 90px; + margin-top: 8px; +} + +.sensor-gauge.gauge-small { + max-width: 120px; + width: 120px !important; + height: 120px !important; + max-height: 120px; + margin-top: 8px; +} + +.sensor-gauge.gauge-medium { + max-width: 180px; + width: 180px !important; + height: 180px !important; + max-height: 180px; +} + +.sensor-gauge.gauge-large { + max-width: 240px; + width: 240px !important; + height: 240px !important; + max-height: 240px; +} + +/* === Apps Section === */ +.apps-section { + margin-top: 30px; + padding-top: 20px; + border-top: 2px solid var(--border); +} + +.apps-section h3 { + margin-bottom: 15px; + font-size: 18px; +} + +.apps-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); + gap: 10px; +} + +.app-button { + background: var(--bg-secondary); + border: 1px solid var(--border); + border-radius: 12px; + padding: 20px 15px; + cursor: pointer; + transition: all 0.2s; + text-align: center; +} + +.app-button:hover { + background: var(--bg-tertiary); + transform: translateY(-2px); +} + +.app-icon { + font-size: 32px; + margin-bottom: 8px; +} + +.app-name { + font-size: 13px; + font-weight: 500; +} + +/* === Empty State === */ +.empty-state, .error-state { + text-align: center; + padding: 60px 20px; +} + +.empty-icon, .error-icon { + font-size: 64px; + margin-bottom: 20px; +} + +.empty-state h2, .error-state h2 { + font-size: 24px; + margin-bottom: 10px; +} + +.empty-state p, .error-state p { + color: var(--text-secondary); + margin-bottom: 20px; +} + +/* === Loading State === */ +@keyframes pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.5; } +} + +.loading { + animation: pulse 1.5s ease-in-out infinite; +} + +/* === Responsive === */ +/* Masquer header sur mobile EN PORTRAIT (largeur < 768px) */ +@media (max-width: 768px) { + /* MASQUER LE HEADER sur mobile pour économiser l'espace */ + header { + display: none !important; + } + + .container { + padding: 4px; /* Réduit de 8px à 4px */ + } + + /* Sur mobile, toutes les cartes prennent la largeur disponible */ + .sensors-grid { + grid-template-columns: repeat(6, 1fr); + gap: 4px; /* Réduit de 8px à 4px */ + margin-bottom: 8px; + } + + /* Les cartes tiny/xs gardent leur taille sur mobile */ + .sensor-card.card-tiny { + grid-column: span 1; + } + + .sensor-card.card-xs { + grid-column: span 2; + } + + .sensor-card.card-small { + grid-column: span 3; + } + + .sensor-card.card-medium { + grid-column: span 4; + } + + .sensor-card.card-large { + grid-column: span 6; + } + + .sensor-card.card-xl { + grid-column: span 6; + } + + /* Cartes TRÈS compactes sur mobile */ + .sensor-card { + padding: 4px; /* Réduit de 8px à 4px */ + border-radius: 6px; + border-width: 1px; + } + + .sensor-card:hover { + transform: none; + } + + .sensor-header { + margin-bottom: 3px; /* Réduit */ + } + + .sensor-name { + font-size: 10px; /* Plus petit */ + } + + .sensor-type-badge { + font-size: 8px; + padding: 1px 4px; + } + + .sensor-value { + font-size: 18px; /* Réduit de 22px */ + margin-bottom: 3px; /* Réduit */ + } + + /* Option pour masquer la valeur sur mobile et donner plus d'espace au graphique */ + .sensor-card.hide-value-mobile .sensor-value { + display: none; + } + + .sensor-card.hide-value-mobile .sensor-header { + margin-bottom: 2px; /* Encore plus compact */ + } + + /* GRAPHIQUES - Canvas direct, aucun padding intermédiaire */ + .sensor-chart { + margin-top: 4px; + } + + .sensor-chart.chart-tiny { + height: 45px; + margin-top: 2px; + } + + .sensor-chart.chart-xs { + height: 60px; + margin-top: 3px; + } + + .sensor-chart.chart-small { + height: 75px; + margin-top: 4px; + } + + .sensor-chart.chart-medium { + height: 95px; + margin-top: 4px; + } + + .sensor-chart.chart-large { + height: 125px; + margin-top: 5px; + } + + /* JAUGES - Canvas direct, aucun padding intermédiaire */ + .sensor-gauge { + margin-top: 4px; + } + + .sensor-gauge.gauge-tiny { + max-width: 60px; + height: 60px; + margin-top: 2px; + } + + .sensor-gauge.gauge-xs { + max-width: 90px; + height: 90px; + margin-top: 3px; + } + + .sensor-gauge.gauge-small { + max-width: 120px; + height: 120px; + margin-top: 4px; + } + + .sensor-gauge.gauge-medium { + max-width: 165px; + height: 165px; + margin-top: 4px; + } + + .sensor-gauge.gauge-large { + max-width: 205px; + height: 205px; + margin-top: 5px; + } + + /* Tailles de police personnalisables sur mobile */ + .sensor-card.font-tiny .sensor-name { + font-size: 8px !important; + } + + .sensor-card.font-tiny .sensor-type-badge { + font-size: 7px !important; + padding: 1px 3px !important; + } + + .sensor-card.font-tiny .sensor-value { + font-size: 14px !important; + } + + .sensor-card.font-xs .sensor-name { + font-size: 9px !important; + } + + .sensor-card.font-xs .sensor-type-badge { + font-size: 7px !important; + padding: 1px 4px !important; + } + + .sensor-card.font-xs .sensor-value { + font-size: 16px !important; + } + + .sensor-card.font-small .sensor-name { + font-size: 10px !important; + } + + .sensor-card.font-small .sensor-type-badge { + font-size: 8px !important; + } + + .sensor-card.font-small .sensor-value { + font-size: 18px !important; + } + + .sensor-card.font-medium .sensor-name { + font-size: 11px !important; + } + + .sensor-card.font-medium .sensor-type-badge { + font-size: 9px !important; + } + + .sensor-card.font-medium .sensor-value { + font-size: 20px !important; + } + + .sensor-card.font-large .sensor-name { + font-size: 12px !important; + } + + .sensor-card.font-large .sensor-type-badge { + font-size: 10px !important; + } + + .sensor-card.font-large .sensor-value { + font-size: 22px !important; + } + + .tabs-nav { + gap: 3px; + margin-bottom: 8px; + } + + .tab-button { + padding: 6px 10px; + font-size: 11px; + } + + .apps-grid { + grid-template-columns: repeat(auto-fill, minmax(70px, 1fr)); + gap: 6px; + } + + .app-button { + padding: 8px; + font-size: 10px; + } +} + +/* === Mobile en MODE PAYSAGE === */ +@media (orientation: landscape) and (max-height: 500px) { + /* MASQUER LE HEADER en paysage mobile */ + header { + display: none !important; + } + + .container { + padding: 4px; + height: 100vh; + } + + /* Grille optimisée pour paysage - plus de colonnes */ + .sensors-grid { + grid-template-columns: repeat(12, 1fr); + gap: 4px; + } + + /* Tailles de cartes réduites pour paysage */ + .sensor-card.card-tiny { + grid-column: span 1; + } + + .sensor-card.card-xs { + grid-column: span 1; + } + + .sensor-card.card-small { + grid-column: span 2; + } + + .sensor-card.card-medium { + grid-column: span 2; + } + + .sensor-card.card-large { + grid-column: span 3; + } + + .sensor-card.card-xl { + grid-column: span 4; + } + + .sensor-card { + padding: 4px 6px; + border-radius: 6px; + } + + .sensor-header { + margin-bottom: 2px; + } + + .sensor-name { + font-size: 9px !important; + } + + .sensor-type-badge { + font-size: 7px !important; + padding: 1px 4px !important; + } + + .sensor-value { + font-size: 14px !important; + margin-bottom: 2px; + } + + /* Graphiques compacts en paysage */ + .sensor-chart { + margin-top: 2px; + } + + .sensor-chart.chart-tiny, + .sensor-chart.chart-xs { + height: 30px !important; + } + + .sensor-chart.chart-small { + height: 40px !important; + } + + .sensor-chart.chart-medium { + height: 50px !important; + } + + .sensor-chart.chart-large { + height: 70px !important; + } + + /* Jauges compactes en paysage */ + .sensor-gauge { + margin-top: 2px; + } + + .sensor-gauge.gauge-tiny, + .sensor-gauge.gauge-xs { + max-width: 40px !important; + height: 40px !important; + } + + .sensor-gauge.gauge-small { + max-width: 55px !important; + height: 55px !important; + } + + .sensor-gauge.gauge-medium { + max-width: 70px !important; + height: 70px !important; + } + + .sensor-gauge.gauge-large { + max-width: 90px !important; + height: 90px !important; + } + + /* Tabs compacts */ + .tabs-nav { + gap: 2px; + margin-bottom: 4px; + padding-bottom: 4px; + } + + .tab-button { + padding: 4px 8px; + font-size: 10px; + } + + /* Masquer la section apps en paysage pour plus d'espace */ + .apps-section { + display: none; + } +} + +/* Mode paysage tablette / grand mobile */ +@media (orientation: landscape) and (min-height: 501px) and (max-height: 800px) { + header { + padding: 8px 0; + margin-bottom: 8px; + } + + header h1 { + font-size: 18px; + } + + .container { + padding: 8px; + } + + .sensors-grid { + grid-template-columns: repeat(12, 1fr); + gap: 6px; + } + + /* Tailles intermédiaires */ + .sensor-card.card-tiny { + grid-column: span 1; + } + + .sensor-card.card-xs { + grid-column: span 2; + } + + .sensor-card.card-small { + grid-column: span 2; + } + + .sensor-card.card-medium { + grid-column: span 3; + } + + .sensor-card.card-large { + grid-column: span 4; + } + + .sensor-card { + padding: 6px 8px; + } + + .sensor-name { + font-size: 10px; + } + + .sensor-value { + font-size: 16px; + } +} + +/* === Scrollbar === */ +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: var(--bg-primary); +} + +::-webkit-scrollbar-thumb { + background: var(--bg-tertiary); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: var(--border); +} + +/* === Swipe Indicators === */ +.swipe-indicators { + display: flex; + justify-content: center; + align-items: center; + gap: 8px; + padding: 8px 0; + margin-bottom: 10px; +} + +.swipe-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--bg-tertiary); + cursor: pointer; + transition: all 0.3s ease; +} + +.swipe-dot:hover { + background: var(--text-secondary); + transform: scale(1.2); +} + +.swipe-dot.active { + background: var(--accent); + width: 24px; + border-radius: 4px; +} + +/* === Swipe Animation === */ +.tabs-content { + transition: transform 0.2s ease-out; +} + +.tabs-content.swipe-next { + animation: swipeLeft 0.2s ease-out; +} + +.tabs-content.swipe-prev { + animation: swipeRight 0.2s ease-out; +} + +@keyframes swipeLeft { + 0% { transform: translateX(20px); opacity: 0.7; } + 100% { transform: translateX(0); opacity: 1; } +} + +@keyframes swipeRight { + 0% { transform: translateX(-20px); opacity: 0.7; } + 100% { transform: translateX(0); opacity: 1; } +} + +/* === Mobile Swipe Indicators === */ +@media (max-width: 768px) { + .swipe-indicators { + padding: 6px 0; + margin-bottom: 6px; + gap: 6px; + } + + .swipe-dot { + width: 6px; + height: 6px; + } + + .swipe-dot.active { + width: 18px; + } +} + +/* Paysage mobile - indicateurs encore plus petits */ +@media (orientation: landscape) and (max-height: 500px) { + .swipe-indicators { + padding: 3px 0; + margin-bottom: 3px; + gap: 4px; + } + + .swipe-dot { + width: 5px; + height: 5px; + } + + .swipe-dot.active { + width: 14px; + } +} + +/* === Apps in Tab === */ +.apps-section-in-tab { + margin-top: 20px; + padding-top: 15px; + border-top: 1px solid var(--border); +} + +.apps-title-in-tab { + font-size: 14px; + color: var(--text-secondary); + margin-bottom: 10px; +} + +.apps-grid-in-tab { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(80px, 1fr)); + gap: 10px; +} + +@media (max-width: 480px) { + .apps-section-in-tab { + margin-top: 12px; + padding-top: 10px; + } + + .apps-title-in-tab { + font-size: 12px; + margin-bottom: 8px; + } + + .apps-grid-in-tab { + grid-template-columns: repeat(auto-fill, minmax(60px, 1fr)); + gap: 6px; + } +} + +@media (orientation: landscape) and (max-height: 500px) { + .apps-section-in-tab { + margin-top: 8px; + padding-top: 6px; + } + + .apps-title-in-tab { + font-size: 10px; + margin-bottom: 4px; + } + + .apps-grid-in-tab { + grid-template-columns: repeat(auto-fill, minmax(50px, 1fr)); + gap: 4px; + } +} diff --git a/output/Pc-monitor/_internal/static/js/admin.js b/output/Pc-monitor/_internal/static/js/admin.js new file mode 100644 index 0000000..e385d41 --- /dev/null +++ b/output/Pc-monitor/_internal/static/js/admin.js @@ -0,0 +1,1014 @@ +// Configuration globale +let config = { + theme: 'dark', + tabs: [], + apps: [], + active_plugin: 'librehardwaremonitor', + plugins: {} +}; + +let allSensors = {}; +let availablePlugins = []; + +// Initialisation +document.addEventListener('DOMContentLoaded', async () => { + // Charger les plugins disponibles + await loadPlugins(); + + // Charger la configuration + await loadConfig(); + + // Charger les capteurs + await loadSensors(); + + // Appliquer le thème + applyTheme(config.theme); + + // Setup event listeners + setupEventListeners(); + + // Afficher les onglets et apps + renderTabs(); + renderApps(); +}); + +// === Gestion des sections === +function setupEventListeners() { + // Navigation entre sections + document.querySelectorAll('.section-tab').forEach(tab => { + tab.addEventListener('click', () => { + const section = tab.dataset.section; + switchSection(section); + }); + }); + + // Bouton sauvegarder + document.getElementById('save-btn').addEventListener('click', saveConfig); + + // Bouton ajouter onglet + document.getElementById('add-tab-btn').addEventListener('click', addTab); + + // Bouton ajouter app + document.getElementById('add-app-btn').addEventListener('click', addApp); + + // Sélecteur de thème + document.querySelectorAll('input[name="theme"]').forEach(radio => { + radio.addEventListener('change', (e) => { + config.theme = e.target.value; + applyTheme(config.theme); + }); + }); + + // Configuration du plugin (host/port) + const pluginHost = document.getElementById('plugin-host'); + const pluginPort = document.getElementById('plugin-port'); + + if (pluginHost) { + pluginHost.addEventListener('change', updatePluginConfig); + } + if (pluginPort) { + pluginPort.addEventListener('change', updatePluginConfig); + } + + // Bouton tester connexion + const testBtn = document.getElementById('test-connection-btn'); + if (testBtn) { + testBtn.addEventListener('click', testPluginConnection); + } +} + +function switchSection(sectionName) { + // Désactiver tous les tabs et sections + document.querySelectorAll('.section-tab').forEach(t => t.classList.remove('active')); + document.querySelectorAll('.config-section').forEach(s => s.classList.remove('active')); + + // Activer le bon + document.querySelector(`.section-tab[data-section="${sectionName}"]`).classList.add('active'); + document.getElementById(`section-${sectionName}`).classList.add('active'); + + // Rafraîchir la section ordre quand on y accède + if (sectionName === 'order') { + renderOrderSection(); + } +} + +// === Gestion des Plugins === +async function loadPlugins() { + try { + const response = await fetch('/api/plugins'); + availablePlugins = await response.json(); + renderPluginSelector(); + } catch (error) { + console.error('Erreur chargement plugins:', error); + } +} + +function renderPluginSelector() { + const container = document.getElementById('plugin-selector'); + if (!container) return; + + container.innerHTML = ''; + + availablePlugins.forEach(plugin => { + const card = document.createElement('div'); + card.className = 'plugin-card' + (plugin.active ? ' active' : ''); + card.dataset.pluginId = plugin.id; + + const icon = plugin.id === 'librehardwaremonitor' ? '🖥️' : '📊'; + + card.innerHTML = ` +
+ ${icon} + ${plugin.name} +
+
${plugin.description}
+
+ Port par défaut: ${plugin.default_port} | + Site web ↗ +
+ `; + + card.addEventListener('click', () => selectPlugin(plugin.id)); + + container.appendChild(card); + }); + + // Mettre à jour l'affichage de la config + updatePluginConfigDisplay(); + updatePluginInfo(); +} + +function selectPlugin(pluginId) { + const currentPlugin = config.active_plugin; + + if (pluginId === currentPlugin) return; + + // Confirmer le changement (les capteurs seront différents) + if (config.tabs.some(t => t.sensors.length > 0)) { + if (!confirm('Changer de plugin va afficher des capteurs différents. Les capteurs configurés pour ce plugin seront conservés si vous revenez. Continuer ?')) { + return; + } + } + + // Mettre à jour visuellement + document.querySelectorAll('.plugin-card').forEach(card => { + card.classList.toggle('active', card.dataset.pluginId === pluginId); + }); + + // Mettre à jour la config + config.active_plugin = pluginId; + + // Mettre à jour l'affichage + updatePluginConfigDisplay(); + updatePluginInfo(); + + // Sauvegarder et recharger + switchPluginOnServer(pluginId); +} + +async function switchPluginOnServer(pluginId) { + try { + const response = await fetch('/api/plugins/switch', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ plugin_id: pluginId }) + }); + + const result = await response.json(); + + if (result.success) { + showNotification('Plugin changé, rechargement des capteurs...', 'success'); + + // Recharger la config et les capteurs + await loadConfig(); + await loadSensors(); + renderTabs(); + } else { + showNotification('Erreur: ' + result.error, 'error'); + } + } catch (error) { + console.error('Erreur changement plugin:', error); + showNotification('Erreur de connexion', 'error'); + } +} + +function updatePluginConfigDisplay() { + const pluginId = config.active_plugin || 'librehardwaremonitor'; + const pluginConfig = config.plugins?.[pluginId] || {}; + + const hostInput = document.getElementById('plugin-host'); + const portInput = document.getElementById('plugin-port'); + + if (hostInput) { + hostInput.value = pluginConfig.host || '127.0.0.1'; + } + if (portInput) { + // Trouver le port par défaut du plugin + const plugin = availablePlugins.find(p => p.id === pluginId); + portInput.value = pluginConfig.port || plugin?.default_port || 8085; + } +} + +function updatePluginConfig() { + const pluginId = config.active_plugin || 'librehardwaremonitor'; + const host = document.getElementById('plugin-host').value || '127.0.0.1'; + const port = parseInt(document.getElementById('plugin-port').value) || 8085; + + if (!config.plugins) config.plugins = {}; + config.plugins[pluginId] = { host, port }; +} + +function updatePluginInfo() { + const container = document.getElementById('plugin-info'); + if (!container) return; + + const pluginId = config.active_plugin || 'librehardwaremonitor'; + + if (pluginId === 'librehardwaremonitor') { + container.innerHTML = ` +

ℹ️ Configuration LibreHardwareMonitor

+

Pour utiliser ce plugin :

+
    +
  • Téléchargez LibreHardwareMonitor
  • +
  • Lancez-le en administrateur
  • +
  • Allez dans Options → Remote Web Server → Run
  • +
  • Le serveur écoute par défaut sur le port 8085
  • +
+ `; + } else if (pluginId === 'hwinfo') { + container.innerHTML = ` +

ℹ️ Configuration HWiNFO

+

Pour utiliser ce plugin, vous avez besoin de 2 logiciels :

+
    +
  • Téléchargez HWiNFO
  • +
  • Dans HWiNFO : Settings → General → Enable Shared Memory Support
  • +
  • Téléchargez Remote Sensor Monitor
  • +
  • Lancez Remote Sensor Monitor (port par défaut: 55555)
  • +
+

Note : La version gratuite de HWiNFO limite le Shared Memory à 12 heures. Après, il faut réactiver manuellement.

+ `; + } +} + +async function testPluginConnection() { + const statusEl = document.getElementById('connection-status'); + const pluginId = config.active_plugin || 'librehardwaremonitor'; + + const host = document.getElementById('plugin-host').value || '127.0.0.1'; + const port = parseInt(document.getElementById('plugin-port').value) || 8085; + + statusEl.className = 'loading'; + statusEl.textContent = '⏳ Test en cours...'; + + try { + const response = await fetch('/api/plugins/test', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + plugin_id: pluginId, + config: { host, port } + }) + }); + + const result = await response.json(); + + if (result.success) { + statusEl.className = 'success'; + statusEl.textContent = `✅ ${result.message}`; + + // Mettre à jour la config si le test réussit + updatePluginConfig(); + } else { + statusEl.className = 'error'; + statusEl.textContent = `❌ ${result.message}`; + } + } catch (error) { + statusEl.className = 'error'; + statusEl.textContent = '❌ Erreur de connexion au serveur'; + } +} + +// === Chargement config === +async function loadConfig() { + try { + const response = await fetch('/api/config'); + config = await response.json(); + + // Assurer qu'il y a au moins un onglet + if (!config.tabs || config.tabs.length === 0) { + config.tabs = [{ + id: 'tab1', + name: 'Général', + sensors: [] + }]; + } + + // Valeurs par défaut pour les plugins + if (!config.active_plugin) { + config.active_plugin = 'librehardwaremonitor'; + } + if (!config.plugins) { + config.plugins = {}; + } + + // Sélectionner le thème + const themeRadio = document.querySelector(`input[name="theme"][value="${config.theme}"]`); + if (themeRadio) { + themeRadio.checked = true; + } + + // Remplir le sélecteur d'onglet pour les apps + updateAppsTabSelector(); + + // Mettre à jour l'affichage des plugins + renderPluginSelector(); + + } catch (error) { + console.error('Erreur chargement config:', error); + showNotification('Erreur de chargement', 'error'); + } +} + +function updateAppsTabSelector() { + const select = document.getElementById('apps-tab-select'); + if (!select) return; + + // Sauvegarder la valeur actuelle + const currentValue = config.apps_tab || ''; + + // Garder la première option + select.innerHTML = ''; + + // Ajouter les onglets + config.tabs.forEach(tab => { + const option = document.createElement('option'); + option.value = tab.id; + option.textContent = tab.name; + select.appendChild(option); + }); + + // Sélectionner la valeur actuelle + select.value = currentValue; + + // Utiliser onchange au lieu de addEventListener pour éviter les doublons + select.onchange = (e) => { + config.apps_tab = e.target.value; + showNotification('Onglet des apps modifié (pensez à sauvegarder)', 'success'); + }; +} + +// === Chargement capteurs === +async function loadSensors() { + const loadingDiv = document.getElementById('sensors-loading'); + const listDiv = document.getElementById('sensors-list'); + + try { + const response = await fetch('/api/lhm/hierarchy'); + allSensors = await response.json(); + + loadingDiv.style.display = 'none'; + listDiv.style.display = 'block'; + + renderSensorsHierarchical(); + + } catch (error) { + console.error('Erreur chargement capteurs:', error); + loadingDiv.innerHTML = '⚠️ Erreur: Impossible de charger les capteurs. Vérifiez que LibreHardwareMonitor est lancé.'; + } +} + +function renderSensorsHierarchical() { + const listDiv = document.getElementById('sensors-list'); + listDiv.innerHTML = ''; + + // Créer un Set des capteurs déjà sélectionnés + const selectedSensors = new Map(); + config.tabs.forEach(tab => { + tab.sensors.forEach(sensor => { + selectedSensors.set(sensor.id, { + tabId: tab.id, + showGraph: sensor.show_graph, + viz_type: sensor.viz_type // Utiliser snake_case pour cohérence + }); + }); + }); + + // Fonction récursive pour afficher l'arbre + function renderNode(node, parentDiv, level = 0) { + // Ignorer le nœud racine "Sensor" + if (level === 0 && node.name === "Sensor") { + node.children.forEach(child => renderNode(child, parentDiv, 0)); + return; + } + + // Si c'est un capteur (a une valeur et un ID) + if (node.value && node.id) { + const isSelected = selectedSensors.has(node.id); + const sensorConfig = selectedSensors.get(node.id) || {}; + + const item = document.createElement('div'); + item.className = 'sensor-item'; + item.style.marginLeft = `${level * 15}px`; + item.innerHTML = ` + +
+
${node.name}
+
+ ${node.value} + ${node.type} +
+
+
+ + + +
+ `; + + parentDiv.appendChild(item); + } + // Si c'est un groupe (a des enfants) + else if (node.children && node.children.length > 0) { + const groupDiv = document.createElement('div'); + groupDiv.className = 'sensor-group'; + groupDiv.setAttribute('data-level', level); + + // Header du groupe (repliable) + const header = document.createElement('div'); + header.className = 'group-header'; + header.style.marginLeft = `${level * 15}px`; + + // Compter les capteurs dans ce groupe et ses enfants + function countSensors(n) { + let count = 0; + if (n.value && n.id) count = 1; + if (n.children) { + n.children.forEach(child => { + count += countSensors(child); + }); + } + return count; + } + + const sensorCount = countSensors(node); + + // Icône selon le niveau + let icon = '📦'; + if (level === 1) { + if (node.name.includes('CPU') || node.name.includes('Core')) icon = '🔧'; + else if (node.name.includes('GPU') || node.name.includes('NVIDIA') || node.name.includes('AMD') || node.name.includes('Radeon') || node.name.includes('GeForce')) icon = '🎮'; + else if (node.name.includes('Memory') || node.name.includes('RAM')) icon = '💾'; + else if (node.name.includes('Storage') || node.name.includes('Disk')) icon = '💿'; + } else if (level >= 2) { + if (node.name.includes('Temperature')) icon = '🌡️'; + else if (node.name.includes('Voltage')) icon = '⚡'; + else if (node.name.includes('Clock') || node.name.includes('Frequency')) icon = '🔄'; + else if (node.name.includes('Load') || node.name.includes('Usage')) icon = '📊'; + else if (node.name.includes('Fan')) icon = '🌀'; + else if (node.name.includes('Power')) icon = '🔋'; + else icon = '📁'; + } + + header.innerHTML = ` + + ${icon} + ${node.name} + ${sensorCount} capteur${sensorCount > 1 ? 's' : ''} + `; + + // Container pour les enfants + const childrenDiv = document.createElement('div'); + childrenDiv.className = 'group-children'; + + // Rendre les enfants + node.children.forEach(child => { + renderNode(child, childrenDiv, level + 1); + }); + + // Toggle pour replier/déplier + header.addEventListener('click', () => { + const isExpanded = childrenDiv.style.display !== 'none'; + childrenDiv.style.display = isExpanded ? 'none' : 'block'; + header.querySelector('.group-toggle').textContent = isExpanded ? '▶' : '▼'; + }); + + groupDiv.appendChild(header); + groupDiv.appendChild(childrenDiv); + parentDiv.appendChild(groupDiv); + } + } + + // Rendre tous les nœuds racine + allSensors.forEach(node => { + renderNode(node, listDiv); + }); + + // Event listeners pour les checkboxes + document.querySelectorAll('.sensor-checkbox').forEach(checkbox => { + checkbox.addEventListener('change', handleSensorToggle); + }); + + document.querySelectorAll('.sensor-tab-select').forEach(select => { + select.addEventListener('change', handleSensorTabChange); + }); + + document.querySelectorAll('.sensor-viz-select').forEach(select => { + select.addEventListener('change', handleSensorVizChange); + }); + + // Utiliser la délégation d'événements pour les boutons de config + // (car ils sont créés dynamiquement quand on déplie les groupes) + const sensorsContainer = document.getElementById('sensors-list'); + if (sensorsContainer) { + sensorsContainer.addEventListener('click', (e) => { + if (e.target.classList.contains('sensor-config-btn')) { + openSensorConfig(e); + } + }); + } +} + +// Garder l'ancienne fonction pour la compatibilité avec findSensor +function findSensor(sensorId) { + function searchTree(node) { + if (node.id === sensorId) { + return { + id: node.id, + name: node.name, + type: node.type, + value: node.value + }; + } + if (node.children) { + for (const child of node.children) { + const found = searchTree(child); + if (found) return found; + } + } + return null; + } + + for (const rootNode of allSensors) { + const found = searchTree(rootNode); + if (found) return found; + } + return null; +} + +function handleSensorToggle(e) { + const sensorId = e.target.dataset.sensorId; + const isChecked = e.target.checked; + + const sensorItem = e.target.closest('.sensor-item'); + const tabSelect = sensorItem.querySelector('.sensor-tab-select'); + const vizSelect = sensorItem.querySelector('.sensor-viz-select'); + const configBtn = sensorItem.querySelector('.sensor-config-btn'); + + tabSelect.disabled = !isChecked; + vizSelect.disabled = !isChecked; + + // Le bouton config est actif dès que le capteur est coché + // (on peut configurer la taille même sans graphique) + if (configBtn) { + configBtn.disabled = !isChecked; + } + + if (isChecked) { + // Ajouter le capteur au premier onglet par défaut + const sensor = findSensor(sensorId); + + // Vérifier que le capteur existe + if (!sensor) { + console.error('Capteur non trouvé:', sensorId); + console.log('allSensors:', allSensors); + e.target.checked = false; + tabSelect.disabled = true; + vizSelect.disabled = true; + if (configBtn) configBtn.disabled = true; + return; + } + + const firstTab = config.tabs[0]; + + if (!firstTab.sensors.find(s => s.id === sensorId)) { + firstTab.sensors.push({ + id: sensorId, + name: sensor.name, + type: sensor.type, + show_graph: false, + viz_type: 'none' + }); + } + + tabSelect.value = firstTab.id; + } else { + // Retirer le capteur de tous les onglets + config.tabs.forEach(tab => { + tab.sensors = tab.sensors.filter(s => s.id !== sensorId); + }); + } +} + +function handleSensorTabChange(e) { + const sensorId = e.target.dataset.sensorId; + const newTabId = e.target.value; + + // Retirer le capteur de tous les onglets + config.tabs.forEach(tab => { + tab.sensors = tab.sensors.filter(s => s.id !== sensorId); + }); + + // Ajouter au nouvel onglet + const sensor = findSensor(sensorId); + const targetTab = config.tabs.find(t => t.id === newTabId); + + if (targetTab) { + targetTab.sensors.push({ + id: sensorId, + name: sensor.name, + type: sensor.type, + show_graph: false + }); + } +} + +function handleSensorVizChange(e) { + const sensorId = e.target.dataset.sensorId; + const vizType = e.target.value; + + // Trouver et mettre à jour + config.tabs.forEach(tab => { + const sensor = tab.sensors.find(s => s.id === sensorId); + if (sensor) { + if (vizType === 'none') { + sensor.show_graph = false; + sensor.viz_type = 'none'; + } else { + sensor.show_graph = true; + sensor.viz_type = vizType; // 'line' ou 'gauge' + } + } + }); + + // Le bouton config reste toujours actif si le capteur est coché + // (on peut configurer la taille même sans graphique) +} + +// === Configuration Modal === +let currentConfigSensorId = null; + +function openSensorConfig(e) { + const sensorId = e.target.dataset.sensorId; + currentConfigSensorId = sensorId; + + // Trouver le capteur dans la config + let sensorConfig = null; + config.tabs.forEach(tab => { + const sensor = tab.sensors.find(s => s.id === sensorId); + if (sensor) sensorConfig = sensor; + }); + + if (!sensorConfig) return; + + // Remplir la modal avec les valeurs actuelles + document.getElementById('config-card-size').value = sensorConfig.card_size || 'medium'; + document.getElementById('config-font-family').value = sensorConfig.font_family || 'system'; + document.getElementById('config-font-bold').checked = sensorConfig.font_bold !== false; // true par défaut + document.getElementById('config-font-size').value = sensorConfig.font_size || 'small'; + document.getElementById('config-hide-value-mobile').checked = sensorConfig.hide_value_mobile || false; + document.getElementById('config-show-type-badge').checked = sensorConfig.show_type_badge !== false; // true par défaut + + // Afficher les options selon le type de visualisation + const gaugeOptions = document.getElementById('gauge-options-group'); + const chartOptions = document.getElementById('chart-options-group'); + + if (sensorConfig.viz_type === 'gauge') { + gaugeOptions.style.display = 'block'; + chartOptions.style.display = 'none'; + + const gaugeOpts = sensorConfig.gauge_options || {}; + document.getElementById('config-gauge-show-value').checked = gaugeOpts.show_value !== false; + document.getElementById('config-gauge-size').value = gaugeOpts.size || 'medium'; + document.getElementById('config-gauge-style').value = gaugeOpts.style || 'arc'; + } else if (sensorConfig.viz_type === 'line') { + gaugeOptions.style.display = 'none'; + chartOptions.style.display = 'block'; + + const chartOpts = sensorConfig.chart_options || {}; + document.getElementById('config-chart-height').value = chartOpts.height || 'medium'; + } else { + gaugeOptions.style.display = 'none'; + chartOptions.style.display = 'none'; + } + + // Afficher la modal + document.getElementById('sensor-config-modal').style.display = 'flex'; +} + +function closeSensorConfig() { + document.getElementById('sensor-config-modal').style.display = 'none'; + currentConfigSensorId = null; +} + +function saveSensorConfig() { + if (!currentConfigSensorId) return; + + // Trouver le capteur dans la config + config.tabs.forEach(tab => { + const sensor = tab.sensors.find(s => s.id === currentConfigSensorId); + if (sensor) { + // Sauvegarder la taille de la carte + sensor.card_size = document.getElementById('config-card-size').value; + sensor.font_family = document.getElementById('config-font-family').value; + sensor.font_bold = document.getElementById('config-font-bold').checked; + sensor.font_size = document.getElementById('config-font-size').value; + sensor.hide_value_mobile = document.getElementById('config-hide-value-mobile').checked; + sensor.show_type_badge = document.getElementById('config-show-type-badge').checked; + + // Sauvegarder les options selon le type + if (sensor.viz_type === 'gauge') { + sensor.gauge_options = { + show_value: document.getElementById('config-gauge-show-value').checked, + size: document.getElementById('config-gauge-size').value, + style: document.getElementById('config-gauge-style').value + }; + } else if (sensor.viz_type === 'line') { + sensor.chart_options = { + height: document.getElementById('config-chart-height').value + }; + } + } + }); + + closeSensorConfig(); + showNotification('Configuration mise à jour', 'success'); +} + +// Event listeners pour la modal +document.querySelector('.modal-close').addEventListener('click', closeSensorConfig); +document.querySelector('.modal-cancel').addEventListener('click', closeSensorConfig); +document.querySelector('.modal-save').addEventListener('click', saveSensorConfig); + +// Fermer la modal en cliquant en dehors +document.getElementById('sensor-config-modal').addEventListener('click', (e) => { + if (e.target.id === 'sensor-config-modal') { + closeSensorConfig(); + } +}); + +// === Gestion des onglets === +function renderTabs() { + const tabsList = document.getElementById('tabs-list'); + tabsList.innerHTML = ''; + + config.tabs.forEach((tab, index) => { + const item = document.createElement('div'); + item.className = 'tab-item'; + item.innerHTML = ` + + + ${tab.sensors.length} capteurs + ${config.tabs.length > 1 ? `` : ''} + `; + + // Event listener pour le nom + item.querySelector('input').addEventListener('input', (e) => { + const tabToUpdate = config.tabs.find(t => t.id === tab.id); + if (tabToUpdate) { + tabToUpdate.name = e.target.value; + // Mettre à jour le sélecteur d'onglet des apps + updateAppsTabSelector(); + } + }); + + tabsList.appendChild(item); + }); + + // Mettre à jour le sélecteur d'onglet des apps + updateAppsTabSelector(); +} + +function addTab() { + const newId = 'tab' + Date.now(); // Utiliser timestamp pour ID unique + config.tabs.push({ + id: newId, + name: `Onglet ${config.tabs.length + 1}`, + sensors: [] + }); + + renderTabs(); + renderSensors(); // Re-render pour ajouter le nouvel onglet aux selects +} + +function removeTab(tabId) { + if (config.tabs.length === 1) { + showNotification('Impossible de supprimer le dernier onglet', 'error'); + return; + } + + // Si c'était l'onglet des apps, réinitialiser + if (config.apps_tab === tabId) { + config.apps_tab = ''; + } + + config.tabs = config.tabs.filter(t => t.id !== tabId); + renderTabs(); + renderSensors(); +} + +// === Gestion des applications === +function renderApps() { + const appsList = document.getElementById('apps-list'); + appsList.innerHTML = ''; + + config.apps.forEach((app, index) => { + const item = document.createElement('div'); + item.className = 'app-item'; + item.innerHTML = ` + + + + + `; + + // Event listeners + item.querySelectorAll('input').forEach(input => { + input.addEventListener('input', (e) => { + const idx = parseInt(e.target.dataset.appIndex); + const field = e.target.dataset.field; + config.apps[idx][field] = e.target.value; + }); + }); + + appsList.appendChild(item); + }); +} + +function addApp() { + config.apps.push({ + name: 'Nouvelle App', + path: '', + icon: '🚀' + }); + + renderApps(); +} + +function removeApp(index) { + config.apps.splice(index, 1); + renderApps(); +} + +// === Sauvegarde === +async function saveConfig() { + try { + const response = await fetch('/api/config', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(config) + }); + + const result = await response.json(); + + if (result.success) { + showNotification('✅ Configuration sauvegardée !'); + } else { + showNotification('❌ Erreur de sauvegarde', 'error'); + } + + } catch (error) { + console.error('Erreur sauvegarde:', error); + showNotification('❌ Erreur de sauvegarde', 'error'); + } +} + +// === Thème === +function applyTheme(theme) { + document.documentElement.setAttribute('data-theme', theme); +} + +// === Notifications === +function showNotification(message, type = 'success') { + const notification = document.getElementById('notification'); + notification.textContent = message; + notification.className = `notification ${type}`; + notification.classList.add('show'); + + setTimeout(() => { + notification.classList.remove('show'); + }, 3000); +} + +// === Section Ordre des capteurs === +let sortableInstances = []; + +function renderOrderSection() { + const container = document.getElementById('order-tabs-container'); + if (!container) return; + + container.innerHTML = ''; + + // Détruire les anciennes instances Sortable + sortableInstances.forEach(instance => instance.destroy()); + sortableInstances = []; + + // Créer une section pour chaque onglet + config.tabs.forEach((tab, tabIndex) => { + const section = document.createElement('div'); + section.className = 'order-tab-section'; + + section.innerHTML = ` +

📑 ${tab.name} (${tab.sensors.length} capteurs)

+
+ ${tab.sensors.length === 0 ? + '
Aucun capteur dans cet onglet
' : + tab.sensors.map((sensor, index) => ` +
+ ${index + 1} + +
+
${sensor.name || sensor.id}
+
+ ${sensor.type || 'generic'} + ${sensor.viz_type === 'gauge' ? '🎯 Jauge' : sensor.viz_type === 'line' ? '📈 Courbe' : '📊 Valeur'} +
+
+
+ `).join('') + } +
+ `; + + container.appendChild(section); + + // Initialiser Sortable sur la liste si elle a des capteurs + if (tab.sensors.length > 0) { + const listEl = section.querySelector('.order-sensors-list'); + const sortable = new Sortable(listEl, { + animation: 150, + handle: '.order-sensor-handle', + ghostClass: 'sortable-ghost', + chosenClass: 'sortable-chosen', + dragClass: 'sortable-drag', + onEnd: function(evt) { + handleSensorReorder(evt); + } + }); + sortableInstances.push(sortable); + } + }); +} + +function handleSensorReorder(evt) { + const listEl = evt.from; + const tabId = listEl.dataset.tabId; + const tabIndex = parseInt(listEl.dataset.tabIndex); + + // Récupérer le nouvel ordre des IDs + const newOrder = Array.from(listEl.querySelectorAll('.order-sensor-item')) + .map(item => item.dataset.sensorId); + + // Réorganiser les capteurs dans la config + const tab = config.tabs[tabIndex]; + const reorderedSensors = []; + + newOrder.forEach(sensorId => { + const sensor = tab.sensors.find(s => s.id === sensorId); + if (sensor) { + reorderedSensors.push(sensor); + } + }); + + // Mettre à jour la config + config.tabs[tabIndex].sensors = reorderedSensors; + + // Mettre à jour les numéros affichés + updateOrderNumbers(listEl); + + console.log(`Ordre mis à jour pour ${tab.name}:`, newOrder); + showNotification('Ordre modifié (pensez à sauvegarder)', 'success'); +} + +function updateOrderNumbers(listEl) { + const items = listEl.querySelectorAll('.order-sensor-item'); + items.forEach((item, index) => { + const numberEl = item.querySelector('.order-sensor-number'); + if (numberEl) { + numberEl.textContent = index + 1; + } + item.dataset.index = index; + }); +} diff --git a/output/Pc-monitor/_internal/static/js/dashboard.js b/output/Pc-monitor/_internal/static/js/dashboard.js new file mode 100644 index 0000000..49985b9 --- /dev/null +++ b/output/Pc-monitor/_internal/static/js/dashboard.js @@ -0,0 +1,1035 @@ +// Configuration et état +let config = null; +let charts = new Map(); // Map des graphiques Chart.js +let updateInterval = null; +let currentTabIndex = 0; +let totalTabs = 0; +let consecutiveErrors = 0; +const MAX_CONSECUTIVE_ERRORS = 3; + +// Variables pour les apps +let appsRendered = false; +let lastAppsTabId = null; + +// Variables pour le swipe +let touchStartX = 0; +let touchEndX = 0; +let touchStartY = 0; +let touchEndY = 0; +const SWIPE_THRESHOLD = 50; // Minimum de pixels pour déclencher un swipe + +// Initialisation +document.addEventListener('DOMContentLoaded', async () => { + await loadConfig(); + await loadData(); + + // Initialiser le swipe + initSwipeGestures(); + + // Démarrer les mises à jour automatiques (toutes les 2 secondes) + updateInterval = setInterval(loadData, 2000); +}); + +// === Chargement configuration === +async function loadConfig() { + try { + const response = await fetch('/api/config'); + config = await response.json(); + + // Appliquer le thème + document.documentElement.setAttribute('data-theme', config.theme || 'dark'); + + // Réinitialiser le flag de rendu des apps (la config peut avoir changé) + appsRendered = false; + + // Les apps seront rendues dans loadData() après création des panes + + } catch (error) { + console.error('Erreur chargement config:', error); + showError('Impossible de charger la configuration'); + } +} + +// === Chargement données === +async function loadData() { + try { + const response = await fetch('/api/lhm/data'); + const data = await response.json(); + + if (data.error) { + consecutiveErrors++; + if (consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) { + showError(data.error); + } + return; + } + + // Réinitialiser le compteur d'erreurs en cas de succès + consecutiveErrors = 0; + + // Cacher les états d'erreur/vide + document.getElementById('error-state').style.display = 'none'; + + // Vérifier s'il y a des capteurs OU des apps configurés + const hasSensors = data.tabs.some(tab => tab.sensors.length > 0); + const hasApps = config && config.apps && config.apps.length > 0; + + if (!hasSensors && !hasApps) { + document.getElementById('empty-state').style.display = 'block'; + document.getElementById('tabs-nav').style.display = 'none'; + document.getElementById('tabs-content').style.display = 'none'; + return; + } + + document.getElementById('empty-state').style.display = 'none'; + + // Render les onglets et données + renderTabs(data.tabs); + renderSensors(data.tabs); + + // Render les apps (dans le bon onglet ou section séparée) + try { + renderApps(); + } catch (appError) { + console.error('Erreur rendu apps:', appError); + } + + // Mettre à jour le timestamp + updateTimestamp(); + + } catch (error) { + console.error('Erreur chargement données:', error); + consecutiveErrors++; + + // N'afficher l'erreur que si plusieurs échecs consécutifs + // et qu'il n'y a pas déjà du contenu affiché + if (consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) { + const tabsContent = document.getElementById('tabs-content'); + if (!tabsContent || tabsContent.children.length === 0) { + showError('Erreur de connexion à LibreHardwareMonitor'); + } + } + } +} + +// === Render onglets === +function renderTabs(tabs) { + const tabsNav = document.getElementById('tabs-nav'); + + // Mettre à jour le nombre total d'onglets + totalTabs = tabs.length; + + // Si un seul onglet, on ne l'affiche pas mais on crée quand même le swipe indicator + if (tabs.length === 1) { + tabsNav.style.display = 'none'; + removeSwipeIndicators(); + return; + } + + tabsNav.style.display = 'flex'; + + // Ne re-render que si nécessaire + if (tabsNav.dataset.rendered !== 'true') { + tabsNav.innerHTML = ''; + + tabs.forEach((tab, index) => { + const button = document.createElement('button'); + button.className = 'tab-button' + (index === 0 ? ' active' : ''); + button.textContent = tab.name; + button.dataset.tabId = tab.id; + button.dataset.tabIndex = index; + button.addEventListener('click', () => switchTab(tab.id)); + tabsNav.appendChild(button); + }); + + tabsNav.dataset.rendered = 'true'; + + // Créer les indicateurs de swipe + createSwipeIndicators(tabs.length); + } +} + +function createSwipeIndicators(count) { + // Supprimer les anciens indicateurs + removeSwipeIndicators(); + + if (count <= 1) return; + + const container = document.createElement('div'); + container.className = 'swipe-indicators'; + container.id = 'swipe-indicators'; + + for (let i = 0; i < count; i++) { + const dot = document.createElement('span'); + dot.className = 'swipe-dot' + (i === 0 ? ' active' : ''); + dot.dataset.index = i; + dot.addEventListener('click', () => switchTabByIndex(i)); + container.appendChild(dot); + } + + // Ajouter après les tabs-nav + const tabsNav = document.getElementById('tabs-nav'); + tabsNav.parentNode.insertBefore(container, tabsNav.nextSibling); +} + +function removeSwipeIndicators() { + const existing = document.getElementById('swipe-indicators'); + if (existing) { + existing.remove(); + } +} + +function switchTab(tabId) { + // Désactiver tous les tabs + document.querySelectorAll('.tab-button').forEach(btn => { + btn.classList.remove('active'); + }); + + // Activer le bon + const activeBtn = document.querySelector(`.tab-button[data-tab-id="${tabId}"]`); + if (activeBtn) { + activeBtn.classList.add('active'); + // Mettre à jour l'index courant + currentTabIndex = parseInt(activeBtn.dataset.tabIndex) || 0; + } + + // Basculer les panes + document.querySelectorAll('.tab-pane').forEach(pane => { + pane.classList.remove('active'); + }); + + const targetPane = document.getElementById(`pane-${tabId}`); + if (targetPane) { + targetPane.classList.add('active'); + } + + // Mettre à jour les indicateurs + updateSwipeIndicators(); +} + +function switchTabByIndex(index) { + const buttons = document.querySelectorAll('.tab-button'); + if (index >= 0 && index < buttons.length) { + const tabId = buttons[index].dataset.tabId; + switchTab(tabId); + } +} + +function updateSwipeIndicators() { + const indicators = document.querySelectorAll('.swipe-dot'); + indicators.forEach((dot, index) => { + dot.classList.toggle('active', index === currentTabIndex); + }); +} + +// === Render capteurs === +function renderSensors(tabs) { + const tabsContent = document.getElementById('tabs-content'); + tabsContent.style.display = 'block'; + + // Créer les panes si nécessaire + tabs.forEach((tab, index) => { + let pane = document.getElementById(`pane-${tab.id}`); + + if (!pane) { + pane = document.createElement('div'); + pane.id = `pane-${tab.id}`; + pane.className = 'tab-pane' + (index === 0 ? ' active' : ''); + tabsContent.appendChild(pane); + } + + // Créer le grid de capteurs + let grid = pane.querySelector('.sensors-grid'); + if (!grid) { + grid = document.createElement('div'); + grid.className = 'sensors-grid'; + pane.appendChild(grid); + } + + // Render chaque capteur + tab.sensors.forEach(sensor => { + console.log('--- Render sensor:', sensor.name, 'show_graph:', sensor.show_graph, 'viz_type:', sensor.viz_type); + + let card = grid.querySelector(`[data-sensor-id="${CSS.escape(sensor.id)}"]`); + + // Déterminer le viz_type à utiliser + const vizType = sensor.show_graph ? (sensor.viz_type || 'line') : 'none'; + + // Vérifier si on doit recréer la carte + let needsRecreation = false; + if (card) { + const currentVizType = card.dataset.vizType || 'none'; + const currentShowTypeBadge = card.dataset.showTypeBadge !== 'false'; + const newShowTypeBadge = sensor.show_type_badge !== false; + const currentFontFamily = card.dataset.fontFamily || 'system'; + const newFontFamily = sensor.font_family || 'system'; + const currentFontBold = card.dataset.fontBold !== 'false'; + const newFontBold = sensor.font_bold !== false; + + // Recréer si le type de visualisation a changé + if (currentVizType !== vizType) { + console.log(`⚠️ Changement de visualisation: ${currentVizType} → ${vizType}, recréation carte`); + needsRecreation = true; + + // Supprimer l'ancien graphique du Map si existant + if (charts.has(sensor.id)) { + const oldChart = charts.get(sensor.id); + // Détruire proprement si c'est un Chart.js + if (oldChart && typeof oldChart.destroy === 'function') { + oldChart.destroy(); + } + charts.delete(sensor.id); + } + } + // Recréer si l'option badge a changé + else if (currentShowTypeBadge !== newShowTypeBadge) { + console.log(`⚠️ Changement badge type: ${currentShowTypeBadge} → ${newShowTypeBadge}, recréation carte`); + needsRecreation = true; + } + // Recréer si la police a changé + else if (currentFontFamily !== newFontFamily) { + console.log(`⚠️ Changement police: ${currentFontFamily} → ${newFontFamily}, recréation carte`); + needsRecreation = true; + } + // Recréer si le bold a changé + else if (currentFontBold !== newFontBold) { + console.log(`⚠️ Changement bold: ${currentFontBold} → ${newFontBold}, recréation carte`); + needsRecreation = true; + } + // Vérifier aussi si le canvas manque + else if (sensor.show_graph) { + if (vizType === 'gauge' && !card.querySelector('.sensor-gauge')) { + console.log('⚠️ Jauge manquante, recréation carte'); + needsRecreation = true; + } else if (vizType === 'line' && !card.querySelector('.sensor-chart')) { + console.log('⚠️ Graphique manquant, recréation carte'); + needsRecreation = true; + } + } + } + + if (!card || needsRecreation) { + console.log(needsRecreation ? 'Recréation carte...' : 'Carte n\'existe pas, création...'); + + // Supprimer l'ancienne si elle existe + if (card) { + card.remove(); + } + + // Créer un objet sensor modifié pour l'affichage + const sensorForDisplay = { + ...sensor, + viz_type: sensor.show_graph ? (sensor.viz_type || 'line') : 'none' + }; + + // Créer la carte + card = createSensorCard(sensorForDisplay); + grid.appendChild(card); + + // Créer la visualisation si nécessaire + if (sensor.show_graph) { + console.log('show_graph = true, création visualisation...'); + if (vizType === 'gauge') { + console.log('→ Appel createGauge'); + createGauge(sensorForDisplay); + } else { + console.log('→ Appel createChart'); + createChart(sensorForDisplay); + } + } else { + console.log('show_graph = false, pas de visualisation'); + } + } else { + // Mettre à jour la valeur + updateSensorCard(card, sensor); + } + + // Mettre à jour la visualisation + if (sensor.show_graph && charts.has(sensor.id)) { + if (vizType === 'gauge') { + updateGauge(sensor); + } else { + updateChart(sensor); + } + } + }); + }); +} + +function createSensorCard(sensor) { + console.log('=== createSensorCard ==='); + console.log('Sensor:', sensor); + console.log('show_graph:', sensor.show_graph); + console.log('viz_type:', sensor.viz_type); + + const card = document.createElement('div'); + card.className = 'sensor-card'; + + // Ajouter la classe de taille + const cardSize = sensor.card_size || 'medium'; + card.classList.add(`card-${cardSize}`); + + // Ajouter la classe de police + const fontFamily = sensor.font_family || 'system'; + card.classList.add(`font-family-${fontFamily}`); + + // Ajouter la classe bold/normal + const fontBold = sensor.font_bold !== false; // true par défaut + card.classList.add(fontBold ? 'font-bold' : 'font-normal'); + + // Ajouter la classe de taille de police + const fontSize = sensor.font_size || 'small'; + card.classList.add(`font-${fontSize}`); + + // Ajouter la classe pour masquer la valeur sur mobile si activé + if (sensor.hide_value_mobile) { + card.classList.add('hide-value-mobile'); + } + + card.dataset.sensorId = sensor.id; + card.dataset.vizType = sensor.show_graph ? (sensor.viz_type || 'line') : 'none'; + card.dataset.showTypeBadge = sensor.show_type_badge !== false ? 'true' : 'false'; + card.dataset.fontFamily = fontFamily; + card.dataset.fontBold = fontBold ? 'true' : 'false'; + + const valueClass = getSensorValueClass(sensor); + + // Déterminer quel type de visualisation afficher + let vizHtml = ''; + if (sensor.show_graph && sensor.viz_type === 'gauge') { + console.log('→ Création HTML jauge DIRECTE'); + const gaugeSize = (sensor.gauge_options && sensor.gauge_options.size) || 'medium'; + // Définir les dimensions selon la taille + const gaugeSizes = { + tiny: 60, + xs: 90, + small: 120, + medium: 180, + large: 240 + }; + const size = gaugeSizes[gaugeSize] || 180; + // Canvas DIRECT avec dimensions explicites + vizHtml = ``; + } else if (sensor.show_graph && (sensor.viz_type === 'line' || !sensor.viz_type)) { + console.log('→ Création HTML courbe DIRECTE'); + const chartHeight = (sensor.chart_options && sensor.chart_options.height) || 'medium'; + // Définir les hauteurs selon la taille + const chartHeights = { + tiny: 50, + xs: 70, + small: 90, + medium: 120, + large: 180 + }; + const height = chartHeights[chartHeight] || 120; + // Canvas DIRECT avec dimensions explicites (width sera 100%) + vizHtml = ``; + } else { + console.log('→ Pas de visualisation'); + } + + // Badge de type (affiché par défaut, peut être masqué) + const showTypeBadge = sensor.show_type_badge !== false; + const typeBadgeHtml = showTypeBadge ? `
${sensor.type}
` : ''; + + card.innerHTML = ` +
+
${sensor.name}
+ ${typeBadgeHtml} +
+
${sensor.value}
+ ${vizHtml} + `; + + console.log('HTML carte créée avec canvas DIRECT'); + return card; +} + +function updateSensorCard(card, sensor) { + const valueDiv = card.querySelector('[data-value]'); + valueDiv.textContent = sensor.value; + valueDiv.className = 'sensor-value ' + getSensorValueClass(sensor); +} + +function getSensorValueClass(sensor) { + let classes = [sensor.type]; + + // Ajouter des classes selon la valeur + if (sensor.type === 'temperature') { + const temp = parseFloat(sensor.value); + if (temp < 40) classes.push('cold'); + else if (temp > 70) classes.push('hot'); + } else if (sensor.type === 'percentage') { + const percent = parseFloat(sensor.value); + if (percent > 90) classes.push('critical'); + else if (percent > 70) classes.push('high'); + } + + return classes.join(' '); +} + +// === Graphiques Chart.js === +function createChart(sensor) { + console.log('=== createChart appelé ==='); + console.log('Sensor:', sensor); + + const sensorId = sensor.id; + const card = document.querySelector(`[data-sensor-id="${CSS.escape(sensorId)}"]`); + + console.log('Card trouvée:', card); + if (!card) { + console.error('ERREUR: Card non trouvée pour', sensorId); + return; + } + + const canvas = card.querySelector('.sensor-chart'); + console.log('Canvas trouvé:', canvas); + + if (!canvas) { + console.error('ERREUR: Canvas .sensor-chart non trouvé dans la carte'); + return; + } + + const ctx = canvas.getContext('2d'); + console.log('Context 2D:', ctx); + + // Obtenir le type de capteur + const sensorType = sensor.type || 'generic'; + + // Couleurs selon le type + let borderColor, backgroundColor; + switch(sensorType) { + case 'temperature': + borderColor = 'rgba(255, 152, 0, 1)'; // Orange + backgroundColor = 'rgba(255, 152, 0, 0.1)'; + break; + case 'percentage': + case 'load': + borderColor = 'rgba(74, 158, 255, 1)'; // Bleu + backgroundColor = 'rgba(74, 158, 255, 0.1)'; + break; + case 'fan': + borderColor = 'rgba(76, 175, 80, 1)'; // Vert + backgroundColor = 'rgba(76, 175, 80, 0.1)'; + break; + case 'power': + borderColor = 'rgba(244, 67, 54, 1)'; // Rouge + backgroundColor = 'rgba(244, 67, 54, 0.1)'; + break; + case 'voltage': + borderColor = 'rgba(156, 39, 176, 1)'; // Violet + backgroundColor = 'rgba(156, 39, 176, 0.1)'; + break; + case 'frequency': + case 'clock': + borderColor = 'rgba(255, 193, 7, 1)'; // Jaune + backgroundColor = 'rgba(255, 193, 7, 0.1)'; + break; + default: + borderColor = 'rgba(74, 158, 255, 1)'; + backgroundColor = 'rgba(74, 158, 255, 0.1)'; + } + + console.log('Création Chart.js...'); + const chart = new Chart(ctx, { + type: 'line', + data: { + labels: [], + datasets: [{ + data: [], + borderColor: borderColor, + backgroundColor: backgroundColor, + borderWidth: 2, + tension: 0.4, + pointRadius: 0, + fill: true + }] + }, + options: { + responsive: true, + maintainAspectRatio: false, + plugins: { + legend: { display: false }, + tooltip: { enabled: false } + }, + scales: { + x: { display: false }, + y: { + display: true, + grid: { + color: 'rgba(255, 255, 255, 0.05)', + drawBorder: false + }, + ticks: { + color: 'rgba(255, 255, 255, 0.3)', + font: { size: 10 } + } + } + }, + animation: { duration: 0 } + } + }); + + console.log('Chart créé:', chart); + charts.set(sensorId, chart); + console.log('Chart stocké dans Map'); + + // Charger l'historique initial + console.log('Chargement historique initial...'); + updateChart(sensor); +} + +async function updateChart(sensor) { + console.log('=== updateChart appelé ===', sensor.name); + + const sensorId = sensor.id; + const chart = charts.get(sensorId); + if (!chart) { + console.error('ERREUR: Chart non trouvé dans Map pour', sensorId); + return; + } + + // Vérifier si le chart est dans un onglet actif + const canvas = chart.canvas; + if (canvas) { + const pane = canvas.closest('.tab-pane'); + if (pane && !pane.classList.contains('active')) { + // Le chart est dans un onglet inactif, ne pas mettre à jour + return; + } + } + + try { + console.log('Fetch historique pour', sensorId); + const response = await fetch(`/api/lhm/history/${encodeURIComponent(sensorId)}?count=60`); + const data = await response.json(); + + console.log('Historique reçu:', data); + + if (data.values && data.values.length > 0) { + console.log('→ Mise à jour chart avec', data.values.length, 'valeurs'); + chart.data.labels = data.values.map((_, i) => i); + chart.data.datasets[0].data = data.values; + chart.update('none'); + console.log('→ Chart mis à jour'); + } else { + console.warn('→ Pas de valeurs dans l\'historique'); + } + } catch (error) { + console.error('Erreur mise à jour graphique:', sensorId, error); + } +} + +// === Jauges circulaires === +function createGauge(sensor) { + console.log('=== createGauge appelé ==='); + console.log('Sensor:', sensor); + + const sensorId = sensor.id; + const card = document.querySelector(`[data-sensor-id="${CSS.escape(sensorId)}"]`); + + console.log('Card trouvée:', card); + if (!card) { + console.error('ERREUR: Card non trouvée pour', sensorId); + return; + } + + const canvas = card.querySelector('.sensor-gauge'); + console.log('Canvas trouvé:', canvas); + + if (!canvas) { + console.error('ERREUR: Canvas .sensor-gauge non trouvé dans la carte'); + console.log('HTML de la card:', card.innerHTML); + return; + } + + // Stocker les infos de la jauge + charts.set(sensorId, { + type: 'gauge', + canvas: canvas, + sensor: sensor + }); + + console.log('Jauge stockée dans Map, dessin initial...'); + + // Dessiner la jauge initiale + updateGauge(sensor); +} + +function updateGauge(sensor) { + console.log('=== updateGauge appelé ===', sensor.name); + + const sensorId = sensor.id; + const gaugeInfo = charts.get(sensorId); + if (!gaugeInfo || gaugeInfo.type !== 'gauge') { + console.error('ERREUR: gaugeInfo non trouvé ou pas de type gauge'); + return; + } + + const canvas = gaugeInfo.canvas; + if (!canvas) { + console.error('ERREUR: canvas non trouvé'); + return; + } + + // Vérifier si le canvas est visible (dans un onglet actif) + const pane = canvas.closest('.tab-pane'); + if (pane && !pane.classList.contains('active')) { + // Le canvas est dans un onglet inactif, ne pas dessiner + return; + } + + const ctx = canvas.getContext('2d'); + + console.log('Canvas:', canvas, 'offsetWidth:', canvas.offsetWidth); + + // Définir la taille - protection contre taille nulle ou trop petite + const size = canvas.offsetWidth || canvas.width || 60; + if (size < 20) { + console.warn('Canvas trop petit, skip updateGauge'); + return; + } + + canvas.width = size; + canvas.height = size; + + console.log('Taille canvas:', size); + + // Extraire la valeur numérique + const valueStr = sensor.value.replace(/[^\d.,]/g, '').replace(',', '.'); + let value = parseFloat(valueStr); + if (isNaN(value)) value = 0; + + console.log('Valeur extraite:', value); + + // Déterminer min, max selon le type + let min = 0, max = 100; + const sensorType = sensor.type || 'generic'; + + switch(sensorType) { + case 'temperature': + min = 0; + max = 100; // 0-100°C + break; + case 'percentage': + case 'load': + min = 0; + max = 100; + break; + case 'fan': + min = 0; + max = 2000; // 0-2000 RPM + break; + case 'power': + min = 0; + max = 200; // 0-200W + break; + case 'voltage': + min = 0; + max = 15; // 0-15V + break; + case 'frequency': + case 'clock': + min = 0; + max = 6000; // 0-6000 MHz + break; + default: + min = 0; + max = 100; + } + + // Calculer le pourcentage + const percentage = Math.min(Math.max((value - min) / (max - min), 0), 1); + + // Couleur selon le type et la valeur + let color; + if (sensorType === 'temperature') { + if (value < 40) color = '#4a9eff'; // Bleu (froid) + else if (value < 70) color = '#ff9800'; // Orange (tiède) + else color = '#f44336'; // Rouge (chaud) + } else if (sensorType === 'percentage' || sensorType === 'load') { + if (value < 50) color = '#4caf50'; // Vert + else if (value < 80) color = '#ff9800'; // Orange + else color = '#f44336'; // Rouge + } else if (sensorType === 'fan') { + color = '#4caf50'; // Vert + } else if (sensorType === 'power') { + color = '#f44336'; // Rouge + } else if (sensorType === 'voltage') { + color = '#9c27b0'; // Violet + } else if (sensorType === 'frequency' || sensorType === 'clock') { + color = '#ffc107'; // Jaune + } else { + color = '#4a9eff'; // Bleu par défaut + } + + // Effacer le canvas + ctx.clearRect(0, 0, size, size); + + // Centre et rayon + const centerX = size / 2; + const centerY = size / 2; + const radius = Math.max(size / 2 - 10, 5); // Minimum 5px de rayon + const lineWidth = Math.max(size / 10, 2); // Minimum 2px d'épaisseur + + // Fond de la jauge (gris) + ctx.beginPath(); + ctx.arc(centerX, centerY, radius, 0.75 * Math.PI, 2.25 * Math.PI); + ctx.strokeStyle = 'rgba(255, 255, 255, 0.1)'; + ctx.lineWidth = lineWidth; + ctx.lineCap = 'round'; + ctx.stroke(); + + // Arc de la valeur + const startAngle = 0.75 * Math.PI; + const endAngle = startAngle + (1.5 * Math.PI * percentage); + + ctx.beginPath(); + ctx.arc(centerX, centerY, radius, startAngle, endAngle); + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + ctx.lineCap = 'round'; + ctx.stroke(); + + // Récupérer les options personnalisées + const gaugeOptions = sensor.gauge_options || {}; + const showValue = gaugeOptions.show_value !== false; // true par défaut + + // Texte de la valeur au centre (si activé) + if (showValue) { + ctx.fillStyle = 'rgba(255, 255, 255, 0.9)'; + ctx.font = `bold ${size / 4}px -apple-system, sans-serif`; + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + ctx.fillText(sensor.value, centerX, centerY); + } +} + +// === Applications === +function renderApps() { + const appsSection = document.getElementById('apps-section'); + + if (!config || !config.apps || config.apps.length === 0) { + if (appsSection) appsSection.style.display = 'none'; + cleanAppsFromTabs(); + appsRendered = false; + return; + } + + const appsTabId = config.apps_tab || ''; + + // Si les apps ont déjà été rendues dans le même onglet, ne pas re-rendre + if (appsRendered && lastAppsTabId === appsTabId) { + return; + } + + // Créer le HTML des boutons d'apps + const appsHtml = config.apps.map((app, index) => ` + + `).join(''); + + // Nettoyer d'abord les apps existantes dans les onglets + cleanAppsFromTabs(); + + // Si un onglet est spécifié, mettre les apps dans cet onglet + if (appsTabId) { + // Cacher la section séparée + if (appsSection) appsSection.style.display = 'none'; + + // Trouver le pane cible + const targetPane = document.getElementById(`pane-${appsTabId}`); + if (targetPane) { + // Créer la nouvelle grille d'apps + const appsContainer = document.createElement('div'); + appsContainer.className = 'apps-section-in-tab'; + appsContainer.innerHTML = ` +

🚀 Applications

+
${appsHtml}
+ `; + + // Ajouter à la fin du pane + targetPane.appendChild(appsContainer); + + // Ajouter les event listeners + appsContainer.querySelectorAll('.app-button').forEach(btn => { + btn.addEventListener('click', () => launchApp(parseInt(btn.dataset.appIndex))); + }); + + appsRendered = true; + lastAppsTabId = appsTabId; + } else { + // L'onglet cible n'existe pas encore, afficher dans la section séparée + console.warn(`Onglet apps "${appsTabId}" non trouvé, affichage en section séparée`); + renderAppsInSection(appsHtml); + appsRendered = true; + lastAppsTabId = ''; + } + } else { + // Afficher dans la section séparée (comportement par défaut) + renderAppsInSection(appsHtml); + appsRendered = true; + lastAppsTabId = ''; + } +} + +function renderAppsInSection(appsHtml) { + const appsSection = document.getElementById('apps-section'); + const appsGrid = document.getElementById('apps-grid'); + + if (appsSection && appsGrid) { + appsSection.style.display = 'block'; + appsGrid.innerHTML = appsHtml; + + // Ajouter les event listeners + appsGrid.querySelectorAll('.app-button').forEach(btn => { + btn.addEventListener('click', () => launchApp(parseInt(btn.dataset.appIndex))); + }); + } +} + +// Nettoyer les apps des onglets (appelé lors du re-render) +function cleanAppsFromTabs() { + document.querySelectorAll('.apps-section-in-tab').forEach(el => el.remove()); +} + +async function launchApp(appId) { + try { + const response = await fetch(`/api/apps/launch/${appId}`, { + method: 'POST' + }); + + const result = await response.json(); + + if (!result.success) { + alert('Erreur: ' + result.error); + } + + } catch (error) { + console.error('Erreur lancement app:', error); + alert('Erreur de lancement'); + } +} + +// === Utilitaires === +function updateTimestamp() { + const now = new Date(); + const timeStr = now.toLocaleTimeString('fr-FR', { + hour: '2-digit', + minute: '2-digit', + second: '2-digit' + }); + + document.getElementById('last-update').textContent = `🔄 ${timeStr}`; +} + +function showError(message) { + const errorState = document.getElementById('error-state'); + const errorMessage = document.getElementById('error-message'); + + errorMessage.textContent = message; + errorState.style.display = 'block'; + + document.getElementById('empty-state').style.display = 'none'; + document.getElementById('tabs-nav').style.display = 'none'; + document.getElementById('tabs-content').style.display = 'none'; +} + +// Nettoyage à la fermeture +window.addEventListener('beforeunload', () => { + if (updateInterval) { + clearInterval(updateInterval); + } + + charts.forEach((chart, key) => { + // Chart.js a une méthode destroy, les jauges n'en ont pas + if (chart && typeof chart.destroy === 'function') { + chart.destroy(); + } + }); +}); + +// === Swipe Gestures === +function initSwipeGestures() { + const tabsContent = document.getElementById('tabs-content'); + + if (!tabsContent) return; + + // Touch events + tabsContent.addEventListener('touchstart', handleTouchStart, { passive: true }); + tabsContent.addEventListener('touchend', handleTouchEnd, { passive: true }); + + // Optionnel: support souris pour test sur desktop + tabsContent.addEventListener('mousedown', handleMouseDown); + tabsContent.addEventListener('mouseup', handleMouseUp); +} + +function handleTouchStart(e) { + touchStartX = e.changedTouches[0].screenX; + touchStartY = e.changedTouches[0].screenY; +} + +function handleTouchEnd(e) { + touchEndX = e.changedTouches[0].screenX; + touchEndY = e.changedTouches[0].screenY; + handleSwipe(); +} + +function handleMouseDown(e) { + touchStartX = e.screenX; + touchStartY = e.screenY; +} + +function handleMouseUp(e) { + touchEndX = e.screenX; + touchEndY = e.screenY; + handleSwipe(); +} + +function handleSwipe() { + const deltaX = touchEndX - touchStartX; + const deltaY = touchEndY - touchStartY; + + // Vérifier que c'est bien un swipe horizontal (pas vertical) + if (Math.abs(deltaX) < SWIPE_THRESHOLD) return; + if (Math.abs(deltaY) > Math.abs(deltaX)) return; // Scroll vertical, ignorer + + if (deltaX > 0) { + // Swipe vers la droite → onglet précédent + navigateToPreviousTab(); + } else { + // Swipe vers la gauche → onglet suivant + navigateToNextTab(); + } +} + +function navigateToNextTab() { + if (totalTabs <= 1) return; + + const nextIndex = (currentTabIndex + 1) % totalTabs; + switchTabByIndex(nextIndex); + + // Feedback visuel + showSwipeFeedback('next'); +} + +function navigateToPreviousTab() { + if (totalTabs <= 1) return; + + const prevIndex = (currentTabIndex - 1 + totalTabs) % totalTabs; + switchTabByIndex(prevIndex); + + // Feedback visuel + showSwipeFeedback('prev'); +} + +function showSwipeFeedback(direction) { + const content = document.getElementById('tabs-content'); + content.classList.add('swipe-' + direction); + + setTimeout(() => { + content.classList.remove('swipe-' + direction); + }, 200); +} diff --git a/output/Pc-monitor/_internal/templates/admin.html b/output/Pc-monitor/_internal/templates/admin.html new file mode 100644 index 0000000..daa5e45 --- /dev/null +++ b/output/Pc-monitor/_internal/templates/admin.html @@ -0,0 +1,256 @@ + + + + + + PC Monitor - Admin + + + + + +
+
+

⚙️ Configuration PC Monitor

+
+ 📊 Dashboard + +
+
+ +
+ + + + +
+

Source de monitoring

+

Choisissez le logiciel de monitoring à utiliser

+ +
+ +
+ +
+

⚙️ Configuration de la connexion

+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ +
+ +
+
+ + +
+

Sélection des capteurs

+

Cochez les capteurs que vous souhaitez afficher sur le dashboard

+ +
+
Chargement des capteurs...
+ +
+
+ + +
+

Ordre des capteurs

+

Glissez-déposez les capteurs pour changer leur ordre d'affichage

+ +
+ +
+
+ + +
+

Gestion des onglets

+

Créez et organisez vos onglets personnalisés

+ +
+
+ + +
+
+ + +
+

Applications lancables

+

Configurez les applications que vous voulez lancer depuis le dashboard

+ +
+ + +
+ +
+ + +
+ + +
+

Apparence

+

Personnalisez le thème de l'interface

+ +
+ + + + + +
+
+
+
+ + + + +
+ + + + diff --git a/output/Pc-monitor/_internal/templates/dashboard.html b/output/Pc-monitor/_internal/templates/dashboard.html new file mode 100644 index 0000000..6dbbffb --- /dev/null +++ b/output/Pc-monitor/_internal/templates/dashboard.html @@ -0,0 +1,61 @@ + + + + + + PC Monitor - Dashboard + + + + + + + + +
+
+

📊 PC Monitor

+
+ - + ⚙️ +
+
+ + + + + +
+ +
+ + + + + +
+
📊
+

Aucun capteur configuré

+

Rendez-vous dans la page d'administration pour configurer vos capteurs

+ ⚙️ Configuration +
+ + + +
+ + + + diff --git a/output/Pc-monitor/_internal/ucrtbase.dll b/output/Pc-monitor/_internal/ucrtbase.dll new file mode 100644 index 0000000..0b41078 Binary files /dev/null and b/output/Pc-monitor/_internal/ucrtbase.dll differ diff --git a/output/Pc-monitor/_internal/unicodedata.pyd b/output/Pc-monitor/_internal/unicodedata.pyd new file mode 100644 index 0000000..df8b894 Binary files /dev/null and b/output/Pc-monitor/_internal/unicodedata.pyd differ diff --git a/output/Pc-monitor/_internal/werkzeug-3.1.3.dist-info/INSTALLER b/output/Pc-monitor/_internal/werkzeug-3.1.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/output/Pc-monitor/_internal/werkzeug-3.1.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/output/Pc-monitor/_internal/werkzeug-3.1.3.dist-info/LICENSE.txt b/output/Pc-monitor/_internal/werkzeug-3.1.3.dist-info/LICENSE.txt new file mode 100644 index 0000000..c37cae4 --- /dev/null +++ b/output/Pc-monitor/_internal/werkzeug-3.1.3.dist-info/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/output/Pc-monitor/_internal/werkzeug-3.1.3.dist-info/METADATA b/output/Pc-monitor/_internal/werkzeug-3.1.3.dist-info/METADATA new file mode 100644 index 0000000..e495b3d --- /dev/null +++ b/output/Pc-monitor/_internal/werkzeug-3.1.3.dist-info/METADATA @@ -0,0 +1,99 @@ +Metadata-Version: 2.3 +Name: Werkzeug +Version: 3.1.3 +Summary: The comprehensive WSGI web application library. +Maintainer-email: Pallets +Requires-Python: >=3.9 +Description-Content-Type: text/markdown +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Classifier: Typing :: Typed +Requires-Dist: MarkupSafe>=2.1.1 +Requires-Dist: watchdog>=2.3 ; extra == "watchdog" +Project-URL: Changes, https://werkzeug.palletsprojects.com/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://werkzeug.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Issue Tracker, https://github.com/pallets/werkzeug/issues/ +Project-URL: Source Code, https://github.com/pallets/werkzeug/ +Provides-Extra: watchdog + +# Werkzeug + +*werkzeug* German noun: "tool". Etymology: *werk* ("work"), *zeug* ("stuff") + +Werkzeug is a comprehensive [WSGI][] web application library. It began as +a simple collection of various utilities for WSGI applications and has +become one of the most advanced WSGI utility libraries. + +It includes: + +- An interactive debugger that allows inspecting stack traces and + source code in the browser with an interactive interpreter for any + frame in the stack. +- A full-featured request object with objects to interact with + headers, query args, form data, files, and cookies. +- A response object that can wrap other WSGI applications and handle + streaming data. +- A routing system for matching URLs to endpoints and generating URLs + for endpoints, with an extensible system for capturing variables + from URLs. +- HTTP utilities to handle entity tags, cache control, dates, user + agents, cookies, files, and more. +- A threaded WSGI server for use while developing applications + locally. +- A test client for simulating HTTP requests during testing without + requiring running a server. + +Werkzeug doesn't enforce any dependencies. It is up to the developer to +choose a template engine, database adapter, and even how to handle +requests. It can be used to build all sorts of end user applications +such as blogs, wikis, or bulletin boards. + +[Flask][] wraps Werkzeug, using it to handle the details of WSGI while +providing more structure and patterns for defining powerful +applications. + +[WSGI]: https://wsgi.readthedocs.io/en/latest/ +[Flask]: https://www.palletsprojects.com/p/flask/ + + +## A Simple Example + +```python +# save this as app.py +from werkzeug.wrappers import Request, Response + +@Request.application +def application(request: Request) -> Response: + return Response("Hello, World!") + +if __name__ == "__main__": + from werkzeug.serving import run_simple + run_simple("127.0.0.1", 5000, application) +``` + +``` +$ python -m app + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) +``` + + +## Donate + +The Pallets organization develops and supports Werkzeug and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +[please donate today][]. + +[please donate today]: https://palletsprojects.com/donate + diff --git a/output/Pc-monitor/_internal/werkzeug-3.1.3.dist-info/RECORD b/output/Pc-monitor/_internal/werkzeug-3.1.3.dist-info/RECORD new file mode 100644 index 0000000..9756b78 --- /dev/null +++ b/output/Pc-monitor/_internal/werkzeug-3.1.3.dist-info/RECORD @@ -0,0 +1,116 @@ +werkzeug-3.1.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +werkzeug-3.1.3.dist-info/LICENSE.txt,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +werkzeug-3.1.3.dist-info/METADATA,sha256=9d8uO6J-ck8mHyFjxFUs5nCVy5iN3XdTYcJfz2QBr0I,3682 +werkzeug-3.1.3.dist-info/RECORD,, +werkzeug-3.1.3.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82 +werkzeug/__init__.py,sha256=CejNWfCZKDaJ_FmshZFw8dFgjNAlu6q15ec7DwWJlM8,165 +werkzeug/__pycache__/__init__.cpython-313.pyc,, +werkzeug/__pycache__/_internal.cpython-313.pyc,, +werkzeug/__pycache__/_reloader.cpython-313.pyc,, +werkzeug/__pycache__/exceptions.cpython-313.pyc,, +werkzeug/__pycache__/formparser.cpython-313.pyc,, +werkzeug/__pycache__/http.cpython-313.pyc,, +werkzeug/__pycache__/local.cpython-313.pyc,, +werkzeug/__pycache__/security.cpython-313.pyc,, +werkzeug/__pycache__/serving.cpython-313.pyc,, +werkzeug/__pycache__/test.cpython-313.pyc,, +werkzeug/__pycache__/testapp.cpython-313.pyc,, +werkzeug/__pycache__/urls.cpython-313.pyc,, +werkzeug/__pycache__/user_agent.cpython-313.pyc,, +werkzeug/__pycache__/utils.cpython-313.pyc,, +werkzeug/__pycache__/wsgi.cpython-313.pyc,, +werkzeug/_internal.py,sha256=su1olkbHMkzt0VKcEkPLCha8sdVzXNBuqW6YVpp8GHg,5545 +werkzeug/_reloader.py,sha256=QuMO-UwuD-cHsUpwSEUr7iYNbv_ziHFhgNDAiv25J80,15429 +werkzeug/datastructures/__init__.py,sha256=0Vt8Lt8KUYSoAe8ADt1jIE-w3Ib9tkrk0HEhBOktqUw,2615 +werkzeug/datastructures/__pycache__/__init__.cpython-313.pyc,, +werkzeug/datastructures/__pycache__/accept.cpython-313.pyc,, +werkzeug/datastructures/__pycache__/auth.cpython-313.pyc,, +werkzeug/datastructures/__pycache__/cache_control.cpython-313.pyc,, +werkzeug/datastructures/__pycache__/csp.cpython-313.pyc,, +werkzeug/datastructures/__pycache__/etag.cpython-313.pyc,, +werkzeug/datastructures/__pycache__/file_storage.cpython-313.pyc,, +werkzeug/datastructures/__pycache__/headers.cpython-313.pyc,, +werkzeug/datastructures/__pycache__/mixins.cpython-313.pyc,, +werkzeug/datastructures/__pycache__/range.cpython-313.pyc,, +werkzeug/datastructures/__pycache__/structures.cpython-313.pyc,, +werkzeug/datastructures/accept.py,sha256=xoDD4qwZeTjew_1Ze0gyyKWkbhtowwR5tHTWnobPeGI,12177 +werkzeug/datastructures/auth.py,sha256=Zcqdr8-uUpq6_czg1672S2XthG0UakhUHOuummzqz64,10055 +werkzeug/datastructures/cache_control.py,sha256=hh-0nlj8CWDTrWcDvprMkmHZ8HW_Afo4853vl0LuFU4,9697 +werkzeug/datastructures/csp.py,sha256=2UDhFNqBzjhpA45m11HDg6LnhBSSWWdkfFzPq7ikfho,3816 +werkzeug/datastructures/etag.py,sha256=N2dFqhFsLR0k5hgjol3QTGpcSltJhpgLWeyz6Va80G8,3278 +werkzeug/datastructures/file_storage.py,sha256=2P-4PEkR_kY37g3hc1S30YH_15VrwRnQ13sBFreZyc4,6701 +werkzeug/datastructures/headers.py,sha256=_VjcQCrLxjNKxPL8xSoFnEJnZ5tRc1zdL9spQf4c758,21554 +werkzeug/datastructures/mixins.py,sha256=sYJeA8kZuAOvzlfrRWRN2dyuNrBev4yFxWH8coZyrec,9027 +werkzeug/datastructures/range.py,sha256=5c1Mo5jBkkVhQyLoD9lPdjETKo0iw9g-lFYOqF1ZQvY,7020 +werkzeug/datastructures/structures.py,sha256=IG5WpAj5RZSUfyxYXXHvIgtlOx5PQeZ9YmQO87FJr08,41359 +werkzeug/debug/__init__.py,sha256=80vaavVZYwV21ItrsOLQudEUi2uKDlxcjm5cCmeU1u4,20016 +werkzeug/debug/__pycache__/__init__.cpython-313.pyc,, +werkzeug/debug/__pycache__/console.cpython-313.pyc,, +werkzeug/debug/__pycache__/repr.cpython-313.pyc,, +werkzeug/debug/__pycache__/tbtools.cpython-313.pyc,, +werkzeug/debug/console.py,sha256=t4hZ0Qg1p6Uu2MWimqoMDi7S3WYZvLMjnc8v_dPaxAo,6089 +werkzeug/debug/repr.py,sha256=iHMYny8whiiMDasvUqj0nm4-1VHVvwe697KleiZVK1s,9303 +werkzeug/debug/shared/ICON_LICENSE.md,sha256=DhA6Y1gUl5Jwfg0NFN9Rj4VWITt8tUx0IvdGf0ux9-s,222 +werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507 +werkzeug/debug/shared/debugger.js,sha256=SRL9YZ9FTVngaYD-INQNincEVdZ-kBHa_-VJx0U7-rg,10068 +werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191 +werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200 +werkzeug/debug/shared/style.css,sha256=-xSxzUEZGw_IqlDR5iZxitNl8LQUjBM-_Y4UAvXVH8g,6078 +werkzeug/debug/tbtools.py,sha256=4JDhZT_2gm9sMgfiMieEyxRsV196i3kp_0b3MOjy1KY,13560 +werkzeug/exceptions.py,sha256=cpwKKTfe1_yFrBpRHjp2bqwDhtUdHnGoDKcWOXR_SIE,26455 +werkzeug/formparser.py,sha256=v0-F9OcmNHuPLqXePW_b0asWzpH-Z_ZlGj8ao0CMmuo,15847 +werkzeug/http.py,sha256=PRpjIrbvIIiAMlmxwVIo9MMxaNX8vSOSn58rwAThEWM,44880 +werkzeug/local.py,sha256=KUFuAm8BAayQouzVg0MGqW_hiwY8Z_lY5l7d1Scvsx8,22492 +werkzeug/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +werkzeug/middleware/__pycache__/__init__.cpython-313.pyc,, +werkzeug/middleware/__pycache__/dispatcher.cpython-313.pyc,, +werkzeug/middleware/__pycache__/http_proxy.cpython-313.pyc,, +werkzeug/middleware/__pycache__/lint.cpython-313.pyc,, +werkzeug/middleware/__pycache__/profiler.cpython-313.pyc,, +werkzeug/middleware/__pycache__/proxy_fix.cpython-313.pyc,, +werkzeug/middleware/__pycache__/shared_data.cpython-313.pyc,, +werkzeug/middleware/dispatcher.py,sha256=zWN5_lqJr_sc9UDv-PPoSlDHN_zR33z6B74F_4Cxpo8,2602 +werkzeug/middleware/http_proxy.py,sha256=sdk-V6GoZ6aMny-D0QNKNf5MWD2OTO3AGbBg6upp4Hc,7834 +werkzeug/middleware/lint.py,sha256=jVdyljRxpkz18MiMR8N7YdiElna8DJVvO4CCjZsnSQI,14476 +werkzeug/middleware/profiler.py,sha256=1ZAHlDeYNdhgp8THOXkV5lgmcLl307phAr2Ufy30-lY,5562 +werkzeug/middleware/proxy_fix.py,sha256=n-HW-MRWJquCIhmqiZKoGdbbEeHuWJqPRHhFpuj4pzY,6755 +werkzeug/middleware/shared_data.py,sha256=gsjmgeEFLzDdKsgd19pMhI7BfU_TbL6AyEyZPG2ykfQ,9542 +werkzeug/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +werkzeug/routing/__init__.py,sha256=d8TRxsk24IWu2BdoOYUfL--deolHwiGVCBJqLoEe3YM,4820 +werkzeug/routing/__pycache__/__init__.cpython-313.pyc,, +werkzeug/routing/__pycache__/converters.cpython-313.pyc,, +werkzeug/routing/__pycache__/exceptions.cpython-313.pyc,, +werkzeug/routing/__pycache__/map.cpython-313.pyc,, +werkzeug/routing/__pycache__/matcher.cpython-313.pyc,, +werkzeug/routing/__pycache__/rules.cpython-313.pyc,, +werkzeug/routing/converters.py,sha256=iqpee_mAjr1oGbq0etujYF9PiDv5U7DgNkARHXnMId0,7297 +werkzeug/routing/exceptions.py,sha256=wNBiUmUk4OtFOpbdDSr7KKKUjH7yn84JqwBicUup8p8,4846 +werkzeug/routing/map.py,sha256=mEXlHOyinkg1Jtx5L0UDYsvoX4eVLiEuEVQzD5LVAz8,36515 +werkzeug/routing/matcher.py,sha256=nfBbl37eGAkZ1dQlumshFcPuyfggmFjPuSSQOE6GuYs,7849 +werkzeug/routing/rules.py,sha256=eGi6PD-COG2As_HY0nAw-nxYxLTH0FsuqRaSy8d9FjQ,32510 +werkzeug/sansio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +werkzeug/sansio/__pycache__/__init__.cpython-313.pyc,, +werkzeug/sansio/__pycache__/http.cpython-313.pyc,, +werkzeug/sansio/__pycache__/multipart.cpython-313.pyc,, +werkzeug/sansio/__pycache__/request.cpython-313.pyc,, +werkzeug/sansio/__pycache__/response.cpython-313.pyc,, +werkzeug/sansio/__pycache__/utils.cpython-313.pyc,, +werkzeug/sansio/http.py,sha256=OYlTJn8fJhHA0CDOOmerekpsyGyIQVm9LvVRO3lH0TA,5337 +werkzeug/sansio/multipart.py,sha256=fMGgY9CvMDRgNgKozz2cBIp0iN2EME2IIOBh306_Ecs,11637 +werkzeug/sansio/request.py,sha256=ijwestWQS-dpb61uKl0NRntzNtH6C72OXCNomx-XKxc,19832 +werkzeug/sansio/response.py,sha256=8pE2fiHDroOOCtBWJWig4Lnv3VztD5szkSzeQELIlcQ,27965 +werkzeug/sansio/utils.py,sha256=3-Gr0Qsa_Rx48mUm7zdFJZNNKMzHfPAknywujHnkhPs,5256 +werkzeug/security.py,sha256=WctngEBHBo8e-gXf6lMURhs1t0tmEjJjBYZi2MXoWss,5581 +werkzeug/serving.py,sha256=k30NzIKq6mkNONk7B5rTyEuLrLZo__Kz2_XGXLjVUic,39857 +werkzeug/test.py,sha256=2G08IExd_x3T1P69mz57LYYQrqk31nxmkgHY5M5HYZU,52795 +werkzeug/testapp.py,sha256=5_IS5Dh_WfWfNcTLmbydj01lomgcKA_4l9PPCNZnmdI,6332 +werkzeug/urls.py,sha256=XyNKwHvK5IC37-wuIDMYWkiCJ3yLTLGv7wn2GF3ndqI,6430 +werkzeug/user_agent.py,sha256=lSlLYKCcbzCUSkbdAoO8zPk2UR-8Mdn6iu_iA2kYPBA,1416 +werkzeug/utils.py,sha256=1StUqI45bcxJx4sj81qVPQH5X8VuWgtICViJI_BKg-c,24725 +werkzeug/wrappers/__init__.py,sha256=b78jCM8x96kJUGLZ5FYFR3zlK-3pnFAmP9RJIGU0ses,138 +werkzeug/wrappers/__pycache__/__init__.cpython-313.pyc,, +werkzeug/wrappers/__pycache__/request.cpython-313.pyc,, +werkzeug/wrappers/__pycache__/response.cpython-313.pyc,, +werkzeug/wrappers/request.py,sha256=2eJKd8yBU4zc0FIm2T6SROeuZERkP9m_Yx1Z7MeMs-Y,24737 +werkzeug/wrappers/response.py,sha256=u6zg7VpNYrCeEjpIgf8VqgfaSi9yR_9wi9ly2uudglg,32459 +werkzeug/wsgi.py,sha256=P7jB0VpG6X6miies4uk7Zgm7NVm4Yz8Ra6Inr5q_FMs,20894 diff --git a/output/Pc-monitor/_internal/werkzeug-3.1.3.dist-info/WHEEL b/output/Pc-monitor/_internal/werkzeug-3.1.3.dist-info/WHEEL new file mode 100644 index 0000000..e3c6fee --- /dev/null +++ b/output/Pc-monitor/_internal/werkzeug-3.1.3.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.10.1 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/output/Pc-monitor/_internal/zstandard/_cffi.cp313-win_amd64.pyd b/output/Pc-monitor/_internal/zstandard/_cffi.cp313-win_amd64.pyd new file mode 100644 index 0000000..1d174b3 Binary files /dev/null and b/output/Pc-monitor/_internal/zstandard/_cffi.cp313-win_amd64.pyd differ diff --git a/output/Pc-monitor/_internal/zstandard/backend_c.cp313-win_amd64.pyd b/output/Pc-monitor/_internal/zstandard/backend_c.cp313-win_amd64.pyd new file mode 100644 index 0000000..a00eb01 Binary files /dev/null and b/output/Pc-monitor/_internal/zstandard/backend_c.cp313-win_amd64.pyd differ diff --git a/output/Pc-monitor/config.json b/output/Pc-monitor/config.json new file mode 100644 index 0000000..6ae38e2 --- /dev/null +++ b/output/Pc-monitor/config.json @@ -0,0 +1,16 @@ +{ + "active_plugin": "hwinfo", + "theme": "dark", + "apps": [], + "apps_tab": "", + "plugins": { + "librehardwaremonitor": { + "host": "127.0.0.1", + "port": 8085 + }, + "hwinfo": { + "host": "127.0.0.1", + "port": 60000 + } + } +} \ No newline at end of file diff --git a/output/Pc-monitor/config_hwinfo.json b/output/Pc-monitor/config_hwinfo.json new file mode 100644 index 0000000..2e6bc42 --- /dev/null +++ b/output/Pc-monitor/config_hwinfo.json @@ -0,0 +1,26 @@ +{ + "tabs": [ + { + "id": "tab1", + "name": "Général", + "sensors": [ + { + "id": "/hwinfo/3_16777220_CPU_Entier", + "name": "CPU Entier", + "type": "temperature", + "show_graph": true, + "viz_type": "line", + "card_size": "xs", + "font_family": "opensans", + "font_bold": false, + "font_size": "xs", + "hide_value_mobile": false, + "show_type_badge": false, + "chart_options": { + "height": "xs" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/output/Pc-monitor/config_librehardwaremonitor.json b/output/Pc-monitor/config_librehardwaremonitor.json new file mode 100644 index 0000000..9f5b59a --- /dev/null +++ b/output/Pc-monitor/config_librehardwaremonitor.json @@ -0,0 +1,9 @@ +{ + "tabs": [ + { + "id": "tab1", + "name": "Général", + "sensors": [] + } + ] +} \ No newline at end of file diff --git a/plugins/__init__.py b/plugins/__init__.py new file mode 100644 index 0000000..f3522b8 --- /dev/null +++ b/plugins/__init__.py @@ -0,0 +1,59 @@ +# Plugins pour PC Monitor +from .base import BasePlugin +from .librehardwaremonitor import LibreHardwareMonitorPlugin +from .hwinfo import HWiNFOPlugin +from .plexamp import PlexampPlugin + +# Registry des plugins monitoring hardware +PLUGINS = { + 'librehardwaremonitor': LibreHardwareMonitorPlugin, + 'hwinfo': HWiNFOPlugin +} + +# Registry des plugins média +MEDIA_PLUGINS = { + 'plexamp': PlexampPlugin +} + +def get_plugin(name: str, config: dict) -> BasePlugin: + """Retourne une instance du plugin demandé""" + if name not in PLUGINS: + raise ValueError(f"Plugin inconnu: {name}") + return PLUGINS[name](config) + +def get_media_plugin(name: str, config: dict): + """Retourne une instance du plugin média demandé""" + if name not in MEDIA_PLUGINS: + raise ValueError(f"Plugin média inconnu: {name}") + return MEDIA_PLUGINS[name](config) + +def get_available_plugins() -> list: + """Retourne la liste des plugins disponibles""" + return [ + { + 'id': 'librehardwaremonitor', + 'name': 'LibreHardwareMonitor', + 'description': 'Open source, API REST intégrée', + 'default_port': 8085, + 'website': 'https://github.com/LibreHardwareMonitor/LibreHardwareMonitor' + }, + { + 'id': 'hwinfo', + 'name': 'HWiNFO + RemoteHWInfo', + 'description': 'HWiNFO avec RemoteHWInfo (github.com/Demion/remotehwinfo)', + 'default_port': 60000, + 'website': 'https://github.com/Demion/remotehwinfo' + } + ] + +def get_available_media_plugins() -> list: + """Retourne la liste des plugins média disponibles""" + return [ + { + 'id': 'plexamp', + 'name': 'Plexamp', + 'description': 'Lecteur Plex (via serveur Plex distant)', + 'default_port': 32400, + 'website': 'https://plexamp.com' + } + ] diff --git a/plugins/__pycache__/__init__.cpython-313.pyc b/plugins/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000..bc72314 Binary files /dev/null and b/plugins/__pycache__/__init__.cpython-313.pyc differ diff --git a/plugins/__pycache__/base.cpython-313.pyc b/plugins/__pycache__/base.cpython-313.pyc new file mode 100644 index 0000000..9fafb6f Binary files /dev/null and b/plugins/__pycache__/base.cpython-313.pyc differ diff --git a/plugins/__pycache__/hwinfo.cpython-313.pyc b/plugins/__pycache__/hwinfo.cpython-313.pyc new file mode 100644 index 0000000..dbe75d0 Binary files /dev/null and b/plugins/__pycache__/hwinfo.cpython-313.pyc differ diff --git a/plugins/__pycache__/librehardwaremonitor.cpython-313.pyc b/plugins/__pycache__/librehardwaremonitor.cpython-313.pyc new file mode 100644 index 0000000..7bccae7 Binary files /dev/null and b/plugins/__pycache__/librehardwaremonitor.cpython-313.pyc differ diff --git a/plugins/__pycache__/plexamp.cpython-313.pyc b/plugins/__pycache__/plexamp.cpython-313.pyc new file mode 100644 index 0000000..b594cfe Binary files /dev/null and b/plugins/__pycache__/plexamp.cpython-313.pyc differ diff --git a/plugins/base.py b/plugins/base.py new file mode 100644 index 0000000..dd59afa --- /dev/null +++ b/plugins/base.py @@ -0,0 +1,151 @@ +""" +Classe de base pour tous les plugins de monitoring +""" +from abc import ABC, abstractmethod +from typing import Optional, List, Dict, Any + + +class BasePlugin(ABC): + """Classe abstraite définissant l'interface des plugins""" + + def __init__(self, config: dict): + """ + Initialise le plugin avec sa configuration + + Args: + config: Configuration du plugin (host, port, etc.) + """ + self.host = config.get('host', '127.0.0.1') + self.port = config.get('port', self.get_default_port()) + self.config = config + + @abstractmethod + def get_id(self) -> str: + """Retourne l'identifiant unique du plugin""" + pass + + @abstractmethod + def get_name(self) -> str: + """Retourne le nom affichable du plugin""" + pass + + @abstractmethod + def get_default_port(self) -> int: + """Retourne le port par défaut""" + pass + + @abstractmethod + def test_connection(self) -> Dict[str, Any]: + """ + Teste la connexion au logiciel de monitoring + + Returns: + dict avec 'success' (bool), 'message' (str), et optionnellement 'version' + """ + pass + + @abstractmethod + def get_data(self) -> Optional[dict]: + """ + Récupère les données brutes du logiciel de monitoring + + Returns: + Données brutes ou None si erreur + """ + pass + + @abstractmethod + def get_hierarchy(self) -> List[dict]: + """ + Récupère la hiérarchie des capteurs (pour l'admin) + + Returns: + Liste de hardware avec leurs capteurs + """ + pass + + @abstractmethod + def parse_sensors(self, data: dict) -> List[dict]: + """ + Parse les données brutes en liste standardisée de capteurs + + Args: + data: Données brutes du logiciel + + Returns: + Liste de capteurs au format standardisé: + [ + { + 'id': str, # Identifiant unique + 'name': str, # Nom du capteur + 'value': str, # Valeur formatée (ex: "45 °C") + 'raw_value': float, # Valeur numérique + 'type': str, # Type (temperature, load, voltage, etc.) + 'unit': str, # Unité (°C, %, MHz, etc.) + 'hardware': str, # Nom du hardware parent + 'hardware_type': str # Type de hardware (CPU, GPU, etc.) + }, + ... + ] + """ + pass + + def get_base_url(self) -> str: + """Retourne l'URL de base pour les requêtes""" + return f"http://{self.host}:{self.port}" + + def get_sensor_type(self, unit: str, name: str = '') -> str: + """ + Détermine le type de capteur à partir de l'unité et du nom + + Args: + unit: Unité du capteur + name: Nom du capteur (pour affiner la détection) + + Returns: + Type standardisé du capteur + """ + unit_lower = unit.lower() if unit else '' + name_lower = name.lower() if name else '' + + # Détection par unité + if '°c' in unit_lower or '°f' in unit_lower: + return 'temperature' + elif '%' in unit_lower: + if 'load' in name_lower or 'usage' in name_lower: + return 'load' + return 'percentage' + elif 'mhz' in unit_lower or 'ghz' in unit_lower: + return 'frequency' + elif 'rpm' in unit_lower: + return 'fan' + elif 'w' in unit_lower and 'wh' not in unit_lower: + return 'power' + elif 'v' in unit_lower and 'mv' not in unit_lower: + return 'voltage' + elif 'mv' in unit_lower: + return 'voltage' + elif 'mb' in unit_lower or 'gb' in unit_lower or 'kb' in unit_lower: + return 'data' + elif 'mb/s' in unit_lower or 'kb/s' in unit_lower or 'gb/s' in unit_lower: + return 'throughput' + elif 'a' in unit_lower: + return 'current' + elif 'wh' in unit_lower: + return 'energy' + + # Détection par nom si unité non reconnue + if 'temp' in name_lower or 'temperature' in name_lower: + return 'temperature' + elif 'fan' in name_lower: + return 'fan' + elif 'clock' in name_lower or 'freq' in name_lower: + return 'frequency' + elif 'load' in name_lower or 'usage' in name_lower: + return 'load' + elif 'power' in name_lower: + return 'power' + elif 'voltage' in name_lower or 'vcore' in name_lower: + return 'voltage' + + return 'generic' diff --git a/plugins/hwinfo.py b/plugins/hwinfo.py new file mode 100644 index 0000000..58b4bbf --- /dev/null +++ b/plugins/hwinfo.py @@ -0,0 +1,274 @@ +""" +Plugin pour HWiNFO via RemoteHWInfo (Demion) +https://github.com/Demion/remotehwinfo + +Format JSON RemoteHWInfo: +{ + "hwinfo": { + "sensors": [ + {"entryIndex": 0, "sensorNameUser": "System", ...}, + {"entryIndex": 1, "sensorNameUser": "CPU [#0]: Intel Core i7", ...} + ], + "readings": [ + {"sensorIndex": 0, "labelUser": "Memory Load", "value": 45.5, "unit": "%", ...}, + {"sensorIndex": 1, "labelUser": "CPU Temp", "value": 65.0, "unit": "°C", ...} + ] + } +} +""" +import requests +from typing import Dict, List, Optional, Any +from .base import BasePlugin + + +class HWiNFOPlugin(BasePlugin): + """Plugin pour HWiNFO via RemoteHWInfo""" + + def __init__(self, config: dict): + super().__init__(config) + self.history = {} + self.max_history = 120 + + def get_id(self) -> str: + return 'hwinfo' + + def get_name(self) -> str: + return 'HWiNFO' + + def get_default_port(self) -> int: + return 60000 + + def get_base_url(self) -> str: + """Retourne l'URL de l'API RemoteHWInfo""" + return f"http://{self.host}:{self.port}/json.json" + + def test_connection(self) -> Dict[str, Any]: + """Teste la connexion à RemoteHWInfo""" + try: + url = self.get_base_url() + response = requests.get(url, timeout=5) + response.raise_for_status() + + data = response.json() + + # Vérifier le format RemoteHWInfo + if 'hwinfo' not in data: + return { + 'success': False, + 'message': 'Format invalide. Vérifiez que RemoteHWInfo est lancé.' + } + + hwinfo = data['hwinfo'] + sensor_count = len(hwinfo.get('sensors', [])) + reading_count = len(hwinfo.get('readings', [])) + + return { + 'success': True, + 'message': f'Connecté - {sensor_count} capteurs, {reading_count} lectures', + 'version': 'RemoteHWInfo', + 'sensor_count': reading_count + } + + except requests.exceptions.ConnectionError: + return { + 'success': False, + 'message': f'Impossible de se connecter à {self.get_base_url()}. Vérifiez que RemoteHWInfo est lancé.' + } + except requests.exceptions.Timeout: + return { + 'success': False, + 'message': 'Timeout - Le serveur ne répond pas' + } + except Exception as e: + return { + 'success': False, + 'message': f'Erreur: {str(e)}' + } + + def get_data(self) -> Optional[Dict]: + """Récupère les données JSON depuis RemoteHWInfo""" + try: + url = self.get_base_url() + response = requests.get(url, timeout=5) + response.raise_for_status() + + data = response.json() + + if 'hwinfo' in data: + return data['hwinfo'] + + return None + + except Exception as e: + print(f"Erreur HWiNFO get_data: {e}") + return None + + def get_hierarchy(self) -> List[dict]: + """Récupère la hiérarchie des capteurs pour l'admin""" + data = self.get_data() + if not data: + return [] + + return self._build_hierarchy(data) + + def _build_hierarchy(self, data: Dict) -> List[dict]: + """Construit la hiérarchie des capteurs""" + sensors = data.get('sensors', []) + readings = data.get('readings', []) + + # Créer un dictionnaire des sensors par index + sensor_map = {} + for sensor in sensors: + idx = sensor.get('entryIndex', 0) + sensor_map[idx] = { + 'name': sensor.get('sensorNameUser', sensor.get('sensorNameOriginal', 'Unknown')), + 'value': '', + 'id': '', + 'level': 0, + 'type': 'group', + 'children': [] + } + + # Ajouter les readings aux sensors correspondants + for reading in readings: + sensor_idx = reading.get('sensorIndex', 0) + + if sensor_idx not in sensor_map: + continue + + label = reading.get('labelUser', reading.get('labelOriginal', 'Unknown')) + value = reading.get('value', 0) + unit = reading.get('unit', '') + + # Générer un ID unique + sensor_id = self._generate_sensor_id(sensor_idx, reading.get('readingId', 0), label) + + # Formater la valeur + if isinstance(value, float): + if value == int(value): + formatted_value = f"{int(value)} {unit}".strip() + else: + formatted_value = f"{value:.2f} {unit}".strip() + else: + formatted_value = f"{value} {unit}".strip() + + reading_entry = { + 'name': label, + 'value': formatted_value, + 'id': sensor_id, + 'level': 1, + 'type': self.get_sensor_type(unit, label), + 'children': [] + } + + sensor_map[sensor_idx]['children'].append(reading_entry) + + # Retourner seulement les sensors qui ont des readings + return [s for s in sensor_map.values() if s['children']] + + def parse_sensors(self, data: Dict) -> List[Dict]: + """Parse les données et retourne une liste plate de capteurs""" + sensors_list = [] + + if not data: + return sensors_list + + sensors = data.get('sensors', []) + readings = data.get('readings', []) + + # Créer un dictionnaire des sensors par index + sensor_names = {} + for sensor in sensors: + idx = sensor.get('entryIndex', 0) + sensor_names[idx] = sensor.get('sensorNameUser', sensor.get('sensorNameOriginal', 'Unknown')) + + # Parser chaque reading + for reading in readings: + sensor_idx = reading.get('sensorIndex', 0) + hardware_name = sensor_names.get(sensor_idx, 'Unknown') + + label = reading.get('labelUser', reading.get('labelOriginal', 'Unknown')) + value = reading.get('value', 0) + unit = reading.get('unit', '') + + # Générer un ID unique + sensor_id = self._generate_sensor_id(sensor_idx, reading.get('readingId', 0), label) + + # Formater la valeur + if isinstance(value, float): + if value == int(value): + formatted_value = f"{int(value)} {unit}".strip() + else: + formatted_value = f"{value:.2f} {unit}".strip() + else: + formatted_value = f"{value} {unit}".strip() + + sensor_type = self.get_sensor_type(unit, label) + hardware_type = self._guess_hardware_type(hardware_name) + + sensor = { + 'id': sensor_id, + 'name': label, + 'value': formatted_value, + 'raw_value': float(value) if value else 0.0, + 'type': sensor_type, + 'unit': unit, + 'hardware': hardware_name, + 'hardware_type': hardware_type, + 'category': hardware_name, + 'path': f"{hardware_name}/{label}", + } + sensors_list.append(sensor) + + return sensors_list + + def _generate_sensor_id(self, sensor_idx: int, reading_id: int, label: str) -> str: + """Génère un ID unique pour un capteur""" + # Nettoyer le label pour l'ID + clean_label = label.replace(' ', '_').replace('[', '').replace(']', '') + clean_label = clean_label.replace('#', '').replace(':', '_').replace('/', '_') + return f"/hwinfo/{sensor_idx}_{reading_id}_{clean_label}" + + def _guess_hardware_type(self, sensor_name: str) -> str: + """Devine le type de hardware basé sur le nom du sensor""" + name_lower = sensor_name.lower() + + if 'cpu' in name_lower or 'processor' in name_lower: + return 'CPU' + elif 'gpu' in name_lower or 'graphics' in name_lower or 'radeon' in name_lower or 'geforce' in name_lower: + return 'GPU' + elif 'memory' in name_lower or 'ram' in name_lower or 'dimm' in name_lower: + return 'RAM' + elif 'drive' in name_lower or 'disk' in name_lower or 'ssd' in name_lower or 'hdd' in name_lower or 's.m.a.r.t' in name_lower: + return 'Storage' + elif 'network' in name_lower or 'ethernet' in name_lower or 'wifi' in name_lower or 'réseau' in name_lower: + return 'Network' + elif 'system' in name_lower or 'système' in name_lower: + return 'System' + else: + return 'Other' + + # === Gestion de l'historique === + + def update_history(self, sensors: List[Dict]): + """Met à jour l'historique des capteurs pour les graphiques""" + for sensor in sensors: + sensor_id = sensor.get("id", "") + if not sensor_id: + continue + + raw_value = sensor.get("raw_value", 0.0) + + if sensor_id not in self.history: + self.history[sensor_id] = [] + + self.history[sensor_id].append(raw_value) + + if len(self.history[sensor_id]) > self.max_history: + self.history[sensor_id] = self.history[sensor_id][-self.max_history:] + + def get_history(self, sensor_id: str, count: int = 60) -> List[float]: + """Récupère l'historique d'un capteur""" + if sensor_id not in self.history: + return [] + return self.history[sensor_id][-count:] diff --git a/plugins/librehardwaremonitor.py b/plugins/librehardwaremonitor.py new file mode 100644 index 0000000..06f04aa --- /dev/null +++ b/plugins/librehardwaremonitor.py @@ -0,0 +1,266 @@ +""" +Plugin pour LibreHardwareMonitor +Utilise l'API REST intégrée de LHM (port 8085 par défaut) +""" +import requests +from typing import Dict, List, Optional, Any +from .base import BasePlugin + + +class LibreHardwareMonitorPlugin(BasePlugin): + """Plugin pour LibreHardwareMonitor""" + + def __init__(self, config: dict): + super().__init__(config) + self.history = {} + self.max_history = 120 # 2 minutes à 1 sample/sec + + def get_id(self) -> str: + return 'librehardwaremonitor' + + def get_name(self) -> str: + return 'LibreHardwareMonitor' + + def get_default_port(self) -> int: + return 8085 + + def test_connection(self) -> Dict[str, Any]: + """Teste la connexion à LibreHardwareMonitor""" + try: + url = f"{self.get_base_url()}/data.json" + response = requests.get(url, timeout=5) + response.raise_for_status() + + data = response.json() + + # Extraire la version si disponible + version = "Inconnue" + if data and "Text" in data: + version = data.get("Text", "LibreHardwareMonitor") + + # Compter les capteurs + sensors = self.parse_sensors(data) + + return { + 'success': True, + 'message': f'Connecté - {len(sensors)} capteurs détectés', + 'version': version, + 'sensor_count': len(sensors) + } + + except requests.exceptions.ConnectionError: + return { + 'success': False, + 'message': f'Impossible de se connecter à {self.get_base_url()}. Vérifiez que LibreHardwareMonitor est lancé avec le serveur web activé.' + } + except requests.exceptions.Timeout: + return { + 'success': False, + 'message': 'Timeout - Le serveur ne répond pas' + } + except Exception as e: + return { + 'success': False, + 'message': f'Erreur: {str(e)}' + } + + def get_data(self) -> Optional[Dict]: + """Récupère les données JSON depuis LHM Remote Server""" + try: + url = f"{self.get_base_url()}/data.json" + response = requests.get(url, timeout=5) + response.raise_for_status() + return response.json() + except Exception as e: + print(f"Erreur LHM get_data: {e}") + return None + + def get_hierarchy(self) -> List[dict]: + """Récupère la hiérarchie des capteurs pour l'admin""" + data = self.get_data() + if not data: + return [] + + return self._build_hierarchy(data) + + def _build_hierarchy(self, data: Dict) -> List[dict]: + """Construit la hiérarchie des capteurs""" + if not data or "Children" not in data: + return [] + + def build_tree(node, level=0): + node_text = node.get("Text", "") + node_value = node.get("Value", "") + sensor_id = node.get("SensorId", "") + + result = { + "name": node_text, + "value": node_value, + "id": sensor_id, + "level": level, + "type": self._guess_sensor_type(node_text, node_value) if node_value else "group", + "children": [] + } + + if "Children" in node and node["Children"]: + for child in node["Children"]: + result["children"].append(build_tree(child, level + 1)) + + return result + + tree = [] + for child in data.get("Children", []): + tree.append(build_tree(child)) + + return tree + + def parse_sensors(self, data: Dict) -> List[Dict]: + """Parse les données et retourne une liste plate de capteurs""" + sensors = [] + + if not data or "Children" not in data: + return sensors + + def extract_sensors(node, parent_name="", hardware_name="", hardware_type=""): + node_text = node.get("Text", "") + current_path = f"{parent_name}/{node_text}" if parent_name else node_text + + # Détecter le type de hardware au niveau 1 + if not hardware_name and "Children" in node: + hw_type = self._guess_hardware_type(node_text) + hardware_name = node_text + hardware_type = hw_type + + # Si le nœud a une valeur, c'est un capteur + if "Value" in node and node["Value"]: + sensor_id = node.get("SensorId", "") + if not sensor_id: + sensor_id = f"{current_path}".replace(" ", "-").lower() + + value_str = node.get("Value", "") + raw_value = self._extract_numeric_value(value_str) + unit = self._extract_unit(value_str) + sensor_type = self._guess_sensor_type(node_text, value_str) + + sensor = { + "id": sensor_id, + "name": node_text, + "value": value_str, + "raw_value": raw_value, + "type": sensor_type, + "unit": unit, + "hardware": hardware_name, + "hardware_type": hardware_type, + "category": parent_name.split("/")[0] if "/" in parent_name else parent_name, + "path": current_path, + "min": node.get("Min", ""), + "max": node.get("Max", ""), + } + sensors.append(sensor) + + # Parcourir les enfants récursivement + if "Children" in node: + for child in node["Children"]: + extract_sensors(child, current_path, hardware_name, hardware_type) + + for child in data.get("Children", []): + extract_sensors(child) + + return sensors + + def _guess_hardware_type(self, name: str) -> str: + """Devine le type de hardware basé sur le nom""" + name_lower = name.lower() + + if 'cpu' in name_lower or 'processor' in name_lower: + return 'CPU' + elif 'gpu' in name_lower or 'graphics' in name_lower or 'nvidia' in name_lower or 'amd' in name_lower or 'radeon' in name_lower or 'geforce' in name_lower: + return 'GPU' + elif 'memory' in name_lower or 'ram' in name_lower: + return 'RAM' + elif 'motherboard' in name_lower or 'mainboard' in name_lower: + return 'Motherboard' + elif 'storage' in name_lower or 'disk' in name_lower or 'ssd' in name_lower or 'hdd' in name_lower or 'nvme' in name_lower: + return 'Storage' + elif 'network' in name_lower or 'ethernet' in name_lower or 'wifi' in name_lower: + return 'Network' + elif 'battery' in name_lower: + return 'Battery' + else: + return 'Other' + + def _guess_sensor_type(self, name: str, value: str) -> str: + """Devine le type de capteur basé sur le nom et la valeur""" + name_lower = name.lower() + value_lower = value.lower() + + if "°c" in value_lower or "temperature" in name_lower or "temp" in name_lower: + return "temperature" + elif "%" in value or "load" in name_lower or "usage" in name_lower: + return "percentage" + elif "rpm" in value_lower or "fan" in name_lower: + return "fan" + elif "mhz" in value_lower or "ghz" in value_lower or "clock" in name_lower: + return "frequency" + elif "w" in value_lower and "wh" not in value_lower: + return "power" + elif "v" in value_lower: + return "voltage" + elif "gb" in value_lower or "mb" in value_lower or "memory" in name_lower: + return "memory" + else: + return "generic" + + def _extract_numeric_value(self, value_str: str) -> float: + """Extrait la valeur numérique d'une chaîne""" + try: + # Enlever tous les caractères non numériques sauf le point et la virgule + clean = value_str.replace("°C", "").replace("%", "").replace("V", "").replace("W", "") + clean = clean.replace("MHz", "").replace("GHz", "").replace("GB", "").replace("MB", "") + clean = clean.replace("RPM", "").replace(" ", "").replace(",", ".").strip() + + if clean: + return float(clean) + except (ValueError, AttributeError): + pass + return 0.0 + + def _extract_unit(self, value_str: str) -> str: + """Extrait l'unité d'une valeur""" + value_str = value_str.strip() + + units = ['°C', '°F', '%', 'MHz', 'GHz', 'GB', 'MB', 'KB', 'RPM', 'W', 'V', 'A', 'GB/s', 'MB/s'] + for unit in units: + if unit in value_str: + return unit + return '' + + # === Gestion de l'historique === + + def update_history(self, sensors: List[Dict]): + """Met à jour l'historique des capteurs pour les graphiques""" + for sensor in sensors: + sensor_id = sensor.get("id", "") + if not sensor_id: + continue + + raw_value = sensor.get("raw_value") + if raw_value is None: + raw_value = self._extract_numeric_value(sensor.get("value", "")) + + if raw_value == 0.0 and "0" not in sensor.get("value", ""): + continue + + if sensor_id not in self.history: + self.history[sensor_id] = [] + + self.history[sensor_id].append(raw_value) + + if len(self.history[sensor_id]) > self.max_history: + self.history[sensor_id] = self.history[sensor_id][-self.max_history:] + + def get_history(self, sensor_id: str, count: int = 60) -> List[float]: + """Récupère l'historique d'un capteur""" + if sensor_id not in self.history: + return [] + return self.history[sensor_id][-count:] diff --git a/plugins/plexamp.py b/plugins/plexamp.py new file mode 100644 index 0000000..4f4e54a --- /dev/null +++ b/plugins/plexamp.py @@ -0,0 +1,219 @@ +""" +Plugin Plexamp - Récupère l'état de lecture depuis le serveur Plex +Interroge /status/sessions sur le serveur Plex pour voir les sessions actives + +Configuration: +- host: IP/hostname du serveur Plex (ex: 192.168.1.235) +- port: Port du serveur Plex (défaut: 32400) +- token: Token d'authentification Plex +""" +import requests +from typing import Dict, Optional, Any + + +class PlexampPlugin: + """Plugin pour Plexamp via serveur Plex""" + + def __init__(self, config: dict): + self.host = config.get('host', '192.168.1.235') + self.port = config.get('port', 32400) + self.token = config.get('token', '') + self.config = config + + def get_id(self) -> str: + return 'plexamp' + + def get_name(self) -> str: + return 'Plexamp' + + def get_default_port(self) -> int: + return 32400 + + def get_base_url(self) -> str: + return f"http://{self.host}:{self.port}" + + def _get_headers(self) -> Dict[str, str]: + """Headers pour l'API Plex""" + return { + 'X-Plex-Token': self.token, + 'Accept': 'application/json' + } + + def test_connection(self) -> Dict[str, Any]: + """Teste la connexion au serveur Plex""" + if not self.token: + return { + 'success': False, + 'message': 'Token Plex non configuré. Ajoutez-le dans les paramètres.' + } + + try: + url = f"{self.get_base_url()}/status/sessions" + response = requests.get(url, headers=self._get_headers(), timeout=5) + + if response.status_code == 401: + return { + 'success': False, + 'message': 'Token invalide ou expiré.' + } + + response.raise_for_status() + + return { + 'success': True, + 'message': f'Connecté au serveur Plex ({self.host}:{self.port})', + 'version': 'Plex Media Server' + } + + except requests.exceptions.ConnectionError: + return { + 'success': False, + 'message': f'Impossible de se connecter à {self.get_base_url()}. Vérifiez l\'adresse du serveur.' + } + except requests.exceptions.Timeout: + return { + 'success': False, + 'message': 'Timeout - Le serveur ne répond pas' + } + except Exception as e: + return { + 'success': False, + 'message': f'Erreur: {str(e)}' + } + + def get_now_playing(self) -> Optional[Dict[str, Any]]: + """Récupère les infos de lecture en cours depuis le serveur Plex""" + if not self.token: + return None + + try: + url = f"{self.get_base_url()}/status/sessions" + response = requests.get(url, headers=self._get_headers(), timeout=5) + response.raise_for_status() + + # Parser le JSON + data = response.json() + + media_container = data.get('MediaContainer', {}) + + # Vérifier s'il y a des sessions actives + if media_container.get('size', 0) == 0: + return { + 'playing': False, + 'state': 'stopped' + } + + # Chercher une session audio (Plexamp) + metadata_list = media_container.get('Metadata', []) + + music_session = None + for session in metadata_list: + # Filtrer les sessions audio + if session.get('type') == 'track': + music_session = session + break + + if not music_session: + return { + 'playing': False, + 'state': 'stopped' + } + + # Extraire les infos + player = music_session.get('Player', {}) + state = player.get('state', 'stopped') + + # Temps en millisecondes + view_offset = music_session.get('viewOffset', 0) + duration = music_session.get('duration', 0) + + result = { + 'playing': state == 'playing', + 'state': state, + 'time': view_offset, + 'duration': duration, + 'progress': (view_offset / duration * 100) if duration > 0 else 0, + 'title': music_session.get('title', ''), + 'artist': music_session.get('grandparentTitle', ''), + 'album': music_session.get('parentTitle', ''), + 'year': music_session.get('parentYear', ''), + 'thumb': music_session.get('thumb', ''), + 'art': music_session.get('art', ''), + 'player_name': player.get('title', ''), + 'player_device': player.get('device', ''), + 'session_key': music_session.get('sessionKey', ''), + 'rating_key': music_session.get('ratingKey', ''), + 'machine_id': player.get('machineIdentifier', '') + } + + return result + + except Exception as e: + print(f"Erreur Plexamp get_now_playing: {e}") + return None + + def get_artwork_url(self, thumb_path: str) -> str: + """Construit l'URL complète pour l'artwork""" + if not thumb_path: + return '' + return f"{self.get_base_url()}{thumb_path}?X-Plex-Token={self.token}" + + # === Contrôles de lecture === + + def play(self) -> bool: + """Reprend la lecture""" + return self._send_command('play') + + def pause(self) -> bool: + """Met en pause""" + return self._send_command('pause') + + def play_pause(self) -> bool: + """Toggle play/pause""" + now_playing = self.get_now_playing() + if now_playing and now_playing.get('playing'): + return self.pause() + else: + return self.play() + + def next_track(self) -> bool: + """Piste suivante""" + return self._send_command('skipNext') + + def prev_track(self) -> bool: + """Piste précédente""" + return self._send_command('skipPrevious') + + def stop(self) -> bool: + """Arrête la lecture""" + return self._send_command('stop') + + def _send_command(self, command: str) -> bool: + """Envoie une commande au player via le serveur Plex""" + if not self.token: + return False + + try: + # Récupérer la session active pour avoir le machineIdentifier + now_playing = self.get_now_playing() + if not now_playing or not now_playing.get('machine_id'): + print("Pas de session active trouvée") + return False + + machine_id = now_playing['machine_id'] + + # Envoyer la commande au client + url = f"{self.get_base_url()}/player/playback/{command}" + params = { + 'commandID': 1, + 'type': 'music' + } + headers = self._get_headers() + headers['X-Plex-Target-Client-Identifier'] = machine_id + + response = requests.get(url, headers=headers, params=params, timeout=5) + return response.status_code == 200 + + except Exception as e: + print(f"Erreur Plexamp command {command}: {e}") + return False diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..86ffd36 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +Flask==3.0.0 +requests==2.31.0 diff --git a/static/css/admin.css b/static/css/admin.css new file mode 100644 index 0000000..7166e6e --- /dev/null +++ b/static/css/admin.css @@ -0,0 +1,1060 @@ +/* === Variables CSS pour thèmes === */ +:root[data-theme="dark"] { + --bg-primary: #1a1a1a; + --bg-secondary: #2a2a2a; + --bg-tertiary: #3a3a3a; + --text-primary: #e0e0e0; + --text-secondary: #a0a0a0; + --accent: #4a9eff; + --accent-hover: #3a8eef; + --success: #4caf50; + --warning: #ff9800; + --danger: #f44336; + --border: #404040; +} + +:root[data-theme="light"] { + --bg-primary: #ffffff; + --bg-secondary: #f5f5f5; + --bg-tertiary: #e0e0e0; + --text-primary: #1a1a1a; + --text-secondary: #606060; + --accent: #2196f3; + --accent-hover: #1976d2; + --success: #4caf50; + --warning: #ff9800; + --danger: #f44336; + --border: #d0d0d0; +} + +:root[data-theme="blue"] { + --bg-primary: #0d1117; + --bg-secondary: #161b22; + --bg-tertiary: #21262d; + --text-primary: #c9d1d9; + --text-secondary: #8b949e; + --accent: #58a6ff; + --accent-hover: #4896ef; + --success: #3fb950; + --warning: #d29922; + --danger: #f85149; + --border: #30363d; +} + +/* === Reset === */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; + background: var(--bg-primary); + color: var(--text-primary); + line-height: 1.6; +} + +/* === Container === */ +.container { + max-width: 1400px; + margin: 0 auto; + padding: 20px; + padding-top: 0; /* Le header gère son propre padding */ +} + +/* === Header === */ +header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 30px; + padding: 20px 0; + border-bottom: 2px solid var(--border); + /* Header fixe */ + position: sticky; + top: 0; + background: var(--bg-primary); + z-index: 100; + /* Effet de flou pour un look moderne */ + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); +} + +header h1 { + font-size: 28px; + font-weight: 600; +} + +.header-actions { + display: flex; + gap: 10px; +} + +/* === Buttons === */ +.btn { + padding: 10px 20px; + border: none; + border-radius: 8px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: all 0.2s; + text-decoration: none; + display: inline-block; +} + +.btn-primary { + background: var(--accent); + color: white; +} + +.btn-primary:hover { + background: var(--accent-hover); + transform: translateY(-2px); +} + +.btn-secondary { + background: var(--bg-tertiary); + color: var(--text-primary); +} + +.btn-secondary:hover { + background: var(--border); +} + +.btn-danger { + background: var(--danger); + color: white; +} + +.btn-danger:hover { + background: #d32f2f; +} + +/* === Navigation sections === */ +.sections-nav { + display: flex; + gap: 10px; + margin-bottom: 30px; + border-bottom: 2px solid var(--border); + overflow-x: auto; +} + +.section-tab { + padding: 12px 24px; + background: transparent; + border: none; + border-bottom: 3px solid transparent; + color: var(--text-secondary); + cursor: pointer; + font-size: 15px; + font-weight: 500; + transition: all 0.2s; + white-space: nowrap; +} + +.section-tab:hover { + color: var(--text-primary); + background: var(--bg-secondary); +} + +.section-tab.active { + color: var(--accent); + border-bottom-color: var(--accent); +} + +/* === Sections === */ +.config-section { + display: none; +} + +.config-section.active { + display: block; +} + +.config-section h2 { + font-size: 24px; + margin-bottom: 10px; +} + +.help-text { + color: var(--text-secondary); + margin-bottom: 20px; +} + +/* === Sensors Section === */ +.sensors-container { + background: var(--bg-secondary); + border-radius: 12px; + padding: 20px; +} + +#sensors-loading { + text-align: center; + padding: 40px; + color: var(--text-secondary); +} + +.sensor-category { + margin-bottom: 25px; +} + +.category-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 12px 15px; + background: var(--bg-tertiary); + border-radius: 8px; + margin-bottom: 10px; + cursor: pointer; + user-select: none; +} + +.category-header:hover { + background: var(--border); +} + +.category-title { + font-size: 16px; + font-weight: 600; +} + +.category-count { + background: var(--accent); + color: white; + padding: 2px 10px; + border-radius: 12px; + font-size: 12px; +} + +.sensors-grid { + display: flex; + flex-direction: column; + gap: 8px; + padding: 0; +} + +.sensor-item { + background: var(--bg-tertiary); + padding: 10px 12px; + border-radius: 6px; + display: flex; + align-items: center; + gap: 12px; + transition: all 0.2s; +} + +.sensor-item:hover { + background: var(--border); +} + +/* === Groupes hiérarchiques === */ +.sensor-group { + margin-bottom: 15px; +} + +.group-header { + display: flex; + align-items: center; + gap: 10px; + padding: 10px 12px; + background: var(--bg-tertiary); + border-radius: 6px; + cursor: pointer; + user-select: none; + transition: all 0.2s; +} + +.group-header:hover { + background: var(--border); +} + +.group-toggle { + font-size: 12px; + color: var(--text-secondary); + transition: transform 0.2s; +} + +.group-icon { + font-size: 18px; +} + +.group-name { + flex: 1; + font-weight: 500; + font-size: 15px; +} + +.group-count { + background: var(--accent); + color: white; + padding: 2px 8px; + border-radius: 10px; + font-size: 11px; +} + +.group-children { + margin-top: 8px; + padding-left: 10px; + border-left: 2px solid var(--border); +} + +/* Niveau 1 : Composants principaux (CPU, GPU, etc.) */ +.sensor-group[data-level="1"] .group-header { + background: var(--bg-secondary); + padding: 12px 15px; + border: 1px solid var(--border); +} + +.sensor-group[data-level="1"] .group-name { + font-size: 16px; + font-weight: 600; +} + +/* Niveau 2+ : Catégories de capteurs */ +.sensor-group[data-level="2"] .group-header { + background: var(--bg-tertiary); +} + +.sensor-group[data-level="3"] .group-header { + background: var(--bg-primary); + border: 1px solid var(--border); +} + +.sensor-checkbox { + width: 20px; + height: 20px; + cursor: pointer; +} + +.sensor-info { + flex: 1; +} + +.sensor-name { + font-weight: 500; + margin-bottom: 2px; +} + +.sensor-value { + font-size: 13px; + color: var(--text-secondary); +} + +.sensor-type { + display: inline-block; + padding: 2px 8px; + border-radius: 4px; + font-size: 11px; + background: var(--bg-primary); +} + +.sensor-options { + display: flex; + gap: 10px; + align-items: center; +} + +.sensor-options select { + background: var(--bg-primary); + color: var(--text-primary); + border: 1px solid var(--border); + border-radius: 6px; + padding: 5px 10px; + font-size: 12px; +} + +.sensor-options label { + display: flex; + align-items: center; + gap: 5px; + font-size: 12px; + color: var(--text-secondary); +} + +/* === Tabs Section === */ +.tabs-manager { + background: var(--bg-secondary); + border-radius: 12px; + padding: 20px; +} + +.tabs-list { + margin-bottom: 20px; +} + +.tab-item { + background: var(--bg-tertiary); + padding: 15px; + border-radius: 8px; + margin-bottom: 10px; + display: flex; + align-items: center; + gap: 15px; +} + +.tab-handle { + cursor: move; + font-size: 20px; +} + +.tab-item input { + flex: 1; + background: var(--bg-primary); + border: 1px solid var(--border); + border-radius: 6px; + padding: 8px 12px; + color: var(--text-primary); + font-size: 14px; +} + +.tab-sensors-count { + color: var(--text-secondary); + font-size: 13px; +} + +/* === Apps Section === */ +.apps-list { + background: var(--bg-secondary); + border-radius: 12px; + padding: 20px; + margin-bottom: 20px; +} + +.app-item { + background: var(--bg-tertiary); + padding: 15px; + border-radius: 8px; + margin-bottom: 10px; + display: grid; + grid-template-columns: 60px 1fr 1fr 100px auto; + gap: 15px; + align-items: center; +} + +.app-item input { + background: var(--bg-primary); + border: 1px solid var(--border); + border-radius: 6px; + padding: 8px 12px; + color: var(--text-primary); + font-size: 14px; +} + +.app-icon-input { + text-align: center; + font-size: 24px; +} + +/* === Theme Section === */ +.theme-selector { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); + gap: 15px; + background: var(--bg-secondary); + border-radius: 12px; + padding: 20px; +} + +.theme-selector label { + cursor: pointer; +} + +.theme-selector input[type="radio"] { + display: none; +} + +.theme-option { + text-align: center; + padding: 15px; + border-radius: 8px; + border: 2px solid transparent; + transition: all 0.2s; +} + +.theme-selector input[type="radio"]:checked + .theme-option { + border-color: var(--accent); + background: var(--bg-tertiary); +} + +.theme-preview { + width: 100%; + height: 80px; + border-radius: 6px; + margin-bottom: 10px; +} + +.theme-dark { background: linear-gradient(135deg, #1a1a1a 0%, #2a2a2a 100%); } +.theme-light { background: linear-gradient(135deg, #ffffff 0%, #f5f5f5 100%); } +.theme-blue { background: linear-gradient(135deg, #0d1117 0%, #161b22 100%); } + +/* === Notification === */ +.notification { + position: fixed; + bottom: 20px; + right: 20px; + padding: 15px 25px; + border-radius: 8px; + background: var(--success); + color: white; + font-weight: 500; + transform: translateY(100px); + opacity: 0; + transition: all 0.3s; + z-index: 1000; +} + +.notification.show { + transform: translateY(0); + opacity: 1; +} + +.notification.error { + background: var(--danger); +} + +/* === Responsive === */ +@media (max-width: 768px) { + .sensors-grid { + grid-template-columns: 1fr; + } + + .app-item { + grid-template-columns: 1fr; + } + + .sections-nav { + gap: 5px; + } + + .section-tab { + padding: 10px 15px; + font-size: 13px; + } +} + +/* === Configuration Button === */ +.sensor-config-btn { + background: var(--bg-primary); + border: 1px solid var(--border); + border-radius: 6px; + padding: 5px 10px; + cursor: pointer; + font-size: 14px; + transition: all 0.2s; +} + +.sensor-config-btn:hover:not(:disabled) { + background: var(--accent); + color: white; +} + +.sensor-config-btn:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +/* === Modal === */ +.modal { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.7); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; +} + +.modal-content { + background: var(--bg-secondary); + border-radius: 12px; + width: 90%; + max-width: 500px; + max-height: 90vh; + overflow: auto; + box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5); +} + +.modal-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 20px; + border-bottom: 1px solid var(--border); +} + +.modal-header h3 { + font-size: 18px; + font-weight: 600; +} + +.modal-close { + background: none; + border: none; + font-size: 28px; + color: var(--text-secondary); + cursor: pointer; + line-height: 1; + padding: 0; + width: 30px; + height: 30px; +} + +.modal-close:hover { + color: var(--danger); +} + +.modal-body { + padding: 20px; +} + +.config-group { + margin-bottom: 20px; +} + +.config-group h4 { + font-size: 16px; + margin-bottom: 15px; + color: var(--accent); +} + +.config-group label { + display: block; + margin-bottom: 8px; + font-weight: 500; + font-size: 14px; +} + +.config-group select { + width: 100%; + padding: 10px; + background: var(--bg-primary); + border: 1px solid var(--border); + border-radius: 6px; + color: var(--text-primary); + font-size: 14px; + margin-bottom: 15px; +} + +.config-group input[type="checkbox"] { + margin-right: 8px; +} + +.modal-footer { + display: flex; + justify-content: flex-end; + gap: 10px; + padding: 20px; + border-top: 1px solid var(--border); +} + +.modal-cancel { + background: var(--bg-tertiary); +} + +.modal-cancel:hover { + background: var(--border); +} + +/* === Section Ordre des capteurs === */ +#order-tabs-container { + display: flex; + flex-direction: column; + gap: 20px; +} + +.order-tab-section { + background: var(--bg-secondary); + border-radius: 10px; + padding: 15px; + border: 1px solid var(--border); +} + +.order-tab-section h3 { + margin-bottom: 15px; + color: var(--accent); + font-size: 16px; + display: flex; + align-items: center; + gap: 8px; +} + +.order-sensors-list { + display: flex; + flex-direction: column; + gap: 8px; + min-height: 50px; +} + +.order-sensor-item { + display: flex; + align-items: center; + gap: 12px; + padding: 12px 15px; + background: var(--bg-tertiary); + border-radius: 8px; + cursor: grab; + transition: all 0.2s; + border: 1px solid transparent; +} + +.order-sensor-item:hover { + border-color: var(--accent); + background: var(--bg-primary); +} + +.order-sensor-item:active { + cursor: grabbing; +} + +.order-sensor-item.sortable-ghost { + opacity: 0.4; + background: var(--accent); +} + +.order-sensor-item.sortable-chosen { + border-color: var(--accent); + box-shadow: 0 4px 12px rgba(74, 158, 255, 0.3); +} + +.order-sensor-handle { + color: var(--text-secondary); + font-size: 18px; + cursor: grab; +} + +.order-sensor-handle:active { + cursor: grabbing; +} + +.order-sensor-info { + flex: 1; + display: flex; + flex-direction: column; + gap: 2px; +} + +.order-sensor-name { + font-weight: 500; + color: var(--text-primary); +} + +.order-sensor-details { + font-size: 12px; + color: var(--text-secondary); + display: flex; + gap: 10px; +} + +.order-sensor-number { + background: var(--accent); + color: white; + width: 24px; + height: 24px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; + font-weight: 600; +} + +.order-empty-message { + color: var(--text-secondary); + font-style: italic; + text-align: center; + padding: 20px; +} + +/* === Section Plugin === */ +.plugin-selector { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 15px; + margin-bottom: 25px; +} + +.plugin-card { + background: var(--bg-secondary); + border: 2px solid var(--border); + border-radius: 12px; + padding: 20px; + cursor: pointer; + transition: all 0.2s ease; +} + +.plugin-card:hover { + border-color: var(--accent); + transform: translateY(-2px); +} + +.plugin-card.active { + border-color: var(--accent); + background: var(--bg-tertiary); +} + +.plugin-card.active::before { + content: '✓'; + position: absolute; + top: 10px; + right: 10px; + background: var(--accent); + color: white; + width: 24px; + height: 24px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 14px; + font-weight: bold; +} + +.plugin-card { + position: relative; +} + +.plugin-card-header { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 10px; +} + +.plugin-icon { + font-size: 28px; +} + +.plugin-name { + font-size: 18px; + font-weight: 600; + color: var(--text-primary); +} + +.plugin-description { + font-size: 13px; + color: var(--text-secondary); + margin-bottom: 10px; +} + +.plugin-meta { + font-size: 12px; + color: var(--text-secondary); +} + +.plugin-meta a { + color: var(--accent); + text-decoration: none; +} + +.plugin-meta a:hover { + text-decoration: underline; +} + +.plugin-config { + background: var(--bg-secondary); + border-radius: 12px; + padding: 20px; + margin-bottom: 20px; +} + +.plugin-config h3 { + margin-bottom: 15px; + font-size: 16px; + color: var(--text-primary); +} + +.plugin-config .config-group { + margin-bottom: 15px; +} + +.plugin-config .config-group label { + display: block; + margin-bottom: 5px; + font-size: 13px; + color: var(--text-secondary); +} + +.plugin-config .config-group input { + width: 100%; + max-width: 300px; + padding: 10px 12px; + background: var(--bg-tertiary); + border: 1px solid var(--border); + border-radius: 6px; + color: var(--text-primary); + font-size: 14px; +} + +.plugin-config .config-group input:focus { + outline: none; + border-color: var(--accent); +} + +.plugin-actions { + display: flex; + align-items: center; + gap: 15px; + margin-top: 20px; +} + +#connection-status { + font-size: 14px; + display: flex; + align-items: center; + gap: 8px; +} + +#connection-status.success { + color: var(--success); +} + +#connection-status.error { + color: var(--danger); +} + +#connection-status.loading { + color: var(--text-secondary); +} + +.plugin-info { + background: var(--bg-secondary); + border-radius: 12px; + padding: 20px; + border-left: 4px solid var(--accent); +} + +.plugin-info h4 { + font-size: 14px; + margin-bottom: 10px; + color: var(--text-primary); +} + +.plugin-info p { + font-size: 13px; + color: var(--text-secondary); + line-height: 1.6; +} + +.plugin-info ul { + margin-top: 10px; + margin-left: 20px; + font-size: 13px; + color: var(--text-secondary); +} + +.plugin-info ul li { + margin-bottom: 5px; +} + +.plugin-info code { + background: var(--bg-tertiary); + padding: 2px 6px; + border-radius: 4px; + font-family: monospace; + font-size: 12px; +} + +/* ==================== Section Plexamp ==================== */ + +.plugin-card { + background: var(--bg-secondary); + border-radius: 12px; + padding: 20px; + margin-bottom: 15px; +} + +.plugin-header { + display: flex; + align-items: center; + gap: 15px; + margin-bottom: 20px; +} + +.plugin-title h3 { + margin: 0; + color: var(--text-primary); +} + +.plugin-title p { + margin: 5px 0 0; + color: var(--text-secondary); + font-size: 0.9em; +} + +/* Toggle switch */ +.plugin-toggle { + position: relative; + display: inline-block; + width: 50px; + height: 28px; +} + +.plugin-toggle input { + opacity: 0; + width: 0; + height: 0; +} + +.toggle-slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: var(--bg-tertiary); + transition: 0.3s; + border-radius: 28px; +} + +.toggle-slider:before { + position: absolute; + content: ""; + height: 20px; + width: 20px; + left: 4px; + bottom: 4px; + background-color: var(--text-secondary); + transition: 0.3s; + border-radius: 50%; +} + +.plugin-toggle input:checked + .toggle-slider { + background-color: var(--accent); +} + +.plugin-toggle input:checked + .toggle-slider:before { + transform: translateX(22px); + background-color: white; +} + +/* Status messages */ +.status-success { + color: var(--success); +} + +.status-error { + color: var(--danger); +} + +.status-warning { + color: var(--warning); +} + +#plexamp-status, #connection-status { + margin-left: 10px; + font-size: 0.9em; +} + +#plexamp-config small { + display: block; + color: var(--text-secondary); + font-size: 0.85em; + margin-top: 5px; +} diff --git a/static/css/dashboard.css b/static/css/dashboard.css new file mode 100644 index 0000000..28fb4a0 --- /dev/null +++ b/static/css/dashboard.css @@ -0,0 +1,1265 @@ +/* === Variables CSS (héritées de admin.css) === */ +:root[data-theme="dark"] { + --bg-primary: #1a1a1a; + --bg-secondary: #2a2a2a; + --bg-tertiary: #3a3a3a; + --text-primary: #e0e0e0; + --text-secondary: #a0a0a0; + --accent: #4a9eff; + --accent-hover: #3a8eef; + --success: #4caf50; + --warning: #ff9800; + --danger: #f44336; + --border: #404040; + --temp-cold: #4a9eff; + --temp-warm: #ff9800; + --temp-hot: #f44336; +} + +:root[data-theme="light"] { + --bg-primary: #ffffff; + --bg-secondary: #f5f5f5; + --bg-tertiary: #e0e0e0; + --text-primary: #1a1a1a; + --text-secondary: #606060; + --accent: #2196f3; + --accent-hover: #1976d2; + --success: #4caf50; + --warning: #ff9800; + --danger: #f44336; + --border: #d0d0d0; + --temp-cold: #2196f3; + --temp-warm: #ff9800; + --temp-hot: #f44336; +} + +:root[data-theme="blue"] { + --bg-primary: #0d1117; + --bg-secondary: #161b22; + --bg-tertiary: #21262d; + --text-primary: #c9d1d9; + --text-secondary: #8b949e; + --accent: #58a6ff; + --accent-hover: #4896ef; + --success: #3fb950; + --warning: #d29922; + --danger: #f85149; + --border: #30363d; + --temp-cold: #58a6ff; + --temp-warm: #d29922; + --temp-hot: #f85149; +} + +/* === Reset === */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; + background: var(--bg-primary); + color: var(--text-primary); + line-height: 1.6; + overflow-x: hidden; +} + +/* === Font Families === */ +.font-family-system { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; +} + +.font-family-roboto { + font-family: 'Roboto', sans-serif; +} + +.font-family-opensans { + font-family: 'Open Sans', sans-serif; +} + +.font-family-lato { + font-family: 'Lato', sans-serif; +} + +.font-family-montserrat { + font-family: 'Montserrat', sans-serif; +} + +.font-family-poppins { + font-family: 'Poppins', sans-serif; +} + +.font-family-inter { + font-family: 'Inter', sans-serif; +} + +.font-family-mono { + font-family: 'Share Tech Mono', 'Consolas', 'Monaco', monospace; +} + +.font-family-digital { + font-family: 'Orbitron', 'Share Tech Mono', monospace; + letter-spacing: 1px; +} + +/* === Font Weight === */ +.font-bold { + font-weight: 700; +} + +.font-bold .sensor-name { + font-weight: 600; +} + +.font-bold .sensor-value { + font-weight: 700; +} + +.font-normal { + font-weight: 400; +} + +.font-normal .sensor-name { + font-weight: 400; +} + +.font-normal .sensor-value { + font-weight: 500; +} + +/* === Container === */ +.container { + max-width: 100%; + height: 100vh; + display: flex; + flex-direction: column; + padding: 15px; +} + +/* === Header === */ +header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 20px; + padding-bottom: 15px; + border-bottom: 2px solid var(--border); + flex-shrink: 0; +} + +header h1 { + font-size: 24px; + font-weight: 600; +} + +.header-actions { + display: flex; + align-items: center; + gap: 15px; +} + +#last-update { + font-size: 13px; + color: var(--text-secondary); +} + +.btn { + padding: 8px 16px; + border: none; + border-radius: 8px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: all 0.2s; + text-decoration: none; + display: inline-block; +} + +.btn-secondary { + background: var(--bg-tertiary); + color: var(--text-primary); +} + +.btn-secondary:hover { + background: var(--border); +} + +.btn-primary { + background: var(--accent); + color: white; +} + +.btn-primary:hover { + background: var(--accent-hover); +} + +/* === Tabs Navigation === */ +.tabs-nav { + display: flex; + gap: 10px; + margin-bottom: 20px; + border-bottom: 2px solid var(--border); + flex-shrink: 0; + overflow-x: auto; +} + +.tab-button { + padding: 12px 24px; + background: transparent; + border: none; + border-bottom: 3px solid transparent; + color: var(--text-secondary); + cursor: pointer; + font-size: 15px; + font-weight: 500; + transition: all 0.2s; + white-space: nowrap; +} + +.tab-button:hover { + color: var(--text-primary); + background: var(--bg-secondary); +} + +.tab-button.active { + color: var(--accent); + border-bottom-color: var(--accent); +} + +/* === Tabs Content === */ +.tabs-content { + flex: 1; + overflow-y: auto; +} + +.tab-pane { + display: none; +} + +.tab-pane.active { + display: block; +} + +/* === Sensors Grid === */ +.sensors-grid { + display: grid; + grid-template-columns: repeat(12, 1fr); + gap: 15px; + margin-bottom: 20px; +} + +/* === Sensor Card === */ +.sensor-card { + background: var(--bg-secondary); + border-radius: 12px; + padding: 15px; + border: 1px solid var(--border); + transition: all 0.2s; +} + +/* Tailles de cartes (grille 12 colonnes) */ +.sensor-card.card-tiny { + grid-column: span 1; /* 1/12 = 8.3% */ +} + +.sensor-card.card-xs { + grid-column: span 2; /* 2/12 = 16.7% */ +} + +.sensor-card.card-small { + grid-column: span 3; /* 3/12 = 25% */ +} + +.sensor-card.card-medium { + grid-column: span 4; /* 4/12 = 33.3% */ +} + +.sensor-card.card-large { + grid-column: span 6; /* 6/12 = 50% */ +} + +.sensor-card.card-xl { + grid-column: span 8; /* 8/12 = 66.7% */ +} + +.sensor-card:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); +} + +.sensor-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 10px; +} + +.sensor-name { + font-size: 14px; + color: var(--text-secondary); + font-weight: 500; +} + +.sensor-type-badge { + font-size: 11px; + padding: 3px 8px; + border-radius: 4px; + background: var(--bg-tertiary); + color: var(--text-secondary); +} + +.sensor-value { + font-size: 32px; + font-weight: 600; + margin-bottom: 10px; +} + +/* Couleurs selon le type */ +.sensor-value.temperature { + color: var(--temp-warm); +} + +.sensor-value.temperature.cold { + color: var(--temp-cold); +} + +.sensor-value.temperature.hot { + color: var(--temp-hot); +} + +.sensor-value.percentage { + color: var(--accent); +} + +.sensor-value.percentage.high { + color: var(--warning); +} + +.sensor-value.percentage.critical { + color: var(--danger); +} + +.sensor-value.fan { + color: var(--success); +} + +.sensor-value.power { + color: var(--warning); +} + +/* === Sensor Chart (Canvas directement dans la carte) === */ +.sensor-chart { + width: 100% !important; + height: 120px !important; + max-height: 120px; + margin-top: 10px; + display: block; +} + +/* Hauteurs de graphiques personnalisées */ +.sensor-chart.chart-tiny { + height: 50px !important; + max-height: 50px; + margin-top: 6px; +} + +.sensor-chart.chart-xs { + height: 70px !important; + max-height: 70px; + margin-top: 8px; +} + +.sensor-chart.chart-small { + height: 90px !important; + max-height: 90px; + margin-top: 8px; +} + +.sensor-chart.chart-medium { + height: 120px !important; + max-height: 120px; +} + +.sensor-chart.chart-large { + height: 180px !important; + max-height: 180px; +} + +/* === Sensor Gauge (Canvas directement dans la carte) === */ +.sensor-gauge { + width: 100% !important; + max-width: 180px; + height: 180px !important; + max-height: 180px; + margin: 10px auto 0; + display: block; +} + +/* Tailles de jauges personnalisées */ +.sensor-gauge.gauge-tiny { + max-width: 60px; + width: 60px !important; + height: 60px !important; + max-height: 60px; + margin-top: 6px; +} + +.sensor-gauge.gauge-xs { + max-width: 90px; + width: 90px !important; + height: 90px !important; + max-height: 90px; + margin-top: 8px; +} + +.sensor-gauge.gauge-small { + max-width: 120px; + width: 120px !important; + height: 120px !important; + max-height: 120px; + margin-top: 8px; +} + +.sensor-gauge.gauge-medium { + max-width: 180px; + width: 180px !important; + height: 180px !important; + max-height: 180px; +} + +.sensor-gauge.gauge-large { + max-width: 240px; + width: 240px !important; + height: 240px !important; + max-height: 240px; +} + +/* === Apps Section === */ +.apps-section { + margin-top: 30px; + padding-top: 20px; + border-top: 2px solid var(--border); +} + +.apps-section h3 { + margin-bottom: 15px; + font-size: 18px; +} + +.apps-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); + gap: 10px; +} + +.app-button { + background: var(--bg-secondary); + border: 1px solid var(--border); + border-radius: 12px; + padding: 20px 15px; + cursor: pointer; + transition: all 0.2s; + text-align: center; +} + +.app-button:hover { + background: var(--bg-tertiary); + transform: translateY(-2px); +} + +.app-icon { + font-size: 32px; + margin-bottom: 8px; +} + +.app-name { + font-size: 13px; + font-weight: 500; +} + +/* === Empty State === */ +.empty-state, .error-state { + text-align: center; + padding: 60px 20px; +} + +.empty-icon, .error-icon { + font-size: 64px; + margin-bottom: 20px; +} + +.empty-state h2, .error-state h2 { + font-size: 24px; + margin-bottom: 10px; +} + +.empty-state p, .error-state p { + color: var(--text-secondary); + margin-bottom: 20px; +} + +/* === Loading State === */ +@keyframes pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.5; } +} + +.loading { + animation: pulse 1.5s ease-in-out infinite; +} + +/* === Responsive === */ +/* Masquer header sur mobile EN PORTRAIT (largeur < 768px) */ +@media (max-width: 768px) { + /* MASQUER LE HEADER sur mobile pour économiser l'espace */ + header { + display: none !important; + } + + .container { + padding: 4px; /* Réduit de 8px à 4px */ + } + + /* Sur mobile, toutes les cartes prennent la largeur disponible */ + .sensors-grid { + grid-template-columns: repeat(6, 1fr); + gap: 4px; /* Réduit de 8px à 4px */ + margin-bottom: 8px; + } + + /* Les cartes tiny/xs gardent leur taille sur mobile */ + .sensor-card.card-tiny { + grid-column: span 1; + } + + .sensor-card.card-xs { + grid-column: span 2; + } + + .sensor-card.card-small { + grid-column: span 3; + } + + .sensor-card.card-medium { + grid-column: span 4; + } + + .sensor-card.card-large { + grid-column: span 6; + } + + .sensor-card.card-xl { + grid-column: span 6; + } + + /* Cartes TRÈS compactes sur mobile */ + .sensor-card { + padding: 4px; /* Réduit de 8px à 4px */ + border-radius: 6px; + border-width: 1px; + } + + .sensor-card:hover { + transform: none; + } + + .sensor-header { + margin-bottom: 3px; /* Réduit */ + } + + .sensor-name { + font-size: 10px; /* Plus petit */ + } + + .sensor-type-badge { + font-size: 8px; + padding: 1px 4px; + } + + .sensor-value { + font-size: 18px; /* Réduit de 22px */ + margin-bottom: 3px; /* Réduit */ + } + + /* Option pour masquer la valeur sur mobile et donner plus d'espace au graphique */ + .sensor-card.hide-value-mobile .sensor-value { + display: none; + } + + .sensor-card.hide-value-mobile .sensor-header { + margin-bottom: 2px; /* Encore plus compact */ + } + + /* GRAPHIQUES - Canvas direct, aucun padding intermédiaire */ + .sensor-chart { + margin-top: 4px; + } + + .sensor-chart.chart-tiny { + height: 45px; + margin-top: 2px; + } + + .sensor-chart.chart-xs { + height: 60px; + margin-top: 3px; + } + + .sensor-chart.chart-small { + height: 75px; + margin-top: 4px; + } + + .sensor-chart.chart-medium { + height: 95px; + margin-top: 4px; + } + + .sensor-chart.chart-large { + height: 125px; + margin-top: 5px; + } + + /* JAUGES - Canvas direct, aucun padding intermédiaire */ + .sensor-gauge { + margin-top: 4px; + } + + .sensor-gauge.gauge-tiny { + max-width: 60px; + height: 60px; + margin-top: 2px; + } + + .sensor-gauge.gauge-xs { + max-width: 90px; + height: 90px; + margin-top: 3px; + } + + .sensor-gauge.gauge-small { + max-width: 120px; + height: 120px; + margin-top: 4px; + } + + .sensor-gauge.gauge-medium { + max-width: 165px; + height: 165px; + margin-top: 4px; + } + + .sensor-gauge.gauge-large { + max-width: 205px; + height: 205px; + margin-top: 5px; + } + + /* Tailles de police personnalisables sur mobile */ + .sensor-card.font-tiny .sensor-name { + font-size: 8px !important; + } + + .sensor-card.font-tiny .sensor-type-badge { + font-size: 7px !important; + padding: 1px 3px !important; + } + + .sensor-card.font-tiny .sensor-value { + font-size: 14px !important; + } + + .sensor-card.font-xs .sensor-name { + font-size: 9px !important; + } + + .sensor-card.font-xs .sensor-type-badge { + font-size: 7px !important; + padding: 1px 4px !important; + } + + .sensor-card.font-xs .sensor-value { + font-size: 16px !important; + } + + .sensor-card.font-small .sensor-name { + font-size: 10px !important; + } + + .sensor-card.font-small .sensor-type-badge { + font-size: 8px !important; + } + + .sensor-card.font-small .sensor-value { + font-size: 18px !important; + } + + .sensor-card.font-medium .sensor-name { + font-size: 11px !important; + } + + .sensor-card.font-medium .sensor-type-badge { + font-size: 9px !important; + } + + .sensor-card.font-medium .sensor-value { + font-size: 20px !important; + } + + .sensor-card.font-large .sensor-name { + font-size: 12px !important; + } + + .sensor-card.font-large .sensor-type-badge { + font-size: 10px !important; + } + + .sensor-card.font-large .sensor-value { + font-size: 22px !important; + } + + .tabs-nav { + gap: 3px; + margin-bottom: 8px; + } + + .tab-button { + padding: 6px 10px; + font-size: 11px; + } + + .apps-grid { + grid-template-columns: repeat(auto-fill, minmax(70px, 1fr)); + gap: 6px; + } + + .app-button { + padding: 8px; + font-size: 10px; + } +} + +/* === Mobile en MODE PAYSAGE === */ +@media (orientation: landscape) and (max-height: 500px) { + /* MASQUER LE HEADER en paysage mobile */ + header { + display: none !important; + } + + .container { + padding: 4px; + height: 100vh; + } + + /* Grille optimisée pour paysage - plus de colonnes */ + .sensors-grid { + grid-template-columns: repeat(12, 1fr); + gap: 4px; + } + + /* Tailles de cartes réduites pour paysage */ + .sensor-card.card-tiny { + grid-column: span 1; + } + + .sensor-card.card-xs { + grid-column: span 1; + } + + .sensor-card.card-small { + grid-column: span 2; + } + + .sensor-card.card-medium { + grid-column: span 2; + } + + .sensor-card.card-large { + grid-column: span 3; + } + + .sensor-card.card-xl { + grid-column: span 4; + } + + .sensor-card { + padding: 4px 6px; + border-radius: 6px; + } + + .sensor-header { + margin-bottom: 2px; + } + + .sensor-name { + font-size: 9px !important; + } + + .sensor-type-badge { + font-size: 7px !important; + padding: 1px 4px !important; + } + + .sensor-value { + font-size: 14px !important; + margin-bottom: 2px; + } + + /* Graphiques compacts en paysage */ + .sensor-chart { + margin-top: 2px; + } + + .sensor-chart.chart-tiny, + .sensor-chart.chart-xs { + height: 30px !important; + } + + .sensor-chart.chart-small { + height: 40px !important; + } + + .sensor-chart.chart-medium { + height: 50px !important; + } + + .sensor-chart.chart-large { + height: 70px !important; + } + + /* Jauges compactes en paysage */ + .sensor-gauge { + margin-top: 2px; + } + + .sensor-gauge.gauge-tiny, + .sensor-gauge.gauge-xs { + max-width: 40px !important; + height: 40px !important; + } + + .sensor-gauge.gauge-small { + max-width: 55px !important; + height: 55px !important; + } + + .sensor-gauge.gauge-medium { + max-width: 70px !important; + height: 70px !important; + } + + .sensor-gauge.gauge-large { + max-width: 90px !important; + height: 90px !important; + } + + /* Tabs compacts */ + .tabs-nav { + gap: 2px; + margin-bottom: 4px; + padding-bottom: 4px; + } + + .tab-button { + padding: 4px 8px; + font-size: 10px; + } + + /* Masquer la section apps en paysage pour plus d'espace */ + .apps-section { + display: none; + } +} + +/* Mode paysage tablette / grand mobile */ +@media (orientation: landscape) and (min-height: 501px) and (max-height: 800px) { + header { + padding: 8px 0; + margin-bottom: 8px; + } + + header h1 { + font-size: 18px; + } + + .container { + padding: 8px; + } + + .sensors-grid { + grid-template-columns: repeat(12, 1fr); + gap: 6px; + } + + /* Tailles intermédiaires */ + .sensor-card.card-tiny { + grid-column: span 1; + } + + .sensor-card.card-xs { + grid-column: span 2; + } + + .sensor-card.card-small { + grid-column: span 2; + } + + .sensor-card.card-medium { + grid-column: span 3; + } + + .sensor-card.card-large { + grid-column: span 4; + } + + .sensor-card { + padding: 6px 8px; + } + + .sensor-name { + font-size: 10px; + } + + .sensor-value { + font-size: 16px; + } +} + +/* === Scrollbar === */ +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: var(--bg-primary); +} + +::-webkit-scrollbar-thumb { + background: var(--bg-tertiary); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: var(--border); +} + +/* === Swipe Indicators === */ +.swipe-indicators { + display: flex; + justify-content: center; + align-items: center; + gap: 8px; + padding: 8px 0; + margin-bottom: 10px; +} + +.swipe-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--bg-tertiary); + cursor: pointer; + transition: all 0.3s ease; +} + +.swipe-dot:hover { + background: var(--text-secondary); + transform: scale(1.2); +} + +.swipe-dot.active { + background: var(--accent); + width: 24px; + border-radius: 4px; +} + +/* === Swipe Animation === */ +.tabs-content { + transition: transform 0.2s ease-out; +} + +.tabs-content.swipe-next { + animation: swipeLeft 0.2s ease-out; +} + +.tabs-content.swipe-prev { + animation: swipeRight 0.2s ease-out; +} + +@keyframes swipeLeft { + 0% { transform: translateX(20px); opacity: 0.7; } + 100% { transform: translateX(0); opacity: 1; } +} + +@keyframes swipeRight { + 0% { transform: translateX(-20px); opacity: 0.7; } + 100% { transform: translateX(0); opacity: 1; } +} + +/* === Mobile Swipe Indicators === */ +@media (max-width: 768px) { + .swipe-indicators { + padding: 6px 0; + margin-bottom: 6px; + gap: 6px; + } + + .swipe-dot { + width: 6px; + height: 6px; + } + + .swipe-dot.active { + width: 18px; + } +} + +/* Paysage mobile - indicateurs encore plus petits */ +@media (orientation: landscape) and (max-height: 500px) { + .swipe-indicators { + padding: 3px 0; + margin-bottom: 3px; + gap: 4px; + } + + .swipe-dot { + width: 5px; + height: 5px; + } + + .swipe-dot.active { + width: 14px; + } +} + +/* === Apps in Tab === */ +.apps-section-in-tab { + margin-top: 20px; + padding-top: 15px; + border-top: 1px solid var(--border); +} + +.apps-title-in-tab { + font-size: 14px; + color: var(--text-secondary); + margin-bottom: 10px; +} + +.apps-grid-in-tab { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(80px, 1fr)); + gap: 10px; +} + +@media (max-width: 480px) { + .apps-section-in-tab { + margin-top: 12px; + padding-top: 10px; + } + + .apps-title-in-tab { + font-size: 12px; + margin-bottom: 8px; + } + + .apps-grid-in-tab { + grid-template-columns: repeat(auto-fill, minmax(60px, 1fr)); + gap: 6px; + } +} + +@media (orientation: landscape) and (max-height: 500px) { + .apps-section-in-tab { + margin-top: 8px; + padding-top: 6px; + } + + .apps-title-in-tab { + font-size: 10px; + margin-bottom: 4px; + } + + .apps-grid-in-tab { + grid-template-columns: repeat(auto-fill, minmax(50px, 1fr)); + gap: 4px; + } +} + +/* ==================== Widget Plexamp ==================== */ + +.plexamp-widget { + background: var(--bg-secondary); + border-radius: 16px; + padding: 20px; + margin: 20px 0; + display: flex; + gap: 20px; + align-items: center; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); +} + +.plexamp-artwork { + position: relative; + width: 120px; + height: 120px; + flex-shrink: 0; + border-radius: 12px; + overflow: hidden; + background: var(--bg-tertiary); +} + +.plexamp-artwork img { + width: 100%; + height: 100%; + object-fit: cover; + display: block; +} + +.plexamp-no-music { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + background: var(--bg-tertiary); + color: var(--text-secondary); +} + +.plexamp-no-music span { + font-size: 2.5em; + margin-bottom: 5px; +} + +.plexamp-no-music p { + font-size: 0.75em; + margin: 0; +} + +.plexamp-info { + flex: 1; + min-width: 0; +} + +.plexamp-track { + margin-bottom: 15px; +} + +.plexamp-title { + font-size: 1.2em; + font-weight: 600; + color: var(--text-primary); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.plexamp-artist { + font-size: 1em; + color: var(--accent); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-top: 4px; +} + +.plexamp-album { + font-size: 0.85em; + color: var(--text-secondary); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-top: 2px; +} + +.plexamp-progress { + margin-bottom: 15px; +} + +.plexamp-progress-bar { + height: 6px; + background: var(--bg-tertiary); + border-radius: 3px; + overflow: hidden; + cursor: pointer; +} + +.plexamp-progress-fill { + height: 100%; + background: var(--accent); + border-radius: 3px; + width: 0%; + transition: width 0.3s ease; +} + +.plexamp-times { + display: flex; + justify-content: space-between; + font-size: 0.75em; + color: var(--text-secondary); + margin-top: 5px; +} + +.plexamp-controls { + display: flex; + align-items: center; + gap: 15px; +} + +.plexamp-btn { + background: var(--bg-tertiary); + border: none; + border-radius: 50%; + width: 44px; + height: 44px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + font-size: 1.2em; + transition: all 0.2s; +} + +.plexamp-btn:hover { + background: var(--accent); + transform: scale(1.1); +} + +.plexamp-btn-play { + width: 56px; + height: 56px; + font-size: 1.5em; + background: var(--accent); +} + +.plexamp-btn-play:hover { + background: var(--accent-hover); +} + +/* Responsive */ +@media (max-width: 600px) { + .plexamp-widget { + flex-direction: column; + text-align: center; + } + + .plexamp-artwork { + width: 150px; + height: 150px; + } + + .plexamp-controls { + justify-content: center; + } + + .plexamp-title, + .plexamp-artist, + .plexamp-album { + text-align: center; + } +} diff --git a/static/js/admin.js b/static/js/admin.js new file mode 100644 index 0000000..d18faf1 --- /dev/null +++ b/static/js/admin.js @@ -0,0 +1,1127 @@ +// Configuration globale +let config = { + theme: 'dark', + tabs: [], + apps: [], + active_plugin: 'librehardwaremonitor', + plugins: {} +}; + +let allSensors = {}; +let availablePlugins = []; + +// Initialisation +document.addEventListener('DOMContentLoaded', async () => { + // Charger les plugins disponibles + await loadPlugins(); + + // Charger la configuration + await loadConfig(); + + // Charger les capteurs + await loadSensors(); + + // Charger la config Plexamp + await loadPlexampConfig(); + + // Appliquer le thème + applyTheme(config.theme); + + // Setup event listeners + setupEventListeners(); + + // Afficher les onglets et apps + renderTabs(); + renderApps(); +}); + +// === Gestion des sections === +function setupEventListeners() { + // Navigation entre sections + document.querySelectorAll('.section-tab').forEach(tab => { + tab.addEventListener('click', () => { + const section = tab.dataset.section; + switchSection(section); + }); + }); + + // Bouton sauvegarder + document.getElementById('save-btn').addEventListener('click', saveConfig); + + // Bouton ajouter onglet + document.getElementById('add-tab-btn').addEventListener('click', addTab); + + // Bouton ajouter app + document.getElementById('add-app-btn').addEventListener('click', addApp); + + // Sélecteur de thème + document.querySelectorAll('input[name="theme"]').forEach(radio => { + radio.addEventListener('change', (e) => { + config.theme = e.target.value; + applyTheme(config.theme); + }); + }); + + // Configuration du plugin (host/port) + const pluginHost = document.getElementById('plugin-host'); + const pluginPort = document.getElementById('plugin-port'); + + if (pluginHost) { + pluginHost.addEventListener('change', updatePluginConfig); + } + if (pluginPort) { + pluginPort.addEventListener('change', updatePluginConfig); + } + + // Bouton tester connexion + const testBtn = document.getElementById('test-connection-btn'); + if (testBtn) { + testBtn.addEventListener('click', testPluginConnection); + } +} + +function switchSection(sectionName) { + // Désactiver tous les tabs et sections + document.querySelectorAll('.section-tab').forEach(t => t.classList.remove('active')); + document.querySelectorAll('.config-section').forEach(s => s.classList.remove('active')); + + // Activer le bon + document.querySelector(`.section-tab[data-section="${sectionName}"]`).classList.add('active'); + document.getElementById(`section-${sectionName}`).classList.add('active'); + + // Rafraîchir la section ordre quand on y accède + if (sectionName === 'order') { + renderOrderSection(); + } +} + +// === Gestion des Plugins === +async function loadPlugins() { + try { + const response = await fetch('/api/plugins'); + availablePlugins = await response.json(); + renderPluginSelector(); + } catch (error) { + console.error('Erreur chargement plugins:', error); + } +} + +function renderPluginSelector() { + const container = document.getElementById('plugin-selector'); + if (!container) return; + + container.innerHTML = ''; + + availablePlugins.forEach(plugin => { + const card = document.createElement('div'); + card.className = 'plugin-card' + (plugin.active ? ' active' : ''); + card.dataset.pluginId = plugin.id; + + const icon = plugin.id === 'librehardwaremonitor' ? '🖥️' : '📊'; + + card.innerHTML = ` +
+ ${icon} + ${plugin.name} +
+
${plugin.description}
+
+ Port par défaut: ${plugin.default_port} | + Site web ↗ +
+ `; + + card.addEventListener('click', () => selectPlugin(plugin.id)); + + container.appendChild(card); + }); + + // Mettre à jour l'affichage de la config + updatePluginConfigDisplay(); + updatePluginInfo(); +} + +function selectPlugin(pluginId) { + const currentPlugin = config.active_plugin; + + if (pluginId === currentPlugin) return; + + // Confirmer le changement (les capteurs seront différents) + if (config.tabs.some(t => t.sensors.length > 0)) { + if (!confirm('Changer de plugin va afficher des capteurs différents. Les capteurs configurés pour ce plugin seront conservés si vous revenez. Continuer ?')) { + return; + } + } + + // Mettre à jour visuellement + document.querySelectorAll('.plugin-card').forEach(card => { + card.classList.toggle('active', card.dataset.pluginId === pluginId); + }); + + // Mettre à jour la config + config.active_plugin = pluginId; + + // Mettre à jour l'affichage + updatePluginConfigDisplay(); + updatePluginInfo(); + + // Sauvegarder et recharger + switchPluginOnServer(pluginId); +} + +async function switchPluginOnServer(pluginId) { + try { + const response = await fetch('/api/plugins/switch', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ plugin_id: pluginId }) + }); + + const result = await response.json(); + + if (result.success) { + showNotification('Plugin changé, rechargement des capteurs...', 'success'); + + // Recharger la config et les capteurs + await loadConfig(); + await loadSensors(); + renderTabs(); + } else { + showNotification('Erreur: ' + result.error, 'error'); + } + } catch (error) { + console.error('Erreur changement plugin:', error); + showNotification('Erreur de connexion', 'error'); + } +} + +function updatePluginConfigDisplay() { + const pluginId = config.active_plugin || 'librehardwaremonitor'; + const pluginConfig = config.plugins?.[pluginId] || {}; + + const hostInput = document.getElementById('plugin-host'); + const portInput = document.getElementById('plugin-port'); + + if (hostInput) { + hostInput.value = pluginConfig.host || '127.0.0.1'; + } + if (portInput) { + // Trouver le port par défaut du plugin + const plugin = availablePlugins.find(p => p.id === pluginId); + portInput.value = pluginConfig.port || plugin?.default_port || 8085; + } +} + +function updatePluginConfig() { + const pluginId = config.active_plugin || 'librehardwaremonitor'; + const host = document.getElementById('plugin-host').value || '127.0.0.1'; + const port = parseInt(document.getElementById('plugin-port').value) || 8085; + + if (!config.plugins) config.plugins = {}; + config.plugins[pluginId] = { host, port }; +} + +function updatePluginInfo() { + const container = document.getElementById('plugin-info'); + if (!container) return; + + const pluginId = config.active_plugin || 'librehardwaremonitor'; + + if (pluginId === 'librehardwaremonitor') { + container.innerHTML = ` +

ℹ️ Configuration LibreHardwareMonitor

+

Pour utiliser ce plugin :

+
    +
  • Téléchargez LibreHardwareMonitor
  • +
  • Lancez-le en administrateur
  • +
  • Allez dans Options → Remote Web Server → Run
  • +
  • Le serveur écoute par défaut sur le port 8085
  • +
+ `; + } else if (pluginId === 'hwinfo') { + container.innerHTML = ` +

ℹ️ Configuration HWiNFO

+

Pour utiliser ce plugin, vous avez besoin de 2 logiciels :

+
    +
  • Téléchargez HWiNFO
  • +
  • Dans HWiNFO : Settings → General → Enable Shared Memory Support
  • +
  • Téléchargez Remote Sensor Monitor
  • +
  • Lancez Remote Sensor Monitor (port par défaut: 55555)
  • +
+

Note : La version gratuite de HWiNFO limite le Shared Memory à 12 heures. Après, il faut réactiver manuellement.

+ `; + } +} + +async function testPluginConnection() { + const statusEl = document.getElementById('connection-status'); + const pluginId = config.active_plugin || 'librehardwaremonitor'; + + const host = document.getElementById('plugin-host').value || '127.0.0.1'; + const port = parseInt(document.getElementById('plugin-port').value) || 8085; + + statusEl.className = 'loading'; + statusEl.textContent = '⏳ Test en cours...'; + + try { + const response = await fetch('/api/plugins/test', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + plugin_id: pluginId, + config: { host, port } + }) + }); + + const result = await response.json(); + + if (result.success) { + statusEl.className = 'success'; + statusEl.textContent = `✅ ${result.message}`; + + // Mettre à jour la config si le test réussit + updatePluginConfig(); + } else { + statusEl.className = 'error'; + statusEl.textContent = `❌ ${result.message}`; + } + } catch (error) { + statusEl.className = 'error'; + statusEl.textContent = '❌ Erreur de connexion au serveur'; + } +} + +// === Chargement config === +async function loadConfig() { + try { + const response = await fetch('/api/config'); + config = await response.json(); + + // Assurer qu'il y a au moins un onglet + if (!config.tabs || config.tabs.length === 0) { + config.tabs = [{ + id: 'tab1', + name: 'Général', + sensors: [] + }]; + } + + // Valeurs par défaut pour les plugins + if (!config.active_plugin) { + config.active_plugin = 'librehardwaremonitor'; + } + if (!config.plugins) { + config.plugins = {}; + } + + // Sélectionner le thème + const themeRadio = document.querySelector(`input[name="theme"][value="${config.theme}"]`); + if (themeRadio) { + themeRadio.checked = true; + } + + // Remplir le sélecteur d'onglet pour les apps + updateAppsTabSelector(); + + // Mettre à jour l'affichage des plugins + renderPluginSelector(); + + } catch (error) { + console.error('Erreur chargement config:', error); + showNotification('Erreur de chargement', 'error'); + } +} + +function updateAppsTabSelector() { + const select = document.getElementById('apps-tab-select'); + if (!select) return; + + // Sauvegarder la valeur actuelle + const currentValue = config.apps_tab || ''; + + // Garder la première option + select.innerHTML = ''; + + // Ajouter les onglets + config.tabs.forEach(tab => { + const option = document.createElement('option'); + option.value = tab.id; + option.textContent = tab.name; + select.appendChild(option); + }); + + // Sélectionner la valeur actuelle + select.value = currentValue; + + // Utiliser onchange au lieu de addEventListener pour éviter les doublons + select.onchange = (e) => { + config.apps_tab = e.target.value; + showNotification('Onglet des apps modifié (pensez à sauvegarder)', 'success'); + }; +} + +// === Chargement capteurs === +async function loadSensors() { + const loadingDiv = document.getElementById('sensors-loading'); + const listDiv = document.getElementById('sensors-list'); + + try { + const response = await fetch('/api/lhm/hierarchy'); + allSensors = await response.json(); + + loadingDiv.style.display = 'none'; + listDiv.style.display = 'block'; + + renderSensorsHierarchical(); + + } catch (error) { + console.error('Erreur chargement capteurs:', error); + loadingDiv.innerHTML = '⚠️ Erreur: Impossible de charger les capteurs. Vérifiez que LibreHardwareMonitor est lancé.'; + } +} + +function renderSensorsHierarchical() { + const listDiv = document.getElementById('sensors-list'); + listDiv.innerHTML = ''; + + // Créer un Set des capteurs déjà sélectionnés + const selectedSensors = new Map(); + config.tabs.forEach(tab => { + tab.sensors.forEach(sensor => { + selectedSensors.set(sensor.id, { + tabId: tab.id, + showGraph: sensor.show_graph, + viz_type: sensor.viz_type // Utiliser snake_case pour cohérence + }); + }); + }); + + // Fonction récursive pour afficher l'arbre + function renderNode(node, parentDiv, level = 0) { + // Ignorer le nœud racine "Sensor" + if (level === 0 && node.name === "Sensor") { + node.children.forEach(child => renderNode(child, parentDiv, 0)); + return; + } + + // Si c'est un capteur (a une valeur et un ID) + if (node.value && node.id) { + const isSelected = selectedSensors.has(node.id); + const sensorConfig = selectedSensors.get(node.id) || {}; + + const item = document.createElement('div'); + item.className = 'sensor-item'; + item.style.marginLeft = `${level * 15}px`; + item.innerHTML = ` + +
+
${node.name}
+
+ ${node.value} + ${node.type} +
+
+
+ + + +
+ `; + + parentDiv.appendChild(item); + } + // Si c'est un groupe (a des enfants) + else if (node.children && node.children.length > 0) { + const groupDiv = document.createElement('div'); + groupDiv.className = 'sensor-group'; + groupDiv.setAttribute('data-level', level); + + // Header du groupe (repliable) + const header = document.createElement('div'); + header.className = 'group-header'; + header.style.marginLeft = `${level * 15}px`; + + // Compter les capteurs dans ce groupe et ses enfants + function countSensors(n) { + let count = 0; + if (n.value && n.id) count = 1; + if (n.children) { + n.children.forEach(child => { + count += countSensors(child); + }); + } + return count; + } + + const sensorCount = countSensors(node); + + // Icône selon le niveau + let icon = '📦'; + if (level === 1) { + if (node.name.includes('CPU') || node.name.includes('Core')) icon = '🔧'; + else if (node.name.includes('GPU') || node.name.includes('NVIDIA') || node.name.includes('AMD') || node.name.includes('Radeon') || node.name.includes('GeForce')) icon = '🎮'; + else if (node.name.includes('Memory') || node.name.includes('RAM')) icon = '💾'; + else if (node.name.includes('Storage') || node.name.includes('Disk')) icon = '💿'; + } else if (level >= 2) { + if (node.name.includes('Temperature')) icon = '🌡️'; + else if (node.name.includes('Voltage')) icon = '⚡'; + else if (node.name.includes('Clock') || node.name.includes('Frequency')) icon = '🔄'; + else if (node.name.includes('Load') || node.name.includes('Usage')) icon = '📊'; + else if (node.name.includes('Fan')) icon = '🌀'; + else if (node.name.includes('Power')) icon = '🔋'; + else icon = '📁'; + } + + header.innerHTML = ` + ▼ + ${icon} + ${node.name} + ${sensorCount} capteur${sensorCount > 1 ? 's' : ''} + `; + + // Container pour les enfants + const childrenDiv = document.createElement('div'); + childrenDiv.className = 'group-children'; + + // Rendre les enfants + node.children.forEach(child => { + renderNode(child, childrenDiv, level + 1); + }); + + // Toggle pour replier/déplier + header.addEventListener('click', () => { + const isExpanded = childrenDiv.style.display !== 'none'; + childrenDiv.style.display = isExpanded ? 'none' : 'block'; + header.querySelector('.group-toggle').textContent = isExpanded ? '▶' : '▼'; + }); + + groupDiv.appendChild(header); + groupDiv.appendChild(childrenDiv); + parentDiv.appendChild(groupDiv); + } + } + + // Rendre tous les nœuds racine + allSensors.forEach(node => { + renderNode(node, listDiv); + }); + + // Event listeners pour les checkboxes + document.querySelectorAll('.sensor-checkbox').forEach(checkbox => { + checkbox.addEventListener('change', handleSensorToggle); + }); + + document.querySelectorAll('.sensor-tab-select').forEach(select => { + select.addEventListener('change', handleSensorTabChange); + }); + + document.querySelectorAll('.sensor-viz-select').forEach(select => { + select.addEventListener('change', handleSensorVizChange); + }); + + // Utiliser la délégation d'événements pour les boutons de config + // (car ils sont créés dynamiquement quand on déplie les groupes) + const sensorsContainer = document.getElementById('sensors-list'); + if (sensorsContainer) { + sensorsContainer.addEventListener('click', (e) => { + if (e.target.classList.contains('sensor-config-btn')) { + openSensorConfig(e); + } + }); + } +} + +// Garder l'ancienne fonction pour la compatibilité avec findSensor +function findSensor(sensorId) { + function searchTree(node) { + if (node.id === sensorId) { + return { + id: node.id, + name: node.name, + type: node.type, + value: node.value + }; + } + if (node.children) { + for (const child of node.children) { + const found = searchTree(child); + if (found) return found; + } + } + return null; + } + + for (const rootNode of allSensors) { + const found = searchTree(rootNode); + if (found) return found; + } + return null; +} + +function handleSensorToggle(e) { + const sensorId = e.target.dataset.sensorId; + const isChecked = e.target.checked; + + const sensorItem = e.target.closest('.sensor-item'); + const tabSelect = sensorItem.querySelector('.sensor-tab-select'); + const vizSelect = sensorItem.querySelector('.sensor-viz-select'); + const configBtn = sensorItem.querySelector('.sensor-config-btn'); + + tabSelect.disabled = !isChecked; + vizSelect.disabled = !isChecked; + + // Le bouton config est actif dès que le capteur est coché + // (on peut configurer la taille même sans graphique) + if (configBtn) { + configBtn.disabled = !isChecked; + } + + if (isChecked) { + // Ajouter le capteur au premier onglet par défaut + const sensor = findSensor(sensorId); + + // Vérifier que le capteur existe + if (!sensor) { + console.error('Capteur non trouvé:', sensorId); + console.log('allSensors:', allSensors); + e.target.checked = false; + tabSelect.disabled = true; + vizSelect.disabled = true; + if (configBtn) configBtn.disabled = true; + return; + } + + const firstTab = config.tabs[0]; + + if (!firstTab.sensors.find(s => s.id === sensorId)) { + firstTab.sensors.push({ + id: sensorId, + name: sensor.name, + type: sensor.type, + show_graph: false, + viz_type: 'none' + }); + } + + tabSelect.value = firstTab.id; + } else { + // Retirer le capteur de tous les onglets + config.tabs.forEach(tab => { + tab.sensors = tab.sensors.filter(s => s.id !== sensorId); + }); + } +} + +function handleSensorTabChange(e) { + const sensorId = e.target.dataset.sensorId; + const newTabId = e.target.value; + + // Retirer le capteur de tous les onglets + config.tabs.forEach(tab => { + tab.sensors = tab.sensors.filter(s => s.id !== sensorId); + }); + + // Ajouter au nouvel onglet + const sensor = findSensor(sensorId); + const targetTab = config.tabs.find(t => t.id === newTabId); + + if (targetTab) { + targetTab.sensors.push({ + id: sensorId, + name: sensor.name, + type: sensor.type, + show_graph: false + }); + } +} + +function handleSensorVizChange(e) { + const sensorId = e.target.dataset.sensorId; + const vizType = e.target.value; + + // Trouver et mettre à jour + config.tabs.forEach(tab => { + const sensor = tab.sensors.find(s => s.id === sensorId); + if (sensor) { + if (vizType === 'none') { + sensor.show_graph = false; + sensor.viz_type = 'none'; + } else { + sensor.show_graph = true; + sensor.viz_type = vizType; // 'line' ou 'gauge' + } + } + }); + + // Le bouton config reste toujours actif si le capteur est coché + // (on peut configurer la taille même sans graphique) +} + +// === Configuration Modal === +let currentConfigSensorId = null; + +function openSensorConfig(e) { + const sensorId = e.target.dataset.sensorId; + currentConfigSensorId = sensorId; + + // Trouver le capteur dans la config + let sensorConfig = null; + config.tabs.forEach(tab => { + const sensor = tab.sensors.find(s => s.id === sensorId); + if (sensor) sensorConfig = sensor; + }); + + if (!sensorConfig) return; + + // Remplir la modal avec les valeurs actuelles + document.getElementById('config-card-size').value = sensorConfig.card_size || 'medium'; + document.getElementById('config-font-family').value = sensorConfig.font_family || 'system'; + document.getElementById('config-font-bold').checked = sensorConfig.font_bold !== false; // true par défaut + document.getElementById('config-font-size').value = sensorConfig.font_size || 'small'; + document.getElementById('config-hide-value-mobile').checked = sensorConfig.hide_value_mobile || false; + document.getElementById('config-show-type-badge').checked = sensorConfig.show_type_badge !== false; // true par défaut + + // Afficher les options selon le type de visualisation + const gaugeOptions = document.getElementById('gauge-options-group'); + const chartOptions = document.getElementById('chart-options-group'); + + if (sensorConfig.viz_type === 'gauge') { + gaugeOptions.style.display = 'block'; + chartOptions.style.display = 'none'; + + const gaugeOpts = sensorConfig.gauge_options || {}; + document.getElementById('config-gauge-show-value').checked = gaugeOpts.show_value !== false; + document.getElementById('config-gauge-size').value = gaugeOpts.size || 'medium'; + document.getElementById('config-gauge-style').value = gaugeOpts.style || 'arc'; + } else if (sensorConfig.viz_type === 'line') { + gaugeOptions.style.display = 'none'; + chartOptions.style.display = 'block'; + + const chartOpts = sensorConfig.chart_options || {}; + document.getElementById('config-chart-height').value = chartOpts.height || 'medium'; + } else { + gaugeOptions.style.display = 'none'; + chartOptions.style.display = 'none'; + } + + // Afficher la modal + document.getElementById('sensor-config-modal').style.display = 'flex'; +} + +function closeSensorConfig() { + document.getElementById('sensor-config-modal').style.display = 'none'; + currentConfigSensorId = null; +} + +function saveSensorConfig() { + if (!currentConfigSensorId) return; + + // Trouver le capteur dans la config + config.tabs.forEach(tab => { + const sensor = tab.sensors.find(s => s.id === currentConfigSensorId); + if (sensor) { + // Sauvegarder la taille de la carte + sensor.card_size = document.getElementById('config-card-size').value; + sensor.font_family = document.getElementById('config-font-family').value; + sensor.font_bold = document.getElementById('config-font-bold').checked; + sensor.font_size = document.getElementById('config-font-size').value; + sensor.hide_value_mobile = document.getElementById('config-hide-value-mobile').checked; + sensor.show_type_badge = document.getElementById('config-show-type-badge').checked; + + // Sauvegarder les options selon le type + if (sensor.viz_type === 'gauge') { + sensor.gauge_options = { + show_value: document.getElementById('config-gauge-show-value').checked, + size: document.getElementById('config-gauge-size').value, + style: document.getElementById('config-gauge-style').value + }; + } else if (sensor.viz_type === 'line') { + sensor.chart_options = { + height: document.getElementById('config-chart-height').value + }; + } + } + }); + + closeSensorConfig(); + showNotification('Configuration mise à jour', 'success'); +} + +// Event listeners pour la modal +document.querySelector('.modal-close').addEventListener('click', closeSensorConfig); +document.querySelector('.modal-cancel').addEventListener('click', closeSensorConfig); +document.querySelector('.modal-save').addEventListener('click', saveSensorConfig); + +// Fermer la modal en cliquant en dehors +document.getElementById('sensor-config-modal').addEventListener('click', (e) => { + if (e.target.id === 'sensor-config-modal') { + closeSensorConfig(); + } +}); + +// === Gestion des onglets === +function renderTabs() { + const tabsList = document.getElementById('tabs-list'); + tabsList.innerHTML = ''; + + config.tabs.forEach((tab, index) => { + const item = document.createElement('div'); + item.className = 'tab-item'; + item.innerHTML = ` + ☰ + + ${tab.sensors.length} capteurs + ${config.tabs.length > 1 ? `` : ''} + `; + + // Event listener pour le nom + item.querySelector('input').addEventListener('input', (e) => { + const tabToUpdate = config.tabs.find(t => t.id === tab.id); + if (tabToUpdate) { + tabToUpdate.name = e.target.value; + // Mettre à jour le sélecteur d'onglet des apps + updateAppsTabSelector(); + } + }); + + tabsList.appendChild(item); + }); + + // Mettre à jour le sélecteur d'onglet des apps + updateAppsTabSelector(); +} + +function addTab() { + const newId = 'tab' + Date.now(); // Utiliser timestamp pour ID unique + config.tabs.push({ + id: newId, + name: `Onglet ${config.tabs.length + 1}`, + sensors: [] + }); + + renderTabs(); + renderSensors(); // Re-render pour ajouter le nouvel onglet aux selects +} + +function removeTab(tabId) { + if (config.tabs.length === 1) { + showNotification('Impossible de supprimer le dernier onglet', 'error'); + return; + } + + // Si c'était l'onglet des apps, réinitialiser + if (config.apps_tab === tabId) { + config.apps_tab = ''; + } + + config.tabs = config.tabs.filter(t => t.id !== tabId); + renderTabs(); + renderSensors(); +} + +// === Gestion des applications === +function renderApps() { + const appsList = document.getElementById('apps-list'); + appsList.innerHTML = ''; + + config.apps.forEach((app, index) => { + const item = document.createElement('div'); + item.className = 'app-item'; + item.innerHTML = ` + + + + + `; + + // Event listeners + item.querySelectorAll('input').forEach(input => { + input.addEventListener('input', (e) => { + const idx = parseInt(e.target.dataset.appIndex); + const field = e.target.dataset.field; + config.apps[idx][field] = e.target.value; + }); + }); + + appsList.appendChild(item); + }); +} + +function addApp() { + config.apps.push({ + name: 'Nouvelle App', + path: '', + icon: '🚀' + }); + + renderApps(); +} + +function removeApp(index) { + config.apps.splice(index, 1); + renderApps(); +} + +// === Sauvegarde === +async function saveConfig() { + try { + const response = await fetch('/api/config', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(config) + }); + + const result = await response.json(); + + if (result.success) { + showNotification('✅ Configuration sauvegardée !'); + } else { + showNotification('❌ Erreur de sauvegarde', 'error'); + } + + } catch (error) { + console.error('Erreur sauvegarde:', error); + showNotification('❌ Erreur de sauvegarde', 'error'); + } +} + +// === Thème === +function applyTheme(theme) { + document.documentElement.setAttribute('data-theme', theme); +} + +// === Notifications === +function showNotification(message, type = 'success') { + const notification = document.getElementById('notification'); + notification.textContent = message; + notification.className = `notification ${type}`; + notification.classList.add('show'); + + setTimeout(() => { + notification.classList.remove('show'); + }, 3000); +} + +// === Section Ordre des capteurs === +let sortableInstances = []; + +function renderOrderSection() { + const container = document.getElementById('order-tabs-container'); + if (!container) return; + + container.innerHTML = ''; + + // Détruire les anciennes instances Sortable + sortableInstances.forEach(instance => instance.destroy()); + sortableInstances = []; + + // Créer une section pour chaque onglet + config.tabs.forEach((tab, tabIndex) => { + const section = document.createElement('div'); + section.className = 'order-tab-section'; + + section.innerHTML = ` +

📑 ${tab.name} (${tab.sensors.length} capteurs)

+
+ ${tab.sensors.length === 0 ? + '
Aucun capteur dans cet onglet
' : + tab.sensors.map((sensor, index) => ` +
+ ${index + 1} + ☰ +
+
${sensor.name || sensor.id}
+
+ ${sensor.type || 'generic'} + ${sensor.viz_type === 'gauge' ? '🎯 Jauge' : sensor.viz_type === 'line' ? '📈 Courbe' : '📊 Valeur'} +
+
+
+ `).join('') + } +
+ `; + + container.appendChild(section); + + // Initialiser Sortable sur la liste si elle a des capteurs + if (tab.sensors.length > 0) { + const listEl = section.querySelector('.order-sensors-list'); + const sortable = new Sortable(listEl, { + animation: 150, + handle: '.order-sensor-handle', + ghostClass: 'sortable-ghost', + chosenClass: 'sortable-chosen', + dragClass: 'sortable-drag', + onEnd: function(evt) { + handleSensorReorder(evt); + } + }); + sortableInstances.push(sortable); + } + }); +} + +function handleSensorReorder(evt) { + const listEl = evt.from; + const tabId = listEl.dataset.tabId; + const tabIndex = parseInt(listEl.dataset.tabIndex); + + // Récupérer le nouvel ordre des IDs + const newOrder = Array.from(listEl.querySelectorAll('.order-sensor-item')) + .map(item => item.dataset.sensorId); + + // Réorganiser les capteurs dans la config + const tab = config.tabs[tabIndex]; + const reorderedSensors = []; + + newOrder.forEach(sensorId => { + const sensor = tab.sensors.find(s => s.id === sensorId); + if (sensor) { + reorderedSensors.push(sensor); + } + }); + + // Mettre à jour la config + config.tabs[tabIndex].sensors = reorderedSensors; + + // Mettre à jour les numéros affichés + updateOrderNumbers(listEl); + + console.log(`Ordre mis à jour pour ${tab.name}:`, newOrder); + showNotification('Ordre modifié (pensez à sauvegarder)', 'success'); +} + +function updateOrderNumbers(listEl) { + const items = listEl.querySelectorAll('.order-sensor-item'); + items.forEach((item, index) => { + const numberEl = item.querySelector('.order-sensor-number'); + if (numberEl) { + numberEl.textContent = index + 1; + } + item.dataset.index = index; + }); +} + +// ==================== Plexamp ==================== + +async function loadPlexampConfig() { + try { + const response = await fetch('/api/plexamp/config'); + const data = await response.json(); + + document.getElementById('plexamp-enabled').checked = data.enabled; + document.getElementById('plexamp-host').value = data.host || '192.168.1.235'; + document.getElementById('plexamp-port').value = data.port || 32400; + + // Le token n'est pas renvoyé pour des raisons de sécurité + if (data.has_token) { + document.getElementById('plexamp-token').placeholder = '••••••••••••••••'; + } + + // Setup event listeners Plexamp + setupPlexampListeners(); + + } catch (error) { + console.error('Erreur chargement config Plexamp:', error); + } +} + +function setupPlexampListeners() { + const testBtn = document.getElementById('plexamp-test-btn'); + const saveBtn = document.getElementById('plexamp-save-btn'); + + if (testBtn) { + testBtn.addEventListener('click', testPlexampConnection); + } + + if (saveBtn) { + saveBtn.addEventListener('click', savePlexampConfig); + } +} + +async function testPlexampConnection() { + const statusEl = document.getElementById('plexamp-status'); + statusEl.textContent = '⏳ Test en cours...'; + statusEl.className = ''; + + const config = { + host: document.getElementById('plexamp-host').value, + port: parseInt(document.getElementById('plexamp-port').value), + token: document.getElementById('plexamp-token').value + }; + + // Si le token est vide, on ne peut pas tester + if (!config.token) { + statusEl.textContent = '⚠️ Entrez un token'; + statusEl.className = 'status-warning'; + return; + } + + try { + const response = await fetch('/api/plexamp/test', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(config) + }); + + const result = await response.json(); + + if (result.success) { + statusEl.textContent = '✅ ' + result.message; + statusEl.className = 'status-success'; + } else { + statusEl.textContent = '❌ ' + result.message; + statusEl.className = 'status-error'; + } + } catch (error) { + statusEl.textContent = '❌ Erreur: ' + error.message; + statusEl.className = 'status-error'; + } +} + +async function savePlexampConfig() { + const statusEl = document.getElementById('plexamp-status'); + + const config = { + enabled: document.getElementById('plexamp-enabled').checked, + host: document.getElementById('plexamp-host').value, + port: parseInt(document.getElementById('plexamp-port').value), + token: document.getElementById('plexamp-token').value + }; + + try { + const response = await fetch('/api/plexamp/config', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(config) + }); + + const result = await response.json(); + + if (result.success) { + statusEl.textContent = '✅ Sauvegardé'; + statusEl.className = 'status-success'; + showNotification('Configuration Plexamp sauvegardée', 'success'); + } else { + statusEl.textContent = '❌ ' + result.error; + statusEl.className = 'status-error'; + } + } catch (error) { + statusEl.textContent = '❌ Erreur: ' + error.message; + statusEl.className = 'status-error'; + } +} diff --git a/static/js/dashboard.js b/static/js/dashboard.js new file mode 100644 index 0000000..121c7d9 --- /dev/null +++ b/static/js/dashboard.js @@ -0,0 +1,1156 @@ +// Configuration et état +let config = null; +let charts = new Map(); // Map des graphiques Chart.js +let updateInterval = null; +let currentTabIndex = 0; +let totalTabs = 0; +let consecutiveErrors = 0; +const MAX_CONSECUTIVE_ERRORS = 3; + +// Variables pour les apps +let appsRendered = false; +let lastAppsTabId = null; + +// Variables pour le swipe +let touchStartX = 0; +let touchEndX = 0; +let touchStartY = 0; +let touchEndY = 0; +const SWIPE_THRESHOLD = 50; // Minimum de pixels pour déclencher un swipe + +// Initialisation +document.addEventListener('DOMContentLoaded', async () => { + await loadConfig(); + await loadData(); + + // Initialiser le swipe + initSwipeGestures(); + + // Démarrer les mises à jour automatiques (toutes les 2 secondes) + updateInterval = setInterval(loadData, 2000); +}); + +// === Chargement configuration === +async function loadConfig() { + try { + const response = await fetch('/api/config'); + config = await response.json(); + + // Appliquer le thème + document.documentElement.setAttribute('data-theme', config.theme || 'dark'); + + // Réinitialiser le flag de rendu des apps (la config peut avoir changé) + appsRendered = false; + + // Les apps seront rendues dans loadData() après création des panes + + } catch (error) { + console.error('Erreur chargement config:', error); + showError('Impossible de charger la configuration'); + } +} + +// === Chargement données === +async function loadData() { + try { + const response = await fetch('/api/lhm/data'); + const data = await response.json(); + + if (data.error) { + consecutiveErrors++; + if (consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) { + showError(data.error); + } + return; + } + + // Réinitialiser le compteur d'erreurs en cas de succès + consecutiveErrors = 0; + + // Cacher les états d'erreur/vide + document.getElementById('error-state').style.display = 'none'; + + // Vérifier s'il y a des capteurs OU des apps configurés + const hasSensors = data.tabs.some(tab => tab.sensors.length > 0); + const hasApps = config && config.apps && config.apps.length > 0; + + if (!hasSensors && !hasApps) { + document.getElementById('empty-state').style.display = 'block'; + document.getElementById('tabs-nav').style.display = 'none'; + document.getElementById('tabs-content').style.display = 'none'; + return; + } + + document.getElementById('empty-state').style.display = 'none'; + + // Render les onglets et données + renderTabs(data.tabs); + renderSensors(data.tabs); + + // Render les apps (dans le bon onglet ou section séparée) + try { + renderApps(); + } catch (appError) { + console.error('Erreur rendu apps:', appError); + } + + // Mettre à jour le timestamp + updateTimestamp(); + + } catch (error) { + console.error('Erreur chargement données:', error); + consecutiveErrors++; + + // N'afficher l'erreur que si plusieurs échecs consécutifs + // et qu'il n'y a pas déjà du contenu affiché + if (consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) { + const tabsContent = document.getElementById('tabs-content'); + if (!tabsContent || tabsContent.children.length === 0) { + showError('Erreur de connexion à LibreHardwareMonitor'); + } + } + } +} + +// === Render onglets === +function renderTabs(tabs) { + const tabsNav = document.getElementById('tabs-nav'); + + // Mettre à jour le nombre total d'onglets + totalTabs = tabs.length; + + // Si un seul onglet, on ne l'affiche pas mais on crée quand même le swipe indicator + if (tabs.length === 1) { + tabsNav.style.display = 'none'; + removeSwipeIndicators(); + return; + } + + tabsNav.style.display = 'flex'; + + // Ne re-render que si nécessaire + if (tabsNav.dataset.rendered !== 'true') { + tabsNav.innerHTML = ''; + + tabs.forEach((tab, index) => { + const button = document.createElement('button'); + button.className = 'tab-button' + (index === 0 ? ' active' : ''); + button.textContent = tab.name; + button.dataset.tabId = tab.id; + button.dataset.tabIndex = index; + button.addEventListener('click', () => switchTab(tab.id)); + tabsNav.appendChild(button); + }); + + tabsNav.dataset.rendered = 'true'; + + // Créer les indicateurs de swipe + createSwipeIndicators(tabs.length); + } +} + +function createSwipeIndicators(count) { + // Supprimer les anciens indicateurs + removeSwipeIndicators(); + + if (count <= 1) return; + + const container = document.createElement('div'); + container.className = 'swipe-indicators'; + container.id = 'swipe-indicators'; + + for (let i = 0; i < count; i++) { + const dot = document.createElement('span'); + dot.className = 'swipe-dot' + (i === 0 ? ' active' : ''); + dot.dataset.index = i; + dot.addEventListener('click', () => switchTabByIndex(i)); + container.appendChild(dot); + } + + // Ajouter après les tabs-nav + const tabsNav = document.getElementById('tabs-nav'); + tabsNav.parentNode.insertBefore(container, tabsNav.nextSibling); +} + +function removeSwipeIndicators() { + const existing = document.getElementById('swipe-indicators'); + if (existing) { + existing.remove(); + } +} + +function switchTab(tabId) { + // Désactiver tous les tabs + document.querySelectorAll('.tab-button').forEach(btn => { + btn.classList.remove('active'); + }); + + // Activer le bon + const activeBtn = document.querySelector(`.tab-button[data-tab-id="${tabId}"]`); + if (activeBtn) { + activeBtn.classList.add('active'); + // Mettre à jour l'index courant + currentTabIndex = parseInt(activeBtn.dataset.tabIndex) || 0; + } + + // Basculer les panes + document.querySelectorAll('.tab-pane').forEach(pane => { + pane.classList.remove('active'); + }); + + const targetPane = document.getElementById(`pane-${tabId}`); + if (targetPane) { + targetPane.classList.add('active'); + } + + // Mettre à jour les indicateurs + updateSwipeIndicators(); +} + +function switchTabByIndex(index) { + const buttons = document.querySelectorAll('.tab-button'); + if (index >= 0 && index < buttons.length) { + const tabId = buttons[index].dataset.tabId; + switchTab(tabId); + } +} + +function updateSwipeIndicators() { + const indicators = document.querySelectorAll('.swipe-dot'); + indicators.forEach((dot, index) => { + dot.classList.toggle('active', index === currentTabIndex); + }); +} + +// === Render capteurs === +function renderSensors(tabs) { + const tabsContent = document.getElementById('tabs-content'); + tabsContent.style.display = 'block'; + + // Créer les panes si nécessaire + tabs.forEach((tab, index) => { + let pane = document.getElementById(`pane-${tab.id}`); + + if (!pane) { + pane = document.createElement('div'); + pane.id = `pane-${tab.id}`; + pane.className = 'tab-pane' + (index === 0 ? ' active' : ''); + tabsContent.appendChild(pane); + } + + // Créer le grid de capteurs + let grid = pane.querySelector('.sensors-grid'); + if (!grid) { + grid = document.createElement('div'); + grid.className = 'sensors-grid'; + pane.appendChild(grid); + } + + // Render chaque capteur + tab.sensors.forEach(sensor => { + console.log('--- Render sensor:', sensor.name, 'show_graph:', sensor.show_graph, 'viz_type:', sensor.viz_type); + + let card = grid.querySelector(`[data-sensor-id="${CSS.escape(sensor.id)}"]`); + + // Déterminer le viz_type à utiliser + const vizType = sensor.show_graph ? (sensor.viz_type || 'line') : 'none'; + + // Vérifier si on doit recréer la carte + let needsRecreation = false; + if (card) { + const currentVizType = card.dataset.vizType || 'none'; + const currentShowTypeBadge = card.dataset.showTypeBadge !== 'false'; + const newShowTypeBadge = sensor.show_type_badge !== false; + const currentFontFamily = card.dataset.fontFamily || 'system'; + const newFontFamily = sensor.font_family || 'system'; + const currentFontBold = card.dataset.fontBold !== 'false'; + const newFontBold = sensor.font_bold !== false; + + // Recréer si le type de visualisation a changé + if (currentVizType !== vizType) { + console.log(`⚠️ Changement de visualisation: ${currentVizType} → ${vizType}, recréation carte`); + needsRecreation = true; + + // Supprimer l'ancien graphique du Map si existant + if (charts.has(sensor.id)) { + const oldChart = charts.get(sensor.id); + // Détruire proprement si c'est un Chart.js + if (oldChart && typeof oldChart.destroy === 'function') { + oldChart.destroy(); + } + charts.delete(sensor.id); + } + } + // Recréer si l'option badge a changé + else if (currentShowTypeBadge !== newShowTypeBadge) { + console.log(`⚠️ Changement badge type: ${currentShowTypeBadge} → ${newShowTypeBadge}, recréation carte`); + needsRecreation = true; + } + // Recréer si la police a changé + else if (currentFontFamily !== newFontFamily) { + console.log(`⚠️ Changement police: ${currentFontFamily} → ${newFontFamily}, recréation carte`); + needsRecreation = true; + } + // Recréer si le bold a changé + else if (currentFontBold !== newFontBold) { + console.log(`⚠️ Changement bold: ${currentFontBold} → ${newFontBold}, recréation carte`); + needsRecreation = true; + } + // Vérifier aussi si le canvas manque + else if (sensor.show_graph) { + if (vizType === 'gauge' && !card.querySelector('.sensor-gauge')) { + console.log('⚠️ Jauge manquante, recréation carte'); + needsRecreation = true; + } else if (vizType === 'line' && !card.querySelector('.sensor-chart')) { + console.log('⚠️ Graphique manquant, recréation carte'); + needsRecreation = true; + } + } + } + + if (!card || needsRecreation) { + console.log(needsRecreation ? 'Recréation carte...' : 'Carte n\'existe pas, création...'); + + // Supprimer l'ancienne si elle existe + if (card) { + card.remove(); + } + + // Créer un objet sensor modifié pour l'affichage + const sensorForDisplay = { + ...sensor, + viz_type: sensor.show_graph ? (sensor.viz_type || 'line') : 'none' + }; + + // Créer la carte + card = createSensorCard(sensorForDisplay); + grid.appendChild(card); + + // Créer la visualisation si nécessaire + if (sensor.show_graph) { + console.log('show_graph = true, création visualisation...'); + if (vizType === 'gauge') { + console.log('→ Appel createGauge'); + createGauge(sensorForDisplay); + } else { + console.log('→ Appel createChart'); + createChart(sensorForDisplay); + } + } else { + console.log('show_graph = false, pas de visualisation'); + } + } else { + // Mettre à jour la valeur + updateSensorCard(card, sensor); + } + + // Mettre à jour la visualisation + if (sensor.show_graph && charts.has(sensor.id)) { + if (vizType === 'gauge') { + updateGauge(sensor); + } else { + updateChart(sensor); + } + } + }); + }); +} + +function createSensorCard(sensor) { + console.log('=== createSensorCard ==='); + console.log('Sensor:', sensor); + console.log('show_graph:', sensor.show_graph); + console.log('viz_type:', sensor.viz_type); + + const card = document.createElement('div'); + card.className = 'sensor-card'; + + // Ajouter la classe de taille + const cardSize = sensor.card_size || 'medium'; + card.classList.add(`card-${cardSize}`); + + // Ajouter la classe de police + const fontFamily = sensor.font_family || 'system'; + card.classList.add(`font-family-${fontFamily}`); + + // Ajouter la classe bold/normal + const fontBold = sensor.font_bold !== false; // true par défaut + card.classList.add(fontBold ? 'font-bold' : 'font-normal'); + + // Ajouter la classe de taille de police + const fontSize = sensor.font_size || 'small'; + card.classList.add(`font-${fontSize}`); + + // Ajouter la classe pour masquer la valeur sur mobile si activé + if (sensor.hide_value_mobile) { + card.classList.add('hide-value-mobile'); + } + + card.dataset.sensorId = sensor.id; + card.dataset.vizType = sensor.show_graph ? (sensor.viz_type || 'line') : 'none'; + card.dataset.showTypeBadge = sensor.show_type_badge !== false ? 'true' : 'false'; + card.dataset.fontFamily = fontFamily; + card.dataset.fontBold = fontBold ? 'true' : 'false'; + + const valueClass = getSensorValueClass(sensor); + + // Déterminer quel type de visualisation afficher + let vizHtml = ''; + if (sensor.show_graph && sensor.viz_type === 'gauge') { + console.log('→ Création HTML jauge DIRECTE'); + const gaugeSize = (sensor.gauge_options && sensor.gauge_options.size) || 'medium'; + // Définir les dimensions selon la taille + const gaugeSizes = { + tiny: 60, + xs: 90, + small: 120, + medium: 180, + large: 240 + }; + const size = gaugeSizes[gaugeSize] || 180; + // Canvas DIRECT avec dimensions explicites + vizHtml = ``; + } else if (sensor.show_graph && (sensor.viz_type === 'line' || !sensor.viz_type)) { + console.log('→ Création HTML courbe DIRECTE'); + const chartHeight = (sensor.chart_options && sensor.chart_options.height) || 'medium'; + // Définir les hauteurs selon la taille + const chartHeights = { + tiny: 50, + xs: 70, + small: 90, + medium: 120, + large: 180 + }; + const height = chartHeights[chartHeight] || 120; + // Canvas DIRECT avec dimensions explicites (width sera 100%) + vizHtml = ``; + } else { + console.log('→ Pas de visualisation'); + } + + // Badge de type (affiché par défaut, peut être masqué) + const showTypeBadge = sensor.show_type_badge !== false; + const typeBadgeHtml = showTypeBadge ? `
${sensor.type}
` : ''; + + card.innerHTML = ` +
+
${sensor.name}
+ ${typeBadgeHtml} +
+
${sensor.value}
+ ${vizHtml} + `; + + console.log('HTML carte créée avec canvas DIRECT'); + return card; +} + +function updateSensorCard(card, sensor) { + const valueDiv = card.querySelector('[data-value]'); + valueDiv.textContent = sensor.value; + valueDiv.className = 'sensor-value ' + getSensorValueClass(sensor); +} + +function getSensorValueClass(sensor) { + let classes = [sensor.type]; + + // Ajouter des classes selon la valeur + if (sensor.type === 'temperature') { + const temp = parseFloat(sensor.value); + if (temp < 40) classes.push('cold'); + else if (temp > 70) classes.push('hot'); + } else if (sensor.type === 'percentage') { + const percent = parseFloat(sensor.value); + if (percent > 90) classes.push('critical'); + else if (percent > 70) classes.push('high'); + } + + return classes.join(' '); +} + +// === Graphiques Chart.js === +function createChart(sensor) { + console.log('=== createChart appelé ==='); + console.log('Sensor:', sensor); + + const sensorId = sensor.id; + const card = document.querySelector(`[data-sensor-id="${CSS.escape(sensorId)}"]`); + + console.log('Card trouvée:', card); + if (!card) { + console.error('ERREUR: Card non trouvée pour', sensorId); + return; + } + + const canvas = card.querySelector('.sensor-chart'); + console.log('Canvas trouvé:', canvas); + + if (!canvas) { + console.error('ERREUR: Canvas .sensor-chart non trouvé dans la carte'); + return; + } + + const ctx = canvas.getContext('2d'); + console.log('Context 2D:', ctx); + + // Obtenir le type de capteur + const sensorType = sensor.type || 'generic'; + + // Couleurs selon le type + let borderColor, backgroundColor; + switch(sensorType) { + case 'temperature': + borderColor = 'rgba(255, 152, 0, 1)'; // Orange + backgroundColor = 'rgba(255, 152, 0, 0.1)'; + break; + case 'percentage': + case 'load': + borderColor = 'rgba(74, 158, 255, 1)'; // Bleu + backgroundColor = 'rgba(74, 158, 255, 0.1)'; + break; + case 'fan': + borderColor = 'rgba(76, 175, 80, 1)'; // Vert + backgroundColor = 'rgba(76, 175, 80, 0.1)'; + break; + case 'power': + borderColor = 'rgba(244, 67, 54, 1)'; // Rouge + backgroundColor = 'rgba(244, 67, 54, 0.1)'; + break; + case 'voltage': + borderColor = 'rgba(156, 39, 176, 1)'; // Violet + backgroundColor = 'rgba(156, 39, 176, 0.1)'; + break; + case 'frequency': + case 'clock': + borderColor = 'rgba(255, 193, 7, 1)'; // Jaune + backgroundColor = 'rgba(255, 193, 7, 0.1)'; + break; + default: + borderColor = 'rgba(74, 158, 255, 1)'; + backgroundColor = 'rgba(74, 158, 255, 0.1)'; + } + + console.log('Création Chart.js...'); + const chart = new Chart(ctx, { + type: 'line', + data: { + labels: [], + datasets: [{ + data: [], + borderColor: borderColor, + backgroundColor: backgroundColor, + borderWidth: 2, + tension: 0.4, + pointRadius: 0, + fill: true + }] + }, + options: { + responsive: true, + maintainAspectRatio: false, + plugins: { + legend: { display: false }, + tooltip: { enabled: false } + }, + scales: { + x: { display: false }, + y: { + display: true, + grid: { + color: 'rgba(255, 255, 255, 0.05)', + drawBorder: false + }, + ticks: { + color: 'rgba(255, 255, 255, 0.3)', + font: { size: 10 } + } + } + }, + animation: { duration: 0 } + } + }); + + console.log('Chart créé:', chart); + charts.set(sensorId, chart); + console.log('Chart stocké dans Map'); + + // Charger l'historique initial + console.log('Chargement historique initial...'); + updateChart(sensor); +} + +async function updateChart(sensor) { + console.log('=== updateChart appelé ===', sensor.name); + + const sensorId = sensor.id; + const chart = charts.get(sensorId); + if (!chart) { + console.error('ERREUR: Chart non trouvé dans Map pour', sensorId); + return; + } + + // Vérifier si le chart est dans un onglet actif + const canvas = chart.canvas; + if (canvas) { + const pane = canvas.closest('.tab-pane'); + if (pane && !pane.classList.contains('active')) { + // Le chart est dans un onglet inactif, ne pas mettre à jour + return; + } + } + + try { + console.log('Fetch historique pour', sensorId); + const response = await fetch(`/api/lhm/history/${encodeURIComponent(sensorId)}?count=60`); + const data = await response.json(); + + console.log('Historique reçu:', data); + + if (data.values && data.values.length > 0) { + console.log('→ Mise à jour chart avec', data.values.length, 'valeurs'); + chart.data.labels = data.values.map((_, i) => i); + chart.data.datasets[0].data = data.values; + chart.update('none'); + console.log('→ Chart mis à jour'); + } else { + console.warn('→ Pas de valeurs dans l\'historique'); + } + } catch (error) { + console.error('Erreur mise à jour graphique:', sensorId, error); + } +} + +// === Jauges circulaires === +function createGauge(sensor) { + console.log('=== createGauge appelé ==='); + console.log('Sensor:', sensor); + + const sensorId = sensor.id; + const card = document.querySelector(`[data-sensor-id="${CSS.escape(sensorId)}"]`); + + console.log('Card trouvée:', card); + if (!card) { + console.error('ERREUR: Card non trouvée pour', sensorId); + return; + } + + const canvas = card.querySelector('.sensor-gauge'); + console.log('Canvas trouvé:', canvas); + + if (!canvas) { + console.error('ERREUR: Canvas .sensor-gauge non trouvé dans la carte'); + console.log('HTML de la card:', card.innerHTML); + return; + } + + // Stocker les infos de la jauge + charts.set(sensorId, { + type: 'gauge', + canvas: canvas, + sensor: sensor + }); + + console.log('Jauge stockée dans Map, dessin initial...'); + + // Dessiner la jauge initiale + updateGauge(sensor); +} + +function updateGauge(sensor) { + console.log('=== updateGauge appelé ===', sensor.name); + + const sensorId = sensor.id; + const gaugeInfo = charts.get(sensorId); + if (!gaugeInfo || gaugeInfo.type !== 'gauge') { + console.error('ERREUR: gaugeInfo non trouvé ou pas de type gauge'); + return; + } + + const canvas = gaugeInfo.canvas; + if (!canvas) { + console.error('ERREUR: canvas non trouvé'); + return; + } + + // Vérifier si le canvas est visible (dans un onglet actif) + const pane = canvas.closest('.tab-pane'); + if (pane && !pane.classList.contains('active')) { + // Le canvas est dans un onglet inactif, ne pas dessiner + return; + } + + const ctx = canvas.getContext('2d'); + + console.log('Canvas:', canvas, 'offsetWidth:', canvas.offsetWidth); + + // Définir la taille - protection contre taille nulle ou trop petite + const size = canvas.offsetWidth || canvas.width || 60; + if (size < 20) { + console.warn('Canvas trop petit, skip updateGauge'); + return; + } + + canvas.width = size; + canvas.height = size; + + console.log('Taille canvas:', size); + + // Extraire la valeur numérique + const valueStr = sensor.value.replace(/[^\d.,]/g, '').replace(',', '.'); + let value = parseFloat(valueStr); + if (isNaN(value)) value = 0; + + console.log('Valeur extraite:', value); + + // Déterminer min, max selon le type + let min = 0, max = 100; + const sensorType = sensor.type || 'generic'; + + switch(sensorType) { + case 'temperature': + min = 0; + max = 100; // 0-100°C + break; + case 'percentage': + case 'load': + min = 0; + max = 100; + break; + case 'fan': + min = 0; + max = 2000; // 0-2000 RPM + break; + case 'power': + min = 0; + max = 200; // 0-200W + break; + case 'voltage': + min = 0; + max = 15; // 0-15V + break; + case 'frequency': + case 'clock': + min = 0; + max = 6000; // 0-6000 MHz + break; + default: + min = 0; + max = 100; + } + + // Calculer le pourcentage + const percentage = Math.min(Math.max((value - min) / (max - min), 0), 1); + + // Couleur selon le type et la valeur + let color; + if (sensorType === 'temperature') { + if (value < 40) color = '#4a9eff'; // Bleu (froid) + else if (value < 70) color = '#ff9800'; // Orange (tiède) + else color = '#f44336'; // Rouge (chaud) + } else if (sensorType === 'percentage' || sensorType === 'load') { + if (value < 50) color = '#4caf50'; // Vert + else if (value < 80) color = '#ff9800'; // Orange + else color = '#f44336'; // Rouge + } else if (sensorType === 'fan') { + color = '#4caf50'; // Vert + } else if (sensorType === 'power') { + color = '#f44336'; // Rouge + } else if (sensorType === 'voltage') { + color = '#9c27b0'; // Violet + } else if (sensorType === 'frequency' || sensorType === 'clock') { + color = '#ffc107'; // Jaune + } else { + color = '#4a9eff'; // Bleu par défaut + } + + // Effacer le canvas + ctx.clearRect(0, 0, size, size); + + // Centre et rayon + const centerX = size / 2; + const centerY = size / 2; + const radius = Math.max(size / 2 - 10, 5); // Minimum 5px de rayon + const lineWidth = Math.max(size / 10, 2); // Minimum 2px d'épaisseur + + // Fond de la jauge (gris) + ctx.beginPath(); + ctx.arc(centerX, centerY, radius, 0.75 * Math.PI, 2.25 * Math.PI); + ctx.strokeStyle = 'rgba(255, 255, 255, 0.1)'; + ctx.lineWidth = lineWidth; + ctx.lineCap = 'round'; + ctx.stroke(); + + // Arc de la valeur + const startAngle = 0.75 * Math.PI; + const endAngle = startAngle + (1.5 * Math.PI * percentage); + + ctx.beginPath(); + ctx.arc(centerX, centerY, radius, startAngle, endAngle); + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + ctx.lineCap = 'round'; + ctx.stroke(); + + // Récupérer les options personnalisées + const gaugeOptions = sensor.gauge_options || {}; + const showValue = gaugeOptions.show_value !== false; // true par défaut + + // Texte de la valeur au centre (si activé) + if (showValue) { + ctx.fillStyle = 'rgba(255, 255, 255, 0.9)'; + ctx.font = `bold ${size / 4}px -apple-system, sans-serif`; + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + ctx.fillText(sensor.value, centerX, centerY); + } +} + +// === Applications === +function renderApps() { + const appsSection = document.getElementById('apps-section'); + + if (!config || !config.apps || config.apps.length === 0) { + if (appsSection) appsSection.style.display = 'none'; + cleanAppsFromTabs(); + appsRendered = false; + return; + } + + const appsTabId = config.apps_tab || ''; + + // Si les apps ont déjà été rendues dans le même onglet, ne pas re-rendre + if (appsRendered && lastAppsTabId === appsTabId) { + return; + } + + // Créer le HTML des boutons d'apps + const appsHtml = config.apps.map((app, index) => ` + + `).join(''); + + // Nettoyer d'abord les apps existantes dans les onglets + cleanAppsFromTabs(); + + // Si un onglet est spécifié, mettre les apps dans cet onglet + if (appsTabId) { + // Cacher la section séparée + if (appsSection) appsSection.style.display = 'none'; + + // Trouver le pane cible + const targetPane = document.getElementById(`pane-${appsTabId}`); + if (targetPane) { + // Créer la nouvelle grille d'apps + const appsContainer = document.createElement('div'); + appsContainer.className = 'apps-section-in-tab'; + appsContainer.innerHTML = ` +

🚀 Applications

+
${appsHtml}
+ `; + + // Ajouter à la fin du pane + targetPane.appendChild(appsContainer); + + // Ajouter les event listeners + appsContainer.querySelectorAll('.app-button').forEach(btn => { + btn.addEventListener('click', () => launchApp(parseInt(btn.dataset.appIndex))); + }); + + appsRendered = true; + lastAppsTabId = appsTabId; + } else { + // L'onglet cible n'existe pas encore, afficher dans la section séparée + console.warn(`Onglet apps "${appsTabId}" non trouvé, affichage en section séparée`); + renderAppsInSection(appsHtml); + appsRendered = true; + lastAppsTabId = ''; + } + } else { + // Afficher dans la section séparée (comportement par défaut) + renderAppsInSection(appsHtml); + appsRendered = true; + lastAppsTabId = ''; + } +} + +function renderAppsInSection(appsHtml) { + const appsSection = document.getElementById('apps-section'); + const appsGrid = document.getElementById('apps-grid'); + + if (appsSection && appsGrid) { + appsSection.style.display = 'block'; + appsGrid.innerHTML = appsHtml; + + // Ajouter les event listeners + appsGrid.querySelectorAll('.app-button').forEach(btn => { + btn.addEventListener('click', () => launchApp(parseInt(btn.dataset.appIndex))); + }); + } +} + +// Nettoyer les apps des onglets (appelé lors du re-render) +function cleanAppsFromTabs() { + document.querySelectorAll('.apps-section-in-tab').forEach(el => el.remove()); +} + +async function launchApp(appId) { + try { + const response = await fetch(`/api/apps/launch/${appId}`, { + method: 'POST' + }); + + const result = await response.json(); + + if (!result.success) { + alert('Erreur: ' + result.error); + } + + } catch (error) { + console.error('Erreur lancement app:', error); + alert('Erreur de lancement'); + } +} + +// === Utilitaires === +function updateTimestamp() { + const now = new Date(); + const timeStr = now.toLocaleTimeString('fr-FR', { + hour: '2-digit', + minute: '2-digit', + second: '2-digit' + }); + + document.getElementById('last-update').textContent = `🔄 ${timeStr}`; +} + +function showError(message) { + const errorState = document.getElementById('error-state'); + const errorMessage = document.getElementById('error-message'); + + errorMessage.textContent = message; + errorState.style.display = 'block'; + + document.getElementById('empty-state').style.display = 'none'; + document.getElementById('tabs-nav').style.display = 'none'; + document.getElementById('tabs-content').style.display = 'none'; +} + +// Nettoyage à la fermeture +window.addEventListener('beforeunload', () => { + if (updateInterval) { + clearInterval(updateInterval); + } + + charts.forEach((chart, key) => { + // Chart.js a une méthode destroy, les jauges n'en ont pas + if (chart && typeof chart.destroy === 'function') { + chart.destroy(); + } + }); +}); + +// === Swipe Gestures === +function initSwipeGestures() { + const tabsContent = document.getElementById('tabs-content'); + + if (!tabsContent) return; + + // Touch events + tabsContent.addEventListener('touchstart', handleTouchStart, { passive: true }); + tabsContent.addEventListener('touchend', handleTouchEnd, { passive: true }); + + // Optionnel: support souris pour test sur desktop + tabsContent.addEventListener('mousedown', handleMouseDown); + tabsContent.addEventListener('mouseup', handleMouseUp); +} + +function handleTouchStart(e) { + touchStartX = e.changedTouches[0].screenX; + touchStartY = e.changedTouches[0].screenY; +} + +function handleTouchEnd(e) { + touchEndX = e.changedTouches[0].screenX; + touchEndY = e.changedTouches[0].screenY; + handleSwipe(); +} + +function handleMouseDown(e) { + touchStartX = e.screenX; + touchStartY = e.screenY; +} + +function handleMouseUp(e) { + touchEndX = e.screenX; + touchEndY = e.screenY; + handleSwipe(); +} + +function handleSwipe() { + const deltaX = touchEndX - touchStartX; + const deltaY = touchEndY - touchStartY; + + // Vérifier que c'est bien un swipe horizontal (pas vertical) + if (Math.abs(deltaX) < SWIPE_THRESHOLD) return; + if (Math.abs(deltaY) > Math.abs(deltaX)) return; // Scroll vertical, ignorer + + if (deltaX > 0) { + // Swipe vers la droite → onglet précédent + navigateToPreviousTab(); + } else { + // Swipe vers la gauche → onglet suivant + navigateToNextTab(); + } +} + +function navigateToNextTab() { + if (totalTabs <= 1) return; + + const nextIndex = (currentTabIndex + 1) % totalTabs; + switchTabByIndex(nextIndex); + + // Feedback visuel + showSwipeFeedback('next'); +} + +function navigateToPreviousTab() { + if (totalTabs <= 1) return; + + const prevIndex = (currentTabIndex - 1 + totalTabs) % totalTabs; + switchTabByIndex(prevIndex); + + // Feedback visuel + showSwipeFeedback('prev'); +} + +function showSwipeFeedback(direction) { + const content = document.getElementById('tabs-content'); + content.classList.add('swipe-' + direction); + + setTimeout(() => { + content.classList.remove('swipe-' + direction); + }, 200); +} + +// ==================== Plexamp Widget ==================== + +let plexampEnabled = false; +let plexampInterval = null; + +async function initPlexamp() { + try { + const response = await fetch('/api/plexamp/config'); + const config = await response.json(); + + plexampEnabled = config.enabled && config.has_token; + + const widget = document.getElementById('plexamp-widget'); + if (plexampEnabled && widget) { + widget.style.display = 'flex'; + setupPlexampControls(); + updatePlexampStatus(); + // Polling toutes les 2 secondes + plexampInterval = setInterval(updatePlexampStatus, 2000); + } + } catch (error) { + console.error('Erreur init Plexamp:', error); + } +} + +async function updatePlexampStatus() { + try { + const response = await fetch('/api/plexamp/status'); + const data = await response.json(); + + const widget = document.getElementById('plexamp-widget'); + const cover = document.getElementById('plexamp-cover'); + const noMusic = document.getElementById('plexamp-no-music'); + const title = document.getElementById('plexamp-title'); + const artist = document.getElementById('plexamp-artist'); + const album = document.getElementById('plexamp-album'); + const progressFill = document.getElementById('plexamp-progress-fill'); + const timeCurrent = document.getElementById('plexamp-time-current'); + const timeTotal = document.getElementById('plexamp-time-total'); + const playPauseBtn = document.getElementById('plexamp-playpause'); + + if (!data.enabled || data.state === 'stopped' || !data.title) { + // Pas de lecture + cover.style.display = 'none'; + noMusic.style.display = 'flex'; + title.textContent = '-'; + artist.textContent = '-'; + album.textContent = '-'; + progressFill.style.width = '0%'; + timeCurrent.textContent = '0:00'; + timeTotal.textContent = '0:00'; + playPauseBtn.textContent = '▶️'; + return; + } + + // Afficher les infos + cover.style.display = 'block'; + noMusic.style.display = 'none'; + + if (data.artwork_url) { + cover.src = data.artwork_url; + } + + title.textContent = data.title || '-'; + artist.textContent = data.artist || '-'; + album.textContent = data.album || '-'; + + // Progression + progressFill.style.width = `${data.progress || 0}%`; + timeCurrent.textContent = formatTime(data.time || 0); + timeTotal.textContent = formatTime(data.duration || 0); + + // Bouton play/pause + playPauseBtn.textContent = data.playing ? '⏸️' : '▶️'; + + } catch (error) { + console.error('Erreur update Plexamp:', error); + } +} + +function formatTime(ms) { + const seconds = Math.floor(ms / 1000); + const mins = Math.floor(seconds / 60); + const secs = seconds % 60; + return `${mins}:${secs.toString().padStart(2, '0')}`; +} + +function setupPlexampControls() { + const prevBtn = document.getElementById('plexamp-prev'); + const playPauseBtn = document.getElementById('plexamp-playpause'); + const nextBtn = document.getElementById('plexamp-next'); + + if (prevBtn) { + prevBtn.addEventListener('click', () => sendPlexampCommand('prev')); + } + + if (playPauseBtn) { + playPauseBtn.addEventListener('click', () => sendPlexampCommand('playpause')); + } + + if (nextBtn) { + nextBtn.addEventListener('click', () => sendPlexampCommand('next')); + } +} + +async function sendPlexampCommand(command) { + try { + await fetch(`/api/plexamp/${command}`, { method: 'POST' }); + // Mettre à jour immédiatement + setTimeout(updatePlexampStatus, 300); + } catch (error) { + console.error(`Erreur commande Plexamp ${command}:`, error); + } +} + +// Initialiser Plexamp au chargement +document.addEventListener('DOMContentLoaded', () => { + // Attendre un peu que le reste soit chargé + setTimeout(initPlexamp, 500); +}); diff --git a/templates/admin.html b/templates/admin.html new file mode 100644 index 0000000..69ffb9e --- /dev/null +++ b/templates/admin.html @@ -0,0 +1,301 @@ + + + + + + PC Monitor - Admin + + + + + +
+
+

⚙️ Configuration PC Monitor

+
+ 📊 Dashboard + +
+
+ +
+ + + + +
+

Source de monitoring

+

Choisissez le logiciel de monitoring à utiliser

+ +
+ +
+ +
+

⚙️ Configuration de la connexion

+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ +
+ +
+
+ + +
+

Sélection des capteurs

+

Cochez les capteurs que vous souhaitez afficher sur le dashboard

+ +
+
Chargement des capteurs...
+ +
+
+ + +
+

Ordre des capteurs

+

Glissez-déposez les capteurs pour changer leur ordre d'affichage

+ +
+ +
+
+ + +
+

Gestion des onglets

+

Créez et organisez vos onglets personnalisés

+ +
+
+ + +
+
+ + + + +
+

🎵 Lecteur Média

+

Configurez Plexamp pour afficher le lecteur sur le dashboard

+ +
+
+ +
+

Plexamp

+

Lecteur Plex (via serveur Plex)

+
+
+ +
+
+ + +
+ +
+ + +
+ +
+ + + Trouvez-le dans Plexamp → Paramètres → Dépannage → Copier le token +
+ +
+ + + +
+
+
+
+ +
+

Applications lancables

+

Configurez les applications que vous voulez lancer depuis le dashboard

+ +
+ + +
+ +
+ + +
+ + +
+

Apparence

+

Personnalisez le thème de l'interface

+ +
+ + + + + +
+
+
+
+ + + + +
+ + + + diff --git a/templates/dashboard.html b/templates/dashboard.html new file mode 100644 index 0000000..49ae793 --- /dev/null +++ b/templates/dashboard.html @@ -0,0 +1,93 @@ + + + + + + PC Monitor - Dashboard + + + + + + + + +
+
+

📊 PC Monitor

+
+ - + ⚙️ +
+
+ + + + + +
+ +
+ + + + + + + + +
+
📊
+

Aucun capteur configuré

+

Rendez-vous dans la page d'administration pour configurer vos capteurs

+ ⚙️ Configuration +
+ + + +
+ + + +