You know the drill, Updates

This commit is contained in:
Sophia Atkinson 2023-05-01 19:51:20 -07:00
parent af6f76fbcb
commit 006e3d3314
105 changed files with 1725 additions and 1430 deletions

View File

@ -18,13 +18,13 @@ switch( $action ) {
case 'add': case 'add':
yourls_verify_nonce( 'add_url', $_REQUEST['nonce'], false, 'omg error' ); yourls_verify_nonce( 'add_url', $_REQUEST['nonce'], false, 'omg error' );
$return = yourls_add_new_link( $_REQUEST['url'], $_REQUEST['keyword'] ); $return = yourls_add_new_link( $_REQUEST['url'], $_REQUEST['keyword'], '', $_REQUEST['rowid'] );
echo json_encode($return); echo json_encode($return);
break; break;
case 'edit_display': case 'edit_display':
yourls_verify_nonce( 'edit-link_'.$_REQUEST['id'], $_REQUEST['nonce'], false, 'omg error' ); yourls_verify_nonce( 'edit-link_'.$_REQUEST['id'], $_REQUEST['nonce'], false, 'omg error' );
$row = yourls_table_edit_row ( $_REQUEST['keyword'] ); $row = yourls_table_edit_row ( $_REQUEST['keyword'], $_REQUEST['id'] );
echo json_encode( array('html' => $row) ); echo json_encode( array('html' => $row) );
break; break;

View File

@ -110,10 +110,10 @@ if ( isset( $_GET['u'] ) or isset( $_GET['up'] ) ) {
// No sanitization needed here: everything happens in yourls_add_new_link() // No sanitization needed here: everything happens in yourls_add_new_link()
if( isset( $_GET['u'] ) ) { if( isset( $_GET['u'] ) ) {
// Old school bookmarklet: ?u=<url> // Old school bookmarklet: ?u=<url>
$url = urldecode( $_GET['u'] ); $url = $_GET['u'];
} else { } else {
// New style bookmarklet: ?up=<url protocol>&us=<url slashes>&ur=<url rest> // New style bookmarklet: ?up=<url protocol>&us=<url slashes>&ur=<url rest>
$url = urldecode( $_GET['up'] . $_GET['us'] . $_GET['ur'] ); $url = $_GET['up'] . $_GET['us'] . $_GET['ur'];
} }
$keyword = ( isset( $_GET['k'] ) ? ( $_GET['k'] ) : '' ); $keyword = ( isset( $_GET['k'] ) ? ( $_GET['k'] ) : '' );
$title = ( isset( $_GET['t'] ) ? ( $_GET['t'] ) : '' ); $title = ( isset( $_GET['t'] ) ? ( $_GET['t'] ) : '' );
@ -227,7 +227,7 @@ if ( isset( $_GET['u'] ) or isset( $_GET['up'] ) ) {
$display_on_page = ( $offset + 1 ); $display_on_page = ( $offset + 1 );
} }
// Determing Total Amount Of Pages // Determine Total Amount Of Pages
$total_pages = ceil( $total_items / $perpage ); $total_pages = ceil( $total_items / $perpage );
} }
@ -292,7 +292,7 @@ yourls_table_tbody_start();
// Main Query // Main Query
$where = yourls_apply_filter( 'admin_list_where', $where ); $where = yourls_apply_filter( 'admin_list_where', $where );
$url_results = yourls_get_db()->fetchObjects( "SELECT * FROM `$table_url` WHERE 1=1 ${where['sql']} ORDER BY `$sort_by` $sort_order LIMIT $offset, $perpage;", $where['binds'] ); $url_results = yourls_get_db()->fetchObjects( "SELECT * FROM `$table_url` WHERE 1=1 {$where['sql']} ORDER BY `$sort_by` $sort_order LIMIT $offset, $perpage;", $where['binds'] );
$found_rows = false; $found_rows = false;
if( $url_results ) { if( $url_results ) {
$found_rows = true; $found_rows = true;

View File

@ -47,7 +47,7 @@ if( isset( $_GET['action'] ) ) {
yourls_add_notice( $result ); yourls_add_notice( $result );
} }
// Handle message upon succesfull (de)activation // Handle message upon successful (de)activation
if( isset( $_GET['success'] ) && ( ( $_GET['success'] == 'activated' ) OR ( $_GET['success'] == 'deactivated' ) ) ) { if( isset( $_GET['success'] ) && ( ( $_GET['success'] == 'activated' ) OR ( $_GET['success'] == 'deactivated' ) ) ) {
if( $_GET['success'] == 'activated' ) { if( $_GET['success'] == 'activated' ) {
$message = yourls__( 'Plugin has been activated' ); $message = yourls__( 'Plugin has been activated' );

View File

@ -98,7 +98,7 @@ STANDARD_SIMPLE;
if (r.short_url) { if (r.short_url) {
prompt(r.message, r.short_url); prompt(r.message, r.short_url);
} else { } else {
alert('An error occured: ' + r.message); alert('An error occurred: ' + r.message);
} }
}; };
sc.src = '$base_bookmarklet' + p + '&jsonp=yourls'; sc.src = '$base_bookmarklet' + p + '&jsonp=yourls';
@ -166,7 +166,7 @@ CUSTOM_STANDARD;
if (r.short_url) { if (r.short_url) {
prompt(r.message, r.short_url); prompt(r.message, r.short_url);
} else { } else {
alert('An error occured: ' + r.message); alert('An error occurred: ' + r.message);
} }
}; };
sc.src = '$base_bookmarklet' + p + '&k=' + k + '&jsonp=yourls'; sc.src = '$base_bookmarklet' + p + '&k=' + k + '&jsonp=yourls';
@ -247,7 +247,7 @@ TWITTER;
?> ?>
<?php $js_code = <<<TUMBLR <?php $js_code = <<<TUMBLR
// Share on Tumlr // Share on Tumblr
var d = document, var d = document,
w = window, w = window,
enc = encodeURIComponent, enc = encodeURIComponent,

View File

@ -1,5 +1,5 @@
// Font Imports // Font Imports
@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@700&family=Open+Sans&display=swap'); @import url("https://fonts.bunny.net/css?family=montserrat:700|open-sans");
$open-sans: "Open Sans", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; $open-sans: "Open Sans", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
$montserrat: "Montserrat", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; $montserrat: "Montserrat", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<svg class="iconLeft" data-v-423bf9ae="" viewBox="0 0 416 90" xmlns="http://www.w3.org/2000/svg"> <svg class="iconLeft" data-v-423bf9ae="" viewBox="0 0 416 90" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(4.6332 0 0 4.6332 144.49 -1.8649)" data-v-423bf9ae=""> <g transform="matrix(4.6332 0 0 4.633a2 144.49 -1.8649)" data-v-423bf9ae="">
<path d="m4.24 13.92q-0.71 0-1.39-0.35-0.68-0.34-1.16-0.9l0.69-0.6q0.85 0.98 1.95 0.98 0.64 0 1.06-0.27 0.42-0.28 0.42-0.77 0-0.31-0.15-0.55-0.14-0.25-0.46-0.45-0.31-0.2-0.56-0.31-0.24-0.12-0.69-0.28-0.53-0.21-0.86-0.38t-0.68-0.42-0.52-0.6q-0.17-0.34-0.17-0.77 0-0.82 0.67-1.32 0.68-0.5 1.73-0.5 1.47 0 2.4 1.09l-0.64 0.54q-0.8-0.77-1.79-0.77-0.66 0-1.05 0.26-0.39 0.25-0.39 0.68 0 0.21 0.1 0.39 0.11 0.19 0.23 0.31 0.13 0.11 0.41 0.26t0.45 0.21q0.16 0.06 0.53 0.2 0.56 0.21 0.86 0.36t0.71 0.43q0.42 0.28 0.6 0.66 0.19 0.39 0.19 0.91 0 0.89-0.67 1.42-0.67 0.54-1.82 0.54zm11.1-1q-0.91 1-2.4 1-1.5 0-2.4-0.99-0.91-0.99-0.91-2.75 0-1.75 0.91-2.75 0.9-1 2.4-1 1.49 0 2.4 0.98 0.9 0.99 0.9 2.75 0 1.75-0.9 2.76zm-2.4 0.11q1.07 0 1.68-0.76 0.6-0.76 0.6-2.11t-0.59-2.1-1.69-0.75q-1.12 0-1.7 0.73-0.59 0.74-0.59 2.14 0 1.36 0.59 2.11 0.59 0.74 1.7 0.74zm6.83 3.07-0.98 0.49v-10h0.98v0.65q0.42-0.39 0.87-0.6 0.44-0.21 1.13-0.21 1.44 0 2.28 1.01 0.83 1.02 0.83 2.72 0 1.77-0.85 2.76-0.85 1-2.2 1-1.29 0-2.06-0.9v3.08zm1.94-3.07q1.03 0 1.59-0.74t0.56-2.13q0-1.31-0.58-2.08-0.59-0.77-1.62-0.77-1.28 0-1.89 1.1v3.52q0.85 1.1 1.94 1.1zm9.1 0.65q-0.26 0.26-0.63 0.26-0.36 0-0.62-0.26-0.26-0.27-0.26-0.62t0.26-0.61q0.26-0.27 0.62-0.27 0.37 0 0.63 0.27 0.26 0.26 0.26 0.61t-0.26 0.62zm6.79 0.07h-0.92l-1.76-7.16h1l1.17 5.13q0.07 0.39 0.09 0.53 0.02-0.06 0.05-0.26 0.04-0.2 0.07-0.31l1.1-5.09h0.81l1.12 5.1q0.03 0.13 0.13 0.63 0.03-0.25 0.11-0.63l1.12-5.1h1.01l-1.76 7.16h-0.91l-1.11-4.87q-0.06-0.2-0.13-0.63-0.07 0.46-0.11 0.6l-1.08 4.9zm10.48 0.17q-1.7 0-1.7-1.71v-4.73h-1.69v-0.89h1.69v-2.46l0.98-0.49v2.95h2.4v0.89h-2.4v4.31q0 0.6 0.21 0.9 0.2 0.3 0.84 0.3 0.74 0 1.36-0.42l-0.11 1.02q-0.6 0.33-1.58 0.33zm9.1-9.23q-0.37 0-0.58 0.07-0.22 0.07-0.31 0.23t-0.11 0.3q-0.03 0.13-0.03 0.38v0.92h1.91v0.89h-1.91v5.39h1.91v0.88h-4.37v-0.88h1.48v-5.39h-1.48v-0.89h1.48v-1.07q0-0.93 0.53-1.33 0.52-0.41 1.38-0.41 0.74 0 1.5 0.34v0.88q-0.65-0.31-1.4-0.31z"/> <path d="m4.24 13.92q-0.71 0-1.39-0.35-0.68-0.34-1.16-0.9l0.69-0.6q0.85 0.98 1.95 0.98 0.64 0 1.06-0.27 0.42-0.28 0.42-0.77 0-0.31-0.15-0.55-0.14-0.25-0.46-0.45-0.31-0.2-0.56-0.31-0.24-0.12-0.69-0.28-0.53-0.21-0.86-0.38t-0.68-0.42-0.52-0.6q-0.17-0.34-0.17-0.77 0-0.82 0.67-1.32 0.68-0.5 1.73-0.5 1.47 0 2.4 1.09l-0.64 0.54q-0.8-0.77-1.79-0.77-0.66 0-1.05 0.26-0.39 0.25-0.39 0.68 0 0.21 0.1 0.39 0.11 0.19 0.23 0.31 0.13 0.11 0.41 0.26t0.45 0.21q0.16 0.06 0.53 0.2 0.56 0.21 0.86 0.36t0.71 0.43q0.42 0.28 0.6 0.66 0.19 0.39 0.19 0.91 0 0.89-0.67 1.42-0.67 0.54-1.82 0.54zm11.1-1q-0.91 1-2.4 1-1.5 0-2.4-0.99-0.91-0.99-0.91-2.75 0-1.75 0.91-2.75 0.9-1 2.4-1 1.49 0 2.4 0.98 0.9 0.99 0.9 2.75 0 1.75-0.9 2.76zm-2.4 0.11q1.07 0 1.68-0.76 0.6-0.76 0.6-2.11t-0.59-2.1-1.69-0.75q-1.12 0-1.7 0.73-0.59 0.74-0.59 2.14 0 1.36 0.59 2.11 0.59 0.74 1.7 0.74zm6.83 3.07-0.98 0.49v-10h0.98v0.65q0.42-0.39 0.87-0.6 0.44-0.21 1.13-0.21 1.44 0 2.28 1.01 0.83 1.02 0.83 2.72 0 1.77-0.85 2.76-0.85 1-2.2 1-1.29 0-2.06-0.9v3.08zm1.94-3.07q1.03 0 1.59-0.74t0.56-2.13q0-1.31-0.58-2.08-0.59-0.77-1.62-0.77-1.28 0-1.89 1.1v3.52q0.85 1.1 1.94 1.1zm9.1 0.65q-0.26 0.26-0.63 0.26-0.36 0-0.62-0.26-0.26-0.27-0.26-0.62t0.26-0.61q0.26-0.27 0.62-0.27 0.37 0 0.63 0.27 0.26 0.26 0.26 0.61t-0.26 0.62zm6.79 0.07h-0.92l-1.76-7.16h1l1.17 5.13q0.07 0.39 0.09 0.53 0.02-0.06 0.05-0.26 0.04-0.2 0.07-0.31l1.1-5.09h0.81l1.12 5.1q0.03 0.13 0.13 0.63 0.03-0.25 0.11-0.63l1.12-5.1h1.01l-1.76 7.16h-0.91l-1.11-4.87q-0.06-0.2-0.13-0.63-0.07 0.46-0.11 0.6l-1.08 4.9zm10.48 0.17q-1.7 0-1.7-1.71v-4.73h-1.69v-0.89h1.69v-2.46l0.98-0.49v2.95h2.4v0.89h-2.4v4.31q0 0.6 0.21 0.9 0.2 0.3 0.84 0.3 0.74 0 1.36-0.42l-0.11 1.02q-0.6 0.33-1.58 0.33zm9.1-9.23q-0.37 0-0.58 0.07-0.22 0.07-0.31 0.23t-0.11 0.3q-0.03 0.13-0.03 0.38v0.92h1.91v0.89h-1.91v5.39h1.91v0.88h-4.37v-0.88h1.48v-5.39h-1.48v-0.89h1.48v-1.07q0-0.93 0.53-1.33 0.52-0.41 1.38-0.41 0.74 0 1.5 0.34v0.88q-0.65-0.31-1.4-0.31z"/>
</g> </g>
<g transform="matrix(1.4702 0 0 1.4702 -6.5121 -28.119)" data-v-423bf9ae=""> <g transform="matrix(1.4702 0 0 1.4702 -6.5121 -28.119)" data-v-423bf9ae="">

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -1,9 +1,10 @@
@charset "UTF-8"; @charset "UTF-8";
@import url("https://fonts.bunny.net/css?family=montserrat:700|open-sans");
@import "https://fonts.googleapis.com/css2?family=Montserrat:wght@700&family=Open+Sans&display=swap";/*!* Bootstrap v5.0.2 (https://getbootstrap.com/) /*!* Bootstrap v5.0.2 (https://getbootstrap.com/)
* Copyright 2011-2023 The Bootstrap Authors * Copyright 2011-2023 The Bootstrap Authors
* Copyright 2011-2023 Twitter, Inc. (Fuck Elon) * Copyright 2011-2023 Twitter, Inc. (Fuck Elon)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)*/:root { * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)*/
:root {
--bs-blue: #0d6efd; --bs-blue: #0d6efd;
--bs-indigo: #6610f2; --bs-indigo: #6610f2;
--bs-purple: #6f42c1; --bs-purple: #6f42c1;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 781 B

After

Width:  |  Height:  |  Size: 374 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 B

After

Width:  |  Height:  |  Size: 288 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 429 B

View File

@ -7,6 +7,9 @@
id="svg6" id="svg6"
sodipodi:docname="bg.svg" sodipodi:docname="bg.svg"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)" inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
inkscape:export-filename="bg.gif"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 587 B

After

Width:  |  Height:  |  Size: 728 B

View File

@ -5,10 +5,6 @@
width="24" width="24"
version="1.1" version="1.1"
id="svg6" id="svg6"
sodipodi:docname="cancel.svg"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
@ -27,30 +23,6 @@
</metadata> </metadata>
<defs <defs
id="defs10" /> id="defs10" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1017"
id="namedview8"
showgrid="false"
inkscape:zoom="9.8333333"
inkscape:cx="-5.8474577"
inkscape:cy="12"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg6"
inkscape:document-rotation="0"
inkscape:showpageshadow="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#d1d1d1" />
<path <path
d="M 12,2 C 6.47,2 2,6.47 2,12 2,17.53 6.47,22 12,22 17.53,22 22,17.53 22,12 22,6.47 17.53,2 12,2 Z M 17,15.59 15.59,17 12,13.41 8.41,17 7,15.59 10.59,12 7,8.41 8.41,7 12,10.59 15.59,7 17,8.41 13.41,12 Z" d="M 12,2 C 6.47,2 2,6.47 2,12 2,17.53 6.47,22 12,22 17.53,22 22,17.53 22,12 22,6.47 17.53,2 12,2 Z M 17,15.59 15.59,17 12,13.41 8.41,17 7,15.59 10.59,12 7,8.41 8.41,7 12,10.59 15.59,7 17,8.41 13.41,12 Z"
id="path2" id="path2"

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 541 B

After

Width:  |  Height:  |  Size: 223 B

View File

@ -5,10 +5,6 @@
width="24" width="24"
version="1.1" version="1.1"
id="svg6" id="svg6"
sodipodi:docname="chart_bar.svg"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
@ -27,30 +23,6 @@
</metadata> </metadata>
<defs <defs
id="defs10" /> id="defs10" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1017"
id="namedview8"
showgrid="false"
inkscape:zoom="19.666667"
inkscape:cx="-7.1967591"
inkscape:cy="8.9930972"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg6"
inkscape:document-rotation="0"
inkscape:showpageshadow="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#d1d1d1" />
<path <path
d="M 5,9.2 H 8 V 19 H 5 Z M 10.6,5 h 2.8 v 14 h -2.8 z m 5.6,8 H 19 v 6 h -2.8 z" d="M 5,9.2 H 8 V 19 H 5 Z M 10.6,5 h 2.8 v 14 h -2.8 z m 5.6,8 H 19 v 6 h -2.8 z"
id="path2" id="path2"

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 901 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 626 B

After

Width:  |  Height:  |  Size: 399 B

View File

@ -7,6 +7,9 @@
width="24" width="24"
viewBox="0 0 24 24" viewBox="0 0 24 24"
height="24" height="24"
inkscape:export-filename="chart_bar_add.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 715 B

After

Width:  |  Height:  |  Size: 322 B

View File

@ -1,14 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg <svg
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
sodipodi:docname="delete.svg"
id="svg6" id="svg6"
version="1.1" version="1.1"
width="16" width="16"
viewBox="0 0 16 16" viewBox="0 0 16 16"
height="16" height="16"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
@ -27,30 +23,6 @@
</metadata> </metadata>
<defs <defs
id="defs10" /> id="defs10" />
<sodipodi:namedview
inkscape:document-rotation="0"
inkscape:current-layer="svg6"
inkscape:window-maximized="1"
inkscape:window-y="-8"
inkscape:window-x="-8"
inkscape:cy="14.778455"
inkscape:cx="6.5688882"
inkscape:zoom="19.666667"
showgrid="false"
id="namedview8"
inkscape:window-height="1017"
inkscape:window-width="1920"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
guidetolerance="10"
gridtolerance="10"
objecttolerance="10"
borderopacity="1"
bordercolor="#666666"
pagecolor="#ffffff"
inkscape:showpageshadow="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#d1d1d1" />
<path <path
style="fill:#7289da;fill-opacity:1;stroke-width:0.888889" style="fill:#7289da;fill-opacity:1;stroke-width:0.888889"
id="path2" id="path2"

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 B

After

Width:  |  Height:  |  Size: 308 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 666 B

After

Width:  |  Height:  |  Size: 579 B

View File

@ -5,10 +5,6 @@
width="24" width="24"
version="1.1" version="1.1"
id="svg6" id="svg6"
sodipodi:docname="error.svg"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
@ -27,30 +23,6 @@
</metadata> </metadata>
<defs <defs
id="defs10" /> id="defs10" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1017"
id="namedview8"
showgrid="false"
inkscape:zoom="9.8333333"
inkscape:cx="-5.8474577"
inkscape:cy="12"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg6"
inkscape:document-rotation="0"
inkscape:showpageshadow="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#d1d1d1" />
<path <path
d="M 0,0 H 24 V 24 H 0 Z" d="M 0,0 H 24 V 24 H 0 Z"
fill="none" fill="none"

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 891 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 318 B

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -4,14 +4,10 @@
id="Capa_1" id="Capa_1"
x="0px" x="0px"
y="0px" y="0px"
viewBox="0 0 131072 262144" viewBox="0 0 512 512"
xml:space="preserve" xml:space="preserve"
sodipodi:docname="facebook.svg" width="512"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)" height="512"
width="131072"
height="262144"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
@ -20,34 +16,10 @@
id="metadata43"><rdf:RDF><cc:Work id="metadata43"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs41" /><sodipodi:namedview id="defs41" />
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1017"
id="namedview39"
showgrid="false"
inkscape:zoom="0.4609375"
inkscape:cx="-124.74576"
inkscape:cy="256"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1"
inkscape:document-rotation="0"
inkscape:showpageshadow="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#d1d1d1" />
<g <g
id="g6" id="g6"
style="fill:#7289da;fill-opacity:1" style="fill:#7289da;fill-opacity:1">
transform="translate(-65536)">
<g <g
id="g4" id="g4"
style="fill:#7289da;fill-opacity:1"> style="fill:#7289da;fill-opacity:1">
@ -57,64 +29,19 @@
style="fill:#7289da;fill-opacity:1" /> style="fill:#7289da;fill-opacity:1" />
</g> </g>
</g> </g>
<g
id="g8"
transform="translate(-65536)">
</g>
<g
id="g10"
transform="translate(-65536)">
</g>
<g
id="g12"
transform="translate(-65536)">
</g>
<g
id="g14"
transform="translate(-65536)">
</g>
<g
id="g16"
transform="translate(-65536)">
</g>
<g
id="g18"
transform="translate(-65536)">
</g>
<g
id="g20"
transform="translate(-65536)">
</g>
<g
id="g22"
transform="translate(-65536)">
</g>
<g
id="g24"
transform="translate(-65536)">
</g>
<g
id="g26"
transform="translate(-65536)">
</g>
<g
id="g28"
transform="translate(-65536)">
</g>
<g
id="g30"
transform="translate(-65536)">
</g>
<g
id="g32"
transform="translate(-65536)">
</g>
<g
id="g34"
transform="translate(-65536)">
</g>
<g
id="g36"
transform="translate(-65536)">
</g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 1015 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 870 B

After

Width:  |  Height:  |  Size: 347 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 450 B

After

Width:  |  Height:  |  Size: 410 B

View File

@ -5,10 +5,6 @@
width="24" width="24"
version="1.1" version="1.1"
id="svg6" id="svg6"
sodipodi:docname="pencil.svg"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
@ -27,30 +23,6 @@
</metadata> </metadata>
<defs <defs
id="defs10" /> id="defs10" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1017"
id="namedview8"
showgrid="false"
inkscape:zoom="9.8333333"
inkscape:cx="-5.8474577"
inkscape:cy="12"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg6"
inkscape:document-rotation="0"
inkscape:showpageshadow="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#d1d1d1" />
<path <path
d="M 3,17.25 V 21 H 6.75 L 17.81,9.94 14.06,6.19 Z M 20.71,7.04 c 0.39,-0.39 0.39,-1.02 0,-1.41 L 18.37,3.29 C 17.98,2.9 17.35,2.9 16.96,3.29 l -1.83,1.83 3.75,3.75 z" d="M 3,17.25 V 21 H 6.75 L 17.81,9.94 14.06,6.19 Z M 20.71,7.04 c 0.39,-0.39 0.39,-1.02 0,-1.41 L 18.37,3.29 C 17.98,2.9 17.35,2.9 16.96,3.29 l -1.83,1.83 3.75,3.75 z"
id="path2" id="path2"

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 987 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1007 B

After

Width:  |  Height:  |  Size: 574 B

View File

@ -4,8 +4,7 @@
viewBox="0 0 24 24" viewBox="0 0 24 24"
width="24" width="24"
version="1.1" version="1.1"
id="svg6" id=" xml sodipodi:docname="share.svg"
sodipodi:docname="share.svg"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)" inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
inkscape:export-filename="share.png" inkscape:export-filename="share.png"
inkscape:export-xdpi="96" inkscape:export-xdpi="96"
@ -54,6 +53,10 @@
inkscape:showpageshadow="0" inkscape:showpageshadow="0"
inkscape:pagecheckerboard="1" inkscape:pagecheckerboard="1"
inkscape:deskcolor="#d1d1d1" /> inkscape:deskcolor="#d1d1d1" />
board="1"
inkscape:deskcolor="#d1d1d1" />
rboard="1"
inkscape:deskcolor="#d1d1d1" />
<path <path
d="M 0,0 H 24 V 24 H 0 Z" d="M 0,0 H 24 V 24 H 0 Z"
fill="none" fill="none"

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -4,14 +4,10 @@
id="Capa_1" id="Capa_1"
x="0px" x="0px"
y="0px" y="0px"
viewBox="0 0 262144 262144" viewBox="0 0 512 416"
xml:space="preserve" xml:space="preserve"
sodipodi:docname="twitter.svg" width="512"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)" height="416"
width="262144"
height="262144"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
@ -20,33 +16,11 @@
id="metadata43"><rdf:RDF><cc:Work id="metadata43"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs41" /><sodipodi:namedview id="defs41" />
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1017"
id="namedview39"
showgrid="false"
inkscape:zoom="0.4609375"
inkscape:cx="-124.74576"
inkscape:cy="256"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="Capa_1"
inkscape:document-rotation="0"
inkscape:showpageshadow="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#d1d1d1" />
<g <g
id="g6" id="g6"
style="fill:#7289da;fill-opacity:1"> style="fill:#7289da;fill-opacity:1"
transform="translate(4.0003259,-48.401114)">
<g <g
id="g4" id="g4"
style="fill:#7289da;fill-opacity:1"> style="fill:#7289da;fill-opacity:1">
@ -74,7 +48,7 @@
<g <g
style="fill:#ff0000;fill-opacity:1" style="fill:#ff0000;fill-opacity:1"
id="g1956" id="g1956"
transform="matrix(0.86810312,0,0,0.86815918,51.999458,48.388091)"><path transform="matrix(0.86810312,0,0,0.86815918,55.999784,-0.0130231)"><path
d="M 285.08,230.397 456.218,59.27 c 6.076,-6.077 6.076,-15.911 0,-21.986 L 423.511,4.565 c -2.913,-2.911 -6.866,-4.55 -10.992,-4.55 -4.127,0 -8.08,1.639 -10.993,4.55 L 230.388,175.705 59.25,4.565 c -2.913,-2.911 -6.866,-4.55 -10.993,-4.55 -4.126,0 -8.08,1.639 -10.992,4.55 L 4.558,37.284 c -6.077,6.075 -6.077,15.909 0,21.986 L 175.696,230.398 4.575,401.505 c -6.074,6.077 -6.074,15.911 0,21.986 l 32.709,32.719 c 2.911,2.911 6.865,4.55 10.992,4.55 4.127,0 8.08,-1.639 10.994,-4.55 L 230.387,285.09 401.505,456.21 c 2.913,2.911 6.866,4.55 10.993,4.55 4.128,0 8.081,-1.639 10.992,-4.55 l 32.709,-32.719 c 6.074,-6.075 6.074,-15.909 0,-21.986 z" d="M 285.08,230.397 456.218,59.27 c 6.076,-6.077 6.076,-15.911 0,-21.986 L 423.511,4.565 c -2.913,-2.911 -6.866,-4.55 -10.992,-4.55 -4.127,0 -8.08,1.639 -10.993,4.55 L 230.388,175.705 59.25,4.565 c -2.913,-2.911 -6.866,-4.55 -10.993,-4.55 -4.126,0 -8.08,1.639 -10.992,4.55 L 4.558,37.284 c -6.077,6.075 -6.077,15.909 0,21.986 L 175.696,230.398 4.575,401.505 c -6.074,6.077 -6.074,15.911 0,21.986 l 32.709,32.719 c 2.911,2.911 6.865,4.55 10.992,4.55 4.127,0 8.08,-1.639 10.994,-4.55 L 230.387,285.09 401.505,456.21 c 2.913,2.911 6.866,4.55 10.993,4.55 4.128,0 8.081,-1.639 10.992,-4.55 l 32.709,-32.719 c 6.074,-6.075 6.074,-15.909 0,-21.986 z"
id="path1948" id="path1948"
style="fill:#ff0000;fill-opacity:1" /></g></svg> style="fill:#ff0000;fill-opacity:1" /></g></svg>

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 34 KiB

