diff --git a/THING/THING.127/icons.inf b/THING/THING.127/icons.inf
index 13d7e98..96a55ef 100644
--- a/THING/THING.127/icons.inf
+++ b/THING/THING.127/icons.inf
@@ -1,5 +1,5 @@
# Icon assignments for Thing (ICONS.INF)
-# Created by ThingIcn on 11.09.2019, 15:09:02
+# Created by ThingIcn on 23.11.2022, 15:50:22
#
# (The comments are, of course, not held in memory --
# so there is no harm keeping them in this file)
@@ -81,7 +81,7 @@ IFIL "APP 68KEMU" 68KEMU.PRG
IFIL "APP CONS" TOSWIN2.APP
IFIL "APP RSM" RSM.APP
IFIL "APP KEYEDIT" KEYEDIT.APP
-IFIL "ZIP DIR/FILE" LZIP.APP
+IFIL "ZIP DIR/FILE" LATZIP.APP
IFLD "SYS" SYS
IFLD "VAR" VAR
IFLD "DHCP" DHCP
diff --git a/THING/THING.127/thing.inf b/THING/THING.127/thing.inf
index cb397a9..4f1d28a 100644
--- a/THING/THING.127/thing.inf
+++ b/THING/THING.127/thing.inf
@@ -1,8 +1,8 @@
# Thing general configuration (thing.inf)
-# 01-10-2022 / 18:43
+# 24-11-2022 / 15:57
#
VERS 127
-CONF 1 1 0 0 1 1 1 4 1 0 1 0 1 0 0 1 1 0 0 1 1 0 1 0 1 1 1 1 0 0
+CONF 1 1 0 0 1 1 1 4 1 1 1 0 1 0 0 1 1 0 0 1 1 0 1 0 1 1 1 1 0 0
CNFG 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
CBUF 4000
US3D 1
@@ -46,9 +46,9 @@ APPL "mxplay_cf.app" C:\tools\mxplay\mxplay_cf.app "" 1 "*.mp3" "" "" 0 1 0 0 0
AOPT 0 0 0 0 0 0 0 0 0 0
APPL "NetSurf" C:\tools\netsurf3\nsv4e.app "" 1 "*.htm*,*.php,http*" "" "" 0 1 0 0 0 0 0 0 0 0 0
AOPT 0 0 0 0 0 0 0 0 0 0
-APPL "synctmcf.prg" C:\tools\synctime\synctmcf.prg "" 1 "" "" "" 0 1 0 0 0 1 0 0 0 0 0
+APPL "cops.acc" C:\mint\mint_acc\cops.acc "" 1 "*.cpx" "" "" 0 1 0 1 0 0 0 0 0 0 0
AOPT 0 0 0 0 0 0 0 0 0 0
-WIXY 0 2328 1341 4703 7594
+WIXY 0 4937 1650 4703 7594
WIXY 1 2875 4721 6656 5000
WIXY 2 500 1560 6656 5000
WIXY 3 625 1729 6656 5000
@@ -65,3 +65,4 @@ WIXY 13 1875 3459 6656 5000
WIXY 14 2000 3638 6656 5000
WIXY 15 2125 3807 6656 5000
VTXY 0 0 10000 10000
+WOPN 256 1 0 0 * F:\ 0 "" 0 0 1
diff --git a/UPLOADS.TXT b/UPLOADS.TXT
index fa8ff72..ff65fab 100644
--- a/UPLOADS.TXT
+++ b/UPLOADS.TXT
@@ -146,4 +146,6 @@
08.11.2022 Lars: Moved /sources/ out of setup (one dir up)
20.11.2022 Lars: /mint/sys/bin/ cleaned + updated
Corrected teradesk.inf, highwire.cfg
-
\ No newline at end of file
+24.11.2022 Lars: Updated cops.acc and Vision -> 4.9b2
+ Corrected thing.inf/icons.inf for thing 1.27
+
\ No newline at end of file
diff --git a/mint/mint_acc/COPS.ACC b/mint/mint_acc/COPS.ACC
deleted file mode 100644
index 58b60ec..0000000
Binary files a/mint/mint_acc/COPS.ACC and /dev/null differ
diff --git a/mint/mint_acc/cops.acc b/mint/mint_acc/cops.acc
new file mode 100644
index 0000000..6d730c9
Binary files /dev/null and b/mint/mint_acc/cops.acc differ
diff --git a/teradesk/teradesk.inf b/teradesk/teradesk.inf
index 2717e48..6952c16 100644
--- a/teradesk/teradesk.inf
+++ b/teradesk/teradesk.inf
@@ -1422,6 +1422,23 @@ applications=
}
}
}
+ app=
+ {
+ path=C:\mint\mint_acc\cops.acc
+ cmdl=%f
+ atype=
+ {
+ appt=2
+ flag=0x2000
+ }
+ doctypes=
+ {
+ dtype=
+ {
+ mask=*.cpx
+ }
+ }
+ }
}
windows=
@@ -1452,8 +1469,8 @@ windows=
{
xpos=103
ypos=95
- winw=57
- winh=11
+ winw=52
+ winh=23
}
pos=
{
diff --git a/tools/vision/HISTOIRE.TXT b/tools/vision/HISTOIRE.TXT
deleted file mode 100644
index b73e6ca..0000000
--- a/tools/vision/HISTOIRE.TXT
+++ /dev/null
@@ -1,331 +0,0 @@
- V I S I O N
- -----------
-
-http://vision.atari.org ou http://jlusetti.free.fr
-E-Mail : vision@atari.org ou jlusetti@free.fr
-
-Tous les details des dernieres mises a jour sont disponibles sur:
-http://vision.atari.org/vhisto.htm
-
-Version 4.0e (Decembre 2003)
-----------------------------
-* Correction du bug faisant planter VISION lorsque l'on cree une nouvelle
- categorie depuis le formulaire d'informations sur l'album
-
-
-Version 4.0a (Novembre 2000)
-----------------------------
-* VISION devient modulaire !
-Un clic avec le bouton droit sur une image fait apparaitre un popup donnant
-acces aux LDV (Librairies Dynamiques VISION).
-Vous pouvez ensuite selectionner votre LDV, voir ses details et l'appliquer
-sur l'image ou sur un bloc.
-Un kit de developemment est egalement disponible sur le site WEB.
-Les LDV sont basees sur les librairies dynamiques GEM (LDG), developpees
-par Dominique Bereziat et Olivier Landemarre. Merci a eux !
-!!!! IMPORTANT !!!!
-N'oubliez pas de copier LDG.PRG dans le dossier AUTO !
-
-* Grosse refonte de l'interface
-
- - Bien plus respecteux du Multitache Magic ou Mint...
- - On peut d‚placer les fenetres de progression et celles-ci
- se redessinent bien...
- - Plusieurs boites de dialogue sont devenues non modales:
- . La roue True Color
- . La s‚lection d'un index de la palette (fenetre redimensionnable
- et librement positionnable)
- . Le catalogue -enfin!-
- . La vue du catalogue en vignettes -enfin!-
- - Pleins de d‚tails du style, on peut iconiser, bouger, retailler les
- fenetres alors qu'une boite modale est ouverte
-
-* Nouvelle fenetre : Image Browser
-
- Tres pratique, cette fenetre permet de visualiser tres rapidement les images
- d'un dossier a la maniere du logiciel ACDSee sur PC (excellent logiciel par
- ailleurs...). Cette fenetre est affichee au demarrage et donne acces aux fonctions
- suivantes:
-
- - Chargement d'une image : L'image demandee sera affichee et laliste des images du
- meme dossier sera memorisee
- - Image precedente/suivante : Permet de visualiser l'image d'avant ou d'apres. Noter que
- ( touches <- et -> ) vous pouvez, durant le chargement d'une image l'interrompre
- et avec les touches de <- et -> enchainer sur le chargement
- de l'image suivante / precedente.
- - Edition : Permet d'ouvrir une fenetre classique d'image VISION
- permettant la modification
- - Impression : Cette fonction permet d'imprimer l'image courante
- - Supression : Supprime le fichier image sur le disque
- - Zoom : Popup permettant de selectionner le niveau de zoom desire
- - Deplacement : Si l'image est trop grande pour etre affichee en totalite
- dans une fenetre, vous pouvez vous deplacer dedans en
- maintenant appuye le bouton gauche de la souris et en la
- deplacant dans le fenetre de l'Image Browser
-
-
-* Extension de l'id‚e de cat‚gorie par d‚faut dans l'album
- Il est possible d'associer … la place d'une categorie par defaut un fichier INI qui
- determine les 3 categories possibles suivants les repertoires ou l'image se trouve.
- Ce fichier INI … indiquer dans la fenetre d'informations sur l'album est structure ainsi:
- [Lookn] --> n est l'ordre de priorite de recherche (0 est le plus prioritaire)
- Path=... --> Chemin et masque, si le fichier a ajouter entre dans Path, cette image
- sera enregistree avec les categories suivantes
- Catn=... --> Nom de la categorie n (1,2,3) de l'image. Si cette categorie n'existe pas,
- elle sera creee (attention a la limite des 32 categories). Si une erreur
- survient ou si Catn n'est pas indique, la categorie par defaut de l'album
- sera utilisee.
-
- Ce fichier INI est tres puissant pour organiser vos images si vous avez l'habitude de les
- rassembler dans des repertoires ! Par exemple, une fois fait, ce fichier vous permet d'ajouter
- automatiquement d'un seul coup toutes vos images sans qu'il soit necessaire de reprendre
- ensuite a la main les categories !
-
-* Gestion du protocole VA_START
-
- - Si votre bureau (Thing, Magic, Mint,...) gere ce protocole, vous pouvez charger a
- la suite une nouvelle image dans VISION sans qu'il soit necessaire de le relancer
-
-* Gestion des noms longs
- ! IMPORTANT !
- Suivant les versions du systeme (Tos, Mint, Magic...), certaines fonctions
- proposees par le systeme ne gerent pas les noms longs, cela peut entrainer
- des erreurs notamment lors des conversions en serie ou de l'ajout d'images
- dans un album. Pour palier a cela, VISION propose sa validation dans la
- fenetre des preferences (cela remplace d'ailleurs l'option des popups a
- defilement qui ne servait pas a grand chose...)
-
-* Sur clic droit dans la vue en fenetre du catalogue, apparition d'un
- popup donnant accŠs a:
- - Chargement de l'image sous la souris
- - Information sur l'image
- - Export en HTML de la vue en fenetre (avec possibilite de dupliquer les
- images correspondant aux vignettes)
-
-* Pour les conversions en serie, on peut specifier la destruction des fichiers
- sources, leur deplacement et l'ecrasement des fichiers existants
-
-* Plus rapide : le tri suivant criteres pour le catalogue (jusqu'a 30 fois !)
-
-* Les filtres peuvent maintenant etre traduits et integres (de la meme
- facon que les langues) dans VISION (creer le repertoire du nom de la
- langue dans VISION\FILTRES)
-
-* Lors d'une conversion en serie ou d'un ajout d'images dans un album,
- la progression s'affiche de maniere globale et non plus sur chaque
- image traitee
-
-* Dans la boite de dialogue des formes, on peut maintenant specifier un
- type de debut et de fin differents pour une ligne
-
-* Lors de l'utilisation de l'outil lignes ou K-lignes, les coordonnees
- s'affichent dans la barre d'info de la fenetre
-
-* Sur clic droit sur une image, on peut lancer un programme externe (en
- parallele si un systeme Multitache (Mint, Magic...) est utilise)
-
-* La palette fait parite de la liste des actions possibles lors d'un clic
- droit sur une image
-
-* Ajout de la cle SplashWindow dans vision.ini indiquant si la fenetre de
- presentation doit etre affichee
-
-* Ajout de la cle DisplayToolBar dans vision.ini indiquant si la barre
- d'outils doit etre affichee. Pour la reafficher, passer par les
- preferences
-
-* Si VISION ne trouve pas VISION.INI au demarrage, il vous permet de le trouver
- a sa place
-
-* Correction de bugs
- ------------------
- - Sous NVDI5, les drivers d'imprimantes sont reconnus
-
- - Sur une machine necessitant l'utilisation du format VDI standard, la
- fonction "Copier" dans le Presse Papier GEM ne prenait pas en compte
- le format VDI standard et l'image copiee etait incorrecte.
-
- - Sur une machine necessitant l'utilisation du format VDI standard, les
- conversions en serie ne pouvaient pas marcher dans certains cas
-
- - Suivant le nombre de fontes et la postion de la fonte systŠme dans la liste,
- il etait possible que cetteliste soit mal affichee dans le formulaire de
- parametrage du texte
-
-
-Version 3.5a (Decembre 98)
-------------
-
-* Impl‚mentation du tramage en 256 couleurs (selection automatique)
-
-* Ajout de la fonction de recopie d'ecran (SnapShot), activable par les
- touches '*' et '/' du pave numerique:
- '*' : Propose le choix entre l'ecran entier et un bloc rectangulaire
- '/' : Recopie avec les parametres presents dans la derniere configuration
-
-* Gestion du format JPEG en import sans DSP
- Support du format 256 couleurs en niveaux de gris
- Support du format progressif (entrelace)
-
-* Gestion du format JPEG en export sans DSP
- Qualite de sauvegarde reglable
-
- (Le module import/export JPEG sans DSP est en grosse partie base
- sur le travail effectue par le Independent JPEG Group)
-
-* Possibilite de decouper une image en n lignes et m colonnes afin de sauver
- chaque bloc dans un fichier (pratique pour creer des tableaux d'images dans
- une page HTML)
-
-* Gestion du format GIF entrelace en import
-
-* + Rapide : tramage en niveaux de gris accelere de 25 % a 35 %
-
-* La fenetre du catalogue est maintenant redimensionnable
-
-* Ajout d'un popup apparaissant sur un clic droit sur image permettant l'acces
- aux fonctions suivantes :
- agrandir, maximiser, informations, sauver, sauver sous et fermer
-
-* Possibilite d'activer un fichier journal au format VSS afin de generer
- automatiquement un fichier diaporama en chargeant des images a la suite
-
-* Correction du bug provoquant systematiquement une allocation memoire pour
- le undo lors d'une operation de correction gamma ou luminosite en True Color
-
-* Correction du bug en True Color lors du chargement d'une image monochrome
- (affichage en rouge et blanc au lieu de noir et blanc)
-
-* Correction d'un bug pouvant empecher le chargement de la fin d'une image
- TIFF compresse LZW
-
-* Correction du bug provoquant l'affichage d'une mauvaise palette en 256
- couleurs dans le cas ou seules les 16 premieres couleurs sont utilisees
-
-* Correction du bug generant un mauvais fichier lors de la sauvegarde
- en GIF d'une image ayant moins de couleurs que la resoution graphique
-
-* Correction de bugs divers pouvant entrainer un plantage lors du chargement
- d'une image GIF animee
-
-
-
-Version 3.0d
-------------
-
-* Correction du bug avec NVDI empechant la selection d'une couleur dans une image True Color
-
-
-Version 3.0c
-------------
-
-* Gestion des modes TrueColor 16 bits (65K), seul le mode 24 bits n'est
- pas encore gere
-
-* Detection automatique de l'organisation True Color et de
- la necessite d'utiliser le format VDI standard
-
-* La fenetre du catalogue devient "presque" non modale
-
-* Les fleches de direction peuvent etre utilisees pour se deplacer dans
- les fenetres d'image ou du catalogue
-
-* L'iconification marche sous Magic
-
-* Doc HTML On et Off Line consultable sur le site WEB de VISION:
- http://www.mygale.org/01/jlusetti
-
-* Sauvegarde des parametres des outils (ligne, point,...) dans
- VISION.INI
-
-* Correction d'un bug empechant la selection d'une couleur en True Color
-
-* Correction d'un bug amenant … un plantage lors d'un UNDO disque sur la
- palette
-
-* Le temps d'attente ShareWare passe a 10 secondes
-
-* Les fichiers diaporama (.VSS) acceptent des commentaires en ligne
-
-* La traduction Anglaise a ete amelioree par Hallard TANGERAAS, merci a lui !
-
-
-Version 3.0b
-------------
-* VISION devient SHAREWARE !
- Prix : 150 Frs (cheque a l'ordre de Jean LUSETTI,
- coordonnes dans REGISTER.TXT)
-
-
-* Ajout d'une fenetre de zoom (x 1,2,4,8,16) en TEMPS REEL
- Les outils peuvent maintenant etre utilises avec une
- precision inegalee.
-
-
-* Ajout de la fonctionnalit‚ de diaporama (SlideShow)
- Directement int‚gr‚ au catalogue ou pouvant etre cree "a la main"
- en tant que fichier texte d'extension VSS
-
-
-* Plus RAPIDE !
- Conversion indices --> format bitplan ATARI
- Tramage
- Decompactage LZW
-
- Exemple : Le chargement d'une image TIFF 256 compressee LZW en mode
- 16 couleurs a ete divise par 2,3 !
-
-
-* Les informations d'une image comprennent maintenant un compte rendu sur
- les performances de chargement :
- Acces disque
- Conversion indices --> bitplan
- Decompression
- Tramage
- Transformation format graphique specifique <--> format ATARI standard
-
-
-* Les buffers UNDO peuvent maintenant etre definis sur disque
- --> Jusqu'a 99 niveaux d'annulation !!!
-
-
-* TOUTES les operations deviennent annulables
- Y compris rotation, luminosite (TC), correction Gamma (TC) conversion et
- redimensionnement
-
-
-* Compatibilite avec les cartes graphiques et emulateurs ST sur Mac/PC
- Grace a une boite de dialogue permettant a VISION de detecter
- l'organisation du mode True Color (detection automatique integree)
-
- NOTE:
- Les modes True Color 16 et 32 bits ont pu etre testes.
- Le mode 24 bits est present mais NON TESTE, faute de machine
- et de carte video le permettant
- En 16 bits, seul le mode 32K est utilise
-
-
-* Les icones apparaissent en couleurs sur toutes les machines et non plus
- uniquement sur FALCON.
-
-
-* Gestion simplifiee de la langue utilisee
- Choix dans la boite des preferences
- La traduction de VISION dans n'importe quelle langue se limite a traduire
- 3 fichiers de ressources.
-
-
-* Le fichier de configuration (ex VISION.CFG) devient VISION.INI au format texte
- Plus facile et plus souple a utiliser
-
-
-* La roue True Color est sauvee dans le fichier tcwheel.dat
- Le temps d'initialisation du mode True Color disparait
- Correction du bug empechant la selection d'une couleur dans la roue TC
- avec NVDI ou un emulateur.
-
-
-* L'ensemble des messages est rassemble dans le fichier VMSG.RSC
- Cela permet de reduire la taille des fichiers VISION.RSC et VISIONB.RSC
- qui contenaient chacun une copie de ces messages.
-
diff --git a/tools/vision/LDV/BW.LDV b/tools/vision/LDV/BW.LDV
deleted file mode 100644
index dcddb47..0000000
Binary files a/tools/vision/LDV/BW.LDV and /dev/null differ
diff --git a/tools/vision/LDV/GAMMA.LDV b/tools/vision/LDV/GAMMA.LDV
deleted file mode 100644
index 3a20601..0000000
Binary files a/tools/vision/LDV/GAMMA.LDV and /dev/null differ
diff --git a/tools/vision/LDV/INVERT.LDV b/tools/vision/LDV/INVERT.LDV
deleted file mode 100644
index 9d29d3b..0000000
Binary files a/tools/vision/LDV/INVERT.LDV and /dev/null differ
diff --git a/tools/vision/LDV/LDG.LIB b/tools/vision/LDV/LDG.LIB
deleted file mode 100644
index 1c546cf..0000000
Binary files a/tools/vision/LDV/LDG.LIB and /dev/null differ
diff --git a/tools/vision/LDV/LDV.C b/tools/vision/LDV/LDV.C
deleted file mode 100644
index d34fcec..0000000
--- a/tools/vision/LDV/LDV.C
+++ /dev/null
@@ -1,1202 +0,0 @@
-#include
-#include
-#include
-
-#include "..\tools\chkstack.h"
-#include "..\tools\scalemem.h"
-#include "..\tools\gwindows.h"
-#include "..\tools\rasterop.h"
-#include "..\tools\frecurse.h"
-#include "..\tools\logging.h"
-#include "..\tools\xfile.h"
-#include "..\tools\ini.h"
-#include "..\tools\cpupng.h" /* Workaround */
-
-#include "actions.h"
-#include "ldv\ldvcom.h"
-
-static LDV_MODULE *Modules ;
-static int NbModules ;
-static int NumModule ;
-static short ListTypes[] = { TLDV_MODIFYIMG, TLDV_LOADIMG, TLDV_SAVEIMG } ;
-
-#define VAPI_LDVVERSION 0x0104
-static VAPI *Vapi = NULL ;
-static GEM_WINDOW *LdvProg = NULL ;
-
-
-void cdecl PrSetText(long no_line, char *text)
-{
- if ( LdvProg && ( no_line >= 0 ) && ( no_line <= 2 ) )
- StdProgWText( LdvProg, (int)no_line, text ) ;
-}
-
-void cdecl PrSetProg(long pc)
-{
- if ( LdvProg ) LdvProg->ProgPc( LdvProg, (int)pc, NULL ) ;
-}
-
-long cdecl PrSetProgEx(long pc)
-{
- long ret = 0 ;
-
- if ( LdvProg ) ret = LdvProg->ProgPc( LdvProg, (int)pc, NULL ) ;
- if ( ret != 0 ) LdvProg = NULL ;
-
- return( ret ) ;
-}
-
-void cdecl PrOptimize(long mask)
-{
- if ( LdvProg )
- {
- StdProgDisplay030( LdvProg, (int)mask & 0x01 ) ;
- StdProgDisplayDSP( LdvProg, (int)mask & 0x02 ) ;
- StdProgDisplayFPU( LdvProg, (int)mask & 0x04 ) ;
- }
-}
-
-void cdecl RaImgWhite(MFDB *img)
-{
- img_raz( img ) ;
-}
-
-long cdecl RaIs15Bits(void)
-{
- long is_15bits = 0 ;
-
- if ( nb_plane == 16 ) is_15bits = RVBOrg.Is15Bits ;
-
- return( is_15bits ) ;
-}
-
-void cdecl RaTCConvert(MFDB *img)
-{
- tc_convert( img ) ;
-}
-
-void cdecl RaTCInvConvert(MFDB *img)
-{
- tc_invconvert( img ) ;
-}
-
-void cdecl RaInd2RasterInit(MFDB *out, long width)
-{
- int raz_done = 0 ;
-
- i2r_init( out, (short)width, raz_done ) ;
-}
-
-void cdecl RaInd2Raster(unsigned char *indexes, long nb_indexes)
-{
- i2r_data = indexes ;
- i2r_nb = nb_indexes ;
- ind2raster() ;
-}
-
-void cdecl RaRaster2Ind(short *pt_raster, long nb_pts, long nplans, unsigned char *out)
-{
- raster2ind( (int*)pt_raster, out, nb_pts, (short)nplans ) ;
-}
-
-unsigned char * cdecl RaGetTOS2VDIArray(long nplanes)
-{
- return( get_pttos2vdi( (short)nplanes ) ) ;
-}
-
-unsigned char * cdecl RaGetVDI2TOSArray(long nplanes)
-{
- return( get_ptvdi2tos( (short)nplanes ) ) ;
-}
-
-unsigned long cdecl RaGetImgSize(long width, long height, long nplanes)
-{
- return( (unsigned long) img_size( (int)width, (int)height, (int)nplanes ) ) ;
-}
-
-long cdecl RaRasterAlloc(MFDB *raster)
-{
- size_t size ;
-
- size = img_size( raster->fd_w, raster->fd_h, raster->fd_nplanes ) ;
- raster->fd_addr = Xalloc( size ) ;
- if ( raster->fd_addr )
- {
- raster->fd_wdwidth = raster->fd_w / 16 ;
- if ( raster->fd_w % 16 ) raster->fd_wdwidth++ ;
-
- return( 0 ) ;
- }
-
- return( -1 ) ; /* Erreur */
-}
-
-void cdecl RaRasterFree(MFDB *raster)
-{
- if ( raster->fd_addr ) Xfree( raster->fd_addr ) ;
- memset( raster, 0, sizeof(MFDB) ) ;
-}
-
-void cdecl RaTC15RemapColors(REMAP_COLORS *rc)
-{
- TC15RemapColors( rc ) ;
-}
-
-void cdecl RaTC16RemapColors(REMAP_COLORS *rc)
-{
- TC16RemapColors( rc ) ;
-}
-
-void cdecl RaTC32RemapColors(REMAP_COLORS *rc)
-{
- TC32RemapColors( rc ) ;
-}
-
-void cdecl RaRasterRotateGetDstMFDB(MFDB *in, MFDB *out, long angle)
-{
- float cosinus, sinus ;
-
- raster_rgetdstmfdb( (int)angle, in, out, &cosinus, &sinus ) ;
-}
-
-long cdecl RaRasterRotate(MFDB *in, MFDB *out, long angle, long flags)
-{
- LDV_STATUS status ;
- int ret ;
-
- if ( flags & 0x01L ) /* Progression */
- ret = raster_rotate( in, out, (int) angle, LdvProg ) ;
- else
- ret = raster_rotate( in, out, (int) angle, NULL ) ;
-
- switch( ret )
- {
- case 0 : status = ELDV_NOERROR ;
- break ;
- case -1 : status = ELDV_NOTENOUGHMEMORY ;
- break ;
- case 1 : status = ELDV_CANCELLED ;
- break ;
- default : status = ELDV_GENERALFAILURE ;
- break ;
- }
-
- return( (long)status ) ;
-}
-
-void cdecl GEMMessageLoop(void *msg)
-{
- EVENT event ;
-
- memcpy( &event.ev_mmgpbuf, msg, sizeof(event.ev_mmgpbuf) ) ;
- GeneralMesagHandler( &event ) ;
-}
-
-char* cdecl CoGetLDVPath(void)
-{
- return( config.path_ldv ) ;
-}
-
-char* cdecl CoGetCurrentLanguage(void)
-{
- return( config.language ) ;
-}
-
-unsigned long cdecl CoGetFunctionOptimizations(void *function)
-{
- unsigned long code = 0 ;
-
- if ( MachineInfo.cpu >= 30L )
- {
- if ( ( function == (void *)Vapi->MeSCopyMemory16 ) ||
- ( function == (void *)Vapi->MeSCopyMemory32 ) ||
- ( function == (void *)Vapi->RaRasterRotate ) ||
- ( function == (void *)Vapi->RaInd2Raster )
- ) code |= 0x01 ;
- }
-
- return( code ) ;
-}
-
-unsigned long cdecl CoGetProcessors(void)
-{
- unsigned long pmask = 0 ;
-
- if ( (MachineInfo.cpu >= 30L) && ((config.ldv_options & LDVO_HIDE030) == 0) )
- pmask |= CO_HAS_030 ;
-
- if ( get_fpu() && ((config.ldv_options & LDVO_HIDEFPU) == 0) )
- pmask |= CO_HAS_FPU ;
-
- if ( DspInfo.type && ((config.ldv_options & LDVO_HIDEDSP) == 0) )
- pmask |= CO_HAS_DSP ;
-
- return pmask ;
-}
-
-long cdecl InOpen(char *file)
-{
- return( (long) OpenIni( file ) ) ;
-}
-
-long cdecl InClose(HINI h_ini)
-{
- return( CloseIni( h_ini ) ) ;
-}
-
-long cdecl InSaveAndClose(HINI h_ini, char *new_name)
-{
- return( SaveAndCloseIni( h_ini, new_name ) ) ;
-}
-
-long cdecl InGetKey(HINI h_ini, char *section, char *key, char *val_key)
-{
- return( GetIniKey( h_ini, section, key, val_key ) ) ;
-}
-
-long cdecl InSetKey(HINI h_ini, char *section, char *key, char *val_key)
-{
- return( SetIniKey( h_ini, section, key, val_key ) ) ;
-}
-
-long cdecl InGetOrSetKey(HINI h_ini, char *section, char *key, char *val_default_key)
-{
- return( GetOrSetIniKey( h_ini, section, key, val_default_key ) ) ;
-}
-
-long cdecl InGetKeyFromFile(char *file, char *section, char *key, char *val_key)
-{
- return GetIniKeyFromFile( file, section, key, val_key ) ;
-}
-
-void cdecl MeSCopyMemory8(void *dst, void *src, unsigned long nb_elems_dst, unsigned long nb_elems_src)
-{
- asm_smemcpy8( dst, src, nb_elems_dst, nb_elems_src ) ;
-}
-
-void cdecl MeSCopyMemory16(void *dst, void *src, unsigned long nb_elems_dst, unsigned long nb_elems_src)
-{
- asm_smemcpy16( dst, src, nb_elems_dst, nb_elems_src ) ;
-}
-
-void cdecl MeSCopyMemory32(void *dst, void *src, unsigned long nb_elems_dst, unsigned long nb_elems_src)
-{
- asm_smemcpy32( dst, src, nb_elems_dst, nb_elems_src ) ;
-}
-
-void cdecl Me030SCopyMemory8(void *dst, void *src, unsigned long nb_elems_dst, unsigned long nb_elems_src)
-{
- asm030_smemcpy8( dst, src, nb_elems_dst, nb_elems_src ) ;
-}
-
-void cdecl Me030SCopyMemory16(void *dst, void *src, unsigned long nb_elems_dst, unsigned long nb_elems_src)
-{
- asm030_smemcpy16( dst, src, nb_elems_dst, nb_elems_src ) ;
-}
-
-void cdecl Me030SCopyMemory32(void *dst, void *src, unsigned long nb_elems_dst, unsigned long nb_elems_src)
-{
- asm030_smemcpy32( dst, src, nb_elems_dst, nb_elems_src ) ;
-}
-
-unsigned long cdecl LoGetLogLevel(void)
-{
- return LoggingGetLevel() ;
-}
-
-#ifdef __NO_LOGGING
-#pragma warn -par
-long cdecl LoDoLog(unsigned long level, char* format, ...)
-{
- return 0 ;
-}
-#pragma warn +par
-#else
-long cdecl LoDoLog(unsigned long level, char* format, ...)
-{
- va_list argp ;
- long r ;
-
- va_start(argp, format) ;
- r = LoggingvDo(level, format, argp) ;
- va_end(argp) ;
-
- return r ;
-}
-#endif
-
-VAPI *LDVInitVAPI(void)
-{
- if ( Vapi == NULL )
- {
- Vapi = (VAPI *) Xcalloc( 1, sizeof(VAPI) ) ;
- if ( Vapi )
- {
- Vapi->Header.Version = VAPI_LDVVERSION ;
- Vapi->Header.StrSize = sizeof(VAPI) ;
- LoggingDo(LL_INFO, "VAPI Version: %02x.%02x", Vapi->Header.Version >> 8, Vapi->Header.Version & 0xFF) ;
- LoggingDo(LL_INFO, "VAPI interface size:%d bytes", Vapi->Header.StrSize) ;
- Vapi->Header.Global = _GemParBlk.global ;
- Vapi->Header.GEMMessageLoop = GEMMessageLoop ;
-
- /* Progress Interface */
- Vapi->PrSetProg = PrSetProg ;
- Vapi->PrOptimize = PrOptimize ;
- Vapi->PrSetText = PrSetText ;
- Vapi->PrSetProgEx = PrSetProgEx ;
-
- /* Raster Interface */
- Vapi->RaImgWhite = RaImgWhite ;
-
- Vapi->RaIs15Bits = RaIs15Bits ;
- Vapi->RaTCInvConvert = RaTCInvConvert ;
- Vapi->RaTCConvert = RaTCConvert ;
-
- Vapi->RaInd2RasterInit = RaInd2RasterInit ;
- Vapi->RaInd2Raster = RaInd2Raster ;
- Vapi->RaRaster2Ind = RaRaster2Ind ;
-
- Vapi->RaGetTOS2VDIArray = RaGetTOS2VDIArray ;
- Vapi->RaGetVDI2TOSArray = RaGetVDI2TOSArray ;
-
- Vapi->RaGetImgSize = RaGetImgSize ;
- Vapi->RaRasterAlloc = RaRasterAlloc ;
- Vapi->RaRasterFree = RaRasterFree ;
-
- Vapi->RaTC15RemapColors = RaTC15RemapColors ;
- Vapi->RaTC16RemapColors = RaTC16RemapColors ;
- Vapi->RaTC32RemapColors = RaTC32RemapColors ;
-
- Vapi->RaRasterRotateGetDstMFDB = RaRasterRotateGetDstMFDB ;
- Vapi->RaRasterRotate = RaRasterRotate ;
-
- /* Config Interface */
- Vapi->CoGetLDVPath = CoGetLDVPath ;
- Vapi->CoGetCurrentLanguage = CoGetCurrentLanguage ;
- Vapi->CoGetFunctionOptimizations = CoGetFunctionOptimizations ;
- Vapi->CoGetProcessors = CoGetProcessors ;
-
- /* INI Interface */
- Vapi->InOpen = InOpen ;
- Vapi->InClose = InClose ;
- Vapi->InSaveAndClose = InSaveAndClose ;
- Vapi->InGetKey = InGetKey ;
- Vapi->InSetKey = InSetKey ;
- Vapi->InGetOrSetKey = InGetOrSetKey ;
- Vapi->InGetKeyFromFile = InGetKeyFromFile ;
-
- /* MEM Interface */
- if ( MachineInfo.cpu >= 30L )
- {
- Vapi->MeSCopyMemory8 = Me030SCopyMemory8 ;
- Vapi->MeSCopyMemory16 = Me030SCopyMemory16 ;
- Vapi->MeSCopyMemory32 = Me030SCopyMemory32 ;
- }
- else
- {
- Vapi->MeSCopyMemory8 = MeSCopyMemory8 ;
- Vapi->MeSCopyMemory16 = MeSCopyMemory16 ;
- Vapi->MeSCopyMemory32 = MeSCopyMemory32 ;
- }
-
- /* Logging Interface */
- Vapi->LoDoLog = LoDoLog ;
- Vapi->LoGetLogLevel = LoGetLogLevel ;
- }
- }
-
- return( Vapi ) ;
-}
-
-int LDVSetValueFromString(char *buf, int type, LDV_BASICPARAM *p)
-{
- int set = 1 ;
-
- switch( type )
- {
- case LDVT_SHORT : p->s = atoi( buf ) ;
- break ;
-
- case LDVT_FLOAT : p->f = atof( buf ) ;
- break ;
-
- default : set = 0 ;
- break ;
- }
-
- return( set ) ;
-}
-
-int LDVGetIniSpec(char *base_path, LDV_MODULE *ldv_module)
-{
- HINI hini ;
- int err = 0 ;
- int i, max_len ;
- char name[PATH_MAX] ;
- char *point ;
- char short_name[16] ;
- char long_name[32] ;
- char description[80] ;
- char buf[200] ;
-
- point = strrchr( ldv_module->FileName, '.' ) ;
- if ( point ) *point = 0 ;
- sprintf( name, "%s\\%s\\%s.INI", base_path, config.language, ldv_module->FileName ) ;
- if ( !FileExist( name ) ) sprintf( name, "%s\\%s.INI", base_path, ldv_module->FileName ) ;
- hini = OpenIni( name ) ;
- if ( ( hini != NULL ) && FileExist( name ) )
- {
- /* ShortName */
- buf[0] = 0 ;
- GetIniKey( hini, "Informations", "ShortName", buf ) ;
- max_len = (int) sizeof(short_name) - 1 ;
- if ( strlen( buf ) > max_len ) buf[max_len] = 0 ;
- strcpy( short_name, buf ) ;
-
- /* LongName */
- buf[0] = 0 ;
- GetIniKey( hini, "Informations", "LongName", buf ) ;
- max_len = (int) sizeof(long_name) - 1 ;
- if ( strlen( buf ) > max_len ) buf[max_len] = 0 ;
- strcpy( long_name, buf ) ;
-
- /* Description */
- buf[0] = 0 ;
- GetIniKey( hini, "Informations", "Description", buf ) ;
- max_len = (int) sizeof(description) - 1 ;
- if ( strlen( buf ) > max_len ) buf[max_len] = 0 ;
- strcpy( description, buf ) ;
-
- ldv_module->IniSpec.ShortName = NULL ;
- ldv_module->IniSpec.LongName = NULL ;
- ldv_module->IniSpec.Description = NULL ;
- max_len = 1 + (int) strlen( short_name ) ;
- max_len += 1 + (int) strlen( long_name ) ;
- max_len += 1 + (int) strlen( description ) ;
- ldv_module->IniSpec.ShortName = (char *) Xalloc( max_len ) ;
- if ( ldv_module->IniSpec.ShortName )
- {
- strcpy( ldv_module->IniSpec.ShortName, short_name ) ;
- strcpy( ldv_module->IniSpec.ShortName + 1 + strlen( short_name ), long_name ) ;
- strcpy( ldv_module->IniSpec.ShortName + 1 + strlen( short_name ) + 1 + strlen( long_name ), description ) ;
- ldv_module->IniSpec.LongName = ldv_module->IniSpec.ShortName + 1 + strlen( short_name ) ;
- ldv_module->IniSpec.Description = ldv_module->IniSpec.LongName + 1 + strlen( long_name ) ;
- }
-
- /* Parameters */
- for ( i = 0; i < LDVNBMAX_PARAMETERS; i++ )
- {
- /* Name */
- buf[0] = 0 ;
- sprintf( name, "Parameter%d", 1 + i ) ;
- GetIniKey( hini, name, "Name", buf ) ;
- max_len = (int) sizeof(ldv_module->IniSpec.Params[i].Name) - 1 ;
- if ( strlen( buf ) > max_len ) buf[max_len] = 0 ;
- strcpy( ldv_module->IniSpec.Params[i].Name, buf ) ;
-
- /* Type */
- buf[0] = 0 ;
- GetIniKey( hini, name, "Type", buf ) ;
- ldv_module->IniSpec.Params[i].Type = atoi( buf ) ;
-
- /* MinValue */
- buf[0] = 0 ;
- GetIniKey( hini, name, "MinValue", buf ) ;
- LDVSetValueFromString( buf, ldv_module->IniSpec.Params[i].Type, &ldv_module->IniSpec.Params[i].MinValue ) ;
-
- /* DefaultValue */
- buf[0] = 0 ;
- GetIniKey( hini, name, "DefaultValue", buf ) ;
- LDVSetValueFromString( buf, ldv_module->IniSpec.Params[i].Type, &ldv_module->IniSpec.Params[i].DefaultValue ) ;
-
- /* MaxValue */
- buf[0] = 0 ;
- GetIniKey( hini, name, "MaxValue", buf ) ;
- LDVSetValueFromString( buf, ldv_module->IniSpec.Params[i].Type, &ldv_module->IniSpec.Params[i].MaxValue ) ;
-
- /* FloatIncrement */
- buf[0] = 0 ;
- GetIniKey( hini, name, "FloatIncrement", buf ) ;
- ldv_module->IniSpec.Params[i].FloatIncrement = atof( buf ) ;
-
- /* Verification de la validite */
- if ( ldv_module->IniSpec.Params[i].MinValue.s == ldv_module->IniSpec.Params[i].MaxValue.s )
- ldv_module->IniSpec.Params[i].Name[0] = 0 ; /* Ignorer ce parametre */
- }
-
- CloseIni( hini ) ;
- }
- else err = 1 ;
- if ( point ) *point ='.' ;
-
- return( err ) ;
-}
-
-void LDVReleaseInterface(LDV_MODULE *mod, int iid)
-{
- void *old_interface = NULL ;
-
- if ( mod && ( mod->Infos.Type & iid ) )
- {
- switch( iid )
- {
- case TLDV_MODIFYIMG : old_interface = mod->IModifImg ;
- mod->IModifImg = NULL ;
- break ;
-
- case TLDV_LOADIMG : old_interface = mod->ILoadImg ;
- mod->ILoadImg = NULL ;
- break ;
-
- case TLDV_SAVEIMG : old_interface = mod->ISaveImg ;
- mod->ISaveImg = NULL ;
- break ;
- }
- }
-
- if ( old_interface )
- {
- Xfree( old_interface ) ;
- mod->NbReferences-- ;
- }
-}
-
-void *LDVGetInterface(LDV_MODULE *mod, int iid)
-{
- LDG *ldg ;
- void *interface = NULL ;
-
- if ( mod && ( mod->Infos.Type & iid ) )
- {
- ldg = mod->Ldg ;
- switch( iid )
- {
- case TLDV_MODIFYIMG : if ( mod->IModifImg ) LDVReleaseInterface( mod, iid ) ;
- mod->IModifImg = (ILDVModifImg *) Xcalloc( 1, sizeof(ILDVModifImg) ) ;
- if ( mod->IModifImg )
- {
- mod->IModifImg->PreRun = ldg_find( "PreRun", ldg ) ;
- mod->IModifImg->Run = ldg_find( "Run", ldg ) ;
- mod->IModifImg->Preview = ldg_find( "Preview", ldg ) ;
- mod->IModifImg->GetParams = ldg_find( "GetParams", ldg ) ;
- }
- interface = mod->IModifImg ;
- break ;
-
- case TLDV_LOADIMG : if ( mod->ILoadImg ) LDVReleaseInterface( mod, iid ) ;
- mod->ILoadImg = (ILDVLoadImg *) Xcalloc( 1, sizeof(ILDVLoadImg) ) ;
- if ( mod->ILoadImg )
- {
- }
- interface = mod->ILoadImg ;
- break ;
-
- case TLDV_SAVEIMG : if ( mod->ISaveImg ) LDVReleaseInterface( mod, iid ) ;
- mod->ISaveImg = (ILDVSaveImg *) Xcalloc( 1, sizeof(ILDVSaveImg) ) ;
- if ( mod->ISaveImg )
- {
- }
- interface = mod->ISaveImg ;
- break ;
- }
- }
-
- if ( interface ) mod->NbReferences++ ;
-
- return( interface ) ;
-}
-
-void LDVReleaseAllInterfaces(LDV_MODULE *ldv_module)
-{
- short index ;
-
- for ( index = 0; index < sizeof(ListTypes)/sizeof(short); index++ )
- LDVReleaseInterface( ldv_module, ListTypes[index] ) ;
-}
-
-void LDVGetAllInterfaces(LDV_MODULE *ldv_module)
-{
- short index ;
-
- for ( index = 0; index < sizeof(ListTypes)/sizeof(short); index++ )
- LDVGetInterface( ldv_module, ListTypes[index] ) ;
-}
-
-void LDVUnloadFunctions(LDV_MODULE *ldv_module)
-{
- LDVReleaseAllInterfaces( ldv_module ) ;
- ldg_term( ap_id, ldv_module->Ldg ) ;
- ldv_module->Ldg = NULL ;
-}
-
-LDV_STATUS LDVInit(char *file, LDV_MODULE *ldv_module, int minimal_infos)
-{
- LDV_INFOS *ldv_infos ;
- LDG *ldg ;
- LDV_STATUS err = ELDV_NOERROR ;
-#if !defined(__NO_LOGGING)
- short ver ;
-#endif
- char *slash, *lname = file ;
- char base_path[PATH_MAX] ;
-
- if ( minimal_infos )
- {
- if ( ldv_module->FileName ) Xfree( ldv_module->FileName ) ;
- memset( ldv_module, 0, sizeof(LDV_MODULE) ) ;
- }
-
- slash = strrchr( file, '\\' ) ;
- if ( slash )
- {
- *slash = 0 ;
- strcpy( base_path, file ) ;
- *slash = '\\' ;
- lname = 1 + slash ;
- }
-
- if ( ldv_module->FileName )
- {
- if ( strlen( ldv_module->FileName ) < strlen( lname ) )
- {
- Xfree( ldv_module->FileName ) ;
- ldv_module->FileName = Xalloc( 1 + strlen( lname ) ) ;
- if ( ldv_module->FileName == NULL ) return( ELDV_NOTENOUGHMEMORY ) ;
- }
- strcpy( ldv_module->FileName, lname ) ;
- }
- else
- {
- ldv_module->FileName = Xalloc( 1 + strlen( lname ) ) ;
- if ( ldv_module->FileName == NULL ) return( ELDV_NOTENOUGHMEMORY ) ;
- strcpy( ldv_module->FileName, lname ) ;
- }
-
- /* Workaround for Mint/Aranym: if libpng is not closed, ldg_exec will freeze */
- cpu_png_terminate() ;
- ldg = ldg_exec( ap_id, file ) ;
- if ( ldg )
- {
- ldv_module->Ldg = ldg ;
-
- ldv_module->GetLDVCapabilities = ldg_find( "GetLDVCapabilities", ldg ) ;
- ldv_module->Infos.StrSize = sizeof(ldv_module->Infos) ;
- if ( ldv_module->GetLDVCapabilities ) ldv_infos = ldv_module->GetLDVCapabilities( Vapi ) ;
- else err = ELDV_GENERALFAILURE ;
- if ( LDV_SUCCESS( err ) && ldv_infos )
- {
- if ( ldv_infos->StrSize <= ldv_module->Infos.StrSize ) memcpy( &ldv_module->Infos, ldv_infos, ldv_infos->StrSize ) ;
- else err = ELDV_GENERALFAILURE ;
- }
- else
- err = ELDV_GENERALFAILURE ;
- ldv_module->Version = ldg->vers ;
-#if !defined(__NO_LOGGING)
- ver = ldg->vers ;
-#endif
- }
- else LoggingDo(LL_ERROR, "Failed to exec ldg %s", file);
-
- if ( !err )
- {
- if ( minimal_infos )
- {
- LDVGetIniSpec( base_path, ldv_module ) ;
- LDVUnloadFunctions( ldv_module ) ;
- }
- else LDVGetAllInterfaces( ldv_module ) ;
- }
-
-
-#if !defined(__NO_LOGGING)
- if (err)
- LoggingDo(LL_INFO, "Loading LDV %12s returned %ld", lname, err) ;
- else
- LoggingDo(LL_INFO, "Loading LDV %12s(v%x.%02x)...OK", lname, ver >> 8, ver & 0xFF) ;
-#endif
-
- return( err ) ;
-}
-
-LDV_STATUS LDVLoadFunctions(char *path, LDV_MODULE *mod)
-{
- char filename[PATH_MAX] ;
-
- sprintf( filename, "%s\\%s", path, mod->FileName ) ;
- return( LDVInit( filename, mod, 0 ) ) ;
-}
-
-LDV_CAPS *LDVGetNPlanesCaps(LDV_MODULE *mod, int nplanes)
-{
- LDV_CAPS *caps ;
-
- caps = &mod->Infos.Caps[0] ;
- while ( caps->NbPlanes )
- {
- if ( caps->NbPlanes == nplanes ) break ;
- else caps++ ;
- }
-
- if ( caps->NbPlanes == 0 ) caps = NULL ;
-
- return( caps ) ;
-}
-
-int add_ldv(FR_CDATA* fr_cdata)
-{
- /* Should always be true */
- if ( NumModule < NbModules )
- if ( LDVInit( fr_cdata->filename, &Modules[NumModule], 1 ) == 0 ) NumModule++ ;
-
- return 0 ;
-}
-
-LDV_MODULE *LDVGetModuleList(char *path, int *nb_ldv)
-{
- FR_DATA fr_data ;
-
- fr_data.long_names = 0 ; /* Better not use long filenames here, old OSes would report no files */
- fr_data.path = path ;
- fr_data.mask = "*.LDV" ;
- fr_data.log_file = NULL ;
- fr_data.user_func = NULL ;
- fr_data.user_data = NULL ;
-
- Modules = NULL ;
- NbModules = (int) count_files( 0, &fr_data ) ;
- if ( NbModules > 0 )
- {
- Vapi = LDVInitVAPI() ;
-
- /* Last module (not valid) will be zeroed */
- NumModule = 0 ;
- Modules = (LDV_MODULE *) Xcalloc( 1+NbModules, sizeof(LDV_MODULE) ) ;
- fr_data.long_names = 0 ;
- fr_data.path = path ;
- fr_data.mask = "*.LDV" ;
- fr_data.log_file = NULL ;
- fr_data.user_func = add_ldv ;
- fr_data.user_data = NULL ;
- if ( Modules ) find_files( &fr_data ) ;
- else NbModules = 0 ;
- }
-
- if ( nb_ldv ) *nb_ldv = NbModules ;
-
- return( Modules ) ;
-}
-
-void LDVFreeModuleList(LDV_MODULE *module_list)
-{
- LDV_MODULE *mod ;
- int i ;
-
- mod = module_list ;
- for ( i = 0; i < NbModules; i++, mod++ )
- {
- if ( mod->IniSpec.ShortName ) Xfree( mod->IniSpec.ShortName ) ;
- if ( mod->FileName ) Xfree( mod->FileName ) ;
- if ( mod->Ldg ) LDVUnloadFunctions( mod ) ;
- }
-
- Xfree( module_list ) ;
- if ( Vapi ) Xfree( Vapi ) ;
- Vapi = NULL ;
-}
-
-LDV_MODULE *GetLdvByLdg(LDV_MODULE *ldv_list, LDG *ldg)
-{
- LDV_MODULE *ldv_module = NULL ;
- LDV_MODULE *cldv = ldv_list ;
-
- if ( ldv_list )
- {
- while ( cldv->Ldg && ( ldv_module == NULL ) )
- {
- if ( cldv->Ldg == ldg ) ldv_module = cldv ;
- else cldv++ ;
- }
- }
-
- return( ldv_module ) ;
-}
-
-LDV_STATUS LDVAlloc(LDV_IMAGE *img)
-{
- LDV_STATUS err = ELDV_NOERROR ;
-
- if ( img->Raster.fd_w && img->Raster.fd_h )
- {
- img->Raster.fd_addr = img_alloc( img->Raster.fd_w, img->Raster.fd_h,img->Raster.fd_nplanes ) ;
- if ( img->Raster.fd_addr == NULL )
- err = ELDV_NOTENOUGHMEMORY ;
- else
- {
- img->Raster.fd_wdwidth = img->Raster.fd_w / 16 ;
- if ( img->Raster.fd_w % 16 ) img->Raster.fd_wdwidth++ ;
- }
- }
-
- if ( img->Palette.NbColors > 0 )
- {
- img->Palette.Pal = Xcalloc( img->Palette.NbColors, sizeof(VDI_ELEMENTPAL) ) ;
- if ( img->Palette.Pal == NULL ) err = ELDV_NOTENOUGHMEMORY ;
- }
-
- return( err ) ;
-}
-
-int GetBestImgFormat(LDV_CAPS *caps)
-{
- int img_format ;
-
- switch( caps->NbPlanes )
- {
- case 1 :
- case 2 :
- case 4 :
- case 8 : if ( caps->Flags & LDVF_SPECFORMAT ) img_format = (int)LDVF_SPECFORMAT ;
- else
- if ( caps->Flags & LDVF_STDFORMAT ) img_format = (int)LDVF_STDFORMAT ;
- else
- if ( caps->Flags & LDVF_ATARIFORMAT ) img_format = (int)LDVF_ATARIFORMAT ;
- else img_format = (int)LDVF_ATARIFORMAT ;
- break ;
-
- case 16 :
- case 24 :
- case 32 : if ( caps->Flags & LDVF_SPECFORMAT ) img_format = (int)LDVF_SPECFORMAT ;
- else
- if ( caps->Flags & LDVF_ATARIFORMAT ) img_format = (int)LDVF_ATARIFORMAT ;
- else img_format = (int)LDVF_ATARIFORMAT ;
- break ;
-
- default : img_format = (int)LDVF_SPECFORMAT ;
- break ;
- }
-
- return( img_format ) ;
-}
-
-LDV_STATUS FormatLdvImgFromSpec(LDV_IMAGE *ldv_img, int new_format)
-{
- MFDB previous_img, std_img ;
- LDV_STATUS err = ELDV_NOERROR ;
-
- /* ldv_img->raster doit valoir LDVF_SPECFORMAT */
- if ( ldv_img->RasterFormat != LDVF_SPECFORMAT ) return( ELDV_GENERALFAILURE ) ;
-
- memcpy( &previous_img, &ldv_img->Raster, sizeof(MFDB) ) ;
- if ( ldv_img->RasterFormat != new_format )
- {
- switch( new_format )
- {
- case LDVF_STDFORMAT : if ( ldv_img->Raster.fd_nplanes <= 8 )
- {
- memcpy( &std_img, &ldv_img->Raster, sizeof(MFDB) ) ;
- std_img.fd_addr = img_alloc( std_img.fd_w, std_img.fd_h, std_img.fd_nplanes ) ;
- if ( std_img.fd_addr == NULL ) err = ELDV_NOTENOUGHMEMORY ;
- if ( LDV_SUCCESS( err ) )
- {
- std_img.fd_stand = 1 ;
- vr_trnfm( handle, &ldv_img->Raster, &std_img ) ;
- Xfree( ldv_img->Raster.fd_addr ) ;
- memcpy( &ldv_img->Raster, &std_img, sizeof(MFDB) ) ;
- }
- }
- else
- err = ELDV_GENERALFAILURE ;
- break ;
-
- case LDVF_ATARIFORMAT : if ( ldv_img->Raster.fd_nplanes <= 8 )
- {
- if ( MakeMFDBClassicAtari( &ldv_img->Raster, NULL ) != 0 )
- err = ELDV_NOTENOUGHMEMORY ;
- }
- else if ( UseStdVDI ) tc_invconvert( &ldv_img->Raster ) ;
- break ;
-
- default : err = ELDV_GENERALFAILURE ;
- break ;
- }
- if ( LDV_SUCCESS( err ) ) ldv_img->RasterFormat = (short)new_format ;
- }
-
- return( err ) ;
-}
-
-LDV_STATUS FormatLdvImgToSpec(LDV_IMAGE *ldv_img)
-{
- MFDB img ;
- LDV_STATUS err = ELDV_NOERROR ;
-
- switch( ldv_img->RasterFormat )
- {
- case LDVF_SPECFORMAT : err = ELDV_NOERROR ;
- break ;
-
- case LDVF_STDFORMAT : if ( ldv_img->Raster.fd_nplanes <= 8 )
- {
- memcpy( &img, &ldv_img->Raster, sizeof(MFDB) ) ;
- img.fd_addr = img_alloc( img.fd_w, img.fd_h, img.fd_nplanes ) ;
- if ( img.fd_addr == NULL ) err = ELDV_NOTENOUGHMEMORY ;
- if ( LDV_SUCCESS( err ) )
- {
- img.fd_stand = 0 ;
- vr_trnfm( handle, &ldv_img->Raster, &img ) ;
- Xfree( ldv_img->Raster.fd_addr ) ;
- memcpy( &ldv_img->Raster, &img, sizeof(MFDB) ) ;
- }
- }
- else
- err = ELDV_GENERALFAILURE ;
- break ;
-
- case LDVF_ATARIFORMAT : if ( UseStdVDI && ( ldv_img->Raster.fd_nplanes <= 8 ) )
- {
- memcpy( &img, &ldv_img->Raster, sizeof(MFDB) ) ;
- img.fd_addr = img_alloc( img.fd_w, img.fd_h, img.fd_nplanes ) ;
- if ( img.fd_addr )
- {
- img.fd_stand = 1 ;
- ClassicAtari2StdVDI( &ldv_img->Raster, &img ) ;
- ldv_img->Raster.fd_stand = 0 ;
- vr_trnfm( handle, &img, &ldv_img->Raster ) ;
- Xfree( img.fd_addr ) ;
- }
- else
- err = ELDV_NOTENOUGHMEMORY ;
- }
- else if ( UseStdVDI ) tc_convert( &ldv_img->Raster ) ;
- break ;
-
- default : err = ELDV_GENERALFAILURE ;
- break ;
- }
-
- if ( LDV_SUCCESS( err ) ) ldv_img->RasterFormat = (int)LDVF_SPECFORMAT ;
-
- return( err ) ;
-}
-
-LDV_STATUS LDVDo(LDV_MODULE *ldv, LDV_PARAMS *pldv_params, LDV_IMAGE *pldv_img, int preview, LDV_PERF *perfs)
-{
- LDV_PARAMS ldv_params ;
- LDV_CAPS *caps ;
- ILDVModifImg *IModifImg = ldv->IModifImg ;
- LDV_IMAGE *ldv_img, img_sel, out ;
- LDV_STATUS err ;
- size_t t0, t00 ;
- int img_format ;
-
- if ( IModifImg == NULL ) return( ELDV_BADINTERFACE ) ;
- if ( preview ) perfs = NULL ;
- if ( perfs ) t00 = clock() ;
-
- ldv_img = pldv_img ;
- memcpy( &ldv_params, pldv_params, sizeof(LDV_PARAMS) ) ;
- caps = LDVGetNPlanesCaps( ldv, ldv_img->Raster.fd_nplanes ) ;
- if ( caps == NULL ) return( ELDV_NBPLANESNOTSUPPORTED ) ;
-
- if (
- ( ( ldv_params.x1 != 0 ) || ( ldv_params.y1 != 0 ) ||
- ( ldv_params.x2 != ldv_img->Raster.fd_w -1 ) || ( ldv_params.y2 != ldv_img->Raster.fd_h -1 )
- ) &&
- ( caps->Flags & LDVF_NOSELECTION )
- )
- {
- int xy[8] ;
-
- /* Dupliquer la selection, le LDV ne peut pas travailler sur une partie d'image */
- memcpy( &img_sel, ldv_img, sizeof(LDV_IMAGE) ) ;
- img_sel.Raster.fd_w = 1 + ldv_params.x2 - ldv_params.x1 ;
- img_sel.Raster.fd_h = 1 + ldv_params.y2 - ldv_params.y1 ;
- RaRasterAlloc( &img_sel.Raster ) ;
- if ( img_sel.Raster.fd_addr == NULL ) return( ELDV_NOTENOUGHMEMORY ) ;
- xy[0] = ldv_params.x1 ; xy[1] = ldv_params.y1 ;
- xy[2] = ldv_params.x2 ; xy[3] = ldv_params.y2 ;
- xy[4] = xy[5] = 0 ;
- xy[6] = img_sel.Raster.fd_w - 1 ;
- xy[7] = img_sel.Raster.fd_h - 1 ;
- vro_cpyfm( handle, S_ONLY, xy, &ldv_img->Raster, &img_sel.Raster ) ;
- ldv_img = &img_sel ;
- ldv_params.x1 = ldv_params.y1 = 0 ;
- ldv_params.x2 = img_sel.Raster.fd_w - 1 ;
- ldv_params.y2 = img_sel.Raster.fd_h - 1 ;
- }
- else memset( &img_sel, 0, sizeof(LDV_IMAGE) ) ;
-
- if ( perfs ) t0 = clock() ;
- img_format = GetBestImgFormat( caps ) ;
- err = FormatLdvImgFromSpec( ldv_img, img_format ) ;
- if ( perfs ) perfs->pre_ldv_ms = (1000L * (clock() - t0) ) / CLK_TCK ;
- if ( !LDV_SUCCESS( err ) ) return( err ) ;
-
- memset( &out, 0, sizeof(LDV_IMAGE) ) ;
- out.Raster.fd_nplanes = caps->NbPlanesOut ;
- out.RasterFormat = img_format ;
-
- if ( perfs ) t0 = clock() ;
- err = IModifImg->PreRun( ldv_img, &ldv_params, &out ) ;
- if ( perfs )
- {
- perfs->prerun_ms = (1000L * (clock() - t0) ) / CLK_TCK ;
- t0 = clock() ;
- }
-
- if ( LDV_SUCCESS( err ) )
- {
- if ( caps->Flags & LDVF_OPINPLACE )
- {
- memcpy( &out, ldv_img, sizeof(LDV_IMAGE) ) ;
- out.Raster.fd_nplanes = caps->NbPlanesOut ;
- }
- else
- {
- err = LDVAlloc( &out ) ;
- if ( !LDV_SUCCESS( err ) ) RaRasterFree( &img_sel.Raster ) ;
- }
- }
-
- if ( perfs ) perfs->pre_ldv_ms += (1000L * (clock() - t0) ) / CLK_TCK ;
- if ( LDV_SUCCESS( err ) )
- {
-#if !defined(__NO_LOGGING)
- int perf2log = ( LoggingGetLevel() >= LL_PERF ) ;
-
- if (perf2log)
- {
- char tmp[300], buf[100] ;
- int n ;
-
- sprintf(tmp, "Running LDV with w=%d, h=%d", out.Raster.fd_w, out.Raster.fd_h) ;
- for (n=0; n < ldv_params.NbParams; n++ )
- {
- sprintf(buf, ", P%d=%d", n, ldv_params.Param[n].s) ;
- strcat(tmp, buf) ;
- }
- LoggingDo(LL_DEBUG, tmp) ;
- }
-#endif
-
- if ( preview )
- {
-#if !defined(__NO_LOGGING)
- if (perf2log) t0 = clock() ;
-#endif
- if ( IModifImg->Preview ) err = IModifImg->Preview( ldv_img, &ldv_params, &out ) ;
- else err = ELDV_PREVIEWNOTSUPPORTED ;
-#if !defined(__NO_LOGGING)
- if (perf2log)
- LoggingDo(LL_PERF, "LDV Preview took %ldms", (1000L * (clock() - t0) ) / CLK_TCK) ;
-#endif
- }
- else
- {
- if ( IModifImg->Run )
- {
- int nflags ;
-
- if ( caps->Flags & LDVF_SUPPORTCANCEL ) nflags = 0 ;
- else nflags = CLOSER ; /* Pas d'annulation possible par defaut */
- if ( ( caps->Flags & LDVF_SUPPORTPROG ) && ( LdvProg == NULL ) )
- LdvProg = DisplayStdProg( "", "", "", nflags ) ;
- if ( LdvProg ) GWSetWindowCaption( LdvProg, "LDV ..." ) ;
- if ( perfs ) t0 = clock() ;
-#if !defined(__NO_LOGGING)
- if ( perf2log ) t0 = clock() ;
-#endif
- err = IModifImg->Run( ldv_img, &ldv_params, &out ) ;
- if ( perfs ) perfs->run_ms = (1000L * (clock() - t0) ) / CLK_TCK ;
-#if !defined(__NO_LOGGING)
- if (perf2log)
- LoggingDo(LL_PERF, "LDV Run took %ldms", (1000L * (clock() - t0) ) / CLK_TCK) ;
-#endif
- if ( ( caps->Flags & LDVF_SUPPORTPROG ) && LdvProg )
- GWDestroyWindow( LdvProg ) ;
- LdvProg = NULL ;
- }
- else
- err = ELDV_RUNNOTSUPPORTED ;
- }
-
- if ( LDV_SUCCESS( err ) )
- {
- if ( perfs ) t0 = clock() ;
- err = FormatLdvImgToSpec( &out ) ;
- if ( LDV_SUCCESS( err ) )
- {
- if ( img_sel.Raster.fd_addr )
- {
- int xy[8] ;
- int xs0, ys0, xd0, yd0, ws, hs, wd, hd, w, h ;
- int mode = S_ONLY ;
-
- if (mode_vswr == MD_TRANS) mode = S_OR_D ;
- else if (mode_vswr == MD_XOR) mode = S_XOR_D ;
- else if (mode_vswr == MD_ERASE) mode = NOTS_AND_D ;
- /* Replacer la selection dupliquee */
- /* Centrer le resultat sur le centre du bloc d'origine */
- wd = 1 + pldv_params->x2 - pldv_params->x1 ;
- hd = 1 + pldv_params->y2 - pldv_params->y1 ;
- ws = out.Raster.fd_w ;
- hs = out.Raster.fd_h ;
- if ( ws > wd )
- {
- w = wd ;
- xs0 = ( ws - w ) / 2 ;
- xd0 = 0 ;
- }
- else
- {
- w = ws ;
- xs0 = 0 ;
- xd0 = ( wd - w ) / 2 ;
- }
- if ( hs > hd )
- {
- h = hd ;
- ys0 = ( hs - h ) / 2 ;
- yd0 = 0 ;
- }
- else
- {
- h = hs ;
- ys0 = 0 ;
- yd0 = ( hd - h ) / 2 ;
- }
-
- xy[0] = xs0 ;
- xy[1] = ys0 ;
- xy[2] = xy[0] + w - 1 ;
- xy[3] = xy[1] + h - 1 ;
- xy[4] = pldv_params->x1 + xd0 ;
- xy[5] = pldv_params->y1 + yd0 ;
- xy[6] = xy[4] + w - 1 ;
- xy[7] = xy[5] + h - 1 ;
- vro_cpyfm( handle, mode, xy, &out.Raster, &pldv_img->Raster ) ;
- RaRasterFree( &img_sel.Raster ) ;
- if ( ( caps->Flags & LDVF_OPINPLACE ) == 0 ) Xfree( out.Raster.fd_addr ) ;
- }
- else
- {
- if ( ( caps->Flags & LDVF_OPINPLACE ) == 0 ) Xfree( ldv_img->Raster.fd_addr ) ;
- memcpy( &ldv_img->Raster, &out.Raster, sizeof(MFDB) ) ;
- }
- }
- if ( perfs ) perfs->post_ldv_ms = (1000L * (clock() - t0) ) / CLK_TCK ;
- }
- else
- {
- if ( ( caps->Flags & LDVF_OPINPLACE ) == 0 ) Xfree( out.Raster.fd_addr ) ;
- if ( out.Palette.Pal ) Xfree( out.Palette.Pal ) ;
- }
- }
-
- if ( perfs ) perfs->total_ms = (1000L * (clock() - t00) ) / CLK_TCK ;
-
- /* Run peut avoir modifie les valeurs des parametres */
- memcpy( &pldv_params->Param[0], &ldv_params.Param[0], LDVNBMAX_PARAMETERS*sizeof(LDV_BASICPARAM) ) ;
-
- return( err ) ;
-}
diff --git a/tools/vision/LDV/LDV.H b/tools/vision/LDV/LDV.H
deleted file mode 100644
index 36f9295..0000000
--- a/tools/vision/LDV/LDV.H
+++ /dev/null
@@ -1,150 +0,0 @@
-#ifndef __LDV
-#define __LDV
-
-#ifndef __LDG__
-#include
-#endif
-
-#ifndef __VAPI
-#include "ldv\vapi.h"
-#endif
-
-/* Codes d'erreurs */
-typedef long LDV_STATUS ; /* Type de status retourne */
-#define ELDV_NOERROR 0x0 /* Pas d'erreur */
-#define ELDV_INVALIDPARAMETER 0x1 /* Au moins un parametre transmis est invalide */
-#define ELDV_NBPLANESNOTSUPPORTED 0x2 /* Nombre de plans non supporte */
-#define ELDV_NOTENOUGHMEMORY 0x3 /* Memoire insuffisante */
-#define ELDV_PREVIEWNOTSUPPORTED 0x4 /* Preview non supportee */
-#define ELDV_RUNNOTSUPPORTED 0x5 /* Run non supporte (!) */
-#define ELDV_BADVAPIVERSION 0x6 /* VAPI absent ou mauvaise version */
-#define ELDV_IMGFORMATMISMATCH 0x7 /* Format d'image incompatible */
-#define ELDV_CANCELLED 0x8 /* Operation annulee par l'utilisateur (GetParams par exemple) */
-#define ELDV_BADINTERFACE 0x9 /* Impossible : ce LDV ne possede pas la bonne interface */
-#define ELDV_GENERALFAILURE 0xF /* Echec general, raison non precisee */
-
-
-/* Pour finir, une petite macro pour tester si */
-/* Une fonction LDV a retourne une erreur */
-#define LDV_SUCCESS(x) ((x) == ELDV_NOERROR)
-
-
-/* Types de LDV */
-#define TLDV_MODIFYIMG 0x01 /* Modificateur d'image : filtre, deformation, ... */
- /* Le nombre de plans de l'image reste inchange */
-#define TLDV_LOADIMG 0x02 /* Module de chargement d'image */
-#define TLDV_SAVEIMG 0x04 /* Module de sauvegarde d'image */
-
-/* Structure de definition du LDV */
-/* Pour un nombre de plans defini */
-/* Masques de bits pour le champ Flags */
-#define LDVF_STDFORMAT 0x00000001UL /* Donnees image au format standard */
-#define LDVF_ATARIFORMAT 0x00000002UL /* Donnees image au format ATARI (Falcon) */
-#define LDVF_SPECFORMAT 0x00000004UL /* Donnees image au format specifique a la machine */
-#define LDVF_SUPPORTPREVIEW 0x00000008UL /* Support de la pre-visualisation */
-#define LDVF_AFFECTPALETTE 0x00000010UL /* Le module affecte la palette (si NbPlanes <= 8) */
-#define LDVF_SUPPORTPROG 0x00000020UL /* Le module appelera la fonction de progression */
-#define LDVF_OPINPLACE 0x00000040UL /* Le module modifie la source (param out ignore) */
-#define LDVF_REALTIMEPARAMS 0x00000080UL /* Le module supporte la modification en temps reel */
- /* Des parametres (mode Preview) */
-#define LDVF_SUPPORTCANCEL 0x00000100UL /* Le module gere l'annulation (voir PrSetProgEx) */
-#define LDVF_NOSELECTION 0x00000200UL /* Le module ne peut pas g‚rer la selection */
-
-/* Cette structure definit ce que ce LDV sait faire, */
-/* Pour un nombre donne de plans en entree */
-typedef struct
-{
- char NbPlanes ; /* Nombre de plans de l'image : */
- /* 0 : Fin de cette structure */
- /* 1, 2, 4, 8, 16, 24, ou 32 */
-
- char NbPlanesOut ; /* Nombre de plans en sortie */
-
- unsigned long Flags ; /* LDVF_... */
-}
-LDV_CAPS ;
-
-/* Cette structure rassemble les infos du module qui sont */
-/* Suceptibles de pouvoir etre traduites dans d'autres langues */
-/* Un fichier .INI doit etre associe (voir SMP_LDV.INI pour exemple) */
-
-#define LDVNBMAX_PARAMETERS 4 /* Nombre maximal de parametres pouvant etre gere */
- /* Depuis VISION et passes au travers de LDV_PARAMS */
-
-typedef union
-{
- short s ;
- float f ;
-}
-LDV_BASICPARAM ;
-
-#define LDVT_SHORT 1
-#define LDVT_FLOAT 2
-typedef struct
-{
- char Name[1+15] ;
- char Type ;
- LDV_BASICPARAM MinValue ;
- LDV_BASICPARAM DefaultValue ;
- LDV_BASICPARAM MaxValue ;
- float FloatIncrement ;
-}
-LDV_DEF_PARAM ;
-
-typedef struct
-{
- short StrSize ; /* Taille de la structure LDV_INFOS */
- short Type ; /* TLDV_... */
- char Authors[1+45] ; /* Liste du ou des auteurs */
-
- LDV_CAPS Caps[10] ; /* Ce que ce LDV sait faire, pour */
- /* Chaque type d'image */
- /* Mettre cette structure a zero */
- /* Des que la liste est terminee */
- /* Un maximum de 9 elements utiles */
- /* Est donc disponible */
-
- char RFU[16] ; /* Usage futur */
-}
-LDV_INFOS ;
-
-typedef struct
-{
- short Red ; /* 0...1000 */
- short Green ; /* 0...1000 */
- short Blue ; /* 0...1000 */
-}
-VDI_ELEMENTPAL ;
-
-typedef struct
-{
- short NbColors ; /* Nombre d'index dans cette palette */
- VDI_ELEMENTPAL *Pal ; /* ATTENTION : Palette indexee sur les indices VDI */
-}
-LDV_PALETTE ;
-
-typedef struct
-{
- short x1, y1, x2, y2 ; /* Rectangle definissant la partie du MFDB a traiter */
- short NbParams ;
- LDV_BASICPARAM Param[LDVNBMAX_PARAMETERS] ;
- void *UserParam ; /* Peut etre utilise avec GetParams */
-}
-LDV_PARAMS ;
-
-/* Parametres d'entree de la fonction a effectuer par le LDV */
-typedef struct
-{
- short RasterFormat ; /* LDVF_STDFORMAT, LDVF_ATARIFORMAT ou LDVF_SPECFORMAT */
- /* VISION choisit automatiquement le format optimal en */
- /* Fonction des capacites du LDV fournies par la */
- /* Fonction GetLDVCapabilities */
-
- MFDB Raster ; /* Image */
-
- LDV_PALETTE Palette ; /* Structure fournie si Raster.fd_nplanes > 8 */
-}
-LDV_IMAGE ;
-
-
-#endif
diff --git a/tools/vision/LDV/LDVCOM.H b/tools/vision/LDV/LDVCOM.H
deleted file mode 100644
index 4ff68c5..0000000
--- a/tools/vision/LDV/LDVCOM.H
+++ /dev/null
@@ -1,102 +0,0 @@
-#ifndef __LDVCOM
-#define __LDVCOM
-
-#ifndef __LDV
-#include "ldv\ldv.h"
-#endif
-
-typedef struct
-{
- char *ShortName ; /* Nom court du module (15 carac. max) */
- char *LongName ; /* Nom long du module (31 carac. max) */
- char *Description ; /* Description du module (79 carac. max) */
-
- /* Definition des parametres pouvant etre applique */
- LDV_DEF_PARAM Params[LDVNBMAX_PARAMETERS] ;
-}
-LDV_INI_SPEC ;
-
-/* Interface pour la modification d'image */
-typedef struct
-{
- /* Permet a VISION d'allouer les ressources */
- /* Necessaires a la fonction assuree par le LDV */
- /* Renvoyer dans out->Raster les dimensions */
- /* Voulues et/ou renseigner le champ out->Palette.NbColors */
- /* Renvoyer dans params, la totalite de la zone a envoyer */
- /* Dans le Undo */
- LDV_STATUS cdecl (*PreRun)(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out) ;
-
- /* Effectue la fonction du LDV */
- /* VISION a deja alloue la memoire voulue grace a la fonction precedente */
- /* NE SURTOUT PAS ALLOUER OU LIBERER DE LA MEMOIRE QUI SERA UTILISEE PAR */
- /* VISION ! */
- LDV_STATUS cdecl (*Run)(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out) ;
-
- /* Identique a la fonction precedente, mais en mode Preview */
- LDV_STATUS cdecl (*Preview)(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out) ;
-
- /* Optionnel : Si cette fonction est presente, VISION l'appelera a la place */
- /* de la fonction interne pour parametrer le module */
- /* Si la valeur de retour est differente de ELDV_NOERROR, VISION consderera */
- /* Que la saisie a ete annulee (comme si vous aviez appuye sur "Cancel" dans */
- /* Le formulaire standard de saisie. */
- LDV_STATUS cdecl (*GetParams)(LDV_IMAGE *img, LDV_PARAMS *params, char *path) ;
-}
-ILDVModifImg ;
-
-typedef struct
-{
- long RFU[10] ;
-}
-ILDVLoadImg ;
-
-typedef struct
-{
- long RFU[10] ;
-}
-ILDVSaveImg ;
-
-typedef struct
-{
- LDG *Ldg ; /* Le module LDG */
-
- char *FileName ; /* Nom uniquement, sans le chemin */
- short Version ; /* Idem que Ldg->vers */
-
- LDV_INFOS Infos ; /* Informations sur ce module */
- LDV_INI_SPEC IniSpec ; /* Specifique au .INI */
-
- /* Indique a VISION ce que ce LDV sait faire */
- /* VISION fournit son interface de programmation vapi */
- LDV_INFOS * cdecl (*GetLDVCapabilities)(VAPI *vapi) ;
-
- int NbReferences ; /* Nombre de references en cours sur ce module */
- ILDVModifImg *IModifImg ; /* Interface pour le type TLDV_MODIFYIMG */
- ILDVLoadImg *ILoadImg ; /* Interface pour le type TLDV_LOADIMG */
- ILDVSaveImg *ISaveImg ; /* Interface pour le type TLDV_SAVEIMG */
- long RFUInterfaces[10] ; /* Interfaces de reserve */
-}
-LDV_MODULE ;
-
-typedef struct
-{
- unsigned long prerun_ms ;
- unsigned long pre_ldv_ms ;
- unsigned long run_ms ;
- unsigned long post_ldv_ms ;
- unsigned long total_ms ;
-}
-LDV_PERF ;
-
-LDV_CAPS *LDVGetNPlanesCaps(LDV_MODULE *mod, int nplanes) ;
-LDV_MODULE *LDVGetModuleList(char *path, int *nb_ldv) ;
-void LDVFreeModuleList(LDV_MODULE *module_list) ;
-LDV_MODULE *GetLdvByLdg(LDV_MODULE *ldv_list, LDG *ldg) ;
-LDV_STATUS LDVAlloc(LDV_IMAGE *img) ;
-LDV_STATUS LDVDo(LDV_MODULE *ldv, LDV_PARAMS *ldv_params, LDV_IMAGE *ldv_img, int preview, LDV_PERF *perfs) ;
-
-LDV_STATUS LDVLoadFunctions(char *path, LDV_MODULE *mod) ;
-void LDVUnloadFunctions(LDV_MODULE *mod) ;
-
-#endif
diff --git a/tools/vision/LDV/LIGHT.LDV b/tools/vision/LDV/LIGHT.LDV
deleted file mode 100644
index 8b35128..0000000
Binary files a/tools/vision/LDV/LIGHT.LDV and /dev/null differ
diff --git a/tools/vision/LDV/PIXEL.LDV b/tools/vision/LDV/PIXEL.LDV
deleted file mode 100644
index 446830f..0000000
Binary files a/tools/vision/LDV/PIXEL.LDV and /dev/null differ
diff --git a/tools/vision/LDV/ROTATE.LDV b/tools/vision/LDV/ROTATE.LDV
deleted file mode 100644
index 6b268c4..0000000
Binary files a/tools/vision/LDV/ROTATE.LDV and /dev/null differ
diff --git a/tools/vision/LDV/SRC/BW/BW.LDV b/tools/vision/LDV/SRC/BW/BW.LDV
deleted file mode 100644
index dcddb47..0000000
Binary files a/tools/vision/LDV/SRC/BW/BW.LDV and /dev/null differ
diff --git a/tools/vision/LDV/SRC/INVERT/INVERT.LDV b/tools/vision/LDV/SRC/INVERT/INVERT.LDV
deleted file mode 100644
index 9d29d3b..0000000
Binary files a/tools/vision/LDV/SRC/INVERT/INVERT.LDV and /dev/null differ
diff --git a/tools/vision/LDV/SRC/PIXEL/PIXEL.LDV b/tools/vision/LDV/SRC/PIXEL/PIXEL.LDV
deleted file mode 100644
index 446830f..0000000
Binary files a/tools/vision/LDV/SRC/PIXEL/PIXEL.LDV and /dev/null differ
diff --git a/tools/vision/LDV/SRC/YPERSC/YPERSC.LDV b/tools/vision/LDV/SRC/YPERSC/YPERSC.LDV
deleted file mode 100644
index b1a83ca..0000000
Binary files a/tools/vision/LDV/SRC/YPERSC/YPERSC.LDV and /dev/null differ
diff --git a/tools/vision/LDV/SRC/bhole/bhole.ldv b/tools/vision/LDV/SRC/bhole/bhole.ldv
deleted file mode 100644
index 3f923fa..0000000
Binary files a/tools/vision/LDV/SRC/bhole/bhole.ldv and /dev/null differ
diff --git a/tools/vision/LDV/SRC/bhole/bhole.lst b/tools/vision/LDV/SRC/bhole/bhole.lst
deleted file mode 100644
index 0ec1228..0000000
--- a/tools/vision/LDV/SRC/bhole/bhole.lst
+++ /dev/null
@@ -1,1054 +0,0 @@
-PASM 68040 Macro Assembler Version Dec 18 1992 (C) 91 Pure Software Page 1
-Source File: H:\PURE_C\PROJECTS\VISION\LDV\SRC\BHOLE\BHOLE.S
-
- 1 .IMPORT pre_cosin ; array of 2*ITRIGO_ARRAY_SIZE longs
- 2 .IMPORT pre_loffset ; long*
- 3 .EXPORT bh_xd, bh_yd, bh_rd2 ; long
- 4 .EXPORT bh_xs, bh_ys, bh_ref ; long
- 5 .EXPORT bh_xc, bh_yc ; long
- 6 .EXPORT bh_out_w, bh_out_h ; short
- 7 .EXPORT bh_in_w, bh_in_h ; short
- 8 .EXPORT bh_out_x, bh_out_y ; short
- 9 .EXPORT BHL32_68030,BHL16_68030,BHLInd_68030
- 10 .EXPORT BHL32_F68030,BHL16_F68030,BHLInd_F68030
- 11 .EXPORT lcosin_fpu
- 12
- 13 ITRIGO_ARRAY_SIZE EQU (1 << 14)
- 14 ITRIGO_ANGLE_MAX EQU (ITRIGO_ARRAY_SIZE-1)
- 15 QUARTER EQU (ITRIGO_ARRAY_SIZE/4)
- 16
- 17 ; The black hole transformation consists of:
- 18 ; Rotate the destination pixel around the black hole center
- 19 ; The closest we are to the black hole, the bigger the rotation angle is
- 20 ; We have 2 or 3 parts of computation angle for black hole transformation:
- 21 ; 1: Just before dividing the maximum possible angle (depending on LDV paramter Rotation angle) by:
- 22 ; CPU: the square of distance to black hole center
- 23 ; FPU: the distance to black hole center; here we need 68881 instruction FSQRT
- 24 ; So there are 3 parts in macro calculations:
- 25 ; 1. Before dividing by distance or its square
- 26 ; 1a. (FPU only) Compute distance
- 27 ; 3. Divide by either distance or its square and state if the resulting pixel is in source image
- 28 ; Dividing by distance instead of its square gives better visual results
- 29 MACRO BH_COMP_1
- 30 MOVE.L A6,D0 ; Remember A6=bh_xd
- 31 ADD.L D0,D0
- 32 ADDQ.L #1,D0
- 33 MOVE.L A5,D1 ; Remember A5=bh_rd2
- 34 ADD.L D0,D1 ; bh_rd2(D1)=1+2*bh_xd(D0)
- 35 MOVE.L bh_ref(PC),D2
- 36 MOVE.L D1,A5 ; Save bh_rd2, free D1
- 37 ADDQ.L #1,D1 ; We need bh_rd2+1 for divide
- 38 ENDM
- 39
- 40 MACRO BH_COMP_2 bail_out_addr
- 41 DIVU.L D1,D2 ; alpha(D2)=bh_ref/(1+bh_rd2)
- 42 ANDI.L #ITRIGO_ANGLE_MAX,D2 ; alpha &= ITRIGO_ANGLE_MAX
- 43
- 44 LSL.L #3,D2 ; D2=offset for pre_cosin array
- 45 MOVE.L A6,D0 ; D0=bh_xd
- 46 MOVE.L bh_yd(PC),D1 ; D1=bh_yd
- 47 MOVE.L 4(A2,D2.L),D3 ; A2->pre_cosin, D3.L=SIN(alpha)
- 48 MOVE.L (A2,D2.L),D2 ; A2->pre_cosin, D2.L=COS(alpha)
- 49
- 50 MOVEQ.L #16,D6 ; Prepare shifts/assume not in range
- 51
- 52 MOVE.L D0,D4
- 53 MULS.L D2,D4 ; D4=bh_xd * pre_cos[alpha]
- 54 MOVE.L D1,D5
- 55 MULS.L D3,D5 ; D5=bh_yd * pre_sin[alpha]
- 56 SUB.L D5,D4 ; D4=bh_xd * pre_cos[alpha] - bh_yd * pre_sin[alpha]
-PASM 68040 Macro Assembler Version Dec 18 1992 (C) 91 Pure Software Page 2
-Source File: H:\PURE_C\PROJECTS\VISION\LDV\SRC\BHOLE\BHOLE.S
-
- 57 ASR.L D6,D4
- 58 ADD.L bh_xc(PC),D4 ; D6=16, assume pixel not in range
- 59 BLT.S bail_out_addr ; xs < 0: not in range
- 60 CMP.W bh_in_w(PC),D4
- 61 BGE.S bail_out_addr ; xs >= bh_in_w: not in range
- 62 MOVE.L D4,A3 ; A3=bh_xs= (D4 >> 16)
- 63
- 64 MOVE.L D0,D4
- 65 MULS.L D3,D4 ; D4=bh_xd * pre_sin[alpha]
- 66 MOVE.L D1,D5
- 67 MULS.L D2,D5 ; D5=bh_yd * pre_cos[alpha]
- 68 ADD.L D5,D4 ; D4=bh_xd * pre_sin[alpha] + bh_yd * pre_cos[alpha]
- 69 ASR.L D6,D4
- 70 ADD.L bh_yc(PC),D4 ; D4.L=bh_ys
- 71 BLT.S bail_out_addr ; ys < 0: not in range
- 72 CMP.W bh_in_h(PC),D4
- 73 BGE.S bail_out_addr ; ys >= bh_in_h: not in range
- 74 MOVEQ.L #0,D6 ; pixel in range
- 75 ENDM
- 76
- 77 ; Macro for CPU 68030
- 78 MACRO BH_COMPUTE_CPU bail_out_addr
- 79 BH_COMP_1
- 80 BH_COMP_2 bail_out_addr
- 81 ENDM
- 82
- 83 ; Macro for using FPU
- 84 ; What we do with FPU is to compute the square root of D1 which
- 85 ; Is then the distance to the back hole center instead of its square
- 86 MACRO BH_COMPUTE_FPU bail_out_addr
- 87 BH_COMP_1
- 88 FMOVE.L D1,FP0
- 89 FSQRT FP0
- 90 FMOVE.L FP0,D1
- 91 BH_COMP_2 bail_out_addr
- 92 ENDM
- 93
- 94 ; Init parameters valid for the entire call
- 95 MACRO INIT_BHL
- 96 LEA.L pre_cosin,A2
- 97 MOVE.L pre_loffset,A4 ; A4-->preoffset
- 98 MOVE.L bh_rd2(PC),A5 ; A5=bh_rd2
- 99 MOVE.L bh_xd(PC),A6 ; A6=bh_xd
- 100 MOVE.W bh_out_w(PC),D7
- 101 SUBQ.W #1,D7 ; For DBF
- 102 ENDM
- 103
- 104 MACRO INIT_BHL_SYM
- 105 LEA.L pre_cosin,A2
- 106 MOVE.L pre_loffset,A4 ; A4-->preoffset
- 107 MOVE.L bh_rd2(PC),A5 ; A5=bh_rd2
- 108 MOVE.L bh_xd(PC),A6 ; A6=bh_xd
- 109 MOVE.W bh_out_w(PC),D7
- 110 LSR.W #1,D7 ; loop to bh_out_w/2 counts
- 111 ADD.W A6,D7 ; starting from bh_xd
- 112 MOVE.W D7,last_xd
-PASM 68040 Macro Assembler Version Dec 18 1992 (C) 91 Pure Software Page 3
-Source File: H:\PURE_C\PROJECTS\VISION\LDV\SRC\BHOLE\BHOLE.S
-
- 113 ENDM
- 114
- 115 ; Get pixel TC32 -->dest (Dx)
- 116 ; A4-->pre_loffset
- 117 MACRO GET_TCPIXEL32 p,x,y,dest
- 118 MOVE.L (A4,y.L*4),dest
- 119 ADD.L x,dest
- 120 MOVE.L (p,dest.L*4),dest
- 121 ENDM
- 122
- 123 ; Set pixel TC32 val(Dx) -->dest
- 124 ; A4-->pre_loffset
- 125 ; scratch_Dx scratch variable
- 126 MACRO SET_TCPIXEL32 p,x,y,val,scratch_Dx
- 127 MOVE.L (A4,y.L*4),scratch_Dx
- 128 ADD.L x,scratch_Dx
- 129 MOVE.L val,(p,scratch_Dx.L*4)
- 130 ENDM
- 131
- 132 ; Get pixel TC16 -->dest (Dx)
- 133 ; A4-->pre_loffset
- 134 MACRO GET_TCPIXEL16 p,x,y,dest
- 135 MOVE.L (A4,y.L*4),dest
- 136 ADD.L x,dest
- 137 MOVE.W (p,dest.L*2),dest
- 138 ENDM
- 139
- 140 ; Set pixel TC16 val(Dx) -->dest
- 141 ; A4-->pre_loffset
- 142 ; scratch_Dx scratch variable
- 143 MACRO SET_TCPIXEL16 p,x,y,val,scratch_Dx
- 144 MOVE.L (A4,y.L*4),scratch_Dx
- 145 ADD.L x,scratch_Dx
- 146 MOVE.W val,(p,scratch_Dx.L*2)
- 147 ENDM
- 148
- 149 ; Rotate 90
- 150 ; x,y,scratch_Dx : registers, y has to be Dx
- 151 ; #define R90(x,y) { long _x=x; x=-y; y=_x; }
- 152 MACRO R90 x,y,scratch_Dx
- 153 MOVE.L x,scratch_Dx
- 154 NEG.L y
- 155 MOVE.L y,x
- 156 MOVE.L scratch_Dx,y
- 157 ENDM
- 158
- 159 MACRO PIXINIMG x,y,w,h,bailout
- 160 TST.W x
- 161 BLT.S bailout
- 162 TST.W y
- 163 BLT.S bailout
- 164 CMP.W w,x
- 165 BGE.S bailout
- 166 CMP.W h,y
- 167 BGE.S bailout
- 168 ENDM
-PASM 68040 Macro Assembler Version Dec 18 1992 (C) 91 Pure Software Page 4
-Source File: H:\PURE_C\PROJECTS\VISION\LDV\SRC\BHOLE\BHOLE.S
-
- 169
- 170 ; On sample file 00_1480ms.jpg, Aranym 32bit:
- 171 ; BHL32_68000 takes about 1450ms
- 172 ; BHL32_68030 takes about 740ms
- 173
- 174 ; 68030 routine for True Color 32bit
- 175 ; BHL32_68030(short use_sym, void* in, void* out)
- 176 ; D0, A0 A1
- 177 00000000' BHL32_68030:
- 178 00000000' 48E7 FF3E MOVEM.L D0-D7/A2-A6,-(SP) ; Save context
- 179
- 180 00000004' 4A40 TST.W D0
- 181 00000006' 6600 00AE BNE BHL32_68030_sym
- 182
- 183 0000000A' 7E00 MOVEQ.L #0,D7
- 184 0000000C' 3E3A 0488 MOVE.W bh_out_x(PC),D7
- 185 00000010' E58F LSL.L #2,D7
- 186 00000012' D3C7 ADD.L D7,A1 ; A1-->&out[bh_out_x]
- 187 INIT_BHL
- 96 00000014' 45F9 00000000* + LEA.L pre_cosin,A2
- 97 0000001A' 2879 00000000* + MOVE.L pre_loffset,A4 ; A4-->preoffset
- 98 00000020' 2A7A 0454 + MOVE.L bh_rd2(PC),A5 ; A5=bh_rd2
- 99 00000024' 2C7A 0448 + MOVE.L bh_xd(PC),A6 ; A6=bh_xd
- 100 00000028' 3E3A 0464 + MOVE.W bh_out_w(PC),D7
- 101 0000002C' 5347 + SUBQ.W #1,D7 ; For DBF
- 188 0000002E' bhl32_l030:
- 189 BH_COMPUTE_CPU bhl32_tpir_030 ; -->D6=0:pixel in range
- 30 0000002E' 200E + MOVE.L A6,D0 ; Remember A6=bh_xd
- 31 00000030' D080 + ADD.L D0,D0
- 32 00000032' 5280 + ADDQ.L #1,D0
- 33 00000034' 220D + MOVE.L A5,D1 ; Remember A5=bh_rd2
- 34 00000036' D280 + ADD.L D0,D1 ; bh_rd2(D1)=1+2*bh_xd(D0)
- 35 00000038' 243A 0448 + MOVE.L bh_ref(PC),D2
- 36 0000003C' 2A41 + MOVE.L D1,A5 ; Save bh_rd2, free D1
- 37 0000003E' 5281 + ADDQ.L #1,D1 ; We need bh_rd2+1 for divide
- 41 00000040' 4C41 2002 + DIVU.L D1,D2 ; alpha(D2)=bh_ref/(1+bh_rd2)
- 42 00000044' 0282 0000 3FFF + ANDI.L #ITRIGO_ANGLE_MAX,D2 ; alpha &= ITRIGO_ANGLE_MAX
- 44 0000004A' E78A + LSL.L #3,D2 ; D2=offset for pre_cosin array
- 45 0000004C' 200E + MOVE.L A6,D0 ; D0=bh_xd
- 46 0000004E' 223A 0422 + MOVE.L bh_yd(PC),D1 ; D1=bh_yd
- 47 00000052' 2632 2804 + MOVE.L 4(A2,D2.L),D3 ; A2->pre_cosin, D3.L=SIN(alpha)
- 48 00000056' 2432 2800 + MOVE.L (A2,D2.L),D2 ; A2->pre_cosin, D2.L=COS(alpha)
- 50 0000005A' 7C10 + MOVEQ.L #16,D6 ; Prepare shifts/assume not in range
- 52 0000005C' 2800 + MOVE.L D0,D4
- 53 0000005E' 4C02 4800 + MULS.L D2,D4 ; D4=bh_xd * pre_cos[alpha]
- 54 00000062' 2A01 + MOVE.L D1,D5
- 55 00000064' 4C03 5800 + MULS.L D3,D5 ; D5=bh_yd * pre_sin[alpha]
- 56 00000068' 9885 + SUB.L D5,D4 ; D4=bh_xd * pre_cos[alpha] - bh_yd * pre_sin[alpha]
- 57 0000006A' ECA4 + ASR.L D6,D4
- 58 0000006C' D8BA 0418 + ADD.L bh_xc(PC),D4 ; D6=16, assume pixel not in range
- 59 00000070' 6D 26 + BLT.S bhl32_tpir_030 ; xs < 0: not in range
- 60 00000072' B87A 041E + CMP.W bh_in_w(PC),D4
- 61 00000076' 6C 20 + BGE.S bhl32_tpir_030 ; xs >= bh_in_w: not in range
- 62 00000078' 2644 + MOVE.L D4,A3 ; A3=bh_xs= (D4 >> 16)
- 64 0000007A' 2800 + MOVE.L D0,D4
- 65 0000007C' 4C03 4800 + MULS.L D3,D4 ; D4=bh_xd * pre_sin[alpha]
-PASM 68040 Macro Assembler Version Dec 18 1992 (C) 91 Pure Software Page 5
-Source File: H:\PURE_C\PROJECTS\VISION\LDV\SRC\BHOLE\BHOLE.S
-
- 66 00000080' 2A01 + MOVE.L D1,D5
- 67 00000082' 4C02 5800 + MULS.L D2,D5 ; D5=bh_yd * pre_cos[alpha]
- 68 00000086' D885 + ADD.L D5,D4 ; D4=bh_xd * pre_sin[alpha] + bh_yd * pre_cos[alpha]
- 69 00000088' ECA4 + ASR.L D6,D4
- 70 0000008A' D8BA 03FE + ADD.L bh_yc(PC),D4 ; D4.L=bh_ys
- 71 0000008E' 6D 08 + BLT.S bhl32_tpir_030 ; ys < 0: not in range
- 72 00000090' B87A 0402 + CMP.W bh_in_h(PC),D4
- 73 00000094' 6C 02 + BGE.S bhl32_tpir_030 ; ys >= bh_in_h: not in range
- 74 00000096' 7C00 + MOVEQ.L #0,D6 ; pixel in range
- 190 00000098' bhl32_tpir_030:
- 191 00000098' 70FF MOVEQ.L #-1,D0 ; Assume out of range
- 192 0000009A' 4A46 TST.W D6
- 193 0000009C' 66 0A BNE.S bhl32_setpix_030
- 194 0000009E' 2034 4C00 MOVE.L (A4,D4.L*4),D0 ; D4=bh_ys, D0=pre_loffset[bh_ys]
- 195 000000A2' D08B ADD.L A3,D0 ; D0=pre_loffset[bh_ys] + bh_xs(A3)
- 196 000000A4' 2030 0C00 MOVE.L (A0,D0.L*4),D0 ; D0=in_ptr[pre_loffset[bh_ys] + bh_xs]
- 197 000000A8' bhl32_setpix_030:
- 198 000000A8' 22C0 MOVE.L D0,(A1)+
- 199 000000AA' 528E ADD.L #1,A6 ; bh_xd++
- 200 000000AC' 51CF FF80 DBF D7,bhl32_l030
- 201
- 202 000000B0' 4CDF 7CFF MOVEM.L (SP)+,D0-D7/A2-A6 ; Restore context
- 203 000000B4' 4E75 RTS
- 204
- 205 000000B6' BHL32_68030_sym:
- 206 INIT_BHL_SYM
- 105 000000B6' 45F9 00000000* + LEA.L pre_cosin,A2
- 106 000000BC' 2879 00000000* + MOVE.L pre_loffset,A4 ; A4-->preoffset
- 107 000000C2' 2A7A 03B2 + MOVE.L bh_rd2(PC),A5 ; A5=bh_rd2
- 108 000000C6' 2C7A 03A6 + MOVE.L bh_xd(PC),A6 ; A6=bh_xd
- 109 000000CA' 3E3A 03C2 + MOVE.W bh_out_w(PC),D7
- 110 000000CE' E24F + LSR.W #1,D7 ; loop to bh_out_w/2 counts
- 111 000000D0' DE4E + ADD.W A6,D7 ; starting from bh_xd
- 112 000000D2' 33C7 00000000' + MOVE.W D7,last_xd
- 207 000000D8' bhl32_l030_sym:
- 208 BH_COMPUTE_CPU bhl32_tpir_030_sym ; -->D6=0:pixel in range
- 30 000000D8' 200E + MOVE.L A6,D0 ; Remember A6=bh_xd
- 31 000000DA' D080 + ADD.L D0,D0
- 32 000000DC' 5280 + ADDQ.L #1,D0
- 33 000000DE' 220D + MOVE.L A5,D1 ; Remember A5=bh_rd2
- 34 000000E0' D280 + ADD.L D0,D1 ; bh_rd2(D1)=1+2*bh_xd(D0)
- 35 000000E2' 243A 039E + MOVE.L bh_ref(PC),D2
- 36 000000E6' 2A41 + MOVE.L D1,A5 ; Save bh_rd2, free D1
- 37 000000E8' 5281 + ADDQ.L #1,D1 ; We need bh_rd2+1 for divide
- 41 000000EA' 4C41 2002 + DIVU.L D1,D2 ; alpha(D2)=bh_ref/(1+bh_rd2)
- 42 000000EE' 0282 0000 3FFF + ANDI.L #ITRIGO_ANGLE_MAX,D2 ; alpha &= ITRIGO_ANGLE_MAX
- 44 000000F4' E78A + LSL.L #3,D2 ; D2=offset for pre_cosin array
- 45 000000F6' 200E + MOVE.L A6,D0 ; D0=bh_xd
- 46 000000F8' 223A 0378 + MOVE.L bh_yd(PC),D1 ; D1=bh_yd
- 47 000000FC' 2632 2804 + MOVE.L 4(A2,D2.L),D3 ; A2->pre_cosin, D3.L=SIN(alpha)
- 48 00000100' 2432 2800 + MOVE.L (A2,D2.L),D2 ; A2->pre_cosin, D2.L=COS(alpha)
- 50 00000104' 7C10 + MOVEQ.L #16,D6 ; Prepare shifts/assume not in range
- 52 00000106' 2800 + MOVE.L D0,D4
- 53 00000108' 4C02 4800 + MULS.L D2,D4 ; D4=bh_xd * pre_cos[alpha]
- 54 0000010C' 2A01 + MOVE.L D1,D5
- 55 0000010E' 4C03 5800 + MULS.L D3,D5 ; D5=bh_yd * pre_sin[alpha]
-PASM 68040 Macro Assembler Version Dec 18 1992 (C) 91 Pure Software Page 6
-Source File: H:\PURE_C\PROJECTS\VISION\LDV\SRC\BHOLE\BHOLE.S
-
- 56 00000112' 9885 + SUB.L D5,D4 ; D4=bh_xd * pre_cos[alpha] - bh_yd * pre_sin[alpha]
- 57 00000114' ECA4 + ASR.L D6,D4
- 58 00000116' D8BA 036E + ADD.L bh_xc(PC),D4 ; D6=16, assume pixel not in range
- 59 0000011A' 6D 26 + BLT.S bhl32_tpir_030_sym ; xs < 0: not in range
- 60 0000011C' B87A 0374 + CMP.W bh_in_w(PC),D4
- 61 00000120' 6C 20 + BGE.S bhl32_tpir_030_sym ; xs >= bh_in_w: not in range
- 62 00000122' 2644 + MOVE.L D4,A3 ; A3=bh_xs= (D4 >> 16)
- 64 00000124' 2800 + MOVE.L D0,D4
- 65 00000126' 4C03 4800 + MULS.L D3,D4 ; D4=bh_xd * pre_sin[alpha]
- 66 0000012A' 2A01 + MOVE.L D1,D5
- 67 0000012C' 4C02 5800 + MULS.L D2,D5 ; D5=bh_yd * pre_cos[alpha]
- 68 00000130' D885 + ADD.L D5,D4 ; D4=bh_xd * pre_sin[alpha] + bh_yd * pre_cos[alpha]
- 69 00000132' ECA4 + ASR.L D6,D4
- 70 00000134' D8BA 0354 + ADD.L bh_yc(PC),D4 ; D4.L=bh_ys
- 71 00000138' 6D 08 + BLT.S bhl32_tpir_030_sym ; ys < 0: not in range
- 72 0000013A' B87A 0358 + CMP.W bh_in_h(PC),D4
- 73 0000013E' 6C 02 + BGE.S bhl32_tpir_030_sym ; ys >= bh_in_h: not in range
- 74 00000140' 7C00 + MOVEQ.L #0,D6 ; pixel in range
- 209 00000142' bhl32_tpir_030_sym:
- 210 00000142' 70FF MOVEQ.L #-1,D0 ; Assume out of range
- 211 00000144' 4A46 TST.W D6
- 212 00000146' 66 0A BNE.S bhl32_setpix_030_sym
- 213 GET_TCPIXEL32 A0,A3,D4,D0 ; A0-->in_ptr, A3=bh_xs+bh_xc, D4=bh_ys+bh_yc
- 118 00000148' 2034 4C00 + MOVE.L (A4,D4.L*4),D0
- 119 0000014C' D08B + ADD.L A3,D0
- 120 0000014E' 2030 0C00 + MOVE.L (A0,D0.L*4),D0
- 214 ; D0=GET_TCPIXEL(in_ptr, bh_xs+bh_xc, bh_ys+bh_yc)
- 215 00000152' bhl32_setpix_030_sym:
- 216 00000152' 2F0E MOVE.L A6,-(SP) ; Save bh_xd
- 217 00000154' 243A 0330 MOVE.L bh_xc(PC),D2 ; D2=bh_xc
- 218 00000158' 263A 0330 MOVE.L bh_yc(PC),D3 ; D3=bh_yc
- 219 0000015C' DDC2 ADD.L D2,A6 ; A6=bh_xd+bh_xc
- 220 0000015E' 2E3A 0312 MOVE.L bh_yd(PC),D7
- 221 00000162' DE83 ADD.L D3,D7 ; D7=bh_yd+bh_yc
- 222 SET_TCPIXEL32 A1,A6,D7,D0,D5 ; SET_TCPIXEL(out_ptr, bh_xd+bh_xc, bh_yd+bh_yc, GET_TCPIXEL(in_ptr, bh_xs+bh_xc, bh_ys+bh_yc))
- 127 00000164' 2A34 7C00 + MOVE.L (A4,D7.L*4),D5
- 128 00000168' DA8E + ADD.L A6,D5
- 129 0000016A' 2380 5C00 + MOVE.L D0,(A1,D5.L*4)
- 223
- 224 0000016E' 7202 MOVEQ.L #2,D1 ; 3 loops, -1 for DBF
- 225 00000170' deduc32_030:
- 226 00000170' 97C2 SUB.L D2,A3 ; We need now bh_xs(A3) and bh_ys(D4) relative to
- 227 00000172' 9883 SUB.L D3,D4 ; Black Hole center to use R90
- 228 00000174' 9DC2 SUB.L D2,A6 ; We need now bh_xd(A6) and bh_yd(D7) relative to
- 229 00000176' 9E83 SUB.L D3,D7 ; Black Hole center to use R90
- 230
- 231 R90 A6,D7,D0 ; Rotate (xd,yd) by PI/4
- 153 00000178' 200E + MOVE.L A6,D0
- 154 0000017A' 4487 + NEG.L D7
- 155 0000017C' 2C47 + MOVE.L D7,A6
- 156 0000017E' 2E00 + MOVE.L D0,D7
- 232 R90 A3,D4,D0 ; Rotate (xs,ys) by PI/4
- 153 00000180' 200B + MOVE.L A3,D0
- 154 00000182' 4484 + NEG.L D4
- 155 00000184' 2644 + MOVE.L D4,A3
- 156 00000186' 2800 + MOVE.L D0,D4
-PASM 68040 Macro Assembler Version Dec 18 1992 (C) 91 Pure Software Page 7
-Source File: H:\PURE_C\PROJECTS\VISION\LDV\SRC\BHOLE\BHOLE.S
-
- 233
- 234 00000188' D7C2 ADD.L D2,A3 ; Now we need coords in image raster
- 235 0000018A' D883 ADD.L D3,D4
- 236 0000018C' DDC2 ADD.L D2,A6
- 237 0000018E' DE83 ADD.L D3,D7
- 238
- 239 PIXINIMG A6,D7,bh_in_w(PC),bh_in_h(PC),dnotinimg32_030 ; Check if pixel in dest is within bounds
- 160 00000190' 4A4E + TST.W A6
- 161 00000192' 6D 3A + BLT.S dnotinimg32_030
- 162 00000194' 4A47 + TST.W D7
- 163 00000196' 6D 36 + BLT.S dnotinimg32_030
- 164 00000198' BCFA 02F8 + CMP.W bh_in_w(PC),A6
- 165 0000019C' 6C 30 + BGE.S dnotinimg32_030
- 166 0000019E' BE7A 02F4 + CMP.W bh_in_h(PC),D7
- 167 000001A2' 6C 2A + BGE.S dnotinimg32_030
- 240 000001A4' 70FF MOVEQ.L #-1,D0 ; Assume out of range
- 241 PIXINIMG A3,D4,bh_in_w(PC),bh_in_h(PC),plotdest32_030 ; Check if pixel in src is within bounds
- 160 000001A6' 4A4B + TST.W A3
- 161 000001A8' 6D 1A + BLT.S plotdest32_030
- 162 000001AA' 4A44 + TST.W D4
- 163 000001AC' 6D 16 + BLT.S plotdest32_030
- 164 000001AE' B6FA 02E2 + CMP.W bh_in_w(PC),A3
- 165 000001B2' 6C 10 + BGE.S plotdest32_030
- 166 000001B4' B87A 02DE + CMP.W bh_in_h(PC),D4
- 167 000001B8' 6C 0A + BGE.S plotdest32_030
- 242 GET_TCPIXEL32 A0,A3,D4,D0 ; A0-->in_ptr, A3=bh_xs+bh_xc, D4=bh_ys+bh_yc
- 118 000001BA' 2034 4C00 + MOVE.L (A4,D4.L*4),D0
- 119 000001BE' D08B + ADD.L A3,D0
- 120 000001C0' 2030 0C00 + MOVE.L (A0,D0.L*4),D0
- 243 ; D0=GET_TCPIXEL(in_ptr, bh_xs+bh_xc, bh_ys+bh_yc)
- 244 000001C4' plotdest32_030:
- 245 SET_TCPIXEL32 A1,A6,D7,D0,D5 ; SET_TCPIXEL(out_ptr, bh_xd+bh_xc, bh_yd+bh_yc, GET_TCPIXEL(in_ptr, bh_xs+bh_xc, bh_ys+bh_yc))
- 127 000001C4' 2A34 7C00 + MOVE.L (A4,D7.L*4),D5
- 128 000001C8' DA8E + ADD.L A6,D5
- 129 000001CA' 2380 5C00 + MOVE.L D0,(A1,D5.L*4)
- 246 000001CE' dnotinimg32_030:
- 247 000001CE' 51C9 FFA0 DBF D1,deduc32_030
- 248
- 249 000001D2' 2C5F MOVE.L (SP)+,A6 ; Restore bh_xd
- 250 000001D4' 528E ADD.L #1,A6 ; bh_xd++
- 251 000001D6' BCFA 02C2 CMP.W last_xd(PC),A6
- 252 000001DA' 6F00 FEFC BLE bhl32_l030_sym
- 253
- 254 000001DE' 4CDF 7CFF MOVEM.L (SP)+,D0-D7/A2-A6 ; Restore context
- 255 000001E2' 4E75 RTS
- 256
- 257 ; 68030 routine for True Color 16bit
- 258 ; BHL16_68030(short use_sym, void* in, void* out)
- 259 ; D0, A0 A1
- 260 000001E4' BHL16_68030:
- 261 000001E4' 48E7 FF3E MOVEM.L D0-D7/A2-A6,-(SP) ; Save context
- 262
- 263 000001E8' 4A40 TST.W D0
- 264 000001EA' 6600 00AE BNE BHL16_68030_sym
- 265
- 266 000001EE' 7E00 MOVEQ.L #0,D7
-PASM 68040 Macro Assembler Version Dec 18 1992 (C) 91 Pure Software Page 8
-Source File: H:\PURE_C\PROJECTS\VISION\LDV\SRC\BHOLE\BHOLE.S
-
- 267 000001F0' 3E3A 02A4 MOVE.W bh_out_x(PC),D7
- 268 000001F4' DE87 ADD.L D7,D7
- 269 000001F6' D3C7 ADD.L D7,A1 ; A1-->&out[bh_out_x]
- 270 INIT_BHL
- 96 000001F8' 45F9 00000000* + LEA.L pre_cosin,A2
- 97 000001FE' 2879 00000000* + MOVE.L pre_loffset,A4 ; A4-->preoffset
- 98 00000204' 2A7A 0270 + MOVE.L bh_rd2(PC),A5 ; A5=bh_rd2
- 99 00000208' 2C7A 0264 + MOVE.L bh_xd(PC),A6 ; A6=bh_xd
- 100 0000020C' 3E3A 0280 + MOVE.W bh_out_w(PC),D7
- 101 00000210' 5347 + SUBQ.W #1,D7 ; For DBF
- 271 00000212' bhl16_l030:
- 272 BH_COMPUTE_CPU bhl16_tpir_030 ; -->D6=0:pixel in range
- 30 00000212' 200E + MOVE.L A6,D0 ; Remember A6=bh_xd
- 31 00000214' D080 + ADD.L D0,D0
- 32 00000216' 5280 + ADDQ.L #1,D0
- 33 00000218' 220D + MOVE.L A5,D1 ; Remember A5=bh_rd2
- 34 0000021A' D280 + ADD.L D0,D1 ; bh_rd2(D1)=1+2*bh_xd(D0)
- 35 0000021C' 243A 0264 + MOVE.L bh_ref(PC),D2
- 36 00000220' 2A41 + MOVE.L D1,A5 ; Save bh_rd2, free D1
- 37 00000222' 5281 + ADDQ.L #1,D1 ; We need bh_rd2+1 for divide
- 41 00000224' 4C41 2002 + DIVU.L D1,D2 ; alpha(D2)=bh_ref/(1+bh_rd2)
- 42 00000228' 0282 0000 3FFF + ANDI.L #ITRIGO_ANGLE_MAX,D2 ; alpha &= ITRIGO_ANGLE_MAX
- 44 0000022E' E78A + LSL.L #3,D2 ; D2=offset for pre_cosin array
- 45 00000230' 200E + MOVE.L A6,D0 ; D0=bh_xd
- 46 00000232' 223A 023E + MOVE.L bh_yd(PC),D1 ; D1=bh_yd
- 47 00000236' 2632 2804 + MOVE.L 4(A2,D2.L),D3 ; A2->pre_cosin, D3.L=SIN(alpha)
- 48 0000023A' 2432 2800 + MOVE.L (A2,D2.L),D2 ; A2->pre_cosin, D2.L=COS(alpha)
- 50 0000023E' 7C10 + MOVEQ.L #16,D6 ; Prepare shifts/assume not in range
- 52 00000240' 2800 + MOVE.L D0,D4
- 53 00000242' 4C02 4800 + MULS.L D2,D4 ; D4=bh_xd * pre_cos[alpha]
- 54 00000246' 2A01 + MOVE.L D1,D5
- 55 00000248' 4C03 5800 + MULS.L D3,D5 ; D5=bh_yd * pre_sin[alpha]
- 56 0000024C' 9885 + SUB.L D5,D4 ; D4=bh_xd * pre_cos[alpha] - bh_yd * pre_sin[alpha]
- 57 0000024E' ECA4 + ASR.L D6,D4
- 58 00000250' D8BA 0234 + ADD.L bh_xc(PC),D4 ; D6=16, assume pixel not in range
- 59 00000254' 6D 26 + BLT.S bhl16_tpir_030 ; xs < 0: not in range
- 60 00000256' B87A 023A + CMP.W bh_in_w(PC),D4
- 61 0000025A' 6C 20 + BGE.S bhl16_tpir_030 ; xs >= bh_in_w: not in range
- 62 0000025C' 2644 + MOVE.L D4,A3 ; A3=bh_xs= (D4 >> 16)
- 64 0000025E' 2800 + MOVE.L D0,D4
- 65 00000260' 4C03 4800 + MULS.L D3,D4 ; D4=bh_xd * pre_sin[alpha]
- 66 00000264' 2A01 + MOVE.L D1,D5
- 67 00000266' 4C02 5800 + MULS.L D2,D5 ; D5=bh_yd * pre_cos[alpha]
- 68 0000026A' D885 + ADD.L D5,D4 ; D4=bh_xd * pre_sin[alpha] + bh_yd * pre_cos[alpha]
- 69 0000026C' ECA4 + ASR.L D6,D4
- 70 0000026E' D8BA 021A + ADD.L bh_yc(PC),D4 ; D4.L=bh_ys
- 71 00000272' 6D 08 + BLT.S bhl16_tpir_030 ; ys < 0: not in range
- 72 00000274' B87A 021E + CMP.W bh_in_h(PC),D4
- 73 00000278' 6C 02 + BGE.S bhl16_tpir_030 ; ys >= bh_in_h: not in range
- 74 0000027A' 7C00 + MOVEQ.L #0,D6 ; pixel in range
- 273 0000027C' bhl16_tpir_030:
- 274 0000027C' 70FF MOVEQ.L #-1,D0 ; Assume out of range
- 275 0000027E' 4A46 TST.W D6
- 276 00000280' 66 0A BNE.S bhl16_setpix_030
- 277 00000282' 2034 4C00 MOVE.L (A4,D4.L*4),D0 ; D4=bh_ys, D0=pre_loffset[bh_ys]
- 278 00000286' D08B ADD.L A3,D0 ; D0=pre_loffset[bh_ys] + bh_xs(A3)
-PASM 68040 Macro Assembler Version Dec 18 1992 (C) 91 Pure Software Page 9
-Source File: H:\PURE_C\PROJECTS\VISION\LDV\SRC\BHOLE\BHOLE.S
-
- 279 00000288' 3030 0A00 MOVE.W (A0,D0.L*2),D0 ; D0=in_ptr[pre_loffset[bh_ys] + bh_xs]
- 280 0000028C' bhl16_setpix_030:
- 281 0000028C' 32C0 MOVE.W D0,(A1)+
- 282 0000028E' 528E ADD.L #1,A6 ; bh_xd++
- 283 00000290' 51CF FF80 DBF D7,bhl16_l030
- 284
- 285 00000294' 4CDF 7CFF MOVEM.L (SP)+,D0-D7/A2-A6 ; Restore context
- 286 00000298' 4E75 RTS
- 287
- 288 0000029A' BHL16_68030_sym:
- 289 INIT_BHL_SYM
- 105 0000029A' 45F9 00000000* + LEA.L pre_cosin,A2
- 106 000002A0' 2879 00000000* + MOVE.L pre_loffset,A4 ; A4-->preoffset
- 107 000002A6' 2A7A 01CE + MOVE.L bh_rd2(PC),A5 ; A5=bh_rd2
- 108 000002AA' 2C7A 01C2 + MOVE.L bh_xd(PC),A6 ; A6=bh_xd
- 109 000002AE' 3E3A 01DE + MOVE.W bh_out_w(PC),D7
- 110 000002B2' E24F + LSR.W #1,D7 ; loop to bh_out_w/2 counts
- 111 000002B4' DE4E + ADD.W A6,D7 ; starting from bh_xd
- 112 000002B6' 33C7 00000000' + MOVE.W D7,last_xd
- 290 000002BC' bhl16_l030_sym:
- 291 BH_COMPUTE_CPU bhl16_tpir_030_sym ; -->D6=0:pixel in range
- 30 000002BC' 200E + MOVE.L A6,D0 ; Remember A6=bh_xd
- 31 000002BE' D080 + ADD.L D0,D0
- 32 000002C0' 5280 + ADDQ.L #1,D0
- 33 000002C2' 220D + MOVE.L A5,D1 ; Remember A5=bh_rd2
- 34 000002C4' D280 + ADD.L D0,D1 ; bh_rd2(D1)=1+2*bh_xd(D0)
- 35 000002C6' 243A 01BA + MOVE.L bh_ref(PC),D2
- 36 000002CA' 2A41 + MOVE.L D1,A5 ; Save bh_rd2, free D1
- 37 000002CC' 5281 + ADDQ.L #1,D1 ; We need bh_rd2+1 for divide
- 41 000002CE' 4C41 2002 + DIVU.L D1,D2 ; alpha(D2)=bh_ref/(1+bh_rd2)
- 42 000002D2' 0282 0000 3FFF + ANDI.L #ITRIGO_ANGLE_MAX,D2 ; alpha &= ITRIGO_ANGLE_MAX
- 44 000002D8' E78A + LSL.L #3,D2 ; D2=offset for pre_cosin array
- 45 000002DA' 200E + MOVE.L A6,D0 ; D0=bh_xd
- 46 000002DC' 223A 0194 + MOVE.L bh_yd(PC),D1 ; D1=bh_yd
- 47 000002E0' 2632 2804 + MOVE.L 4(A2,D2.L),D3 ; A2->pre_cosin, D3.L=SIN(alpha)
- 48 000002E4' 2432 2800 + MOVE.L (A2,D2.L),D2 ; A2->pre_cosin, D2.L=COS(alpha)
- 50 000002E8' 7C10 + MOVEQ.L #16,D6 ; Prepare shifts/assume not in range
- 52 000002EA' 2800 + MOVE.L D0,D4
- 53 000002EC' 4C02 4800 + MULS.L D2,D4 ; D4=bh_xd * pre_cos[alpha]
- 54 000002F0' 2A01 + MOVE.L D1,D5
- 55 000002F2' 4C03 5800 + MULS.L D3,D5 ; D5=bh_yd * pre_sin[alpha]
- 56 000002F6' 9885 + SUB.L D5,D4 ; D4=bh_xd * pre_cos[alpha] - bh_yd * pre_sin[alpha]
- 57 000002F8' ECA4 + ASR.L D6,D4
- 58 000002FA' D8BA 018A + ADD.L bh_xc(PC),D4 ; D6=16, assume pixel not in range
- 59 000002FE' 6D 26 + BLT.S bhl16_tpir_030_sym ; xs < 0: not in range
- 60 00000300' B87A 0190 + CMP.W bh_in_w(PC),D4
- 61 00000304' 6C 20 + BGE.S bhl16_tpir_030_sym ; xs >= bh_in_w: not in range
- 62 00000306' 2644 + MOVE.L D4,A3 ; A3=bh_xs= (D4 >> 16)
- 64 00000308' 2800 + MOVE.L D0,D4
- 65 0000030A' 4C03 4800 + MULS.L D3,D4 ; D4=bh_xd * pre_sin[alpha]
- 66 0000030E' 2A01 + MOVE.L D1,D5
- 67 00000310' 4C02 5800 + MULS.L D2,D5 ; D5=bh_yd * pre_cos[alpha]
- 68 00000314' D885 + ADD.L D5,D4 ; D4=bh_xd * pre_sin[alpha] + bh_yd * pre_cos[alpha]
- 69 00000316' ECA4 + ASR.L D6,D4
- 70 00000318' D8BA 0170 + ADD.L bh_yc(PC),D4 ; D4.L=bh_ys
- 71 0000031C' 6D 08 + BLT.S bhl16_tpir_030_sym ; ys < 0: not in range
-PASM 68040 Macro Assembler Version Dec 18 1992 (C) 91 Pure Software Page 10
-Source File: H:\PURE_C\PROJECTS\VISION\LDV\SRC\BHOLE\BHOLE.S
-
- 72 0000031E' B87A 0174 + CMP.W bh_in_h(PC),D4
- 73 00000322' 6C 02 + BGE.S bhl16_tpir_030_sym ; ys >= bh_in_h: not in range
- 74 00000324' 7C00 + MOVEQ.L #0,D6 ; pixel in range
- 292 00000326' bhl16_tpir_030_sym:
- 293 00000326' 70FF MOVEQ.L #-1,D0 ; Assume out of range
- 294 00000328' 4A46 TST.W D6
- 295 0000032A' 66 0A BNE.S bhl16_setpix_030_sym
- 296 GET_TCPIXEL16 A0,A3,D4,D0 ; A0-->in_ptr, A3=bh_xs+bh_xc, D4=bh_ys+bh_yc
- 135 0000032C' 2034 4C00 + MOVE.L (A4,D4.L*4),D0
- 136 00000330' D08B + ADD.L A3,D0
- 137 00000332' 3030 0A00 + MOVE.W (A0,D0.L*2),D0
- 297 ; D0=GET_TCPIXEL(in_ptr, bh_xs+bh_xc, bh_ys+bh_yc)
- 298 00000336' bhl16_setpix_030_sym:
- 299 00000336' 2F0E MOVE.L A6,-(SP) ; Save bh_xd
- 300 00000338' 243A 014C MOVE.L bh_xc(PC),D2 ; D2=bh_xc
- 301 0000033C' 263A 014C MOVE.L bh_yc(PC),D3 ; D3=bh_yc
- 302 00000340' DDC2 ADD.L D2,A6 ; A6=bh_xd+bh_xc
- 303 00000342' 2E3A 012E MOVE.L bh_yd(PC),D7
- 304 00000346' DE83 ADD.L D3,D7 ; D7=bh_yd+bh_yc
- 305 SET_TCPIXEL16 A1,A6,D7,D0,D5 ; SET_TCPIXEL(out_ptr, bh_xd+bh_xc, bh_yd+bh_yc, GET_TCPIXEL(in_ptr, bh_xs+bh_xc, bh_ys+bh_yc))
- 144 00000348' 2A34 7C00 + MOVE.L (A4,D7.L*4),D5
- 145 0000034C' DA8E + ADD.L A6,D5
- 146 0000034E' 3380 5A00 + MOVE.W D0,(A1,D5.L*2)
- 306
- 307 00000352' 7202 MOVEQ.L #2,D1 ; 3 loops, -1 for DBF
- 308 00000354' deduc16_030:
- 309 00000354' 97C2 SUB.L D2,A3 ; We need now bh_xs(A3) and bh_ys(D4) relative to
- 310 00000356' 9883 SUB.L D3,D4 ; Black Hole center to use R90
- 311 00000358' 9DC2 SUB.L D2,A6 ; We need now bh_xd(A6) and bh_yd(D7) relative to
- 312 0000035A' 9E83 SUB.L D3,D7 ; Black Hole center to use R90
- 313
- 314 R90 A6,D7,D0 ; Rotate (xd,yd) by PI/4
- 153 0000035C' 200E + MOVE.L A6,D0
- 154 0000035E' 4487 + NEG.L D7
- 155 00000360' 2C47 + MOVE.L D7,A6
- 156 00000362' 2E00 + MOVE.L D0,D7
- 315 R90 A3,D4,D0 ; Rotate (xs,ys) by PI/4
- 153 00000364' 200B + MOVE.L A3,D0
- 154 00000366' 4484 + NEG.L D4
- 155 00000368' 2644 + MOVE.L D4,A3
- 156 0000036A' 2800 + MOVE.L D0,D4
- 316
- 317 0000036C' D7C2 ADD.L D2,A3 ; Now we need coords in image raster
- 318 0000036E' D883 ADD.L D3,D4
- 319 00000370' DDC2 ADD.L D2,A6
- 320 00000372' DE83 ADD.L D3,D7
- 321
- 322 PIXINIMG A6,D7,bh_in_w(PC),bh_in_h(PC),dnotinimg16_030 ; Check if pixel in dest is within bounds
- 160 00000374' 4A4E + TST.W A6
- 161 00000376' 6D 3A + BLT.S dnotinimg16_030
- 162 00000378' 4A47 + TST.W D7
- 163 0000037A' 6D 36 + BLT.S dnotinimg16_030
- 164 0000037C' BCFA 0114 + CMP.W bh_in_w(PC),A6
- 165 00000380' 6C 30 + BGE.S dnotinimg16_030
- 166 00000382' BE7A 0110 + CMP.W bh_in_h(PC),D7
- 167 00000386' 6C 2A + BGE.S dnotinimg16_030
-PASM 68040 Macro Assembler Version Dec 18 1992 (C) 91 Pure Software Page 11
-Source File: H:\PURE_C\PROJECTS\VISION\LDV\SRC\BHOLE\BHOLE.S
-
- 323 00000388' 70FF MOVEQ.L #-1,D0 ; Assume out of range
- 324 PIXINIMG A3,D4,bh_in_w(PC),bh_in_h(PC),plotdest16_030 ; Check if pixel in src is within bounds
- 160 0000038A' 4A4B + TST.W A3
- 161 0000038C' 6D 1A + BLT.S plotdest16_030
- 162 0000038E' 4A44 + TST.W D4
- 163 00000390' 6D 16 + BLT.S plotdest16_030
- 164 00000392' B6FA 00FE + CMP.W bh_in_w(PC),A3
- 165 00000396' 6C 10 + BGE.S plotdest16_030
- 166 00000398' B87A 00FA + CMP.W bh_in_h(PC),D4
- 167 0000039C' 6C 0A + BGE.S plotdest16_030
- 325 GET_TCPIXEL16 A0,A3,D4,D0 ; A0-->in_ptr, A3=bh_xs+bh_xc, D4=bh_ys+bh_yc
- 135 0000039E' 2034 4C00 + MOVE.L (A4,D4.L*4),D0
- 136 000003A2' D08B + ADD.L A3,D0
- 137 000003A4' 3030 0A00 + MOVE.W (A0,D0.L*2),D0
- 326 ; D0=GET_TCPIXEL(in_ptr, bh_xs+bh_xc, bh_ys+bh_yc)
- 327 000003A8' plotdest16_030:
- 328 SET_TCPIXEL16 A1,A6,D7,D0,D5 ; SET_TCPIXEL(out_ptr, bh_xd+bh_xc, bh_yd+bh_yc, GET_TCPIXEL(in_ptr, bh_xs+bh_xc, bh_ys+bh_yc))
- 144 000003A8' 2A34 7C00 + MOVE.L (A4,D7.L*4),D5
- 145 000003AC' DA8E + ADD.L A6,D5
- 146 000003AE' 3380 5A00 + MOVE.W D0,(A1,D5.L*2)
- 329 000003B2' dnotinimg16_030:
- 330 000003B2' 51C9 FFA0 DBF D1,deduc16_030
- 331
- 332 000003B6' 2C5F MOVE.L (SP)+,A6 ; Restore bh_xd
- 333 000003B8' 528E ADD.L #1,A6 ; bh_xd++
- 334 000003BA' BCFA 00DE CMP.W last_xd(PC),A6
- 335 000003BE' 6F00 FEFC BLE bhl16_l030_sym
- 336
- 337 000003C2' 4CDF 7CFF MOVEM.L (SP)+,D0-D7/A2-A6 ; Restore context
- 338 000003C6' 4E75 RTS
- 339
- 340 ; 68030 routine for bitplances images, converted to indexes
- 341 ; BHLInd_68030(short use_sym, void* in, void* out)
- 342 ; D0, A0 A1
- 343 000003C8' BHLInd_68030:
- 344 000003C8' 48E7 FF3E MOVEM.L D0-D7/A2-A6,-(SP) ; Save context
- 345
- 346 INIT_BHL
- 96 000003CC' 45F9 00000000* + LEA.L pre_cosin,A2
- 97 000003D2' 2879 00000000* + MOVE.L pre_loffset,A4 ; A4-->preoffset
- 98 000003D8' 2A7A 009C + MOVE.L bh_rd2(PC),A5 ; A5=bh_rd2
- 99 000003DC' 2C7A 0090 + MOVE.L bh_xd(PC),A6 ; A6=bh_xd
- 100 000003E0' 3E3A 00AC + MOVE.W bh_out_w(PC),D7
- 101 000003E4' 5347 + SUBQ.W #1,D7 ; For DBF
- 347 000003E6' bhlind_l030:
- 348 BH_COMPUTE_CPU bhlind_tpir_030 ; -->D6=0:pixel in range
- 30 000003E6' 200E + MOVE.L A6,D0 ; Remember A6=bh_xd
- 31 000003E8' D080 + ADD.L D0,D0
- 32 000003EA' 5280 + ADDQ.L #1,D0
- 33 000003EC' 220D + MOVE.L A5,D1 ; Remember A5=bh_rd2
- 34 000003EE' D280 + ADD.L D0,D1 ; bh_rd2(D1)=1+2*bh_xd(D0)
- 35 000003F0' 243A 0090 + MOVE.L bh_ref(PC),D2
- 36 000003F4' 2A41 + MOVE.L D1,A5 ; Save bh_rd2, free D1
- 37 000003F6' 5281 + ADDQ.L #1,D1 ; We need bh_rd2+1 for divide
- 41 000003F8' 4C41 2002 + DIVU.L D1,D2 ; alpha(D2)=bh_ref/(1+bh_rd2)
- 42 000003FC' 0282 0000 3FFF + ANDI.L #ITRIGO_ANGLE_MAX,D2 ; alpha &= ITRIGO_ANGLE_MAX
-PASM 68040 Macro Assembler Version Dec 18 1992 (C) 91 Pure Software Page 12
-Source File: H:\PURE_C\PROJECTS\VISION\LDV\SRC\BHOLE\BHOLE.S
-
- 44 00000402' E78A + LSL.L #3,D2 ; D2=offset for pre_cosin array
- 45 00000404' 200E + MOVE.L A6,D0 ; D0=bh_xd
- 46 00000406' 223A 006A + MOVE.L bh_yd(PC),D1 ; D1=bh_yd
- 47 0000040A' 2632 2804 + MOVE.L 4(A2,D2.L),D3 ; A2->pre_cosin, D3.L=SIN(alpha)
- 48 0000040E' 2432 2800 + MOVE.L (A2,D2.L),D2 ; A2->pre_cosin, D2.L=COS(alpha)
- 50 00000412' 7C10 + MOVEQ.L #16,D6 ; Prepare shifts/assume not in range
- 52 00000414' 2800 + MOVE.L D0,D4
- 53 00000416' 4C02 4800 + MULS.L D2,D4 ; D4=bh_xd * pre_cos[alpha]
- 54 0000041A' 2A01 + MOVE.L D1,D5
- 55 0000041C' 4C03 5800 + MULS.L D3,D5 ; D5=bh_yd * pre_sin[alpha]
- 56 00000420' 9885 + SUB.L D5,D4 ; D4=bh_xd * pre_cos[alpha] - bh_yd * pre_sin[alpha]
- 57 00000422' ECA4 + ASR.L D6,D4
- 58 00000424' D8BA 0060 + ADD.L bh_xc(PC),D4 ; D6=16, assume pixel not in range
- 59 00000428' 6D 26 + BLT.S bhlind_tpir_030 ; xs < 0: not in range
- 60 0000042A' B87A 0066 + CMP.W bh_in_w(PC),D4
- 61 0000042E' 6C 20 + BGE.S bhlind_tpir_030 ; xs >= bh_in_w: not in range
- 62 00000430' 2644 + MOVE.L D4,A3 ; A3=bh_xs= (D4 >> 16)
- 64 00000432' 2800 + MOVE.L D0,D4
- 65 00000434' 4C03 4800 + MULS.L D3,D4 ; D4=bh_xd * pre_sin[alpha]
- 66 00000438' 2A01 + MOVE.L D1,D5
- 67 0000043A' 4C02 5800 + MULS.L D2,D5 ; D5=bh_yd * pre_cos[alpha]
- 68 0000043E' D885 + ADD.L D5,D4 ; D4=bh_xd * pre_sin[alpha] + bh_yd * pre_cos[alpha]
- 69 00000440' ECA4 + ASR.L D6,D4
- 70 00000442' D8BA 0046 + ADD.L bh_yc(PC),D4 ; D4.L=bh_ys
- 71 00000446' 6D 08 + BLT.S bhlind_tpir_030 ; ys < 0: not in range
- 72 00000448' B87A 004A + CMP.W bh_in_h(PC),D4
- 73 0000044C' 6C 02 + BGE.S bhlind_tpir_030 ; ys >= bh_in_h: not in range
- 74 0000044E' 7C00 + MOVEQ.L #0,D6 ; pixel in range
- 349 00000450' bhlind_tpir_030:
- 350 00000450' 70FF MOVEQ.L #-1,D0 ; Assume out of range
- 351 00000452' 4A46 TST.W D6
- 352 00000454' 66 0A BNE.S bhlind_setpix_030
- 353 00000456' 2034 4C00 MOVE.L (A4,D4.L*4),D0 ; D4=bh_ys, D0=pre_loffset[bh_ys]
- 354 0000045A' D08B ADD.L A3,D0 ; D0=pre_loffset[bh_ys] + bh_xs(A3)
- 355 0000045C' 1030 0800 MOVE.B (A0,D0.L),D0 ; D0=in_ptr[pre_loffset[bh_ys] + bh_xs]
- 356 00000460' bhlind_setpix_030:
- 357 00000460' 12C0 MOVE.B D0,(A1)+
- 358 00000462' 528E ADD.L #1,A6 ; bh_xd++
- 359 00000464' 51CF FF80 DBF D7,bhlind_l030
- 360
- 361 00000468' 4CDF 7CFF MOVEM.L (SP)+,D0-D7/A2-A6 ; Restore context
- 362 0000046C' 4E75 RTS
- 363
- 364 0000046E' .EVEN
- 365 0000046E' bh_xd:
- 366 0000046E' 0000 0000 DC.L 0
- 367 00000472' bh_yd:
- 368 00000472' 0000 0000 DC.L 0
- 369 00000476' bh_rd2:
- 370 00000476' 0000 0000 DC.L 0
- 371 0000047A' bh_xs:
- 372 0000047A' 0000 0000 DC.L 0
- 373 0000047E' bh_ys:
- 374 0000047E' 0000 0000 DC.L 0
- 375 00000482' bh_ref:
- 376 00000482' 0000 0000 DC.L 0
-PASM 68040 Macro Assembler Version Dec 18 1992 (C) 91 Pure Software Page 13
-Source File: H:\PURE_C\PROJECTS\VISION\LDV\SRC\BHOLE\BHOLE.S
-
- 377 00000486' bh_xc:
- 378 00000486' 0000 0000 DC.L 0
- 379 0000048A' bh_yc:
- 380 0000048A' 0000 0000 DC.L 0
- 381 0000048E' bh_out_w:
- 382 0000048E' 0000 DC.W 0
- 383 00000490' bh_out_h:
- 384 00000490' 0000 DC.W 0
- 385 00000492' bh_in_w:
- 386 00000492' 0000 DC.W 0
- 387 00000494' bh_in_h:
- 388 00000494' 0000 DC.W 0
- 389 00000496' bh_out_x:
- 390 00000496' 0000 DC.W 0
- 391 00000498' bh_out_y:
- 392 00000498' 0000 DC.W 0
- 393 0000049A' last_xd:
- 394 0000049A' 0000 DC.W 0
- 395
- 396 ; 68030/FPU routine for True Color 32bit
- 397 ; BHL32_F68030(short use_sym, void* in, void* out)
- 398 ; D0, A0 A1
- 399 0000049C' BHL32_F68030:
- 400 0000049C' 48E7 FF3E MOVEM.L D0-D7/A2-A6,-(SP) ; Save context
- 401 000004A0' F227 6800 FMOVE.X FP0,-(SP)
- 402
- 403 INIT_BHL
- 96 000004A4' 45F9 00000000* + LEA.L pre_cosin,A2
- 97 000004AA' 2879 00000000* + MOVE.L pre_loffset,A4 ; A4-->preoffset
- 98 000004B0' 2A7A FFC4 + MOVE.L bh_rd2(PC),A5 ; A5=bh_rd2
- 99 000004B4' 2C7A FFB8 + MOVE.L bh_xd(PC),A6 ; A6=bh_xd
- 100 000004B8' 3E3A FFD4 + MOVE.W bh_out_w(PC),D7
- 101 000004BC' 5347 + SUBQ.W #1,D7 ; For DBF
- 404 000004BE' bhl32_lf030:
- 405 BH_COMPUTE_FPU bhl32_tpir_f030 ; -->D6=0:pixel in range
- 30 000004BE' 200E + MOVE.L A6,D0 ; Remember A6=bh_xd
- 31 000004C0' D080 + ADD.L D0,D0
- 32 000004C2' 5280 + ADDQ.L #1,D0
- 33 000004C4' 220D + MOVE.L A5,D1 ; Remember A5=bh_rd2
- 34 000004C6' D280 + ADD.L D0,D1 ; bh_rd2(D1)=1+2*bh_xd(D0)
- 35 000004C8' 243A FFB8 + MOVE.L bh_ref(PC),D2
- 36 000004CC' 2A41 + MOVE.L D1,A5 ; Save bh_rd2, free D1
- 37 000004CE' 5281 + ADDQ.L #1,D1 ; We need bh_rd2+1 for divide
- 88 000004D0' F201 4000 + FMOVE.L D1,FP0
- 89 000004D4' F200 0004 + FSQRT FP0
- 90 000004D8' F201 6000 + FMOVE.L FP0,D1
- 41 000004DC' 4C41 2002 + DIVU.L D1,D2 ; alpha(D2)=bh_ref/(1+bh_rd2)
- 42 000004E0' 0282 0000 3FFF + ANDI.L #ITRIGO_ANGLE_MAX,D2 ; alpha &= ITRIGO_ANGLE_MAX
- 44 000004E6' E78A + LSL.L #3,D2 ; D2=offset for pre_cosin array
- 45 000004E8' 200E + MOVE.L A6,D0 ; D0=bh_xd
- 46 000004EA' 223A FF86 + MOVE.L bh_yd(PC),D1 ; D1=bh_yd
- 47 000004EE' 2632 2804 + MOVE.L 4(A2,D2.L),D3 ; A2->pre_cosin, D3.L=SIN(alpha)
- 48 000004F2' 2432 2800 + MOVE.L (A2,D2.L),D2 ; A2->pre_cosin, D2.L=COS(alpha)
- 50 000004F6' 7C10 + MOVEQ.L #16,D6 ; Prepare shifts/assume not in range
- 52 000004F8' 2800 + MOVE.L D0,D4
- 53 000004FA' 4C02 4800 + MULS.L D2,D4 ; D4=bh_xd * pre_cos[alpha]
-PASM 68040 Macro Assembler Version Dec 18 1992 (C) 91 Pure Software Page 14
-Source File: H:\PURE_C\PROJECTS\VISION\LDV\SRC\BHOLE\BHOLE.S
-
- 54 000004FE' 2A01 + MOVE.L D1,D5
- 55 00000500' 4C03 5800 + MULS.L D3,D5 ; D5=bh_yd * pre_sin[alpha]
- 56 00000504' 9885 + SUB.L D5,D4 ; D4=bh_xd * pre_cos[alpha] - bh_yd * pre_sin[alpha]
- 57 00000506' ECA4 + ASR.L D6,D4
- 58 00000508' D8BA FF7C + ADD.L bh_xc(PC),D4 ; D6=16, assume pixel not in range
- 59 0000050C' 6D 26 + BLT.S bhl32_tpir_f030 ; xs < 0: not in range
- 60 0000050E' B87A FF82 + CMP.W bh_in_w(PC),D4
- 61 00000512' 6C 20 + BGE.S bhl32_tpir_f030 ; xs >= bh_in_w: not in range
- 62 00000514' 2644 + MOVE.L D4,A3 ; A3=bh_xs= (D4 >> 16)
- 64 00000516' 2800 + MOVE.L D0,D4
- 65 00000518' 4C03 4800 + MULS.L D3,D4 ; D4=bh_xd * pre_sin[alpha]
- 66 0000051C' 2A01 + MOVE.L D1,D5
- 67 0000051E' 4C02 5800 + MULS.L D2,D5 ; D5=bh_yd * pre_cos[alpha]
- 68 00000522' D885 + ADD.L D5,D4 ; D4=bh_xd * pre_sin[alpha] + bh_yd * pre_cos[alpha]
- 69 00000524' ECA4 + ASR.L D6,D4
- 70 00000526' D8BA FF62 + ADD.L bh_yc(PC),D4 ; D4.L=bh_ys
- 71 0000052A' 6D 08 + BLT.S bhl32_tpir_f030 ; ys < 0: not in range
- 72 0000052C' B87A FF66 + CMP.W bh_in_h(PC),D4
- 73 00000530' 6C 02 + BGE.S bhl32_tpir_f030 ; ys >= bh_in_h: not in range
- 74 00000532' 7C00 + MOVEQ.L #0,D6 ; pixel in range
- 406 00000534' bhl32_tpir_f030:
- 407 00000534' 70FF MOVEQ.L #-1,D0 ; Assume out of range
- 408 00000536' 4A46 TST.W D6
- 409 00000538' 66 0A BNE.S bhl32_setpix_f030
- 410 0000053A' 2034 4C00 MOVE.L (A4,D4.L*4),D0 ; D4=bh_ys, D0=pre_loffset[bh_ys]
- 411 0000053E' D08B ADD.L A3,D0 ; D0=pre_loffset[bh_ys] + bh_xs(A3)
- 412 00000540' 2030 0C00 MOVE.L (A0,D0.L*4),D0 ; D0=in_ptr[pre_loffset[bh_ys] + bh_xs]
- 413 00000544' bhl32_setpix_f030:
- 414 00000544' 22C0 MOVE.L D0,(A1)+
- 415 00000546' 528E ADD.L #1,A6 ; bh_xd++
- 416 00000548' 51CF FF74 DBF D7,bhl32_lf030
- 417
- 418 0000054C' F21F 4800 FMOVE.X (SP)+,FP0
- 419 00000550' 4CDF 7CFF MOVEM.L (SP)+,D0-D7/A2-A6 ; Restore context
- 420 00000554' 4E75 RTS
- 421
- 422 ; 68030/FPU routine for True Color 16bit
- 423 ; BHL16_F68030(short use_sym, void* in, void* out)
- 424 ; D0, A0 A1
- 425 00000556' BHL16_F68030:
- 426 00000556' 48E7 FF3E MOVEM.L D0-D7/A2-A6,-(SP) ; Save context
- 427 0000055A' F227 6800 FMOVE.X FP0,-(SP)
- 428
- 429 INIT_BHL
- 96 0000055E' 45F9 00000000* + LEA.L pre_cosin,A2
- 97 00000564' 2879 00000000* + MOVE.L pre_loffset,A4 ; A4-->preoffset
- 98 0000056A' 2A7A FF0A + MOVE.L bh_rd2(PC),A5 ; A5=bh_rd2
- 99 0000056E' 2C7A FEFE + MOVE.L bh_xd(PC),A6 ; A6=bh_xd
- 100 00000572' 3E3A FF1A + MOVE.W bh_out_w(PC),D7
- 101 00000576' 5347 + SUBQ.W #1,D7 ; For DBF
- 430 00000578' bhl16_lf030:
- 431 BH_COMPUTE_FPU bhl16_tpir_f030 ; -->D6=0:pixel in range
- 30 00000578' 200E + MOVE.L A6,D0 ; Remember A6=bh_xd
- 31 0000057A' D080 + ADD.L D0,D0
- 32 0000057C' 5280 + ADDQ.L #1,D0
- 33 0000057E' 220D + MOVE.L A5,D1 ; Remember A5=bh_rd2
-PASM 68040 Macro Assembler Version Dec 18 1992 (C) 91 Pure Software Page 15
-Source File: H:\PURE_C\PROJECTS\VISION\LDV\SRC\BHOLE\BHOLE.S
-
- 34 00000580' D280 + ADD.L D0,D1 ; bh_rd2(D1)=1+2*bh_xd(D0)
- 35 00000582' 243A FEFE + MOVE.L bh_ref(PC),D2
- 36 00000586' 2A41 + MOVE.L D1,A5 ; Save bh_rd2, free D1
- 37 00000588' 5281 + ADDQ.L #1,D1 ; We need bh_rd2+1 for divide
- 88 0000058A' F201 4000 + FMOVE.L D1,FP0
- 89 0000058E' F200 0004 + FSQRT FP0
- 90 00000592' F201 6000 + FMOVE.L FP0,D1
- 41 00000596' 4C41 2002 + DIVU.L D1,D2 ; alpha(D2)=bh_ref/(1+bh_rd2)
- 42 0000059A' 0282 0000 3FFF + ANDI.L #ITRIGO_ANGLE_MAX,D2 ; alpha &= ITRIGO_ANGLE_MAX
- 44 000005A0' E78A + LSL.L #3,D2 ; D2=offset for pre_cosin array
- 45 000005A2' 200E + MOVE.L A6,D0 ; D0=bh_xd
- 46 000005A4' 223A FECC + MOVE.L bh_yd(PC),D1 ; D1=bh_yd
- 47 000005A8' 2632 2804 + MOVE.L 4(A2,D2.L),D3 ; A2->pre_cosin, D3.L=SIN(alpha)
- 48 000005AC' 2432 2800 + MOVE.L (A2,D2.L),D2 ; A2->pre_cosin, D2.L=COS(alpha)
- 50 000005B0' 7C10 + MOVEQ.L #16,D6 ; Prepare shifts/assume not in range
- 52 000005B2' 2800 + MOVE.L D0,D4
- 53 000005B4' 4C02 4800 + MULS.L D2,D4 ; D4=bh_xd * pre_cos[alpha]
- 54 000005B8' 2A01 + MOVE.L D1,D5
- 55 000005BA' 4C03 5800 + MULS.L D3,D5 ; D5=bh_yd * pre_sin[alpha]
- 56 000005BE' 9885 + SUB.L D5,D4 ; D4=bh_xd * pre_cos[alpha] - bh_yd * pre_sin[alpha]
- 57 000005C0' ECA4 + ASR.L D6,D4
- 58 000005C2' D8BA FEC2 + ADD.L bh_xc(PC),D4 ; D6=16, assume pixel not in range
- 59 000005C6' 6D 26 + BLT.S bhl16_tpir_f030 ; xs < 0: not in range
- 60 000005C8' B87A FEC8 + CMP.W bh_in_w(PC),D4
- 61 000005CC' 6C 20 + BGE.S bhl16_tpir_f030 ; xs >= bh_in_w: not in range
- 62 000005CE' 2644 + MOVE.L D4,A3 ; A3=bh_xs= (D4 >> 16)
- 64 000005D0' 2800 + MOVE.L D0,D4
- 65 000005D2' 4C03 4800 + MULS.L D3,D4 ; D4=bh_xd * pre_sin[alpha]
- 66 000005D6' 2A01 + MOVE.L D1,D5
- 67 000005D8' 4C02 5800 + MULS.L D2,D5 ; D5=bh_yd * pre_cos[alpha]
- 68 000005DC' D885 + ADD.L D5,D4 ; D4=bh_xd * pre_sin[alpha] + bh_yd * pre_cos[alpha]
- 69 000005DE' ECA4 + ASR.L D6,D4
- 70 000005E0' D8BA FEA8 + ADD.L bh_yc(PC),D4 ; D4.L=bh_ys
- 71 000005E4' 6D 08 + BLT.S bhl16_tpir_f030 ; ys < 0: not in range
- 72 000005E6' B87A FEAC + CMP.W bh_in_h(PC),D4
- 73 000005EA' 6C 02 + BGE.S bhl16_tpir_f030 ; ys >= bh_in_h: not in range
- 74 000005EC' 7C00 + MOVEQ.L #0,D6 ; pixel in range
- 432 000005EE' bhl16_tpir_f030:
- 433 000005EE' 70FF MOVEQ.L #-1,D0 ; Assume out of range
- 434 000005F0' 4A46 TST.W D6
- 435 000005F2' 66 0A BNE.S bhl16_setpix_f030
- 436 000005F4' 2034 4C00 MOVE.L (A4,D4.L*4),D0 ; D4=bh_ys, D0=pre_loffset[bh_ys]
- 437 000005F8' D08B ADD.L A3,D0 ; D0=pre_loffset[bh_ys] + bh_xs(A3)
- 438 000005FA' 3030 0A00 MOVE.W (A0,D0.L*2),D0 ; D0=in_ptr[pre_loffset[bh_ys] + bh_xs]
- 439 000005FE' bhl16_setpix_f030:
- 440 000005FE' 32C0 MOVE.W D0,(A1)+
- 441 00000600' 528E ADD.L #1,A6 ; bh_xd++
- 442 00000602' 51CF FF74 DBF D7,bhl16_lf030
- 443
- 444 00000606' F21F 4800 FMOVE.X (SP)+,FP0
- 445 0000060A' 4CDF 7CFF MOVEM.L (SP)+,D0-D7/A2-A6 ; Restore context
- 446 0000060E' 4E75 RTS
- 447
- 448 ; 68030/FPU routine for bitplances images, converted to indexes
- 449 ; BHLInd_F68030(short use_sym, void* in, void* out)
- 450 ; D0, A0 A1
-PASM 68040 Macro Assembler Version Dec 18 1992 (C) 91 Pure Software Page 16
-Source File: H:\PURE_C\PROJECTS\VISION\LDV\SRC\BHOLE\BHOLE.S
-
- 451 00000610' BHLInd_F68030:
- 452 00000610' 48E7 FF3E MOVEM.L D0-D7/A2-A6,-(SP) ; Save context
- 453 00000614' F227 6800 FMOVE.X FP0,-(SP)
- 454
- 455 INIT_BHL
- 96 00000618' 45F9 00000000* + LEA.L pre_cosin,A2
- 97 0000061E' 2879 00000000* + MOVE.L pre_loffset,A4 ; A4-->preoffset
- 98 00000624' 2A7A FE50 + MOVE.L bh_rd2(PC),A5 ; A5=bh_rd2
- 99 00000628' 2C7A FE44 + MOVE.L bh_xd(PC),A6 ; A6=bh_xd
- 100 0000062C' 3E3A FE60 + MOVE.W bh_out_w(PC),D7
- 101 00000630' 5347 + SUBQ.W #1,D7 ; For DBF
- 456 00000632' bhlInd_lf030:
- 457 BH_COMPUTE_FPU bhlInd_tpir_f030 ; -->D6=0:pixel in range
- 30 00000632' 200E + MOVE.L A6,D0 ; Remember A6=bh_xd
- 31 00000634' D080 + ADD.L D0,D0
- 32 00000636' 5280 + ADDQ.L #1,D0
- 33 00000638' 220D + MOVE.L A5,D1 ; Remember A5=bh_rd2
- 34 0000063A' D280 + ADD.L D0,D1 ; bh_rd2(D1)=1+2*bh_xd(D0)
- 35 0000063C' 243A FE44 + MOVE.L bh_ref(PC),D2
- 36 00000640' 2A41 + MOVE.L D1,A5 ; Save bh_rd2, free D1
- 37 00000642' 5281 + ADDQ.L #1,D1 ; We need bh_rd2+1 for divide
- 88 00000644' F201 4000 + FMOVE.L D1,FP0
- 89 00000648' F200 0004 + FSQRT FP0
- 90 0000064C' F201 6000 + FMOVE.L FP0,D1
- 41 00000650' 4C41 2002 + DIVU.L D1,D2 ; alpha(D2)=bh_ref/(1+bh_rd2)
- 42 00000654' 0282 0000 3FFF + ANDI.L #ITRIGO_ANGLE_MAX,D2 ; alpha &= ITRIGO_ANGLE_MAX
- 44 0000065A' E78A + LSL.L #3,D2 ; D2=offset for pre_cosin array
- 45 0000065C' 200E + MOVE.L A6,D0 ; D0=bh_xd
- 46 0000065E' 223A FE12 + MOVE.L bh_yd(PC),D1 ; D1=bh_yd
- 47 00000662' 2632 2804 + MOVE.L 4(A2,D2.L),D3 ; A2->pre_cosin, D3.L=SIN(alpha)
- 48 00000666' 2432 2800 + MOVE.L (A2,D2.L),D2 ; A2->pre_cosin, D2.L=COS(alpha)
- 50 0000066A' 7C10 + MOVEQ.L #16,D6 ; Prepare shifts/assume not in range
- 52 0000066C' 2800 + MOVE.L D0,D4
- 53 0000066E' 4C02 4800 + MULS.L D2,D4 ; D4=bh_xd * pre_cos[alpha]
- 54 00000672' 2A01 + MOVE.L D1,D5
- 55 00000674' 4C03 5800 + MULS.L D3,D5 ; D5=bh_yd * pre_sin[alpha]
- 56 00000678' 9885 + SUB.L D5,D4 ; D4=bh_xd * pre_cos[alpha] - bh_yd * pre_sin[alpha]
- 57 0000067A' ECA4 + ASR.L D6,D4
- 58 0000067C' D8BA FE08 + ADD.L bh_xc(PC),D4 ; D6=16, assume pixel not in range
- 59 00000680' 6D 26 + BLT.S bhlInd_tpir_f030 ; xs < 0: not in range
- 60 00000682' B87A FE0E + CMP.W bh_in_w(PC),D4
- 61 00000686' 6C 20 + BGE.S bhlInd_tpir_f030 ; xs >= bh_in_w: not in range
- 62 00000688' 2644 + MOVE.L D4,A3 ; A3=bh_xs= (D4 >> 16)
- 64 0000068A' 2800 + MOVE.L D0,D4
- 65 0000068C' 4C03 4800 + MULS.L D3,D4 ; D4=bh_xd * pre_sin[alpha]
- 66 00000690' 2A01 + MOVE.L D1,D5
- 67 00000692' 4C02 5800 + MULS.L D2,D5 ; D5=bh_yd * pre_cos[alpha]
- 68 00000696' D885 + ADD.L D5,D4 ; D4=bh_xd * pre_sin[alpha] + bh_yd * pre_cos[alpha]
- 69 00000698' ECA4 + ASR.L D6,D4
- 70 0000069A' D8BA FDEE + ADD.L bh_yc(PC),D4 ; D4.L=bh_ys
- 71 0000069E' 6D 08 + BLT.S bhlInd_tpir_f030 ; ys < 0: not in range
- 72 000006A0' B87A FDF2 + CMP.W bh_in_h(PC),D4
- 73 000006A4' 6C 02 + BGE.S bhlInd_tpir_f030 ; ys >= bh_in_h: not in range
- 74 000006A6' 7C00 + MOVEQ.L #0,D6 ; pixel in range
- 458 000006A8' bhlInd_tpir_f030:
- 459 000006A8' 70FF MOVEQ.L #-1,D0 ; Assume out of range
-PASM 68040 Macro Assembler Version Dec 18 1992 (C) 91 Pure Software Page 17
-Source File: H:\PURE_C\PROJECTS\VISION\LDV\SRC\BHOLE\BHOLE.S
-
- 460 000006AA' 4A46 TST.W D6
- 461 000006AC' 66 0A BNE.S bhlInd_setpix_f030
- 462 000006AE' 2034 4C00 MOVE.L (A4,D4.L*4),D0 ; D4=bh_ys, D0=pre_loffset[bh_ys]
- 463 000006B2' D08B ADD.L A3,D0 ; D0=pre_loffset[bh_ys] + bh_xs
- 464 000006B4' 1030 0800 MOVE.B (A0,D0.L),D0 ; D0=in_ptr[pre_loffset[bh_ys] + bh_xs]
- 465 000006B8' bhlInd_setpix_f030:
- 466 000006B8' 12C0 MOVE.B D0,(A1)+
- 467 000006BA' 528E ADD.L #1,A6 ; bh_xd++
- 468 000006BC' 51CF FF74 DBF D7,bhlInd_lf030
- 469
- 470 000006C0' F21F 4800 FMOVE.X (SP)+,FP0
- 471 000006C4' 4CDF 7CFF MOVEM.L (SP)+,D0-D7/A2-A6 ; Restore context
- 472 000006C8' 4E75 RTS
- 473
- 474 ; Pre-calculation of cosinus/sinus table using FPU
- 475 ; void lcosin_fpu(long i, long* pcs)
- 476 ; D0 A0
- 477 ; double angle = i*ANGLE_ADD ;
- 478 ; pcs[0] = 65536.0 * cos( angle ) ;
- 479 ; pcs[1] = 65536.0 * sin( angle ) ;
- 480 000006CA' lcosin_fpu:
- 481 000006CA' F227 E007 FMOVEM.X FP0-FP2,-(SP)
- 482
- 483 000006CE' F200 5000 FMOVE D0,FP0
- 484 ; 3.8349519697141030742952189737299e-4=M_PI/2.0/(double)QUARTER
- 485 ; For some reason, I did not manage to use EQU with floating point constants
- 486 000006D2' F23C 4823 3FF3 0000
- 000006DA' C90F DAA2 2168 C234 FMUL.X #3.8349519697141030742952189737299e-4,FP0
- 487 000006E2' F200 0131 FSINCOS.X FP0,FP1:FP2
- 488 000006E6' F23C 48A3 400F 0000
- 000006EE' 8000 0000 0000 0000 FMUL.X #65536.0,FP1
- 489 000006F6' F23C 4923 400F 0000
- 000006FE' 8000 0000 0000 0000 FMUL.X #65536.0,FP2
- 490 00000706' F218 6080 FMOVE.L FP1,(A0)+
- 491 0000070A' F210 6100 FMOVE.L FP2,(A0)
- 492
- 493 0000070E' F21F D0E0 FMOVEM.X (SP)+,FP0-FP2
- 494 00000712' 4E75 RTS
-PASM 68040 Macro Assembler Version Dec 18 1992 (C) 91 Pure Software Page 18
-Source File: H:\PURE_C\PROJECTS\VISION\LDV\SRC\BHOLE\BHOLE.S
-
-
-
-Symbols:
-========
-
-Name Value Scope Relocation base
-
-BHL16_68030 000001E4 Global TEXT
-BHL16_68030_sym 0000029A File TEXT
-BHL16_F68030 00000556 Global TEXT
-BHL32_68030 00000000 Global TEXT
-BHL32_68030_sym 000000B6 File TEXT
-BHL32_F68030 0000049C Global TEXT
-BHLInd_68030 000003C8 Global TEXT
-BHLInd_F68030 00000610 Global TEXT
-ITRIGO_ANGLE_MAX 00003FFF File EQUATE
-ITRIGO_ARRAY_SIZE 00004000 File EQUATE
-QUARTER 00001000 File EQUATE
-bh_in_h 00000494 Global TEXT
-bh_in_w 00000492 Global TEXT
-bh_out_h 00000490 Global TEXT
-bh_out_w 0000048E Global TEXT
-bh_out_x 00000496 Global TEXT
-bh_out_y 00000498 Global TEXT
-bh_rd2 00000476 Global TEXT
-bh_ref 00000482 Global TEXT
-bh_xc 00000486 Global TEXT
-bh_xd 0000046E Global TEXT
-bh_xs 0000047A Global TEXT
-bh_yc 0000048A Global TEXT
-bh_yd 00000472 Global TEXT
-bh_ys 0000047E Global TEXT
-bhl16_l030 00000212 File TEXT
-bhl16_l030_sym 000002BC File TEXT
-bhl16_lf030 00000578 File TEXT
-bhl16_setpix_030 0000028C File TEXT
-bhl16_setpix_030_sym 00000336 File TEXT
-bhl16_setpix_f030 000005FE File TEXT
-bhl16_tpir_030 0000027C File TEXT
-bhl16_tpir_030_sym 00000326 File TEXT
-bhl16_tpir_f030 000005EE File TEXT
-bhl32_l030 0000002E File TEXT
-bhl32_l030_sym 000000D8 File TEXT
-bhl32_lf030 000004BE File TEXT
-bhl32_setpix_030 000000A8 File TEXT
-bhl32_setpix_030_sym 00000152 File TEXT
-bhl32_setpix_f030 00000544 File TEXT
-bhl32_tpir_030 00000098 File TEXT
-bhl32_tpir_030_sym 00000142 File TEXT
-bhl32_tpir_f030 00000534 File TEXT
-bhlInd_lf030 00000632 File TEXT
-bhlInd_setpix_f030 000006B8 File TEXT
-bhlInd_tpir_f030 000006A8 File TEXT
-bhlind_l030 000003E6 File TEXT
-bhlind_setpix_030 00000460 File TEXT
-bhlind_tpir_030 00000450 File TEXT
-deduc16_030 00000354 File TEXT
-deduc32_030 00000170 File TEXT
-dnotinimg16_030 000003B2 File TEXT
-dnotinimg32_030 000001CE File TEXT
-last_xd 0000049A File TEXT
-lcosin_fpu 000006CA Global TEXT
-plotdest16_030 000003A8 File TEXT
-plotdest32_030 000001C4 File TEXT
-pre_cosin ******** External
-pre_loffset ******** External
diff --git a/tools/vision/LDV/SRC/gamma/GAMMA.LDV b/tools/vision/LDV/SRC/gamma/GAMMA.LDV
deleted file mode 100644
index 3a20601..0000000
Binary files a/tools/vision/LDV/SRC/gamma/GAMMA.LDV and /dev/null differ
diff --git a/tools/vision/LDV/SRC/light/LIGHT.LDV b/tools/vision/LDV/SRC/light/LIGHT.LDV
deleted file mode 100644
index 8b35128..0000000
Binary files a/tools/vision/LDV/SRC/light/LIGHT.LDV and /dev/null differ
diff --git a/tools/vision/LDV/SRC/puzzle/puzzle.ldv b/tools/vision/LDV/SRC/puzzle/puzzle.ldv
deleted file mode 100644
index 4f3c35b..0000000
Binary files a/tools/vision/LDV/SRC/puzzle/puzzle.ldv and /dev/null differ
diff --git a/tools/vision/LDV/SRC/rotate/ROTATE.LDV b/tools/vision/LDV/SRC/rotate/ROTATE.LDV
deleted file mode 100644
index 6b268c4..0000000
Binary files a/tools/vision/LDV/SRC/rotate/ROTATE.LDV and /dev/null differ
diff --git a/tools/vision/LDV/YPERSC.LDV b/tools/vision/LDV/YPERSC.LDV
deleted file mode 100644
index b1a83ca..0000000
Binary files a/tools/vision/LDV/YPERSC.LDV and /dev/null differ
diff --git a/tools/vision/LDV/bhole.ldv b/tools/vision/LDV/bhole.ldv
deleted file mode 100644
index 3f923fa..0000000
Binary files a/tools/vision/LDV/bhole.ldv and /dev/null differ
diff --git a/tools/vision/LDV/puzzle.ldv b/tools/vision/LDV/puzzle.ldv
deleted file mode 100644
index 4f3c35b..0000000
Binary files a/tools/vision/LDV/puzzle.ldv and /dev/null differ
diff --git a/tools/vision/VISION.PRG b/tools/vision/VISION.PRG
deleted file mode 100644
index 9a91cb1..0000000
Binary files a/tools/vision/VISION.PRG and /dev/null differ
diff --git a/tools/vision/cacert.pem b/tools/vision/cacert.pem
new file mode 100644
index 0000000..0bf312f
--- /dev/null
+++ b/tools/vision/cacert.pem
@@ -0,0 +1,3232 @@
+##
+## Bundle of CA Root Certificates
+##
+## Certificate data from Mozilla as of: Tue Oct 26 03:12:05 2021 GMT
+##
+## This is a bundle of X.509 certificates of public Certificate Authorities
+## (CA). These were automatically extracted from Mozilla's root certificates
+## file (certdata.txt). This file can be found in the mozilla source tree:
+## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt
+##
+## It contains the certificates in PEM format and therefore
+## can be directly used with curl / libcurl / php_curl, or with
+## an Apache+mod_ssl webserver for SSL client authentication.
+## Just configure this file as the SSLCACertificateFile.
+##
+## Conversion done with mk-ca-bundle.pl version 1.28.
+## SHA256: bb36818a81feaa4cca61101e6d6276cd09e972efcb08112dfed846918ca41d7f
+##
+
+
+GlobalSign Root CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
+GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
+b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
+BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
+VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
+DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
+THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
+Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
+c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
+gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
+AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
+Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
+j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
+hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
+X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
+YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
+bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
+aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
+ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
+s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
+S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
+TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
+ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
+FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
+YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
+BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
+9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
+01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
+9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
+TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
+-----END CERTIFICATE-----
+
+Entrust.net Premium 2048 Secure Server CA
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
+ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
+bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
+BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
+NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
+d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
+MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
+ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
+Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
+hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
+nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
+VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ
+KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy
+T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
+zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT
+J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e
+nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=
+-----END CERTIFICATE-----
+
+Baltimore CyberTrust Root
+=========================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
+ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
+ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
+SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
+dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
+uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
+UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
+G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
+XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
+l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
+VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
+BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
+cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
+hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
+Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
+RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
+BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
+b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
+A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
+MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
+MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
+Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
+dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
+A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
+Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
+j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
+rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
+MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
+hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
+A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
+Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
+v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
+W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
+tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
+-----END CERTIFICATE-----
+
+Comodo AAA Services root
+========================
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
+MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
+c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
+BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
+C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
+i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
+Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
+Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
+Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
+BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
+cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
+LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
+7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
+8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
+12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 2
+==================
+-----BEGIN CERTIFICATE-----
+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
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 3
+==================
+-----BEGIN CERTIFICATE-----
+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
+-----END CERTIFICATE-----
+
+Security Communication Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
+HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
+8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
+DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
+5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
+DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
+JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
+0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
+mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
+s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
+6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
+FL39vmwLAw==
+-----END CERTIFICATE-----
+
+XRamp Global CA Root
+====================
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
+BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
+dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
+HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
+U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
+IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
+foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
+zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
+AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
+xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
+oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
+AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
+/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
+qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
+nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
+8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
+-----END CERTIFICATE-----
+
+Go Daddy Class 2 CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
+VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
+A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
+RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
+ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
+2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
+qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
+YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
+vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
+BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
+atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
+MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
+A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
+PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
+I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
+HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
+Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
+vZ8=
+-----END CERTIFICATE-----
+
+Starfield Class 2 CA
+====================
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
+U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
+MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
+A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
+SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
+bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
+JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
+epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
+F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
+MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
+hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
+bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
+afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
+PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
+xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
+KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
+QBFGmh95DmK/D5fs4C8fF5Q=
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
+IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
+MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
+ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
+9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
+UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
+/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
+oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
+GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
+66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
+hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
+EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
+SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
+8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
+-----END CERTIFICATE-----
+
+DigiCert Global Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
+HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
+MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
+dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
+TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
+BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
+4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
+7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
+o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
+8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
+BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
+EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
+tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
+UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
+-----END CERTIFICATE-----
+
+DigiCert High Assurance EV Root CA
+==================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
+KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
+MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
+MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
+Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
+Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
+OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
+MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
+NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
+h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
+Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
+JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
+V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
+myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
+mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
+-----END CERTIFICATE-----
+
+SwissSign Gold CA - G2
+======================
+-----BEGIN CERTIFICATE-----
+MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
+EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
+MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
+c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
+t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
+jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
+vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
+ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
+AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
+jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
+peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
+7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
+GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
+OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
+L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
+5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
+44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
+Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
+Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
+mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
+vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
+KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
+NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
+viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
+-----END CERTIFICATE-----
+
+SwissSign Silver CA - G2
+========================
+-----BEGIN CERTIFICATE-----
+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
+-----END CERTIFICATE-----
+
+SecureTrust CA
+==============
+-----BEGIN CERTIFICATE-----
+MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
+dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
+BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
+OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
+DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
+GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
+01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
+ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
+aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
+KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
+SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
+mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
+nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
+3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
+-----END CERTIFICATE-----
+
+Secure Global CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
+bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
+MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
+Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
+YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
+bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
+8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
+HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
+0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
+oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
+MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
+CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
+3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
+f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
+-----END CERTIFICATE-----
+
+COMODO Certification Authority
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
+BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
+A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
+dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
+MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
+T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
+xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
+4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
+1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
+rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
+b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
+AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
+OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
+RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
+IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
+-----END CERTIFICATE-----
+
+Network Solutions Certificate Authority
+=======================================
+-----BEGIN CERTIFICATE-----
+MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
+EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
+IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
+MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
+MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
+jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
+aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
+crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
+/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
+AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
+bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
+A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
+4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
+GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
+wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
+ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
+-----END CERTIFICATE-----
+
+COMODO ECC Certification Authority
+==================================
+-----BEGIN CERTIFICATE-----
+MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
+R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
+ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
+GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
+Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
+b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
+4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
+wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
+FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
+U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
+-----END CERTIFICATE-----
+
+Certigna
+========
+-----BEGIN CERTIFICATE-----
+MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
+EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
+MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
+Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
+XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
+GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
+ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
+DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
+Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
+tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
+BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
+SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
+hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
+PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
+1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
+WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
+-----END CERTIFICATE-----
+
+Cybertrust Global Root
+======================
+-----BEGIN CERTIFICATE-----
+MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
+ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
+MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
+ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
+0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
+AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
+89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
+8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
+MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
+A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
+lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
+5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
+hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
+X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
+WL1WMRJOEcgh4LMRkWXbtKaIOM5V
+-----END CERTIFICATE-----
+
+ePKI Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
+EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
+Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
+MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
+MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
+IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
+lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
+qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
+12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
+WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
+lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
+vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
+Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
+MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
+ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
+1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
+KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
+xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
+NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
+GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
+xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
+gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
+sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
+BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
+-----END CERTIFICATE-----
+
+certSIGN ROOT CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
+VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
+Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
+CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
+JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
+rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
+ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
+0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
+AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
+Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
+AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
+SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
+x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
+vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
+TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
+-----END CERTIFICATE-----
+
+NetLock Arany (Class Gold) FÅ‘tanúsÃtvány
+========================================
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
+A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
+dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
+cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
+MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
+ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
+biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
+c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
+0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
+/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
+H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
+fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
+neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
+qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
+YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
+bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
+NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
+dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
+-----END CERTIFICATE-----
+
+Hongkong Post Root CA 1
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
+DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
+NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
+IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
+ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
+auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
+qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
+V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
+HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
+h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
+l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
+IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
+T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
+c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
+-----END CERTIFICATE-----
+
+SecureSign RootCA11
+===================
+-----BEGIN CERTIFICATE-----
+MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
+SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
+b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
+KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
+cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
+TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
+wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
+g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
+O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
+bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
+t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
+OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
+bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
+Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
+y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
+lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
+-----END CERTIFICATE-----
+
+Microsec e-Szigno Root CA 2009
+==============================
+-----BEGIN CERTIFICATE-----
+MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
+MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
+c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
+dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
+BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
+U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
+fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
+0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
+pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
+1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
+AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
+QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
+FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
+lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
+I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
+tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
+yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
+LXpUq3DDfSJlgnCW
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R3
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
+YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
+bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
+aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
+iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
+0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
+rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
+OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
+xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
+lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
+EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
+bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
+YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
+kpeDMdmztcpHWD9f
+-----END CERTIFICATE-----
+
+Autoridad de Certificacion Firmaprofesional CIF A62634068
+=========================================================
+-----BEGIN CERTIFICATE-----
+MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
+BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
+MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
+QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
+NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
+Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
+B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
+7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
+ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
+plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
+MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
+LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
+bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
+vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
+EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
+DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
+cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
+bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
+ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
+51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
+R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
+T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
+Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
+osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
+crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
+saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
+KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
+6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
+-----END CERTIFICATE-----
+
+Izenpe.com
+==========
+-----BEGIN CERTIFICATE-----
+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
+-----END CERTIFICATE-----
+
+Go Daddy Root Certificate Authority - G2
+========================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
+MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
+MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
+b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
+A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
+9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
+fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
+NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
+BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
+vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
+5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
+N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
+LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
+-----END CERTIFICATE-----
+
+Starfield Root Certificate Authority - G2
+=========================================
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
+b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
+eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
+DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
+VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
+dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
+W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
+bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
+N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
+ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
+JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
+TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
+4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
+F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
+pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
+c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
+-----END CERTIFICATE-----
+
+Starfield Services Root Certificate Authority - G2
+==================================================
+-----BEGIN CERTIFICATE-----
+MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
+b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
+IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
+BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
+dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
+h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
+hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
+LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
+rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
+SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
+E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
+xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
+iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
+YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
+-----END CERTIFICATE-----
+
+AffirmTrust Commercial
+======================
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
+MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
+DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
+C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
+BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
+MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
+HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
+hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
+qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
+0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
+sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
+-----END CERTIFICATE-----
+
+AffirmTrust Networking
+======================
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
+MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
+Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
+dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
+/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
+h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
+HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
+UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
+12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
+WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
+/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
+-----END CERTIFICATE-----
+
+AffirmTrust Premium
+===================
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
+OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
+dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
+BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
+5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
+GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
+p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
+S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
+6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
+/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
+MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
+Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
+6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
+L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
+BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
+IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
+g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
+zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
+-----END CERTIFICATE-----
+
+AffirmTrust Premium ECC
+=======================
+-----BEGIN CERTIFICATE-----
+MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
+BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
+MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
+cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
+IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
+N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
+BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
+BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
+57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
+eQ==
+-----END CERTIFICATE-----
+
+Certum Trusted Network CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
+ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
+MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
+ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
+l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
+J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
+fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
+cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
+Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
+DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
+jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
+mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
+Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
+03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
+-----END CERTIFICATE-----
+
+TWCA Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
+VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
+EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
+IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
+QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
+oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
+4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
+y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
+9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
+mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
+QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
+T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
+Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
+-----END CERTIFICATE-----
+
+Security Communication RootCA2
+==============================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
+U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
+dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
+SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
+aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
+3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
+spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
+EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
+QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
+CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
+u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
+3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
+tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
+mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
+-----END CERTIFICATE-----
+
+EC-ACC
+======
+-----BEGIN CERTIFICATE-----
+MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
+BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
+ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
+VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
+CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
+BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
+MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
+SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
+Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
+cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
+w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
+ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
+HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
+E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
+0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
+VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
+Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
+dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
+lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
+Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
+l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
+E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
+5EI=
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions RootCA 2011
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
+O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
+aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
+IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
+AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
+IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
+IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
+1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
+71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
+8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
+3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
+MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
+MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
+b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
+XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
+TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
+/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
+7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
+-----END CERTIFICATE-----
+
+Actalis Authentication Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+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
+-----END CERTIFICATE-----
+
+Buypass Class 2 Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X
+DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
+eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1
+g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn
+9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b
+/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU
+CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff
+awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI
+zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn
+Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX
+Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs
+M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
+AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
+A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI
+osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S
+aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd
+DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD
+LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0
+oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC
+wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS
+CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN
+rJgWVqA=
+-----END CERTIFICATE-----
+
+Buypass Class 3 Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X
+DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
+eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH
+sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR
+5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh
+7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ
+ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH
+2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV
+/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ
+RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA
+Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq
+j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
+AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
+cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G
+uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG
+Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8
+ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2
+KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz
+6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug
+UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe
+eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi
+Cp/HuZc=
+-----END CERTIFICATE-----
+
+T-TeleSec GlobalRoot Class 3
+============================
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
+IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
+cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
+MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
+dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
+ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
+9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
+NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
+iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
+0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
+AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
+fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
+ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
+P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
+e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
+-----END CERTIFICATE-----
+
+D-TRUST Root Class 3 CA 2 2009
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe
+Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE
+LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD
+ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA
+BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv
+KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z
+p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC
+AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ
+4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y
+eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw
+MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G
+PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw
+OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm
+2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
+o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV
+dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph
+X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=
+-----END CERTIFICATE-----
+
+D-TRUST Root Class 3 CA 2 EV 2009
+=================================
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
+OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
+OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS
+egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh
+zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T
+7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60
+sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35
+11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv
+cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v
+ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El
+MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp
+b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh
+c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+
+PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
+nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX
+ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA
+NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv
+w9y4AyHqnxbxLFS1
+-----END CERTIFICATE-----
+
+CA Disig Root R2
+================
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw
+EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
+ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx
+EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
+c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC
+w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia
+xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7
+A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S
+GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV
+g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa
+5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE
+koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A
+Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i
+Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u
+Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
+tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV
+sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je
+dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8
+1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx
+mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01
+utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0
+sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg
+UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV
+7+ZtsH8tZ/3zbBt1RqPlShfppNcL
+-----END CERTIFICATE-----
+
+ACCVRAIZ1
+=========
+-----BEGIN CERTIFICATE-----
+MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB
+SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1
+MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH
+UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM
+jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0
+RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD
+aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ
+0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG
+WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7
+8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR
+5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J
+9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK
+Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw
+Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu
+Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
+VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM
+Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA
+QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh
+AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA
+YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj
+AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA
+IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk
+aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0
+dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2
+MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI
+hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E
+R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN
+YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49
+nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ
+TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3
+sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
+I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg
+Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd
+3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p
+EfbRD0tVNEYqi4Y7
+-----END CERTIFICATE-----
+
+TWCA Global Root CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT
+CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD
+QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK
+EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg
+Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C
+nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV
+r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR
+Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV
+tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W
+KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99
+sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p
+yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn
+kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI
+zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g
+cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
+LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M
+8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg
+/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg
+lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP
+A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m
+i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8
+EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3
+zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=
+-----END CERTIFICATE-----
+
+TeliaSonera Root CA v1
+======================
+-----BEGIN CERTIFICATE-----
+MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE
+CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4
+MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW
+VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+
+6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA
+3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k
+B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn
+Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH
+oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3
+F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ
+oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7
+gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc
+TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB
+AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW
+DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm
+zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
+0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW
+pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV
+G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc
+c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT
+JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2
+qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6
+Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems
+WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
+-----END CERTIFICATE-----
+
+E-Tugra Certification Authority
+===============================
+-----BEGIN CERTIFICATE-----
+MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w
+DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls
+ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
+ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw
+NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx
+QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl
+cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD
+DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd
+hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K
+CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g
+ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ
+BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0
+E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz
+rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq
+jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
+rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5
+dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB
+/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG
+MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK
+kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO
+XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807
+VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo
+a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc
+dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV
+KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT
+Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0
+8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G
+C7TbO6Orb1wdtn7os4I07QZcJA==
+-----END CERTIFICATE-----
+
+T-TeleSec GlobalRoot Class 2
+============================
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
+IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
+cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx
+MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
+dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
+ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ
+SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F
+vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970
+2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV
+WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy
+YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4
+r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf
+vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR
+3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
+9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==
+-----END CERTIFICATE-----
+
+Atos TrustedRoot 2011
+=====================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU
+cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4
+MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG
+A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV
+hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr
+54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+
+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320
+HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR
+z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R
+l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ
+bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
+CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h
+k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh
+TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9
+61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G
+3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 1 G3
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG
+A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
+b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN
+MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg
+RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE
+PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm
+PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6
+Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN
+ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l
+g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV
+7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX
+9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f
+iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg
+t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI
+hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC
+MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3
+GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct
+Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP
++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh
+3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa
+wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6
+O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0
+FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV
+hMJKzRwuJIczYOXD
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 2 G3
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG
+A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
+b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN
+MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg
+RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh
+ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY
+NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t
+oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o
+MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l
+V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo
+L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ
+sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD
+6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh
+lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI
+hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66
+AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K
+pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9
+x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz
+dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X
+U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw
+mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD
+zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN
+JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr
+O3jtZsSOeWmD3n+M
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 3 G3
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG
+A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
+b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN
+MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg
+RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286
+IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL
+Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe
+6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3
+I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U
+VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7
+5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi
+Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM
+dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt
+rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI
+hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px
+KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS
+t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ
+TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du
+DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib
+Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD
+hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX
+0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW
+dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2
+PpxxVJkES/1Y+Zj0
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root G2
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
+IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw
+MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
+ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH
+35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq
+bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw
+VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP
+YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn
+lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO
+w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv
+0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz
+d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW
+hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M
+jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
+IhNzbM8m9Yop5w==
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root G3
+===========================
+-----BEGIN CERTIFICATE-----
+MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD
+VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
+MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ
+BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb
+RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs
+KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF
+UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy
+YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy
+1vUhZscv6pZjamVFkpUBtA==
+-----END CERTIFICATE-----
+
+DigiCert Global Root G2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
+HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx
+MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
+dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ
+kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO
+3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV
+BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM
+UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB
+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu
+5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr
+F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U
+WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH
+QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/
+iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
+MrY=
+-----END CERTIFICATE-----
+
+DigiCert Global Root G3
+=======================
+-----BEGIN CERTIFICATE-----
+MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD
+VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw
+MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
+aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C
+AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O
+YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP
+BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp
+Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y
+3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34
+VOKa5Vt8sycX
+-----END CERTIFICATE-----
+
+DigiCert Trusted Root G4
+========================
+-----BEGIN CERTIFICATE-----
+MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw
+HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
+MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp
+pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o
+k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa
+vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY
+QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6
+MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm
+mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7
+f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH
+dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8
+oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
+DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
+ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY
+ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr
+yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy
+7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah
+ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN
+5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb
+/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa
+5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK
+G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP
+82Z+
+-----END CERTIFICATE-----
+
+COMODO RSA Certification Authority
+==================================
+-----BEGIN CERTIFICATE-----
+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
+LaZRfyHBNVOFBkpdn627G190
+-----END CERTIFICATE-----
+
+USERTrust RSA Certification Authority
+=====================================
+-----BEGIN CERTIFICATE-----
+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
+Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9
+-----END CERTIFICATE-----
+
+USERTrust ECC Certification Authority
+=====================================
+-----BEGIN CERTIFICATE-----
+MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC
+VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC
+VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2
+0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez
+nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV
+HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB
+HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu
+9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
+-----END CERTIFICATE-----
+
+GlobalSign ECC Root CA - R4
+===========================
+-----BEGIN CERTIFICATE-----
+MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl
+OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P
+AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV
+MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF
+JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=
+-----END CERTIFICATE-----
+
+GlobalSign ECC Root CA - R5
+===========================
+-----BEGIN CERTIFICATE-----
+MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6
+SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS
+h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
+BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx
+uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
+yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
+-----END CERTIFICATE-----
+
+Staat der Nederlanden EV Root CA
+================================
+-----BEGIN CERTIFICATE-----
+MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE
+CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M
+MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl
+cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk
+SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW
+O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r
+0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8
+Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV
+XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr
+08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV
+0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd
+74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx
+fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa
+ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
+eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu
+c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq
+5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN
+b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN
+f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi
+5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4
+WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK
+DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy
+eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==
+-----END CERTIFICATE-----
+
+IdenTrust Commercial Root CA 1
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG
+EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS
+b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES
+MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB
+IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld
+hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/
+mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi
+1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C
+XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl
+3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy
+NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV
+WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg
+xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix
+uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI
+hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
+6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg
+ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt
+ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV
+YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX
+feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro
+kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe
+2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz
+Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R
+cGzM7vRX+Bi6hG6H
+-----END CERTIFICATE-----
+
+IdenTrust Public Sector Root CA 1
+=================================
+-----BEGIN CERTIFICATE-----
+MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG
+EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv
+ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV
+UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS
+b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy
+P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6
+Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI
+rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf
+qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS
+mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn
+ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh
+LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v
+iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL
+4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B
+Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw
+DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj
+t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A
+mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt
+GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt
+m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx
+NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4
+Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI
+ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC
+ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ
+3Wl9af0AVqW3rLatt8o+Ae+c
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority - G2
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV
+BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy
+bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug
+b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw
+HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT
+DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx
+OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s
+eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP
+/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz
+HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU
+s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y
+TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx
+AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6
+0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z
+iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
+Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi
+nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+
+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO
+e4pIb4tF9g==
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority - EC1
+==========================================
+-----BEGIN CERTIFICATE-----
+MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx
+FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn
+YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl
+ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw
+FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs
+LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg
+dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
+IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy
+AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef
+9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h
+vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8
+kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
+-----END CERTIFICATE-----
+
+CFCA EV ROOT
+============
+-----BEGIN CERTIFICATE-----
+MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE
+CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB
+IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw
+MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD
+DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV
+BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD
+7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN
+uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW
+ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7
+xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f
+py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K
+gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol
+hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ
+tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf
+BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
+/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
+ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q
+ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua
+4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG
+E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX
+BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn
+aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy
+PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX
+kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C
+ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
+-----END CERTIFICATE-----
+
+OISTE WISeKey Global Root GB CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG
+EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
+ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw
+MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD
+VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds
+b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX
+scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP
+rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk
+9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o
+Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg
+GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI
+hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD
+dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0
+VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui
+HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
+Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
+-----END CERTIFICATE-----
+
+SZAFIR ROOT CA2
+===============
+-----BEGIN CERTIFICATE-----
+MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG
+A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV
+BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ
+BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD
+VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q
+qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK
+DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE
+2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ
+ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi
+ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
+AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC
+AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5
+O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67
+oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul
+4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6
++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
+-----END CERTIFICATE-----
+
+Certum Trusted Network CA 2
+===========================
+-----BEGIN CERTIFICATE-----
+MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE
+BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1
+bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y
+ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ
+TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB
+IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9
+7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o
+CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b
+Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p
+uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130
+GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ
+9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB
+Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye
+hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM
+BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI
+hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW
+Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA
+L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo
+clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM
+pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb
+w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo
+J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm
+ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX
+is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7
+zAYspsbiDrW5viSP
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions RootCA 2015
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT
+BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0
+aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl
+YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx
+MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg
+QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV
+BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw
+MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv
+bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh
+iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+
+6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd
+FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr
+i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F
+GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2
+fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu
+iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
+Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI
+hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+
+D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM
+d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y
+d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn
+82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb
+davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F
+Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt
+J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa
+JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q
+p/UsQu0yrbYhnr68
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions ECC RootCA 2015
+===========================================================
+-----BEGIN CERTIFICATE-----
+MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0
+aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
+cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj
+aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw
+MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj
+IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD
+VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290
+Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP
+dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK
+Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
+BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA
+GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn
+dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
+-----END CERTIFICATE-----
+
+ISRG Root X1
+============
+-----BEGIN CERTIFICATE-----
+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE
+BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD
+EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG
+EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT
+DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r
+Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1
+3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K
+b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN
+Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ
+4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf
+1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu
+hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH
+usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r
+OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G
+A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY
+9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV
+0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt
+hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw
+TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx
+e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA
+JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD
+YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n
+JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ
+m+kXQ99b21/+jh5Xos1AnX5iItreGCc=
+-----END CERTIFICATE-----
+
+AC RAIZ FNMT-RCM
+================
+-----BEGIN CERTIFICATE-----
+MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT
+AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw
+MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD
+TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
+ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf
+qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr
+btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL
+j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou
+08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw
+WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT
+tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ
+47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC
+ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa
+i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
+FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o
+dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD
+nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s
+D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ
+j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT
+Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW
++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7
+Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d
+8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm
+5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG
+rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM=
+-----END CERTIFICATE-----
+
+Amazon Root CA 1
+================
+-----BEGIN CERTIFICATE-----
+MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD
+VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1
+MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
+bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH
+FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ
+gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t
+dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce
+VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3
+DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM
+CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy
+8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa
+2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2
+xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5
+-----END CERTIFICATE-----
+
+Amazon Root CA 2
+================
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD
+VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1
+MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
+bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
+ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4
+kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp
+N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9
+AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd
+fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx
+kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS
+btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0
+Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN
+c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+
+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw
+DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA
+A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE
+YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW
+xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ
+gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW
+aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV
+Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3
+KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi
+JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw=
+-----END CERTIFICATE-----
+
+Amazon Root CA 3
+================
+-----BEGIN CERTIFICATE-----
+MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG
+EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy
+NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
+MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB
+f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr
+Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43
+rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc
+eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw==
+-----END CERTIFICATE-----
+
+Amazon Root CA 4
+================
+-----BEGIN CERTIFICATE-----
+MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG
+EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy
+NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
+MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN
+/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri
+83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
+HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA
+MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1
+AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA==
+-----END CERTIFICATE-----
+
+TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT
+D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr
+IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g
+TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp
+ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD
+VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt
+c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth
+bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11
+IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8
+6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc
+wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0
+3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9
+WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU
+ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
+KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh
+AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc
+lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R
+e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j
+q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=
+-----END CERTIFICATE-----
+
+GDCA TrustAUTH R5 ROOT
+======================
+-----BEGIN CERTIFICATE-----
+MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw
+BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD
+DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow
+YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ
+IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs
+AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p
+OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr
+pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ
+9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ
+xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM
+R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ
+D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4
+oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx
+9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg
+p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9
+H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35
+6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd
++PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ
+HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD
+F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ
+8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv
+/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT
+aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==
+-----END CERTIFICATE-----
+
+TrustCor RootCert CA-1
+======================
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP
+MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig
+U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp
+dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx
+MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu
+YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe
+VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy
+dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq
+jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4
+pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0
+JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h
+gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw
+/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j
+BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5
+mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf
+ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C
+qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P
+3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk=
+-----END CERTIFICATE-----
+
+TrustCor RootCert CA-2
+======================
+-----BEGIN CERTIFICATE-----
+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
+-----END CERTIFICATE-----
+
+TrustCor ECA-1
+==============
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP
+MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig
+U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp
+dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw
+N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5
+MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y
+IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR
+MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23
+xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc
+p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+
+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj
+YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL
+f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF
+AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u
+/ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F
+hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs
+J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC
+jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g==
+-----END CERTIFICATE-----
+
+SSL.com Root Certification Authority RSA
+========================================
+-----BEGIN CERTIFICATE-----
+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
+WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k=
+-----END CERTIFICATE-----
+
+SSL.com Root Certification Authority ECC
+========================================
+-----BEGIN CERTIFICATE-----
+MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV
+BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv
+BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy
+MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO
+BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv
+bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA
+BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+
+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR
+hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT
+jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW
+e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z
+5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl
+-----END CERTIFICATE-----
+
+SSL.com EV Root Certification Authority RSA R2
+==============================================
+-----BEGIN CERTIFICATE-----
+MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w
+DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u
+MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy
+MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI
+DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD
+VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh
+hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w
+cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO
+Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+
+B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh
+CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim
+9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto
+RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm
+JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48
++qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
+HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp
+qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1
+++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx
+Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G
+guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz
+OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7
+CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq
+lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR
+rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1
+hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX
+9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w==
+-----END CERTIFICATE-----
+
+SSL.com EV Root Certification Authority ECC
+===========================================
+-----BEGIN CERTIFICATE-----
+MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV
+BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy
+BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw
+MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx
+EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM
+LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB
+BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy
+3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O
+BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe
+5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ
+N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm
+m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R6
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX
+R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds
+b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i
+YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs
+U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss
+grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE
+3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF
+vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM
+PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+
+azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O
+WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy
+CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP
+0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN
+b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE
+AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV
+HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN
+nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0
+lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY
+BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym
+Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr
+3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1
+0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T
+uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK
+oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t
+JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA=
+-----END CERTIFICATE-----
+
+OISTE WISeKey Global Root GC CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD
+SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo
+MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa
+Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL
+ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh
+bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr
+VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab
+NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
+BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E
+AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk
+AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9
+-----END CERTIFICATE-----
+
+GTS Root R1
+===========
+-----BEGIN CERTIFICATE-----
+MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG
+EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv
+b3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG
+A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx
+9vaMf/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7r
+aKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnW
+r4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqM
+LnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly
+4cpk9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr
+06zqkUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92
+wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om
+3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNu
+JLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEM
+BQADggIBADiWCu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1
+d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6ZXPYfcX3v73sv
+fuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZRgyFmxhE+885H7pwoHyXa/6xm
+ld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9b
+gsiG1eGZbYwE8na6SfZu6W0eX6DvJ4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq
+4BjFbkerQUIpm/ZgDdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWEr
+tXvM+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyyF62ARPBo
+pY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9SQ98POyDGCBDTtWTurQ0
+sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdwsE3PYJ/HQcu51OyLemGhmW/HGY0dVHLql
+CFF1pkgl
+-----END CERTIFICATE-----
+
+GTS Root R2
+===========
+-----BEGIN CERTIFICATE-----
+MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG
+EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv
+b3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG
+A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTuk
+k3LvCvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo
+7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWI
+m8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5Gm
+dFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbu
+ak7MkogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscsz
+cTJGr61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW
+Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73Vululycsl
+aVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy
+5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEM
+BQADggIBALZp8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT
+vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiTz9D2PGcDFWEJ
++YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiApJiS4wGWAqoC7o87xdFtCjMw
+c3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvbpxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3Da
+WsYDQvTtN6LwG1BUSw7YhN4ZKJmBR64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5r
+n/WkhLx3+WuXrD5RRaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56Gtmwfu
+Nmsk0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC5AwiWVIQ
+7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiFizoHCBy69Y9Vmhh1fuXs
+gWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLnyOd/xCxgXS/Dr55FBcOEArf9LAhST4Ld
+o/DUhgkC
+-----END CERTIFICATE-----
+
+GTS Root R3
+===========
+-----BEGIN CERTIFICATE-----
+MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV
+UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg
+UjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE
+ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcq
+hkjOPQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUU
+Rout736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24Cej
+QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP
+0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFukfCPAlaUs3L6JbyO5o91lAFJekazInXJ0
+glMLfalAvWhgxeG4VDvBNhcl2MG9AjEAnjWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOa
+KaqW04MjyaR7YbPMAuhd
+-----END CERTIFICATE-----
+
+GTS Root R4
+===========
+-----BEGIN CERTIFICATE-----
+MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV
+UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg
+UjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE
+ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcq
+hkjOPQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa
+6zzuhXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqj
+QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV
+2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0CMRw3J5QdCHojXohw0+WbhXRIjVhLfoI
+N+4Zba3bssx9BzT1YBkstTTZbyACMANxsbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11x
+zPKwTdb+mciUqXWi4w==
+-----END CERTIFICATE-----
+
+UCA Global G2 Root
+==================
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG
+EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x
+NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU
+cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT
+oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV
+8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS
+h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o
+LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/
+R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe
+KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa
+4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc
+OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97
+8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
+BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo
+5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5
+1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A
+Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9
+yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX
+c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo
+jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk
+bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x
+ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn
+RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A==
+-----END CERTIFICATE-----
+
+UCA Extended Validation Root
+============================
+-----BEGIN CERTIFICATE-----
+MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG
+EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u
+IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G
+A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs
+iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF
+Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu
+eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR
+59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH
+0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR
+el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv
+B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth
+WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS
+NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS
+3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL
+BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR
+ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM
+aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4
+dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb
++7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW
+F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi
+GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc
+GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi
+djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr
+dhh2n1ax
+-----END CERTIFICATE-----
+
+Certigna Root CA
+================
+-----BEGIN CERTIFICATE-----
+MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE
+BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ
+MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda
+MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz
+MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX
+stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz
+KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8
+JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16
+XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq
+4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej
+wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ
+lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI
+jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/
+/TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
+HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of
+1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy
+dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h
+LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl
+cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt
+OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP
+TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq
+7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3
+4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd
+8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS
+6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY
+tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS
+aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde
+E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0=
+-----END CERTIFICATE-----
+
+emSign Root CA - G1
+===================
+-----BEGIN CERTIFICATE-----
+MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET
+MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl
+ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx
+ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk
+aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN
+LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1
+cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW
+DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ
+6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH
+hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG
+MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2
+vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q
+NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q
++Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih
+U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx
+iN66zB+Afko=
+-----END CERTIFICATE-----
+
+emSign ECC Root CA - G3
+=======================
+-----BEGIN CERTIFICATE-----
+MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG
+A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg
+MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4
+MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11
+ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g
+RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc
+58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr
+MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D
+CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7
+jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj
+-----END CERTIFICATE-----
+
+emSign Root CA - C1
+===================
+-----BEGIN CERTIFICATE-----
+MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx
+EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp
+Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE
+BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD
+ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up
+ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/
+Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX
+OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V
+I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms
+lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+
+XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD
+ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp
+/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1
+NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9
+wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ
+BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI=
+-----END CERTIFICATE-----
+
+emSign ECC Root CA - C3
+=======================
+-----BEGIN CERTIFICATE-----
+MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG
+A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF
+Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE
+BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD
+ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd
+6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9
+SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA
+B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA
+MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU
+ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ==
+-----END CERTIFICATE-----
+
+Hongkong Post Root CA 3
+=======================
+-----BEGIN CERTIFICATE-----
+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
+dBb9HxEGmpv0
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority - G4
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAwgb4xCzAJBgNV
+BAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3Qu
+bmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1
+dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1
+dGhvcml0eSAtIEc0MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYT
+AlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
+L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhv
+cml0eSAtIEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3D
+umSXbcr3DbVZwbPLqGgZ2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV
+3imz/f3ET+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j5pds
+8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAMC1rlLAHGVK/XqsEQ
+e9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73TDtTUXm6Hnmo9RR3RXRv06QqsYJn7
+ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNXwbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5X
+xNMhIWNlUpEbsZmOeX7m640A2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV
+7rtNOzK+mndmnqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8
+dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwlN4y6mACXi0mW
+Hv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNjc0kCAwEAAaNCMEAwDwYDVR0T
+AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9n
+MA0GCSqGSIb3DQEBCwUAA4ICAQAS5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4Q
+jbRaZIxowLByQzTSGwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht
+7LGrhFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/B7NTeLUK
+YvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uIAeV8KEsD+UmDfLJ/fOPt
+jqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbwH5Lk6rWS02FREAutp9lfx1/cH6NcjKF+
+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKW
+RGhXxNUzzxkvFMSUHHuk2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjA
+JOgc47OlIQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk5F6G
++TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuYn/PIjhs4ViFqUZPT
+kcpG2om3PVODLAgfi49T3f+sHw==
+-----END CERTIFICATE-----
+
+Microsoft ECC Root Certificate Authority 2017
+=============================================
+-----BEGIN CERTIFICATE-----
+MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
+UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND
+IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4
+MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw
+NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ
+BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6
+thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB
+eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM
++Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf
+Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR
+eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M=
+-----END CERTIFICATE-----
+
+Microsoft RSA Root Certificate Authority 2017
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG
+EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg
+UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw
+NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
+MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw
+ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml
+7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e
+S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7
+1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+
+dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F
+yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS
+MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr
+lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ
+0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ
+ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw
+DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC
+NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og
+6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80
+dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk
++ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex
+/2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy
+AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW
+ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE
+7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT
+c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D
+5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E
+-----END CERTIFICATE-----
+
+e-Szigno Root CA 2017
+=====================
+-----BEGIN CERTIFICATE-----
+MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw
+DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt
+MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa
+Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE
+CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp
+Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx
+s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G
+A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv
+vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA
+tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO
+svxyqltZ+efcMQ==
+-----END CERTIFICATE-----
+
+certSIGN Root CA G2
+===================
+-----BEGIN CERTIFICATE-----
+MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw
+EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy
+MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH
+TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05
+N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk
+abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg
+wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp
+dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh
+ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732
+jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf
+95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc
+z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL
+iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud
+DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB
+ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC
+b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB
+/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5
+8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5
+BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW
+atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU
+Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M
+NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N
+0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc=
+-----END CERTIFICATE-----
+
+Trustwave Global Certification Authority
+========================================
+-----BEGIN CERTIFICATE-----
+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
+29FpHOTKyeC2nOnOcXHebD8WpHk=
+-----END CERTIFICATE-----
+
+Trustwave Global ECC P256 Certification Authority
+=================================================
+-----BEGIN CERTIFICATE-----
+MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYDVQQGEwJVUzER
+MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI
+b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYD
+VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy
+dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1
+NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH77bOYj
+43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoNFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqm
+P62jQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt
+0UrrdaVKEJmzsaGLSvcwCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjz
+RM4q3wghDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7
+-----END CERTIFICATE-----
+
+Trustwave Global ECC P384 Certification Authority
+=================================================
+-----BEGIN CERTIFICATE-----
+MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYDVQQGEwJVUzER
+MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI
+b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYD
+VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy
+dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4
+NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGvaDXU1CDFH
+Ba5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr
+/TklZvFe/oyujUF5nQlgziip04pt89ZF1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNV
+HQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNn
+ADBkAjA3AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsCMGcl
+CrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVuSw==
+-----END CERTIFICATE-----
+
+NAVER Global Root Certification Authority
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEMBQAwaTELMAkG
+A1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRGT1JNIENvcnAuMTIwMAYDVQQD
+DClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4
+NDJaFw0zNzA4MTgyMzU5NTlaMGkxCzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVT
+UyBQTEFURk9STSBDb3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVAiQqrDZBb
+UGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH38dq6SZeWYp34+hInDEW
++j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lEHoSTGEq0n+USZGnQJoViAbbJAh2+g1G7
+XNr4rRVqmfeSVPc0W+m/6imBEtRTkZazkVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2
+aacp+yPOiNgSnABIqKYPszuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4
+Yb8ObtoqvC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHfnZ3z
+VHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaGYQ5fG8Ir4ozVu53B
+A0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo0es+nPxdGoMuK8u180SdOqcXYZai
+cdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3aCJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejy
+YhbLgGvtPe31HzClrkvJE+2KAQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNV
+HQ4EFgQU0p+I36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB
+Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoNqo0hV4/GPnrK
+21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatjcu3cvuzHV+YwIHHW1xDBE1UB
+jCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bx
+hYTeodoS76TiEJd6eN4MUZeoIUCLhr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTg
+E34h5prCy8VCZLQelHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTH
+D8z7p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8piKCk5XQ
+A76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLRLBT/DShycpWbXgnbiUSY
+qqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG
+I/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg
+kpzNNIaRkPpkUZ3+/uul9XXeifdy
+-----END CERTIFICATE-----
+
+AC RAIZ FNMT-RCM SERVIDORES SEGUROS
+===================================
+-----BEGIN CERTIFICATE-----
+MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF
+UzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy
+NjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4
+MTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt
+UkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB
+QyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA
+BPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2
+LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG
+SM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD
+zBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c=
+-----END CERTIFICATE-----
+
+GlobalSign Root R46
+===================
+-----BEGIN CERTIFICATE-----
+MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV
+BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv
+b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX
+BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es
+CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/
+r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje
+2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt
+bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj
+K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4
+12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on
+ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls
+eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9
+vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD
+VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM
+BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg
+JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy
+gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92
+CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm
+OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq
+JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye
+qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz
+nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7
+DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3
+QEUxeCp6
+-----END CERTIFICATE-----
+
+GlobalSign Root E46
+===================
+-----BEGIN CERTIFICATE-----
+MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT
+AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg
+RTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV
+BAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq
+hkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB
+jtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj
+QjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL
+gLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk
+vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+
+CAezNIm8BZ/3Hobui3A=
+-----END CERTIFICATE-----
+
+GLOBALTRUST 2020
+================
+-----BEGIN CERTIFICATE-----
+MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx
+IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT
+VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh
+BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy
+MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi
+D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO
+VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM
+CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm
+fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA
+A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR
+JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG
+DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU
+clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ
+mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud
+IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA
+VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw
+4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9
+iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS
+8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2
+HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS
+vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918
+oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF
+YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl
+gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg==
+-----END CERTIFICATE-----
+
+ANF Secure Server Root CA
+=========================
+-----BEGIN CERTIFICATE-----
+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
+-----END CERTIFICATE-----
+
+Certum EC-384 CA
+================
+-----BEGIN CERTIFICATE-----
+MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ
+TDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy
+dGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2
+MDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh
+dGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx
+GTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq
+vm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn
+iBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo
+ADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0
+QoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k=
+-----END CERTIFICATE-----
+
+Certum Trusted Root CA
+======================
+-----BEGIN CERTIFICATE-----
+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
+-----END CERTIFICATE-----
+
+TunTrust Root CA
+================
+-----BEGIN CERTIFICATE-----
+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
+-----END CERTIFICATE-----
+
+HARICA TLS RSA Root CA 2021
+===========================
+-----BEGIN CERTIFICATE-----
+MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQG
+EwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
+cyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUz
+OFoXDTQ1MDIxMzEwNTUzN1owbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRl
+bWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNB
+IFJvb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569lmwVnlskN
+JLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE4VGC/6zStGndLuwRo0Xu
+a2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uva9of08WRiFukiZLRgeaMOVig1mlDqa2Y
+Ulhu2wr7a89o+uOkXjpFc5gH6l8Cct4MpbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K
+5FrZx40d/JiZ+yykgmvwKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEv
+dmn8kN3bLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcYAuUR
+0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqBAGMUuTNe3QvboEUH
+GjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYqE613TBoYm5EPWNgGVMWX+Ko/IIqm
+haZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHrW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQ
+CPxrvrNQKlr9qEgYRtaQQJKQCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8G
+A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE
+AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAUX15QvWiWkKQU
+EapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3f5Z2EMVGpdAgS1D0NTsY9FVq
+QRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxajaH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxD
+QpSbIPDRzbLrLFPCU3hKTwSUQZqPJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcR
+j88YxeMn/ibvBZ3PzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5
+vZStjBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0/L5H9MG0
+qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pTBGIBnfHAT+7hOtSLIBD6
+Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79aPib8qXPMThcFarmlwDB31qlpzmq6YR/
+PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YWxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnn
+kf3/W9b3raYvAwtt41dU63ZTGI0RmLo=
+-----END CERTIFICATE-----
+
+HARICA TLS ECC Root CA 2021
+===========================
+-----BEGIN CERTIFICATE-----
+MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQswCQYDVQQGEwJH
+UjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBD
+QTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoX
+DTQ1MDIxMzExMDEwOVowbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWlj
+IGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJv
+b3QgQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7KKrxcm1l
+AEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9YSTHMmE5gEYd103KUkE+b
+ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW
+0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAi
+rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw
+CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps
+-----END CERTIFICATE-----
diff --git a/tools/vision/DSP/CONVOL.LOD b/tools/vision/dsp/convol.lod
similarity index 100%
rename from tools/vision/DSP/CONVOL.LOD
rename to tools/vision/dsp/convol.lod
diff --git a/tools/vision/DSP/EXJPEGD.PRG b/tools/vision/dsp/exjpegd.prg
similarity index 100%
rename from tools/vision/DSP/EXJPEGD.PRG
rename to tools/vision/dsp/exjpegd.prg
diff --git a/tools/vision/DSP/JPEGD.PRG b/tools/vision/dsp/jpegd.prg
similarity index 100%
rename from tools/vision/DSP/JPEGD.PRG
rename to tools/vision/dsp/jpegd.prg
diff --git a/tools/vision/DSP/nfjpeg.prg b/tools/vision/dsp/nfjpeg.prg
similarity index 100%
rename from tools/vision/DSP/nfjpeg.prg
rename to tools/vision/dsp/nfjpeg.prg
diff --git a/tools/vision/FILTRES/BIDON.VCF b/tools/vision/filtres/bidon.vcf
similarity index 100%
rename from tools/vision/FILTRES/BIDON.VCF
rename to tools/vision/filtres/bidon.vcf
diff --git a/tools/vision/FILTRES/english/BIDON.VCF b/tools/vision/filtres/english/bidon.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/BIDON.VCF
rename to tools/vision/filtres/english/bidon.vcf
diff --git a/tools/vision/FILTRES/FLOU1.VCF b/tools/vision/filtres/english/flou1.vcf
similarity index 100%
rename from tools/vision/FILTRES/FLOU1.VCF
rename to tools/vision/filtres/english/flou1.vcf
diff --git a/tools/vision/FILTRES/FLOU2.VCF b/tools/vision/filtres/english/flou2.vcf
similarity index 100%
rename from tools/vision/FILTRES/FLOU2.VCF
rename to tools/vision/filtres/english/flou2.vcf
diff --git a/tools/vision/FILTRES/FLOU3.VCF b/tools/vision/filtres/english/flou3.vcf
similarity index 100%
rename from tools/vision/FILTRES/FLOU3.VCF
rename to tools/vision/filtres/english/flou3.vcf
diff --git a/tools/vision/FILTRES/FLOU551.VCF b/tools/vision/filtres/english/flou551.vcf
similarity index 100%
rename from tools/vision/FILTRES/FLOU551.VCF
rename to tools/vision/filtres/english/flou551.vcf
diff --git a/tools/vision/FILTRES/FLOU552.VCF b/tools/vision/filtres/english/flou552.vcf
similarity index 100%
rename from tools/vision/FILTRES/FLOU552.VCF
rename to tools/vision/filtres/english/flou552.vcf
diff --git a/tools/vision/FILTRES/FLOU553.VCF b/tools/vision/filtres/english/flou553.vcf
similarity index 100%
rename from tools/vision/FILTRES/FLOU553.VCF
rename to tools/vision/filtres/english/flou553.vcf
diff --git a/tools/vision/FILTRES/FLOU554.VCF b/tools/vision/filtres/english/flou554.vcf
similarity index 100%
rename from tools/vision/FILTRES/FLOU554.VCF
rename to tools/vision/filtres/english/flou554.vcf
diff --git a/tools/vision/FILTRES/GRAD33E.VCF b/tools/vision/filtres/english/grad33e.vcf
similarity index 100%
rename from tools/vision/FILTRES/GRAD33E.VCF
rename to tools/vision/filtres/english/grad33e.vcf
diff --git a/tools/vision/FILTRES/GRAD33N.VCF b/tools/vision/filtres/english/grad33n.vcf
similarity index 100%
rename from tools/vision/FILTRES/GRAD33N.VCF
rename to tools/vision/filtres/english/grad33n.vcf
diff --git a/tools/vision/FILTRES/GRAD33NE.VCF b/tools/vision/filtres/english/grad33ne.vcf
similarity index 100%
rename from tools/vision/FILTRES/GRAD33NE.VCF
rename to tools/vision/filtres/english/grad33ne.vcf
diff --git a/tools/vision/FILTRES/GRAD33NO.VCF b/tools/vision/filtres/english/grad33no.vcf
similarity index 100%
rename from tools/vision/FILTRES/GRAD33NO.VCF
rename to tools/vision/filtres/english/grad33no.vcf
diff --git a/tools/vision/FILTRES/GRAD33O.VCF b/tools/vision/filtres/english/grad33o.vcf
similarity index 100%
rename from tools/vision/FILTRES/GRAD33O.VCF
rename to tools/vision/filtres/english/grad33o.vcf
diff --git a/tools/vision/FILTRES/GRAD33S.VCF b/tools/vision/filtres/english/grad33s.vcf
similarity index 100%
rename from tools/vision/FILTRES/GRAD33S.VCF
rename to tools/vision/filtres/english/grad33s.vcf
diff --git a/tools/vision/FILTRES/GRAD33SE.VCF b/tools/vision/filtres/english/grad33se.vcf
similarity index 100%
rename from tools/vision/FILTRES/GRAD33SE.VCF
rename to tools/vision/filtres/english/grad33se.vcf
diff --git a/tools/vision/FILTRES/GRAD33SO.VCF b/tools/vision/filtres/english/grad33so.vcf
similarity index 100%
rename from tools/vision/FILTRES/GRAD33SO.VCF
rename to tools/vision/filtres/english/grad33so.vcf
diff --git a/tools/vision/FILTRES/LAPLA331.VCF b/tools/vision/filtres/english/lapla331.vcf
similarity index 100%
rename from tools/vision/FILTRES/LAPLA331.VCF
rename to tools/vision/filtres/english/lapla331.vcf
diff --git a/tools/vision/FILTRES/LAPLA551.VCF b/tools/vision/filtres/english/lapla551.vcf
similarity index 100%
rename from tools/vision/FILTRES/LAPLA551.VCF
rename to tools/vision/filtres/english/lapla551.vcf
diff --git a/tools/vision/FILTRES/NET331.VCF b/tools/vision/filtres/english/net331.vcf
similarity index 100%
rename from tools/vision/FILTRES/NET331.VCF
rename to tools/vision/filtres/english/net331.vcf
diff --git a/tools/vision/FILTRES/OBRE3DE.VCF b/tools/vision/filtres/english/obre3de.vcf
similarity index 100%
rename from tools/vision/FILTRES/OBRE3DE.VCF
rename to tools/vision/filtres/english/obre3de.vcf
diff --git a/tools/vision/FILTRES/OBRE3DNE.VCF b/tools/vision/filtres/english/obre3dne.vcf
similarity index 100%
rename from tools/vision/FILTRES/OBRE3DNE.VCF
rename to tools/vision/filtres/english/obre3dne.vcf
diff --git a/tools/vision/FILTRES/OBRE3DNO.VCF b/tools/vision/filtres/english/obre3dno.vcf
similarity index 100%
rename from tools/vision/FILTRES/OBRE3DNO.VCF
rename to tools/vision/filtres/english/obre3dno.vcf
diff --git a/tools/vision/FILTRES/OBRE3DO.VCF b/tools/vision/filtres/english/obre3do.vcf
similarity index 100%
rename from tools/vision/FILTRES/OBRE3DO.VCF
rename to tools/vision/filtres/english/obre3do.vcf
diff --git a/tools/vision/FILTRES/OBRE3DSE.VCF b/tools/vision/filtres/english/obre3dse.vcf
similarity index 100%
rename from tools/vision/FILTRES/OBRE3DSE.VCF
rename to tools/vision/filtres/english/obre3dse.vcf
diff --git a/tools/vision/FILTRES/OBRE3DSO.VCF b/tools/vision/filtres/english/obre3dso.vcf
similarity index 100%
rename from tools/vision/FILTRES/OBRE3DSO.VCF
rename to tools/vision/filtres/english/obre3dso.vcf
diff --git a/tools/vision/FILTRES/PERSO331.VCF b/tools/vision/filtres/english/perso331.vcf
similarity index 100%
rename from tools/vision/FILTRES/PERSO331.VCF
rename to tools/vision/filtres/english/perso331.vcf
diff --git a/tools/vision/FILTRES/PERSO332.VCF b/tools/vision/filtres/english/perso332.vcf
similarity index 100%
rename from tools/vision/FILTRES/PERSO332.VCF
rename to tools/vision/filtres/english/perso332.vcf
diff --git a/tools/vision/FILTRES/PERSO333.VCF b/tools/vision/filtres/english/perso333.vcf
similarity index 100%
rename from tools/vision/FILTRES/PERSO333.VCF
rename to tools/vision/filtres/english/perso333.vcf
diff --git a/tools/vision/FILTRES/PERSO334.VCF b/tools/vision/filtres/english/perso334.vcf
similarity index 100%
rename from tools/vision/FILTRES/PERSO334.VCF
rename to tools/vision/filtres/english/perso334.vcf
diff --git a/tools/vision/FILTRES/XXX.VCF b/tools/vision/filtres/english/xxx.vcf
similarity index 100%
rename from tools/vision/FILTRES/XXX.VCF
rename to tools/vision/filtres/english/xxx.vcf
diff --git a/tools/vision/FILTRES/english/FLOU1.VCF b/tools/vision/filtres/flou1.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/FLOU1.VCF
rename to tools/vision/filtres/flou1.vcf
diff --git a/tools/vision/FILTRES/english/FLOU2.VCF b/tools/vision/filtres/flou2.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/FLOU2.VCF
rename to tools/vision/filtres/flou2.vcf
diff --git a/tools/vision/FILTRES/english/FLOU3.VCF b/tools/vision/filtres/flou3.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/FLOU3.VCF
rename to tools/vision/filtres/flou3.vcf
diff --git a/tools/vision/FILTRES/english/FLOU551.VCF b/tools/vision/filtres/flou551.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/FLOU551.VCF
rename to tools/vision/filtres/flou551.vcf
diff --git a/tools/vision/FILTRES/english/FLOU552.VCF b/tools/vision/filtres/flou552.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/FLOU552.VCF
rename to tools/vision/filtres/flou552.vcf
diff --git a/tools/vision/FILTRES/english/FLOU553.VCF b/tools/vision/filtres/flou553.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/FLOU553.VCF
rename to tools/vision/filtres/flou553.vcf
diff --git a/tools/vision/FILTRES/english/FLOU554.VCF b/tools/vision/filtres/flou554.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/FLOU554.VCF
rename to tools/vision/filtres/flou554.vcf
diff --git a/tools/vision/FILTRES/francais/BIDON.VCF b/tools/vision/filtres/francais/bidon.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/BIDON.VCF
rename to tools/vision/filtres/francais/bidon.vcf
diff --git a/tools/vision/FILTRES/francais/FLOU1.VCF b/tools/vision/filtres/francais/flou1.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/FLOU1.VCF
rename to tools/vision/filtres/francais/flou1.vcf
diff --git a/tools/vision/FILTRES/francais/FLOU2.VCF b/tools/vision/filtres/francais/flou2.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/FLOU2.VCF
rename to tools/vision/filtres/francais/flou2.vcf
diff --git a/tools/vision/FILTRES/francais/FLOU3.VCF b/tools/vision/filtres/francais/flou3.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/FLOU3.VCF
rename to tools/vision/filtres/francais/flou3.vcf
diff --git a/tools/vision/FILTRES/francais/FLOU551.VCF b/tools/vision/filtres/francais/flou551.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/FLOU551.VCF
rename to tools/vision/filtres/francais/flou551.vcf
diff --git a/tools/vision/FILTRES/francais/FLOU552.VCF b/tools/vision/filtres/francais/flou552.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/FLOU552.VCF
rename to tools/vision/filtres/francais/flou552.vcf
diff --git a/tools/vision/FILTRES/francais/FLOU553.VCF b/tools/vision/filtres/francais/flou553.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/FLOU553.VCF
rename to tools/vision/filtres/francais/flou553.vcf
diff --git a/tools/vision/FILTRES/francais/FLOU554.VCF b/tools/vision/filtres/francais/flou554.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/FLOU554.VCF
rename to tools/vision/filtres/francais/flou554.vcf
diff --git a/tools/vision/FILTRES/francais/GRAD33E.VCF b/tools/vision/filtres/francais/grad33e.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/GRAD33E.VCF
rename to tools/vision/filtres/francais/grad33e.vcf
diff --git a/tools/vision/FILTRES/francais/GRAD33N.VCF b/tools/vision/filtres/francais/grad33n.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/GRAD33N.VCF
rename to tools/vision/filtres/francais/grad33n.vcf
diff --git a/tools/vision/FILTRES/francais/GRAD33NE.VCF b/tools/vision/filtres/francais/grad33ne.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/GRAD33NE.VCF
rename to tools/vision/filtres/francais/grad33ne.vcf
diff --git a/tools/vision/FILTRES/francais/GRAD33NO.VCF b/tools/vision/filtres/francais/grad33no.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/GRAD33NO.VCF
rename to tools/vision/filtres/francais/grad33no.vcf
diff --git a/tools/vision/FILTRES/francais/GRAD33O.VCF b/tools/vision/filtres/francais/grad33o.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/GRAD33O.VCF
rename to tools/vision/filtres/francais/grad33o.vcf
diff --git a/tools/vision/FILTRES/francais/GRAD33S.VCF b/tools/vision/filtres/francais/grad33s.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/GRAD33S.VCF
rename to tools/vision/filtres/francais/grad33s.vcf
diff --git a/tools/vision/FILTRES/francais/GRAD33SE.VCF b/tools/vision/filtres/francais/grad33se.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/GRAD33SE.VCF
rename to tools/vision/filtres/francais/grad33se.vcf
diff --git a/tools/vision/FILTRES/francais/GRAD33SO.VCF b/tools/vision/filtres/francais/grad33so.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/GRAD33SO.VCF
rename to tools/vision/filtres/francais/grad33so.vcf
diff --git a/tools/vision/FILTRES/francais/LAPLA331.VCF b/tools/vision/filtres/francais/lapla331.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/LAPLA331.VCF
rename to tools/vision/filtres/francais/lapla331.vcf
diff --git a/tools/vision/FILTRES/francais/LAPLA551.VCF b/tools/vision/filtres/francais/lapla551.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/LAPLA551.VCF
rename to tools/vision/filtres/francais/lapla551.vcf
diff --git a/tools/vision/FILTRES/francais/NET331.VCF b/tools/vision/filtres/francais/net331.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/NET331.VCF
rename to tools/vision/filtres/francais/net331.vcf
diff --git a/tools/vision/FILTRES/francais/OBRE3DE.VCF b/tools/vision/filtres/francais/obre3de.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/OBRE3DE.VCF
rename to tools/vision/filtres/francais/obre3de.vcf
diff --git a/tools/vision/FILTRES/francais/OBRE3DNE.VCF b/tools/vision/filtres/francais/obre3dne.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/OBRE3DNE.VCF
rename to tools/vision/filtres/francais/obre3dne.vcf
diff --git a/tools/vision/FILTRES/francais/OBRE3DNO.VCF b/tools/vision/filtres/francais/obre3dno.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/OBRE3DNO.VCF
rename to tools/vision/filtres/francais/obre3dno.vcf
diff --git a/tools/vision/FILTRES/francais/OBRE3DO.VCF b/tools/vision/filtres/francais/obre3do.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/OBRE3DO.VCF
rename to tools/vision/filtres/francais/obre3do.vcf
diff --git a/tools/vision/FILTRES/francais/OBRE3DSE.VCF b/tools/vision/filtres/francais/obre3dse.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/OBRE3DSE.VCF
rename to tools/vision/filtres/francais/obre3dse.vcf
diff --git a/tools/vision/FILTRES/francais/OBRE3DSO.VCF b/tools/vision/filtres/francais/obre3dso.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/OBRE3DSO.VCF
rename to tools/vision/filtres/francais/obre3dso.vcf
diff --git a/tools/vision/FILTRES/francais/PERSO331.VCF b/tools/vision/filtres/francais/perso331.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/PERSO331.VCF
rename to tools/vision/filtres/francais/perso331.vcf
diff --git a/tools/vision/FILTRES/francais/PERSO332.VCF b/tools/vision/filtres/francais/perso332.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/PERSO332.VCF
rename to tools/vision/filtres/francais/perso332.vcf
diff --git a/tools/vision/FILTRES/francais/PERSO333.VCF b/tools/vision/filtres/francais/perso333.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/PERSO333.VCF
rename to tools/vision/filtres/francais/perso333.vcf
diff --git a/tools/vision/FILTRES/francais/PERSO334.VCF b/tools/vision/filtres/francais/perso334.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/PERSO334.VCF
rename to tools/vision/filtres/francais/perso334.vcf
diff --git a/tools/vision/FILTRES/francais/XXX.VCF b/tools/vision/filtres/francais/xxx.vcf
similarity index 100%
rename from tools/vision/FILTRES/francais/XXX.VCF
rename to tools/vision/filtres/francais/xxx.vcf
diff --git a/tools/vision/FILTRES/english/GRAD33E.VCF b/tools/vision/filtres/grad33e.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/GRAD33E.VCF
rename to tools/vision/filtres/grad33e.vcf
diff --git a/tools/vision/FILTRES/english/GRAD33N.VCF b/tools/vision/filtres/grad33n.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/GRAD33N.VCF
rename to tools/vision/filtres/grad33n.vcf
diff --git a/tools/vision/FILTRES/english/GRAD33NE.VCF b/tools/vision/filtres/grad33ne.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/GRAD33NE.VCF
rename to tools/vision/filtres/grad33ne.vcf
diff --git a/tools/vision/FILTRES/english/GRAD33NO.VCF b/tools/vision/filtres/grad33no.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/GRAD33NO.VCF
rename to tools/vision/filtres/grad33no.vcf
diff --git a/tools/vision/FILTRES/english/GRAD33O.VCF b/tools/vision/filtres/grad33o.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/GRAD33O.VCF
rename to tools/vision/filtres/grad33o.vcf
diff --git a/tools/vision/FILTRES/english/GRAD33S.VCF b/tools/vision/filtres/grad33s.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/GRAD33S.VCF
rename to tools/vision/filtres/grad33s.vcf
diff --git a/tools/vision/FILTRES/english/GRAD33SE.VCF b/tools/vision/filtres/grad33se.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/GRAD33SE.VCF
rename to tools/vision/filtres/grad33se.vcf
diff --git a/tools/vision/FILTRES/english/GRAD33SO.VCF b/tools/vision/filtres/grad33so.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/GRAD33SO.VCF
rename to tools/vision/filtres/grad33so.vcf
diff --git a/tools/vision/FILTRES/english/LAPLA331.VCF b/tools/vision/filtres/lapla331.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/LAPLA331.VCF
rename to tools/vision/filtres/lapla331.vcf
diff --git a/tools/vision/FILTRES/english/LAPLA551.VCF b/tools/vision/filtres/lapla551.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/LAPLA551.VCF
rename to tools/vision/filtres/lapla551.vcf
diff --git a/tools/vision/FILTRES/english/NET331.VCF b/tools/vision/filtres/net331.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/NET331.VCF
rename to tools/vision/filtres/net331.vcf
diff --git a/tools/vision/FILTRES/english/OBRE3DE.VCF b/tools/vision/filtres/obre3de.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/OBRE3DE.VCF
rename to tools/vision/filtres/obre3de.vcf
diff --git a/tools/vision/FILTRES/english/OBRE3DNE.VCF b/tools/vision/filtres/obre3dne.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/OBRE3DNE.VCF
rename to tools/vision/filtres/obre3dne.vcf
diff --git a/tools/vision/FILTRES/english/OBRE3DNO.VCF b/tools/vision/filtres/obre3dno.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/OBRE3DNO.VCF
rename to tools/vision/filtres/obre3dno.vcf
diff --git a/tools/vision/FILTRES/english/OBRE3DO.VCF b/tools/vision/filtres/obre3do.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/OBRE3DO.VCF
rename to tools/vision/filtres/obre3do.vcf
diff --git a/tools/vision/FILTRES/english/OBRE3DSE.VCF b/tools/vision/filtres/obre3dse.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/OBRE3DSE.VCF
rename to tools/vision/filtres/obre3dse.vcf
diff --git a/tools/vision/FILTRES/english/OBRE3DSO.VCF b/tools/vision/filtres/obre3dso.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/OBRE3DSO.VCF
rename to tools/vision/filtres/obre3dso.vcf
diff --git a/tools/vision/FILTRES/english/PERSO331.VCF b/tools/vision/filtres/perso331.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/PERSO331.VCF
rename to tools/vision/filtres/perso331.vcf
diff --git a/tools/vision/FILTRES/english/PERSO332.VCF b/tools/vision/filtres/perso332.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/PERSO332.VCF
rename to tools/vision/filtres/perso332.vcf
diff --git a/tools/vision/FILTRES/english/PERSO333.VCF b/tools/vision/filtres/perso333.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/PERSO333.VCF
rename to tools/vision/filtres/perso333.vcf
diff --git a/tools/vision/FILTRES/english/PERSO334.VCF b/tools/vision/filtres/perso334.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/PERSO334.VCF
rename to tools/vision/filtres/perso334.vcf
diff --git a/tools/vision/FILTRES/english/XXX.VCF b/tools/vision/filtres/xxx.vcf
similarity index 100%
rename from tools/vision/FILTRES/english/XXX.VCF
rename to tools/vision/filtres/xxx.vcf
diff --git a/tools/vision/LANGUES/BULLE.RSC b/tools/vision/langues/bulle.rsc
similarity index 100%
rename from tools/vision/LANGUES/BULLE.RSC
rename to tools/vision/langues/bulle.rsc
diff --git a/tools/vision/LANGUES/chkmsg.c b/tools/vision/langues/chkmsg.c
similarity index 100%
rename from tools/vision/LANGUES/chkmsg.c
rename to tools/vision/langues/chkmsg.c
diff --git a/tools/vision/LANGUES/chkmsg.prg b/tools/vision/langues/chkmsg.prg
similarity index 100%
rename from tools/vision/LANGUES/chkmsg.prg
rename to tools/vision/langues/chkmsg.prg
diff --git a/tools/vision/LANGUES/CHKMSG.PRJ b/tools/vision/langues/chkmsg.prj
similarity index 100%
rename from tools/vision/LANGUES/CHKMSG.PRJ
rename to tools/vision/langues/chkmsg.prj
diff --git a/tools/vision/LANGUES/DEUTSCH/vision.hrd b/tools/vision/langues/deutsch/vision.hrd
similarity index 100%
rename from tools/vision/LANGUES/DEUTSCH/vision.hrd
rename to tools/vision/langues/deutsch/vision.hrd
diff --git a/tools/vision/LANGUES/DEUTSCH/VISION.RSC b/tools/vision/langues/deutsch/vision.rsc
similarity index 54%
rename from tools/vision/LANGUES/DEUTSCH/VISION.RSC
rename to tools/vision/langues/deutsch/vision.rsc
index c633193..5722569 100644
Binary files a/tools/vision/LANGUES/DEUTSCH/VISION.RSC and b/tools/vision/langues/deutsch/vision.rsc differ
diff --git a/tools/vision/LANGUES/DEUTSCH/visionb.hrd b/tools/vision/langues/deutsch/visionb.hrd
similarity index 100%
rename from tools/vision/LANGUES/DEUTSCH/visionb.hrd
rename to tools/vision/langues/deutsch/visionb.hrd
diff --git a/tools/vision/LANGUES/DEUTSCH/VISIONB.RSC b/tools/vision/langues/deutsch/visionb.rsc
similarity index 100%
rename from tools/vision/LANGUES/DEUTSCH/VISIONB.RSC
rename to tools/vision/langues/deutsch/visionb.rsc
diff --git a/tools/vision/LANGUES/DEUTSCH/vmsg.txt b/tools/vision/langues/deutsch/vmsg.txt
similarity index 92%
rename from tools/vision/LANGUES/DEUTSCH/vmsg.txt
rename to tools/vision/langues/deutsch/vmsg.txt
index 31458e0..77899e0 100644
--- a/tools/vision/LANGUES/DEUTSCH/vmsg.txt
+++ b/tools/vision/langues/deutsch/vmsg.txt
@@ -280,4 +280,12 @@
280:Entfernen von Datens„tzen und Bilddateien aus dem katalog...
281: W„hlen Sie alle Obkekte aus
282: Aus Katalog entfernen...
-283: Bilddateien entfernen...
\ No newline at end of file
+283: Bilddateien entfernen...
+284:Aktualisierung der Datenbank der Bildmodule...
+285:[Update %s verfgbar!|M”chtenSie es installieren?][Ja|Nein]
+286:[Update abgeschlossen!|VISION wird jetzt beendet][OK]
+287:[Internet scheint nicht zug„nglich zu sein|M”chtenSie die Update-Prfung deaktivieren?][Ja|Nein]
+288:VISION aktualisieren...
+289:[Aktualisierung fehlgeschlagen mit %d|Check VISION.LOG][OK]
+290:Zus„tzliche Bildattribute
+291:[Diese Funktion ist jetzt|bei Dither LDV verfgbar][OK]
\ No newline at end of file
diff --git a/tools/vision/LANGUES/ENGLISH/VISION.H b/tools/vision/langues/english/vision.h
similarity index 100%
rename from tools/vision/LANGUES/ENGLISH/VISION.H
rename to tools/vision/langues/english/vision.h
diff --git a/tools/vision/LANGUES/ENGLISH/vision.hrd b/tools/vision/langues/english/vision.hrd
similarity index 100%
rename from tools/vision/LANGUES/ENGLISH/vision.hrd
rename to tools/vision/langues/english/vision.hrd
diff --git a/tools/vision/LANGUES/ENGLISH/VISION.RSC b/tools/vision/langues/english/vision.rsc
similarity index 54%
rename from tools/vision/LANGUES/ENGLISH/VISION.RSC
rename to tools/vision/langues/english/vision.rsc
index 294437f..de63726 100644
Binary files a/tools/vision/LANGUES/ENGLISH/VISION.RSC and b/tools/vision/langues/english/vision.rsc differ
diff --git a/tools/vision/LANGUES/ENGLISH/VISIONB.H b/tools/vision/langues/english/visionb.h
similarity index 100%
rename from tools/vision/LANGUES/ENGLISH/VISIONB.H
rename to tools/vision/langues/english/visionb.h
diff --git a/tools/vision/LANGUES/ENGLISH/visionb.hrd b/tools/vision/langues/english/visionb.hrd
similarity index 100%
rename from tools/vision/LANGUES/ENGLISH/visionb.hrd
rename to tools/vision/langues/english/visionb.hrd
diff --git a/tools/vision/LANGUES/ENGLISH/VISIONB.RSC b/tools/vision/langues/english/visionb.rsc
similarity index 100%
rename from tools/vision/LANGUES/ENGLISH/VISIONB.RSC
rename to tools/vision/langues/english/visionb.rsc
diff --git a/tools/vision/LANGUES/ENGLISH/vmsg.txt b/tools/vision/langues/english/vmsg.txt
similarity index 93%
rename from tools/vision/LANGUES/ENGLISH/vmsg.txt
rename to tools/vision/langues/english/vmsg.txt
index c7167c4..86d44de 100644
--- a/tools/vision/LANGUES/ENGLISH/vmsg.txt
+++ b/tools/vision/langues/english/vmsg.txt
@@ -280,4 +280,12 @@
280:Removing records and image files from catalog...
281: Select all objects
282: Remove from catalog...
-283: Remove image files...
\ No newline at end of file
+283: Remove image files...
+284:Updating image modules database...
+285:[Update %s available!|Would you like to install it?][Yes|No]
+286:[Update done!|VISION will now exit][OK]
+287:[Internet looks not accessible|Would you like to disable update check?][Yes|No]
+288:Updating VISION...
+289:[Update failed with %d|Check VISION.LOG][OK]
+290:Additional image attributes
+291:[This feature is now available|from Dither LDV][OK]
diff --git a/tools/vision/LANGUES/FRANCAIS/VISION.H b/tools/vision/langues/francais/vision.h
similarity index 98%
rename from tools/vision/LANGUES/FRANCAIS/VISION.H
rename to tools/vision/langues/francais/vision.h
index e6e0c03..e4e44e7 100644
--- a/tools/vision/LANGUES/FRANCAIS/VISION.H
+++ b/tools/vision/langues/francais/vision.h
@@ -128,6 +128,7 @@
#define INFO_TOTAL 25 /* BOXTEXT dans l'arbre FORM_INFO */
#define INFO_OK 26 /* BUTTON dans l'arbre FORM_INFO */
#define INFO_CANCEL 27 /* BUTTON dans l'arbre FORM_INFO */
+#define INFO_PLUS 28 /* BUTTON dans l'arbre FORM_INFO */
#define FORM_TEXTE 4 /* Formulaire/Dialogue */
#define TEXTE_TNORMAL 3 /* TEXT dans l'arbre FORM_TEXTE */
@@ -905,5 +906,3 @@
#define LDVA_OK 38 /* BUTTON dans l'arbre FORM_LDVAPPLY */
#define LDVA_PREVIEW 39 /* BUTTON dans l'arbre FORM_LDVAPPLY */
#define LDVA_CANCEL 40 /* BUTTON dans l'arbre FORM_LDVAPPLY */
-
-#define FORM_HEX 52 /* Formulaire/Dialogue */
diff --git a/tools/vision/LANGUES/FRANCAIS/VISION.HRD b/tools/vision/langues/francais/vision.hrd
similarity index 97%
rename from tools/vision/LANGUES/FRANCAIS/VISION.HRD
rename to tools/vision/langues/francais/vision.hrd
index 97436c8..eb1e186 100644
Binary files a/tools/vision/LANGUES/FRANCAIS/VISION.HRD and b/tools/vision/langues/francais/vision.hrd differ
diff --git a/tools/vision/LANGUES/FRANCAIS/VISION.RSC b/tools/vision/langues/francais/vision.rsc
similarity index 65%
rename from tools/vision/LANGUES/FRANCAIS/VISION.RSC
rename to tools/vision/langues/francais/vision.rsc
index d4dbbbf..aa37f56 100644
Binary files a/tools/vision/LANGUES/FRANCAIS/VISION.RSC and b/tools/vision/langues/francais/vision.rsc differ
diff --git a/tools/vision/LANGUES/FRANCAIS/VISIONB.H b/tools/vision/langues/francais/visionb.h
similarity index 100%
rename from tools/vision/LANGUES/FRANCAIS/VISIONB.H
rename to tools/vision/langues/francais/visionb.h
diff --git a/tools/vision/LANGUES/FRANCAIS/visionb.hrd b/tools/vision/langues/francais/visionb.hrd
similarity index 100%
rename from tools/vision/LANGUES/FRANCAIS/visionb.hrd
rename to tools/vision/langues/francais/visionb.hrd
diff --git a/tools/vision/LANGUES/FRANCAIS/VISIONB.RSC b/tools/vision/langues/francais/visionb.rsc
similarity index 100%
rename from tools/vision/LANGUES/FRANCAIS/VISIONB.RSC
rename to tools/vision/langues/francais/visionb.rsc
diff --git a/tools/vision/LANGUES/FRANCAIS/VMSG.H b/tools/vision/langues/francais/vmsg.h
similarity index 92%
rename from tools/vision/LANGUES/FRANCAIS/VMSG.H
rename to tools/vision/langues/francais/vmsg.h
index 31bd0f2..c77b5dd 100644
--- a/tools/vision/LANGUES/FRANCAIS/VMSG.H
+++ b/tools/vision/langues/francais/vmsg.h
@@ -283,4 +283,12 @@
#define MSG_WASALL 281
#define MSG_WADELICONS 282
#define MSG_WADELFILES 283
-#define MSG_ENDLIST 284
+#define MSG_UPTIMGMOD 284
+#define MSG_UPDATEAVAILABLE 285
+#define MSG_UPDATEDONE 286
+#define MSG_UPDATENOINTERNET 287
+#define MSG_VUPDATING 288
+#define MSG_UPDATEFAILED 289
+#define MSG_IMGADDPROP 290
+#define MSG_NOMORECONVERT 291
+#define MSG_ENDLIST 291
diff --git a/tools/vision/LANGUES/FRANCAIS/vmsg.txt b/tools/vision/langues/francais/vmsg.txt
similarity index 93%
rename from tools/vision/LANGUES/FRANCAIS/vmsg.txt
rename to tools/vision/langues/francais/vmsg.txt
index 5f930f9..c7181db 100644
--- a/tools/vision/LANGUES/FRANCAIS/vmsg.txt
+++ b/tools/vision/langues/francais/vmsg.txt
@@ -275,9 +275,17 @@
275:Mise … jour du fichier catalogue...
276:[Impossible de mettre le catalogue … jour|code erreur=%d][OK]
277:[Supprimer %ld images du catalogue?|Les fichiers images ne seront pas supprim‚s][Oui|Non]
-278:[Supprimer %ld images du catalogue?|Ainsi que les fichiers images?][Yes|No]
+278:[Supprimer %ld images du catalogue?|Ainsi que les fichiers images?][Oui|Non]
279:Supression des enregistrements du catalogue...
280:Supression des enregistrements et fichiers images du catalogue...
281: Tout s‚lectionner
282: Supprimer du catalogue...
-283: Supprimer les fichiers...
\ No newline at end of file
+283: Supprimer les fichiers...
+284:Mise … jour de la base de donn‚es des modules images...
+285:[Mise … jour %s disponible!|Voulez-vous l'installer?][Oui|Non]
+286:[Fin de la mise … jour!|VISION va quitter maintenant][OK]
+287:[La connexion Internet ne semble pas ˆtre disponible|Voulez-vous d‚-activer les mises … jour?][Oui|Non]
+288:Mise … jour de VISION...
+289:[Echec de la mise … jour %d|Voyez VISION.LOG][OK]
+290:Attributs additionnels de l'image
+291:[Cette fonction est maintenant|disponible depuis le LDV Dither][OK]
diff --git a/tools/vision/LANGUES/italian/vision.hrd b/tools/vision/langues/italian/vision.hrd
similarity index 100%
rename from tools/vision/LANGUES/italian/vision.hrd
rename to tools/vision/langues/italian/vision.hrd
diff --git a/tools/vision/LANGUES/italian/VISION.RSC b/tools/vision/langues/italian/vision.rsc
similarity index 52%
rename from tools/vision/LANGUES/italian/VISION.RSC
rename to tools/vision/langues/italian/vision.rsc
index 94dc5ad..581fc60 100644
Binary files a/tools/vision/LANGUES/italian/VISION.RSC and b/tools/vision/langues/italian/vision.rsc differ
diff --git a/tools/vision/LANGUES/italian/visionb.hrd b/tools/vision/langues/italian/visionb.hrd
similarity index 100%
rename from tools/vision/LANGUES/italian/visionb.hrd
rename to tools/vision/langues/italian/visionb.hrd
diff --git a/tools/vision/LANGUES/italian/VISIONB.RSC b/tools/vision/langues/italian/visionb.rsc
similarity index 100%
rename from tools/vision/LANGUES/italian/VISIONB.RSC
rename to tools/vision/langues/italian/visionb.rsc
diff --git a/tools/vision/LANGUES/italian/vmsg.txt b/tools/vision/langues/italian/vmsg.txt
similarity index 93%
rename from tools/vision/LANGUES/italian/vmsg.txt
rename to tools/vision/langues/italian/vmsg.txt
index e52cf63..09bbd04 100644
--- a/tools/vision/LANGUES/italian/vmsg.txt
+++ b/tools/vision/langues/italian/vmsg.txt
@@ -280,4 +280,12 @@
280:Rimozione di record e file immagini dal catalogo...
281: Seleziona tutti gli oggetti
282: Rimuovi dal catalogo...
-283: Rimuovi file immagine...
\ No newline at end of file
+283: Rimuovi file immagine...
+284:Aggiornamento del database dei mduli immagine...
+285:[Aggiornamento %s disponibile!|Vuoi installarlo?][Si|No]
+286:[Aggiornamento eseguito!|VISION ora verr… chiuso][OK]
+287:[Internet non Š accessibile|Desideri disabilatare il controllo degli aggiiornamenti?][Si|No]
+288:Aggiornamento di VISION...
+289:[Aggiornamento non riuscito con %d|Controllare VISION.LOG][OK]
+290:Attributi di immagine aggiuntivi
+291:[Questa funzione Š ora|disponibile da Dither LDV][OK]
diff --git a/tools/vision/LANGUES/README.TXT b/tools/vision/langues/readme.txt
similarity index 100%
rename from tools/vision/LANGUES/README.TXT
rename to tools/vision/langues/readme.txt
diff --git a/tools/vision/LANGUES/svenska/vision.hrd b/tools/vision/langues/svenska/vision.hrd
similarity index 100%
rename from tools/vision/LANGUES/svenska/vision.hrd
rename to tools/vision/langues/svenska/vision.hrd
diff --git a/tools/vision/LANGUES/svenska/VISION.RSC b/tools/vision/langues/svenska/vision.rsc
similarity index 53%
rename from tools/vision/LANGUES/svenska/VISION.RSC
rename to tools/vision/langues/svenska/vision.rsc
index 27c818b..631c610 100644
Binary files a/tools/vision/LANGUES/svenska/VISION.RSC and b/tools/vision/langues/svenska/vision.rsc differ
diff --git a/tools/vision/LANGUES/svenska/visionb.hrd b/tools/vision/langues/svenska/visionb.hrd
similarity index 100%
rename from tools/vision/LANGUES/svenska/visionb.hrd
rename to tools/vision/langues/svenska/visionb.hrd
diff --git a/tools/vision/LANGUES/svenska/VISIONB.RSC b/tools/vision/langues/svenska/visionb.rsc
similarity index 100%
rename from tools/vision/LANGUES/svenska/VISIONB.RSC
rename to tools/vision/langues/svenska/visionb.rsc
diff --git a/tools/vision/LANGUES/svenska/vmsg.txt b/tools/vision/langues/svenska/vmsg.txt
similarity index 92%
rename from tools/vision/LANGUES/svenska/vmsg.txt
rename to tools/vision/langues/svenska/vmsg.txt
index 70e09b6..cc1af30 100644
--- a/tools/vision/LANGUES/svenska/vmsg.txt
+++ b/tools/vision/langues/svenska/vmsg.txt
@@ -280,4 +280,12 @@
280:Ta bort poster och bidfiler fr†n katalog...
281: V„lj alla objekt
282: Ta bort fr†n katalog...
-283: Ta bort bildfiler...
\ No newline at end of file
+283: Ta bort bildfiler...
+284:Uppdatering av bildmodulens databas...
+285:[Uppdatering %s till„nglig!|Vill du installera det?][Ja|Nej]
+286:[Uppdateringen har gjorts!|VISION kommer nu att avsluta][OK]
+287:[Internet ser inte tillg„ngligt|Vill du inaktivera uppdateringskontroll?][Ja|Nej]
+288:Uppdaterar VISION...
+289:[Uppdateringen misslyckades med %d|Kontrollera VISION.LOG][OK]
+290:Ytterligare bildattribut
+291:[Den h„r funktionen „r nu|tillg„nglig fr†n Dither LDV][OK]
\ No newline at end of file
diff --git a/tools/vision/LDV/bhole.ini b/tools/vision/ldv/bhole.ini
similarity index 100%
rename from tools/vision/LDV/bhole.ini
rename to tools/vision/ldv/bhole.ini
diff --git a/tools/vision/ldv/bhole.ldv b/tools/vision/ldv/bhole.ldv
new file mode 100644
index 0000000..c882bd1
Binary files /dev/null and b/tools/vision/ldv/bhole.ldv differ
diff --git a/tools/vision/LDV/BW.INI b/tools/vision/ldv/bw.ini
similarity index 100%
rename from tools/vision/LDV/BW.INI
rename to tools/vision/ldv/bw.ini
diff --git a/tools/vision/ldv/bw.ldv b/tools/vision/ldv/bw.ldv
new file mode 100644
index 0000000..8866145
Binary files /dev/null and b/tools/vision/ldv/bw.ldv differ
diff --git a/tools/vision/ldv/cntcol.ini b/tools/vision/ldv/cntcol.ini
new file mode 100644
index 0000000..0122a63
--- /dev/null
+++ b/tools/vision/ldv/cntcol.ini
@@ -0,0 +1,46 @@
+; This is a basic INI file used
+; To setup a language for a LDV
+; Module for VISION 4.0 or older
+; For example, if your module is
+; Named SOGOOD.LDV, you should create
+; SOGOOD.INI (default file, this may be the English version) in LDV folder
+; SOGOOD.INI in the FRANCAIS folder for the French version
+; SOGOOD.INI in the ENGLISH folder for the English version
+; SOGOOD.INI in the SVENSKA folder for the Swedish version
+; ... and so on ...
+; Now you just have to fill in the ShortName, LongName and Description fields
+; Note that VISION will search for the INI file associated to the LDV file
+; In the folder defined by the language setup (same as in LANGUES folder)
+
+[Informations]
+; ShortName should not exceed 15 caracters
+ShortName = Count Colors
+; LongName should not exceed 31 caracters
+LongName = Count Colors (per line/global)
+; Description should not exceed 79 caracters
+Description = Counts the number of colors on an image
+
+; Here comes the language parameters dependencies
+[Parameter1]
+Name = Method
+; Method = 0: auto selection by LDV depending on image
+; Method = 1:
+; Per line: simple add to color array if color does not exist (quite slow if many colors)
+; Globally: bitarray of max. # of colors
+; Memory usage: 2MB max (32bit) + 1 line
+; Method = 2:
+; Per line: sort/reduce colors
+; Globally: sort/reduce colors
+; Memory usage: full image memory + 1 line
+; Method = 3: (#1 and #2 mix)
+; Per line: sort/reduce colors
+; Globally: bitarray of max. # of colors
+; Memory usage: 2MB max (32bit) + 1 line
+Type = 1
+MinValue = 0
+DefaultValue = 0
+MaxValue = 3
+
+[Parameter2]
+Name = OutputFile
+Type = 3
diff --git a/tools/vision/ldv/cntcol.ldv b/tools/vision/ldv/cntcol.ldv
new file mode 100644
index 0000000..646d4e1
Binary files /dev/null and b/tools/vision/ldv/cntcol.ldv differ
diff --git a/tools/vision/ldv/dither.ini b/tools/vision/ldv/dither.ini
new file mode 100644
index 0000000..9754832
--- /dev/null
+++ b/tools/vision/ldv/dither.ini
@@ -0,0 +1,44 @@
+; This is a basic INI file used
+; To setup a language for a LDV
+; Module for VISION 4.0 or older
+; For example, if your module is
+; Named SOGOOD.LDV, you should create
+; SOGOOD.INI (default file, this may be the English version) in LDV folder
+; SOGOOD.INI in the FRANCAIS folder for the French version
+; SOGOOD.INI in the ENGLISH folder for the English version
+; SOGOOD.INI in the SVENSKA folder for the Swedish version
+; ... and so on ...
+; Now you just have to fill in the ShortName, LongName and Description fields
+; Note that VISION will search for the INI file associated to the LDV file
+; In the folder defined by the language setup (same as in LANGUES folder)
+
+[Informations]
+; ShortName should not exceed 15 caracters
+ShortName = Dither
+; LongName should not exceed 31 caracters
+LongName = Dithers an image
+; Description should not exceed 79 caracters
+Description = Reduces number of colors of an image with different methods
+
+; Here comes the language parameters dependencies
+[Parameter1]
+Name = Method
+Type = 1
+MinValue = 0
+DefaultValue = 0
+MaxValue = 4
+Labels = Auto,Mono-Matrix,Greyscale,216 colors,Dual-Tone
+
+[Parameter2]
+Name = Method param
+Type = 1
+MinValue = -1
+DefaultValue = 50
+MaxValue = 100
+
+[Parameter3]
+Name = Output planes
+Type = 1
+MinValue = 0
+DefaultValue = 0
+MaxValue = 32
diff --git a/tools/vision/ldv/dither.ldv b/tools/vision/ldv/dither.ldv
new file mode 100644
index 0000000..b440a3c
Binary files /dev/null and b/tools/vision/ldv/dither.ldv differ
diff --git a/tools/vision/LDV/doc/defines.htm b/tools/vision/ldv/doc/defines.htm
similarity index 100%
rename from tools/vision/LDV/doc/defines.htm
rename to tools/vision/ldv/doc/defines.htm
diff --git a/tools/vision/LDV/doc/descrip.htm b/tools/vision/ldv/doc/descrip.htm
similarity index 100%
rename from tools/vision/LDV/doc/descrip.htm
rename to tools/vision/ldv/doc/descrip.htm
diff --git a/tools/vision/LDV/doc/english/defines.htm b/tools/vision/ldv/doc/english/defines.htm
similarity index 100%
rename from tools/vision/LDV/doc/english/defines.htm
rename to tools/vision/ldv/doc/english/defines.htm
diff --git a/tools/vision/LDV/doc/english/descrip.htm b/tools/vision/ldv/doc/english/descrip.htm
similarity index 100%
rename from tools/vision/LDV/doc/english/descrip.htm
rename to tools/vision/ldv/doc/english/descrip.htm
diff --git a/tools/vision/LDV/doc/english/hints.htm b/tools/vision/ldv/doc/english/hints.htm
similarity index 100%
rename from tools/vision/LDV/doc/english/hints.htm
rename to tools/vision/ldv/doc/english/hints.htm
diff --git a/tools/vision/LDV/doc/english/images/conc2.gif b/tools/vision/ldv/doc/english/images/conc2.gif
similarity index 100%
rename from tools/vision/LDV/doc/english/images/conc2.gif
rename to tools/vision/ldv/doc/english/images/conc2.gif
diff --git a/tools/vision/LDV/doc/english/images/cprev.jpg b/tools/vision/ldv/doc/english/images/cprev.jpg
similarity index 100%
rename from tools/vision/LDV/doc/english/images/cprev.jpg
rename to tools/vision/ldv/doc/english/images/cprev.jpg
diff --git a/tools/vision/LDV/doc/english/images/csom.jpg b/tools/vision/ldv/doc/english/images/csom.jpg
similarity index 100%
rename from tools/vision/LDV/doc/english/images/csom.jpg
rename to tools/vision/ldv/doc/english/images/csom.jpg
diff --git a/tools/vision/LDV/doc/english/images/csuiv.jpg b/tools/vision/ldv/doc/english/images/csuiv.jpg
similarity index 100%
rename from tools/vision/LDV/doc/english/images/csuiv.jpg
rename to tools/vision/ldv/doc/english/images/csuiv.jpg
diff --git a/tools/vision/LDV/doc/english/images/icointro.gif b/tools/vision/ldv/doc/english/images/icointro.gif
similarity index 100%
rename from tools/vision/LDV/doc/english/images/icointro.gif
rename to tools/vision/ldv/doc/english/images/icointro.gif
diff --git a/tools/vision/LDV/doc/english/images/icoprinc.gif b/tools/vision/ldv/doc/english/images/icoprinc.gif
similarity index 100%
rename from tools/vision/LDV/doc/english/images/icoprinc.gif
rename to tools/vision/ldv/doc/english/images/icoprinc.gif
diff --git a/tools/vision/LDV/doc/english/index.htm b/tools/vision/ldv/doc/english/index.htm
similarity index 100%
rename from tools/vision/LDV/doc/english/index.htm
rename to tools/vision/ldv/doc/english/index.htm
diff --git a/tools/vision/LDV/doc/english/intro.htm b/tools/vision/ldv/doc/english/intro.htm
similarity index 100%
rename from tools/vision/LDV/doc/english/intro.htm
rename to tools/vision/ldv/doc/english/intro.htm
diff --git a/tools/vision/LDV/doc/english/kitdev.htm b/tools/vision/ldv/doc/english/kitdev.htm
similarity index 70%
rename from tools/vision/LDV/doc/english/kitdev.htm
rename to tools/vision/ldv/doc/english/kitdev.htm
index c0e9e4d..ade46a8 100644
--- a/tools/vision/LDV/doc/english/kitdev.htm
+++ b/tools/vision/ldv/doc/english/kitdev.htm
@@ -1,9 +1,8 @@
-
+
VISION Documentation (LDV): Development kit
-
@@ -18,7 +17,7 @@

|
- Last update: 05/04/18
+ | Last update: 03/28/20
|
@@ -241,26 +240,25 @@ as well as the sources (in PureC). Here are their characteristics:
| Performs a pixelization on an image or part of it |
- | Capacités |
+ Capabilities |
True Color modes only (16 and 32
planes). ATARI. format |
- | Type de
- transformation |
+ Transformation type |
In place |
- | Utilise VAPI |
+ Uses VAPI |
Yes (Progress
Interface) |
- | Fichier INI |
+ INI file |
Yes (English / French) |
- | Remarque |
+ Comment |
Nice
effect and good for learning: this LDV only considers True Color
ATARI format and it will nevertheless run on your MagicPC ! It makes
@@ -281,28 +279,27 @@ use of VISION feature to deal with format handli
| Performs a perspective effect on an image or part of it |
- | Capacités |
+ Capabilities |
Any number of bitplans (1, 2, 4, 8, 16, 24
and 32). ATARI format. Does not change palette. |
- | Type de
- transformation |
+ Transformation type |
Forces VISION to
allocate memory for destination. |
- | Utilise VAPI |
+ Uses VAPI |
Oui (Progress
Interface+ Raster Interface
+ MEM Interface) |
- | Fichier INI |
+ INI file |
Yes (English / French) |
- | Remarque |
+ Comment |
Nice perspective effect. When operating on selection, the allocation bloc is set thanks to LDVF_NOSELECTION
flag (pretty painful to handle in bitplane mode). This LDV only gets an image and not bloc selection.MEM Interface function MeCopyMemoryxx is used to scale lines. |
@@ -321,26 +318,25 @@ use of VISION feature to deal with format handli
Change red, green, blue color spreading using a line (light) or a gamma curve (gamma). |
- | Capacités |
+ Capabilities |
Any number of bitplans (1, 2, 4, 8, 16, 24
and 32). Machine format. Modifies the palette. |
- | Type de
- transformation |
+ Transformation type |
In place |
- | Utilise VAPI |
+ Uses VAPI |
Yes (Progress
Interface+ Raster Interface) |
- | Fichier INI |
+ INI file |
Yes (English / French) |
- | Remarque |
+ Comment |
Smart replace for old embedded functions in
VISION..In bitplane mode, palette is changed. Handles cancel.
These LDVs are pretty optimized for memory performances: they operate
@@ -363,27 +359,26 @@ image.(true colro only).
| Performs a rotation on the image or part of it. |
- | Capacités |
+ Capabilities |
Any number of bitplans (1, 2, 4, 8, 16, 24
and 32). Machine format. Does not change the palette. |
- | Type de
- transformation |
+ Transformation type |
Forces VISION to
allocate memory for destination. |
- | Utilise VAPI |
+ Uses VAPI |
Yes (Progress
Interface+ Raster Interface) |
- | Fichier INI |
+ INI file |
Yes (English / French) |
- | Remarque |
+ Comment |
This LDV is very simple. Actually it just calls RaRasterRotateGetDstMFDB and RaRasterRotate
functions in VAPI Raster interface .
Have a look how LDVF_NOSELECTION flag is used in order to not complicate things with blocs. |
@@ -391,7 +386,7 @@ image.(true colro only).
-
+
@@ -400,77 +395,147 @@ image.(true colro only).
| Description |
- Mix image blocs to generate a puzzle |
+ Mixes image blocs to generate a puzzle |
- | Capacités |
+ Capabilities |
Any number of bitplans (1, 2, 4, 8, 16, 24
and 32). Machine format. Does not change the palette. |
- | Type de
- transformation |
+ Transformation type |
Forces VISION to
allocate memory for destination. |
- | Utilise VAPI |
+ Uses VAPI |
Yes (Progress
Interface) |
- | Fichier INI |
+ INI file |
Yes (English / French) |
- | Remarque |
+ Comment |
Fun LDV easy to code. Smartest thing is entropy handling i.e. how much disorder there is in the mix. |
-
-
-
-
-
-
+
- | BHOLE.LDV |
+ BHOLE.LDV |
| Description |
Simulates a black hole in an image. Consider it as a tribute to Stephen Hawking. |
- | Capacités |
+ Capabilities |
Any number of bitplans (1, 2, 4, 8, 16, 24
and 32). Machine format. Does not change the palette. |
- | Type de
- transformation |
+ Transformation type |
Forces VISION to
allocate memory for destination. |
- | Utilise VAPI |
+ Uses VAPI |
Yes (Progress
Interface+Config Interface+Logging Interface) |
- | Fichier INI |
+ INI file |
Yes (English / French) |
- | Remarque |
+ Comment |
Most complicated LDV so far. Has its own optimzations for 68030 and 68881. Uses black hole symetry to speed up computations. |
-
+
| GENIMG.LDV |
+
+
+ | Description |
+ Generates as many different colors as possible on an image (tester for previous LDV) |
+
+
+ | Capabilities |
+ Any number of bitplans (1, 2, 4, 8, 16, and 32). Machine format. Does not change the palette. |
+
+
+ | Transformation type |
+ Forces VISION to
+ allocate memory for destination. |
+
+
+ | Uses VAPI |
+ Yes (Progress
+ Interface+Raster Interface) |
+
+
+ | INI file |
+ Yes (English) |
+
+
+ | Comment |
+ Ugly image generated. |
| DITHER.LDV |
+
+
+ | Description |
+ Dithers an image to any number of planes using different methods |
+
+
+ | Capabilities |
+ Any number of bitplans (1, 2, 4, 8, 16, and 32). ATARI format. Palette might be changed/created. |
+
+
+ | Transformation type |
+ Forces VISION to
+ allocate memory for destination. |
+
+
+ | Uses VAPI |
+ Yes (Progress
+ Interface+Config Interface+Logging Interface + Image Interface) |
+
+
+ | INI file |
+ Yes (English) |
+
+
+ | Comment |
+ Pretty simple as it basically calls ImDither function from Image Interface. |
@@ -490,7 +555,7 @@ image.(true colro only).

|
- Last update: 05/04/18
+ | Last update: 03/28/20
|
diff --git a/tools/vision/LDV/doc/english/modele.htm b/tools/vision/ldv/doc/english/modele.htm
similarity index 100%
rename from tools/vision/LDV/doc/english/modele.htm
rename to tools/vision/ldv/doc/english/modele.htm
diff --git a/tools/vision/LDV/doc/english/notions.htm b/tools/vision/ldv/doc/english/notions.htm
similarity index 100%
rename from tools/vision/LDV/doc/english/notions.htm
rename to tools/vision/ldv/doc/english/notions.htm
diff --git a/tools/vision/LDV/doc/english/struct.htm b/tools/vision/ldv/doc/english/struct.htm
similarity index 100%
rename from tools/vision/LDV/doc/english/struct.htm
rename to tools/vision/ldv/doc/english/struct.htm
diff --git a/tools/vision/LDV/doc/english/vapi/co.htm b/tools/vision/ldv/doc/english/vapi/co.htm
similarity index 97%
rename from tools/vision/LDV/doc/english/vapi/co.htm
rename to tools/vision/ldv/doc/english/vapi/co.htm
index d5a6ab6..3022ff4 100644
--- a/tools/vision/LDV/doc/english/vapi/co.htm
+++ b/tools/vision/ldv/doc/english/vapi/co.htm
@@ -1,4 +1,4 @@
-
+
diff --git a/tools/vision/ldv/doc/english/vapi/fi.html b/tools/vision/ldv/doc/english/vapi/fi.html
new file mode 100644
index 0000000..aea226d
--- /dev/null
+++ b/tools/vision/ldv/doc/english/vapi/fi.html
@@ -0,0 +1,296 @@
+
+
+
+
+Documentation VISION (VAPI) : Configuration Interface
+
+
+
+
+
+    |
+ 
+ |
+ Documentation VISION
+ (VAPI)
+ |
+ 
+ |
+ Last update : 04/12/20
+ |
+
+
+
+ |
+ FILE INTERFACE
+ |
+ |
+
+
+
+
+
+
+
+
+
+ | Summary |
+
+
+ | Préfixe de l'interface |
+ Fi |
+
+
+ | Nombre de fonctions |
+ 7 |
+
+
+ | Description |
+ Set of functions to manage files |
+
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl FiFileExist(char* file) |
+
+
+ | Paramètres |
+ file: filename of the file to test against presence |
+
+
+ | Retour |
+ Non zero if file exists |
+
+
+ | Description |
+ Self explanatory |
+
+
+ | Remarques |
+
|
+
+
+ | Version VAPI |
+ 1.09 or more |
+
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl FiFolderExist(char* folder) |
+
+
+ | Paramètres |
+ folder: folder to test against presence |
+
+
+ | Retour |
+ Non zero if folder exists |
+
+
+ | Description |
+ Self explanatory |
+
+
+ | Remarques |
+
|
+
+
+ | Version VAPI |
+ 1.09 or more |
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl FiCopyFile(char* src, char* dst) |
+
+
+ | Paramètres |
+ src: name of source file dst: name of destination file |
+
+
+ | Retour |
+ Zero if success |
+
+
+ | Description |
+ Copies
+source file to destination file. Folder for destination must exist (see
+next function if you wish to create all intermediate folders) |
+
+
+ | Remarques |
+
|
+
+
+ | Version VAPI |
+ 1.09 or more |
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl FiCopyFileR(char* src, char* dst) |
+
+
+ | Paramètres |
+ src: name of source file dst: name of destination file |
+
+
+ | Retour |
+ Zero if success |
+
+
+ | Description |
+ Copies
+source file to destination file and create any intermediate folder if required. |
+
+
+ | Remarques |
+
|
+
+
+ | Version VAPI |
+ 1.09 or more |
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl FiMoveFile(char* src, char* dst) |
+
+
+ | Paramètres |
+ src: name of source file dst: name of destination file |
+
+
+ | Retour |
+ Zero if success |
+
+
+ | Description |
+ Moves source file to destination file. |
+
+
+ | Remarques |
+
|
+
+
+ | Version VAPI |
+ 1.09 or more |
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl FiCreateFolder(char* path) |
+
+
+ | Paramètres |
+ path: path to create |
+
+
+ | Retour |
+ Zero if success |
+
+
+ | Description |
+ Self explanatory |
+
+
+ | Remarques |
+ Returns success (0) if folder already exists
|
+
+
+ | Version VAPI |
+ 1.09 or more |
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl FiCmpFiles(char* f1, char* f2) |
+
+
+ | Paramètres |
+ f1: name of first file f2: name of file to compare to |
+
+
+ | Retour |
+ 1 if files are equal |
+
+
+ | Description |
+ Self explanatory |
+
+
+ | Remarques |
+
|
+
+
+ | Version VAPI |
+ 1.09 or more |
+
+
+
+
+
+
+
+
+
+
+
+    |
+ 
+ |
+ Documentation VISION
+ (VAPI)
+ |
+ 
+ |
+
+ |
+
+
+ Télécharger la doc
+ |
+ FILE INTERFACE
+ |
+ |
+
+
+
+
\ No newline at end of file
diff --git a/tools/vision/ldv/doc/english/vapi/im.htm b/tools/vision/ldv/doc/english/vapi/im.htm
new file mode 100644
index 0000000..b530e00
--- /dev/null
+++ b/tools/vision/ldv/doc/english/vapi/im.htm
@@ -0,0 +1,297 @@
+
+
+
+
+Documentation VISION (VAPI) : Configuration Interface
+
+
+
+
+
+    |
+ 
+ |
+ Documentation VISION
+ (VAPI)
+ |
+ 
+ |
+ Dernière
+ mise à jour : 02/12/20
+ |
+
+
+
+ |
+ IMAGE INTERFACE
+ |
+ |
+
+
+
+
+
+
+
+
+
+ | Summary |
+
+
+ | Interface prefix |
+ Im |
+
+
+ | Number of functions |
+ 7 |
+
+
+ | Description |
+ Set of functions to manage images files |
+
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl ImGetInf(char* filename, void* ldv_img) |
+
+
+ | Parameters |
+ filename: name of the image file ldv_img: pointer to a LDV_IMAGE structure |
+
+
+ | Return |
+ LDV_STATUS |
+
+
+ | Description |
+ Reads
+informatiuons from the file and fills in the LDV_IMAGE strucutre. Image
+is not loaded (see next function) but all image caracteristics such as
+width, height, number of planes, ... are fetched. |
+
+
+ | Comments |
+ Call ImFree to free related resources
|
+
+
+ | Version VAPI |
+ 1.09 or more |
+
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl ImLoad(void* ldv_img) |
+
+
+ | Parameters |
+ ldv_img: pointer to LDV_IMAGE structure previously filled-in by ImGetInf |
+
+
+ | Return |
+ LDV_STATUS |
+
+
+ | Description |
+ Loads the image into memory |
+
+
+ | Comments |
+ Image data is read during this call |
+
+
+ | Version VAPI |
+ 1.09 or more |
+
+
+
+
+
+
+
+
+
+ | Prototype |
+ void cdecl ImFree(void* ldv_img) |
+
+
+ | Parameters |
+ ldv_img: pointer to LDV_IMAGE structure previously filled-in by ImGetInf |
+
+
+ | Return |
+ None |
+
+
+ | Description |
+ Frees resources allocated by ImGetInf and ImLoad |
+
+
+ | Comments |
+ . |
+
+
+ | Version VAPI |
+ 1.09 or more |
+
+
+
+
+
+
+ | Prototype |
+ long cdecl ImSave(char* filename, void* ldv_img, char* save_options) ; |
+
+
+ | Parameters |
+ filename: name of file to save image ldv_img: LDV_IMAGE structure defining image to save save_options: standard options, separated by '';',(option=<value>): fmt = <3 characters defining image format> quality=<quality 0...100> (JPEG) flipflop=<0 ou 2> (0: no flip-flop, 2: Y flip-flop) (TGA) compression=<none or lzw> (TIF) byteorder=<motorola or intel> (TIF) |
+
+
+ | Return |
+ LDV_STATUS |
+
+
+ | Description |
+ Saves an image residing in memory to a file |
+
+
+ | Comments |
+ Example status = Vapi->ImSave( "h:\\test.tif", ldv_img, "fmt=TIF;compression=LZW;byteorder=motorola" ) ; Some options depend on the format; they may be ignored by the driver in charge of saving Check out opnsav.vcs script for an example on the options |
+
+
+ | Version VAPI |
+ 1.09 or more |
+
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl ImDither(long method, long param, void* ldv_img_in, void* ldv_img_out) |
+
+
+ | Parameters |
+ method: dither method to use:
- 0: Auto, let VISION decide
- 1: monochrome mattrix
- 2: grey level
- 3: 216 colors
- 4: dual-tone
ldv_img_in: LDV_IMAGE structure usually provided by VISION ldv_img_out: LDV_IMAGE structure holding dithered image |
+
+
+ | Return |
+ LDV_STATUS |
+
+
+ | Description |
+ Request VISION to dither an image using a method Output number of planes shall be stated in variable out->Raster.fd_nplanes (1,4,8,16 ou32) |
+
+
+ | Comments |
+ |
+
+
+ | Version VAPI |
+ 1.09 or more |
+
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl ImGetStdData(void* ldv_img, char* query, char* out_data, long out_data_size) ; |
+
+
+ | Parameters |
+ ldv_img: pointer to LDV_IMAGE structure previously filled-in by ImGetInf query: string to request standard atribute which list follows:
- filename: filename passed to ImGetInf
out_data: string holding value of the requested attribute out_data_size: size, in bytes, of out_data buffer |
+
+
+ | Return |
+ LDV_STATUS |
+
+
+ | Description |
+ Requests standard data on an image |
+
+
+ | Comments |
+ See optimg.ldv source code |
+
+
+ | Version VAPI |
+ 1.09 or more |
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl ImComputeHistogram(void* ldv_img, HISTO *histo) ; |
+
+
+ | Parameters |
+ ldv_img: LDV_IMAGE structure defining image to compute histograms histo: pointeur to a HISTO structure containing the result |
+
+
+ | Return |
+ LDV_STATUS |
+
+
+ | Description |
+ Requests VISION to compute histograms |
+
+
+ | Remarques |
+ .histo->norm shall be initialized to tell VISION what is the maximal value for the highest repetition frequency See optimg.ldv source code |
+
+
+ | Version VAPI |
+ 1.09 or more |
+
+
+
+
+
+
+
+
+
+
+    |
+ 
+ |
+ Documentation VISION
+ (VAPI)
+ |
+ 
+ |
+
+ |
+
+
+
+ |
+ IMAGE INTERFACE
+ |
+ |
+
+
+
+
\ No newline at end of file
diff --git a/tools/vision/LDV/doc/english/vapi/in.htm b/tools/vision/ldv/doc/english/vapi/in.htm
similarity index 97%
rename from tools/vision/LDV/doc/english/vapi/in.htm
rename to tools/vision/ldv/doc/english/vapi/in.htm
index ecb0d54..f291b0e 100644
--- a/tools/vision/LDV/doc/english/vapi/in.htm
+++ b/tools/vision/ldv/doc/english/vapi/in.htm
@@ -1,4 +1,4 @@
-
+
diff --git a/tools/vision/LDV/doc/english/vapi/index.htm b/tools/vision/ldv/doc/english/vapi/index.htm
similarity index 97%
rename from tools/vision/LDV/doc/english/vapi/index.htm
rename to tools/vision/ldv/doc/english/vapi/index.htm
index 5285381..5d6bb80 100644
--- a/tools/vision/LDV/doc/english/vapi/index.htm
+++ b/tools/vision/ldv/doc/english/vapi/index.htm
@@ -1,4 +1,4 @@
-
+
diff --git a/tools/vision/LDV/doc/english/vapi/lo.htm b/tools/vision/ldv/doc/english/vapi/lo.htm
similarity index 97%
rename from tools/vision/LDV/doc/english/vapi/lo.htm
rename to tools/vision/ldv/doc/english/vapi/lo.htm
index c6535aa..2b4e883 100644
--- a/tools/vision/LDV/doc/english/vapi/lo.htm
+++ b/tools/vision/ldv/doc/english/vapi/lo.htm
@@ -1,4 +1,4 @@
-
+
diff --git a/tools/vision/LDV/doc/english/vapi/me.htm b/tools/vision/ldv/doc/english/vapi/me.htm
similarity index 56%
rename from tools/vision/LDV/doc/english/vapi/me.htm
rename to tools/vision/ldv/doc/english/vapi/me.htm
index ebb482f..beb251d 100644
--- a/tools/vision/LDV/doc/english/vapi/me.htm
+++ b/tools/vision/ldv/doc/english/vapi/me.htm
@@ -1,4 +1,4 @@
-
+
@@ -16,7 +16,7 @@

|
- Last update : 08/04/18
+ | Last update : 03/28/20
|
@@ -43,11 +43,11 @@
| Nombre de fonctions |
- 3 |
+ 8 |
| Description |
- Set of functions allowing to manipulate memory areas, mostly image oriented |
+ Set of functions allowing to manipulate memory areas, mostly image oriented + dynamic memory allocations with stats/boundchecks though vision.log |
@@ -170,6 +170,156 @@ will use automatically an optimzed routine.
+
+
+
+
+ | Prototype |
+ void* cdecl MeXcalloc(unsigned long size) |
+
+
+ | Parameters |
+ [IN] size : Number of bytes to allocate
|
+
+
+ | Return |
+ Pointer to allocated memory of size bytes, NULL if error |
+
+
+ | Description |
+ Similar to malloc 'C' function from stdlib |
+
+
+ | Comments |
+ VISION will keep track of this allocation and check against leak or memory under/over flows. |
+
+
+ | VAPI Version |
+ 1.05 or greater |
+
+
+
+
+
+
+
+
+ | Prototype |
+ void* cdecl MeXrealloc(void* ptr, unsigned long size) |
+
+
+ | Parameters |
+ [IN] ptr : Currently allocated pointer to adjust size [IN] size : Number of bytes to allocate
|
+
+
+ | Return |
+ Pointer to allocated memory of size bytes, NULL if error |
+
+
+ | Description |
+ Similar to realloc 'C' function from stdlib |
+
+
+ | Comments |
+ VISION will keep track of this allocation and check against leak or memory under/over flows. |
+
+
+ | VAPI Version |
+ 1.05 or greater |
+
+
+
+
+
+
+
+
+ | Prototype |
+ void cdecl MeXfree(void* ptr) |
+
+
+ | Parameters |
+ [IN] ptr : Pointer to memory to be freed
|
+
+
+ | Return |
+ None |
+
+
+ | Description |
+ Similar to free 'C' function from stdlib |
+
+
+ | Comments |
+ VISION will check pointer is valid and if under/over flows has occured |
+
+
+ | VAPI Version |
+ 1.05 or greater |
+
+
+
+
+
+
+
+
+ | Prototype |
+ void* cdecl MeXcalloc(unsigned long nb_elems, unsigned long elem_size) |
+
+
+ | Parameters |
+ [IN] nb_elems : Number of elements to allocate [IN] elem_size : Sze of an element in bytes
|
+
+
+ | Return |
+ Pointer to allocated memory of size bytes, NULL if error |
+
+
+ | Description |
+ Similar to calloc 'C' function from stdlib; like malloc but allocated memory is zeroed. |
+
+
+ | Comments |
+ VISION will keep track of this allocation and check against leak or memory under/over flows. |
+
+
+ | VAPI Version |
+ 1.05 or greater |
+
+
+
+
+
+
+
+
+ | Prototype |
+ char* cdecl MeXstrdup(char* s) |
+
+
+ | Parameters |
+ [IN] s : Pointer to string to duplicate
|
+
+
+ | Return |
+ Pointer to duplicated string, NULL if error |
+
+
+ | Description |
+ Similar to strdup 'C' function from stdlib |
+
+
+ | Comments |
+ VISION will keep track of this allocation and check against leak or memory under/over flows. |
+
+
+ | VAPI Version |
+ 1.05 or greater |
+
+
+
+
@@ -185,7 +335,7 @@ will use automatically an optimzed routine.

|
- Last update : 08/04/18
+ | Last update : 03/28/20
|
diff --git a/tools/vision/LDV/doc/english/vapi/modele.htm b/tools/vision/ldv/doc/english/vapi/modele.htm
similarity index 100%
rename from tools/vision/LDV/doc/english/vapi/modele.htm
rename to tools/vision/ldv/doc/english/vapi/modele.htm
diff --git a/tools/vision/LDV/doc/english/vapi/pr.htm b/tools/vision/ldv/doc/english/vapi/pr.htm
similarity index 97%
rename from tools/vision/LDV/doc/english/vapi/pr.htm
rename to tools/vision/ldv/doc/english/vapi/pr.htm
index fffc7f5..8ab086c 100644
--- a/tools/vision/LDV/doc/english/vapi/pr.htm
+++ b/tools/vision/ldv/doc/english/vapi/pr.htm
@@ -1,4 +1,4 @@
-
+
diff --git a/tools/vision/LDV/doc/english/vapi/ra.htm b/tools/vision/ldv/doc/english/vapi/ra.htm
similarity index 97%
rename from tools/vision/LDV/doc/english/vapi/ra.htm
rename to tools/vision/ldv/doc/english/vapi/ra.htm
index 8f9f47d..f0f0bfd 100644
--- a/tools/vision/LDV/doc/english/vapi/ra.htm
+++ b/tools/vision/ldv/doc/english/vapi/ra.htm
@@ -1,4 +1,4 @@
-
+
diff --git a/tools/vision/LDV/doc/english/vapi/struct.htm b/tools/vision/ldv/doc/english/vapi/struct.htm
similarity index 97%
rename from tools/vision/LDV/doc/english/vapi/struct.htm
rename to tools/vision/ldv/doc/english/vapi/struct.htm
index 3f213f0..53a2176 100644
--- a/tools/vision/LDV/doc/english/vapi/struct.htm
+++ b/tools/vision/ldv/doc/english/vapi/struct.htm
@@ -1,4 +1,4 @@
-
+
diff --git a/tools/vision/LDV/doc/hints.htm b/tools/vision/ldv/doc/hints.htm
similarity index 100%
rename from tools/vision/LDV/doc/hints.htm
rename to tools/vision/ldv/doc/hints.htm
diff --git a/tools/vision/LDV/doc/images/conc2.gif b/tools/vision/ldv/doc/images/conc2.gif
similarity index 100%
rename from tools/vision/LDV/doc/images/conc2.gif
rename to tools/vision/ldv/doc/images/conc2.gif
diff --git a/tools/vision/LDV/doc/images/cprev.jpg b/tools/vision/ldv/doc/images/cprev.jpg
similarity index 100%
rename from tools/vision/LDV/doc/images/cprev.jpg
rename to tools/vision/ldv/doc/images/cprev.jpg
diff --git a/tools/vision/LDV/doc/images/csom.jpg b/tools/vision/ldv/doc/images/csom.jpg
similarity index 100%
rename from tools/vision/LDV/doc/images/csom.jpg
rename to tools/vision/ldv/doc/images/csom.jpg
diff --git a/tools/vision/LDV/doc/images/csuiv.jpg b/tools/vision/ldv/doc/images/csuiv.jpg
similarity index 100%
rename from tools/vision/LDV/doc/images/csuiv.jpg
rename to tools/vision/ldv/doc/images/csuiv.jpg
diff --git a/tools/vision/LDV/doc/images/icointro.gif b/tools/vision/ldv/doc/images/icointro.gif
similarity index 100%
rename from tools/vision/LDV/doc/images/icointro.gif
rename to tools/vision/ldv/doc/images/icointro.gif
diff --git a/tools/vision/LDV/doc/images/icoprinc.gif b/tools/vision/ldv/doc/images/icoprinc.gif
similarity index 100%
rename from tools/vision/LDV/doc/images/icoprinc.gif
rename to tools/vision/ldv/doc/images/icoprinc.gif
diff --git a/tools/vision/LDV/doc/index.htm b/tools/vision/ldv/doc/index.htm
similarity index 100%
rename from tools/vision/LDV/doc/index.htm
rename to tools/vision/ldv/doc/index.htm
diff --git a/tools/vision/LDV/doc/intro.htm b/tools/vision/ldv/doc/intro.htm
similarity index 100%
rename from tools/vision/LDV/doc/intro.htm
rename to tools/vision/ldv/doc/intro.htm
diff --git a/tools/vision/LDV/doc/kitdev.htm b/tools/vision/ldv/doc/kitdev.htm
similarity index 97%
rename from tools/vision/LDV/doc/kitdev.htm
rename to tools/vision/ldv/doc/kitdev.htm
index 755bdf8..8059e68 100644
--- a/tools/vision/LDV/doc/kitdev.htm
+++ b/tools/vision/ldv/doc/kitdev.htm
@@ -1,4 +1,4 @@
-
+
diff --git a/tools/vision/LDV/doc/modele.htm b/tools/vision/ldv/doc/modele.htm
similarity index 100%
rename from tools/vision/LDV/doc/modele.htm
rename to tools/vision/ldv/doc/modele.htm
diff --git a/tools/vision/LDV/doc/notions.htm b/tools/vision/ldv/doc/notions.htm
similarity index 100%
rename from tools/vision/LDV/doc/notions.htm
rename to tools/vision/ldv/doc/notions.htm
diff --git a/tools/vision/LDV/doc/struct.htm b/tools/vision/ldv/doc/struct.htm
similarity index 100%
rename from tools/vision/LDV/doc/struct.htm
rename to tools/vision/ldv/doc/struct.htm
diff --git a/tools/vision/LDV/doc/vapi/co.htm b/tools/vision/ldv/doc/vapi/co.htm
similarity index 97%
rename from tools/vision/LDV/doc/vapi/co.htm
rename to tools/vision/ldv/doc/vapi/co.htm
index 56cee92..7c36eff 100644
--- a/tools/vision/LDV/doc/vapi/co.htm
+++ b/tools/vision/ldv/doc/vapi/co.htm
@@ -1,4 +1,4 @@
-
+
diff --git a/tools/vision/ldv/doc/vapi/fi.htm b/tools/vision/ldv/doc/vapi/fi.htm
new file mode 100644
index 0000000..1288f59
--- /dev/null
+++ b/tools/vision/ldv/doc/vapi/fi.htm
@@ -0,0 +1,293 @@
+
+
+
+
+Documentation VISION (VAPI) : Configuration Interface
+
+
+
+
+
+    |
+ 
+ |
+ Documentation VISION
+ (VAPI)
+ |
+ 
+ |
+ Last update : 04/12/20
+ |
+
+
+
+ |
+ FILE INTERFACE
+ |
+ |
+
+
+
+
+
+
+
+
+
+ | Résumé |
+
+
+ | Préfixe de l'interface |
+ Fi |
+
+
+ | Nombre de fonctions |
+ 7 |
+
+
+ | Description |
+ Ensemble de fonctions permettant de manipuler des fichiers |
+
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl FiFileExist(char* file) |
+
+
+ | Paramètres |
+ file: nom du fichier sur lequel tester la présence |
+
+
+ | Retour |
+ Non nul si le fichier existe |
+
+
+ | Description |
+
|
+
+
+ | Remarques |
+
|
+
+
+ | Version VAPI |
+ 1.09 ou mieux |
+
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl FiFolderExist(char* folder) |
+
+
+ | Paramètres |
+ folder: nom du dossier sur lequel tester l'existence |
+
+
+ | Retour |
+ Non nul si le fichier existe |
+
+
+ | Description |
+
|
+
+
+ | Remarques |
+
|
+
+
+ | Version VAPI |
+ 1.09 ou mieux |
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl FiCopyFile(char* src, char* dst) |
+
+
+ | Paramètres |
+ src: nom du fichier source dst: nom du fichier destination |
+
+
+ | Retour |
+ Zero si succès |
+
+
+ | Description |
+ Copie la source vers la desnitation. Le dossier de la destination doit exister (voyez la fonction suivante sinon). |
+
+
+ | Remarques |
+
|
+
+
+ | Version VAPI |
+ 1.09 ou mieux |
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl FiCopyFileR(char* src, char* dst) |
+
+
+ | Paramètres |
+ src: nom du fichier source dst: nom du fichier destination |
+
+
+ | Retour |
+ Zero si succès |
+
+
+ | Description |
+ Copie la source vers la destination et créee les dossiers intermédiaires si nécessaire. |
+
+
+ | Remarques |
+
|
+
+
+ | Version VAPI |
+ 1.09 ou mieux |
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl FiMoveFile(char* src, char* dst) |
+
+
+ | Paramètres |
+ src: nom du fichier source dst: nom du fichier destination |
+
+
+ | Retour |
+ Zero si succès |
+
+
+ | Description |
+ Renomme le fichier source vers la destination |
+
+
+ | Remarques |
+
|
+
+
+ | Version VAPI |
+ 1.09 ou mieux |
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl FiCreateFolder(char* path) |
+
+
+ | Paramètres |
+ path: chemin du dossier à créer |
+
+
+ | Retour |
+ Zero si succès |
+
+
+ | Description |
+
|
+
+
+ | Remarques |
+ Returne succès (0) si le dossier existe déjà
|
+
+
+ | Version VAPI |
+ 1.09 ou mieux |
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl FiCmpFiles(char* f1, char* f2) |
+
+
+ | Paramètres |
+ f1: nom du premier fichier f2: nom du fichier à comparer |
+
+
+ | Retour |
+ 1 si les fichiers sont identiques |
+
+
+ | Description |
+
|
+
+
+ | Remarques |
+
|
+
+
+ | Version VAPI |
+ 1.09 ou mieux |
+
+
+
+
+
+
+
+
+
+
+
+    |
+ 
+ |
+ Documentation VISION
+ (VAPI)
+ |
+ 
+ |
+
+ |
+
+
+ Télécharger la doc
+ |
+ FILE INTERFACE
+ |
+ |
+
+
+
+
\ No newline at end of file
diff --git a/tools/vision/ldv/doc/vapi/im.htm b/tools/vision/ldv/doc/vapi/im.htm
new file mode 100644
index 0000000..4e3b567
--- /dev/null
+++ b/tools/vision/ldv/doc/vapi/im.htm
@@ -0,0 +1,298 @@
+
+
+
+
+Documentation VISION (VAPI) : Configuration Interface
+
+
+
+
+
+    |
+ 
+ |
+ Documentation VISION
+ (VAPI)
+ |
+ 
+ |
+ Dernière
+ mise à jour : 02/12/20
+ |
+
+
+ Télécharger la doc
+ |
+ IMAGE INTERFACE
+ |
+ |
+
+
+
+
+
+
+
+
+
+ | Summary |
+
+
+ | Préfixe de l'interface |
+ Im |
+
+
+ | Nombre de fonctions |
+ 7 |
+
+
+ | Description |
+ Ensemble de fonctions permettant de manipuler des images |
+
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl ImGetInf(char* filename, void* ldv_img) |
+
+
+ | Paramètres |
+ filename: nom du fichier ldv_img: pointeur sur une structure de type LDV_IMAGE |
+
+
+ | Retour |
+ LDV_STATUS |
+
+
+ | Description |
+ Récupère
+les informations image dans le fichier et remplit la structure
+LDV_IMAGE en conséquence, ne charge pas l'image (fonction suivante)
+mais renseigne ses caractéristiques comme sa largeur, hauteur, nombre
+de plans... |
+
+
+ | Remarques |
+ Appeler ImFree pour libérer les resources associées
|
+
+
+ | Version VAPI |
+ 1.09 ou supérieure |
+
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl ImLoad(void* ldv_img) |
+
+
+ | Paramètres |
+ ldv_img: structure remplie précédemment par ImGetInf |
+
+
+ | Retour |
+ LDV_STATUS |
+
+
+ | Description |
+ Charge en mémoire l'image depuis le fichier |
+
+
+ | Remarques |
+ La lecture des données image est effectuée lors de cet appel.. |
+
+
+ | Version VAPI |
+ 1.09 ou supérieure |
+
+
+
+
+
+
+
+
+
+ | Prototype |
+ void cdecl ImFree(void* ldv_img) |
+
+
+ | Paramètres |
+ ldv_img: structure remplie précédemment par ImGetInf |
+
+
+ | Retour |
+ Aucun |
+
+
+ | Description |
+ Libère les resources allouées par ImGetInf et ImLoad |
+
+
+ | Remarques |
+ . |
+
+
+ | Version VAPI |
+ 1.09 ou supérieure |
+
+
+
+
+
+
+ | Prototype |
+ long cdecl ImSave(char* filename, void* ldv_img, char* save_options) ; |
+
+
+ | Paramètres |
+ filename: nom du fichier de sauvegarde ldv_img: structure LDV_IMAGE définissant l'image à sauvegarder save_options: options standard, séparées par ';', pour la sauvegarde (option=<valeur>): fmt = <extension du fichier en 3 lettres> quality=<qualite 0...100> (JPEG) flipflop=<0 ou 2> (0: pas d'inversion, 2: inversion Y) (TGA) compression=<none or lzw> (TIF) byteorder=<motorola ou intel> (TIF) |
+
+
+ | Retour |
+ LDV_STATUS |
+
+
+ | Description |
+ Sauvegarde une image en mémoire vers un fichier |
+
+
+ | Remarques |
+ Exemple d'appel: status = Vapi->ImSave( "h:\\test.tif", ldv_img, "fmt=TIF;compression=LZW;byteorder=motorola" ) ; Certaines options sont relatives au format, elles seront simplement ignorées par le driver de sauvergarde. Voyez le script opnsav.vcs pour un exemple de ces options |
+
+
+ | Version VAPI |
+ 1.09 ou supérieure |
+
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl ImDither(long method, long param, void* ldv_img_in, void* ldv_img_out) |
+
+
+ | Paramètres |
+ method: méthode à utiliser pour le tramage:
- 0: Automatique, laisser VISION décider
- 1: matrice monochrome
- 2: niveaux de gris
- 3: 216 couleurs
- 4: bichromie
ldv_img_in: structure généralement fournie par VISION ldv_img_out: structure LDV_IMAGE contenant l'image tramée |
+
+
+ | Retour |
+ LDV_STATUS |
+
+
+ | Description |
+ Demande à VISION de tramer l'image source selon la méthode choisie. Le nombre de plans en sortie doit être précisé avant l'appel par la variable out->Raster.fd_nplanes (1,4,8,16 ou32) |
+
+
+ | Remarques |
+ |
+
+
+ | Version VAPI |
+ 1.09 ou supérieure |
+
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl ImGetStdData(void* ldv_img, char* query, char* out_data, long out_data_size) ; |
+
+
+ | Paramètres |
+ ldv_img: structure remplie précédemment par ImGetInf query: chaine de caractères standard pour demander la valeur d'un des attributs suivants:
- filename: nom du fichier chargé par ImGetInf
out_data: chaine contenant la valeur de l'attribut demandé out_data_size: taille du buffer passé en paramètre |
+
+
+ | Retour |
+ LDV_STATUS |
+
+
+ | Description |
+ Récupère des données 'standard' sur l'image |
+
+
+ | Remarques |
+ Voyez l'exemple optimg.ldv |
+
+
+ | Version VAPI |
+ 1.09 ou supérieure |
+
+
+
+
+
+
+
+
+ | Prototype |
+ long cdecl ImComputeHistogram(void* ldv_img, HISTO *histo) ; |
+
+
+ | Paramètres |
+ ldv_img: structure LDV_IMAGE définissant l'image sur laquelle calculer les histogrammes histo: pointeur sur la structure de type HISTO contenant le résultat du calcul |
+
+
+ | Retour |
+ LDV_STATUS |
+
+
+ | Description |
+ Demande à VISION de calculer les histogrammes sur une image |
+
+
+ | Remarques |
+ .histo->norm doit être initialisé pour indiquer à VISION quelle est la valeur maximale pour la plus haute fréquence de répétition Voyez l'exemple optimg.ldv |
+
+
+ | Version VAPI |
+ 1.09 ou supérieure |
+
+
+
+
+
+
+
+
+
+
+    |
+ 
+ |
+ Documentation VISION
+ (VAPI)
+ |
+ 
+ |
+
+ |
+
+
+ Télécharger la doc
+ |
+ IMAGE INTERFACE
+ |
+ |
+
+
+
+
\ No newline at end of file
diff --git a/tools/vision/LDV/doc/vapi/in.htm b/tools/vision/ldv/doc/vapi/in.htm
similarity index 97%
rename from tools/vision/LDV/doc/vapi/in.htm
rename to tools/vision/ldv/doc/vapi/in.htm
index 1404efd..6373d7a 100644
--- a/tools/vision/LDV/doc/vapi/in.htm
+++ b/tools/vision/ldv/doc/vapi/in.htm
@@ -1,4 +1,4 @@
-
+
diff --git a/tools/vision/LDV/doc/vapi/index.htm b/tools/vision/ldv/doc/vapi/index.htm
similarity index 89%
rename from tools/vision/LDV/doc/vapi/index.htm
rename to tools/vision/ldv/doc/vapi/index.htm
index 6b6dfed..5d9622d 100644
--- a/tools/vision/LDV/doc/vapi/index.htm
+++ b/tools/vision/ldv/doc/vapi/index.htm
@@ -1,9 +1,8 @@
-
+
Documentation VISION (VAPI) : Présentation
-
@@ -18,9 +17,7 @@

|
Dernière
- mise à jour : 18/03/18
+ mise à jour : 03/12/20
|
@@ -29,10 +26,7 @@
V
A P I
|
-
- |
+ |
@@ -138,8 +132,8 @@ non-exhaustive) des interfaces actuelles:
| MEM Interface |
Logging Interface |
- |
- |
+ Image Interface |
+ File Interface |
@@ -159,9 +153,7 @@ non-exhaustive) des interfaces actuelles:

|
Dernière
- mise à jour : 18/03/18
+ mise à jour : 03/12/20
|
diff --git a/tools/vision/LDV/doc/vapi/lo.htm b/tools/vision/ldv/doc/vapi/lo.htm
similarity index 97%
rename from tools/vision/LDV/doc/vapi/lo.htm
rename to tools/vision/ldv/doc/vapi/lo.htm
index 92394f8..d24148e 100644
--- a/tools/vision/LDV/doc/vapi/lo.htm
+++ b/tools/vision/ldv/doc/vapi/lo.htm
@@ -1,4 +1,4 @@
-
+
diff --git a/tools/vision/LDV/doc/vapi/me.htm b/tools/vision/ldv/doc/vapi/me.htm
similarity index 100%
rename from tools/vision/LDV/doc/vapi/me.htm
rename to tools/vision/ldv/doc/vapi/me.htm
diff --git a/tools/vision/LDV/doc/vapi/modele.htm b/tools/vision/ldv/doc/vapi/modele.htm
similarity index 100%
rename from tools/vision/LDV/doc/vapi/modele.htm
rename to tools/vision/ldv/doc/vapi/modele.htm
diff --git a/tools/vision/LDV/doc/vapi/pr.htm b/tools/vision/ldv/doc/vapi/pr.htm
similarity index 100%
rename from tools/vision/LDV/doc/vapi/pr.htm
rename to tools/vision/ldv/doc/vapi/pr.htm
diff --git a/tools/vision/LDV/doc/vapi/ra.htm b/tools/vision/ldv/doc/vapi/ra.htm
similarity index 100%
rename from tools/vision/LDV/doc/vapi/ra.htm
rename to tools/vision/ldv/doc/vapi/ra.htm
diff --git a/tools/vision/LDV/doc/vapi/struct.htm b/tools/vision/ldv/doc/vapi/struct.htm
similarity index 100%
rename from tools/vision/LDV/doc/vapi/struct.htm
rename to tools/vision/ldv/doc/vapi/struct.htm
diff --git a/tools/vision/LDV/FRANCAIS/bhole.ini b/tools/vision/ldv/francais/bhole.ini
similarity index 100%
rename from tools/vision/LDV/FRANCAIS/bhole.ini
rename to tools/vision/ldv/francais/bhole.ini
diff --git a/tools/vision/LDV/FRANCAIS/BW.INI b/tools/vision/ldv/francais/bw.ini
similarity index 100%
rename from tools/vision/LDV/FRANCAIS/BW.INI
rename to tools/vision/ldv/francais/bw.ini
diff --git a/tools/vision/ldv/francais/cntcol.ini b/tools/vision/ldv/francais/cntcol.ini
new file mode 100644
index 0000000..36efc00
--- /dev/null
+++ b/tools/vision/ldv/francais/cntcol.ini
@@ -0,0 +1,42 @@
+; This is a basic INI file used
+; To setup a language for a LDV
+; Module for VISION 4.0 or older
+; For example, if your module is
+; Named SOGOOD.LDV, you should create
+; SOGOOD.INI (default file, this may be the English version) in LDV folder
+; SOGOOD.INI in the FRANCAIS folder for the French version
+; SOGOOD.INI in the ENGLISH folder for the English version
+; SOGOOD.INI in the SVENSKA folder for the Swedish version
+; ... and so on ...
+; Now you just have to fill in the ShortName, LongName and Description fields
+; Note that VISION will search for the INI file associated to the LDV file
+; In the folder defined by the language setup (same as in LANGUES folder)
+
+[Informations]
+; ShortName should not exceed 15 caracters
+ShortName = Compte couleurs
+; LongName should not exceed 31 caracters
+LongName = Compte couleurs ligne/totalit‚
+; Description should not exceed 79 caracters
+Description = Ce LDV compte les couleurs par ligne et en totalit‚ d'une image
+
+; Here comes the language parameters dependencies
+[Parameter1]
+Name = Method
+; Method = 0: slection automatique par le LDV en fonction de l'image
+; Method = 1:
+; Par ligne: ajout au tableau des couleurs si non existante (lent si beaucoup de couleurs)
+; Global: tableau de bits dimensionné au nombre max de couleurs
+; Usage mémoire : 2MB max (32bit) + 1 ligne
+; Method = 2:
+; Par ligne: tri/reduction des couleurs
+; Global: tri/reduction des couleurs
+; Usage mémoire : image entière + 1 ligne
+; Method = 3: (mix de #1 et #2)
+; Par ligne: tri/reduction des couleurs
+; Global: tableau de bits dimensionné au nombre max de couleurs
+; Usage mémoire : 2MB max (32bit) + 1 ligne
+Type = 1
+MinValue = 0
+DefaultValue = 0
+MaxValue = 3
\ No newline at end of file
diff --git a/tools/vision/LDV/FRANCAIS/GAMMA.INI b/tools/vision/ldv/francais/gamma.ini
similarity index 100%
rename from tools/vision/LDV/FRANCAIS/GAMMA.INI
rename to tools/vision/ldv/francais/gamma.ini
diff --git a/tools/vision/ldv/francais/genimg.ini b/tools/vision/ldv/francais/genimg.ini
new file mode 100644
index 0000000..a554e6f
--- /dev/null
+++ b/tools/vision/ldv/francais/genimg.ini
@@ -0,0 +1,29 @@
+; This is a basic INI file used
+; To setup a language for a LDV
+; Module for VISION 4.0 or older
+; For example, if your module is
+; Named SOGOOD.LDV, you should create
+; SOGOOD.INI (default file, this may be the English version) in LDV folder
+; SOGOOD.INI in the FRANCAIS folder for the French version
+; SOGOOD.INI in the ENGLISH folder for the English version
+; SOGOOD.INI in the SVENSKA folder for the Swedish version
+; ... and so on ...
+; Now you just have to fill in the ShortName, LongName and Description fields
+; Note that VISION will search for the INI file associated to the LDV file
+; In the folder defined by the language setup (same as in LANGUES folder)
+
+[Informations]
+; ShortName should not exceed 15 caracters
+ShortName = GenŠre C.Image
+; LongName should not exceed 31 caracters
+LongName = GenŠre une image max couleurs
+; Description should not exceed 79 caracters
+Description = GenŠre une image avec le maximum de couleurs possibles
+
+; Here comes the language parameters dependencies
+[Parameter1]
+Name = Image Type
+Type = 1
+MinValue = 1
+DefaultValue = 1
+MaxValue = 1
diff --git a/tools/vision/LDV/FRANCAIS/INVERT.INI b/tools/vision/ldv/francais/invert.ini
similarity index 100%
rename from tools/vision/LDV/FRANCAIS/INVERT.INI
rename to tools/vision/ldv/francais/invert.ini
diff --git a/tools/vision/LDV/FRANCAIS/LIGHT.INI b/tools/vision/ldv/francais/light.ini
similarity index 100%
rename from tools/vision/LDV/FRANCAIS/LIGHT.INI
rename to tools/vision/ldv/francais/light.ini
diff --git a/tools/vision/LDV/FRANCAIS/PIXEL.INI b/tools/vision/ldv/francais/pixel.ini
similarity index 100%
rename from tools/vision/LDV/FRANCAIS/PIXEL.INI
rename to tools/vision/ldv/francais/pixel.ini
diff --git a/tools/vision/LDV/FRANCAIS/puzzle.ini b/tools/vision/ldv/francais/puzzle.ini
similarity index 100%
rename from tools/vision/LDV/FRANCAIS/puzzle.ini
rename to tools/vision/ldv/francais/puzzle.ini
diff --git a/tools/vision/LDV/FRANCAIS/ROTATE.INI b/tools/vision/ldv/francais/rotate.ini
similarity index 100%
rename from tools/vision/LDV/FRANCAIS/ROTATE.INI
rename to tools/vision/ldv/francais/rotate.ini
diff --git a/tools/vision/LDV/FRANCAIS/XWAVE.INI b/tools/vision/ldv/francais/xwave.ini
similarity index 100%
rename from tools/vision/LDV/FRANCAIS/XWAVE.INI
rename to tools/vision/ldv/francais/xwave.ini
diff --git a/tools/vision/LDV/FRANCAIS/YPERSC.INI b/tools/vision/ldv/francais/ypersc.ini
similarity index 100%
rename from tools/vision/LDV/FRANCAIS/YPERSC.INI
rename to tools/vision/ldv/francais/ypersc.ini
diff --git a/tools/vision/LDV/FRANCAIS/YWAVE.INI b/tools/vision/ldv/francais/ywave.ini
similarity index 100%
rename from tools/vision/LDV/FRANCAIS/YWAVE.INI
rename to tools/vision/ldv/francais/ywave.ini
diff --git a/tools/vision/LDV/GAMMA.INI b/tools/vision/ldv/gamma.ini
similarity index 100%
rename from tools/vision/LDV/GAMMA.INI
rename to tools/vision/ldv/gamma.ini
diff --git a/tools/vision/ldv/gamma.ldv b/tools/vision/ldv/gamma.ldv
new file mode 100644
index 0000000..c43a69f
Binary files /dev/null and b/tools/vision/ldv/gamma.ldv differ
diff --git a/tools/vision/ldv/genimg.ini b/tools/vision/ldv/genimg.ini
new file mode 100644
index 0000000..d0502d7
--- /dev/null
+++ b/tools/vision/ldv/genimg.ini
@@ -0,0 +1,29 @@
+; This is a basic INI file used
+; To setup a language for a LDV
+; Module for VISION 4.0 or older
+; For example, if your module is
+; Named SOGOOD.LDV, you should create
+; SOGOOD.INI (default file, this may be the English version) in LDV folder
+; SOGOOD.INI in the FRANCAIS folder for the French version
+; SOGOOD.INI in the ENGLISH folder for the English version
+; SOGOOD.INI in the SVENSKA folder for the Swedish version
+; ... and so on ...
+; Now you just have to fill in the ShortName, LongName and Description fields
+; Note that VISION will search for the INI file associated to the LDV file
+; In the folder defined by the language setup (same as in LANGUES folder)
+
+[Informations]
+; ShortName should not exceed 15 caracters
+ShortName = GenImg
+; LongName should not exceed 31 caracters
+LongName = Generate Images
+; Description should not exceed 79 caracters
+Description = Generate test images
+
+; Here comes the language parameters dependencies
+[Parameter1]
+Name = Image Type
+Type = 1
+MinValue = 1
+DefaultValue = 1
+MaxValue = 1
diff --git a/tools/vision/ldv/genimg.ldv b/tools/vision/ldv/genimg.ldv
new file mode 100644
index 0000000..db2f06e
Binary files /dev/null and b/tools/vision/ldv/genimg.ldv differ
diff --git a/tools/vision/LDV/INVERT.INI b/tools/vision/ldv/invert.ini
similarity index 100%
rename from tools/vision/LDV/INVERT.INI
rename to tools/vision/ldv/invert.ini
diff --git a/tools/vision/ldv/invert.ldv b/tools/vision/ldv/invert.ldv
new file mode 100644
index 0000000..911f6be
Binary files /dev/null and b/tools/vision/ldv/invert.ldv differ
diff --git a/tools/vision/LDV/LDG.H b/tools/vision/ldv/ldg.h
similarity index 96%
rename from tools/vision/LDV/LDG.H
rename to tools/vision/ldv/ldg.h
index 310bbe6..bea1bbd 100644
--- a/tools/vision/LDV/LDG.H
+++ b/tools/vision/ldv/ldg.h
@@ -1,186 +1,187 @@
-/*
- * LDG : Gem Dynamical Libraries
- * Copyright (c) 1997-2004 Olivier Landemarre, Dominique Bereziat & Arnaud Bercegeay
- *
- * Header file of LDG devel library, should be included after the AES header
- *
- * Current version is 2.31
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * $Id: ldg.h 102 2012-10-04 22:31:16Z vriviere $
- */
-
-#ifndef __LDG__
-#define __LDG__
-
-
-#ifdef __PUREC__
-#define CDECL cdecl
-#else
-#include
-#define CDECL __CDECL
-#endif
-
-#ifdef __GEMLIB__
-#define ldg_global aes_global
-#else
-#ifdef __PUREC__ /* For Pure C users using PCGEMLIB */
-#define ldg_global _GemParBlk.global
-#endif
-#endif
-
-#define LDG_QUIT 0x4C4A /* ldg->client : a lib discharged */
-#define LDG_LOST_LIB 0x4C4D /* ldg->client : a lib lost */
-#define LDG_COOKIE 0x4C44474DL /* 'LDGM' */
-#define PATHLEN 128
-
-/*
- * Data structures
- */
-
-typedef struct entrie {
- char *name; /* Function name */
- char *info; /* Describe the prototype of the function */
- void *func; /* Function address */
-} PROC;
-
-/*
- * The LDG-library descriptor (private)
- */
-
-typedef struct ldg {
- long magic; /* magic number ('LDGM') */
- short vers; /* library version */
- short id; /* AES-id of launcher */
- short num; /* count of avalaible functions */
- PROC *list; /* pointer to the functions list */
- char *infos; /* describe the library */
- void *baspag; /* basepage of library */
-/* from version 0.99 */
- unsigned short flags; /* library flags ( shared, resident, locked) */
-/* from version 0.99c */
- void (*close)(void); /* fonction launched by ldg_term() */
-/* from version 1.00 */
- short vers_ldg; /* LDG-protocol version */
- char path[PATHLEN]; /* real path of the lib */
- long user_ext; /* own library extension */
- long addr_ext; /* for future extension */
-} LDG;
-
-/*
- * The LDG cookie
- */
-
-typedef struct {
- short version; /* The cookie number version */
- char path[PATHLEN]; /* Path of LDG-libraries */
- short garbage; /* The garbage collector time */
- short idle; /* Obsolet : for backward compatibility */
-
- LDG* CDECL (*ldg_open) ( const char *lib, short *gl);
- /* Open a library */
- short CDECL (*ldg_close) ( LDG *ldg, short *gl);
- /* Close a library */
- void* CDECL (*ldg_find) ( char *fnc, LDG *ldg);
- /* Find a function in a library */
- LDG* CDECL (*ldg_open_ev)( char *lib, short *gl, void (*)(short*));
- /* Obsolet : for backward compatibility */
- short error; /* Last error occuring */
- void CDECL (*ldg_garbage)( short *gl);
- /* Release unused libs */
- void CDECL (*ldg_reset)( short *gl);
- /* Release all libs */
- void* internal; /* Reserved */
- short CDECL (*ldg_libpath)( char *, short *global);
- /* Find the path of a library */
-} LDG_INFOS;
-
-/*
- * This structure is used by ldg_init() to initiate the
- * the LDG-protocol inside a LDG-library.
- */
-
-typedef struct ldglib {
- short vers; /* library version */
- short num; /* count of avalaible functions */
- PROC *list; /* pointer to the functions list */
- char *infos; /* description of the lib */
- unsigned short flags; /* library flags (shared, locked, resident) */
- void (*close)(void); /* function executed by ldg_term()*/
- long user_ext; /* own library extension */
-} LDGLIB;
-
-/* value of the 'flag' field */
-#define LDG_NOT_SHARED 0x1 /* the library is unshareable */
-#define LDG_LOCKED 0x2 /* the library is locked */
-#define LDG_RESIDENT 0x4 /* the library is memory resident */
-#define LDG_STDCALL 0x100 /* a2/d2 are not scratch register - private */
-
-/* Errors returned by ldg_error() */
-#define LDG_LIB_FULLED -1
-#define LDG_APP_FULLED -2
-#define LDG_ERR_EXEC -3
-#define LDG_BAD_FORMAT -4
-#define LDG_LIB_LOCKED -6
-#define LDG_NO_MANAGER -7
-#define LDG_NOT_FOUND -8
-#define LDG_BAD_LIB LDG_BAD_FORMAT
-#define LDG_NO_MEMORY -9
-#define LDG_TIME_IDLE -10
-#define LDG_NO_TSR -11
-#define LDG_BAD_TSR -12
-#define LDG_NO_FUNC -13
-
-/* Client functions */
-LDG* ldg_open ( const char *name, short *gl);
-short ldg_close ( LDG *lib, short *gl);
-short ldg_error ( void);
-void* ldg_find ( char *name, LDG *ldg);
-short ldg_libpath ( char *path, short *gl);
-
-/* Server functions */
-int ldg_init ( LDGLIB *libldg);
-char *ldg_getpath ( void);
-
-/* Diverse functions */
-int ldg_cookie ( long, long *);
-void ldg_debug ( char *, ...);
-void* ldg_Malloc ( long size);
-void* ldg_Calloc ( long count,long size);
-int ldg_Free ( void *memory);
-void* ldg_Realloc ( void *oldblk, long oldsize, long newsize);
-#ifndef __mcoldfire__
-void ldg_cpush ( void);
-#endif
-long CDECL ldg_callback( void *f, ...);
-
-/* For backward compatibility */
-#define ldg_exec(a,b) ldg_open( b, ldg_global)
-#define ldg_exec_evnt(a,b,c) ldg_open( b, ldg_global)
-#define ldg_term(a,b) ldg_close( b, ldg_global)
-#define ldg_libexec_evnt(a,b,c) ldg_open( a, b)
-#define ldg_libexec(a,b) ldg_open( a, b)
-#define ldg_libterm(a,b) ldg_close( a,b)
-
-/* C-library version (currently 1.20) */
-struct _ldg_version {
- char *name;
- short num;
-};
-
-extern struct _ldg_version ldg_version;
-
-#endif /* __LDG__ */
+/*
+ * LDG : Gem Dynamical Libraries
+ * Copyright (c) 1997-2004 Olivier Landemarre, Dominique Bereziat & Arnaud Bercegeay
+ *
+ * Header file of LDG devel library, should be included after the AES header
+ *
+ * Current version is 2.31
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * $Id: ldg.h 102 2012-10-04 22:31:16Z vriviere $
+ */
+
+#ifndef __LDG__
+#define __LDG__
+
+
+#ifdef __PUREC__
+#define CDECL cdecl
+#else
+#include
+#define CDECL __CDECL
+#endif
+
+#ifdef __GEMLIB__
+#define ldg_global aes_global
+#else
+#ifdef __PUREC__ /* For Pure C users using PCGEMLIB */
+#define ldg_global ((short*)&_GemParBlk.global[0])
+/*#define ldg_global _GemParBlk.global*/
+#endif
+#endif
+
+#define LDG_QUIT 0x4C4A /* ldg->client : a lib discharged */
+#define LDG_LOST_LIB 0x4C4D /* ldg->client : a lib lost */
+#define LDG_COOKIE 0x4C44474DL /* 'LDGM' */
+#define PATHLEN 128
+
+/*
+ * Data structures
+ */
+
+typedef struct entrie {
+ char *name; /* Function name */
+ char *info; /* Describe the prototype of the function */
+ void *func; /* Function address */
+} PROC;
+
+/*
+ * The LDG-library descriptor (private)
+ */
+
+typedef struct ldg {
+ long magic; /* magic number ('LDGM') */
+ short vers; /* library version */
+ short id; /* AES-id of launcher */
+ short num; /* count of avalaible functions */
+ PROC *list; /* pointer to the functions list */
+ char *infos; /* describe the library */
+ void *baspag; /* basepage of library */
+/* from version 0.99 */
+ unsigned short flags; /* library flags ( shared, resident, locked) */
+/* from version 0.99c */
+ void (*close)(void); /* fonction launched by ldg_term() */
+/* from version 1.00 */
+ short vers_ldg; /* LDG-protocol version */
+ char path[PATHLEN]; /* real path of the lib */
+ long user_ext; /* own library extension */
+ long addr_ext; /* for future extension */
+} LDG;
+
+/*
+ * The LDG cookie
+ */
+
+typedef struct {
+ short version; /* The cookie number version */
+ char path[PATHLEN]; /* Path of LDG-libraries */
+ short garbage; /* The garbage collector time */
+ short idle; /* Obsolet : for backward compatibility */
+
+ LDG* CDECL (*ldg_open) ( const char *lib, short *gl);
+ /* Open a library */
+ short CDECL (*ldg_close) ( LDG *ldg, short *gl);
+ /* Close a library */
+ void* CDECL (*ldg_find) ( char *fnc, LDG *ldg);
+ /* Find a function in a library */
+ LDG* CDECL (*ldg_open_ev)( char *lib, short *gl, void (*)(short*));
+ /* Obsolet : for backward compatibility */
+ short error; /* Last error occuring */
+ void CDECL (*ldg_garbage)( short *gl);
+ /* Release unused libs */
+ void CDECL (*ldg_reset)( short *gl);
+ /* Release all libs */
+ void* internal; /* Reserved */
+ short CDECL (*ldg_libpath)( char *, short *global);
+ /* Find the path of a library */
+} LDG_INFOS;
+
+/*
+ * This structure is used by ldg_init() to initiate the
+ * the LDG-protocol inside a LDG-library.
+ */
+
+typedef struct ldglib {
+ short vers; /* library version */
+ short num; /* count of avalaible functions */
+ PROC *list; /* pointer to the functions list */
+ char *infos; /* description of the lib */
+ unsigned short flags; /* library flags (shared, locked, resident) */
+ void (*close)(void); /* function executed by ldg_term()*/
+ long user_ext; /* own library extension */
+} LDGLIB;
+
+/* value of the 'flag' field */
+#define LDG_NOT_SHARED 0x1 /* the library is unshareable */
+#define LDG_LOCKED 0x2 /* the library is locked */
+#define LDG_RESIDENT 0x4 /* the library is memory resident */
+#define LDG_STDCALL 0x100 /* a2/d2 are not scratch register - private */
+
+/* Errors returned by ldg_error() */
+#define LDG_LIB_FULLED -1
+#define LDG_APP_FULLED -2
+#define LDG_ERR_EXEC -3
+#define LDG_BAD_FORMAT -4
+#define LDG_LIB_LOCKED -6
+#define LDG_NO_MANAGER -7
+#define LDG_NOT_FOUND -8
+#define LDG_BAD_LIB LDG_BAD_FORMAT
+#define LDG_NO_MEMORY -9
+#define LDG_TIME_IDLE -10
+#define LDG_NO_TSR -11
+#define LDG_BAD_TSR -12
+#define LDG_NO_FUNC -13
+
+/* Client functions */
+LDG* ldg_open ( const char *name, short *gl);
+short ldg_close ( LDG *lib, short *gl);
+short ldg_error ( void);
+void* ldg_find ( char *name, LDG *ldg);
+short ldg_libpath ( char *path, short *gl);
+
+/* Server functions */
+int ldg_init ( LDGLIB *libldg);
+char *ldg_getpath ( void);
+
+/* Diverse functions */
+int ldg_cookie ( long, long *);
+void ldg_debug ( char *, ...);
+void* ldg_Malloc ( long size);
+void* ldg_Calloc ( long count,long size);
+int ldg_Free ( void *memory);
+void* ldg_Realloc ( void *oldblk, long oldsize, long newsize);
+#ifndef __mcoldfire__
+void ldg_cpush ( void);
+#endif
+long CDECL ldg_callback( void *f, ...);
+
+/* For backward compatibility */
+#define ldg_exec(a,b) ldg_open( b, ldg_global)
+#define ldg_exec_evnt(a,b,c) ldg_open( b, ldg_global)
+#define ldg_term(a,b) ldg_close( b, ldg_global)
+#define ldg_libexec_evnt(a,b,c) ldg_open( a, b)
+#define ldg_libexec(a,b) ldg_open( a, b)
+#define ldg_libterm(a,b) ldg_close( a,b)
+
+/* C-library version (currently 1.20) */
+struct _ldg_version {
+ char *name;
+ short num;
+};
+
+extern struct _ldg_version ldg_version;
+
+#endif /* __LDG__ */
diff --git a/tools/vision/ldv/ldg.lib b/tools/vision/ldv/ldg.lib
new file mode 100644
index 0000000..a9bd4a2
Binary files /dev/null and b/tools/vision/ldv/ldg.lib differ
diff --git a/tools/vision/ldv/ldv.h b/tools/vision/ldv/ldv.h
new file mode 100644
index 0000000..eb648dc
--- /dev/null
+++ b/tools/vision/ldv/ldv.h
@@ -0,0 +1,150 @@
+#ifndef __LDV_H
+#define __LDV_H
+
+#ifndef __LDG__
+#include "ldv\ldg.h"
+#endif
+
+#ifndef __VAPI_H
+#include "ldv\vapi.h"
+#endif
+
+/* Error codes */
+typedef long LDV_STATUS ;
+#define ELDV_NOERROR 0x0 /* No error */
+#define ELDV_INVALIDPARAMETER 0x1 /* At least one parameter is invalid */
+#define ELDV_NBPLANESNOTSUPPORTED 0x2 /* Unsupported number of planes */
+#define ELDV_NOTENOUGHMEMORY 0x3 /* Not enough memory */
+#define ELDV_PREVIEWNOTSUPPORTED 0x4 /* Preview is not supported */
+#define ELDV_RUNNOTSUPPORTED 0x5 /* Run is not supported (!) */
+#define ELDV_BADVAPIVERSION 0x6 /* No VAPI or wrong version */
+#define ELDV_IMGFORMATMISMATCH 0x7 /* Image format is not compatible */
+#define ELDV_CANCELLED 0x8 /* User cancelled the operation */
+#define ELDV_BADINTERFACE 0x9 /* LDV does not expose a proper interface */
+#define ELDV_GENERALFAILURE 0xF /* General failure, reason unknown */
+
+
+/* Macro aiming to test if a */
+/* LDV call was successful */
+#define LDV_SUCCESS(x) ((x) == ELDV_NOERROR)
+
+
+/* LDV types */
+#define TLDV_MODIFYIMG 0x01 /* Modify image : filter, scaler, ... */
+
+/* Flags field bitmask for */
+/* A given number of planes */
+#define LDVF_STDFORMAT 0x00000001UL /* Image is standard format */
+#define LDVF_ATARIFORMAT 0x00000002UL /* Image is ATARI format (Falcon) */
+#define LDVF_SPECFORMAT 0x00000004UL /* Image is specific format (video card/emulator)) */
+#define LDVF_SUPPORTPREVIEW 0x00000008UL /* Preview is supported */
+#define LDVF_AFFECTPALETTE 0x00000010UL /* Module changes palette (if NbPlanes <= 8) */
+#define LDVF_SUPPORTPROG 0x00000020UL /* Module wil call progress fonction */
+#define LDVF_OPINPLACE 0x00000040UL /* Module operate inplace and changes the source (out parameter is ignored) */
+#define LDVF_REALTIMEPARAMS 0x00000080UL /* Module supports real time parameter changes in preview mode */
+#define LDVF_SUPPORTCANCEL 0x00000100UL /* Module supports user cancellation (see PrSetProgEx) */
+#define LDVF_NOSELECTION 0x00000200UL /* Module can only operate on full image, not sub block */
+#define LDVF_NOCHANGE 0x00000400UL /* Module won't change any part of the image (e.g. report LDV) */
+
+/* This struct reports what a LDV */
+/* Can do for each number of planes */
+typedef struct
+{
+ char NbPlanes ; /* Image number of planes : */
+ /* 0 : ends this structure */
+ /* 1, 2, 4, 8, 16, 24, or 32 */
+
+ char NbPlanesOut ; /* Number of planes after modification */
+
+ unsigned long Flags ; /* LDVF_... */
+}
+LDV_CAPS ;
+
+
+#define LDVNBMAX_PARAMETERS 4 /* Maximum 4 parameters can be passed by VISION */
+
+typedef union
+{
+ short s ;
+ float f ;
+ void* str ;
+}
+LDV_BASICPARAM ;
+
+#define LDVT_SHORT 1
+#define LDVT_FLOAT 2
+#define LDVT_FILE 3
+typedef struct
+{
+ char Name[1+15] ;
+ char Type ;
+ LDV_BASICPARAM MinValue ;
+ LDV_BASICPARAM DefaultValue ;
+ LDV_BASICPARAM MaxValue ;
+}
+LDV_DEF_PARAM ;
+
+typedef struct
+{
+ short StrSize ; /* Size in bytes of LDV_INFOS */
+ short Type ; /* TLDV_... */
+ char Authors[1+45] ; /* Author(s) list */
+
+ LDV_CAPS Caps[10] ; /* What this LDV can do */
+ /* For each number of planes */
+ /* Last element is zeroed to */
+ /* Mark the end */
+ char RFU[16] ; /* Futur usage */
+}
+LDV_INFOS ;
+
+typedef struct
+{
+ short Red ; /* 0...1000 */
+ short Green ; /* 0...1000 */
+ short Blue ; /* 0...1000 */
+}
+VDI_ELEMENTPAL ;
+
+typedef struct
+{
+ short NbColors ; /* Number of colors for this palette */
+ VDI_ELEMENTPAL* Pal ; /* Indexed from VDI */
+}
+LDV_PALETTE ;
+
+typedef struct
+{
+ short x1, y1, x2, y2 ; /* Rectangle defining the sub block to work on */
+ short NbParams ;
+ LDV_BASICPARAM Param[LDVNBMAX_PARAMETERS] ;
+ short ParamType[LDVNBMAX_PARAMETERS] ; /* A bit redundant but useful to free allocated memory for file name */
+
+ /* Since VAPI_LDVVERSION 0x0106 */
+ /* LDV can return a text to be displayed by VISION */
+ char ldv_txt_out[128] ;
+}
+LDV_PARAMS ;
+
+/* Image definition for the LDV to operate on */
+typedef struct
+{
+ short RasterFormat ; /* LDVF_STDFORMAT, LDVF_ATARIFORMAT or LDVF_SPECFORMAT */
+ /* VISION selects the optimal format from */
+ /* LDV capabilities reported via GetLDVCapabilities */
+
+ MFDB Raster ; /* Image */
+
+ LDV_PALETTE Palette ; /* Valid if Raster.fd_nplanes <= 8 */
+
+ void* Context ; /* Used by Image I/O interface */
+}
+LDV_IMAGE ;
+
+
+long cdecl ImGetInf(char* filename, void* ldv_img) ;
+long cdecl ImLoad(void* ldv_img) ;
+void cdecl ImFree(void* ldv_img) ;
+
+
+#endif
diff --git a/tools/vision/ldv/ldvcom.h b/tools/vision/ldv/ldvcom.h
new file mode 100644
index 0000000..ae3cddd
--- /dev/null
+++ b/tools/vision/ldv/ldvcom.h
@@ -0,0 +1,91 @@
+#ifndef __LDVCOM_H
+#define __LDVCOM_H
+
+#include "ldv\ldv.h"
+
+typedef struct
+{
+ char* ShortName ; /* Module short name (15 chars max) */
+ char* LongName ; /* Module long name (31 chars max) */
+ char* Description ; /* Module description (79 chars max) */
+
+ /* Parameters that can apply */
+ LDV_DEF_PARAM Params[LDVNBMAX_PARAMETERS] ;
+ char* ParamLabels[LDVNBMAX_PARAMETERS] ; /* Optional labels for parameters */
+ /* Should be part of LDV_DEF_PARAM */
+ /* But that would break compatibility with previous LDVs */
+
+}
+LDV_INI_SPEC ;
+
+/* Image Modification Interface */
+typedef struct
+{
+ /* Allows VISION to allocate required ressources for LDV to operate */
+ /* You have to indicate in out->Raster the output image size */
+ /* As well as in out->Palette.NbColors field */
+ /* In params, you have to tell which zone has to be send to Undo buffer */
+ LDV_STATUS cdecl (*PreRun)(LDV_IMAGE* in, LDV_PARAMS* params, LDV_IMAGE* out) ;
+
+ /* Performs LDV operation */
+ /* VISION already allocated required memory from previous call */
+ /* DO NOT ALLOCATE OR FREE MEMORY THAT VISION WILL USE AFTER THIS CALL */
+ LDV_STATUS cdecl (*Run)(LDV_IMAGE* in, LDV_PARAMS* params, LDV_IMAGE* out) ;
+
+ /* Same as previous one, but in preview mode */
+ LDV_STATUS cdecl (*Preview)(LDV_IMAGE* in, LDV_PARAMS* params, LDV_IMAGE* out) ;
+}
+ILDVModifImg ;
+
+typedef struct
+{
+ LDG* Ldg ; /* LDG Module */
+
+ char* FileName ; /* Only name, no path */
+ short Version ; /* Same as Ldg->vers */
+
+ LDV_INFOS Infos ; /* Module informations */
+ LDV_INI_SPEC IniSpec ; /* .INI specific */
+
+ /* Reports capabilities to VISION */
+ /* VISION gives access to its Application Programmer Interface */
+ LDV_INFOS* cdecl (*GetLDVCapabilities)(VAPI* vapi) ;
+
+ int NbReferences ; /* How many times this module is referenced */
+ ILDVModifImg* IModifImg ; /* TLDV_MODIFYIMG Interface */
+}
+LDV_MODULE ;
+
+typedef struct
+{
+ unsigned long prerun_ms ;
+ unsigned long pre_ldv_ms ;
+ unsigned long run_ms ;
+ unsigned long post_ldv_ms ;
+ unsigned long total_ms ;
+}
+LDV_PERF ;
+
+/* Flags for LDVDo */
+#define LDVDOF_NONE 0
+#define LDVDOF_PREVIEW 1
+#define LDVDOF_PROGLFOUT 2 /* Progression Life Cycle (creation/destruction) is outside of LDVDo */
+
+
+LDV_CAPS* LDVGetNPlanesCaps(LDV_MODULE* mod, int nplanes) ;
+LDV_MODULE* LDVGetModuleList(char* path, int* nb_ldv) ;
+void LDVFreeModuleList(LDV_MODULE* module_list) ;
+LDV_MODULE* GetLdvByLdg(LDV_MODULE* ldv_list, LDG* ldg) ;
+LDV_STATUS LDVAlloc(LDV_IMAGE* img) ;
+LDV_STATUS LDVDo(LDV_MODULE* ldv, LDV_PARAMS* ldv_params, LDV_IMAGE* ldv_img, int flags) ;
+LDV_STATUS LDVAdapt2Planes(LDV_IMAGE* pldv_img, short nplanes) ;
+
+LDV_STATUS LDVLoadFunctions(char* path, LDV_MODULE* mod) ;
+void LDVUnloadFunctions(LDV_MODULE* mod) ;
+void LDVFreeDynParams(LDV_PARAMS* ldv_params) ;
+
+GEM_WINDOW* LDVGetProgWindow(void) ;
+GEM_WINDOW* LDVCreateProgWindow(int ldvcap_flags) ;
+void LDVDestroyProgWindow(void) ;
+
+#endif
diff --git a/tools/vision/LDV/LIGHT.INI b/tools/vision/ldv/light.ini
similarity index 100%
rename from tools/vision/LDV/LIGHT.INI
rename to tools/vision/ldv/light.ini
diff --git a/tools/vision/ldv/light.ldv b/tools/vision/ldv/light.ldv
new file mode 100644
index 0000000..ef811a2
Binary files /dev/null and b/tools/vision/ldv/light.ldv differ
diff --git a/tools/vision/LDV/MT_AES.H b/tools/vision/ldv/mt_aes.h
similarity index 100%
rename from tools/vision/LDV/MT_AES.H
rename to tools/vision/ldv/mt_aes.h
diff --git a/tools/vision/LDV/MT_AES.LIB b/tools/vision/ldv/mt_aes.lib
similarity index 100%
rename from tools/vision/LDV/MT_AES.LIB
rename to tools/vision/ldv/mt_aes.lib
diff --git a/tools/vision/ldv/optimg.ini b/tools/vision/ldv/optimg.ini
new file mode 100644
index 0000000..a3b8e17
--- /dev/null
+++ b/tools/vision/ldv/optimg.ini
@@ -0,0 +1,112 @@
+; This is a basic INI file used
+; To setup a language for a LDV
+; Module for VISION 4.0 or older
+; For example, if your module is
+; Named SOGOOD.LDV, you should create
+; SOGOOD.INI (default file, this may be the English version) in LDV folder
+; SOGOOD.INI in the FRANCAIS folder for the French version
+; SOGOOD.INI in the ENGLISH folder for the English version
+; SOGOOD.INI in the SVENSKA folder for the Swedish version
+; ... and so on ...
+; Now you just have to fill in the ShortName, LongName and Description fields
+; Note that VISION will search for the INI file associated to the LDV file
+; In the folder defined by the language setup (same as in LANGUES folder)
+
+[Informations]
+; ShortName should not exceed 15 caracters
+ShortName = OptImg
+; LongName should not exceed 31 caracters
+LongName = Image Optimization
+; Description should not exceed 79 caracters
+Description = Changes format/color arrangement according to image
+
+; Here comes the language parameters dependencies
+; Profiles are defined as follows:
+; [ProfileName]
+; enforce_smaller = <0 or 1> : if VISION's optimization ends up with a bigger file, keep original
+; 1 = fmt=,;.... : format then save options for #nplanes=1
+; 4 = fmt=,;.... : format then save options for #nplanes=4
+; 8 = fmt=,;.... : format then save options for #nplanes=8
+; 16 = fmt=,;.... : format then save options for #nplanes=16
+; 24 = fmt=,;.... : format then save options for #nplanes=24
+; 32 = fmt=,;.... : format then save options for #nplanes=32
+; Several profiles are already defined to cope with different machines/goals
+; Feel free to create new ones
+; ProfileName is to be passed as 3rd parameter to OPTIMG.LDV, see SCRIPTS/ldvopt.vcs
+[ST]
+limit_black = 5
+limit_white = 250
+diff_grey = 5
+1 = fmt=IMG
+4 = fmt=IMG
+8 = fmt=IMG
+16 = fmt=TGA
+24 = fmt=TGA
+32 = fmt=TGA
+
+[TT]
+limit_black = 5
+limit_white = 250
+diff_grey = 5
+1 = fmt=TIF;compression=lzw
+4 = fmt=TIF;compression=lzw
+8 = fmt=TIF;compression=lzw
+16 = fmt=TGA
+24 = fmt=TGA
+32 = fmt=TGA
+
+[Falcon]
+limit_black = 5
+limit_white = 250
+diff_grey = 5
+1 = fmt=TIF;compression=lzw
+4 = fmt=TIF;compression=lzw
+8 = fmt=TIF;compression=lzw
+16 = fmt=JPG;quality=90
+24 = fmt=JPG;quality=90
+32 = fmt=JPG;quality=90
+
+[Aranym]
+enforce_smaller = 1
+limit_black = 5
+limit_white = 250
+diff_grey = 2
+1 = fmt=TIF;compression=lzw
+4 = fmt=TIF;compression=lzw
+8 = fmt=TIF;compression=lzw
+16 = fmt=JPG;quality=90
+24 = fmt=JPG;quality=90
+32 = fmt=JPG;quality=90
+
+[DualToneLikely]
+enforce_smaller = 1
+limit_black = 50
+limit_white = 205
+diff_grey = 30
+1 = fmt=TIF;compression=lzw
+4 = fmt=TIF;compression=lzw
+8 = fmt=TIF;compression=lzw
+16 = fmt=JPG;quality=90
+24 = fmt=JPG;quality=90
+32 = fmt=JPG;quality=90
+
+[DualToneForced]
+enforce_dither = 1
+dither_method = 4
+dither_outplanes = 1
+dither_param = 50
+1 = fmt=TIF;compression=lzw
+
+[TIFForceDither256c]
+enforce_dither = 1
+dither_method = 3
+dither_outplanes = 8
+dither_param = 0
+8 = fmt=TIF;compression=lzw
+
+[IMGForceDither256c]
+enforce_dither = 1
+dither_method = 3
+dither_outplanes = 8
+dither_param = 0
+8 = fmt=IMG
diff --git a/tools/vision/ldv/optimg.ldv b/tools/vision/ldv/optimg.ldv
new file mode 100644
index 0000000..7b3973c
Binary files /dev/null and b/tools/vision/ldv/optimg.ldv differ
diff --git a/tools/vision/LDV/PIXEL.INI b/tools/vision/ldv/pixel.ini
similarity index 100%
rename from tools/vision/LDV/PIXEL.INI
rename to tools/vision/ldv/pixel.ini
diff --git a/tools/vision/ldv/pixel.ldv b/tools/vision/ldv/pixel.ldv
new file mode 100644
index 0000000..153de7b
Binary files /dev/null and b/tools/vision/ldv/pixel.ldv differ
diff --git a/tools/vision/LDV/puzzle.ini b/tools/vision/ldv/puzzle.ini
similarity index 100%
rename from tools/vision/LDV/puzzle.ini
rename to tools/vision/ldv/puzzle.ini
diff --git a/tools/vision/ldv/puzzle.ldv b/tools/vision/ldv/puzzle.ldv
new file mode 100644
index 0000000..d0a670a
Binary files /dev/null and b/tools/vision/ldv/puzzle.ldv differ
diff --git a/tools/vision/LDV/ROTATE.INI b/tools/vision/ldv/rotate.ini
similarity index 100%
rename from tools/vision/LDV/ROTATE.INI
rename to tools/vision/ldv/rotate.ini
diff --git a/tools/vision/ldv/rotate.ldv b/tools/vision/ldv/rotate.ldv
new file mode 100644
index 0000000..faf26fe
Binary files /dev/null and b/tools/vision/ldv/rotate.ldv differ
diff --git a/tools/vision/LDV/SMLLDV.H b/tools/vision/ldv/smlldv.h
similarity index 100%
rename from tools/vision/LDV/SMLLDV.H
rename to tools/vision/ldv/smlldv.h
diff --git a/tools/vision/LDV/SMP_LDV.INI b/tools/vision/ldv/smp_ldv.ini
similarity index 100%
rename from tools/vision/LDV/SMP_LDV.INI
rename to tools/vision/ldv/smp_ldv.ini
diff --git a/tools/vision/LDV/SRC/bhole/bhole.c b/tools/vision/ldv/src/bhole/bhole.c
similarity index 95%
rename from tools/vision/LDV/SRC/bhole/bhole.c
rename to tools/vision/ldv/src/bhole/bhole.c
index 92db7ff..bccb8ef 100644
--- a/tools/vision/LDV/SRC/bhole/bhole.c
+++ b/tools/vision/ldv/src/bhole/bhole.c
@@ -47,12 +47,12 @@ PROC Proc[] = {
char Info[] = "LDV";
LDGLIB Ldg[] = {
- 0x0100, /* LDV version */
+ 0x0101, /* LDV version */
4, /* Number of functions in the lib */
Proc, /* Pointers to LDV functions */
Info, /* Library Information */
0x0, /* Lib flags, mandatory */
- OnClose, /* Closing, free VDIHandle */
+ OnClose, /* Closing, free VDIHandle */
};
#define BP_CAPS (LDVF_ATARIFORMAT | LDVF_SUPPORTPREVIEW | LDVF_SUPPORTPROG | LDVF_REALTIMEPARAMS | LDVF_SUPPORTCANCEL | LDVF_NOSELECTION)
@@ -207,7 +207,7 @@ void BHL16_68000(short use_sym, void* in, void* out)
unsigned long save_bh_xd, save_bh_yd ;
short n ;
- for ( x = bh_out_x; x <= bh_out_x+bh_out_w/2; x++, bh_xd++ )
+ for ( x = bh_out_x; x <= bh_out_x+(bh_out_w>>1); x++, bh_xd++ )
{
/* Save bh_xd and bh_yd as they will change */
save_bh_xd = bh_xd ;
@@ -262,7 +262,7 @@ void BHL32_68000(short use_sym, void* in, void* out)
unsigned long save_bh_xd, save_bh_yd ;
short n ;
- for ( x = bh_out_x; x <= bh_out_x+bh_out_w/2; x++, bh_xd++ )
+ for ( x = bh_out_x; x <= bh_out_x+(bh_out_w>>1); x++, bh_xd++ )
{
/* Save bh_xd and bh_yd as they will change */
save_bh_xd = bh_xd ;
@@ -444,7 +444,7 @@ char check_prog(short y, short ymax)
if ( ( y & 0x0F ) == 0 )
{
- int pc = (short) ( ( 100L * (long)y ) / (long)ymax ) ;
+ short pc = (short)((y*100L)/ymax) ;
cancel = Vapi->PrSetProgEx( bh_pc+pc/bh_nrect ) ;
}
@@ -541,7 +541,7 @@ LDV_STATUS Run16(MFDB *in, long angle, short xc, short yc, MFDB *out, RECT* rect
in_ptr = (unsigned int*) in->fd_addr ;
out_ptr = (unsigned int*) out->fd_addr ;
init_computation(xc, yc, angle, in, rect) ;
- hy = bh_out_y+bh_out_h/2 ;
+ hy = bh_out_y+(bh_out_h>>1) ;
if (!use_sym)
{
sizelout = (long) ALIGN16( out->fd_w ) ;
@@ -572,7 +572,7 @@ LDV_STATUS Run32(MFDB *in, long angle, short xc, short yc, MFDB *out, RECT* rect
in_ptr = (unsigned long*) in->fd_addr ;
out_ptr = (unsigned long*) out->fd_addr ;
init_computation(xc, yc, angle, in, rect) ;
- hy = bh_out_y+bh_out_h/2 ;
+ hy = bh_out_y+(bh_out_h>>1) ;
if (!use_sym)
{
sizelout = (long) ALIGN16( out->fd_w ) ;
@@ -633,7 +633,7 @@ void SymmetrySplit(MFDB* img, short xc, short yc, BH_SPROPERTIES* sgProps)
npts_total = (long)img->fd_w*(long)img->fd_h ;
npts_insym = 4L*(long)sw*(long)sw ;
- npts_to_compute = npts_total-((3L*npts_insym)/4L) ;
+ npts_to_compute = npts_total-((3L*npts_insym)>>2) ;
sgProps->estdpc = (100L*npts_to_compute)/npts_total ;
if ( sgProps->estdpc > 70 )
{
@@ -736,7 +736,7 @@ short GetSymetryUsageFromIni(void)
sprintf( filename, "%s\\%s\\BHOLE.INI", path_ldv, language ) ;
if ( Vapi->LoDoLog ) Vapi->LoDoLog(LL_INFO,"Looking into %s to see symetry usage...", filename) ;
- found = Vapi->InGetKeyFromFile( filename, "Private", "UseSym", val_key ) ;
+ found = Vapi->InGetKeyFromFile( filename, "Private", "UseSym", val_key ) ;
if ( !found )
{
sprintf( filename, "%s\\BHOLE.INI", path_ldv ) ;
@@ -818,7 +818,7 @@ LDV_STATUS cdecl Run(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out)
bh_pc = (100*n)/sgProps.nrect ; /* For progression indicator as we may have multiple loops */
npix = (long)sgProps.rect[n].w * (long)sgProps.rect[n].h ;
np += npix ;
- if ( VapiLogLevel >= LL_PERF)
+ if ( VapiLogLevel >= LL_PERF )
{
size_t t0, tms ;
diff --git a/tools/vision/ldv/src/bhole/bhole.ldv b/tools/vision/ldv/src/bhole/bhole.ldv
new file mode 100644
index 0000000..c882bd1
Binary files /dev/null and b/tools/vision/ldv/src/bhole/bhole.ldv differ
diff --git a/tools/vision/LDV/SRC/bhole/bhole.prj b/tools/vision/ldv/src/bhole/bhole.prj
similarity index 61%
rename from tools/vision/LDV/SRC/bhole/bhole.prj
rename to tools/vision/ldv/src/bhole/bhole.prj
index e3df650..e85dd05 100644
--- a/tools/vision/LDV/SRC/bhole/bhole.prj
+++ b/tools/vision/ldv/src/bhole/bhole.prj
@@ -1,13 +1,15 @@
BHOLE.LDV
-;.C[-Y- -G+]
-;.L[-Y-]
+.C [ ]
+.S [ -2 -8 ]
+.L [ ]
+
=
+
pcstart.o
BHOLE.C
-BHOLE.S
+BHOLES.S
pcgemlib.lib
pcstdlib.lib
pctoslib.lib
pcfltlib.lib
..\..\ldg.lib
-;..\..\mt_aes.lib
\ No newline at end of file
diff --git a/tools/vision/LDV/SRC/bhole/bhole.s b/tools/vision/ldv/src/bhole/bholes.s
similarity index 100%
rename from tools/vision/LDV/SRC/bhole/bhole.s
rename to tools/vision/ldv/src/bhole/bholes.s
diff --git a/tools/vision/LDV/SRC/bhole/perf_r51.txt b/tools/vision/ldv/src/bhole/perf_r51.txt
similarity index 100%
rename from tools/vision/LDV/SRC/bhole/perf_r51.txt
rename to tools/vision/ldv/src/bhole/perf_r51.txt
diff --git a/tools/vision/LDV/SRC/BW/BW.C b/tools/vision/ldv/src/bw/bw.c
similarity index 74%
rename from tools/vision/LDV/SRC/BW/BW.C
rename to tools/vision/ldv/src/bw/bw.c
index 6258955..0a462d5 100644
--- a/tools/vision/LDV/SRC/BW/BW.C
+++ b/tools/vision/ldv/src/bw/bw.c
@@ -44,7 +44,7 @@ PROC Proc[] = {
char Info[] = "LDV";
LDGLIB Ldg[] = {
- 0x0102, /* version de la lib, recommand‚ */
+ 0x0104, /* version de la lib, recommand‚ */
4, /* nombre de fonction dans la lib */
Proc, /* Pointeurs vers nos fonctions */
Info, /* Information sur la lib */
@@ -85,6 +85,30 @@ void OnClose(void)
VDIHandle = -1 ;
}
+/* Helper function to call best progress routine depending on VAPI progress function availability */
+/* Return value: */
+/* 1: Cencel requested by user */
+/* 0: Progress update done */
+/* -1: Progress update not made to screen () */
+static short Prog(long current, long max)
+{
+ short status = 0 ;
+
+ if ( Vapi->PrSetProgRange ) status = (short) Vapi->PrSetProgRange( current, max ) ;
+ else if ( max && ( ( current & 0x0F ) == 0 ) )
+ {
+ short pc ;
+
+ /* Call progress routine only once on 16 */
+ pc = (short) ( ( 100L * ( current - max ) ) / max ) ;
+ if ( Vapi->PrSetProgEx ) status = Vapi->PrSetProgEx( pc ) ;
+ else Vapi->PrSetProg( pc ) ;
+ }
+
+ return status ;
+}
+#define PROG_CANCEL(status) (status == 1)
+
/*
* Fonctions de la librairie
*/
@@ -129,7 +153,7 @@ LDV_STATUS cdecl Run(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out)
VDI_ELEMENTPAL *vdi_epal ;
short vdi_index ;
short bw_value ;
- short cancel = 0 ;
+ short status = 0 ;
if ( in->Raster.fd_nplanes <= 8 )
{
@@ -148,23 +172,24 @@ LDV_STATUS cdecl Run(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out)
else
{
MFDB *img = &in->Raster ;
- long nb_pts_in_line ;
- short x, y, pc ;
+ long nb_pts_in_line, ymax ;
+ short x, y ;
- if ( Vapi == NULL ) return( ELDV_GENERALFAILURE ) ;
+ if ( Vapi == NULL ) return ELDV_GENERALFAILURE ;
+ ymax = params->y2 - params->y1 ;
/* Convertir l'image au format True Color "standard" ATARI */
/* Format specifique --> format "ATARI True Color" */
Vapi->RaTCInvConvert( img ) ;
nb_pts_in_line = img->fd_w ;
- if ( nb_pts_in_line % 16 ) nb_pts_in_line = (16+nb_pts_in_line) & 0xFFF0 ; /* Toujours aligne sur 16 pixels ! */
+ nb_pts_in_line = ALIGN16( nb_pts_in_line ) ; /* Toujours aligne sur 16 pixels ! */
if ( img->fd_nplanes == 16 )
{
unsigned short *ptu, red, green, blue, ugris, val, ubr ;
- for ( y = params->y1; !cancel && (y <= params->y2); y++ )
+ for ( y = params->y1; !PROG_CANCEL(status) && (y <= params->y2); y++ )
{
ptu = (unsigned short *) img->fd_addr ;
ptu += nb_pts_in_line * y ;
@@ -179,19 +204,7 @@ LDV_STATUS cdecl Run(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out)
ubr = ( ugris >> 1 ) ;
*ptu++ = RVB16( ubr, ugris, ubr ) ;
}
- if ( ( y & 0x0F ) == 0x0F )
- {
- /* Appelle la routine de progression une fois sur 16 */
- /* NB : en mode preview, VISION ignorera cet appel, */
- /* inutile donc de s'en soucier */
- pc = (short) ( ( 100L * ( y - params->y1 ) ) / ( params->y2 - params->y1 ) ) ;
- if ( Vapi->PrSetProgEx )
- {
- cancel = Vapi->PrSetProgEx( pc ) ;
- }
- else
- Vapi->PrSetProg( pc ) ;
- }
+ status = Prog( y - params->y1, ymax ) ;
}
}
else if ( img->fd_nplanes == 24 ) /* NON teste ! */
@@ -199,7 +212,7 @@ LDV_STATUS cdecl Run(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out)
unsigned char *ptu ;
unsigned short red, green, blue, ugris ;
- for ( y = params->y1; !cancel && (y <= params->y2); y++ )
+ for ( y = params->y1; !PROG_CANCEL(status) && (y <= params->y2); y++ )
{
ptu = (unsigned char *) img->fd_addr ;
ptu += 3 * nb_pts_in_line * y ;
@@ -215,19 +228,7 @@ LDV_STATUS cdecl Run(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out)
*ptu-- = ugris ;
ptu += 3 ;
}
- if ( ( y & 0x0F ) == 0x0F )
- {
- /* Appelle la routine de progression une fois sur 16 */
- /* NB : en mode preview, VISION ignorera cet appel, */
- /* inutile donc de s'en soucier */
- pc = (short) ( ( 100L * ( y - params->y1 ) ) / ( params->y2 - params->y1 ) ) ;
- if ( Vapi->PrSetProgEx )
- {
- cancel = Vapi->PrSetProgEx( pc ) ;
- }
- else
- Vapi->PrSetProg( pc ) ;
- }
+ status = Prog( y - params->y1, ymax ) ;
}
}
else if ( img->fd_nplanes == 32 )
@@ -235,7 +236,7 @@ LDV_STATUS cdecl Run(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out)
unsigned long *ptu, val ;
unsigned short red, green, blue, ugris ;
- for ( y = params->y1; !cancel && (y <= params->y2); y++ )
+ for ( y = params->y1; !PROG_CANCEL(status) && (y <= params->y2); y++ )
{
ptu = (unsigned long *)img->fd_addr ;
ptu += nb_pts_in_line * y ;
@@ -252,19 +253,7 @@ LDV_STATUS cdecl Run(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out)
ugris = ( R4[red] + G4[green] + B4[blue] ) ;
*ptu++ = RVB32( ugris, ugris, ugris ) ;
}
- if ( ( y & 0x0F ) == 0x0F )
- {
- /* Appelle la routine de progression une fois sur 16 */
- /* NB : en mode preview, VISION ignorera cet appel, */
- /* inutile donc de s'en soucier */
- pc = (short) ( ( 100L * ( y - params->y1 ) ) / ( params->y2 - params->y1 ) ) ;
- if ( Vapi->PrSetProgEx )
- {
- cancel = Vapi->PrSetProgEx( pc ) ;
- }
- else
- Vapi->PrSetProg( pc ) ;
- }
+ status = Prog( y - params->y1, ymax ) ;
}
}
@@ -272,7 +261,7 @@ LDV_STATUS cdecl Run(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out)
Vapi->RaTCConvert( img ) ;
}
- return( cancel ? ELDV_CANCELLED : ELDV_NOERROR ) ;
+ return( PROG_CANCEL(status) ? ELDV_CANCELLED : ELDV_NOERROR ) ;
}
LDV_STATUS cdecl Preview(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out)
diff --git a/tools/vision/ldv/src/bw/bw.ldv b/tools/vision/ldv/src/bw/bw.ldv
new file mode 100644
index 0000000..8866145
Binary files /dev/null and b/tools/vision/ldv/src/bw/bw.ldv differ
diff --git a/tools/vision/LDV/SRC/BW/BW.PRJ b/tools/vision/ldv/src/bw/bw.prj
similarity index 76%
rename from tools/vision/LDV/SRC/BW/BW.PRJ
rename to tools/vision/ldv/src/bw/bw.prj
index f0abb07..77fdebb 100644
--- a/tools/vision/LDV/SRC/BW/BW.PRJ
+++ b/tools/vision/ldv/src/bw/bw.prj
@@ -1,6 +1,7 @@
bw.ldv
-;.C[-Y- -G+]
-;.L[-Y-]
+.C [ ]
+.S [ ]
+.L [ ]
=
pcstart.o
bw.c
diff --git a/tools/vision/ldv/src/cntcol/cntcol.c b/tools/vision/ldv/src/cntcol/cntcol.c
new file mode 100644
index 0000000..f25a365
--- /dev/null
+++ b/tools/vision/ldv/src/cntcol/cntcol.c
@@ -0,0 +1,856 @@
+#define PCGEMLIB 1 /* Set to 1 if PureC is used */
+
+#if PCGEMLIB
+#include
+#include
+#else
+#include
+#include
+#endif
+
+#include
+#include
+#include
+#include
+#include "..\..\ldg.h"
+#include "..\..\vapi.h"
+#include "..\..\ldv.h"
+
+/* Prototypes */
+LDV_INFOS* cdecl GetLDVCapabilities(VAPI* vapi) ;
+LDV_STATUS cdecl PreRun(LDV_IMAGE* in, LDV_PARAMS* params, LDV_IMAGE* out) ;
+LDV_STATUS cdecl Run(LDV_IMAGE* in, LDV_PARAMS* params, LDV_IMAGE* out) ;
+
+/* Global variables */
+PROC Proc[] = {
+ "GetLDVCapabilities", "LDV capabilities", (void*)GetLDVCapabilities,
+ "PreRun", "Run initialization", (void*)PreRun,
+ "Run", "LDV operation", (void*)Run,
+ } ;
+
+char Info[] = "LDV" ;
+
+LDGLIB Ldg[] = {
+ 0x0107, /* Lib version */
+ 3, /* Number of functions in lib */
+ Proc, /* Pointers to our functions */
+ Info, /* Lib information */
+ 0x0, /* Lib flags */
+ NULL, /* On exit, free VDI handle (unused) */
+ } ;
+
+#define CAPS (LDVF_ATARIFORMAT | LDVF_SUPPORTPROG | LDVF_OPINPLACE | LDVF_SUPPORTCANCEL | LDVF_NOSELECTION | LDVF_NOCHANGE)
+
+LDV_INFOS LdvInfos = {
+ (short) sizeof(LDV_INFOS), /* size of this structure */
+ TLDV_MODIFYIMG, /* LDV Type */
+ "Jean Lusetti/Seedy", /* Authors */
+ {
+ { 1, 1, CAPS }, /* 1 bitplane capabilities */
+ { 2, 2, CAPS }, /* 2 bitplane capabilities */
+ { 4, 4, CAPS }, /* 4 bitplane capabilities */
+ { 8, 8, CAPS }, /* 8 bitplane capabilities */
+ { 16, 16, CAPS }, /* 16 bitplane capabilities */
+/* Not yet { 24, 24, CAPS }, */
+ { 32, 32, CAPS }, /* 32 bitplane capabilities */
+ { 0, 0, 0UL } /* End of this list */
+ },
+ } ;
+
+VAPI* Vapi = NULL ;
+unsigned char VapiLog = 0 ;
+unsigned char UseVAlloc ; /* Use VISION's allocation routines if possible */
+unsigned char NbBitsIn[256] ; /* Number of bits set to 1 for every integer in [0;255] */
+
+typedef struct _CNTCOL_DATA
+{
+ /* Input data */
+ LDV_IMAGE* in ;
+ LDV_PARAMS* params ;
+ FILE* report_file ;
+ short method ; /* 0: auto, 1: bit array of colors, 2: sorted colors */
+}
+CNTCOL_DATA, *PCNTCOL_DATA ;
+
+typedef struct _CC1_CONTEXT
+{
+ void* line_colors ;
+ unsigned long so_line_colors ;
+ unsigned char* unique_colors_bits ;
+ unsigned long so_unique_colors_bits ;
+ short nplanes ;
+ unsigned char* indexes ; /* Allocated only if nplanes <= 8 */
+ unsigned long so_indexes ;
+ unsigned long used_bytes ;
+}
+CC1_CONTEXT, *PCC1_CONTEXT ;
+
+typedef struct _CC2_CONTEXT
+{
+ unsigned char* line_sorted ;
+ unsigned char* img_sorted ;
+ unsigned long nb_img_colors ;
+ unsigned long nb_img_colors_max ;
+ short nplanes ;
+ unsigned char* indexes ; /* Allocated only if nplanes <= 8 */
+ unsigned long so_indexes ;
+ unsigned long used_bytes ;
+}
+CC2_CONTEXT, *PCC2_CONTEXT ;
+
+typedef struct _CC3_CONTEXT
+{
+ unsigned char* line_sorted ;
+ unsigned long so_line_colors ;
+ unsigned char* unique_colors_bits ;
+ unsigned long so_unique_colors_bits ;
+ short nplanes ;
+ unsigned char* indexes ; /* Allocated only if nplanes <= 8 */
+ unsigned long so_indexes ;
+ unsigned long used_bytes ;
+}
+CC3_CONTEXT, *PCC3_CONTEXT ;
+
+typedef union _CC_CONTEXT
+{
+ /* Specific data for each method */
+ CC1_CONTEXT c1 ; /* color table for a line and bitcolor array globally */
+ CC2_CONTEXT c2 ; /* sort/reduce each line and globally */
+ CC3_CONTEXT c3 ; /* sort/reduce each line and bitcolor array globally */
+}
+CC_CONTEXT, *PCC_CONTEXT ;
+
+typedef struct _CC_INTERFACE
+{
+ LDV_STATUS (*Init)(CC_CONTEXT* vc, CNTCOL_DATA* data) ;
+ unsigned long (*CountColors)(CC_CONTEXT* vc, void* addr, unsigned long so_line) ;
+ unsigned long (*CountColorsEnd)(CC_CONTEXT* vc) ;
+ unsigned long (*Exit)(CC_CONTEXT* vc) ;
+}
+CC_INTERFACE, *PCC_INTERFACE ;
+
+
+/* Helper function to call best progress routine depending on VAPI progress function availability */
+/* Return value: */
+/* 1: Cencel requested by user */
+/* 0: Progress update done */
+/* -1: Progress update not made to screen () */
+static short Prog(long current, long max)
+{
+ short status = 0 ;
+
+ if ( Vapi->PrSetProgRange ) status = (short) Vapi->PrSetProgRange( current, max ) ;
+ else if ( max && ( ( current & 0x0F ) == 0 ) )
+ {
+ short pc ;
+
+ /* Call progress routine only once on 16 */
+ pc = (short) ( ( 100L * ( current - max ) ) / max ) ;
+ if ( Vapi->PrSetProgEx ) status = Vapi->PrSetProgEx( pc ) ;
+ else Vapi->PrSetProg( pc ) ;
+ }
+
+ return status ;
+}
+
+/* Wrappers to abstract dynamic allocation routines */
+static void* localCalloc(unsigned long size)
+{
+ void* p ;
+
+ if ( UseVAlloc ) p = Vapi->MeXcalloc( 1, size ) ;
+ else p = calloc( 1, size ) ;
+
+ return p ;
+}
+
+static void* localAlloc(unsigned long size)
+{
+ void* p ;
+
+ if ( UseVAlloc ) p = Vapi->MeXalloc( size ) ;
+ else p = malloc( size ) ;
+
+ return p ;
+}
+
+static void localFree(void* p)
+{
+ if ( p )
+ {
+ if ( UseVAlloc ) Vapi->MeXfree( p ) ;
+ else free( p ) ;
+ }
+}
+
+LDV_INFOS* cdecl GetLDVCapabilities(VAPI* vapi)
+{
+ Vapi = vapi ;
+ VapiLog = Vapi && Vapi->LoDoLog ;
+
+ return( &LdvInfos ) ;
+}
+
+#pragma warn -par
+LDV_STATUS cdecl PreRun(LDV_IMAGE* in, LDV_PARAMS* params, LDV_IMAGE* out)
+{
+ return ELDV_NOERROR ;
+}
+#pragma warn +par
+
+static FILE* CreateReportFile(CNTCOL_DATA* data)
+{
+ FILE* stream ;
+ char* filename ;
+
+ if ( data->params->Param[1].str ) filename = data->params->Param[1].str ;
+ else filename = "cntcol.txt" ;
+ stream = fopen( filename, "wb" ) ;
+ if ( VapiLog )
+ {
+ if ( stream ) Vapi->LoDoLog(LL_INFO, "cntcol.ldv will generate report file %s", filename) ;
+ else Vapi->LoDoLog(LL_ERROR, "cntcol.ldv failed to create report file %s", filename) ;
+ }
+
+ if ( stream )
+ {
+ fprintf( stream, "cntcol LDV running on image %dx%d, %d bitplanes:\r\n", data->in->Raster.fd_w, data->in->Raster.fd_h, data->in->Raster.fd_nplanes ) ;
+ fprintf( stream, "-------|--------------------\r\n" ) ;
+ fprintf( stream, "| Line | # unique colors |\r\n" ) ;
+ }
+
+ return stream ;
+}
+
+static unsigned long CountBits(unsigned char* pt, unsigned long nb_bytes)
+{
+ unsigned char* p = pt ;
+ unsigned long nb_bits = 0 ;
+
+ while ( p < pt+nb_bytes )
+ {
+ nb_bits += NbBitsIn[*p] ;
+ p++ ;
+ }
+
+ return nb_bits ;
+}
+
+static LDV_STATUS check_prog(short y, short ymax, unsigned long nb_unique_colors_on_line)
+{
+ short status ;
+
+ status = Prog( y, ymax ) ;
+ if ( status == 0 ) /* GUI updated */
+ {
+ if ( Vapi->PrSetText )
+ {
+ char buf[128] ;
+
+ sprintf( buf, "%lu unique colors on line %d", nb_unique_colors_on_line, y ) ;
+ Vapi->PrSetText( 1, buf ) ;
+ }
+ }
+
+ return LDVPROG_CANCEL( status ) ? ELDV_CANCELLED:ELDV_NOERROR ;
+}
+
+static short add_pixel_if_not_present16(unsigned short pixel, unsigned short* line_colors, unsigned long nb_colors)
+{
+ unsigned long i ;
+
+ for ( i = 0; i < nb_colors; i++ )
+ if ( line_colors[i] == pixel ) break ;
+
+ if ( i == nb_colors ) { line_colors[nb_colors++] = pixel ; return 1 ; }
+
+ return 0 ;
+}
+
+static short add_pixel_if_not_present32(unsigned long pixel, unsigned long* line_colors, unsigned long nb_colors)
+{
+ unsigned long i ;
+
+ for ( i = 0; i < nb_colors; i++ )
+ if ( line_colors[i] == pixel ) break ;
+
+ if ( i == nb_colors ) { line_colors[nb_colors++] = pixel ; return 1 ; }
+
+ return 0 ;
+}
+
+static unsigned long CC1(CC_CONTEXT* vc, void* addr, unsigned long so_line)
+{
+ CC1_CONTEXT* c = (CC1_CONTEXT*) &vc->c1 ;
+ unsigned char* line = (unsigned char*) addr ;
+ unsigned long offset, nb_colors = 0 ;
+ unsigned short bit ;
+
+ if ( c->nplanes <= 8 ) /* Bit planes */
+ {
+ unsigned char unique_colors_bits_line[256/8] ; /* 256 bits --> 256/8 bytes */
+ unsigned short x ;
+
+ memset( unique_colors_bits_line, 0, sizeof(unique_colors_bits_line) ) ;
+ Vapi->RaRaster2Ind( addr, c->so_indexes, c->nplanes, c->indexes ) ;
+ for ( x = 0; x < c->so_indexes; x++ )
+ {
+ bit = c->indexes[x] & 0x07 ;
+ offset = c->indexes[x] >> 3 ;
+ c->unique_colors_bits[offset] |= (1 << bit) ;
+ unique_colors_bits_line[offset] |= (1 << bit) ;
+ }
+ nb_colors = CountBits( unique_colors_bits_line, sizeof(unique_colors_bits_line) ) ;
+ }
+ else if ( c->nplanes == 16 ) /* TC16 */
+ {
+ unsigned short* p ;
+ unsigned short pixel ;
+
+ for ( p = (unsigned short*)line; p < (unsigned short*) (line+so_line); p++ )
+ {
+ pixel = *p ;
+ nb_colors += add_pixel_if_not_present16( pixel, c->line_colors, nb_colors ) ;
+ bit = pixel & 0x07 ;
+ offset = pixel >> 3 ;
+ c->unique_colors_bits[offset] |= (1 << bit) ;
+ }
+ }
+ else if ( c->nplanes == 32 ) /* TC32 */
+ {
+ unsigned char* p ;
+ unsigned long pixel ;
+
+ for ( p = line; p < line+so_line; p += 4 )
+ {
+ pixel = p[0] ;
+ pixel |= ( (unsigned long)p[1] << 8 ) ;
+ pixel |= ( (unsigned long)p[2] << 16 ) ;
+ nb_colors += add_pixel_if_not_present32( pixel, c->line_colors, nb_colors ) ;
+ bit = (unsigned short)pixel & 0x07 ;
+ offset = pixel >> 3 ;
+ c->unique_colors_bits[offset] |= (1 << bit) ;
+ }
+ }
+
+ return nb_colors ;
+}
+
+static unsigned long CC1Exit(CC_CONTEXT* vc)
+{
+ CC1_CONTEXT* c = &vc->c1 ;
+
+ localFree( c->unique_colors_bits ) ;
+ localFree( c->line_colors ) ;
+ localFree( c->indexes ) ;
+
+ return c->used_bytes ;
+}
+
+static unsigned long Getso_unique_colors_bits(MFDB* img)
+{
+ unsigned long so_unique_colors_bits ;
+
+ if ( img->fd_nplanes > 8 )
+ {
+ if ( img->fd_nplanes == 16 ) so_unique_colors_bits = 1UL << 16 ;
+ else so_unique_colors_bits = 1UL << 24 ; /* TC24 or TC32 */
+ }
+ else so_unique_colors_bits = 256 ;
+
+ so_unique_colors_bits >>= 3 ; /* #bits --> #bytes */
+ if ( so_unique_colors_bits == 0 ) so_unique_colors_bits = 1 ;
+
+ return so_unique_colors_bits ;
+}
+
+static LDV_STATUS CC1Init(CC_CONTEXT* vc, CNTCOL_DATA* data)
+{
+ MFDB* img = &data->in->Raster ;
+ CC1_CONTEXT* c = &vc->c1 ;
+
+ memset( c, 0, sizeof(*c) ) ;
+ c->nplanes = img->fd_nplanes ;
+ if ( img->fd_nplanes > 8 )
+ {
+ /* True Color */
+ /* Size of bit array for each unique color depending on the number of planes */
+ c->so_line_colors = Vapi->RaGetImgSize( img->fd_w, 1, img->fd_nplanes ) ;
+ c->line_colors = localAlloc( c->so_line_colors ) ;
+ if ( c->line_colors == NULL ) return ELDV_NOTENOUGHMEMORY ;
+ }
+ else
+ {
+ /* Bit planes */
+ c->so_indexes = 16*img->fd_wdwidth ; /* Max for 8 planes */
+ c->indexes = (unsigned char*) localAlloc( c->so_indexes ) ;
+ c->so_line_colors = 0 ;
+ if ( c->indexes == NULL ) return ELDV_NOTENOUGHMEMORY ;
+ }
+
+ c->so_unique_colors_bits = Getso_unique_colors_bits( img ) ;
+ c->unique_colors_bits = localCalloc( c->so_unique_colors_bits ) ;
+ if ( c->unique_colors_bits == NULL ) { CC1Exit( vc ) ; return ELDV_NOTENOUGHMEMORY ; }
+
+ c->used_bytes = c->so_unique_colors_bits + c->so_line_colors + c->so_indexes ;
+
+ return ELDV_NOERROR ;
+}
+
+static unsigned long CC1End(CC_CONTEXT* vc)
+{
+ CC1_CONTEXT* c = &vc->c1 ;
+
+ return CountBits( c->unique_colors_bits, c->so_unique_colors_bits ) ;
+}
+
+static int cmp8(const void* a, const void* b)
+{
+ unsigned char* e1 = (unsigned char*) a ;
+ unsigned char* e2 = (unsigned char*) b ;
+
+ return (int)( *e1 - *e2 ) ;
+}
+
+static int cmp16(const void* a, const void* b)
+{
+ unsigned short* e1 = (unsigned short*) a ;
+ unsigned short* e2 = (unsigned short*) b ;
+
+ return ( *e1 - *e2 ) ;
+}
+
+static int cmp32(const void* a, const void* b)
+{
+ unsigned long* e1 = (unsigned long*) a ;
+ unsigned long* e2 = (unsigned long*) b ;
+
+ if ( *e1 < *e2 ) return -1 ;
+ if ( *e1 == *e2 ) return 0 ;
+ return 1 ;
+}
+
+static unsigned long reduce8(unsigned char* array, unsigned long nb_items)
+{
+ unsigned long nb_unique = 0 ;
+ unsigned char* pread ;
+ unsigned char* pwrite ;
+ unsigned char val ;
+
+ pread = pwrite = array ;
+ while ( pread < array + nb_items )
+ {
+ val = *pread++ ;
+ while ( (pread < array + nb_items) && (*pread == val) ) pread++ ;
+ nb_unique++ ;
+ *pwrite++ = val ;
+ }
+
+ return nb_unique ;
+}
+
+static unsigned long reduce16(unsigned short* array, unsigned long nb_items)
+{
+ unsigned long nb_unique = 0 ;
+ unsigned short* pread ;
+ unsigned short* pwrite ;
+ unsigned short val ;
+
+ pread = pwrite = array ;
+ while ( pread < array + nb_items )
+ {
+ val = *pread++ ;
+ while ( (pread < array + nb_items) && (*pread == val) ) pread++ ;
+ nb_unique++ ;
+ *pwrite++ = val ;
+ }
+
+ return nb_unique ;
+}
+
+static unsigned long reduce32(unsigned long* array, unsigned long nb_items)
+{
+ unsigned long nb_unique = 0 ;
+ unsigned long* pread ;
+ unsigned long* pwrite ;
+ unsigned long val ;
+
+ pread = pwrite = array ;
+ while ( pread < array + nb_items )
+ {
+ val = *pread++ ;
+ while ( (pread < array + nb_items) && (*pread == val) ) pread++ ;
+ nb_unique++ ;
+ *pwrite++ = val ;
+ }
+
+ return nb_unique ;
+}
+
+static unsigned long CC2(CC_CONTEXT* vc, void* addr, unsigned long so_line)
+{
+ CC2_CONTEXT* c = (CC2_CONTEXT*) &vc->c2 ;
+ unsigned long nb_colors = 0 ;
+
+ if ( c->nplanes <= 8 ) /* Bit planes */
+ {
+ Vapi->RaRaster2Ind( addr, c->so_indexes, c->nplanes, c->indexes ) ;
+ qsort( c->indexes, c->so_indexes, sizeof(unsigned char), cmp8 ) ;
+ nb_colors = reduce8( c->indexes, c->so_indexes ) ;
+ /* Add new line of unique colors to current image unique colors */
+ memmove( c->img_sorted + c->nb_img_colors, c->indexes, nb_colors*sizeof(unsigned char) ) ;
+ c->nb_img_colors += nb_colors ;
+ }
+ else if ( c->nplanes == 16 ) /* TC16 */
+ {
+ memmove( c->line_sorted, addr, so_line ) ;
+ qsort( c->line_sorted, so_line >> 1, sizeof(unsigned short), cmp16 ) ;
+ nb_colors = reduce16( (unsigned short*) c->line_sorted, so_line >> 1 ) ;
+ /* Add new line of unique colors to current image unique colors */
+ memmove( c->img_sorted + 2*c->nb_img_colors, c->line_sorted, nb_colors*sizeof(unsigned short) ) ;
+ c->nb_img_colors += nb_colors ;
+ }
+ else if ( c->nplanes == 32 ) /* TC32 */
+ {
+ memmove( c->line_sorted, addr, so_line ) ;
+ qsort( c->line_sorted, so_line >> 2, sizeof(unsigned long), cmp32 ) ;
+ nb_colors = reduce32( (unsigned long*) c->line_sorted, so_line >> 2 ) ;
+ /* Add new line of unique colors to current image unique colors */
+ memmove( c->img_sorted + 4*c->nb_img_colors, c->line_sorted, nb_colors*sizeof(unsigned long) ) ;
+ c->nb_img_colors += nb_colors ;
+ }
+
+ return nb_colors ;
+}
+
+static unsigned long CC2Exit(CC_CONTEXT* vc)
+{
+ CC2_CONTEXT* c = &vc->c2 ;
+
+ localFree( c->indexes ) ;
+ localFree( c->img_sorted ) ;
+ localFree( c->line_sorted ) ;
+
+ return c->used_bytes ;
+}
+
+static LDV_STATUS CC2Init(CC_CONTEXT* vc, CNTCOL_DATA* data)
+{
+ MFDB* img = &data->in->Raster ;
+ CC2_CONTEXT* c = &vc->c2 ;
+ short pixel_in_bytes ;
+
+ memset( c, 0, sizeof(*c) ) ;
+ c->nplanes = img->fd_nplanes ;
+
+ /* Use VISION's checked allocation routine for safety as VISION performs bounduary checks */
+ /* Allocate memory to duplicate a line and sort it out */
+ if ( img->fd_nplanes > 8 )
+ {
+ c->line_sorted = (unsigned char*) localAlloc( Vapi->RaGetImgSize( img->fd_w, 1, img->fd_nplanes ) ) ;
+ if ( c->line_sorted == NULL ) return ELDV_NOTENOUGHMEMORY ;
+ if ( img->fd_nplanes == 16 ) pixel_in_bytes = 2 ;
+ else pixel_in_bytes = 4 ;
+ }
+ else
+ {
+ /* Bit planes: we need an index array */
+ c->so_indexes = 16*img->fd_wdwidth ; /* Max for 8 planes */
+ c->indexes = (unsigned char*) localAlloc( c->so_indexes ) ;
+ if ( c->indexes == NULL ) { CC2Exit( vc ) ; return ELDV_NOTENOUGHMEMORY ; }
+ pixel_in_bytes = 1 ;
+ }
+
+ /* Allocate memory to store all colors used for all the image */
+ /* There can't be more colors than pixels in the image, so let's go with that */
+ c->nb_img_colors_max = (unsigned long)img->fd_w * (unsigned long)img->fd_h ;
+ c->img_sorted = (unsigned char*) localAlloc( c->nb_img_colors_max*pixel_in_bytes ) ;
+ if ( c->img_sorted == NULL ) { CC2Exit( vc ) ; return ELDV_NOTENOUGHMEMORY ; }
+ c->used_bytes = c->so_indexes + c->nb_img_colors_max*pixel_in_bytes ;
+
+ return ELDV_NOERROR ;
+}
+
+static unsigned long CC2End(CC_CONTEXT* vc)
+{
+ CC2_CONTEXT* c = &vc->c2 ;
+
+ if ( c->nplanes <= 8 ) /* Bit planes */
+ {
+ /* Sort the new array */
+ qsort( c->img_sorted, c->nb_img_colors, sizeof(unsigned char), cmp8 ) ;
+ /* And reduce it */
+ c->nb_img_colors = reduce8( c->img_sorted, c->nb_img_colors ) ;
+ }
+ else if ( c->nplanes == 16 ) /* TC16 */
+ {
+ /* Sort the new array */
+ qsort( c->img_sorted, c->nb_img_colors, sizeof(unsigned short), cmp16 ) ;
+ /* And reduce it */
+ c->nb_img_colors = reduce16( (unsigned short*) c->img_sorted, c->nb_img_colors ) ;
+ }
+ else if ( c->nplanes == 32 ) /* TC32 */
+ {
+ /* Sort the new array */
+ qsort( c->img_sorted, c->nb_img_colors, sizeof(unsigned long), cmp32 ) ;
+ /* And reduce it */
+ c->nb_img_colors = reduce32( (unsigned long*) c->img_sorted, c->nb_img_colors ) ;
+ }
+
+ return c->nb_img_colors ;
+}
+
+static unsigned long CC3Exit(CC_CONTEXT* vc)
+{
+ CC3_CONTEXT* c = &vc->c3 ;
+
+ localFree( c->unique_colors_bits ) ;
+ localFree( c->line_sorted ) ;
+ localFree( c->indexes ) ;
+
+ return c->used_bytes ;
+}
+
+static LDV_STATUS CC3Init(CC_CONTEXT* vc, CNTCOL_DATA* data)
+{
+ MFDB* img = &data->in->Raster ;
+ CC3_CONTEXT* c = &vc->c3 ;
+
+ memset( c, 0, sizeof(*c) ) ;
+ c->nplanes = img->fd_nplanes ;
+ if ( img->fd_nplanes > 8 )
+ {
+ /* True Color */
+ /* Size of bit array for each unique color depending on the number of planes */
+ c->so_line_colors = Vapi->RaGetImgSize( img->fd_w, 1, img->fd_nplanes ) ;
+ /* Allocate memory for a line to get sorted */
+ c->line_sorted = localAlloc( c->so_line_colors ) ;
+ if ( c->line_sorted == NULL ) return ELDV_NOTENOUGHMEMORY ;
+ }
+ else
+ {
+ /* Bit planes */
+ c->so_indexes = 16*img->fd_wdwidth ; /* Max for 8 planes */
+ c->indexes = (unsigned char*) localAlloc( c->so_indexes ) ;
+ if ( c->indexes == NULL ) return ELDV_NOTENOUGHMEMORY ;
+ }
+
+ c->so_unique_colors_bits = Getso_unique_colors_bits( img ) ;
+ c->unique_colors_bits = localCalloc( c->so_unique_colors_bits ) ;
+ if ( c->unique_colors_bits == NULL ) { CC3Exit( vc ) ; return ELDV_NOTENOUGHMEMORY ; }
+
+ c->used_bytes = c->so_line_colors + c->so_indexes + c->so_unique_colors_bits ;
+
+ return ELDV_NOERROR ;
+}
+
+static unsigned long CC3End(CC_CONTEXT* vc)
+{
+ CC3_CONTEXT* c = &vc->c3 ;
+
+ return CountBits( c->unique_colors_bits, c->so_unique_colors_bits ) ;
+}
+
+static unsigned long CC3(CC_CONTEXT* vc, void* addr, unsigned long so_line)
+{
+ CC3_CONTEXT* c = (CC3_CONTEXT*) &vc->c3 ;
+ unsigned char* line = (unsigned char*) addr ;
+ unsigned long offset, nb_colors = 0 ;
+ unsigned short bit ;
+
+ if ( c->nplanes <= 8 ) /* Bit planes */
+ {
+ unsigned short x ;
+
+ /* Sort/reduce this line */
+ Vapi->RaRaster2Ind( addr, c->so_indexes, c->nplanes, c->indexes ) ;
+ qsort( c->indexes, c->so_indexes, sizeof(unsigned char), cmp8 ) ;
+ nb_colors = reduce8( c->indexes, c->so_indexes ) ;
+
+ /* Update global bitarray */
+ for ( x = 0; x < c->so_indexes; x++ )
+ {
+ bit = c->indexes[x] & 0x07 ;
+ offset = c->indexes[x] >> 3 ;
+ c->unique_colors_bits[offset] |= (1 << bit) ;
+ }
+ }
+ else if ( c->nplanes == 16 ) /* TC16 */
+ {
+ unsigned short* p ;
+ unsigned short pixel ;
+
+ /* Sort/reduce this line */
+ memmove( c->line_sorted, addr, so_line ) ;
+ qsort( c->line_sorted, so_line >> 1, sizeof(unsigned short), cmp16 ) ;
+ nb_colors = reduce16( (unsigned short*) c->line_sorted, so_line >> 1 ) ;
+
+ /* Update global bitarray */
+ for ( p = (unsigned short*)line; p < (unsigned short*) (line+so_line); p++ )
+ {
+ pixel = *p ;
+ bit = pixel & 0x07 ;
+ offset = pixel >> 3 ;
+ c->unique_colors_bits[offset] |= (1 << bit) ;
+ }
+ }
+ else if ( c->nplanes == 32 ) /* TC32 */
+ {
+ unsigned char* p ;
+ unsigned long pixel ;
+
+ /* Sort/reduce this line */
+ memmove( c->line_sorted, addr, so_line ) ;
+ qsort( c->line_sorted, so_line >> 2, sizeof(unsigned long), cmp32 ) ;
+ nb_colors = reduce32( (unsigned long*) c->line_sorted, so_line >> 2 ) ;
+
+ for ( p = line; p < line+so_line; p += 4 )
+ {
+ pixel = p[0] ;
+ pixel |= ( (unsigned long)p[1] << 8 ) ;
+ pixel |= ( (unsigned long)p[2] << 16 ) ;
+ bit = (unsigned short)pixel & 0x07 ;
+ offset = pixel >> 3 ;
+ c->unique_colors_bits[offset] |= (1 << bit) ;
+ }
+ }
+
+ return nb_colors ;
+}
+
+static LDV_STATUS LDVOperation(CNTCOL_DATA* data)
+{
+ CC_INTERFACE cci ;
+ CC_CONTEXT c ;
+ LDV_STATUS status ;
+ MFDB* img = &data->in->Raster ;
+ unsigned char* line ;
+ unsigned long so_line ;
+ short method, l = 0 ;
+ unsigned long nb_unique_colors_on_line, used_ram ;
+ unsigned char* pt_after_img ;
+
+ so_line = Vapi->RaGetImgSize( img->fd_w, 1, img->fd_nplanes ) ;
+ method = data->method ;
+ if ( method == 0 )
+ {
+ /* Let me decide */
+ if ( img->fd_nplanes <= 8 ) method = 1 ; /* qsort/reduce is too costy when there are not so many colors */
+ else method = 3 ;
+ }
+ switch( method )
+ {
+ case 1: cci.Init = CC1Init ;
+ cci.CountColors = CC1 ;
+ cci.CountColorsEnd = CC1End ;
+ cci.Exit = CC1Exit ;
+ break ;
+
+ case 2: cci.Init = CC2Init ;
+ cci.CountColors = CC2 ;
+ cci.CountColorsEnd = CC2End ;
+ cci.Exit = CC2Exit ;
+ break ;
+
+ default: cci.Init = CC3Init ;
+ cci.CountColors = CC3 ;
+ cci.CountColorsEnd = CC3End ;
+ cci.Exit = CC3Exit ;
+ method = 3 ;
+ break ;
+ }
+ if ( VapiLog )
+ {
+ Vapi->LoDoLog(LL_DEBUG, "cntcol.ldv: Image is %dx%dx%d, wd_width=%d", img->fd_w, img->fd_h, img->fd_nplanes, img->fd_wdwidth ) ;
+ Vapi->LoDoLog(LL_DEBUG, "cntcol.ldv: using %s's memory allocation routines", UseVAlloc ? "VISION":"compiler" ) ;
+ Vapi->LoDoLog(LL_DEBUG, "cntcol.ldv: using method %d for counting colors", method ) ;
+ }
+ status = cci.Init( &c, data ) ;
+ if ( !LDV_SUCCESS( status ) ) return status ;
+ if ( VapiLog ) Vapi->LoDoLog(LL_DEBUG, "cntcol.ldv: init done" ) ;
+
+ line = img->fd_addr ;
+ pt_after_img = line + (unsigned long)img->fd_h*so_line ;
+ while ( LDV_SUCCESS( status ) && (line < pt_after_img) )
+ {
+ nb_unique_colors_on_line = cci.CountColors( &c, line, so_line ) ;
+ if ( nb_unique_colors_on_line > 0 )
+ {
+ fprintf( data->report_file, "|%6d|%17lu|\r\n", l, nb_unique_colors_on_line ) ;
+ line += so_line ;
+ status = check_prog( l++, img->fd_h, nb_unique_colors_on_line ) ;
+ }
+ else status = ELDV_NOTENOUGHMEMORY ;
+ }
+
+ if ( status == ELDV_CANCELLED ) fprintf( data->report_file, "---- Operation cancelled by user ----\r\n" ) ;
+ else if ( status == ELDV_NOTENOUGHMEMORY ) fprintf( data->report_file, "---- Not enough memory ----\r\n" ) ;
+ else
+ {
+ unsigned long nb_unique_colors ;
+
+ if ( VapiLog ) Vapi->LoDoLog(LL_DEBUG, "cntcol.ldv: finishing counting..." ) ;
+ fprintf( data->report_file, "-------|------------------\r\n" ) ;
+ nb_unique_colors = cci.CountColorsEnd( &c ) ;
+ fprintf( data->report_file, "|Total |%17lu|\r\n", nb_unique_colors ) ;
+ if ( VapiLog ) Vapi->LoDoLog(LL_INFO, "cntcol.ldv: %lu unique colors on image", nb_unique_colors ) ;
+ if ( Vapi->Header.Version >= 0x0106 )
+ {
+ /* LDV_PARAMS provides storage for returning */
+ /* A free text to be displayed in VISION */
+ if ( VapiLog ) Vapi->LoDoLog(LL_INFO, "cntcol.ldv: returning #unique colors to VISION" ) ;
+ sprintf( data->params->ldv_txt_out, "%lu unique colors", nb_unique_colors ) ;
+ }
+ }
+
+ fprintf( data->report_file, "-------|------------------\r\n" ) ;
+ used_ram = cci.Exit( &c ) ;
+ fprintf( data->report_file, "RAM used: %lu KB\r\n", used_ram/1024UL ) ;
+
+ return status ;
+}
+
+#pragma warn -par
+LDV_STATUS cdecl Run(LDV_IMAGE* in, LDV_PARAMS* params, LDV_IMAGE* out)
+{
+ CNTCOL_DATA data ;
+ LDV_STATUS status ;
+ clock_t t0 ;
+
+ if ( (in->RasterFormat & CAPS) == 0 ) return ELDV_IMGFORMATMISMATCH ;
+
+ UseVAlloc = Vapi && Vapi->MeXcalloc && Vapi->MeXfree ;
+
+ data.in = in ;
+ data.params = params ;
+ data.method = data.params->Param[0].s ;
+ data.report_file = CreateReportFile( &data ) ;
+ if ( data.report_file == NULL ) return ELDV_GENERALFAILURE ;
+
+ t0 = clock() ;
+ status = LDVOperation( &data ) ;
+
+ fprintf( data.report_file, "Computation time: %lu ms\r\n", (1000L*(clock()-t0))/CLK_TCK ) ;
+ fclose( data.report_file ) ;
+
+ return status ;
+}
+#pragma warn +par
+
+static void init_bit_counts(void)
+{
+ unsigned short i, mask ;
+
+ for ( i = 0; i <= 255; i++ )
+ for ( mask = 1; mask < 256; mask <<= 1 )
+ if ( i & mask ) NbBitsIn[i]++ ;
+}
+
+int main(void)
+{
+ ldg_init( Ldg ) ;
+
+ init_bit_counts() ;
+
+ return 0 ;
+}
diff --git a/tools/vision/ldv/src/cntcol/cntcol.ldv b/tools/vision/ldv/src/cntcol/cntcol.ldv
new file mode 100644
index 0000000..646d4e1
Binary files /dev/null and b/tools/vision/ldv/src/cntcol/cntcol.ldv differ
diff --git a/tools/vision/ldv/src/cntcol/cntcol.prj b/tools/vision/ldv/src/cntcol/cntcol.prj
new file mode 100644
index 0000000..7d1b290
--- /dev/null
+++ b/tools/vision/ldv/src/cntcol/cntcol.prj
@@ -0,0 +1,12 @@
+CNTCOL.LDV
+.C [ ]
+.S [ ]
+.L [ ]
+=
+pcstart.o
+CNTCOL.C
+pcgemlib.lib
+pcstdlib.lib
+pctoslib.lib
+..\..\ldg.lib
+..\..\mt_aes.lib
\ No newline at end of file
diff --git a/tools/vision/ldv/src/dither/dither.c b/tools/vision/ldv/src/dither/dither.c
new file mode 100644
index 0000000..ce86ce9
--- /dev/null
+++ b/tools/vision/ldv/src/dither/dither.c
@@ -0,0 +1,145 @@
+/*
+ *
+ *
+ * Version PureC / Gcc
+ */
+
+#define PCGEMLIB 1 /* mettre 1 si les utilisateurs de Pure C
+ * utilise les librairies GEM Pure C */
+
+/* Fichiers headers */
+
+#include
+#if PCGEMLIB
+#include
+#include
+#else
+#include
+#include
+#endif
+
+#include
+#include
+#include "..\..\ldg.h"
+#include "..\..\vapi.h"
+#include "..\..\ldv.h"
+#include "..\..\mt_aes.h"
+
+/* Prototypages */
+LDV_INFOS* cdecl GetLDVCapabilities(VAPI *vapi) ;
+LDV_STATUS cdecl PreRun(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out) ;
+LDV_STATUS cdecl Run(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out) ;
+LDV_STATUS cdecl Preview(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out) ;
+
+void OnClose(void) ;
+
+/* Variables globales */
+PROC Proc[] = {
+ "GetLDVCapabilities", "LDV capabilties", (void *)GetLDVCapabilities,
+ "PreRun", "Before Run", (void *)PreRun,
+ "Run", "LDV routine", (void *)Run,
+ "Preview", "Preview", (void *)Preview,
+ } ;
+
+char Info[] = "LDV";
+
+LDGLIB Ldg[] = {
+ 0x0100, /* version de la lib, recommand‚ */
+ 4, /* nombre de fonction dans la lib */
+ Proc, /* Pointeurs vers nos fonctions */
+ Info, /* Information sur la lib */
+ 0x0, /* Flags de la lib, obligatoire */
+ NULL,
+ };
+
+#define BP_CAPS (LDVF_ATARIFORMAT | LDVF_SUPPORTPREVIEW | LDVF_REALTIMEPARAMS | LDVF_NOSELECTION | LDVF_AFFECTPALETTE)
+#define TC_CAPS (LDVF_ATARIFORMAT | LDVF_SUPPORTPREVIEW | LDVF_REALTIMEPARAMS | LDVF_NOSELECTION | LDVF_AFFECTPALETTE)
+
+LDV_INFOS LdvInfos = {
+ (short) sizeof(LDV_INFOS), /* Taille de cette structure */
+ TLDV_MODIFYIMG, /* Type du LDV */
+ "Jean Lusetti", /* Auteurs */
+ {
+ { 1, 1, BP_CAPS }, /* Capacites pour 1 plan */
+ { 4, 1, BP_CAPS }, /* Capacites pour 4 plans */
+ { 8, 1, BP_CAPS }, /* Capacites pour 8 plans */
+ { 16, 1, TC_CAPS }, /* Capacites pour 16 plans */
+ { 32, 1, TC_CAPS }, /* Capacites pour 32 plans */
+ { 0, 0, 0UL } /* Fin de la liste des capacites */
+ },
+ } ;
+
+VAPI* Vapi = NULL ;
+
+/* Petite macro de verification pour VAPI */
+#define CHECK_VAPI(vapi) if ( (vapi == NULL) || (vapi->Header.Version < 0x0109) ) return ELDV_BADVAPIVERSION ;
+
+
+/*
+ * Fonctions de la librairie
+ */
+
+LDV_INFOS* cdecl GetLDVCapabilities(VAPI* vapi)
+{
+ Vapi = vapi ;
+
+ return( &LdvInfos ) ;
+}
+
+#pragma warn -par
+LDV_STATUS cdecl PreRun(LDV_IMAGE* in, LDV_PARAMS* params, LDV_IMAGE* out)
+{
+ return ELDV_NOERROR ;
+}
+
+LDV_STATUS cdecl Run(LDV_IMAGE* in, LDV_PARAMS* params, LDV_IMAGE* out)
+{
+ LDV_STATUS status ;
+ short method, param, out_planes ;
+
+ CHECK_VAPI( Vapi ) ;
+
+ method = params->Param[0].s ;
+ param = params->Param[1].s ;
+ out_planes = params->Param[2].s ;
+ if ( out_planes <= 0 )
+ {
+ SCREEN_INFO sinfo ;
+
+ Vapi->CoGetScreenInfo( &sinfo ) ;
+ out_planes = sinfo.NPlanes ;
+ }
+ if ( (out_planes != 1) && (out_planes != 4) && (out_planes != 8) && (out_planes != 16) && (out_planes != 32) )
+ {
+ if ( out_planes > 32 ) out_planes = 32 ;
+ else if ( out_planes > 14 ) out_planes = 16 ; /* TC15 or TC16 */
+ else if ( out_planes > 8 ) out_planes = 8 ;
+ else if ( out_planes > 4 ) out_planes = 4 ;
+ else out_planes = 1 ;
+ if ( Vapi->LoDoLog ) Vapi->LoDoLog( LL_INFO, "LDVDither: nplanes %d not supported, changed to %d", params->Param[2].s, out_planes ) ;
+ }
+ out->Raster.fd_nplanes = out_planes ;
+
+ status = (LDV_STATUS) Vapi->ImDither( method, param, in, out ) ;
+ if ( status != 0 )
+ {
+ if ( Vapi->LoDoLog ) Vapi->LoDoLog( LL_WARNING, "LDVDither: ImDither returned %d", status ) ;
+ status = ELDV_GENERALFAILURE ;
+ }
+
+ return status ;
+}
+
+LDV_STATUS cdecl Preview(LDV_IMAGE* in, LDV_PARAMS* params, LDV_IMAGE* out)
+{
+ return( Run( in, params, out ) ) ;
+}
+#pragma warn +par
+
+
+int main(void)
+{
+ ldg_init( Ldg ) ;
+
+ return 0 ;
+}
diff --git a/tools/vision/ldv/src/dither/dither.ldv b/tools/vision/ldv/src/dither/dither.ldv
new file mode 100644
index 0000000..b440a3c
Binary files /dev/null and b/tools/vision/ldv/src/dither/dither.ldv differ
diff --git a/tools/vision/ldv/src/dither/dither.prj b/tools/vision/ldv/src/dither/dither.prj
new file mode 100644
index 0000000..19c20e4
--- /dev/null
+++ b/tools/vision/ldv/src/dither/dither.prj
@@ -0,0 +1,13 @@
+DITHER.LDV
+.C [ ]
+.S [ ]
+.L [ ]
+=
+pcstart.o
+DITHER.C
+pcgemlib.lib
+pcstdlib.lib
+pctoslib.lib
+pcfltlib.lib
+..\..\ldg.lib
+..\..\mt_aes.lib
\ No newline at end of file
diff --git a/tools/vision/ldv/src/dither/testplan.xlsx b/tools/vision/ldv/src/dither/testplan.xlsx
new file mode 100644
index 0000000..9c1af57
Binary files /dev/null and b/tools/vision/ldv/src/dither/testplan.xlsx differ
diff --git a/tools/vision/LDV/SRC/gamma/GAMMA.C b/tools/vision/ldv/src/gamma/gamma.c
similarity index 93%
rename from tools/vision/LDV/SRC/gamma/GAMMA.C
rename to tools/vision/ldv/src/gamma/gamma.c
index af21a2a..f5c2265 100644
--- a/tools/vision/LDV/SRC/gamma/GAMMA.C
+++ b/tools/vision/ldv/src/gamma/gamma.c
@@ -42,7 +42,7 @@ PROC Proc[] = {
char Info[] = "LDV";
LDGLIB Ldg[] = {
- 0x0100, /* version de la lib, recommand‚ */
+ 0x0101, /* version de la lib, recommand‚ */
4, /* nombre de fonction dans la lib */
Proc, /* Pointeurs vers nos fonctions */
Info, /* Information sur la lib */
@@ -94,7 +94,7 @@ LDV_INFOS * cdecl GetLDVCapabilities(VAPI *vapi)
#pragma warn -par
LDV_STATUS cdecl PreRun(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out)
{
- return( ELDV_NOERROR ) ;
+ return ELDV_NOERROR ;
}
double GammaFunc(double val, double val_max, double gamma)
@@ -133,9 +133,9 @@ LDV_STATUS cdecl Run(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out)
bgamma = params->Param[3].s / 100.0 ;
if ( in->Raster.fd_nplanes <= 8 )
{
- if ( vdi_palette == NULL ) return( ELDV_GENERALFAILURE ) ;
+ if ( vdi_palette == NULL ) return ELDV_GENERALFAILURE ;
vdi_epal = vdi_palette->Pal ;
- if ( vdi_epal == NULL ) return( ELDV_GENERALFAILURE ) ;
+ if ( vdi_epal == NULL ) return ELDV_GENERALFAILURE ;
for ( vdi_index = 0; vdi_index < vdi_palette->NbColors; vdi_index++, vdi_epal++ )
{
vdi_epal->Red = (short) ( 0.5 + GammaFunc( vdi_epal->Red, 1000.0, rgamma ) ) ;
@@ -150,7 +150,7 @@ LDV_STATUS cdecl Run(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out)
REMAP_COLORS rc ;
MFDB *img = &in->Raster ;
long *pt_line32, nb_pts_in_line ;
- short *pt_line16, y, pc, is_15bits, cancel=0 ;
+ short *pt_line16, y, pc, is_15bits ;
unsigned short nb_bits_red=8, nb_bits_green=8, nb_bits_blue=8 ; /* Sur 32 bits par defaut */
CHECK_VAPI(Vapi) ;
diff --git a/tools/vision/ldv/src/gamma/gamma.ldv b/tools/vision/ldv/src/gamma/gamma.ldv
new file mode 100644
index 0000000..c43a69f
Binary files /dev/null and b/tools/vision/ldv/src/gamma/gamma.ldv differ
diff --git a/tools/vision/LDV/SRC/gamma/GAMMA.PRJ b/tools/vision/ldv/src/gamma/gamma.prj
similarity index 77%
rename from tools/vision/LDV/SRC/gamma/GAMMA.PRJ
rename to tools/vision/ldv/src/gamma/gamma.prj
index 673407f..c883b92 100644
--- a/tools/vision/LDV/SRC/gamma/GAMMA.PRJ
+++ b/tools/vision/ldv/src/gamma/gamma.prj
@@ -1,6 +1,7 @@
GAMMA.LDV
-;.C[-Y- -G+]
-;.L[-Y-]
+.C [ ]
+.S [ ]
+.L [ ]
=
pcstart.o
GAMMA.C
diff --git a/tools/vision/ldv/src/genimg/genimg.c b/tools/vision/ldv/src/genimg/genimg.c
new file mode 100644
index 0000000..28f6034
--- /dev/null
+++ b/tools/vision/ldv/src/genimg/genimg.c
@@ -0,0 +1,173 @@
+#define PCGEMLIB 1 /* Set to 1 if PureC is used */
+
+#if PCGEMLIB
+#include
+#include
+#else
+#include
+#include
+#endif
+
+#include
+#include
+#include
+#include "..\..\ldg.h"
+#include "..\..\vapi.h"
+#include "..\..\ldv.h"
+
+/* Prototypes */
+LDV_INFOS* cdecl GetLDVCapabilities(VAPI* vapi) ;
+LDV_STATUS cdecl PreRun(LDV_IMAGE* in, LDV_PARAMS* params, LDV_IMAGE* out) ;
+LDV_STATUS cdecl Run(LDV_IMAGE* in, LDV_PARAMS* params, LDV_IMAGE* out) ;
+LDV_STATUS cdecl Preview(LDV_IMAGE* in, LDV_PARAMS* params, LDV_IMAGE* out) ;
+
+/* Variables globales */
+PROC Proc[] = {
+ "GetLDVCapabilities", "LDV capabilities", (void *)GetLDVCapabilities,
+ "PreRun", "Run initialization", (void *)PreRun,
+ "Run", "LDV operation", (void *)Run,
+ "Preview", "Pre-Visu", (void *)Preview,
+ } ;
+
+char Info[] = "LDV" ;
+
+LDGLIB Ldg[] = {
+ 0x0100, /* Lib version */
+ 4, /* Number of functions in lib */
+ Proc, /* Pointers to our functions */
+ Info, /* Lib information */
+ 0x0, /* Lib flags */
+ NULL, /* On exit, free VDI handle (unused) */
+ } ;
+
+#define CAPS (LDVF_ATARIFORMAT | LDVF_SUPPORTPREVIEW | LDVF_OPINPLACE | LDVF_NOSELECTION)
+
+LDV_INFOS LdvInfos = {
+ (short) sizeof(LDV_INFOS), /* size of this structure */
+ TLDV_MODIFYIMG, /* LDV Type */
+ "Jean Lusetti", /* Authors */
+ {
+ { 1, 1, CAPS }, /* 1 bitplane capabilities */
+ { 2, 2, CAPS }, /* 2 bitplane capabilities */
+ { 4, 4, CAPS }, /* 4 bitplane capabilities */
+ { 8, 8, CAPS }, /* 8 bitplane capabilities */
+ { 16, 16, CAPS }, /* 16 bitplane capabilities */
+/* Not yet { 24, 24, CAPS }, */
+ { 32, 32, CAPS }, /* 32 bitplane capabilities */
+ { 0, 0, 0UL } /* End of this list */
+ },
+ } ;
+
+VAPI* Vapi = NULL ;
+
+
+LDV_INFOS* cdecl GetLDVCapabilities(VAPI* vapi)
+{
+ Vapi = vapi ;
+
+ return( &LdvInfos ) ;
+}
+
+static LDV_STATUS GenMaxColors(MFDB* img)
+{
+ unsigned long nb = ((unsigned long)img->fd_wdwidth << 4) * (unsigned long) img->fd_h ;
+ unsigned long n ;
+
+ if ( img->fd_nplanes <= 8 )
+ {
+ MFDB tmp ;
+ unsigned char* pt_img ;
+ unsigned char* pt_after_img ;
+ unsigned char indexes[256] ; /* Array of indexes: 256 as max for 8 bitplanes */
+ short bitplanes[128] ; /* Transformation into bitplanes Atari */
+ unsigned long so_line ;
+ unsigned short ncol = 1 << img->fd_nplanes ;
+
+ memset( &tmp, 0, sizeof(MFDB) ) ;
+ tmp.fd_addr = bitplanes ; tmp.fd_nplanes = img->fd_nplanes ;
+ tmp.fd_w = ncol ; tmp.fd_h = 1 ;
+ for ( n = 0; n < 256; n++ ) indexes[n] = (unsigned char) n ;
+ Vapi->RaInd2RasterInit( &tmp, 256 ) ;
+ Vapi->RaInd2Raster( indexes, 256 ) ;
+ /* Fill in img MFDB with repetition of bitplanes buffer */
+ pt_img = img->fd_addr ;
+ so_line = 16UL*img->fd_wdwidth ;
+ so_line *= (unsigned long)img->fd_nplanes ;
+ so_line >>= 3 ; /* Size of a line in bytes */
+ pt_after_img = pt_img + so_line * (unsigned long)img->fd_h ;
+ Vapi->LoDoLog(LL_DEBUG, "genimg.ldv: pt_after_img=%p", pt_after_img ) ;
+ while ( pt_img < pt_after_img-256 )
+ {
+ Vapi->LoDoLog(LL_DEBUG, "genimg.ldv: pt_img=%p", pt_img ) ;
+ memcpy( pt_img, bitplanes, 256 ) ;
+ pt_img += 256 ;
+ }
+ }
+ else if ( img->fd_nplanes == 16 )
+ {
+ unsigned short* pt = img->fd_addr ;
+ unsigned short inc = (unsigned short) (nb / (1UL << 16)) ;
+ unsigned short val = 0 ;
+
+ if ( inc < 1 ) inc = 1 ;
+
+ for ( n = 0; n < nb; n++ )
+ {
+ *pt++ = val ;
+ val += inc ;
+ }
+ }
+ else if ( img->fd_nplanes == 32 )
+ {
+ unsigned long* pt = img->fd_addr ;
+ unsigned long inc = nb / (1UL << 24) ;
+ unsigned long val = 0 ;
+
+ if ( inc < 1 ) inc = 1 ;
+ inc <<= 8 ;
+
+ for ( n = 0; n < nb; n++ )
+ {
+ *pt++ = val ;
+ val += inc ;
+ }
+ }
+
+ return ELDV_NOERROR ;
+}
+
+#pragma warn -par
+LDV_STATUS cdecl PreRun(LDV_IMAGE* in, LDV_PARAMS* params, LDV_IMAGE* out)
+{
+ return ELDV_NOERROR ;
+}
+
+LDV_STATUS cdecl Run(LDV_IMAGE* in, LDV_PARAMS* params, LDV_IMAGE* out)
+{
+ LDV_STATUS status ;
+
+ switch( params->Param[0].s )
+ {
+ case 1: /* Generate an image with as many colors as possible */
+ status = GenMaxColors( &in->Raster ) ;
+ break ;
+
+ default: status = ELDV_INVALIDPARAMETER ;
+ break ;
+ }
+
+ return status ;
+}
+#pragma warn +par
+
+LDV_STATUS cdecl Preview(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out)
+{
+ return( Run( in, params, out ) ) ;
+}
+
+int main(void)
+{
+ ldg_init( Ldg ) ;
+
+ return 0 ;
+}
diff --git a/tools/vision/ldv/src/genimg/genimg.ldv b/tools/vision/ldv/src/genimg/genimg.ldv
new file mode 100644
index 0000000..db2f06e
Binary files /dev/null and b/tools/vision/ldv/src/genimg/genimg.ldv differ
diff --git a/tools/vision/ldv/src/genimg/genimg.prj b/tools/vision/ldv/src/genimg/genimg.prj
new file mode 100644
index 0000000..7a3e792
--- /dev/null
+++ b/tools/vision/ldv/src/genimg/genimg.prj
@@ -0,0 +1,12 @@
+GENIMG.LDV
+.C [ ]
+.S [ ]
+.L [ ]
+=
+pcstart.o
+GENIMG.C
+pcgemlib.lib
+pcstdlib.lib
+pctoslib.lib
+..\..\ldg.lib
+..\..\mt_aes.lib
\ No newline at end of file
diff --git a/tools/vision/LDV/SRC/INVERT/INVERT.C b/tools/vision/ldv/src/invert/invert.c
similarity index 95%
rename from tools/vision/LDV/SRC/INVERT/INVERT.C
rename to tools/vision/ldv/src/invert/invert.c
index 0890e9a..321ca66 100644
--- a/tools/vision/LDV/SRC/INVERT/INVERT.C
+++ b/tools/vision/ldv/src/invert/invert.c
@@ -42,7 +42,7 @@ PROC Proc[] = {
char Info[] = "LDV";
LDGLIB Ldg[] = {
- 0x0100, /* version de la lib, recommand‚ */
+ 0x0101, /* version de la lib, recommand‚ */
4, /* nombre de fonction dans la lib */
Proc, /* Pointeurs vers nos fonctions */
Info, /* Information sur la lib */
diff --git a/tools/vision/ldv/src/invert/invert.ldv b/tools/vision/ldv/src/invert/invert.ldv
new file mode 100644
index 0000000..911f6be
Binary files /dev/null and b/tools/vision/ldv/src/invert/invert.ldv differ
diff --git a/tools/vision/LDV/SRC/INVERT/INVERT.PRJ b/tools/vision/ldv/src/invert/invert.prj
similarity index 75%
rename from tools/vision/LDV/SRC/INVERT/INVERT.PRJ
rename to tools/vision/ldv/src/invert/invert.prj
index 46db0fd..58215c1 100644
--- a/tools/vision/LDV/SRC/INVERT/INVERT.PRJ
+++ b/tools/vision/ldv/src/invert/invert.prj
@@ -1,6 +1,7 @@
invert.ldv
-;.C[-Y- -G+]
-;.L[-Y-]
+.C [ ]
+.S [ ]
+.L [ ]
=
pcstart.o
invert.c
diff --git a/tools/vision/LDV/SRC/light/LIGHT.C b/tools/vision/ldv/src/light/light.c
similarity index 95%
rename from tools/vision/LDV/SRC/light/LIGHT.C
rename to tools/vision/ldv/src/light/light.c
index 739c791..2545538 100644
--- a/tools/vision/LDV/SRC/light/LIGHT.C
+++ b/tools/vision/ldv/src/light/light.c
@@ -41,7 +41,7 @@ PROC Proc[] = {
char Info[] = "LDV";
LDGLIB Ldg[] = {
- 0x0101, /* version de la lib, recommand‚ */
+ 0x0102, /* version de la lib, recommand‚ */
4, /* nombre de fonction dans la lib */
Proc, /* Pointeurs vers nos fonctions */
Info, /* Information sur la lib */
@@ -151,7 +151,7 @@ LDV_STATUS cdecl Run(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out)
REMAP_COLORS rc ;
MFDB *img = &in->Raster ;
long *pt_line32, nb_pts_in_line ;
- short *pt_line16, y, pc, is_15bits, cancel=0 ;
+ short *pt_line16, y, pc, is_15bits ;
unsigned short nb_bits_red=8, nb_bits_green=8, nb_bits_blue=8 ; /* Sur 32 bits par defaut */
CHECK_VAPI(Vapi) ;
diff --git a/tools/vision/ldv/src/light/light.ldv b/tools/vision/ldv/src/light/light.ldv
new file mode 100644
index 0000000..ef811a2
Binary files /dev/null and b/tools/vision/ldv/src/light/light.ldv differ
diff --git a/tools/vision/LDV/SRC/light/LIGHT.PRJ b/tools/vision/ldv/src/light/light.prj
similarity index 77%
rename from tools/vision/LDV/SRC/light/LIGHT.PRJ
rename to tools/vision/ldv/src/light/light.prj
index bcee124..4b77118 100644
--- a/tools/vision/LDV/SRC/light/LIGHT.PRJ
+++ b/tools/vision/ldv/src/light/light.prj
@@ -1,6 +1,7 @@
LIGHT.LDV
-;.C[-Y- -G+]
-;.L[-Y-]
+.C [ ]
+.S [ ]
+.L [ ]
=
pcstart.o
LIGHT.C
diff --git a/tools/vision/ldv/src/optimg/optimg.c b/tools/vision/ldv/src/optimg/optimg.c
new file mode 100644
index 0000000..96c04d9
--- /dev/null
+++ b/tools/vision/ldv/src/optimg/optimg.c
@@ -0,0 +1,552 @@
+/*
+ *
+ *
+ * Version PureC / Gcc
+ */
+
+#define PCGEMLIB 1 /* mettre 1 si les utilisateurs de Pure C
+ * utilise les librairies GEM Pure C */
+
+/* Fichiers headers */
+
+#include
+#include
+#if PCGEMLIB
+#include
+#include
+#else
+#include
+#include
+#endif
+
+#include
+#include
+#include "..\..\ldg.h"
+#include "..\..\vapi.h"
+#include "..\..\ldv.h"
+#include "..\..\mt_aes.h"
+
+/* Prototypages */
+LDV_INFOS* cdecl GetLDVCapabilities(VAPI *vapi) ;
+LDV_STATUS cdecl Run(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out) ;
+
+typedef struct _ANALYSIS_DATA
+{
+ /* Internal data during analysis */
+ unsigned char* pixel ; /* Pixel under analysis */
+ long add_pixel ; /* Offset to next pixel to analyze */
+
+ /* For indexes */
+ short* pt_img ;
+
+ long npixels_sofar ;
+ long npixels_add ;
+ long npixels_total ;
+}
+ANALYSIS_DATA, *PANALYSIS_DATA ;
+
+/* This is our structure to held image data */
+/* And analyze outcome */
+typedef struct _IMG_REPORT
+{
+ /* Inputs */
+ LDV_IMAGE* in ;
+ char* profile ;
+ char save_options[6][32] ; /* 0: 1 plane, 1: 4 planes, 2:8 planes, 3:16 planes, 4:24 planes, 5:32 planes */
+ unsigned char limit_black ;
+ unsigned char limit_white ;
+ unsigned char diff_grey ;
+ unsigned char enforce_smaller ;
+ short enforce_dither ;
+ short dither_method ;
+ short dither_outplanes ;
+ short dither_param ;
+
+ ANALYSIS_DATA d ;
+
+ /* Outcome */
+ char is_dualtone ;
+ char is_grey ;
+ long ncolors ;
+}
+IMG_REPORT, *PIMG_REPORT ;
+
+/* Variables globales */
+PROC Proc[] = {
+ "GetLDVCapabilities", "LDV capabilties", (void *)GetLDVCapabilities,
+/* No preRun "PreRun", "Before Run", (void *)PreRun, */
+ "Run", "LDV routine", (void *)Run,
+/* No preview "Preview", "Preview", (void *)Preview, */
+ } ;
+
+char Info[] = "LDV";
+
+LDGLIB Ldg[] = {
+ 0x0102, /* version de la lib, recommand‚ */
+ 2, /* nombre de fonction dans la lib */
+ Proc, /* Pointeurs vers nos fonctions */
+ Info, /* Information sur la lib */
+ 0x0, /* Flags de la lib, obligatoire */
+ NULL,
+ };
+
+#define CAPS (LDVF_ATARIFORMAT | LDVF_OPINPLACE | LDVF_SUPPORTPROG | LDVF_SUPPORTCANCEL | LDVF_NOSELECTION | LDVF_NOCHANGE)
+
+/* Note that for this LDV, no matter what is returned as #nplanes for output */
+/* As no LDV_IMAGE is returned, a file is generated */
+LDV_INFOS LdvInfos = {
+ (short) sizeof(LDV_INFOS), /* Taille de cette structure */
+ TLDV_MODIFYIMG, /* Type du LDV */
+ "Jean Lusetti", /* Auteurs */
+ {
+ { 1, 1, CAPS }, /* Capacites pour 1 plan */
+ { 4, 1, CAPS }, /* Capacites pour 4 plans */
+ { 8, 1, CAPS }, /* Capacites pour 8 plans */
+ { 16, 1, CAPS }, /* Capacites pour 16 plans */
+ { 32, 1, CAPS }, /* Capacites pour 32 plans */
+ { 0, 0, 0UL } /* Fin de la liste des capacites */
+ },
+ } ;
+
+VAPI* Vapi = NULL ;
+
+/* VAPI macro check */
+#define CHECK_VAPI(vapi) if ( (vapi == NULL) || (vapi->Header.Version < 0x0109) ) return ELDV_BADVAPIVERSION ;
+
+unsigned char u5bto8b[32] ;
+unsigned char u6bto8b[64] ;
+
+/*
+ * Fonctions de la librairie
+ */
+
+LDV_INFOS* cdecl GetLDVCapabilities(VAPI* vapi)
+{
+ Vapi = vapi ;
+
+ return( &LdvInfos ) ;
+}
+
+static void GetDefaultSaveOptions(IMG_REPORT* img_report)
+{
+ strcpy( &img_report->save_options[0][0], "fmt=TIF;compression=lzw" ) ; /* 1 Plane */
+ strcpy( &img_report->save_options[1][0], "fmt=TIF;compression=lzw" ) ; /* 4 Planes */
+ strcpy( &img_report->save_options[2][0], "fmt=TIF;compression=lzw" ) ; /* 8 Planes */
+ strcpy( &img_report->save_options[3][0], "fmt=JPG;quality=90" ) ; /* 16 Planes */
+ strcpy( &img_report->save_options[4][0], "fmt=JPG;quality=90" ) ; /* 24 Planes */
+ strcpy( &img_report->save_options[5][0], "fmt=JPG;quality=90" ) ; /* 32 Planes */
+}
+
+static short LoadProfile(IMG_REPORT* img_report)
+{
+ long profile_found = 0 ;
+ short i ;
+ char* path_ldv ;
+ char* language ;
+ char* keys[] = { "1", "4", "8", "16", "24", "32" } ;
+
+ if ( img_report->profile == NULL ) return -1 ;
+
+ path_ldv = Vapi->CoGetLDVPath() ;
+ language = Vapi->CoGetCurrentLanguage() ;
+ if ( path_ldv && language )
+ {
+ long found ;
+ char filename[256] ;
+ char buffer[128] ;
+
+ sprintf( filename, "%s\\%s\\OPTIMG.INI", path_ldv, language ) ;
+ Vapi->LoDoLog(LL_INFO,"optimg.ldv: Looking into %s to find profile %s", filename, img_report->profile) ;
+ for ( i = 0; i < ARRAY_SIZE(keys); i++ )
+ if ( !profile_found ) profile_found = Vapi->InGetKeyFromFile( filename, img_report->profile, keys[i], &img_report->save_options[i][0] ) ;
+ if ( !profile_found )
+ {
+ sprintf( filename, "%s\\OPTIMG.INI", path_ldv ) ;
+ Vapi->LoDoLog(LL_INFO,"optimg.ldv: Looking into %s to find profile %s", filename, img_report->profile) ;
+ Vapi->LoDoLog(LL_INFO,"optimg.ldv: Looking into non language specific %s to find profile %s ...", filename, img_report->profile) ;
+ for ( i = 0; i < ARRAY_SIZE(keys); i++ )
+ profile_found = Vapi->InGetKeyFromFile( filename, img_report->profile, keys[i], &img_report->save_options[i][0] ) ;
+ }
+ found = Vapi->InGetKeyFromFile( filename, img_report->profile, "limit_black", buffer ) ;
+ if ( found ) img_report->limit_black = (unsigned char) atoi( buffer ) ;
+ else img_report->limit_black = 0 ;
+ found = Vapi->InGetKeyFromFile( filename, img_report->profile, "limit_white", buffer ) ;
+ if ( found ) img_report->limit_white = (unsigned char) atoi( buffer ) ;
+ else img_report->limit_white = 255 ;
+ found = Vapi->InGetKeyFromFile( filename, img_report->profile, "diff_grey", buffer ) ;
+ if ( found ) img_report->diff_grey = (unsigned char) atoi( buffer ) ;
+ else img_report->diff_grey = 0 ;
+ found = Vapi->InGetKeyFromFile( filename, img_report->profile, "enforce_smaller", buffer ) ;
+ if ( found ) img_report->enforce_smaller = (unsigned char) atoi( buffer ) ;
+ else img_report->enforce_smaller = 0 ;
+
+ /* Keys to enforce dither method */
+ found = Vapi->InGetKeyFromFile( filename, img_report->profile, "enforce_dither", buffer ) ;
+ if ( found ) img_report->enforce_dither = (short) atoi( buffer ) ;
+ else img_report->enforce_dither = 0 ;
+ if ( img_report->enforce_dither )
+ {
+ found = Vapi->InGetKeyFromFile( filename, img_report->profile, "dither_method", buffer ) ;
+ if ( found ) img_report->dither_method = (short) atoi( buffer ) ;
+ else img_report->dither_method = 0 ;
+ found = Vapi->InGetKeyFromFile( filename, img_report->profile, "dither_outplanes", buffer ) ;
+ if ( found ) img_report->dither_outplanes = (short) atoi( buffer ) ;
+ else img_report->dither_outplanes = 0 ;
+ found = Vapi->InGetKeyFromFile( filename, img_report->profile, "dither_param", buffer ) ;
+ if ( found ) img_report->dither_param = (short) atoi( buffer ) ;
+ else img_report->dither_param = 0 ;
+ }
+ }
+ else Vapi->LoDoLog(LL_WARNING,"optimg.ldv: Can't access LDV (%s) or language path (%s)!", path_ldv, language) ;
+
+ return !profile_found ; /* 0 if found */
+}
+
+static long md_grey(long abs_diff, long max_diff)
+{
+ if ( abs_diff > max_diff ) return abs_diff ;
+ else return max_diff ;
+}
+
+static void fast_isgrey(IMG_REPORT* img_report)
+{
+ /* Quick check to see if all pixels in diagonal are grey */
+ MFDB* in = &img_report->in->Raster ;
+ long add_pixel = (in->fd_nplanes >> 3) ;
+ unsigned char* pixel = in->fd_addr ;
+ unsigned short pix16, diff_grey = img_report->diff_grey ;
+ short h ;
+ unsigned char r, g, b ;
+
+ add_pixel += add_pixel*16L*(long)in->fd_wdwidth ; /* Offset to next pixel in diagonal */
+ for( h = 0 ; img_report->is_grey && (h < in->fd_h-1); h++, pixel += add_pixel )
+ {
+ if ( in->fd_nplanes == 16 )
+ {
+ pix16 = *pixel ; /* RRRRRGGGGGGBBBBB*/
+ r = u5bto8b[pix16 >> 11] ; /* Value on 5 bits remapped to 8 bits */
+ g = u6bto8b[(pix16 >> 5) & 0x1F] ; /* Value on 6 bits remapped to 8 bits */
+ b = u5bto8b[pix16 & 0x1F] ; /* Value on 5 bits remapped to 8 bits */
+ }
+ else
+ {
+ r = pixel[0] ;
+ g = pixel[1] ;
+ b = pixel[2] ;
+ }
+ if ( abs( r-g ) > diff_grey ) img_report->is_grey = 0 ;
+ else if ( abs( r-b ) > diff_grey ) img_report->is_grey = 0 ;
+ else if ( abs( g-b ) > diff_grey ) img_report->is_grey = 0 ;
+ }
+
+ if ( !img_report->is_grey )
+ {
+ if ( in->fd_nplanes == 16 ) Vapi->LoDoLog(LL_INFO,"optimg.ldv: fast_isgrey, not grey: %d %d %d (%X)", (short)r, (short)g, (short)b, pix16) ;
+ else Vapi->LoDoLog(LL_INFO,"optimg.ldv: fast_isgrey, not grey: %d %d %d", (short)r, (short)g, (short)b) ;
+ }
+}
+
+static short AnalyzeFromVISION(IMG_REPORT* img_report)
+{
+ HISTO histo ;
+ short status ;
+
+ Vapi->LoDoLog(LL_INFO,"optimg.ldv: Requesting VISION to compute histogram...") ;
+ Vapi->PrSetText( 1, "Requesting histograms to VISION..." ) ;
+ histo.norm = 256 ; /* Normalize stats to 0...256 scale */
+ status = Vapi->ImComputeHistogram( img_report->in, &histo ) ;
+ Vapi->LoDoLog(LL_INFO,"optimg.ldv: histogram done with status %d", status) ;
+ if ( status == 0 )
+ {
+ long max_diff_grey = 0 ;
+ long r, g, b, ref_diff_grey ;
+ short i, grey1 = 0 ;
+
+ ref_diff_grey = img_report->diff_grey ;
+ for ( i = 0; img_report->is_grey && (i < HISTO_SIZE); i++ )
+ {
+ r = histo.red[i] ;
+ g = histo.green[i] ;
+ b = histo.blue[i] ;
+ max_diff_grey = md_grey( labs( r-g ), max_diff_grey ) ;
+ max_diff_grey = md_grey( labs( r-b ), max_diff_grey ) ;
+ max_diff_grey = md_grey( labs( g-b ), max_diff_grey ) ;
+ if ( max_diff_grey > ref_diff_grey ) img_report->is_grey = 0 ;
+ }
+ Vapi->LoDoLog(LL_INFO,"optimg.ldv: max difference grey=%ld", max_diff_grey) ;
+
+ /* As histogram will report "perfect grey" if image has colors fully aligned (i.e. full 16M picture), let's make a fast check on grey levels */
+ if ( img_report->is_grey && (img_report->in->Raster.fd_nplanes > 8) )
+ {
+ fast_isgrey( img_report ) ;
+ if ( img_report->is_grey ) grey1 = 1 ;
+ }
+ if ( !img_report->is_grey )
+ {
+ i-- ;
+ Vapi->LoDoLog(LL_INFO,"optimg.ldv: image is not grey level and so not dual-tone") ;
+ if ( grey1 ) Vapi->LoDoLog(LL_INFO,"optimg.ldv: RGB[%d]=%ld,%ld,%ld", i, r, g, b) ;
+ img_report->is_dualtone = 0 ;
+ }
+ else if ( img_report->limit_black < img_report->limit_white )
+ {
+ for ( i = img_report->limit_black; img_report->is_dualtone && (i < img_report->limit_white); i++ )
+ {
+ if ( histo.grey[i] > ref_diff_grey ) img_report->is_dualtone = 0 ;
+ }
+ if ( !img_report->is_dualtone )
+ {
+ i-- ;
+ Vapi->LoDoLog(LL_INFO,"optimg.ldv: image is not dual tone") ;
+ Vapi->LoDoLog(LL_INFO,"optimg.ldv: Grey[%d]=%ld", i, histo.grey[i]) ;
+ }
+ }
+ img_report->ncolors = histo.nb_colors_used ;
+ }
+
+ return status ;
+}
+
+static LDV_STATUS ImgAnalyze(IMG_REPORT* img_report)
+{
+ LDV_IMAGE* in = img_report->in ;
+ short status ;
+
+ img_report->is_dualtone = 1 ;
+ img_report->is_grey = 1 ;
+
+ if ( LoadProfile( img_report ) != 0 )
+ {
+ /* For some reason, profile is not found */
+ /* Let's defaut to TIF/JPEG outputs */
+ Vapi->LoDoLog(LL_INFO, "optimg.ldv: getting hard-coded default profile") ;
+ GetDefaultSaveOptions( img_report ) ;
+ }
+
+ if ( in->Raster.fd_nplanes == 1 ) return 1 ;
+
+ Vapi->LoDoLog(LL_INFO, "optimg.ldv: image is %dx%dx%d", in->Raster.fd_w, in->Raster.fd_h, in->Raster.fd_nplanes) ;
+ Vapi->LoDoLog(LL_INFO, "optimg.ldv: ImgAnalyze enforce_smaller = %d", (short)img_report->enforce_smaller) ;
+ Vapi->LoDoLog(LL_INFO, "optimg.ldv: ImgAnalyze limit_black = %d", (short)img_report->limit_black) ;
+ Vapi->LoDoLog(LL_INFO, "optimg.ldv: ImgAnalyze limit_white = %d", (short)img_report->limit_white) ;
+ Vapi->LoDoLog(LL_INFO, "optimg.ldv: ImgAnalyze diff_grey = %d", (short)img_report->diff_grey) ;
+ Vapi->LoDoLog(LL_INFO, "optimg.ldv: ImgAnalyze enforce_dither = %d", (short)img_report->enforce_dither) ;
+ if ( img_report->enforce_dither )
+ {
+ Vapi->LoDoLog(LL_INFO, "optimg.ldv: ImgAnalyze method = %d", (short)img_report->dither_method) ;
+ Vapi->LoDoLog(LL_INFO, "optimg.ldv: ImgAnalyze outplanes = %d", (short)img_report->dither_outplanes) ;
+ Vapi->LoDoLog(LL_INFO, "optimg.ldv: ImgAnalyze param = %d", (short)img_report->dither_param) ;
+ }
+
+ if ( img_report->enforce_dither )
+ {
+ Vapi->LoDoLog(LL_INFO,"optimg.ldv: profile enforces dither method=%d, outplanes=%d, param=%d", img_report->dither_method, img_report->dither_outplanes, img_report->dither_param ) ;
+ status = 1 ;
+ }
+ else
+ {
+ status = ( AnalyzeFromVISION( img_report ) == 0 ) ;
+ if ( img_report->is_grey ) { Vapi->LoDoLog(LL_INFO,"optimg.ldv: image is grey level") ; status = 1 ; }
+ if ( img_report->is_dualtone ) { Vapi->LoDoLog(LL_INFO,"optimg.ldv: image is dual tone") ; status = 1 ; }
+ Vapi->LoDoLog(LL_INFO,"optimg.ldv: %ld colors found", img_report->ncolors) ;
+ }
+
+ return status ;
+}
+
+static char* GetSaveOptions(IMG_REPORT* img_report, short nplanes)
+{
+ short planes[] = { 1, 4, 8, 16, 24, 32 } ;
+ short i ;
+ char* save_options = NULL ;
+
+ for ( i = 0; (save_options == NULL) && (i < ARRAY_SIZE(planes)); i++ )
+ if ( planes[i] == nplanes ) save_options = &img_report->save_options[i][0] ;
+
+ Vapi->LoDoLog(LL_INFO, "optimg.ldv: GetSaveOptions(%d planes): %s", nplanes, save_options ? save_options:NULL) ;
+ return save_options ;
+}
+
+static char* GetBestImgMatch(IMG_REPORT* img_report, long* method, long* param, LDV_IMAGE* out)
+{
+ LDV_IMAGE* in = img_report->in ;
+
+ out->Raster.fd_nplanes = in->Raster.fd_nplanes ;
+ *method = -1 ;
+ *param = 0 ;
+
+ if ( img_report->enforce_dither )
+ {
+ out->Raster.fd_nplanes = img_report->dither_outplanes ;
+ *method = img_report->dither_method ;
+ *param = img_report->dither_param ;
+ }
+ else if ( img_report->is_dualtone )
+ {
+ out->Raster.fd_nplanes = 1 ;
+ *method = 4 ;
+ *param = 50 ;
+ }
+ else if ( img_report->is_grey )
+ {
+ out->Raster.fd_nplanes = (img_report->ncolors <= 16L) ? 4:8 ;
+ *method = 2 ;
+ }
+ else if ( img_report->ncolors < 2048L )
+ {
+ if ( in->Raster.fd_nplanes > 8 )
+ {
+ out->Raster.fd_nplanes = 8 ;
+ *method = 3 ;
+ }
+ }
+
+ return GetSaveOptions( img_report, out->Raster.fd_nplanes ) ;
+}
+
+static long file_size(char* name)
+{
+ FILE* stream = fopen( name, "rb" ) ;
+ long size ;
+
+ if ( stream == NULL ) return -1 ;
+
+ fseek( stream, 0, SEEK_END ) ;
+ size = ftell( stream ) ;
+ fclose( stream ) ;
+
+ return size ;
+}
+
+LDV_STATUS cdecl Run(LDV_IMAGE* in, LDV_PARAMS* params, LDV_IMAGE* out)
+{
+ LDV_STATUS status = ELDV_NOERROR ;
+ IMG_REPORT img_report ;
+ short copy_file = 1 ; /* In case we don't find a better choice than the current one */
+ char in_file[256] ;
+ char out_file[256] ;
+ char buf[256] ;
+ char* pout_file ;
+ char* profile ;
+
+ CHECK_VAPI( Vapi ) ;
+
+ pout_file = params->Param[0].str ;
+ profile = params->Param[1].str ;
+ Vapi->LoDoLog(LL_INFO, "optimg.ldv: dest:%s, profile=%s", pout_file ? pout_file:"", profile ? profile:"") ;
+ if ( pout_file == NULL ) return ELDV_INVALIDPARAMETER ;
+
+ status = Vapi->ImGetStdData( in, "filename", in_file, sizeof(in_file) ) ;
+ if ( !LDV_SUCCESS( status ) ) return status ;
+
+ strcpy( out_file, pout_file ) ;
+ if ( Vapi->FiFolderExist( pout_file ) )
+ {
+ char* last_slash = strrchr( in_file, '\\' ) ;
+
+ Vapi->LoDoLog(LL_INFO, "optimg.ldv: %s is a folder", pout_file ) ;
+ if ( last_slash ) strcat( out_file, last_slash ) ; /* Just copy filename without folder before */
+ else strcat( out_file, in_file ) ;
+ }
+
+ sprintf( buf, "Analyzing %s...", in_file ) ;
+ Vapi->PrSetText( 0, buf ) ;
+ Vapi->PrSetText( 1, "Requesting histograms to VISION..." ) ;
+ if ( LDVPROG_CANCEL( Vapi->PrSetProgEx( 0 ) ) ) { Vapi->LoDoLog(LL_INFO, "optimg.ldv: user requested cancel") ; return ELDV_CANCELLED ; }
+ memset( &img_report, 0, sizeof(img_report) ) ;
+ img_report.in = in ;
+ img_report.profile = profile ;
+ if ( ImgAnalyze( &img_report ) == 1 )
+ {
+ long method, param ;
+ char* save_options ;
+
+ save_options = GetBestImgMatch( &img_report, &method, ¶m, out ) ;
+ if ( save_options )
+ {
+ Vapi->LoDoLog(LL_INFO,"optimg.ldv: dither method=%ld", method) ;
+ sprintf( buf, "Optimizing %s...", in_file ) ;
+ Vapi->PrSetText( 0, buf ) ;
+ Vapi->PrSetText( 1, "Requesting dithering to VISION..." ) ;
+ if ( LDVPROG_CANCEL( Vapi->PrSetProgEx( 33 ) ) ) status = ELDV_CANCELLED ;
+ else if ( method != -1 ) status = Vapi->ImDither( method, param, in, out ) ;
+ if ( LDV_SUCCESS( status ) )
+ {
+ char local_outfile[256] ; /* As we have to set the format as extension */
+ char buffer[128] ;
+ char out_ext[16] ;
+ char* c ;
+ char* ext ;
+
+ if ( method != -1 ) Vapi->ImFree( in ) ; /* We just dither the image sucessfully, let's free the original one */
+ else memcpy( out, in, sizeof(LDV_IMAGE) ) ;
+ if ( sscanf( save_options, "fmt=%s", buffer ) == 1 ) /* format is the first field returned by GetBestImgMatch */
+ {
+ c = strchr( buffer, ';' ) ;
+ if ( c ) { *c = 0 ; strcpy( out_ext, buffer ) ; }
+ else strcpy( out_ext, buffer ) ;
+ strcpy( local_outfile, out_file ) ;
+ c = strrchr( local_outfile, '\\' ) ;
+ if ( c ) ext = strrchr( 1+c, '.' ) ;
+ else ext = strrchr( local_outfile, '.' ) ;
+ if ( ext ) *(1+ext) = 0 ;
+ if ( c ) strcat( 1+c, out_ext ) ;
+ Vapi->LoDoLog(LL_INFO, "optimg.ldv: optimizing image file %s to %s with options: %s", in_file, local_outfile, save_options ) ;
+ Vapi->PrSetText( 1, "Requesting saving to VISION..." ) ;
+ if ( LDVPROG_CANCEL( Vapi->PrSetProgEx( 66 ) ) ) status = ELDV_CANCELLED ;
+ else status = Vapi->ImSave( local_outfile, out, save_options ) ;
+ if ( LDV_SUCCESS( status ) )
+ {
+ if ( img_report.enforce_smaller )
+ {
+ long l1, l2 ;
+
+ l1 = file_size( in_file ) ;
+ l2 = file_size( local_outfile ) ;
+ if ( (l2 > 0) && (l1 > l2) ) copy_file = 0 ;
+ else { unlink( local_outfile ) ; Vapi->LoDoLog(LL_INFO, "optimg.ldv: optimized file is bigger (%ldKB vs %ldKB), keeping original one", l1>>10, l2>>10 ) ; }
+ }
+ else copy_file = 0 ;
+ }
+ else { Vapi->LoDoLog(LL_ERROR, "optimg.ldv: ImSave returned %ld", status ) ; status = ELDV_GENERALFAILURE ; }
+ }
+ else { Vapi->LoDoLog(LL_ERROR, "optimg.ldv: image format not found in save options %s", save_options ) ; status = ELDV_GENERALFAILURE ; }
+ }
+ else Vapi->LoDoLog(LL_ERROR, "optimg.ldv: ImDither returned %ld", status ) ;
+ }
+ else Vapi->LoDoLog(LL_INFO, "optimg.ldv: can't find a better setting" ) ;
+ }
+ else Vapi->LoDoLog(LL_INFO, "optimg.ldv: ImgAnalyze did not identify a possible optimization" ) ;
+
+ if ( status == ELDV_CANCELLED ) Vapi->LoDoLog(LL_INFO, "optimg.ldv: user requested cancel") ;
+ else if ( copy_file )
+ {
+ Vapi->LoDoLog(LL_INFO, "optimg.ldv: duplicating image file %s to %s", in_file, out_file ) ;
+ Vapi->PrSetText( 1, "Duplicating original file..." ) ;
+ Vapi->PrSetProgEx( 85 ) ;
+ status = Vapi->FiCopyFileR( in_file, out_file ) ;
+ if ( !LDV_SUCCESS( status ) )
+ {
+ Vapi->LoDoLog(LL_ERROR, "optimg.ldv: FiCopyFileR returned %ld", status ) ;
+ status = ELDV_GENERALFAILURE ;
+ }
+ }
+ Vapi->PrSetText( 1, "" ) ;
+
+ return status ;
+}
+
+static void uinit()
+{
+ short i ;
+
+ for ( i = 0; i < 32; i++ ) u5bto8b[i] = (unsigned char) (0.5+(i*256.0)/32.0) ;
+ for ( i = 0; i < 64; i++ ) u6bto8b[i] = (unsigned char) (0.5+(i*256.0)/64.0) ;
+}
+
+int main(void)
+{
+ ldg_init( Ldg ) ;
+
+ return 0 ;
+}
diff --git a/tools/vision/ldv/src/optimg/optimg.ldv b/tools/vision/ldv/src/optimg/optimg.ldv
new file mode 100644
index 0000000..7b3973c
Binary files /dev/null and b/tools/vision/ldv/src/optimg/optimg.ldv differ
diff --git a/tools/vision/ldv/src/optimg/optimg.prj b/tools/vision/ldv/src/optimg/optimg.prj
new file mode 100644
index 0000000..a0e9cef
--- /dev/null
+++ b/tools/vision/ldv/src/optimg/optimg.prj
@@ -0,0 +1,13 @@
+OPTIMG.LDV
+.C [ ]
+.S [ ]
+.L [ ]
+=
+pcstart.o
+OPTIMG.C
+pcgemlib.lib
+pcstdlib.lib
+pctoslib.lib
+pcfltlib.lib
+..\..\ldg.lib
+..\..\mt_aes.lib
\ No newline at end of file
diff --git a/tools/vision/LDV/SRC/PIXEL/PIXEL.C b/tools/vision/ldv/src/pixel/pixel.c
similarity index 94%
rename from tools/vision/LDV/SRC/PIXEL/PIXEL.C
rename to tools/vision/ldv/src/pixel/pixel.c
index 11b314d..14b6dfb 100644
--- a/tools/vision/LDV/SRC/PIXEL/PIXEL.C
+++ b/tools/vision/ldv/src/pixel/pixel.c
@@ -29,7 +29,6 @@ LDV_INFOS * cdecl GetLDVCapabilities(VAPI *vapi) ;
LDV_STATUS cdecl PreRun(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out) ;
LDV_STATUS cdecl Run(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out) ;
LDV_STATUS cdecl Preview(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out) ;
-LDV_STATUS cdecl GetParams(LDV_IMAGE *in, LDV_PARAMS *params, char *path) ;
/* Variables globales */
PROC Proc[] = {
@@ -42,7 +41,7 @@ PROC Proc[] = {
char Info[] = "LDV";
LDGLIB Ldg[] = {
- 0x0100, /* version de la lib, recommand‚ */
+ 0x0101, /* version de la lib, recommand‚ */
4, /* nombre de fonction dans la lib */
Proc, /* Pointeurs vers nos fonctions */
Info, /* Information sur la lib */
@@ -165,7 +164,7 @@ LDV_STATUS Run16(LDV_IMAGE *in, LDV_PARAMS *params)
power = params->Param[0].s ;
po2 = power * power ;
nb_lpts = in->Raster.fd_w ;
- if ( nb_lpts % 16 ) nb_lpts++ ;
+ if ( nb_lpts & 0x0F ) nb_lpts++ ;
yoffset = nb_lpts * (long)(params->y1) ;
for ( y = params->y1; !cancel && (y < params->y2); y += power, yoffset += nb_lpts*power )
{
@@ -256,7 +255,7 @@ LDV_STATUS Run32(LDV_IMAGE *in, LDV_PARAMS *params)
power = params->Param[0].s ;
po2 = power * power ;
nb_lpts = in->Raster.fd_w ;
- if ( nb_lpts % 16 ) nb_lpts++ ;
+ if ( nb_lpts & 0x0F ) nb_lpts++ ;
yoffset = nb_lpts * (long)(params->y1) ;
for ( y = params->y1; !cancel && (y < params->y2); y += power, yoffset += nb_lpts*power )
{
diff --git a/tools/vision/ldv/src/pixel/pixel.ldv b/tools/vision/ldv/src/pixel/pixel.ldv
new file mode 100644
index 0000000..153de7b
Binary files /dev/null and b/tools/vision/ldv/src/pixel/pixel.ldv differ
diff --git a/tools/vision/LDV/SRC/PIXEL/PIXEL.PRJ b/tools/vision/ldv/src/pixel/pixel.prj
similarity index 76%
rename from tools/vision/LDV/SRC/PIXEL/PIXEL.PRJ
rename to tools/vision/ldv/src/pixel/pixel.prj
index 7fea599..e995c2d 100644
--- a/tools/vision/LDV/SRC/PIXEL/PIXEL.PRJ
+++ b/tools/vision/ldv/src/pixel/pixel.prj
@@ -1,6 +1,7 @@
PIXEL.LDV
-;.C[-Y- -G+]
-;.L[-Y-]
+.C [ ]
+.S [ ]
+.L [ ]
=
pcstart.o
PIXEL.C
diff --git a/tools/vision/LDV/SRC/PIXEL/PIXEL.S b/tools/vision/ldv/src/pixel/pixel.s
similarity index 100%
rename from tools/vision/LDV/SRC/PIXEL/PIXEL.S
rename to tools/vision/ldv/src/pixel/pixel.s
diff --git a/tools/vision/LDV/SRC/puzzle/puzzle.c b/tools/vision/ldv/src/puzzle/puzzle.c
similarity index 86%
rename from tools/vision/LDV/SRC/puzzle/puzzle.c
rename to tools/vision/ldv/src/puzzle/puzzle.c
index bc84493..a8fd33f 100644
--- a/tools/vision/LDV/SRC/puzzle/puzzle.c
+++ b/tools/vision/ldv/src/puzzle/puzzle.c
@@ -44,7 +44,7 @@ PROC Proc[] = {
char Info[] = "LDV";
LDGLIB Ldg[] = {
- 0x0100, /* version de la lib, recommand‚ */
+ 0x0102, /* version de la lib, recommand‚ */
4, /* nombre de fonction dans la lib */
Proc, /* Pointeurs vers nos fonctions */
Info, /* Information sur la lib */
@@ -105,7 +105,7 @@ int vdihandle(void)
return( i ) ;
}
-void SetMixedArray(short Nw, short Nh, short entropy)
+short* SetMixedArray(short Nw, short Nh, short entropy)
{
short nb = Nw * Nh ;
@@ -125,25 +125,44 @@ void SetMixedArray(short Nw, short Nh, short entropy)
ToBeMixed[j] = ToBeMixed[k] ;
ToBeMixed[k] = l ;
}
- }
+ }
+
+ return ToBeMixed ;
}
-#pragma warn -par
-LDV_STATUS cdecl PreRun(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out)
+LDV_STATUS UpdateMixedArray(LDV_PARAMS *params)
{
+ short old_nw = Nw ;
+ short old_nh = Nh ;
+ short old_entropy = Entropy ;
+
Nw = params->Param[0].s ;
Nh = params->Param[1].s ;
Entropy = params->Param[2].s ;
+ if ( (old_nw != Nw) || (old_nh != Nh) || (old_entropy != Entropy) )
+ if ( SetMixedArray( Nw, Nh, Entropy ) == NULL ) return ELDV_NOTENOUGHMEMORY ;
+
+ return ELDV_NOERROR ;
+}
+
+LDV_STATUS cdecl PreRun(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out)
+{
+ LDV_STATUS status ;
+
+ status = UpdateMixedArray( params ) ;
+ if ( !LDV_SUCCESS(status) ) return status ;
+
out->Raster.fd_w = in->Raster.fd_w ;
out->Raster.fd_h = in->Raster.fd_h ;
- return( ELDV_NOERROR ) ;
+ return ELDV_NOERROR ;
}
+#pragma warn -par
LDV_STATUS cdecl Run(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out)
{
- LDV_STATUS status = ELDV_NOERROR ;
+ LDV_STATUS status ;
long cancel, pc ;
short *src_num = ToBeMixed ;
short dst_num ;
@@ -151,7 +170,8 @@ LDV_STATUS cdecl Run(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out)
int x, y, w, h ;
int nw, nh, mw, mh ;
- if ( ToBeMixed == NULL ) return( ELDV_NOTENOUGHMEMORY ) ;
+ status = UpdateMixedArray( params ) ;
+ if ( !LDV_SUCCESS(status) ) return status ;
if ( VDIHandle == -1 ) VDIHandle = vdihandle() ;
@@ -203,15 +223,12 @@ LDV_STATUS cdecl Run(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out)
return( status ) ;
}
+#pragma warn +par
LDV_STATUS cdecl Preview(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out)
{
- SetMixedArray( Nw, Nh, Entropy ) ;
- if ( ToBeMixed == NULL ) return( ELDV_NOTENOUGHMEMORY ) ;
-
return( Run( in, params, out ) ) ;
}
-#pragma warn +par
int main(void)
diff --git a/tools/vision/ldv/src/puzzle/puzzle.ldv b/tools/vision/ldv/src/puzzle/puzzle.ldv
new file mode 100644
index 0000000..d0a670a
Binary files /dev/null and b/tools/vision/ldv/src/puzzle/puzzle.ldv differ
diff --git a/tools/vision/LDV/SRC/puzzle/puzzle.prj b/tools/vision/ldv/src/puzzle/puzzle.prj
similarity index 75%
rename from tools/vision/LDV/SRC/puzzle/puzzle.prj
rename to tools/vision/ldv/src/puzzle/puzzle.prj
index 7deb25b..1f85ca6 100644
--- a/tools/vision/LDV/SRC/puzzle/puzzle.prj
+++ b/tools/vision/ldv/src/puzzle/puzzle.prj
@@ -1,6 +1,7 @@
PUZZLE.LDV
-;.C[-Y- -G+]
-;.L[-Y-]
+.C [ ]
+.S [ ]
+.L [ ]
=
pcstart.o
PUZZLE.C
diff --git a/tools/vision/LDV/SRC/rotate/ROTATE.C b/tools/vision/ldv/src/rotate/rotate.c
similarity index 95%
rename from tools/vision/LDV/SRC/rotate/ROTATE.C
rename to tools/vision/ldv/src/rotate/rotate.c
index f619a6b..0f37c61 100644
--- a/tools/vision/LDV/SRC/rotate/ROTATE.C
+++ b/tools/vision/ldv/src/rotate/rotate.c
@@ -44,7 +44,7 @@ PROC Proc[] = {
char Info[] = "LDV";
LDGLIB Ldg[] = {
- 0x0100, /* version de la lib, recommand‚ */
+ 0x0101, /* version de la lib, recommand‚ */
4, /* nombre de fonction dans la lib */
Proc, /* Pointeurs vers nos fonctions */
Info, /* Information sur la lib */
diff --git a/tools/vision/ldv/src/rotate/rotate.ldv b/tools/vision/ldv/src/rotate/rotate.ldv
new file mode 100644
index 0000000..faf26fe
Binary files /dev/null and b/tools/vision/ldv/src/rotate/rotate.ldv differ
diff --git a/tools/vision/LDV/SRC/rotate/ROTATE.PRJ b/tools/vision/ldv/src/rotate/rotate.prj
similarity index 77%
rename from tools/vision/LDV/SRC/rotate/ROTATE.PRJ
rename to tools/vision/ldv/src/rotate/rotate.prj
index 563afb9..7a1448d 100644
--- a/tools/vision/LDV/SRC/rotate/ROTATE.PRJ
+++ b/tools/vision/ldv/src/rotate/rotate.prj
@@ -1,6 +1,7 @@
ROTATE.LDV
-;.C[-Y- -G+]
-;.L[-Y-]
+.C [ ]
+.S [ ]
+.L [ ]
=
pcstart.o
ROTATE.C
diff --git a/tools/vision/LDV/SRC/XWAVE/XWAVE.C b/tools/vision/ldv/src/xwave/xwave.c
similarity index 95%
rename from tools/vision/LDV/SRC/XWAVE/XWAVE.C
rename to tools/vision/ldv/src/xwave/xwave.c
index 0ad6af2..76fa85d 100644
--- a/tools/vision/LDV/SRC/XWAVE/XWAVE.C
+++ b/tools/vision/ldv/src/xwave/xwave.c
@@ -44,7 +44,7 @@ PROC Proc[] = {
char Info[] = "LDV";
LDGLIB Ldg[] = {
- 0x0101, /* version de la lib, recommand‚ */
+ 0x0102, /* version de la lib, recommand‚ */
4, /* nombre de fonction dans la lib */
Proc, /* Pointeurs vers nos fonctions */
Info, /* Information sur la lib */
diff --git a/tools/vision/LDV/XWAVE.LDV b/tools/vision/ldv/src/xwave/xwave.ldv
similarity index 50%
rename from tools/vision/LDV/XWAVE.LDV
rename to tools/vision/ldv/src/xwave/xwave.ldv
index c45e179..1f2117c 100644
Binary files a/tools/vision/LDV/XWAVE.LDV and b/tools/vision/ldv/src/xwave/xwave.ldv differ
diff --git a/tools/vision/LDV/SRC/XWAVE/XWAVE.PRJ b/tools/vision/ldv/src/xwave/xwave.prj
similarity index 77%
rename from tools/vision/LDV/SRC/XWAVE/XWAVE.PRJ
rename to tools/vision/ldv/src/xwave/xwave.prj
index ce2fc3b..88b8c69 100644
--- a/tools/vision/LDV/SRC/XWAVE/XWAVE.PRJ
+++ b/tools/vision/ldv/src/xwave/xwave.prj
@@ -1,6 +1,7 @@
xwave.ldv
-;.C[-Y- -G+]
-;.L[-Y-]
+.C [ ]
+.S [ ]
+.L [ ]
=
pcstart.o
xwave.c
diff --git a/tools/vision/LDV/SRC/YPERSC/YPERSC.C b/tools/vision/ldv/src/ypersc/ypersc.c
similarity index 96%
rename from tools/vision/LDV/SRC/YPERSC/YPERSC.C
rename to tools/vision/ldv/src/ypersc/ypersc.c
index a01efae..37ba8d8 100644
--- a/tools/vision/LDV/SRC/YPERSC/YPERSC.C
+++ b/tools/vision/ldv/src/ypersc/ypersc.c
@@ -44,7 +44,7 @@ PROC Proc[] = {
char Info[] = "LDV";
LDGLIB Ldg[] = {
- 0x0100, /* version de la lib, recommand‚ */
+ 0x0101, /* version de la lib, recommand‚ */
4, /* nombre de fonction dans la lib */
Proc, /* Pointeurs vers nos fonctions */
Info, /* Information sur la lib */
@@ -175,7 +175,7 @@ LDV_STATUS cdecl Run(LDV_IMAGE *in, LDV_PARAMS *params, LDV_IMAGE *out)
/* pt16_... est utilise pour le mode 16 bits et le mode bit-plan (avec reajustement) */
if ( in->Raster.fd_nplanes <= 8 )
{
- size_t win, wout ;
+ size_t win ;
win = ALIGN16( in->Raster.fd_w ) ;
wout = ALIGN16( out->Raster.fd_w ) ;
diff --git a/tools/vision/ldv/src/ypersc/ypersc.ldv b/tools/vision/ldv/src/ypersc/ypersc.ldv
new file mode 100644
index 0000000..a0af340
Binary files /dev/null and b/tools/vision/ldv/src/ypersc/ypersc.ldv differ
diff --git a/tools/vision/LDV/SRC/YPERSC/YPERSC.PRJ b/tools/vision/ldv/src/ypersc/ypersc.prj
similarity index 77%
rename from tools/vision/LDV/SRC/YPERSC/YPERSC.PRJ
rename to tools/vision/ldv/src/ypersc/ypersc.prj
index fbcb512..f3103cc 100644
--- a/tools/vision/LDV/SRC/YPERSC/YPERSC.PRJ
+++ b/tools/vision/ldv/src/ypersc/ypersc.prj
@@ -1,6 +1,7 @@
YPERSC.LDV
-;.C[-Y- -G+]
-;.L[-Y-]
+.C [ ]
+.S [ ]
+.L [ ]
=
pcstart.o
YPERSC.C
diff --git a/tools/vision/LDV/SRC/YWAVE/YWAVE.C b/tools/vision/ldv/src/ywave/ywave.c
similarity index 95%
rename from tools/vision/LDV/SRC/YWAVE/YWAVE.C
rename to tools/vision/ldv/src/ywave/ywave.c
index 503f90f..3191ffa 100644
--- a/tools/vision/LDV/SRC/YWAVE/YWAVE.C
+++ b/tools/vision/ldv/src/ywave/ywave.c
@@ -44,7 +44,7 @@ PROC Proc[] = {
char Info[] = "LDV";
LDGLIB Ldg[] = {
- 0x0100, /* version de la lib, recommand‚ */
+ 0x0101, /* version de la lib, recommand‚ */
4, /* nombre de fonction dans la lib */
Proc, /* Pointeurs vers nos fonctions */
Info, /* Information sur la lib */
diff --git a/tools/vision/LDV/SRC/YWAVE/YWAVE.LDV b/tools/vision/ldv/src/ywave/ywave.ldv
similarity index 50%
rename from tools/vision/LDV/SRC/YWAVE/YWAVE.LDV
rename to tools/vision/ldv/src/ywave/ywave.ldv
index 303d101..546b0f5 100644
Binary files a/tools/vision/LDV/SRC/YWAVE/YWAVE.LDV and b/tools/vision/ldv/src/ywave/ywave.ldv differ
diff --git a/tools/vision/LDV/SRC/YWAVE/YWAVE.PRJ b/tools/vision/ldv/src/ywave/ywave.prj
similarity index 77%
rename from tools/vision/LDV/SRC/YWAVE/YWAVE.PRJ
rename to tools/vision/ldv/src/ywave/ywave.prj
index ad5372b..fa46655 100644
--- a/tools/vision/LDV/SRC/YWAVE/YWAVE.PRJ
+++ b/tools/vision/ldv/src/ywave/ywave.prj
@@ -1,6 +1,7 @@
ywave.ldv
-;.C[-Y- -G+]
-;.L[-Y-]
+.C [ ]
+.S [ ]
+.L [ ]
=
pcstart.o
ywave.c
diff --git a/tools/vision/LDV/VAPI.H b/tools/vision/ldv/vapi.h
similarity index 61%
rename from tools/vision/LDV/VAPI.H
rename to tools/vision/ldv/vapi.h
index 0015a6e..783bf3e 100644
--- a/tools/vision/LDV/VAPI.H
+++ b/tools/vision/ldv/vapi.h
@@ -1,10 +1,14 @@
-#ifndef __VAPI
-#define __VAPI
+#ifndef __VAPI_H
+#define __VAPI_H
#ifndef __VDI__
#include
#endif
+#ifndef ARRAY_SIZE
+#define ARRAY_SIZE(v) sizeof(v)/sizeof((v)[0])
+#endif
+
typedef struct
{
unsigned short Version ; /* 0x0100 for example */
@@ -20,14 +24,14 @@ typedef struct
VAPI_HEADER ;
/* For RaTCxxRemapColors */
-#ifndef __RASTEROP /* Dont worry, it's for VISION's compile */
+#ifndef __RASTEROP_H /* Dont worry, it's for VISION's compile */
typedef struct
{
- unsigned char *red ;
- unsigned char *green ;
- unsigned char *blue ;
- void *pt_img ;
- long nb_pts ;
+ unsigned char* red ;
+ unsigned char* green ;
+ unsigned char* blue ;
+ void* pt_img ;
+ long nb_pts ;
}
REMAP_COLORS ;
@@ -79,9 +83,39 @@ REMAP_COLORS ;
#define CO_HAS_FPU 0x20
#define CO_HAS_DSP 0x200
+/* For CoGetScreenInfo */
+typedef struct
+{
+ short Width ;
+ short Height ;
+ short NPlanes ;
+ short UseStdVDI ;
+ short RFU[120] ;
+}
+SCREEN_INFO ;
+
+/* From image_io.h, make sure */
+/* Same definition is shared */
+#ifndef HISTO_SIZE
+#define HISTO_SIZE 256
+typedef struct _HISTO
+{
+ unsigned long red[HISTO_SIZE] ;
+ unsigned long green[HISTO_SIZE] ;
+ unsigned long blue[HISTO_SIZE] ;
+ unsigned long grey[HISTO_SIZE] ;
+ unsigned long index[HISTO_SIZE] ;
+ unsigned long nb_colors ;
+ unsigned long norm ; /* Must be set by caller */
+ unsigned long nb_colors_used ;
+}
+HISTO, *PHISTO ;
+#endif
+
#ifndef __INI_H
typedef void* HINI ;
#endif
+
typedef struct
{
VAPI_HEADER Header ;
@@ -91,7 +125,8 @@ typedef struct
void cdecl (*PrOptimize)(long mask) ;
void cdecl (*PrSetText)(long no_line, char *text) ;
long cdecl (*PrSetProgEx)(long pc) ;
- long PrRFU[8] ;
+ long cdecl (*PrSetProgRange)(long current, long max) ;
+ long PrRFU[7] ;
/* Raster Interface */
void cdecl (*RaImgWhite)(MFDB *img) ;
@@ -116,9 +151,10 @@ typedef struct
/* Config Interface */
char* cdecl (*CoGetLDVPath)(void) ;
char* cdecl (*CoGetCurrentLanguage)(void) ;
- unsigned long cdecl (*CoGetFunctionOptimizations)(void *function) ;
+ unsigned long cdecl (*CoGetFunctionOptimizations)(void* function) ;
unsigned long cdecl (*CoGetProcessors)(void) ;
- long CoRFU[18] ;
+ void cdecl (*CoGetScreenInfo)(SCREEN_INFO* sinfo) ;
+ long CoRFU[17] ;
/* INI Interface */
long cdecl (*InOpen)(char *file) ;
@@ -131,18 +167,47 @@ typedef struct
long InRFU[19] ;
/* MEM Interface */
- void cdecl (*MeSCopyMemory8)(void *dst, void *src, unsigned long nb_elems_dst, unsigned long nb_elems_src) ;
- void cdecl (*MeSCopyMemory16)(void *dst, void *src, unsigned long nb_elems_dst, unsigned long nb_elems_src) ;
- void cdecl (*MeSCopyMemory32)(void *dst, void *src, unsigned long nb_elems_dst, unsigned long nb_elems_src) ;
- long MeRFU[30] ;
+ void cdecl (*MeSCopyMemory8)(void *dst, void *src, unsigned long nb_elems_dst, unsigned long nb_elems_src) ;
+ void cdecl (*MeSCopyMemory16)(void *dst, void *src, unsigned long nb_elems_dst, unsigned long nb_elems_src) ;
+ void cdecl (*MeSCopyMemory32)(void *dst, void *src, unsigned long nb_elems_dst, unsigned long nb_elems_src) ;
+ void* cdecl (*MeXalloc)(unsigned long size) ;
+ void* cdecl (*MeXrealloc)(void* ptr, unsigned long size) ;
+ void cdecl (*MeXfree)(void* ptr) ;
+ void* cdecl (*MeXcalloc)(unsigned long nb_elems, unsigned long elem_size) ;
+ char* cdecl (*MeXstrdup)(char* s) ;
+ long MeRFU[25] ;
/* Logging Interface */
long cdecl (*LoDoLog)(unsigned long level, char* format, ...) ;
unsigned long cdecl (*LoGetLogLevel)(void) ;
long LoRFU[8] ;
+ /* Image I/O interface */
+ /* ldv_img must point to a LDV_IMG structure */
+ long cdecl (*ImGetInf)(char* filename, void* ldv_img) ;
+ long cdecl (*ImLoad)(void* ldv_img) ;
+ void cdecl (*ImFree)(void* ldv_img) ;
+ long cdecl (*ImSave)(char* filename, void* ldv_img, char* save_options) ;
+ /* 0: auto, 1: matrixmono, 2: grey level, 3: 216 colors, 4: dual-tone */
+ long cdecl (*ImDither)(long method, long param, void* ldv_img_in, void* ldv_img_out) ;
+ long cdecl (*ImGetStdData)(void* ldv_img, char* query, char* out_data, long out_data_size) ;
+ long cdecl (*ImComputeHistogram)(void* ldv_img, HISTO *histo) ; /* histo->norm must be set by caller */
+ long ImRFU[9] ;
+
+ /* File Interface */
+ long cdecl (*FiFileExist)(char* file) ;
+ long cdecl (*FiFolderExist)(char* folder) ;
+ long cdecl (*FiCopyFile)(char* src, char* dst) ;
+ long cdecl (*FiCopyFileR)(char* src, char* dst) ;
+ long cdecl (*FiMoveFile)(char* src, char* dst) ;
+ long cdecl (*FiCreateFolder)(char* path) ;
+ long cdecl (*FiCmpFiles)(char* f1, char* f2) ;
+ long FiRFU[9] ;
+
/* More interfaces to come ! */
}
VAPI ;
+#define LDVPROG_CANCEL(status) (status == 1)
+
#endif
diff --git a/tools/vision/LDV/XWAVE.INI b/tools/vision/ldv/xwave.ini
similarity index 100%
rename from tools/vision/LDV/XWAVE.INI
rename to tools/vision/ldv/xwave.ini
diff --git a/tools/vision/LDV/SRC/XWAVE/XWAVE.LDV b/tools/vision/ldv/xwave.ldv
similarity index 50%
rename from tools/vision/LDV/SRC/XWAVE/XWAVE.LDV
rename to tools/vision/ldv/xwave.ldv
index c45e179..1f2117c 100644
Binary files a/tools/vision/LDV/SRC/XWAVE/XWAVE.LDV and b/tools/vision/ldv/xwave.ldv differ
diff --git a/tools/vision/LDV/YPERSC.INI b/tools/vision/ldv/ypersc.ini
similarity index 100%
rename from tools/vision/LDV/YPERSC.INI
rename to tools/vision/ldv/ypersc.ini
diff --git a/tools/vision/ldv/ypersc.ldv b/tools/vision/ldv/ypersc.ldv
new file mode 100644
index 0000000..a0af340
Binary files /dev/null and b/tools/vision/ldv/ypersc.ldv differ
diff --git a/tools/vision/LDV/YWAVE.INI b/tools/vision/ldv/ywave.ini
similarity index 100%
rename from tools/vision/LDV/YWAVE.INI
rename to tools/vision/ldv/ywave.ini
diff --git a/tools/vision/LDV/YWAVE.LDV b/tools/vision/ldv/ywave.ldv
similarity index 50%
rename from tools/vision/LDV/YWAVE.LDV
rename to tools/vision/ldv/ywave.ldv
index 303d101..546b0f5 100644
Binary files a/tools/vision/LDV/YWAVE.LDV and b/tools/vision/ldv/ywave.ldv differ
diff --git a/tools/vision/png.txt b/tools/vision/png.txt
index e4ddbf9..609e9fb 100644
--- a/tools/vision/png.txt
+++ b/tools/vision/png.txt
@@ -1,5 +1,5 @@
png.txt for VISION
-VISION support PNG image format through popular libpng (http://www.libpng.org/pub/png/libpng.html)
+VISION supports PNG image format through popular libpng (http://www.libpng.org/pub/png/libpng.html)
libpng is made availabe to Atari systems via a Shared Library (SLB).
This SLB is available for Mint and Magic Atari Oses.
- Download latest zlib and libpng libs available from http://tho-otto.de/download/zlib1211.zip and http://tho-otto.de/download/png1635.tbz
diff --git a/tools/vision/readme.txt b/tools/vision/readme.txt
deleted file mode 100644
index b456376..0000000
--- a/tools/vision/readme.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-*********************************
-* readme.txt for VISION sources *
-*********************************
-In early 2005, I decided to make the source code of VISION freely available on my website http://vision.atari.org
-VISION is an image editor/manager/album and more lotta stuff for all ATARI platforms.
-This is the release 4.1a, with a lot of improvements compared to 4.0f, see http://vision.atari.org/vhistoe.htm for details.
-
-**********************
-* So, what's in it ? *
-**********************
-This archive contains the following objects:
-
-xaes.h Modified (compatible) version of AES.H for Falcon "new" features. Copy it to your INCLUDE folder
-PCFLTLIB.LIB Modified floating point library for MAC emulator compatibility. Copy it to your LIB folder
-
-TOOLS\ This is the main folder for my personal library
-+-JPEG\ JPEG encoder/decoder source files
-
-VISION\ Well, all the VISION specific stuff
-+-DSP\ Contains the Brainstorm JPEG decoder for Falcon and nfjpeg.prg (native JPEG decoding for Aranym)
- And the 56001 binary I did for image filtering
-+-FILTRES\ Convolution filters files
-+-FORMS\ Source files for all VISION's dialog boxes
-+-LANGUES\ Resource files for all languages currently supported by VISION:
- (one folder per language)
- DEUTSCH, ENGLISH, FRANCAIS, ITALIAN, SVENSKA
-+-LDV\ Source files for VISION's modules based on LDGs
-
-VISION is developped using PURE_C.
-
-
-*************
-* Copyright *
-*************
-See license.txt: MIT basically says: do whatever you want with sources.
-
-Well, here we are, I really enjoyed developing VISION on ATARI, I hope someone will continue...
-
-If you need more details on source code (I have to admit that it is not so well commented...),
-you can contact me at: vision.support@free.fr
-
-Have fun !
\ No newline at end of file
diff --git a/tools/vision/scripts/bcon.vcs b/tools/vision/scripts/bcon.vcs
new file mode 100644
index 0000000..ee509b8
--- /dev/null
+++ b/tools/vision/scripts/bcon.vcs
@@ -0,0 +1,2 @@
+; Batch Conversion sample
+bconv_do bconv.ini
\ No newline at end of file
diff --git a/tools/vision/scripts/bconv.ini b/tools/vision/scripts/bconv.ini
new file mode 100644
index 0000000..1677500
--- /dev/null
+++ b/tools/vision/scripts/bconv.ini
@@ -0,0 +1,49 @@
+; INI file for Batch Conversion script sample
+; All parameters shall be in BatchConv section
+[BatchConv]
+; SrcPath: Folder where source files are hold
+SrcPath=H:\PURE_C\PROJECTS\VISION\IMGTEST\BYPLANES
+
+; SrcMask: mask for files of interest
+SrcMask=*.*
+
+; SrcRecurse (0 or 1) if files of interst are to be searched in sub-folders
+SrcRecurse=1
+
+; OutputFormat: the 3 letter code for output format (e.g. DEG,GIF,TIF,JPG,PNG,...)
+OutputFormat=TIF
+
+; DstPath: folder whare files will be converted to
+DstPath=H:\PURE_C\PROJECTS\VISION\TEMP
+
+; ManageSrc: what to do with source file once successfully converted
+; 0: Do nothing
+; 1: Remove source
+; 2: Move source to folder specified by DstMovePath
+ManageSrc=0
+
+; DstMovePath: if ManageSrc=2, move source files to this folder
+DstMovePath=
+
+; ManageDst: what to do if destination file already exists
+; 0: Over-write destination file
+; 1: Cancel conversion
+ManageDst=0
+
+; NotCompatibleBehavior: what to do if destination format cannot handle the request (e.g. number of plans not supported)
+; 0: Dither
+; 1: Cancel
+NotCompatibleBehavior=0
+
+; Resize: resize source if width or height is exceeded
+; 0: Don't resize
+; 1: Resize as soon width or height is exceeded
+Resize=0
+
+; ResizeWidth: Width from which VISION will resize the image (keeping it proportional)
+; Only used if Resize=1
+ResizeWidth=0
+
+; ResizeHeight: Height from which VISION will resize the image (keeping it proportional)
+; Only used if Resize=1
+ResizeHeight=0
diff --git a/tools/vision/scripts/buggy.vcs b/tools/vision/scripts/buggy.vcs
new file mode 100644
index 0000000..fc323c9
--- /dev/null
+++ b/tools/vision/scripts/buggy.vcs
@@ -0,0 +1,12 @@
+; This script leads to issues on second pass
+; VISION starts to report incorrect frees/leaks and crashes on exit
+; The root cause is SPEC512.LDG failing on 3d_512.sps
+; Fixed now from lp in a private message on http://www.atari-forum.com
+iprio_set 1,3,2
+Loop 2
+cat_create H:\My_Documents\Documents\stimg.vic
+cat_addfolder H:\My_Documents\Documents\stimg.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\*.* recurse
+cat_openwicon H:\My_Documents\Documents\stimg.vic
+wait 3000
+close H:\My_Documents\Documents\stimg.vic
+Endloop
\ No newline at end of file
diff --git a/tools/vision/scripts/clip.vcs b/tools/vision/scripts/clip.vcs
new file mode 100644
index 0000000..3dec88d
--- /dev/null
+++ b/tools/vision/scripts/clip.vcs
@@ -0,0 +1,24 @@
+; LDV script sample
+; Demonstrates how to use clip commands from VCS
+
+; Open a sample picture for demonstration
+open H:\PURE_C\PROJECTS\VISION\IMGTEST\MARBLES.TIF
+
+; Select a block on this picture
+clip_sel H:\PURE_C\PROJECTS\VISION\IMGTEST\MARBLES.TIF 16 16 256 192
+
+; Copy that block into clipboard
+clip_copy
+
+; Paste clipboard to new page (TGA extension does not matter, just specify some format here)
+clip_pasten H:\PURE_C\PROJECTS\VISION\IMGTEST\CRAP.TGA
+
+; We don't need loaded picture anymore
+close H:\PURE_C\PROJECTS\VISION\IMGTEST\MARBLES.TIF nosave
+
+; Save new image to disk
+save H:\PURE_C\PROJECTS\VISION\IMGTEST\CRAP.TGA H:\PURE_C\PROJECTS\VISION\IMGTEST\CRAP.JPG
+
+; We don't need this image window anymore
+; Note that image identifier did not change in spite of giving a different name for saving
+close H:\PURE_C\PROJECTS\VISION\IMGTEST\CRAP.TGA nosave
\ No newline at end of file
diff --git a/tools/vision/scripts/clip_loop.vcs b/tools/vision/scripts/clip_loop.vcs
new file mode 100644
index 0000000..45b2dd1
--- /dev/null
+++ b/tools/vision/scripts/clip_loop.vcs
@@ -0,0 +1,42 @@
+; LDV script sample
+; Demonstrates automate image operations from a folder
+; This script take each image from a folder, extract a block
+; And saves that block as an image file
+
+; Inside the loop:
+; current file is accessible via $LFCurrentFile global variable
+; start folder (parameter#1 of Loop_Folder) is accessible via $LFStartFolder global variable
+; Global function LFAdjustDest() allows to build destination file
+; In such a way that it respects original folder hierachy, e.g.:
+; Assuming LFStartFolder=H:\IMAGES
+; And $LFCurrentFile=H:\IMAGES\BYPLANES\32\TC32.JPG
+; Then LFAdjustDest($LFStartFolder,$LFCurrentFile,H:\OPTIMAL) will be H:\OPTIMAL\BYPLANES\32
+
+; Starts the loop on a folder (not recursing)
+Loop_Folder H:\PURE_C\PROJECTS\VISION\IMGTEST
+
+; Open current image file
+open $LFCurrentFile
+
+; Select a block on this picture
+clip_sel $LFCurrentFile 16 16 256 192
+
+; Copy that block into clipboard
+clip_copy
+
+; Paste clipboard to new page using same filename
+clip_pasten LFAdjustDest($LFStartFolder,$LFCurrentFile,H:\PURE_C\PROJECTS\VISION\IMGTEST\TEMP)
+
+; We don't need loaded picture anymore
+close $LFCurrentFile
+
+; Save new image to disk (same window name and filename)
+; Note quality=90;compression=lzw
+; This is to force JPEG quality to 90 and compression to LZW (TIFF)
+save LFAdjustDest($LFStartFolder,$LFCurrentFile,H:\PURE_C\PROJECTS\VISION\IMGTEST\TEMP) LFAdjustDest($LFStartFolder,$LFCurrentFile,H:\PURE_C\PROJECTS\VISION\IMGTEST\TEMP) quality=90;compression=lzw
+
+; We don't need this image window anymore
+close LFAdjustDest($LFStartFolder,$LFCurrentFile,H:\PURE_C\PROJECTS\VISION\IMGTEST\TEMP)
+
+; Proceed with next file in the folder
+Endloop_Folder
diff --git a/tools/vision/scripts/clip_paste.vcs b/tools/vision/scripts/clip_paste.vcs
new file mode 100644
index 0000000..4f72371
--- /dev/null
+++ b/tools/vision/scripts/clip_paste.vcs
@@ -0,0 +1,25 @@
+; LDV script sample
+; Demonstrates how to use clip command (copy/paste) from VCS
+
+; Open a sample picture for demonstration
+open H:\PURE_C\PROJECTS\VISION\IMGTEST\MARBLES.TIF
+
+; Select a block on this picture
+clip_sel H:\PURE_C\PROJECTS\VISION\IMGTEST\MARBLES.TIF 16 16 256 192
+
+; Copy that block into clipboard
+clip_copy
+
+; Paste clipboard to image at various locations
+clip_paste H:\PURE_C\PROJECTS\VISION\IMGTEST\MARBLES.TIF 128 128
+clip_paste H:\PURE_C\PROJECTS\VISION\IMGTEST\MARBLES.TIF 512 512
+clip_paste H:\PURE_C\PROJECTS\VISION\IMGTEST\MARBLES.TIF 1280 800
+
+; Save image to disk with new name
+save H:\PURE_C\PROJECTS\VISION\IMGTEST\MARBLES.TIF H:\PURE_C\PROJECTS\VISION\IMGTEST\CRAP.TIF
+
+; We don't need this image window anymore
+close H:\PURE_C\PROJECTS\VISION\IMGTEST\MARBLES.TIF nosave
+
+; Open saved picture to check it's OK
+open H:\PURE_C\PROJECTS\VISION\IMGTEST\CRAP.TIF
\ No newline at end of file
diff --git a/tools/vision/scripts/ddualton.vcs b/tools/vision/scripts/ddualton.vcs
new file mode 100644
index 0000000..0e98eb5
--- /dev/null
+++ b/tools/vision/scripts/ddualton.vcs
@@ -0,0 +1,17 @@
+; LDV script sample
+; Using dither.ldv to dither files in a folder to dual tone
+; Param1: method; auto, 1: matrixmono, 2: grey level, 3: 216 colors, 4: dual tone
+; Param2: method parameter (only required as threshold for dual tone), -1: default or a number for the percent of max value
+; Param3: number of planes for output (0 for current resolution)
+Loop_Folder H:\PURE_C\PROJECTS\VISION\IMGTEST
+open $LFCurrentFile
+ldv_do $LFCurrentFile dither.ldv 4 -1 0
+sleep 800
+close $LFCurrentFile nosave
+EndLoop_Folder
+Loop_Folder I:\2020\10
+open $LFCurrentFile
+ldv_do $LFCurrentFile dither.ldv 3 -1 0
+sleep 800
+close $LFCurrentFile nosave
+EndLoop_Folder
\ No newline at end of file
diff --git a/tools/vision/scripts/dfixpal.vcs b/tools/vision/scripts/dfixpal.vcs
new file mode 100644
index 0000000..271dede
--- /dev/null
+++ b/tools/vision/scripts/dfixpal.vcs
@@ -0,0 +1,16 @@
+; LDV script sample
+; Demonstrates how to optimize images using optimg.ldv
+; This scripts loops over a folder and recursively start optimg.ldv
+; On each image found to analyze it and find a better output format
+; Based on its colors characteristics (e.g. a monochrome image saved
+; As True Color will end up with a monochrome file, LZW compressed)
+
+; These images are stored in TC mode but have less than 256 colors
+; They will be saved as images with fixed palette
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\rgb.tif optimg.ldv H:\PURE_C\PROJECTS\VISION\TEMP\rgb.tif Falcon
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\17c.tif optimg.ldv H:\PURE_C\PROJECTS\VISION\TEMP\17c.tif Falcon
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\rgbtc16.tif optimg.ldv H:\PURE_C\PROJECTS\VISION\TEMP\rgbtc16.tif Falcon
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\17ctc16.tif optimg.ldv H:\PURE_C\PROJECTS\VISION\TEMP\17ctc16.tif Falcon
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\marbles.tif optimg.ldv H:\PURE_C\PROJECTS\VISION\TEMP\marbles.tif Falcon
+; Next one will fail as image has more than 256 colors
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\marbles.tif optimg.ldv H:\PURE_C\PROJECTS\VISION\TEMP\marbles.tif TIFForceDitherFixedPal256c
\ No newline at end of file
diff --git a/tools/vision/scripts/ibrowser.vcs b/tools/vision/scripts/ibrowser.vcs
new file mode 100644
index 0000000..dfa0e45
--- /dev/null
+++ b/tools/vision/scripts/ibrowser.vcs
@@ -0,0 +1,10 @@
+; Image Browser Scripting
+ibrw_open I:\tmp\1DSC00629.png
+Loop 25
+ibrw_next
+wait 300
+Endloop
+Loop 25
+ibrw_prev
+wait 300
+Endloop
diff --git a/tools/vision/scripts/img_prio.vcs b/tools/vision/scripts/img_prio.vcs
new file mode 100644
index 0000000..6a4ece6
--- /dev/null
+++ b/tools/vision/scripts/img_prio.vcs
@@ -0,0 +1,38 @@
+; Image Priorities control
+iprio_set 1,3,2
+cat_create H:\My_Documents\Documents\stimg132.vic
+cat_addfolder H:\My_Documents\Documents\stimg12.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\others\*.* recurse
+cat_openwicon H:\My_Documents\Documents\stimg12.vic
+wait 3000
+
+iprio_set 3,2,1
+cat_create H:\My_Documents\Documents\stimg321.vic
+cat_addfolder H:\My_Documents\Documents\stimg21.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\others\*.* recurse
+cat_openwicon H:\My_Documents\Documents\stimg21.vic
+wait 3000
+
+iprio_set 3
+cat_create H:\My_Documents\Documents\stimg3.vic
+cat_addfolder H:\My_Documents\Documents\stimg2.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\others\*.* recurse
+cat_openwicon H:\My_Documents\Documents\stimg2.vic
+wait 3000
+
+iprio_set 2
+cat_create H:\My_Documents\Documents\stimg2.vic
+cat_addfolder H:\My_Documents\Documents\stimg2.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\others\*.* recurse
+cat_openwicon H:\My_Documents\Documents\stimg2.vic
+wait 3000
+
+iprio_set 1
+cat_create H:\My_Documents\Documents\stimg1.vic
+cat_addfolder H:\My_Documents\Documents\stimg1.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\others\*.* recurse
+cat_openwicon H:\My_Documents\Documents\stimg1.vic
+
+wait 60000
+
+
+close H:\My_Documents\Documents\stimg1.vic
+close H:\My_Documents\Documents\stimg2.vic
+close H:\My_Documents\Documents\stimg3.vic
+close H:\My_Documents\Documents\stimg321.vic
+close H:\My_Documents\Documents\stimg132.vic
\ No newline at end of file
diff --git a/tools/vision/scripts/ldv.vcs b/tools/vision/scripts/ldv.vcs
new file mode 100644
index 0000000..04d3ab8
--- /dev/null
+++ b/tools/vision/scripts/ldv.vcs
@@ -0,0 +1,10 @@
+; LDV script sample
+open H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_3mbmb.png
+ldv_do H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_3mbmb.png rotate.ldv 45
+ldv_do H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_3mbmb.png bhole.ldv 250 50 50
+ldv_do H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_3mbmb.png gamma.ldv 150 50 100
+ldv_do H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_3mbmb.png pixel.ldv 3
+ldv_do H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_3mbmb.png xwave.ldv 80 60
+ldv_do H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_3mbmb.png ywave.ldv 100 80
+ldv_do H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_3mbmb.png ypersc.ldv 300 50
+ldv_do H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_3mbmb.png bw.ldv
\ No newline at end of file
diff --git a/tools/vision/scripts/ldvcnt.vcs b/tools/vision/scripts/ldvcnt.vcs
new file mode 100644
index 0000000..d22bbb1
--- /dev/null
+++ b/tools/vision/scripts/ldvcnt.vcs
@@ -0,0 +1,20 @@
+; LDV script sample for CNTCOL.LDV
+open H:\PURE_C\PROJECTS\VISION\IMGTEST\TGA\MARBLES.TGA
+ldv_do H:\PURE_C\PROJECTS\VISION\IMGTEST\TGA\MARBLES.TGA cntcol.ldv 1 H:\marbles1.txt
+ldv_do H:\PURE_C\PROJECTS\VISION\IMGTEST\TGA\MARBLES.TGA cntcol.ldv 2 H:\marbles2.txt
+ldv_do H:\PURE_C\PROJECTS\VISION\IMGTEST\TGA\MARBLES.TGA cntcol.ldv 3 H:\marbles3.txt
+
+open H:\PURE_C\PROJECTS\VISION\IMGTEST\TGA\rwhite.TGA
+ldv_do H:\PURE_C\PROJECTS\VISION\IMGTEST\TGA\rwhite.TGA cntcol.ldv 1 H:\rwhite1.txt
+ldv_do H:\PURE_C\PROJECTS\VISION\IMGTEST\TGA\rwhite.TGA cntcol.ldv 2 H:\rwhite2.txt
+ldv_do H:\PURE_C\PROJECTS\VISION\IMGTEST\TGA\rwhite.TGA cntcol.ldv 3 H:\rwhite3.txt
+
+open H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_10mbmb.png
+ldv_do H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_10mbmb.png cntcol.ldv 1 H:\spng1.txt
+ldv_do H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_10mbmb.png cntcol.ldv 2 H:\spng2.txt
+ldv_do H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_10mbmb.png cntcol.ldv 3 H:\spng3.txt
+
+open H:\PURE_C\PROJECTS\VISION\IMGTEST\BYPLANES\32\16m.tif
+ldv_do H:\PURE_C\PROJECTS\VISION\IMGTEST\BYPLANES\32\16m.tif cntcol.ldv 1 H:\16m1.txt
+ldv_do H:\PURE_C\PROJECTS\VISION\IMGTEST\BYPLANES\32\16m.tif cntcol.ldv 2 H:\16m2.txt
+ldv_do H:\PURE_C\PROJECTS\VISION\IMGTEST\BYPLANES\32\16m.tif cntcol.ldv 3 H:\16m3.txt
diff --git a/tools/vision/scripts/ldvcntf.vcs b/tools/vision/scripts/ldvcntf.vcs
new file mode 100644
index 0000000..0f4a66a
--- /dev/null
+++ b/tools/vision/scripts/ldvcntf.vcs
@@ -0,0 +1,20 @@
+; LDV script sample for CNTCOL.LDV
+; This one is working directly from the image file
+; So it does not depend on the number of planes of the screen
+; Remember VISION always works with images wih same number of planes than the screen
+; As soon image is displayed/grapihcal tools used
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\TGA\MARBLES.TGA cntcol.ldv 1 H:\marbles1.txt
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\TGA\MARBLES.TGA cntcol.ldv 2 H:\marbles2.txt
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\TGA\MARBLES.TGA cntcol.ldv 3 H:\marbles3.txt
+
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\TGA\rwhite.TGA cntcol.ldv 1 H:\rwhite1.txt
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\TGA\rwhite.TGA cntcol.ldv 2 H:\rwhite2.txt
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\TGA\rwhite.TGA cntcol.ldv 3 H:\rwhite3.txt
+
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_10mbmb.png cntcol.ldv 1 H:\spng1.txt
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_10mbmb.png cntcol.ldv 2 H:\spng2.txt
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_10mbmb.png cntcol.ldv 3 H:\spng3.txt
+
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\BYPLANES\32\16m.tif cntcol.ldv 1 H:\16m1.txt
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\BYPLANES\32\16m.tif cntcol.ldv 2 H:\16m2.txt
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\BYPLANES\32\16m.tif cntcol.ldv 3 H:\16m3.txt
diff --git a/tools/vision/scripts/ldvf.vcs b/tools/vision/scripts/ldvf.vcs
new file mode 100644
index 0000000..88d57bd
--- /dev/null
+++ b/tools/vision/scripts/ldvf.vcs
@@ -0,0 +1,10 @@
+; LDV script sample
+; Dummy test as -f: instructs LDV will work from the original file so no display
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_3mbmb.png rotate.ldv 45
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_3mbmb.png bhole.ldv 250 50 50
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_3mbmb.png gamma.ldv 150 50 100
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_3mbmb.png pixel.ldv 3
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_3mbmb.png xwave.ldv 80 60
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_3mbmb.png ywave.ldv 100 80
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_3mbmb.png ypersc.ldv 300 50
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_3mbmb.png bw.ldv
\ No newline at end of file
diff --git a/tools/vision/scripts/ldvini.vcs b/tools/vision/scripts/ldvini.vcs
new file mode 100644
index 0000000..715a8e7
--- /dev/null
+++ b/tools/vision/scripts/ldvini.vcs
@@ -0,0 +1,6 @@
+; LDV script sample
+open H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_1mbmb.png
+ldv_doip H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_1mbmb.png rotate.ldv protate.ini
+ldv_doip H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_1mbmb.png puzzle.ldv ppuzzle.ini
+ldv_doip H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_1mbmb.png invert.ldv pinvert.ini
+ldv_doip H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_1mbmb.png light.ldv plight.ini
\ No newline at end of file
diff --git a/tools/vision/scripts/ldvopt.vcs b/tools/vision/scripts/ldvopt.vcs
new file mode 100644
index 0000000..49b5be5
--- /dev/null
+++ b/tools/vision/scripts/ldvopt.vcs
@@ -0,0 +1,33 @@
+; LDV script sample
+; Demonstrates how to optimize images using optimg.ldv
+; This scripts loops over a folder and recursively start optimg.ldv
+; On each image found to analyze it and find a better output format
+; Based on its colors characteristics (e.g. a monochrome image saved
+; As True Color will end up with a monochrome file, LZW compressed)
+
+; Inside the loop:
+; current file is accessible via $LFCurrentFile global variable
+; start folder (parameter#1 of Loop_Folder) is accessible via $LFStartFolder global variable
+; Global function LFAdjustDest() allows to build destination file
+; In such a way that it respects original folder hierachy, e.g.:
+; Assuming LFStartFolder=H:\IMAGES
+; And $LFCurrentFile=H:\IMAGES\BYPLANES\32\TC32.JPG
+; Then LFAdjustDest($LFStartFolder,$LFCurrentFile,H:\OPTIMAL) will be H:\OPTIMAL\BYPLANES\32
+
+; Call optimg.ldv as follows:
+; ldv_do -f: optimg.ldv
+; : filename of the file (full path recommended)
+; : if folder, LDV will build filename based on original file name extension decided by profile
+; if file, only extension will be changed
+;Loop_Folder H:\PURE_C\PROJECTS\VISION\IMGTEST recurse
+Loop_Folder H:\tmp\axa\05 recurse
+;ldv_do -f:$LFCurrentFile optimg.ldv LFAdjustDest($LFStartFolder,$LFCurrentFile,H:\PURE_C\PROJECTS\VISION\TEMP\Aranym) DualToneLikely
+ldv_do -f:$LFCurrentFile optimg.ldv LFAdjustDest($LFStartFolder,$LFCurrentFile,H:\tmp\axa\opt\05) DualToneLikely
+Endloop_Folder
+
+
+; Other examples:
+;ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\MARBLES.TIF optimg.ldv H:\PURE_C\PROJECTS\VISION\TEMP\Falcon Falcon
+;ldv_do -f:H:\tmp\z\39\aquila-002.tif optimg.ldv H:\PURE_C\PROJECTS\VISION\TEMP\aquila-002.tif DualToneLikely
+;ldv_do -f:H:\tmp\z\39\aquila-003.tif optimg.ldv H:\PURE_C\PROJECTS\VISION\TEMP\aquila-003.tif DualToneLikely
+; --> Will generate H:\PURE_C\PROJECTS\VISION\TEMP\ST\MARBLES.JPG (assuming MARBLES.TIF is a TC24 image)
diff --git a/tools/vision/scripts/ldvopt256c.vcs b/tools/vision/scripts/ldvopt256c.vcs
new file mode 100644
index 0000000..1063acb
--- /dev/null
+++ b/tools/vision/scripts/ldvopt256c.vcs
@@ -0,0 +1,5 @@
+; LDV Dither to 256 colors using optimg.ldv
+; We are using optimg.ldv and not dither.ldv because
+; dither.ldv can't save the file
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_5mbmb.png optimg.ldv H:\PURE_C\PROJECTS\VISION\TEMP\SamplePNGImage_5mbmb.tif TIFForceDither256c
+ldv_do -f:H:\PURE_C\PROJECTS\VISION\IMGTEST\PNG\3\SamplePNGImage_3mbmb.png optimg.ldv H:\PURE_C\PROJECTS\VISION\TEMP\SamplePNGImage_3mbmb.img IMGForceDither256c
\ No newline at end of file
diff --git a/tools/vision/scripts/lloopfol.vcs b/tools/vision/scripts/lloopfol.vcs
new file mode 100644
index 0000000..d6b2aa9
--- /dev/null
+++ b/tools/vision/scripts/lloopfol.vcs
@@ -0,0 +1,21 @@
+; Load/close images from a folder
+; Command:
+; Loop_Folder [] [recurse]
+; Inside the loop:
+; current file is accessible via $LFCurrentFile global variable
+; start folder (parameter#1 of Loop_Folder) is accessible via $LFStartFolder global variable
+; Global function LFAdjustDest() allows to build destination file
+; In such a way that it respect original folder hierachy, e.g.:
+; LFStartFolder=H:\IMAGES
+; $LFCurrentFile=H:\IMAGES\BYPLANES\32\TC32.JPG
+; LFAdjustDest($LFStartFolder,$LFCurrentFile,H:\OPTIMAL) will be H:\OPTIMAL\BYPLANES\32
+
+form_silent
+prog_silent
+Loop_Folder H:\PURE_C\PROJECTS\VISION\IMGTEST recurse
+open $LFCurrentFile
+sleep 100
+close $LFCurrentFile
+Endloop_Folder
+form_silent 0
+prog_silent 0
diff --git a/tools/vision/scripts/loadloop.vcs b/tools/vision/scripts/loadloop.vcs
new file mode 100644
index 0000000..baaff14
--- /dev/null
+++ b/tools/vision/scripts/loadloop.vcs
@@ -0,0 +1,13 @@
+; Image Priorities control
+form_silent
+iprio_set 1,3,2
+Loop 200
+open H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\gem_image\img\04\yel.img
+open H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\gem_image\sttt\teststtt.img
+open H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\gem_image\ventura\16color.img
+close H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\gem_image\img\04\yel.img
+close H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\gem_image\ventura\16color.img
+;close H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\gem_image\timg\fsnap32k.img
+close H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\gem_image\sttt\teststtt.img
+Endloop
+form_silent 0
\ No newline at end of file
diff --git a/tools/vision/scripts/main.vcs b/tools/vision/scripts/main.vcs
new file mode 100644
index 0000000..6c41277
--- /dev/null
+++ b/tools/vision/scripts/main.vcs
@@ -0,0 +1,67 @@
+; This is a VISION Command Script example
+; Used to automate actions in VISION
+; Global Syntax:
+; - Each line represents a command to execute
+; - A command may or may not have parameters
+; - Some parameters are mandatory (between <>) or optional (between [])
+; - if has a space character, surround it par quote character "
+; Available commands are:
+; ';' : Comment line, ignored for processing
+; 'open' : opens a file just as File->Open menu
+; Syntax: open
+; Comment:
+; 'close' : closes a window (image or catalog)
+; Syntax: close [nosave]
+; Comment:
+; 'wait' : Wait some time before running the next command
+; Syntax: wait
+; Comment: Don't expect much accuracy here sleep keyword can be used also
+; 'loop': start a loop
+; Syntax: loop
+; Comment:
+; 'endloop': ends a loop
+; Syntax: endloop
+; Comment:
+; 'quit' : Quit VISION just as File->Quit
+; Syntax: quit
+; Comment: exit keyword can also be used
+; 'run_script' : runs a new script from the current one
+; Syntax: run_script
+; Comment: filename can be a full pathname or relative to the path or the current script
+; 'cat_create' : Create a new catalog file and opens it
+; Syntax: cat_create
+; Comment:
+; 'cat_addfile' : Adds an image file to an existing catalog
+; Syntax: cat_create
+; Comment: must have been created/opened previously with cat_create or open
+; 'cat_addfolder' : Adds a folder of image files to an existing catalog
+; Syntax: cat_addfolder [recurse]
+; Comment: must have been created/opened previously with cat_create or open
+; recurse is an optional parameter, if present all images files into sub-folders will be added
+; 'cat_openwicon' : Opens the window icon album from the album window dialog
+; Syntax: cat_openwicon
+; Comment: must have been created/opened previously with cat_create or open
+; This window can be closed by using command close Walb_
+; 'cat_setini' : Associates an INI file to a catalog et applies it
+; Syntax: cat_setini
+; Comment: must have been created/opened previously with cat_create or open
+; 'ibrw_open' : Opens a file into Image Browser to nagigate through its folder
+; Syntax: ibrw_open
+; Comment:
+; 'ibrw_next' : Opens next file in Image Browser folder
+; Syntax: ibrw_next
+; Comment:
+; 'ibrw_prev' : Opens previous file in Image Browser folder
+; Syntax: ibrw_prev
+; Comment:
+
+cat_create H:\My_Documents\Documents\stest.vic
+cat_setini H:\My_Documents\Documents\stest.vic H:\My_Documents\Documents\photos.ini
+cat_addfolder H:\My_Documents\Documents\stest.vic I:\2019\03\*.*
+cat_addfolder H:\My_Documents\Documents\stest.vic I:\2017\2017-10\*.* recurse
+cat_openwicon H:\My_Documents\Documents\stest.vic
+;wait 2000
+;close Walb_H:\My_Documents\Documents\stest.vic
+;wait 1000
+;close H:\My_Documents\Documents\stest.vic
+
diff --git a/tools/vision/scripts/muchram.vcs b/tools/vision/scripts/muchram.vcs
new file mode 100644
index 0000000..f1fd0a9
--- /dev/null
+++ b/tools/vision/scripts/muchram.vcs
@@ -0,0 +1,25 @@
+; muchram.vcs
+; Load many modules to have some RAM usage for them and
+; Try to load a BIG picture to check modules are unloaded
+; Do not try all folders under ST-Picture-Formats\samples
+; As IMG.LDG module has a bug, don't go through gem_images
+cat_create H:\My_Documents\Documents\tst.vic
+cat_addfolder H:\My_Documents\Documents\tst.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\degas\*.* recurse
+cat_addfolder H:\My_Documents\Documents\tst.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\deluxe_paint\*.* recurse
+cat_addfolder H:\My_Documents\Documents\tst.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\apex_media\*.* recurse
+cat_addfolder H:\My_Documents\Documents\tst.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\falcon_tc\*.* recurse
+cat_addfolder H:\My_Documents\Documents\tst.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\crackart\*.* recurse
+cat_addfolder H:\My_Documents\Documents\tst.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\gfa_raytrace\*.* recurse
+cat_addfolder H:\My_Documents\Documents\tst.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\imagelab\*.* recurse
+cat_addfolder H:\My_Documents\Documents\tst.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\neochrome\*.* recurse
+cat_addfolder H:\My_Documents\Documents\tst.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\misc\*.* recurse
+cat_addfolder H:\My_Documents\Documents\tst.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\pixart\*.* recurse
+cat_addfolder H:\My_Documents\Documents\tst.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\spectrum\*.* recurse
+cat_addfolder H:\My_Documents\Documents\tst.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\computereyes\*.* recurse
+cat_addfolder H:\My_Documents\Documents\tst.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\TGA\*.* recurse
+cat_addfolder H:\My_Documents\Documents\tst.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\BYPLANES\*.* recurse
+cat_openwicon H:\My_Documents\Documents\tst.vic
+wait 3000
+close Walb_H:\My_Documents\Documents\tst.vic
+open I:\Demoscene.jpg
+open I:\Demoscene1.jpg
\ No newline at end of file
diff --git a/tools/vision/scripts/muchram2.vcs b/tools/vision/scripts/muchram2.vcs
new file mode 100644
index 0000000..d7e7615
--- /dev/null
+++ b/tools/vision/scripts/muchram2.vcs
@@ -0,0 +1,13 @@
+; muchram2.vcs
+; Load many modules to have some RAM usage for them and
+; Try to load a BIG picture to check modules are unloaded
+; Assuming IMG.LDG module does not corrupt memory when ientifying fsnap32k.img
+cat_create H:\My_Documents\Documents\tst.vic
+cat_addfolder H:\My_Documents\Documents\tst.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\*.* recurse
+cat_addfolder H:\My_Documents\Documents\tst.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\TGA\*.* recurse
+cat_addfolder H:\My_Documents\Documents\tst.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\BYPLANES\*.* recurse
+cat_openwicon H:\My_Documents\Documents\tst.vic
+wait 3000
+close Walb_H:\My_Documents\Documents\tst.vic
+open I:\Demoscene.jpg
+open I:\Demoscene1.jpg
\ No newline at end of file
diff --git a/tools/vision/scripts/opnsav.vcs b/tools/vision/scripts/opnsav.vcs
new file mode 100644
index 0000000..948ad7d
--- /dev/null
+++ b/tools/vision/scripts/opnsav.vcs
@@ -0,0 +1,8 @@
+; LDV script sample
+; Demonstrates how to open/save images with saving options
+open H:\PURE_C\PROJECTS\VISION\IMGTEST\MARBLES.TIF
+save H:\PURE_C\PROJECTS\VISION\IMGTEST\MARBLES.TIF H:\PURE_C\PROJECTS\VISION\IMGTEST\mtest.tga
+save H:\PURE_C\PROJECTS\VISION\IMGTEST\MARBLES.TIF H:\PURE_C\PROJECTS\VISION\IMGTEST\mtest.tif compression=lzw;byteorder=intel
+; next line does not support all these options, you will see some info in vision.log about that but file is still saved
+save H:\PURE_C\PROJECTS\VISION\IMGTEST\MARBLES.TIF H:\PURE_C\PROJECTS\VISION\IMGTEST\mtest2.tga quality=80;flipflop=2;byteorder=motorola
+save H:\PURE_C\PROJECTS\VISION\IMGTEST\MARBLES.TIF H:\PURE_C\PROJECTS\VISION\IMGTEST\mtest.jpg quality=50
diff --git a/tools/vision/scripts/photos.ini b/tools/vision/scripts/photos.ini
new file mode 100644
index 0000000..93fab91
--- /dev/null
+++ b/tools/vision/scripts/photos.ini
@@ -0,0 +1,87 @@
+; First start with categories that won't stop processing
+; Cont = 1 means if match continue with other Lookxx
+; There can be up to 50 Lookxx from Look00 to Look49
+[Look0]
+Path=[corse]
+Cat2=Corse
+Continue=1
+
+[Look1]
+Path=[paris]
+Cat2=Paris
+Continue=1
+
+[Look3]
+Path=[hawai]
+Cat2=Hawai
+Continue=1
+
+[Look4]
+Path=[mazamet]
+Cat2=Mazamet
+Continue=1
+
+[Look5]
+Path=[rome]
+Cat2=Rome
+Continue=1
+
+[Look6]
+Path=[old]
+Cat2=Ancien
+Continue=1
+
+[Look7]
+Path=[imgtest]
+Cat2=TestSample
+Continue=1
+
+; Then those for which when there is a match
+; Procesing will stop there as these categories are exclusive
+[Look10]
+Path=I:\200?\*.*
+Cat1=2005-2009
+
+[Look11]
+Path=I:\2010\*.*
+Cat1=2010-2015
+
+[Look12]
+Path=I:\2011\*.*
+Cat1=2010-2015
+
+[Look13]
+Path=I:\2012\*.*
+Cat1=2010-2015
+
+[Look14]
+Path=I:\2013\*.*
+Cat1=2010-2015
+
+[Look15]
+Path=I:\2014\*.*
+Cat1=2010-2015
+
+[Look16]
+Path=I:\2015\*.*
+Cat1=2010-2015
+
+[Look17]
+Path=I:\2016\*.*
+Cat1=2016-2020
+
+[Look18]
+Path=I:\2017\*.*
+Cat1=2016-2020
+
+[Look19]
+Path=I:\2018\*.*
+Cat1=2016-2020
+
+[Look20]
+Path=I:\2019\*.*
+Cat1=2016-2020
+
+[Look21]
+Path=I:\2020\*.*
+Cat1=2016-2020
diff --git a/tools/vision/scripts/pinvert.ini b/tools/vision/scripts/pinvert.ini
new file mode 100644
index 0000000..1907e63
--- /dev/null
+++ b/tools/vision/scripts/pinvert.ini
@@ -0,0 +1,5 @@
+[LDVParams]
+x1=70%
+x2=90%
+y1=10%
+y2=30%
diff --git a/tools/vision/scripts/plight.ini b/tools/vision/scripts/plight.ini
new file mode 100644
index 0000000..386e2f7
--- /dev/null
+++ b/tools/vision/scripts/plight.ini
@@ -0,0 +1,10 @@
+[LDVParams]
+x1=70%
+x2=95%
+y1=65%
+y2=90%
+
+Parameter1=100
+Parameter2=100
+Parameter3=50
+Parameter4=110
diff --git a/tools/vision/scripts/ppuzzle.ini b/tools/vision/scripts/ppuzzle.ini
new file mode 100644
index 0000000..eb4c389
--- /dev/null
+++ b/tools/vision/scripts/ppuzzle.ini
@@ -0,0 +1,9 @@
+[LDVParams]
+x1=10%
+x2=30%
+y1=70%
+y2=90%
+
+Parameter1=20
+Parameter2=15
+Parameter3=20
diff --git a/tools/vision/scripts/protate.ini b/tools/vision/scripts/protate.ini
new file mode 100644
index 0000000..66e6c1e
--- /dev/null
+++ b/tools/vision/scripts/protate.ini
@@ -0,0 +1,7 @@
+[LDVParams]
+x1=40%
+x2=60%
+y1=40%
+y2=60%
+
+Parameter1=45
diff --git a/tools/vision/scripts/readme.txt b/tools/vision/scripts/readme.txt
new file mode 100644
index 0000000..e54c9d6
--- /dev/null
+++ b/tools/vision/scripts/readme.txt
@@ -0,0 +1,2 @@
+Please take these scripts as educational samples; they are very depending on my own configuration.
+This is just to give you an idea of how VISION scripting works, they are not intended to be working in general as image file location is surely not identical.
\ No newline at end of file
diff --git a/tools/vision/scripts/s0.vcs b/tools/vision/scripts/s0.vcs
new file mode 100644
index 0000000..ba3de1a
--- /dev/null
+++ b/tools/vision/scripts/s0.vcs
@@ -0,0 +1,6 @@
+; Catalog all ST images
+cat_create H:\My_Documents\Documents\s0.vic
+cat_addfile H:\My_Documents\Documents\s0.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\BYPLANES\32\XING_B32.TGA
+cat_openwicon H:\My_Documents\Documents\s0.vic
+wait 5000
+close H:\My_Documents\Documents\s0.vic
diff --git a/tools/vision/scripts/s1.vcs b/tools/vision/scripts/s1.vcs
new file mode 100644
index 0000000..a11d591
--- /dev/null
+++ b/tools/vision/scripts/s1.vcs
@@ -0,0 +1,8 @@
+; Catalog all ST images
+Loop 2
+cat_create H:\My_Documents\Documents\stimg.vic
+cat_addfolder H:\My_Documents\Documents\stimg.vic H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\*.* recurse
+cat_openwicon H:\My_Documents\Documents\stimg.vic
+wait 3000
+close H:\My_Documents\Documents\stimg.vic
+Endloop
\ No newline at end of file
diff --git a/tools/vision/scripts/spec512.vcs b/tools/vision/scripts/spec512.vcs
new file mode 100644
index 0000000..d531ac7
--- /dev/null
+++ b/tools/vision/scripts/spec512.vcs
@@ -0,0 +1,5 @@
+iprio_set 1,3,2
+Loop 2000
+open H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\spectrum\unispec\3d_512.sps
+close H:\PURE_C\PROJECTS\VISION\IMGTEST\ST-Picture-Formats\samples\spectrum\unispec\3d_512.sps
+Endloop
\ No newline at end of file
diff --git a/tools/vision/TCW128.DAT b/tools/vision/tcw128.dat
similarity index 98%
rename from tools/vision/TCW128.DAT
rename to tools/vision/tcw128.dat
index 6f05dd5..5e10422 100644
Binary files a/tools/vision/TCW128.DAT and b/tools/vision/tcw128.dat differ
diff --git a/tools/vision/TCW64.DAT b/tools/vision/tcw64.dat
similarity index 100%
rename from tools/vision/TCW64.DAT
rename to tools/vision/tcw64.dat
diff --git a/tools/vision/VISION.IMG b/tools/vision/vision.img
similarity index 100%
rename from tools/vision/VISION.IMG
rename to tools/vision/vision.img
diff --git a/tools/vision/vision.ini b/tools/vision/vision.ini
index 3f1a49a..83b5e7a 100644
--- a/tools/vision/vision.ini
+++ b/tools/vision/vision.ini
@@ -2,15 +2,14 @@
; Image Modules. There are 2 modules managed by VISION:
; 1: Internal modules (in VISION's prg file)
; 2: zView LDG modules
+; 3: zView IM modules
+; 4: zView SLB modules
; Global defines a generic rule for all image formats
-; Some examples:
+; Some example:
; Global=2,1
-; --> Prefer zView plugins to load images
-; Global=1
-; --> Only use VISION's internal modules to load images
-; By default VISION will prefer its own modules and fall back to zView plugin if not supported
+; By default VISION will prefer its own modules and fall back to zView IM then LDG plugin if not supported:
[Img Priorities]
-Global = 1,2
+Global = 1,3,2
[SlideShow]
DisplayProg = 1
@@ -35,14 +34,15 @@ HandleLock = 0
UseDSP = 0
[Folders]
-zvLDG =
-LDV =
-Album =
-Filters =
-DSP =
-Images =
-Temp =
-Languages =
+zvLDG = C:\tools\vision\zvLDG
+LDV = C:\tools\vision\LDV
+Album = C:\tools\vision
+Filters = C:\tools\vision\FILTRES
+DSP = C:\tools\vision\DSP
+Images = C:\tools\vision
+Temp = C:\tools\vision\TEMP
+Languages = C:\tools\vision\LANGUES
+ImgMod = C:\GEMSYS\IMGMOD
[Logging]
; LoggingFlags:
@@ -61,7 +61,7 @@ Languages =
; TMP2 $000008
; TMP1 $000004
; Unsed bits can be set to 0 or 1
-LoggingFlags = 1ff900f
+LoggingFlags = 1ff9000
LoggingFile = vision.log
; FlushFreq is used to avoid flushing log to disk
; For every log request:
@@ -76,8 +76,6 @@ LoggingFlushFreq = 1
PreviewDstSize = 640
; PreviewSrcSize to 0 will simply show only result of LDV
PreviewSrcSize = 0
-MePriority = 0
-ShowPerf = 0
; You can hide processors to LDV (e.g. for testing)
Hide030 = 0
HideFPU = 0
@@ -88,12 +86,6 @@ SnapKeyDirect = 652f
SnapKeyViaConfig = 662a
SnapFlags = 1
-[Log]
-; Pretty misnamed here, it's just a facility to generate a slide show file (.vss)
-; By loading pictures
-LogFlags = 0
-LogFile =
-
[Graphics]
PColor = 1
PHeight = 16
@@ -124,6 +116,8 @@ TWCar = 7
MaskOutside = 0
EraserForm = 0
WriteMode = 1
+; Here is the thickness list mapped to Control-1 to Control-9
+Thickness = 1,4,7,10,14,18,22,26,30
[Real Time Zoom]
RTHeight = 128
@@ -154,7 +148,7 @@ FullScreen = 0
DisplayToolBar = 1
SplashWindow = 0
DitherAuto = 1
-HelpBubbles = 1
+HelpBubbles = 0
Language = ENGLISH
; RSRC choice for loading resources
; -1: Auto (default)
@@ -162,3 +156,19 @@ Language = ENGLISH
; 1: Use regular rsrc provided by AES
; -1 should work always but TC32 on a Falcon+Radeon card
RsrcChoice = -1
+HexDumpOnError = 1
+ShowIBrowser = 1
+
+[Update]
+Choice = 1
+LastCheck = 0
+MinCheck = 604800
+TrustedCAFile =
+; TrustedCAFile must be filled-in only if https is enforced (yes http://vision2.atari.org redirects to a https website)
+; cacert.pem must be in VISION's folder, cacert.pem can be found at https://curl.se/docs/caextract.html or https://github.com/freemint/git/releases/download/v2.11.0-m68k/certs.tar.bz2
+; TrustedCAFile must point to a file which contains RootCA for Let's Encrypt
+; If TrustedCAFile is empty, curl can still use https but in "insecure mode" (curl does not check against server certificate)
+; By default, wget (http only) is defined
+Enabled = 1
+Updater = wget
+URL = http://vision.atari.org/vupdate/staging/
diff --git a/tools/vision/vision.prg b/tools/vision/vision.prg
new file mode 100644
index 0000000..3db2e6a
Binary files /dev/null and b/tools/vision/vision.prg differ
diff --git a/tools/vision/vision.ver b/tools/vision/vision.ver
new file mode 100644
index 0000000..d77b59f
--- /dev/null
+++ b/tools/vision/vision.ver
@@ -0,0 +1,324 @@
+Version = 4.9b2
+cacert.pem 208065 ae31ecb3c6e9ff3154cb7a55f017090448f88482f0e94ac927c0c67a1f33b9cf
+dsp\convol.lod 3317 1737051a7c3778e869a45af36b42b1b1b6d3f6bae83a89f3045ab7001459ff04
+dsp\exjpegd.prg 10640 65733cdd3adc51c34bb5ba51425771d00bd3f7f0ab81470ded1813976b330026
+dsp\jpegd.prg 10640 f5a7b46c4b76a0d2480e3362b6bc299d93308f57ac309323d9c5f7a740096108
+dsp\nfjpeg.prg 3132 1965f30e520dce312bdfc4d83333ab4962624b1db058e133a3ca7613f6bdd087
+filtres\bidon.vcf 95 5a0536e46f43588de2acdb63af65171fe425d86ff85cb2758971c2dda6f3f62c
+filtres\english\bidon.vcf 95 5a0536e46f43588de2acdb63af65171fe425d86ff85cb2758971c2dda6f3f62c
+filtres\english\flou1.vcf 95 f6c01a0ad3c50f311ec0a7e7b0d732967cfd5e1744f8060f11cc0e86eaeae9e6
+filtres\english\flou2.vcf 95 77ca64a156a7590ab0e076eaca49acec92f563fb42d6208ed2300a17d11806f6
+filtres\english\flou3.vcf 95 fad6c9509267cb77adb207cb2cc2e88ef7833108a0fbc4e8b4c995054d08fb56
+filtres\english\flou551.vcf 111 df82ceeeb4b8c2e9e6d8c038690bae8bd4bcd77fc53dd201409d8ba6d4640502
+filtres\english\flou552.vcf 111 5930ad0a3052a168447a445b602090fd0a11f56f1d832df6200c94fe7b3f7d46
+filtres\english\flou553.vcf 111 62b9519fb5aa5626a479b3681a02e5b64a41e55af3db1d0b1557e9b036fac2cc
+filtres\english\flou554.vcf 111 0496f73d4e10ef761026c1074cc3a22ab9a678b3b8b42f7a1c319c10015666ca
+filtres\english\grad33e.vcf 95 efe2921bb4aae7082152334cca4702a636eb6325f4d7204a81a2c9e813af69ab
+filtres\english\grad33n.vcf 95 d74fbf28d899356ffd169da07095059fa3f1c44b55e7d6ee8e36793222f5d45a
+filtres\english\grad33ne.vcf 95 99d4c9fb5692f7b140134a99a6f2a134b505c3f2acdddae639563add26ffc778
+filtres\english\grad33no.vcf 95 42c31b748bd9100393fb232552d3d0cc4392d364d48efb2dd745216b58d7da88
+filtres\english\grad33o.vcf 95 6565a16e944b4f22fa881cdad32e22f12ef7811a2e60a1f2a07eff2d347c3140
+filtres\english\grad33s.vcf 95 8329d93032c150cb4f33b9ad4d4d50626db3022f2bd45a4f6977e69f16794fae
+filtres\english\grad33se.vcf 95 1ce396f47f1558c838894a238265c8c25f6c6501b37cc5807329205c104da654
+filtres\english\grad33so.vcf 95 a51cd5079b2a02c9bf3dcbc9c473cb09d349894115cab1023540c64970a82c8a
+filtres\english\lapla331.vcf 95 bbcc66770daa9a367e8a8a203c7067ba5d837484594719621322794637fbe949
+filtres\english\lapla551.vcf 111 845ae796b308c133e0c4f95d6c22a853c93963e386e22ee23aa0b6a831260058
+filtres\english\net331.vcf 95 86e94ff16b1f63d7884460ea715dc6cc329bee962b5723fcbb1a6b8dce094a6a
+filtres\english\obre3de.vcf 95 37023885dbacba0e64ba2f19187db16fe0b4f4780f3fc8d496e150b87fcaaa88
+filtres\english\obre3dne.vcf 95 517206d698043ca38f6261c3ce8a1c916b15cf00a0740847259544005f7eebab
+filtres\english\obre3dno.vcf 95 b7b598955bd88edde5a3e40e00e34339413d8a0b35de9fd0b7063a90e6e4f7df
+filtres\english\obre3do.vcf 95 27c9a4ad730ce4398de3b9ea6d1f04039199ce87d5d91c38ad15c42abf20d629
+filtres\english\obre3dse.vcf 95 9131d2ecf9fdc215f705ef8482162aa6b35c12c39ab4c84f7c68d15281b7f6c5
+filtres\english\obre3dso.vcf 95 b80b25900fc4fef3c31f6070b82c6a0d103ed92ba034c8f81b38a9de9c456227
+filtres\english\perso331.vcf 95 6605160ae1374aeed5c33616c01b0825eec0d7bfd5b489fb270152e1a959f227
+filtres\english\perso332.vcf 95 10436d4abcd4b10689ff41ba74762682b77f5b0084f0409908e19d22662eeaf3
+filtres\english\perso333.vcf 95 98baf4815d51dbb11bc5308418281877ee7a60c63665bcb105b43005f793244c
+filtres\english\perso334.vcf 95 c7de7deaf17847492de2538b209e38138be361f1da1df69ebba0da7c3d487c23
+filtres\english\xxx.vcf 95 f888f206d1e735a61d7d568acce9c81bd4a432d2911a0e8eb00884028af4abc4
+filtres\flou1.vcf 95 f6c01a0ad3c50f311ec0a7e7b0d732967cfd5e1744f8060f11cc0e86eaeae9e6
+filtres\flou2.vcf 95 77ca64a156a7590ab0e076eaca49acec92f563fb42d6208ed2300a17d11806f6
+filtres\flou3.vcf 95 fad6c9509267cb77adb207cb2cc2e88ef7833108a0fbc4e8b4c995054d08fb56
+filtres\flou551.vcf 111 df82ceeeb4b8c2e9e6d8c038690bae8bd4bcd77fc53dd201409d8ba6d4640502
+filtres\flou552.vcf 111 5930ad0a3052a168447a445b602090fd0a11f56f1d832df6200c94fe7b3f7d46
+filtres\flou553.vcf 111 62b9519fb5aa5626a479b3681a02e5b64a41e55af3db1d0b1557e9b036fac2cc
+filtres\flou554.vcf 111 0496f73d4e10ef761026c1074cc3a22ab9a678b3b8b42f7a1c319c10015666ca
+filtres\francais\bidon.vcf 95 c63dfeb18899af3ab0135b33dee0a742d507f9dc2f638f8a770c32293a5fb113
+filtres\francais\flou1.vcf 95 b7c75fb64e8c07f8f5a2bd89ac24a13b3b710711b1e46f03d81e4661b3b85428
+filtres\francais\flou2.vcf 95 c5c41646ac823f7653a3eaedf78407a9199d4c94f692abca4468328c731e8522
+filtres\francais\flou3.vcf 95 7eeec8b27558634d0ea66585b6d8746c341f4c6eac2f109265fb815cfeac6965
+filtres\francais\flou551.vcf 111 402862a9b0ae431e1a95e9b667fc0be5c67e2e12a68a412310850f5db2451641
+filtres\francais\flou552.vcf 111 18bfef3e46d0f8c135362193bea660cc9da7f621700afb170c848a011b146206
+filtres\francais\flou553.vcf 111 6840a519f1814b4f6101bde93a1c1109a9e041c08ef637dbc4a0ffd4137d61b1
+filtres\francais\flou554.vcf 111 09648a789a5f18cfba6bdef8ed8dce1974f7a40c88c960ab02087dd645116505
+filtres\francais\grad33e.vcf 95 79364a59318fb464ace590cd8bdc2ed648b4bacc3efddd193106928bed94bdec
+filtres\francais\grad33n.vcf 95 c6810d9106bc73aa20cf65244442188a5cf89194ee4e75f4975e5304826c7b1e
+filtres\francais\grad33ne.vcf 95 878b5c2f091aa6905d8a0be0490ddcf9f9196795ca7e7d65e097e5b58d98b5aa
+filtres\francais\grad33no.vcf 95 ff8bc6625fe522106b97b957228eed67b2c1b54c085f4a1ca88bcc0d1669019e
+filtres\francais\grad33o.vcf 95 70b4201557e237c16624ce1edc313ac236a57303e546f1c0d540b0e7db541cf2
+filtres\francais\grad33s.vcf 95 359f51313a49e23b747ff08c5a2848c41599ff007f0392e6d768e0005c5b10b9
+filtres\francais\grad33se.vcf 95 289f55c8cace2d70c81b7f987f15c00e3e33a990b3576c85743e3495acdb583f
+filtres\francais\grad33so.vcf 95 ab0e8ea9acfd2f4935604627fdd1ad5662c64b3e5176374f8dc41ce34685b9a2
+filtres\francais\lapla331.vcf 95 95667e2cb49672546ca58565f088ef268345045741c6875257f1cb5e65e2bac1
+filtres\francais\lapla551.vcf 111 10a4cf60772dcc3853fec9eb4055cc9108618b2dad60b51e1fba94f340e39269
+filtres\francais\net331.vcf 95 88ab11b98092fc264d14656cf601ce821aa083bd5e59faeb5d24cfdedc08878c
+filtres\francais\obre3de.vcf 95 ba63c3328d8853da2e098ebcbbdbf674c12b7f40048d63d9e66b319683974c70
+filtres\francais\obre3dne.vcf 95 878b5c2f091aa6905d8a0be0490ddcf9f9196795ca7e7d65e097e5b58d98b5aa
+filtres\francais\obre3dno.vcf 95 b5646a9708ac0aaeb6d1cb81766caedd0e01e18f10da7e9cd10b72bc839fe3b9
+filtres\francais\obre3do.vcf 95 ae2db5f23a9a12a5ed7fa82d6d3e8e6a1a42ecbd8d9e759a85c6bd04eb22a898
+filtres\francais\obre3dse.vcf 95 d899fe27b92be61c5cd75c57e9c8978e2400d086449d14983d4fdbf4d1b8aeec
+filtres\francais\obre3dso.vcf 95 a581cd014cd65c3fe7a75592a1f99fd85e305b5fcf711f660188986c73d095f1
+filtres\francais\perso331.vcf 95 904b71281a121f77f5aeea3f2f29399aebbe9ae6f4190bae95209b4496851f2c
+filtres\francais\perso332.vcf 95 8f9668675fb66aacafe2af5176d563f39430b164f09c36747aaf8159e7ffcab6
+filtres\francais\perso333.vcf 95 522be3f39c3d4c231712621bc119e8f736865c939582ece5c8762c106be8db74
+filtres\francais\perso334.vcf 95 1fd7d578be92e0711a3ecd9a60ddc9bb459fa45744c3f25b66ce0fb9d4b6ce7c
+filtres\francais\xxx.vcf 95 46282cf8422d736f5a34c9e87c472c54fc6106a69c3b4996f934dd85d1d7bae0
+filtres\grad33e.vcf 95 efe2921bb4aae7082152334cca4702a636eb6325f4d7204a81a2c9e813af69ab
+filtres\grad33n.vcf 95 d74fbf28d899356ffd169da07095059fa3f1c44b55e7d6ee8e36793222f5d45a
+filtres\grad33ne.vcf 95 99d4c9fb5692f7b140134a99a6f2a134b505c3f2acdddae639563add26ffc778
+filtres\grad33no.vcf 95 42c31b748bd9100393fb232552d3d0cc4392d364d48efb2dd745216b58d7da88
+filtres\grad33o.vcf 95 6565a16e944b4f22fa881cdad32e22f12ef7811a2e60a1f2a07eff2d347c3140
+filtres\grad33s.vcf 95 8329d93032c150cb4f33b9ad4d4d50626db3022f2bd45a4f6977e69f16794fae
+filtres\grad33se.vcf 95 1ce396f47f1558c838894a238265c8c25f6c6501b37cc5807329205c104da654
+filtres\grad33so.vcf 95 a51cd5079b2a02c9bf3dcbc9c473cb09d349894115cab1023540c64970a82c8a
+filtres\lapla331.vcf 95 bbcc66770daa9a367e8a8a203c7067ba5d837484594719621322794637fbe949
+filtres\lapla551.vcf 111 845ae796b308c133e0c4f95d6c22a853c93963e386e22ee23aa0b6a831260058
+filtres\net331.vcf 95 86e94ff16b1f63d7884460ea715dc6cc329bee962b5723fcbb1a6b8dce094a6a
+filtres\obre3de.vcf 95 37023885dbacba0e64ba2f19187db16fe0b4f4780f3fc8d496e150b87fcaaa88
+filtres\obre3dne.vcf 95 517206d698043ca38f6261c3ce8a1c916b15cf00a0740847259544005f7eebab
+filtres\obre3dno.vcf 95 b7b598955bd88edde5a3e40e00e34339413d8a0b35de9fd0b7063a90e6e4f7df
+filtres\obre3do.vcf 95 27c9a4ad730ce4398de3b9ea6d1f04039199ce87d5d91c38ad15c42abf20d629
+filtres\obre3dse.vcf 95 9131d2ecf9fdc215f705ef8482162aa6b35c12c39ab4c84f7c68d15281b7f6c5
+filtres\obre3dso.vcf 95 b80b25900fc4fef3c31f6070b82c6a0d103ed92ba034c8f81b38a9de9c456227
+filtres\perso331.vcf 95 6605160ae1374aeed5c33616c01b0825eec0d7bfd5b489fb270152e1a959f227
+filtres\perso332.vcf 95 10436d4abcd4b10689ff41ba74762682b77f5b0084f0409908e19d22662eeaf3
+filtres\perso333.vcf 95 98baf4815d51dbb11bc5308418281877ee7a60c63665bcb105b43005f793244c
+filtres\perso334.vcf 95 c7de7deaf17847492de2538b209e38138be361f1da1df69ebba0da7c3d487c23
+filtres\xxx.vcf 95 f888f206d1e735a61d7d568acce9c81bd4a432d2911a0e8eb00884028af4abc4
+langues\bulle.rsc 8800 4154ef2ab9a0f7872c0677f483209bf5fcc4678e83913fa682b9940b111b80e6
+langues\chkmsg.c 4287 74251f0b5ba51d5c3b3b7a52181d1023ad6a1671c3ef75743da7e31c55904ac5
+langues\chkmsg.prg 8268 983356754ccd5568eb91559ac71b322fcf8520abe934f76005bd484a2e509839
+langues\chkmsg.prj 274 e130ffb1e789b487d82cb496849302a5475cee6b163b842ccf881b337cf9b4e1
+langues\deutsch\vision.hrd 682 f4baaaf205216344848650efeecdc9283f28b53cfc145b1c1119502508e5ecb8
+langues\deutsch\vision.rsc 125004 11e66d879270eb71a7f13e7b695d00c9f98dae11785d269fecd7228c8c342704
+langues\deutsch\visionb.hrd 682 f4baaaf205216344848650efeecdc9283f28b53cfc145b1c1119502508e5ecb8
+langues\deutsch\visionb.rsc 123876 9b23e3c5f4a032a2ef194f1d5650cd0e1bc59241ab91902013f859f4c50c7cb3
+langues\deutsch\vmsg.txt 10743 ba368f40269de20f3996a210d2cc5d79809384203ddc6e058a26c690c1542873
+langues\english\vision.h 51338 65358c54e03625f48c3f060bdff58db8ec5aae6a1d0111505952b6f1e03a0a4e
+langues\english\vision.hrd 682 f4baaaf205216344848650efeecdc9283f28b53cfc145b1c1119502508e5ecb8
+langues\english\vision.rsc 124982 5852c53bbdab25e7f62d87f32260d715946fccc9bce22e1810f6b4e6069e2701
+langues\english\visionb.h 48589 14e292ed13c17025a45b80a49430eb804b93fa49b8fce5db497d874f8c5b13fb
+langues\english\visionb.hrd 682 f4baaaf205216344848650efeecdc9283f28b53cfc145b1c1119502508e5ecb8
+langues\english\visionb.rsc 123704 32e0ecc6fb43904d08db266701a70b437d84cbf55b7b8013b69aaf647ea1d1ff
+langues\english\vmsg.txt 10498 2cfacc65209d9f54e01ff571e1bd1d911c8efb4167bc1aa6d0e28922e733f38d
+langues\francais\vision.h 52771 948ca376d8e5303835b32f4ad044c5735708bfb6d6640225e477e66788c2752e
+langues\francais\vision.hrd 15278 b26b976a3b21ffd2425b9952a6c5cc061469ff5a7db5b1243322525508a839b6
+langues\francais\vision.rsc 126204 654c92c91b2094b78645c7b39869c65153535fc181c7d6ca784b0eacbd1cfeaf
+langues\francais\visionb.h 50559 20699bf195e73ecdcf4739fd0662faeeaf0cf67d324aa4a4f980ad5c18449315
+langues\francais\visionb.hrd 682 f4baaaf205216344848650efeecdc9283f28b53cfc145b1c1119502508e5ecb8
+langues\francais\visionb.rsc 124934 a637a3034fa6cb7aed38426dfe03dbd740c9c802c8a3539be7b96f49c330d1a1
+langues\francais\vmsg.h 7700 d9268e6ccb4ef85439b3351de20957af2e998f726918132aa74df77216c8daba
+langues\francais\vmsg.txt 12786 40d50840aa05cf49a507db780581e047e470235cff6c27b3af7fd957766b733a
+langues\italian\vision.hrd 682 f4baaaf205216344848650efeecdc9283f28b53cfc145b1c1119502508e5ecb8
+langues\italian\vision.rsc 125374 20a958ccbfa7833ced33116547095e6fad2f443bd4817753bd70245a52d58f81
+langues\italian\visionb.hrd 682 f4baaaf205216344848650efeecdc9283f28b53cfc145b1c1119502508e5ecb8
+langues\italian\visionb.rsc 124382 e39b2ab396d75430c00575634e8d6601cc4e859a43b183d37b8725b11a449365
+langues\italian\vmsg.txt 11788 df53e8c9795db566944c407f6050b9e0b552612403ff7baceeb3c68610456308
+langues\readme.txt 1288 c5bf73b2cdbeac236f49475979dda7265e1983e911bfbe703721510dcd75bd95
+langues\svenska\vision.hrd 682 f4baaaf205216344848650efeecdc9283f28b53cfc145b1c1119502508e5ecb8
+langues\svenska\vision.rsc 124742 503e0e2ebb07ddc4c655664b1a607c4c6ae426190193fb351c3ad5ff012e25f5
+langues\svenska\visionb.hrd 682 f4baaaf205216344848650efeecdc9283f28b53cfc145b1c1119502508e5ecb8
+langues\svenska\visionb.rsc 123888 a355db60032990a8643040dc72dd4954af40de20ce2c026eddb246fbe0d14f9f
+langues\svenska\vmsg.txt 10825 068be801f0102f5a1ab25c3afb2c68b59eeec52972de5522bcfa0d0d7c67b441
+ldv\bhole.ini 1540 3fbacbbebbc8039d0c950cc0bb03fd862f7afb55ea1efcf86e8d53f6d742a219
+ldv\bhole.ldv 20060 59c297d518204bd154dff27d6d642db31098cbb47998973cd51c471940b60456
+ldv\bw.ini 1137 d03f21e6df8bb54d4c836cdc09e27a0b6786f9b0f1562b6ef59e26dea71095d4
+ldv\bw.ldv 5382 a7a0c9d7908db772e474609c91a29ff852823e1e32bbacf6ef6d79b625ef2903
+ldv\cntcol.ini 1666 d54f1a9eb4597405af22c94f4e4b2f9965e0fe070b7bd5a336cb3ac0d0dfaf03
+ldv\cntcol.ldv 12061 8527fbe855ee0b9b78bd9db4fe869a3fcd80881a6eee274dbab1488ab292a923
+ldv\dither.ini 1343 32f2e41ff10caa57d66eb063952bf37a79b6b971c1dd0c2036d8021e35ce1620
+ldv\dither.ldv 2538 01078d8a893457983ae12be38fb3298c3a28710efe46c8f24057488229be3cea
+ldv\doc\defines.htm 13417 d991068988db239324fc0ab2ef5f410f626f048770dad310f791da5d40efe269
+ldv\doc\descrip.htm 22190 757ad152fbee16ec047c1b13c57bc572614485e9faca44ec823735821c217dfe
+ldv\doc\english\defines.htm 11455 ff113ce78363c7fc66a096602aa67296f8ced7d518d751656310494458e9874b
+ldv\doc\english\descrip.htm 17446 5f6569cfbb33abe228a29855d7f226be6783122d05ac99941c6584be89ad9b82
+ldv\doc\english\hints.htm 13491 ed1affb9460f6cc46a7c644ab41039e43003998c16db46e16a92b5e50b471bec
+ldv\doc\english\images\conc2.gif 8385 f2054314a609bae3329efa2487748e030eda183fb2a83250b01dc369eed20ca3
+ldv\doc\english\images\cprev.jpg 726 ed552d311677cdecb1c4b49a16a92c5896a4e730251a3f16f1389a10041e196e
+ldv\doc\english\images\csom.jpg 518 b76d0fb3cc23f6b3aed8220eb2ae0ab20d03f9d3289ad276db686a959fab0202
+ldv\doc\english\images\csuiv.jpg 703 1fce01d6b96ae2cff4229db3209455970c9a5a9f6905c223b512c688986c7549
+ldv\doc\english\images\icointro.gif 492 48856898e6f008494997e942327dae52910664efda84aa5953c076e85f3e366c
+ldv\doc\english\images\icoprinc.gif 413 3805372ea73877dc615a6a91208efe298c12ee052102cfd9b1c8c14f4480b19c
+ldv\doc\english\index.htm 6081 36718607e781673db438deaef54766ce956d9cb5bc3adea8e188445cb07e57fe
+ldv\doc\english\intro.htm 6745 1f64a34f4123b64cb0ebe46f8413e2dbbdc4084620e62f3c3d92a898eeada369
+ldv\doc\english\kitdev.htm 26152 ece16f26f591df3ce647cf0eac2846ba55fd9019e230399b9fa80336eeac2000
+ldv\doc\english\modele.htm 4002 343bd4ca8e5f44adb682144e3f9cf64885ded4c88c83ddeb5429a042264e1959
+ldv\doc\english\notions.htm 9016 3c569730ac231f54ac500f46878a73229eaba7ba18c24a9127a82c009c5132f0
+ldv\doc\english\struct.htm 17347 fb2690b2d64875955e9b85d2ff5050dec4b3c17a93fe75c08ee4716ccc183f38
+ldv\doc\english\vapi\co.htm 9939 3b1a2b1c2e637747714b837d917dc1092fd1a57ba5732bf6770772e65ca23bee
+ldv\doc\english\vapi\fi.html 11292 5c629d2e57088ad044ac4f92cb2b5430e313e8e18b12241b772a27f4e6e1dffe
+ldv\doc\english\vapi\im.htm 14177 1e74dcbeba4b924e591a191e41a0426db8defb5be0dbf114822fa988009be814
+ldv\doc\english\vapi\in.htm 15507 d6041167c077c41f9869048c13f1e6c7b2b377308c6e2a049a41b0fe7fb0c35b
+ldv\doc\english\vapi\index.htm 7291 7dfa8b99f069077213d674ade965e31e259ec345053e9255627fe37fc004afa1
+ldv\doc\english\vapi\lo.htm 7284 46aa926c44000dec3fc74a578d925eb6dc69c5c11143903e558fe0082d9c1808
+ldv\doc\english\vapi\me.htm 15448 c92f915b119516985136be0d76d965a79ca1b3504720cb9f2321d94deef3ede0
+ldv\doc\english\vapi\modele.htm 4038 ce4cea3d331fc0365b51cfebae8616cb3ed697a0a97b20ee935c75be8b553176
+ldv\doc\english\vapi\pr.htm 9351 7aac6b7789b42ddf4220d72883bd8aa0e8d28fea4e99e8bad1d00eab840e793a
+ldv\doc\english\vapi\ra.htm 31733 56b48643a36f291913ea18b9272d44301d215cb51d7988dc8f2358d2ae13a518
+ldv\doc\english\vapi\struct.htm 8001 b296aef72b87d15363300917476df7c1b51080476caadffbcbefebb387f709ce
+ldv\doc\hints.htm 15537 a22f1547ffe1000357899cde265c42a71d2b412ee9da7fd204840d2f591f3a7d
+ldv\doc\images\conc2.gif 8385 f2054314a609bae3329efa2487748e030eda183fb2a83250b01dc369eed20ca3
+ldv\doc\images\cprev.jpg 726 ed552d311677cdecb1c4b49a16a92c5896a4e730251a3f16f1389a10041e196e
+ldv\doc\images\csom.jpg 518 b76d0fb3cc23f6b3aed8220eb2ae0ab20d03f9d3289ad276db686a959fab0202
+ldv\doc\images\csuiv.jpg 703 1fce01d6b96ae2cff4229db3209455970c9a5a9f6905c223b512c688986c7549
+ldv\doc\images\icointro.gif 492 48856898e6f008494997e942327dae52910664efda84aa5953c076e85f3e366c
+ldv\doc\images\icoprinc.gif 413 3805372ea73877dc615a6a91208efe298c12ee052102cfd9b1c8c14f4480b19c
+ldv\doc\index.htm 6211 92cb41eb085c71883621378191a3a46f367f518f300ee65325d3cc98c1e459e8
+ldv\doc\intro.htm 7477 8462c74f1aedb0a5528899b0ada238a7529c3aa70255be00b225c67ad982a022
+ldv\doc\kitdev.htm 22334 7deabba8fb582ce5e36060916ac58a0fde7ebf55e0e8d276db40d3dcceb7ea77
+ldv\doc\modele.htm 4036 c747f981a06ad8f7981d39858825a240852e75b4d3a9927261a07153acdc5f4e
+ldv\doc\notions.htm 9414 0b34332921518c6b9d3ee244d59dbd4b73b8b21f428cf73c104f69572c126666
+ldv\doc\struct.htm 19158 6e93975c8684cbe4f7c0daa7c8bcf80b3ffb1d3146d5cae9790a91e87df1fe3b
+ldv\doc\vapi\co.htm 10899 85d8648a0895659e5f91d6e115559dcfbdeeeb8d2d1b4ab6b688eeb533ed149b
+ldv\doc\vapi\fi.htm 11310 91d605e444b6401acfc453cbf3d3fe92032c4780bb5c31f5d07c04e641c302fa
+ldv\doc\vapi\im.htm 14368 6d97f5db4a5f08c218090b687e50e28a6d6f8f3a6ad1f2d183197f88736891e8
+ldv\doc\vapi\in.htm 16375 8e7e8089e4ecffe6a9f3eb37e291294b4ed3e1fd1b0bfc2e6c4425bee7fe5a5e
+ldv\doc\vapi\index.htm 7784 57bc8231f833a0b2fb29964b5638bbd748c2904b865333c6c350a028a6766e2b
+ldv\doc\vapi\lo.htm 7667 0eaf924267ccca41dd34f4d11597688e1a2e5a9925f94535641f923f8c8871ac
+ldv\doc\vapi\me.htm 10811 a9a3f46f8e3525edef984fff13e688c465953511679fb0212b0f4367356dbfc1
+ldv\doc\vapi\modele.htm 4071 50efe71aafbe4d7a3a43958c22cec2a13286710d7a05583c92ad41c161b7b3b2
+ldv\doc\vapi\pr.htm 10725 8ace3fdf5501c67722f287f86f9f7e0aaaf9351ceda85e1dcab5437e86cc6975
+ldv\doc\vapi\ra.htm 34585 197600d399036b8c119c1ee8d2caf08c14fdd84a3bdc21b80b9eda5057b598a7
+ldv\doc\vapi\struct.htm 9051 fa696f4cae608b2dba77b8c7f4ef2e7841b422176c2fa5c0b5654240acf3ea58
+ldv\francais\bhole.ini 1536 8f0585fc40ba621277088b7294c48fc9f4b2bf9b83521f2c5f780e69e3dbf1bf
+ldv\francais\bw.ini 1139 f64e140a517066341ab6076b54e65164e569cbc1450324642aca8c3fa12f2da7
+ldv\francais\cntcol.ini 1740 136e5f7b7345f8c89cd0951c40d568dff42054bf60a23472e3961b355b278ec1
+ldv\francais\gamma.ini 1377 5c8efe023365e38103ac01ce262cf8f469ebbc6dbaaef99290885babab3737a9
+ldv\francais\genimg.ini 1113 cc7c02eed8b589e841992ae60fa8fb902de22710c0fc3474b2b2c845b5c8a00e
+ldv\francais\invert.ini 1226 93e088a0aaedbf9560a003f332eb266efb026dddab06ca7c11295540df1b7534
+ldv\francais\light.ini 1355 3fa6b8a42b77f543ecffcf6a8755c74392052d0177b237301248bb8b0551bdc6
+ldv\francais\pixel.ini 1070 34da91d9a77467c552cc47d78aee1078a78ea47d64a2f20ff4e9571c97541846
+ldv\francais\puzzle.ini 1251 30ec45abc20a44a6986be1861ef2e62790606f299aaa4c5b9da8361317cea353
+ldv\francais\rotate.ini 1074 7c1792e33b600acbcea1aa72276d0d1bb06e9c3258dab2e7ec5f4543bf5baff8
+ldv\francais\xwave.ini 1195 e3016c9fff5867922669ca72ae3039b3215b7afa84f9b1b06d0c85b2b2e7267d
+ldv\francais\ypersc.ini 1185 c7efe551fb0af02ac843a2d6e35d736a8f1f12ceb2519e0aa61b471419cadb37
+ldv\francais\ywave.ini 1195 24fdab1e7764b296733fbf8c4d0b4bc96b79e3dace287e0553429b7aefc923fb
+ldv\gamma.ini 1357 df8c3c30f969e2bb2abd729a3be7abc60432ee8118bf4adc2947744712ab3687
+ldv\gamma.ldv 9560 4cae0078bf64fdde9437b9b9831144b3a63269dbc920ed215d86331121ddf727
+ldv\genimg.ini 1057 bb1b18b01e9c8dc4fde34722b9fe0cf3f05eebbb21966d87fed61b8a967f2b19
+ldv\genimg.ldv 3402 785ead5fe4df608434364ed3b1787cfaf1ec2ddbf3d266541af3ee3fc2b6c528
+ldv\invert.ini 1112 f1f9144b69e6ddeb43177899276acb2d1c9bdb379319839518faf3ccbe5ab7db
+ldv\invert.ldv 3209 6a157a1f108083fb42e9b34195df2a4f1cd69912792e80c920837d21baa1b44d
+ldv\ldg.h 5802 9c5c6ca6b36c97498890d3cfcb49a94ea2ae719986e193505fb2928974c92266
+ldv\ldg.lib 3036 12fdae214aa3476fde562f6b273fe9f969211de819bbb26b679dab2aec62fedd
+ldv\ldv.h 5648 f27dc140d4cf9ef9362e2b90a686f5aa7d5ba59e63d841e0545c0655a92359b1
+ldv\ldvcom.h 3349 466a6f7a1c60309d7740ef08844e75bdeef36a33c91f47017e5522d628a67eb5
+ldv\light.ini 1358 c7674365255b435fd41a1f4f58ff20918c1a336695ffe5d507667de4815d6deb
+ldv\light.ldv 3182 0b2828f91b728ffa2de87b59eb4bbd2eab267760c5a10609953433f69ef4caf8
+ldv\mt_aes.h 9594 a5d303b2c187c6393dfe274c4b6c076ac700f6acc604f4130c2bb9132a93aae6
+ldv\mt_aes.lib 12068 cfa72009b79dc206ecb10550ee35d1018e289f59ec6ec1fa005963aa1ea83ec5
+ldv\optimg.ini 3356 829c696949df2478b0d19f90be6c4a238df35c3023138c42af3cfc7a3cc81936
+ldv\optimg.ldv 15195 0793c890a6e7603de3ce6ef9c568168eb90e949abe0414247a60312386310aa3
+ldv\pixel.ini 1069 05e361a82b975cfc5fd1ae02b1c74f7d2e7c059ae0dd6a2c62eda95f8f19142d
+ldv\pixel.ldv 3972 b9d3a9160effbe11372085f85b0c8d912595115025192ec50ca88c2b2cf72fc5
+ldv\puzzle.ini 1232 f3acfbb35397e326f1623a0d8c00f3940952cc934fd22f126d69b5dd03394136
+ldv\puzzle.ldv 4076 7b5c4b14c4885bf489f1f249849ec291955d053f133e0a55cc4656aaf10aee39
+ldv\rotate.ini 1053 ca5f0946b982b138a61917308f6d142242e9768b64202243c4a486d2b9e2fabc
+ldv\rotate.ldv 2359 551cb6c89e180f97461ee1e4400cc733bb3b462578ab3d1ae3f6471b33fa5015
+ldv\smlldv.h 13441 dac0973aac3142ec7d6d741a68fa8e6f5cdf6bae8a5daac2fd929d4f47da5a61
+ldv\smp_ldv.ini 873 fe5a69342e950b14f81d723829974b44c83e9327d9eb251495e99aea96a8f601
+ldv\src\bhole\bhole.c 29306 3726a29eb712a7399f2c4e430dc8dfeb3d9aa48586c625e769b0b63d1098366a
+ldv\src\bhole\bhole.ldv 20060 59c297d518204bd154dff27d6d642db31098cbb47998973cd51c471940b60456
+ldv\src\bhole\bhole.prj 149 2ef938b63747714e12aee9a3ac536967e6696912303e83b8680cbeed2bc263ad
+ldv\src\bhole\bholes.s 22860 591c346095b94d82e84b75dcd387b85324baaca5db32291757aaeb10fa0bde3c
+ldv\src\bhole\perf_r51.txt 5408 16f6b9bc608de0aeaa2d3cad3d6cca97257d3ce4cfb6c4e28b167318161a05bd
+ldv\src\bw\bw.c 8891 deeb8bf61b49967a0d777018e3ffa7626198816e57b97b85c0f09c8012937cfb
+ldv\src\bw\bw.ldv 5382 a7a0c9d7908db772e474609c91a29ff852823e1e32bbacf6ef6d79b625ef2903
+ldv\src\bw\bw.prj 139 d96e3ac347088a6d04ffc0989483560ba331ba08b90e5f3774f9ec33f56d1440
+ldv\src\cntcol\cntcol.c 27031 0cae678a5553f0a78226c9fdf28e23c4641d01eccf07001b03dea49782aea6f6
+ldv\src\cntcol\cntcol.ldv 12061 8527fbe855ee0b9b78bd9db4fe869a3fcd80881a6eee274dbab1488ab292a923
+ldv\src\cntcol\cntcol.prj 133 80fc0e31eed58d4b90e8f3c1942da166c0169ba02c0dc1e16796e2f65b4889d9
+ldv\src\dither\dither.c 4426 725e45e8e349d97a241f5eea3918d2629597fb7f544f00c0e9d016677c6b71a5
+ldv\src\dither\dither.ldv 2538 01078d8a893457983ae12be38fb3298c3a28710efe46c8f24057488229be3cea
+ldv\src\dither\dither.prj 147 1999dc2705896d2753fd366ad22dbabc17420f5a97c88495f680697ead6ec827
+ldv\src\dither\testplan.xlsx 15378 c9ae3783c1faac249d32a9f225f35e0d429501e5797871246f7226b5e6088a1b
+ldv\src\gamma\gamma.c 7441 1d79aed9ff1b8822381f46628a7e345d593fdc543685c99b741b759632a23ac4
+ldv\src\gamma\gamma.ldv 9560 4cae0078bf64fdde9437b9b9831144b3a63269dbc920ed215d86331121ddf727
+ldv\src\gamma\gamma.prj 145 8985edcf229caef78ad28079dde5d992a52490c4a2a0425d0b8f9941ae4d1aa9
+ldv\src\genimg\genimg.c 5392 f20eb06ad848e25f6887f095baf79d66b128bb3b28a6d4dd685684413c034cb1
+ldv\src\genimg\genimg.ldv 3402 785ead5fe4df608434364ed3b1787cfaf1ec2ddbf3d266541af3ee3fc2b6c528
+ldv\src\genimg\genimg.prj 133 1d482bd2d2917b720a68a29fb71d70020ea1046d886041d22cd3bf054ec08e29
+ldv\src\invert\invert.c 4426 8215b4d20b9d512b0525236978eb120db0da0359a725656bd4450bd830c9fbb4
+ldv\src\invert\invert.ldv 3209 6a157a1f108083fb42e9b34195df2a4f1cd69912792e80c920837d21baa1b44d
+ldv\src\invert\invert.prj 133 6dabaa4fc7d159550ac12907bb2740c5c304f30951d8de89cc6f7b62d4a2db11
+ldv\src\light\light.c 7656 d9f61969f6f7b248785950a06d155561411087730c20f082846d9e55f5181322
+ldv\src\light\light.ldv 3182 0b2828f91b728ffa2de87b59eb4bbd2eab267760c5a10609953433f69ef4caf8
+ldv\src\light\light.prj 145 2760c8105435189fa4df6b951f13ecbccd70aa174463fa194ad3eddfcdd4b4ba
+ldv\src\optimg\optimg.c 21320 cd0d368cd9b205613ec3f4761a4fced5265ce63f15b3dbc169f1b1d335bf1fb3
+ldv\src\optimg\optimg.ldv 15195 0793c890a6e7603de3ce6ef9c568168eb90e949abe0414247a60312386310aa3
+ldv\src\optimg\optimg.prj 147 3f285d583b917575a508d18c6aaa7624f56bf46b602a69c28b86783637f6ced2
+ldv\src\pixel\pixel.c 9916 68895e7a303675eed1dad0fbfa2c32bbd92665e55ebe5f0d1997ed4669269131
+ldv\src\pixel\pixel.ldv 3972 b9d3a9160effbe11372085f85b0c8d912595115025192ec50ca88c2b2cf72fc5
+ldv\src\pixel\pixel.prj 141 d6388ac7254203f35a21112e12a89ad49c881db3d6c90a145cf1aabf26ba15fb
+ldv\src\pixel\pixel.s 1891 38b17fc12353beef0204560ba5b323fff0d043dd0d13cf73e770480f923d8b08
+ldv\src\puzzle\puzzle.c 6695 8529641c49644aa39396373fa98f6b873c91a4179606be261eb678416bd2b06f
+ldv\src\puzzle\puzzle.ldv 4076 7b5c4b14c4885bf489f1f249849ec291955d053f133e0a55cc4656aaf10aee39
+ldv\src\puzzle\puzzle.prj 133 c1e47f70ae6bcb9bbcf17760fe42e4ded1e22b3d8394157d8d9f7cb7cce6f2a7
+ldv\src\rotate\rotate.c 3793 eeeda5f03cdd75eab12ad8c8102bb8571c5e0c167c65a3ff65345881f3c17c72
+ldv\src\rotate\rotate.ldv 2359 551cb6c89e180f97461ee1e4400cc733bb3b462578ab3d1ae3f6471b33fa5015
+ldv\src\rotate\rotate.prj 147 7220810cbef9624e559b5618b5629a149728069cdeda042ce94407919260f3aa
+ldv\src\xwave\xwave.c 5789 c1ccea334afe15078ede22c6335f697f770037d2368fcfd82b03017857535e5f
+ldv\src\xwave\xwave.ldv 8949 ddcecae558c557b717e9da59a6372b79be2c852c24b6e4158e22ca38c44b5e65
+ldv\src\xwave\xwave.prj 145 6c287e3396e2da2ea8e09ee2f9bef607ec5902539912bb5c5920145ef20f9c04
+ldv\src\ypersc\ypersc.c 8784 3213d2e14bb4736cef9f64f7d1f04f57c41fd9bfe47f426c77c260832209891e
+ldv\src\ypersc\ypersc.ldv 5291 ce98c59c590a011daa155be772bb8ec297eb8e7d20f636cba201194bc7f7cf4b
+ldv\src\ypersc\ypersc.prj 147 7d3c7749084f033764beea7716cb0acc9146ae90ee7845ac9f8a6acf535e8abf
+ldv\src\ywave\ywave.c 5778 28c573e6cbf7c405d92f49cf299248f5a5ac0fe67930724d5edf57a669d94f68
+ldv\src\ywave\ywave.ldv 8955 435ea840e97f8b52ac8cb47151432b20a18369e10d578b5f18d68a57d0fe1eba
+ldv\src\ywave\ywave.prj 145 0556931fe4a2fead5ac5022e9012e5b2293b818593682edbba496cb7b6ed8abf
+ldv\vapi.h 7916 894ebf28a2a8b052af8a3ff071e399f704cae29495fb2460ee174e9c8ac508ba
+ldv\xwave.ini 1181 5011d48395d4011aa9ab02819f5e207974dfa0a7f0bd5c648a2bddabadef6232
+ldv\xwave.ldv 8949 ddcecae558c557b717e9da59a6372b79be2c852c24b6e4158e22ca38c44b5e65
+ldv\ypersc.ini 1177 84c2463f1696325339966b5fe88a03d91586f2e3e15a5235355d920e1b9a231d
+ldv\ypersc.ldv 5291 ce98c59c590a011daa155be772bb8ec297eb8e7d20f636cba201194bc7f7cf4b
+ldv\ywave.ini 1181 4392ccf33be793ea6d68dfc55096ccdc83776e5aead9a2d8a58084c03707bf55
+ldv\ywave.ldv 8955 435ea840e97f8b52ac8cb47151432b20a18369e10d578b5f18d68a57d0fe1eba
+license.txt 1113 05ad0b2204c9c194f678d53546d5597263d02a0d129b652e6125636575d409a3
+png.txt 903 cf4a5607eec16234d0493316e793e748cd5894e76b515d160f351226eeb2bf84
+scripts\bcon.vcs 45 8b3a3479c0e85a4a6d596c4871a0e8ae6b566998581bf088e15074be19b41f8b
+scripts\bconv.ini 1632 529e69c32b3bc1c4877ff82669f02cba34daa45a45ade5dfdf7097906f4885d2
+scripts\buggy.vcs 551 e392a774af6db457fecc177441e2b95b83b091727ba4fb6b7560cb4d31be1a4e
+scripts\clip.vcs 887 6b17287a00287b0df1c0bdbe4bca68d6ada2ec048ff932d309d53ece2cdea691
+scripts\clip_loop.vcs 1745 b175215a7b6eb73b0bf47a3f06caf25dca1acc8fb0eda35623f5a6fe95cbd960
+scripts\clip_paste.vcs 909 b8d729be940e782ecc60c1077c5d0cf45c9ecec9ef3164d9eef3e455530f87d1
+scripts\ddualton.vcs 661 b494dae174e45e44eef820bac82fd116c24be0332ffc4faea3419cf16f370f43
+scripts\dfixpal.vcs 1241 5b8d9276a09d8ab4827edc324c9d0fce7d997d6067a019a53160bf8d0c484cff
+scripts\ibrowser.vcs 137 5c594a43412d9fd35d875de5c651894e31e42e6776d8b0f49516fd5f0156c504
+scripts\img_prio.vcs 1526 3bf973e8d4a8f7315daefe68001ac18bf9f851a44723ae1cd0e5d84f18021a81
+scripts\ldv.vcs 799 b60a1c3f88b6483ba1fbe562e69e92b993896786b59145343ffc2e762c3a624b
+scripts\ldvcnt.vcs 1362 043460157fd21b901426a4596dd2b3175ce9d4fdd84e3fce485c0291e8013fc5
+scripts\ldvcntf.vcs 1407 bb359b2bf4a94b5df43c137796eebd9b0bccf74e4adce8486f77d85c1f93380b
+scripts\ldvf.vcs 834 2d4db21ca3db780156b2e5d5c9401cf76523c9d337013d631e6c8e6f0a418f86
+scripts\ldvini.vcs 481 f3505db72beabcbd7bd434a0fc372e93487cb42c2122ea754ad0475ec2f360df
+scripts\ldvopt.vcs 2061 7cfffeb7172902bd314c3c0dcb3ba34f6cf9b2dfdb62d55d2c5acaaab9bc3727
+scripts\ldvopt256c.vcs 455 ced2afa42d18f5e614feb8e06586a0dddcade1e1e6ffffd562a7af78f70dd41e
+scripts\lloopfol.vcs 789 f669e48a06bbef67c95d0b3a598a3c4e18e5eb247ff27fc8baa38533f92c3696
+scripts\loadloop.vcs 758 d6197237ac3d2f322f5fcb6f2345b19c71b5bd98e3630c8219380c266512d9d5
+scripts\main.vcs 3144 2a78ce96ca41d642e1868036196fdef47ce8eaef7c8ddc12a411dc42f75c9045
+scripts\muchram.vcs 2229 ad8a3f9dcdd6689143008a14d307f1dd2a8f0ff8d702f0f7648df8e308f9b89e
+scripts\muchram2.vcs 734 c403dccbbbf063f6a503a2c817fcf912dc17c143ae17ac496ef685882adeb3dd
+scripts\opnsav.vcs 723 f2b5dbcbbddbdb71c7ef6f9d0abd29afd805973b71e6a4916ddcd9cba6675f8f
+scripts\photos.ini 1176 7cdfe70095dfd5b8f37d73fa9dc5fd0a53bacae187597c13358768cdd316533c
+scripts\pinvert.ini 45 faf3f6d46c63f6e1da90cdef92e4debd7573de6c552e67b150ad175303a5c7d2
+scripts\plight.ini 110 7dd5cbde06fc10059337b654080ecfc0872cf1782cde280d283b62e38d49b365
+scripts\ppuzzle.ini 92 e3aa044e35bffcf7ae5f94a198b76d7b901c036222465e84a1c2938179d4166d
+scripts\protate.ini 62 702b32c2da63049eae879571b55e6dedb7811fe7271f588c4ff6e0f6d8c4b0bd
+scripts\readme.txt 258 d3627e8c8046a12955d1d149e52bfbf85a812a30970255ce0f85371c9642692b
+scripts\s0.vcs 274 010484801d66b15f2b88ebb15551eb32720404519b8cd23cdeabbf56b1b48999
+scripts\s1.vcs 317 56a757b307929f51487327ad9fed60d9972e5c7c23beeb12f6f2638ae4e9921d
+scripts\spec512.vcs 226 32b74868242f3d6a03e5afa6d9c263f7eb823b82cf4dc2eaa4c89920b0f0a7f0
+tcw128.dat 154515 e0078a4db445954de5c413cd06e68a595a3094c68c03f77ca7f0cafcdd94d92d
+tcw64.dat 38703 4ecd0eccd0e92e5d3271afbebb501c14e867e60384246a7b114c02d6c0ccfe9d
+vision.img 21060 fabf2b6d4f797fe4a819992142017df3d020e4792b42ca51c74d5f2704f69732
+vision.ini 3861 2c0129b74593d17be2568066b71f4aff6c8ddc5182e59d428ad28fa0ebe60372
+vision.prg 521728 20cb864b739eeabdecdba99fb81866379f744d7b3fd4bc729554822999b62df2
+visionl.prg 363101 16502ff84de472b9f54631f0f324f34e171196480bcdb8783a00a7ee42934c9c
diff --git a/tools/vision/visionl.prg b/tools/vision/visionl.prg
new file mode 100644
index 0000000..1f6a41f
Binary files /dev/null and b/tools/vision/visionl.prg differ