View File

@ -57,7 +57,7 @@ class Init {
$this->include_db_files(); $this->include_db_files();
} }
// Allow early inclusion of a cache layer // Allow early and unconditional inclusion of custom code
if ($actions->include_cache === true) { if ($actions->include_cache === true) {
$this->include_cache_files(); $this->include_cache_files();
} }
@ -145,22 +145,41 @@ class Init {
* @return void * @return void
*/ */
public function include_db_files() { public function include_db_files() {
// Allow drop-in replacement for the DB engine // Attempt to open drop-in replacement for the DB engine else default to core engine
if (file_exists(YOURLS_USERDIR.'/db.php')) { $file = YOURLS_USERDIR . '/db.php';
require_once YOURLS_USERDIR.'/db.php'; $attempt = false;
} else { if(file_exists($file)) {
require_once YOURLS_INC.'/class-mysql.php'; $attempt = yourls_include_file_sandbox( $file );
// Check if we have an error to display
if ( is_string( $attempt ) ) {
yourls_add_notice( $attempt );
}
}
// Fallback to core DB engine
if ( $attempt !== true ) {
require_once YOURLS_INC . '/class-mysql.php';
yourls_db_connect(); yourls_db_connect();
} }
} }
/** /**
* Include custom extension file.
*
* "Cache" stands for "Custom Additional Code for Hazardous Extensions".
*
* @since 1.7.3 * @since 1.7.3
* @return void * @return void
*/ */
public function include_cache_files() { public function include_cache_files() {
if (file_exists(YOURLS_USERDIR.'/cache.php')) { $file = YOURLS_USERDIR . '/cache.php';
require_once YOURLS_USERDIR.'/cache.php'; $attempt = false;
if(file_exists($file)) {
$attempt = yourls_include_file_sandbox($file);
// Check if we have an error to display
if (is_string($attempt)) {
yourls_add_notice($attempt);
}
} }
} }

View File

@ -157,16 +157,18 @@ class YDB extends ExtendedPdo {
*/ */
public function dead_or_error(\Exception $exception) { public function dead_or_error(\Exception $exception) {
// Use any /user/db_error.php file // Use any /user/db_error.php file
if( file_exists( YOURLS_USERDIR . '/db_error.php' ) ) { $file = YOURLS_USERDIR . '/db_error.php';
include_once( YOURLS_USERDIR . '/db_error.php' ); if(file_exists($file)) {
die(); if(yourls_include_file_sandbox( $file ) === true) {
die();
}
} }
$message = yourls__( 'Incorrect DB config, or could not connect to DB' ); $message = yourls__( 'Incorrect DB config, or could not connect to DB' );
$message .= '<br/>' . get_class($exception) .': ' . $exception->getMessage(); $message .= '<br/>' . get_class($exception) .': ' . $exception->getMessage();
yourls_die( yourls__( $message ), yourls__( 'Fatal error' ), 503 ); yourls_die( yourls__( $message ), yourls__( 'Fatal error' ), 503 );
die(); die();
} }
/** /**

View File

@ -222,7 +222,7 @@ class AdminParams
public function get_click_limit() public function get_click_limit()
{ {
// @hook Default link click threshold (unset) // @hook Default link click threshold (unset)
return (isset($_GET['click_limit']) && intval($_GET['click_limit'])) ? return (isset($_GET['click_limit']) && intval($_GET['click_limit']) >= 0) ?
intval($_GET['click_limit']) : yourls_apply_filter('admin_view_click_limit', ''); intval($_GET['click_limit']) : yourls_apply_filter('admin_view_click_limit', '');
} }

View File

@ -44,7 +44,7 @@ if ( isset( $_GET['dismiss'] ) && $_GET['dismiss'] == 'hasherror' ) {
if ( yourls_maybe_hash_passwords() ) { if ( yourls_maybe_hash_passwords() ) {
$hash = yourls_hash_passwords_now( YOURLS_CONFIGFILE ); $hash = yourls_hash_passwords_now( YOURLS_CONFIGFILE );
if ( $hash === true ) { if ( $hash === true ) {
// Hashing succesful. Remove flag from DB if any. // Hashing successful. Remove flag from DB if any.
if( yourls_get_option( 'defer_hashing_error' ) ) if( yourls_get_option( 'defer_hashing_error' ) )
yourls_delete_option( 'defer_hashing_error' ); yourls_delete_option( 'defer_hashing_error' );
} else { } else {

View File

@ -213,7 +213,7 @@ function yourls_hash_passwords_now( $config_file ) {
// PHP would interpret $ as a variable, so replace it in storage. // PHP would interpret $ as a variable, so replace it in storage.
$hash = str_replace( '$', '!', $hash ); $hash = str_replace( '$', '!', $hash );
$quotes = "'" . '"'; $quotes = "'" . '"';
$pattern = "/[$quotes]${user}[$quotes]\s*=>\s*[$quotes]" . preg_quote( $password, '/' ) . "[$quotes]/"; $pattern = "/[$quotes]" . preg_quote( $user, '/' ) . "[$quotes]\s*=>\s*[$quotes]" . preg_quote( $password, '/' ) . "[$quotes]/";
$replace = "'$user' => 'phpass:$hash' /* Password encrypted by YOURLS */ "; $replace = "'$user' => 'phpass:$hash' /* Password encrypted by YOURLS */ ";
$count = 0; $count = 0;
$configdata = preg_replace( $pattern, $replace, $configdata, -1, $count ); $configdata = preg_replace( $pattern, $replace, $configdata, -1, $count );

View File

@ -7,7 +7,7 @@
* Add a message to the debug log * Add a message to the debug log
* *
* When in debug mode ( YOURLS_DEBUG == true ) the debug log is echoed in yourls_html_footer() * When in debug mode ( YOURLS_DEBUG == true ) the debug log is echoed in yourls_html_footer()
* Log messages are appended to $ydb->debug_log array, which is instanciated within class ezSQLcore_YOURLS * Log messages are appended to $ydb->debug_log array, which is instanciated within class Database\YDB
* *
* @since 1.7 * @since 1.7
* @param string $msg Message to add to the debug log * @param string $msg Message to add to the debug log
@ -17,7 +17,10 @@ function yourls_debug_log( $msg ) {
yourls_do_action( 'debug_log', $msg ); yourls_do_action( 'debug_log', $msg );
// Get the DB object ($ydb), get its profiler (\Aura\Sql\Profiler\Profiler), its logger (\Aura\Sql\Profiler\MemoryLogger) and // Get the DB object ($ydb), get its profiler (\Aura\Sql\Profiler\Profiler), its logger (\Aura\Sql\Profiler\MemoryLogger) and
// pass it a unused argument (loglevel) and the message // pass it a unused argument (loglevel) and the message
yourls_get_db()->getProfiler()->getLogger()->log( 'debug', $msg); // Check if function exists to allow usage of the function in very early stages
if(function_exists('yourls_debug_log')) {
yourls_get_db()->getProfiler()->getLogger()->log( 'debug', $msg);
}
return $msg; return $msg;
} }

View File

@ -17,6 +17,19 @@
// @codeCoverageIgnoreStart // @codeCoverageIgnoreStart
/**
* Plugin activation sandbox
*
* @since 1.8.3
* @deprecated 1.9.2
* @param string $pluginfile Plugin filename (full path)
* @return string|true string if error or true if success
*/
function yourls_activate_plugin_sandbox( $pluginfile ) {
yourls_deprecated_function( __FUNCTION__, '1.9.1', 'yourls_include_file_sandbox');
return yourls_include_file_sandbox($pluginfile);
}
/** /**
* Return current admin page, or null if not an admin page. Was not used anywhere. * Return current admin page, or null if not an admin page. Was not used anywhere.
* *

View File

@ -52,12 +52,16 @@ function yourls_string2int($string, $chars = null) {
* Return a unique string to be used as a valid HTML id * Return a unique string to be used as a valid HTML id
* *
* @since 1.8.3 * @since 1.8.3
* @param string $prefix Optional prefix * @param string $prefix Optional prefix
* @return string The unique string * @param int $initial_val The initial counter value (defaults to one)
* @return string The unique string
*/ */
function yourls_unique_element_id($prefix = 'yid') { function yourls_unique_element_id($prefix = 'yid', $initial_val = 1) {
static $id_counter = 0; static $id_counter = 1;
return yourls_apply_filter( 'unique_element_id', $prefix . (string)++$id_counter ); if ($initial_val > 1) {
$id_counter = (int) $initial_val;
}
return yourls_apply_filter( 'unique_element_id', $prefix . (string) $id_counter++ );
} }
/** /**
@ -635,7 +639,7 @@ function yourls_normalize_uri( $url ) {
$lower['host'] = mb_strtolower($parts['host']); $lower['host'] = mb_strtolower($parts['host']);
/** /**
* Convert IDN domains to their UTF8 form so that طارق.net and xn--mgbuq0c.net * Convert IDN domains to their UTF8 form so that طارق.net and xn--mgbuq0c.net
* are considered the same. Explicitely mention option and variant to avoid notice * are considered the same. Explicitly mention option and variant to avoid notice
* on PHP 7.2 and 7.3 * on PHP 7.2 and 7.3
*/ */
$lower['host'] = idn_to_utf8($lower['host'], IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46); $lower['host'] = idn_to_utf8($lower['host'], IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46);

View File

@ -503,11 +503,11 @@ function yourls_die( $message = '', $title = '', $header_code = 200 ) {
* Return an "Edit" row for the main table * Return an "Edit" row for the main table
* *
* @param string $keyword Keyword to edit * @param string $keyword Keyword to edit
* @param string $id
* @return string HTML of the edit row * @return string HTML of the edit row
*/ */
function yourls_table_edit_row( $keyword ) { function yourls_table_edit_row( $keyword, $id ) {
$keyword = yourls_sanitize_keyword($keyword); $keyword = yourls_sanitize_keyword($keyword);
$id = yourls_unique_element_id();
$url = yourls_get_keyword_longurl( $keyword ); $url = yourls_get_keyword_longurl( $keyword );
$title = htmlspecialchars( yourls_get_keyword_title( $keyword ) ); $title = htmlspecialchars( yourls_get_keyword_title( $keyword ) );
$safe_url = yourls_esc_attr( $url ); $safe_url = yourls_esc_attr( $url );
@ -545,11 +545,12 @@ RETURN;
* @param string $ip IP * @param string $ip IP
* @param string|int $clicks Number of clicks * @param string|int $clicks Number of clicks
* @param string $timestamp Timestamp * @param string $timestamp Timestamp
* @param int $row_id Numeric value used to form row IDs, defaults to one
* @return string HTML of the row * @return string HTML of the row
*/ */
function yourls_table_add_row( $keyword, $url, $title, $ip, $clicks, $timestamp ) { function yourls_table_add_row( $keyword, $url, $title, $ip, $clicks, $timestamp, $row_id = 1 ) {
$keyword = yourls_sanitize_keyword($keyword); $keyword = yourls_sanitize_keyword($keyword);
$id = yourls_unique_element_id(); $id = yourls_unique_element_id('yid', $row_id);
$shorturl = yourls_link( $keyword ); $shorturl = yourls_link( $keyword );
$statlink = yourls_statlink( $keyword ); $statlink = yourls_statlink( $keyword );
@ -905,7 +906,10 @@ function yourls_page( $page ) {
} }
yourls_do_action( 'pre_page', $page ); yourls_do_action( 'pre_page', $page );
include_once( YOURLS_PAGEDIR . "/$page.php" ); $load = yourls_include_file_sandbox(YOURLS_PAGEDIR . "/$page.php");
if (is_string($load)) {
yourls_die( $load, yourls__('Not found'), 404 );
}
yourls_do_action( 'post_page', $page ); yourls_do_action( 'post_page', $page );
} }

View File

@ -595,7 +595,7 @@ function yourls_load_plugins() {
$plugins = []; $plugins = [];
foreach ( $active_plugins as $key => $plugin ) { foreach ( $active_plugins as $key => $plugin ) {
$file = YOURLS_PLUGINDIR . '/' . $plugin; $file = YOURLS_PLUGINDIR . '/' . $plugin;
if ( yourls_is_a_plugin_file($file) && yourls_activate_plugin_sandbox( $file ) === true ) { if ( yourls_is_a_plugin_file($file) && yourls_include_file_sandbox( $file ) === true ) {
$plugins[] = $plugin; $plugins[] = $plugin;
unset( $active_plugins[ $key ] ); unset( $active_plugins[ $key ] );
} }
@ -659,7 +659,7 @@ function yourls_activate_plugin( $plugin ) {
} }
// attempt activation. // attempt activation.
$attempt = yourls_activate_plugin_sandbox( $plugindir.'/'.$plugin ); $attempt = yourls_include_file_sandbox( $plugindir.'/'.$plugin );
if( $attempt !== true ) { if( $attempt !== true ) {
return yourls_s( 'Plugin generated unexpected output. Error was: <br/><pre>%s</pre>', $attempt ); return yourls_s( 'Plugin generated unexpected output. Error was: <br/><pre>%s</pre>', $attempt );
} }
@ -673,22 +673,6 @@ function yourls_activate_plugin( $plugin ) {
return true; return true;
} }
/**
* Plugin activation sandbox
*
* @since 1.8.3
* @param string $pluginfile Plugin filename (full path)
* @return string|true string if error or true if success
*/
function yourls_activate_plugin_sandbox( $pluginfile ) {
try {
include_once $pluginfile;
return true;
} catch ( \Throwable $e ) {
return $e->getMessage();
}
}
/** /**
* Deactivate a plugin * Deactivate a plugin
* *
@ -706,12 +690,16 @@ function yourls_deactivate_plugin( $plugin ) {
// Check if we have an uninstall file - load if so // Check if we have an uninstall file - load if so
$uninst_file = YOURLS_PLUGINDIR . '/' . dirname($plugin) . '/uninstall.php'; $uninst_file = YOURLS_PLUGINDIR . '/' . dirname($plugin) . '/uninstall.php';
if ( file_exists($uninst_file) ) { $attempt = yourls_include_file_sandbox( $uninst_file );
// Check if we have an error to display
if ( is_string( $attempt ) ) {
$message = yourls_s( 'Loading %s generated unexpected output. Error was: <br/><pre>%s</pre>', $uninst_file, $attempt );
return( $message );
}
if ( $attempt === true ) {
define('YOURLS_UNINSTALL_PLUGIN', true); define('YOURLS_UNINSTALL_PLUGIN', true);
$attempt = yourls_activate_plugin_sandbox( $uninst_file );
if( $attempt !== true ) {
return yourls_s( 'Plugin generated unexpected output. Error was: <br/><pre>%s</pre>', $attempt );
}
} }
// Deactivate the plugin // Deactivate the plugin

View File

@ -26,9 +26,10 @@
* @param string $url URL to shorten * @param string $url URL to shorten
* @param string $keyword optional "keyword" * @param string $keyword optional "keyword"
* @param string $title option title * @param string $title option title
* @param int $row_id used to form unique IDs in the generated HTML
* @return array array with error/success state and short URL information * @return array array with error/success state and short URL information
*/ */
function yourls_add_new_link( $url, $keyword = '', $title = '' ) { function yourls_add_new_link( $url, $keyword = '', $title = '', $row_id = 1 ) {
// Allow plugins to short-circuit the whole function // Allow plugins to short-circuit the whole function
$pre = yourls_apply_filter( 'shunt_add_new_link', false, $url, $keyword, $title ); $pre = yourls_apply_filter( 'shunt_add_new_link', false, $url, $keyword, $title );
if ( false !== $pre ) { if ( false !== $pre ) {
@ -140,7 +141,7 @@ function yourls_add_new_link( $url, $keyword = '', $title = '' ) {
$return['status'] = 'success'; $return['status'] = 'success';
$return['message'] = /* //translators: eg "http://someurl/ added to DB" */ yourls_s( '%s added to database', yourls_trim_long_string( $url ) ); $return['message'] = /* //translators: eg "http://someurl/ added to DB" */ yourls_s( '%s added to database', yourls_trim_long_string( $url ) );
$return['title'] = $title; $return['title'] = $title;
$return['html'] = yourls_table_add_row( $keyword, $url, $title, $ip, 0, time() ); $return['html'] = yourls_table_add_row( $keyword, $url, $title, $ip, 0, time(), $row_id );
$return['shorturl'] = yourls_link($keyword); $return['shorturl'] = yourls_link($keyword);
$return['statusCode'] = 200; // 200 OK $return['statusCode'] = 200; // 200 OK
} else { } else {

View File

@ -5,7 +5,7 @@
* *
* Note to devs : prefer update function names using the SQL version, eg yourls_update_to_506(), * Note to devs : prefer update function names using the SQL version, eg yourls_update_to_506(),
* rather than using the YOURLS version number, eg yourls_update_to_18(). This is to allow having * rather than using the YOURLS version number, eg yourls_update_to_18(). This is to allow having
* multiple SQL update during the dev cycle of the same Y0URLS version * multiple SQL update during the dev cycle of the same YOURLS version
* *
* @param string|int $step * @param string|int $step
* @param string $oldver * @param string $oldver
@ -406,7 +406,7 @@ function yourls_update_table_to_14() {
if( $count != $queries ) { if( $count != $queries ) {
$success = false; $success = false;
$num = $count - $queries; $num = $count - $queries;
echo "<p>$num error(s) occured while updating the URL table :(</p>"; echo "<p>$num error(s) occurred while updating the URL table :(</p>";
} }
if ( $count == $chunk ) { if ( $count == $chunk ) {

View File

@ -264,8 +264,7 @@ function yourls_redirect( $location, $code = 301 ) {
* Redirect to an existing short URL * Redirect to an existing short URL
* *
* Redirect client to an existing short URL (no check performed) and execute misc tasks: update * Redirect client to an existing short URL (no check performed) and execute misc tasks: update
* clicks for short URL, update logs, and send a nocache header to prevent bots indexing short * clicks for short URL, update logs, and send an X-Robots-Tag header to control indexing of a page.
* URLS (see #2202)
* *
* @since 1.7.3 * @since 1.7.3
* @param string $url * @param string $url
@ -281,16 +280,36 @@ function yourls_redirect_shorturl($url, $keyword) {
// Update detailed log for stats // Update detailed log for stats
yourls_log_redirect( $keyword ); yourls_log_redirect( $keyword );
// Tell (Google)bots not to index this short URL, see #2202 // Send an X-Robots-Tag header
if ( !headers_sent() ) { yourls_robots_tag_header();
header( "X-Robots-Tag: noindex", true );
}
yourls_redirect( $url, 301 ); yourls_redirect( $url, 301 );
} }
/** /**
* Send headers to explicitely tell browser not to cache content or redirection * Send an X-Robots-Tag header. See #3486
*
* @since 1.9.2
* @return void
*/
function yourls_robots_tag_header() {
// Allow plugins to short-circuit the whole function
$pre = yourls_apply_filter( 'shunt_robots_tag_header', false );
if ( false !== $pre ) {
return $pre;
}
// By default, we're sending a 'noindex' header
$tag = yourls_apply_filter( 'robots_tag_header', 'noindex' );
$replace = yourls_apply_filter( 'robots_tag_header_replace', true );
if ( !headers_sent() ) {
header( "X-Robots-Tag: $tag", $replace );
}
}
/**
* Send headers to explicitly tell browser not to cache content or redirection
* *
* @since 1.7.10 * @since 1.7.10
* @return void * @return void
@ -1014,6 +1033,10 @@ function yourls_get_request($yourls_site = '', $uri = '') {
/** /**
* Fix $_SERVER['REQUEST_URI'] variable for various setups. Stolen from WP. * Fix $_SERVER['REQUEST_URI'] variable for various setups. Stolen from WP.
* *
* We also strip $_COOKIE from $_REQUEST to allow our lazy using $_REQUEST without 3rd party cookie interfering.
* See #3383 for explanation.
*
* @since 1.5.1
* @return void * @return void
*/ */
function yourls_fix_request_uri() { function yourls_fix_request_uri() {
@ -1024,6 +1047,9 @@ function yourls_fix_request_uri() {
]; ];
$_SERVER = array_merge( $default_server_values, $_SERVER ); $_SERVER = array_merge( $default_server_values, $_SERVER );
// Make $_REQUEST with only $_GET and $_POST, not $_COOKIE. See #3383.
$_REQUEST = array_merge( $_GET, $_POST );
// Fix for IIS when running with PHP ISAPI // Fix for IIS when running with PHP ISAPI
if ( empty( $_SERVER[ 'REQUEST_URI' ] ) || ( php_sapi_name() != 'cgi-fcgi' && preg_match( '/^Microsoft-IIS\//', $_SERVER[ 'SERVER_SOFTWARE' ] ) ) ) { if ( empty( $_SERVER[ 'REQUEST_URI' ] ) || ( php_sapi_name() != 'cgi-fcgi' && preg_match( '/^Microsoft-IIS\//', $_SERVER[ 'SERVER_SOFTWARE' ] ) ) ) {
@ -1065,30 +1091,32 @@ function yourls_fix_request_uri() {
* @return void * @return void
*/ */
function yourls_check_maintenance_mode() { function yourls_check_maintenance_mode() {
$file = YOURLS_ABSPATH . '/.maintenance' ; $dot_file = YOURLS_ABSPATH . '/.maintenance' ;
if ( !file_exists( $file ) || yourls_is_upgrading() || yourls_is_installing() ) { if ( !file_exists( $dot_file ) || yourls_is_upgrading() || yourls_is_installing() ) {
return; return;
} }
global $maintenance_start; global $maintenance_start;
include_once( $file ); yourls_include_file_sandbox( $dot_file );
// If the $maintenance_start timestamp is older than 10 minutes, don't die. // If the $maintenance_start timestamp is older than 10 minutes, don't die.
if ( ( time() - $maintenance_start ) >= 600 ) { if ( ( time() - $maintenance_start ) >= 600 ) {
return; return;
} }
// Use any /user/maintenance.php file // Use any /user/maintenance.php file
if( file_exists( YOURLS_USERDIR.'/maintenance.php' ) ) { $file = YOURLS_USERDIR . '/maintenance.php';
include_once( YOURLS_USERDIR.'/maintenance.php' ); if(file_exists($file)) {
die(); if(yourls_include_file_sandbox( $file ) == true) {
} die();
}
}
// Or use the default messages // Or use the default messages
$title = yourls__( 'Service temporarily unavailable' ); $title = yourls__('Service temporarily unavailable');
$message = yourls__( 'Our service is currently undergoing scheduled maintenance.' ) . "</p>\n<p>" . $message = yourls__('Our service is currently undergoing scheduled maintenance.') . "</p>\n<p>" .
yourls__( 'Things should not last very long, thank you for your patience and please excuse the inconvenience' ); yourls__('Things should not last very long, thank you for your patience and please excuse the inconvenience');
yourls_die( $message, $title , 503 ); yourls_die( $message, $title, 503 );
} }
/** /**
@ -1271,3 +1299,26 @@ function yourls_tell_if_new_version() {
yourls_debug_log( 'Check for new version: '.( yourls_maybe_check_core_version() ? 'yes' : 'no' ) ); yourls_debug_log( 'Check for new version: '.( yourls_maybe_check_core_version() ? 'yes' : 'no' ) );
yourls_new_core_version_notice(YOURLS_VERSION); yourls_new_core_version_notice(YOURLS_VERSION);
} }
/**
* File include sandbox
*
* Attempt to include a PHP file, fail with an error message if the file isn't valid PHP code.
* This function does not check first if the file exists : depending on use case, you may check first.
*
* @since 1.9.2
* @param string $file filename (full path)
* @return string|bool string if error, true if success
*/
function yourls_include_file_sandbox($file) {
try {
if (is_readable( $file )) {
include_once $file;
yourls_debug_log("loaded $file");
return true;
}
} catch ( \Throwable $e ) {
yourls_debug_log("could not load $file");
return sprintf("%s (%s : %s)", $e->getMessage() , $e->getFile() , $e->getLine() );
}
}

View File

@ -1 +1 @@
Database and Contents Copyright (c) 2022 MaxMind, Inc. Database and Contents Copyright (c) 2023 MaxMind, Inc.

Binary file not shown.

View File

@ -3,8 +3,21 @@
// autoload.php @generated by Composer // autoload.php @generated by Composer
if (PHP_VERSION_ID < 50600) { if (PHP_VERSION_ID < 50600) {
echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; if (!headers_sent()) {
exit(1); header('HTTP/1.1 500 Internal Server Error');
}
$err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
if (!ini_get('display_errors')) {
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
fwrite(STDERR, $err);
} elseif (!headers_sent()) {
echo $err;
}
}
trigger_error(
$err,
E_USER_ERROR
);
} }
require_once __DIR__ . '/composer/autoload_real.php'; require_once __DIR__ . '/composer/autoload_real.php';

View File

@ -28,7 +28,7 @@ class InstalledVersions
{ {
/** /**
* @var mixed[]|null * @var mixed[]|null
* @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}|array{}|null * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
*/ */
private static $installed; private static $installed;
@ -39,7 +39,7 @@ class InstalledVersions
/** /**
* @var array[] * @var array[]
* @psalm-var array<string, array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}> * @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
*/ */
private static $installedByVendor = array(); private static $installedByVendor = array();
@ -243,7 +243,7 @@ class InstalledVersions
/** /**
* @return array * @return array
* @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string} * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
*/ */
public static function getRootPackage() public static function getRootPackage()
{ {
@ -257,7 +257,7 @@ class InstalledVersions
* *
* @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
* @return array[] * @return array[]
* @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}
*/ */
public static function getRawData() public static function getRawData()
{ {
@ -280,7 +280,7 @@ class InstalledVersions
* Returns the raw data of all installed.php which are currently loaded for custom implementations * Returns the raw data of all installed.php which are currently loaded for custom implementations
* *
* @return array[] * @return array[]
* @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}> * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
*/ */
public static function getAllRawData() public static function getAllRawData()
{ {
@ -303,7 +303,7 @@ class InstalledVersions
* @param array[] $data A vendor/composer/installed.php data set * @param array[] $data A vendor/composer/installed.php data set
* @return void * @return void
* *
* @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} $data * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data
*/ */
public static function reload($data) public static function reload($data)
{ {
@ -313,7 +313,7 @@ class InstalledVersions
/** /**
* @return array[] * @return array[]
* @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}> * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
*/ */
private static function getInstalled() private static function getInstalled()
{ {

View File

@ -1,7 +1,7 @@
## ##
## Bundle of CA Root Certificates ## Bundle of CA Root Certificates
## ##
## Certificate data from Mozilla as of: Tue Oct 26 03:12:05 2021 GMT ## Certificate data from Mozilla as of: Tue Oct 11 03:12:05 2022 GMT
## ##
## This is a bundle of X.509 certificates of public Certificate Authorities ## This is a bundle of X.509 certificates of public Certificate Authorities
## (CA). These were automatically extracted from Mozilla's root certificates ## (CA). These were automatically extracted from Mozilla's root certificates
@ -13,8 +13,8 @@
## an Apache+mod_ssl webserver for SSL client authentication. ## an Apache+mod_ssl webserver for SSL client authentication.
## Just configure this file as the SSLCACertificateFile. ## Just configure this file as the SSLCACertificateFile.
## ##
## Conversion done with mk-ca-bundle.pl version 1.28. ## Conversion done with mk-ca-bundle.pl version 1.29.
## SHA256: bb36818a81feaa4cca61101e6d6276cd09e972efcb08112dfed846918ca41d7f ## SHA256: 3ff8bd209b5f2e739b9f2b96eacb694a774114685b02978257824f37ff528f71
## ##
@ -39,28 +39,6 @@ hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
-----END CERTIFICATE----- -----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 Entrust.net Premium 2048 Secure Server CA
========================================= =========================================
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
@ -573,28 +551,6 @@ PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
-----END CERTIFICATE----- -----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 ePKI Root Certification Authority
================================= =================================
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
@ -1037,60 +993,6 @@ tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
-----END CERTIFICATE----- -----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 Actalis Authentication Root CA
============================== ==============================
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
@ -1737,20 +1639,6 @@ HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu
9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
-----END CERTIFICATE----- -----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 GlobalSign ECC Root CA - R5
=========================== ===========================
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
@ -2472,96 +2360,6 @@ AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk
AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9
-----END CERTIFICATE----- -----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 UCA Global G2 Root
================== ==================
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
@ -3230,3 +3028,479 @@ ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW
rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw
CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps
-----END CERTIFICATE----- -----END CERTIFICATE-----
Autoridad de Certificacion Firmaprofesional CIF A62634068
=========================================================
-----BEGIN CERTIFICATE-----
MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCRVMxQjBA
BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIw
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+JIwuwIDAQABo4HvMIHsMB0GA1Ud
DgQWBBRlzeurNR4APn7VdMActHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4w
gZswgZgGBFUdIAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j
b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABCAG8AbgBhAG4A
bwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAwADEANzAOBgNVHQ8BAf8EBAMC
AQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9miWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL
4QjbEwj4KKE1soCzC1HA01aajTNFSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDb
LIpgD7dvlAceHabJhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1il
I45PVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZEEAEeiGaP
cjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV1aUsIC+nmCjuRfzxuIgA
LI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2tCsvMo2ebKHTEm9caPARYpoKdrcd7b/+A
lun4jWq9GJAd/0kakFI3ky88Al2CdgtR5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH
9IBk9W6VULgRfhVwOEqwf9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpf
NIbnYrX9ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNKGbqE
ZycPvEJdvSRUDewdcAZfpLz6IHxV
-----END CERTIFICATE-----
vTrus ECC Root CA
=================
-----BEGIN CERTIFICATE-----
MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMwRzELMAkGA1UE
BhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBS
b290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDczMTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAa
BgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYw
EAYHKoZIzj0CAQYFK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+c
ToL0v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUde4BdS49n
TPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYDVR0TAQH/BAUwAwEB/zAO
BgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIwV53dVvHH4+m4SVBrm2nDb+zDfSXkV5UT
QJtS0zvzQBm8JsctBp61ezaf9SXUY2sAAjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQL
YgmRWAD5Tfs0aNoJrSEGGJTO
-----END CERTIFICATE-----
vTrus Root CA
=============
-----BEGIN CERTIFICATE-----
MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQELBQAwQzELMAkG
A1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xFjAUBgNVBAMTDXZUcnVzIFJv
b3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMxMDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoG
A1UEChMTaVRydXNDaGluYSBDby4sTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJ
KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZots
SKYcIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykUAyyNJJrI
ZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+GrPSbcKvdmaVayqwlHeF
XgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z98Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KA
YPxMvDVTAWqXcoKv8R1w6Jz1717CbMdHflqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70
kLJrxLT5ZOrpGgrIDajtJ8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2
AXPKBlim0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZNpGvu
/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQUqqzApVg+QxMaPnu
1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHWOXSuTEGC2/KmSNGzm/MzqvOmwMVO
9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMBAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYg
scasGrz2iTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC
AgEAKbqSSaet8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd
nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1jbhd47F18iMjr
jld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvMKar5CKXiNxTKsbhm7xqC5PD4
8acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIivTDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJn
xDHO2zTlJQNgJXtxmOTAGytfdELSS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554Wg
icEFOwE30z9J4nfrI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4
sEb9b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNBUvupLnKW
nyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1PTi07NEPhmg4NpGaXutIc
SkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929vensBxXVsFy6K2ir40zSbofitzmdHxghm+H
l3s=
-----END CERTIFICATE-----
ISRG Root X2
============
-----BEGIN CERTIFICATE-----
MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQswCQYDVQQGEwJV
UzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElT
UkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVT
MSkwJwYDVQQKEyBJbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNS
RyBSb290IFgyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0H
ttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9ItgKbppb
d9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
HQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZIzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtF
cP9Ymd70/aTSVaYgLXTWNLxBo1BfASdWtL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5
U6VR5CmD1/iQMVtCnwr1/q4AaOeMSQ+2b1tbFfLn
-----END CERTIFICATE-----
HiPKI Root CA - G1
==================
-----BEGIN CERTIFICATE-----
MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQG
EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xGzAZBgNVBAMMEkhpUEtJ
IFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRaFw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYT
AlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kg
Um9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0
o9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twvVcg3Px+k
wJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6lZgRZq2XNdZ1AYDgr/SE
YYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnzQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsA
GJZMoYFL3QRtU6M9/Aes1MU3guvklQgZKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfd
hSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj
1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDry+K4
9a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/
Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF
8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYD
VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQD
AgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi
7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqcSE5XCV0vrPSl
tJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6FzaZsT0pPBWGTMpWmWSBUdGSquE
wx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9TcXzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07Q
JNBAsNB1CI69aO4I1258EHBGG3zgiLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv
5wiZqAxeJoBF1PhoL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+Gpz
jLrFNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wrkkVbbiVg
hUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+vhV4nYWBSipX3tUZQ9rb
yltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQUYDksswBVLuT1sw5XxJFBAJw/6KXf6vb/
yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ==
-----END CERTIFICATE-----
GlobalSign ECC Root CA - R4
===========================
-----BEGIN CERTIFICATE-----
MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYDVQQLExtHbG9i
YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds
b2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgwMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9i
YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds
b2JhbFNpZ24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkW
ymOxuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNVHQ8BAf8E
BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/+wpu+74zyTyjhNUwCgYI
KoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147bmF0774BxL4YSFlhgjICICadVGNA3jdg
UM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm
-----END CERTIFICATE-----
GTS Root R1
===========
-----BEGIN CERTIFICATE-----
MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV
UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg
UjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE
ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0G
CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM
f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7raKb0
xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+w
B7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXW
nOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk
9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zq
kUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1A
K/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPX
V2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDW
cfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T
AQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQAD
ggIBAJ+qQibbC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe
QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuyh6f88/qBVRRi
ClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM47HLwEXWdyzRSjeZ2axfG34ar
J45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8JZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYci
NuaCp+0KueIHoI17eko8cdLiA6EfMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5me
LMFrUKTX5hgUvYU/Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJF
fbdT6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ0E6yove+
7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm2tIMPNuzjsmhDYAPexZ3
FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bbbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3
gm3c
-----END CERTIFICATE-----
GTS Root R2
===========
-----BEGIN CERTIFICATE-----
MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV
UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg
UjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE
ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0G
CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv
CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo7JUl
e3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWIm8Wb
a96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS
+LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7M
kogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJG
r61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9q
S34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNV
J1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okL
dWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T
AQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQAD
ggIBAB/Kzt3HvqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8
0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyCB19m3H0Q/gxh
swWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2uNmSRXbBoGOqKYcl3qJfEycel
/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMgyALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVn
jWQye+mew4K6Ki3pHrTgSAai/GevHyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y5
9PYjJbigapordwj6xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M
7YNRTOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924SgJPFI/2R8
0L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV7LXTWtiBmelDGDfrs7vR
WGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjW
HYbL
-----END CERTIFICATE-----
GTS Root R3
===========
-----BEGIN CERTIFICATE-----
MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi
MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMw
HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ
R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjO
PQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout
736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24CejQjBA
MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/Eq
Er24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azT
L818+FsuVbu/3ZL3pAzcMeGiAjEA/JdmZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV
11RZt+cRLInUue4X
-----END CERTIFICATE-----
GTS Root R4
===========
-----BEGIN CERTIFICATE-----
MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi
MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQw
HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ
R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjO
PQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu
hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqjQjBA
MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1
PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/C
r8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh
4rsUecrNIdSUtUlD
-----END CERTIFICATE-----
Telia Root CA v2
================
-----BEGIN CERTIFICATE-----
MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNVBAYT
AkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2
MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQK
DBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZI
hvcNAQEBBQADggIPADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ7
6zBqAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9vVYiQJ3q
9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9lRdU2HhE8Qx3FZLgmEKn
pNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTODn3WhUidhOPFZPY5Q4L15POdslv5e2QJl
tI5c0BE0312/UqeBAMN/mUWZFdUXyApT7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW
5olWK8jjfN7j/4nlNW4o6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNr
RBH0pUPCTEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6WT0E
BXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63RDolUK5X6wK0dmBR4
M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZIpEYslOqodmJHixBTB0hXbOKSTbau
BcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGjYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7W
xy+G2CQ5MB0GA1UdDgQWBBRyrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYD
VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ
8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi0f6X+J8wfBj5
tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMMA8iZGok1GTzTyVR8qPAs5m4H
eW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBSSRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+C
y748fdHif64W1lZYudogsYMVoe+KTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygC
QMez2P2ccGrGKMOF6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15
h2Er3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMtTy3EHD70
sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pTVmBds9hCG1xLEooc6+t9
xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAWysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQ
raVplI/owd8k+BsHMYeB2F326CjYSlKArBPuUBQemMc=
-----END CERTIFICATE-----
D-TRUST BR Root CA 1 2020
=========================
-----BEGIN CERTIFICATE-----
MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE
RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0EgMSAy
MDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNV
BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAG
ByqGSM49AgEGBSuBBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7
dPYSzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0QVK5buXu
QqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/VbNafAkl1bK6CKBrqx9t
MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu
bmV0L2NybC9kLXRydXN0X2JyX3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj
dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP
PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD
AwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFWwKrY7RjEsK70Pvom
AjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHVdWNbFJWcHwHP2NVypw87
-----END CERTIFICATE-----
D-TRUST EV Root CA 1 2020
=========================
-----BEGIN CERTIFICATE-----
MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE
RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0EgMSAy
MDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNV
BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAG
ByqGSM49AgEGBSuBBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8
ZRCC/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rDwpdhQntJ
raOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3OqQo5FD4pPfsazK2/umL
MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu
bmV0L2NybC9kLXRydXN0X2V2X3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj
dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP
PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD
AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR
AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW
-----END CERTIFICATE-----
DigiCert TLS ECC P384 Root G5
=============================
-----BEGIN CERTIFICATE-----
MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV
UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4
NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx
FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg
Um9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd
lHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj
n4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB
/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds
Jk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx
AJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA==
-----END CERTIFICATE-----
DigiCert TLS RSA4096 Root G5
============================
-----BEGIN CERTIFICATE-----
MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG
EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0
MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV
UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2
IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8
7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU
AT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces
tyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa
zOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV
DdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q
TXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy
z6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/
MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk
wcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E
FgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w
DQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw
GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN
lnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN
MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/
u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G
OUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh
47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU
FvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ
yqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP
bEtoL8pU9ozaMv7Da4M/OMZ+
-----END CERTIFICATE-----
Certainly Root R1
=================
-----BEGIN CERTIFICATE-----
MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE
BhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN
MjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy
dGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
ADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O
5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl
8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl
DbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI
XsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN
KPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ
AjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb
rlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1
VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS
p6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
DgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz
HQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d
8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v
MMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB
GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+
gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH
JBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7
fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw
x06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S
X3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8=
-----END CERTIFICATE-----
Certainly Root E1
=================
-----BEGIN CERTIFICATE-----
MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV
UzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0
MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu
bHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4
fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9
YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw
DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E
AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8
rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR
-----END CERTIFICATE-----
E-Tugra Global Root CA RSA v3
=============================
-----BEGIN CERTIFICATE-----
MIIF8zCCA9ugAwIBAgIUDU3FzRYilZYIfrgLfxUGNPt5EDQwDQYJKoZIhvcNAQELBQAwgYAxCzAJ
BgNVBAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVncmEgRUJHIEEuUy4xHTAb
BgNVBAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYDVQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290
IENBIFJTQSB2MzAeFw0yMDAzMTgwOTA3MTdaFw00NTAzMTIwOTA3MTdaMIGAMQswCQYDVQQGEwJU
UjEPMA0GA1UEBxMGQW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRF
LVR1Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBDQSBSU0Eg
djMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCiZvCJt3J77gnJY9LTQ91ew6aEOErx
jYG7FL1H6EAX8z3DeEVypi6Q3po61CBxyryfHUuXCscxuj7X/iWpKo429NEvx7epXTPcMHD4QGxL
sqYxYdE0PD0xesevxKenhOGXpOhL9hd87jwH7eKKV9y2+/hDJVDqJ4GohryPUkqWOmAalrv9c/SF
/YP9f4RtNGx/ardLAQO/rWm31zLZ9Vdq6YaCPqVmMbMWPcLzJmAy01IesGykNz709a/r4d+ABs8q
QedmCeFLl+d3vSFtKbZnwy1+7dZ5ZdHPOrbRsV5WYVB6Ws5OUDGAA5hH5+QYfERaxqSzO8bGwzrw
bMOLyKSRBfP12baqBqG3q+Sx6iEUXIOk/P+2UNOMEiaZdnDpwA+mdPy70Bt4znKS4iicvObpCdg6
04nmvi533wEKb5b25Y08TVJ2Glbhc34XrD2tbKNSEhhw5oBOM/J+JjKsBY04pOZ2PJ8QaQ5tndLB
eSBrW88zjdGUdjXnXVXHt6woq0bM5zshtQoK5EpZ3IE1S0SVEgpnpaH/WwAH0sDM+T/8nzPyAPiM
bIedBi3x7+PmBvrFZhNb/FAHnnGGstpvdDDPk1Po3CLW3iAfYY2jLqN4MpBs3KwytQXk9TwzDdbg
h3cXTJ2w2AmoDVf3RIXwyAS+XF1a4xeOVGNpf0l0ZAWMowIDAQABo2MwYTAPBgNVHRMBAf8EBTAD
AQH/MB8GA1UdIwQYMBaAFLK0ruYt9ybVqnUtdkvAG1Mh0EjvMB0GA1UdDgQWBBSytK7mLfcm1ap1
LXZLwBtTIdBI7zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAImocn+M684uGMQQ
gC0QDP/7FM0E4BQ8Tpr7nym/Ip5XuYJzEmMmtcyQ6dIqKe6cLcwsmb5FJ+Sxce3kOJUxQfJ9emN4
38o2Fi+CiJ+8EUdPdk3ILY7r3y18Tjvarvbj2l0Upq7ohUSdBm6O++96SmotKygY/r+QLHUWnw/q
ln0F7psTpURs+APQ3SPh/QMSEgj0GDSz4DcLdxEBSL9htLX4GdnLTeqjjO/98Aa1bZL0SmFQhO3s
SdPkvmjmLuMxC1QLGpLWgti2omU8ZgT5Vdps+9u1FGZNlIM7zR6mK7L+d0CGq+ffCsn99t2HVhjY
sCxVYJb6CH5SkPVLpi6HfMsg2wY+oF0Dd32iPBMbKaITVaA9FCKvb7jQmhty3QUBjYZgv6Rn7rWl
DdF/5horYmbDB7rnoEgcOMPpRfunf/ztAmgayncSd6YAVSgU7NbHEqIbZULpkejLPoeJVF3Zr52X
nGnnCv8PWniLYypMfUeUP95L6VPQMPHF9p5J3zugkaOj/s1YzOrfr28oO6Bpm4/srK4rVJ2bBLFH
IK+WEj5jlB0E5y67hscMmoi/dkfv97ALl2bSRM9gUgfh1SxKOidhd8rXj+eHDjD/DLsE4mHDosiX
YY60MGo8bcIHX0pzLz/5FooBZu+6kcpSV3uu1OYP3Qt6f4ueJiDPO++BcYNZ
-----END CERTIFICATE-----
E-Tugra Global Root CA ECC v3
=============================
-----BEGIN CERTIFICATE-----
MIICpTCCAiqgAwIBAgIUJkYZdzHhT28oNt45UYbm1JeIIsEwCgYIKoZIzj0EAwMwgYAxCzAJBgNV
BAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVncmEgRUJHIEEuUy4xHTAbBgNV
BAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYDVQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290IENB
IEVDQyB2MzAeFw0yMDAzMTgwOTQ2NThaFw00NTAzMTIwOTQ2NThaMIGAMQswCQYDVQQGEwJUUjEP
MA0GA1UEBxMGQW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRFLVR1
Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBDQSBFQ0MgdjMw
djAQBgcqhkjOPQIBBgUrgQQAIgNiAASOmCm/xxAeJ9urA8woLNheSBkQKczLWYHMjLiSF4mDKpL2
w6QdTGLVn9agRtwcvHbB40fQWxPa56WzZkjnIZpKT4YKfWzqTTKACrJ6CZtpS5iB4i7sAnCWH/31
Rs7K3IKjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU/4Ixcj75xGZsrTie0bBRiKWQ
zPUwHQYDVR0OBBYEFP+CMXI++cRmbK04ntGwUYilkMz1MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO
PQQDAwNpADBmAjEA5gVYaWHlLcoNy/EZCL3W/VGSGn5jVASQkZo1kTmZ+gepZpO6yGjUij/67W4W
Aie3AjEA3VoXK3YdZUKWpqxdinlW2Iob35reX8dQj7FbcQwm32pAAOwzkSFxvmjkI6TZraE3
-----END CERTIFICATE-----
Security Communication RootCA3
==============================
-----BEGIN CERTIFICATE-----
MIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNVBAYTAkpQMSUw
IwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScwJQYDVQQDEx5TZWN1cml0eSBD
b21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2MDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQsw
CQYDVQQGEwJKUDElMCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UE
AxMeU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
MIICCgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4rCmDvu20r
hvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzAlrenfna84xtSGc4RHwsE
NPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MGTfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2
/D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF79+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGm
npjKIG58u4iFW/vAEGK78vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtY
XLVqAvO4g160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3weGVPK
p7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst+3A7caoreyYn8xrC
3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M0V9hvqG8OmpI6iZVIhZdXw3/JzOf
GAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQT9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0Vcw
CBEF/VfR2ccCAwEAAaNCMEAwHQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB
/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS
YpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PAFNr0Y/Dq9HHu
Tofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd9XbXv8S2gVj/yP9kaWJ5rW4O
H3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQIUYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASx
YfQAW0q3nHE3GYV5v4GwxxMOdnE+OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZ
XSEIx2C/pHF7uNkegr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml
+LLfiAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUVnuiZIesn
KwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD2NCcnWXL0CsnMQMeNuE9
dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI//1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm
6Vwdp6POXiUyK+OVrCoHzrQoeIY8LaadTdJ0MN1kURXbg4NR16/9M51NZg==
-----END CERTIFICATE-----
Security Communication ECC RootCA1
==================================
-----BEGIN CERTIFICATE-----
MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUwIwYD
VQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0eSBDb21t
dW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTEL
MAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNV
BAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQA
IgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+CnnfdldB9sELLo
5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpKULGjQjBAMB0GA1UdDgQW
BBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAK
BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L
snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e
N9k=
-----END CERTIFICATE-----

View File

@ -62,17 +62,17 @@
}, },
{ {
"name": "composer/ca-bundle", "name": "composer/ca-bundle",
"version": "1.3.1", "version": "1.3.4",
"version_normalized": "1.3.1.0", "version_normalized": "1.3.4.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/composer/ca-bundle.git", "url": "https://github.com/composer/ca-bundle.git",
"reference": "4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b" "reference": "69098eca243998b53eed7a48d82dedd28b447cd5"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/composer/ca-bundle/zipball/4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b", "url": "https://api.github.com/repos/composer/ca-bundle/zipball/69098eca243998b53eed7a48d82dedd28b447cd5",
"reference": "4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b", "reference": "69098eca243998b53eed7a48d82dedd28b447cd5",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -86,7 +86,7 @@
"symfony/phpunit-bridge": "^4.2 || ^5", "symfony/phpunit-bridge": "^4.2 || ^5",
"symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0"
}, },
"time": "2021-10-28T20:44:15+00:00", "time": "2022-10-12T12:08:29+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
@ -121,7 +121,7 @@
"support": { "support": {
"irc": "irc://irc.freenode.org/composer", "irc": "irc://irc.freenode.org/composer",
"issues": "https://github.com/composer/ca-bundle/issues", "issues": "https://github.com/composer/ca-bundle/issues",
"source": "https://github.com/composer/ca-bundle/tree/1.3.1" "source": "https://github.com/composer/ca-bundle/tree/1.3.4"
}, },
"funding": [ "funding": [
{ {
@ -141,17 +141,17 @@
}, },
{ {
"name": "geoip2/geoip2", "name": "geoip2/geoip2",
"version": "v2.12.2", "version": "v2.13.0",
"version_normalized": "2.12.2.0", "version_normalized": "2.13.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/maxmind/GeoIP2-php.git", "url": "git@github.com:maxmind/GeoIP2-php.git",
"reference": "83adb44ac4b9553d36b579a14673ed124583082f" "reference": "6a41d8fbd6b90052bc34dff3b4252d0f88067b23"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/83adb44ac4b9553d36b579a14673ed124583082f", "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/6a41d8fbd6b90052bc34dff3b4252d0f88067b23",
"reference": "83adb44ac4b9553d36b579a14673ed124583082f", "reference": "6a41d8fbd6b90052bc34dff3b4252d0f88067b23",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -166,7 +166,7 @@
"phpunit/phpunit": "^8.0 || ^9.0", "phpunit/phpunit": "^8.0 || ^9.0",
"squizlabs/php_codesniffer": "3.*" "squizlabs/php_codesniffer": "3.*"
}, },
"time": "2021-11-30T18:15:25+00:00", "time": "2022-08-05T20:32:58+00:00",
"type": "library", "type": "library",
"installation-source": "dist", "installation-source": "dist",
"autoload": { "autoload": {
@ -194,10 +194,6 @@
"geolocation", "geolocation",
"maxmind" "maxmind"
], ],
"support": {
"issues": "https://github.com/maxmind/GeoIP2-php/issues",
"source": "https://github.com/maxmind/GeoIP2-php/tree/v2.12.2"
},
"install-path": "../geoip2/geoip2" "install-path": "../geoip2/geoip2"
}, },
{ {
@ -360,23 +356,23 @@
}, },
{ {
"name": "ozh/bookmarkletgen", "name": "ozh/bookmarkletgen",
"version": "1.2", "version": "1.2.2",
"version_normalized": "1.2.0.0", "version_normalized": "1.2.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/ozh/bookmarkletgen.git", "url": "https://github.com/ozh/bookmarkletgen.git",
"reference": "3319b53c493a1474a03d1cc4e087617652284c20" "reference": "65fffa64bb11f70470d398d7baf6d9bb84411cfc"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/ozh/bookmarkletgen/zipball/3319b53c493a1474a03d1cc4e087617652284c20", "url": "https://api.github.com/repos/ozh/bookmarkletgen/zipball/65fffa64bb11f70470d398d7baf6d9bb84411cfc",
"reference": "3319b53c493a1474a03d1cc4e087617652284c20", "reference": "65fffa64bb11f70470d398d7baf6d9bb84411cfc",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=5.3" "php": ">=7.2"
}, },
"time": "2017-05-18T12:46:21+00:00", "time": "2022-05-04T13:05:16+00:00",
"type": "library", "type": "library",
"installation-source": "dist", "installation-source": "dist",
"autoload": { "autoload": {
@ -400,31 +396,35 @@
"bookmarklet", "bookmarklet",
"javascript" "javascript"
], ],
"support": {
"issues": "https://github.com/ozh/bookmarkletgen/issues",
"source": "https://github.com/ozh/bookmarkletgen/tree/1.2.2"
},
"install-path": "../ozh/bookmarkletgen" "install-path": "../ozh/bookmarkletgen"
}, },
{ {
"name": "pomo/pomo", "name": "pomo/pomo",
"version": "v1.4.1", "version": "v1.5.0",
"version_normalized": "1.4.1.0", "version_normalized": "1.5.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/LeoColomb/pomo.git", "url": "https://github.com/LeoColomb/pomo.git",
"reference": "1594bd1f90c89a45ffc3da2ee6d5d582bfac7542" "reference": "b1e53a997850496369634d574fa6b508091fc353"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/LeoColomb/pomo/zipball/1594bd1f90c89a45ffc3da2ee6d5d582bfac7542", "url": "https://api.github.com/repos/LeoColomb/pomo/zipball/b1e53a997850496369634d574fa6b508091fc353",
"reference": "1594bd1f90c89a45ffc3da2ee6d5d582bfac7542", "reference": "b1e53a997850496369634d574fa6b508091fc353",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=5.3.0" "php": ">=5.3.0"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": ">=4.0", "phpunit/phpunit": "^4.0 || ^7.0",
"squizlabs/php_codesniffer": "^3.0 || ^2.9.1" "squizlabs/php_codesniffer": "^3.0"
}, },
"time": "2018-12-20T14:55:38+00:00", "time": "2023-01-06T01:05:43+00:00",
"type": "library", "type": "library",
"installation-source": "dist", "installation-source": "dist",
"autoload": { "autoload": {
@ -448,7 +448,7 @@
"role": "Maintainer" "role": "Maintainer"
} }
], ],
"description": "Gettext library to translate with I18n", "description": "Gettext library to translate with i18n",
"homepage": "https://github.com/LeoColomb/pomo", "homepage": "https://github.com/LeoColomb/pomo",
"keywords": [ "keywords": [
"gettext", "gettext",
@ -457,6 +457,20 @@
"localization", "localization",
"translation" "translation"
], ],
"support": {
"issues": "https://github.com/LeoColomb/pomo/issues",
"source": "https://github.com/LeoColomb/pomo/tree/v1.5.0"
},
"funding": [
{
"url": "https://github.com/LeoColomb",
"type": "github"
},
{
"url": "https://www.patreon.com/LeoColomb",
"type": "patreon"
}
],
"install-path": "../pomo/pomo" "install-path": "../pomo/pomo"
}, },
{ {
@ -514,17 +528,17 @@
}, },
{ {
"name": "rmccue/requests", "name": "rmccue/requests",
"version": "2.0.2", "version": "v2.0.5",
"version_normalized": "2.0.2.0", "version_normalized": "2.0.5.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/WordPress/Requests.git", "url": "https://github.com/WordPress/Requests.git",
"reference": "b01ce7c91657d604f298751686d7f5eec87b9493" "reference": "b717f1d2f4ef7992ec0c127747ed8b7e170c2f49"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/WordPress/Requests/zipball/b01ce7c91657d604f298751686d7f5eec87b9493", "url": "https://api.github.com/repos/WordPress/Requests/zipball/b717f1d2f4ef7992ec0c127747ed8b7e170c2f49",
"reference": "b01ce7c91657d604f298751686d7f5eec87b9493", "reference": "b717f1d2f4ef7992ec0c127747ed8b7e170c2f49",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -542,7 +556,7 @@
"wp-coding-standards/wpcs": "^2.0", "wp-coding-standards/wpcs": "^2.0",
"yoast/phpunit-polyfills": "^1.0.0" "yoast/phpunit-polyfills": "^1.0.0"
}, },
"time": "2022-03-28T15:37:07+00:00", "time": "2022-10-11T08:15:28+00:00",
"type": "library", "type": "library",
"installation-source": "dist", "installation-source": "dist",
"autoload": { "autoload": {
@ -598,17 +612,17 @@
}, },
{ {
"name": "spatie/array-to-xml", "name": "spatie/array-to-xml",
"version": "2.16.0", "version": "2.17.1",
"version_normalized": "2.16.0.0", "version_normalized": "2.17.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/spatie/array-to-xml.git", "url": "https://github.com/spatie/array-to-xml.git",
"reference": "db39308c5236b69b89cadc3f44f191704814eae2" "reference": "5cbec9c6ab17e320c58a259f0cebe88bde4a7c46"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/spatie/array-to-xml/zipball/db39308c5236b69b89cadc3f44f191704814eae2", "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/5cbec9c6ab17e320c58a259f0cebe88bde4a7c46",
"reference": "db39308c5236b69b89cadc3f44f191704814eae2", "reference": "5cbec9c6ab17e320c58a259f0cebe88bde4a7c46",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -617,10 +631,11 @@
}, },
"require-dev": { "require-dev": {
"mockery/mockery": "^1.2", "mockery/mockery": "^1.2",
"pestphp/pest": "^1.21",
"phpunit/phpunit": "^9.0", "phpunit/phpunit": "^9.0",
"spatie/phpunit-snapshot-assertions": "^4.2" "spatie/pest-plugin-snapshots": "^1.1"
}, },
"time": "2020-11-18T22:03:17+00:00", "time": "2022-12-26T08:22:07+00:00",
"type": "library", "type": "library",
"installation-source": "dist", "installation-source": "dist",
"autoload": { "autoload": {
@ -648,8 +663,7 @@
"xml" "xml"
], ],
"support": { "support": {
"issues": "https://github.com/spatie/array-to-xml/issues", "source": "https://github.com/spatie/array-to-xml/tree/2.17.1"
"source": "https://github.com/spatie/array-to-xml/tree/2.16.0"
}, },
"funding": [ "funding": [
{ {
@ -665,17 +679,17 @@
}, },
{ {
"name": "symfony/polyfill-intl-idn", "name": "symfony/polyfill-intl-idn",
"version": "v1.25.0", "version": "v1.27.0",
"version_normalized": "1.25.0.0", "version_normalized": "1.27.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git", "url": "https://github.com/symfony/polyfill-intl-idn.git",
"reference": "749045c69efb97c70d25d7463abba812e91f3a44" "reference": "639084e360537a19f9ee352433b84ce831f3d2da"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/749045c69efb97c70d25d7463abba812e91f3a44", "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da",
"reference": "749045c69efb97c70d25d7463abba812e91f3a44", "reference": "639084e360537a19f9ee352433b84ce831f3d2da",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -686,11 +700,11 @@
"suggest": { "suggest": {
"ext-intl": "For best performance" "ext-intl": "For best performance"
}, },
"time": "2021-09-14T14:02:44+00:00", "time": "2022-11-03T14:55:06+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "1.23-dev" "dev-main": "1.27-dev"
}, },
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
@ -735,7 +749,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.25.0" "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0"
}, },
"funding": [ "funding": [
{ {
@ -755,17 +769,17 @@
}, },
{ {
"name": "symfony/polyfill-intl-normalizer", "name": "symfony/polyfill-intl-normalizer",
"version": "v1.25.0", "version": "v1.27.0",
"version_normalized": "1.25.0.0", "version_normalized": "1.27.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
"reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6",
"reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -774,11 +788,11 @@
"suggest": { "suggest": {
"ext-intl": "For best performance" "ext-intl": "For best performance"
}, },
"time": "2021-02-19T12:13:01+00:00", "time": "2022-11-03T14:55:06+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "1.23-dev" "dev-main": "1.27-dev"
}, },
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
@ -822,7 +836,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.25.0" "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0"
}, },
"funding": [ "funding": [
{ {
@ -842,17 +856,17 @@
}, },
{ {
"name": "symfony/polyfill-mbstring", "name": "symfony/polyfill-mbstring",
"version": "v1.25.0", "version": "v1.27.0",
"version_normalized": "1.25.0.0", "version_normalized": "1.27.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git", "url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825" "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0abb51d2f102e00a4eefcf46ba7fec406d245825", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
"reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825", "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -864,11 +878,11 @@
"suggest": { "suggest": {
"ext-mbstring": "For best performance" "ext-mbstring": "For best performance"
}, },
"time": "2021-11-30T18:21:41+00:00", "time": "2022-11-03T14:55:06+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "1.23-dev" "dev-main": "1.27-dev"
}, },
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
@ -908,7 +922,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.25.0" "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
}, },
"funding": [ "funding": [
{ {
@ -928,27 +942,27 @@
}, },
{ {
"name": "symfony/polyfill-php72", "name": "symfony/polyfill-php72",
"version": "v1.25.0", "version": "v1.27.0",
"version_normalized": "1.25.0.0", "version_normalized": "1.27.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-php72.git", "url": "https://github.com/symfony/polyfill-php72.git",
"reference": "9a142215a36a3888e30d0a9eeea9766764e96976" "reference": "869329b1e9894268a8a61dabb69153029b7a8c97"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97",
"reference": "9a142215a36a3888e30d0a9eeea9766764e96976", "reference": "869329b1e9894268a8a61dabb69153029b7a8c97",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1" "php": ">=7.1"
}, },
"time": "2021-05-27T09:17:38+00:00", "time": "2022-11-03T14:55:06+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "1.23-dev" "dev-main": "1.27-dev"
}, },
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
@ -987,7 +1001,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-php72/tree/v1.25.0" "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0"
}, },
"funding": [ "funding": [
{ {

View File

@ -1,157 +1,157 @@
<?php return array( <?php return array(
'root' => array( 'root' => array(
'name' => 'yourls/yourls',
'pretty_version' => 'dev-master', 'pretty_version' => 'dev-master',
'version' => 'dev-master', 'version' => 'dev-master',
'reference' => '9f7806c525ef266bb74bdd501463799e45fe2be5',
'type' => 'project', 'type' => 'project',
'install_path' => __DIR__ . '/../../../', 'install_path' => __DIR__ . '/../../../',
'aliases' => array(), 'aliases' => array(),
'reference' => '59464102ee27cb5c808625c92448a48cebefda6f',
'name' => 'yourls/yourls',
'dev' => true, 'dev' => true,
), ),
'versions' => array( 'versions' => array(
'aura/sql' => array( 'aura/sql' => array(
'pretty_version' => '3.1.0', 'pretty_version' => '3.1.0',
'version' => '3.1.0.0', 'version' => '3.1.0.0',
'reference' => '88d8b8ed1bcfd588a649fdc7e7ac89ec047abbca',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../aura/sql', 'install_path' => __DIR__ . '/../aura/sql',
'aliases' => array(), 'aliases' => array(),
'reference' => '88d8b8ed1bcfd588a649fdc7e7ac89ec047abbca',
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'composer/ca-bundle' => array( 'composer/ca-bundle' => array(
'pretty_version' => '1.3.1', 'pretty_version' => '1.3.4',
'version' => '1.3.1.0', 'version' => '1.3.4.0',
'reference' => '69098eca243998b53eed7a48d82dedd28b447cd5',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/./ca-bundle', 'install_path' => __DIR__ . '/./ca-bundle',
'aliases' => array(), 'aliases' => array(),
'reference' => '4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b',
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'geoip2/geoip2' => array( 'geoip2/geoip2' => array(
'pretty_version' => 'v2.12.2', 'pretty_version' => 'v2.13.0',
'version' => '2.12.2.0', 'version' => '2.13.0.0',
'reference' => '6a41d8fbd6b90052bc34dff3b4252d0f88067b23',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../geoip2/geoip2', 'install_path' => __DIR__ . '/../geoip2/geoip2',
'aliases' => array(), 'aliases' => array(),
'reference' => '83adb44ac4b9553d36b579a14673ed124583082f',
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'jakeasmith/http_build_url' => array( 'jakeasmith/http_build_url' => array(
'pretty_version' => '1.0.1', 'pretty_version' => '1.0.1',
'version' => '1.0.1.0', 'version' => '1.0.1.0',
'reference' => '93c273e77cb1edead0cf8bcf8cd2003428e74e37',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../jakeasmith/http_build_url', 'install_path' => __DIR__ . '/../jakeasmith/http_build_url',
'aliases' => array(), 'aliases' => array(),
'reference' => '93c273e77cb1edead0cf8bcf8cd2003428e74e37',
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'maxmind-db/reader' => array( 'maxmind-db/reader' => array(
'pretty_version' => 'v1.11.0', 'pretty_version' => 'v1.11.0',
'version' => '1.11.0.0', 'version' => '1.11.0.0',
'reference' => 'b1f3c0699525336d09cc5161a2861268d9f2ae5b',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../maxmind-db/reader', 'install_path' => __DIR__ . '/../maxmind-db/reader',
'aliases' => array(), 'aliases' => array(),
'reference' => 'b1f3c0699525336d09cc5161a2861268d9f2ae5b',
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'maxmind/web-service-common' => array( 'maxmind/web-service-common' => array(
'pretty_version' => 'v0.9.0', 'pretty_version' => 'v0.9.0',
'version' => '0.9.0.0', 'version' => '0.9.0.0',
'reference' => '4dc5a3e8df38aea4ca3b1096cee3a038094e9b53',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../maxmind/web-service-common', 'install_path' => __DIR__ . '/../maxmind/web-service-common',
'aliases' => array(), 'aliases' => array(),
'reference' => '4dc5a3e8df38aea4ca3b1096cee3a038094e9b53',
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'ozh/bookmarkletgen' => array( 'ozh/bookmarkletgen' => array(
'pretty_version' => '1.2', 'pretty_version' => '1.2.2',
'version' => '1.2.0.0', 'version' => '1.2.2.0',
'reference' => '65fffa64bb11f70470d398d7baf6d9bb84411cfc',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../ozh/bookmarkletgen', 'install_path' => __DIR__ . '/../ozh/bookmarkletgen',
'aliases' => array(), 'aliases' => array(),
'reference' => '3319b53c493a1474a03d1cc4e087617652284c20',
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'pomo/pomo' => array( 'pomo/pomo' => array(
'pretty_version' => 'v1.4.1', 'pretty_version' => 'v1.5.0',
'version' => '1.4.1.0', 'version' => '1.5.0.0',
'reference' => 'b1e53a997850496369634d574fa6b508091fc353',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../pomo/pomo', 'install_path' => __DIR__ . '/../pomo/pomo',
'aliases' => array(), 'aliases' => array(),
'reference' => '1594bd1f90c89a45ffc3da2ee6d5d582bfac7542',
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'psr/log' => array( 'psr/log' => array(
'pretty_version' => '1.1.4', 'pretty_version' => '1.1.4',
'version' => '1.1.4.0', 'version' => '1.1.4.0',
'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../psr/log', 'install_path' => __DIR__ . '/../psr/log',
'aliases' => array(), 'aliases' => array(),
'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11',
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'rmccue/requests' => array( 'rmccue/requests' => array(
'pretty_version' => '2.0.2', 'pretty_version' => 'v2.0.5',
'version' => '2.0.2.0', 'version' => '2.0.5.0',
'reference' => 'b717f1d2f4ef7992ec0c127747ed8b7e170c2f49',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../rmccue/requests', 'install_path' => __DIR__ . '/../rmccue/requests',
'aliases' => array(), 'aliases' => array(),
'reference' => 'b01ce7c91657d604f298751686d7f5eec87b9493',
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'spatie/array-to-xml' => array( 'spatie/array-to-xml' => array(
'pretty_version' => '2.16.0', 'pretty_version' => '2.17.1',
'version' => '2.16.0.0', 'version' => '2.17.1.0',
'reference' => '5cbec9c6ab17e320c58a259f0cebe88bde4a7c46',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../spatie/array-to-xml', 'install_path' => __DIR__ . '/../spatie/array-to-xml',
'aliases' => array(), 'aliases' => array(),
'reference' => 'db39308c5236b69b89cadc3f44f191704814eae2',
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/polyfill-intl-idn' => array( 'symfony/polyfill-intl-idn' => array(
'pretty_version' => 'v1.25.0', 'pretty_version' => 'v1.27.0',
'version' => '1.25.0.0', 'version' => '1.27.0.0',
'reference' => '639084e360537a19f9ee352433b84ce831f3d2da',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-intl-idn', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-idn',
'aliases' => array(), 'aliases' => array(),
'reference' => '749045c69efb97c70d25d7463abba812e91f3a44',
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/polyfill-intl-normalizer' => array( 'symfony/polyfill-intl-normalizer' => array(
'pretty_version' => 'v1.25.0', 'pretty_version' => 'v1.27.0',
'version' => '1.25.0.0', 'version' => '1.27.0.0',
'reference' => '19bd1e4fcd5b91116f14d8533c57831ed00571b6',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer',
'aliases' => array(), 'aliases' => array(),
'reference' => '8590a5f561694770bdcd3f9b5c69dde6945028e8',
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/polyfill-mbstring' => array( 'symfony/polyfill-mbstring' => array(
'pretty_version' => 'v1.25.0', 'pretty_version' => 'v1.27.0',
'version' => '1.25.0.0', 'version' => '1.27.0.0',
'reference' => '8ad114f6b39e2c98a8b0e3bd907732c207c2b534',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',
'aliases' => array(), 'aliases' => array(),
'reference' => '0abb51d2f102e00a4eefcf46ba7fec406d245825',
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/polyfill-php72' => array( 'symfony/polyfill-php72' => array(
'pretty_version' => 'v1.25.0', 'pretty_version' => 'v1.27.0',
'version' => '1.25.0.0', 'version' => '1.27.0.0',
'reference' => '869329b1e9894268a8a61dabb69153029b7a8c97',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-php72', 'install_path' => __DIR__ . '/../symfony/polyfill-php72',
'aliases' => array(), 'aliases' => array(),
'reference' => '9a142215a36a3888e30d0a9eeea9766764e96976',
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'yourls/yourls' => array( 'yourls/yourls' => array(
'pretty_version' => 'dev-master', 'pretty_version' => 'dev-master',
'version' => 'dev-master', 'version' => 'dev-master',
'reference' => '9f7806c525ef266bb74bdd501463799e45fe2be5',
'type' => 'project', 'type' => 'project',
'install_path' => __DIR__ . '/../../../', 'install_path' => __DIR__ . '/../../../',
'aliases' => array(), 'aliases' => array(),
'reference' => '59464102ee27cb5c808625c92448a48cebefda6f',
'dev_requirement' => false, 'dev_requirement' => false,
), ),
), ),

View File

@ -258,6 +258,18 @@ print($record->network . "\n"); // '128.101.101.101/32'
``` ```
## Database Updates ##
You can keep your databases up to date with our
[GeoIP Update program](https://github.com/maxmind/geoipupdate/releases).
[Learn more about GeoIP Update on our developer
portal.](https://dev.maxmind.com/geoip/updating-databases?lang=en)
There is also a third-party tool for updating databases using PHP and
Composer. MaxMind does not offer support for this tool or maintain it.
[Learn more about the Geoip2 Update tool for PHP and Composer on its
GitHub page.](https://github.com/tronovav/geoip2-update)
## Web Service Client ## ## Web Service Client ##
### Usage ### ### Usage ###
@ -274,7 +286,8 @@ specifies the language preferences when using the `->name` method on the model
classes that this client creates. The fourth argument is additional options classes that this client creates. The fourth argument is additional options
such as `host` and `timeout`. such as `host` and `timeout`.
For instance, to call the GeoLite2 web service instead of GeoIP2 Precision: For instance, to call the GeoLite2 web service instead of the GeoIP2 web
service:
```php ```php
$client = new Client(42, 'abcdef123456', ['en'], ['host' => 'geolite.info']); $client = new Client(42, 'abcdef123456', ['en'], ['host' => 'geolite.info']);
@ -305,7 +318,8 @@ use GeoIp2\WebService\Client;
// This creates a Client object that can be reused across requests. // This creates a Client object that can be reused across requests.
// Replace "42" with your account ID and "license_key" with your license // Replace "42" with your account ID and "license_key" with your license
// key. Set the "host" to "geolite.info" in the fourth argument options // key. Set the "host" to "geolite.info" in the fourth argument options
// array to use the GeoLite2 web service instead of GeoIP2 Precision. // array to use the GeoLite2 web service instead of the GeoIP2 web
// service.
$client = new Client(42, 'abcdef123456'); $client = new Client(42, 'abcdef123456');
// Replace "city" with the method corresponding to the web service that // Replace "city" with the method corresponding to the web service that
@ -355,7 +369,7 @@ Because of these factors, it is possible for any end point to return a record
where some or all of the attributes are unpopulated. where some or all of the attributes are unpopulated.
See the See the
[GeoIP2 Precision web service docs](https://dev.maxmind.com/geoip/docs/web-services?lang=en) [GeoIP2 web service docs](https://dev.maxmind.com/geoip/docs/web-services?lang=en)
for details on what data each end point may return. for details on what data each end point may return.
The only piece of data which is always returned is the `ipAddress` The only piece of data which is always returned is the `ipAddress`

View File

@ -6,6 +6,14 @@ namespace GeoIp2\Database;
use GeoIp2\Exception\AddressNotFoundException; use GeoIp2\Exception\AddressNotFoundException;
use GeoIp2\Model\AbstractModel; use GeoIp2\Model\AbstractModel;
use GeoIp2\Model\AnonymousIp;
use GeoIp2\Model\Asn;
use GeoIp2\Model\City;
use GeoIp2\Model\ConnectionType;
use GeoIp2\Model\Country;
use GeoIp2\Model\Domain;
use GeoIp2\Model\Enterprise;
use GeoIp2\Model\Isp;
use GeoIp2\ProviderInterface; use GeoIp2\ProviderInterface;
use MaxMind\Db\Reader as DbReader; use MaxMind\Db\Reader as DbReader;
use MaxMind\Db\Reader\InvalidDatabaseException; use MaxMind\Db\Reader\InvalidDatabaseException;
@ -40,10 +48,12 @@ class Reader implements ProviderInterface
* @var DbReader * @var DbReader
*/ */
private $dbReader; private $dbReader;
/** /**
* @var string * @var string
*/ */
private $dbType; private $dbType;
/** /**
* @var array<string> * @var array<string>
*/ */
@ -78,10 +88,10 @@ class Reader implements ProviderInterface
* @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
* is corrupt or invalid * is corrupt or invalid
*/ */
public function city(string $ipAddress): \GeoIp2\Model\City public function city(string $ipAddress): City
{ {
// @phpstan-ignore-next-line // @phpstan-ignore-next-line
return $this->modelFor('City', 'City', $ipAddress); return $this->modelFor(City::class, 'City', $ipAddress);
} }
/** /**
@ -94,10 +104,10 @@ class Reader implements ProviderInterface
* @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
* is corrupt or invalid * is corrupt or invalid
*/ */
public function country(string $ipAddress): \GeoIp2\Model\Country public function country(string $ipAddress): Country
{ {
// @phpstan-ignore-next-line // @phpstan-ignore-next-line
return $this->modelFor('Country', 'Country', $ipAddress); return $this->modelFor(Country::class, 'Country', $ipAddress);
} }
/** /**
@ -110,11 +120,11 @@ class Reader implements ProviderInterface
* @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
* is corrupt or invalid * is corrupt or invalid
*/ */
public function anonymousIp(string $ipAddress): \GeoIp2\Model\AnonymousIp public function anonymousIp(string $ipAddress): AnonymousIp
{ {
// @phpstan-ignore-next-line // @phpstan-ignore-next-line
return $this->flatModelFor( return $this->flatModelFor(
'AnonymousIp', AnonymousIp::class,
'GeoIP2-Anonymous-IP', 'GeoIP2-Anonymous-IP',
$ipAddress $ipAddress
); );
@ -130,11 +140,11 @@ class Reader implements ProviderInterface
* @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
* is corrupt or invalid * is corrupt or invalid
*/ */
public function asn(string $ipAddress): \GeoIp2\Model\Asn public function asn(string $ipAddress): Asn
{ {
// @phpstan-ignore-next-line // @phpstan-ignore-next-line
return $this->flatModelFor( return $this->flatModelFor(
'Asn', Asn::class,
'GeoLite2-ASN', 'GeoLite2-ASN',
$ipAddress $ipAddress
); );
@ -150,11 +160,11 @@ class Reader implements ProviderInterface
* @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
* is corrupt or invalid * is corrupt or invalid
*/ */
public function connectionType(string $ipAddress): \GeoIp2\Model\ConnectionType public function connectionType(string $ipAddress): ConnectionType
{ {
// @phpstan-ignore-next-line // @phpstan-ignore-next-line
return $this->flatModelFor( return $this->flatModelFor(
'ConnectionType', ConnectionType::class,
'GeoIP2-Connection-Type', 'GeoIP2-Connection-Type',
$ipAddress $ipAddress
); );
@ -170,11 +180,11 @@ class Reader implements ProviderInterface
* @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
* is corrupt or invalid * is corrupt or invalid
*/ */
public function domain(string $ipAddress): \GeoIp2\Model\Domain public function domain(string $ipAddress): Domain
{ {
// @phpstan-ignore-next-line // @phpstan-ignore-next-line
return $this->flatModelFor( return $this->flatModelFor(
'Domain', Domain::class,
'GeoIP2-Domain', 'GeoIP2-Domain',
$ipAddress $ipAddress
); );
@ -190,10 +200,10 @@ class Reader implements ProviderInterface
* @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
* is corrupt or invalid * is corrupt or invalid
*/ */
public function enterprise(string $ipAddress): \GeoIp2\Model\Enterprise public function enterprise(string $ipAddress): Enterprise
{ {
// @phpstan-ignore-next-line // @phpstan-ignore-next-line
return $this->modelFor('Enterprise', 'Enterprise', $ipAddress); return $this->modelFor(Enterprise::class, 'Enterprise', $ipAddress);
} }
/** /**
@ -206,11 +216,11 @@ class Reader implements ProviderInterface
* @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
* is corrupt or invalid * is corrupt or invalid
*/ */
public function isp(string $ipAddress): \GeoIp2\Model\Isp public function isp(string $ipAddress): Isp
{ {
// @phpstan-ignore-next-line // @phpstan-ignore-next-line
return $this->flatModelFor( return $this->flatModelFor(
'Isp', Isp::class,
'GeoIP2-ISP', 'GeoIP2-ISP',
$ipAddress $ipAddress
); );
@ -223,8 +233,6 @@ class Reader implements ProviderInterface
$record['traits']['ip_address'] = $ipAddress; $record['traits']['ip_address'] = $ipAddress;
$record['traits']['prefix_len'] = $prefixLen; $record['traits']['prefix_len'] = $prefixLen;
$class = 'GeoIp2\\Model\\' . $class;
return new $class($record, $this->locales); return new $class($record, $this->locales);
} }
@ -234,7 +242,6 @@ class Reader implements ProviderInterface
$record['ip_address'] = $ipAddress; $record['ip_address'] = $ipAddress;
$record['prefix_len'] = $prefixLen; $record['prefix_len'] = $prefixLen;
$class = 'GeoIp2\\Model\\' . $class;
return new $class($record); return new $class($record);
} }
@ -242,7 +249,7 @@ class Reader implements ProviderInterface
private function getRecord(string $class, string $type, string $ipAddress): array private function getRecord(string $class, string $type, string $ipAddress): array
{ {
if (strpos($this->dbType, $type) === false) { if (strpos($this->dbType, $type) === false) {
$method = lcfirst($class); $method = lcfirst((new \ReflectionClass($class))->getShortName());
throw new \BadMethodCallException( throw new \BadMethodCallException(
"The $method method cannot be used to open a {$this->dbType} database" "The $method method cannot be used to open a {$this->dbType} database"

View File

@ -35,30 +35,37 @@ class AnonymousIp extends AbstractModel
* @var bool * @var bool
*/ */
protected $isAnonymous; protected $isAnonymous;
/** /**
* @var bool * @var bool
*/ */
protected $isAnonymousVpn; protected $isAnonymousVpn;
/** /**
* @var bool * @var bool
*/ */
protected $isHostingProvider; protected $isHostingProvider;
/** /**
* @var bool * @var bool
*/ */
protected $isPublicProxy; protected $isPublicProxy;
/** /**
* @var bool * @var bool
*/ */
protected $isResidentialProxy; protected $isResidentialProxy;
/** /**
* @var bool * @var bool
*/ */
protected $isTorExitNode; protected $isTorExitNode;
/** /**
* @var string * @var string
*/ */
protected $ipAddress; protected $ipAddress;
/** /**
* @var string * @var string
*/ */

View File

@ -26,14 +26,17 @@ class Asn extends AbstractModel
* @var int|null * @var int|null
*/ */
protected $autonomousSystemNumber; protected $autonomousSystemNumber;
/** /**
* @var string|null * @var string|null
*/ */
protected $autonomousSystemOrganization; protected $autonomousSystemOrganization;
/** /**
* @var string * @var string
*/ */
protected $ipAddress; protected $ipAddress;
/** /**
* @var string * @var string
*/ */

View File

@ -5,11 +5,11 @@ declare(strict_types=1);
namespace GeoIp2\Model; namespace GeoIp2\Model;
/** /**
* Model class for the data returned by GeoIP2 City web service and database. * Model class for the data returned by City Plus web service and City
* database.
* *
* The only difference between the City and Insights model classes is which * See https://dev.maxmind.com/geoip/docs/web-services?lang=en for more
* fields in each record may be populated. See * details.
* https://dev.maxmind.com/geoip/docs/web-services?lang=en for more details.
* *
* @property-read \GeoIp2\Record\City $city City data for the requested IP * @property-read \GeoIp2\Record\City $city City data for the requested IP
* address. * address.
@ -37,18 +37,21 @@ class City extends Country
* @var \GeoIp2\Record\City * @var \GeoIp2\Record\City
*/ */
protected $city; protected $city;
/** /**
* @ignore * @ignore
* *
* @var \GeoIp2\Record\Location * @var \GeoIp2\Record\Location
*/ */
protected $location; protected $location;
/** /**
* @ignore * @ignore
* *
* @var \GeoIp2\Record\Postal * @var \GeoIp2\Record\Postal
*/ */
protected $postal; protected $postal;
/** /**
* @ignore * @ignore
* *

View File

@ -24,10 +24,12 @@ class ConnectionType extends AbstractModel
* @var string|null * @var string|null
*/ */
protected $connectionType; protected $connectionType;
/** /**
* @var string * @var string
*/ */
protected $ipAddress; protected $ipAddress;
/** /**
* @var string * @var string
*/ */

View File

@ -7,9 +7,7 @@ namespace GeoIp2\Model;
/** /**
* Model class for the data returned by GeoIP2 Country web service and database. * Model class for the data returned by GeoIP2 Country web service and database.
* *
* The only difference between the City and Insights model classes is which * See https://dev.maxmind.com/geoip/docs/web-services?lang=en for more details.
* fields in each record may be populated. See
* https://dev.maxmind.com/geoip/docs/web-services?lang=en for more details.
* *
* @property-read \GeoIp2\Record\Continent $continent Continent data for the * @property-read \GeoIp2\Record\Continent $continent Continent data for the
* requested IP address. * requested IP address.
@ -36,26 +34,32 @@ class Country extends AbstractModel
* @var \GeoIp2\Record\Continent * @var \GeoIp2\Record\Continent
*/ */
protected $continent; protected $continent;
/** /**
* @var \GeoIp2\Record\Country * @var \GeoIp2\Record\Country
*/ */
protected $country; protected $country;
/** /**
* @var array<string> * @var array<string>
*/ */
protected $locales; protected $locales;
/** /**
* @var \GeoIp2\Record\MaxMind * @var \GeoIp2\Record\MaxMind
*/ */
protected $maxmind; protected $maxmind;
/** /**
* @var \GeoIp2\Record\Country * @var \GeoIp2\Record\Country
*/ */
protected $registeredCountry; protected $registeredCountry;
/** /**
* @var \GeoIp2\Record\RepresentedCountry * @var \GeoIp2\Record\RepresentedCountry
*/ */
protected $representedCountry; protected $representedCountry;
/** /**
* @var \GeoIp2\Record\Traits * @var \GeoIp2\Record\Traits
*/ */

View File

@ -24,10 +24,12 @@ class Domain extends AbstractModel
* @var string|null * @var string|null
*/ */
protected $domain; protected $domain;
/** /**
* @var string * @var string
*/ */
protected $ipAddress; protected $ipAddress;
/** /**
* @var string * @var string
*/ */

View File

@ -7,9 +7,8 @@ namespace GeoIp2\Model;
/** /**
* Model class for the data returned by GeoIP2 Enterprise database lookups. * Model class for the data returned by GeoIP2 Enterprise database lookups.
* *
* The only difference between the City and Enterprise model classes is which * See https://dev.maxmind.com/geoip/docs/web-services?lang=en for more
* fields in each record may be populated. See * details.
* https://dev.maxmind.com/geoip/docs/web-services?lang=en for more details.
*/ */
class Enterprise extends City class Enterprise extends City
{ {

View File

@ -5,11 +5,10 @@ declare(strict_types=1);
namespace GeoIp2\Model; namespace GeoIp2\Model;
/** /**
* Model class for the data returned by GeoIP2 Precision: Insights web service. * Model class for the data returned by GeoIP2 Insights web service.
* *
* The only difference between the City and Insights model classes is which * See https://dev.maxmind.com/geoip/docs/web-services?lang=en for
* fields in each record may be populated. See * more details.
* https://dev.maxmind.com/geoip/docs/web-services?lang=en for more details.
*/ */
class Insights extends City class Insights extends City
{ {

View File

@ -36,30 +36,37 @@ class Isp extends AbstractModel
* @var int|null * @var int|null
*/ */
protected $autonomousSystemNumber; protected $autonomousSystemNumber;
/** /**
* @var string|null * @var string|null
*/ */
protected $autonomousSystemOrganization; protected $autonomousSystemOrganization;
/** /**
* @var string|null * @var string|null
*/ */
protected $isp; protected $isp;
/** /**
* @var string|null * @var string|null
*/ */
protected $mobileCountryCode; protected $mobileCountryCode;
/** /**
* @var string|null * @var string|null
*/ */
protected $mobileNetworkCode; protected $mobileNetworkCode;
/** /**
* @var string|null * @var string|null
*/ */
protected $organization; protected $organization;
/** /**
* @var string * @var string
*/ */
protected $ipAddress; protected $ipAddress;
/** /**
* @var string * @var string
*/ */

View File

@ -57,7 +57,6 @@ abstract class AbstractPlaceRecord extends AbstractRecord
private function firstSetNameLocale(): ?string private function firstSetNameLocale(): ?string
{ {
foreach ($this->locales as $locale) { foreach ($this->locales as $locale) {
// @phpstan-ignore-next-line
if (isset($this->names[$locale])) { if (isset($this->names[$locale])) {
return $locale; return $locale;
} }

View File

@ -18,7 +18,7 @@ namespace GeoIp2\Record;
* @property-read string|null $name The name of the city based on the locales list * @property-read string|null $name The name of the city based on the locales list
* passed to the constructor. This attribute is returned by all location * passed to the constructor. This attribute is returned by all location
* services and databases. * services and databases.
* @property-read array|null $names A array map where the keys are locale codes * @property-read array|null $names An array map where the keys are locale codes
* and the values are names. This attribute is returned by all location * and the values are names. This attribute is returned by all location
* services and databases. * services and databases.
*/ */

View File

@ -14,13 +14,13 @@ use GeoIp2\Util;
* @property-read int|null $autonomousSystemNumber The autonomous system number * @property-read int|null $autonomousSystemNumber The autonomous system number
* associated with the IP address. See * associated with the IP address. See
* https://en.wikipedia.org/wiki/Autonomous_system_(Internet%29. This attribute * https://en.wikipedia.org/wiki/Autonomous_system_(Internet%29. This attribute
* is only available from the City and Insights web service and the GeoIP2 * is only available from the City Plus and Insights web services and the
* Enterprise database. * GeoIP2 Enterprise database.
* @property-read string|null $autonomousSystemOrganization The organization * @property-read string|null $autonomousSystemOrganization The organization
* associated with the registered autonomous system number for the IP address. * associated with the registered autonomous system number for the IP address.
* See https://en.wikipedia.org/wiki/Autonomous_system_(Internet%29. This * See https://en.wikipedia.org/wiki/Autonomous_system_(Internet%29. This
* attribute is only available from the City and Insights web service and the * attribute is only available from the City Plus and Insights web services and
* GeoIP2 Enterprise database. * the GeoIP2 Enterprise database.
* @property-read string|null $connectionType The connection type may take the * @property-read string|null $connectionType The connection type may take the
* following values: "Dialup", "Cable/DSL", "Corporate", "Cellular". * following values: "Dialup", "Cable/DSL", "Corporate", "Cellular".
* Additional values may be added in the future. This attribute is only * Additional values may be added in the future. This attribute is only
@ -28,7 +28,7 @@ use GeoIp2\Util;
* @property-read string|null $domain The second level domain associated with the * @property-read string|null $domain The second level domain associated with the
* IP address. This will be something like "example.com" or "example.co.uk", * IP address. This will be something like "example.com" or "example.co.uk",
* not "foo.example.com". This attribute is only available from the * not "foo.example.com". This attribute is only available from the
* City and Insights web service and the GeoIP2 Enterprise * City Plus and Insights web services and the GeoIP2 Enterprise
* database. * database.
* @property-read string $ipAddress The IP address that the data in the model * @property-read string $ipAddress The IP address that the data in the model
* is for. If you performed a "me" lookup against the web service, this * is for. If you performed a "me" lookup against the web service, this
@ -38,7 +38,7 @@ use GeoIp2\Util;
* points. * points.
* @property-read bool $isAnonymous This is true if the IP address belongs to * @property-read bool $isAnonymous This is true if the IP address belongs to
* any sort of anonymous network. This property is only available from GeoIP2 * any sort of anonymous network. This property is only available from GeoIP2
* Precision Insights. * Insights.
* @property-read bool $isAnonymousProxy *Deprecated.* Please see our GeoIP2 * @property-read bool $isAnonymousProxy *Deprecated.* Please see our GeoIP2
* Anonymous IP database * Anonymous IP database
* (https://www.maxmind.com/en/geoip2-anonymous-ip-database) to determine * (https://www.maxmind.com/en/geoip2-anonymous-ip-database) to determine
@ -47,50 +47,49 @@ use GeoIp2\Util;
* registered to an anonymous VPN provider. If a VPN provider does not register * registered to an anonymous VPN provider. If a VPN provider does not register
* subnets under names associated with them, we will likely only flag their IP * subnets under names associated with them, we will likely only flag their IP
* ranges using the isHostingProvider property. This property is only available * ranges using the isHostingProvider property. This property is only available
* from GeoIP2 Precision Insights. * from GeoIP2 Insights.
* @property-read bool $isHostingProvider This is true if the IP address belongs * @property-read bool $isHostingProvider This is true if the IP address belongs
* to a hosting or VPN provider (see description of isAnonymousVpn property). * to a hosting or VPN provider (see description of isAnonymousVpn property).
* This property is only available from GeoIP2 Precision Insights. * This property is only available from GeoIP2 Insights.
* @property-read bool $isLegitimateProxy This attribute is true if MaxMind * @property-read bool $isLegitimateProxy This attribute is true if MaxMind
* believes this IP address to be a legitimate proxy, such as an internal * believes this IP address to be a legitimate proxy, such as an internal
* VPN used by a corporation. This attribute is only available in the GeoIP2 * VPN used by a corporation. This attribute is only available in the GeoIP2
* Enterprise database. * Enterprise database.
* @property-read bool $isPublicProxy This is true if the IP address belongs to * @property-read bool $isPublicProxy This is true if the IP address belongs to
* a public proxy. This property is only available from GeoIP2 Precision * a public proxy. This property is only available from GeoIP2 Insights.
* Insights.
* @property-read bool $isResidentialProxy This is true if the IP address is * @property-read bool $isResidentialProxy This is true if the IP address is
* on a suspected anonymizing network and belongs to a residential ISP. This * on a suspected anonymizing network and belongs to a residential ISP. This
* property is only available from GeoIP2 Precision Insights. * property is only available from GeoIP2 Insights.
* @property-read bool $isSatelliteProvider *Deprecated.* Due to the * @property-read bool $isSatelliteProvider *Deprecated.* Due to the
* increased coverage by mobile carriers, very few satellite providers now * increased coverage by mobile carriers, very few satellite providers now
* serve multiple countries. As a result, the output does not provide * serve multiple countries. As a result, the output does not provide
* sufficiently relevant data for us to maintain it. * sufficiently relevant data for us to maintain it.
* @property-read bool $isTorExitNode This is true if the IP address is a Tor * @property-read bool $isTorExitNode This is true if the IP address is a Tor
* exit node. This property is only available from GeoIP2 Precision Insights. * exit node. This property is only available from GeoIP2 Insights.
* @property-read string|null $isp The name of the ISP associated with the IP * @property-read string|null $isp The name of the ISP associated with the IP
* address. This attribute is only available from the City and Insights web * address. This attribute is only available from the City Plus and Insights
* services and the GeoIP2 Enterprise database. * web services and the GeoIP2 Enterprise database.
* @property-read string $network The network in CIDR notation associated with * @property-read string $network The network in CIDR notation associated with
* the record. In particular, this is the largest network where all of the * the record. In particular, this is the largest network where all of the
* fields besides $ipAddress have the same value. * fields besides $ipAddress have the same value.
* @property-read string|null $organization The name of the organization associated * @property-read string|null $organization The name of the organization
* with the IP address. This attribute is only available from the City and * associated with the IP address. This attribute is only available from the
* Insights web services and the GeoIP2 Enterprise database. * City Plus and Insights web services and the GeoIP2 Enterprise database.
* @property-read string|null $mobileCountryCode The [mobile country code * @property-read string|null $mobileCountryCode The [mobile country code
* (MCC)](https://en.wikipedia.org/wiki/Mobile_country_code) associated with * (MCC)](https://en.wikipedia.org/wiki/Mobile_country_code) associated with
* the IP address and ISP. This property is available from the City and * the IP address and ISP. This property is available from the City Plus and
* Insights web services and the GeoIP2 Enterprise database. * Insights web services and the GeoIP2 Enterprise database.
* @property-read string|null $mobileNetworkCode The [mobile network code * @property-read string|null $mobileNetworkCode The [mobile network code
* (MNC)](https://en.wikipedia.org/wiki/Mobile_country_code) associated with * (MNC)](https://en.wikipedia.org/wiki/Mobile_country_code) associated with
* the IP address and ISP. This property is available from the City and * the IP address and ISP. This property is available from the City Plus and
* Insights web services and the GeoIP2 Enterprise database. * Insights web services and the GeoIP2 Enterprise database.
* @property-read float|null $staticIpScore An indicator of how static or * @property-read float|null $staticIpScore An indicator of how static or
* dynamic an IP address is. This property is only available from GeoIP2 * dynamic an IP address is. This property is only available from GeoIP2
* Precision Insights. * Insights.
* @property-read int|null $userCount The estimated number of users sharing * @property-read int|null $userCount The estimated number of users sharing
* the IP/network during the past 24 hours. For IPv4, the count is for the * the IP/network during the past 24 hours. For IPv4, the count is for the
* individual IP. For IPv6, the count is for the /64 network. This property is * individual IP. For IPv6, the count is for the /64 network. This property is
* only available from GeoIP2 Precision Insights. * only available from GeoIP2 Insights.
* @property-read string|null $userType <p>The user type associated with the IP * @property-read string|null $userType <p>The user type associated with the IP
* address. This can be one of the following values:</p> * address. This can be one of the following values:</p>
* <ul> * <ul>
@ -98,6 +97,7 @@ use GeoIp2\Util;
* <li>cafe * <li>cafe
* <li>cellular * <li>cellular
* <li>college * <li>college
* <li>consumer_privacy_network
* <li>content_delivery_network * <li>content_delivery_network
* <li>dialup * <li>dialup
* <li>government * <li>government

View File

@ -17,9 +17,9 @@ use GeoIp2\ProviderInterface;
use MaxMind\WebService\Client as WsClient; use MaxMind\WebService\Client as WsClient;
/** /**
* This class provides a client API for all the GeoIP2 Precision web services. * This class provides a client API for all the GeoIP2 web services.
* The services are Country, City, and Insights. Each service returns a * The services are Country, City Plus, and Insights. Each service returns
* different set of data about an IP address, with Country returning the * a different set of data about an IP address, with Country returning the
* least data and Insights the most. * least data and Insights the most.
* *
* Each web service is represented by a different model class, and these model * Each web service is represented by a different model class, and these model
@ -52,16 +52,18 @@ class Client implements ProviderInterface
* @var array<string> * @var array<string>
*/ */
private $locales; private $locales;
/** /**
* @var WsClient * @var WsClient
*/ */
private $client; private $client;
/** /**
* @var string * @var string
*/ */
private static $basePath = '/geoip/v2.1'; private static $basePath = '/geoip/v2.1';
public const VERSION = 'v2.12.2'; public const VERSION = 'v2.13.0';
/** /**
* Constructor. * Constructor.
@ -71,9 +73,10 @@ class Client implements ProviderInterface
* @param array $locales list of locale codes to use in name property * @param array $locales list of locale codes to use in name property
* from most preferred to least preferred * from most preferred to least preferred
* @param array $options array of options. Valid options include: * @param array $options array of options. Valid options include:
* * `host` - The host to use when querying the web service. To * * `host` - The host to use when querying the web
* query the GeoLite2 web service instead of GeoIP2 Precision, * service. To query the GeoLite2 web service
* set the host to `geolite.info`. * instead of the GeoIP2 web service, set the
* host to `geolite.info`.
* * `timeout` - Timeout in seconds. * * `timeout` - Timeout in seconds.
* * `connectTimeout` - Initial connection timeout in seconds. * * `connectTimeout` - Initial connection timeout in seconds.
* * `proxy` - The HTTP proxy to use. May include a schema, port, * * `proxy` - The HTTP proxy to use. May include a schema, port,
@ -110,7 +113,7 @@ class Client implements ProviderInterface
} }
/** /**
* This method calls the City service. * This method calls the City Plus service.
* *
* @param string $ipAddress IPv4 or IPv6 address as a string. If no * @param string $ipAddress IPv4 or IPv6 address as a string. If no
* address is provided, the address that the web service is called * address is provided, the address that the web service is called
@ -136,7 +139,7 @@ class Client implements ProviderInterface
public function city(string $ipAddress = 'me'): City public function city(string $ipAddress = 'me'): City
{ {
// @phpstan-ignore-next-line // @phpstan-ignore-next-line
return $this->responseFor('city', 'City', $ipAddress); return $this->responseFor('city', City::class, $ipAddress);
} }
/** /**
@ -165,12 +168,12 @@ class Client implements ProviderInterface
*/ */
public function country(string $ipAddress = 'me'): Country public function country(string $ipAddress = 'me'): Country
{ {
return $this->responseFor('country', 'Country', $ipAddress); return $this->responseFor('country', Country::class, $ipAddress);
} }
/** /**
* This method calls the Insights service. Insights is only supported by GeoIP2 * This method calls the Insights service. Insights is only supported by
* Precision. The GeoLite2 web service does not support it. * the GeoIP2 web service. The GeoLite2 web service does not support it.
* *
* @param string $ipAddress IPv4 or IPv6 address as a string. If no * @param string $ipAddress IPv4 or IPv6 address as a string. If no
* address is provided, the address that the web service is called * address is provided, the address that the web service is called
@ -196,7 +199,7 @@ class Client implements ProviderInterface
public function insights(string $ipAddress = 'me'): Insights public function insights(string $ipAddress = 'me'): Insights
{ {
// @phpstan-ignore-next-line // @phpstan-ignore-next-line
return $this->responseFor('insights', 'Insights', $ipAddress); return $this->responseFor('insights', Insights::class, $ipAddress);
} }
private function responseFor(string $endpoint, string $class, string $ipAddress): Country private function responseFor(string $endpoint, string $class, string $ipAddress): Country
@ -204,7 +207,8 @@ class Client implements ProviderInterface
$path = implode('/', [self::$basePath, $endpoint, $ipAddress]); $path = implode('/', [self::$basePath, $endpoint, $ipAddress]);
try { try {
$body = $this->client->get('GeoIP2 ' . $class, $path); $service = (new \ReflectionClass($class))->getShortName();
$body = $this->client->get('GeoIP2 ' . $service, $path);
} catch (\MaxMind\Exception\IpAddressNotFoundException $ex) { } catch (\MaxMind\Exception\IpAddressNotFoundException $ex) {
throw new AddressNotFoundException( throw new AddressNotFoundException(
$ex->getMessage(), $ex->getMessage(),
@ -246,8 +250,6 @@ class Client implements ProviderInterface
); );
} }
$class = 'GeoIp2\\Model\\' . $class;
return new $class($body, $this->locales); return new $class($body, $this->locales);
} }
} }

View File

@ -1,14 +1,15 @@
POMO # POMO
====
> Gettext library to translate with i18n
[![Latest Release](https://img.shields.io/packagist/v/pomo/pomo.svg)](https://packagist.org/packages/pomo/pomo) [![Latest Release](https://img.shields.io/packagist/v/pomo/pomo.svg)](https://packagist.org/packages/pomo/pomo)
[![Build Status](https://travis-ci.org/LeoColomb/pomo.svg?branch=master)](https://travis-ci.org/LeoColomb/pomo)
[![Code Climate](https://img.shields.io/codeclimate/github/LeoColomb/pomo.svg)](https://codeclimate.com/github/LeoColomb/pomo)
**Gettext library to translate with I18n**. ## About
[Why use it](http://codex.wordpress.org/I18n_for_WordPress_Developers).
[Why use it](https://codex.wordpress.org/I18n_for_WordPress_Developers).
## Usage
Usage
-----
```php ```php
<?php <?php
use POMO\MO; use POMO\MO;
@ -23,30 +24,28 @@ $translations->import_from_file($the_mo_filepath);
$translations->translate($text); $translations->translate($text);
``` ```
Installation ## Installation
------------
The easiest way to install POMO is via [composer](http://getcomposer.org/).
Create the following `composer.json` file and run the `php composer.phar install` command to install it.
```json The easiest way to install POMO is via [composer](http://getcomposer.org/).
{
"require": { ```console
"pomo/pomo": "*" composer require pomo/pomo
}
}
``` ```
```php ```php
<?php <?php
require 'vendor/autoload.php'; require 'vendor/autoload.php';
use POMO\MO; use POMO\MO;
...
[...]
``` ```
Requirements ## Requirements
------------
POMO works with PHP 5.3 or above. POMO works with PHP 5.3 or above.
License ## License
-------
POMO is licensed under the [GPLv2 License](LICENSE). POMO is licensed under the [GPLv2 License](LICENSE).

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* This file is part of the POMO package. * This file is part of the POMO package.
* *
@ -18,6 +19,11 @@ use POMO\Translations\GettextTranslations;
*/ */
class MO extends GettextTranslations class MO extends GettextTranslations
{ {
/**
* Number of plural forms.
*
* @var int
*/
public $_nplurals = 2; public $_nplurals = 2;
/** /**
@ -38,16 +44,16 @@ class MO extends GettextTranslations
} }
/** /**
* Fills up with the entries from MO file $filename. * Fills up with the entries from MO file $filename
* *
* @param string $filename MO file to load * @param string $filename MO file to load
* * @return bool True if the import from file was successful, otherwise false.
* @return bool Success
*/ */
public function import_from_file($filename) public function import_from_file($filename)
{ {
$reader = new FileReader($filename); $reader = new FileReader($filename);
if (!$reader->is_resource()) {
if (! $reader->is_resource()) {
return false; return false;
} }
@ -58,18 +64,16 @@ class MO extends GettextTranslations
/** /**
* @param string $filename * @param string $filename
*
* @return bool * @return bool
*/ */
public function export_to_file($filename) public function export_to_file($filename)
{ {
$fh = fopen($filename, 'wb'); $fh = fopen($filename, 'wb');
if (!$fh) { if (! $fh) {
return false; return false;
} }
$res = $this->export_to_file_handle($fh); $res = $this->export_to_file_handle($fh);
fclose($fh); fclose($fh);
return $res; return $res;
} }
@ -79,12 +83,11 @@ class MO extends GettextTranslations
public function export() public function export()
{ {
$tmp_fh = fopen('php://temp', 'r+'); $tmp_fh = fopen('php://temp', 'r+');
if (!$tmp_fh) { if (! $tmp_fh) {
return false; return false;
} }
$this->export_to_file_handle($tmp_fh); $this->export_to_file_handle($tmp_fh);
rewind($tmp_fh); rewind($tmp_fh);
return stream_get_contents($tmp_fh); return stream_get_contents($tmp_fh);
} }
@ -99,7 +102,7 @@ class MO extends GettextTranslations
return false; return false;
} }
if (!array_filter($entry->translations)) { if (! array_filter($entry->translations)) {
return false; return false;
} }
@ -108,69 +111,63 @@ class MO extends GettextTranslations
/** /**
* @param resource $fh * @param resource $fh
*
* @return true * @return true
*/ */
public function export_to_file_handle($fh) public function export_to_file_handle($fh)
{ {
$entries = array_filter( $entries = array_filter($this->entries, array($this, 'is_entry_good_for_export'));
$this->entries,
array($this, 'is_entry_good_for_export')
);
ksort($entries); ksort($entries);
$magic = 0x950412de; $magic = 0x950412de;
$revision = 0; $revision = 0;
$total = count($entries) + 1; // all the headers are one entry $total = count($entries) + 1; // All the headers are one entry.
$originals_lenghts_addr = 28; $originals_lengths_addr = 28;
$translations_lenghts_addr = $originals_lenghts_addr + 8 * $total; $translations_lengths_addr = $originals_lengths_addr + 8 * $total;
$size_of_hash = 0; $size_of_hash = 0;
$hash_addr = $translations_lenghts_addr + 8 * $total; $hash_addr = $translations_lengths_addr + 8 * $total;
$current_addr = $hash_addr; $current_addr = $hash_addr;
fwrite($fh, pack( fwrite(
'V*', $fh,
$magic, pack(
$revision, 'V*',
$total, $magic,
$originals_lenghts_addr, $revision,
$translations_lenghts_addr, $total,
$size_of_hash, $originals_lengths_addr,
$hash_addr $translations_lengths_addr,
)); $size_of_hash,
fseek($fh, $originals_lenghts_addr); $hash_addr
)
);
fseek($fh, $originals_lengths_addr);
// headers' msgid is an empty string // Headers' msgid is an empty string.
fwrite($fh, pack('VV', 0, $current_addr)); fwrite($fh, pack('VV', 0, $current_addr));
$current_addr++; $current_addr++;
$originals_table = chr(0); $originals_table = "\0";
$reader = new NOOPReader(); $reader = new NOOPReader();
foreach ($entries as $entry) { foreach ($entries as $entry) {
$originals_table .= $this->export_original($entry).chr(0); $originals_table .= $this->export_original($entry) . "\0";
$length = $reader->strlen($this->export_original($entry)); $length = $reader->strlen($this->export_original($entry));
fwrite($fh, pack('VV', $length, $current_addr)); fwrite($fh, pack('VV', $length, $current_addr));
$current_addr += $length + 1; // account for the NULL byte after $current_addr += $length + 1; // Account for the NULL byte after.
} }
$exported_headers = $this->export_headers(); $exported_headers = $this->export_headers();
fwrite($fh, pack( fwrite($fh, pack('VV', $reader->strlen($exported_headers), $current_addr));
'VV', $current_addr += strlen($exported_headers) + 1;
$reader->strlen($exported_headers), $translations_table = $exported_headers . "\0";
$current_addr
));
$current_addr += strlen($exported_headers) + 1;
$translations_table = $exported_headers.chr(0);
foreach ($entries as $entry) { foreach ($entries as $entry) {
$translations_table .= $this->export_translations($entry).chr(0); $translations_table .= $this->export_translations($entry) . "\0";
$length = $reader->strlen($this->export_translations($entry)); $length = $reader->strlen($this->export_translations($entry));
fwrite($fh, pack('VV', $length, $current_addr)); fwrite($fh, pack('VV', $length, $current_addr));
$current_addr += $length + 1; $current_addr += $length + 1;
} }
fwrite($fh, $originals_table); fwrite($fh, $originals_table);
fwrite($fh, $translations_table); fwrite($fh, $translations_table);
return true; return true;
} }
@ -181,15 +178,14 @@ class MO extends GettextTranslations
*/ */
public function export_original(EntryTranslations $entry) public function export_original(EntryTranslations $entry)
{ {
//TODO: warnings for control characters // TODO: Warnings for control characters.
$exported = $entry->singular; $exported = $entry->singular;
if ($entry->is_plural) { if ($entry->is_plural) {
$exported .= chr(0).$entry->plural; $exported .= "\0" . $entry->plural;
} }
if (!is_null($entry->context)) { if ($entry->context) {
$exported = $entry->context.chr(4).$exported; $exported = $entry->context . "\4" . $exported;
} }
return $exported; return $exported;
} }
@ -200,8 +196,8 @@ class MO extends GettextTranslations
*/ */
public function export_translations(EntryTranslations $entry) public function export_translations(EntryTranslations $entry)
{ {
//TODO: warnings for control characters // TODO: Warnings for control characters.
return $entry->is_plural ? implode(chr(0), $entry->translations) : $entry->translations[0]; return $entry->is_plural ? implode("\0", $entry->translations) : $entry->translations[0];
} }
/** /**
@ -213,22 +209,22 @@ class MO extends GettextTranslations
foreach ($this->headers as $header => $value) { foreach ($this->headers as $header => $value) {
$exported .= "$header: $value\n"; $exported .= "$header: $value\n";
} }
return $exported; return $exported;
} }
/** /**
* @param int $magic * @param int $magic
*
* @return string|false * @return string|false
*/ */
public function get_byteorder($magic) public function get_byteorder($magic)
{ {
// The magic is 0x950412de // The magic is 0x950412de.
$magic_little = (int) -1794895138;
// bug in PHP 5.0.2, see https://savannah.nongnu.org/bugs/?func=detailitem&item_id=10565
$magic_little = (int) - 1794895138;
$magic_little_64 = (int) 2500072158; $magic_little_64 = (int) 2500072158;
// 0xde120495 // 0xde120495
$magic_big = ((int) -569244523) & 0xFFFFFFFF; $magic_big = ((int) - 569244523) & 0xFFFFFFFF;
if ($magic_little == $magic || $magic_little_64 == $magic) { if ($magic_little == $magic || $magic_little_64 == $magic) {
return 'little'; return 'little';
} elseif ($magic_big == $magic) { } elseif ($magic_big == $magic) {
@ -240,8 +236,7 @@ class MO extends GettextTranslations
/** /**
* @param FileReader $reader * @param FileReader $reader
* * @return bool True if the import was successful, otherwise false.
* @return bool
*/ */
public function import_from_reader(FileReader $reader) public function import_from_reader(FileReader $reader)
{ {
@ -251,29 +246,29 @@ class MO extends GettextTranslations
} }
$reader->setEndian($endian_string); $reader->setEndian($endian_string);
$endian = ('big' == $endian_string) ? 'N' : 'V'; $endian = ('big' === $endian_string) ? 'N' : 'V';
$header = $reader->read(24); $header = $reader->read(24);
if ($reader->strlen($header) != 24) { if ($reader->strlen($header) != 24) {
return false; return false;
} }
// parse header // Parse header.
$header = unpack("{$endian}revision/{$endian}total/{$endian}originals_lenghts_addr/{$endian}translations_lenghts_addr/{$endian}hash_length/{$endian}hash_addr", $header); $header = unpack("{$endian}revision/{$endian}total/{$endian}originals_lengths_addr/{$endian}translations_lengths_addr/{$endian}hash_length/{$endian}hash_addr", $header);
if (!is_array($header)) { if (! is_array($header)) {
return false; return false;
} }
// support revision 0 of MO format specs, only // Support revision 0 of MO format specs, only.
if ($header['revision'] != 0) { if (0 != $header['revision']) {
return false; return false;
} }
// seek to data blocks // Seek to data blocks.
$reader->seekto($header['originals_lenghts_addr']); $reader->seekto($header['originals_lengths_addr']);
// read originals' indices // Read originals' indices.
$originals_lengths_length = $header['translations_lenghts_addr'] - $header['originals_lenghts_addr']; $originals_lengths_length = $header['translations_lengths_addr'] - $header['originals_lengths_addr'];
if ($originals_lengths_length != $header['total'] * 8) { if ($originals_lengths_length != $header['total'] * 8) {
return false; return false;
} }
@ -283,22 +278,22 @@ class MO extends GettextTranslations
return false; return false;
} }
// read translations' indices // Read translations' indices.
$translations_lenghts_length = $header['hash_addr'] - $header['translations_lenghts_addr']; $translations_lengths_length = $header['hash_addr'] - $header['translations_lengths_addr'];
if ($translations_lenghts_length != $header['total'] * 8) { if ($translations_lengths_length != $header['total'] * 8) {
return false; return false;
} }
$translations = $reader->read($translations_lenghts_length); $translations = $reader->read($translations_lengths_length);
if ($reader->strlen($translations) != $translations_lenghts_length) { if ($reader->strlen($translations) != $translations_lengths_length) {
return false; return false;
} }
// transform raw data into set of indices // Transform raw data into set of indices.
$originals = $reader->str_split($originals, 8); $originals = $reader->str_split($originals, 8);
$translations = $reader->str_split($translations, 8); $translations = $reader->str_split($translations, 8);
// skip hash table // Skip hash table.
$strings_addr = $header['hash_addr'] + $header['hash_length'] * 4; $strings_addr = $header['hash_addr'] + $header['hash_length'] * 4;
$reader->seekto($strings_addr); $reader->seekto($strings_addr);
@ -307,67 +302,63 @@ class MO extends GettextTranslations
$reader->close(); $reader->close();
for ($i = 0; $i < $header['total']; $i++) { for ($i = 0; $i < $header['total']; $i++) {
$o = unpack("{$endian}length/{$endian}pos", $originals[$i]); $o = unpack("{$endian}length/{$endian}pos", $originals[ $i ]);
$t = unpack("{$endian}length/{$endian}pos", $translations[$i]); $t = unpack("{$endian}length/{$endian}pos", $translations[ $i ]);
if (!$o || !$t) { if (! $o || ! $t) {
return false; return false;
} }
// adjust offset due to reading strings to separate space before // Adjust offset due to reading strings to separate space before.
$o['pos'] -= $strings_addr; $o['pos'] -= $strings_addr;
$t['pos'] -= $strings_addr; $t['pos'] -= $strings_addr;
$original = $reader->substr($strings, $o['pos'], $o['length']); $original = $reader->substr($strings, $o['pos'], $o['length']);
$translation = $reader->substr($strings, $t['pos'], $t['length']); $translation = $reader->substr($strings, $t['pos'], $t['length']);
if ('' === $original) { if ('' === $original) {
$this->set_headers($this->make_headers($translation)); $this->set_headers($this->make_headers($translation));
} else { } else {
$entry = &static::make_entry($original, $translation); $entry = &static::make_entry($original, $translation);
$this->entries[$entry->key()] = &$entry; $this->entries[ $entry->key() ] = &$entry;
} }
} }
return true; return true;
} }
/** /**
* Build a from original string and translation strings, * Build a EntryTranslations from original string and translation strings,
* found in a MO file. * found in a MO file
* *
* @param string $original original string to translate from MO file. * @static
* Might contain 0x04 as context separator or * @param string $original original string to translate from MO file. Might contain
* 0x00 as singular/plural separator * 0x04 as context separator or 0x00 as singular/plural separator
* @param string $translation translation string from MO file.Might contain * @param string $translation translation string from MO file. Might contain
* 0x00 as a plural translations separator * 0x00 as a plural translations separator
* * @return EntryTranslations Entry instance.
* @return EntryTranslations New entry
*/ */
public static function &make_entry($original, $translation) public static function &make_entry($original, $translation)
{ {
$entry = new EntryTranslations(); $entry = new EntryTranslations();
// look for context // Look for context, separated by \4.
$parts = explode(chr(4), $original); $parts = explode("\4", $original);
if (isset($parts[1])) { if (isset($parts[1])) {
$original = $parts[1]; $original = $parts[1];
$entry->context = $parts[0]; $entry->context = $parts[0];
} }
// look for plural original // Look for plural original.
$parts = explode(chr(0), $original); $parts = explode("\0", $original);
$entry->singular = $parts[0]; $entry->singular = $parts[0];
if (isset($parts[1])) { if (isset($parts[1])) {
$entry->is_plural = true; $entry->is_plural = true;
$entry->plural = $parts[1]; $entry->plural = $parts[1];
} }
// plural translations are also separated by \0 // Plural translations are also separated by \0.
$entry->translations = explode(chr(0), $translation); $entry->translations = explode("\0", $translation);
return $entry; return $entry;
} }
/** /**
* @param int $count * @param int $count
*
* @return string * @return string
*/ */
public function select_plural_form($count) public function select_plural_form($count)

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* This file is part of the POMO package. * This file is part of the POMO package.
* *
@ -23,10 +24,9 @@ class PO extends GettextTranslations
public $comments_before_headers = ''; public $comments_before_headers = '';
/** /**
* Exports headers to a PO entry. * Exports headers to a PO entry
* *
* @return string msgid/msgstr PO entry for this PO file headers, doesn't * @return string msgid/msgstr PO entry for this PO file headers, doesn't contain newline at the end
* contain newline at the end
*/ */
public function export_headers() public function export_headers()
{ {
@ -36,40 +36,29 @@ class PO extends GettextTranslations
} }
$poified = self::poify($header_string); $poified = self::poify($header_string);
if ($this->comments_before_headers) { if ($this->comments_before_headers) {
$before_headers = self::prepend_each_line( $before_headers = self::prepend_each_line(rtrim($this->comments_before_headers) . "\n", '# ');
rtrim($this->comments_before_headers)."\n",
'# '
);
} else { } else {
$before_headers = ''; $before_headers = '';
} }
return rtrim("{$before_headers}msgid \"\"\nmsgstr $poified"); return rtrim("{$before_headers}msgid \"\"\nmsgstr $poified");
} }
/** /**
* Exports all entries to PO format. * Exports all entries to PO format
* *
* @return string sequence of mgsgid/msgstr PO strings, doesn't containt * @return string sequence of mgsgid/msgstr PO strings, doesn't containt newline at the end
* newline at the end
*/ */
public function export_entries() public function export_entries()
{ {
//TODO: sorting // TODO: Sorting.
return implode("\n\n", array_map( return implode("\n\n", array_map(array(__NAMESPACE__ . '\PO', 'export_entry'), $this->entries));
array(__NAMESPACE__.'\PO', 'export_entry'),
$this->entries
));
} }
/** /**
* Exports the whole PO file as a string. * Exports the whole PO file as a string
* *
* @param bool $include_headers whether to include the headers in the * @param bool $include_headers whether to include the headers in the export
* export * @return string ready for inclusion in PO file string for headers and all the enrtries
*
* @return string ready for inclusion in PO file string for headers and all
* the enrtries
*/ */
public function export($include_headers = true) public function export($include_headers = true)
{ {
@ -79,17 +68,14 @@ class PO extends GettextTranslations
$res .= "\n\n"; $res .= "\n\n";
} }
$res .= $this->export_entries(); $res .= $this->export_entries();
return $res; return $res;
} }
/** /**
* Same as {@link export}, but writes the result to a file. * Same as {@link export}, but writes the result to a file
*
* @param string $filename where to write the PO string
* @param bool $include_headers whether to include tje headers in the
* export
* *
* @param string $filename Where to write the PO string.
* @param bool $include_headers Whether to include the headers in the export.
* @return bool true on success, false on error * @return bool true on success, false on error
*/ */
public function export_to_file($filename, $include_headers = true) public function export_to_file($filename, $include_headers = true)
@ -99,7 +85,7 @@ class PO extends GettextTranslations
return false; return false;
} }
$export = $this->export($include_headers); $export = $this->export($include_headers);
$res = fwrite($fh, $export); $res = fwrite($fh, $export);
if (false === $res) { if (false === $res) {
return false; return false;
} }
@ -108,12 +94,11 @@ class PO extends GettextTranslations
} }
/** /**
* Text to include as a comment before the start of the PO contents. * Text to include as a comment before the start of the PO contents
* *
* Doesn't need to include # in the beginning of lines, these are added * Doesn't need to include # in the beginning of lines, these are added automatically
* automatically
* *
* @param string $text Comment text * @param string $text Text to include as a comment.
*/ */
public function set_comment_before_headers($text) public function set_comment_before_headers($text)
{ {
@ -121,120 +106,114 @@ class PO extends GettextTranslations
} }
/** /**
* Formats a string in PO-style. * Formats a string in PO-style
*
* @param string $string the string to format
* *
* @param string $input_string the string to format
* @return string the poified string * @return string the poified string
*/ */
public static function poify($string) public static function poify($input_string)
{ {
$quote = '"'; $quote = '"';
$slash = '\\'; $slash = '\\';
$newline = "\n"; $newline = "\n";
$replaces = array( $replaces = array(
"$slash" => "$slash$slash", "$slash" => "$slash$slash",
"$quote" => "$slash$quote", "$quote" => "$slash$quote",
"\t" => '\t', "\t" => '\t',
); );
$string = str_replace( $input_string = str_replace(array_keys($replaces), array_values($replaces), $input_string);
array_keys($replaces),
array_values($replaces),
$string
);
$po = $quote.implode( $po = $quote . implode("{$slash}n{$quote}{$newline}{$quote}", explode($newline, $input_string)) . $quote;
"${slash}n$quote$newline$quote", // Add empty string on first line for readbility.
explode($newline, $string) if (
).$quote; false !== strpos($input_string, $newline) &&
// add empty string on first line for readbility (substr_count($input_string, $newline) > 1 || substr($input_string, -strlen($newline)) !== $newline)
if (false !== strpos($string, $newline) && ) {
(substr_count($string, $newline) > 1 ||
!($newline === substr($string, -strlen($newline))))) {
$po = "$quote$quote$newline$po"; $po = "$quote$quote$newline$po";
} }
// remove empty strings // Remove empty strings.
$po = str_replace("$newline$quote$quote", '', $po); $po = str_replace("$newline$quote$quote", '', $po);
return $po; return $po;
} }
/** /**
* Gives back the original string from a PO-formatted string. * Gives back the original string from a PO-formatted string
*
* @param string $string PO-formatted string
* *
* @param string $input_string PO-formatted string
* @return string enascaped string * @return string enascaped string
*/ */
public static function unpoify($string) public static function unpoify($input_string)
{ {
$escapes = array('t' => "\t", 'n' => "\n", 'r' => "\r", '\\' => '\\'); $escapes = array(
$lines = array_map('trim', explode("\n", $string)); 't' => "\t",
$lines = array_map(array(__NAMESPACE__.'\PO', 'trim_quotes'), $lines); 'n' => "\n",
$unpoified = ''; 'r' => "\r",
'\\' => '\\',
);
$lines = array_map('trim', explode("\n", $input_string));
$lines = array_map(array(__NAMESPACE__ . '\PO', 'trim_quotes'), $lines);
$unpoified = '';
$previous_is_backslash = false; $previous_is_backslash = false;
foreach ($lines as $line) { foreach ($lines as $line) {
preg_match_all('/./u', $line, $chars); preg_match_all('/./u', $line, $chars);
$chars = $chars[0]; $chars = $chars[0];
foreach ($chars as $char) { foreach ($chars as $char) {
if (!$previous_is_backslash) { if (! $previous_is_backslash) {
if ('\\' == $char) { if ('\\' === $char) {
$previous_is_backslash = true; $previous_is_backslash = true;
} else { } else {
$unpoified .= $char; $unpoified .= $char;
} }
} else { } else {
$previous_is_backslash = false; $previous_is_backslash = false;
$unpoified .= isset($escapes[$char]) ? $escapes[$char] : $char; $unpoified .= isset($escapes[ $char ]) ? $escapes[ $char ] : $char;
} }
} }
} }
// Standardise the line endings on imported content, technically PO files shouldn't contain \r // Standardize the line endings on imported content, technically PO files shouldn't contain \r.
$unpoified = str_replace(array("\r\n", "\r"), "\n", $unpoified); $unpoified = str_replace(array("\r\n", "\r"), "\n", $unpoified);
return $unpoified; return $unpoified;
} }
/** /**
* Inserts $with in the beginning of every new line of $string and * Inserts $with in the beginning of every new line of $input_string and
* returns the modified string. * returns the modified string
* *
* @param string $string prepend lines in this string * @param string $input_string prepend lines in this string
* @param string $with prepend lines with this string * @param string $with prepend lines with this string
*
* @return string The modified string
*/ */
public static function prepend_each_line($string, $with) public static function prepend_each_line($input_string, $with)
{ {
$lines = explode("\n", $string); $lines = explode("\n", $input_string);
$append = ''; $append = '';
if ("\n" === substr($string, -1) && '' === end($lines)) { if ("\n" === substr($input_string, -1) && '' === end($lines)) {
// Last line might be empty because $string was terminated /*
// with a newline, remove it from the $lines array, * Last line might be empty because $input_string was terminated
// we'll restore state by re-terminating the string at the end * with a newline, remove it from the $lines array,
* we'll restore state by re-terminating the string at the end.
*/
array_pop($lines); array_pop($lines);
$append = "\n"; $append = "\n";
} }
foreach ($lines as &$line) { foreach ($lines as &$line) {
$line = $with.$line; $line = $with . $line;
} }
unset($line); unset($line);
return implode("\n", $lines).$append; return implode("\n", $lines) . $append;
} }
/** /**
* Prepare a text as a comment -- wraps the lines and prepends # * Prepare a text as a comment -- wraps the lines and prepends #
* and a special character to each line. * and a special character to each line
* *
* @param string $text the comment text * @param string $text the comment text
* @param string $char character to denote a special PO comment, * @param string $char character to denote a special PO comment,
* like :, default is a space * like :, default is a space
*
* @return string The modified string
*/ */
private static function comment_block($text, $char = ' ') private static function comment_block($text, $char = ' ')
{ {
@ -244,14 +223,11 @@ class PO extends GettextTranslations
} }
/** /**
* Builds a string from the entry for inclusion in PO file. * Builds a string from the entry for inclusion in PO file
* *
* @static * @param EntryTranslations $entry the entry to convert to po string.
* * @return string|false PO-style formatted string for the entry or
* @param EntryTranslations &$entry the entry to convert to po string * false if the entry is empty
*
* @return false|string PO-style formatted string for the entry or
* false if the entry is empty
*/ */
public static function export_entry(EntryTranslations &$entry) public static function export_entry(EntryTranslations &$entry)
{ {
@ -259,67 +235,58 @@ class PO extends GettextTranslations
return false; return false;
} }
$po = array(); $po = array();
if (!empty($entry->translator_comments)) { if (! empty($entry->translator_comments)) {
$po[] = self::comment_block($entry->translator_comments); $po[] = self::comment_block($entry->translator_comments);
} }
if (!empty($entry->extracted_comments)) { if (! empty($entry->extracted_comments)) {
$po[] = self::comment_block($entry->extracted_comments, '.'); $po[] = self::comment_block($entry->extracted_comments, '.');
} }
if (!empty($entry->references)) { if (! empty($entry->references)) {
$po[] = self::comment_block(implode(' ', $entry->references), ':'); $po[] = self::comment_block(implode(' ', $entry->references), ':');
} }
if (!empty($entry->flags)) { if (! empty($entry->flags)) {
$po[] = self::comment_block(implode(', ', $entry->flags), ','); $po[] = self::comment_block(implode(', ', $entry->flags), ',');
} }
if (!is_null($entry->context)) { if ($entry->context) {
$po[] = 'msgctxt '.self::poify($entry->context); $po[] = 'msgctxt ' . self::poify($entry->context);
} }
$po[] = 'msgid '.self::poify($entry->singular); $po[] = 'msgid ' . self::poify($entry->singular);
if (!$entry->is_plural) { if (! $entry->is_plural) {
$translation = empty($entry->translations) ? $translation = empty($entry->translations) ? '' : $entry->translations[0];
'' :
$entry->translations[0];
$translation = self::match_begin_and_end_newlines($translation, $entry->singular); $translation = self::match_begin_and_end_newlines($translation, $entry->singular);
$po[] = 'msgstr '.self::poify($translation); $po[] = 'msgstr ' . self::poify($translation);
} else { } else {
$po[] = 'msgid_plural '.self::poify($entry->plural); $po[] = 'msgid_plural ' . self::poify($entry->plural);
$translations = empty($entry->translations) ? $translations = empty($entry->translations) ? array( '', '' ) : $entry->translations;
array('', '') :
$entry->translations;
foreach ($translations as $i => $translation) { foreach ($translations as $i => $translation) {
$translation = self::match_begin_and_end_newlines($translation, $entry->plural); $translation = self::match_begin_and_end_newlines($translation, $entry->plural);
$po[] = "msgstr[$i] ".self::poify($translation); $po[] = "msgstr[$i] " . self::poify($translation);
} }
} }
return implode("\n", $po); return implode("\n", $po);
} }
/**
* @param $translation
* @param $original
*
* @return string
*/
public static function match_begin_and_end_newlines($translation, $original) public static function match_begin_and_end_newlines($translation, $original)
{ {
if ('' === $translation) { if ('' === $translation) {
return $translation; return $translation;
} }
$original_begin = "\n" === substr($original, 0, 1); $original_begin = "\n" === substr($original, 0, 1);
$original_end = "\n" === substr($original, -1); $original_end = "\n" === substr($original, -1);
$translation_begin = "\n" === substr($translation, 0, 1); $translation_begin = "\n" === substr($translation, 0, 1);
$translation_end = "\n" === substr($translation, -1); $translation_end = "\n" === substr($translation, -1);
if ($original_begin) { if ($original_begin) {
if (!$translation_begin) { if (! $translation_begin) {
$translation = "\n".$translation; $translation = "\n" . $translation;
} }
} elseif ($translation_begin) { } elseif ($translation_begin) {
$translation = ltrim($translation, "\n"); $translation = ltrim($translation, "\n");
} }
if ($original_end) { if ($original_end) {
if (!$translation_end) { if (! $translation_end) {
$translation .= "\n"; $translation .= "\n";
} }
} elseif ($translation_end) { } elseif ($translation_end) {
@ -337,20 +304,17 @@ class PO extends GettextTranslations
public function import_from_file($filename) public function import_from_file($filename)
{ {
$f = fopen($filename, 'r'); $f = fopen($filename, 'r');
if (!$f) { if (! $f) {
return false; return false;
} }
$lineno = 0; $lineno = 0;
$res = false;
while (true) { while (true) {
$res = $this->read_entry($f, $lineno); $res = $this->read_entry($f, $lineno);
if (!$res) { if (! $res) {
break; break;
} }
if ($res['entry']->singular == '') { if ('' === $res['entry']->singular) {
$this->set_headers( $this->set_headers($this->make_headers($res['entry']->translations[0]));
$this->make_headers($res['entry']->translations[0])
);
} else { } else {
$this->add_entry($res['entry']); $this->add_entry($res['entry']);
} }
@ -359,47 +323,44 @@ class PO extends GettextTranslations
if (false === $res) { if (false === $res) {
return false; return false;
} }
if (!$this->headers && !$this->entries) { if (! $this->headers && ! $this->entries) {
return false; return false;
} }
return true; return true;
} }
/** /**
* Helper function for read_entry. * Helper function for read_entry
* *
* @param string $context * @param string $context
*
* @return bool * @return bool
*/ */
protected static function is_final($context) protected static function is_final($context)
{ {
return ($context === 'msgstr') || ($context === 'msgstr_plural'); return ('msgstr' === $context) || ('msgstr_plural' === $context);
} }
/** /**
* @param resource $f * @param resource $f
* @param int $lineno * @param int $lineno
*
* @return null|false|array * @return null|false|array
*/ */
public function read_entry($f, $lineno = 0) public function read_entry($f, $lineno = 0)
{ {
$entry = new EntryTranslations(); $entry = new EntryTranslations();
// where were we in the last step // Where were we in the last step.
// can be: comment, msgctxt, msgid, msgid_plural, msgstr, msgstr_plural // Can be: comment, msgctxt, msgid, msgid_plural, msgstr, msgstr_plural.
$context = ''; $context = '';
$msgstr_index = 0; $msgstr_index = 0;
while (true) { while (true) {
$lineno++; $lineno++;
$line = self::read_line($f); $line = self::read_line($f);
if (!$line) { if (! $line) {
if (feof($f)) { if (feof($f)) {
if (self::is_final($context)) { if (self::is_final($context)) {
break; break;
} elseif (!$context) { // we haven't read a line and eof came } elseif (! $context) { // We haven't read a line and EOF came.
return; return null;
} else { } else {
return false; return false;
} }
@ -407,23 +368,22 @@ class PO extends GettextTranslations
return false; return false;
} }
} }
if ($line == "\n") { if ("\n" === $line) {
continue; continue;
} }
$line = trim($line); $line = trim($line);
if (preg_match('/^#/', $line, $m)) { if (preg_match('/^#/', $line, $m)) {
// the comment is the start of a new entry // The comment is the start of a new entry.
if (self::is_final($context)) { if (self::is_final($context)) {
self::read_line($f, 'put-back'); self::read_line($f, 'put-back');
$lineno--; $lineno--;
break; break;
} }
// comments have to be at the beginning // Comments have to be at the beginning.
if ($context && $context != 'comment') { if ($context && 'comment' !== $context) {
return false; return false;
} }
// add comment // Add comment.
$this->add_comment_to_entry($entry, $line); $this->add_comment_to_entry($entry, $line);
} elseif (preg_match('/^msgctxt\s+(".*")/', $line, $m)) { } elseif (preg_match('/^msgctxt\s+(".*")/', $line, $m)) {
if (self::is_final($context)) { if (self::is_final($context)) {
@ -431,10 +391,10 @@ class PO extends GettextTranslations
$lineno--; $lineno--;
break; break;
} }
if ($context && $context != 'comment') { if ($context && 'comment' !== $context) {
return false; return false;
} }
$context = 'msgctxt'; $context = 'msgctxt';
$entry->context .= self::unpoify($m[1]); $entry->context .= self::unpoify($m[1]);
} elseif (preg_match('/^msgid\s+(".*")/', $line, $m)) { } elseif (preg_match('/^msgid\s+(".*")/', $line, $m)) {
if (self::is_final($context)) { if (self::is_final($context)) {
@ -442,32 +402,30 @@ class PO extends GettextTranslations
$lineno--; $lineno--;
break; break;
} }
if ($context && if ($context && 'msgctxt' !== $context && 'comment' !== $context) {
$context != 'msgctxt' &&
$context != 'comment') {
return false; return false;
} }
$context = 'msgid'; $context = 'msgid';
$entry->singular .= self::unpoify($m[1]); $entry->singular .= self::unpoify($m[1]);
} elseif (preg_match('/^msgid_plural\s+(".*")/', $line, $m)) { } elseif (preg_match('/^msgid_plural\s+(".*")/', $line, $m)) {
if ($context != 'msgid') { if ('msgid' !== $context) {
return false; return false;
} }
$context = 'msgid_plural'; $context = 'msgid_plural';
$entry->is_plural = true; $entry->is_plural = true;
$entry->plural .= self::unpoify($m[1]); $entry->plural .= self::unpoify($m[1]);
} elseif (preg_match('/^msgstr\s+(".*")/', $line, $m)) { } elseif (preg_match('/^msgstr\s+(".*")/', $line, $m)) {
if ($context != 'msgid') { if ('msgid' !== $context) {
return false; return false;
} }
$context = 'msgstr'; $context = 'msgstr';
$entry->translations = array(self::unpoify($m[1])); $entry->translations = array(self::unpoify($m[1]));
} elseif (preg_match('/^msgstr\[(\d+)\]\s+(".*")/', $line, $m)) { } elseif (preg_match('/^msgstr\[(\d+)\]\s+(".*")/', $line, $m)) {
if ($context != 'msgid_plural' && $context != 'msgstr_plural') { if ('msgid_plural' !== $context && 'msgstr_plural' !== $context) {
return false; return false;
} }
$context = 'msgstr_plural'; $context = 'msgstr_plural';
$msgstr_index = $m[1]; $msgstr_index = $m[1];
$entry->translations[$m[1]] = self::unpoify($m[2]); $entry->translations[$m[1]] = self::unpoify($m[2]);
} elseif (preg_match('/^".*"$/', $line)) { } elseif (preg_match('/^".*"$/', $line)) {
$unpoified = self::unpoify($line); $unpoified = self::unpoify($line);
@ -506,36 +464,33 @@ class PO extends GettextTranslations
$entry->translations = array(); $entry->translations = array();
} }
return array('entry' => $entry, 'lineno' => $lineno); return array(
'entry' => $entry,
'lineno' => $lineno,
);
} }
/** /**
* @param resource $f * @param resource $f
* @param string $action * @param string $action
*
* @return bool * @return bool
*/ */
public static function read_line($f, $action = 'read') public static function read_line($f, $action = 'read')
{ {
static $last_line = ''; static $last_line = '';
static $use_last_line = false; static $use_last_line = false;
if ('clear' == $action) { if ('clear' === $action) {
$last_line = ''; $last_line = '';
return true; return true;
} }
if ('put-back' == $action) { if ('put-back' === $action) {
$use_last_line = true; $use_last_line = true;
return true; return true;
} }
$line = $use_last_line ? $last_line : fgets($f); $line = $use_last_line ? $last_line : fgets($f);
$line = ("\r\n" == substr($line, -2)) ? $line = ("\r\n" === substr($line, -2)) ? rtrim($line, "\r\n") . "\n" : $line;
rtrim($line, "\r\n")."\n" : $last_line = $line;
$line;
$last_line = $line;
$use_last_line = false; $use_last_line = false;
return $line; return $line;
} }
@ -546,42 +501,30 @@ class PO extends GettextTranslations
public function add_comment_to_entry(EntryTranslations &$entry, $po_comment_line) public function add_comment_to_entry(EntryTranslations &$entry, $po_comment_line)
{ {
$first_two = substr($po_comment_line, 0, 2); $first_two = substr($po_comment_line, 0, 2);
$comment = trim(substr($po_comment_line, 2)); $comment = trim(substr($po_comment_line, 2));
if ('#:' == $first_two) { if ('#:' === $first_two) {
$entry->references = array_merge( $entry->references = array_merge($entry->references, preg_split('/\s+/', $comment));
$entry->references, } elseif ('#.' === $first_two) {
preg_split('/\s+/', $comment) $entry->extracted_comments = trim($entry->extracted_comments . "\n" . $comment);
); } elseif ('#,' === $first_two) {
} elseif ('#.' == $first_two) { $entry->flags = array_merge($entry->flags, preg_split('/,\s*/', $comment));
$entry->extracted_comments = trim(
$entry->extracted_comments."\n".$comment
);
} elseif ('#,' == $first_two) {
$entry->flags = array_merge(
$entry->flags,
preg_split('/,\s*/', $comment)
);
} else { } else {
$entry->translator_comments = trim( $entry->translator_comments = trim($entry->translator_comments . "\n" . $comment);
$entry->translator_comments."\n".$comment
);
} }
} }
/** /**
* @param string $s * @param string $s
*
* @return string * @return string
*/ */
public static function trim_quotes($s) public static function trim_quotes($s)
{ {
if (substr($s, 0, 1) == '"') { if ('"' === substr($s, 0, 1)) {
$s = substr($s, 1); $s = substr($s, 1);
} }
if (substr($s, -1, 1) == '"') { if ('"' === substr($s, -1, 1)) {
$s = substr($s, 0, -1); $s = substr($s, 0, -1);
} }
return $s; return $s;
} }
} }

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* This file is part of the POMO package. * This file is part of the POMO package.
*/ */
@ -89,9 +90,9 @@ class PluralForms
* Uses the shunting-yard algorithm to convert the string to Reverse Polish * Uses the shunting-yard algorithm to convert the string to Reverse Polish
* Notation tokens. * Notation tokens.
* *
* @param string $str String to parse. * @throws Exception If there is a syntax or parsing error with the string.
* *
* @throws Exception * @param string $str String to parse.
*/ */
protected function parse($str) protected function parse($str)
{ {
@ -230,6 +231,7 @@ class PluralForms
/** /**
* Get the plural form for a number. * Get the plural form for a number.
*
* Caches the value for repeated calls. * Caches the value for repeated calls.
* *
* @param int $num Number to get plural form for. * @param int $num Number to get plural form for.
@ -248,10 +250,9 @@ class PluralForms
/** /**
* Execute the plural form function. * Execute the plural form function.
* *
* @throws Exception If the plural form value cannot be calculated.
*
* @param int $n Variable "n" to substitute. * @param int $n Variable "n" to substitute.
*
* @throws Exception
*
* @return int PluralForms form value. * @return int PluralForms form value.
*/ */
public function execute($n) public function execute($n)

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* This file is part of the POMO package. * This file is part of the POMO package.
*/ */
@ -7,8 +8,6 @@ namespace POMO\Streams;
/** /**
* Reads the contents of the file in the beginning. * Reads the contents of the file in the beginning.
*
* @author Danilo Segan <danilo@kvota.net>
*/ */
class CachedFileReader extends StringReader implements StreamInterface class CachedFileReader extends StringReader implements StreamInterface
{ {

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* This file is part of the POMO package. * This file is part of the POMO package.
*/ */

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* This file is part of the POMO package. * This file is part of the POMO package.
*/ */
@ -14,6 +15,13 @@ namespace POMO\Streams;
*/ */
class FileReader extends Reader implements StreamInterface class FileReader extends Reader implements StreamInterface
{ {
/**
* File pointer resource.
*
* @var resource|false
*/
public $_f;
/** /**
* @param string $filename * @param string $filename
*/ */
@ -23,21 +31,31 @@ class FileReader extends Reader implements StreamInterface
$this->_f = fopen($filename, 'rb'); $this->_f = fopen($filename, 'rb');
} }
/**
* @param int $bytes
* @return string|false Returns read string, otherwise false.
*/
public function read($bytes) public function read($bytes)
{ {
return fread($this->_f, $bytes); return fread($this->_f, $bytes);
} }
/**
* @param int $pos
* @return bool
*/
public function seekto($pos) public function seekto($pos)
{ {
if (-1 == fseek($this->_f, $pos, SEEK_SET)) { if (-1 == fseek($this->_f, $pos, SEEK_SET)) {
return false; return false;
} }
$this->_pos = $pos; $this->_pos = $pos;
return true; return true;
} }
/**
* @return bool
*/
public function is_resource() public function is_resource()
{ {
return is_resource($this->_f); return is_resource($this->_f);
@ -51,18 +69,19 @@ class FileReader extends Reader implements StreamInterface
return feof($this->_f); return feof($this->_f);
} }
/**
* @return bool
*/
public function close() public function close()
{ {
return fclose($this->_f); return fclose($this->_f);
} }
/**
* @return string
*/
public function read_all() public function read_all()
{ {
$all = ''; return stream_get_contents($this->_f);
while (!$this->feof()) {
$all .= $this->read(4096);
}
return $all;
} }
} }

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* This file is part of the POMO package. * This file is part of the POMO package.
*/ */

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* This file is part of the POMO package. * This file is part of the POMO package.
*/ */
@ -12,89 +13,137 @@ namespace POMO\Streams;
* @property int $_pos * @property int $_pos
* @author Danilo Segan <danilo@kvota.net> * @author Danilo Segan <danilo@kvota.net>
*/ */
#[AllowDynamicProperties]
abstract class Reader implements StreamInterface abstract class Reader implements StreamInterface
{ {
public $endian = 'little'; public $endian = 'little';
public $_post = ''; public $_pos;
public $is_overloaded;
public function __construct() public function __construct()
{ {
$this->is_overloaded = ((ini_get('mbstring.func_overload') & 2) != 0) && if (
function_exists('mb_substr'); function_exists('mb_substr')
&& ((int) ini_get('mbstring.func_overload') & 2) // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated
) {
$this->is_overloaded = true;
} else {
$this->is_overloaded = false;
}
$this->_pos = 0; $this->_pos = 0;
} }
public function setEndian($endian) /**
* Sets the endianness of the file.
*
* @param string $endian Set the endianness of the file. Accepts 'big', or 'little'.
*/
public function setEndian($endian) // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid
{ {
$this->endian = $endian; $this->endian = $endian;
} }
/**
* Reads a 32bit Integer from the Stream
*
* @return mixed The integer, corresponding to the next 32 bits from
* the stream of false if there are not enough bytes or on error
*/
public function readint32() public function readint32()
{ {
$bytes = $this->read(4); $bytes = $this->read(4);
if (4 != $this->strlen($bytes)) { if (4 != $this->strlen($bytes)) {
return false; return false;
} }
$endian_letter = ('big' == $this->endian) ? 'N' : 'V'; $endian_letter = ('big' === $this->endian) ? 'N' : 'V';
$int = unpack($endian_letter, $bytes); $int = unpack($endian_letter, $bytes);
return reset($int); return reset($int);
} }
/**
* Reads an array of 32-bit Integers from the Stream
*
* @param int $count How many elements should be read
* @return mixed Array of integers or false if there isn't
* enough data or on error
*/
public function readint32array($count) public function readint32array($count)
{ {
$bytes = $this->read(4 * $count); $bytes = $this->read(4 * $count);
if (4 * $count != $this->strlen($bytes)) { if (4 * $count != $this->strlen($bytes)) {
return false; return false;
} }
$endian_letter = ('big' == $this->endian) ? 'N' : 'V'; $endian_letter = ('big' === $this->endian) ? 'N' : 'V';
return unpack($endian_letter . $count, $bytes);
return unpack($endian_letter.$count, $bytes);
} }
public function substr($string, $start, $length) /**
* @param string $input_string
* @param int $start
* @param int $length
* @return string
*/
public function substr($input_string, $start, $length)
{ {
if ($this->is_overloaded) { if ($this->is_overloaded) {
return mb_substr($string, $start, $length, 'ascii'); return mb_substr($input_string, $start, $length, 'ascii');
} else { } else {
return substr($string, $start, $length); return substr($input_string, $start, $length);
} }
} }
public function strlen($string) /**
* @param string $input_string
* @return int
*/
public function strlen($input_string)
{ {
if ($this->is_overloaded) { if ($this->is_overloaded) {
return mb_strlen($string, 'ascii'); return mb_strlen($input_string, 'ascii');
} else { } else {
return strlen($string); return strlen($input_string);
} }
} }
public function str_split($string, $chunk_size) /**
* @param string $input_string
* @param int $chunk_size
* @return array
*/
public function str_split($input_string, $chunk_size)
{ {
if (!function_exists('str_split')) { if (! function_exists('str_split')) {
$length = $this->strlen($string); $length = $this->strlen($input_string);
$out = array(); $out = array();
for ($i = 0; $i < $length; $i += $chunk_size) { for ($i = 0; $i < $length; $i += $chunk_size) {
$out[] = $this->substr($string, $i, $chunk_size); $out[] = $this->substr($input_string, $i, $chunk_size);
} }
return $out; return $out;
} else { } else {
return str_split($string, $chunk_size); return str_split($input_string, $chunk_size);
} }
} }
/**
* @return int
*/
public function pos() public function pos()
{ {
return $this->_pos; return $this->_pos;
} }
/**
* @return true
*/
public function is_resource() public function is_resource()
{ {
return true; return true;
} }
/**
* @return true
*/
public function close() public function close()
{ {
return true; return true;

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* This file is part of the POMO package. * This file is part of the POMO package.
*/ */
@ -10,25 +11,24 @@ interface StreamInterface
/** /**
* Sets the endianness of the file. * Sets the endianness of the file.
* *
* @param $endian string 'big' or 'little' * @param string $endian Set the endianness of the file. Accepts 'big', or 'little'.
*/ */
public function setEndian($endian); public function setEndian($endian);
/** /**
* Reads a 32bit Integer from the Stream. * Reads a 32bit Integer from the Stream
* *
* @return mixed The integer, corresponding to the next 32 bits from the * @return mixed The integer, corresponding to the next 32 bits from
* stream of false if there are not enough bytes or on error * the stream of false if there are not enough bytes or on error
*/ */
public function readint32(); public function readint32();
/** /**
* Reads an array of 32-bit Integers from the Stream. * Reads an array of 32-bit Integers from the Stream
* *
* @param int $count How many elements should be read * @param int $count How many elements should be read
*
* @return mixed Array of integers or false if there isn't * @return mixed Array of integers or false if there isn't
* enough data or on error * enough data or on error
*/ */
public function readint32array($count); public function readint32array($count);

View File

@ -1,16 +1,15 @@
<?php <?php
/** /**
* This file is part of the POMO package. * This file is part of the POMO package.
*/ */
namespace POMO\Streams; namespace POMO\Streams;
/** /**
* Provides file-like methods for manipulating a string instead * Provides file-like methods for manipulating a string instead
* of a physical file. * of a physical file.
* */
* @author Danilo Segan <danilo@kvota.net>
*/
class StringReader extends Reader implements StreamInterface class StringReader extends Reader implements StreamInterface
{ {
public $_str = ''; public $_str = '';
@ -22,24 +21,30 @@ class StringReader extends Reader implements StreamInterface
$this->_pos = 0; $this->_pos = 0;
} }
/**
* @param string $bytes
* @return string
*/
public function read($bytes) public function read($bytes)
{ {
$data = $this->substr($this->_str, $this->_pos, $bytes); $data = $this->substr($this->_str, $this->_pos, $bytes);
$this->_pos += $bytes; $this->_pos += $bytes;
if ($this->strlen($this->_str) < $this->_pos) { if ($this->strlen($this->_str) < $this->_pos) {
$this->_pos = $this->strlen($this->_str); $this->_pos = $this->strlen($this->_str);
} }
return $data; return $data;
} }
/**
* @param int $pos
* @return int
*/
public function seekto($pos) public function seekto($pos)
{ {
$this->_pos = $pos; $this->_pos = $pos;
if ($this->strlen($this->_str) < $this->_pos) { if ($this->strlen($this->_str) < $this->_pos) {
$this->_pos = $this->strlen($this->_str); $this->_pos = $this->strlen($this->_str);
} }
return $this->_pos; return $this->_pos;
} }
@ -51,12 +56,11 @@ class StringReader extends Reader implements StreamInterface
return $this->strlen($this->_str); return $this->strlen($this->_str);
} }
/**
* @return string
*/
public function read_all() public function read_all()
{ {
return $this->substr( return $this->substr($this->_str, $this->_pos, $this->strlen($this->_str));
$this->_str,
$this->_pos,
$this->strlen($this->_str)
);
} }
} }

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* This file is part of the POMO package. * This file is part of the POMO package.
* *
@ -9,9 +10,9 @@
namespace POMO\Translations; namespace POMO\Translations;
/** /**
* Contains EntryTranslations class
* EntryTranslations class encapsulates a translatable string. * EntryTranslations class encapsulates a translatable string.
*/ */
#[AllowDynamicProperties]
class EntryTranslations class EntryTranslations
{ {
/** /**
@ -21,46 +22,54 @@ class EntryTranslations
*/ */
public $is_plural = false; public $is_plural = false;
public $context = null; public $context = null;
public $singular = null; public $singular = null;
public $plural = null; public $plural = null;
public $translations = array(); public $translations = array();
public $translator_comments = ''; public $translator_comments = '';
public $extracted_comments = ''; public $extracted_comments = '';
public $references = array(); public $references = array();
public $flags = array(); public $flags = array();
/** /**
* @param array $args associative array, support following keys: * @param array $args {
* - singular (string) -- the string to translate, if omitted and empty entry will be created * Arguments array, supports the following keys:
* - plural (string) -- the plural form of the string, setting this will set {@link $is_plural} to true *
* - translations (array) -- translations of the string and possibly -- its plural forms * @type string $singular The string to translate, if omitted an
* - context (string) -- a string differentiating two equal strings used in different contexts * empty entry will be created.
* - translator_comments (string) -- comments left by translators * @type string $plural The plural form of the string, setting
* - extracted_comments (string) -- comments left by developers * this will set `$is_plural` to true.
* - references (array) -- places in the code this strings is used, in relative_to_root_path/file.php:linenum form * @type array $translations Translations of the string and possibly
* - flags (array) -- flags like php-format * its plural forms.
* @type string $context A string differentiating two equal strings
* used in different contexts.
* @type string $translator_comments Comments left by translators.
* @type string $extracted_comments Comments left by developers.
* @type array $references Places in the code this string is used, in
* relative_to_root_path/file.php:linenum form.
* @type array $flags Flags like php-format.
* }
*/ */
public function __construct($args = array()) public function __construct($args = array())
{ {
// if no singular -- empty object // If no singular -- empty object.
if (!isset($args['singular'])) { if (! isset($args['singular'])) {
return; return;
} }
// get member variable values from args hash // Get member variable values from args hash.
foreach ($args as $varname => $value) { foreach ($args as $varname => $value) {
$this->$varname = $value; $this->$varname = $value;
} }
if (isset($args['plural']) && $args['plural']) { if (isset($args['plural']) && $args['plural']) {
$this->is_plural = true; $this->is_plural = true;
} }
if (!is_array($this->translations)) { if (! is_array($this->translations)) {
$this->translations = array(); $this->translations = array();
} }
if (!is_array($this->references)) { if (! is_array($this->references)) {
$this->references = array(); $this->references = array();
} }
if (!is_array($this->flags)) { if (! is_array($this->flags)) {
$this->flags = array(); $this->flags = array();
} }
} }
@ -68,18 +77,18 @@ class EntryTranslations
/** /**
* Generates a unique key for this entry. * Generates a unique key for this entry.
* *
* @return string|bool the key or false if the entry is empty * @return string|false The key or false if the entry is null.
*/ */
public function key() public function key()
{ {
if (null === $this->singular || '' === $this->singular) { if (null === $this->singular) {
return false; return false;
} }
// Prepend context and EOT, like in MO files // Prepend context and EOT, like in MO files.
$key = !$this->context ? $this->singular : $this->context.chr(4).$this->singular; $key = ! $this->context ? $this->singular : $this->context . "\4" . $this->singular;
// Standardize on \n line endings // Standardize on \n line endings.
$key = str_replace(array("\r\n", "\r"), "\n", $key); $key = str_replace(array( "\r\n", "\r" ), "\n", $key);
return $key; return $key;
} }
@ -89,7 +98,7 @@ class EntryTranslations
*/ */
public function merge_with(&$other) public function merge_with(&$other)
{ {
$this->flags = array_unique(array_merge($this->flags, $other->flags)); $this->flags = array_unique(array_merge($this->flags, $other->flags));
$this->references = array_unique(array_merge($this->references, $other->references)); $this->references = array_unique(array_merge($this->references, $other->references));
if ($this->extracted_comments != $other->extracted_comments) { if ($this->extracted_comments != $other->extracted_comments) {
$this->extracted_comments .= $other->extracted_comments; $this->extracted_comments .= $other->extracted_comments;

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* This file is part of the POMO package. * This file is part of the POMO package.
* *
@ -12,12 +13,23 @@ use POMO\Parser\PluralForms;
/** /**
* Class for a set of entries for translation and their associated headers. * Class for a set of entries for translation and their associated headers.
*
* @property mixed $_nplurals
* @property callable $_gettext_select_plural_form
*/ */
class GettextTranslations extends Translations implements TranslationsInterface class GettextTranslations extends Translations implements TranslationsInterface
{ {
/**
* Number of plural forms.
*
* @var int
*/
public $_nplurals;
/**
* Callback to retrieve the plural form.
*
* @var callable
*/
public $_gettext_select_plural_form;
/** /**
* The gettext implementation of select_plural_form. * The gettext implementation of select_plural_form.
* *
@ -30,8 +42,10 @@ class GettextTranslations extends Translations implements TranslationsInterface
*/ */
public function gettext_select_plural_form($count) public function gettext_select_plural_form($count)
{ {
if (!isset($this->_gettext_select_plural_form) if (
|| is_null($this->_gettext_select_plural_form)) { !isset($this->_gettext_select_plural_form)
|| is_null($this->_gettext_select_plural_form)
) {
list($nplurals, $expression) = $this->nplurals_and_expression_from_header($this->get_header('Plural-Forms')); list($nplurals, $expression) = $this->nplurals_and_expression_from_header($this->get_header('Plural-Forms'));
$this->_nplurals = $nplurals; $this->_nplurals = $nplurals;
$this->_gettext_select_plural_form = $this->make_plural_form_function($nplurals, $expression); $this->_gettext_select_plural_form = $this->make_plural_form_function($nplurals, $expression);
@ -103,7 +117,7 @@ class GettextTranslations extends Translations implements TranslationsInterface
$res .= ') : ('; $res .= ') : (';
break; break;
case ';': case ';':
$res .= str_repeat(')', $depth).';'; $res .= str_repeat(')', $depth) . ';';
$depth = 0; $depth = 0;
break; break;
default: default:

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* This file is part of the POMO package. * This file is part of the POMO package.
* *

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* This file is part of the POMO package. * This file is part of the POMO package.
* *
@ -11,6 +12,7 @@ namespace POMO\Translations;
/** /**
* Class for a set of entries for translation and their associated headers. * Class for a set of entries for translation and their associated headers.
*/ */
#[AllowDynamicProperties]
class Translations implements TranslationsInterface class Translations implements TranslationsInterface
{ {
public $entries = array(); public $entries = array();
@ -114,9 +116,11 @@ class Translations implements TranslationsInterface
$translated = $this->translate_entry($entry); $translated = $this->translate_entry($entry);
$index = $this->select_plural_form($count); $index = $this->select_plural_form($count);
$total_plural_forms = $this->get_plural_forms_count(); $total_plural_forms = $this->get_plural_forms_count();
if ($translated && 0 <= $index && $index < $total_plural_forms && if (
$translated && 0 <= $index && $index < $total_plural_forms &&
is_array($translated->translations) && is_array($translated->translations) &&
isset($translated->translations[$index])) { isset($translated->translations[$index])
) {
return $translated->translations[$index]; return $translated->translations[$index];
} else { } else {
return 1 == $count ? $singular : $plural; return 1 == $count ? $singular : $plural;

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* This file is part of the POMO package. * This file is part of the POMO package.
* *

View File

@ -1,7 +1,7 @@
## ##
## Bundle of CA Root Certificates ## Bundle of CA Root Certificates
## ##
## Certificate data from Mozilla as of: Tue Apr 26 03:12:05 2022 GMT ## Certificate data from Mozilla as of: Tue Jan 10 04:12:06 2023 GMT
## ##
## This is a bundle of X.509 certificates of public Certificate Authorities ## This is a bundle of X.509 certificates of public Certificate Authorities
## (CA). These were automatically extracted from Mozilla's root certificates ## (CA). These were automatically extracted from Mozilla's root certificates
@ -14,7 +14,7 @@
## Just configure this file as the SSLCACertificateFile. ## Just configure this file as the SSLCACertificateFile.
## ##
## Conversion done with mk-ca-bundle.pl version 1.29. ## Conversion done with mk-ca-bundle.pl version 1.29.
## SHA256: 34a54d5191775c1bd37be6cfd3f09e831e072555dc3a2e51f4a2c4b0f8ada5cc ## SHA256: 90c470e705b4b5f36f09684dc50e2b79c8b86989a848b62cd1a7bd6460ee65f6
## ##
@ -489,29 +489,6 @@ IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
-----END CERTIFICATE----- -----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 COMODO ECC Certification Authority
================================== ==================================
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
@ -993,30 +970,6 @@ tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
-----END CERTIFICATE----- -----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 Actalis Authentication Root CA
============================== ==============================
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
@ -1678,36 +1631,6 @@ uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
-----END CERTIFICATE----- -----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 IdenTrust Commercial Root CA 1
============================== ==============================
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
@ -2159,87 +2082,6 @@ F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ
aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==
-----END CERTIFICATE----- -----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-----
MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNVBAYTAlBBMQ8w
DQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBT
eXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0
eTEfMB0GA1UEAwwWVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEy
MzExNzI2MzlaMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5h
bWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0
IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnIG7CKqJiJJWQdsg4foDSq8Gb
ZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9Nk
RvRUqdw6VC0xK5mC8tkq1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1
oYxOdqHp2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nKDOOb
XUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hapeaz6LMvYHL1cEksr1
/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF3wP+TfSvPd9cW436cOGlfifHhi5q
jxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQP
eSghYA2FFn3XVDjxklb9tTNMg9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+Ctg
rKAmrhQhJ8Z3mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh
8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAdBgNVHQ4EFgQU
2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6UnrybPZx9mCAZ5YwwYrIwDwYD
VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/h
Osh80QA9z+LqBrWyOrsGS2h60COXdKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnp
kpfbsEZC89NiqpX+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv
2wnL/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RXCI/hOWB3
S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYaZH9bDTMJBzN7Bj8RpFxw
PIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dv
DDqPys/cA8GiCcjl/YBeyGBCARsaU1q7N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYU
RpFHmygk71dSTlxCnKr3Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANE
xdqtvArBAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp5KeX
RKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu1uwJ
-----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 SSL.com Root Certification Authority RSA
======================================== ========================================
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
@ -3345,3 +3187,186 @@ PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD
AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR
AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW
-----END CERTIFICATE----- -----END CERTIFICATE-----
DigiCert TLS ECC P384 Root G5
=============================
-----BEGIN CERTIFICATE-----
MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV
UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4
NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx
FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg
Um9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd
lHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj
n4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB
/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds
Jk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx
AJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA==
-----END CERTIFICATE-----
DigiCert TLS RSA4096 Root G5
============================
-----BEGIN CERTIFICATE-----
MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG
EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0
MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV
UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2
IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8
7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU
AT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces
tyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa
zOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV
DdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q
TXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy
z6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/
MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk
wcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E
FgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w
DQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw
GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN
lnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN
MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/
u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G
OUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh
47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU
FvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ
yqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP
bEtoL8pU9ozaMv7Da4M/OMZ+
-----END CERTIFICATE-----
Certainly Root R1
=================
-----BEGIN CERTIFICATE-----
MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE
BhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN
MjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy
dGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
ADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O
5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl
8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl
DbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI
XsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN
KPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ
AjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb
rlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1
VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS
p6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
DgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz
HQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d
8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v
MMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB
GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+
gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH
JBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7
fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw
x06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S
X3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8=
-----END CERTIFICATE-----
Certainly Root E1
=================
-----BEGIN CERTIFICATE-----
MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV
UzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0
MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu
bHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4
fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9
YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw
DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E
AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8
rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR
-----END CERTIFICATE-----
E-Tugra Global Root CA RSA v3
=============================
-----BEGIN CERTIFICATE-----
MIIF8zCCA9ugAwIBAgIUDU3FzRYilZYIfrgLfxUGNPt5EDQwDQYJKoZIhvcNAQELBQAwgYAxCzAJ
BgNVBAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVncmEgRUJHIEEuUy4xHTAb
BgNVBAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYDVQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290
IENBIFJTQSB2MzAeFw0yMDAzMTgwOTA3MTdaFw00NTAzMTIwOTA3MTdaMIGAMQswCQYDVQQGEwJU
UjEPMA0GA1UEBxMGQW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRF
LVR1Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBDQSBSU0Eg
djMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCiZvCJt3J77gnJY9LTQ91ew6aEOErx
jYG7FL1H6EAX8z3DeEVypi6Q3po61CBxyryfHUuXCscxuj7X/iWpKo429NEvx7epXTPcMHD4QGxL
sqYxYdE0PD0xesevxKenhOGXpOhL9hd87jwH7eKKV9y2+/hDJVDqJ4GohryPUkqWOmAalrv9c/SF
/YP9f4RtNGx/ardLAQO/rWm31zLZ9Vdq6YaCPqVmMbMWPcLzJmAy01IesGykNz709a/r4d+ABs8q
QedmCeFLl+d3vSFtKbZnwy1+7dZ5ZdHPOrbRsV5WYVB6Ws5OUDGAA5hH5+QYfERaxqSzO8bGwzrw
bMOLyKSRBfP12baqBqG3q+Sx6iEUXIOk/P+2UNOMEiaZdnDpwA+mdPy70Bt4znKS4iicvObpCdg6
04nmvi533wEKb5b25Y08TVJ2Glbhc34XrD2tbKNSEhhw5oBOM/J+JjKsBY04pOZ2PJ8QaQ5tndLB
eSBrW88zjdGUdjXnXVXHt6woq0bM5zshtQoK5EpZ3IE1S0SVEgpnpaH/WwAH0sDM+T/8nzPyAPiM
bIedBi3x7+PmBvrFZhNb/FAHnnGGstpvdDDPk1Po3CLW3iAfYY2jLqN4MpBs3KwytQXk9TwzDdbg
h3cXTJ2w2AmoDVf3RIXwyAS+XF1a4xeOVGNpf0l0ZAWMowIDAQABo2MwYTAPBgNVHRMBAf8EBTAD
AQH/MB8GA1UdIwQYMBaAFLK0ruYt9ybVqnUtdkvAG1Mh0EjvMB0GA1UdDgQWBBSytK7mLfcm1ap1
LXZLwBtTIdBI7zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAImocn+M684uGMQQ
gC0QDP/7FM0E4BQ8Tpr7nym/Ip5XuYJzEmMmtcyQ6dIqKe6cLcwsmb5FJ+Sxce3kOJUxQfJ9emN4
38o2Fi+CiJ+8EUdPdk3ILY7r3y18Tjvarvbj2l0Upq7ohUSdBm6O++96SmotKygY/r+QLHUWnw/q
ln0F7psTpURs+APQ3SPh/QMSEgj0GDSz4DcLdxEBSL9htLX4GdnLTeqjjO/98Aa1bZL0SmFQhO3s
SdPkvmjmLuMxC1QLGpLWgti2omU8ZgT5Vdps+9u1FGZNlIM7zR6mK7L+d0CGq+ffCsn99t2HVhjY
sCxVYJb6CH5SkPVLpi6HfMsg2wY+oF0Dd32iPBMbKaITVaA9FCKvb7jQmhty3QUBjYZgv6Rn7rWl
DdF/5horYmbDB7rnoEgcOMPpRfunf/ztAmgayncSd6YAVSgU7NbHEqIbZULpkejLPoeJVF3Zr52X
nGnnCv8PWniLYypMfUeUP95L6VPQMPHF9p5J3zugkaOj/s1YzOrfr28oO6Bpm4/srK4rVJ2bBLFH
IK+WEj5jlB0E5y67hscMmoi/dkfv97ALl2bSRM9gUgfh1SxKOidhd8rXj+eHDjD/DLsE4mHDosiX
YY60MGo8bcIHX0pzLz/5FooBZu+6kcpSV3uu1OYP3Qt6f4ueJiDPO++BcYNZ
-----END CERTIFICATE-----
E-Tugra Global Root CA ECC v3
=============================
-----BEGIN CERTIFICATE-----
MIICpTCCAiqgAwIBAgIUJkYZdzHhT28oNt45UYbm1JeIIsEwCgYIKoZIzj0EAwMwgYAxCzAJBgNV
BAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVncmEgRUJHIEEuUy4xHTAbBgNV
BAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYDVQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290IENB
IEVDQyB2MzAeFw0yMDAzMTgwOTQ2NThaFw00NTAzMTIwOTQ2NThaMIGAMQswCQYDVQQGEwJUUjEP
MA0GA1UEBxMGQW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRFLVR1
Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBDQSBFQ0MgdjMw
djAQBgcqhkjOPQIBBgUrgQQAIgNiAASOmCm/xxAeJ9urA8woLNheSBkQKczLWYHMjLiSF4mDKpL2
w6QdTGLVn9agRtwcvHbB40fQWxPa56WzZkjnIZpKT4YKfWzqTTKACrJ6CZtpS5iB4i7sAnCWH/31
Rs7K3IKjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU/4Ixcj75xGZsrTie0bBRiKWQ
zPUwHQYDVR0OBBYEFP+CMXI++cRmbK04ntGwUYilkMz1MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO
PQQDAwNpADBmAjEA5gVYaWHlLcoNy/EZCL3W/VGSGn5jVASQkZo1kTmZ+gepZpO6yGjUij/67W4W
Aie3AjEA3VoXK3YdZUKWpqxdinlW2Iob35reX8dQj7FbcQwm32pAAOwzkSFxvmjkI6TZraE3
-----END CERTIFICATE-----
Security Communication RootCA3
==============================
-----BEGIN CERTIFICATE-----
MIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNVBAYTAkpQMSUw
IwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScwJQYDVQQDEx5TZWN1cml0eSBD
b21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2MDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQsw
CQYDVQQGEwJKUDElMCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UE
AxMeU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
MIICCgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4rCmDvu20r
hvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzAlrenfna84xtSGc4RHwsE
NPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MGTfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2
/D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF79+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGm
npjKIG58u4iFW/vAEGK78vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtY
XLVqAvO4g160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3weGVPK
p7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst+3A7caoreyYn8xrC
3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M0V9hvqG8OmpI6iZVIhZdXw3/JzOf
GAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQT9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0Vcw
CBEF/VfR2ccCAwEAAaNCMEAwHQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB
/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS
YpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PAFNr0Y/Dq9HHu
Tofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd9XbXv8S2gVj/yP9kaWJ5rW4O
H3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQIUYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASx
YfQAW0q3nHE3GYV5v4GwxxMOdnE+OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZ
XSEIx2C/pHF7uNkegr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml
+LLfiAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUVnuiZIesn
KwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD2NCcnWXL0CsnMQMeNuE9
dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI//1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm
6Vwdp6POXiUyK+OVrCoHzrQoeIY8LaadTdJ0MN1kURXbg4NR16/9M51NZg==
-----END CERTIFICATE-----
Security Communication ECC RootCA1
==================================
-----BEGIN CERTIFICATE-----
MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUwIwYD
VQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0eSBDb21t
dW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTEL
MAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNV
BAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQA
IgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+CnnfdldB9sELLo
5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpKULGjQjBAMB0GA1UdDgQW
BBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAK
BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L
snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e
N9k=
-----END CERTIFICATE-----

View File

@ -1 +1 @@
08df40e8f528ed283b0e480ba4bcdbfdd2fdcf695a7ada1668243072d80f8b6f cacert.pem fb1ecd641d0a02c01bc9036d513cb658bbda62a75e246bedbc01764560a639f0 cacert.pem

View File

@ -148,7 +148,7 @@ class Requests {
* *
* @var string * @var string
*/ */
const VERSION = '2.0.2'; const VERSION = '2.0.5';
/** /**
* Selected transport name * Selected transport name

View File

@ -1,3 +1,6 @@
[<img src="https://github-ads.s3.eu-central-1.amazonaws.com/support-ukraine.svg?t=1" />](https://supportukrainenow.org)
# Convert an array to xml # Convert an array to xml
[![Latest Version](https://img.shields.io/github/release/spatie/array-to-xml.svg?style=flat-square)](https://github.com/spatie/array-to-xml/releases) [![Latest Version](https://img.shields.io/github/release/spatie/array-to-xml.svg?style=flat-square)](https://github.com/spatie/array-to-xml/releases)
@ -360,7 +363,7 @@ This will result in:
<nickname>estacet</nickname> <nickname>estacet</nickname>
<tags> <tags>
<ns:tag>first-tag</ns:tag> <ns:tag>first-tag</ns:tag>
<tns:ag>second-tag</tns:ag> <ns:tag>second-tag</ns:tag>
</tags> </tags>
</ns:custom-key> </ns:custom-key>
</root> </root>
@ -477,23 +480,43 @@ This will result in:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"><soap:Header/><soap:Body><soap:key>soap:value</soap:key></soap:Body></soap:Envelope> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"><soap:Header/><soap:Body><soap:key>soap:value</soap:key></soap:Body></soap:Envelope>
``` ```
### Adding processing instructions
Call `$arrayToXml->addProcessingInstruction($target, $data)` method on ArrayToXml object to prepend a processing instruction before the root element.
Example:
```php
$arrayToXml = new ArrayToXml($array);
$arrayToXml->addProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="base.xsl"');
$result = $arrayToXml->toXml();
```
This will result in:
```xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="base.xsl"?>
<root><Good_guy><name>Luke Skywalker</name><weapon>Lightsaber</weapon></Good_guy><Bad_guy><name>Sauron</name><weapon>Evil Eye</weapon></Bad_guy></root>
```
## Testing ## Testing
```bash ```bash
vendor/bin/phpunit vendor/bin/phpunit
``` ```
### Changelog ## Changelog
Please see [CHANGELOG](CHANGELOG.md) for more information what has changed recently. Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.
## Contributing ## Contributing
Please see [CONTRIBUTING](CONTRIBUTING.md) for details. Please see [CONTRIBUTING](https://github.com/spatie/.github/blob/main/CONTRIBUTING.md) for details.
## Security ## Security Vulnerabilities
If you discover any security related issues, please email freek@spatie.be instead of using the issue tracker. Please review [our security policy](../../security/policy) on how to report security vulnerabilities.
## Postcardware ## Postcardware

View File

@ -26,7 +26,7 @@ class ArrayToXml
$domProperties = [], $domProperties = [],
$xmlStandalone = null $xmlStandalone = null
) { ) {
$this->document = new DOMDocument($xmlVersion, $xmlEncoding); $this->document = new DOMDocument($xmlVersion, $xmlEncoding ?? '');
if (! is_null($xmlStandalone)) { if (! is_null($xmlStandalone)) {
$this->document->xmlStandalone = $xmlStandalone; $this->document->xmlStandalone = $xmlStandalone;
@ -38,7 +38,7 @@ class ArrayToXml
$this->replaceSpacesByUnderScoresInKeyNames = $replaceSpacesByUnderScoresInKeyNames; $this->replaceSpacesByUnderScoresInKeyNames = $replaceSpacesByUnderScoresInKeyNames;
if ($this->isArrayAllKeySequential($array) && ! empty($array)) { if (! empty($array) && $this->isArrayAllKeySequential($array)) {
throw new DOMException('Invalid Character Error'); throw new DOMException('Invalid Character Error');
} }
@ -78,11 +78,9 @@ class ArrayToXml
public function toXml(): string public function toXml(): string
{ {
if ($this->addXmlDeclaration === false) { return $this->addXmlDeclaration
return $this->document->saveXml($this->document->documentElement); ? $this->document->saveXML()
} : $this->document->saveXml($this->document->documentElement);
return $this->document->saveXML();
} }
public function toDom(): DOMDocument public function toDom(): DOMDocument
@ -94,7 +92,7 @@ class ArrayToXml
{ {
foreach ($domProperties as $key => $value) { foreach ($domProperties as $key => $value) {
if (! property_exists($this->document, $key)) { if (! property_exists($this->document, $key)) {
throw new Exception($key.' is not a valid property of DOMDocument'); throw new Exception("{$key} is not a valid property of DOMDocument");
} }
} }
} }
@ -125,12 +123,25 @@ class ArrayToXml
return $this; return $this;
} }
public function addProcessingInstruction($target, $data)
{
$elements = $this->document->getElementsByTagName('*');
$rootElement = $elements->count() > 0 ? $elements->item(0) : null;
$processingInstruction = $this->document->createProcessingInstruction($target, $data);
$this->document->insertBefore($processingInstruction, $rootElement);
return $this;
}
private function convertElement(DOMElement $element, $value) private function convertElement(DOMElement $element, $value)
{ {
$sequential = $this->isArrayAllKeySequential($value); $sequential = $this->isArrayAllKeySequential($value);
if (! is_array($value)) { if (! is_array($value)) {
$value = htmlspecialchars($value); $value = htmlspecialchars($value ?? '');
$value = $this->removeControlCharacters($value); $value = $this->removeControlCharacters($value);
@ -205,7 +216,7 @@ class ArrayToXml
return; return;
} }
$child = new DOMElement($element->tagName); $child = $this->document->createElement($element->tagName);
$child->nodeValue = htmlspecialchars($value); $child->nodeValue = htmlspecialchars($value);
$element->parentNode->appendChild($child); $element->parentNode->appendChild($child);
} }
@ -230,7 +241,7 @@ class ArrayToXml
protected function addAttributes(DOMElement $element, array $data) protected function addAttributes(DOMElement $element, array $data)
{ {
foreach ($data as $attrKey => $attrVal) { foreach ($data as $attrKey => $attrVal) {
$element->setAttribute($attrKey, $attrVal); $element->setAttribute($attrKey, $attrVal ?? '');
} }
} }

View File

@ -723,7 +723,7 @@ final class Idn
$qMinusT = $q - $t; $qMinusT = $q - $t;
$baseMinusT = self::BASE - $t; $baseMinusT = self::BASE - $t;
$output .= self::encodeDigit($t + ($qMinusT) % ($baseMinusT), false); $output .= self::encodeDigit($t + $qMinusT % $baseMinusT, false);
++$out; ++$out;
$q = intdiv($qMinusT, $baseMinusT); $q = intdiv($qMinusT, $baseMinusT);
} }

View File

@ -4,7 +4,7 @@ Symfony Polyfill / Intl: Idn
This component provides [`idn_to_ascii`](https://php.net/idn-to-ascii) and [`idn_to_utf8`](https://php.net/idn-to-utf8) functions to users who run php versions without the [Intl](https://php.net/intl) extension. This component provides [`idn_to_ascii`](https://php.net/idn-to-ascii) and [`idn_to_utf8`](https://php.net/idn-to-utf8) functions to users who run php versions without the [Intl](https://php.net/intl) extension.
More information can be found in the More information can be found in the
[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). [main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).
License License
======= =======

View File

@ -34,7 +34,7 @@
"minimum-stability": "dev", "minimum-stability": "dev",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "1.23-dev" "dev-main": "1.27-dev"
}, },
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",

View File

@ -90,7 +90,7 @@ class Normalizer
self::$cC = self::getData('combiningClass'); self::$cC = self::getData('combiningClass');
} }
if (null !== $mbEncoding = (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) ? mb_internal_encoding() : null) { if (null !== $mbEncoding = (2 /* MB_OVERLOAD_STRING */ & (int) \ini_get('mbstring.func_overload')) ? mb_internal_encoding() : null) {
mb_internal_encoding('8bit'); mb_internal_encoding('8bit');
} }

View File

@ -6,7 +6,7 @@ This component provides a fallback implementation for the
by the [Intl](https://php.net/intl) extension. by the [Intl](https://php.net/intl) extension.
More information can be found in the More information can be found in the
[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). [main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).
License License
======= =======

View File

@ -29,7 +29,7 @@
"minimum-stability": "dev", "minimum-stability": "dev",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "1.23-dev" "dev-main": "1.27-dev"
}, },
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",

View File

@ -80,7 +80,7 @@ final class Mbstring
public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null) public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)
{ {
if (\is_array($fromEncoding) || ($fromEncoding !== null && false !== strpos($fromEncoding, ','))) { if (\is_array($fromEncoding) || (null !== $fromEncoding && false !== strpos($fromEncoding, ','))) {
$fromEncoding = self::mb_detect_encoding($s, $fromEncoding); $fromEncoding = self::mb_detect_encoding($s, $fromEncoding);
} else { } else {
$fromEncoding = self::getEncoding($fromEncoding); $fromEncoding = self::getEncoding($fromEncoding);
@ -102,7 +102,7 @@ final class Mbstring
$fromEncoding = 'Windows-1252'; $fromEncoding = 'Windows-1252';
} }
if ('UTF-8' !== $fromEncoding) { if ('UTF-8' !== $fromEncoding) {
$s = \iconv($fromEncoding, 'UTF-8//IGNORE', $s); $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s);
} }
return preg_replace_callback('/[\x80-\xFF]+/', [__CLASS__, 'html_encoding_callback'], $s); return preg_replace_callback('/[\x80-\xFF]+/', [__CLASS__, 'html_encoding_callback'], $s);
@ -113,7 +113,7 @@ final class Mbstring
$fromEncoding = 'UTF-8'; $fromEncoding = 'UTF-8';
} }
return \iconv($fromEncoding, $toEncoding.'//IGNORE', $s); return iconv($fromEncoding, $toEncoding.'//IGNORE', $s);
} }
public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars) public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars)
@ -130,7 +130,7 @@ final class Mbstring
public static function mb_decode_mimeheader($s) public static function mb_decode_mimeheader($s)
{ {
return \iconv_mime_decode($s, 2, self::$internalEncoding); return iconv_mime_decode($s, 2, self::$internalEncoding);
} }
public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null) public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null)
@ -140,7 +140,7 @@ final class Mbstring
public static function mb_decode_numericentity($s, $convmap, $encoding = null) public static function mb_decode_numericentity($s, $convmap, $encoding = null)
{ {
if (null !== $s && !is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) {
trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING); trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING);
return null; return null;
@ -150,7 +150,7 @@ final class Mbstring
return false; return false;
} }
if (null !== $encoding && !is_scalar($encoding)) { if (null !== $encoding && !\is_scalar($encoding)) {
trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING); trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING);
return ''; // Instead of null (cf. mb_encode_numericentity). return ''; // Instead of null (cf. mb_encode_numericentity).
@ -166,10 +166,10 @@ final class Mbstring
if ('UTF-8' === $encoding) { if ('UTF-8' === $encoding) {
$encoding = null; $encoding = null;
if (!preg_match('//u', $s)) { if (!preg_match('//u', $s)) {
$s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
} }
} else { } else {
$s = \iconv($encoding, 'UTF-8//IGNORE', $s); $s = iconv($encoding, 'UTF-8//IGNORE', $s);
} }
$cnt = floor(\count($convmap) / 4) * 4; $cnt = floor(\count($convmap) / 4) * 4;
@ -195,12 +195,12 @@ final class Mbstring
return $s; return $s;
} }
return \iconv('UTF-8', $encoding.'//IGNORE', $s); return iconv('UTF-8', $encoding.'//IGNORE', $s);
} }
public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false) public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false)
{ {
if (null !== $s && !is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) {
trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING); trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING);
return null; return null;
@ -210,13 +210,13 @@ final class Mbstring
return false; return false;
} }
if (null !== $encoding && !is_scalar($encoding)) { if (null !== $encoding && !\is_scalar($encoding)) {
trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING); trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING);
return null; // Instead of '' (cf. mb_decode_numericentity). return null; // Instead of '' (cf. mb_decode_numericentity).
} }
if (null !== $is_hex && !is_scalar($is_hex)) { if (null !== $is_hex && !\is_scalar($is_hex)) {
trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', \E_USER_WARNING); trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', \E_USER_WARNING);
return null; return null;
@ -232,10 +232,10 @@ final class Mbstring
if ('UTF-8' === $encoding) { if ('UTF-8' === $encoding) {
$encoding = null; $encoding = null;
if (!preg_match('//u', $s)) { if (!preg_match('//u', $s)) {
$s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
} }
} else { } else {
$s = \iconv($encoding, 'UTF-8//IGNORE', $s); $s = iconv($encoding, 'UTF-8//IGNORE', $s);
} }
static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4]; static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4];
@ -265,7 +265,7 @@ final class Mbstring
return $result; return $result;
} }
return \iconv('UTF-8', $encoding.'//IGNORE', $result); return iconv('UTF-8', $encoding.'//IGNORE', $result);
} }
public static function mb_convert_case($s, $mode, $encoding = null) public static function mb_convert_case($s, $mode, $encoding = null)
@ -280,10 +280,10 @@ final class Mbstring
if ('UTF-8' === $encoding) { if ('UTF-8' === $encoding) {
$encoding = null; $encoding = null;
if (!preg_match('//u', $s)) { if (!preg_match('//u', $s)) {
$s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
} }
} else { } else {
$s = \iconv($encoding, 'UTF-8//IGNORE', $s); $s = iconv($encoding, 'UTF-8//IGNORE', $s);
} }
if (\MB_CASE_TITLE == $mode) { if (\MB_CASE_TITLE == $mode) {
@ -343,7 +343,7 @@ final class Mbstring
return $s; return $s;
} }
return \iconv('UTF-8', $encoding.'//IGNORE', $s); return iconv('UTF-8', $encoding.'//IGNORE', $s);
} }
public static function mb_internal_encoding($encoding = null) public static function mb_internal_encoding($encoding = null)
@ -354,7 +354,7 @@ final class Mbstring
$normalizedEncoding = self::getEncoding($encoding); $normalizedEncoding = self::getEncoding($encoding);
if ('UTF-8' === $normalizedEncoding || false !== @\iconv($normalizedEncoding, $normalizedEncoding, ' ')) { if ('UTF-8' === $normalizedEncoding || false !== @iconv($normalizedEncoding, $normalizedEncoding, ' ')) {
self::$internalEncoding = $normalizedEncoding; self::$internalEncoding = $normalizedEncoding;
return true; return true;
@ -413,7 +413,7 @@ final class Mbstring
$encoding = self::$internalEncoding; $encoding = self::$internalEncoding;
} }
return self::mb_detect_encoding($var, [$encoding]) || false !== @\iconv($encoding, $encoding, $var); return self::mb_detect_encoding($var, [$encoding]) || false !== @iconv($encoding, $encoding, $var);
} }
public static function mb_detect_encoding($str, $encodingList = null, $strict = false) public static function mb_detect_encoding($str, $encodingList = null, $strict = false)
@ -488,7 +488,7 @@ final class Mbstring
return \strlen($s); return \strlen($s);
} }
return @\iconv_strlen($s, $encoding); return @iconv_strlen($s, $encoding);
} }
public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null)
@ -509,7 +509,7 @@ final class Mbstring
return 0; return 0;
} }
return \iconv_strpos($haystack, $needle, $offset, $encoding); return iconv_strpos($haystack, $needle, $offset, $encoding);
} }
public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null)
@ -533,7 +533,7 @@ final class Mbstring
} }
$pos = '' !== $needle || 80000 > \PHP_VERSION_ID $pos = '' !== $needle || 80000 > \PHP_VERSION_ID
? \iconv_strrpos($haystack, $needle, $encoding) ? iconv_strrpos($haystack, $needle, $encoding)
: self::mb_strlen($haystack, $encoding); : self::mb_strlen($haystack, $encoding);
return false !== $pos ? $offset + $pos : false; return false !== $pos ? $offset + $pos : false;
@ -541,7 +541,7 @@ final class Mbstring
public static function mb_str_split($string, $split_length = 1, $encoding = null) public static function mb_str_split($string, $split_length = 1, $encoding = null)
{ {
if (null !== $string && !is_scalar($string) && !(\is_object($string) && method_exists($string, '__toString'))) { if (null !== $string && !\is_scalar($string) && !(\is_object($string) && method_exists($string, '__toString'))) {
trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', \E_USER_WARNING); trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', \E_USER_WARNING);
return null; return null;
@ -550,6 +550,7 @@ final class Mbstring
if (1 > $split_length = (int) $split_length) { if (1 > $split_length = (int) $split_length) {
if (80000 > \PHP_VERSION_ID) { if (80000 > \PHP_VERSION_ID) {
trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING); trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING);
return false; return false;
} }
@ -568,7 +569,7 @@ final class Mbstring
} }
$rx .= '.{'.$split_length.'})/us'; $rx .= '.{'.$split_length.'})/us';
return preg_split($rx, $string, null, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); return preg_split($rx, $string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY);
} }
$result = []; $result = [];
@ -617,7 +618,7 @@ final class Mbstring
} }
if ($start < 0) { if ($start < 0) {
$start = \iconv_strlen($s, $encoding) + $start; $start = iconv_strlen($s, $encoding) + $start;
if ($start < 0) { if ($start < 0) {
$start = 0; $start = 0;
} }
@ -626,13 +627,13 @@ final class Mbstring
if (null === $length) { if (null === $length) {
$length = 2147483647; $length = 2147483647;
} elseif ($length < 0) { } elseif ($length < 0) {
$length = \iconv_strlen($s, $encoding) + $length - $start; $length = iconv_strlen($s, $encoding) + $length - $start;
if ($length < 0) { if ($length < 0) {
return ''; return '';
} }
} }
return (string) \iconv_substr($s, $start, $length, $encoding); return (string) iconv_substr($s, $start, $length, $encoding);
} }
public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null)
@ -657,7 +658,7 @@ final class Mbstring
$pos = strrpos($haystack, $needle); $pos = strrpos($haystack, $needle);
} else { } else {
$needle = self::mb_substr($needle, 0, 1, $encoding); $needle = self::mb_substr($needle, 0, 1, $encoding);
$pos = \iconv_strrpos($haystack, $needle, $encoding); $pos = iconv_strrpos($haystack, $needle, $encoding);
} }
return self::getSubpart($pos, $part, $haystack, $encoding); return self::getSubpart($pos, $part, $haystack, $encoding);
@ -736,12 +737,12 @@ final class Mbstring
$encoding = self::getEncoding($encoding); $encoding = self::getEncoding($encoding);
if ('UTF-8' !== $encoding) { if ('UTF-8' !== $encoding) {
$s = \iconv($encoding, 'UTF-8//IGNORE', $s); $s = iconv($encoding, 'UTF-8//IGNORE', $s);
} }
$s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide); $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide);
return ($wide << 1) + \iconv_strlen($s, 'UTF-8'); return ($wide << 1) + iconv_strlen($s, 'UTF-8');
} }
public static function mb_substr_count($haystack, $needle, $encoding = null) public static function mb_substr_count($haystack, $needle, $encoding = null)

View File

@ -5,7 +5,7 @@ This component provides a partial, native PHP implementation for the
[Mbstring](https://php.net/mbstring) extension. [Mbstring](https://php.net/mbstring) extension.
More information can be found in the More information can be found in the
[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). [main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).
License License
======= =======

View File

@ -31,7 +31,7 @@
"minimum-stability": "dev", "minimum-stability": "dev",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "1.23-dev" "dev-main": "1.27-dev"
}, },
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",

Some files were not shown because too many files have changed in this diff Show More