Amazon Associates Link Builder - Version 1.5.0

Version Description

Download this release

Release Info

Developer amazonlinkbuilder
Plugin Icon 128x128 Amazon Associates Link Builder
Version 1.5.0
Comparing to
See all releases

Code changes from version 1.4.13 to 1.5.0

Files changed (111) hide show
  1. NOTICE.txt +22 -1
  2. aalb_config.php +19 -8
  3. admin/aalb_admin.php +17 -7
  4. admin/css/aalb_admin.css +132 -73
  5. admin/css/aalb_credentials.css +5 -1
  6. admin/js/aalb_admin.js +790 -523
  7. admin/partials/aalb_admin_pop_up_content_hbs.php +34 -0
  8. admin/partials/aalb_editor_search_box.php +3 -6
  9. admin/partials/aalb_meta_box.php +62 -80
  10. admin/partials/aalb_meta_box_tab_content.php +98 -0
  11. admin/sidebar/aalb_sidebar.php +1 -0
  12. admin/sidebar/partials/aalb_credentials.php +15 -3
  13. admin/sidebar/partials/aalb_ui_common.php +3 -3
  14. admin/sidebar/partials/helper/aalb_credentials_helper.php +29 -0
  15. amazon-associates-link-builder.php +3 -1
  16. composer.json +5 -0
  17. composer.lock +232 -0
  18. composer.phar +0 -0
  19. css/aalb_basics.css +10 -0
  20. includes/aalb_activator.php +0 -21
  21. includes/aalb_autoloader.php +1 -0
  22. includes/aalb_cache_loader.php +6 -5
  23. includes/aalb_helper.php +32 -11
  24. includes/aalb_manager.php +6 -4
  25. includes/aalb_template_engine.php +7 -4
  26. ip2country/aalb_customer_country.php +110 -0
  27. ip2country/aalb_customer_ip_address.php +70 -0
  28. ip2country/aalb_maxmind_db_manager.php +242 -0
  29. lib/php/aalb_xml_helper.php +1 -1
  30. shortcode/aalb_shortcode_loader.php +10 -38
  31. shortcode/aalb_shortcode_manager.php +176 -0
  32. vendor/autoload.php +7 -0
  33. vendor/composer/ClassLoader.php +445 -0
  34. vendor/composer/LICENSE +21 -0
  35. vendor/composer/autoload_classmap.php +9 -0
  36. vendor/composer/autoload_namespaces.php +9 -0
  37. vendor/composer/autoload_psr4.php +14 -0
  38. vendor/composer/autoload_real.php +52 -0
  39. vendor/composer/autoload_static.php +57 -0
  40. vendor/composer/ca-bundle/LICENSE +19 -0
  41. vendor/composer/ca-bundle/README.md +77 -0
  42. vendor/composer/ca-bundle/composer.json +57 -0
  43. vendor/composer/ca-bundle/res/cacert.pem +3646 -0
  44. vendor/composer/ca-bundle/src/CaBundle.php +291 -0
  45. vendor/composer/installed.json +224 -0
  46. vendor/geoip2/geoip2/.gitmodules +3 -0
  47. vendor/geoip2/geoip2/.php_cs +34 -0
  48. vendor/geoip2/geoip2/CHANGELOG.md +250 -0
  49. vendor/geoip2/geoip2/LICENSE +202 -0
  50. vendor/geoip2/geoip2/README.md +401 -0
  51. vendor/geoip2/geoip2/composer.json +31 -0
  52. vendor/geoip2/geoip2/src/Database/Reader.php +283 -0
  53. vendor/geoip2/geoip2/src/Exception/AddressNotFoundException.php +10 -0
  54. vendor/geoip2/geoip2/src/Exception/AuthenticationException.php +10 -0
  55. vendor/geoip2/geoip2/src/Exception/GeoIp2Exception.php +10 -0
  56. vendor/geoip2/geoip2/src/Exception/HttpException.php +24 -0
  57. vendor/geoip2/geoip2/src/Exception/InvalidRequestException.php +26 -0
  58. vendor/geoip2/geoip2/src/Exception/OutOfQueriesException.php +10 -0
  59. vendor/geoip2/geoip2/src/Model/AbstractModel.php +67 -0
  60. vendor/geoip2/geoip2/src/Model/AnonymousIp.php +46 -0
  61. vendor/geoip2/geoip2/src/Model/Asn.php +35 -0
  62. vendor/geoip2/geoip2/src/Model/City.php +133 -0
  63. vendor/geoip2/geoip2/src/Model/ConnectionType.php +31 -0
  64. vendor/geoip2/geoip2/src/Model/Country.php +71 -0
  65. vendor/geoip2/geoip2/src/Model/Domain.php +31 -0
  66. vendor/geoip2/geoip2/src/Model/Enterprise.php +47 -0
  67. vendor/geoip2/geoip2/src/Model/Insights.php +47 -0
  68. vendor/geoip2/geoip2/src/Model/Isp.php +44 -0
  69. vendor/geoip2/geoip2/src/ProviderInterface.php +20 -0
  70. vendor/geoip2/geoip2/src/Record/AbstractPlaceRecord.php +66 -0
  71. vendor/geoip2/geoip2/src/Record/AbstractRecord.php +61 -0
  72. vendor/geoip2/geoip2/src/Record/City.php +29 -0
  73. vendor/geoip2/geoip2/src/Record/Continent.php +32 -0
  74. vendor/geoip2/geoip2/src/Record/Country.php +37 -0
  75. vendor/geoip2/geoip2/src/Record/Location.php +52 -0
  76. vendor/geoip2/geoip2/src/Record/MaxMind.php +19 -0
  77. vendor/geoip2/geoip2/src/Record/Postal.php +26 -0
  78. vendor/geoip2/geoip2/src/Record/RepresentedCountry.php +35 -0
  79. vendor/geoip2/geoip2/src/Record/Subdivision.php +40 -0
  80. vendor/geoip2/geoip2/src/Record/Traits.php +114 -0
  81. vendor/geoip2/geoip2/src/WebService/Client.php +239 -0
  82. vendor/maxmind-db/reader/CHANGELOG.md +108 -0
  83. vendor/maxmind-db/reader/LICENSE +202 -0
  84. vendor/maxmind-db/reader/README.md +139 -0
  85. vendor/maxmind-db/reader/composer.json +34 -0
  86. vendor/maxmind-db/reader/ext/config.m4 +19 -0
  87. vendor/maxmind-db/reader/ext/maxminddb.c +564 -0
  88. vendor/maxmind-db/reader/ext/php_maxminddb.h +24 -0
  89. vendor/maxmind-db/reader/ext/tests/001-load.phpt +12 -0
  90. vendor/maxmind-db/reader/ext/tests/002-final.phpt +13 -0
  91. vendor/maxmind-db/reader/src/MaxMind/Db/Reader.php +309 -0
  92. vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Decoder.php +311 -0
  93. vendor/maxmind-db/reader/src/MaxMind/Db/Reader/InvalidDatabaseException.php +10 -0
  94. vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Metadata.php +69 -0
  95. vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Util.php +26 -0
  96. vendor/maxmind/web-service-common/CHANGELOG.md +74 -0
  97. vendor/maxmind/web-service-common/LICENSE +202 -0
  98. vendor/maxmind/web-service-common/README.md +26 -0
  99. vendor/maxmind/web-service-common/composer.json +31 -0
  100. vendor/maxmind/web-service-common/src/Exception/AuthenticationException.php +10 -0
  101. vendor/maxmind/web-service-common/src/Exception/HttpException.php +40 -0
  102. vendor/maxmind/web-service-common/src/Exception/InsufficientFundsException.php +10 -0
  103. vendor/maxmind/web-service-common/src/Exception/InvalidInputException.php +12 -0
  104. vendor/maxmind/web-service-common/src/Exception/InvalidRequestException.php +37 -0
  105. vendor/maxmind/web-service-common/src/Exception/IpAddressNotFoundException.php +7 -0
  106. vendor/maxmind/web-service-common/src/Exception/PermissionRequiredException.php +10 -0
  107. vendor/maxmind/web-service-common/src/Exception/WebServiceException.php +10 -0
  108. vendor/maxmind/web-service-common/src/WebService/Client.php +470 -0
  109. vendor/maxmind/web-service-common/src/WebService/Http/CurlRequest.php +110 -0
  110. vendor/maxmind/web-service-common/src/WebService/Http/Request.php +29 -0
  111. vendor/maxmind/web-service-common/src/WebService/Http/RequestFactory.php +26 -0
NOTICE.txt CHANGED
@@ -74,4 +74,25 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
74
  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
75
  DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
76
  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
77
- OR OTHER DEALINGS IN THE SOFTWARE.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
75
  DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
76
  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
77
+ OR OTHER DEALINGS IN THE SOFTWARE.
78
+
79
+ ** maxmind-web-service-common, maxmind-db-reader geoip2 Apache License
80
+
81
+ Copyright [2017] [MaxMind]
82
+
83
+ Licensed under the Apache License, Version 2.0 (the "License");
84
+ you may not use this file except in compliance with the License.
85
+ You may obtain a copy of the License at
86
+
87
+ http://www.apache.org/licenses/LICENSE-2.0
88
+
89
+ Unless required by applicable law or agreed to in writing, software
90
+ distributed under the License is distributed on an "AS IS" BASIS,
91
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
92
+ See the License for the specific language governing permissions and
93
+ limitations under the License.
94
+
95
+
96
+ ** GeoLite2 Country Database Creative Commons Attribution-ShareAlike 4.0 International License
97
+ This product includes GeoLite2 data created by MaxMind, available from
98
+ <a href="http://www.maxmind.com">http://www.maxmind.com</a>.
aalb_config.php CHANGED
@@ -13,13 +13,13 @@ and limitations under the License.
13
  */
14
 
15
  //version
16
- define( 'AALB_PLUGIN_CURRENT_VERSION', '1.4.13' );
17
 
18
  //Version no. with multi locale settings page
19
  define( 'AALB_MULTI_LOCALE_SETTINGS_PLUGIN_VERSION', '1.4.12' );
20
 
21
  //PHP version compatible for AALB plugin
22
- define( 'AALB_PLUGIN_MINIMUM_SUPPORTED_PHP_VERSION', '5.3.0' );
23
 
24
  //Plugin Name
25
  define( 'AALB_PLUGIN_NAME', 'Amazon Associates Link Builder' );
@@ -40,12 +40,7 @@ define( 'AALB_PAAPI_HELPER_PHP', AALB_PLUGIN_DIR . 'lib/php/Paapi/aalb_paapi_hel
40
  define( 'AALB_VALIDATION_HELPER_PHP', AALB_PLUGIN_DIR . 'lib/php/aalb_validation_helper.php' );
41
  define( 'AALB_XML_HELPER_PHP', AALB_PLUGIN_DIR . 'lib/php/aalb_xml_helper.php' );
42
  define( 'AALB_TRACKING_API_HELPER_PHP', AALB_PLUGIN_DIR . 'lib/php/aalb_tracking_api_helper.php' );
43
-
44
- //Shortcode
45
- define( 'AALB_SHORTCODE_PHP', AALB_PLUGIN_DIR . 'shortcode/aalb_shortcode.php' );
46
- define( 'AALB_SHORTCODE_TEXT_PHP', AALB_PLUGIN_DIR . 'shortcode/aalb_shortcode_text.php' );
47
- define( 'AALB_SHORTCODE_LOADER', AALB_PLUGIN_DIR . 'shortcode/aalb_shortcode_loader.php' );
48
- define( 'AALB_SHORTCODE_HELPER', AALB_PLUGIN_DIR . 'shortcode/aalb_shortcode_helper.php' );
49
 
50
  //Shortcodes supported
51
  define( 'AALB_SHORTCODE_AMAZON_LINK', 'amazon_link' );
@@ -67,6 +62,7 @@ define( 'AALB_PAAPI_DIR', AALB_PLUGIN_DIR . 'lib/php/Paapi/' );
67
  define( 'AALB_SHORTCODE_DIR', AALB_PLUGIN_DIR . 'shortcode/' );
68
  define( 'AALB_LIBRARY_DIR', AALB_PLUGIN_DIR . 'lib/php/' );
69
  define( 'AALB_SIDEBAR_HELPER_DIR', AALB_PLUGIN_DIR . 'admin/sidebar/partials/helper/' );
 
70
 
71
  //Includes
72
  define( 'AALB_ACTIVATOR_PHP', AALB_PLUGIN_DIR . 'includes/aalb_activator.php' );
@@ -80,6 +76,7 @@ define( 'AALB_AUTOLOADER', AALB_PLUGIN_DIR . 'includes/aalb_autoloader.php' );
80
  //Templates Directory
81
  define( 'AALB_TEMPLATE_URL', AALB_PLUGIN_URL . 'template/' );
82
  define( 'AALB_TEMPLATE_UPLOADS_FOLDER', 'amazon-associates-link-builder/template/' );
 
83
 
84
  //Partials
85
  define( 'AALB_META_BOX_PARTIAL', AALB_PLUGIN_DIR . 'admin/partials/aalb_meta_box.php' );
@@ -120,6 +117,8 @@ define( 'HANDLEBARS_JS', 'https://d8fd03967nrad.cloudfront.net/libs/handlebars.j
120
  define( 'CODEMIRROR_JS', 'https://d8fd03967nrad.cloudfront.net/libs/codemirror/5.13.2/codemirror.min.js' );
121
  define( 'CODEMIRROR_MODE_XML_JS', 'https://d8fd03967nrad.cloudfront.net/libs/codemirror/5.13.2/mode/xml/xml.min.js' );
122
  define( 'CODEMIRROR_MODE_CSS_JS', 'https://d8fd03967nrad.cloudfront.net/libs/codemirror/5.13.2/mode/css/css.min.js' );
 
 
123
 
124
  //External Styles
125
  define( 'FONT_AWESOME_CSS', 'https://d8fd03967nrad.cloudfront.net/libs/font-awesome/4.5.0/css/font-awesome.min.css' );
@@ -161,9 +160,12 @@ define( 'AALB_AWS_SECRET_KEY', 'aalb_aws_secret_key' );
161
  define( 'AALB_CRED_CONFIG_GROUP', 'aalb_cred_config_group' );
162
  define( 'AALB_STORE_ID_NAMES', 'aalb_store_id_names' );
163
  define( 'AALB_STORE_IDS', 'aalb_store_ids' );
 
164
  define( 'AALB_SHOW_HTTP_WARNING_ONCE', 'aalb_show_http_warning_once' );
165
  define( 'AALB_PLUGIN_VERSION', 'aalb_plugin_version' );
166
  define( 'AALB_NO_REFERRER_DISABLED', 'aalb_no_referrer_disabled' );
 
 
167
 
168
  //Masking constant
169
  define( 'AALB_AWS_SECRET_KEY_MASK', '••••••••••••••••••••••••••••••••••••••••' );
@@ -288,8 +290,17 @@ define( 'AALB_PAAPI_EFFICIENCY_GUIDELINES_URL', 'http://docs.aws.amazon.com/AWSE
288
  //Plugin specific URLS
289
  define( 'AALB_SETTINGS_PAGE_URL', admin_url( 'admin.php?page=associates-link-builder-settings' ) );
290
 
 
 
 
291
  define( 'AALB_NEW_PAGE_TARGET', "_blank" );
292
 
293
  define( 'AALB_NEWLINE_SEPARATOR', "\r\n" );
 
 
 
 
 
 
294
 
295
  ?>
13
  */
14
 
15
  //version
16
+ define( 'AALB_PLUGIN_CURRENT_VERSION', '1.5.0' );
17
 
18
  //Version no. with multi locale settings page
19
  define( 'AALB_MULTI_LOCALE_SETTINGS_PLUGIN_VERSION', '1.4.12' );
20
 
21
  //PHP version compatible for AALB plugin
22
+ define( 'AALB_PLUGIN_MINIMUM_SUPPORTED_PHP_VERSION', '5.4.0' );
23
 
24
  //Plugin Name
25
  define( 'AALB_PLUGIN_NAME', 'Amazon Associates Link Builder' );
40
  define( 'AALB_VALIDATION_HELPER_PHP', AALB_PLUGIN_DIR . 'lib/php/aalb_validation_helper.php' );
41
  define( 'AALB_XML_HELPER_PHP', AALB_PLUGIN_DIR . 'lib/php/aalb_xml_helper.php' );
42
  define( 'AALB_TRACKING_API_HELPER_PHP', AALB_PLUGIN_DIR . 'lib/php/aalb_tracking_api_helper.php' );
43
+ define( 'MAXMIND_DATA_FILENAME', 'GeoLite2-Country.mmdb' );
 
 
 
 
 
44
 
45
  //Shortcodes supported
46
  define( 'AALB_SHORTCODE_AMAZON_LINK', 'amazon_link' );
62
  define( 'AALB_SHORTCODE_DIR', AALB_PLUGIN_DIR . 'shortcode/' );
63
  define( 'AALB_LIBRARY_DIR', AALB_PLUGIN_DIR . 'lib/php/' );
64
  define( 'AALB_SIDEBAR_HELPER_DIR', AALB_PLUGIN_DIR . 'admin/sidebar/partials/helper/' );
65
+ define( 'AALB_IP_2_COUNTRY_DIR', AALB_PLUGIN_DIR . 'ip2country/' );
66
 
67
  //Includes
68
  define( 'AALB_ACTIVATOR_PHP', AALB_PLUGIN_DIR . 'includes/aalb_activator.php' );
76
  //Templates Directory
77
  define( 'AALB_TEMPLATE_URL', AALB_PLUGIN_URL . 'template/' );
78
  define( 'AALB_TEMPLATE_UPLOADS_FOLDER', 'amazon-associates-link-builder/template/' );
79
+ define( 'AALB_UPLOADS_FOLDER', 'amazon-associates-link-builder/' );
80
 
81
  //Partials
82
  define( 'AALB_META_BOX_PARTIAL', AALB_PLUGIN_DIR . 'admin/partials/aalb_meta_box.php' );
117
  define( 'CODEMIRROR_JS', 'https://d8fd03967nrad.cloudfront.net/libs/codemirror/5.13.2/codemirror.min.js' );
118
  define( 'CODEMIRROR_MODE_XML_JS', 'https://d8fd03967nrad.cloudfront.net/libs/codemirror/5.13.2/mode/xml/xml.min.js' );
119
  define( 'CODEMIRROR_MODE_CSS_JS', 'https://d8fd03967nrad.cloudfront.net/libs/codemirror/5.13.2/mode/css/css.min.js' );
120
+ define( 'AALB_JQUERY_UI_JS', 'https://d8fd03967nrad.cloudfront.net/libs/jQueryUI/1.12.1/jquery-ui.js' );
121
+ define( 'AALB_JQUERY_UI_CSS', 'https://d8fd03967nrad.cloudfront.net/libs/jQueryUI/1.12.1/themes/ui-lightness/jquery-ui.css' );
122
 
123
  //External Styles
124
  define( 'FONT_AWESOME_CSS', 'https://d8fd03967nrad.cloudfront.net/libs/font-awesome/4.5.0/css/font-awesome.min.css' );
160
  define( 'AALB_CRED_CONFIG_GROUP', 'aalb_cred_config_group' );
161
  define( 'AALB_STORE_ID_NAMES', 'aalb_store_id_names' );
162
  define( 'AALB_STORE_IDS', 'aalb_store_ids' );
163
+ define( 'AALB_CUSTOM_UPLOAD_PATH', 'aalb_custom_upload_path' );
164
  define( 'AALB_SHOW_HTTP_WARNING_ONCE', 'aalb_show_http_warning_once' );
165
  define( 'AALB_PLUGIN_VERSION', 'aalb_plugin_version' );
166
  define( 'AALB_NO_REFERRER_DISABLED', 'aalb_no_referrer_disabled' );
167
+ define( 'AALB_GEOLITE_DB_EXPIRATION_TIME', 'aalb_geolite_db_expiration_time' );
168
+ define( 'AALB_GEOLITE_DB_LAST_UPDATED_TIME', 'aalb_geolite_db_last_updated_time' );
169
 
170
  //Masking constant
171
  define( 'AALB_AWS_SECRET_KEY_MASK', '••••••••••••••••••••••••••••••••••••••••' );
290
  //Plugin specific URLS
291
  define( 'AALB_SETTINGS_PAGE_URL', admin_url( 'admin.php?page=associates-link-builder-settings' ) );
292
 
293
+ //Maxmind GeoLite2Country DB Download URL
294
+ define('AALB_GEOLITE_COUNTRY_DB_DOWNLOAD_URL', 'http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz');
295
+ define('AALB_GEOLITE_COUNTRY_DB_DETAILS_URL','https://dev.maxmind.com/geoip/geoip2/geolite2/');
296
  define( 'AALB_NEW_PAGE_TARGET', "_blank" );
297
 
298
  define( 'AALB_NEWLINE_SEPARATOR', "\r\n" );
299
+ define('GEO_TARGETED_LINKS_DELIMITER', "|");
300
+
301
+ //Pugin Link Codes
302
+ define('AALB_DEFAULT_LINK_CODE', "alb");
303
+ define('AALB_GEO_TARGETED_LINKS_DEFAULT_COUNTRY_LINK_CODE', "al0");
304
+ define('AALB_GEO_TARGETED_LINKS_REDIRECTED_COUNTRY_LINK_CODE', "al1");
305
 
306
  ?>
admin/aalb_admin.php CHANGED
@@ -56,7 +56,7 @@ class Aalb_Admin {
56
  * Checks if store-ids credentials are not set
57
  *
58
  * @since 1.4.12
59
- *
60
  * @return boolean true if store-id credentials are set
61
  */
62
  public function is_store_id_credentials_not_set() {
@@ -70,8 +70,10 @@ class Aalb_Admin {
70
  *
71
  */
72
  public function aalb_enqueue_styles() {
73
- wp_enqueue_style( 'aalb_basics_css', AALB_BASICS_CSS, array(), AALB_PLUGIN_CURRENT_VERSION );
74
- wp_enqueue_style( 'aalb_admin_css', AALB_ADMIN_CSS, array(), AALB_PLUGIN_CURRENT_VERSION );
 
 
75
  wp_enqueue_style( 'font_awesome_css', FONT_AWESOME_CSS );
76
  wp_enqueue_style( 'thickbox' );
77
  }
@@ -86,7 +88,8 @@ class Aalb_Admin {
86
  wp_enqueue_script( 'jquery' );
87
  wp_enqueue_script( 'handlebars_js', HANDLEBARS_JS );
88
  wp_enqueue_script( 'aalb_sha2_js', AALB_SHA2_JS, array(), AALB_PLUGIN_CURRENT_VERSION );
89
- wp_enqueue_script( 'aalb_admin_js', AALB_ADMIN_JS, array( 'handlebars_js', 'jquery', 'aalb_sha2_js' ), AALB_PLUGIN_CURRENT_VERSION );
 
90
  wp_localize_script( 'aalb_admin_js', 'api_pref', $this->get_paapi_pref() );
91
  wp_localize_script( 'aalb_admin_js', 'aalb_strings', $this->get_aalb_strings() );
92
  }
@@ -126,7 +129,7 @@ class Aalb_Admin {
126
  private function get_aalb_strings() {
127
  return array(
128
  "template_asin_error" => esc_html__( "Only one product can be selected for this template", 'amazon-associates-link-builder' ),
129
- "no_asin_selected_error" => esc_html__( "Please select at least one product for display", 'amazon-associates-link-builder' ),
130
  "empty_product_search_bar" => esc_html__( "Please Enter a Product Name ", 'amazon-associates-link-builder' ),
131
  "short_code_create_failure" => esc_html__( "Failed to create Text Link shortcode. Editor has some text selected. Only one item can be selected while adding text links", 'amazon-associates-link-builder' ),
132
  /* translators: %s: Email-id of the support */
@@ -140,16 +143,22 @@ class Aalb_Admin {
140
  "searchbox_placeholder" => esc_html__( "Enter keyword(s)", 'amazon-associates-link-builder' ),
141
  "search_button_label" => esc_html__( "Search", 'amazon-associates-link-builder' ),
142
  "associate_id_label" => esc_html__( "Tracking IDs", 'amazon-associates-link-builder' ),
 
 
143
  "marketplace_label" => esc_html__( "Marketplace", 'amazon-associates-link-builder' ),
 
144
  "text_shown_during_search" => esc_html__( "Searching relevant products from Amazon", 'amazon-associates-link-builder' ),
145
  "click_to_select_products_label" => esc_html__( "Click to select product(s) to advertise", 'amazon-associates-link-builder' ),
146
  "check_more_on_amazon_text" => esc_html__( "Check more search results on Amazon", 'amazon-associates-link-builder' ),
147
- "selected_products_list_label" => esc_html__( "List of Selected Products", 'amazon-associates-link-builder' ),
148
  "text_shown_during_shortcode_creation" => esc_html__( "Creating shortcode. Please wait....", 'amazon-associates-link-builder' ),
149
  "add_shortcode_button_label" => esc_html__( "Add Shortcode", 'amazon-associates-link-builder' ),
150
  "templates_help_content" => esc_html__( "To configure templates, go to Associates Link Builder plugin's Templates page", 'amazon-associates-link-builder' ),
151
  "marketplace_help_content" => esc_html__( "To configure marketplaces, go to Associates Link Builder plugin's Settings page", 'amazon-associates-link-builder' ),
152
- "tracking_id_help_content" => esc_html__( "To configure tracking ids, go to Associates Link Builder plugin's Settings page", 'amazon-associates-link-builder' )
 
 
 
153
  );
154
  }
155
 
@@ -175,6 +184,7 @@ class Aalb_Admin {
175
  //Clear all transients for price changes to reflect
176
  $this->helper->clear_cache_for_substring( '' );
177
  $this->helper->clear_expired_transients();
 
178
 
179
  global $wp_filesystem;
180
  $this->helper->aalb_initialize_wp_filesystem_api();
56
  * Checks if store-ids credentials are not set
57
  *
58
  * @since 1.4.12
59
+ *
60
  * @return boolean true if store-id credentials are set
61
  */
62
  public function is_store_id_credentials_not_set() {
70
  *
71
  */
72
  public function aalb_enqueue_styles() {
73
+ wp_enqueue_style( 'jquery_ui_css', AALB_JQUERY_UI_CSS );
74
+ wp_enqueue_style( 'aalb_basics_css', AALB_BASICS_CSS, array( 'jquery_ui_css' ), AALB_PLUGIN_CURRENT_VERSION );
75
+ wp_enqueue_style( 'aalb_admin_css', AALB_ADMIN_CSS, array( 'jquery_ui_css' ), AALB_PLUGIN_CURRENT_VERSION );
76
+
77
  wp_enqueue_style( 'font_awesome_css', FONT_AWESOME_CSS );
78
  wp_enqueue_style( 'thickbox' );
79
  }
88
  wp_enqueue_script( 'jquery' );
89
  wp_enqueue_script( 'handlebars_js', HANDLEBARS_JS );
90
  wp_enqueue_script( 'aalb_sha2_js', AALB_SHA2_JS, array(), AALB_PLUGIN_CURRENT_VERSION );
91
+ wp_enqueue_script( 'jquery_ui', AALB_JQUERY_UI_JS );
92
+ wp_enqueue_script( 'aalb_admin_js', AALB_ADMIN_JS, array( 'handlebars_js', 'jquery', 'jquery_ui', 'aalb_sha2_js' ), AALB_PLUGIN_CURRENT_VERSION );
93
  wp_localize_script( 'aalb_admin_js', 'api_pref', $this->get_paapi_pref() );
94
  wp_localize_script( 'aalb_admin_js', 'aalb_strings', $this->get_aalb_strings() );
95
  }
129
  private function get_aalb_strings() {
130
  return array(
131
  "template_asin_error" => esc_html__( "Only one product can be selected for this template", 'amazon-associates-link-builder' ),
132
+ "no_asin_selected_error" => esc_html__( "Please select at least one product for these marketplaces:", 'amazon-associates-link-builder' ),
133
  "empty_product_search_bar" => esc_html__( "Please Enter a Product Name ", 'amazon-associates-link-builder' ),
134
  "short_code_create_failure" => esc_html__( "Failed to create Text Link shortcode. Editor has some text selected. Only one item can be selected while adding text links", 'amazon-associates-link-builder' ),
135
  /* translators: %s: Email-id of the support */
143
  "searchbox_placeholder" => esc_html__( "Enter keyword(s)", 'amazon-associates-link-builder' ),
144
  "search_button_label" => esc_html__( "Search", 'amazon-associates-link-builder' ),
145
  "associate_id_label" => esc_html__( "Tracking IDs", 'amazon-associates-link-builder' ),
146
+ "search_keyword_label" => esc_html__( "Search Phrase", 'amazon-associates-link-builder' ),
147
+ "select_associate_id_label" => esc_html__( "Select Tracking Id", 'amazon-associates-link-builder' ),
148
  "marketplace_label" => esc_html__( "Marketplace", 'amazon-associates-link-builder' ),
149
+ "select_marketplace_label" => esc_html__( "Select Marketplace", 'amazon-associates-link-builder' ),
150
  "text_shown_during_search" => esc_html__( "Searching relevant products from Amazon", 'amazon-associates-link-builder' ),
151
  "click_to_select_products_label" => esc_html__( "Click to select product(s) to advertise", 'amazon-associates-link-builder' ),
152
  "check_more_on_amazon_text" => esc_html__( "Check more search results on Amazon", 'amazon-associates-link-builder' ),
153
+ "selected_products_list_label" => esc_html__( "List of Selected Products(Maximum: 10)", 'amazon-associates-link-builder' ),
154
  "text_shown_during_shortcode_creation" => esc_html__( "Creating shortcode. Please wait....", 'amazon-associates-link-builder' ),
155
  "add_shortcode_button_label" => esc_html__( "Add Shortcode", 'amazon-associates-link-builder' ),
156
  "templates_help_content" => esc_html__( "To configure templates, go to Associates Link Builder plugin's Templates page", 'amazon-associates-link-builder' ),
157
  "marketplace_help_content" => esc_html__( "To configure marketplaces, go to Associates Link Builder plugin's Settings page", 'amazon-associates-link-builder' ),
158
+ "tracking_id_help_content" => esc_html__( "To configure tracking ids, go to Associates Link Builder plugin's Settings page", 'amazon-associates-link-builder' ),
159
+ "searched_products_box_placeholder" => esc_html__( "Please select marketplace from above to show products.", 'amazon-associates-link-builder' ),
160
+ "selected_products_box_placeholder" => esc_html__( "Please select some products from above.", 'amazon-associates-link-builder' ),
161
+ "pop_up_new_tab_label" => esc_html__( "Add ProductSet for Country", 'amazon-associates-link-builder' )
162
  );
163
  }
164
 
184
  //Clear all transients for price changes to reflect
185
  $this->helper->clear_cache_for_substring( '' );
186
  $this->helper->clear_expired_transients();
187
+ $this->helper->load_db_keys();
188
 
189
  global $wp_filesystem;
190
  $this->helper->aalb_initialize_wp_filesystem_api();
admin/css/aalb_admin.css CHANGED
@@ -24,7 +24,7 @@ input.aalb-admin-input-search {
24
  width: 190px;
25
  }
26
 
27
- .aalb-admin-searchbox a.aalb-admin-button-create-amazon-shortcode {
28
  box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.4) inset;
29
  background: transparent linear-gradient(to bottom, #F7DFA5, #F0C14B) repeat scroll 0% 0%;
30
  background-color: transparent;
@@ -65,7 +65,7 @@ html, body {
65
  display: none;
66
  }
67
 
68
- #aalb-admin-popup-content {
69
  padding-top: 5px;
70
  height: 50%;
71
  width: 100%;
@@ -144,11 +144,10 @@ html, body {
144
  padding: 5px;
145
  margin: 0 0 5px;
146
  width: 100%;
147
- height: 30%;
148
  -moz-box-sizing: border-box;
149
  -webkit-box-sizing: border-box;
150
  box-sizing: border-box;
151
- box-shadow: 2px 2px 4px 0 #ccc;
152
  border: 1px solid #CCC;
153
  border-radius: 4px;
154
  cursor: pointer;
@@ -226,24 +225,26 @@ and(-webkit-min-device-pixel-ratio: 0) {
226
  }
227
  }
228
  }
 
229
  /* fix for safari 10.1 */
230
- @media not all and (min-resolution:.001dpcm) {
231
  @media {
232
- .aalb-admin-item-search-items-item-title {
233
- position: initial;
234
- margin-left: 2em;
235
- margin-right: 0em;
236
- font-weight: bold;
237
- word-break: break-all;
238
- font-size: 1em;
239
- overflow: hidden;
240
- position: relative;
241
- line-height: 1.2em;
242
- max-height: 2.4em;
243
- text-align: justify;
244
- }
245
 
246
- }}
 
247
 
248
  .aalb-admin-item-search-items-item-price {
249
  font-size: 1em;
@@ -257,70 +258,39 @@ and(-webkit-min-device-pixel-ratio: 0) {
257
  border-color: #E77600;
258
  }
259
 
260
- .aalb-admin-popup-shortocde-wrapper {
261
- display: block;
262
- width: 100%;
263
- margin-top: 10px;
264
- padding-top: 5px;
265
- }
266
-
267
  .aalb-admin-popup-shortcode-options {
268
- padding-top: 3%;
269
  width: 100%;
270
- -moz-column-gap: 10px;
271
- -webkit-column-gap: 10px;
272
- column-gap: 10px;
273
- -moz-column-count: 3;
274
- -webkit-column-count: 3;
275
- column-count: 3;
276
- }
277
-
278
- .aalb-admin-popup-shortcode-options label {
279
- display: block;
280
- text-align: left;
281
  }
282
 
283
  .aalb-admin-item-search-templates {
284
- width: 100%;
285
- }
286
-
287
- .aalb-admin-popup-store {
288
- width: 100%;
289
  }
290
 
291
- .aalb-admin-item-search-marketplaces {
292
- width: 100%;
 
293
  }
294
 
295
  .aalb-add-shortcode-button {
296
- padding-top: 20px;
297
  bottom: 2px;
298
  position: absolute;
 
 
 
 
299
  }
300
 
301
- .aalb-admin-popup-options {
302
- position: relative;
303
- }
304
-
305
- #aalb-admin-popup-input-search {
306
- position: absolute;
307
- width: 100%;
308
- left: 0;
309
- margin-top: 1%;
310
- height: 33px;
311
- vertical-align: middle;
312
  border: 1px solid #F0C14B;
313
- }
314
-
315
- #aalb-admin-popup-search-button {
316
- position: absolute;
317
- right: 0;
318
  }
319
 
320
  .aalb-selected {
321
  height: auto;
322
  width: 100%;
323
- padding-top: 10px;
324
  padding-bottom: 10px;
325
  }
326
 
@@ -330,6 +300,13 @@ and(-webkit-min-device-pixel-ratio: 0) {
330
  padding: 15px 0px;
331
  }
332
 
 
 
 
 
 
 
 
333
  .aalb-selected-item {
334
  border: 1px solid #eee;
335
  float: left;
@@ -403,10 +380,6 @@ and(-webkit-min-device-pixel-ratio: 0) {
403
  display: none;
404
  }
405
 
406
- .aalb-admin-searchbox.aalb-admin-popup-options {
407
- margin-bottom: 15px;
408
- }
409
-
410
  #aalb-add-asin-error {
411
  padding: 2px;
412
  display: inline;
@@ -420,8 +393,8 @@ and(-webkit-min-device-pixel-ratio: 0) {
420
  display: block;
421
  }
422
 
423
- #aalb_template_names_list , #aalb-admin-popup-store-id , #aalb_marketplace_names_list {
424
- width: 100%;
425
  }
426
 
427
  input.aalb-admin-input-search:focus {
@@ -429,9 +402,9 @@ input.aalb-admin-input-search:focus {
429
  }
430
 
431
  #aalb-add-shortcode-button:disabled {
432
- cursor : not-allowed;
433
- background : transparent;
434
- opacity : 0.2;
435
  }
436
 
437
  .aalb-admin-inline.aalb-admin-searchbox:hover .aalb-admin-searchbox-tooltip-text {
@@ -460,7 +433,7 @@ input.aalb-admin-input-search:disabled {
460
  bottom: 60%;
461
  width: 290px;
462
  box-shadow: 3px 3px 10px 0px rgba(44, 50, 50, 0.76);
463
- border: 1px black;
464
  font-size: 12px;
465
  }
466
 
@@ -476,4 +449,90 @@ input.aalb-admin-input-search:disabled {
476
 
477
  .aalb-info-icon::before {
478
  margin-left: 5px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
479
  }
24
  width: 190px;
25
  }
26
 
27
+ .aalb-admin-searchbox a.aalb-admin-button-create-amazon-shortcode {
28
  box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.4) inset;
29
  background: transparent linear-gradient(to bottom, #F7DFA5, #F0C14B) repeat scroll 0% 0%;
30
  background-color: transparent;
65
  display: none;
66
  }
67
 
68
+ .aalb-admin-popup-content {
69
  padding-top: 5px;
70
  height: 50%;
71
  width: 100%;
144
  padding: 5px;
145
  margin: 0 0 5px;
146
  width: 100%;
147
+ height: 80px;
148
  -moz-box-sizing: border-box;
149
  -webkit-box-sizing: border-box;
150
  box-sizing: border-box;
 
151
  border: 1px solid #CCC;
152
  border-radius: 4px;
153
  cursor: pointer;
225
  }
226
  }
227
  }
228
+
229
  /* fix for safari 10.1 */
230
+ @media not all and (min-resolution: .001dpcm) {
231
  @media {
232
+ .aalb-admin-item-search-items-item-title {
233
+ position: initial;
234
+ margin-left: 2em;
235
+ margin-right: 0;
236
+ font-weight: bold;
237
+ word-break: break-all;
238
+ font-size: 1em;
239
+ overflow: hidden;
240
+ position: relative;
241
+ line-height: 1.2em;
242
+ max-height: 2.4em;
243
+ text-align: justify;
244
+ }
245
 
246
+ }
247
+ }
248
 
249
  .aalb-admin-item-search-items-item-price {
250
  font-size: 1em;
258
  border-color: #E77600;
259
  }
260
 
 
 
 
 
 
 
 
261
  .aalb-admin-popup-shortcode-options {
262
+ display: inline-block;
263
  width: 100%;
 
 
 
 
 
 
 
 
 
 
 
264
  }
265
 
266
  .aalb-admin-item-search-templates {
267
+ display: inline-block;
 
 
 
 
268
  }
269
 
270
+ .aalb-admin-item-search-templates {
271
+ margin-top: 2px;
272
+ margin-bottom: 3px;
273
  }
274
 
275
  .aalb-add-shortcode-button {
 
276
  bottom: 2px;
277
  position: absolute;
278
+ width: 97%;
279
+ margin-left: -1%;
280
+ background: #ffffff;
281
+ z-index: 1000;
282
  }
283
 
284
+ .aalb-admin-popup-input-search {
 
 
 
 
 
 
 
 
 
 
285
  border: 1px solid #F0C14B;
286
+ width: 95%;
287
+ height: 28px;
 
 
 
288
  }
289
 
290
  .aalb-selected {
291
  height: auto;
292
  width: 100%;
293
+ margin-top: 20px;
294
  padding-bottom: 10px;
295
  }
296
 
300
  padding: 15px 0px;
301
  }
302
 
303
+ .aalb-selected-placeholder {
304
+ color: #a9a9a9;
305
+ margin-left: 17px;
306
+ margin-top: 8px;
307
+ font-size: 18px;
308
+ }
309
+
310
  .aalb-selected-item {
311
  border: 1px solid #eee;
312
  float: left;
380
  display: none;
381
  }
382
 
 
 
 
 
383
  #aalb-add-asin-error {
384
  padding: 2px;
385
  display: inline;
393
  display: block;
394
  }
395
 
396
+ #aalb_template_names_list {
397
+ width: 200px;
398
  }
399
 
400
  input.aalb-admin-input-search:focus {
402
  }
403
 
404
  #aalb-add-shortcode-button:disabled {
405
+ cursor: not-allowed;
406
+ background: transparent;
407
+ opacity: 0.2;
408
  }
409
 
410
  .aalb-admin-inline.aalb-admin-searchbox:hover .aalb-admin-searchbox-tooltip-text {
433
  bottom: 60%;
434
  width: 290px;
435
  box-shadow: 3px 3px 10px 0px rgba(44, 50, 50, 0.76);
436
+ border: 1px #000000;
437
  font-size: 12px;
438
  }
439
 
449
 
450
  .aalb-info-icon::before {
451
  margin-left: 5px;
452
+ }
453
+
454
+ #aalb-tabs li .ui-icon-close {
455
+ float: left;
456
+ margin: 0.4em 0.2em 0 0;
457
+ cursor: pointer;
458
+ }
459
+
460
+ .aalb-pop-up-tabs {
461
+ width: 100%;
462
+ border: 1px solid #e78f08;
463
+ }
464
+
465
+ #aalb-tabs {
466
+ padding: 0;
467
+ }
468
+
469
+ .aalb-pop-up-tabs ul {
470
+ background: #ededed;
471
+ padding: 0;
472
+ border-top: 0;
473
+ border-left: 0;
474
+ border-right: 0;
475
+ }
476
+
477
+ .aalb-pop-up-tabs ul li {
478
+ background: #ededed;
479
+ border: 0.1px solid #ededed;
480
+ }
481
+
482
+ #aalb-tabs .ui-state-active {
483
+ background: #ffffff !important;
484
+ border-bottom: 0;
485
+ }
486
+
487
+ #aalb-add-marketplace-tab {
488
+ size: 70px;
489
+ cursor: pointer;
490
+ }
491
+
492
+ .aalb-templates-label {
493
+ vertical-align: middle;
494
+ }
495
+
496
+ .aalb-admin-popup-fieldset {
497
+ border: 1px solid #778899;
498
+ border-radius: 5px;
499
+ min-height: 150px;
500
+ padding-right: 4px;
501
+ padding-left: 4px;
502
+ }
503
+
504
+ .aalb-admin-popup-legend {
505
+ margin-left: 5px;
506
+ }
507
+
508
+ .aalb-admin-popup-placeholder {
509
+ margin-top: 15px;
510
+ }
511
+
512
+ .aalb-admin-popup-more-results {
513
+ margin-bottom: 3px;
514
+ }
515
+
516
+ .aalb-table-cell {
517
+ display: table-cell;
518
+ }
519
+
520
+ .aalb-table {
521
+ display: table;
522
+ }
523
+
524
+ .aalb-table-row {
525
+ display: table-row;
526
+ }
527
+
528
+ .aalb-width-25 {
529
+ width: 25%
530
+ }
531
+
532
+ .aalb-width-40 {
533
+ width: 40%
534
+ }
535
+
536
+ .aalb-width-10 {
537
+ width: 10%
538
  }
admin/css/aalb_credentials.css CHANGED
@@ -22,7 +22,7 @@ td.aalb-settings-input-column {
22
  width: 90%;
23
  }
24
 
25
- .aalb-settings-no-referrer-text {
26
  font-size: 110%;
27
  }
28
 
@@ -70,4 +70,8 @@ a.aalb-remove-marketplace {
70
 
71
  #aalb-remove-marketplace-confirmation-container {
72
  display: none;
 
 
 
 
73
  }
22
  width: 90%;
23
  }
24
 
25
+ .aalb-font-size-110 {
26
  font-size: 110%;
27
  }
28
 
70
 
71
  #aalb-remove-marketplace-confirmation-container {
72
  display: none;
73
+ }
74
+
75
+ .aalb-is-upload-in-plugin-column {
76
+ width: 58%;
77
  }
admin/js/aalb_admin.js CHANGED
@@ -10,572 +10,839 @@
10
  and limitations under the License.
11
  */
12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
 
14
- /*
15
- List of tasks to be done in this file for improving code quality and to ease development and reduce chances of bugs.
16
- ToDo: Put everything under closure to avoid name conflicts(remove aalb prefix from methods & variables after this) and making internal functionality private
17
- ToDO: The variables under documet.ready by default(without closures) can create conflicts with same named varaibles from other files like "old_tb_remove"
18
- ToDO: Add mustache templating in the meta_box and remove html code from this js to separate business logic & html
19
- */
 
 
20
 
21
- var template;
22
- var TB_WIDTH, TB_HEIGHT;
23
- var tb_remove;
24
- var link_id = "";
25
- var AALB_SHORTCODE_AMAZON_LINK = api_pref.AALB_SHORTCODE_AMAZON_LINK; //constant value from server side is reused here
26
- var AALB_SHORTCODE_AMAZON_TEXT = api_pref.AALB_SHORTCODE_AMAZON_TEXT;
27
- var IS_PAAPI_CREDENTIALS_NOT_SET = api_pref.IS_PAAPI_CREDENTIALS_NOT_SET;
28
- var IS_STORE_ID_CREDENTIALS_NOT_SET = api_pref.IS_STORE_ID_CREDENTIALS_NOT_SET;
29
- //object used as map to check duplicate asin selected by admin
30
- var asin_map = {};
31
- var SINGLE_ASIN_TEMPLATE = {
32
- PriceLink : 'true',
33
- ProductAd : 'true',
34
- ProductLink: 'true'
35
- };
36
-
37
- var aalb_marketplace_store_id_mapping = jQuery.parseJSON( api_pref.marketplace_store_id_map );
38
- var aalb_default_marketplace = api_pref.default_marketplace;
39
- var aalb_default_store_id_list = aalb_marketplace_store_id_mapping ? aalb_marketplace_store_id_mapping[ aalb_default_marketplace ] : [];
40
- var aalb_search_pop_up_context = {
41
- "ad_template_label" : aalb_strings.ad_template_label,
42
- "searchbox_placeholder" : aalb_strings.searchbox_placeholder,
43
- "search_button_label" : aalb_strings.search_button_label,
44
- "associate_id_label" : aalb_strings.associate_id_label,
45
- "marketplace_label" : aalb_strings.marketplace_label,
46
- "text_shown_during_search" : aalb_strings.text_shown_during_search,
47
- "click_to_select_products_label" : aalb_strings.click_to_select_products_label,
48
- "check_more_on_amazon_text" : aalb_strings.check_more_on_amazon_text,
49
- "selected_products_list_label" : aalb_strings.selected_products_list_label,
50
- "text_shown_during_shortcode_creation": aalb_strings.text_shown_during_shortcode_creation,
51
- "add_shortcode_button_label" : aalb_strings.add_shortcode_button_label,
52
- "templates_help_content" : aalb_strings.templates_help_content,
53
- "marketplace_help_content" : aalb_strings.marketplace_help_content,
54
- "tracking_id_help_content" : aalb_strings.tracking_id_help_content,
55
- "templates_list" : jQuery.parseJSON( api_pref.templates_list ),
56
- "default_template" : api_pref.default_template,
57
- "marketplace_list" : aalb_marketplace_store_id_mapping ? Object.keys( aalb_marketplace_store_id_mapping ) : "",
58
- "default_marketplace" : aalb_default_marketplace,
59
- "default_store_id_list" : aalb_default_store_id_list,
60
- "default_store_id" : aalb_default_store_id_list ? aalb_default_store_id_list[ 0 ] : ""
61
- };
62
-
63
- jQuery( document ).ready( function() {
64
- aalb_load_search_pop_up();
65
- // http://stackoverflow.com/questions/5557641/how-can-i-reset-div-to-its-original-state-after-it-has-been-modified-by-java
66
- jQuery( "#aalb-admin-popup-content" ).data( 'old-state', jQuery( "#aalb-admin-popup-content" ).html() );
67
-
68
- //Load the search result template
69
- var aalb_hbs_admin_items_search_source = jQuery( "#aalb-hbs-admin-items-search" ).html();
70
- if( aalb_hbs_admin_items_search_source != null ) {
71
- template = Handlebars.compile( aalb_hbs_admin_items_search_source );
72
- }
73
-
74
-
75
- //Resize thickbox on window resize
76
- jQuery( window ).on( 'resize', resize_thickbox );
77
-
78
- //Storing the tb_remove function of Thickbox.js
79
- var old_tb_remove = window.tb_remove;
80
-
81
- //Custom tb_remove function
82
- tb_remove = function() {
83
- aalb_reset_add_short_button_and_error_warnings();
84
- //re initializing asin_map on window remove
85
- asin_map = {};
86
- //call actual tb_remove
87
- old_tb_remove();
88
- //custom actions to execute
89
- jQuery( ".aalb-selected-item" ).each( function() {
90
- aalb_remove_selected_item( this );
91
- } );
92
  };
93
 
94
- /**
95
- * TO check the number of selected products on template change
96
- **/
97
- jQuery( '#aalb_template_names_list' ).on( 'change', function() {
98
- var user_selected_template = aalb_get_selected_template();
99
- var selected_products = jQuery( 'div.aalb-selected-item[data-asin]' ).length || 0;
100
- var aalb_add_short_code_button = jQuery( '#aalb-add-shortcode-button' );
101
- //checking for user selected template and number of products selected by user
102
- if( ( selected_products > 1 ) && SINGLE_ASIN_TEMPLATE[ user_selected_template ] ) {
103
- jQuery( '#aalb-add-template-asin-error' ).text( aalb_strings.template_asin_error );
104
- aalb_add_short_code_button.prop( 'disabled', true );
105
 
106
- } else {
107
- aalb_add_short_code_button.prop( 'disabled', false );
108
- jQuery( '#aalb-add-template-asin-error' ).text( '' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
109
  }
110
  } );
111
 
112
  /**
113
- * To fill the store-ids as per markeplace in Associate Id section on changing marketplace
114
- **/
115
- jQuery( '#aalb_marketplace_names_list' ).on( 'change', function() {
116
- jQuery( '#aalb-admin-popup-store-id' ).empty();
117
- jQuery.each( aalb_marketplace_store_id_mapping[ jQuery( this ).val() ], function( key, store_id ) {
118
- jQuery( '#aalb-admin-popup-store-id' ).append( '<option>' + store_id + '</option>' );
119
- } );
120
- } );
 
 
 
 
 
 
121
 
122
- if( IS_PAAPI_CREDENTIALS_NOT_SET ) {
123
- aalb_disable_editor_search( aalb_strings.paapi_credentials_not_set );
124
- } else if( IS_STORE_ID_CREDENTIALS_NOT_SET ) {
125
- aalb_disable_editor_search( aalb_strings.store_id_credentials_not_set );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
126
  }
127
- } );
128
 
129
- /**
130
- * Load search pop-up box
131
- *
132
- * @since 1.4.12
133
- */
134
- function aalb_load_search_pop_up() {
135
- Handlebars.registerHelper( 'selected', function( current_option, selected_option ) {
136
- return (current_option === selected_option) ? 'selected' : '';
137
- } );
138
- var aalb_search_pop_up_hbs = jQuery( "#aalb-search-pop-up-hbs" ).html();
139
- if( aalb_search_pop_up_hbs != null ) {
140
- var aalb_search_pop_up_template = Handlebars.compile( aalb_search_pop_up_hbs );
141
- var aalb_search_pop_up_html = aalb_search_pop_up_template( aalb_search_pop_up_context );
142
- jQuery( "#aalb-admin-popup-container" ).prepend( aalb_search_pop_up_html );
143
  }
144
- }
145
 
146
- /**
147
- * Resizing thickbox on change in window dimensions
148
- * Setting a max width and height of 1280x800 px for readability and to lessen distortion
149
- */
150
- function resize_thickbox() {
151
- TB_WIDTH = Math.min( 1280, 0.6 * jQuery( window ).width() );
152
- TB_HEIGHT = Math.min( 800, 0.9 * jQuery( window ).height() );
153
- jQuery( document ).find( '#TB_ajaxContent' ).width( TB_WIDTH - 35 ).height( TB_HEIGHT - 90 );
154
- jQuery( document ).find( '#TB_window' ).width( TB_WIDTH ).height( TB_HEIGHT );
155
- jQuery( document ).find( '#TB_window' ).css( { marginLeft: '-' + TB_WIDTH / 2 + 'px', top: TB_HEIGHT / 12 } );
156
- jQuery( document ).find( '#TB_window' ).removeClass();
157
- }
158
-
159
- /**
160
- * Ensure a button click on a return key press event
161
- * Caller element and button_to_click_class needs to be part of a container having class name aalb-admin-searchbox.
162
- *
163
- * @param HTML_DOM_EVENT event OnKeyPress event
164
- * @param string button_to_click_class name of a button to click on a return key press event
165
- * @param HTMLElement caller_element caller of this function
166
- *
167
- * @since 1.4.3 added param caller_element and modified param button_to_click_class
168
- */
169
- function aalb_submit_event( event, button_to_click_class, caller_element ) {
170
- //Code for the RETURN key is 13
171
- if ( event.keyCode == 13 ) {
172
- event.preventDefault();
173
- //Find button to click in the container and invoke a click event.
174
- var container_search_box = jQuery( caller_element ).closest( ".aalb-admin-searchbox" );
175
- jQuery( container_search_box ).find( '.' + button_to_click_class ).click();
176
- }
177
- }
178
-
179
- /**
180
- * Removes the selected HTML element
181
- *
182
- * @param HTMLElement element HTML element to be removed.
183
- */
184
- function aalb_remove_selected_item( element ) {
185
- jQuery( element ).remove();
186
- }
187
-
188
- /**
189
- * Display pop up thickbox
190
- *
191
- * @param HTMLElement search_button reference to the clicked button element to get to the keyword of interest.
192
- *
193
- * @since 1.4.3 added param search_button
194
- */
195
- function aalb_admin_show_create_shortcode_popup( search_button ) {
196
- // Retain content from old state of pop content primarily input text of search box.
197
- // http://stackoverflow.com/questions/5557641/how-can-i-reset-div-to-its-original-state-after-it-has-been-modified-by-java
198
- jQuery( "#aalb-admin-popup-content" ).html( jQuery( "#aalb-admin-popup-content" ).data( 'old-state' ) );
199
 
200
- var editor_selected_text = aalb_get_selected_text_from_editor();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
201
 
202
- if ( editor_selected_text ) {
203
- //Make ProductLink template as a default choice of template when some text is selected.
204
- jQuery( "#aalb_template_names_list" ).val( 'ProductLink' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
205
  }
206
 
207
- var editor_search_box_input = jQuery( search_button ).siblings( ".aalb-admin-input-search" );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
208
 
209
- var search_keywords = editor_selected_text || editor_search_box_input.val();
210
- if ( search_keywords ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
211
 
212
- tb_show( aalb_strings.add_aalb_shortcode, '#TB_inline?inlineId=aalb-admin-popup-container', false );
213
- resize_thickbox();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
214
 
215
- // Getting the ItemSearch results
216
- aalb_admin_get_item_search_items( search_keywords );
 
 
 
 
 
 
 
 
 
 
 
217
 
218
- //Setting search input of shortcode popup with search keyword.
219
- jQuery( "#aalb-admin-popup-input-search" ).attr( 'value', search_keywords );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
220
 
221
- //Setting editor search input with search keyword.
222
- editor_search_box_input.attr( 'value', search_keywords );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
223
 
224
- } else {
225
- alert( aalb_strings.empty_product_search_bar );
226
- editor_search_box_input.focus();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
227
  }
228
- }
229
 
230
- /**
231
- * Search items from within the thickbox
232
- */
233
- function aalb_admin_popup_search_items() {
234
- var keywords = jQuery( "#aalb-admin-popup-input-search" ).val();
235
- jQuery( "#aalb-admin-popup-content" ).html( jQuery( "#aalb-admin-popup-content" ).data( 'old-state' ) );
236
- if ( keywords ) {
237
- // Getting the ItemSearch results
238
- aalb_admin_get_item_search_items( keywords );
239
- jQuery( "#aalb-admin-popup-input-search" ).attr( 'value', keywords );
240
-
241
- } else {
242
- alert( aalb_strings.empty_product_search_bar );
243
- jQuery( "#aalb-admin-popup-input-search" ).focus();
244
- }
245
- }
246
-
247
- /**
248
- * Search items for the keywords and display it in the pop up thickbox
249
- *
250
- * @param String keywords Items to search for.
251
- */
252
- function aalb_admin_get_item_search_items( keywords ) {
253
- jQuery.ajax({
254
- url: api_pref.ajax_url,
255
- type: 'GET',
256
- data: {
257
- "action": api_pref.action,
258
- "item_search_nonce": api_pref.item_search_nonce,
259
- "keywords": keywords,
260
- "marketplace": aalb_get_selected_marketplace(),
261
- "store_id": aalb_get_selected_store()
262
- },
263
- success: function( xml ) {
264
- var items_xml = jQuery( xml ).find( "Item" );
265
- if ( items_xml.length > 0 ) {
266
- var items = [];
267
- var i = 0;
268
- items_xml.each( function() {
269
- //selecting maximum of max_search_result_items elements
270
- if ( i < api_pref.max_search_result_items ) {
271
- var item = {};
272
- item.asin = jQuery( this ).find( "ASIN" ).text();
273
- item.title = jQuery( this ).find( "Title" ).text();
274
- item.image = jQuery( this ).find( "LargeImage" ).first().find( "URL" ).text();
275
- item.price = jQuery( this ).find( "LowestNewPrice" ).find( "FormattedPrice" ).text();
276
- items.push( item );
277
- }
278
- i++;
279
- } );
280
-
281
- var html = template( items );
282
- jQuery( ".aalb-admin-item-search-items" ).append( html );
283
- jQuery( "#aalb-admin-popup-more-results" ).attr( 'href', jQuery( xml ).find( "MoreSearchResultsUrl" ).text() );
284
- jQuery( ".aalb-admin-item-search-loading" ).slideUp( "slow" );
285
- jQuery( ".aalb-admin-item-search" ).fadeIn( "slow" );
286
- jQuery( ".aalb-admin-item-search-items-item" ).on( "click", function() {
287
-
288
- var data_asin = jQuery( this ).attr( "data-asin" );
289
- //return on duplicate asin selected
290
- if( !aalb_validate_asins( data_asin, 'add' ) ) {
291
- return;
292
- }
293
- var productImage = jQuery( this ).find( "img" ).attr( "src" );
294
- var productTitle = jQuery( this ).find( "div.aalb-admin-item-search-items-item-title" ).text();
295
- var productPrice = jQuery( this ).find( "div.aalb-admin-item-search-items-item-price" ).text();
296
- //ToDO: 1. See if handlebars can be leveraged here like in credentials.js
297
- //ToDO: 2. Remove inline event handler 'onClick'
298
- var selectedAsinHTML = '<div class="aalb-selected-item" onclick="aalb_remove_asin(this)"';
299
- selectedAsinHTML += ' data-asin="' + data_asin + '">';
300
- selectedAsinHTML += '<div class="aalb-selected-item-img-wrap"><span class="aalb-selected-item-close">&times;</span>';
301
- selectedAsinHTML += '<img class="aalb-selected-item-img" src="' + productImage + '"></img></div>';
302
- selectedAsinHTML += '<div class="aalb-selected-item-title"><h3>' + productTitle + '</h3>';
303
- selectedAsinHTML += '<p class="aalb-selected-item-price">' + productPrice + '<br></p></div>';
304
-
305
- jQuery( ".aalb-selected" ).append( selectedAsinHTML );
306
- } );
307
- } else {
308
- errors_xml = jQuery( xml ).find( "Error" );
309
- if ( errors_xml.length > 0 ) {
310
- var htmlerror = "";
311
- errors_xml.each( function() {
312
- htmlerror += jQuery( this ).find( "Message" ).text() + "<br>";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
313
  } );
314
- jQuery( ".aalb-admin-item-search-loading" ).html( htmlerror );
 
 
 
 
 
315
  } else {
316
- jQuery( ".aalb-admin-item-search-loading" ).html( xml );
 
 
 
 
 
 
 
 
 
317
  }
318
- }
319
- },
320
- error: function( request, status ) {
321
- if( status === "timeout" ) {
322
- jQuery( ".aalb-admin-item-search-loading" ).html( aalb_strings.paapi_request_timeout_error );
323
- } else {
324
- jQuery( ".aalb-admin-item-search-loading" ).html( "An Error Occurred : " + status );
325
- }
326
- },
327
- timeout: api_pref.WORDPRESS_REQUEST_TIMEOUT
328
- });
329
- jQuery( "#aalb-add-shortcode-button" ).unbind().click( function() {
330
- var selectedAsins = aalb_get_selected_asins();
331
- var selected = aalb_get_selected_text_from_editor();
332
- if ( selectedAsins ) {
333
- if ( selected ) {
334
- /* If there was some text selected in the wordpress post editor. Implies amazon_textlink */
335
- var selectedAsinsLength = selectedAsins.split( "," ).length;
336
- if ( selectedAsinsLength > 1 ) {
337
- alert( aalb_strings.short_code_create_failure );
 
 
 
338
  } else {
339
- jQuery( "#aalb-add-shortcode-alert" ).fadeTo( "fast", 1 );
340
- aalb_add_shortcode( AALB_SHORTCODE_AMAZON_TEXT );
341
  }
342
  } else {
343
- jQuery( "#aalb-add-shortcode-alert" ).fadeTo( "fast", 1 );
344
- aalb_add_shortcode( AALB_SHORTCODE_AMAZON_LINK );
345
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
346
  } else {
347
- alert( aalb_strings.no_asin_selected_error );
 
348
  }
349
- } );
350
- }
351
 
352
- /**
353
- * Adds the given shortcode to the editor
354
- *
355
- * @param String Shortcode type to be added
356
- */
357
- function aalb_add_shortcode( shortcodeName ) {
358
- var shortcodeJson;
359
- var selectedAsins = aalb_get_selected_asins();
360
- var selectedTemplate = aalb_get_selected_template();
361
- var selectedStore = aalb_get_selected_store();
362
- var selectedMarketplace = aalb_get_selected_marketplace();
363
-
364
- if ( shortcodeName == AALB_SHORTCODE_AMAZON_LINK ) {
365
- shortcodeJson = {
366
- "name": AALB_SHORTCODE_AMAZON_LINK,
367
- "params": {
368
- "asins": selectedAsins,
369
- "template": selectedTemplate,
370
- "store": selectedStore,
371
- "marketplace": selectedMarketplace,
372
- }
373
- };
374
- } else if ( shortcodeName == AALB_SHORTCODE_AMAZON_TEXT ) {
375
- shortcodeJson = {
376
- "name": AALB_SHORTCODE_AMAZON_TEXT,
377
- "params": {
378
- "asin": selectedAsins,
379
- "text": aalb_get_selected_text_from_editor(),
380
- "template": selectedTemplate,
381
- "store": selectedStore,
382
- "marketplace": selectedMarketplace,
383
  }
384
- };
385
- } else {
386
- console.log( "Invalid Shortcode provided!" );
387
- return;
388
- }
389
- aalb_get_link_id( shortcodeJson );
390
- }
391
-
392
- /**
393
- * Handler function when the Add Shortcode button is clicked
394
- * and link id is retrieved.
395
- *
396
- * @param Object shortcodeJson Object describing the shortcode
397
- */
398
- function aalb_add_shortcode_click_handler( shortcodeJson ) {
399
- aalb_create_shortcode( shortcodeJson );
400
- tb_remove();
401
- }
402
-
403
- /**
404
- * Builds shortcode from given JSON
405
- *
406
- * @param Object shortcodeJson Object describing the shortcode
407
- *
408
- * @return String returns the Shortcode String
409
- */
410
- function buildShortcode( shortcodeJson ) {
411
- var shortcodeParamsString = "";
412
- for ( var shortcodeParam in shortcodeJson.params ) {
413
- if ( shortcodeJson.params.hasOwnProperty( shortcodeParam ) ) {
414
- shortcodeParamsString += " " + shortcodeParam + "='" + shortcodeJson.params[ shortcodeParam ] + "'";
415
  }
 
 
 
416
  }
417
 
418
- var shortcodeString = "[" + shortcodeJson.name + shortcodeParamsString + "]";
419
- return shortcodeString;
420
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
421
 
422
- /**
423
- * Get unique link id whenever add shortcode button is clicked
424
- *
425
- * @param Object shortcodeJson Object describing the shortcode
426
- */
427
- function aalb_get_link_id( shortcodeJson ) {
428
- jQuery.post( api_pref.ajax_url, {
429
- "action": "get_link_code", "shortcode_name": shortcodeJson.name, "shortcode_params": shortcodeJson.params
430
- } ).success( function( data ) {
431
- link_id = data;
432
- } ).fail( function() {
433
- link_id = "";
434
- } ).always( function() {
435
- shortcodeJson.params.link_id = link_id;
436
- jQuery( "#aalb-add-shortcode-alert" ).fadeTo( "slow", 0 );
437
- aalb_add_shortcode_click_handler( shortcodeJson );
438
- } );
439
- }
440
 
441
- /**
442
- * Add the shortcode to the display editor
443
- *
444
- * @param Object shortcodeJson Object describing the shortcode
445
- */
446
- function aalb_create_shortcode( shortcodeJson ) {
447
- send_to_editor( buildShortcode( shortcodeJson ) );
448
- }
449
-
450
- /**
451
- * Get the selected Asins
452
- *
453
- * @return String Selected Asins
454
- */
455
- function aalb_get_selected_asins() {
456
- var selectedAsins = "";
457
- jQuery( ".aalb-selected-item" ).each( function() {
458
- selectedAsins += jQuery( this ).attr( "data-asin" ) + ",";
459
- } );
460
- return selectedAsins.slice( 0, -1 );
461
- }
462
 
463
- /**
464
- * Get the selected Template style
465
- *
466
- * @return String Selected Template style
467
- */
468
- function aalb_get_selected_template() {
469
- var selectedTemplate = "";
470
- var $selectedTemplate = jQuery( "#aalb_template_names_list option:selected" );
471
- if ( $selectedTemplate.length > 0 ) {
472
- selectedTemplate = $selectedTemplate.val();
473
- }
474
- return selectedTemplate;
475
- }
476
-
477
- /**
478
- * Get the selected associate tag
479
- *
480
- * @return String Selected Associate tag
481
- */
482
- function aalb_get_selected_store() {
483
- return jQuery( '#aalb-admin-popup-store-id' ).val();
484
- }
485
-
486
- /**
487
- * Get the selected marketplace
488
- *
489
- * @return String Selected Marketplace to search the product
490
- */
491
- function aalb_get_selected_marketplace() {
492
- return jQuery( "#aalb_marketplace_names_list" ).val();
493
- }
494
-
495
- /**
496
- * Get selected text from the editor.
497
- *
498
- * @return String Selected text from the wordpress post editor.
499
- */
500
- function aalb_get_selected_text_from_editor() {
501
- if ( tinyMCE.activeEditor ) {
502
- return tinyMCE.activeEditor.selection.getContent( { format: "text" } );
503
- } else {
504
- return null;
505
- }
506
- }
507
-
508
- /**
509
- * To check the validity of ASIN based on different actions
510
- *
511
- * @param String Asin ASIN of Product selected by Admin
512
- * @param String action Admin action either 'add' or 'remove'
513
- *
514
- * @return Boolean true if single ASIN is selected or false on multiple ASIN selected
515
- **/
516
- function aalb_validate_asins( asin, action ) {
517
- var count_of_selected_items = jQuery( '.aalb-selected-item' ).length;
518
- var selected_template = aalb_get_selected_template();
519
- var aalb_add_short_code_button = jQuery( '#aalb-add-shortcode-button' );
520
- var max_allowed_items;
521
- if( action === 'add' ) {
522
- max_allowed_items = 0;
523
-
524
- //if ASIN is already present no need to add the ASIN
525
- if( !asin_map[ asin ] ) {
526
- asin_map[ asin ] = 1;
527
  } else {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
528
  return false;
529
  }
530
- } else if( action === 'remove' ) {
531
- max_allowed_items = 1;
532
- delete asin_map[ asin ];
533
- }
534
-
535
- var template_asin_error = ( count_of_selected_items > max_allowed_items ) && SINGLE_ASIN_TEMPLATE[ selected_template ];
536
-
537
- if( ( !template_asin_error ) ) {
538
- aalb_reset_add_short_button_and_error_warnings();
539
- } else {
540
- jQuery( '#aalb-add-template-asin-error' ).text( aalb_strings.template_asin_error );
541
- aalb_add_short_code_button.prop( 'disabled', true );
542
- }
543
- return true;
544
- }
545
-
546
- /**
547
- * To remove ASIN element from list
548
- *
549
- * @param element HTMLDivElement
550
- **/
551
- function aalb_remove_asin( element ) {
552
- var removed_product_asin = element.getAttribute( 'data-asin' );
553
- jQuery( element ).remove();
554
- aalb_validate_asins( removed_product_asin , 'remove' );
555
- }
556
-
557
- /**
558
- * To enable add short code button and remove template asin error
559
- **/
560
- function aalb_reset_add_short_button_and_error_warnings() {
561
- var aalb_add_short_code_button = jQuery( '#aalb-add-shortcode-button' );
562
- aalb_add_short_code_button.prop( 'disabled', false );
563
- jQuery( '#aalb-add-template-asin-error' ).text( '' );
564
- }
565
-
566
- /**
567
- * To disable editor search for AALB plugin along with message
568
- *
569
- * @param String error_msg Error message
570
- *
571
- * @since 1.4.12
572
- *
573
- **/
574
- function aalb_disable_editor_search( error_msg ) {
575
- jQuery( ".aalb-admin-button-create-amazon-shortcode" ).addClass( 'aalb-admin-button-create-amazon-shortcode-disabled' );
576
- jQuery( ".aalb-admin-input-search" ).prop( 'disabled', true );
577
- var aalb_admin_searchbox_tooltip = jQuery( '.aalb-admin-editor-tooltip' );
578
- aalb_admin_searchbox_tooltip.html( error_msg );
579
- aalb_admin_searchbox_tooltip.addClass( 'aalb-admin-searchbox-tooltip-text' );
580
- aalb_admin_searchbox_tooltip.removeClass( 'aalb-admin-hide-display' );
581
- }
10
  and limitations under the License.
11
  */
12
 
13
+ //ToDo: Create the JSON in contexts in PHP instead of creating here and pass directly to Handlebars
14
+ //ToDO: Deep-dive to find out if event bubbling with single target is a better option and instead of having a common parent for event delgation with capturing
15
+
16
+ (function( $ ) {
17
+ var SELECT_DROPDOWN_VALUE = "no-selection";
18
+ var SINGLE_ASIN_TEMPLATE = {
19
+ PriceLink : 'true',
20
+ ProductAd : 'true',
21
+ ProductLink: 'true'
22
+ };
23
+ var AALB_SHORTCODE_AMAZON_LINK = api_pref.AALB_SHORTCODE_AMAZON_LINK;
24
+ var AALB_SHORTCODE_AMAZON_TEXT = api_pref.AALB_SHORTCODE_AMAZON_TEXT;
25
+ var IS_PAAPI_CREDENTIALS_NOT_SET = api_pref.IS_PAAPI_CREDENTIALS_NOT_SET;
26
+ var IS_STORE_ID_CREDENTIALS_NOT_SET = api_pref.IS_STORE_ID_CREDENTIALS_NOT_SET;
27
+ var MAX_ALLOWED_ASINS_IN_SELECTION = 10;
28
+ var ENTER_KEY_CODE = 13;
29
+ var tb_remove = "";
30
+ var template;
31
+ var link_id = "";
32
+ var marketplace_store_id_mapping = $.parseJSON( api_pref.marketplace_store_id_map );
33
+ var default_marketplace = api_pref.default_marketplace;
34
+ var default_store_id_list = marketplace_store_id_mapping[ default_marketplace ] || [];
35
+ var default_store_id = default_store_id_list[ 0 ] || "";
36
+ var tabs = "";
37
+ //tab_counter will be appended to the new tab's id(#aalb_tab2) and will be incremented in code on every new tab addition. 1 is already assigned to default marketplace tab
38
+ var tab_counter = 2;
39
+ var marketplace_pop_up_json = [];
40
+ var keyword_for_search = "";
41
+
42
+ var meta_box_tab_context = {
43
+ "searchbox_placeholder" : aalb_strings.searchbox_placeholder,
44
+ "search_button_label" : aalb_strings.search_button_label,
45
+ "associate_id_label" : aalb_strings.associate_id_label,
46
+ "select_associate_id_label" : aalb_strings.select_associate_id_label,
47
+ "marketplace_label" : aalb_strings.marketplace_label,
48
+ "search_keyword_label" : aalb_strings.search_keyword_label,
49
+ "select_marketplace_label" : aalb_strings.select_marketplace_label,
50
+ "selected_products_list_label" : aalb_strings.selected_products_list_label,
51
+ "click_to_select_products_label" : aalb_strings.click_to_select_products_label,
52
+ "text_shown_during_shortcode_creation": aalb_strings.text_shown_during_shortcode_creation,
53
+ "marketplace_help_content" : aalb_strings.marketplace_help_content,
54
+ "tracking_id_help_content" : aalb_strings.tracking_id_help_content,
55
+ "searched_products_box_placeholder" : aalb_strings.searched_products_box_placeholder,
56
+ "selected_products_box_placeholder" : aalb_strings.selected_products_box_placeholder,
57
+ "marketplace_list" : marketplace_store_id_mapping ? Object.keys( marketplace_store_id_mapping ) : "",
58
+ "default_marketplace" : default_marketplace,
59
+ "default_store_id_list" : default_store_id_list,
60
+ "default_store_id" : default_store_id
61
+ };
62
 
63
+ var search_pop_up_context = {
64
+ "meta_box_tab_context" : meta_box_tab_context,
65
+ "add_shortcode_button_label": aalb_strings.add_shortcode_button_label,
66
+ "ad_template_label" : aalb_strings.ad_template_label,
67
+ "templates_help_content" : aalb_strings.templates_help_content,
68
+ "templates_list" : $.parseJSON( api_pref.templates_list ),
69
+ "default_template" : api_pref.default_template
70
+ };
71
 
72
+ var admin_pop_up_content_context = {
73
+ "text_shown_during_search" : aalb_strings.text_shown_during_search,
74
+ "check_more_on_amazon_text": aalb_strings.check_more_on_amazon_text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
  };
76
 
77
+ $( function() {
78
+ //Load the search result template
79
+ var hbs_admin_items_search_source = $( "#aalb-hbs-admin-items-search" ).html();
80
+ if( hbs_admin_items_search_source != null ) {
81
+ template = Handlebars.compile( hbs_admin_items_search_source );
82
+ }
 
 
 
 
 
83
 
84
+ //Resize thickbox on window resize
85
+ $( window ).on( 'resize', resize_thickbox );
86
+
87
+ //Storing the tb_remove function of Thickbox.js
88
+ var old_tb_remove = window.tb_remove;
89
+ //Custom tb_remove function
90
+ tb_remove = function() {
91
+ reset_add_short_button_and_error_warnings();
92
+ //call actual tb_remove
93
+ old_tb_remove();
94
+ //Emptying the array
95
+ marketplace_pop_up_json = [];
96
+ tab_counter = 2;
97
+ };
98
+
99
+ /**
100
+ * Bind template change using delegated events so that the binding remains when complete pop-up is removed(childs of #aalb-admin-pop-up) & added again
101
+ *
102
+ **/
103
+ $( '#aalb-admin-pop-up' ).on( 'change', '#aalb_template_names_list', function() {
104
+ var aalb_add_short_code_button = $( '#aalb-add-shortcode-button' );
105
+ //checking for user selected template and number of products selected by user
106
+ if( does_any_marketplace_contains_multiple_asin() && SINGLE_ASIN_TEMPLATE[ get_selected_template() ] ) {
107
+ $( '#aalb-add-template-asin-error' ).text( aalb_strings.template_asin_error );
108
+ aalb_add_short_code_button.prop( 'disabled', true );
109
+ } else {
110
+ aalb_add_short_code_button.prop( 'disabled', false );
111
+ $( '#aalb-add-template-asin-error' ).text( '' );
112
+ }
113
+ } );
114
+
115
+ //Bind focus event with dropdown of marketplaces
116
+ $( "#aalb-admin-pop-up" ).on( 'focus', '.aalb-marketplace-names-list', function() {
117
+ $( this ).data( 'prev-val', $( this ).val() );
118
+ } );
119
+
120
+ /**
121
+ * To fill the store-ids as per markeplace in Associate Id section on changing marketplace
122
+ **/
123
+ $( '#aalb-admin-pop-up' ).on( 'change', '.aalb-marketplace-names-list', function() {
124
+ var prev_marketplace = $( this ).data( 'prev-val' );
125
+ var new_marketplace = $( this ).val();
126
+ if( !marketplace_pop_up_json[ new_marketplace ] ) {
127
+ var pop_up_container = $( this ).closest( '.aalb-pop-up-container' );
128
+ var store_id_dropdown = pop_up_container.find( '.aalb-admin-popup-store-id' );
129
+ reset_store_id_list( store_id_dropdown, marketplace_store_id_mapping[ new_marketplace ] );
130
+ if( prev_marketplace !== null ) {
131
+ delete marketplace_pop_up_json[ prev_marketplace ];
132
+ pop_up_container.find( '.aalb-selected-item' ).remove();
133
+ } else {
134
+ add_close_button( pop_up_container );
135
+ add_tab();
136
+ }
137
+ add_entry_in_marketplace_json( new_marketplace, marketplace_store_id_mapping[ new_marketplace ][ 0 ] );
138
+ change_header_of_tab( pop_up_container, new_marketplace );
139
+ admin_popup_search_items( pop_up_container );
140
+ } else {
141
+ $( this ).val( prev_marketplace || SELECT_DROPDOWN_VALUE );
142
+ }
143
+ $( this ).blur();
144
+ } );
145
+
146
+ // Close icon: removing the tab on click
147
+ $( '#aalb-admin-pop-up' ).on( "click", "span.ui-icon-close", function() {
148
+ var marketplace = $( this ).siblings( "a" ).text();
149
+ var panelId = $( this ).closest( "li" ).remove().attr( "aria-controls" );
150
+ $( "#" + panelId ).remove();
151
+
152
+ delete marketplace_pop_up_json[ marketplace ];
153
+ tabs.tabs( "refresh" );
154
+ } );
155
+
156
+ //Binding on change event of store-id list
157
+ $( '#aalb-admin-pop-up' ).on( 'change', '.aalb-admin-popup-store-id', function() {
158
+ var pop_up_container = $( this ).closest( '.aalb-pop-up-container' );
159
+ marketplace_pop_up_json[ pop_up_container.find( '.aalb-marketplace-names-list' ).val() ].store_id = $( this ).val();
160
+ } );
161
+
162
+ //Binding click event with Search button in editor search box
163
+ $( '.aalb-admin-button-create-amazon-shortcode' ).on( 'click', function() {
164
+ admin_show_create_shortcode_popup( this );
165
+ } );
166
+
167
+ //Binding click event with Search button in search pop-up
168
+ $( '#aalb-admin-pop-up' ).on( 'click', '.aalb-admin-popup-search-button', function() {
169
+ admin_popup_search_items( $( this ).closest( '.aalb-pop-up-container' ) );
170
+ } );
171
+
172
+ //Binding click event with ASIN removal from selcted item in search pop-up
173
+ $( '#aalb-admin-pop-up' ).on( 'click', '.aalb-selected-item', function() {
174
+ var aalb_selected_box = $( this ).closest( '.aalb-selected' );
175
+ remove_asin( this );
176
+ if( aalb_selected_box.find( '.aalb-selected-item' ).length === 0 ) {
177
+ aalb_selected_box.find( '.aalb-admin-popup-placeholder' ).show();
178
+ }
179
+ } );
180
+
181
+ //Binding click event with ASIN addition from search item in search pop-up
182
+ $( '#aalb-admin-pop-up' ).on( "click", '.aalb-admin-item-search-items-item', function() {
183
+ var data_asin = $( this ).attr( "data-asin" );
184
+ var marketplace = $( this ).closest( '.aalb-pop-up-container' ).find( '.aalb-marketplace-names-list' ).val();
185
+ if( !validate_asin_addition( data_asin, marketplace ) ) {
186
+ return;
187
+ }
188
+ marketplace_pop_up_json[ marketplace ].selected_asin.push( data_asin );
189
+ var aalb_selected_box = $( this ).closest( '.aalb-pop-up-container' ).find( '.aalb-selected' );
190
+ aalb_selected_box.find( '.aalb-admin-popup-placeholder' ).hide();
191
+ aalb_selected_box.append( create_selected_asin_html( data_asin, this ) );
192
+ } );
193
+
194
+ //Binding enter event with Search button in search pop-up
195
+ $( '.aalb-admin-input-search' ).on( 'keypress', function( event ) {
196
+ if( event.keyCode === ENTER_KEY_CODE ) {
197
+ event.preventDefault();
198
+ admin_show_create_shortcode_popup( $( this ).siblings( '.aalb-admin-button-create-amazon-shortcode' ) );
199
+ }
200
+ } );
201
+
202
+ //Binding Enter event with Search button in editor search box
203
+ $( '#aalb-admin-pop-up' ).on( 'keypress', '.aalb-admin-popup-input-search', function( event ) {
204
+ if( event.keyCode === ENTER_KEY_CODE ) {
205
+ event.preventDefault();
206
+ admin_popup_search_items( $( this ).closest( '.aalb-pop-up-container' ) );
207
+ }
208
+ } );
209
+
210
+ if( IS_PAAPI_CREDENTIALS_NOT_SET ) {
211
+ disable_editor_search( aalb_strings.paapi_credentials_not_set );
212
+ } else if( IS_STORE_ID_CREDENTIALS_NOT_SET ) {
213
+ disable_editor_search( aalb_strings.store_id_credentials_not_set );
214
  }
215
  } );
216
 
217
  /**
218
+ * Returns elements not present in second array but in first
219
+ *
220
+ * @param Array arr1
221
+ * @param Array arr2
222
+ *
223
+ * @since 1.5.0
224
+ *
225
+ * @return Array difference between two arrays
226
+ */
227
+ function get_diff_between_two_arrays( arr1, arr2 ) {
228
+ return arr1.filter( function( a ) {
229
+ return arr2.indexOf( a ) == -1;
230
+ } );
231
+ }
232
 
233
+ /**
234
+ * Resets marketplace drop down with the values provided in new_store_id_list
235
+ *
236
+ * @param HTMLElement marketplace_dropdown
237
+ * @param Array marketplace_list
238
+ * @param String selected_marketplace
239
+ *
240
+ * @since 1.5.0
241
+ */
242
+ function reset_marketplace_dropwdown( marketplace_dropdown, new_marketplace_list, selected_marketplace ) {
243
+ marketplace_dropdown.empty();
244
+ marketplace_dropdown.append( '<option value="' + SELECT_DROPDOWN_VALUE + '" disabled="disabled">' + meta_box_tab_context.select_marketplace_label + '</option>' );
245
+ if( selected_marketplace ) {
246
+ marketplace_dropdown.append( '<option>' + selected_marketplace + '</option>' );
247
+ }
248
+ $.each( new_marketplace_list, function( key, marketplace ) {
249
+ marketplace_dropdown.append( '<option>' + marketplace + '</option>' );
250
+ } );
251
+ marketplace_dropdown.val( selected_marketplace || SELECT_DROPDOWN_VALUE );
252
  }
 
253
 
254
+ /**
255
+ * Adds a close button to the tab
256
+ *
257
+ * @param jQueryObject pop_up_container The pop up container in which all content in a tab resides
258
+ *
259
+ * @since 1.5.0
260
+ *
261
+ */
262
+ function add_close_button( pop_up_container ) {
263
+ var close_icon = "<span class='ui-icon ui-icon-close' role='presentation'></span>";
264
+ var url = '#' + pop_up_container.parent().closest( 'div' ).attr( "id" );
265
+ $( 'a[href=' + url + ']' ).after( close_icon );
 
 
266
  }
 
267
 
268
+ /**
269
+ * Change header of tab with marketplace name
270
+ *
271
+ * @param jQueryObject pop_up_container The pop up container in which all content in a tab resides
272
+ * @param String marketplace
273
+ *
274
+ * @since 1.5.0
275
+ *
276
+ */
277
+ function change_header_of_tab( pop_up_container, marketplace ) {
278
+ var url = '#' + pop_up_container.parent().closest( 'div' ).attr( "id" );
279
+ $( 'a[href=' + url + ']' ).text( marketplace );
280
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
281
 
282
+ /**
283
+ * Checks if any marketplace contains more than one asin selected
284
+ *
285
+ * @return bool does any marketplace contains multiple asins
286
+ *
287
+ * @since 1.5.0
288
+ */
289
+ function does_any_marketplace_contains_multiple_asin() {
290
+ return Object.keys( marketplace_pop_up_json ).some( function( marketplace ) {
291
+ return marketplace_pop_up_json[ marketplace ].selected_asin.length > 1;
292
+ } );
293
+ }
294
+
295
+ /**
296
+ * Checks if any marketplace exists for which no asin is selected
297
+ *
298
+ * @param String marketplace
299
+ *
300
+ * @return Array marketplaces list for which no asin is selected
301
+ *
302
+ * @since 1.5.0
303
+ */
304
+ function get_marketplaces_containing_no_asin_selected() {
305
+ return Object.keys( marketplace_pop_up_json ).filter( function( marketplace ) {
306
+ return marketplace_pop_up_json[ marketplace ].selected_asin.length === 0;
307
+ } );
308
+ }
309
 
310
+ /**
311
+ * Creates HTML for the selected ASIN from search results
312
+ *
313
+ * @param String data_asin ASIN to be added
314
+ * @param jQueryObject element The search item clicked in search results to be added to selected ASIN list
315
+ *
316
+ * @return HTMLElement HTML of selected ASIN
317
+ *
318
+ * @since 1.5.0
319
+ */
320
+ function create_selected_asin_html( data_asin, element ) {
321
+ var productImage = $( element ).find( "img" ).attr( "src" );
322
+ var productTitle = $( element ).find( "div.aalb-admin-item-search-items-item-title" ).text();
323
+ var productPrice = $( element ).find( "div.aalb-admin-item-search-items-item-price" ).text();
324
+ //ToDO: See if handlebars can be leveraged here like in credentials.js
325
+ var selectedAsinHTML = '<div class="aalb-selected-item"';
326
+ selectedAsinHTML += ' data-asin="' + data_asin + '">';
327
+ selectedAsinHTML += '<div class="aalb-selected-item-img-wrap"><span class="aalb-selected-item-close">&times;</span>';
328
+ selectedAsinHTML += '<img class="aalb-selected-item-img" src="' + productImage + '"></img></div>';
329
+ selectedAsinHTML += '<div class="aalb-selected-item-title"><h3>' + productTitle + '</h3>';
330
+ selectedAsinHTML += '<p class="aalb-selected-item-price">' + productPrice + '<br></p></div>';
331
+ return selectedAsinHTML;
332
  }
333
 
334
+ /**
335
+ * Add json object with marketplace as key
336
+ *
337
+ * @param String marketplace
338
+ * @param String store_id
339
+ *
340
+ *
341
+ * @since 1.5.0
342
+ */
343
+ function add_entry_in_marketplace_json( marketplace, store_id ) {
344
+ marketplace_pop_up_json[ marketplace ] = {
345
+ "store_id" : store_id,
346
+ "selected_asin": []
347
+ };
348
+ }
349
 
350
+ /**
351
+ * Resets store-id drop down with the values provided in new_store_id_list
352
+ *
353
+ * @param HTMLElement store_id_dropdown
354
+ * @param Array new_store_id_list
355
+ *
356
+ * @since 1.5.0
357
+ */
358
+ function reset_store_id_list( store_id_dropdown, new_store_id_list ) {
359
+ store_id_dropdown.empty();
360
+ store_id_dropdown.append( '<option value="' + SELECT_DROPDOWN_VALUE + '" disabled="disabled">' + meta_box_tab_context.select_associate_id_label + '</option>' );
361
+ $.each( new_store_id_list, function( key, store_id ) {
362
+ store_id_dropdown.append( '<option>' + store_id + '</option>' );
363
+ } );
364
+ store_id_dropdown.val( new_store_id_list[ 0 ] );
365
+ }
366
 
367
+ /**
368
+ * Insert Loading search results spinner and content
369
+ *
370
+ * @param jQueryObject pop_up_container The pop up container in which all content in a tab resides
371
+ *
372
+ * @since 1.5.0
373
+ */
374
+ function insert_search_loading_box( pop_up_container ) {
375
+ delete_stale_pop_up_content( pop_up_container );
376
+ var admin_pop_up_content_hbs = $( "#aalb-admin-pop-up-content-hbs" ).html();
377
+ if( admin_pop_up_content_hbs != null ) {
378
+ var admin_pop_up_content_template = Handlebars.compile( admin_pop_up_content_hbs );
379
+ var admin_pop_up_content_html = admin_pop_up_content_template( admin_pop_up_content_context );
380
+ pop_up_container.find( ".aalb-admin-popup-search-result .aalb-admin-popup-placeholder" ).remove();
381
+ pop_up_container.find( ".aalb-admin-popup-search-result" ).append( admin_pop_up_content_html );
382
+ }
383
+ }
384
 
385
+ /**
386
+ * Delete existing content in pop-up container
387
+ *
388
+ * @param jQueryObject pop_up_container The pop up container in which all content in a tab resides
389
+ *
390
+ * @since 1.5.0
391
+ */
392
+ function delete_stale_pop_up_content( pop_up_container ) {
393
+ var pop_up_content = pop_up_container.find( '.aalb-admin-popup-content' );
394
+ if( pop_up_content.length !== 0 ) {
395
+ pop_up_content.remove();
396
+ }
397
+ }
398
 
399
+ /**
400
+ * Adds a new jQuery tab
401
+ *
402
+ * @since 1.5.0
403
+ */
404
+ function add_tab() {
405
+ var id = "aalb_tab" + tab_counter++;
406
+ var tab_template = "<li><a href=#" + id + ">" + aalb_strings.pop_up_new_tab_label + "</a></li>";
407
+ tabs.find( ".ui-tabs-nav" ).append( tab_template );
408
+ tabs.append( "<div id='" + id + "'>" );
409
+ tabs.tabs( "refresh" );
410
+
411
+ var aalb_meta_box_tab_hbs = $( "#aalb-metabox-tab-hbs" ).html();
412
+ if( aalb_meta_box_tab_hbs != null ) {
413
+ var aalb_meta_box_template = Handlebars.compile( aalb_meta_box_tab_hbs );
414
+ var aalb_meta_box_html = aalb_meta_box_template( meta_box_tab_context );
415
+ $( 'div#aalb-tabs' + ' #' + id ).append( aalb_meta_box_html );
416
+ }
417
+ $( '#' + id + ' .aalb-marketplace-names-list' ).val( SELECT_DROPDOWN_VALUE );
418
+ $( '#' + id + ' .aalb-admin-popup-store-id' ).empty();
419
+ $( '#' + id + ' .aalb-admin-popup-store-id' ).append( '<option>' + meta_box_tab_context.select_associate_id_label + '</option>' );
420
+ $( '#' + id + ' .aalb-marketplace-names-list' ).val( SELECT_DROPDOWN_VALUE );
421
+ $( '#' + id + ' .aalb-admin-popup-input-search' ).val( keyword_for_search );
422
+ }
423
 
424
+ /**
425
+ * Load search pop-up box
426
+ *
427
+ * @since 1.4.12
428
+ */
429
+ function load_search_pop_up() {
430
+ var aalb_meta_box_tab_partial = $( "#aalb-metabox-tab-hbs" ).html();
431
+ if( aalb_meta_box_tab_partial != null ) {
432
+ Handlebars.registerPartial( "aalb-metabox-tab-hbs", aalb_meta_box_tab_partial );
433
+
434
+ Handlebars.registerHelper( 'selected', function( current_option, selected_option ) {
435
+ return (current_option === selected_option) ? 'selected' : '';
436
+ } );
437
+ var aalb_search_pop_up_hbs = $( "#aalb-search-pop-up-hbs" ).html();
438
+ if( aalb_search_pop_up_hbs != null ) {
439
+ var aalb_search_pop_up_template = Handlebars.compile( aalb_search_pop_up_hbs );
440
+ var aalb_search_pop_up_html = aalb_search_pop_up_template( search_pop_up_context );
441
+ $( "#aalb-admin-pop-up" ).prepend( aalb_search_pop_up_html );
442
+ load_jQuery_tabs();
443
+ }
444
+ }
445
+ }
446
 
447
+ /**
448
+ * Load JQuery tabs
449
+ *
450
+ * @since 1.5.0
451
+ */
452
+ function load_jQuery_tabs() {
453
+ tabs = $( "#aalb-tabs" ).tabs();
454
+ tabs.css( {
455
+ 'overflow': 'auto'
456
+ } );
457
+ $( '#aalb-tabs' ).removeClass( 'ui-widget-content' );
458
+ //Binding the event here as this tab is created dynamically on every click of search button from editor
459
+ $( "#aalb-tabs" ).tabs( {
460
+ activate: function( event, ui ) {
461
+ //Below fetches the id of active tab & find marketplace dropdown element in that active tab
462
+ var maketplace_dropdown = $( '#' + ui.newPanel.attr( 'id' ) ).find( '.aalb-marketplace-names-list' );
463
+ var not_set_marketplace = get_diff_between_two_arrays( Object.keys( marketplace_store_id_mapping ), Object.keys( marketplace_pop_up_json ) );
464
+ reset_marketplace_dropwdown( maketplace_dropdown, not_set_marketplace, maketplace_dropdown.val() );
465
+ }
466
+ } );
467
  }
 
468
 
469
+ /**
470
+ * Resizing thickbox on change in window dimensions
471
+ * Setting a max width and height of 1280x800 px for readability and to lessen distortion
472
+ */
473
+ function resize_thickbox() {
474
+ var tb_width = Math.min( 1280, 0.6 * $( window ).width() );
475
+ var tb_height = Math.min( 800, 0.9 * $( window ).height() );
476
+ $( document ).find( '#TB_ajaxContent' ).width( tb_width - 35 ).height( tb_height - 90 );
477
+ $( document ).find( '#TB_window' ).width( tb_width ).height( tb_height );
478
+ $( document ).find( '#TB_window' ).css( { marginLeft: '-' + tb_width / 2 + 'px', top: tb_height / 12 } );
479
+ $( document ).find( '#TB_window' ).removeClass();
480
+ }
481
+
482
+ /**
483
+ * Display pop up thickbox
484
+ *
485
+ * @param HTMLElement search_button reference to the clicked button element to get to the keyword of interest.
486
+ *
487
+ * @since 1.4.3 added param search_button
488
+ */
489
+ function admin_show_create_shortcode_popup( search_button ) {
490
+ var editor_selected_text = get_selected_text_from_editor();
491
+
492
+ var editor_search_box_input = $( search_button ).siblings( ".aalb-admin-input-search" );
493
+
494
+ var search_keywords = editor_selected_text || editor_search_box_input.val();
495
+ if( search_keywords ) {
496
+ keyword_for_search = search_keywords;
497
+ $( '#aalb-search-pop-up' ).remove();
498
+ tab_counter = 2;
499
+ load_search_pop_up();
500
+ if( editor_selected_text ) {
501
+ //Make ProductLink template as a default choice of template when some text is selected.
502
+ $( "#aalb_template_names_list" ).val( 'ProductLink' );
503
+ }
504
+
505
+ var pop_up_container = $( '#aalb-tabs' ).find( '.aalb-pop-up-container' );
506
+ add_tab();
507
+ insert_search_loading_box( pop_up_container );
508
+ add_entry_in_marketplace_json( default_marketplace, default_store_id );
509
+ tb_show( aalb_strings.add_aalb_shortcode, '#TB_inline?inlineId=aalb-admin-popup-container', false );
510
+ resize_thickbox();
511
+
512
+ // Getting the ItemSearch results
513
+ admin_get_item_search_items( search_keywords, pop_up_container );
514
+
515
+ //Setting search input of shortcode popup with search keyword.
516
+ $( ".aalb-admin-popup-input-search" ).attr( 'value', search_keywords );
517
+
518
+ //Setting editor search input with search keyword.
519
+ editor_search_box_input.attr( 'value', search_keywords );
520
+
521
+ } else {
522
+ alert( aalb_strings.empty_product_search_bar );
523
+ editor_search_box_input.focus();
524
+ }
525
+ }
526
+
527
+ /**
528
+ * Search items from within the thickbox
529
+ *
530
+ * @param jQueryObject pop_up_container The pop up container in which all content in a tab resides
531
+ *
532
+ */
533
+ function admin_popup_search_items( pop_up_container ) {
534
+ var keywords = $( pop_up_container ).find( '.aalb-admin-popup-input-search' ).val();
535
+ if( keywords ) {
536
+ insert_search_loading_box( pop_up_container );
537
+ // Getting the ItemSearch results
538
+ admin_get_item_search_items( keywords, pop_up_container );
539
+ pop_up_container.find( ".aalb-admin-popup-input-search" ).attr( 'value', keywords );
540
+ } else {
541
+ alert( aalb_strings.empty_product_search_bar );
542
+ $( ".aalb-admin-popup-input-search" ).focus();
543
+ }
544
+ }
545
+
546
+ /**
547
+ * Search items for the keywords and display it in the pop up thickbox
548
+ *
549
+ * @param String keywords Items to search for.
550
+ * @param jQueryObject pop_up_container The pop up container in which all content in a tab resides
551
+ */
552
+ function admin_get_item_search_items( keywords, pop_up_container ) {
553
+ $.ajax( {
554
+ url : api_pref.ajax_url,
555
+ type : 'GET',
556
+ data : {
557
+ "action" : api_pref.action,
558
+ "item_search_nonce": api_pref.item_search_nonce,
559
+ "keywords" : keywords,
560
+ "marketplace" : $( pop_up_container ).find( '.aalb-marketplace-names-list' ).val(),
561
+ "store_id" : $( pop_up_container ).find( '.aalb-admin-popup-store-id' ).val()
562
+ },
563
+ success: function( xml ) {
564
+ var items_xml = $( xml ).find( "Item" );
565
+ if( items_xml.length > 0 ) {
566
+ var items = [];
567
+ var i = 0;
568
+ items_xml.each( function() {
569
+ //selecting maximum of max_search_result_items elements
570
+ if( i < api_pref.max_search_result_items ) {
571
+ var item = {};
572
+ item.asin = $( this ).find( "ASIN" ).text();
573
+ item.title = $( this ).find( "Title" ).text();
574
+ item.image = $( this ).find( "LargeImage" ).first().find( "URL" ).text();
575
+ item.price = $( this ).find( "LowestNewPrice" ).find( "FormattedPrice" ).text();
576
+ items.push( item );
577
+ }
578
+ i++;
579
  } );
580
+
581
+ var html = template( items );
582
+ $( pop_up_container ).find( ".aalb-admin-item-search-items" ).append( html );
583
+ $( pop_up_container ).find( ".aalb-admin-popup-more-results" ).attr( 'href', $( xml ).find( "MoreSearchResultsUrl" ).text() );
584
+ $( pop_up_container ).find( ".aalb-admin-item-search-loading" ).slideUp( "slow" );
585
+ $( pop_up_container ).find( ".aalb-admin-item-search" ).fadeIn( "slow" );
586
  } else {
587
+ var errors_xml = $( xml ).find( "Error" );
588
+ if( errors_xml.length > 0 ) {
589
+ var htmlerror = "";
590
+ errors_xml.each( function() {
591
+ htmlerror += $( this ).find( "Message" ).text() + "<br>";
592
+ } );
593
+ $( pop_up_container ).find( ".aalb-admin-item-search-loading" ).html( htmlerror );
594
+ } else {
595
+ $( pop_up_container ).find( ".aalb-admin-item-search-loading" ).html( xml );
596
+ }
597
  }
598
+ },
599
+ error : function( request, status ) {
600
+ if( status === "timeout" ) {
601
+ $( pop_up_container ).find( ".aalb-admin-item-search-loading" ).html( aalb_strings.paapi_request_timeout_error );
602
+ } else {
603
+ $( pop_up_container ).find( ".aalb-admin-item-search-loading" ).html( "An Error Occurred : " + status );
604
+ }
605
+ },
606
+ timeout: api_pref.WORDPRESS_REQUEST_TIMEOUT
607
+ } );
608
+
609
+ $( "#aalb-add-shortcode-button" ).unbind().click( function() {
610
+ var selected = get_selected_text_from_editor();
611
+ var non_asin_selected_marketplaces = get_marketplaces_containing_no_asin_selected();
612
+ if( non_asin_selected_marketplaces.length === 0 ) {
613
+ if( selected ) {
614
+ /* If there was some text selected in the wordpress post editor. Implies amazon_textlink */
615
+ if( does_any_marketplace_contains_multiple_asin() ) {
616
+ alert( aalb_strings.short_code_create_failure );
617
+ } else {
618
+ $( "#aalb-add-shortcode-alert" ).fadeTo( "fast", 1 );
619
+ add_shortcode( AALB_SHORTCODE_AMAZON_TEXT );
620
+ }
621
  } else {
622
+ $( "#aalb-add-shortcode-alert" ).fadeTo( "fast", 1 );
623
+ add_shortcode( AALB_SHORTCODE_AMAZON_LINK );
624
  }
625
  } else {
626
+ alert( aalb_strings.no_asin_selected_error + non_asin_selected_marketplaces.toString() );
 
627
  }
628
+ } );
629
+ }
630
+
631
+ /**
632
+ * Adds the given shortcode to the editor
633
+ *
634
+ * @param String Shortcode type to be added
635
+ */
636
+ function add_shortcode( shortcodeName ) {
637
+ var shortcodeJson;
638
+ var selectedAsins = get_selected_asins();
639
+ var selectedTemplate = get_selected_template();
640
+ var selectedStore = get_selected_store();
641
+ var selectedMarketplace = get_selected_marketplace();
642
+
643
+ if( shortcodeName === AALB_SHORTCODE_AMAZON_LINK ) {
644
+ shortcodeJson = {
645
+ "name" : AALB_SHORTCODE_AMAZON_LINK,
646
+ "params": {
647
+ "asins" : selectedAsins,
648
+ "template" : selectedTemplate,
649
+ "store" : selectedStore,
650
+ "marketplace": selectedMarketplace
651
+ }
652
+ };
653
+ } else if( shortcodeName === AALB_SHORTCODE_AMAZON_TEXT ) {
654
+ shortcodeJson = {
655
+ "name" : AALB_SHORTCODE_AMAZON_TEXT,
656
+ "params": {
657
+ "asin" : selectedAsins,
658
+ "text" : get_selected_text_from_editor(),
659
+ "template" : selectedTemplate,
660
+ "store" : selectedStore,
661
+ "marketplace": selectedMarketplace
662
+ }
663
+ };
664
  } else {
665
+ console.log( "Invalid Shortcode provided!" );
666
+ return;
667
  }
668
+ get_link_id( shortcodeJson );
669
+ }
670
 
671
+ /**
672
+ * Handler function when the Add Shortcode button is clicked
673
+ * and link id is retrieved.
674
+ *
675
+ * @param Object shortcodeJson Object describing the shortcode
676
+ */
677
+ function add_shortcode_click_handler( shortcodeJson ) {
678
+ create_shortcode( shortcodeJson );
679
+ tb_remove();
680
+ }
681
+
682
+ /**
683
+ * Builds shortcode from given JSON
684
+ *
685
+ * @param Object shortcodeJson Object describing the shortcode
686
+ *
687
+ * @return String returns the Shortcode String
688
+ */
689
+ function buildShortcode( shortcodeJson ) {
690
+ var shortcodeParamsString = "";
691
+ var shortcodeParam = "";
692
+ for( shortcodeParam in shortcodeJson.params ) {
693
+ if( shortcodeJson.params.hasOwnProperty( shortcodeParam ) ) {
694
+ shortcodeParamsString += " " + shortcodeParam + "='" + shortcodeJson.params[ shortcodeParam ] + "'";
 
 
 
 
 
 
 
695
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
696
  }
697
+
698
+ var shortcodeString = "[" + shortcodeJson.name + shortcodeParamsString + "]";
699
+ return shortcodeString;
700
  }
701
 
702
+ /**
703
+ * Get unique link id whenever add shortcode button is clicked
704
+ *
705
+ * @param Object shortcodeJson Object describing the shortcode
706
+ */
707
+ function get_link_id( shortcodeJson ) {
708
+ $.post( api_pref.ajax_url, {
709
+ "action": "get_link_code", "shortcode_name": shortcodeJson.name, "shortcode_params": shortcodeJson.params
710
+ } ).success( function( data ) {
711
+ link_id = data;
712
+ } ).fail( function() {
713
+ link_id = "";
714
+ } ).always( function() {
715
+ shortcodeJson.params.link_id = link_id;
716
+ $( "#aalb-add-shortcode-alert" ).fadeTo( "slow", 0 );
717
+ add_shortcode_click_handler( shortcodeJson );
718
+ } );
719
+ }
720
 
721
+ /**
722
+ * Add the shortcode to the display editor
723
+ *
724
+ * @param Object shortcodeJson Object describing the shortcode
725
+ */
726
+ function create_shortcode( shortcodeJson ) {
727
+ send_to_editor( buildShortcode( shortcodeJson ) );
728
+ }
 
 
 
 
 
 
 
 
 
 
729
 
730
+ /**
731
+ * Gets the selected Asins
732
+ *
733
+ * @return String Selected Asins
734
+ */
735
+ function get_selected_asins() {
736
+ //Map first creates an Array of ASINs(every array element contains comma separated asins of one marketplace) & later separate these array elements by join
737
+ return Object.values( marketplace_pop_up_json ).map( function( marketplace ) {
738
+ return marketplace.selected_asin.toString();
739
+ } ).join( '|' );
740
+ }
 
 
 
 
 
 
 
 
 
 
741
 
742
+ /**
743
+ * Get the selected Template style
744
+ *
745
+ * @return String Selected Template style
746
+ */
747
+ function get_selected_template() {
748
+ return $( '#aalb_template_names_list' ).val();
749
+ }
750
+
751
+ /**
752
+ * Get the selected associate tag
753
+ *
754
+ * @return String Selected Associate tag
755
+ */
756
+ function get_selected_store() {
757
+ return Object.values( marketplace_pop_up_json ).map( function( marketplace ) {
758
+ return marketplace.store_id;
759
+ } ).join( '|' );
760
+ }
761
+
762
+ /**
763
+ * Get the selected marketplace
764
+ *
765
+ * @return String Selected Marketplace bar spearted list
766
+ */
767
+ function get_selected_marketplace() {
768
+ return Object.keys( marketplace_pop_up_json ).join( '|' );
769
+ }
770
+
771
+ /**
772
+ * Get selected text from the editor.
773
+ *
774
+ * @return String Selected text from the wordpress post editor.
775
+ */
776
+ function get_selected_text_from_editor() {
777
+ if( tinyMCE.activeEditor ) {
778
+ return tinyMCE.activeEditor.selection.getContent( { format: "text" } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
779
  } else {
780
+ return null;
781
+ }
782
+ }
783
+
784
+ /**
785
+ * To check the validity of ASIN based on different actions
786
+ *
787
+ * @param String Asin ASIN of Product selected by Admin
788
+ * @param String marketplace Marketplace for which this ASIN is being added
789
+ *
790
+ * @return bool true
791
+ *
792
+ * @since 1.5.0
793
+ **/
794
+ function validate_asin_addition( asin, marketplace ) {
795
+ if( marketplace_pop_up_json[ marketplace ].selected_asin.indexOf( asin ) != -1 || marketplace_pop_up_json[ marketplace ].selected_asin.length === MAX_ALLOWED_ASINS_IN_SELECTION ) {
796
  return false;
797
  }
798
+
799
+ var selected_template = get_selected_template();
800
+ if( SINGLE_ASIN_TEMPLATE[ selected_template ] && marketplace_pop_up_json[ marketplace ].selected_asin.length === 1 ) {
801
+ $( '#aalb-add-template-asin-error' ).text( aalb_strings.template_asin_error );
802
+ $( '#aalb-add-shortcode-button' ).prop( 'disabled', true );
803
+ }
804
+ return true;
805
+ // reset_add_short_button_and_error_warnings();
806
+ }
807
+
808
+ /**
809
+ * To remove ASIN element from list
810
+ *
811
+ * @param element HTMLDivElement
812
+ **/
813
+ function remove_asin( element ) {
814
+ var removed_product_asin = element.getAttribute( 'data-asin' );
815
+ var marketplace = $( element ).closest( '.aalb-pop-up-container' ).find( '.aalb-marketplace-names-list' ).val();
816
+ $( element ).remove();
817
+ marketplace_pop_up_json[ marketplace ].selected_asin.splice( marketplace_pop_up_json[ marketplace ].selected_asin.indexOf( removed_product_asin ), 1 );
818
+ if( SINGLE_ASIN_TEMPLATE[ get_selected_template() ] && !does_any_marketplace_contains_multiple_asin() ) {
819
+ reset_add_short_button_and_error_warnings();
820
+ }
821
+ }
822
+
823
+ /**
824
+ * To enable add short code button and remove template asin error
825
+ **/
826
+ function reset_add_short_button_and_error_warnings() {
827
+ var add_short_code_button = $( '#aalb-add-shortcode-button' );
828
+ add_short_code_button.prop( 'disabled', false );
829
+ $( '#aalb-add-template-asin-error' ).text( '' );
830
+ }
831
+
832
+ /**
833
+ * To disable editor search for AALB plugin along with message
834
+ *
835
+ * @param String error_msg Error message
836
+ *
837
+ * @since 1.4.12
838
+ *
839
+ **/
840
+ function disable_editor_search( error_msg ) {
841
+ $( ".aalb-admin-button-create-amazon-shortcode" ).addClass( 'aalb-admin-button-create-amazon-shortcode-disabled' );
842
+ $( ".aalb-admin-input-search" ).prop( 'disabled', true );
843
+ var admin_searchbox_tooltip = $( '.aalb-admin-editor-tooltip' );
844
+ admin_searchbox_tooltip.html( error_msg );
845
+ admin_searchbox_tooltip.addClass( 'aalb-admin-searchbox-tooltip-text' );
846
+ admin_searchbox_tooltip.removeClass( 'aalb-admin-hide-display' );
847
+ }
848
+ })( jQuery );
 
admin/partials/aalb_admin_pop_up_content_hbs.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--
2
+ Copyright 2016-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+
4
+ Licensed under the GNU General Public License as published by the Free Software Foundation,
5
+ Version 2.0 (the "License"). You may not use this file except in compliance with the License.
6
+ A copy of the License is located in the "license" file accompanying this file.
7
+
8
+ This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
9
+ either express or implied. See the License for the specific language governing permissions
10
+ and limitations under the License.
11
+ -->
12
+ <?php
13
+ /*
14
+ * Below is an example of context to be passed to the below template
15
+ *
16
+ {
17
+ "text_shown_during_search":"Searching relevant products from Amazon",
18
+ "check_more_on_amazon_text":"Check more search results on Amazon"
19
+ }
20
+ */
21
+ ?>
22
+
23
+ <script id="aalb-admin-pop-up-content-hbs" type="text/x-handlebars-template">
24
+ <div class="aalb-admin-popup-content">
25
+ <div class="aalb-admin-alert aalb-admin-alert-info aalb-admin-item-search-loading">
26
+ <div class="aalb-admin-icon"><i class="fa fa-spinner fa-pulse"></i></div>
27
+ {{text_shown_during_search}}
28
+ </div>
29
+ <div class="aalb-admin-item-search">
30
+ <div class="aalb-admin-item-search-items"></div>
31
+ <a href="#" target="_blank" class="aalb-admin-popup-more-results pull-right">{{check_more_on_amazon_text}}</a>
32
+ </div>
33
+ </div>
34
+ </script>
admin/partials/aalb_editor_search_box.php CHANGED
@@ -27,11 +27,8 @@ $aalb_admin->aalb_enqueue_scripts();
27
  <div class="aalb-admin-inline aalb-admin-searchbox">
28
  <span class="aalb-admin-editor-tooltip aalb-admin-hide-display"></span>
29
  <img src=<?= AALB_ADMIN_ICON ?> class="aalb-admin-searchbox-amzlogo">
30
- <input type="text" class="aalb-admin-input-search"
31
- name="aalb-admin-input-search"
32
- placeholder="<?php esc_attr_e( "Enter keyword(s)", 'amazon-associates-link-builder' ) ?>"
33
- onkeypress='aalb_submit_event(event,"aalb-admin-button-create-amazon-shortcode",this)' />
34
- <a class="button aalb-admin-button-create-amazon-shortcode" title="<?php esc_attr_e( "Add Amazon Associates Link Builder Shortcode", 'amazon-associates-link-builder' ) ?>"
35
- onclick="aalb_admin_show_create_shortcode_popup(this)"><?php esc_html_e( "Search", 'amazon-associates-link-builder' ) ?>
36
  </a>
37
  </div>
27
  <div class="aalb-admin-inline aalb-admin-searchbox">
28
  <span class="aalb-admin-editor-tooltip aalb-admin-hide-display"></span>
29
  <img src=<?= AALB_ADMIN_ICON ?> class="aalb-admin-searchbox-amzlogo">
30
+ <input type="text" class="aalb-admin-input-search" name="aalb-admin-input-search" placeholder="<?php esc_attr_e( "Enter keyword(s)", 'amazon-associates-link-builder' ) ?>" />
31
+ <a class="button aalb-admin-button-create-amazon-shortcode" title="<?php esc_attr_e( "Add Amazon Associates Link Builder Shortcode", 'amazon-associates-link-builder' ) ?>">
32
+ <?php esc_html_e( "Search", 'amazon-associates-link-builder' ) ?>
 
 
 
33
  </a>
34
  </div>
admin/partials/aalb_meta_box.php CHANGED
@@ -20,7 +20,8 @@ and limitations under the License.
20
 
21
  // HandleBar template
22
  include AALB_ADMIN_ITEM_SEARCH_ITEMS_PATH;
23
-
 
24
  $aalb_admin = new Aalb_Admin();
25
  $aalb_admin->aalb_enqueue_styles();
26
  $aalb_admin->aalb_enqueue_scripts();
@@ -29,55 +30,58 @@ $aalb_admin->aalb_enqueue_scripts();
29
  * Below is an example of context to be passed to the below template
30
  *
31
  {
32
- "ad_template_label":"Ad Template",
33
- "searchbox_placeholder":"Enter keyword(s)",
34
- "search_button_label":"Search",
35
- "associate_id_label":"Associate ID",
36
- "marketplace_label":"Marketplace",
37
- "text_shown_during_search":"Searching relevant products from Amazon",
38
- "click_to_select_products_label":"Click to select product(s) to advertise",
39
- "check_more_on_amazon_text":"Check more search results on Amazon",
40
- "selected_products_list_label":"List of Selected Products",
41
- "text_shown_during_shortcode_creation":"Creating shortcode. Please wait....",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  "add_shortcode_button_label":"Add Shortcode",
 
 
43
  "templates_list":[
44
  "PriceLink",
45
  "ProductAd",
46
  "ProductCarousel",
47
  "ProductGrid",
48
- "ProductLink"
49
- ],
50
- "default_template":"ProductAd",
51
- "marketplace_list":[
52
- "IN",
53
- "UK"
54
- ],
55
- "default_marketplace":"IN",
56
- "default_store_id_list":[
57
- "store-1",
58
- "store-2"
59
  ],
60
- "default_store_id":"store-1"
61
  }
62
  */
63
 
64
  ?>
65
- <!--ToDO: Remove inline & event binding & styling(except the one for aalb-admin-popup-container)-->
66
  <!-- keeping css inline as css file does not load at plugin initialization -->
67
  <div id="aalb-admin-popup-container" style="display:none;">
68
- <script id="aalb-search-pop-up-hbs" type="text/x-handlebars-template">
69
- <div class="aalb-admin-searchbox aalb-admin-popup-options">
70
- <input type="text" id="aalb-admin-popup-input-search" name="aalb-admin-popup-input-search"
71
- placeholder="{{searchbox_placeholder}}" onkeypress='aalb_submit_event(event,"aalb-btn-primary",this)' />
72
- <button class="aalb-btn aalb-btn-primary" id="aalb-admin-popup-search-button" type="button"
73
- onclick="aalb_admin_popup_search_items()" style="margin-top:1%">{{search_button_label}}
74
- </button>
75
- </div><!--end .aalb-admin-popup-options-->
76
- <!-- start: aalb-admin-popup-shortcode-options-->
77
- <div class="aalb-admin-popup-shortocde-wrapper">
78
- <div class="aalb-admin-popup-shortcode-options">
79
  <div class="aalb-admin-item-search-templates">
80
- <label title="{{templates_help_content}}">{{ad_template_label}}<i class="fa fa-info-circle aalb-info-icon" aria-hidden="true"></i></label>
81
  <select id="aalb_template_names_list" name="aalb_template_names_list">
82
  {{#each templates_list}}
83
  <option value="{{this}}" {{selected this ..
@@ -85,52 +89,30 @@ $aalb_admin->aalb_enqueue_scripts();
85
  {{/each}}
86
  </select>
87
  </div>
88
- <div class="aalb-admin-item-search-marketplaces">
89
- <label title="{{marketplace_help_content}}">{{marketplace_label}}<i class="fa fa-info-circle aalb-info-icon" aria-hidden="true"></i></label>
90
- <select id="aalb_marketplace_names_list" name="aalb_marketplace_names_list">
91
- {{#each marketplace_list}}
92
- <option value="{{this}}" {{selected this ..
93
- /default_marketplace}}>{{this}}</option>
94
- {{/each}}
95
- </select>
96
- </div>
97
- <div class="aalb-admin-popup-store">
98
- <label title="{{tracking_id_help_content}}">{{associate_id_label}}<i class="fa fa-info-circle aalb-info-icon" aria-hidden="true"></i></label>
99
- <select id="aalb-admin-popup-store-id" name="aalb-admin-popup-store-id">
100
- {{#each default_store_id_list}}
101
- <option value="{{this}}" {{selected this ..
102
- /default_store_id}}>{{this}}</option>
103
- {{/each}}
104
- </select>
105
  </div>
106
- </div>
107
- </div><!--end .aalb-admin-popup-shortcode-options-->
108
- <div id="aalb-admin-popup-content">
109
- <div class="aalb-admin-alert aalb-admin-alert-info aalb-admin-item-search-loading">
110
- <div class="aalb-admin-icon"><i class="fa fa-spinner fa-pulse"></i></div>
111
- {{text_shown_during_search}}
112
- </div><!--end .aalb-admin-item-search-loading-->
113
- <div class="aalb-admin-item-search">
114
- {{click_to_select_products_label}}
115
- <div class="aalb-admin-item-search-items"></div>
116
- <a href="#" target="_blank" id="aalb-admin-popup-more-results" class="pull-right">{{check_more_on_amazon_text}}</a>
117
- </div><!--end .aalb-admin-item-serch-->
118
- </div><!--end .aalb-admin-popup-content-->
119
- <div class="aalb-selected">
120
- <label>{{selected_products_list_label}}</label>
121
- </div>
122
 
123
- <div class="aalb-add-shortcode-button">
124
- <button class="aalb-btn aalb-btn-primary" id="aalb-add-shortcode-button" type="button">{{add_shortcode_button_label}}</button>
125
- <div id="aalb-add-shortcode-alert">
126
- <div class="aalb-admin-icon"><i class="fa fa-spinner fa-pulse"></i></div>
127
- {{text_shown_during_shortcode_creation}}
128
- </div>
129
- <div id="aalb-add-asin-error">
130
- <div id="aalb-add-template-asin-error"></div>
 
 
131
  </div>
132
- </div><!--end .aalb-add-shortcode-button-->
133
- </script>
134
- </div><!--end .aalb-admin-popup-container-->
135
  <?php
136
  ?>
20
 
21
  // HandleBar template
22
  include AALB_ADMIN_ITEM_SEARCH_ITEMS_PATH;
23
+ include 'aalb_meta_box_tab_content.php';
24
+ include 'aalb_admin_pop_up_content_hbs.php';
25
  $aalb_admin = new Aalb_Admin();
26
  $aalb_admin->aalb_enqueue_styles();
27
  $aalb_admin->aalb_enqueue_scripts();
30
  * Below is an example of context to be passed to the below template
31
  *
32
  {
33
+ "meta_box_tab_context":{
34
+ "searchbox_placeholder":"Enter keyword(s)",
35
+ "search_button_label":"Search",
36
+ "associate_id_label":"Tracking IDs",
37
+ "select_associate_id_label":"Select Tracking Id",
38
+ "marketplace_label":"Marketplace",
39
+ "select_marketplace_label":"Select Marketplace",
40
+ "selected_products_list_label":"List of Selected Products(Maximum: 10)",
41
+ "text_shown_during_shortcode_creation":"Creating shortcode. Please wait....",
42
+ "marketplace_help_content":"To configure marketplaces, go to Associates Link Builder plugin's Settings page",
43
+ "tracking_id_help_content":"To configure tracking ids, go to Associates Link Builder plugin's Settings page",
44
+ "marketplace_list":[
45
+ "IN",
46
+ "BR",
47
+ "IT",
48
+ "CA",
49
+ "US"
50
+ ],
51
+ "default_marketplace":"IN",
52
+ "default_store_id_list":[
53
+ "in-1",
54
+ "in-2"
55
+ ],
56
+ "default_store_id":"in-1"
57
+ },
58
  "add_shortcode_button_label":"Add Shortcode",
59
+ "ad_template_label":"Ad Template",
60
+ "templates_help_content":"To configure templates, go to Associates Link Builder plugin's Templates page",
61
  "templates_list":[
62
  "PriceLink",
63
  "ProductAd",
64
  "ProductCarousel",
65
  "ProductGrid",
66
+ "ProductLink",
67
+ "CopyOf-ProductAd",
68
+ "CopyOf-ProductAds",
69
+ "CopyOf-ProductCarousel",
70
+ "ProductAdss",
71
+ "ProductCarousel-width"
 
 
 
 
 
72
  ],
73
+ "default_template":"ProductCarousel"
74
  }
75
  */
76
 
77
  ?>
 
78
  <!-- keeping css inline as css file does not load at plugin initialization -->
79
  <div id="aalb-admin-popup-container" style="display:none;">
80
+ <div id="aalb-admin-pop-up">
81
+ <script id="aalb-search-pop-up-hbs" type="text/x-handlebars-template">
82
+ <div id="aalb-search-pop-up">
 
 
 
 
 
 
 
 
83
  <div class="aalb-admin-item-search-templates">
84
+ <label class="aalb-templates-label" title="{{templates_help_content}}">{{ad_template_label}}<i class="fa fa-info-circle aalb-info-icon" aria-hidden="true"></i></label>
85
  <select id="aalb_template_names_list" name="aalb_template_names_list">
86
  {{#each templates_list}}
87
  <option value="{{this}}" {{selected this ..
89
  {{/each}}
90
  </select>
91
  </div>
92
+
93
+ <div id="aalb-tabs" class="aalb-pop-up-tabs">
94
+ <ul>
95
+ <li><a href="#aalb_tab1">{{meta_box_tab_context.default_marketplace}}</a></li>
96
+ </ul>
97
+
98
+ <div id="aalb_tab1">
99
+ {{> aalb-metabox-tab-hbs meta_box_tab_context}}
100
+ </div>
 
 
 
 
 
 
 
 
101
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102
 
103
+ <div class="aalb-add-shortcode-button">
104
+ <button class="aalb-btn aalb-btn-primary" id="aalb-add-shortcode-button" type="button">{{add_shortcode_button_label}}</button>
105
+ <div id="aalb-add-shortcode-alert">
106
+ <div class="aalb-admin-icon"><i class="fa fa-spinner fa-pulse"></i></div>
107
+ {{text_shown_during_shortcode_creation}}
108
+ </div>
109
+ <div id="aalb-add-asin-error">
110
+ <div id="aalb-add-template-asin-error"></div>
111
+ </div>
112
+ </div>
113
  </div>
114
+ </script>
115
+ </div>
116
+ </div>
117
  <?php
118
  ?>
admin/partials/aalb_meta_box_tab_content.php ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--
2
+ Copyright 2016-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+
4
+ Licensed under the GNU General Public License as published by the Free Software Foundation,
5
+ Version 2.0 (the "License"). You may not use this file except in compliance with the License.
6
+ A copy of the License is located in the "license" file accompanying this file.
7
+
8
+ This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
9
+ either express or implied. See the License for the specific language governing permissions
10
+ and limitations under the License.
11
+ -->
12
+ <?php
13
+ /*
14
+ * Below is an example of context to be passed to the below template
15
+ *
16
+ {
17
+ "searchbox_placeholder":"Enter keyword(s)",
18
+ "search_button_label":"Search",
19
+ "associate_id_label":"Tracking IDs",
20
+ "select_associate_id_label":"Select Tracking Id",
21
+ "marketplace_label":"Marketplace",
22
+ "select_marketplace_label":"Select Marketplace",
23
+ "selected_products_list_label":"List of Selected Products(Maximum: 10)",
24
+ "click_to_select_products_label":"Click to select product(s) to advertise",
25
+ "text_shown_during_shortcode_creation":"Creating shortcode. Please wait....",
26
+ "marketplace_help_content":"To configure marketplaces, go to Associates Link Builder plugin's Settings page",
27
+ "tracking_id_help_content":"To configure tracking ids, go to Associates Link Builder plugin's Settings page",
28
+ "searched_products_box_placeholder":Please select marketplace from above to show products.,
29
+ "selected_products_box_placeholder":Please select some products from above.,
30
+ "marketplace_list":[
31
+ "IN",
32
+ "BR",
33
+ "IT",
34
+ "CA",
35
+ "US"
36
+ ],
37
+ "default_marketplace":"IN",
38
+ "default_store_id_list":[
39
+ "in-1",
40
+ "in-2"
41
+ ],
42
+ "default_store_id":"in-1"
43
+ }
44
+ */
45
+ ?>
46
+ <script id="aalb-metabox-tab-hbs" type="text/x-handlebars-template">
47
+ <div class="aalb-pop-up-container">
48
+ <div class="aalb-admin-popup-shortcode-options aalb-table">
49
+ <div class="aalb-table-row">
50
+ <div class="aalb-table-cell">
51
+ <label title="{{marketplace_help_content}}">{{marketplace_label}}<i class="fa fa-info-circle aalb-info-icon" aria-hidden="true"></i></label>
52
+ </div>
53
+ <div class="aalb-table-cell">
54
+ <label title="{{tracking_id_help_content}}">{{associate_id_label}}<i class="fa fa-info-circle aalb-info-icon" aria-hidden="true"></i></label>
55
+ </div>
56
+ <div class="aalb-table-cell">
57
+ <label>{{search_keyword_label}}</label>
58
+ </div>
59
+ </div>
60
+
61
+ <div class="aalb-table-row">
62
+ <div class="aalb-admin-item-search-marketplaces aalb-width-25 aalb-table-cell">
63
+ <select class="aalb-marketplace-names-list" name="aalb-marketplace-names-list">
64
+ <option value="no-selection" disabled="disabled">{{select_marketplace_label}}</option>
65
+ {{#each marketplace_list}}
66
+ <option value="{{this}}" {{selected this ..
67
+ /default_marketplace}}>{{this}}</option>
68
+ {{/each}}
69
+ </select>
70
+ </div>
71
+ <div class="aalb-admin-popup-store aalb-width-25 aalb-table-cell">
72
+ <select class="aalb-admin-popup-store-id" name="aalb-admin-popup-store-id">
73
+ <option value="no-selection" disabled="disabled">{{select_associate_id_label}}</option>
74
+ {{#each default_store_id_list}}
75
+ <option value="{{this}}" {{selected this ..
76
+ /default_store_id}}>{{this}}</option>
77
+ {{/each}}
78
+ </select>
79
+ </div>
80
+
81
+ <div class="aalb-width-40 aalb-table-cell">
82
+ <input type="text" class="aalb-admin-popup-input-search" name="aalb-admin-popup-input-search" placeholder="{{searchbox_placeholder}}" />
83
+ </div>
84
+ <div class="aalb-admin-searchbox aalb-width-10 aalb-table-cell">
85
+ <button class="aalb-btn aalb-btn-primary aalb-admin-popup-search-button" type="button">{{search_button_label}}</button>
86
+ </div>
87
+ </div>
88
+ </div>
89
+ <fieldset class="aalb-admin-popup-search-result aalb-admin-popup-fieldset">
90
+ <legend class="aalb-admin-popup-legend">{{click_to_select_products_label}}</legend>
91
+ <div class="aalb-admin-alert aalb-admin-alert-info aalb-admin-popup-placeholder">{{searched_products_box_placeholder}}</div>
92
+ </fieldset>
93
+ <fieldset class="aalb-selected aalb-admin-popup-fieldset">
94
+ <legend class="aalb-admin-popup-legend">{{selected_products_list_label}}</legend>
95
+ <div class="aalb-admin-alert aalb-admin-alert-info aalb-admin-popup-placeholder">{{selected_products_box_placeholder}}</div>
96
+ </fieldset>
97
+ </div>
98
+ </script>
admin/sidebar/aalb_sidebar.php CHANGED
@@ -54,6 +54,7 @@ class Aalb_Sidebar {
54
  register_setting( AALB_CRED_CONFIG_GROUP, AALB_STORE_ID_NAMES );
55
  register_setting( AALB_CRED_CONFIG_GROUP, AALB_STORE_IDS );
56
  register_setting( AALB_CRED_CONFIG_GROUP, AALB_NO_REFERRER_DISABLED );
 
57
  }
58
 
59
  /**
54
  register_setting( AALB_CRED_CONFIG_GROUP, AALB_STORE_ID_NAMES );
55
  register_setting( AALB_CRED_CONFIG_GROUP, AALB_STORE_IDS );
56
  register_setting( AALB_CRED_CONFIG_GROUP, AALB_NO_REFERRER_DISABLED );
57
+ register_setting( AALB_CRED_CONFIG_GROUP, AALB_CUSTOM_UPLOAD_PATH );
58
  }
59
 
60
  /**
admin/sidebar/partials/aalb_credentials.php CHANGED
@@ -13,7 +13,10 @@ and limitations under the License.
13
  */
14
 
15
  include 'aalb_admin_ui_common.php';
16
- include 'aalb_credentials_locale_row.php'
 
 
 
17
  ?>
18
  <!-- ToDO: 1. Convert table to div. 2. Put complete code under handlebars as currently store-id settings loads 1 second after page load-->
19
  <!-- ToDO: 3. Include JSHint 4. See how can we leverage any of the libraries from Angular,React or VueJS -->
@@ -35,7 +38,6 @@ include 'aalb_credentials_locale_row.php'
35
  <form id="aalb-credentials-form" method="post" action="options.php">
36
  <?php settings_fields( AALB_CRED_CONFIG_GROUP );
37
  do_settings_sections( AALB_CRED_CONFIG_GROUP ); ?>
38
-
39
  <script id="aalb-hbs-store-id-settings" type="text/x-handlebars-template">
40
  <fieldset class="aalb-settings-fieldset">
41
  <legend class="aalb-settings-legend"> {{tracking_id_fieldset_label}}</legend>
@@ -85,11 +87,21 @@ include 'aalb_credentials_locale_row.php'
85
  <td><?php esc_html_e( "The ad template that will be used for rendering the ad if no template is specified in the short code.", 'amazon-associates-link-builder' ) ?>
86
  </td>
87
  </tr>
 
 
 
 
 
 
 
 
 
 
88
  <tr>
89
  <td scope="row" colspan="2" class="aalb-settings-input-column">
90
  <input id=<?php echo AALB_NO_REFERRER_DISABLED ?> type="checkbox" name=<?php echo AALB_NO_REFERRER_DISABLED ?> value="true"<?php if ( get_option( AALB_NO_REFERRER_DISABLED ) )
91
  echo "checked='checked'"; ?> />
92
- <label class="aalb-settings-no-referrer-text" for="aalb_no_referrer_disabled">
93
  <?php /* translators: %s: rel="noreferrer" attribute */
94
  printf( esc_html__( "Remove %s for Amazon Affiliate Links from all posts", 'amazon-associates-link-builder' ), "rel=\"noreferrer\"" ); ?></label>
95
  </td>
13
  */
14
 
15
  include 'aalb_admin_ui_common.php';
16
+ include 'aalb_credentials_locale_row.php';
17
+
18
+ $cred_helper = new Aalb_Credentials_Helper();
19
+ $cred_helper->handle_error_notices();
20
  ?>
21
  <!-- ToDO: 1. Convert table to div. 2. Put complete code under handlebars as currently store-id settings loads 1 second after page load-->
22
  <!-- ToDO: 3. Include JSHint 4. See how can we leverage any of the libraries from Angular,React or VueJS -->
38
  <form id="aalb-credentials-form" method="post" action="options.php">
39
  <?php settings_fields( AALB_CRED_CONFIG_GROUP );
40
  do_settings_sections( AALB_CRED_CONFIG_GROUP ); ?>
 
41
  <script id="aalb-hbs-store-id-settings" type="text/x-handlebars-template">
42
  <fieldset class="aalb-settings-fieldset">
43
  <legend class="aalb-settings-legend"> {{tracking_id_fieldset_label}}</legend>
87
  <td><?php esc_html_e( "The ad template that will be used for rendering the ad if no template is specified in the short code.", 'amazon-associates-link-builder' ) ?>
88
  </td>
89
  </tr>
90
+ <tr>
91
+ <th scope="row" class="aalb-settings-identifier"><?php esc_html_e( "Downloads Folder", 'amazon-associates-link-builder' ) ?></th>
92
+ <td class="aalb-settings-input-column">
93
+ <input type="text" name=<?php echo AALB_CUSTOM_UPLOAD_PATH ?> class="aalb-settings-input-field"
94
+ value="<?php echo get_option( AALB_CUSTOM_UPLOAD_PATH ) ?>" />
95
+ </td>
96
+ <td>
97
+ <?php printf( __("This folder will be used to save files downloaded by the plugin (e.g. <a href=%1s target=%2s>The MaxMind IP2Country Database</a>) for local use. Absolute path required. <br><span class=\"aalb-bold\"> Default value:</span> *blank*, defaults to <code>wp_upload_dir()['basedir'] + '%3s'</code>", 'amazon-associates-link-builder' ), AALB_GEOLITE_COUNTRY_DB_DETAILS_URL, AALB_NEW_PAGE_TARGET, AALB_UPLOADS_FOLDER ); ?>
98
+ </td>
99
+ </tr>
100
  <tr>
101
  <td scope="row" colspan="2" class="aalb-settings-input-column">
102
  <input id=<?php echo AALB_NO_REFERRER_DISABLED ?> type="checkbox" name=<?php echo AALB_NO_REFERRER_DISABLED ?> value="true"<?php if ( get_option( AALB_NO_REFERRER_DISABLED ) )
103
  echo "checked='checked'"; ?> />
104
+ <label class="aalb-font-size-110" for="aalb_no_referrer_disabled">
105
  <?php /* translators: %s: rel="noreferrer" attribute */
106
  printf( esc_html__( "Remove %s for Amazon Affiliate Links from all posts", 'amazon-associates-link-builder' ), "rel=\"noreferrer\"" ); ?></label>
107
  </td>
admin/sidebar/partials/aalb_ui_common.php CHANGED
@@ -21,17 +21,17 @@ function aalb_info_notice( $message ) {
21
 
22
  function aalb_warning_notice( $message ) {
23
  /* translators: %s: Warning message */
24
- echo "<div class=\"notice notice-warning\"><p>" . sprintf( esc_html__( "WARNING - %s", 'amazon-associates-link-builder' ), $message ) . "</p></div>";
25
  }
26
 
27
  function aalb_error_notice( $message ) {
28
  /* translators: %s: Error message */
29
- echo "<div class=\"notice notice-error\"><p>" . sprintf( esc_html__( "ERROR - %s", 'amazon-associates-link-builder' ), $message ) . "</p></div>";
30
  }
31
 
32
  function aalb_success_notice( $message ) {
33
  /* translators: %s: Success message */
34
- echo "<div class=\"notice notice-success\"><p>" . sprintf( esc_html__( "SUCCESS - %s", 'amazon-associates-link-builder' ), $message ) . "</p></div>";
35
  }
36
 
37
  ?>
21
 
22
  function aalb_warning_notice( $message ) {
23
  /* translators: %s: Warning message */
24
+ echo "<div class=\"notice notice-warning is-dismissible\"><p>" . sprintf( esc_html__( "WARNING - %s", 'amazon-associates-link-builder' ), $message ) . "</p></div>";
25
  }
26
 
27
  function aalb_error_notice( $message ) {
28
  /* translators: %s: Error message */
29
+ echo "<div class=\"notice notice-error is-dismissible\"><p>" . sprintf( esc_html__( "ERROR - %s", 'amazon-associates-link-builder' ), $message ) . "</p></div>";
30
  }
31
 
32
  function aalb_success_notice( $message ) {
33
  /* translators: %s: Success message */
34
+ echo "<div class=\"notice notice-success is-dismissible\"><p>" . sprintf( esc_html__( "SUCCESS - %s", 'amazon-associates-link-builder' ), $message ) . "</p></div>";
35
  }
36
 
37
  ?>
admin/sidebar/partials/helper/aalb_credentials_helper.php CHANGED
@@ -108,6 +108,35 @@ class Aalb_Credentials_Helper {
108
 
109
  return json_encode( array_values( $aalb_marketplace_names ) );
110
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
  }
112
 
113
  ?>
108
 
109
  return json_encode( array_values( $aalb_marketplace_names ) );
110
  }
111
+
112
+ /**
113
+ * Prints admin error notices specific to geolite db on settings page
114
+ *
115
+ * @since 1.5.0
116
+ */
117
+ public function handle_error_notices() {
118
+ $maxmind_db_manager = new Aalb_Maxmind_Db_Manager();
119
+ if ( $this->is_more_than_one_marketplaces_configured() ) {
120
+ if ( ! is_readable( $maxmind_db_manager->db_file_path ) ) {
121
+ aalb_error_notice( sprintf( esc_html__( "The file used to fetch country details to enable geo-targetted links doesn't have read permissions. Please give recursive read/write permissons to:%s. In case you are still facing the issue, please change download folder in Site Wide Settings section on this page.", 'amazon-associates-link-builder' ), $maxmind_db_manager->db_file_path ) );
122
+ } else if ( ! is_writable( $maxmind_db_manager->db_file_path ) ) {
123
+ aalb_error_notice( sprintf( esc_html__( "The file used to fetch country details to enable geo-targetted links doesn't have write permissions. Please give recursive read/write permissons to:%s. In case you are still facing the issue, please change download folder in Site Wide Settings section on this page", 'amazon-associates-link-builder' ), $maxmind_db_manager->db_file_path ) );
124
+ } else if ( ! is_writable( $maxmind_db_manager->db_upload_dir ) ) {
125
+ aalb_error_notice( sprintf( esc_html__( "The directory where the file used to fetch country details to enable geo-targetted links doesn't have write permissions. Please give recursive read/write permissons to:%s. In case you are still facing the issue, please change download folder in Site Wide Settings section on this page", 'amazon-associates-link-builder' ), $maxmind_db_manager->db_upload_dir ) );
126
+ }
127
+ }
128
+ }
129
+
130
+ /**
131
+ * Checks if more than one marketplaces have been configured in settings
132
+ *
133
+ * @since 1.5.0
134
+ *
135
+ * @return bool True if more than one marketplaces configured in settings
136
+ */
137
+ public function is_more_than_one_marketplaces_configured() {
138
+ return count( json_decode( get_option( AALB_STORE_IDS ), true ) ) > 1;
139
+ }
140
  }
141
 
142
  ?>
amazon-associates-link-builder.php CHANGED
@@ -7,7 +7,7 @@
7
  /*
8
  Plugin Name: Amazon Associates Link Builder
9
  Description: Amazon Associates Link Builder is the official free Amazon Associates Program plugin for WordPress. The plugin enables you to search for products in the Amazon catalog, access real-time price and availability information, and easily create links in your posts to products on Amazon.com. You will be able to generate text links, create custom ad units, or take advantage of out-of-the-box widgets that we’ve designed and included with the plugin.
10
- Version: 1.4.13
11
  Author: Amazon Associates Program
12
  Author URI: https://affiliate-program.amazon.com/
13
  License: GPLv2
@@ -54,6 +54,8 @@ function aalb_autoload() {
54
  require_once( MUSTACHE_AUTOLOADER_PHP );
55
  Mustache_Autoloader::register();
56
 
 
 
57
  //Load the autoloader for plugin files.
58
  require_once( AALB_AUTOLOADER );
59
  Aalb_Autoloader::register();
7
  /*
8
  Plugin Name: Amazon Associates Link Builder
9
  Description: Amazon Associates Link Builder is the official free Amazon Associates Program plugin for WordPress. The plugin enables you to search for products in the Amazon catalog, access real-time price and availability information, and easily create links in your posts to products on Amazon.com. You will be able to generate text links, create custom ad units, or take advantage of out-of-the-box widgets that we’ve designed and included with the plugin.
10
+ Version: 1.5.0
11
  Author: Amazon Associates Program
12
  Author URI: https://affiliate-program.amazon.com/
13
  License: GPLv2
54
  require_once( MUSTACHE_AUTOLOADER_PHP );
55
  Mustache_Autoloader::register();
56
 
57
+ require_once(AALB_PLUGIN_DIR . 'vendor/autoload.php');
58
+
59
  //Load the autoloader for plugin files.
60
  require_once( AALB_AUTOLOADER );
61
  Aalb_Autoloader::register();
composer.json ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ {
2
+ "require": {
3
+ "geoip2/geoip2": "~2.0"
4
+ }
5
+ }
composer.lock ADDED
@@ -0,0 +1,232 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_readme": [
3
+ "This file locks the dependencies of your project to a known state",
4
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
5
+ "This file is @generated automatically"
6
+ ],
7
+ "content-hash": "25737d43de99fb5d718029bd29d5374e",
8
+ "packages": [
9
+ {
10
+ "name": "composer/ca-bundle",
11
+ "version": "1.0.9",
12
+ "source": {
13
+ "type": "git",
14
+ "url": "https://github.com/composer/ca-bundle.git",
15
+ "reference": "36344aeffdc37711335563e6108cda86566432a6"
16
+ },
17
+ "dist": {
18
+ "type": "zip",
19
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/36344aeffdc37711335563e6108cda86566432a6",
20
+ "reference": "36344aeffdc37711335563e6108cda86566432a6",
21
+ "shasum": ""
22
+ },
23
+ "require": {
24
+ "ext-openssl": "*",
25
+ "ext-pcre": "*",
26
+ "php": "^5.3.2 || ^7.0"
27
+ },
28
+ "require-dev": {
29
+ "phpunit/phpunit": "^4.5",
30
+ "psr/log": "^1.0",
31
+ "symfony/process": "^2.5 || ^3.0"
32
+ },
33
+ "suggest": {
34
+ "symfony/process": "This is necessary to reliably check whether openssl_x509_parse is vulnerable on older php versions, but can be ignored on PHP 5.5.6+"
35
+ },
36
+ "type": "library",
37
+ "extra": {
38
+ "branch-alias": {
39
+ "dev-master": "1.x-dev"
40
+ }
41
+ },
42
+ "autoload": {
43
+ "psr-4": {
44
+ "Composer\\CaBundle\\": "src"
45
+ }
46
+ },
47
+ "notification-url": "https://packagist.org/downloads/",
48
+ "license": [
49
+ "MIT"
50
+ ],
51
+ "authors": [
52
+ {
53
+ "name": "Jordi Boggiano",
54
+ "email": "j.boggiano@seld.be",
55
+ "homepage": "http://seld.be"
56
+ }
57
+ ],
58
+ "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
59
+ "keywords": [
60
+ "cabundle",
61
+ "cacert",
62
+ "certificate",
63
+ "ssl",
64
+ "tls"
65
+ ],
66
+ "time": "2017-11-13T15:51:25+00:00"
67
+ },
68
+ {
69
+ "name": "geoip2/geoip2",
70
+ "version": "v2.7.0",
71
+ "source": {
72
+ "type": "git",
73
+ "url": "https://github.com/maxmind/GeoIP2-php.git",
74
+ "reference": "ca9f9a244474d97eac1ef542aaced7cc944bafbe"
75
+ },
76
+ "dist": {
77
+ "type": "zip",
78
+ "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/ca9f9a244474d97eac1ef542aaced7cc944bafbe",
79
+ "reference": "ca9f9a244474d97eac1ef542aaced7cc944bafbe",
80
+ "shasum": ""
81
+ },
82
+ "require": {
83
+ "maxmind-db/reader": "~1.0",
84
+ "maxmind/web-service-common": "~0.4",
85
+ "php": ">=5.4"
86
+ },
87
+ "require-dev": {
88
+ "apigen/apigen": "*",
89
+ "friendsofphp/php-cs-fixer": "2.*",
90
+ "phpunit/phpunit": "4.*",
91
+ "squizlabs/php_codesniffer": "3.*"
92
+ },
93
+ "type": "library",
94
+ "autoload": {
95
+ "psr-4": {
96
+ "GeoIp2\\": "src"
97
+ }
98
+ },
99
+ "notification-url": "https://packagist.org/downloads/",
100
+ "license": [
101
+ "Apache-2.0"
102
+ ],
103
+ "authors": [
104
+ {
105
+ "name": "Gregory J. Oschwald",
106
+ "email": "goschwald@maxmind.com",
107
+ "homepage": "http://www.maxmind.com/"
108
+ }
109
+ ],
110
+ "description": "MaxMind GeoIP2 PHP API",
111
+ "homepage": "https://github.com/maxmind/GeoIP2-php",
112
+ "keywords": [
113
+ "IP",
114
+ "geoip",
115
+ "geoip2",
116
+ "geolocation",
117
+ "maxmind"
118
+ ],
119
+ "time": "2017-10-27T19:20:22+00:00"
120
+ },
121
+ {
122
+ "name": "maxmind-db/reader",
123
+ "version": "v1.2.0",
124
+ "source": {
125
+ "type": "git",
126
+ "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
127
+ "reference": "1647820dfbcb552222fb5feb3a8387e2636394c9"
128
+ },
129
+ "dist": {
130
+ "type": "zip",
131
+ "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/1647820dfbcb552222fb5feb3a8387e2636394c9",
132
+ "reference": "1647820dfbcb552222fb5feb3a8387e2636394c9",
133
+ "shasum": ""
134
+ },
135
+ "require": {
136
+ "php": ">=5.4"
137
+ },
138
+ "require-dev": {
139
+ "friendsofphp/php-cs-fixer": "2.*",
140
+ "phpunit/phpunit": "4.*",
141
+ "satooshi/php-coveralls": "1.0.*",
142
+ "squizlabs/php_codesniffer": "3.*"
143
+ },
144
+ "suggest": {
145
+ "ext-bcmath": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
146
+ "ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
147
+ "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups"
148
+ },
149
+ "type": "library",
150
+ "autoload": {
151
+ "psr-4": {
152
+ "MaxMind\\Db\\": "src/MaxMind/Db"
153
+ }
154
+ },
155
+ "notification-url": "https://packagist.org/downloads/",
156
+ "license": [
157
+ "Apache-2.0"
158
+ ],
159
+ "authors": [
160
+ {
161
+ "name": "Gregory J. Oschwald",
162
+ "email": "goschwald@maxmind.com",
163
+ "homepage": "http://www.maxmind.com/"
164
+ }
165
+ ],
166
+ "description": "MaxMind DB Reader API",
167
+ "homepage": "https://github.com/maxmind/MaxMind-DB-Reader-php",
168
+ "keywords": [
169
+ "database",
170
+ "geoip",
171
+ "geoip2",
172
+ "geolocation",
173
+ "maxmind"
174
+ ],
175
+ "time": "2017-10-27T19:15:33+00:00"
176
+ },
177
+ {
178
+ "name": "maxmind/web-service-common",
179
+ "version": "v0.4.0",
180
+ "source": {
181
+ "type": "git",
182
+ "url": "https://github.com/maxmind/web-service-common-php.git",
183
+ "reference": "622f7c732a7f9c4c62497fc103939e042b6bdb88"
184
+ },
185
+ "dist": {
186
+ "type": "zip",
187
+ "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/622f7c732a7f9c4c62497fc103939e042b6bdb88",
188
+ "reference": "622f7c732a7f9c4c62497fc103939e042b6bdb88",
189
+ "shasum": ""
190
+ },
191
+ "require": {
192
+ "composer/ca-bundle": "^1.0.3",
193
+ "ext-curl": "*",
194
+ "ext-json": "*",
195
+ "php": ">=5.4"
196
+ },
197
+ "require-dev": {
198
+ "friendsofphp/php-cs-fixer": "2.*",
199
+ "phpunit/phpunit": "4.*",
200
+ "squizlabs/php_codesniffer": "3.*"
201
+ },
202
+ "type": "library",
203
+ "autoload": {
204
+ "psr-4": {
205
+ "MaxMind\\Exception\\": "src/Exception",
206
+ "MaxMind\\WebService\\": "src/WebService"
207
+ }
208
+ },
209
+ "notification-url": "https://packagist.org/downloads/",
210
+ "license": [
211
+ "Apache-2.0"
212
+ ],
213
+ "authors": [
214
+ {
215
+ "name": "Gregory Oschwald",
216
+ "email": "goschwald@maxmind.com"
217
+ }
218
+ ],
219
+ "description": "Internal MaxMind Web Service API",
220
+ "homepage": "https://github.com/maxmind/web-service-common-php",
221
+ "time": "2017-07-06T17:48:21+00:00"
222
+ }
223
+ ],
224
+ "packages-dev": [],
225
+ "aliases": [],
226
+ "minimum-stability": "stable",
227
+ "stability-flags": [],
228
+ "prefer-stable": false,
229
+ "prefer-lowest": false,
230
+ "platform": [],
231
+ "platform-dev": []
232
+ }
composer.phar ADDED
Binary file
css/aalb_basics.css CHANGED
@@ -81,3 +81,13 @@ and limitations under the License.
81
  .pull-left {
82
  float: left;
83
  }
 
 
 
 
 
 
 
 
 
 
81
  .pull-left {
82
  float: left;
83
  }
84
+
85
+ .aalb-preview-message {
86
+ color: #ff0000;
87
+ font-weight: bold;
88
+ margin-top: 10px;
89
+ }
90
+
91
+ .aalb-bold {
92
+ font-weight: bold;
93
+ }
includes/aalb_activator.php CHANGED
@@ -40,26 +40,6 @@ class Aalb_Activator {
40
  $this->helper->refresh_template_list();
41
  }
42
 
43
- /**
44
- * Add the aws key options into the database on activation.
45
- * This solves the problem of encryption as wordpress called an update option before calling
46
- * add option while sanitizing.
47
- * https://codex.wordpress.org/Function_Reference/register_setting
48
- *
49
- * @since 1.0.0
50
- */
51
- private function load_db_keys() {
52
- if ( ! get_option( AALB_AWS_ACCESS_KEY ) ) {
53
- update_option( AALB_AWS_ACCESS_KEY, '' );
54
- }
55
- if ( ! get_option( AALB_AWS_SECRET_KEY ) ) {
56
- update_option( AALB_AWS_SECRET_KEY, '' );
57
- }
58
- if ( ! get_option( AALB_STORE_IDS ) ) {
59
- update_option( AALB_STORE_IDS, '' );
60
- }
61
- }
62
-
63
  /**
64
  * Halts activation process if the plugin is not compatible with the user environment
65
  *
@@ -80,7 +60,6 @@ class Aalb_Activator {
80
  function activate() {
81
  if($this->aalb_compatibility_helper->is_plugin_compatible()) {
82
  $this->load_templates();
83
- $this->load_db_keys();
84
  } else {
85
  $this->halt_activation();
86
  }
40
  $this->helper->refresh_template_list();
41
  }
42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  /**
44
  * Halts activation process if the plugin is not compatible with the user environment
45
  *
60
  function activate() {
61
  if($this->aalb_compatibility_helper->is_plugin_compatible()) {
62
  $this->load_templates();
 
63
  } else {
64
  $this->halt_activation();
65
  }
includes/aalb_autoloader.php CHANGED
@@ -53,6 +53,7 @@ class Aalb_Autoloader {
53
  new self( AALB_SHORTCODE_DIR );
54
  new self( AALB_LIBRARY_DIR );
55
  new self( AALB_SIDEBAR_HELPER_DIR );
 
56
  }
57
 
58
  /**
53
  new self( AALB_SHORTCODE_DIR );
54
  new self( AALB_LIBRARY_DIR );
55
  new self( AALB_SIDEBAR_HELPER_DIR );
56
+ new self( AALB_IP_2_COUNTRY_DIR );
57
  }
58
 
59
  /**
includes/aalb_cache_loader.php CHANGED
@@ -38,15 +38,16 @@ class Aalb_Cache_Loader {
38
  *
39
  * @param string $key Unique identification of the information.
40
  * @param string $url URL for making a request.
 
41
  *
42
  * @return string GET Response.
43
  */
44
- public function load( $key, $url ) {
45
  $info = $this->lookup( $key );
46
  if ( $info !== false ) {
47
  return $info;
48
  } else {
49
- return $this->load_and_save( $key, $url );
50
  }
51
  }
52
 
@@ -68,15 +69,15 @@ class Aalb_Cache_Loader {
68
  *
69
  * @param string $key Unique identification of the information.
70
  * @param string $url URL for making a request.
 
71
  *
72
  * @return string GET Response.
73
  */
74
- private function load_and_save( $key, $url ) {
75
  $info = $this->loader->load( $url );
76
 
77
  //use wordpress linkcode
78
- $info = str_replace( 'linkCode%3Dxm2', 'linkCode%3Dalb', $info );
79
- $info = str_replace( 'linkCode=xm2', 'linkCode=alb', $info );
80
 
81
  $this->helper->clear_expired_transients_at_intervals();
82
  set_transient( $key, $info, AALB_CACHE_FOR_ASIN_RAWINFO_TTL );
38
  *
39
  * @param string $key Unique identification of the information.
40
  * @param string $url URL for making a request.
41
+ * @param string $link_code Link Code to be entered in URLS for attribution purposes.
42
  *
43
  * @return string GET Response.
44
  */
45
+ public function load( $key, $url, $link_code = AALB_DEFAULT_LINK_CODE ) {
46
  $info = $this->lookup( $key );
47
  if ( $info !== false ) {
48
  return $info;
49
  } else {
50
+ return $this->load_and_save( $key, $url, $link_code );
51
  }
52
  }
53
 
69
  *
70
  * @param string $key Unique identification of the information.
71
  * @param string $url URL for making a request.
72
+ * @param string $link_code Link Code to be entered in URLS for attribution purposes.
73
  *
74
  * @return string GET Response.
75
  */
76
+ private function load_and_save( $key, $url, $link_code ) {
77
  $info = $this->loader->load( $url );
78
 
79
  //use wordpress linkcode
80
+ $info = preg_replace( "/linkCode(%3D|=)\w{1,3}/", "linkCode$1" . $link_code, $info );
 
81
 
82
  $this->helper->clear_expired_transients_at_intervals();
83
  set_transient( $key, $info, AALB_CACHE_FOR_ASIN_RAWINFO_TTL );
includes/aalb_helper.php CHANGED
@@ -132,20 +132,10 @@ class Aalb_Helper {
132
  public function show_error_in_preview( $error_message ) {
133
  if ( is_preview() ) {
134
  //If it's preview mode
135
- echo "<br><font color='red'><b>" . $error_message . "</b></font>";
136
  }
137
  }
138
 
139
- /**
140
- * Returns the Store IDs Array.
141
- * Returns AALB_DEFAULT_STORE_ID_NAME if the nothing is specified.
142
- *
143
- * @since 1.0.0
144
- */
145
- public function get_store_ids_array() {
146
- return explode( "\r\n", strlen( get_option( AALB_STORE_ID_NAMES ) ) ? get_option( AALB_STORE_ID_NAMES ) : AALB_DEFAULT_STORE_ID_NAME );
147
- }
148
-
149
  /**
150
  * Fetches the Wordpress version number
151
  *
@@ -298,6 +288,37 @@ class Aalb_Helper {
298
  public function aalb_get_file_extension( $file_name ) {
299
  return substr( strrchr( $file_name, '.' ), 1 );
300
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
301
  }
302
 
303
  ?>
132
  public function show_error_in_preview( $error_message ) {
133
  if ( is_preview() ) {
134
  //If it's preview mode
135
+ echo '<div class="aalb-preview-message">' . $error_message . '</div>';
136
  }
137
  }
138
 
 
 
 
 
 
 
 
 
 
 
139
  /**
140
  * Fetches the Wordpress version number
141
  *
288
  public function aalb_get_file_extension( $file_name ) {
289
  return substr( strrchr( $file_name, '.' ), 1 );
290
  }
291
+
292
+ /**
293
+ * Add the aws key options into the database on activation.
294
+ * This solves the problem of encryption as wordpress called an update option before calling
295
+ * add option while sanitizing.
296
+ * https://codex.wordpress.org/Function_Reference/register_setting
297
+ *
298
+ * @since 1.0.0
299
+ */
300
+ public function load_db_keys() {
301
+ $this->init_option_if_empty( AALB_AWS_ACCESS_KEY, '' );
302
+ $this->init_option_if_empty( AALB_AWS_SECRET_KEY, '' );
303
+ $this->init_option_if_empty( AALB_STORE_IDS, '' );
304
+ $this->init_option_if_empty( AALB_CUSTOM_UPLOAD_PATH, '' );
305
+ $this->init_option_if_empty( AALB_GEOLITE_DB_EXPIRATION_TIME, 0 );
306
+ $this->init_option_if_empty( AALB_GEOLITE_DB_LAST_UPDATED_TIME, 0 );
307
+ }
308
+
309
+ /**
310
+ * Initialize db option with the value provided
311
+ *
312
+ * @param String db_key Database key
313
+ * @param String db_value Database Value
314
+ *
315
+ * @since 1.5.0
316
+ */
317
+ private function init_option_if_empty( $dbkey, $dbvalue ) {
318
+ if ( ! get_option( $dbkey ) ) {
319
+ update_option( $dbkey, $dbvalue );
320
+ }
321
+ }
322
  }
323
 
324
  ?>
includes/aalb_manager.php CHANGED
@@ -23,10 +23,12 @@ class Aalb_Manager {
23
 
24
  protected $hook_loader;
25
  protected $shortcode_loader;
 
26
 
27
  public function __construct() {
28
  $this->hook_loader = new Aalb_Hook_Loader();
29
  $this->shortcode_loader = new Aalb_Shortcode_Loader();
 
30
 
31
  //add the hooks specific to admin.
32
  $this->add_admin_hooks();
@@ -56,6 +58,9 @@ class Aalb_Manager {
56
  $aalb_sidebar = new Aalb_Sidebar();
57
  $this->hook_loader->add_action( 'admin_init', $aalb_sidebar, 'register_cred_config_group' );
58
  $this->hook_loader->add_action( 'admin_menu', $aalb_sidebar, 'register_sidebar_config_page' );
 
 
 
59
  }
60
 
61
  /**
@@ -64,10 +69,7 @@ class Aalb_Manager {
64
  * @since 1.0.0
65
  */
66
  private function register_shortcode_hooks() {
67
- $aalb_shortcode = $this->shortcode_loader->get_amazon_link_shortcode();
68
- $aalb_shortcode_text = $this->shortcode_loader->get_amazon_textlink_shortcode();
69
- $this->hook_loader->add_action( 'wp_enqueue_scripts', $aalb_shortcode, 'enqueue_styles' );
70
- $this->hook_loader->add_action( 'wp_enqueue_scripts', $aalb_shortcode_text, 'enqueue_styles' );
71
  }
72
 
73
  /**
23
 
24
  protected $hook_loader;
25
  protected $shortcode_loader;
26
+ protected $shortcode_manager;
27
 
28
  public function __construct() {
29
  $this->hook_loader = new Aalb_Hook_Loader();
30
  $this->shortcode_loader = new Aalb_Shortcode_Loader();
31
+ $this->shortcode_manager = new Aalb_Shortcode_Manager();
32
 
33
  //add the hooks specific to admin.
34
  $this->add_admin_hooks();
58
  $aalb_sidebar = new Aalb_Sidebar();
59
  $this->hook_loader->add_action( 'admin_init', $aalb_sidebar, 'register_cred_config_group' );
60
  $this->hook_loader->add_action( 'admin_menu', $aalb_sidebar, 'register_sidebar_config_page' );
61
+
62
+ $maxmind_db_manager = new Aalb_Maxmind_Db_Manager();
63
+ $this->hook_loader->add_action( 'plugins_loaded', $maxmind_db_manager, 'update_db_if_required' );
64
  }
65
 
66
  /**
69
  * @since 1.0.0
70
  */
71
  private function register_shortcode_hooks() {
72
+ $this->hook_loader->add_action( 'wp_enqueue_scripts', $this->shortcode_manager, 'enqueue_styles' );
 
 
 
73
  }
74
 
75
  /**
includes/aalb_template_engine.php CHANGED
@@ -47,12 +47,14 @@ class Aalb_Template_Engine {
47
  * @param string $products_key Key of the combined products.
48
  * @param string $template Template to render the display unit.
49
  * @param string $url Url to get the product from if not present in cache.
 
 
50
  *
51
  * @return string HTML of the disply unit.
52
  */
53
- public function render( $display_key, $products_key, $template, $url, $marketplace ) {
54
  if ( false === ( $display_unit = $this->cache_template_loader->get_display_unit( $display_key ) ) ) {
55
- $products = $this->get_products( $products_key, $url );
56
  $xml = $this->parse( $products );
57
  $items = $this->get_items( $xml );
58
 
@@ -73,11 +75,12 @@ class Aalb_Template_Engine {
73
  *
74
  * @param string $key Unique identification of the product.
75
  * @param string $url Signed URL for the PAAPI request.
 
76
  *
77
  * @return string Xml response from PAAPI.
78
  */
79
- private function get_products( $key, $url ) {
80
- return $this->xml_loader->load( $key, $url );
81
  }
82
 
83
  /**
47
  * @param string $products_key Key of the combined products.
48
  * @param string $template Template to render the display unit.
49
  * @param string $url Url to get the product from if not present in cache.
50
+ * @param string $marketplace Marketplace to which the product belongs.
51
+ * @param string $link_code Link Code to be entered in URLS for attribution purposes.
52
  *
53
  * @return string HTML of the disply unit.
54
  */
55
+ public function render( $display_key, $products_key, $template, $url, $marketplace, $link_code ) {
56
  if ( false === ( $display_unit = $this->cache_template_loader->get_display_unit( $display_key ) ) ) {
57
+ $products = $this->get_products( $products_key, $url, $link_code );
58
  $xml = $this->parse( $products );
59
  $items = $this->get_items( $xml );
60
 
75
  *
76
  * @param string $key Unique identification of the product.
77
  * @param string $url Signed URL for the PAAPI request.
78
+ * @param string $link_code Link Code to be entered in URLS for attribution purposes.
79
  *
80
  * @return string Xml response from PAAPI.
81
  */
82
+ private function get_products( $key, $url, $link_code ) {
83
+ return $this->xml_loader->load( $key, $url, $link_code );
84
  }
85
 
86
  /**
ip2country/aalb_customer_country.php ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Copyright 2016-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+
5
+ Licensed under the GNU General Public License as published by the Free Software Foundation,
6
+ Version 2.0 (the "License"). You may not use this file except in compliance with the License.
7
+ A copy of the License is located in the "license" file accompanying this file.
8
+
9
+ This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
10
+ either express or implied. See the License for the specific language governing permissions
11
+ and limitations under the License.
12
+ */
13
+
14
+ /**
15
+ *
16
+ * Gets the Country from which customer is coming using his IP Address
17
+ *
18
+ * @since 1.5.0
19
+ * @package AmazonAssociatesLinkBuilder
20
+ * @subpackage AmazonAssociatesLinkBuilder/ip2country
21
+ */
22
+
23
+ use GeoIp2\Database\Reader;
24
+
25
+ class Aalb_Customer_Country {
26
+ private $customer_ip_address;
27
+ private $helper;
28
+ private $maxmind_db_manager;
29
+ private $credentials_helper;
30
+
31
+ public function __construct() {
32
+ $this->customer_ip_address = new Aalb_Customer_Ip_Address();
33
+ $this->helper = new Aalb_Helper();
34
+ $this->maxmind_db_manager = new Aalb_Maxmind_Db_Manager();
35
+ $this->credentials_helper = new Aalb_Credentials_Helper();
36
+ }
37
+
38
+ /**
39
+ * Gets the country of the customer from ip Address
40
+ *
41
+ * @since 1.5.0
42
+ *
43
+ * @return string Country of the customer
44
+ */
45
+ public function get_country_iso_code() {
46
+ $ip = $this->customer_ip_address->get();
47
+ $country_code = "";
48
+ $reader = $this->get_reader();
49
+ if ( $reader ) {
50
+ try {
51
+ $record = $reader->country( $ip );
52
+ $country_code = $record->country->isoCode;
53
+ //In the ISO code list, "GB" is used to refer to "UK" but since in Amazon we call it UK, so override that
54
+ $country_code = $country_code === "GB" ? "UK" : $country_code;
55
+ } catch ( Exception $e ) {
56
+ error_log( "Aalb_Customer_Country:get_country_iso_code failed." . $e->getMessage() );
57
+ } finally {
58
+ $reader->close();
59
+ }
60
+ }
61
+
62
+ return $country_code;
63
+ }
64
+
65
+ /**
66
+ * Gets the instance of reader class of maxmind with GeoLiteCountryDB
67
+ *
68
+ * @since 1.5.0
69
+ *
70
+ * @return Reader Instance of Reader class of Maxmind
71
+ */
72
+ private function get_reader() {
73
+ $maxmind_db_file = $this->get_maxmind_db_file();
74
+ $reader = null;
75
+ if ( $maxmind_db_file ) {
76
+ try {
77
+ $reader = new Reader( $maxmind_db_file );
78
+ } catch ( Exception $e ) {
79
+ error_log( "Aalb_Customer_Country:get_reader failed." . $e->getMessage() );
80
+ }
81
+ }
82
+
83
+ return $reader;
84
+ }
85
+
86
+ /**
87
+ * Gets the maxmind db file name with complete path
88
+ *
89
+ * @since 1.5.0
90
+ *
91
+ * @return String Maxmind db file name with complete path
92
+ */
93
+ private function get_maxmind_db_file() {
94
+ $maxmind_file = $this->maxmind_db_manager->db_file_path;
95
+ try {
96
+ if ( ! file_exists( $maxmind_file ) || ! is_readable( $maxmind_file ) ) {
97
+ $maxmind_file = null;
98
+ if ( $this->credentials_helper->is_more_than_one_marketplaces_configured() ) {
99
+ $this->helper->show_error_in_preview( sprintf( esc_html__( "Maxmind DB file doesn't exist or is not readable. Please check & give appropriate read & write permissions to:%s. Go to plugin's Settings page for more details.", 'amazon-associates-link-builder' ), $this->maxmind_db_manager->db_upload_dir ) );
100
+ error_log( "Maxmind DB file doesn't exist or is not readable. Please check & give appropriate read & write permissions to:" . $this->maxmind_db_manager->db_upload_dir . "Go to plugin's settings page for more details" );
101
+ }
102
+ }
103
+ } catch ( Exception $e ) {
104
+ error_log( "Get Aalb_Customer_Country:get_maxmind_db_file failed" . $e->getMessage() );
105
+ }
106
+
107
+ return $maxmind_file;
108
+ }
109
+ }
110
+ ?>
ip2country/aalb_customer_ip_address.php ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Copyright 2016-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+
5
+ Licensed under the GNU General Public License as published by the Free Software Foundation,
6
+ Version 2.0 (the "License"). You may not use this file except in compliance with the License.
7
+ A copy of the License is located in the "license" file accompanying this file.
8
+
9
+ This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
10
+ either express or implied. See the License for the specific language governing permissions
11
+ and limitations under the License.
12
+ */
13
+
14
+ /**
15
+ *
16
+ * Gets the IP Address of the customer
17
+ *
18
+ * @since 1.5.0
19
+ * @package AmazonAssociatesLinkBuilder
20
+ * @subpackage AmazonAssociatesLinkBuilder/ip2country
21
+ */
22
+ class Aalb_Customer_Ip_Address {
23
+ /**
24
+ * Gets the IP Address of the customer
25
+ *
26
+ * @since 1.5.0
27
+ *
28
+ * @return string IP ADDRESS of the customer
29
+ */
30
+ public function get() {
31
+ $ip_address = isset( $_SERVER['REMOTE_ADDR'] ) ? $_SERVER['REMOTE_ADDR'] : '';
32
+ $ip_list = explode( ',', $ip_address );
33
+ $ip_list = array_map( array( $this, 'standardize_ip_address' ), $ip_list );
34
+
35
+ if ( isset( $_SERVER["HTTP_X_FORWARDED_FOR"] ) ) {
36
+ $x_forwarded_for_ip_address = array_map( array( $this, 'standardize_ip_address' ), explode( ',', @$_SERVER["HTTP_X_FORWARDED_FOR"] ) );
37
+ $ip_list = array_merge( $ip_list, $x_forwarded_for_ip_address );
38
+ $trusted_proxies = array( '', '::1', '127.0.0.1' );
39
+ $trusted_proxies = array_map( array( $this, 'standardize_ip_address' ), $trusted_proxies );
40
+
41
+ $ip_list = array_diff( $ip_list, $trusted_proxies );
42
+ }
43
+
44
+ array_unshift( $ip_list, '::1' );
45
+ $ip_address = end( $ip_list );
46
+
47
+ if ( ! $ip_address ) {
48
+ $ip_address = '::1';
49
+ }
50
+
51
+ return $ip_address;
52
+ }
53
+
54
+ /**
55
+ * Standardize the IPV6 Address & Trim IPV4 Address
56
+ *
57
+ * @since 1.5.0
58
+ *
59
+ * @param string $ip_address Raw IP Address
60
+ *
61
+ * @return string Normalized IP Address
62
+ */
63
+ private function standardize_ip_address( $ip_address ) {
64
+ $ip_address = trim( $ip_address );
65
+ $binary_representation = @inet_pton( $ip_address );
66
+ return empty( $binary_representation ) ? $ip_address : inet_ntop( $binary_representation );
67
+ }
68
+
69
+ }
70
+ ?>
ip2country/aalb_maxmind_db_manager.php ADDED
@@ -0,0 +1,242 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ Copyright 2016-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
5
+
6
+ Licensed under the GNU General Public License as published by the Free Software Foundation,
7
+ Version 2.0 (the "License"). You may not use this file except in compliance with the License.
8
+ A copy of the License is located in the "license" file accompanying this file.
9
+
10
+ This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
11
+ either express or implied. See the License for the specific language governing permissions
12
+ and limitations under the License.
13
+ */
14
+
15
+ /**
16
+ *
17
+ * Manages the operations related to maxmind GeoLite2Country database & maintains regular updates for the same
18
+ *
19
+ * @since 1.5.0
20
+ * @package AmazonAssociatesLinkBuilder
21
+ * @subpackage AmazonAssociatesLinkBuilder/ip2country
22
+ */
23
+ class Aalb_Maxmind_Db_Manager {
24
+
25
+ public $db_upload_dir;
26
+ public $db_file_path;
27
+
28
+ public function __construct() {
29
+ $this->db_upload_dir = $this->get_db_file_dir();
30
+ $this->db_file_path = $this->db_upload_dir . MAXMIND_DATA_FILENAME;
31
+ clearstatcache( true, $this->db_file_path );
32
+ }
33
+
34
+ /**
35
+ * Downloads & updates the maxmind db file(GeoLite2 Country)
36
+ *
37
+ * @argument HTTP Response $response
38
+ *
39
+ * @since 1.5.0
40
+ *
41
+ */
42
+ private function update_db( $response ) {
43
+ try {
44
+ $outFile = $this->db_file_path;
45
+ $tmp_file = $response["tmpfname"];
46
+ $current_file = fopen( $outFile, 'w' );
47
+ $donwloaded_file = gzopen( $tmp_file, 'r' );
48
+ while ( ( $string = gzread( $donwloaded_file, 4096 ) ) != false ) {
49
+ fwrite( $current_file, $string, strlen( $string ) );
50
+ }
51
+ gzclose( $donwloaded_file );
52
+ fclose( $current_file );
53
+ unlink( $tmp_file );
54
+ update_option( AALB_GEOLITE_DB_LAST_UPDATED_TIME, strtotime( wp_remote_retrieve_header( $response["response"], 'Last-Modified' ) ) );
55
+ } catch ( Exception $e ) {
56
+ error_log( "Error in maxmind_db_manager:update_db:::" . $e->getMessage() );
57
+ throw $e;
58
+ }
59
+ }
60
+
61
+ /*
62
+ * It checks if the GeoLite Db downloaded file has expired and call for update
63
+ *
64
+ * @since 1.5.0
65
+ *
66
+ */
67
+ public function update_db_if_required() {
68
+ $this->reset_db_keys_if_required();
69
+ if ( $this->is_db_expired() ) {
70
+ $this->check_and_update_db();
71
+ }
72
+ }
73
+
74
+ /*
75
+ * It checks if the GeoLite Db has expired
76
+ *
77
+ * @since 1.5.0
78
+ *
79
+ */
80
+ private function is_db_expired() {
81
+ return ( get_option( AALB_GEOLITE_DB_EXPIRATION_TIME ) == "" || get_option( AALB_GEOLITE_DB_EXPIRATION_TIME ) < time() );
82
+ }
83
+
84
+ /*
85
+ * It checks if the GeoLite Db update is required and calls for update
86
+ *
87
+ * @since 1.5.0
88
+ *
89
+ */
90
+ private function check_and_update_db() {
91
+ try {
92
+ $response = $this->get_db();
93
+ if ( $response ) {
94
+ if ( $this->should_update_db( $response["response"] ) ) {
95
+ $this->update_db( $response );
96
+ }
97
+ update_option( AALB_GEOLITE_DB_EXPIRATION_TIME, strtotime( wp_remote_retrieve_header( $response["response"] , 'expires' ) ) );
98
+ }
99
+ }
100
+ catch ( Exception $e ) {
101
+ error_log( "Error in maxmind_db_manager:should_update_db:::" . $e->getMessage() );
102
+ }
103
+ }
104
+
105
+ /*
106
+ * It downlaods the db file
107
+ *
108
+ * @since 1.5.0
109
+ *
110
+ * @return geolite db on success else null
111
+ *
112
+ */
113
+ private function get_db() {
114
+ $response = null;
115
+ try {
116
+ $response = $this->customized_download_url( AALB_GEOLITE_COUNTRY_DB_DOWNLOAD_URL );
117
+ if ( is_wp_error( $response ) ) {
118
+ error_log( "Maxmind_db_manager:get_db:::" . $response->get_error_message() );
119
+ }
120
+ }
121
+ catch ( Exception $e ) {
122
+ error_log( "Error in maxmind_db_manager:get_db:::" . $e->getMessage() );
123
+ }
124
+
125
+ return $response;
126
+ }
127
+
128
+ /*
129
+ * It reset the db keys if required
130
+ *
131
+ * @since 1.5.0
132
+ *
133
+ */
134
+ private function reset_db_keys_if_required() {
135
+ if ( $this->should_write_new_db_file() ) {
136
+ update_option( AALB_GEOLITE_DB_EXPIRATION_TIME, 0 );
137
+ update_option( AALB_GEOLITE_DB_LAST_UPDATED_TIME, 0 );
138
+ }
139
+ }
140
+
141
+ /*
142
+ * It checks if writing a new db file operation should be done
143
+ *
144
+ * @since 1.5.0
145
+ *
146
+ */
147
+ private function should_write_new_db_file() {
148
+ return ( ! file_exists( $this->db_file_path ) && is_writable( $this->db_upload_dir ) );
149
+ }
150
+
151
+ /*
152
+ * It does basic checks regarding read/write persmissions and then check if update is required
153
+ *
154
+ * @param HTTPResponse $response
155
+ *
156
+ * @since 1.5.0
157
+ *
158
+ * @bool True if geolite db should be updated
159
+ */
160
+ private function should_update_db( $response ) {
161
+ return ( $this->should_write_new_db_file() || ( is_writable( $this->db_file_path ) && $this->is_version_updated( $response ) ) );
162
+ }
163
+
164
+ /**
165
+ * It sets the absolute path of the directory where db file is present
166
+ *
167
+ * @return string database directory absolute path
168
+ *
169
+ * @since 1.5.0
170
+ *
171
+ */
172
+ private function get_db_file_dir() {
173
+ $file_dir_path = get_option( AALB_CUSTOM_UPLOAD_PATH );
174
+ if ( $file_dir_path == "" ) {
175
+ $file_dir_path = wp_upload_dir()['basedir'] . '/' . AALB_UPLOADS_FOLDER;
176
+ }
177
+
178
+ return $file_dir_path;
179
+ }
180
+
181
+ /*
182
+ * It checks if the newer version of GeoLite Db file is present
183
+ *
184
+ * @ since 1.5.0
185
+ *
186
+ * @return bool True if geolite db's newer version is available
187
+ */
188
+ private function is_version_updated( $response ) {
189
+ return ( get_option( AALB_GEOLITE_DB_LAST_UPDATED_TIME ) == '' ) || ( strtotime( wp_remote_retrieve_header( $response, 'Last-Modified' ) ) > get_option( AALB_GEOLITE_DB_LAST_UPDATED_TIME ) );
190
+ }
191
+
192
+ /**
193
+ * Downloads a URL to a local temporary file using the WordPress HTTP Class.
194
+ * Please note, That the calling function must unlink() the file.
195
+ * Modified from download_url() that is located in wp-admin/includes/file.php. Just changed the response returned
196
+ *
197
+ * @since 1.5.0
198
+ *
199
+ * @param string $url the URL of the file to download
200
+ * @param int $timeout The timeout for the request to download the file default 300 seconds
201
+ *
202
+ * @return mixed WP_Error on failure, Array of reponse & filename on success
203
+ */
204
+ function customized_download_url( $url, $timeout = 300 ) {
205
+ //WARNING: The file is not automatically deleted, The script must unlink() the file.
206
+ if ( ! $url )
207
+ return new WP_Error( 'http_no_url', __( 'Invalid URL Provided.' ) );
208
+
209
+ $url_filename = basename( parse_url( $url, PHP_URL_PATH ) );
210
+
211
+ $tmpfname = wp_tempnam( $url_filename );
212
+ if ( ! $tmpfname )
213
+ return new WP_Error( 'http_no_file', __( 'Could not create Temporary file.' ) );
214
+
215
+ $response = wp_safe_remote_get( $url, array( 'timeout' => $timeout, 'stream' => true, 'filename' => $tmpfname ) );
216
+
217
+ if ( is_wp_error( $response ) ) {
218
+ unlink( $tmpfname );
219
+
220
+ return $response;
221
+ }
222
+
223
+ if ( 200 != wp_remote_retrieve_response_code( $response ) ) {
224
+ unlink( $tmpfname );
225
+
226
+ return new WP_Error( 'http_404', trim( wp_remote_retrieve_response_message( $response ) ) );
227
+ }
228
+
229
+ $content_md5 = wp_remote_retrieve_header( $response, 'content-md5' );
230
+ if ( $content_md5 ) {
231
+ $md5_check = verify_file_md5( $tmpfname, $content_md5 );
232
+ if ( is_wp_error( $md5_check ) ) {
233
+ unlink( $tmpfname );
234
+
235
+ return $md5_check;
236
+ }
237
+ }
238
+ return array( "tmpfname" => $tmpfname, "response" => $response );
239
+ }
240
+ }
241
+
242
+ ?>
lib/php/aalb_xml_helper.php CHANGED
@@ -49,7 +49,7 @@ class Aalb_Xml_Helper {
49
  $aalb_node->DetailPageURL = isset( $item->DetailPageURL ) ? $item->DetailPageURL : null;
50
  $aalb_node->LargeImageURL = isset( $item->LargeImage->URL ) ? $item->LargeImage->URL : null;
51
  $aalb_node->MediumImageURL = isset( $item->MediumImage->URL ) ? $item->MediumImage->URL : null;
52
- $aalb_node->SmallImageURL = isset( $item->MediumImage->URL ) ? $item->SmallImage->URL : null;
53
 
54
  //Marketplace
55
  $marketplace_node_name = $common_marketplace_node_name;
49
  $aalb_node->DetailPageURL = isset( $item->DetailPageURL ) ? $item->DetailPageURL : null;
50
  $aalb_node->LargeImageURL = isset( $item->LargeImage->URL ) ? $item->LargeImage->URL : null;
51
  $aalb_node->MediumImageURL = isset( $item->MediumImage->URL ) ? $item->MediumImage->URL : null;
52
+ $aalb_node->SmallImageURL = isset( $item->SmallImageURL->URL ) ? $item->SmallImage->URL : null;
53
 
54
  //Marketplace
55
  $marketplace_node_name = $common_marketplace_node_name;
shortcode/aalb_shortcode_loader.php CHANGED
@@ -22,9 +22,7 @@ and limitations under the License.
22
  * @subpackage AmazonAssociatesLinkBuilder/shortcode
23
  */
24
  class Aalb_Shortcode_Loader {
25
-
26
- public $shortcode_link = null;
27
- public $shortcode_textlink = null;
28
 
29
  /**
30
  * Register shortcode with Wordpress
@@ -36,16 +34,6 @@ class Aalb_Shortcode_Loader {
36
  add_shortcode( AALB_SHORTCODE_AMAZON_TEXT, array( $this, 'amazon_textlink_shortcode_callback' ) );
37
  }
38
 
39
- /**
40
- * Disable shortcode
41
- *
42
- * @since 1.0.0
43
- */
44
- public function remove_shortcode() {
45
- remove_shortcode( AALB_SHORTCODE_AMAZON_LINK );
46
- remove_shortcode( AALB_SHORTCODE_AMAZON_TEXT );
47
- }
48
-
49
  /**
50
  * Callback function for rendering amazon_link shortcode
51
  *
@@ -57,22 +45,7 @@ class Aalb_Shortcode_Loader {
57
  * @return HTML HTML for displaying the templates.
58
  */
59
  public function amazon_link_shortcode_callback( $atts ) {
60
- return $this->get_amazon_link_shortcode()->render( $atts );
61
- }
62
-
63
- /**
64
- * Create only a single instance of the Aalb Shortcode.
65
- * No need to create an instance for rendering each shortcode.
66
- *
67
- * @since 1.0.0
68
- * @return Aalb_Shortcode The instance of Aalb_Shortcode.
69
- */
70
- public function get_amazon_link_shortcode() {
71
- if ( is_null( $this->shortcode_link ) ) {
72
- return new Aalb_Shortcode();
73
- }
74
-
75
- return $this->shortcode_link;
76
  }
77
 
78
  /**
@@ -86,24 +59,23 @@ class Aalb_Shortcode_Loader {
86
  * @return HTML HTML for displaying the templates.
87
  */
88
  public function amazon_textlink_shortcode_callback( $atts ) {
89
- return $this->get_amazon_textlink_shortcode()->render( $atts );
90
  }
91
 
92
  /**
93
- * Create only a single instance of the Aalb TextLink Shortcode.
94
  * No need to create an instance for rendering each shortcode.
95
  *
96
- * @since 1.4
97
- * @return Aalb_Shortcode_Text The instance of Aalb_Shortcode_Text.
98
  */
99
- public function get_amazon_textlink_shortcode() {
100
- if ( is_null( $this->shortcode_textlink ) ) {
101
- return new Aalb_Shortcode_Text();
102
  }
103
 
104
- return $this->shortcode_textlink;
105
  }
106
-
107
  }
108
 
109
  ?>
22
  * @subpackage AmazonAssociatesLinkBuilder/shortcode
23
  */
24
  class Aalb_Shortcode_Loader {
25
+ public $shortcode_manager = null;
 
 
26
 
27
  /**
28
  * Register shortcode with Wordpress
34
  add_shortcode( AALB_SHORTCODE_AMAZON_TEXT, array( $this, 'amazon_textlink_shortcode_callback' ) );
35
  }
36
 
 
 
 
 
 
 
 
 
 
 
37
  /**
38
  * Callback function for rendering amazon_link shortcode
39
  *
45
  * @return HTML HTML for displaying the templates.
46
  */
47
  public function amazon_link_shortcode_callback( $atts ) {
48
+ return $this->get_shortcode_manager_instance()->render( $atts );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
  }
50
 
51
  /**
59
  * @return HTML HTML for displaying the templates.
60
  */
61
  public function amazon_textlink_shortcode_callback( $atts ) {
62
+ return $this->get_shortcode_manager_instance()->render( $atts );
63
  }
64
 
65
  /**
66
+ * Create only a single instance of the Aalb Shortcode manager.
67
  * No need to create an instance for rendering each shortcode.
68
  *
69
+ * @since 1.5.0
70
+ * @return Aalb_Shortcode The instance of Aalb_Shortcode.
71
  */
72
+ public function get_shortcode_manager_instance() {
73
+ if ( is_null( $this->shortcode_manager ) ) {
74
+ $this->shortcode_manager = new Aalb_Shortcode_Manager();
75
  }
76
 
77
+ return $this->shortcode_manager;
78
  }
 
79
  }
80
 
81
  ?>
shortcode/aalb_shortcode_manager.php ADDED
@@ -0,0 +1,176 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Copyright 2016-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+
5
+ Licensed under the GNU General Public License as published by the Free Software Foundation,
6
+ Version 2.0 (the "License"). You may not use this file except in compliance with the License.
7
+ A copy of the License is located in the "license" file accompanying this file.
8
+
9
+ This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
10
+ either express or implied. See the License for the specific language governing permissions
11
+ and limitations under the License.
12
+ */
13
+
14
+ /**
15
+ *
16
+ * Gets the product information by making a Paapi request and renders the HTML
17
+ *
18
+ * @since 1.5.0
19
+ * @package AmazonAssociatesLinkBuilder
20
+ * @subpackage AmazonAssociatesLinkBuilder/shortcode
21
+ */
22
+ class Aalb_Shortcode_Manager {
23
+ protected $paapi_helper;
24
+ protected $template_engine;
25
+ protected $helper;
26
+ //Below is commented out as it was being used in impression tracking
27
+ //protected $tracking_api_helper;
28
+ protected $shortcode_helper;
29
+ protected $customer_country;
30
+
31
+ public function __construct() {
32
+ $this->template_engine = new Aalb_Template_Engine();
33
+ $this->paapi_helper = new Aalb_Paapi_Helper();
34
+ $this->helper = new Aalb_Helper();
35
+ //$this->tracking_api_helper = new Aalb_Tracking_Api_Helper();
36
+ $this->shortcode_helper = new Aalb_Shortcode_Helper();
37
+ $this->customer_country = new Aalb_Customer_Country();
38
+ }
39
+
40
+ /**
41
+ * Add basic styles
42
+ *
43
+ * @since 1.5.0
44
+ */
45
+ public function enqueue_styles() {
46
+ wp_enqueue_style( 'aalb_basics_css', AALB_BASICS_CSS, array(), AALB_PLUGIN_CURRENT_VERSION );
47
+ }
48
+
49
+ /**
50
+ * The function responsible for rendering the shortcode.
51
+ * Makes a GET request and calls the render_xml to render the response.
52
+ *
53
+ * @since 1.5.0
54
+ *
55
+ * @param array $atts Shortcode attribute and values.
56
+ *
57
+ * @return HTML Rendered html to display.
58
+ */
59
+ public function render( $atts ) {
60
+ $shortcode_attributes = $this->get_shortcode_attributes( $atts );
61
+ $marketplace_list = explode( GEO_TARGETED_LINKS_DELIMITER, $shortcode_attributes['marketplace'] );
62
+ //Below contains both asin & asins to support both amazon_text_link & amazon_link
63
+ $asins_list = explode( GEO_TARGETED_LINKS_DELIMITER, $shortcode_attributes['asins'] ? $shortcode_attributes['asins'] : $shortcode_attributes['asin'] );
64
+ $store_id_list = explode( GEO_TARGETED_LINKS_DELIMITER, $shortcode_attributes['store'] );
65
+ if ( ( count( $marketplace_list ) === count( $asins_list ) ) && ( count( $asins_list ) === count( $store_id_list ) ) ) {
66
+ if ( $this->is_shortcode_geo_targeted_links_supported( $marketplace_list ) ) {
67
+ $marketplace = $this->find_marketplace_of_customer( $marketplace_list );
68
+ $index_to_render = array_search( $marketplace, $marketplace_list );
69
+ $index_to_render = $index_to_render === false ? 0 : $index_to_render;
70
+ $link_code = $index_to_render === 0 ? AALB_GEO_TARGETED_LINKS_DEFAULT_COUNTRY_LINK_CODE : AALB_GEO_TARGETED_LINKS_REDIRECTED_COUNTRY_LINK_CODE;
71
+ } else {
72
+ $index_to_render = 0;
73
+ $link_code = AALB_DEFAULT_LINK_CODE;
74
+ }
75
+
76
+ } else {
77
+ //Render geo-targeted default country link-code as its safest bet to pick first marketplace. We can end up in showing wrong ASINs due to bigger mess in shortcode but still we will render some ads.
78
+ if ( count( $asins_list ) === 0 ) {
79
+ $asins_list = array( null );
80
+ }
81
+ $index_to_render = 0;
82
+ $link_code = AALB_GEO_TARGETED_LINKS_DEFAULT_COUNTRY_LINK_CODE;
83
+ $this->helper->show_error_in_preview( esc_html__( "There is an error in the count of configured marketplaces, asins and stores in this shortcode. Please fix the parameters for marketplace, asin and store-id.", 'amazon-associates-link-builder' ) );
84
+ }
85
+
86
+ return $this->render_shortcode( $shortcode_attributes, $marketplace_list[$index_to_render], $asins_list[$index_to_render], $store_id_list[$index_to_render], $link_code );
87
+ }
88
+
89
+ /**
90
+ * Finds whether the shortcode is geo-targetted links supported or not
91
+ * To be geo-targeted links supported a shortcode needs to have at least 2 entries of marketplaces to define redirection to other
92
+ *
93
+ * @since 1.5.0
94
+ *
95
+ * @param array $marketplace_list List of all marketplaces present in shortcode
96
+ *
97
+ * @return boolean is_shortcode_geo_targetted_links_supported
98
+ */
99
+ private function is_shortcode_geo_targeted_links_supported( $marketplace_list ) {
100
+ return ( count( $marketplace_list ) > 1 );
101
+ }
102
+
103
+ /**
104
+ * The function responsible for rendering the shortcode.
105
+ * Makes a GET request and calls the render_xml to render the response.
106
+ *
107
+ * @since 1.5.0
108
+ *
109
+ * @param array $shortcode_attributes Shortcode attribute and values.
110
+ * @param string $redirected_marketplace Marketplace of the asin to look into.
111
+ * @param string $redirected_store The identifier of the store to be used for adunit with $redirected_marketplace
112
+ *
113
+ * @return HTML Rendered html to display.
114
+ */
115
+ private function render_shortcode( $shortcode_attributes, $marketplace, $asins, $store_id, $link_code ) {
116
+ //$validated_link_id = $this->shortcode_helper->get_validated_link_id( $shortcode_attributes['link_id'] );
117
+ $validated_marketplace = $this->shortcode_helper->get_validated_marketplace( $marketplace );
118
+ //Below contains both asin & asins to support both amazon_text_link & amazon_link
119
+ $validated_asins = $this->shortcode_helper->get_validated_asins( $asins );
120
+ $validated_template = $this->shortcode_helper->get_validated_template( $shortcode_attributes['template'] );
121
+ $validated_store_id = $this->shortcode_helper->get_validated_store_id( $store_id );
122
+ $link_text = $shortcode_attributes['text'];
123
+
124
+ $marketplace_endpoint = $this->shortcode_helper->get_marketplace_endpoint( $validated_marketplace );
125
+ $url = $this->paapi_helper->get_item_lookup_url( $validated_asins, $marketplace_endpoint, $validated_store_id );
126
+ $formatted_asins = $this->shortcode_helper->format_asins( $validated_asins );
127
+ $this->shortcode_helper->enqueue_template_styles( $validated_template );
128
+
129
+ $products_key = $this->helper->build_products_cache_key( $formatted_asins, $validated_marketplace, $validated_store_id );
130
+ $products_template_key = $this->helper->build_template_cache_key( $formatted_asins, $validated_marketplace, $validated_store_id, $validated_template );
131
+ try {
132
+ return str_replace( array( '[[UNIQUE_ID]]', '[[Amazon_Link_Text]]' ), array( str_replace( '.', '-', $products_template_key ), $link_text ), $this->template_engine->render( $products_template_key, $products_key, $validated_template, $url, $validated_marketplace, $link_code ) );
133
+ } catch ( Exception $e ) {
134
+ error_log( $this->paapi_helper->get_error_message( $e->getMessage() ) );
135
+ }
136
+ }
137
+
138
+ /**
139
+ * Returns default shortcode attributes if not mentioned
140
+ *
141
+ * @since 1.5.0
142
+ *
143
+ * @param array $atts Shortcode attributes.
144
+ *
145
+ * @return array Default shortcode attributes if not mentioned.
146
+ */
147
+ private function get_shortcode_attributes( $atts ) {
148
+ //Below shortcode contains both asin & asins to support both amazon_text_link & amazon_link
149
+ $shortcode_attributes = shortcode_atts( array(
150
+ 'asin' => null,
151
+ 'asins' => null,
152
+ 'marketplace' => get_option( AALB_DEFAULT_MARKETPLACE ),
153
+ 'store' => get_option( AALB_DEFAULT_STORE_ID ),
154
+ 'template' => get_option( AALB_DEFAULT_TEMPLATE ),
155
+ 'link_id' => null,
156
+ 'text' => null
157
+ ), $atts );
158
+
159
+ return $shortcode_attributes;
160
+ }
161
+
162
+ /**
163
+ * Returns default shortcode attributes if not mentioned
164
+ *
165
+ * @since 1.5.0
166
+ *
167
+ * @param Array $marketplace_list Array of marketplaces present in shortcode
168
+ *
169
+ * @return String Marketplace from which customer is coming. Empty in case marketplace not added by user or no e-commerce presence
170
+ */
171
+ private function find_marketplace_of_customer( $marketplace_list ) {
172
+ $country_code = $this->customer_country->get_country_iso_code();
173
+ return in_array( $country_code, $marketplace_list ) ? $country_code : "";
174
+ }
175
+ }
176
+ ?>
vendor/autoload.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload.php @generated by Composer
4
+
5
+ require_once __DIR__ . '/composer/autoload_real.php';
6
+
7
+ return ComposerAutoloaderInit04057e52b45ebf7b66537656fab0b7df::getLoader();
vendor/composer/ClassLoader.php ADDED
@@ -0,0 +1,445 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Composer.
5
+ *
6
+ * (c) Nils Adermann <naderman@naderman.de>
7
+ * Jordi Boggiano <j.boggiano@seld.be>
8
+ *
9
+ * For the full copyright and license information, please view the LICENSE
10
+ * file that was distributed with this source code.
11
+ */
12
+
13
+ namespace Composer\Autoload;
14
+
15
+ /**
16
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
17
+ *
18
+ * $loader = new \Composer\Autoload\ClassLoader();
19
+ *
20
+ * // register classes with namespaces
21
+ * $loader->add('Symfony\Component', __DIR__.'/component');
22
+ * $loader->add('Symfony', __DIR__.'/framework');
23
+ *
24
+ * // activate the autoloader
25
+ * $loader->register();
26
+ *
27
+ * // to enable searching the include path (eg. for PEAR packages)
28
+ * $loader->setUseIncludePath(true);
29
+ *
30
+ * In this example, if you try to use a class in the Symfony\Component
31
+ * namespace or one of its children (Symfony\Component\Console for instance),
32
+ * the autoloader will first look for the class under the component/
33
+ * directory, and it will then fallback to the framework/ directory if not
34
+ * found before giving up.
35
+ *
36
+ * This class is loosely based on the Symfony UniversalClassLoader.
37
+ *
38
+ * @author Fabien Potencier <fabien@symfony.com>
39
+ * @author Jordi Boggiano <j.boggiano@seld.be>
40
+ * @see http://www.php-fig.org/psr/psr-0/
41
+ * @see http://www.php-fig.org/psr/psr-4/
42
+ */
43
+ class ClassLoader
44
+ {
45
+ // PSR-4
46
+ private $prefixLengthsPsr4 = array();
47
+ private $prefixDirsPsr4 = array();
48
+ private $fallbackDirsPsr4 = array();
49
+
50
+ // PSR-0
51
+ private $prefixesPsr0 = array();
52
+ private $fallbackDirsPsr0 = array();
53
+
54
+ private $useIncludePath = false;
55
+ private $classMap = array();
56
+ private $classMapAuthoritative = false;
57
+ private $missingClasses = array();
58
+ private $apcuPrefix;
59
+
60
+ public function getPrefixes()
61
+ {
62
+ if (!empty($this->prefixesPsr0)) {
63
+ return call_user_func_array('array_merge', $this->prefixesPsr0);
64
+ }
65
+
66
+ return array();
67
+ }
68
+
69
+ public function getPrefixesPsr4()
70
+ {
71
+ return $this->prefixDirsPsr4;
72
+ }
73
+
74
+ public function getFallbackDirs()
75
+ {
76
+ return $this->fallbackDirsPsr0;
77
+ }
78
+
79
+ public function getFallbackDirsPsr4()
80
+ {
81
+ return $this->fallbackDirsPsr4;
82
+ }
83
+
84
+ public function getClassMap()
85
+ {
86
+ return $this->classMap;
87
+ }
88
+
89
+ /**
90
+ * @param array $classMap Class to filename map
91
+ */
92
+ public function addClassMap(array $classMap)
93
+ {
94
+ if ($this->classMap) {
95
+ $this->classMap = array_merge($this->classMap, $classMap);
96
+ } else {
97
+ $this->classMap = $classMap;
98
+ }
99
+ }
100
+
101
+ /**
102
+ * Registers a set of PSR-0 directories for a given prefix, either
103
+ * appending or prepending to the ones previously set for this prefix.
104
+ *
105
+ * @param string $prefix The prefix
106
+ * @param array|string $paths The PSR-0 root directories
107
+ * @param bool $prepend Whether to prepend the directories
108
+ */
109
+ public function add($prefix, $paths, $prepend = false)
110
+ {
111
+ if (!$prefix) {
112
+ if ($prepend) {
113
+ $this->fallbackDirsPsr0 = array_merge(
114
+ (array) $paths,
115
+ $this->fallbackDirsPsr0
116
+ );
117
+ } else {
118
+ $this->fallbackDirsPsr0 = array_merge(
119
+ $this->fallbackDirsPsr0,
120
+ (array) $paths
121
+ );
122
+ }
123
+
124
+ return;
125
+ }
126
+
127
+ $first = $prefix[0];
128
+ if (!isset($this->prefixesPsr0[$first][$prefix])) {
129
+ $this->prefixesPsr0[$first][$prefix] = (array) $paths;
130
+
131
+ return;
132
+ }
133
+ if ($prepend) {
134
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
135
+ (array) $paths,
136
+ $this->prefixesPsr0[$first][$prefix]
137
+ );
138
+ } else {
139
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
140
+ $this->prefixesPsr0[$first][$prefix],
141
+ (array) $paths
142
+ );
143
+ }
144
+ }
145
+
146
+ /**
147
+ * Registers a set of PSR-4 directories for a given namespace, either
148
+ * appending or prepending to the ones previously set for this namespace.
149
+ *
150
+ * @param string $prefix The prefix/namespace, with trailing '\\'
151
+ * @param array|string $paths The PSR-4 base directories
152
+ * @param bool $prepend Whether to prepend the directories
153
+ *
154
+ * @throws \InvalidArgumentException
155
+ */
156
+ public function addPsr4($prefix, $paths, $prepend = false)
157
+ {
158
+ if (!$prefix) {
159
+ // Register directories for the root namespace.
160
+ if ($prepend) {
161
+ $this->fallbackDirsPsr4 = array_merge(
162
+ (array) $paths,
163
+ $this->fallbackDirsPsr4
164
+ );
165
+ } else {
166
+ $this->fallbackDirsPsr4 = array_merge(
167
+ $this->fallbackDirsPsr4,
168
+ (array) $paths
169
+ );
170
+ }
171
+ } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
172
+ // Register directories for a new namespace.
173
+ $length = strlen($prefix);
174
+ if ('\\' !== $prefix[$length - 1]) {
175
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
176
+ }
177
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
178
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
179
+ } elseif ($prepend) {
180
+ // Prepend directories for an already registered namespace.
181
+ $this->prefixDirsPsr4[$prefix] = array_merge(
182
+ (array) $paths,
183
+ $this->prefixDirsPsr4[$prefix]
184
+ );
185
+ } else {
186
+ // Append directories for an already registered namespace.
187
+ $this->prefixDirsPsr4[$prefix] = array_merge(
188
+ $this->prefixDirsPsr4[$prefix],
189
+ (array) $paths
190
+ );
191
+ }
192
+ }
193
+
194
+ /**
195
+ * Registers a set of PSR-0 directories for a given prefix,
196
+ * replacing any others previously set for this prefix.
197
+ *
198
+ * @param string $prefix The prefix
199
+ * @param array|string $paths The PSR-0 base directories
200
+ */
201
+ public function set($prefix, $paths)
202
+ {
203
+ if (!$prefix) {
204
+ $this->fallbackDirsPsr0 = (array) $paths;
205
+ } else {
206
+ $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
207
+ }
208
+ }
209
+
210
+ /**
211
+ * Registers a set of PSR-4 directories for a given namespace,
212
+ * replacing any others previously set for this namespace.
213
+ *
214
+ * @param string $prefix The prefix/namespace, with trailing '\\'
215
+ * @param array|string $paths The PSR-4 base directories
216
+ *
217
+ * @throws \InvalidArgumentException
218
+ */
219
+ public function setPsr4($prefix, $paths)
220
+ {
221
+ if (!$prefix) {
222
+ $this->fallbackDirsPsr4 = (array) $paths;
223
+ } else {
224
+ $length = strlen($prefix);
225
+ if ('\\' !== $prefix[$length - 1]) {
226
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
227
+ }
228
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
229
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
230
+ }
231
+ }
232
+
233
+ /**
234
+ * Turns on searching the include path for class files.
235
+ *
236
+ * @param bool $useIncludePath
237
+ */
238
+ public function setUseIncludePath($useIncludePath)
239
+ {
240
+ $this->useIncludePath = $useIncludePath;
241
+ }
242
+
243
+ /**
244
+ * Can be used to check if the autoloader uses the include path to check
245
+ * for classes.
246
+ *
247
+ * @return bool
248
+ */
249
+ public function getUseIncludePath()
250
+ {
251
+ return $this->useIncludePath;
252
+ }
253
+
254
+ /**
255
+ * Turns off searching the prefix and fallback directories for classes
256
+ * that have not been registered with the class map.
257
+ *
258
+ * @param bool $classMapAuthoritative
259
+ */
260
+ public function setClassMapAuthoritative($classMapAuthoritative)
261
+ {
262
+ $this->classMapAuthoritative = $classMapAuthoritative;
263
+ }
264
+
265
+ /**
266
+ * Should class lookup fail if not found in the current class map?
267
+ *
268
+ * @return bool
269
+ */
270
+ public function isClassMapAuthoritative()
271
+ {
272
+ return $this->classMapAuthoritative;
273
+ }
274
+
275
+ /**
276
+ * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
277
+ *
278
+ * @param string|null $apcuPrefix
279
+ */
280
+ public function setApcuPrefix($apcuPrefix)
281
+ {
282
+ $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;
283
+ }
284
+
285
+ /**
286
+ * The APCu prefix in use, or null if APCu caching is not enabled.
287
+ *
288
+ * @return string|null
289
+ */
290
+ public function getApcuPrefix()
291
+ {
292
+ return $this->apcuPrefix;
293
+ }
294
+
295
+ /**
296
+ * Registers this instance as an autoloader.
297
+ *
298
+ * @param bool $prepend Whether to prepend the autoloader or not
299
+ */
300
+ public function register($prepend = false)
301
+ {
302
+ spl_autoload_register(array($this, 'loadClass'), true, $prepend);
303
+ }
304
+
305
+ /**
306
+ * Unregisters this instance as an autoloader.
307
+ */
308
+ public function unregister()
309
+ {
310
+ spl_autoload_unregister(array($this, 'loadClass'));
311
+ }
312
+
313
+ /**
314
+ * Loads the given class or interface.
315
+ *
316
+ * @param string $class The name of the class
317
+ * @return bool|null True if loaded, null otherwise
318
+ */
319
+ public function loadClass($class)
320
+ {
321
+ if ($file = $this->findFile($class)) {
322
+ includeFile($file);
323
+
324
+ return true;
325
+ }
326
+ }
327
+
328
+ /**
329
+ * Finds the path to the file where the class is defined.
330
+ *
331
+ * @param string $class The name of the class
332
+ *
333
+ * @return string|false The path if found, false otherwise
334
+ */
335
+ public function findFile($class)
336
+ {
337
+ // class map lookup
338
+ if (isset($this->classMap[$class])) {
339
+ return $this->classMap[$class];
340
+ }
341
+ if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
342
+ return false;
343
+ }
344
+ if (null !== $this->apcuPrefix) {
345
+ $file = apcu_fetch($this->apcuPrefix.$class, $hit);
346
+ if ($hit) {
347
+ return $file;
348
+ }
349
+ }
350
+
351
+ $file = $this->findFileWithExtension($class, '.php');
352
+
353
+ // Search for Hack files if we are running on HHVM
354
+ if (false === $file && defined('HHVM_VERSION')) {
355
+ $file = $this->findFileWithExtension($class, '.hh');
356
+ }
357
+
358
+ if (null !== $this->apcuPrefix) {
359
+ apcu_add($this->apcuPrefix.$class, $file);
360
+ }
361
+
362
+ if (false === $file) {
363
+ // Remember that this class does not exist.
364
+ $this->missingClasses[$class] = true;
365
+ }
366
+
367
+ return $file;
368
+ }
369
+
370
+ private function findFileWithExtension($class, $ext)
371
+ {
372
+ // PSR-4 lookup
373
+ $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
374
+
375
+ $first = $class[0];
376
+ if (isset($this->prefixLengthsPsr4[$first])) {
377
+ $subPath = $class;
378
+ while (false !== $lastPos = strrpos($subPath, '\\')) {
379
+ $subPath = substr($subPath, 0, $lastPos);
380
+ $search = $subPath.'\\';
381
+ if (isset($this->prefixDirsPsr4[$search])) {
382
+ foreach ($this->prefixDirsPsr4[$search] as $dir) {
383
+ $length = $this->prefixLengthsPsr4[$first][$search];
384
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
385
+ return $file;
386
+ }
387
+ }
388
+ }
389
+ }
390
+ }
391
+
392
+ // PSR-4 fallback dirs
393
+ foreach ($this->fallbackDirsPsr4 as $dir) {
394
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
395
+ return $file;
396
+ }
397
+ }
398
+
399
+ // PSR-0 lookup
400
+ if (false !== $pos = strrpos($class, '\\')) {
401
+ // namespaced class name
402
+ $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
403
+ . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
404
+ } else {
405
+ // PEAR-like class name
406
+ $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
407
+ }
408
+
409
+ if (isset($this->prefixesPsr0[$first])) {
410
+ foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
411
+ if (0 === strpos($class, $prefix)) {
412
+ foreach ($dirs as $dir) {
413
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
414
+ return $file;
415
+ }
416
+ }
417
+ }
418
+ }
419
+ }
420
+
421
+ // PSR-0 fallback dirs
422
+ foreach ($this->fallbackDirsPsr0 as $dir) {
423
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
424
+ return $file;
425
+ }
426
+ }
427
+
428
+ // PSR-0 include paths.
429
+ if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
430
+ return $file;
431
+ }
432
+
433
+ return false;
434
+ }
435
+ }
436
+
437
+ /**
438
+ * Scope isolated include.
439
+ *
440
+ * Prevents access to $this/self from included files.
441
+ */
442
+ function includeFile($file)
443
+ {
444
+ include $file;
445
+ }
vendor/composer/LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ Copyright (c) Nils Adermann, Jordi Boggiano
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ of this software and associated documentation files (the "Software"), to deal
6
+ in the Software without restriction, including without limitation the rights
7
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the Software is furnished
9
+ to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in all
12
+ copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ THE SOFTWARE.
21
+
vendor/composer/autoload_classmap.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_classmap.php @generated by Composer
4
+
5
+ $vendorDir = dirname(dirname(__FILE__));
6
+ $baseDir = dirname($vendorDir);
7
+
8
+ return array(
9
+ );
vendor/composer/autoload_namespaces.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_namespaces.php @generated by Composer
4
+
5
+ $vendorDir = dirname(dirname(__FILE__));
6
+ $baseDir = dirname($vendorDir);
7
+
8
+ return array(
9
+ );
vendor/composer/autoload_psr4.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_psr4.php @generated by Composer
4
+
5
+ $vendorDir = dirname(dirname(__FILE__));
6
+ $baseDir = dirname($vendorDir);
7
+
8
+ return array(
9
+ 'MaxMind\\WebService\\' => array($vendorDir . '/maxmind/web-service-common/src/WebService'),
10
+ 'MaxMind\\Exception\\' => array($vendorDir . '/maxmind/web-service-common/src/Exception'),
11
+ 'MaxMind\\Db\\' => array($vendorDir . '/maxmind-db/reader/src/MaxMind/Db'),
12
+ 'GeoIp2\\' => array($vendorDir . '/geoip2/geoip2/src'),
13
+ 'Composer\\CaBundle\\' => array($vendorDir . '/composer/ca-bundle/src'),
14
+ );
vendor/composer/autoload_real.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_real.php @generated by Composer
4
+
5
+ class ComposerAutoloaderInit04057e52b45ebf7b66537656fab0b7df
6
+ {
7
+ private static $loader;
8
+
9
+ public static function loadClassLoader($class)
10
+ {
11
+ if ('Composer\Autoload\ClassLoader' === $class) {
12
+ require __DIR__ . '/ClassLoader.php';
13
+ }
14
+ }
15
+
16
+ public static function getLoader()
17
+ {
18
+ if (null !== self::$loader) {
19
+ return self::$loader;
20
+ }
21
+
22
+ spl_autoload_register(array('ComposerAutoloaderInit04057e52b45ebf7b66537656fab0b7df', 'loadClassLoader'), true, true);
23
+ self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInit04057e52b45ebf7b66537656fab0b7df', 'loadClassLoader'));
25
+
26
+ $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
+ if ($useStaticLoader) {
28
+ require_once __DIR__ . '/autoload_static.php';
29
+
30
+ call_user_func(\Composer\Autoload\ComposerStaticInit04057e52b45ebf7b66537656fab0b7df::getInitializer($loader));
31
+ } else {
32
+ $map = require __DIR__ . '/autoload_namespaces.php';
33
+ foreach ($map as $namespace => $path) {
34
+ $loader->set($namespace, $path);
35
+ }
36
+
37
+ $map = require __DIR__ . '/autoload_psr4.php';
38
+ foreach ($map as $namespace => $path) {
39
+ $loader->setPsr4($namespace, $path);
40
+ }
41
+
42
+ $classMap = require __DIR__ . '/autoload_classmap.php';
43
+ if ($classMap) {
44
+ $loader->addClassMap($classMap);
45
+ }
46
+ }
47
+
48
+ $loader->register(true);
49
+
50
+ return $loader;
51
+ }
52
+ }
vendor/composer/autoload_static.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // autoload_static.php @generated by Composer
4
+
5
+ namespace Composer\Autoload;
6
+
7
+ class ComposerStaticInit04057e52b45ebf7b66537656fab0b7df
8
+ {
9
+ public static $prefixLengthsPsr4 = array (
10
+ 'M' =>
11
+ array (
12
+ 'MaxMind\\WebService\\' => 19,
13
+ 'MaxMind\\Exception\\' => 18,
14
+ 'MaxMind\\Db\\' => 11,
15
+ ),
16
+ 'G' =>
17
+ array (
18
+ 'GeoIp2\\' => 7,
19
+ ),
20
+ 'C' =>
21
+ array (
22
+ 'Composer\\CaBundle\\' => 18,
23
+ ),
24
+ );
25
+
26
+ public static $prefixDirsPsr4 = array (
27
+ 'MaxMind\\WebService\\' =>
28
+ array (
29
+ 0 => __DIR__ . '/..' . '/maxmind/web-service-common/src/WebService',
30
+ ),
31
+ 'MaxMind\\Exception\\' =>
32
+ array (
33
+ 0 => __DIR__ . '/..' . '/maxmind/web-service-common/src/Exception',
34
+ ),
35
+ 'MaxMind\\Db\\' =>
36
+ array (
37
+ 0 => __DIR__ . '/..' . '/maxmind-db/reader/src/MaxMind/Db',
38
+ ),
39
+ 'GeoIp2\\' =>
40
+ array (
41
+ 0 => __DIR__ . '/..' . '/geoip2/geoip2/src',
42
+ ),
43
+ 'Composer\\CaBundle\\' =>
44
+ array (
45
+ 0 => __DIR__ . '/..' . '/composer/ca-bundle/src',
46
+ ),
47
+ );
48
+
49
+ public static function getInitializer(ClassLoader $loader)
50
+ {
51
+ return \Closure::bind(function () use ($loader) {
52
+ $loader->prefixLengthsPsr4 = ComposerStaticInit04057e52b45ebf7b66537656fab0b7df::$prefixLengthsPsr4;
53
+ $loader->prefixDirsPsr4 = ComposerStaticInit04057e52b45ebf7b66537656fab0b7df::$prefixDirsPsr4;
54
+
55
+ }, null, ClassLoader::class);
56
+ }
57
+ }
vendor/composer/ca-bundle/LICENSE ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (C) 2016 Composer
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to
6
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
+ of the Software, and to permit persons to whom the Software is furnished to do
8
+ so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
vendor/composer/ca-bundle/README.md ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ composer/ca-bundle
2
+ ==================
3
+
4
+ Small utility library that lets you find a path to the system CA bundle,
5
+ and includes a fallback to the Mozilla CA bundle.
6
+
7
+ Originally written as part of [composer/composer](https://github.com/composer/composer),
8
+ now extracted and made available as a stand-alone library.
9
+
10
+
11
+ Installation
12
+ ------------
13
+
14
+ Install the latest version with:
15
+
16
+ ```bash
17
+ $ composer require composer/ca-bundle
18
+ ```
19
+
20
+
21
+ Requirements
22
+ ------------
23
+
24
+ * PHP 5.3.2 is required but using the latest version of PHP is highly recommended.
25
+
26
+
27
+ Basic usage
28
+ -----------
29
+
30
+ # `Composer\CaBundle\CaBundle`
31
+
32
+ - `CaBundle::getSystemCaRootBundlePath()`: Returns the system CA bundle path, or a path to the bundled one as fallback
33
+ - `CaBundle::getBundledCaBundlePath()`: Returns the path to the bundled CA file
34
+ - `CaBundle::validateCaFile($filename)`: Validates a CA file using opensl_x509_parse only if it is safe to use
35
+ - `CaBundle::isOpensslParseSafe()`: Test if it is safe to use the PHP function openssl_x509_parse()
36
+ - `CaBundle::reset()`: Resets the static caches
37
+
38
+
39
+ ## To use with curl
40
+
41
+ ```php
42
+ $curl = curl_init("https://example.org/");
43
+
44
+ $caPathOrFile = \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath();
45
+ if (is_dir($caPathOrFile) || (is_link($caPathOrFile) && is_dir(readlink($caPathOrFile)))) {
46
+ curl_setopt($curl, CURLOPT_CAPATH, $caPathOrFile);
47
+ } else {
48
+ curl_setopt($curl, CURLOPT_CAINFO, $caPathOrFile);
49
+ }
50
+
51
+ $result = curl_exec($curl);
52
+ ```
53
+
54
+ ## To use with php streams
55
+
56
+ ```php
57
+ $opts = array(
58
+ 'http' => array(
59
+ 'method' => "GET"
60
+ )
61
+ );
62
+
63
+ $caPathOrFile = \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath();
64
+ if (is_dir($caPathOrFile) || (is_link($caPathOrFile) && is_dir(readlink($caPathOrFile)))) {
65
+ $opts['ssl']['capath'] = $caPathOrFile;
66
+ } else {
67
+ $opts['ssl']['cafile'] = $caPathOrFile;
68
+ }
69
+
70
+ $context = stream_context_create($opts);
71
+ $result = file_get_contents('https://example.com', false, $context);
72
+ ```
73
+
74
+ License
75
+ -------
76
+
77
+ composer/ca-bundle is licensed under the MIT License, see the LICENSE file for details.
vendor/composer/ca-bundle/composer.json ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "composer/ca-bundle",
3
+ "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
4
+ "type": "library",
5
+ "license": "MIT",
6
+ "keywords": [
7
+ "cabundle",
8
+ "cacert",
9
+ "certificate",
10
+ "ssl",
11
+ "tls"
12
+ ],
13
+ "authors": [
14
+ {
15
+ "name": "Jordi Boggiano",
16
+ "email": "j.boggiano@seld.be",
17
+ "homepage": "http://seld.be"
18
+ }
19
+ ],
20
+ "support": {
21
+ "irc": "irc://irc.freenode.org/composer",
22
+ "issues": "https://github.com/composer/ca-bundle/issues"
23
+ },
24
+ "require": {
25
+ "ext-openssl": "*",
26
+ "ext-pcre": "*",
27
+ "php": "^5.3.2 || ^7.0"
28
+ },
29
+ "require-dev": {
30
+ "phpunit/phpunit": "^4.5",
31
+ "psr/log": "^1.0",
32
+ "symfony/process": "^2.5 || ^3.0"
33
+ },
34
+ "suggest": {
35
+ "symfony/process": "This is necessary to reliably check whether openssl_x509_parse is vulnerable on older php versions, but can be ignored on PHP 5.5.6+"
36
+ },
37
+ "autoload": {
38
+ "psr-4": {
39
+ "Composer\\CaBundle\\": "src"
40
+ }
41
+ },
42
+ "autoload-dev": {
43
+ "psr-4": {
44
+ "Composer\\CaBundle\\": "tests"
45
+ }
46
+ },
47
+ "extra": {
48
+ "branch-alias": {
49
+ "dev-master": "1.x-dev"
50
+ }
51
+ },
52
+ "config": {
53
+ "platform": {
54
+ "php": "5.3.9"
55
+ }
56
+ }
57
+ }
vendor/composer/ca-bundle/res/cacert.pem ADDED
@@ -0,0 +1,3646 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ##
2
+ ## Bundle of CA Root Certificates
3
+ ##
4
+ ## Certificate data from Mozilla as of: Wed Sep 20 03:12:05 2017 GMT
5
+ ##
6
+ ## This is a bundle of X.509 certificates of public Certificate Authorities
7
+ ## (CA). These were automatically extracted from Mozilla's root certificates
8
+ ## file (certdata.txt). This file can be found in the mozilla source tree:
9
+ ## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt
10
+ ##
11
+ ## It contains the certificates in PEM format and therefore
12
+ ## can be directly used with curl / libcurl / php_curl, or with
13
+ ## an Apache+mod_ssl webserver for SSL client authentication.
14
+ ## Just configure this file as the SSLCACertificateFile.
15
+ ##
16
+ ## Conversion done with mk-ca-bundle.pl version 1.27.
17
+ ## SHA256: 2b2dbe5244e0047e088c597998883a913f6c5fffd1cb5c0fe5a368c8466cb2ec
18
+ ##
19
+
20
+
21
+ GlobalSign Root CA
22
+ ==================
23
+ -----BEGIN CERTIFICATE-----
24
+ MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
25
+ GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
26
+ b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
27
+ BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
28
+ VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
29
+ DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
30
+ THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
31
+ Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
32
+ c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
33
+ gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
34
+ HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
35
+ AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
36
+ Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
37
+ j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
38
+ hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
39
+ X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
40
+ -----END CERTIFICATE-----
41
+
42
+ GlobalSign Root CA - R2
43
+ =======================
44
+ -----BEGIN CERTIFICATE-----
45
+ MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
46
+ YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
47
+ bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
48
+ aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
49
+ bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
50
+ ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
51
+ s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
52
+ S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
53
+ TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
54
+ ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
55
+ FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
56
+ YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
57
+ BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
58
+ 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
59
+ 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
60
+ 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
61
+ TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
62
+ -----END CERTIFICATE-----
63
+
64
+ Verisign Class 3 Public Primary Certification Authority - G3
65
+ ============================================================
66
+ -----BEGIN CERTIFICATE-----
67
+ MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
68
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
69
+ cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
70
+ IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
71
+ dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
72
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
73
+ dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
74
+ cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
75
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
76
+ ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
77
+ EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
78
+ cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
79
+ EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
80
+ 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
81
+ ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
82
+ j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
83
+ /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
84
+ xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
85
+ t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
86
+ -----END CERTIFICATE-----
87
+
88
+ Entrust.net Premium 2048 Secure Server CA
89
+ =========================================
90
+ -----BEGIN CERTIFICATE-----
91
+ MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
92
+ ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
93
+ bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
94
+ BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
95
+ NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
96
+ d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
97
+ MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
98
+ ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
99
+ MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
100
+ Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
101
+ hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
102
+ nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
103
+ VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E
104
+ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ
105
+ KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy
106
+ T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
107
+ zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT
108
+ J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e
109
+ nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=
110
+ -----END CERTIFICATE-----
111
+
112
+ Baltimore CyberTrust Root
113
+ =========================
114
+ -----BEGIN CERTIFICATE-----
115
+ MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
116
+ ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
117
+ ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
118
+ SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
119
+ dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
120
+ uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
121
+ UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
122
+ G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
123
+ XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
124
+ l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
125
+ VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
126
+ BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
127
+ cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
128
+ hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
129
+ Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
130
+ RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
131
+ -----END CERTIFICATE-----
132
+
133
+ AddTrust External Root
134
+ ======================
135
+ -----BEGIN CERTIFICATE-----
136
+ MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
137
+ QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
138
+ VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
139
+ NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
140
+ cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
141
+ Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
142
+ +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
143
+ Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
144
+ aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
145
+ 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
146
+ 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
147
+ BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
148
+ VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
149
+ VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
150
+ IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
151
+ j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
152
+ 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
153
+ e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
154
+ G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
155
+ -----END CERTIFICATE-----
156
+
157
+ Entrust Root Certification Authority
158
+ ====================================
159
+ -----BEGIN CERTIFICATE-----
160
+ MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
161
+ BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
162
+ b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
163
+ A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
164
+ MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
165
+ MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
166
+ Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
167
+ dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
168
+ ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
169
+ A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
170
+ Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
171
+ j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
172
+ rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
173
+ DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
174
+ MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
175
+ hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
176
+ A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
177
+ Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
178
+ v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
179
+ W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
180
+ tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
181
+ -----END CERTIFICATE-----
182
+
183
+ GeoTrust Global CA
184
+ ==================
185
+ -----BEGIN CERTIFICATE-----
186
+ MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
187
+ Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
188
+ MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
189
+ LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
190
+ CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
191
+ BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
192
+ 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
193
+ T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
194
+ vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
195
+ AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
196
+ DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
197
+ zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
198
+ d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
199
+ mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
200
+ XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
201
+ Mw==
202
+ -----END CERTIFICATE-----
203
+
204
+ GeoTrust Universal CA
205
+ =====================
206
+ -----BEGIN CERTIFICATE-----
207
+ MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
208
+ R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
209
+ MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
210
+ Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
211
+ ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
212
+ JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
213
+ RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
214
+ 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
215
+ 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
216
+ qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
217
+ Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
218
+ Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
219
+ KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
220
+ ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
221
+ XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
222
+ hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
223
+ aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
224
+ qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
225
+ oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
226
+ xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
227
+ KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
228
+ DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
229
+ xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
230
+ p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
231
+ P/rmMuGNG2+k5o7Y+SlIis5z/iw=
232
+ -----END CERTIFICATE-----
233
+
234
+ GeoTrust Universal CA 2
235
+ =======================
236
+ -----BEGIN CERTIFICATE-----
237
+ MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
238
+ R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
239
+ MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
240
+ SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
241
+ A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
242
+ DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
243
+ j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
244
+ JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
245
+ QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
246
+ WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
247
+ 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
248
+ ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
249
+ SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
250
+ 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
251
+ +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
252
+ BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
253
+ dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
254
+ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
255
+ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
256
+ A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
257
+ Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
258
+ pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
259
+ FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
260
+ gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
261
+ X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
262
+ -----END CERTIFICATE-----
263
+
264
+ Visa eCommerce Root
265
+ ===================
266
+ -----BEGIN CERTIFICATE-----
267
+ MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
268
+ EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
269
+ QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
270
+ WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
271
+ VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
272
+ bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
273
+ F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
274
+ RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
275
+ TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
276
+ /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
277
+ GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
278
+ MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
279
+ CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
280
+ YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
281
+ zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
282
+ YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
283
+ 398znM/jra6O1I7mT1GvFpLgXPYHDw==
284
+ -----END CERTIFICATE-----
285
+
286
+ Certum Root CA
287
+ ==============
288
+ -----BEGIN CERTIFICATE-----
289
+ MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
290
+ ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
291
+ Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
292
+ by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
293
+ wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
294
+ kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
295
+ 89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
296
+ Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
297
+ NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
298
+ hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
299
+ GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
300
+ GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
301
+ 0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
302
+ qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
303
+ -----END CERTIFICATE-----
304
+
305
+ Comodo AAA Services root
306
+ ========================
307
+ -----BEGIN CERTIFICATE-----
308
+ MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
309
+ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
310
+ TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
311
+ MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
312
+ c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
313
+ BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
314
+ ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
315
+ C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
316
+ i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
317
+ Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
318
+ Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
319
+ Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
320
+ BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
321
+ cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
322
+ LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
323
+ 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
324
+ Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
325
+ 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
326
+ 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
327
+ -----END CERTIFICATE-----
328
+
329
+ QuoVadis Root CA
330
+ ================
331
+ -----BEGIN CERTIFICATE-----
332
+ MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
333
+ ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
334
+ eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
335
+ MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
336
+ cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
337
+ EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
338
+ AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
339
+ J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
340
+ F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
341
+ YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
342
+ AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
343
+ PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
344
+ ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
345
+ MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
346
+ YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
347
+ ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
348
+ Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
349
+ Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
350
+ BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
351
+ FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
352
+ aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
353
+ tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
354
+ fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
355
+ LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
356
+ gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
357
+ 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
358
+ 5nrQNiOKSnQ2+Q==
359
+ -----END CERTIFICATE-----
360
+
361
+ QuoVadis Root CA 2
362
+ ==================
363
+ -----BEGIN CERTIFICATE-----
364
+ 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
390
+ -----END CERTIFICATE-----
391
+
392
+ QuoVadis Root CA 3
393
+ ==================
394
+ -----BEGIN CERTIFICATE-----
395
+ MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
396
+ EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
397
+ OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
398
+ aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
399
+ DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
400
+ DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
401
+ KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
402
+ DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
403
+ BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
404
+ p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
405
+ nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
406
+ MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
407
+ Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
408
+ uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
409
+ BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
410
+ YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
411
+ aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
412
+ BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
413
+ VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
414
+ ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
415
+ AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
416
+ qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
417
+ hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
418
+ POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
419
+ Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
420
+ 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
421
+ bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
422
+ g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
423
+ vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
424
+ qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
425
+ -----END CERTIFICATE-----
426
+
427
+ Security Communication Root CA
428
+ ==============================
429
+ -----BEGIN CERTIFICATE-----
430
+ MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
431
+ U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
432
+ HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
433
+ U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
434
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
435
+ 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
436
+ DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
437
+ 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
438
+ DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
439
+ JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
440
+ DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
441
+ 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
442
+ mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
443
+ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
444
+ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
445
+ FL39vmwLAw==
446
+ -----END CERTIFICATE-----
447
+
448
+ Sonera Class 2 Root CA
449
+ ======================
450
+ -----BEGIN CERTIFICATE-----
451
+ MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
452
+ U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
453
+ NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
454
+ IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
455
+ /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
456
+ dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
457
+ f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
458
+ tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
459
+ nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
460
+ XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
461
+ 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
462
+ cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
463
+ Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
464
+ EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
465
+ llpwrN9M
466
+ -----END CERTIFICATE-----
467
+
468
+ Camerfirma Chambers of Commerce Root
469
+ ====================================
470
+ -----BEGIN CERTIFICATE-----
471
+ MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
472
+ QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
473
+ ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
474
+ NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
475
+ cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
476
+ MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
477
+ AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
478
+ xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
479
+ NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
480
+ DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
481
+ d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
482
+ EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
483
+ cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
484
+ AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
485
+ bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
486
+ VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
487
+ aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
488
+ fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
489
+ L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
490
+ UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
491
+ ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
492
+ erfutGWaIZDgqtCYvDi1czyL+Nw=
493
+ -----END CERTIFICATE-----
494
+
495
+ Camerfirma Global Chambersign Root
496
+ ==================================
497
+ -----BEGIN CERTIFICATE-----
498
+ MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
499
+ QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
500
+ ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
501
+ NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
502
+ YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
503
+ MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
504
+ ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
505
+ 1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
506
+ by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
507
+ 6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
508
+ 8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
509
+ BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
510
+ aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
511
+ Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
512
+ aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
513
+ ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
514
+ bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
515
+ PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
516
+ gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
517
+ PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
518
+ IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
519
+ t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
520
+ -----END CERTIFICATE-----
521
+
522
+ XRamp Global CA Root
523
+ ====================
524
+ -----BEGIN CERTIFICATE-----
525
+ MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
526
+ BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
527
+ dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
528
+ dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
529
+ HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
530
+ U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
531
+ dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
532
+ IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
533
+ foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
534
+ zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
535
+ AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
536
+ xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
537
+ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
538
+ oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
539
+ AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
540
+ /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
541
+ qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
542
+ nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
543
+ 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
544
+ -----END CERTIFICATE-----
545
+
546
+ Go Daddy Class 2 CA
547
+ ===================
548
+ -----BEGIN CERTIFICATE-----
549
+ MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
550
+ VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
551
+ ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
552
+ A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
553
+ RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
554
+ ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
555
+ 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
556
+ qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
557
+ YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
558
+ vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
559
+ BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
560
+ atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
561
+ MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
562
+ A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
563
+ PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
564
+ I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
565
+ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
566
+ Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
567
+ vZ8=
568
+ -----END CERTIFICATE-----
569
+
570
+ Starfield Class 2 CA
571
+ ====================
572
+ -----BEGIN CERTIFICATE-----
573
+ MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
574
+ U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
575
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
576
+ MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
577
+ A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
578
+ SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
579
+ bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
580
+ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
581
+ epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
582
+ F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
583
+ MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
584
+ hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
585
+ bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
586
+ QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
587
+ afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
588
+ PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
589
+ xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
590
+ KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
591
+ QBFGmh95DmK/D5fs4C8fF5Q=
592
+ -----END CERTIFICATE-----
593
+
594
+ StartCom Certification Authority
595
+ ================================
596
+ -----BEGIN CERTIFICATE-----
597
+ MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
598
+ U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
599
+ ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
600
+ NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
601
+ LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
602
+ U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
603
+ ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
604
+ o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
605
+ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
606
+ eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
607
+ 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
608
+ 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
609
+ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
610
+ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
611
+ UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
612
+ 37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
613
+ FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
614
+ Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
615
+ YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
616
+ AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
617
+ Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
618
+ U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
619
+ LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
620
+ cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
621
+ cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
622
+ dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
623
+ AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
624
+ 3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
625
+ vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
626
+ fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
627
+ fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
628
+ EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
629
+ yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
630
+ 1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
631
+ lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
632
+ g14=
633
+ -----END CERTIFICATE-----
634
+
635
+ Taiwan GRCA
636
+ ===========
637
+ -----BEGIN CERTIFICATE-----
638
+ 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
663
+ -----END CERTIFICATE-----
664
+
665
+ DigiCert Assured ID Root CA
666
+ ===========================
667
+ -----BEGIN CERTIFICATE-----
668
+ MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
669
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
670
+ IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
671
+ MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
672
+ ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
673
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
674
+ 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
675
+ UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
676
+ /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
677
+ oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
678
+ GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
679
+ 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
680
+ hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
681
+ EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
682
+ SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
683
+ 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
684
+ +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
685
+ -----END CERTIFICATE-----
686
+
687
+ DigiCert Global Root CA
688
+ =======================
689
+ -----BEGIN CERTIFICATE-----
690
+ MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
691
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
692
+ HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
693
+ MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
694
+ dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
695
+ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
696
+ TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
697
+ BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
698
+ 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
699
+ 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
700
+ o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
701
+ 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
702
+ BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
703
+ EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
704
+ tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
705
+ UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
706
+ CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
707
+ -----END CERTIFICATE-----
708
+
709
+ DigiCert High Assurance EV Root CA
710
+ ==================================
711
+ -----BEGIN CERTIFICATE-----
712
+ MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
713
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
714
+ KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
715
+ MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
716
+ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
717
+ Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
718
+ Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
719
+ OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
720
+ MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
721
+ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
722
+ h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
723
+ Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
724
+ JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
725
+ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
726
+ myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
727
+ mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
728
+ vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
729
+ -----END CERTIFICATE-----
730
+
731
+ Certplus Class 2 Primary CA
732
+ ===========================
733
+ -----BEGIN CERTIFICATE-----
734
+ MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
735
+ BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
736
+ OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
737
+ dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
738
+ ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
739
+ 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
740
+ Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
741
+ YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
742
+ e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
743
+ CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
744
+ YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
745
+ L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
746
+ P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
747
+ TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
748
+ 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
749
+ //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
750
+ l7+ijrRU
751
+ -----END CERTIFICATE-----
752
+
753
+ DST Root CA X3
754
+ ==============
755
+ -----BEGIN CERTIFICATE-----
756
+ MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
757
+ ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
758
+ DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
759
+ cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
760
+ ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
761
+ rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
762
+ UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
763
+ xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
764
+ utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
765
+ AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
766
+ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
767
+ dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
768
+ GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
769
+ RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
770
+ fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
771
+ -----END CERTIFICATE-----
772
+
773
+ DST ACES CA X6
774
+ ==============
775
+ -----BEGIN CERTIFICATE-----
776
+ MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
777
+ EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
778
+ MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
779
+ MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
780
+ CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
781
+ AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
782
+ DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
783
+ pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
784
+ GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
785
+ MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
786
+ EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
787
+ Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
788
+ dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
789
+ CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
790
+ 5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
791
+ Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
792
+ nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
793
+ vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
794
+ oKfN5XozNmr6mis=
795
+ -----END CERTIFICATE-----
796
+
797
+ SwissSign Gold CA - G2
798
+ ======================
799
+ -----BEGIN CERTIFICATE-----
800
+ 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
826
+ -----END CERTIFICATE-----
827
+
828
+ SwissSign Silver CA - G2
829
+ ========================
830
+ -----BEGIN CERTIFICATE-----
831
+ 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
857
+ -----END CERTIFICATE-----
858
+
859
+ GeoTrust Primary Certification Authority
860
+ ========================================
861
+ -----BEGIN CERTIFICATE-----
862
+ MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
863
+ EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
864
+ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
865
+ CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
866
+ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
867
+ CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
868
+ b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
869
+ nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
870
+ RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
871
+ tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
872
+ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
873
+ hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
874
+ Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
875
+ NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
876
+ Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
877
+ 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
878
+ -----END CERTIFICATE-----
879
+
880
+ thawte Primary Root CA
881
+ ======================
882
+ -----BEGIN CERTIFICATE-----
883
+ MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
884
+ BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
885
+ aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
886
+ cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
887
+ MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
888
+ SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
889
+ KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
890
+ FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
891
+ oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
892
+ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
893
+ q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
894
+ aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
895
+ afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
896
+ VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
897
+ AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
898
+ uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
899
+ xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
900
+ jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
901
+ z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
902
+ -----END CERTIFICATE-----
903
+
904
+ VeriSign Class 3 Public Primary Certification Authority - G5
905
+ ============================================================
906
+ -----BEGIN CERTIFICATE-----
907
+ MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
908
+ BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
909
+ ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
910
+ IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
911
+ ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
912
+ yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
913
+ biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
914
+ dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
915
+ YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
916
+ ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
917
+ j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
918
+ Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
919
+ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
920
+ fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
921
+ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
922
+ Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
923
+ aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
924
+ SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
925
+ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
926
+ KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
927
+ Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
928
+ ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
929
+ -----END CERTIFICATE-----
930
+
931
+ SecureTrust CA
932
+ ==============
933
+ -----BEGIN CERTIFICATE-----
934
+ MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
935
+ EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
936
+ dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
937
+ BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
938
+ ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
939
+ OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
940
+ DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
941
+ GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
942
+ 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
943
+ ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
944
+ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
945
+ aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
946
+ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
947
+ SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
948
+ mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
949
+ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
950
+ 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
951
+ -----END CERTIFICATE-----
952
+
953
+ Secure Global CA
954
+ ================
955
+ -----BEGIN CERTIFICATE-----
956
+ MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
957
+ EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
958
+ bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
959
+ MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
960
+ Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
961
+ YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
962
+ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
963
+ 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
964
+ HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
965
+ 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
966
+ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
967
+ oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
968
+ MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
969
+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
970
+ CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
971
+ 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
972
+ f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
973
+ -----END CERTIFICATE-----
974
+
975
+ COMODO Certification Authority
976
+ ==============================
977
+ -----BEGIN CERTIFICATE-----
978
+ MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
979
+ BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
980
+ A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
981
+ dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
982
+ MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
983
+ T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
984
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
985
+ +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
986
+ xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
987
+ 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
988
+ 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
989
+ rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
990
+ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
991
+ b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
992
+ AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
993
+ OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
994
+ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
995
+ IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
996
+ +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
997
+ -----END CERTIFICATE-----
998
+
999
+ Network Solutions Certificate Authority
1000
+ =======================================
1001
+ -----BEGIN CERTIFICATE-----
1002
+ MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
1003
+ EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
1004
+ IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
1005
+ MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
1006
+ MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
1007
+ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
1008
+ jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
1009
+ aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
1010
+ crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
1011
+ /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
1012
+ AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
1013
+ BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
1014
+ bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
1015
+ A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
1016
+ 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
1017
+ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
1018
+ wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
1019
+ ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
1020
+ -----END CERTIFICATE-----
1021
+
1022
+ COMODO ECC Certification Authority
1023
+ ==================================
1024
+ -----BEGIN CERTIFICATE-----
1025
+ MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
1026
+ R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
1027
+ ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
1028
+ dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
1029
+ GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
1030
+ Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
1031
+ b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
1032
+ 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
1033
+ wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
1034
+ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
1035
+ FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
1036
+ U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
1037
+ -----END CERTIFICATE-----
1038
+
1039
+ Security Communication EV RootCA1
1040
+ =================================
1041
+ -----BEGIN CERTIFICATE-----
1042
+ MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
1043
+ U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
1044
+ dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
1045
+ BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
1046
+ Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
1047
+ AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
1048
+ /VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
1049
+ WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
1050
+ ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
1051
+ bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
1052
+ 9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
1053
+ SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
1054
+ iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
1055
+ Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
1056
+ mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
1057
+ T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
1058
+ -----END CERTIFICATE-----
1059
+
1060
+ OISTE WISeKey Global Root GA CA
1061
+ ===============================
1062
+ -----BEGIN CERTIFICATE-----
1063
+ MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
1064
+ BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
1065
+ A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
1066
+ bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
1067
+ VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
1068
+ IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
1069
+ IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
1070
+ Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
1071
+ Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
1072
+ d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
1073
+ /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
1074
+ LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
1075
+ AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
1076
+ KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
1077
+ MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
1078
+ +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
1079
+ hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
1080
+ okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
1081
+ -----END CERTIFICATE-----
1082
+
1083
+ Certigna
1084
+ ========
1085
+ -----BEGIN CERTIFICATE-----
1086
+ MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
1087
+ EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
1088
+ MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
1089
+ Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
1090
+ XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
1091
+ GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
1092
+ ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
1093
+ DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
1094
+ Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
1095
+ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
1096
+ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
1097
+ SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
1098
+ hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
1099
+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
1100
+ PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
1101
+ 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
1102
+ WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
1103
+ -----END CERTIFICATE-----
1104
+
1105
+ Deutsche Telekom Root CA 2
1106
+ ==========================
1107
+ -----BEGIN CERTIFICATE-----
1108
+ MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
1109
+ RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
1110
+ A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
1111
+ MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
1112
+ A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
1113
+ b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
1114
+ bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
1115
+ KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
1116
+ AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
1117
+ Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
1118
+ jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
1119
+ HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
1120
+ E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
1121
+ zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
1122
+ rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
1123
+ dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
1124
+ Cm26OWMohpLzGITY+9HPBVZkVw==
1125
+ -----END CERTIFICATE-----
1126
+
1127
+ Cybertrust Global Root
1128
+ ======================
1129
+ -----BEGIN CERTIFICATE-----
1130
+ MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
1131
+ ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
1132
+ MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
1133
+ ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
1134
+ +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
1135
+ 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
1136
+ AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
1137
+ 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
1138
+ 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
1139
+ BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
1140
+ MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
1141
+ A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
1142
+ lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
1143
+ 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
1144
+ hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
1145
+ X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
1146
+ WL1WMRJOEcgh4LMRkWXbtKaIOM5V
1147
+ -----END CERTIFICATE-----
1148
+
1149
+ ePKI Root Certification Authority
1150
+ =================================
1151
+ -----BEGIN CERTIFICATE-----
1152
+ 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
1178
+ -----END CERTIFICATE-----
1179
+
1180
+ T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3
1181
+ =============================================================================================================================
1182
+ -----BEGIN CERTIFICATE-----
1183
+ MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
1184
+ DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
1185
+ aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
1186
+ b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
1187
+ BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
1188
+ S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
1189
+ MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
1190
+ IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
1191
+ n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
1192
+ IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
1193
+ dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
1194
+ cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
1195
+ AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
1196
+ Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
1197
+ xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
1198
+ 6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
1199
+ hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
1200
+ BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
1201
+ MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
1202
+ N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
1203
+ y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
1204
+ LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
1205
+ dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
1206
+ -----END CERTIFICATE-----
1207
+
1208
+ certSIGN ROOT CA
1209
+ ================
1210
+ -----BEGIN CERTIFICATE-----
1211
+ MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
1212
+ VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
1213
+ Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
1214
+ CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
1215
+ JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
1216
+ rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
1217
+ ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
1218
+ 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
1219
+ AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
1220
+ Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
1221
+ AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
1222
+ SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
1223
+ x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
1224
+ vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
1225
+ TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
1226
+ -----END CERTIFICATE-----
1227
+
1228
+ GeoTrust Primary Certification Authority - G3
1229
+ =============================================
1230
+ -----BEGIN CERTIFICATE-----
1231
+ MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
1232
+ BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
1233
+ IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
1234
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
1235
+ NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
1236
+ YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
1237
+ LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
1238
+ hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
1239
+ K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
1240
+ c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
1241
+ IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
1242
+ dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
1243
+ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
1244
+ 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
1245
+ cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
1246
+ Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
1247
+ AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
1248
+ t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
1249
+ -----END CERTIFICATE-----
1250
+
1251
+ thawte Primary Root CA - G2
1252
+ ===========================
1253
+ -----BEGIN CERTIFICATE-----
1254
+ MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
1255
+ VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
1256
+ IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
1257
+ Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
1258
+ MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
1259
+ b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
1260
+ IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
1261
+ LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
1262
+ 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
1263
+ mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
1264
+ G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
1265
+ rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
1266
+ -----END CERTIFICATE-----
1267
+
1268
+ thawte Primary Root CA - G3
1269
+ ===========================
1270
+ -----BEGIN CERTIFICATE-----
1271
+ MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
1272
+ BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
1273
+ aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
1274
+ cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
1275
+ ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
1276
+ d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
1277
+ VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
1278
+ A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
1279
+ MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
1280
+ P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
1281
+ +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
1282
+ 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
1283
+ vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
1284
+ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
1285
+ KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
1286
+ A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
1287
+ t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
1288
+ 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
1289
+ er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
1290
+ -----END CERTIFICATE-----
1291
+
1292
+ GeoTrust Primary Certification Authority - G2
1293
+ =============================================
1294
+ -----BEGIN CERTIFICATE-----
1295
+ MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
1296
+ VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
1297
+ Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
1298
+ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
1299
+ OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
1300
+ MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
1301
+ b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
1302
+ BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
1303
+ KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
1304
+ VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
1305
+ EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
1306
+ ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
1307
+ npaqBA+K
1308
+ -----END CERTIFICATE-----
1309
+
1310
+ VeriSign Universal Root Certification Authority
1311
+ ===============================================
1312
+ -----BEGIN CERTIFICATE-----
1313
+ MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
1314
+ BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
1315
+ ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
1316
+ IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
1317
+ IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
1318
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
1319
+ cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
1320
+ IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
1321
+ aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
1322
+ 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
1323
+ MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
1324
+ 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
1325
+ AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
1326
+ tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
1327
+ CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
1328
+ a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
1329
+ DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
1330
+ Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
1331
+ Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
1332
+ P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
1333
+ wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
1334
+ mJO37M2CYfE45k+XmCpajQ==
1335
+ -----END CERTIFICATE-----
1336
+
1337
+ VeriSign Class 3 Public Primary Certification Authority - G4
1338
+ ============================================================
1339
+ -----BEGIN CERTIFICATE-----
1340
+ MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
1341
+ VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
1342
+ b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
1343
+ ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
1344
+ YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
1345
+ MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
1346
+ cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
1347
+ b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
1348
+ IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
1349
+ Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
1350
+ rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
1351
+ /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
1352
+ HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
1353
+ Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
1354
+ A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
1355
+ AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
1356
+ -----END CERTIFICATE-----
1357
+
1358
+ NetLock Arany (Class Gold) Főtanúsítvány
1359
+ ========================================
1360
+ -----BEGIN CERTIFICATE-----
1361
+ MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
1362
+ A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
1363
+ dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
1364
+ cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
1365
+ MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
1366
+ ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
1367
+ biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
1368
+ c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
1369
+ 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
1370
+ /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
1371
+ H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
1372
+ fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
1373
+ neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
1374
+ BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
1375
+ qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
1376
+ YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
1377
+ bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
1378
+ NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
1379
+ dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
1380
+ -----END CERTIFICATE-----
1381
+
1382
+ Staat der Nederlanden Root CA - G2
1383
+ ==================================
1384
+ -----BEGIN CERTIFICATE-----
1385
+ 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
1411
+ 66+KAQ==
1412
+ -----END CERTIFICATE-----
1413
+
1414
+ Hongkong Post Root CA 1
1415
+ =======================
1416
+ -----BEGIN CERTIFICATE-----
1417
+ MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
1418
+ DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
1419
+ NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
1420
+ IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
1421
+ AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
1422
+ ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
1423
+ auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
1424
+ qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
1425
+ V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
1426
+ HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
1427
+ h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
1428
+ l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
1429
+ IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
1430
+ T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
1431
+ c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
1432
+ -----END CERTIFICATE-----
1433
+
1434
+ SecureSign RootCA11
1435
+ ===================
1436
+ -----BEGIN CERTIFICATE-----
1437
+ MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
1438
+ SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
1439
+ b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
1440
+ KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
1441
+ cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
1442
+ TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
1443
+ wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
1444
+ g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
1445
+ O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
1446
+ bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
1447
+ t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
1448
+ OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
1449
+ bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
1450
+ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
1451
+ y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
1452
+ lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
1453
+ -----END CERTIFICATE-----
1454
+
1455
+ ACEDICOM Root
1456
+ =============
1457
+ -----BEGIN CERTIFICATE-----
1458
+ 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
1484
+ -----END CERTIFICATE-----
1485
+
1486
+ Microsec e-Szigno Root CA 2009
1487
+ ==============================
1488
+ -----BEGIN CERTIFICATE-----
1489
+ MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
1490
+ MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
1491
+ c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
1492
+ dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
1493
+ BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
1494
+ U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
1495
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
1496
+ fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
1497
+ 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
1498
+ pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
1499
+ 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
1500
+ AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
1501
+ QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
1502
+ FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
1503
+ lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
1504
+ I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
1505
+ tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
1506
+ yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
1507
+ LXpUq3DDfSJlgnCW
1508
+ -----END CERTIFICATE-----
1509
+
1510
+ GlobalSign Root CA - R3
1511
+ =======================
1512
+ -----BEGIN CERTIFICATE-----
1513
+ MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
1514
+ YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
1515
+ bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
1516
+ aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
1517
+ bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
1518
+ iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
1519
+ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
1520
+ rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
1521
+ OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
1522
+ xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
1523
+ FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
1524
+ lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
1525
+ EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
1526
+ bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
1527
+ YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
1528
+ kpeDMdmztcpHWD9f
1529
+ -----END CERTIFICATE-----
1530
+
1531
+ Autoridad de Certificacion Firmaprofesional CIF A62634068
1532
+ =========================================================
1533
+ -----BEGIN CERTIFICATE-----
1534
+ MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
1535
+ BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
1536
+ MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
1537
+ QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
1538
+ NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
1539
+ Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
1540
+ B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
1541
+ 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
1542
+ ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
1543
+ plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
1544
+ MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
1545
+ LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
1546
+ bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
1547
+ vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
1548
+ EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
1549
+ DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
1550
+ cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
1551
+ bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
1552
+ ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
1553
+ 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
1554
+ R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
1555
+ T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
1556
+ Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
1557
+ osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
1558
+ crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
1559
+ saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
1560
+ KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
1561
+ 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
1562
+ -----END CERTIFICATE-----
1563
+
1564
+ Izenpe.com
1565
+ ==========
1566
+ -----BEGIN CERTIFICATE-----
1567
+ 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
1594
+ -----END CERTIFICATE-----
1595
+
1596
+ Chambers of Commerce Root - 2008
1597
+ ================================
1598
+ -----BEGIN CERTIFICATE-----
1599
+ MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
1600
+ MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
1601
+ bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
1602
+ QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
1603
+ Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
1604
+ ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
1605
+ EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
1606
+ cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
1607
+ AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
1608
+ XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
1609
+ h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
1610
+ ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
1611
+ NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
1612
+ D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
1613
+ lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
1614
+ 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
1615
+ ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
1616
+ EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
1617
+ G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
1618
+ BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
1619
+ bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
1620
+ bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
1621
+ CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
1622
+ AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
1623
+ wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
1624
+ 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
1625
+ RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
1626
+ M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
1627
+ YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
1628
+ 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
1629
+ zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
1630
+ nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
1631
+ OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
1632
+ -----END CERTIFICATE-----
1633
+
1634
+ Global Chambersign Root - 2008
1635
+ ==============================
1636
+ -----BEGIN CERTIFICATE-----
1637
+ MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
1638
+ MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
1639
+ bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
1640
+ QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
1641
+ NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
1642
+ Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
1643
+ QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
1644
+ aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
1645
+ VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
1646
+ XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
1647
+ ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
1648
+ /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
1649
+ TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
1650
+ H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
1651
+ Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
1652
+ HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
1653
+ wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
1654
+ AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
1655
+ BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
1656
+ BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
1657
+ aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
1658
+ aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
1659
+ 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
1660
+ dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
1661
+ /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
1662
+ ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
1663
+ dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
1664
+ 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
1665
+ foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
1666
+ qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
1667
+ P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
1668
+ c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
1669
+ 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
1670
+ -----END CERTIFICATE-----
1671
+
1672
+ Go Daddy Root Certificate Authority - G2
1673
+ ========================================
1674
+ -----BEGIN CERTIFICATE-----
1675
+ MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
1676
+ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
1677
+ MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
1678
+ MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
1679
+ b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
1680
+ A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
1681
+ hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
1682
+ 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
1683
+ +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
1684
+ fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
1685
+ NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
1686
+ MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
1687
+ BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
1688
+ vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
1689
+ 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
1690
+ N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
1691
+ LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
1692
+ -----END CERTIFICATE-----
1693
+
1694
+ Starfield Root Certificate Authority - G2
1695
+ =========================================
1696
+ -----BEGIN CERTIFICATE-----
1697
+ MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
1698
+ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
1699
+ b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
1700
+ eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
1701
+ DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
1702
+ VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
1703
+ dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
1704
+ W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
1705
+ bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
1706
+ N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
1707
+ ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
1708
+ JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
1709
+ AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
1710
+ TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
1711
+ 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
1712
+ F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
1713
+ pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
1714
+ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
1715
+ -----END CERTIFICATE-----
1716
+
1717
+ Starfield Services Root Certificate Authority - G2
1718
+ ==================================================
1719
+ -----BEGIN CERTIFICATE-----
1720
+ MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
1721
+ B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
1722
+ b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
1723
+ IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
1724
+ BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
1725
+ dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
1726
+ Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
1727
+ AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
1728
+ h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
1729
+ hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
1730
+ LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
1731
+ rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
1732
+ AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
1733
+ SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
1734
+ E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
1735
+ xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
1736
+ iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
1737
+ YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
1738
+ -----END CERTIFICATE-----
1739
+
1740
+ AffirmTrust Commercial
1741
+ ======================
1742
+ -----BEGIN CERTIFICATE-----
1743
+ MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
1744
+ BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
1745
+ MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
1746
+ bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
1747
+ AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
1748
+ DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
1749
+ C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
1750
+ BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
1751
+ MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
1752
+ HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
1753
+ AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
1754
+ hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
1755
+ qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
1756
+ 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
1757
+ sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
1758
+ -----END CERTIFICATE-----
1759
+
1760
+ AffirmTrust Networking
1761
+ ======================
1762
+ -----BEGIN CERTIFICATE-----
1763
+ MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
1764
+ BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
1765
+ MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
1766
+ bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
1767
+ AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
1768
+ Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
1769
+ dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
1770
+ /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
1771
+ h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
1772
+ HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
1773
+ AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
1774
+ UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
1775
+ 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
1776
+ WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
1777
+ /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
1778
+ -----END CERTIFICATE-----
1779
+
1780
+ AffirmTrust Premium
1781
+ ===================
1782
+ -----BEGIN CERTIFICATE-----
1783
+ MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
1784
+ BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
1785
+ OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
1786
+ dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
1787
+ MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
1788
+ BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
1789
+ 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
1790
+ +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
1791
+ GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
1792
+ p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
1793
+ S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
1794
+ 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
1795
+ /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
1796
+ +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
1797
+ /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
1798
+ MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
1799
+ Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
1800
+ 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
1801
+ L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
1802
+ +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
1803
+ BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
1804
+ IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
1805
+ g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
1806
+ zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
1807
+ -----END CERTIFICATE-----
1808
+
1809
+ AffirmTrust Premium ECC
1810
+ =======================
1811
+ -----BEGIN CERTIFICATE-----
1812
+ MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
1813
+ BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
1814
+ MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
1815
+ cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
1816
+ IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
1817
+ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
1818
+ BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
1819
+ BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
1820
+ 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
1821
+ eQ==
1822
+ -----END CERTIFICATE-----
1823
+
1824
+ Certum Trusted Network CA
1825
+ =========================
1826
+ -----BEGIN CERTIFICATE-----
1827
+ MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
1828
+ ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
1829
+ biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
1830
+ MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
1831
+ ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
1832
+ MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
1833
+ AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
1834
+ l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
1835
+ J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
1836
+ fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
1837
+ cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
1838
+ Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
1839
+ DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
1840
+ jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
1841
+ mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
1842
+ Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
1843
+ 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
1844
+ -----END CERTIFICATE-----
1845
+
1846
+ Certinomis - Autorité Racine
1847
+ ============================
1848
+ -----BEGIN CERTIFICATE-----
1849
+ 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
1874
+ vgt2Fl43N+bYdJeimUV5
1875
+ -----END CERTIFICATE-----
1876
+
1877
+ TWCA Root Certification Authority
1878
+ =================================
1879
+ -----BEGIN CERTIFICATE-----
1880
+ MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
1881
+ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
1882
+ dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
1883
+ EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
1884
+ IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
1885
+ AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
1886
+ QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
1887
+ oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
1888
+ 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
1889
+ y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
1890
+ BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
1891
+ 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
1892
+ mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
1893
+ QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
1894
+ T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
1895
+ Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
1896
+ -----END CERTIFICATE-----
1897
+
1898
+ Security Communication RootCA2
1899
+ ==============================
1900
+ -----BEGIN CERTIFICATE-----
1901
+ MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
1902
+ U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
1903
+ dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
1904
+ SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
1905
+ aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
1906
+ ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
1907
+ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
1908
+ 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
1909
+ spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
1910
+ EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
1911
+ QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
1912
+ CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
1913
+ u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
1914
+ 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
1915
+ tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
1916
+ mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
1917
+ -----END CERTIFICATE-----
1918
+
1919
+ EC-ACC
1920
+ ======
1921
+ -----BEGIN CERTIFICATE-----
1922
+ MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
1923
+ BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
1924
+ ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
1925
+ VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
1926
+ CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
1927
+ BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
1928
+ MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
1929
+ SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
1930
+ Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
1931
+ cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
1932
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
1933
+ w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
1934
+ ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
1935
+ HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
1936
+ E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
1937
+ 0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
1938
+ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
1939
+ VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
1940
+ Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
1941
+ dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
1942
+ lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
1943
+ Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
1944
+ l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
1945
+ E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
1946
+ 5EI=
1947
+ -----END CERTIFICATE-----
1948
+
1949
+ Hellenic Academic and Research Institutions RootCA 2011
1950
+ =======================================================
1951
+ -----BEGIN CERTIFICATE-----
1952
+ MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
1953
+ O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
1954
+ aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
1955
+ IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
1956
+ AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
1957
+ IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
1958
+ IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
1959
+ AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
1960
+ 1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
1961
+ 71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
1962
+ 8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
1963
+ 3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
1964
+ MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
1965
+ MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
1966
+ b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
1967
+ XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
1968
+ TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
1969
+ /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
1970
+ 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
1971
+ -----END CERTIFICATE-----
1972
+
1973
+ Actalis Authentication Root CA
1974
+ ==============================
1975
+ -----BEGIN CERTIFICATE-----
1976
+ MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
1977
+ BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
1978
+ AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
1979
+ MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
1980
+ IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
1981
+ IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
1982
+ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
1983
+ by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
1984
+ zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
1985
+ YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
1986
+ oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
1987
+ EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
1988
+ hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
1989
+ EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
1990
+ jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
1991
+ iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
1992
+ ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
1993
+ WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
1994
+ JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
1995
+ K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
1996
+ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
1997
+ 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
1998
+ 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
1999
+ lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
2000
+ OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
2001
+ vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
2002
+ -----END CERTIFICATE-----
2003
+
2004
+ Trustis FPS Root CA
2005
+ ===================
2006
+ -----BEGIN CERTIFICATE-----
2007
+ MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
2008
+ EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
2009
+ IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
2010
+ BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
2011
+ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
2012
+ RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
2013
+ H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
2014
+ cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
2015
+ o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
2016
+ AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
2017
+ BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
2018
+ GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
2019
+ yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
2020
+ 8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
2021
+ l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
2022
+ iB6XzCGcKQENZetX2fNXlrtIzYE=
2023
+ -----END CERTIFICATE-----
2024
+
2025
+ StartCom Certification Authority
2026
+ ================================
2027
+ -----BEGIN CERTIFICATE-----
2028
+ MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
2029
+ U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
2030
+ ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
2031
+ NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
2032
+ LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
2033
+ U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
2034
+ ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
2035
+ o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
2036
+ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
2037
+ eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
2038
+ 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
2039
+ 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
2040
+ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
2041
+ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
2042
+ UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
2043
+ 37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
2044
+ VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ
2045
+ Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0
2046
+ dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu
2047
+ c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv
2048
+ bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0
2049
+ aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0
2050
+ aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t
2051
+ L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG
2052
+ cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5
2053
+ fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm
2054
+ N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN
2055
+ Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T
2056
+ tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX
2057
+ e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA
2058
+ 2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs
2059
+ HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
2060
+ JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib
2061
+ D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=
2062
+ -----END CERTIFICATE-----
2063
+
2064
+ StartCom Certification Authority G2
2065
+ ===================================
2066
+ -----BEGIN CERTIFICATE-----
2067
+ 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
2091
+ obp573PYtlNXLfbQ4ddI
2092
+ -----END CERTIFICATE-----
2093
+
2094
+ Buypass Class 2 Root CA
2095
+ =======================
2096
+ -----BEGIN CERTIFICATE-----
2097
+ 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
2121
+ rJgWVqA=
2122
+ -----END CERTIFICATE-----
2123
+
2124
+ Buypass Class 3 Root CA
2125
+ =======================
2126
+ -----BEGIN CERTIFICATE-----
2127
+ MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
2128
+ QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X
2129
+ DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
2130
+ eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw
2131
+ DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH
2132
+ sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR
2133
+ 5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh
2134
+ 7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ
2135
+ ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH
2136
+ 2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV
2137
+ /afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ
2138
+ RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA
2139
+ Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq
2140
+ j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
2141
+ VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
2142
+ AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
2143
+ cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G
2144
+ uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG
2145
+ Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8
2146
+ ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2
2147
+ KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz
2148
+ 6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug
2149
+ UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe
2150
+ eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi
2151
+ Cp/HuZc=
2152
+ -----END CERTIFICATE-----
2153
+
2154
+ T-TeleSec GlobalRoot Class 3
2155
+ ============================
2156
+ -----BEGIN CERTIFICATE-----
2157
+ MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
2158
+ IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
2159
+ cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
2160
+ MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
2161
+ dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
2162
+ ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
2163
+ DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
2164
+ 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
2165
+ NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
2166
+ iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
2167
+ 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
2168
+ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
2169
+ AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
2170
+ fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
2171
+ ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
2172
+ P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
2173
+ e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
2174
+ -----END CERTIFICATE-----
2175
+
2176
+ EE Certification Centre Root CA
2177
+ ===============================
2178
+ -----BEGIN CERTIFICATE-----
2179
+ MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
2180
+ EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
2181
+ dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
2182
+ MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
2183
+ UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
2184
+ ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
2185
+ DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
2186
+ TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
2187
+ rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
2188
+ 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
2189
+ P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
2190
+ AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
2191
+ MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
2192
+ BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
2193
+ xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
2194
+ lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
2195
+ uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
2196
+ 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
2197
+ dcGWxZ0=
2198
+ -----END CERTIFICATE-----
2199
+
2200
+ TURKTRUST Certificate Services Provider Root 2007
2201
+ =================================================
2202
+ -----BEGIN CERTIFICATE-----
2203
+ MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
2204
+ bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
2205
+ MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
2206
+ QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X
2207
+ DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl
2208
+ a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN
2209
+ BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
2210
+ bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw
2211
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N
2212
+ YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv
2213
+ KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya
2214
+ KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT
2215
+ rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC
2216
+ AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP
2217
+ BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s
2218
+ Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
2219
+ aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO
2220
+ Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb
2221
+ BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK
2222
+ poRq0Tl9
2223
+ -----END CERTIFICATE-----
2224
+
2225
+ D-TRUST Root Class 3 CA 2 2009
2226
+ ==============================
2227
+ -----BEGIN CERTIFICATE-----
2228
+ MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK
2229
+ DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe
2230
+ Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE
2231
+ LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw
2232
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD
2233
+ ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA
2234
+ BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv
2235
+ KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z
2236
+ p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC
2237
+ AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ
2238
+ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y
2239
+ eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw
2240
+ MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G
2241
+ PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw
2242
+ OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm
2243
+ 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
2244
+ o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV
2245
+ dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph
2246
+ X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=
2247
+ -----END CERTIFICATE-----
2248
+
2249
+ D-TRUST Root Class 3 CA 2 EV 2009
2250
+ =================================
2251
+ -----BEGIN CERTIFICATE-----
2252
+ MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
2253
+ DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
2254
+ OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
2255
+ DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
2256
+ OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS
2257
+ egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh
2258
+ zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T
2259
+ 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60
2260
+ sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35
2261
+ 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv
2262
+ cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v
2263
+ ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El
2264
+ MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp
2265
+ b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh
2266
+ c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+
2267
+ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
2268
+ nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX
2269
+ ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA
2270
+ NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv
2271
+ w9y4AyHqnxbxLFS1
2272
+ -----END CERTIFICATE-----
2273
+
2274
+ PSCProcert
2275
+ ==========
2276
+ -----BEGIN CERTIFICATE-----
2277
+ MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk
2278
+ ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ
2279
+ MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz
2280
+ dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl
2281
+ cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw
2282
+ IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw
2283
+ MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w
2284
+ DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD
2285
+ ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp
2286
+ Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw
2287
+ DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC
2288
+ wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA
2289
+ 3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh
2290
+ RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO
2291
+ EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2
2292
+ 0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH
2293
+ 0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU
2294
+ td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw
2295
+ Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp
2296
+ r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/
2297
+ AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz
2298
+ Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId
2299
+ xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp
2300
+ ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH
2301
+ EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h
2302
+ Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k
2303
+ ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG
2304
+ 9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG
2305
+ MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG
2306
+ LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52
2307
+ ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy
2308
+ YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v
2309
+ Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o
2310
+ dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq
2311
+ T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN
2312
+ g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q
2313
+ uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1
2314
+ n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn
2315
+ FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo
2316
+ 5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq
2317
+ 3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5
2318
+ poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y
2319
+ eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km
2320
+ -----END CERTIFICATE-----
2321
+
2322
+ CA Disig Root R1
2323
+ ================
2324
+ -----BEGIN CERTIFICATE-----
2325
+ MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw
2326
+ EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
2327
+ ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx
2328
+ EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
2329
+ c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy
2330
+ 3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8
2331
+ u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2
2332
+ m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk
2333
+ CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa
2334
+ YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6
2335
+ vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL
2336
+ LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX
2337
+ ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is
2338
+ XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV
2339
+ HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ
2340
+ 04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR
2341
+ xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B
2342
+ LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM
2343
+ CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb
2344
+ VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85
2345
+ YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS
2346
+ ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix
2347
+ lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N
2348
+ UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ
2349
+ a7+h89n07eLw4+1knj0vllJPgFOL
2350
+ -----END CERTIFICATE-----
2351
+
2352
+ CA Disig Root R2
2353
+ ================
2354
+ -----BEGIN CERTIFICATE-----
2355
+ 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
2379
+ 7+ZtsH8tZ/3zbBt1RqPlShfppNcL
2380
+ -----END CERTIFICATE-----
2381
+
2382
+ ACCVRAIZ1
2383
+ =========
2384
+ -----BEGIN CERTIFICATE-----
2385
+ MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB
2386
+ SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1
2387
+ MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH
2388
+ UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
2389
+ DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM
2390
+ jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0
2391
+ RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD
2392
+ aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ
2393
+ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG
2394
+ WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7
2395
+ 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR
2396
+ 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J
2397
+ 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK
2398
+ Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw
2399
+ Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu
2400
+ Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
2401
+ VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM
2402
+ Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA
2403
+ QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh
2404
+ AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA
2405
+ YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj
2406
+ AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA
2407
+ IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk
2408
+ aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0
2409
+ dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2
2410
+ MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI
2411
+ hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E
2412
+ R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN
2413
+ YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49
2414
+ nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ
2415
+ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3
2416
+ sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
2417
+ I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg
2418
+ Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd
2419
+ 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p
2420
+ EfbRD0tVNEYqi4Y7
2421
+ -----END CERTIFICATE-----
2422
+
2423
+ TWCA Global Root CA
2424
+ ===================
2425
+ -----BEGIN CERTIFICATE-----
2426
+ MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT
2427
+ CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD
2428
+ QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK
2429
+ EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg
2430
+ Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C
2431
+ nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV
2432
+ r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR
2433
+ Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV
2434
+ tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W
2435
+ KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99
2436
+ sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p
2437
+ yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn
2438
+ kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI
2439
+ zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC
2440
+ AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g
2441
+ cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
2442
+ LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M
2443
+ 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg
2444
+ /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg
2445
+ lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP
2446
+ A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m
2447
+ i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8
2448
+ EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3
2449
+ zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=
2450
+ -----END CERTIFICATE-----
2451
+
2452
+ TeliaSonera Root CA v1
2453
+ ======================
2454
+ -----BEGIN CERTIFICATE-----
2455
+ MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE
2456
+ CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4
2457
+ MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW
2458
+ VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+
2459
+ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA
2460
+ 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k
2461
+ B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn
2462
+ Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH
2463
+ oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3
2464
+ F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ
2465
+ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7
2466
+ gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc
2467
+ TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB
2468
+ AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW
2469
+ DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm
2470
+ zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
2471
+ 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW
2472
+ pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV
2473
+ G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc
2474
+ c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT
2475
+ JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2
2476
+ qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6
2477
+ Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems
2478
+ WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
2479
+ -----END CERTIFICATE-----
2480
+
2481
+ E-Tugra Certification Authority
2482
+ ===============================
2483
+ -----BEGIN CERTIFICATE-----
2484
+ MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w
2485
+ DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls
2486
+ ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
2487
+ ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw
2488
+ NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx
2489
+ QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl
2490
+ cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD
2491
+ DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
2492
+ MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd
2493
+ hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K
2494
+ CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g
2495
+ ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ
2496
+ BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0
2497
+ E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz
2498
+ rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq
2499
+ jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
2500
+ rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5
2501
+ dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB
2502
+ /wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG
2503
+ MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK
2504
+ kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO
2505
+ XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807
2506
+ VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo
2507
+ a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc
2508
+ dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV
2509
+ KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT
2510
+ Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0
2511
+ 8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G
2512
+ C7TbO6Orb1wdtn7os4I07QZcJA==
2513
+ -----END CERTIFICATE-----
2514
+
2515
+ T-TeleSec GlobalRoot Class 2
2516
+ ============================
2517
+ -----BEGIN CERTIFICATE-----
2518
+ MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
2519
+ IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
2520
+ cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx
2521
+ MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
2522
+ dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
2523
+ ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3
2524
+ DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ
2525
+ SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F
2526
+ vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970
2527
+ 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV
2528
+ WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA
2529
+ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy
2530
+ YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4
2531
+ r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf
2532
+ vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR
2533
+ 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
2534
+ 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==
2535
+ -----END CERTIFICATE-----
2536
+
2537
+ Atos TrustedRoot 2011
2538
+ =====================
2539
+ -----BEGIN CERTIFICATE-----
2540
+ MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU
2541
+ cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4
2542
+ MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG
2543
+ A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV
2544
+ hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr
2545
+ 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+
2546
+ DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320
2547
+ HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR
2548
+ z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R
2549
+ l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ
2550
+ bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
2551
+ CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h
2552
+ k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh
2553
+ TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9
2554
+ 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G
2555
+ 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
2556
+ -----END CERTIFICATE-----
2557
+
2558
+ QuoVadis Root CA 1 G3
2559
+ =====================
2560
+ -----BEGIN CERTIFICATE-----
2561
+ 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
2585
+ hMJKzRwuJIczYOXD
2586
+ -----END CERTIFICATE-----
2587
+
2588
+ QuoVadis Root CA 2 G3
2589
+ =====================
2590
+ -----BEGIN CERTIFICATE-----
2591
+ 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
2615
+ O3jtZsSOeWmD3n+M
2616
+ -----END CERTIFICATE-----
2617
+
2618
+ QuoVadis Root CA 3 G3
2619
+ =====================
2620
+ -----BEGIN CERTIFICATE-----
2621
+ MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG
2622
+ A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
2623
+ b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN
2624
+ MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg
2625
+ RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286
2626
+ IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL
2627
+ Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe
2628
+ 6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3
2629
+ I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U
2630
+ VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7
2631
+ 5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi
2632
+ Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM
2633
+ dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt
2634
+ rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
2635
+ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI
2636
+ hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px
2637
+ KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS
2638
+ t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ
2639
+ TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du
2640
+ DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib
2641
+ Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD
2642
+ hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX
2643
+ 0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW
2644
+ dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2
2645
+ PpxxVJkES/1Y+Zj0
2646
+ -----END CERTIFICATE-----
2647
+
2648
+ DigiCert Assured ID Root G2
2649
+ ===========================
2650
+ -----BEGIN CERTIFICATE-----
2651
+ MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG
2652
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
2653
+ IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw
2654
+ MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
2655
+ ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw
2656
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH
2657
+ 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq
2658
+ bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw
2659
+ VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP
2660
+ YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn
2661
+ lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO
2662
+ w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv
2663
+ 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz
2664
+ d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW
2665
+ hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M
2666
+ jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
2667
+ IhNzbM8m9Yop5w==
2668
+ -----END CERTIFICATE-----
2669
+
2670
+ DigiCert Assured ID Root G3
2671
+ ===========================
2672
+ -----BEGIN CERTIFICATE-----
2673
+ MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
2674
+ UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD
2675
+ VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
2676
+ MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
2677
+ d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ
2678
+ BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb
2679
+ RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs
2680
+ KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF
2681
+ UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy
2682
+ YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy
2683
+ 1vUhZscv6pZjamVFkpUBtA==
2684
+ -----END CERTIFICATE-----
2685
+
2686
+ DigiCert Global Root G2
2687
+ =======================
2688
+ -----BEGIN CERTIFICATE-----
2689
+ MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG
2690
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
2691
+ HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx
2692
+ MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
2693
+ dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq
2694
+ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ
2695
+ kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO
2696
+ 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV
2697
+ BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM
2698
+ UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB
2699
+ o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu
2700
+ 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr
2701
+ F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U
2702
+ WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH
2703
+ QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/
2704
+ iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
2705
+ MrY=
2706
+ -----END CERTIFICATE-----
2707
+
2708
+ DigiCert Global Root G3
2709
+ =======================
2710
+ -----BEGIN CERTIFICATE-----
2711
+ MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV
2712
+ UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD
2713
+ VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw
2714
+ MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
2715
+ aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C
2716
+ AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O
2717
+ YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP
2718
+ BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp
2719
+ Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y
2720
+ 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34
2721
+ VOKa5Vt8sycX
2722
+ -----END CERTIFICATE-----
2723
+
2724
+ DigiCert Trusted Root G4
2725
+ ========================
2726
+ -----BEGIN CERTIFICATE-----
2727
+ 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
2752
+ 82Z+
2753
+ -----END CERTIFICATE-----
2754
+
2755
+ WoSign
2756
+ ======
2757
+ -----BEGIN CERTIFICATE-----
2758
+ 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
2783
+ -----END CERTIFICATE-----
2784
+
2785
+ WoSign China
2786
+ ============
2787
+ -----BEGIN CERTIFICATE-----
2788
+ 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
2812
+ kI26oQ==
2813
+ -----END CERTIFICATE-----
2814
+
2815
+ COMODO RSA Certification Authority
2816
+ ==================================
2817
+ -----BEGIN CERTIFICATE-----
2818
+ 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
2844
+ LaZRfyHBNVOFBkpdn627G190
2845
+ -----END CERTIFICATE-----
2846
+
2847
+ USERTrust RSA Certification Authority
2848
+ =====================================
2849
+ -----BEGIN CERTIFICATE-----
2850
+ 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
2876
+ Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9
2877
+ -----END CERTIFICATE-----
2878
+
2879
+ USERTrust ECC Certification Authority
2880
+ =====================================
2881
+ -----BEGIN CERTIFICATE-----
2882
+ MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC
2883
+ VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
2884
+ aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
2885
+ biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC
2886
+ VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
2887
+ aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
2888
+ biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2
2889
+ 0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez
2890
+ nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV
2891
+ HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB
2892
+ HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu
2893
+ 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
2894
+ -----END CERTIFICATE-----
2895
+
2896
+ GlobalSign ECC Root CA - R4
2897
+ ===========================
2898
+ -----BEGIN CERTIFICATE-----
2899
+ MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb
2900
+ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
2901
+ EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
2902
+ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
2903
+ EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl
2904
+ OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P
2905
+ AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV
2906
+ MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF
2907
+ JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=
2908
+ -----END CERTIFICATE-----
2909
+
2910
+ GlobalSign ECC Root CA - R5
2911
+ ===========================
2912
+ -----BEGIN CERTIFICATE-----
2913
+ MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb
2914
+ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
2915
+ EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
2916
+ R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
2917
+ EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6
2918
+ SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS
2919
+ h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
2920
+ BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx
2921
+ uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
2922
+ yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
2923
+ -----END CERTIFICATE-----
2924
+
2925
+ Staat der Nederlanden Root CA - G3
2926
+ ==================================
2927
+ -----BEGIN CERTIFICATE-----
2928
+ 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
2953
+ -----END CERTIFICATE-----
2954
+
2955
+ Staat der Nederlanden EV Root CA
2956
+ ================================
2957
+ -----BEGIN CERTIFICATE-----
2958
+ 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
2982
+ eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==
2983
+ -----END CERTIFICATE-----
2984
+
2985
+ IdenTrust Commercial Root CA 1
2986
+ ==============================
2987
+ -----BEGIN CERTIFICATE-----
2988
+ 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
3012
+ cGzM7vRX+Bi6hG6H
3013
+ -----END CERTIFICATE-----
3014
+
3015
+ IdenTrust Public Sector Root CA 1
3016
+ =================================
3017
+ -----BEGIN CERTIFICATE-----
3018
+ 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
3042
+ 3Wl9af0AVqW3rLatt8o+Ae+c
3043
+ -----END CERTIFICATE-----
3044
+
3045
+ Entrust Root Certification Authority - G2
3046
+ =========================================
3047
+ -----BEGIN CERTIFICATE-----
3048
+ MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV
3049
+ BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy
3050
+ bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug
3051
+ b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw
3052
+ HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT
3053
+ DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx
3054
+ OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s
3055
+ eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi
3056
+ MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP
3057
+ /vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz
3058
+ HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU
3059
+ s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y
3060
+ TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx
3061
+ AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6
3062
+ 0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z
3063
+ iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
3064
+ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi
3065
+ nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+
3066
+ vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO
3067
+ e4pIb4tF9g==
3068
+ -----END CERTIFICATE-----
3069
+
3070
+ Entrust Root Certification Authority - EC1
3071
+ ==========================================
3072
+ -----BEGIN CERTIFICATE-----
3073
+ MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx
3074
+ FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn
3075
+ YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl
3076
+ ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
3077
+ IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw
3078
+ FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs
3079
+ LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg
3080
+ dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
3081
+ IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy
3082
+ AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef
3083
+ 9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
3084
+ FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h
3085
+ vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8
3086
+ kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
3087
+ -----END CERTIFICATE-----
3088
+
3089
+ CFCA EV ROOT
3090
+ ============
3091
+ -----BEGIN CERTIFICATE-----
3092
+ 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
3117
+ -----END CERTIFICATE-----
3118
+
3119
+ TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5
3120
+ ====================================================
3121
+ -----BEGIN CERTIFICATE-----
3122
+ MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN
3123
+ BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
3124
+ bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg
3125
+ RWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw
3126
+ ODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w
3127
+ SwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE
3128
+ n2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp
3129
+ ZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
3130
+ CgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537
3131
+ jVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m
3132
+ ep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP
3133
+ 9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV
3134
+ 4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH
3135
+ HtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
3136
+ hvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo
3137
+ BP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq
3138
+ URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl
3139
+ lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8
3140
+ B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU=
3141
+ -----END CERTIFICATE-----
3142
+
3143
+ Certinomis - Root CA
3144
+ ====================
3145
+ -----BEGIN CERTIFICATE-----
3146
+ MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
3147
+ Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg
3148
+ LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx
3149
+ EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD
3150
+ ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos
3151
+ P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo
3152
+ d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap
3153
+ z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00
3154
+ 8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x
3155
+ RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE
3156
+ 6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t
3157
+ FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV
3158
+ PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH
3159
+ i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj
3160
+ YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I
3161
+ 6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF
3162
+ AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV
3163
+ WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw
3164
+ Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX
3165
+ lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ
3166
+ y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9
3167
+ Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng
3168
+ DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi
3169
+ I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM
3170
+ cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr
3171
+ hkIGuUE=
3172
+ -----END CERTIFICATE-----
3173
+
3174
+ OISTE WISeKey Global Root GB CA
3175
+ ===============================
3176
+ -----BEGIN CERTIFICATE-----
3177
+ MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG
3178
+ EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
3179
+ ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw
3180
+ MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD
3181
+ VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds
3182
+ b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX
3183
+ scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP
3184
+ rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk
3185
+ 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o
3186
+ Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg
3187
+ GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
3188
+ /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI
3189
+ hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD
3190
+ dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0
3191
+ VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui
3192
+ HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
3193
+ Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
3194
+ -----END CERTIFICATE-----
3195
+
3196
+ Certification Authority of WoSign G2
3197
+ ====================================
3198
+ -----BEGIN CERTIFICATE-----
3199
+ MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQG
3200
+ EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNVBAMTJENlcnRpZmljYXRpb24g
3201
+ QXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgx
3202
+ CzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlm
3203
+ aWNhdGlvbiBBdXRob3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
3204
+ CgKCAQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPXJYY1kBai
3205
+ XW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgOgHzKtB0TiGsOqCR3A9Du
3206
+ W/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg9
3207
+ 5k4ot+vElbGs/V6r+kHLXZ1L3PR8du9nfwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BK
3208
+ v0mUYQs4kI9dJGwlezt52eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
3209
+ AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJKoZI
3210
+ hvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8fHulwqZm46qwtyeY
3211
+ P0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G3CE4Q3RM+zD4F3LBMvzIkRfEzFg3
3212
+ TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yySrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu
3213
+ +sif/a+RZQp4OBXllxcU3fngLDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+
3214
+ 7Q9LGOHSJDy7XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg=
3215
+ -----END CERTIFICATE-----
3216
+
3217
+ CA WoSign ECC Root
3218
+ ==================
3219
+ -----BEGIN CERTIFICATE-----
3220
+ MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQswCQYDVQQGEwJD
3221
+ TjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMTEkNBIFdvU2lnbiBFQ0MgUm9v
3222
+ dDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQK
3223
+ ExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZI
3224
+ zj0CAQYFK4EEACIDYgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiU
3225
+ t5v8KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES1ns2o0Iw
3226
+ QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqv3VWqP2h4syhf3R
3227
+ MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0
3228
+ Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu
3229
+ a/GRspBl9JrmkO5K
3230
+ -----END CERTIFICATE-----
3231
+
3232
+ SZAFIR ROOT CA2
3233
+ ===============
3234
+ -----BEGIN CERTIFICATE-----
3235
+ MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG
3236
+ A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV
3237
+ BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ
3238
+ BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD
3239
+ VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q
3240
+ qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK
3241
+ DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE
3242
+ 2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ
3243
+ ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi
3244
+ ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
3245
+ AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC
3246
+ AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5
3247
+ O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67
3248
+ oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul
3249
+ 4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6
3250
+ +/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
3251
+ -----END CERTIFICATE-----
3252
+
3253
+ Certum Trusted Network CA 2
3254
+ ===========================
3255
+ -----BEGIN CERTIFICATE-----
3256
+ MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE
3257
+ BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1
3258
+ bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y
3259
+ ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ
3260
+ TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl
3261
+ cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB
3262
+ IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9
3263
+ 7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o
3264
+ CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b
3265
+ Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p
3266
+ uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130
3267
+ GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ
3268
+ 9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB
3269
+ Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye
3270
+ hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM
3271
+ BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
3272
+ AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI
3273
+ hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW
3274
+ Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA
3275
+ L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo
3276
+ clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM
3277
+ pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb
3278
+ w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo
3279
+ J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm
3280
+ ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX
3281
+ is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7
3282
+ zAYspsbiDrW5viSP
3283
+ -----END CERTIFICATE-----
3284
+
3285
+ Hellenic Academic and Research Institutions RootCA 2015
3286
+ =======================================================
3287
+ -----BEGIN CERTIFICATE-----
3288
+ MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT
3289
+ BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0
3290
+ aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl
3291
+ YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx
3292
+ MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg
3293
+ QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV
3294
+ BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw
3295
+ MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv
3296
+ bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh
3297
+ iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+
3298
+ 6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd
3299
+ FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr
3300
+ i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F
3301
+ GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2
3302
+ fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu
3303
+ iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
3304
+ Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
3305
+ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI
3306
+ hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+
3307
+ D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM
3308
+ d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y
3309
+ d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn
3310
+ 82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb
3311
+ davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F
3312
+ Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt
3313
+ J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa
3314
+ JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q
3315
+ p/UsQu0yrbYhnr68
3316
+ -----END CERTIFICATE-----
3317
+
3318
+ Hellenic Academic and Research Institutions ECC RootCA 2015
3319
+ ===========================================================
3320
+ -----BEGIN CERTIFICATE-----
3321
+ MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0
3322
+ aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
3323
+ cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj
3324
+ aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw
3325
+ MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj
3326
+ IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD
3327
+ VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290
3328
+ Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP
3329
+ dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK
3330
+ Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
3331
+ BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA
3332
+ GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn
3333
+ dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
3334
+ -----END CERTIFICATE-----
3335
+
3336
+ Certplus Root CA G1
3337
+ ===================
3338
+ -----BEGIN CERTIFICATE-----
3339
+ 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
3363
+ qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo=
3364
+ -----END CERTIFICATE-----
3365
+
3366
+ Certplus Root CA G2
3367
+ ===================
3368
+ -----BEGIN CERTIFICATE-----
3369
+ MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4xCzAJBgNVBAYT
3370
+ AkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjAeFw0x
3371
+ NDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0
3372
+ cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IA
3373
+ BM0PW1aC3/BFGtat93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uN
3374
+ Am8xIk0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0PAQH/BAQD
3375
+ AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMB8GA1Ud
3376
+ IwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqGSM49BAMDA2gAMGUCMHD+sAvZ94OX7PNV
3377
+ HdTcswYO/jOYnYs5kGuUIe22113WTNchp+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjl
3378
+ vPl5adytRSv3tjFzzAalU5ORGpOucGpnutee5WEaXw==
3379
+ -----END CERTIFICATE-----
3380
+
3381
+ OpenTrust Root CA G1
3382
+ ====================
3383
+ -----BEGIN CERTIFICATE-----
3384
+ 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
3408
+ OXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj1oxx
3409
+ -----END CERTIFICATE-----
3410
+
3411
+ OpenTrust Root CA G2
3412
+ ====================
3413
+ -----BEGIN CERTIFICATE-----
3414
+ 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
3438
+ u7JwqkwR3v98KzfUetF3NI/n+UL3PIEMS1IK
3439
+ -----END CERTIFICATE-----
3440
+
3441
+ OpenTrust Root CA G3
3442
+ ====================
3443
+ -----BEGIN CERTIFICATE-----
3444
+ MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAxCzAJBgNVBAYT
3445
+ AkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEczMB4X
3446
+ DTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9w
3447
+ ZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQA
3448
+ IgNiAARK7liuTcpm3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5B
3449
+ ta1doYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4GA1UdDwEB
3450
+ /wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAf
3451
+ BgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAKBggqhkjOPQQDAwNpADBmAjEAj6jcnboM
3452
+ BBf6Fek9LykBl7+BFjNAk2z8+e2AcG+qj9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta
3453
+ 3U1fJAuwACEl74+nBCZx4nxp5V2a+EEfOzmTk51V6s2N8fvB
3454
+ -----END CERTIFICATE-----
3455
+
3456
+ ISRG Root X1
3457
+ ============
3458
+ -----BEGIN CERTIFICATE-----
3459
+ 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
3483
+ m+kXQ99b21/+jh5Xos1AnX5iItreGCc=
3484
+ -----END CERTIFICATE-----
3485
+
3486
+ AC RAIZ FNMT-RCM
3487
+ ================
3488
+ -----BEGIN CERTIFICATE-----
3489
+ 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
3514
+ -----END CERTIFICATE-----
3515
+
3516
+ Amazon Root CA 1
3517
+ ================
3518
+ -----BEGIN CERTIFICATE-----
3519
+ MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD
3520
+ VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1
3521
+ MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
3522
+ bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
3523
+ ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH
3524
+ FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ
3525
+ gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t
3526
+ dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce
3527
+ VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
3528
+ /zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3
3529
+ DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM
3530
+ CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy
3531
+ 8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa
3532
+ 2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2
3533
+ xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5
3534
+ -----END CERTIFICATE-----
3535
+
3536
+ Amazon Root CA 2
3537
+ ================
3538
+ -----BEGIN CERTIFICATE-----
3539
+ MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD
3540
+ VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1
3541
+ MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
3542
+ bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
3543
+ ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4
3544
+ kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp
3545
+ N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9
3546
+ AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd
3547
+ fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx
3548
+ kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS
3549
+ btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0
3550
+ Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN
3551
+ c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+
3552
+ 3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw
3553
+ DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA
3554
+ A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
3555
+ +gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE
3556
+ YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW
3557
+ xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ
3558
+ gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW
3559
+ aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV
3560
+ Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3
3561
+ KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi
3562
+ JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw=
3563
+ -----END CERTIFICATE-----
3564
+
3565
+ Amazon Root CA 3
3566
+ ================
3567
+ -----BEGIN CERTIFICATE-----
3568
+ MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG
3569
+ EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy
3570
+ NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
3571
+ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB
3572
+ f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr
3573
+ Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43
3574
+ rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc
3575
+ eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw==
3576
+ -----END CERTIFICATE-----
3577
+
3578
+ Amazon Root CA 4
3579
+ ================
3580
+ -----BEGIN CERTIFICATE-----
3581
+ MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG
3582
+ EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy
3583
+ NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
3584
+ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN
3585
+ /sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri
3586
+ 83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
3587
+ HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA
3588
+ MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1
3589
+ AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA==
3590
+ -----END CERTIFICATE-----
3591
+
3592
+ LuxTrust Global Root 2
3593
+ ======================
3594
+ -----BEGIN CERTIFICATE-----
3595
+ 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
3621
+ -----END CERTIFICATE-----
3622
+
3623
+ TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1
3624
+ =============================================
3625
+ -----BEGIN CERTIFICATE-----
3626
+ MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT
3627
+ D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr
3628
+ IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g
3629
+ TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp
3630
+ ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD
3631
+ VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt
3632
+ c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth
3633
+ bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11
3634
+ IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
3635
+ MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8
3636
+ 6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc
3637
+ wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0
3638
+ 3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9
3639
+ WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU
3640
+ ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
3641
+ KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh
3642
+ AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc
3643
+ lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R
3644
+ e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j
3645
+ q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=
3646
+ -----END CERTIFICATE-----
vendor/composer/ca-bundle/src/CaBundle.php ADDED
@@ -0,0 +1,291 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of composer/ca-bundle.
5
+ *
6
+ * (c) Composer <https://github.com/composer>
7
+ *
8
+ * For the full copyright and license information, please view
9
+ * the LICENSE file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Composer\CaBundle;
13
+
14
+ use Psr\Log\LoggerInterface;
15
+ use Symfony\Component\Process\PhpProcess;
16
+
17
+ /**
18
+ * @author Chris Smith <chris@cs278.org>
19
+ * @author Jordi Boggiano <j.boggiano@seld.be>
20
+ */
21
+ class CaBundle
22
+ {
23
+ private static $caPath;
24
+ private static $caFileValidity = array();
25
+ private static $useOpensslParse;
26
+
27
+ /**
28
+ * Returns the system CA bundle path, or a path to the bundled one
29
+ *
30
+ * This method was adapted from Sslurp.
31
+ * https://github.com/EvanDotPro/Sslurp
32
+ *
33
+ * (c) Evan Coury <me@evancoury.com>
34
+ *
35
+ * For the full copyright and license information, please see below:
36
+ *
37
+ * Copyright (c) 2013, Evan Coury
38
+ * All rights reserved.
39
+ *
40
+ * Redistribution and use in source and binary forms, with or without modification,
41
+ * are permitted provided that the following conditions are met:
42
+ *
43
+ * * Redistributions of source code must retain the above copyright notice,
44
+ * this list of conditions and the following disclaimer.
45
+ *
46
+ * * Redistributions in binary form must reproduce the above copyright notice,
47
+ * this list of conditions and the following disclaimer in the documentation
48
+ * and/or other materials provided with the distribution.
49
+ *
50
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
51
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
52
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
53
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
54
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
55
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
56
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
57
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
58
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
59
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
60
+ *
61
+ * @param LoggerInterface $logger optional logger for information about which CA files were loaded
62
+ * @return string path to a CA bundle file or directory
63
+ */
64
+ public static function getSystemCaRootBundlePath(LoggerInterface $logger = null)
65
+ {
66
+ if (self::$caPath !== null) {
67
+ return self::$caPath;
68
+ }
69
+
70
+ // If SSL_CERT_FILE env variable points to a valid certificate/bundle, use that.
71
+ // This mimics how OpenSSL uses the SSL_CERT_FILE env variable.
72
+ $envCertFile = getenv('SSL_CERT_FILE');
73
+ if ($envCertFile && is_readable($envCertFile) && static::validateCaFile($envCertFile, $logger)) {
74
+ return self::$caPath = $envCertFile;
75
+ }
76
+
77
+ // If SSL_CERT_DIR env variable points to a valid certificate/bundle, use that.
78
+ // This mimics how OpenSSL uses the SSL_CERT_FILE env variable.
79
+ $envCertDir = getenv('SSL_CERT_DIR');
80
+ if ($envCertDir && is_dir($envCertDir) && is_readable($envCertDir)) {
81
+ return self::$caPath = $envCertDir;
82
+ }
83
+
84
+ $configured = ini_get('openssl.cafile');
85
+ if ($configured && strlen($configured) > 0 && is_readable($configured) && static::validateCaFile($configured, $logger)) {
86
+ return self::$caPath = $configured;
87
+ }
88
+
89
+ $configured = ini_get('openssl.capath');
90
+ if ($configured && is_dir($configured) && is_readable($configured)) {
91
+ return self::$caPath = $configured;
92
+ }
93
+
94
+ $caBundlePaths = array(
95
+ '/etc/pki/tls/certs/ca-bundle.crt', // Fedora, RHEL, CentOS (ca-certificates package)
96
+ '/etc/ssl/certs/ca-certificates.crt', // Debian, Ubuntu, Gentoo, Arch Linux (ca-certificates package)
97
+ '/etc/ssl/ca-bundle.pem', // SUSE, openSUSE (ca-certificates package)
98
+ '/usr/local/share/certs/ca-root-nss.crt', // FreeBSD (ca_root_nss_package)
99
+ '/usr/ssl/certs/ca-bundle.crt', // Cygwin
100
+ '/opt/local/share/curl/curl-ca-bundle.crt', // OS X macports, curl-ca-bundle package
101
+ '/usr/local/share/curl/curl-ca-bundle.crt', // Default cURL CA bunde path (without --with-ca-bundle option)
102
+ '/usr/share/ssl/certs/ca-bundle.crt', // Really old RedHat?
103
+ '/etc/ssl/cert.pem', // OpenBSD
104
+ '/usr/local/etc/ssl/cert.pem', // FreeBSD 10.x
105
+ '/usr/local/etc/openssl/cert.pem', // OS X homebrew, openssl package
106
+ );
107
+
108
+ foreach ($caBundlePaths as $caBundle) {
109
+ if (@is_readable($caBundle) && static::validateCaFile($caBundle, $logger)) {
110
+ return self::$caPath = $caBundle;
111
+ }
112
+ }
113
+
114
+ foreach ($caBundlePaths as $caBundle) {
115
+ $caBundle = dirname($caBundle);
116
+ if (@is_dir($caBundle) && glob($caBundle.'/*')) {
117
+ return self::$caPath = $caBundle;
118
+ }
119
+ }
120
+
121
+ return self::$caPath = static::getBundledCaBundlePath(); // Bundled CA file, last resort
122
+ }
123
+
124
+ /**
125
+ * Returns the path to the bundled CA file
126
+ *
127
+ * In case you don't want to trust the user or the system, you can use this directly
128
+ *
129
+ * @return string path to a CA bundle file
130
+ */
131
+ public static function getBundledCaBundlePath()
132
+ {
133
+ return __DIR__.'/../res/cacert.pem';
134
+ }
135
+
136
+ /**
137
+ * Validates a CA file using opensl_x509_parse only if it is safe to use
138
+ *
139
+ * @param string $filename
140
+ * @param LoggerInterface $logger optional logger for information about which CA files were loaded
141
+ *
142
+ * @return bool
143
+ */
144
+ public static function validateCaFile($filename, LoggerInterface $logger = null)
145
+ {
146
+ static $warned = false;
147
+
148
+ if (isset(self::$caFileValidity[$filename])) {
149
+ return self::$caFileValidity[$filename];
150
+ }
151
+
152
+ $contents = file_get_contents($filename);
153
+
154
+ // assume the CA is valid if php is vulnerable to
155
+ // https://www.sektioneins.de/advisories/advisory-012013-php-openssl_x509_parse-memory-corruption-vulnerability.html
156
+ if (!static::isOpensslParseSafe()) {
157
+ if (!$warned && $logger) {
158
+ $logger->warning(sprintf(
159
+ 'Your version of PHP, %s, is affected by CVE-2013-6420 and cannot safely perform certificate validation, we strongly suggest you upgrade.',
160
+ PHP_VERSION
161
+ ));
162
+ $warned = true;
163
+ }
164
+
165
+ $isValid = !empty($contents);
166
+ } else {
167
+ $isValid = (bool) openssl_x509_parse($contents);
168
+ }
169
+
170
+ if ($logger) {
171
+ $logger->debug('Checked CA file '.realpath($filename).': '.($isValid ? 'valid' : 'invalid'));
172
+ }
173
+
174
+ return self::$caFileValidity[$filename] = $isValid;
175
+ }
176
+
177
+ /**
178
+ * Test if it is safe to use the PHP function openssl_x509_parse().
179
+ *
180
+ * This checks if OpenSSL extensions is vulnerable to remote code execution
181
+ * via the exploit documented as CVE-2013-6420.
182
+ *
183
+ * @return bool
184
+ */
185
+ public static function isOpensslParseSafe()
186
+ {
187
+ if (null !== self::$useOpensslParse) {
188
+ return self::$useOpensslParse;
189
+ }
190
+
191
+ if (PHP_VERSION_ID >= 50600) {
192
+ return self::$useOpensslParse = true;
193
+ }
194
+
195
+ // Vulnerable:
196
+ // PHP 5.3.0 - PHP 5.3.27
197
+ // PHP 5.4.0 - PHP 5.4.22
198
+ // PHP 5.5.0 - PHP 5.5.6
199
+ if (
200
+ (PHP_VERSION_ID < 50400 && PHP_VERSION_ID >= 50328)
201
+ || (PHP_VERSION_ID < 50500 && PHP_VERSION_ID >= 50423)
202
+ || (PHP_VERSION_ID < 50600 && PHP_VERSION_ID >= 50507)
203
+ ) {
204
+ // This version of PHP has the fix for CVE-2013-6420 applied.
205
+ return self::$useOpensslParse = true;
206
+ }
207
+
208
+ if (defined('PHP_WINDOWS_VERSION_BUILD')) {
209
+ // Windows is probably insecure in this case.
210
+ return self::$useOpensslParse = false;
211
+ }
212
+
213
+ $compareDistroVersionPrefix = function ($prefix, $fixedVersion) {
214
+ $regex = '{^'.preg_quote($prefix).'([0-9]+)$}';
215
+
216
+ if (preg_match($regex, PHP_VERSION, $m)) {
217
+ return ((int) $m[1]) >= $fixedVersion;
218
+ }
219
+
220
+ return false;
221
+ };
222
+
223
+ // Hard coded list of PHP distributions with the fix backported.
224
+ if (
225
+ $compareDistroVersionPrefix('5.3.3-7+squeeze', 18) // Debian 6 (Squeeze)
226
+ || $compareDistroVersionPrefix('5.4.4-14+deb7u', 7) // Debian 7 (Wheezy)
227
+ || $compareDistroVersionPrefix('5.3.10-1ubuntu3.', 9) // Ubuntu 12.04 (Precise)
228
+ ) {
229
+ return self::$useOpensslParse = true;
230
+ }
231
+
232
+ // Symfony Process component is missing so we assume it is unsafe at this point
233
+ if (!class_exists('Symfony\Component\Process\PhpProcess')) {
234
+ return self::$useOpensslParse = false;
235
+ }
236
+
237
+ // This is where things get crazy, because distros backport security
238
+ // fixes the chances are on NIX systems the fix has been applied but
239
+ // it's not possible to verify that from the PHP version.
240
+ //
241
+ // To verify exec a new PHP process and run the issue testcase with
242
+ // known safe input that replicates the bug.
243
+
244
+ // Based on testcase in https://github.com/php/php-src/commit/c1224573c773b6845e83505f717fbf820fc18415
245
+ // changes in https://github.com/php/php-src/commit/76a7fd893b7d6101300cc656058704a73254d593
246
+ $cert = 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVwRENDQTR5Z0F3SUJBZ0lKQUp6dThyNnU2ZUJjTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUhETVFzd0NRWUQKVlFRR0V3SkVSVEVjTUJvR0ExVUVDQXdUVG05eVpISm9aV2x1TFZkbGMzUm1ZV3hsYmpFUU1BNEdBMVVFQnd3SApTOE9Ed3Jac2JqRVVNQklHQTFVRUNnd0xVMlZyZEdsdmJrVnBibk14SHpBZEJnTlZCQXNNRmsxaGJHbGphVzkxCmN5QkRaWEowSUZObFkzUnBiMjR4SVRBZkJnTlZCQU1NR0cxaGJHbGphVzkxY3k1elpXdDBhVzl1WldsdWN5NWsKWlRFcU1DZ0dDU3FHU0liM0RRRUpBUlliYzNSbFptRnVMbVZ6YzJWeVFITmxhM1JwYjI1bGFXNXpMbVJsTUhVWQpaREU1TnpBd01UQXhNREF3TURBd1dnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKQUFBQUFBQVhEVEUwTVRFeU9ERXhNemt6TlZvd2djTXhDekFKQmdOVkJBWVRBa1JGTVJ3d0dnWURWUVFJREJOTwpiM0prY21obGFXNHRWMlZ6ZEdaaGJHVnVNUkF3RGdZRFZRUUhEQWRMdzRQQ3RteHVNUlF3RWdZRFZRUUtEQXRUClpXdDBhVzl1UldsdWN6RWZNQjBHQTFVRUN3d1dUV0ZzYVdOcGIzVnpJRU5sY25RZ1UyVmpkR2x2YmpFaE1COEcKQTFVRUF3d1liV0ZzYVdOcGIzVnpMbk5sYTNScGIyNWxhVzV6TG1SbE1Tb3dLQVlKS29aSWh2Y05BUWtCRmh0egpkR1ZtWVc0dVpYTnpaWEpBYzJWcmRHbHZibVZwYm5NdVpHVXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCCkR3QXdnZ0VLQW9JQkFRRERBZjNobDdKWTBYY0ZuaXlFSnBTU0RxbjBPcUJyNlFQNjV1c0pQUnQvOFBhRG9xQnUKd0VZVC9OYSs2ZnNnUGpDMHVLOURaZ1dnMnRIV1dvYW5TYmxBTW96NVBINlorUzRTSFJaN2UyZERJalBqZGhqaAowbUxnMlVNTzV5cDBWNzk3R2dzOWxOdDZKUmZIODFNTjJvYlhXczROdHp0TE11RDZlZ3FwcjhkRGJyMzRhT3M4CnBrZHVpNVVhd1Raa3N5NXBMUEhxNWNNaEZHbTA2djY1Q0xvMFYyUGQ5K0tBb2tQclBjTjVLTEtlYno3bUxwazYKU01lRVhPS1A0aWRFcXh5UTdPN2ZCdUhNZWRzUWh1K3ByWTNzaTNCVXlLZlF0UDVDWm5YMmJwMHdLSHhYMTJEWAoxbmZGSXQ5RGJHdkhUY3lPdU4rblpMUEJtM3ZXeG50eUlJdlZBZ01CQUFHalFqQkFNQWtHQTFVZEV3UUNNQUF3CkVRWUpZSVpJQVliNFFnRUJCQVFEQWdlQU1Bc0dBMVVkRHdRRUF3SUZvREFUQmdOVkhTVUVEREFLQmdnckJnRUYKQlFjREFqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFHMGZaWVlDVGJkajFYWWMrMVNub2FQUit2SThDOENhRAo4KzBVWWhkbnlVNGdnYTBCQWNEclk5ZTk0ZUVBdTZacXljRjZGakxxWFhkQWJvcHBXb2NyNlQ2R0QxeDMzQ2tsClZBcnpHL0t4UW9oR0QySmVxa2hJTWxEb214SE83a2EzOStPYThpMnZXTFZ5alU4QVp2V01BcnVIYTRFRU55RzcKbFcyQWFnYUZLRkNyOVRuWFRmcmR4R1ZFYnY3S1ZRNmJkaGc1cDVTanBXSDErTXEwM3VSM1pYUEJZZHlWODMxOQpvMGxWajFLRkkyRENML2xpV2lzSlJvb2YrMWNSMzVDdGQwd1lCY3BCNlRac2xNY09QbDc2ZHdLd0pnZUpvMlFnClpzZm1jMnZDMS9xT2xOdU5xLzBUenprVkd2OEVUVDNDZ2FVK1VYZTRYT1Z2a2NjZWJKbjJkZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K';
247
+ $script = <<<'EOT'
248
+
249
+ error_reporting(-1);
250
+ $info = openssl_x509_parse(base64_decode('%s'));
251
+ var_dump(PHP_VERSION, $info['issuer']['emailAddress'], $info['validFrom_time_t']);
252
+
253
+ EOT;
254
+ $script = '<'."?php\n".sprintf($script, $cert);
255
+
256
+ try {
257
+ $process = new PhpProcess($script);
258
+ $process->mustRun();
259
+ } catch (\Exception $e) {
260
+ // In the case of any exceptions just accept it is not possible to
261
+ // determine the safety of openssl_x509_parse and bail out.
262
+ return self::$useOpensslParse = false;
263
+ }
264
+
265
+ $output = preg_split('{\r?\n}', trim($process->getOutput()));
266
+ $errorOutput = trim($process->getErrorOutput());
267
+
268
+ if (
269
+ count($output) === 3
270
+ && $output[0] === sprintf('string(%d) "%s"', strlen(PHP_VERSION), PHP_VERSION)
271
+ && $output[1] === 'string(27) "stefan.esser@sektioneins.de"'
272
+ && $output[2] === 'int(-1)'
273
+ && preg_match('{openssl_x509_parse\(\): illegal (?:ASN1 data type for|length in) timestamp in - on line \d+}', $errorOutput)
274
+ ) {
275
+ // This PHP has the fix backported probably by a distro security team.
276
+ return self::$useOpensslParse = true;
277
+ }
278
+
279
+ return self::$useOpensslParse = false;
280
+ }
281
+
282
+ /**
283
+ * Resets the static caches
284
+ */
285
+ public static function reset()
286
+ {
287
+ self::$caFileValidity = array();
288
+ self::$caPath = null;
289
+ self::$useOpensslParse = null;
290
+ }
291
+ }
vendor/composer/installed.json ADDED
@@ -0,0 +1,224 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "name": "composer/ca-bundle",
4
+ "version": "1.0.9",
5
+ "version_normalized": "1.0.9.0",
6
+ "source": {
7
+ "type": "git",
8
+ "url": "https://github.com/composer/ca-bundle.git",
9
+ "reference": "36344aeffdc37711335563e6108cda86566432a6"
10
+ },
11
+ "dist": {
12
+ "type": "zip",
13
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/36344aeffdc37711335563e6108cda86566432a6",
14
+ "reference": "36344aeffdc37711335563e6108cda86566432a6",
15
+ "shasum": ""
16
+ },
17
+ "require": {
18
+ "ext-openssl": "*",
19
+ "ext-pcre": "*",
20
+ "php": "^5.3.2 || ^7.0"
21
+ },
22
+ "require-dev": {
23
+ "phpunit/phpunit": "^4.5",
24
+ "psr/log": "^1.0",
25
+ "symfony/process": "^2.5 || ^3.0"
26
+ },
27
+ "suggest": {
28
+ "symfony/process": "This is necessary to reliably check whether openssl_x509_parse is vulnerable on older php versions, but can be ignored on PHP 5.5.6+"
29
+ },
30
+ "time": "2017-11-13T15:51:25+00:00",
31
+ "type": "library",
32
+ "extra": {
33
+ "branch-alias": {
34
+ "dev-master": "1.x-dev"
35
+ }
36
+ },
37
+ "installation-source": "dist",
38
+ "autoload": {
39
+ "psr-4": {
40
+ "Composer\\CaBundle\\": "src"
41
+ }
42
+ },
43
+ "notification-url": "https://packagist.org/downloads/",
44
+ "license": [
45
+ "MIT"
46
+ ],
47
+ "authors": [
48
+ {
49
+ "name": "Jordi Boggiano",
50
+ "email": "j.boggiano@seld.be",
51
+ "homepage": "http://seld.be"
52
+ }
53
+ ],
54
+ "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
55
+ "keywords": [
56
+ "cabundle",
57
+ "cacert",
58
+ "certificate",
59
+ "ssl",
60
+ "tls"
61
+ ]
62
+ },
63
+ {
64
+ "name": "maxmind/web-service-common",
65
+ "version": "v0.4.0",
66
+ "version_normalized": "0.4.0.0",
67
+ "source": {
68
+ "type": "git",
69
+ "url": "https://github.com/maxmind/web-service-common-php.git",
70
+ "reference": "622f7c732a7f9c4c62497fc103939e042b6bdb88"
71
+ },
72
+ "dist": {
73
+ "type": "zip",
74
+ "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/622f7c732a7f9c4c62497fc103939e042b6bdb88",
75
+ "reference": "622f7c732a7f9c4c62497fc103939e042b6bdb88",
76
+ "shasum": ""
77
+ },
78
+ "require": {
79
+ "composer/ca-bundle": "^1.0.3",
80
+ "ext-curl": "*",
81
+ "ext-json": "*",
82
+ "php": ">=5.4"
83
+ },
84
+ "require-dev": {
85
+ "friendsofphp/php-cs-fixer": "2.*",
86
+ "phpunit/phpunit": "4.*",
87
+ "squizlabs/php_codesniffer": "3.*"
88
+ },
89
+ "time": "2017-07-06T17:48:21+00:00",
90
+ "type": "library",
91
+ "installation-source": "dist",
92
+ "autoload": {
93
+ "psr-4": {
94
+ "MaxMind\\Exception\\": "src/Exception",
95
+ "MaxMind\\WebService\\": "src/WebService"
96
+ }
97
+ },
98
+ "notification-url": "https://packagist.org/downloads/",
99
+ "license": [
100
+ "Apache-2.0"
101
+ ],
102
+ "authors": [
103
+ {
104
+ "name": "Gregory Oschwald",
105
+ "email": "goschwald@maxmind.com"
106
+ }
107
+ ],
108
+ "description": "Internal MaxMind Web Service API",
109
+ "homepage": "https://github.com/maxmind/web-service-common-php"
110
+ },
111
+ {
112
+ "name": "maxmind-db/reader",
113
+ "version": "v1.2.0",
114
+ "version_normalized": "1.2.0.0",
115
+ "source": {
116
+ "type": "git",
117
+ "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
118
+ "reference": "1647820dfbcb552222fb5feb3a8387e2636394c9"
119
+ },
120
+ "dist": {
121
+ "type": "zip",
122
+ "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/1647820dfbcb552222fb5feb3a8387e2636394c9",
123
+ "reference": "1647820dfbcb552222fb5feb3a8387e2636394c9",
124
+ "shasum": ""
125
+ },
126
+ "require": {
127
+ "php": ">=5.4"
128
+ },
129
+ "require-dev": {
130
+ "friendsofphp/php-cs-fixer": "2.*",
131
+ "phpunit/phpunit": "4.*",
132
+ "satooshi/php-coveralls": "1.0.*",
133
+ "squizlabs/php_codesniffer": "3.*"
134
+ },
135
+ "suggest": {
136
+ "ext-bcmath": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
137
+ "ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
138
+ "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups"
139
+ },
140
+ "time": "2017-10-27T19:15:33+00:00",
141
+ "type": "library",
142
+ "installation-source": "dist",
143
+ "autoload": {
144
+ "psr-4": {
145
+ "MaxMind\\Db\\": "src/MaxMind/Db"
146
+ }
147
+ },
148
+ "notification-url": "https://packagist.org/downloads/",
149
+ "license": [
150
+ "Apache-2.0"
151
+ ],
152
+ "authors": [
153
+ {
154
+ "name": "Gregory J. Oschwald",
155
+ "email": "goschwald@maxmind.com",
156
+ "homepage": "http://www.maxmind.com/"
157
+ }
158
+ ],
159
+ "description": "MaxMind DB Reader API",
160
+ "homepage": "https://github.com/maxmind/MaxMind-DB-Reader-php",
161
+ "keywords": [
162
+ "database",
163
+ "geoip",
164
+ "geoip2",
165
+ "geolocation",
166
+ "maxmind"
167
+ ]
168
+ },
169
+ {
170
+ "name": "geoip2/geoip2",
171
+ "version": "v2.7.0",
172
+ "version_normalized": "2.7.0.0",
173
+ "source": {
174
+ "type": "git",
175
+ "url": "https://github.com/maxmind/GeoIP2-php.git",
176
+ "reference": "ca9f9a244474d97eac1ef542aaced7cc944bafbe"
177
+ },
178
+ "dist": {
179
+ "type": "zip",
180
+ "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/ca9f9a244474d97eac1ef542aaced7cc944bafbe",
181
+ "reference": "ca9f9a244474d97eac1ef542aaced7cc944bafbe",
182
+ "shasum": ""
183
+ },
184
+ "require": {
185
+ "maxmind-db/reader": "~1.0",
186
+ "maxmind/web-service-common": "~0.4",
187
+ "php": ">=5.4"
188
+ },
189
+ "require-dev": {
190
+ "apigen/apigen": "*",
191
+ "friendsofphp/php-cs-fixer": "2.*",
192
+ "phpunit/phpunit": "4.*",
193
+ "squizlabs/php_codesniffer": "3.*"
194
+ },
195
+ "time": "2017-10-27T19:20:22+00:00",
196
+ "type": "library",
197
+ "installation-source": "dist",
198
+ "autoload": {
199
+ "psr-4": {
200
+ "GeoIp2\\": "src"
201
+ }
202
+ },
203
+ "notification-url": "https://packagist.org/downloads/",
204
+ "license": [
205
+ "Apache-2.0"
206
+ ],
207
+ "authors": [
208
+ {
209
+ "name": "Gregory J. Oschwald",
210
+ "email": "goschwald@maxmind.com",
211
+ "homepage": "http://www.maxmind.com/"
212
+ }
213
+ ],
214
+ "description": "MaxMind GeoIP2 PHP API",
215
+ "homepage": "https://github.com/maxmind/GeoIP2-php",
216
+ "keywords": [
217
+ "IP",
218
+ "geoip",
219
+ "geoip2",
220
+ "geolocation",
221
+ "maxmind"
222
+ ]
223
+ }
224
+ ]
vendor/geoip2/geoip2/.gitmodules ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ [submodule "maxmind-db"]
2
+ path = maxmind-db
3
+ url = git://github.com/maxmind/MaxMind-DB.git
vendor/geoip2/geoip2/.php_cs ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ return PhpCsFixer\Config::create()
4
+ ->setRiskyAllowed(true)
5
+ ->setRules([
6
+ '@Symfony' => true,
7
+ '@Symfony:risky' => true,
8
+ 'array_syntax' => ['syntax' => 'short'],
9
+ 'combine_consecutive_unsets' => true,
10
+ 'concat_space' => [ 'spacing' => 'one'],
11
+ 'heredoc_to_nowdoc' => true,
12
+ 'list_syntax' => ['syntax' => 'long'],
13
+ 'no_extra_consecutive_blank_lines' => ['break', 'continue', 'extra', 'return', 'throw', 'use', 'parenthesis_brace_block', 'square_brace_block', 'curly_brace_block'],
14
+ 'no_short_echo_tag' => true,
15
+ 'no_unreachable_default_argument_value' => true,
16
+ 'no_useless_else' => true,
17
+ 'no_useless_return' => true,
18
+ 'ordered_imports' => true,
19
+ 'pre_increment' => false,
20
+ 'php_unit_strict' => true,
21
+ 'php_unit_test_class_requires_covers' => true,
22
+ 'phpdoc_add_missing_param_annotation' => true,
23
+ 'phpdoc_no_alias_tag' => false,
24
+ 'phpdoc_order' => true,
25
+ 'semicolon_after_instruction' => true,
26
+ 'strict_comparison' => true,
27
+ 'strict_param' => true,
28
+ 'yoda_style' => false,
29
+ ])
30
+ ->setFinder(
31
+ PhpCsFixer\Finder::create()
32
+ ->in(__DIR__)
33
+ )
34
+ ;
vendor/geoip2/geoip2/CHANGELOG.md ADDED
@@ -0,0 +1,250 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ CHANGELOG
2
+ =========
3
+
4
+ 2.7.0 (2017-10-27)
5
+ ------------------
6
+
7
+ * The following new anonymizer properties were added to `GeoIp2\Record\Traits`
8
+ for use with GeoIP2 Precision Insights: `isAnonymous`, `isAnonymousVpn`,
9
+ `isHostingProvider`, `isPublicProxy`, and `isTorExitNode`.
10
+
11
+ 2.6.0 (2017-07-10)
12
+ -----------------
13
+
14
+ * Code clean-up and tidying.
15
+ * Set minimum required PHP version to 5.4 in `composer.json`. Previously,
16
+ 5.3 would work but was not tested. Now 5.4 is hard minimum version.
17
+
18
+ 2.5.0 (2017-05-08)
19
+ ------------------
20
+
21
+ * Support for PHP 5.3 was dropped.
22
+ * Added support for GeoLite2 ASN database.
23
+
24
+ 2.4.5 (2017-01-31)
25
+ ------------------
26
+
27
+ * Additional error checking on the data returned from `MaxMind\Db\Reader`
28
+ was added to help detect corrupt databases. GitHub #83.
29
+
30
+ 2.4.4 (2016-10-11)
31
+ ------------------
32
+
33
+ * `isset()` on `mostSpecificSubdivision` attribute now returns the
34
+ correct value. Reported by Juan Francisco Giordana. GitHub #81.
35
+
36
+ 2.4.3 (2016-10-11)
37
+ ------------------
38
+
39
+ * `isset()` on `name` attribute now returns the correct value. Reported by
40
+ Juan Francisco Giordana. GitHub #79.
41
+
42
+ 2.4.2 (2016-08-17)
43
+ ------------------
44
+
45
+ * Updated documentation to clarify what the accuracy radius refers to.
46
+ * Upgraded `maxmind/web-service-common` to 0.3.0. This version uses
47
+ `composer/ca-bundle` rather than our own CA bundle. GitHub #75.
48
+ * Improved PHP documentation generation.
49
+
50
+ 2.4.1 (2016-06-10)
51
+ ------------------
52
+
53
+ * Corrected type annotations in documentation. GitHub #66.
54
+ * Updated documentation to reflect that the accuracy radius is now included
55
+ in City.
56
+ * Upgraded web service client, which supports setting a proxy. GitHub #59.
57
+
58
+ 2.4.0 (2016-04-15)
59
+ ------------------
60
+
61
+ * Added support for the GeoIP2 Enterprise database.
62
+
63
+ 2.3.3 (2015-09-24)
64
+ ------------------
65
+
66
+ * Corrected case on `JsonSerializable` interface. Reported by Axel Etcheverry.
67
+ GitHub #56.
68
+
69
+ 2.3.2 (2015-09-23)
70
+ ------------------
71
+
72
+ * `JsonSerializable` compatibility interface was moved to `GeoIp2\Compat`
73
+ rather than the global namespace to prevent autoloading issues. Reported by
74
+ Tomas Buteler. GitHub #54.
75
+ * Missing documentation for the `$postal` property was added to the
76
+ `GeoIp2\Model\City` class. Fix by Roy Sindre Norangshol. GitHub #51.
77
+ * In the Phar distribution, source files for this module no longer have their
78
+ documentation stripped, allowing IDE introspection to work properly.
79
+ Reported by Dominic Black. GitHub #52.
80
+
81
+ 2.3.1 (2015-06-30)
82
+ ------------------
83
+
84
+ * Updated `maxmind/web-service-common` to version with fixes for PHP 5.3 and
85
+ 5.4.
86
+
87
+ 2.3.0 (2015-06-29)
88
+ ------------------
89
+
90
+ * Support for demographics fields `averageIncome` and `populationDensity` in
91
+ the `Location` record, returned by the Insights endpoint.
92
+ * The `isAnonymousProxy` and `isSatelliteProvider` properties on
93
+ `GeoIP2\Record\Traits` have been deprecated. Please use our [GeoIP2
94
+ Anonymous IP database](https://www.maxmind.com/en/geoip2-anonymous-ip-database)
95
+ to determine whether an IP address is used by an anonymizing service.
96
+
97
+ 2.2.0-beta1 (2015-06-09)
98
+ ------------------------
99
+
100
+ * Typo fix in documentation.
101
+
102
+ 2.2.0-alpha2 (2015-06-01)
103
+ -------------------------
104
+
105
+ * `maxmind-ws/web-service-common` was renamed to `maxmind/web-service-common`.
106
+
107
+ 2.2.0-alpha1 (2015-05-22)
108
+ -------------------------
109
+
110
+ * The library no longer uses Guzzle and instead uses curl directly.
111
+ * Support for `timeout` and `connectTimout` were added to the `$options` array
112
+ passed to the `GeoIp2\WebService\Client` constructor. Pull request by Will
113
+ Bradley. GitHub #36.
114
+
115
+ 2.1.1 (2014-12-03)
116
+ ------------------
117
+
118
+ * The 2.1.0 Phar builds included a shebang line, causing issues when loading
119
+ it as a library. This has been corrected. GitHub #33.
120
+
121
+ 2.1.0 (2014-10-29)
122
+ ------------------
123
+
124
+ * Update ApiGen dependency to version that isn't broken on case sensitive
125
+ file systems.
126
+ * Added support for the GeoIP2 Anonymous IP database. The
127
+ `GeoIP2\Database\Reader` class now has an `anonymousIp` method which returns
128
+ a `GeoIP2\Model\AnonymousIp` object.
129
+ * Boolean attributes like those in the `GeoIP2\Record\Traits` class now return
130
+ `false` instead of `null` when they were not true.
131
+
132
+ 2.0.0 (2014-09-22)
133
+ ------------------
134
+
135
+ * First production release.
136
+
137
+ 0.9.0 (2014-09-15)
138
+ ------------------
139
+
140
+ * IMPORTANT: The deprecated `omni()` and `cityIspOrg()` methods have been
141
+ removed from `GeoIp2\WebService\Client`.
142
+
143
+ 0.8.1 (2014-09-12)
144
+ ------------------
145
+
146
+ * The check added to the `GeoIP2\Database\Reader` lookup methods in 0.8.0 did
147
+ not work with the GeoIP2 City Database Subset by Continent with World
148
+ Countries. This has been fixed. Fixes GitHub issue #23.
149
+
150
+ 0.8.0 (2014-09-10)
151
+ ------------------
152
+
153
+ * The `GeoIp2\Database\Reader` lookup methods (e.g., `city()`, `isp()`) now
154
+ throw a `BadMethodCallException` if they are used with a database that
155
+ does not match the method. In particular, doing a `city()` lookup on a
156
+ GeoIP2 Country database will result in an exception, and vice versa.
157
+ * A `metadata()` method has been added to the `GeoIP2\Database\Reader` class.
158
+ This returns a `MaxMind\Db\Reader\Metadata` class with information about the
159
+ database.
160
+ * The name attribute was missing from the RepresentedCountry class.
161
+
162
+ 0.7.0 (2014-07-22)
163
+ ------------------
164
+
165
+ * The web service client API has been updated for the v2.1 release of the web
166
+ service. In particular, the `cityIspOrg` and `omni` methods on
167
+ `GeoIp2\WebService\Client` should be considered deprecated. The `city`
168
+ method now provides all of the data formerly provided by `cityIspOrg`, and
169
+ the `omni` method has been replaced by the `insights` method.
170
+ * Support was added for GeoIP2 Connection Type, Domain and ISP databases.
171
+
172
+
173
+ 0.6.3 (2014-05-12)
174
+ ------------------
175
+
176
+ * With the previous Phar builds, some users received `phar error: invalid url
177
+ or non-existent phar` errors. The correct alias is now used for the Phar,
178
+ and this should no longer be an issue.
179
+
180
+ 0.6.2 (2014-05-08)
181
+ ------------------
182
+
183
+ * The Phar build was broken with Guzzle 3.9.0+. This has been fixed.
184
+
185
+ 0.6.1 (2014-05-01)
186
+ ------------------
187
+
188
+ * This API now officially supports HHVM.
189
+ * The `maxmind-db/reader` dependency was updated to a version that does not
190
+ require BC Math.
191
+ * The Composer compatibility autoload rules are now targeted more narrowly.
192
+ * A `box.json` file is included to build a Phar package.
193
+
194
+ 0.6.0 (2014-02-19)
195
+ ------------------
196
+
197
+ * This API is now licensed under the Apache License, Version 2.0.
198
+ * Model and record classes now implement `JsonSerializable`.
199
+ * `isset` now works with model and record classes.
200
+
201
+ 0.5.0 (2013-10-21)
202
+ ------------------
203
+
204
+ * Renamed $languages constructor parameters to $locales for both the Client
205
+ and Reader classes.
206
+ * Documentation and code clean-up (Ben Morel).
207
+ * Added the interface `GeoIp2\ProviderInterface`, which is implemented by both
208
+ `\GeoIp2\Database\Reader` and `\GeoIp2\WebService\Client`.
209
+
210
+ 0.4.0 (2013-07-16)
211
+ ------------------
212
+
213
+ * This is the first release with the GeoIP2 database reader. Please see the
214
+ `README.md` file and the `\GeoIp2\Database\Reader` class.
215
+ * The general exception classes were replaced with specific exception classes
216
+ representing particular types of errors, such as an authentication error.
217
+
218
+ 0.3.0 (2013-07-12)
219
+ ------------------
220
+
221
+ * In namespaces and class names, "GeoIP2" was renamed to "GeoIp2" to improve
222
+ consistency.
223
+
224
+ 0.2.1 (2013-06-10)
225
+ ------------------
226
+
227
+ * First official beta release.
228
+ * Documentation updates and corrections.
229
+
230
+ 0.2.0 (2013-05-29)
231
+ ------------------
232
+
233
+ * `GenericException` was renamed to `GeoIP2Exception`.
234
+ * We now support more languages. The new languages are de, es, fr, and pt-BR.
235
+ * The REST API now returns a record with data about your account. There is
236
+ a new `GeoIP\Records\MaxMind` class for this data.
237
+ * The `continentCode` attribute on `Continent` was renamed to `code`.
238
+ * Documentation updates.
239
+
240
+ 0.1.1 (2013-05-14)
241
+ ------------------
242
+
243
+ * Updated Guzzle version requirement.
244
+ * Fixed Composer example in README.md.
245
+
246
+
247
+ 0.1.0 (2013-05-13)
248
+ ------------------
249
+
250
+ * Initial release.
vendor/geoip2/geoip2/LICENSE ADDED
@@ -0,0 +1,202 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ Apache License
3
+ Version 2.0, January 2004
4
+ http://www.apache.org/licenses/
5
+
6
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7
+
8
+ 1. Definitions.
9
+
10
+ "License" shall mean the terms and conditions for use, reproduction,
11
+ and distribution as defined by Sections 1 through 9 of this document.
12
+
13
+ "Licensor" shall mean the copyright owner or entity authorized by
14
+ the copyright owner that is granting the License.
15
+
16
+ "Legal Entity" shall mean the union of the acting entity and all
17
+ other entities that control, are controlled by, or are under common
18
+ control with that entity. For the purposes of this definition,
19
+ "control" means (i) the power, direct or indirect, to cause the
20
+ direction or management of such entity, whether by contract or
21
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
22
+ outstanding shares, or (iii) beneficial ownership of such entity.
23
+
24
+ "You" (or "Your") shall mean an individual or Legal Entity
25
+ exercising permissions granted by this License.
26
+
27
+ "Source" form shall mean the preferred form for making modifications,
28
+ including but not limited to software source code, documentation
29
+ source, and configuration files.
30
+
31
+ "Object" form shall mean any form resulting from mechanical
32
+ transformation or translation of a Source form, including but
33
+ not limited to compiled object code, generated documentation,
34
+ and conversions to other media types.
35
+
36
+ "Work" shall mean the work of authorship, whether in Source or
37
+ Object form, made available under the License, as indicated by a
38
+ copyright notice that is included in or attached to the work
39
+ (an example is provided in the Appendix below).
40
+
41
+ "Derivative Works" shall mean any work, whether in Source or Object
42
+ form, that is based on (or derived from) the Work and for which the
43
+ editorial revisions, annotations, elaborations, or other modifications
44
+ represent, as a whole, an original work of authorship. For the purposes
45
+ of this License, Derivative Works shall not include works that remain
46
+ separable from, or merely link (or bind by name) to the interfaces of,
47
+ the Work and Derivative Works thereof.
48
+
49
+ "Contribution" shall mean any work of authorship, including
50
+ the original version of the Work and any modifications or additions
51
+ to that Work or Derivative Works thereof, that is intentionally
52
+ submitted to Licensor for inclusion in the Work by the copyright owner
53
+ or by an individual or Legal Entity authorized to submit on behalf of
54
+ the copyright owner. For the purposes of this definition, "submitted"
55
+ means any form of electronic, verbal, or written communication sent
56
+ to the Licensor or its representatives, including but not limited to
57
+ communication on electronic mailing lists, source code control systems,
58
+ and issue tracking systems that are managed by, or on behalf of, the
59
+ Licensor for the purpose of discussing and improving the Work, but
60
+ excluding communication that is conspicuously marked or otherwise
61
+ designated in writing by the copyright owner as "Not a Contribution."
62
+
63
+ "Contributor" shall mean Licensor and any individual or Legal Entity
64
+ on behalf of whom a Contribution has been received by Licensor and
65
+ subsequently incorporated within the Work.
66
+
67
+ 2. Grant of Copyright License. Subject to the terms and conditions of
68
+ this License, each Contributor hereby grants to You a perpetual,
69
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70
+ copyright license to reproduce, prepare Derivative Works of,
71
+ publicly display, publicly perform, sublicense, and distribute the
72
+ Work and such Derivative Works in Source or Object form.
73
+
74
+ 3. Grant of Patent License. Subject to the terms and conditions of
75
+ this License, each Contributor hereby grants to You a perpetual,
76
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77
+ (except as stated in this section) patent license to make, have made,
78
+ use, offer to sell, sell, import, and otherwise transfer the Work,
79
+ where such license applies only to those patent claims licensable
80
+ by such Contributor that are necessarily infringed by their
81
+ Contribution(s) alone or by combination of their Contribution(s)
82
+ with the Work to which such Contribution(s) was submitted. If You
83
+ institute patent litigation against any entity (including a
84
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
85
+ or a Contribution incorporated within the Work constitutes direct
86
+ or contributory patent infringement, then any patent licenses
87
+ granted to You under this License for that Work shall terminate
88
+ as of the date such litigation is filed.
89
+
90
+ 4. Redistribution. You may reproduce and distribute copies of the
91
+ Work or Derivative Works thereof in any medium, with or without
92
+ modifications, and in Source or Object form, provided that You
93
+ meet the following conditions:
94
+
95
+ (a) You must give any other recipients of the Work or
96
+ Derivative Works a copy of this License; and
97
+
98
+ (b) You must cause any modified files to carry prominent notices
99
+ stating that You changed the files; and
100
+
101
+ (c) You must retain, in the Source form of any Derivative Works
102
+ that You distribute, all copyright, patent, trademark, and
103
+ attribution notices from the Source form of the Work,
104
+ excluding those notices that do not pertain to any part of
105
+ the Derivative Works; and
106
+
107
+ (d) If the Work includes a "NOTICE" text file as part of its
108
+ distribution, then any Derivative Works that You distribute must
109
+ include a readable copy of the attribution notices contained
110
+ within such NOTICE file, excluding those notices that do not
111
+ pertain to any part of the Derivative Works, in at least one
112
+ of the following places: within a NOTICE text file distributed
113
+ as part of the Derivative Works; within the Source form or
114
+ documentation, if provided along with the Derivative Works; or,
115
+ within a display generated by the Derivative Works, if and
116
+ wherever such third-party notices normally appear. The contents
117
+ of the NOTICE file are for informational purposes only and
118
+ do not modify the License. You may add Your own attribution
119
+ notices within Derivative Works that You distribute, alongside
120
+ or as an addendum to the NOTICE text from the Work, provided
121
+ that such additional attribution notices cannot be construed
122
+ as modifying the License.
123
+
124
+ You may add Your own copyright statement to Your modifications and
125
+ may provide additional or different license terms and conditions
126
+ for use, reproduction, or distribution of Your modifications, or
127
+ for any such Derivative Works as a whole, provided Your use,
128
+ reproduction, and distribution of the Work otherwise complies with
129
+ the conditions stated in this License.
130
+
131
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
132
+ any Contribution intentionally submitted for inclusion in the Work
133
+ by You to the Licensor shall be under the terms and conditions of
134
+ this License, without any additional terms or conditions.
135
+ Notwithstanding the above, nothing herein shall supersede or modify
136
+ the terms of any separate license agreement you may have executed
137
+ with Licensor regarding such Contributions.
138
+
139
+ 6. Trademarks. This License does not grant permission to use the trade
140
+ names, trademarks, service marks, or product names of the Licensor,
141
+ except as required for reasonable and customary use in describing the
142
+ origin of the Work and reproducing the content of the NOTICE file.
143
+
144
+ 7. Disclaimer of Warranty. Unless required by applicable law or
145
+ agreed to in writing, Licensor provides the Work (and each
146
+ Contributor provides its Contributions) on an "AS IS" BASIS,
147
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148
+ implied, including, without limitation, any warranties or conditions
149
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150
+ PARTICULAR PURPOSE. You are solely responsible for determining the
151
+ appropriateness of using or redistributing the Work and assume any
152
+ risks associated with Your exercise of permissions under this License.
153
+
154
+ 8. Limitation of Liability. In no event and under no legal theory,
155
+ whether in tort (including negligence), contract, or otherwise,
156
+ unless required by applicable law (such as deliberate and grossly
157
+ negligent acts) or agreed to in writing, shall any Contributor be
158
+ liable to You for damages, including any direct, indirect, special,
159
+ incidental, or consequential damages of any character arising as a
160
+ result of this License or out of the use or inability to use the
161
+ Work (including but not limited to damages for loss of goodwill,
162
+ work stoppage, computer failure or malfunction, or any and all
163
+ other commercial damages or losses), even if such Contributor
164
+ has been advised of the possibility of such damages.
165
+
166
+ 9. Accepting Warranty or Additional Liability. While redistributing
167
+ the Work or Derivative Works thereof, You may choose to offer,
168
+ and charge a fee for, acceptance of support, warranty, indemnity,
169
+ or other liability obligations and/or rights consistent with this
170
+ License. However, in accepting such obligations, You may act only
171
+ on Your own behalf and on Your sole responsibility, not on behalf
172
+ of any other Contributor, and only if You agree to indemnify,
173
+ defend, and hold each Contributor harmless for any liability
174
+ incurred by, or claims asserted against, such Contributor by reason
175
+ of your accepting any such warranty or additional liability.
176
+
177
+ END OF TERMS AND CONDITIONS
178
+
179
+ APPENDIX: How to apply the Apache License to your work.
180
+
181
+ To apply the Apache License to your work, attach the following
182
+ boilerplate notice, with the fields enclosed by brackets "[]"
183
+ replaced with your own identifying information. (Don't include
184
+ the brackets!) The text should be enclosed in the appropriate
185
+ comment syntax for the file format. We also recommend that a
186
+ file or class name and description of purpose be included on the
187
+ same "printed page" as the copyright notice for easier
188
+ identification within third-party archives.
189
+
190
+ Copyright [yyyy] [name of copyright owner]
191
+
192
+ Licensed under the Apache License, Version 2.0 (the "License");
193
+ you may not use this file except in compliance with the License.
194
+ You may obtain a copy of the License at
195
+
196
+ http://www.apache.org/licenses/LICENSE-2.0
197
+
198
+ Unless required by applicable law or agreed to in writing, software
199
+ distributed under the License is distributed on an "AS IS" BASIS,
200
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201
+ See the License for the specific language governing permissions and
202
+ limitations under the License.
vendor/geoip2/geoip2/README.md ADDED
@@ -0,0 +1,401 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # GeoIP2 PHP API #
2
+
3
+ ## Description ##
4
+
5
+ This package provides an API for the GeoIP2
6
+ [web services](http://dev.maxmind.com/geoip/geoip2/web-services) and
7
+ [databases](http://dev.maxmind.com/geoip/geoip2/downloadable). The API also
8
+ works with the free
9
+ [GeoLite2 databases](http://dev.maxmind.com/geoip/geoip2/geolite2/).
10
+
11
+ ## Install via Composer ##
12
+
13
+ We recommend installing this package with [Composer](http://getcomposer.org/).
14
+
15
+ ### Download Composer ###
16
+
17
+ To download Composer, run in the root directory of your project:
18
+
19
+ ```bash
20
+ curl -sS https://getcomposer.org/installer | php
21
+ ```
22
+
23
+ You should now have the file `composer.phar` in your project directory.
24
+
25
+ ### Install Dependencies ###
26
+
27
+ Run in your project root:
28
+
29
+ ```
30
+ php composer.phar require geoip2/geoip2:~2.0
31
+ ```
32
+
33
+ You should now have the files `composer.json` and `composer.lock` as well as
34
+ the directory `vendor` in your project directory. If you use a version control
35
+ system, `composer.json` should be added to it.
36
+
37
+ ### Require Autoloader ###
38
+
39
+ After installing the dependencies, you need to require the Composer autoloader
40
+ from your code:
41
+
42
+ ```php
43
+ require 'vendor/autoload.php';
44
+ ```
45
+
46
+ ## Install via Phar ##
47
+
48
+ Although we strongly recommend using Composer, we also provide a
49
+ [phar archive](http://php.net/manual/en/book.phar.php) containing most of the
50
+ dependencies for GeoIP2. Our latest phar archive is available on
51
+ [our releases page](https://github.com/maxmind/GeoIP2-php/releases).
52
+
53
+ ### Install Dependencies ###
54
+
55
+ In order to use the phar archive, you must have the PHP
56
+ [Phar extension](http://php.net/manual/en/book.phar.php) installed and
57
+ enabled.
58
+
59
+ If you will be making web service requests, you must have the PHP
60
+ [cURL extension](http://php.net/manual/en/book.curl.php)
61
+ installed to use this archive. For Debian based distributions, this can
62
+ typically be found in the the `php-curl` package. For other operating
63
+ systems, please consult the relevant documentation. After installing the
64
+ extension you may need to restart your web server.
65
+
66
+ If you are missing this extension, you will see errors like the following:
67
+
68
+ ```
69
+ PHP Fatal error: Uncaught Error: Call to undefined function MaxMind\WebService\curl_version()
70
+ ```
71
+
72
+ ### Require Package ###
73
+
74
+ To use the archive, just require it from your script:
75
+
76
+ ```php
77
+ require 'geoip2.phar';
78
+ ```
79
+
80
+ ## Optional C Extension ##
81
+
82
+ The [MaxMind DB API](https://github.com/maxmind/MaxMind-DB-Reader-php)
83
+ includes an optional C extension that you may install to dramatically increase
84
+ the performance of lookups in GeoIP2 or GeoLite2 databases. To install, please
85
+ follow the instructions included with that API.
86
+
87
+ The extension has no effect on web-service lookups.
88
+
89
+ ## IP Geolocation Usage ##
90
+
91
+ IP geolocation is inherently imprecise. Locations are often near the center of
92
+ the population. Any location provided by a GeoIP2 database or web service
93
+ should not be used to identify a particular address or household.
94
+
95
+ ## Database Reader ##
96
+
97
+ ### Usage ###
98
+
99
+ To use this API, you must create a new `\GeoIp2\Database\Reader` object with
100
+ the path to the database file as the first argument to the constructor. You
101
+ may then call the method corresponding to the database you are using.
102
+
103
+ If the lookup succeeds, the method call will return a model class for the
104
+ record in the database. This model in turn contains multiple container
105
+ classes for the different parts of the data such as the city in which the
106
+ IP address is located.
107
+
108
+ If the record is not found, a `\GeoIp2\Exception\AddressNotFoundException`
109
+ is thrown. If the database is invalid or corrupt, a
110
+ `\MaxMind\Db\InvalidDatabaseException` will be thrown.
111
+
112
+ See the API documentation for more details.
113
+
114
+ ### City Example ###
115
+
116
+ ```php
117
+ <?php
118
+ require_once 'vendor/autoload.php';
119
+ use GeoIp2\Database\Reader;
120
+
121
+ // This creates the Reader object, which should be reused across
122
+ // lookups.
123
+ $reader = new Reader('/usr/local/share/GeoIP/GeoIP2-City.mmdb');
124
+
125
+ // Replace "city" with the appropriate method for your database, e.g.,
126
+ // "country".
127
+ $record = $reader->city('128.101.101.101');
128
+
129
+ print($record->country->isoCode . "\n"); // 'US'
130
+ print($record->country->name . "\n"); // 'United States'
131
+ print($record->country->names['zh-CN'] . "\n"); // '美国'
132
+
133
+ print($record->mostSpecificSubdivision->name . "\n"); // 'Minnesota'
134
+ print($record->mostSpecificSubdivision->isoCode . "\n"); // 'MN'
135
+
136
+ print($record->city->name . "\n"); // 'Minneapolis'
137
+
138
+ print($record->postal->code . "\n"); // '55455'
139
+
140
+ print($record->location->latitude . "\n"); // 44.9733
141
+ print($record->location->longitude . "\n"); // -93.2323
142
+
143
+ ```
144
+
145
+ ### Anonymous IP Example ###
146
+
147
+ ```php
148
+ <?php
149
+ require_once 'vendor/autoload.php';
150
+ use GeoIp2\Database\Reader;
151
+
152
+ // This creates the Reader object, which should be reused across
153
+ // lookups.
154
+ $reader = new Reader('/usr/local/share/GeoIP/GeoIP2-Anonymous-IP.mmdb');
155
+
156
+ $record = $reader->anonymousIp('128.101.101.101');
157
+
158
+ if ($record->isAnonymous) { print "anon\n"; }
159
+ print($record->ipAddress . "\n"); // '128.101.101.101'
160
+
161
+ ```
162
+
163
+ ### Connection-Type Example ###
164
+
165
+ ```php
166
+ <?php
167
+ require_once 'vendor/autoload.php';
168
+ use GeoIp2\Database\Reader;
169
+
170
+ // This creates the Reader object, which should be reused across
171
+ // lookups.
172
+ $reader = new Reader('/usr/local/share/GeoIP/GeoIP2-Connection-Type.mmdb');
173
+
174
+ $record = $reader->connectionType('128.101.101.101');
175
+
176
+ print($record->connectionType . "\n"); // 'Corporate'
177
+ print($record->ipAddress . "\n"); // '128.101.101.101'
178
+
179
+ ```
180
+
181
+ ### Domain Example ###
182
+
183
+ ```php
184
+ <?php
185
+ require_once 'vendor/autoload.php';
186
+ use GeoIp2\Database\Reader;
187
+
188
+ // This creates the Reader object, which should be reused across
189
+ // lookups.
190
+ $reader = new Reader('/usr/local/share/GeoIP/GeoIP2-Domain.mmdb');
191
+
192
+ $record = $reader->domain('128.101.101.101');
193
+
194
+ print($record->domain . "\n"); // 'umn.edu'
195
+ print($record->ipAddress . "\n"); // '128.101.101.101'
196
+
197
+ ```
198
+
199
+ ### Enterprise Example ###
200
+
201
+ ```php
202
+ <?php
203
+ require_once 'vendor/autoload.php';
204
+ use GeoIp2\Database\Reader;
205
+
206
+ // This creates the Reader object, which should be reused across
207
+ // lookups.
208
+ $reader = new Reader('/usr/local/share/GeoIP/GeoIP2-Enterprise.mmdb');
209
+
210
+ // Use the ->enterprise method to do a lookup in the Enterprise database
211
+ $record = $reader->enterprise('128.101.101.101');
212
+
213
+ print($record->country->confidence . "\n"); // 99
214
+ print($record->country->isoCode . "\n"); // 'US'
215
+ print($record->country->name . "\n"); // 'United States'
216
+ print($record->country->names['zh-CN'] . "\n"); // '美国'
217
+
218
+ print($record->mostSpecificSubdivision->confidence . "\n"); // 77
219
+ print($record->mostSpecificSubdivision->name . "\n"); // 'Minnesota'
220
+ print($record->mostSpecificSubdivision->isoCode . "\n"); // 'MN'
221
+
222
+ print($record->city->confidence . "\n"); // 60
223
+ print($record->city->name . "\n"); // 'Minneapolis'
224
+
225
+ print($record->postal->code . "\n"); // '55455'
226
+
227
+ print($record->location->accuracyRadius . "\n"); // 50
228
+ print($record->location->latitude . "\n"); // 44.9733
229
+ print($record->location->longitude . "\n"); // -93.2323
230
+
231
+ ```
232
+
233
+ ### ISP Example ###
234
+
235
+ ```php
236
+ <?php
237
+ require_once 'vendor/autoload.php';
238
+ use GeoIp2\Database\Reader;
239
+
240
+ // This creates the Reader object, which should be reused across
241
+ // lookups.
242
+ $reader = new Reader('/usr/local/share/GeoIP/GeoIP2-ISP.mmdb');
243
+
244
+ $record = $reader->isp('128.101.101.101');
245
+
246
+ print($record->autonomousSystemNumber . "\n"); // 217
247
+ print($record->autonomousSystemOrganization . "\n"); // 'University of Minnesota'
248
+ print($record->isp . "\n"); // 'University of Minnesota'
249
+ print($record->organization . "\n"); // 'University of Minnesota'
250
+
251
+ print($record->ipAddress . "\n"); // '128.101.101.101'
252
+
253
+ ```
254
+
255
+ ## Web Service Client ##
256
+
257
+ ### Usage ###
258
+
259
+ To use this API, you must create a new `\GeoIp2\WebService\Client`
260
+ object with your `$userId` and `$licenseKey`, then you call the method
261
+ corresponding to a specific end point, passing it the IP address you want to
262
+ look up.
263
+
264
+ If the request succeeds, the method call will return a model class for the end
265
+ point you called. This model in turn contains multiple record classes, each of
266
+ which represents part of the data returned by the web service.
267
+
268
+ If there is an error, a structured exception is thrown.
269
+
270
+ See the API documentation for more details.
271
+
272
+ ### Example ###
273
+
274
+ ```php
275
+ <?php
276
+ require_once 'vendor/autoload.php';
277
+ use GeoIp2\WebService\Client;
278
+
279
+ // This creates a Client object that can be reused across requests.
280
+ // Replace "42" with your user ID and "license_key" with your license
281
+ // key.
282
+ $client = new Client(42, 'abcdef123456');
283
+
284
+ // Replace "city" with the method corresponding to the web service that
285
+ // you are using, e.g., "country", "insights".
286
+ $record = $client->city('128.101.101.101');
287
+
288
+ print($record->country->isoCode . "\n"); // 'US'
289
+ print($record->country->name . "\n"); // 'United States'
290
+ print($record->country->names['zh-CN'] . "\n"); // '美国'
291
+
292
+ print($record->mostSpecificSubdivision->name . "\n"); // 'Minnesota'
293
+ print($record->mostSpecificSubdivision->isoCode . "\n"); // 'MN'
294
+
295
+ print($record->city->name . "\n"); // 'Minneapolis'
296
+
297
+ print($record->postal->code . "\n"); // '55455'
298
+
299
+ print($record->location->latitude . "\n"); // 44.9733
300
+ print($record->location->longitude . "\n"); // -93.2323
301
+
302
+ ```
303
+
304
+ ## Values to use for Database or Array Keys ##
305
+
306
+ **We strongly discourage you from using a value from any `names` property as
307
+ a key in a database or array.**
308
+
309
+ These names may change between releases. Instead we recommend using one of the
310
+ following:
311
+
312
+ * `GeoIp2\Record\City` - `$city->geonameId`
313
+ * `GeoIp2\Record\Continent` - `$continent->code` or `$continent->geonameId`
314
+ * `GeoIp2\Record\Country` and `GeoIp2\Record\RepresentedCountry` -
315
+ `$country->isoCode` or `$country->geonameId`
316
+ * `GeoIp2\Record\Subdivision` - `$subdivision->isoCode` or `$subdivision->geonameId`
317
+
318
+ ### What data is returned? ###
319
+
320
+ While many of the end points return the same basic records, the attributes
321
+ which can be populated vary between end points. In addition, while an end
322
+ point may offer a particular piece of data, MaxMind does not always have every
323
+ piece of data for any given IP address.
324
+
325
+ Because of these factors, it is possible for any end point to return a record
326
+ where some or all of the attributes are unpopulated.
327
+
328
+ See the
329
+ [GeoIP2 Precision web service docs](http://dev.maxmind.com/geoip/geoip2/web-services)
330
+ for details on what data each end point may return.
331
+
332
+ The only piece of data which is always returned is the `ipAddress`
333
+ attribute in the `GeoIp2\Record\Traits` record.
334
+
335
+ ## Integration with GeoNames ##
336
+
337
+ [GeoNames](http://www.geonames.org/) offers web services and downloadable
338
+ databases with data on geographical features around the world, including
339
+ populated places. They offer both free and paid premium data. Each
340
+ feature is unique identified by a `geonameId`, which is an integer.
341
+
342
+ Many of the records returned by the GeoIP2 web services and databases
343
+ include a `geonameId` property. This is the ID of a geographical feature
344
+ (city, region, country, etc.) in the GeoNames database.
345
+
346
+ Some of the data that MaxMind provides is also sourced from GeoNames. We
347
+ source things like place names, ISO codes, and other similar data from
348
+ the GeoNames premium data set.
349
+
350
+ ## Reporting data problems ##
351
+
352
+ If the problem you find is that an IP address is incorrectly mapped,
353
+ please
354
+ [submit your correction to MaxMind](http://www.maxmind.com/en/correction).
355
+
356
+ If you find some other sort of mistake, like an incorrect spelling,
357
+ please check the [GeoNames site](http://www.geonames.org/) first. Once
358
+ you've searched for a place and found it on the GeoNames map view, there
359
+ are a number of links you can use to correct data ("move", "edit",
360
+ "alternate names", etc.). Once the correction is part of the GeoNames
361
+ data set, it will be automatically incorporated into future MaxMind
362
+ releases.
363
+
364
+ If you are a paying MaxMind customer and you're not sure where to submit
365
+ a correction, please
366
+ [contact MaxMind support](http://www.maxmind.com/en/support) for help.
367
+
368
+ ## Other Support ##
369
+
370
+ Please report all issues with this code using the
371
+ [GitHub issue tracker](https://github.com/maxmind/GeoIP2-php/issues).
372
+
373
+ If you are having an issue with a MaxMind service that is not specific
374
+ to the client API, please see
375
+ [our support page](http://www.maxmind.com/en/support).
376
+
377
+ ## Requirements ##
378
+
379
+ This library requires PHP 5.4 or greater. This library works and is tested
380
+ with HHVM.
381
+
382
+ This library also relies on the [MaxMind DB Reader](https://github.com/maxmind/MaxMind-DB-Reader-php).
383
+
384
+ ## Contributing ##
385
+
386
+ Patches and pull requests are encouraged. All code should follow the PSR-2
387
+ style guidelines. Please include unit tests whenever possible. You may obtain
388
+ the test data for the maxmind-db folder by running `git submodule update
389
+ --init --recursive` or adding `--recursive` to your initial clone, or from
390
+ https://github.com/maxmind/MaxMind-DB
391
+
392
+ ## Versioning ##
393
+
394
+ The GeoIP2 PHP API uses [Semantic Versioning](http://semver.org/).
395
+
396
+ ## Copyright and License ##
397
+
398
+ This software is Copyright (c) 2013-2017 by MaxMind, Inc.
399
+
400
+ This is free software, licensed under the Apache License, Version 2.0.
401
+
vendor/geoip2/geoip2/composer.json ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "geoip2/geoip2",
3
+ "description": "MaxMind GeoIP2 PHP API",
4
+ "keywords": ["geoip", "geoip2", "geolocation", "ip", "maxmind"],
5
+ "homepage": "https://github.com/maxmind/GeoIP2-php",
6
+ "type": "library",
7
+ "license": "Apache-2.0",
8
+ "authors": [
9
+ {
10
+ "name": "Gregory J. Oschwald",
11
+ "email": "goschwald@maxmind.com",
12
+ "homepage": "http://www.maxmind.com/"
13
+ }
14
+ ],
15
+ "require": {
16
+ "maxmind-db/reader": "~1.0",
17
+ "maxmind/web-service-common": "~0.4",
18
+ "php": ">=5.4"
19
+ },
20
+ "require-dev": {
21
+ "friendsofphp/php-cs-fixer": "2.*",
22
+ "phpunit/phpunit": "4.*",
23
+ "squizlabs/php_codesniffer": "3.*",
24
+ "apigen/apigen": "*"
25
+ },
26
+ "autoload": {
27
+ "psr-4": {
28
+ "GeoIp2\\": "src"
29
+ }
30
+ }
31
+ }
vendor/geoip2/geoip2/src/Database/Reader.php ADDED
@@ -0,0 +1,283 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Database;
4
+
5
+ use GeoIp2\Exception\AddressNotFoundException;
6
+ use GeoIp2\ProviderInterface;
7
+ use MaxMind\Db\Reader as DbReader;
8
+ use MaxMind\Db\Reader\InvalidDatabaseException;
9
+
10
+ /**
11
+ * Instances of this class provide a reader for the GeoIP2 database format.
12
+ * IP addresses can be looked up using the database specific methods.
13
+ *
14
+ * ## Usage ##
15
+ *
16
+ * The basic API for this class is the same for every database. First, you
17
+ * create a reader object, specifying a file name. You then call the method
18
+ * corresponding to the specific database, passing it the IP address you want
19
+ * to look up.
20
+ *
21
+ * If the request succeeds, the method call will return a model class for
22
+ * the method you called. This model in turn contains multiple record classes,
23
+ * each of which represents part of the data returned by the database. If
24
+ * the database does not contain the requested information, the attributes
25
+ * on the record class will have a `null` value.
26
+ *
27
+ * If the address is not in the database, an
28
+ * {@link \GeoIp2\Exception\AddressNotFoundException} exception will be
29
+ * thrown. If an invalid IP address is passed to one of the methods, a
30
+ * SPL {@link \InvalidArgumentException} will be thrown. If the database is
31
+ * corrupt or invalid, a {@link \MaxMind\Db\Reader\InvalidDatabaseException}
32
+ * will be thrown.
33
+ */
34
+ class Reader implements ProviderInterface
35
+ {
36
+ private $dbReader;
37
+ private $locales;
38
+
39
+ /**
40
+ * Constructor.
41
+ *
42
+ * @param string $filename the path to the GeoIP2 database file
43
+ * @param array $locales list of locale codes to use in name property
44
+ * from most preferred to least preferred
45
+ *
46
+ * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
47
+ * is corrupt or invalid
48
+ */
49
+ public function __construct(
50
+ $filename,
51
+ $locales = ['en']
52
+ ) {
53
+ $this->dbReader = new DbReader($filename);
54
+ $this->locales = $locales;
55
+ }
56
+
57
+ /**
58
+ * This method returns a GeoIP2 City model.
59
+ *
60
+ * @param string $ipAddress an IPv4 or IPv6 address as a string
61
+ *
62
+ * @throws \GeoIp2\Exception\AddressNotFoundException if the address is
63
+ * not in the database
64
+ * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
65
+ * is corrupt or invalid
66
+ *
67
+ * @return \GeoIp2\Model\City
68
+ */
69
+ public function city($ipAddress)
70
+ {
71
+ return $this->modelFor('City', 'City', $ipAddress);
72
+ }
73
+
74
+ /**
75
+ * This method returns a GeoIP2 Country model.
76
+ *
77
+ * @param string $ipAddress an IPv4 or IPv6 address as a string
78
+ *
79
+ * @throws \GeoIp2\Exception\AddressNotFoundException if the address is
80
+ * not in the database
81
+ * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
82
+ * is corrupt or invalid
83
+ *
84
+ * @return \GeoIp2\Model\Country
85
+ */
86
+ public function country($ipAddress)
87
+ {
88
+ return $this->modelFor('Country', 'Country', $ipAddress);
89
+ }
90
+
91
+ /**
92
+ * This method returns a GeoIP2 Anonymous IP model.
93
+ *
94
+ * @param string $ipAddress an IPv4 or IPv6 address as a string
95
+ *
96
+ * @throws \GeoIp2\Exception\AddressNotFoundException if the address is
97
+ * not in the database
98
+ * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
99
+ * is corrupt or invalid
100
+ *
101
+ * @return \GeoIp2\Model\AnonymousIp
102
+ */
103
+ public function anonymousIp($ipAddress)
104
+ {
105
+ return $this->flatModelFor(
106
+ 'AnonymousIp',
107
+ 'GeoIP2-Anonymous-IP',
108
+ $ipAddress
109
+ );
110
+ }
111
+
112
+ /**
113
+ * This method returns a GeoLite2 ASN model.
114
+ *
115
+ * @param string $ipAddress an IPv4 or IPv6 address as a string
116
+ *
117
+ * @throws \GeoIp2\Exception\AddressNotFoundException if the address is
118
+ * not in the database
119
+ * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
120
+ * is corrupt or invalid
121
+ *
122
+ * @return \GeoIp2\Model\Asn
123
+ */
124
+ public function asn($ipAddress)
125
+ {
126
+ return $this->flatModelFor(
127
+ 'Asn',
128
+ 'GeoLite2-ASN',
129
+ $ipAddress
130
+ );
131
+ }
132
+
133
+ /**
134
+ * This method returns a GeoIP2 Connection Type model.
135
+ *
136
+ * @param string $ipAddress an IPv4 or IPv6 address as a string
137
+ *
138
+ * @throws \GeoIp2\Exception\AddressNotFoundException if the address is
139
+ * not in the database
140
+ * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
141
+ * is corrupt or invalid
142
+ *
143
+ * @return \GeoIp2\Model\ConnectionType
144
+ */
145
+ public function connectionType($ipAddress)
146
+ {
147
+ return $this->flatModelFor(
148
+ 'ConnectionType',
149
+ 'GeoIP2-Connection-Type',
150
+ $ipAddress
151
+ );
152
+ }
153
+
154
+ /**
155
+ * This method returns a GeoIP2 Domain model.
156
+ *
157
+ * @param string $ipAddress an IPv4 or IPv6 address as a string
158
+ *
159
+ * @throws \GeoIp2\Exception\AddressNotFoundException if the address is
160
+ * not in the database
161
+ * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
162
+ * is corrupt or invalid
163
+ *
164
+ * @return \GeoIp2\Model\Domain
165
+ */
166
+ public function domain($ipAddress)
167
+ {
168
+ return $this->flatModelFor(
169
+ 'Domain',
170
+ 'GeoIP2-Domain',
171
+ $ipAddress
172
+ );
173
+ }
174
+
175
+ /**
176
+ * This method returns a GeoIP2 Enterprise model.
177
+ *
178
+ * @param string $ipAddress an IPv4 or IPv6 address as a string
179
+ *
180
+ * @throws \GeoIp2\Exception\AddressNotFoundException if the address is
181
+ * not in the database
182
+ * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
183
+ * is corrupt or invalid
184
+ *
185
+ * @return \GeoIp2\Model\Enterprise
186
+ */
187
+ public function enterprise($ipAddress)
188
+ {
189
+ return $this->modelFor('Enterprise', 'Enterprise', $ipAddress);
190
+ }
191
+
192
+ /**
193
+ * This method returns a GeoIP2 ISP model.
194
+ *
195
+ * @param string $ipAddress an IPv4 or IPv6 address as a string
196
+ *
197
+ * @throws \GeoIp2\Exception\AddressNotFoundException if the address is
198
+ * not in the database
199
+ * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
200
+ * is corrupt or invalid
201
+ *
202
+ * @return \GeoIp2\Model\Isp
203
+ */
204
+ public function isp($ipAddress)
205
+ {
206
+ return $this->flatModelFor(
207
+ 'Isp',
208
+ 'GeoIP2-ISP',
209
+ $ipAddress
210
+ );
211
+ }
212
+
213
+ private function modelFor($class, $type, $ipAddress)
214
+ {
215
+ $record = $this->getRecord($class, $type, $ipAddress);
216
+
217
+ $record['traits']['ip_address'] = $ipAddress;
218
+ $class = 'GeoIp2\\Model\\' . $class;
219
+
220
+ return new $class($record, $this->locales);
221
+ }
222
+
223
+ private function flatModelFor($class, $type, $ipAddress)
224
+ {
225
+ $record = $this->getRecord($class, $type, $ipAddress);
226
+
227
+ $record['ip_address'] = $ipAddress;
228
+ $class = 'GeoIp2\\Model\\' . $class;
229
+
230
+ return new $class($record);
231
+ }
232
+
233
+ private function getRecord($class, $type, $ipAddress)
234
+ {
235
+ if (strpos($this->metadata()->databaseType, $type) === false) {
236
+ $method = lcfirst($class);
237
+ throw new \BadMethodCallException(
238
+ "The $method method cannot be used to open a "
239
+ . $this->metadata()->databaseType . ' database'
240
+ );
241
+ }
242
+ $record = $this->dbReader->get($ipAddress);
243
+ if ($record === null) {
244
+ throw new AddressNotFoundException(
245
+ "The address $ipAddress is not in the database."
246
+ );
247
+ }
248
+ if (!is_array($record)) {
249
+ // This can happen on corrupt databases. Generally,
250
+ // MaxMind\Db\Reader will throw a
251
+ // MaxMind\Db\Reader\InvalidDatabaseException, but occasionally
252
+ // the lookup may result in a record that looks valid but is not
253
+ // an array. This mostly happens when the user is ignoring all
254
+ // exceptions and the more frequent InvalidDatabaseException
255
+ // exceptions go unnoticed.
256
+ throw new InvalidDatabaseException(
257
+ "Expected an array when looking up $ipAddress but received: "
258
+ . gettype($record)
259
+ );
260
+ }
261
+
262
+ return $record;
263
+ }
264
+
265
+ /**
266
+ * @throws \InvalidArgumentException if arguments are passed to the method
267
+ * @throws \BadMethodCallException if the database has been closed
268
+ *
269
+ * @return \MaxMind\Db\Reader\Metadata object for the database
270
+ */
271
+ public function metadata()
272
+ {
273
+ return $this->dbReader->metadata();
274
+ }
275
+
276
+ /**
277
+ * Closes the GeoIP2 database and returns the resources to the system.
278
+ */
279
+ public function close()
280
+ {
281
+ $this->dbReader->close();
282
+ }
283
+ }
vendor/geoip2/geoip2/src/Exception/AddressNotFoundException.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Exception;
4
+
5
+ /**
6
+ * This class represents a generic error.
7
+ */
8
+ class AddressNotFoundException extends GeoIp2Exception
9
+ {
10
+ }
vendor/geoip2/geoip2/src/Exception/AuthenticationException.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Exception;
4
+
5
+ /**
6
+ * This class represents a generic error.
7
+ */
8
+ class AuthenticationException extends GeoIp2Exception
9
+ {
10
+ }
vendor/geoip2/geoip2/src/Exception/GeoIp2Exception.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Exception;
4
+
5
+ /**
6
+ * This class represents a generic error.
7
+ */
8
+ class GeoIp2Exception extends \Exception
9
+ {
10
+ }
vendor/geoip2/geoip2/src/Exception/HttpException.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Exception;
4
+
5
+ /**
6
+ * This class represents an HTTP transport error.
7
+ */
8
+ class HttpException extends GeoIp2Exception
9
+ {
10
+ /**
11
+ * The URI queried.
12
+ */
13
+ public $uri;
14
+
15
+ public function __construct(
16
+ $message,
17
+ $httpStatus,
18
+ $uri,
19
+ \Exception $previous = null
20
+ ) {
21
+ $this->uri = $uri;
22
+ parent::__construct($message, $httpStatus, $previous);
23
+ }
24
+ }
vendor/geoip2/geoip2/src/Exception/InvalidRequestException.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Exception;
4
+
5
+ /**
6
+ * This class represents an error returned by MaxMind's GeoIP2
7
+ * web service.
8
+ */
9
+ class InvalidRequestException extends HttpException
10
+ {
11
+ /**
12
+ * The code returned by the MaxMind web service.
13
+ */
14
+ public $error;
15
+
16
+ public function __construct(
17
+ $message,
18
+ $error,
19
+ $httpStatus,
20
+ $uri,
21
+ \Exception $previous = null
22
+ ) {
23
+ $this->error = $error;
24
+ parent::__construct($message, $httpStatus, $uri, $previous);
25
+ }
26
+ }
vendor/geoip2/geoip2/src/Exception/OutOfQueriesException.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Exception;
4
+
5
+ /**
6
+ * This class represents a generic error.
7
+ */
8
+ class OutOfQueriesException extends GeoIp2Exception
9
+ {
10
+ }
vendor/geoip2/geoip2/src/Model/AbstractModel.php ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Model;
4
+
5
+ /**
6
+ * @ignore
7
+ */
8
+ abstract class AbstractModel implements \JsonSerializable
9
+ {
10
+ protected $raw;
11
+
12
+ /**
13
+ * @ignore
14
+ *
15
+ * @param mixed $raw
16
+ */
17
+ public function __construct($raw)
18
+ {
19
+ $this->raw = $raw;
20
+ }
21
+
22
+ /**
23
+ * @ignore
24
+ *
25
+ * @param mixed $field
26
+ */
27
+ protected function get($field)
28
+ {
29
+ if (isset($this->raw[$field])) {
30
+ return $this->raw[$field];
31
+ }
32
+ if (preg_match('/^is_/', $field)) {
33
+ return false;
34
+ }
35
+
36
+ return null;
37
+ }
38
+
39
+ /**
40
+ * @ignore
41
+ *
42
+ * @param mixed $attr
43
+ */
44
+ public function __get($attr)
45
+ {
46
+ if ($attr !== 'instance' && property_exists($this, $attr)) {
47
+ return $this->$attr;
48
+ }
49
+
50
+ throw new \RuntimeException("Unknown attribute: $attr");
51
+ }
52
+
53
+ /**
54
+ * @ignore
55
+ *
56
+ * @param mixed $attr
57
+ */
58
+ public function __isset($attr)
59
+ {
60
+ return $attr !== 'instance' && isset($this->$attr);
61
+ }
62
+
63
+ public function jsonSerialize()
64
+ {
65
+ return $this->raw;
66
+ }
67
+ }
vendor/geoip2/geoip2/src/Model/AnonymousIp.php ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Model;
4
+
5
+ /**
6
+ * This class provides the GeoIP2 Anonymous IP model.
7
+ *
8
+ * @property-read bool $isAnonymous This is true if the IP address belongs to
9
+ * any sort of anonymous network.
10
+ * @property-read bool $isAnonymousVpn This is true if the IP address belongs to
11
+ * an anonymous VPN system.
12
+ * @property-read bool $isHostingProvider This is true if the IP address belongs
13
+ * to a hosting provider.
14
+ * @property-read bool $isPublicProxy This is true if the IP address belongs to
15
+ * a public proxy.
16
+ * @property-read bool $isTorExitNode This is true if the IP address is a Tor
17
+ * exit node.
18
+ * @property-read string $ipAddress The IP address that the data in the model is
19
+ * for.
20
+ */
21
+ class AnonymousIp extends AbstractModel
22
+ {
23
+ protected $isAnonymous;
24
+ protected $isAnonymousVpn;
25
+ protected $isHostingProvider;
26
+ protected $isPublicProxy;
27
+ protected $isTorExitNode;
28
+ protected $ipAddress;
29
+
30
+ /**
31
+ * @ignore
32
+ *
33
+ * @param mixed $raw
34
+ */
35
+ public function __construct($raw)
36
+ {
37
+ parent::__construct($raw);
38
+
39
+ $this->isAnonymous = $this->get('is_anonymous');
40
+ $this->isAnonymousVpn = $this->get('is_anonymous_vpn');
41
+ $this->isHostingProvider = $this->get('is_hosting_provider');
42
+ $this->isPublicProxy = $this->get('is_public_proxy');
43
+ $this->isTorExitNode = $this->get('is_tor_exit_node');
44
+ $this->ipAddress = $this->get('ip_address');
45
+ }
46
+ }
vendor/geoip2/geoip2/src/Model/Asn.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Model;
4
+
5
+ /**
6
+ * This class provides the GeoLite2 ASN model.
7
+ *
8
+ * @property-read int|null $autonomousSystemNumber The autonomous system number
9
+ * associated with the IP address.
10
+ * @property-read string|null $autonomousSystemOrganization The organization
11
+ * associated with the registered autonomous system number for the IP
12
+ * address.
13
+ * @property-read string $ipAddress The IP address that the data in the model is
14
+ * for.
15
+ */
16
+ class Asn extends AbstractModel
17
+ {
18
+ protected $autonomousSystemNumber;
19
+ protected $autonomousSystemOrganization;
20
+ protected $ipAddress;
21
+
22
+ /**
23
+ * @ignore
24
+ *
25
+ * @param mixed $raw
26
+ */
27
+ public function __construct($raw)
28
+ {
29
+ parent::__construct($raw);
30
+ $this->autonomousSystemNumber = $this->get('autonomous_system_number');
31
+ $this->autonomousSystemOrganization =
32
+ $this->get('autonomous_system_organization');
33
+ $this->ipAddress = $this->get('ip_address');
34
+ }
35
+ }
vendor/geoip2/geoip2/src/Model/City.php ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Model;
4
+
5
+ /**
6
+ * Model class for the data returned by GeoIP2 City web service and database.
7
+ *
8
+ * The only difference between the City and Insights model classes is which
9
+ * fields in each record may be populated. See
10
+ * http://dev.maxmind.com/geoip/geoip2/web-services more details.
11
+ *
12
+ * @property-read \GeoIp2\Record\City $city City data for the requested IP
13
+ * address.
14
+ * @property-read \GeoIp2\Record\Continent $continent Continent data for the
15
+ * requested IP address.
16
+ * @property-read \GeoIp2\Record\Country $country Country data for the requested
17
+ * IP address. This object represents the country where MaxMind believes the
18
+ * end user is located.
19
+ * @property-read \GeoIp2\Record\Location $location Location data for the
20
+ * requested IP address.
21
+ * @property-read \GeoIp2\Record\Postal $postal Postal data for the
22
+ * requested IP address.
23
+ * @property-read \GeoIp2\Record\MaxMind $maxmind Data related to your MaxMind
24
+ * account.
25
+ * @property-read \GeoIp2\Record\Country $registeredCountry Registered country
26
+ * data for the requested IP address. This record represents the country
27
+ * where the ISP has registered a given IP block and may differ from the
28
+ * user's country.
29
+ * @property-read \GeoIp2\Record\RepresentedCountry $representedCountry
30
+ * Represented country data for the requested IP address. The represented
31
+ * country is used for things like military bases. It is only present when
32
+ * the represented country differs from the country.
33
+ * @property-read array $subdivisions An array of {@link \GeoIp2\Record\Subdivision}
34
+ * objects representing the country subdivisions for the requested IP
35
+ * address. The number and type of subdivisions varies by country, but a
36
+ * subdivision is typically a state, province, county, etc. Subdivisions
37
+ * are ordered from most general (largest) to most specific (smallest).
38
+ * If the response did not contain any subdivisions, this method returns
39
+ * an empty array.
40
+ * @property-read \GeoIp2\Record\Subdivision $mostSpecificSubdivision An object
41
+ * representing the most specific subdivision returned. If the response
42
+ * did not contain any subdivisions, this method returns an empty
43
+ * {@link \GeoIp2\Record\Subdivision} object.
44
+ * @property-read \GeoIp2\Record\Traits $traits Data for the traits of the
45
+ * requested IP address.
46
+ */
47
+ class City extends Country
48
+ {
49
+ /**
50
+ * @ignore
51
+ */
52
+ protected $city;
53
+ /**
54
+ * @ignore
55
+ */
56
+ protected $location;
57
+ /**
58
+ * @ignore
59
+ */
60
+ protected $postal;
61
+ /**
62
+ * @ignore
63
+ */
64
+ protected $subdivisions = [];
65
+
66
+ /**
67
+ * @ignore
68
+ *
69
+ * @param mixed $raw
70
+ * @param mixed $locales
71
+ */
72
+ public function __construct($raw, $locales = ['en'])
73
+ {
74
+ parent::__construct($raw, $locales);
75
+
76
+ $this->city = new \GeoIp2\Record\City($this->get('city'), $locales);
77
+ $this->location = new \GeoIp2\Record\Location($this->get('location'));
78
+ $this->postal = new \GeoIp2\Record\Postal($this->get('postal'));
79
+
80
+ $this->createSubdivisions($raw, $locales);
81
+ }
82
+
83
+ private function createSubdivisions($raw, $locales)
84
+ {
85
+ if (!isset($raw['subdivisions'])) {
86
+ return;
87
+ }
88
+
89
+ foreach ($raw['subdivisions'] as $sub) {
90
+ array_push(
91
+ $this->subdivisions,
92
+ new \GeoIp2\Record\Subdivision($sub, $locales)
93
+ );
94
+ }
95
+ }
96
+
97
+ /**
98
+ * @ignore
99
+ *
100
+ * @param mixed $attr
101
+ */
102
+ public function __get($attr)
103
+ {
104
+ if ($attr === 'mostSpecificSubdivision') {
105
+ return $this->$attr();
106
+ }
107
+
108
+ return parent::__get($attr);
109
+ }
110
+
111
+ /**
112
+ * @ignore
113
+ *
114
+ * @param mixed $attr
115
+ */
116
+ public function __isset($attr)
117
+ {
118
+ if ($attr === 'mostSpecificSubdivision') {
119
+ // We always return a mostSpecificSubdivision, even if it is the
120
+ // empty subdivision
121
+ return true;
122
+ }
123
+
124
+ return parent::__isset($attr);
125
+ }
126
+
127
+ private function mostSpecificSubdivision()
128
+ {
129
+ return empty($this->subdivisions) ?
130
+ new \GeoIp2\Record\Subdivision([], $this->locales) :
131
+ end($this->subdivisions);
132
+ }
133
+ }
vendor/geoip2/geoip2/src/Model/ConnectionType.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Model;
4
+
5
+ /**
6
+ * This class provides the GeoIP2 Connection-Type model.
7
+ *
8
+ * @property-read string|null $connectionType The connection type may take the
9
+ * following values: "Dialup", "Cable/DSL", "Corporate", "Cellular".
10
+ * Additional values may be added in the future.
11
+ * @property-read string $ipAddress The IP address that the data in the model is
12
+ * for.
13
+ */
14
+ class ConnectionType extends AbstractModel
15
+ {
16
+ protected $connectionType;
17
+ protected $ipAddress;
18
+
19
+ /**
20
+ * @ignore
21
+ *
22
+ * @param mixed $raw
23
+ */
24
+ public function __construct($raw)
25
+ {
26
+ parent::__construct($raw);
27
+
28
+ $this->connectionType = $this->get('connection_type');
29
+ $this->ipAddress = $this->get('ip_address');
30
+ }
31
+ }
vendor/geoip2/geoip2/src/Model/Country.php ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Model;
4
+
5
+ /**
6
+ * Model class for the data returned by GeoIP2 Country web service and database.
7
+ *
8
+ * The only difference between the City and Insights model classes is which
9
+ * fields in each record may be populated. See
10
+ * http://dev.maxmind.com/geoip/geoip2/web-services more details.
11
+ *
12
+ * @property-read \GeoIp2\Record\Continent $continent Continent data for the
13
+ * requested IP address.
14
+ * @property-read \GeoIp2\Record\Country $country Country data for the requested
15
+ * IP address. This object represents the country where MaxMind believes the
16
+ * end user is located.
17
+ * @property-read \GeoIp2\Record\MaxMind $maxmind Data related to your MaxMind
18
+ * account.
19
+ * @property-read \GeoIp2\Record\Country $registeredCountry Registered country
20
+ * data for the requested IP address. This record represents the country
21
+ * where the ISP has registered a given IP block and may differ from the
22
+ * user's country.
23
+ * @property-read \GeoIp2\Record\RepresentedCountry $representedCountry
24
+ * Represented country data for the requested IP address. The represented
25
+ * country is used for things like military bases. It is only present when
26
+ * the represented country differs from the country.
27
+ * @property-read \GeoIp2\Record\Traits $traits Data for the traits of the
28
+ * requested IP address.
29
+ */
30
+ class Country extends AbstractModel
31
+ {
32
+ protected $continent;
33
+ protected $country;
34
+ protected $locales;
35
+ protected $maxmind;
36
+ protected $registeredCountry;
37
+ protected $representedCountry;
38
+ protected $traits;
39
+
40
+ /**
41
+ * @ignore
42
+ *
43
+ * @param mixed $raw
44
+ * @param mixed $locales
45
+ */
46
+ public function __construct($raw, $locales = ['en'])
47
+ {
48
+ parent::__construct($raw);
49
+
50
+ $this->continent = new \GeoIp2\Record\Continent(
51
+ $this->get('continent'),
52
+ $locales
53
+ );
54
+ $this->country = new \GeoIp2\Record\Country(
55
+ $this->get('country'),
56
+ $locales
57
+ );
58
+ $this->maxmind = new \GeoIp2\Record\MaxMind($this->get('maxmind'));
59
+ $this->registeredCountry = new \GeoIp2\Record\Country(
60
+ $this->get('registered_country'),
61
+ $locales
62
+ );
63
+ $this->representedCountry = new \GeoIp2\Record\RepresentedCountry(
64
+ $this->get('represented_country'),
65
+ $locales
66
+ );
67
+ $this->traits = new \GeoIp2\Record\Traits($this->get('traits'));
68
+
69
+ $this->locales = $locales;
70
+ }
71
+ }
vendor/geoip2/geoip2/src/Model/Domain.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Model;
4
+
5
+ /**
6
+ * This class provides the GeoIP2 Domain model.
7
+ *
8
+ * @property-read string|null $domain The second level domain associated with the
9
+ * IP address. This will be something like "example.com" or
10
+ * "example.co.uk", not "foo.example.com".
11
+ * @property-read string $ipAddress The IP address that the data in the model is
12
+ * for.
13
+ */
14
+ class Domain extends AbstractModel
15
+ {
16
+ protected $domain;
17
+ protected $ipAddress;
18
+
19
+ /**
20
+ * @ignore
21
+ *
22
+ * @param mixed $raw
23
+ */
24
+ public function __construct($raw)
25
+ {
26
+ parent::__construct($raw);
27
+
28
+ $this->domain = $this->get('domain');
29
+ $this->ipAddress = $this->get('ip_address');
30
+ }
31
+ }
vendor/geoip2/geoip2/src/Model/Enterprise.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Model;
4
+
5
+ /**
6
+ * Model class for the data returned by GeoIP2 Enterprise database lookups.
7
+ *
8
+ * The only difference between the City and Enterprise model classes is which
9
+ * fields in each record may be populated. See
10
+ * http://dev.maxmind.com/geoip/geoip2/web-services more details.
11
+ *
12
+ * @property-read \GeoIp2\Record\City $city City data for the requested IP
13
+ * address.
14
+ * @property-read \GeoIp2\Record\Continent $continent Continent data for the
15
+ * requested IP address.
16
+ * @property-read \GeoIp2\Record\Country $country Country data for the requested
17
+ * IP address. This object represents the country where MaxMind believes the
18
+ * end user is located.
19
+ * @property-read \GeoIp2\Record\Location $location Location data for the
20
+ * requested IP address.
21
+ * @property-read \GeoIp2\Record\MaxMind $maxmind Data related to your MaxMind
22
+ * account.
23
+ * @property-read \GeoIp2\Record\Country $registeredCountry Registered country
24
+ * data for the requested IP address. This record represents the country
25
+ * where the ISP has registered a given IP block and may differ from the
26
+ * user's country.
27
+ * @property-read \GeoIp2\Record\RepresentedCountry $representedCountry
28
+ * Represented country data for the requested IP address. The represented
29
+ * country is used for things like military bases. It is only present when
30
+ * the represented country differs from the country.
31
+ * @property-read array $subdivisions An array of {@link \GeoIp2\Record\Subdivision}
32
+ * objects representing the country subdivisions for the requested IP
33
+ * address. The number and type of subdivisions varies by country, but a
34
+ * subdivision is typically a state, province, county, etc. Subdivisions
35
+ * are ordered from most general (largest) to most specific (smallest).
36
+ * If the response did not contain any subdivisions, this method returns
37
+ * an empty array.
38
+ * @property-read \GeoIp2\Record\Subdivision $mostSpecificSubdivision An object
39
+ * representing the most specific subdivision returned. If the response
40
+ * did not contain any subdivisions, this method returns an empty
41
+ * {@link \GeoIp2\Record\Subdivision} object.
42
+ * @property-read \GeoIp2\Record\Traits $traits Data for the traits of the
43
+ * requested IP address.
44
+ */
45
+ class Enterprise extends City
46
+ {
47
+ }
vendor/geoip2/geoip2/src/Model/Insights.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Model;
4
+
5
+ /**
6
+ * Model class for the data returned by GeoIP2 Precision: Insights web service.
7
+ *
8
+ * The only difference between the City and Insights model classes is which
9
+ * fields in each record may be populated. See
10
+ * http://dev.maxmind.com/geoip/geoip2/web-services more details.
11
+ *
12
+ * @property-read \GeoIp2\Record\City $city City data for the requested IP
13
+ * address.
14
+ * @property-read \GeoIp2\Record\Continent $continent Continent data for the
15
+ * requested IP address.
16
+ * @property-read \GeoIp2\Record\Country $country Country data for the requested
17
+ * IP address. This object represents the country where MaxMind believes the
18
+ * end user is located.
19
+ * @property-read \GeoIp2\Record\Location $location Location data for the
20
+ * requested IP address.
21
+ * @property-read \GeoIp2\Record\MaxMind $maxmind Data related to your MaxMind
22
+ * account.
23
+ * @property-read \GeoIp2\Record\Country $registeredCountry Registered country
24
+ * data for the requested IP address. This record represents the country
25
+ * where the ISP has registered a given IP block and may differ from the
26
+ * user's country.
27
+ * @property-read \GeoIp2\Record\RepresentedCountry $representedCountry
28
+ * Represented country data for the requested IP address. The represented
29
+ * country is used for things like military bases. It is only present when
30
+ * the represented country differs from the country.
31
+ * @property-read array $subdivisions An array of {@link \GeoIp2\Record\Subdivision}
32
+ * objects representing the country subdivisions for the requested IP
33
+ * address. The number and type of subdivisions varies by country, but a
34
+ * subdivision is typically a state, province, county, etc. Subdivisions
35
+ * are ordered from most general (largest) to most specific (smallest).
36
+ * If the response did not contain any subdivisions, this method returns
37
+ * an empty array.
38
+ * @property-read \GeoIp2\Record\Subdivision $mostSpecificSubdivision An object
39
+ * representing the most specific subdivision returned. If the response
40
+ * did not contain any subdivisions, this method returns an empty
41
+ * {@link \GeoIp2\Record\Subdivision} object.
42
+ * @property-read \GeoIp2\Record\Traits $traits Data for the traits of the
43
+ * requested IP address.
44
+ */
45
+ class Insights extends City
46
+ {
47
+ }
vendor/geoip2/geoip2/src/Model/Isp.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Model;
4
+
5
+ /**
6
+ * This class provides the GeoIP2 ISP model.
7
+ *
8
+ * @property-read int|null $autonomousSystemNumber The autonomous system number
9
+ * associated with the IP address.
10
+ * @property-read string|null $autonomousSystemOrganization The organization
11
+ * associated with the registered autonomous system number for the IP
12
+ * address.
13
+ * @property-read string|null $isp The name of the ISP associated with the IP
14
+ * address.
15
+ * @property-read string|null $organization The name of the organization associated
16
+ * with the IP address.
17
+ * @property-read string $ipAddress The IP address that the data in the model is
18
+ * for.
19
+ */
20
+ class Isp extends AbstractModel
21
+ {
22
+ protected $autonomousSystemNumber;
23
+ protected $autonomousSystemOrganization;
24
+ protected $isp;
25
+ protected $organization;
26
+ protected $ipAddress;
27
+
28
+ /**
29
+ * @ignore
30
+ *
31
+ * @param mixed $raw
32
+ */
33
+ public function __construct($raw)
34
+ {
35
+ parent::__construct($raw);
36
+ $this->autonomousSystemNumber = $this->get('autonomous_system_number');
37
+ $this->autonomousSystemOrganization =
38
+ $this->get('autonomous_system_organization');
39
+ $this->isp = $this->get('isp');
40
+ $this->organization = $this->get('organization');
41
+
42
+ $this->ipAddress = $this->get('ip_address');
43
+ }
44
+ }
vendor/geoip2/geoip2/src/ProviderInterface.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2;
4
+
5
+ interface ProviderInterface
6
+ {
7
+ /**
8
+ * @param string $ipAddress an IPv4 or IPv6 address to lookup
9
+ *
10
+ * @return \GeoIp2\Model\Country a Country model for the requested IP address
11
+ */
12
+ public function country($ipAddress);
13
+
14
+ /**
15
+ * @param string $ipAddress an IPv4 or IPv6 address to lookup
16
+ *
17
+ * @return \GeoIp2\Model\City a City model for the requested IP address
18
+ */
19
+ public function city($ipAddress);
20
+ }
vendor/geoip2/geoip2/src/Record/AbstractPlaceRecord.php ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Record;
4
+
5
+ abstract class AbstractPlaceRecord extends AbstractRecord
6
+ {
7
+ private $locales;
8
+
9
+ /**
10
+ * @ignore
11
+ *
12
+ * @param mixed $record
13
+ * @param mixed $locales
14
+ */
15
+ public function __construct($record, $locales = ['en'])
16
+ {
17
+ $this->locales = $locales;
18
+ parent::__construct($record);
19
+ }
20
+
21
+ /**
22
+ * @ignore
23
+ *
24
+ * @param mixed $attr
25
+ */
26
+ public function __get($attr)
27
+ {
28
+ if ($attr === 'name') {
29
+ return $this->name();
30
+ }
31
+
32
+ return parent::__get($attr);
33
+ }
34
+
35
+ /**
36
+ * @ignore
37
+ *
38
+ * @param mixed $attr
39
+ */
40
+ public function __isset($attr)
41
+ {
42
+ if ($attr === 'name') {
43
+ return $this->firstSetNameLocale() === null ? false : true;
44
+ }
45
+
46
+ return parent::__isset($attr);
47
+ }
48
+
49
+ private function name()
50
+ {
51
+ $locale = $this->firstSetNameLocale();
52
+
53
+ return $locale === null ? null : $this->names[$locale];
54
+ }
55
+
56
+ private function firstSetNameLocale()
57
+ {
58
+ foreach ($this->locales as $locale) {
59
+ if (isset($this->names[$locale])) {
60
+ return $locale;
61
+ }
62
+ }
63
+
64
+ return null;
65
+ }
66
+ }
vendor/geoip2/geoip2/src/Record/AbstractRecord.php ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Record;
4
+
5
+ abstract class AbstractRecord implements \JsonSerializable
6
+ {
7
+ private $record;
8
+
9
+ /**
10
+ * @ignore
11
+ *
12
+ * @param mixed $record
13
+ */
14
+ public function __construct($record)
15
+ {
16
+ $this->record = isset($record) ? $record : [];
17
+ }
18
+
19
+ /**
20
+ * @ignore
21
+ *
22
+ * @param mixed $attr
23
+ */
24
+ public function __get($attr)
25
+ {
26
+ // XXX - kind of ugly but greatly reduces boilerplate code
27
+ $key = $this->attributeToKey($attr);
28
+
29
+ if ($this->__isset($attr)) {
30
+ return $this->record[$key];
31
+ } elseif ($this->validAttribute($attr)) {
32
+ if (preg_match('/^is_/', $key)) {
33
+ return false;
34
+ }
35
+
36
+ return null;
37
+ }
38
+ throw new \RuntimeException("Unknown attribute: $attr");
39
+ }
40
+
41
+ public function __isset($attr)
42
+ {
43
+ return $this->validAttribute($attr) &&
44
+ isset($this->record[$this->attributeToKey($attr)]);
45
+ }
46
+
47
+ private function attributeToKey($attr)
48
+ {
49
+ return strtolower(preg_replace('/([A-Z])/', '_\1', $attr));
50
+ }
51
+
52
+ private function validAttribute($attr)
53
+ {
54
+ return in_array($attr, $this->validAttributes, true);
55
+ }
56
+
57
+ public function jsonSerialize()
58
+ {
59
+ return $this->record;
60
+ }
61
+ }
vendor/geoip2/geoip2/src/Record/City.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Record;
4
+
5
+ /**
6
+ * City-level data associated with an IP address.
7
+ *
8
+ * This record is returned by all location services and databases besides
9
+ * Country.
10
+ *
11
+ * @property-read int|null $confidence A value from 0-100 indicating MaxMind's
12
+ * confidence that the city is correct. This attribute is only available
13
+ * from the Insights service and the GeoIP2 Enterprise database.
14
+ * @property-read int|null $geonameId The GeoName ID for the city. This attribute
15
+ * is returned by all location services and databases.
16
+ * @property-read string|null $name The name of the city based on the locales list
17
+ * passed to the constructor. This attribute is returned by all location
18
+ * services and databases.
19
+ * @property-read array|null $names A array map where the keys are locale codes
20
+ * and the values are names. This attribute is returned by all location
21
+ * services and databases.
22
+ */
23
+ class City extends AbstractPlaceRecord
24
+ {
25
+ /**
26
+ * @ignore
27
+ */
28
+ protected $validAttributes = ['confidence', 'geonameId', 'names'];
29
+ }
vendor/geoip2/geoip2/src/Record/Continent.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Record;
4
+
5
+ /**
6
+ * Contains data for the continent record associated with an IP address.
7
+ *
8
+ * This record is returned by all location services and databases.
9
+ *
10
+ * @property-read string|null $code A two character continent code like "NA" (North
11
+ * America) or "OC" (Oceania). This attribute is returned by all location
12
+ * services and databases.
13
+ * @property-read int|null $geonameId The GeoName ID for the continent. This
14
+ * attribute is returned by all location services and databases.
15
+ * @property-read string|null $name Returns the name of the continent based on the
16
+ * locales list passed to the constructor. This attribute is returned by all location
17
+ * services and databases.
18
+ * @property-read array|null $names An array map where the keys are locale codes
19
+ * and the values are names. This attribute is returned by all location
20
+ * services and databases.
21
+ */
22
+ class Continent extends AbstractPlaceRecord
23
+ {
24
+ /**
25
+ * @ignore
26
+ */
27
+ protected $validAttributes = [
28
+ 'code',
29
+ 'geonameId',
30
+ 'names',
31
+ ];
32
+ }
vendor/geoip2/geoip2/src/Record/Country.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Record;
4
+
5
+ /**
6
+ * Contains data for the country record associated with an IP address.
7
+ *
8
+ * This record is returned by all location services and databases.
9
+ *
10
+ * @property-read int|null $confidence A value from 0-100 indicating MaxMind's
11
+ * confidence that the country is correct. This attribute is only available
12
+ * from the Insights service and the GeoIP2 Enterprise database.
13
+ * @property-read int|null $geonameId The GeoName ID for the country. This
14
+ * attribute is returned by location services and databases.
15
+ * @property-read string|null $isoCode The
16
+ * {@link * http://en.wikipedia.org/wiki/ISO_3166-1 two-character ISO 3166-1 alpha
17
+ * code} for the country. This attribute is returned by all location services
18
+ * and databases.
19
+ * @property-read string|null $name The name of the country based on the locales
20
+ * list passed to the constructor. This attribute is returned by all location
21
+ * services and databases.
22
+ * @property-read array|null $names An array map where the keys are locale codes
23
+ * and the values are names. This attribute is returned by all location
24
+ * services and databases.
25
+ */
26
+ class Country extends AbstractPlaceRecord
27
+ {
28
+ /**
29
+ * @ignore
30
+ */
31
+ protected $validAttributes = [
32
+ 'confidence',
33
+ 'geonameId',
34
+ 'isoCode',
35
+ 'names',
36
+ ];
37
+ }
vendor/geoip2/geoip2/src/Record/Location.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Record;
4
+
5
+ /**
6
+ * Contains data for the location record associated with an IP address.
7
+ *
8
+ * This record is returned by all location services and databases besides
9
+ * Country.
10
+ *
11
+ * @property-read int|null $averageIncome The average income in US dollars
12
+ * associated with the requested IP address. This attribute is only available
13
+ * from the Insights service.
14
+ * @property-read int|null $accuracyRadius The approximate accuracy radius in
15
+ * kilometers around the latitude and longitude for the IP address. This is
16
+ * the radius where we have a 67% confidence that the device using the IP
17
+ * address resides within the circle centered at the latitude and longitude
18
+ * with the provided radius.
19
+ * @property-read float|null $latitude The approximate latitude of the location
20
+ * associated with the IP address. This value is not precise and should not be
21
+ * used to identify a particular address or household.
22
+ * @property-read float|null $longitude The approximate longitude of the location
23
+ * associated with the IP address. This value is not precise and should not be
24
+ * used to identify a particular address or household.
25
+ * @property-read int|null $populationDensity The estimated population per square
26
+ * kilometer associated with the IP address. This attribute is only available
27
+ * from the Insights service.
28
+ * @property-read int|null $metroCode The metro code of the location if the location
29
+ * is in the US. MaxMind returns the same metro codes as the
30
+ * {@link * https://developers.google.com/adwords/api/docs/appendix/cities-DMAregions
31
+ * Google AdWords API}.
32
+ * @property-read string|null $timeZone The time zone associated with location, as
33
+ * specified by the {@link http://www.iana.org/time-zones IANA Time Zone
34
+ * Database}, e.g., "America/New_York".
35
+ */
36
+ class Location extends AbstractRecord
37
+ {
38
+ /**
39
+ * @ignore
40
+ */
41
+ protected $validAttributes = [
42
+ 'averageIncome',
43
+ 'accuracyRadius',
44
+ 'latitude',
45
+ 'longitude',
46
+ 'metroCode',
47
+ 'populationDensity',
48
+ 'postalCode',
49
+ 'postalConfidence',
50
+ 'timeZone',
51
+ ];
52
+ }
vendor/geoip2/geoip2/src/Record/MaxMind.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Record;
4
+
5
+ /**
6
+ * Contains data about your account.
7
+ *
8
+ * This record is returned by all location services and databases.
9
+ *
10
+ * @property-read int|null $queriesRemaining The number of remaining queries you
11
+ * have for the service you are calling.
12
+ */
13
+ class MaxMind extends AbstractRecord
14
+ {
15
+ /**
16
+ * @ignore
17
+ */
18
+ protected $validAttributes = ['queriesRemaining'];
19
+ }
vendor/geoip2/geoip2/src/Record/Postal.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Record;
4
+
5
+ /**
6
+ * Contains data for the postal record associated with an IP address.
7
+ *
8
+ * This record is returned by all location databases and services besides
9
+ * Country.
10
+ *
11
+ * @property-read string|null $code The postal code of the location. Postal codes
12
+ * are not available for all countries. In some countries, this will only
13
+ * contain part of the postal code. This attribute is returned by all location
14
+ * databases and services besides Country.
15
+ * @property-read int|null $confidence A value from 0-100 indicating MaxMind's
16
+ * confidence that the postal code is correct. This attribute is only
17
+ * available from the Insights service and the GeoIP2 Enterprise
18
+ * database.
19
+ */
20
+ class Postal extends AbstractRecord
21
+ {
22
+ /**
23
+ * @ignore
24
+ */
25
+ protected $validAttributes = ['code', 'confidence'];
26
+ }
vendor/geoip2/geoip2/src/Record/RepresentedCountry.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Record;
4
+
5
+ /**
6
+ * Contains data for the represented country associated with an IP address.
7
+ *
8
+ * This class contains the country-level data associated with an IP address
9
+ * for the IP's represented country. The represented country is the country
10
+ * represented by something like a military base.
11
+ *
12
+ * @property-read int|null $confidence A value from 0-100 indicating MaxMind's
13
+ * confidence that the country is correct. This attribute is only available
14
+ * from the Insights service and the GeoIP2 Enterprise database.
15
+ * @property-read int|null $geonameId The GeoName ID for the country.
16
+ * @property-read string|null $isoCode The {@link http://en.wikipedia.org/wiki/ISO_3166-1
17
+ * two-character ISO 3166-1 alpha code} for the country.
18
+ * @property-read string|null $name The name of the country based on the locales list
19
+ * passed to the constructor.
20
+ * @property-read array|null $names An array map where the keys are locale codes and
21
+ * the values are names.
22
+ * @property-read string|null $type A string indicating the type of entity that is
23
+ * representing the country. Currently we only return <code>military</code>
24
+ * but this could expand to include other types in the future.
25
+ */
26
+ class RepresentedCountry extends Country
27
+ {
28
+ protected $validAttributes = [
29
+ 'confidence',
30
+ 'geonameId',
31
+ 'isoCode',
32
+ 'names',
33
+ 'type',
34
+ ];
35
+ }
vendor/geoip2/geoip2/src/Record/Subdivision.php ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Record;
4
+
5
+ /**
6
+ * Contains data for the subdivisions associated with an IP address.
7
+ *
8
+ * This record is returned by all location databases and services besides
9
+ * Country.
10
+ *
11
+ * @property-read int|null $confidence This is a value from 0-100 indicating
12
+ * MaxMind's confidence that the subdivision is correct. This attribute is
13
+ * only available from the Insights service and the GeoIP2 Enterprise
14
+ * database.
15
+ * @property-read int|null $geonameId This is a GeoName ID for the subdivision.
16
+ * This attribute is returned by all location databases and services besides
17
+ * Country.
18
+ * @property-read string|null $isoCode This is a string up to three characters long
19
+ * contain the subdivision portion of the
20
+ * {@link * http://en.wikipedia.org/wiki/ISO_3166-2 ISO 3166-2 code}. This attribute
21
+ * is returned by all location databases and services except Country.
22
+ * @property-read string|null $name The name of the subdivision based on the
23
+ * locales list passed to the constructor. This attribute is returned by all
24
+ * location databases and services besides Country.
25
+ * @property-read array|null $names An array map where the keys are locale codes
26
+ * and the values are names. This attribute is returned by all location
27
+ * databases and services besides Country.
28
+ */
29
+ class Subdivision extends AbstractPlaceRecord
30
+ {
31
+ /**
32
+ * @ignore
33
+ */
34
+ protected $validAttributes = [
35
+ 'confidence',
36
+ 'geonameId',
37
+ 'isoCode',
38
+ 'names',
39
+ ];
40
+ }
vendor/geoip2/geoip2/src/Record/Traits.php ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\Record;
4
+
5
+ /**
6
+ * Contains data for the traits record associated with an IP address.
7
+ *
8
+ * This record is returned by all location services and databases.
9
+ *
10
+ * @property-read int|null $autonomousSystemNumber The
11
+ * {@link * http://en.wikipedia.org/wiki/Autonomous_system_(Internet) autonomous
12
+ * system number} associated with the IP address. This attribute is only
13
+ * available from the City and Insights web service and the GeoIP2
14
+ * Enterprise database.
15
+ * @property-read string|null $autonomousSystemOrganization The organization
16
+ * associated with the registered {@link * http://en.wikipedia.org/wiki/Autonomous_system_(Internet) autonomous
17
+ * system number} for the IP address. This attribute is only available from
18
+ * the City and Insights web service and the GeoIP2 Enterprise
19
+ * database.
20
+ * @property-read string|null $connectionType The connection type may take the
21
+ * following values: "Dialup", "Cable/DSL", "Corporate", "Cellular".
22
+ * Additional values may be added in the future. This attribute is only
23
+ * available in the GeoIP2 Enterprise database.
24
+ * @property-read string|null $domain The second level domain associated with the
25
+ * IP address. This will be something like "example.com" or "example.co.uk",
26
+ * not "foo.example.com". This attribute is only available from the
27
+ * City and Insights web service and the GeoIP2 Enterprise
28
+ * database.
29
+ * @property-read string $ipAddress The IP address that the data in the model
30
+ * is for. If you performed a "me" lookup against the web service, this
31
+ * will be the externally routable IP address for the system the code is
32
+ * running on. If the system is behind a NAT, this may differ from the IP
33
+ * address locally assigned to it. This attribute is returned by all end
34
+ * points.
35
+ * @property-read bool $isAnonymous This is true if the IP address belongs to
36
+ * any sort of anonymous network. This property is only available from GeoIP2
37
+ * Precision Insights.
38
+ * @property-read bool $isAnonymousProxy *Deprecated.* Please see our
39
+ * {@link * https://www.maxmind.com/en/geoip2-anonymous-ip-database GeoIP2
40
+ * Anonymous IP database} to determine whether the IP address is used by an
41
+ * anonymizing service.
42
+ * @property-read bool $isAnonymousVpn This is true if the IP address belongs to
43
+ * an anonymous VPN system. This property is only available from GeoIP2
44
+ * Precision Insights.
45
+ * @property-read bool $isHostingProvider This is true if the IP address belongs
46
+ * to a hosting provider. This property is only available from GeoIP2
47
+ * Precision Insights.
48
+ * @property-read bool $isLegitimateProxy This attribute is true if MaxMind
49
+ * believes this IP address to be a legitimate proxy, such as an internal
50
+ * VPN used by a corporation. This attribute is only available in the GeoIP2
51
+ * Enterprise database.
52
+ * @property-read bool $isPublicProxy This is true if the IP address belongs to
53
+ * a public proxy. This property is only available from GeoIP2 Precision
54
+ * Insights.
55
+ * @property-read bool $isSatelliteProvider *Deprecated.* Due to the
56
+ * increased coverage by mobile carriers, very few satellite providers now
57
+ * serve multiple countries. As a result, the output does not provide
58
+ * sufficiently relevant data for us to maintain it.
59
+ * @property-read bool $isTorExitNode This is true if the IP address is a Tor
60
+ * exit node. This property is only available from GeoIP2 Precision Insights.
61
+ * @property-read string|null $isp The name of the ISP associated with the IP
62
+ * address. This attribute is only available from the City and Insights web
63
+ * services and the GeoIP2 Enterprise database.
64
+ * @property-read string|null $organization The name of the organization associated
65
+ * with the IP address. This attribute is only available from the City and
66
+ * Insights web services and the GeoIP2 Enterprise database.
67
+ * @property-read string|null $userType <p>The user type associated with the IP
68
+ * address. This can be one of the following values:</p>
69
+ * <ul>
70
+ * <li>business
71
+ * <li>cafe
72
+ * <li>cellular
73
+ * <li>college
74
+ * <li>content_delivery_network
75
+ * <li>dialup
76
+ * <li>government
77
+ * <li>hosting
78
+ * <li>library
79
+ * <li>military
80
+ * <li>residential
81
+ * <li>router
82
+ * <li>school
83
+ * <li>search_engine_spider
84
+ * <li>traveler
85
+ * </ul>
86
+ * <p>
87
+ * This attribute is only available from the Insights web service and the
88
+ * GeoIP2 Enterprise database.
89
+ * </p>
90
+ */
91
+ class Traits extends AbstractRecord
92
+ {
93
+ /**
94
+ * @ignore
95
+ */
96
+ protected $validAttributes = [
97
+ 'autonomousSystemNumber',
98
+ 'autonomousSystemOrganization',
99
+ 'connectionType',
100
+ 'domain',
101
+ 'ipAddress',
102
+ 'isAnonymous',
103
+ 'isAnonymousProxy',
104
+ 'isAnonymousVpn',
105
+ 'isHostingProvider',
106
+ 'isLegitimateProxy',
107
+ 'isp',
108
+ 'isPublicProxy',
109
+ 'isSatelliteProvider',
110
+ 'isTorExitNode',
111
+ 'organization',
112
+ 'userType',
113
+ ];
114
+ }
vendor/geoip2/geoip2/src/WebService/Client.php ADDED
@@ -0,0 +1,239 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace GeoIp2\WebService;
4
+
5
+ use GeoIp2\Exception\AddressNotFoundException;
6
+ use GeoIp2\Exception\AuthenticationException;
7
+ use GeoIp2\Exception\GeoIp2Exception;
8
+ use GeoIp2\Exception\HttpException;
9
+ use GeoIp2\Exception\InvalidRequestException;
10
+ use GeoIp2\Exception\OutOfQueriesException;
11
+ use GeoIp2\ProviderInterface;
12
+ use MaxMind\WebService\Client as WsClient;
13
+
14
+ /**
15
+ * This class provides a client API for all the GeoIP2 Precision web services.
16
+ * The services are Country, City, and Insights. Each service returns a
17
+ * different set of data about an IP address, with Country returning the
18
+ * least data and Insights the most.
19
+ *
20
+ * Each web service is represented by a different model class, and these model
21
+ * classes in turn contain multiple record classes. The record classes have
22
+ * attributes which contain data about the IP address.
23
+ *
24
+ * If the web service does not return a particular piece of data for an IP
25
+ * address, the associated attribute is not populated.
26
+ *
27
+ * The web service may not return any information for an entire record, in
28
+ * which case all of the attributes for that record class will be empty.
29
+ *
30
+ * ## Usage ##
31
+ *
32
+ * The basic API for this class is the same for all of the web service end
33
+ * points. First you create a web service object with your MaxMind `$userId`
34
+ * and `$licenseKey`, then you call the method corresponding to a specific end
35
+ * point, passing it the IP address you want to look up.
36
+ *
37
+ * If the request succeeds, the method call will return a model class for
38
+ * the service you called. This model in turn contains multiple record
39
+ * classes, each of which represents part of the data returned by the web
40
+ * service.
41
+ *
42
+ * If the request fails, the client class throws an exception.
43
+ */
44
+ class Client implements ProviderInterface
45
+ {
46
+ private $locales;
47
+ private $client;
48
+ private static $basePath = '/geoip/v2.1';
49
+
50
+ const VERSION = 'v2.7.0';
51
+
52
+ /**
53
+ * Constructor.
54
+ *
55
+ * @param int $userId your MaxMind user ID
56
+ * @param string $licenseKey your MaxMind license key
57
+ * @param array $locales list of locale codes to use in name property
58
+ * from most preferred to least preferred
59
+ * @param array $options array of options. Valid options include:
60
+ * * `host` - The host to use when querying the web service.
61
+ * * `timeout` - Timeout in seconds.
62
+ * * `connectTimeout` - Initial connection timeout in seconds.
63
+ * * `proxy` - The HTTP proxy to use. May include a schema, port,
64
+ * username, and password, e.g.,
65
+ * `http://username:password@127.0.0.1:10`.
66
+ */
67
+ public function __construct(
68
+ $userId,
69
+ $licenseKey,
70
+ $locales = ['en'],
71
+ $options = []
72
+ ) {
73
+ $this->locales = $locales;
74
+
75
+ // This is for backwards compatibility. Do not remove except for a
76
+ // major version bump.
77
+ if (is_string($options)) {
78
+ $options = ['host' => $options];
79
+ }
80
+
81
+ if (!isset($options['host'])) {
82
+ $options['host'] = 'geoip.maxmind.com';
83
+ }
84
+
85
+ $options['userAgent'] = $this->userAgent();
86
+
87
+ $this->client = new WsClient($userId, $licenseKey, $options);
88
+ }
89
+
90
+ private function userAgent()
91
+ {
92
+ return 'GeoIP2-API/' . self::VERSION;
93
+ }
94
+
95
+ /**
96
+ * This method calls the GeoIP2 Precision: City service.
97
+ *
98
+ * @param string $ipAddress IPv4 or IPv6 address as a string. If no
99
+ * address is provided, the address that the web service is called
100
+ * from will be used.
101
+ *
102
+ * @throws \GeoIp2\Exception\AddressNotFoundException if the address you
103
+ * provided is not in our database (e.g., a private address).
104
+ * @throws \GeoIp2\Exception\AuthenticationException if there is a problem
105
+ * with the user ID or license key that you provided
106
+ * @throws \GeoIp2\Exception\OutOfQueriesException if your account is out
107
+ * of queries
108
+ * @throws \GeoIp2\Exception\InvalidRequestException} if your request was received by the web service but is
109
+ * invalid for some other reason. This may indicate an issue
110
+ * with this API. Please report the error to MaxMind.
111
+ * @throws \GeoIp2\Exception\HttpException if an unexpected HTTP error code or message was returned.
112
+ * This could indicate a problem with the connection between
113
+ * your server and the web service or that the web service
114
+ * returned an invalid document or 500 error code.
115
+ * @throws \GeoIp2\Exception\GeoIp2Exception This serves as the parent
116
+ * class to the above exceptions. It will be thrown directly
117
+ * if a 200 status code is returned but the body is invalid.
118
+ *
119
+ * @return \GeoIp2\Model\City
120
+ */
121
+ public function city($ipAddress = 'me')
122
+ {
123
+ return $this->responseFor('city', 'City', $ipAddress);
124
+ }
125
+
126
+ /**
127
+ * This method calls the GeoIP2 Precision: Country service.
128
+ *
129
+ * @param string $ipAddress IPv4 or IPv6 address as a string. If no
130
+ * address is provided, the address that the web service is called
131
+ * from will be used.
132
+ *
133
+ * @throws \GeoIp2\Exception\AddressNotFoundException if the address you provided is not in our database (e.g.,
134
+ * a private address).
135
+ * @throws \GeoIp2\Exception\AuthenticationException if there is a problem
136
+ * with the user ID or license key that you provided
137
+ * @throws \GeoIp2\Exception\OutOfQueriesException if your account is out of queries
138
+ * @throws \GeoIp2\Exception\InvalidRequestException} if your request was received by the web service but is
139
+ * invalid for some other reason. This may indicate an
140
+ * issue with this API. Please report the error to MaxMind.
141
+ * @throws \GeoIp2\Exception\HttpException if an unexpected HTTP error
142
+ * code or message was returned. This could indicate a problem
143
+ * with the connection between your server and the web service
144
+ * or that the web service returned an invalid document or 500
145
+ * error code.
146
+ * @throws \GeoIp2\Exception\GeoIp2Exception This serves as the parent class to the above exceptions. It
147
+ * will be thrown directly if a 200 status code is returned but
148
+ * the body is invalid.
149
+ *
150
+ * @return \GeoIp2\Model\Country
151
+ */
152
+ public function country($ipAddress = 'me')
153
+ {
154
+ return $this->responseFor('country', 'Country', $ipAddress);
155
+ }
156
+
157
+ /**
158
+ * This method calls the GeoIP2 Precision: Insights service.
159
+ *
160
+ * @param string $ipAddress IPv4 or IPv6 address as a string. If no
161
+ * address is provided, the address that the web service is called
162
+ * from will be used.
163
+ *
164
+ * @throws \GeoIp2\Exception\AddressNotFoundException if the address you
165
+ * provided is not in our database (e.g., a private address).
166
+ * @throws \GeoIp2\Exception\AuthenticationException if there is a problem
167
+ * with the user ID or license key that you provided
168
+ * @throws \GeoIp2\Exception\OutOfQueriesException if your account is out
169
+ * of queries
170
+ * @throws \GeoIp2\Exception\InvalidRequestException} if your request was received by the web service but is
171
+ * invalid for some other reason. This may indicate an
172
+ * issue with this API. Please report the error to MaxMind.
173
+ * @throws \GeoIp2\Exception\HttpException if an unexpected HTTP error code or message was returned.
174
+ * This could indicate a problem with the connection between
175
+ * your server and the web service or that the web service
176
+ * returned an invalid document or 500 error code.
177
+ * @throws \GeoIp2\Exception\GeoIp2Exception This serves as the parent
178
+ * class to the above exceptions. It will be thrown directly
179
+ * if a 200 status code is returned but the body is invalid.
180
+ *
181
+ * @return \GeoIp2\Model\Insights
182
+ */
183
+ public function insights($ipAddress = 'me')
184
+ {
185
+ return $this->responseFor('insights', 'Insights', $ipAddress);
186
+ }
187
+
188
+ private function responseFor($endpoint, $class, $ipAddress)
189
+ {
190
+ $path = implode('/', [self::$basePath, $endpoint, $ipAddress]);
191
+
192
+ try {
193
+ $body = $this->client->get('GeoIP2 ' . $class, $path);
194
+ } catch (\MaxMind\Exception\IpAddressNotFoundException $ex) {
195
+ throw new AddressNotFoundException(
196
+ $ex->getMessage(),
197
+ $ex->getStatusCode(),
198
+ $ex
199
+ );
200
+ } catch (\MaxMind\Exception\AuthenticationException $ex) {
201
+ throw new AuthenticationException(
202
+ $ex->getMessage(),
203
+ $ex->getStatusCode(),
204
+ $ex
205
+ );
206
+ } catch (\MaxMind\Exception\InsufficientFundsException $ex) {
207
+ throw new OutOfQueriesException(
208
+ $ex->getMessage(),
209
+ $ex->getStatusCode(),
210
+ $ex
211
+ );
212
+ } catch (\MaxMind\Exception\InvalidRequestException $ex) {
213
+ throw new InvalidRequestException(
214
+ $ex->getMessage(),
215
+ $ex->getErrorCode(),
216
+ $ex->getStatusCode(),
217
+ $ex->getUri(),
218
+ $ex
219
+ );
220
+ } catch (\MaxMind\Exception\HttpException $ex) {
221
+ throw new HttpException(
222
+ $ex->getMessage(),
223
+ $ex->getStatusCode(),
224
+ $ex->getUri(),
225
+ $ex
226
+ );
227
+ } catch (\MaxMind\Exception\WebServiceException $ex) {
228
+ throw new GeoIp2Exception(
229
+ $ex->getMessage(),
230
+ $ex->getCode(),
231
+ $ex
232
+ );
233
+ }
234
+
235
+ $class = 'GeoIp2\\Model\\' . $class;
236
+
237
+ return new $class($body, $this->locales);
238
+ }
239
+ }
vendor/maxmind-db/reader/CHANGELOG.md ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ CHANGELOG
2
+ =========
3
+
4
+ 1.2.0 (2017-10-27)
5
+ ------------------
6
+
7
+ * PHP 5.4 is now required.
8
+ * The `Reader` class for the `maxminddb` extension is no longer final.
9
+ This was change to match the behavior of the pure PHP class.
10
+ Reported and fixed by venyii. GitHub #52 & #54.
11
+
12
+ 1.1.3 (2017-01-19)
13
+ ------------------
14
+
15
+ * Fix incorrect version in `ext/php_maxminddb.h`. GitHub #48.
16
+
17
+ 1.1.2 (2016-11-22)
18
+ ------------------
19
+
20
+ * Searching for database metadata only occurs within the last 128KB
21
+ (128 * 1024 bytes) of the file, speeding detection of corrupt
22
+ datafiles. Reported by Eric Teubert. GitHub #42.
23
+ * Suggest relevant extensions when installing with Composer. GitHub #37.
24
+
25
+ 1.1.1 (2016-09-15)
26
+ ------------------
27
+
28
+ * Development files were added to the `.gitattributes` as `export-ignore` so
29
+ that they are not part of the Composer release. Pull request by Michele
30
+ Locati. GitHub #39.
31
+
32
+ 1.1.0 (2016-01-04)
33
+ ------------------
34
+
35
+ * The MaxMind DB extension now supports PHP 7. Pull request by John Boehr.
36
+ GitHub #27.
37
+
38
+ 1.0.3 (2015-03-13)
39
+ ------------------
40
+
41
+ * All uses of `strlen` were removed. This should prevent issues in situations
42
+ where the function is overloaded or otherwise broken.
43
+
44
+ 1.0.2 (2015-01-19)
45
+ ------------------
46
+
47
+ * Previously the MaxMind DB extension would cause a segfault if the Reader
48
+ object's destructor was called without first having called the constructor.
49
+ (Reported by Matthias Saou & Juan Peri. GitHub #20.)
50
+
51
+ 1.0.1 (2015-01-12)
52
+ ------------------
53
+
54
+ * In the last several releases, the version number in the extension was
55
+ incorrect. This release is being done to correct it. No other code changes
56
+ are included.
57
+
58
+ 1.0.0 (2014-09-22)
59
+ ------------------
60
+
61
+ * First production release.
62
+ * In the pure PHP reader, a string length test after `fread()` was replaced
63
+ with the difference between the start pointer and the end pointer. This
64
+ provided a 15% speed increase.
65
+
66
+ 0.3.3 (2014-09-15)
67
+ ------------------
68
+
69
+ * Clarified behavior of 128-bit type in documentation.
70
+ * Updated phpunit and fixed some test breakage from the newer version.
71
+
72
+ 0.3.2 (2014-09-10)
73
+ ------------------
74
+
75
+ * Fixed invalid reference to global class RuntimeException from namespaced
76
+ code. Fixed by Steven Don. GitHub issue #15.
77
+ * Additional documentation of `Metadata` class as well as misc. documentation
78
+ cleanup.
79
+
80
+ 0.3.1 (2014-05-01)
81
+ ------------------
82
+
83
+ * The API now works when `mbstring.func_overload` is set.
84
+ * BCMath is no longer required. If the decoder encounters a big integer,
85
+ it will try to use GMP and then BCMath. If both of those fail, it will
86
+ throw an exception. No databases released by MaxMind currently use big
87
+ integers.
88
+ * The API now officially supports HHVM when using the pure PHP reader.
89
+
90
+ 0.3.0 (2014-02-19)
91
+ ------------------
92
+
93
+ * This API is now licensed under the Apache License, Version 2.0.
94
+ * The code for the C extension was cleaned up, fixing several potential
95
+ issues.
96
+
97
+ 0.2.0 (2013-10-21)
98
+ ------------------
99
+
100
+ * Added optional C extension for using libmaxminddb in place of the pure PHP
101
+ reader.
102
+ * Significantly improved error handling in pure PHP reader.
103
+ * Improved performance for IPv4 lookups in an IPv6 database.
104
+
105
+ 0.1.0 (2013-07-16)
106
+ ------------------
107
+
108
+ * Initial release
vendor/maxmind-db/reader/LICENSE ADDED
@@ -0,0 +1,202 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ Apache License
3
+ Version 2.0, January 2004
4
+ http://www.apache.org/licenses/
5
+
6
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7
+
8
+ 1. Definitions.
9
+
10
+ "License" shall mean the terms and conditions for use, reproduction,
11
+ and distribution as defined by Sections 1 through 9 of this document.
12
+
13
+ "Licensor" shall mean the copyright owner or entity authorized by
14
+ the copyright owner that is granting the License.
15
+
16
+ "Legal Entity" shall mean the union of the acting entity and all
17
+ other entities that control, are controlled by, or are under common
18
+ control with that entity. For the purposes of this definition,
19
+ "control" means (i) the power, direct or indirect, to cause the
20
+ direction or management of such entity, whether by contract or
21
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
22
+ outstanding shares, or (iii) beneficial ownership of such entity.
23
+
24
+ "You" (or "Your") shall mean an individual or Legal Entity
25
+ exercising permissions granted by this License.
26
+
27
+ "Source" form shall mean the preferred form for making modifications,
28
+ including but not limited to software source code, documentation
29
+ source, and configuration files.
30
+
31
+ "Object" form shall mean any form resulting from mechanical
32
+ transformation or translation of a Source form, including but
33
+ not limited to compiled object code, generated documentation,
34
+ and conversions to other media types.
35
+
36
+ "Work" shall mean the work of authorship, whether in Source or
37
+ Object form, made available under the License, as indicated by a
38
+ copyright notice that is included in or attached to the work
39
+ (an example is provided in the Appendix below).
40
+
41
+ "Derivative Works" shall mean any work, whether in Source or Object
42
+ form, that is based on (or derived from) the Work and for which the
43
+ editorial revisions, annotations, elaborations, or other modifications
44
+ represent, as a whole, an original work of authorship. For the purposes
45
+ of this License, Derivative Works shall not include works that remain
46
+ separable from, or merely link (or bind by name) to the interfaces of,
47
+ the Work and Derivative Works thereof.
48
+
49
+ "Contribution" shall mean any work of authorship, including
50
+ the original version of the Work and any modifications or additions
51
+ to that Work or Derivative Works thereof, that is intentionally
52
+ submitted to Licensor for inclusion in the Work by the copyright owner
53
+ or by an individual or Legal Entity authorized to submit on behalf of
54
+ the copyright owner. For the purposes of this definition, "submitted"
55
+ means any form of electronic, verbal, or written communication sent
56
+ to the Licensor or its representatives, including but not limited to
57
+ communication on electronic mailing lists, source code control systems,
58
+ and issue tracking systems that are managed by, or on behalf of, the
59
+ Licensor for the purpose of discussing and improving the Work, but
60
+ excluding communication that is conspicuously marked or otherwise
61
+ designated in writing by the copyright owner as "Not a Contribution."
62
+
63
+ "Contributor" shall mean Licensor and any individual or Legal Entity
64
+ on behalf of whom a Contribution has been received by Licensor and
65
+ subsequently incorporated within the Work.
66
+
67
+ 2. Grant of Copyright License. Subject to the terms and conditions of
68
+ this License, each Contributor hereby grants to You a perpetual,
69
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70
+ copyright license to reproduce, prepare Derivative Works of,
71
+ publicly display, publicly perform, sublicense, and distribute the
72
+ Work and such Derivative Works in Source or Object form.
73
+
74
+ 3. Grant of Patent License. Subject to the terms and conditions of
75
+ this License, each Contributor hereby grants to You a perpetual,
76
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77
+ (except as stated in this section) patent license to make, have made,
78
+ use, offer to sell, sell, import, and otherwise transfer the Work,
79
+ where such license applies only to those patent claims licensable
80
+ by such Contributor that are necessarily infringed by their
81
+ Contribution(s) alone or by combination of their Contribution(s)
82
+ with the Work to which such Contribution(s) was submitted. If You
83
+ institute patent litigation against any entity (including a
84
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
85
+ or a Contribution incorporated within the Work constitutes direct
86
+ or contributory patent infringement, then any patent licenses
87
+ granted to You under this License for that Work shall terminate
88
+ as of the date such litigation is filed.
89
+
90
+ 4. Redistribution. You may reproduce and distribute copies of the
91
+ Work or Derivative Works thereof in any medium, with or without
92
+ modifications, and in Source or Object form, provided that You
93
+ meet the following conditions:
94
+
95
+ (a) You must give any other recipients of the Work or
96
+ Derivative Works a copy of this License; and
97
+
98
+ (b) You must cause any modified files to carry prominent notices
99
+ stating that You changed the files; and
100
+
101
+ (c) You must retain, in the Source form of any Derivative Works
102
+ that You distribute, all copyright, patent, trademark, and
103
+ attribution notices from the Source form of the Work,
104
+ excluding those notices that do not pertain to any part of
105
+ the Derivative Works; and
106
+
107
+ (d) If the Work includes a "NOTICE" text file as part of its
108
+ distribution, then any Derivative Works that You distribute must
109
+ include a readable copy of the attribution notices contained
110
+ within such NOTICE file, excluding those notices that do not
111
+ pertain to any part of the Derivative Works, in at least one
112
+ of the following places: within a NOTICE text file distributed
113
+ as part of the Derivative Works; within the Source form or
114
+ documentation, if provided along with the Derivative Works; or,
115
+ within a display generated by the Derivative Works, if and
116
+ wherever such third-party notices normally appear. The contents
117
+ of the NOTICE file are for informational purposes only and
118
+ do not modify the License. You may add Your own attribution
119
+ notices within Derivative Works that You distribute, alongside
120
+ or as an addendum to the NOTICE text from the Work, provided
121
+ that such additional attribution notices cannot be construed
122
+ as modifying the License.
123
+
124
+ You may add Your own copyright statement to Your modifications and
125
+ may provide additional or different license terms and conditions
126
+ for use, reproduction, or distribution of Your modifications, or
127
+ for any such Derivative Works as a whole, provided Your use,
128
+ reproduction, and distribution of the Work otherwise complies with
129
+ the conditions stated in this License.
130
+
131
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
132
+ any Contribution intentionally submitted for inclusion in the Work
133
+ by You to the Licensor shall be under the terms and conditions of
134
+ this License, without any additional terms or conditions.
135
+ Notwithstanding the above, nothing herein shall supersede or modify
136
+ the terms of any separate license agreement you may have executed
137
+ with Licensor regarding such Contributions.
138
+
139
+ 6. Trademarks. This License does not grant permission to use the trade
140
+ names, trademarks, service marks, or product names of the Licensor,
141
+ except as required for reasonable and customary use in describing the
142
+ origin of the Work and reproducing the content of the NOTICE file.
143
+
144
+ 7. Disclaimer of Warranty. Unless required by applicable law or
145
+ agreed to in writing, Licensor provides the Work (and each
146
+ Contributor provides its Contributions) on an "AS IS" BASIS,
147
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148
+ implied, including, without limitation, any warranties or conditions
149
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150
+ PARTICULAR PURPOSE. You are solely responsible for determining the
151
+ appropriateness of using or redistributing the Work and assume any
152
+ risks associated with Your exercise of permissions under this License.
153
+
154
+ 8. Limitation of Liability. In no event and under no legal theory,
155
+ whether in tort (including negligence), contract, or otherwise,
156
+ unless required by applicable law (such as deliberate and grossly
157
+ negligent acts) or agreed to in writing, shall any Contributor be
158
+ liable to You for damages, including any direct, indirect, special,
159
+ incidental, or consequential damages of any character arising as a
160
+ result of this License or out of the use or inability to use the
161
+ Work (including but not limited to damages for loss of goodwill,
162
+ work stoppage, computer failure or malfunction, or any and all
163
+ other commercial damages or losses), even if such Contributor
164
+ has been advised of the possibility of such damages.
165
+
166
+ 9. Accepting Warranty or Additional Liability. While redistributing
167
+ the Work or Derivative Works thereof, You may choose to offer,
168
+ and charge a fee for, acceptance of support, warranty, indemnity,
169
+ or other liability obligations and/or rights consistent with this
170
+ License. However, in accepting such obligations, You may act only
171
+ on Your own behalf and on Your sole responsibility, not on behalf
172
+ of any other Contributor, and only if You agree to indemnify,
173
+ defend, and hold each Contributor harmless for any liability
174
+ incurred by, or claims asserted against, such Contributor by reason
175
+ of your accepting any such warranty or additional liability.
176
+
177
+ END OF TERMS AND CONDITIONS
178
+
179
+ APPENDIX: How to apply the Apache License to your work.
180
+
181
+ To apply the Apache License to your work, attach the following
182
+ boilerplate notice, with the fields enclosed by brackets "[]"
183
+ replaced with your own identifying information. (Don't include
184
+ the brackets!) The text should be enclosed in the appropriate
185
+ comment syntax for the file format. We also recommend that a
186
+ file or class name and description of purpose be included on the
187
+ same "printed page" as the copyright notice for easier
188
+ identification within third-party archives.
189
+
190
+ Copyright [yyyy] [name of copyright owner]
191
+
192
+ Licensed under the Apache License, Version 2.0 (the "License");
193
+ you may not use this file except in compliance with the License.
194
+ You may obtain a copy of the License at
195
+
196
+ http://www.apache.org/licenses/LICENSE-2.0
197
+
198
+ Unless required by applicable law or agreed to in writing, software
199
+ distributed under the License is distributed on an "AS IS" BASIS,
200
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201
+ See the License for the specific language governing permissions and
202
+ limitations under the License.
vendor/maxmind-db/reader/README.md ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # MaxMind DB Reader PHP API #
2
+
3
+ ## Description ##
4
+
5
+ This is the PHP API for reading MaxMind DB files. MaxMind DB is a binary file
6
+ format that stores data indexed by IP address subnets (IPv4 or IPv6).
7
+
8
+ ## Installation ##
9
+
10
+ We recommend installing this package with [Composer](http://getcomposer.org/).
11
+
12
+ ### Download Composer ###
13
+
14
+ To download Composer, run in the root directory of your project:
15
+
16
+ ```bash
17
+ curl -sS https://getcomposer.org/installer | php
18
+ ```
19
+
20
+ You should now have the file `composer.phar` in your project directory.
21
+
22
+ ### Install Dependencies ###
23
+
24
+ Run in your project root:
25
+
26
+ ```
27
+ php composer.phar require maxmind-db/reader:~1.0
28
+ ```
29
+
30
+ You should now have the files `composer.json` and `composer.lock` as well as
31
+ the directory `vendor` in your project directory. If you use a version control
32
+ system, `composer.json` should be added to it.
33
+
34
+ ### Require Autoloader ###
35
+
36
+ After installing the dependencies, you need to require the Composer autoloader
37
+ from your code:
38
+
39
+ ```php
40
+ require 'vendor/autoload.php';
41
+ ```
42
+
43
+ ## Usage ##
44
+
45
+ ## Example ##
46
+
47
+ ```php
48
+ <?php
49
+ require_once 'vendor/autoload.php';
50
+
51
+ use MaxMind\Db\Reader;
52
+
53
+ $ipAddress = '24.24.24.24';
54
+ $databaseFile = 'GeoIP2-City.mmdb';
55
+
56
+ $reader = new Reader($databaseFile);
57
+
58
+ print_r($reader->get($ipAddress));
59
+
60
+ $reader->close();
61
+ ```
62
+
63
+ ## Optional PHP C Extension ##
64
+
65
+ MaxMind provides an optional C extension that is a drop-in replacement for
66
+ `MaxMind\Db\Reader`. In order to use this extension, you must install the
67
+ Reader API as described above and install the extension as described below. If
68
+ you are using an autoloader, no changes to your code should be necessary.
69
+
70
+ ### Installing Extension ###
71
+
72
+ First install [libmaxminddb](https://github.com/maxmind/libmaxminddb) as
73
+ described in its [README.md
74
+ file](https://github.com/maxmind/libmaxminddb/blob/master/README.md#installing-from-a-tarball).
75
+ After successfully installing libmaxmindb, run the following commands from the
76
+ top-level directory of this distribution:
77
+
78
+ ```
79
+ cd ext
80
+ phpize
81
+ ./configure
82
+ make
83
+ make test
84
+ sudo make install
85
+ ```
86
+
87
+ You then must load your extension. The recommend method is to add the
88
+ following to your `php.ini` file:
89
+
90
+ ```
91
+ extension=maxminddb.so
92
+ ```
93
+
94
+ Note: You may need to install the PHP development package on your OS such as
95
+ php5-dev for Debian-based systems or php-devel for RedHat/Fedora-based ones.
96
+
97
+ ## 128-bit Integer Support ##
98
+
99
+ The MaxMind DB format includes 128-bit unsigned integer as a type. Although
100
+ no MaxMind-distributed database currently makes use of this type, both the
101
+ pure PHP reader and the C extension support this type. The pure PHP reader
102
+ requires gmp or bcmath to read databases with 128-bit unsigned integers.
103
+
104
+ The integer is currently returned as a hexadecimal string (prefixed with "0x")
105
+ by the C extension and a decimal string (no prefix) by the pure PHP reader.
106
+ Any change to make the reader implementations always return either a
107
+ hexadecimal or decimal representation of the integer will NOT be considered a
108
+ breaking change.
109
+
110
+ ## Support ##
111
+
112
+ Please report all issues with this code using the [GitHub issue tracker]
113
+ (https://github.com/maxmind/MaxMind-DB-Reader-php/issues).
114
+
115
+ If you are having an issue with a MaxMind service that is not specific to the
116
+ client API, please see [our support page](http://www.maxmind.com/en/support).
117
+
118
+ ## Requirements ##
119
+
120
+ This library requires PHP 5.4 or greater. The pure PHP reader included with
121
+ this library works and is tested with HHVM.
122
+
123
+ The GMP or BCMath extension may be required to read some databases
124
+ using the pure PHP API.
125
+
126
+ ## Contributing ##
127
+
128
+ Patches and pull requests are encouraged. All code should follow the PSR-1 and
129
+ PSR-2 style guidelines. Please include unit tests whenever possible.
130
+
131
+ ## Versioning ##
132
+
133
+ The MaxMind DB Reader PHP API uses [Semantic Versioning](http://semver.org/).
134
+
135
+ ## Copyright and License ##
136
+
137
+ This software is Copyright (c) 2014-2017 by MaxMind, Inc.
138
+
139
+ This is free software, licensed under the Apache License, Version 2.0.
vendor/maxmind-db/reader/composer.json ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "maxmind-db/reader",
3
+ "description": "MaxMind DB Reader API",
4
+ "keywords": ["database", "geoip", "geoip2", "geolocation", "maxmind"],
5
+ "homepage": "https://github.com/maxmind/MaxMind-DB-Reader-php",
6
+ "type": "library",
7
+ "license": "Apache-2.0",
8
+ "authors": [
9
+ {
10
+ "name": "Gregory J. Oschwald",
11
+ "email": "goschwald@maxmind.com",
12
+ "homepage": "http://www.maxmind.com/"
13
+ }
14
+ ],
15
+ "require": {
16
+ "php": ">=5.4"
17
+ },
18
+ "suggest": {
19
+ "ext-bcmath": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
20
+ "ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
21
+ "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups"
22
+ },
23
+ "require-dev": {
24
+ "friendsofphp/php-cs-fixer": "2.*",
25
+ "phpunit/phpunit": "4.*",
26
+ "satooshi/php-coveralls": "1.0.*",
27
+ "squizlabs/php_codesniffer": "3.*"
28
+ },
29
+ "autoload": {
30
+ "psr-4": {
31
+ "MaxMind\\Db\\": "src/MaxMind/Db"
32
+ }
33
+ }
34
+ }
vendor/maxmind-db/reader/ext/config.m4 ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ PHP_ARG_WITH(maxminddb,
2
+ [Whether to enable the MaxMind DB Reader extension],
3
+ [ --with-maxminddb Enable MaxMind DB Reader extension support])
4
+
5
+ PHP_ARG_ENABLE(maxminddb-debug, for MaxMind DB debug support,
6
+ [ --enable-maxminddb-debug Enable enable MaxMind DB deubg support], no, no)
7
+
8
+ if test $PHP_MAXMINDDB != "no"; then
9
+ PHP_CHECK_LIBRARY(maxminddb, MMDB_open)
10
+
11
+ if test $PHP_MAXMINDDB_DEBUG != "no"; then
12
+ CFLAGS="$CFLAGS -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Werror"
13
+ fi
14
+
15
+ PHP_ADD_LIBRARY(maxminddb, 1, MAXMINDDB_SHARED_LIBADD)
16
+ PHP_SUBST(MAXMINDDB_SHARED_LIBADD)
17
+
18
+ PHP_NEW_EXTENSION(maxminddb, maxminddb.c, $ext_shared)
19
+ fi
vendor/maxmind-db/reader/ext/maxminddb.c ADDED
@@ -0,0 +1,564 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* MaxMind, Inc., licenses this file to you under the Apache License, Version
2
+ * 2.0 (the "License"); you may not use this file except in compliance with
3
+ * the License. You may obtain a copy of the License at
4
+ *
5
+ * http://www.apache.org/licenses/LICENSE-2.0
6
+ *
7
+ * Unless required by applicable law or agreed to in writing, software
8
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10
+ * License for the specific language governing permissions and limitations
11
+ * under the License.
12
+ */
13
+
14
+ #include "php_maxminddb.h"
15
+
16
+ #ifdef HAVE_CONFIG_H
17
+ #include "config.h"
18
+ #endif
19
+
20
+ #include <php.h>
21
+ #include <zend.h>
22
+ #include "Zend/zend_exceptions.h"
23
+ #include <maxminddb.h>
24
+
25
+ #ifdef ZTS
26
+ #include <TSRM.h>
27
+ #endif
28
+
29
+ #define __STDC_FORMAT_MACROS
30
+ #include <inttypes.h>
31
+
32
+ #define PHP_MAXMINDDB_NS ZEND_NS_NAME("MaxMind", "Db")
33
+ #define PHP_MAXMINDDB_READER_NS ZEND_NS_NAME(PHP_MAXMINDDB_NS, "Reader")
34
+ #define PHP_MAXMINDDB_READER_EX_NS \
35
+ ZEND_NS_NAME(PHP_MAXMINDDB_READER_NS, \
36
+ "InvalidDatabaseException")
37
+
38
+ #ifdef ZEND_ENGINE_3
39
+ #define Z_MAXMINDDB_P(zv) php_maxminddb_fetch_object(Z_OBJ_P(zv))
40
+ #define _ZVAL_STRING ZVAL_STRING
41
+ #define _ZVAL_STRINGL ZVAL_STRINGL
42
+ typedef size_t strsize_t;
43
+ typedef zend_object free_obj_t;
44
+ #else
45
+ #define Z_MAXMINDDB_P(zv) (maxminddb_obj *) zend_object_store_get_object(zv TSRMLS_CC)
46
+ #define _ZVAL_STRING(a, b) ZVAL_STRING(a, b, 1)
47
+ #define _ZVAL_STRINGL(a, b, c) ZVAL_STRINGL(a, b, c, 1)
48
+ typedef int strsize_t;
49
+ typedef void free_obj_t;
50
+ #endif
51
+
52
+ #ifdef ZEND_ENGINE_3
53
+ typedef struct _maxminddb_obj {
54
+ MMDB_s *mmdb;
55
+ zend_object std;
56
+ } maxminddb_obj;
57
+ #else
58
+ typedef struct _maxminddb_obj {
59
+ zend_object std;
60
+ MMDB_s *mmdb;
61
+ } maxminddb_obj;
62
+ #endif
63
+
64
+ PHP_FUNCTION(maxminddb);
65
+
66
+ static const MMDB_entry_data_list_s *handle_entry_data_list(
67
+ const MMDB_entry_data_list_s *entry_data_list,
68
+ zval *z_value
69
+ TSRMLS_DC);
70
+ static const MMDB_entry_data_list_s *handle_array(
71
+ const MMDB_entry_data_list_s *entry_data_list,
72
+ zval *z_value TSRMLS_DC);
73
+ static const MMDB_entry_data_list_s *handle_map(
74
+ const MMDB_entry_data_list_s *entry_data_list,
75
+ zval *z_value TSRMLS_DC);
76
+ static void handle_uint128(const MMDB_entry_data_list_s *entry_data_list,
77
+ zval *z_value TSRMLS_DC);
78
+ static void handle_uint64(const MMDB_entry_data_list_s *entry_data_list,
79
+ zval *z_value TSRMLS_DC);
80
+ static zend_class_entry * lookup_class(const char *name TSRMLS_DC);
81
+
82
+ #define CHECK_ALLOCATED(val) \
83
+ if (!val ) { \
84
+ zend_error(E_ERROR, "Out of memory"); \
85
+ return; \
86
+ } \
87
+
88
+ #define THROW_EXCEPTION(name, ... ) \
89
+ { \
90
+ zend_class_entry *exception_ce = lookup_class(name TSRMLS_CC); \
91
+ zend_throw_exception_ex(exception_ce, 0 TSRMLS_CC, __VA_ARGS__); \
92
+ } \
93
+
94
+
95
+ #if PHP_VERSION_ID < 50399
96
+ #define object_properties_init(zo, class_type) \
97
+ { \
98
+ zval *tmp; \
99
+ zend_hash_copy((*zo).properties, \
100
+ &class_type->default_properties, \
101
+ (copy_ctor_func_t)zval_add_ref, \
102
+ (void *)&tmp, \
103
+ sizeof(zval *)); \
104
+ }
105
+ #endif
106
+
107
+ static zend_object_handlers maxminddb_obj_handlers;
108
+ static zend_class_entry *maxminddb_ce;
109
+
110
+ static inline maxminddb_obj *php_maxminddb_fetch_object(zend_object *obj TSRMLS_DC){
111
+ #ifdef ZEND_ENGINE_3
112
+ return (maxminddb_obj *)((char*)(obj) - XtOffsetOf(maxminddb_obj, std));
113
+ #else
114
+ return (maxminddb_obj *)obj;
115
+ #endif
116
+ }
117
+
118
+ PHP_METHOD(MaxMind_Db_Reader, __construct){
119
+ char *db_file = NULL;
120
+ strsize_t name_len;
121
+ zval * _this_zval = NULL;
122
+
123
+ if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os",
124
+ &_this_zval, maxminddb_ce, &db_file, &name_len) == FAILURE) {
125
+ THROW_EXCEPTION("InvalidArgumentException",
126
+ "The constructor takes exactly one argument.");
127
+ return;
128
+ }
129
+
130
+ if (0 != access(db_file, R_OK)) {
131
+ THROW_EXCEPTION("InvalidArgumentException",
132
+ "The file \"%s\" does not exist or is not readable.",
133
+ db_file);
134
+ return;
135
+ }
136
+
137
+ MMDB_s *mmdb = (MMDB_s *)emalloc(sizeof(MMDB_s));
138
+ uint16_t status = MMDB_open(db_file, MMDB_MODE_MMAP, mmdb);
139
+
140
+ if (MMDB_SUCCESS != status) {
141
+ THROW_EXCEPTION(
142
+ PHP_MAXMINDDB_READER_EX_NS,
143
+ "Error opening database file (%s). Is this a valid MaxMind DB file?",
144
+ db_file);
145
+ efree(mmdb);
146
+ return;
147
+ }
148
+
149
+ maxminddb_obj *mmdb_obj = Z_MAXMINDDB_P(getThis());
150
+ mmdb_obj->mmdb = mmdb;
151
+ }
152
+
153
+ PHP_METHOD(MaxMind_Db_Reader, get){
154
+ char *ip_address = NULL;
155
+ strsize_t name_len;
156
+ zval * _this_zval = NULL;
157
+
158
+ if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os",
159
+ &_this_zval, maxminddb_ce, &ip_address, &name_len) == FAILURE) {
160
+ THROW_EXCEPTION("InvalidArgumentException",
161
+ "Method takes exactly one argument.");
162
+ return;
163
+ }
164
+
165
+ const maxminddb_obj *mmdb_obj =
166
+ (maxminddb_obj *)Z_MAXMINDDB_P(getThis());
167
+
168
+ MMDB_s *mmdb = mmdb_obj->mmdb;
169
+
170
+ if (NULL == mmdb) {
171
+ THROW_EXCEPTION("BadMethodCallException",
172
+ "Attempt to read from a closed MaxMind DB.");
173
+ return;
174
+ }
175
+
176
+ int gai_error = 0;
177
+ int mmdb_error = MMDB_SUCCESS;
178
+ MMDB_lookup_result_s result =
179
+ MMDB_lookup_string(mmdb, ip_address, &gai_error,
180
+ &mmdb_error);
181
+
182
+ if (MMDB_SUCCESS != gai_error) {
183
+ THROW_EXCEPTION("InvalidArgumentException",
184
+ "The value \"%s\" is not a valid IP address.",
185
+ ip_address);
186
+ return;
187
+ }
188
+
189
+ if (MMDB_SUCCESS != mmdb_error) {
190
+ char *exception_name;
191
+ if (MMDB_IPV6_LOOKUP_IN_IPV4_DATABASE_ERROR == mmdb_error) {
192
+ exception_name = "InvalidArgumentException";
193
+ } else {
194
+ exception_name = PHP_MAXMINDDB_READER_EX_NS;
195
+ }
196
+ THROW_EXCEPTION(exception_name,
197
+ "Error looking up %s. %s",
198
+ ip_address, MMDB_strerror(mmdb_error));
199
+ return;
200
+ }
201
+
202
+ MMDB_entry_data_list_s *entry_data_list = NULL;
203
+
204
+ if (!result.found_entry) {
205
+ RETURN_NULL();
206
+ }
207
+
208
+ int status = MMDB_get_entry_data_list(&result.entry, &entry_data_list);
209
+
210
+ if (MMDB_SUCCESS != status) {
211
+ THROW_EXCEPTION(PHP_MAXMINDDB_READER_EX_NS,
212
+ "Error while looking up data for %s. %s",
213
+ ip_address, MMDB_strerror(status));
214
+ MMDB_free_entry_data_list(entry_data_list);
215
+ return;
216
+ } else if (NULL == entry_data_list) {
217
+ THROW_EXCEPTION(
218
+ PHP_MAXMINDDB_READER_EX_NS,
219
+ "Error while looking up data for %s. Your database may be corrupt or you have found a bug in libmaxminddb.",
220
+ ip_address);
221
+ return;
222
+ }
223
+
224
+ handle_entry_data_list(entry_data_list, return_value TSRMLS_CC);
225
+ MMDB_free_entry_data_list(entry_data_list);
226
+ }
227
+
228
+ PHP_METHOD(MaxMind_Db_Reader, metadata){
229
+ if (ZEND_NUM_ARGS() != 0) {
230
+ THROW_EXCEPTION("InvalidArgumentException",
231
+ "Method takes no arguments.");
232
+ return;
233
+ }
234
+
235
+ const maxminddb_obj *const mmdb_obj =
236
+ (maxminddb_obj *)Z_MAXMINDDB_P(getThis());
237
+
238
+ if (NULL == mmdb_obj->mmdb) {
239
+ THROW_EXCEPTION("BadMethodCallException",
240
+ "Attempt to read from a closed MaxMind DB.");
241
+ return;
242
+ }
243
+
244
+ const char *const name = ZEND_NS_NAME(PHP_MAXMINDDB_READER_NS, "Metadata");
245
+ zend_class_entry *metadata_ce = lookup_class(name TSRMLS_CC);
246
+
247
+ object_init_ex(return_value, metadata_ce);
248
+
249
+ #ifdef ZEND_ENGINE_3
250
+ zval _metadata_array;
251
+ zval *metadata_array = &_metadata_array;
252
+ ZVAL_NULL(metadata_array);
253
+ #else
254
+ zval *metadata_array;
255
+ ALLOC_INIT_ZVAL(metadata_array);
256
+ #endif
257
+
258
+ MMDB_entry_data_list_s *entry_data_list;
259
+ MMDB_get_metadata_as_entry_data_list(mmdb_obj->mmdb, &entry_data_list);
260
+
261
+ handle_entry_data_list(entry_data_list, metadata_array TSRMLS_CC);
262
+ MMDB_free_entry_data_list(entry_data_list);
263
+ #ifdef ZEND_ENGINE_3
264
+ zend_call_method_with_1_params(return_value, metadata_ce,
265
+ &metadata_ce->constructor,
266
+ ZEND_CONSTRUCTOR_FUNC_NAME,
267
+ NULL,
268
+ metadata_array);
269
+ zval_ptr_dtor(metadata_array);
270
+ #else
271
+ zend_call_method_with_1_params(&return_value, metadata_ce,
272
+ &metadata_ce->constructor,
273
+ ZEND_CONSTRUCTOR_FUNC_NAME,
274
+ NULL,
275
+ metadata_array);
276
+ zval_ptr_dtor(&metadata_array);
277
+ #endif
278
+ }
279
+
280
+ PHP_METHOD(MaxMind_Db_Reader, close){
281
+ if (ZEND_NUM_ARGS() != 0) {
282
+ THROW_EXCEPTION("InvalidArgumentException",
283
+ "Method takes no arguments.");
284
+ return;
285
+ }
286
+
287
+ maxminddb_obj *mmdb_obj =
288
+ (maxminddb_obj *)Z_MAXMINDDB_P(getThis());
289
+
290
+ if (NULL == mmdb_obj->mmdb) {
291
+ THROW_EXCEPTION("BadMethodCallException",
292
+ "Attempt to close a closed MaxMind DB.");
293
+ return;
294
+ }
295
+ MMDB_close(mmdb_obj->mmdb);
296
+ efree(mmdb_obj->mmdb);
297
+ mmdb_obj->mmdb = NULL;
298
+ }
299
+
300
+ static const MMDB_entry_data_list_s *handle_entry_data_list(
301
+ const MMDB_entry_data_list_s *entry_data_list,
302
+ zval *z_value
303
+ TSRMLS_DC)
304
+ {
305
+ switch (entry_data_list->entry_data.type) {
306
+ case MMDB_DATA_TYPE_MAP:
307
+ return handle_map(entry_data_list, z_value TSRMLS_CC);
308
+ case MMDB_DATA_TYPE_ARRAY:
309
+ return handle_array(entry_data_list, z_value TSRMLS_CC);
310
+ case MMDB_DATA_TYPE_UTF8_STRING:
311
+ _ZVAL_STRINGL(z_value,
312
+ (char *)entry_data_list->entry_data.utf8_string,
313
+ entry_data_list->entry_data.data_size);
314
+ break;
315
+ case MMDB_DATA_TYPE_BYTES:
316
+ _ZVAL_STRINGL(z_value, (char *)entry_data_list->entry_data.bytes,
317
+ entry_data_list->entry_data.data_size);
318
+ break;
319
+ case MMDB_DATA_TYPE_DOUBLE:
320
+ ZVAL_DOUBLE(z_value, entry_data_list->entry_data.double_value);
321
+ break;
322
+ case MMDB_DATA_TYPE_FLOAT:
323
+ ZVAL_DOUBLE(z_value, entry_data_list->entry_data.float_value);
324
+ break;
325
+ case MMDB_DATA_TYPE_UINT16:
326
+ ZVAL_LONG(z_value, entry_data_list->entry_data.uint16);
327
+ break;
328
+ case MMDB_DATA_TYPE_UINT32:
329
+ ZVAL_LONG(z_value, entry_data_list->entry_data.uint32);
330
+ break;
331
+ case MMDB_DATA_TYPE_BOOLEAN:
332
+ ZVAL_BOOL(z_value, entry_data_list->entry_data.boolean);
333
+ break;
334
+ case MMDB_DATA_TYPE_UINT64:
335
+ handle_uint64(entry_data_list, z_value TSRMLS_CC);
336
+ break;
337
+ case MMDB_DATA_TYPE_UINT128:
338
+ handle_uint128(entry_data_list, z_value TSRMLS_CC);
339
+ break;
340
+ case MMDB_DATA_TYPE_INT32:
341
+ ZVAL_LONG(z_value, entry_data_list->entry_data.int32);
342
+ break;
343
+ default:
344
+ THROW_EXCEPTION(PHP_MAXMINDDB_READER_EX_NS,
345
+ "Invalid data type arguments: %d",
346
+ entry_data_list->entry_data.type);
347
+ return NULL;
348
+ }
349
+ return entry_data_list;
350
+ }
351
+
352
+ static const MMDB_entry_data_list_s *handle_map(
353
+ const MMDB_entry_data_list_s *entry_data_list,
354
+ zval *z_value TSRMLS_DC)
355
+ {
356
+ array_init(z_value);
357
+ const uint32_t map_size = entry_data_list->entry_data.data_size;
358
+
359
+ uint i;
360
+ for (i = 0; i < map_size && entry_data_list; i++ ) {
361
+ entry_data_list = entry_data_list->next;
362
+
363
+ char *key =
364
+ estrndup((char *)entry_data_list->entry_data.utf8_string,
365
+ entry_data_list->entry_data.data_size);
366
+ if (NULL == key) {
367
+ THROW_EXCEPTION(PHP_MAXMINDDB_READER_EX_NS,
368
+ "Invalid data type arguments");
369
+ return NULL;
370
+ }
371
+
372
+ entry_data_list = entry_data_list->next;
373
+ #ifdef ZEND_ENGINE_3
374
+ zval _new_value;
375
+ zval * new_value = &_new_value;
376
+ ZVAL_NULL(new_value);
377
+ #else
378
+ zval *new_value;
379
+ ALLOC_INIT_ZVAL(new_value);
380
+ #endif
381
+ entry_data_list = handle_entry_data_list(entry_data_list,
382
+ new_value TSRMLS_CC);
383
+ add_assoc_zval(z_value, key, new_value);
384
+ efree(key);
385
+ }
386
+ return entry_data_list;
387
+ }
388
+
389
+ static const MMDB_entry_data_list_s *handle_array(
390
+ const MMDB_entry_data_list_s *entry_data_list,
391
+ zval *z_value TSRMLS_DC)
392
+ {
393
+ const uint32_t size = entry_data_list->entry_data.data_size;
394
+
395
+ array_init(z_value);
396
+
397
+ uint i;
398
+ for (i = 0; i < size && entry_data_list; i++) {
399
+ entry_data_list = entry_data_list->next;
400
+ #ifdef ZEND_ENGINE_3
401
+ zval _new_value;
402
+ zval * new_value = &_new_value;
403
+ ZVAL_NULL(new_value);
404
+ #else
405
+ zval *new_value;
406
+ ALLOC_INIT_ZVAL(new_value);
407
+ #endif
408
+ entry_data_list = handle_entry_data_list(entry_data_list,
409
+ new_value TSRMLS_CC);
410
+ add_next_index_zval(z_value, new_value);
411
+ }
412
+ return entry_data_list;
413
+ }
414
+
415
+ static void handle_uint128(const MMDB_entry_data_list_s *entry_data_list,
416
+ zval *z_value TSRMLS_DC)
417
+ {
418
+ uint64_t high = 0;
419
+ uint64_t low = 0;
420
+ #if MMDB_UINT128_IS_BYTE_ARRAY
421
+ int i;
422
+ for (i = 0; i < 8; i++) {
423
+ high = (high << 8) | entry_data_list->entry_data.uint128[i];
424
+ }
425
+
426
+ for (i = 8; i < 16; i++) {
427
+ low = (low << 8) | entry_data_list->entry_data.uint128[i];
428
+ }
429
+ #else
430
+ high = entry_data_list->entry_data.uint128 >> 64;
431
+ low = (uint64_t)entry_data_list->entry_data.uint128;
432
+ #endif
433
+
434
+ char *num_str;
435
+ spprintf(&num_str, 0, "0x%016" PRIX64 "%016" PRIX64, high, low);
436
+ CHECK_ALLOCATED(num_str);
437
+
438
+ _ZVAL_STRING(z_value, num_str);
439
+ efree(num_str);
440
+ }
441
+
442
+ static void handle_uint64(const MMDB_entry_data_list_s *entry_data_list,
443
+ zval *z_value TSRMLS_DC)
444
+ {
445
+ // We return it as a string because PHP uses signed longs
446
+ char *int_str;
447
+ spprintf(&int_str, 0, "%" PRIu64,
448
+ entry_data_list->entry_data.uint64);
449
+ CHECK_ALLOCATED(int_str);
450
+
451
+ _ZVAL_STRING(z_value, int_str);
452
+ efree(int_str);
453
+ }
454
+
455
+ static zend_class_entry *lookup_class(const char *name TSRMLS_DC)
456
+ {
457
+ #ifdef ZEND_ENGINE_3
458
+ zend_string *n = zend_string_init(name, strlen(name), 0);
459
+ zend_class_entry *ce = zend_lookup_class(n);
460
+ zend_string_release(n);
461
+ if( NULL == ce ) {
462
+ zend_error(E_ERROR, "Class %s not found", name);
463
+ }
464
+ return ce;
465
+ #else
466
+ zend_class_entry **ce;
467
+ if (FAILURE ==
468
+ zend_lookup_class(name, strlen(name),
469
+ &ce TSRMLS_CC)) {
470
+ zend_error(E_ERROR, "Class %s not found", name);
471
+ }
472
+ return *ce;
473
+ #endif
474
+ }
475
+
476
+ static void maxminddb_free_storage(free_obj_t *object TSRMLS_DC)
477
+ {
478
+ maxminddb_obj *obj = php_maxminddb_fetch_object((zend_object *)object TSRMLS_CC);
479
+ if (obj->mmdb != NULL) {
480
+ MMDB_close(obj->mmdb);
481
+ efree(obj->mmdb);
482
+ }
483
+
484
+ zend_object_std_dtor(&obj->std TSRMLS_CC);
485
+ #ifndef ZEND_ENGINE_3
486
+ efree(object);
487
+ #endif
488
+ }
489
+
490
+ #ifdef ZEND_ENGINE_3
491
+ static zend_object *maxminddb_create_handler(
492
+ zend_class_entry *type TSRMLS_DC)
493
+ {
494
+ maxminddb_obj *obj = (maxminddb_obj *)ecalloc(1, sizeof(maxminddb_obj));
495
+ zend_object_std_init(&obj->std, type TSRMLS_CC);
496
+ object_properties_init(&(obj->std), type);
497
+
498
+ obj->std.handlers = &maxminddb_obj_handlers;
499
+
500
+ return &obj->std;
501
+ }
502
+ #else
503
+ static zend_object_value maxminddb_create_handler(
504
+ zend_class_entry *type TSRMLS_DC)
505
+ {
506
+ zend_object_value retval;
507
+
508
+ maxminddb_obj *obj = (maxminddb_obj *)ecalloc(1, sizeof(maxminddb_obj));
509
+ zend_object_std_init(&obj->std, type TSRMLS_CC);
510
+ object_properties_init(&(obj->std), type);
511
+
512
+ retval.handle = zend_objects_store_put(obj, NULL,
513
+ maxminddb_free_storage,
514
+ NULL TSRMLS_CC);
515
+ retval.handlers = &maxminddb_obj_handlers;
516
+
517
+ return retval;
518
+ }
519
+ #endif
520
+
521
+ /* *INDENT-OFF* */
522
+ static zend_function_entry maxminddb_methods[] = {
523
+ PHP_ME(MaxMind_Db_Reader, __construct, NULL,
524
+ ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
525
+ PHP_ME(MaxMind_Db_Reader, close, NULL, ZEND_ACC_PUBLIC)
526
+ PHP_ME(MaxMind_Db_Reader, get, NULL, ZEND_ACC_PUBLIC)
527
+ PHP_ME(MaxMind_Db_Reader, metadata, NULL, ZEND_ACC_PUBLIC)
528
+ { NULL, NULL, NULL }
529
+ };
530
+ /* *INDENT-ON* */
531
+
532
+ PHP_MINIT_FUNCTION(maxminddb){
533
+ zend_class_entry ce;
534
+
535
+ INIT_CLASS_ENTRY(ce, PHP_MAXMINDDB_READER_NS, maxminddb_methods);
536
+ maxminddb_ce = zend_register_internal_class(&ce TSRMLS_CC);
537
+ maxminddb_ce->create_object = maxminddb_create_handler;
538
+ memcpy(&maxminddb_obj_handlers,
539
+ zend_get_std_object_handlers(), sizeof(zend_object_handlers));
540
+ maxminddb_obj_handlers.clone_obj = NULL;
541
+ #ifdef ZEND_ENGINE_3
542
+ maxminddb_obj_handlers.offset = XtOffsetOf(maxminddb_obj, std);
543
+ maxminddb_obj_handlers.free_obj = maxminddb_free_storage;
544
+ #endif
545
+
546
+ return SUCCESS;
547
+ }
548
+
549
+ zend_module_entry maxminddb_module_entry = {
550
+ STANDARD_MODULE_HEADER,
551
+ PHP_MAXMINDDB_EXTNAME,
552
+ NULL,
553
+ PHP_MINIT(maxminddb),
554
+ NULL,
555
+ NULL,
556
+ NULL,
557
+ NULL,
558
+ PHP_MAXMINDDB_VERSION,
559
+ STANDARD_MODULE_PROPERTIES
560
+ };
561
+
562
+ #ifdef COMPILE_DL_MAXMINDDB
563
+ ZEND_GET_MODULE(maxminddb)
564
+ #endif
vendor/maxmind-db/reader/ext/php_maxminddb.h ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* MaxMind, Inc., licenses this file to you under the Apache License, Version
2
+ * 2.0 (the "License"); you may not use this file except in compliance with
3
+ * the License. You may obtain a copy of the License at
4
+ *
5
+ * http://www.apache.org/licenses/LICENSE-2.0
6
+ *
7
+ * Unless required by applicable law or agreed to in writing, software
8
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10
+ * License for the specific language governing permissions and limitations
11
+ * under the License.
12
+ */
13
+
14
+ #include <zend_interfaces.h>
15
+
16
+ #ifndef PHP_MAXMINDDB_H
17
+ #define PHP_MAXMINDDB_H 1
18
+ #define PHP_MAXMINDDB_VERSION "1.2.0"
19
+ #define PHP_MAXMINDDB_EXTNAME "maxminddb"
20
+
21
+ extern zend_module_entry maxminddb_module_entry;
22
+ #define phpext_maxminddb_ptr &maxminddb_module_entry
23
+
24
+ #endif
vendor/maxmind-db/reader/ext/tests/001-load.phpt ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ --TEST--
2
+ Check for maxminddb presence
3
+ --SKIPIF--
4
+ <?php if (!extension_loaded('maxminddb')) {
5
+ echo 'skip';
6
+ } ?>
7
+ --FILE--
8
+ <?php
9
+ echo 'maxminddb extension is available';
10
+ ?>
11
+ --EXPECT--
12
+ maxminddb extension is available
vendor/maxmind-db/reader/ext/tests/002-final.phpt ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ --TEST--
2
+ Check that Reader class is not final
3
+ --SKIPIF--
4
+ <?php if (!extension_loaded('maxminddb')) {
5
+ echo 'skip';
6
+ } ?>
7
+ --FILE--
8
+ <?php
9
+ $reflectionClass = new \ReflectionClass('MaxMind\Db\Reader');
10
+ var_dump($reflectionClass->isFinal());
11
+ ?>
12
+ --EXPECT--
13
+ bool(false)
vendor/maxmind-db/reader/src/MaxMind/Db/Reader.php ADDED
@@ -0,0 +1,309 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MaxMind\Db;
4
+
5
+ use MaxMind\Db\Reader\Decoder;
6
+ use MaxMind\Db\Reader\InvalidDatabaseException;
7
+ use MaxMind\Db\Reader\Metadata;
8
+ use MaxMind\Db\Reader\Util;
9
+
10
+ /**
11
+ * Instances of this class provide a reader for the MaxMind DB format. IP
12
+ * addresses can be looked up using the <code>get</code> method.
13
+ */
14
+ class Reader
15
+ {
16
+ private static $DATA_SECTION_SEPARATOR_SIZE = 16;
17
+ private static $METADATA_START_MARKER = "\xAB\xCD\xEFMaxMind.com";
18
+ private static $METADATA_START_MARKER_LENGTH = 14;
19
+ private static $METADATA_MAX_SIZE = 131072; // 128 * 1024 = 128KB
20
+
21
+ private $decoder;
22
+ private $fileHandle;
23
+ private $fileSize;
24
+ private $ipV4Start;
25
+ private $metadata;
26
+
27
+ /**
28
+ * Constructs a Reader for the MaxMind DB format. The file passed to it must
29
+ * be a valid MaxMind DB file such as a GeoIp2 database file.
30
+ *
31
+ * @param string $database
32
+ * the MaxMind DB file to use
33
+ *
34
+ * @throws \InvalidArgumentException for invalid database path or unknown arguments
35
+ * @throws \MaxMind\Db\Reader\InvalidDatabaseException
36
+ * if the database is invalid or there is an error reading
37
+ * from it
38
+ */
39
+ public function __construct($database)
40
+ {
41
+ if (func_num_args() !== 1) {
42
+ throw new \InvalidArgumentException(
43
+ 'The constructor takes exactly one argument.'
44
+ );
45
+ }
46
+
47
+ if (!is_readable($database)) {
48
+ throw new \InvalidArgumentException(
49
+ "The file \"$database\" does not exist or is not readable."
50
+ );
51
+ }
52
+ $this->fileHandle = @fopen($database, 'rb');
53
+ if ($this->fileHandle === false) {
54
+ throw new \InvalidArgumentException(
55
+ "Error opening \"$database\"."
56
+ );
57
+ }
58
+ $this->fileSize = @filesize($database);
59
+ if ($this->fileSize === false) {
60
+ throw new \UnexpectedValueException(
61
+ "Error determining the size of \"$database\"."
62
+ );
63
+ }
64
+
65
+ $start = $this->findMetadataStart($database);
66
+ $metadataDecoder = new Decoder($this->fileHandle, $start);
67
+ list($metadataArray) = $metadataDecoder->decode($start);
68
+ $this->metadata = new Metadata($metadataArray);
69
+ $this->decoder = new Decoder(
70
+ $this->fileHandle,
71
+ $this->metadata->searchTreeSize + self::$DATA_SECTION_SEPARATOR_SIZE
72
+ );
73
+ }
74
+
75
+ /**
76
+ * Looks up the <code>address</code> in the MaxMind DB.
77
+ *
78
+ * @param string $ipAddress
79
+ * the IP address to look up
80
+ *
81
+ * @throws \BadMethodCallException if this method is called on a closed database
82
+ * @throws \InvalidArgumentException if something other than a single IP address is passed to the method
83
+ * @throws InvalidDatabaseException
84
+ * if the database is invalid or there is an error reading
85
+ * from it
86
+ *
87
+ * @return array the record for the IP address
88
+ */
89
+ public function get($ipAddress)
90
+ {
91
+ if (func_num_args() !== 1) {
92
+ throw new \InvalidArgumentException(
93
+ 'Method takes exactly one argument.'
94
+ );
95
+ }
96
+
97
+ if (!is_resource($this->fileHandle)) {
98
+ throw new \BadMethodCallException(
99
+ 'Attempt to read from a closed MaxMind DB.'
100
+ );
101
+ }
102
+
103
+ if (!filter_var($ipAddress, FILTER_VALIDATE_IP)) {
104
+ throw new \InvalidArgumentException(
105
+ "The value \"$ipAddress\" is not a valid IP address."
106
+ );
107
+ }
108
+
109
+ if ($this->metadata->ipVersion === 4 && strrpos($ipAddress, ':')) {
110
+ throw new \InvalidArgumentException(
111
+ "Error looking up $ipAddress. You attempted to look up an"
112
+ . ' IPv6 address in an IPv4-only database.'
113
+ );
114
+ }
115
+ $pointer = $this->findAddressInTree($ipAddress);
116
+ if ($pointer === 0) {
117
+ return null;
118
+ }
119
+
120
+ return $this->resolveDataPointer($pointer);
121
+ }
122
+
123
+ private function findAddressInTree($ipAddress)
124
+ {
125
+ // XXX - could simplify. Done as a byte array to ease porting
126
+ $rawAddress = array_merge(unpack('C*', inet_pton($ipAddress)));
127
+
128
+ $bitCount = count($rawAddress) * 8;
129
+
130
+ // The first node of the tree is always node 0, at the beginning of the
131
+ // value
132
+ $node = $this->startNode($bitCount);
133
+
134
+ for ($i = 0; $i < $bitCount; $i++) {
135
+ if ($node >= $this->metadata->nodeCount) {
136
+ break;
137
+ }
138
+ $tempBit = 0xFF & $rawAddress[$i >> 3];
139
+ $bit = 1 & ($tempBit >> 7 - ($i % 8));
140
+
141
+ $node = $this->readNode($node, $bit);
142
+ }
143
+ if ($node === $this->metadata->nodeCount) {
144
+ // Record is empty
145
+ return 0;
146
+ } elseif ($node > $this->metadata->nodeCount) {
147
+ // Record is a data pointer
148
+ return $node;
149
+ }
150
+ throw new InvalidDatabaseException('Something bad happened');
151
+ }
152
+
153
+ private function startNode($length)
154
+ {
155
+ // Check if we are looking up an IPv4 address in an IPv6 tree. If this
156
+ // is the case, we can skip over the first 96 nodes.
157
+ if ($this->metadata->ipVersion === 6 && $length === 32) {
158
+ return $this->ipV4StartNode();
159
+ }
160
+ // The first node of the tree is always node 0, at the beginning of the
161
+ // value
162
+ return 0;
163
+ }
164
+
165
+ private function ipV4StartNode()
166
+ {
167
+ // This is a defensive check. There is no reason to call this when you
168
+ // have an IPv4 tree.
169
+ if ($this->metadata->ipVersion === 4) {
170
+ return 0;
171
+ }
172
+
173
+ if ($this->ipV4Start) {
174
+ return $this->ipV4Start;
175
+ }
176
+ $node = 0;
177
+
178
+ for ($i = 0; $i < 96 && $node < $this->metadata->nodeCount; $i++) {
179
+ $node = $this->readNode($node, 0);
180
+ }
181
+ $this->ipV4Start = $node;
182
+
183
+ return $node;
184
+ }
185
+
186
+ private function readNode($nodeNumber, $index)
187
+ {
188
+ $baseOffset = $nodeNumber * $this->metadata->nodeByteSize;
189
+
190
+ // XXX - probably could condense this.
191
+ switch ($this->metadata->recordSize) {
192
+ case 24:
193
+ $bytes = Util::read($this->fileHandle, $baseOffset + $index * 3, 3);
194
+ list(, $node) = unpack('N', "\x00" . $bytes);
195
+
196
+ return $node;
197
+ case 28:
198
+ $middleByte = Util::read($this->fileHandle, $baseOffset + 3, 1);
199
+ list(, $middle) = unpack('C', $middleByte);
200
+ if ($index === 0) {
201
+ $middle = (0xF0 & $middle) >> 4;
202
+ } else {
203
+ $middle = 0x0F & $middle;
204
+ }
205
+ $bytes = Util::read($this->fileHandle, $baseOffset + $index * 4, 3);
206
+ list(, $node) = unpack('N', chr($middle) . $bytes);
207
+
208
+ return $node;
209
+ case 32:
210
+ $bytes = Util::read($this->fileHandle, $baseOffset + $index * 4, 4);
211
+ list(, $node) = unpack('N', $bytes);
212
+
213
+ return $node;
214
+ default:
215
+ throw new InvalidDatabaseException(
216
+ 'Unknown record size: '
217
+ . $this->metadata->recordSize
218
+ );
219
+ }
220
+ }
221
+
222
+ private function resolveDataPointer($pointer)
223
+ {
224
+ $resolved = $pointer - $this->metadata->nodeCount
225
+ + $this->metadata->searchTreeSize;
226
+ if ($resolved > $this->fileSize) {
227
+ throw new InvalidDatabaseException(
228
+ "The MaxMind DB file's search tree is corrupt"
229
+ );
230
+ }
231
+
232
+ list($data) = $this->decoder->decode($resolved);
233
+
234
+ return $data;
235
+ }
236
+
237
+ /*
238
+ * This is an extremely naive but reasonably readable implementation. There
239
+ * are much faster algorithms (e.g., Boyer-Moore) for this if speed is ever
240
+ * an issue, but I suspect it won't be.
241
+ */
242
+ private function findMetadataStart($filename)
243
+ {
244
+ $handle = $this->fileHandle;
245
+ $fstat = fstat($handle);
246
+ $fileSize = $fstat['size'];
247
+ $marker = self::$METADATA_START_MARKER;
248
+ $markerLength = self::$METADATA_START_MARKER_LENGTH;
249
+ $metadataMaxLengthExcludingMarker
250
+ = min(self::$METADATA_MAX_SIZE, $fileSize) - $markerLength;
251
+
252
+ for ($i = 0; $i <= $metadataMaxLengthExcludingMarker; $i++) {
253
+ for ($j = 0; $j < $markerLength; $j++) {
254
+ fseek($handle, $fileSize - $i - $j - 1);
255
+ $matchBit = fgetc($handle);
256
+ if ($matchBit !== $marker[$markerLength - $j - 1]) {
257
+ continue 2;
258
+ }
259
+ }
260
+
261
+ return $fileSize - $i;
262
+ }
263
+ throw new InvalidDatabaseException(
264
+ "Error opening database file ($filename). " .
265
+ 'Is this a valid MaxMind DB file?'
266
+ );
267
+ }
268
+
269
+ /**
270
+ * @throws \InvalidArgumentException if arguments are passed to the method
271
+ * @throws \BadMethodCallException if the database has been closed
272
+ *
273
+ * @return Metadata object for the database
274
+ */
275
+ public function metadata()
276
+ {
277
+ if (func_num_args()) {
278
+ throw new \InvalidArgumentException(
279
+ 'Method takes no arguments.'
280
+ );
281
+ }
282
+
283
+ // Not technically required, but this makes it consistent with
284
+ // C extension and it allows us to change our implementation later.
285
+ if (!is_resource($this->fileHandle)) {
286
+ throw new \BadMethodCallException(
287
+ 'Attempt to read from a closed MaxMind DB.'
288
+ );
289
+ }
290
+
291
+ return $this->metadata;
292
+ }
293
+
294
+ /**
295
+ * Closes the MaxMind DB and returns resources to the system.
296
+ *
297
+ * @throws \Exception
298
+ * if an I/O error occurs
299
+ */
300
+ public function close()
301
+ {
302
+ if (!is_resource($this->fileHandle)) {
303
+ throw new \BadMethodCallException(
304
+ 'Attempt to close a closed MaxMind DB.'
305
+ );
306
+ }
307
+ fclose($this->fileHandle);
308
+ }
309
+ }
vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Decoder.php ADDED
@@ -0,0 +1,311 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MaxMind\Db\Reader;
4
+
5
+ class Decoder
6
+ {
7
+ private $fileStream;
8
+ private $pointerBase;
9
+ // This is only used for unit testing
10
+ private $pointerTestHack;
11
+ private $switchByteOrder;
12
+
13
+ private $types = [
14
+ 0 => 'extended',
15
+ 1 => 'pointer',
16
+ 2 => 'utf8_string',
17
+ 3 => 'double',
18
+ 4 => 'bytes',
19
+ 5 => 'uint16',
20
+ 6 => 'uint32',
21
+ 7 => 'map',
22
+ 8 => 'int32',
23
+ 9 => 'uint64',
24
+ 10 => 'uint128',
25
+ 11 => 'array',
26
+ 12 => 'container',
27
+ 13 => 'end_marker',
28
+ 14 => 'boolean',
29
+ 15 => 'float',
30
+ ];
31
+
32
+ public function __construct(
33
+ $fileStream,
34
+ $pointerBase = 0,
35
+ $pointerTestHack = false
36
+ ) {
37
+ $this->fileStream = $fileStream;
38
+ $this->pointerBase = $pointerBase;
39
+ $this->pointerTestHack = $pointerTestHack;
40
+
41
+ $this->switchByteOrder = $this->isPlatformLittleEndian();
42
+ }
43
+
44
+ public function decode($offset)
45
+ {
46
+ list(, $ctrlByte) = unpack(
47
+ 'C',
48
+ Util::read($this->fileStream, $offset, 1)
49
+ );
50
+ $offset++;
51
+
52
+ $type = $this->types[$ctrlByte >> 5];
53
+
54
+ // Pointers are a special case, we don't read the next $size bytes, we
55
+ // use the size to determine the length of the pointer and then follow
56
+ // it.
57
+ if ($type === 'pointer') {
58
+ list($pointer, $offset) = $this->decodePointer($ctrlByte, $offset);
59
+
60
+ // for unit testing
61
+ if ($this->pointerTestHack) {
62
+ return [$pointer];
63
+ }
64
+
65
+ list($result) = $this->decode($pointer);
66
+
67
+ return [$result, $offset];
68
+ }
69
+
70
+ if ($type === 'extended') {
71
+ list(, $nextByte) = unpack(
72
+ 'C',
73
+ Util::read($this->fileStream, $offset, 1)
74
+ );
75
+
76
+ $typeNum = $nextByte + 7;
77
+
78
+ if ($typeNum < 8) {
79
+ throw new InvalidDatabaseException(
80
+ 'Something went horribly wrong in the decoder. An extended type '
81
+ . 'resolved to a type number < 8 ('
82
+ . $this->types[$typeNum]
83
+ . ')'
84
+ );
85
+ }
86
+
87
+ $type = $this->types[$typeNum];
88
+ $offset++;
89
+ }
90
+
91
+ list($size, $offset) = $this->sizeFromCtrlByte($ctrlByte, $offset);
92
+
93
+ return $this->decodeByType($type, $offset, $size);
94
+ }
95
+
96
+ private function decodeByType($type, $offset, $size)
97
+ {
98
+ switch ($type) {
99
+ case 'map':
100
+ return $this->decodeMap($size, $offset);
101
+ case 'array':
102
+ return $this->decodeArray($size, $offset);
103
+ case 'boolean':
104
+ return [$this->decodeBoolean($size), $offset];
105
+ }
106
+
107
+ $newOffset = $offset + $size;
108
+ $bytes = Util::read($this->fileStream, $offset, $size);
109
+ switch ($type) {
110
+ case 'utf8_string':
111
+ return [$this->decodeString($bytes), $newOffset];
112
+ case 'double':
113
+ $this->verifySize(8, $size);
114
+
115
+ return [$this->decodeDouble($bytes), $newOffset];
116
+ case 'float':
117
+ $this->verifySize(4, $size);
118
+
119
+ return [$this->decodeFloat($bytes), $newOffset];
120
+ case 'bytes':
121
+ return [$bytes, $newOffset];
122
+ case 'uint16':
123
+ case 'uint32':
124
+ return [$this->decodeUint($bytes), $newOffset];
125
+ case 'int32':
126
+ return [$this->decodeInt32($bytes), $newOffset];
127
+ case 'uint64':
128
+ case 'uint128':
129
+ return [$this->decodeBigUint($bytes, $size), $newOffset];
130
+ default:
131
+ throw new InvalidDatabaseException(
132
+ 'Unknown or unexpected type: ' . $type
133
+ );
134
+ }
135
+ }
136
+
137
+ private function verifySize($expected, $actual)
138
+ {
139
+ if ($expected !== $actual) {
140
+ throw new InvalidDatabaseException(
141
+ "The MaxMind DB file's data section contains bad data (unknown data type or corrupt data)"
142
+ );
143
+ }
144
+ }
145
+
146
+ private function decodeArray($size, $offset)
147
+ {
148
+ $array = [];
149
+
150
+ for ($i = 0; $i < $size; $i++) {
151
+ list($value, $offset) = $this->decode($offset);
152
+ array_push($array, $value);
153
+ }
154
+
155
+ return [$array, $offset];
156
+ }
157
+
158
+ private function decodeBoolean($size)
159
+ {
160
+ return $size === 0 ? false : true;
161
+ }
162
+
163
+ private function decodeDouble($bits)
164
+ {
165
+ // XXX - Assumes IEEE 754 double on platform
166
+ list(, $double) = unpack('d', $this->maybeSwitchByteOrder($bits));
167
+
168
+ return $double;
169
+ }
170
+
171
+ private function decodeFloat($bits)
172
+ {
173
+ // XXX - Assumes IEEE 754 floats on platform
174
+ list(, $float) = unpack('f', $this->maybeSwitchByteOrder($bits));
175
+
176
+ return $float;
177
+ }
178
+
179
+ private function decodeInt32($bytes)
180
+ {
181
+ $bytes = $this->zeroPadLeft($bytes, 4);
182
+ list(, $int) = unpack('l', $this->maybeSwitchByteOrder($bytes));
183
+
184
+ return $int;
185
+ }
186
+
187
+ private function decodeMap($size, $offset)
188
+ {
189
+ $map = [];
190
+
191
+ for ($i = 0; $i < $size; $i++) {
192
+ list($key, $offset) = $this->decode($offset);
193
+ list($value, $offset) = $this->decode($offset);
194
+ $map[$key] = $value;
195
+ }
196
+
197
+ return [$map, $offset];
198
+ }
199
+
200
+ private $pointerValueOffset = [
201
+ 1 => 0,
202
+ 2 => 2048,
203
+ 3 => 526336,
204
+ 4 => 0,
205
+ ];
206
+
207
+ private function decodePointer($ctrlByte, $offset)
208
+ {
209
+ $pointerSize = (($ctrlByte >> 3) & 0x3) + 1;
210
+
211
+ $buffer = Util::read($this->fileStream, $offset, $pointerSize);
212
+ $offset = $offset + $pointerSize;
213
+
214
+ $packed = $pointerSize === 4
215
+ ? $buffer
216
+ : (pack('C', $ctrlByte & 0x7)) . $buffer;
217
+
218
+ $unpacked = $this->decodeUint($packed);
219
+ $pointer = $unpacked + $this->pointerBase
220
+ + $this->pointerValueOffset[$pointerSize];
221
+
222
+ return [$pointer, $offset];
223
+ }
224
+
225
+ private function decodeUint($bytes)
226
+ {
227
+ list(, $int) = unpack('N', $this->zeroPadLeft($bytes, 4));
228
+
229
+ return $int;
230
+ }
231
+
232
+ private function decodeBigUint($bytes, $byteLength)
233
+ {
234
+ $maxUintBytes = log(PHP_INT_MAX, 2) / 8;
235
+
236
+ if ($byteLength === 0) {
237
+ return 0;
238
+ }
239
+
240
+ $numberOfLongs = ceil($byteLength / 4);
241
+ $paddedLength = $numberOfLongs * 4;
242
+ $paddedBytes = $this->zeroPadLeft($bytes, $paddedLength);
243
+ $unpacked = array_merge(unpack("N$numberOfLongs", $paddedBytes));
244
+
245
+ $integer = 0;
246
+
247
+ // 2^32
248
+ $twoTo32 = '4294967296';
249
+
250
+ foreach ($unpacked as $part) {
251
+ // We only use gmp or bcmath if the final value is too big
252
+ if ($byteLength <= $maxUintBytes) {
253
+ $integer = ($integer << 32) + $part;
254
+ } elseif (extension_loaded('gmp')) {
255
+ $integer = gmp_strval(gmp_add(gmp_mul($integer, $twoTo32), $part));
256
+ } elseif (extension_loaded('bcmath')) {
257
+ $integer = bcadd(bcmul($integer, $twoTo32), $part);
258
+ } else {
259
+ throw new \RuntimeException(
260
+ 'The gmp or bcmath extension must be installed to read this database.'
261
+ );
262
+ }
263
+ }
264
+
265
+ return $integer;
266
+ }
267
+
268
+ private function decodeString($bytes)
269
+ {
270
+ // XXX - NOOP. As far as I know, the end user has to explicitly set the
271
+ // encoding in PHP. Strings are just bytes.
272
+ return $bytes;
273
+ }
274
+
275
+ private function sizeFromCtrlByte($ctrlByte, $offset)
276
+ {
277
+ $size = $ctrlByte & 0x1f;
278
+ $bytesToRead = $size < 29 ? 0 : $size - 28;
279
+ $bytes = Util::read($this->fileStream, $offset, $bytesToRead);
280
+ $decoded = $this->decodeUint($bytes);
281
+
282
+ if ($size === 29) {
283
+ $size = 29 + $decoded;
284
+ } elseif ($size === 30) {
285
+ $size = 285 + $decoded;
286
+ } elseif ($size > 30) {
287
+ $size = ($decoded & (0x0FFFFFFF >> (32 - (8 * $bytesToRead))))
288
+ + 65821;
289
+ }
290
+
291
+ return [$size, $offset + $bytesToRead];
292
+ }
293
+
294
+ private function zeroPadLeft($content, $desiredLength)
295
+ {
296
+ return str_pad($content, $desiredLength, "\x00", STR_PAD_LEFT);
297
+ }
298
+
299
+ private function maybeSwitchByteOrder($bytes)
300
+ {
301
+ return $this->switchByteOrder ? strrev($bytes) : $bytes;
302
+ }
303
+
304
+ private function isPlatformLittleEndian()
305
+ {
306
+ $testint = 0x00FF;
307
+ $packed = pack('S', $testint);
308
+
309
+ return $testint === current(unpack('v', $packed));
310
+ }
311
+ }
vendor/maxmind-db/reader/src/MaxMind/Db/Reader/InvalidDatabaseException.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MaxMind\Db\Reader;
4
+
5
+ /**
6
+ * This class should be thrown when unexpected data is found in the database.
7
+ */
8
+ class InvalidDatabaseException extends \Exception
9
+ {
10
+ }
vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Metadata.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MaxMind\Db\Reader;
4
+
5
+ /**
6
+ * This class provides the metadata for the MaxMind DB file.
7
+ *
8
+ * @property int nodeCount This is an unsigned 32-bit integer indicating
9
+ * the number of nodes in the search tree.
10
+ * @property int recordSize This is an unsigned 16-bit integer. It
11
+ * indicates the number of bits in a record in the search tree. Note that each
12
+ * node consists of two records.
13
+ * @property int ipVersion This is an unsigned 16-bit integer which is
14
+ * always 4 or 6. It indicates whether the database contains IPv4 or IPv6
15
+ * address data.
16
+ * @property string databaseType This is a string that indicates the structure
17
+ * of each data record associated with an IP address. The actual definition of
18
+ * these structures is left up to the database creator.
19
+ * @property array languages An array of strings, each of which is a language
20
+ * code. A given record may contain data items that have been localized to
21
+ * some or all of these languages. This may be undefined.
22
+ * @property int binaryFormatMajorVersion This is an unsigned 16-bit
23
+ * integer indicating the major version number for the database's binary
24
+ * format.
25
+ * @property int binaryFormatMinorVersion This is an unsigned 16-bit
26
+ * integer indicating the minor version number for the database's binary format.
27
+ * @property int buildEpoch This is an unsigned 64-bit integer that
28
+ * contains the database build timestamp as a Unix epoch value.
29
+ * @property array description This key will always point to a map
30
+ * (associative array). The keys of that map will be language codes, and the
31
+ * values will be a description in that language as a UTF-8 string. May be
32
+ * undefined for some databases.
33
+ */
34
+ class Metadata
35
+ {
36
+ private $binaryFormatMajorVersion;
37
+ private $binaryFormatMinorVersion;
38
+ private $buildEpoch;
39
+ private $databaseType;
40
+ private $description;
41
+ private $ipVersion;
42
+ private $languages;
43
+ private $nodeByteSize;
44
+ private $nodeCount;
45
+ private $recordSize;
46
+ private $searchTreeSize;
47
+
48
+ public function __construct($metadata)
49
+ {
50
+ $this->binaryFormatMajorVersion =
51
+ $metadata['binary_format_major_version'];
52
+ $this->binaryFormatMinorVersion =
53
+ $metadata['binary_format_minor_version'];
54
+ $this->buildEpoch = $metadata['build_epoch'];
55
+ $this->databaseType = $metadata['database_type'];
56
+ $this->languages = $metadata['languages'];
57
+ $this->description = $metadata['description'];
58
+ $this->ipVersion = $metadata['ip_version'];
59
+ $this->nodeCount = $metadata['node_count'];
60
+ $this->recordSize = $metadata['record_size'];
61
+ $this->nodeByteSize = $this->recordSize / 4;
62
+ $this->searchTreeSize = $this->nodeCount * $this->nodeByteSize;
63
+ }
64
+
65
+ public function __get($var)
66
+ {
67
+ return $this->$var;
68
+ }
69
+ }
vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Util.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MaxMind\Db\Reader;
4
+
5
+ class Util
6
+ {
7
+ public static function read($stream, $offset, $numberOfBytes)
8
+ {
9
+ if ($numberOfBytes === 0) {
10
+ return '';
11
+ }
12
+ if (fseek($stream, $offset) === 0) {
13
+ $value = fread($stream, $numberOfBytes);
14
+
15
+ // We check that the number of bytes read is equal to the number
16
+ // asked for. We use ftell as getting the length of $value is
17
+ // much slower.
18
+ if (ftell($stream) - $offset === $numberOfBytes) {
19
+ return $value;
20
+ }
21
+ }
22
+ throw new InvalidDatabaseException(
23
+ 'The MaxMind DB file contains bad data'
24
+ );
25
+ }
26
+ }
vendor/maxmind/web-service-common/CHANGELOG.md ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ CHANGELOG
2
+ =========
3
+
4
+ 0.4.0 (2017-XX-XX)
5
+ ------------------
6
+
7
+ * PHP 5.4 is now required.
8
+
9
+ 0.3.1 (2016-08-10)
10
+ ------------------
11
+
12
+ * On Mac OS X when using a curl built against SecureTransport, the certs
13
+ in the system's keychain will now be used instead of the CA bundle on
14
+ the file system.
15
+
16
+ 0.3.0 (2016-08-09)
17
+ ------------------
18
+
19
+ * This package now uses `composer/ca-bundle` by default rather than a CA
20
+ bundle distributed with this package. `composer/ca-bundle` will first try
21
+ to use the system CA bundle and will fall back to the Mozilla CA bundle
22
+ when no system bundle is available. You may still specify your own bundle
23
+ using the `caBundle` option.
24
+
25
+ 0.2.1 (2016-06-13)
26
+ ------------------
27
+
28
+ * Fix typo in code to copy cert to temp directory.
29
+
30
+ 0.2.0 (2016-06-10)
31
+ ------------------
32
+
33
+ * Added handling of additional error codes that the web service may return.
34
+ * A `USER_ID_UNKNOWN` error will now throw a
35
+ `MaxMind\Exception\AuthenticationException`.
36
+ * Added support for `proxy` option. Closes #6.
37
+
38
+ 0.1.0 (2016-05-23)
39
+ ------------------
40
+
41
+ * A `PERMISSION_REQUIRED` error will now throw a `PermissionRequiredException`
42
+ exception.
43
+ * Added a `.gitattributes` file to exclude tests from Composer releases.
44
+ GitHub #7.
45
+ * Updated included cert bundle.
46
+
47
+ 0.0.4 (2015-07-21)
48
+ ------------------
49
+
50
+ * Added extremely basic tests for the curl calls.
51
+ * Fixed broken POSTs.
52
+
53
+ 0.0.3 (2015-06-30)
54
+ ------------------
55
+
56
+ * Floats now work with the `timeout` and `connectTimeout` options. Fix by
57
+ Benjamin Pick. GitHub PR #2.
58
+ * `curl_error` is now used instead of `curl_strerror`. The latter is only
59
+ available for PHP 5.5 or later. Fix by Benjamin Pick. GitHub PR #1.
60
+
61
+
62
+ 0.0.2 (2015-06-09)
63
+ ------------------
64
+
65
+ * An exception is now immediately thrown curl error rather than letting later
66
+ status code checks throw an exception. This improves the exception message
67
+ greatly.
68
+ * If this library is inside a phar archive, the CA certs are copied out of the
69
+ archive to a temporary file so that curl can use them.
70
+
71
+ 0.0.1 (2015-06-01)
72
+ ------------------
73
+
74
+ * Initial release.
vendor/maxmind/web-service-common/LICENSE ADDED
@@ -0,0 +1,202 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ Apache License
3
+ Version 2.0, January 2004
4
+ http://www.apache.org/licenses/
5
+
6
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7
+
8
+ 1. Definitions.
9
+
10
+ "License" shall mean the terms and conditions for use, reproduction,
11
+ and distribution as defined by Sections 1 through 9 of this document.
12
+
13
+ "Licensor" shall mean the copyright owner or entity authorized by
14
+ the copyright owner that is granting the License.
15
+
16
+ "Legal Entity" shall mean the union of the acting entity and all
17
+ other entities that control, are controlled by, or are under common
18
+ control with that entity. For the purposes of this definition,
19
+ "control" means (i) the power, direct or indirect, to cause the
20
+ direction or management of such entity, whether by contract or
21
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
22
+ outstanding shares, or (iii) beneficial ownership of such entity.
23
+
24
+ "You" (or "Your") shall mean an individual or Legal Entity
25
+ exercising permissions granted by this License.
26
+
27
+ "Source" form shall mean the preferred form for making modifications,
28
+ including but not limited to software source code, documentation
29
+ source, and configuration files.
30
+
31
+ "Object" form shall mean any form resulting from mechanical
32
+ transformation or translation of a Source form, including but
33
+ not limited to compiled object code, generated documentation,
34
+ and conversions to other media types.
35
+
36
+ "Work" shall mean the work of authorship, whether in Source or
37
+ Object form, made available under the License, as indicated by a
38
+ copyright notice that is included in or attached to the work
39
+ (an example is provided in the Appendix below).
40
+
41
+ "Derivative Works" shall mean any work, whether in Source or Object
42
+ form, that is based on (or derived from) the Work and for which the
43
+ editorial revisions, annotations, elaborations, or other modifications
44
+ represent, as a whole, an original work of authorship. For the purposes
45
+ of this License, Derivative Works shall not include works that remain
46
+ separable from, or merely link (or bind by name) to the interfaces of,
47
+ the Work and Derivative Works thereof.
48
+
49
+ "Contribution" shall mean any work of authorship, including
50
+ the original version of the Work and any modifications or additions
51
+ to that Work or Derivative Works thereof, that is intentionally
52
+ submitted to Licensor for inclusion in the Work by the copyright owner
53
+ or by an individual or Legal Entity authorized to submit on behalf of
54
+ the copyright owner. For the purposes of this definition, "submitted"
55
+ means any form of electronic, verbal, or written communication sent
56
+ to the Licensor or its representatives, including but not limited to
57
+ communication on electronic mailing lists, source code control systems,
58
+ and issue tracking systems that are managed by, or on behalf of, the
59
+ Licensor for the purpose of discussing and improving the Work, but
60
+ excluding communication that is conspicuously marked or otherwise
61
+ designated in writing by the copyright owner as "Not a Contribution."
62
+
63
+ "Contributor" shall mean Licensor and any individual or Legal Entity
64
+ on behalf of whom a Contribution has been received by Licensor and
65
+ subsequently incorporated within the Work.
66
+
67
+ 2. Grant of Copyright License. Subject to the terms and conditions of
68
+ this License, each Contributor hereby grants to You a perpetual,
69
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70
+ copyright license to reproduce, prepare Derivative Works of,
71
+ publicly display, publicly perform, sublicense, and distribute the
72
+ Work and such Derivative Works in Source or Object form.
73
+
74
+ 3. Grant of Patent License. Subject to the terms and conditions of
75
+ this License, each Contributor hereby grants to You a perpetual,
76
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77
+ (except as stated in this section) patent license to make, have made,
78
+ use, offer to sell, sell, import, and otherwise transfer the Work,
79
+ where such license applies only to those patent claims licensable
80
+ by such Contributor that are necessarily infringed by their
81
+ Contribution(s) alone or by combination of their Contribution(s)
82
+ with the Work to which such Contribution(s) was submitted. If You
83
+ institute patent litigation against any entity (including a
84
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
85
+ or a Contribution incorporated within the Work constitutes direct
86
+ or contributory patent infringement, then any patent licenses
87
+ granted to You under this License for that Work shall terminate
88
+ as of the date such litigation is filed.
89
+
90
+ 4. Redistribution. You may reproduce and distribute copies of the
91
+ Work or Derivative Works thereof in any medium, with or without
92
+ modifications, and in Source or Object form, provided that You
93
+ meet the following conditions:
94
+
95
+ (a) You must give any other recipients of the Work or
96
+ Derivative Works a copy of this License; and
97
+
98
+ (b) You must cause any modified files to carry prominent notices
99
+ stating that You changed the files; and
100
+
101
+ (c) You must retain, in the Source form of any Derivative Works
102
+ that You distribute, all copyright, patent, trademark, and
103
+ attribution notices from the Source form of the Work,
104
+ excluding those notices that do not pertain to any part of
105
+ the Derivative Works; and
106
+
107
+ (d) If the Work includes a "NOTICE" text file as part of its
108
+ distribution, then any Derivative Works that You distribute must
109
+ include a readable copy of the attribution notices contained
110
+ within such NOTICE file, excluding those notices that do not
111
+ pertain to any part of the Derivative Works, in at least one
112
+ of the following places: within a NOTICE text file distributed
113
+ as part of the Derivative Works; within the Source form or
114
+ documentation, if provided along with the Derivative Works; or,
115
+ within a display generated by the Derivative Works, if and
116
+ wherever such third-party notices normally appear. The contents
117
+ of the NOTICE file are for informational purposes only and
118
+ do not modify the License. You may add Your own attribution
119
+ notices within Derivative Works that You distribute, alongside
120
+ or as an addendum to the NOTICE text from the Work, provided
121
+ that such additional attribution notices cannot be construed
122
+ as modifying the License.
123
+
124
+ You may add Your own copyright statement to Your modifications and
125
+ may provide additional or different license terms and conditions
126
+ for use, reproduction, or distribution of Your modifications, or
127
+ for any such Derivative Works as a whole, provided Your use,
128
+ reproduction, and distribution of the Work otherwise complies with
129
+ the conditions stated in this License.
130
+
131
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
132
+ any Contribution intentionally submitted for inclusion in the Work
133
+ by You to the Licensor shall be under the terms and conditions of
134
+ this License, without any additional terms or conditions.
135
+ Notwithstanding the above, nothing herein shall supersede or modify
136
+ the terms of any separate license agreement you may have executed
137
+ with Licensor regarding such Contributions.
138
+
139
+ 6. Trademarks. This License does not grant permission to use the trade
140
+ names, trademarks, service marks, or product names of the Licensor,
141
+ except as required for reasonable and customary use in describing the
142
+ origin of the Work and reproducing the content of the NOTICE file.
143
+
144
+ 7. Disclaimer of Warranty. Unless required by applicable law or
145
+ agreed to in writing, Licensor provides the Work (and each
146
+ Contributor provides its Contributions) on an "AS IS" BASIS,
147
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148
+ implied, including, without limitation, any warranties or conditions
149
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150
+ PARTICULAR PURPOSE. You are solely responsible for determining the
151
+ appropriateness of using or redistributing the Work and assume any
152
+ risks associated with Your exercise of permissions under this License.
153
+
154
+ 8. Limitation of Liability. In no event and under no legal theory,
155
+ whether in tort (including negligence), contract, or otherwise,
156
+ unless required by applicable law (such as deliberate and grossly
157
+ negligent acts) or agreed to in writing, shall any Contributor be
158
+ liable to You for damages, including any direct, indirect, special,
159
+ incidental, or consequential damages of any character arising as a
160
+ result of this License or out of the use or inability to use the
161
+ Work (including but not limited to damages for loss of goodwill,
162
+ work stoppage, computer failure or malfunction, or any and all
163
+ other commercial damages or losses), even if such Contributor
164
+ has been advised of the possibility of such damages.
165
+
166
+ 9. Accepting Warranty or Additional Liability. While redistributing
167
+ the Work or Derivative Works thereof, You may choose to offer,
168
+ and charge a fee for, acceptance of support, warranty, indemnity,
169
+ or other liability obligations and/or rights consistent with this
170
+ License. However, in accepting such obligations, You may act only
171
+ on Your own behalf and on Your sole responsibility, not on behalf
172
+ of any other Contributor, and only if You agree to indemnify,
173
+ defend, and hold each Contributor harmless for any liability
174
+ incurred by, or claims asserted against, such Contributor by reason
175
+ of your accepting any such warranty or additional liability.
176
+
177
+ END OF TERMS AND CONDITIONS
178
+
179
+ APPENDIX: How to apply the Apache License to your work.
180
+
181
+ To apply the Apache License to your work, attach the following
182
+ boilerplate notice, with the fields enclosed by brackets "[]"
183
+ replaced with your own identifying information. (Don't include
184
+ the brackets!) The text should be enclosed in the appropriate
185
+ comment syntax for the file format. We also recommend that a
186
+ file or class name and description of purpose be included on the
187
+ same "printed page" as the copyright notice for easier
188
+ identification within third-party archives.
189
+
190
+ Copyright [yyyy] [name of copyright owner]
191
+
192
+ Licensed under the Apache License, Version 2.0 (the "License");
193
+ you may not use this file except in compliance with the License.
194
+ You may obtain a copy of the License at
195
+
196
+ http://www.apache.org/licenses/LICENSE-2.0
197
+
198
+ Unless required by applicable law or agreed to in writing, software
199
+ distributed under the License is distributed on an "AS IS" BASIS,
200
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201
+ See the License for the specific language governing permissions and
202
+ limitations under the License.
vendor/maxmind/web-service-common/README.md ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # MaxMind Web Service Common #
2
+
3
+ This is _not_ intended for direct use by third parties. Rather, it is for
4
+ shared code between MaxMind's various web service APIs.
5
+
6
+ ## Requirements ##
7
+
8
+ The library requires PHP 5.4 or greater. This library works and is tested
9
+ with HHVM.
10
+
11
+ There are several other dependencies as defined in the `composer.json` file.
12
+
13
+ ## Contributing ##
14
+
15
+ Patches and pull requests are encouraged. All code should follow the PSR-2
16
+ style guidelines. Please include unit tests whenever possible.
17
+
18
+ ## Versioning ##
19
+
20
+ This API uses [Semantic Versioning](http://semver.org/).
21
+
22
+ ## Copyright and License ##
23
+
24
+ This software is Copyright (c) 2015-2017 by MaxMind, Inc.
25
+
26
+ This is free software, licensed under the Apache License, Version 2.0.
vendor/maxmind/web-service-common/composer.json ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "maxmind/web-service-common",
3
+ "description": "Internal MaxMind Web Service API",
4
+ "minimum-stability": "stable",
5
+ "homepage": "https://github.com/maxmind/web-service-common-php",
6
+ "type": "library",
7
+ "license": "Apache-2.0",
8
+ "authors": [
9
+ {
10
+ "name": "Gregory Oschwald",
11
+ "email": "goschwald@maxmind.com"
12
+ }
13
+ ],
14
+ "require": {
15
+ "php": ">=5.4",
16
+ "composer/ca-bundle": "^1.0.3",
17
+ "ext-curl": "*",
18
+ "ext-json": "*"
19
+ },
20
+ "require-dev": {
21
+ "friendsofphp/php-cs-fixer": "2.*",
22
+ "phpunit/phpunit": "4.*",
23
+ "squizlabs/php_codesniffer": "3.*"
24
+ },
25
+ "autoload": {
26
+ "psr-4": {
27
+ "MaxMind\\Exception\\": "src/Exception",
28
+ "MaxMind\\WebService\\": "src/WebService"
29
+ }
30
+ }
31
+ }
vendor/maxmind/web-service-common/src/Exception/AuthenticationException.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MaxMind\Exception;
4
+
5
+ /**
6
+ * This class represents an error authenticating.
7
+ */
8
+ class AuthenticationException extends InvalidRequestException
9
+ {
10
+ }
vendor/maxmind/web-service-common/src/Exception/HttpException.php ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MaxMind\Exception;
4
+
5
+ /**
6
+ * This class represents an HTTP transport error.
7
+ */
8
+ class HttpException extends WebServiceException
9
+ {
10
+ /**
11
+ * The URI queried.
12
+ */
13
+ private $uri;
14
+
15
+ /**
16
+ * @param string $message a message describing the error
17
+ * @param int $httpStatus the HTTP status code of the response
18
+ * @param string $uri the URI used in the request
19
+ * @param \Exception $previous the previous exception, if any
20
+ */
21
+ public function __construct(
22
+ $message,
23
+ $httpStatus,
24
+ $uri,
25
+ \Exception $previous = null
26
+ ) {
27
+ $this->uri = $uri;
28
+ parent::__construct($message, $httpStatus, $previous);
29
+ }
30
+
31
+ public function getUri()
32
+ {
33
+ return $this->uri;
34
+ }
35
+
36
+ public function getStatusCode()
37
+ {
38
+ return $this->getCode();
39
+ }
40
+ }
vendor/maxmind/web-service-common/src/Exception/InsufficientFundsException.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MaxMind\Exception;
4
+
5
+ /**
6
+ * Thrown when the account is out of credits.
7
+ */
8
+ class InsufficientFundsException extends InvalidRequestException
9
+ {
10
+ }
vendor/maxmind/web-service-common/src/Exception/InvalidInputException.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MaxMind\Exception;
4
+
5
+ /**
6
+ * This class represents an error in creating the request to be sent to the
7
+ * web service. For example, if the array cannot be encoded as JSON or if there
8
+ * is a missing or invalid field.
9
+ */
10
+ class InvalidInputException extends WebServiceException
11
+ {
12
+ }
vendor/maxmind/web-service-common/src/Exception/InvalidRequestException.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MaxMind\Exception;
4
+
5
+ /**
6
+ * Thrown when a MaxMind web service returns an error relating to the request.
7
+ */
8
+ class InvalidRequestException extends HttpException
9
+ {
10
+ /**
11
+ * The code returned by the MaxMind web service.
12
+ */
13
+ private $error;
14
+
15
+ /**
16
+ * @param string $message the exception message
17
+ * @param int $error the error code returned by the MaxMind web service
18
+ * @param int $httpStatus the HTTP status code of the response
19
+ * @param string $uri the URI queries
20
+ * @param \Exception $previous the previous exception, if any
21
+ */
22
+ public function __construct(
23
+ $message,
24
+ $error,
25
+ $httpStatus,
26
+ $uri,
27
+ \Exception $previous = null
28
+ ) {
29
+ $this->error = $error;
30
+ parent::__construct($message, $httpStatus, $uri, $previous);
31
+ }
32
+
33
+ public function getErrorCode()
34
+ {
35
+ return $this->error;
36
+ }
37
+ }
vendor/maxmind/web-service-common/src/Exception/IpAddressNotFoundException.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MaxMind\Exception;
4
+
5
+ class IpAddressNotFoundException extends InvalidRequestException
6
+ {
7
+ }
vendor/maxmind/web-service-common/src/Exception/PermissionRequiredException.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MaxMind\Exception;
4
+
5
+ /**
6
+ * This exception is thrown when the service requires permission to access.
7
+ */
8
+ class PermissionRequiredException extends InvalidRequestException
9
+ {
10
+ }
vendor/maxmind/web-service-common/src/Exception/WebServiceException.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MaxMind\Exception;
4
+
5
+ /**
6
+ * This class represents a generic web service error.
7
+ */
8
+ class WebServiceException extends \Exception
9
+ {
10
+ }
vendor/maxmind/web-service-common/src/WebService/Client.php ADDED
@@ -0,0 +1,470 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MaxMind\WebService;
4
+
5
+ use Composer\CaBundle\CaBundle;
6
+ use MaxMind\Exception\AuthenticationException;
7
+ use MaxMind\Exception\HttpException;
8
+ use MaxMind\Exception\InsufficientFundsException;
9
+ use MaxMind\Exception\InvalidInputException;
10
+ use MaxMind\Exception\InvalidRequestException;
11
+ use MaxMind\Exception\IpAddressNotFoundException;
12
+ use MaxMind\Exception\PermissionRequiredException;
13
+ use MaxMind\Exception\WebServiceException;
14
+ use MaxMind\WebService\Http\RequestFactory;
15
+
16
+ /**
17
+ * This class is not intended to be used directly by an end-user of a
18
+ * MaxMind web service. Please use the appropriate client API for the service
19
+ * that you are using.
20
+ *
21
+ * @internal
22
+ */
23
+ class Client
24
+ {
25
+ const VERSION = '0.2.0';
26
+
27
+ private $caBundle;
28
+ private $connectTimeout;
29
+ private $host = 'api.maxmind.com';
30
+ private $httpRequestFactory;
31
+ private $licenseKey;
32
+ private $proxy;
33
+ private $timeout;
34
+ private $userAgentPrefix;
35
+ private $userId;
36
+
37
+ /**
38
+ * @param int $userId your MaxMind user ID
39
+ * @param string $licenseKey your MaxMind license key
40
+ * @param array $options an array of options. Possible keys:
41
+ * * `host` - The host to use when connecting to the web service.
42
+ * * `userAgent` - The prefix of the User-Agent to use in the request.
43
+ * * `caBundle` - The bundle of CA root certificates to use in the request.
44
+ * * `connectTimeout` - The connect timeout to use for the request.
45
+ * * `timeout` - The timeout to use for the request.
46
+ * * `proxy` - The HTTP proxy to use. May include a schema, port,
47
+ * username, and password, e.g., `http://username:password@127.0.0.1:10`.
48
+ */
49
+ public function __construct(
50
+ $userId,
51
+ $licenseKey,
52
+ $options = []
53
+ ) {
54
+ $this->userId = $userId;
55
+ $this->licenseKey = $licenseKey;
56
+
57
+ $this->httpRequestFactory = isset($options['httpRequestFactory'])
58
+ ? $options['httpRequestFactory']
59
+ : new RequestFactory();
60
+
61
+ if (isset($options['host'])) {
62
+ $this->host = $options['host'];
63
+ }
64
+ if (isset($options['userAgent'])) {
65
+ $this->userAgentPrefix = $options['userAgent'] . ' ';
66
+ }
67
+
68
+ $this->caBundle = isset($options['caBundle']) ?
69
+ $this->caBundle = $options['caBundle'] : $this->getCaBundle();
70
+
71
+ if (isset($options['connectTimeout'])) {
72
+ $this->connectTimeout = $options['connectTimeout'];
73
+ }
74
+ if (isset($options['timeout'])) {
75
+ $this->timeout = $options['timeout'];
76
+ }
77
+
78
+ if (isset($options['proxy'])) {
79
+ $this->proxy = $options['proxy'];
80
+ }
81
+ }
82
+
83
+ /**
84
+ * @param string $service name of the service querying
85
+ * @param string $path the URI path to use
86
+ * @param array $input the data to be posted as JSON
87
+ *
88
+ * @throws InvalidInputException when the request has missing or invalid
89
+ * data
90
+ * @throws AuthenticationException when there is an issue authenticating the
91
+ * request
92
+ * @throws InsufficientFundsException when your account is out of funds
93
+ * @throws InvalidRequestException when the request is invalid for some
94
+ * other reason, e.g., invalid JSON in the POST.
95
+ * @throws HttpException when an unexpected HTTP error occurs
96
+ * @throws WebServiceException when some other error occurs. This also
97
+ * serves as the base class for the above exceptions.
98
+ *
99
+ * @return array The decoded content of a successful response
100
+ */
101
+ public function post($service, $path, $input)
102
+ {
103
+ $body = json_encode($input);
104
+ if ($body === false) {
105
+ throw new InvalidInputException(
106
+ 'Error encoding input as JSON: '
107
+ . $this->jsonErrorDescription()
108
+ );
109
+ }
110
+
111
+ $request = $this->createRequest(
112
+ $path,
113
+ ['Content-Type: application/json']
114
+ );
115
+
116
+ list($statusCode, $contentType, $body) = $request->post($body);
117
+
118
+ return $this->handleResponse(
119
+ $statusCode,
120
+ $contentType,
121
+ $body,
122
+ $service,
123
+ $path
124
+ );
125
+ }
126
+
127
+ public function get($service, $path)
128
+ {
129
+ $request = $this->createRequest($path);
130
+
131
+ list($statusCode, $contentType, $body) = $request->get();
132
+
133
+ return $this->handleResponse(
134
+ $statusCode,
135
+ $contentType,
136
+ $body,
137
+ $service,
138
+ $path
139
+ );
140
+ }
141
+
142
+ private function userAgent()
143
+ {
144
+ $curlVersion = curl_version();
145
+
146
+ return $this->userAgentPrefix . 'MaxMind-WS-API/' . self::VERSION . ' PHP/' . PHP_VERSION .
147
+ ' curl/' . $curlVersion['version'];
148
+ }
149
+
150
+ private function createRequest($path, $headers = [])
151
+ {
152
+ array_push(
153
+ $headers,
154
+ 'Authorization: Basic '
155
+ . base64_encode($this->userId . ':' . $this->licenseKey),
156
+ 'Accept: application/json'
157
+ );
158
+
159
+ return $this->httpRequestFactory->request(
160
+ $this->urlFor($path),
161
+ [
162
+ 'caBundle' => $this->caBundle,
163
+ 'connectTimeout' => $this->connectTimeout,
164
+ 'headers' => $headers,
165
+ 'proxy' => $this->proxy,
166
+ 'timeout' => $this->timeout,
167
+ 'userAgent' => $this->userAgent(),
168
+ ]
169
+ );
170
+ }
171
+
172
+ /**
173
+ * @param int $statusCode the HTTP status code of the response
174
+ * @param string $contentType the Content-Type of the response
175
+ * @param string $body the response body
176
+ * @param string $service the name of the service
177
+ * @param string $path the path used in the request
178
+ *
179
+ * @throws AuthenticationException when there is an issue authenticating the
180
+ * request
181
+ * @throws InsufficientFundsException when your account is out of funds
182
+ * @throws InvalidRequestException when the request is invalid for some
183
+ * other reason, e.g., invalid JSON in the POST.
184
+ * @throws HttpException when an unexpected HTTP error occurs
185
+ * @throws WebServiceException when some other error occurs. This also
186
+ * serves as the base class for the above exceptions
187
+ *
188
+ * @return array The decoded content of a successful response
189
+ */
190
+ private function handleResponse(
191
+ $statusCode,
192
+ $contentType,
193
+ $body,
194
+ $service,
195
+ $path
196
+ ) {
197
+ if ($statusCode >= 400 && $statusCode <= 499) {
198
+ $this->handle4xx($statusCode, $contentType, $body, $service, $path);
199
+ } elseif ($statusCode >= 500) {
200
+ $this->handle5xx($statusCode, $service, $path);
201
+ } elseif ($statusCode !== 200) {
202
+ $this->handleUnexpectedStatus($statusCode, $service, $path);
203
+ }
204
+
205
+ return $this->handleSuccess($body, $service);
206
+ }
207
+
208
+ /**
209
+ * @return string describing the JSON error
210
+ */
211
+ private function jsonErrorDescription()
212
+ {
213
+ $errno = json_last_error();
214
+ switch ($errno) {
215
+ case JSON_ERROR_DEPTH:
216
+ return 'The maximum stack depth has been exceeded.';
217
+ case JSON_ERROR_STATE_MISMATCH:
218
+ return 'Invalid or malformed JSON.';
219
+ case JSON_ERROR_CTRL_CHAR:
220
+ return 'Control character error.';
221
+ case JSON_ERROR_SYNTAX:
222
+ return 'Syntax error.';
223
+ case JSON_ERROR_UTF8:
224
+ return 'Malformed UTF-8 characters.';
225
+ default:
226
+ return "Other JSON error ($errno).";
227
+ }
228
+ }
229
+
230
+ /**
231
+ * @param string $path the path to use in the URL
232
+ *
233
+ * @return string the constructed URL
234
+ */
235
+ private function urlFor($path)
236
+ {
237
+ return 'https://' . $this->host . $path;
238
+ }
239
+
240
+ /**
241
+ * @param int $statusCode the HTTP status code
242
+ * @param string $contentType the response content-type
243
+ * @param string $body the response body
244
+ * @param string $service the service name
245
+ * @param string $path the path used in the request
246
+ *
247
+ * @throws AuthenticationException
248
+ * @throws HttpException
249
+ * @throws InsufficientFundsException
250
+ * @throws InvalidRequestException
251
+ */
252
+ private function handle4xx(
253
+ $statusCode,
254
+ $contentType,
255
+ $body,
256
+ $service,
257
+ $path
258
+ ) {
259
+ if (strlen($body) === 0) {
260
+ throw new HttpException(
261
+ "Received a $statusCode error for $service with no body",
262
+ $statusCode,
263
+ $this->urlFor($path)
264
+ );
265
+ }
266
+ if (!strstr($contentType, 'json')) {
267
+ throw new HttpException(
268
+ "Received a $statusCode error for $service with " .
269
+ 'the following body: ' . $body,
270
+ $statusCode,
271
+ $this->urlFor($path)
272
+ );
273
+ }
274
+
275
+ $message = json_decode($body, true);
276
+ if ($message === null) {
277
+ throw new HttpException(
278
+ "Received a $statusCode error for $service but could " .
279
+ 'not decode the response as JSON: '
280
+ . $this->jsonErrorDescription() . ' Body: ' . $body,
281
+ $statusCode,
282
+ $this->urlFor($path)
283
+ );
284
+ }
285
+
286
+ if (!isset($message['code']) || !isset($message['error'])) {
287
+ throw new HttpException(
288
+ 'Error response contains JSON but it does not ' .
289
+ 'specify code or error keys: ' . $body,
290
+ $statusCode,
291
+ $this->urlFor($path)
292
+ );
293
+ }
294
+
295
+ $this->handleWebServiceError(
296
+ $message['error'],
297
+ $message['code'],
298
+ $statusCode,
299
+ $path
300
+ );
301
+ }
302
+
303
+ /**
304
+ * @param string $message the error message from the web service
305
+ * @param string $code the error code from the web service
306
+ * @param int $statusCode the HTTP status code
307
+ * @param string $path the path used in the request
308
+ *
309
+ * @throws AuthenticationException
310
+ * @throws InvalidRequestException
311
+ * @throws InsufficientFundsException
312
+ */
313
+ private function handleWebServiceError(
314
+ $message,
315
+ $code,
316
+ $statusCode,
317
+ $path
318
+ ) {
319
+ switch ($code) {
320
+ case 'IP_ADDRESS_NOT_FOUND':
321
+ case 'IP_ADDRESS_RESERVED':
322
+ throw new IpAddressNotFoundException(
323
+ $message,
324
+ $code,
325
+ $statusCode,
326
+ $this->urlFor($path)
327
+ );
328
+ case 'AUTHORIZATION_INVALID':
329
+ case 'LICENSE_KEY_REQUIRED':
330
+ case 'USER_ID_REQUIRED':
331
+ case 'USER_ID_UNKNOWN':
332
+ throw new AuthenticationException(
333
+ $message,
334
+ $code,
335
+ $statusCode,
336
+ $this->urlFor($path)
337
+ );
338
+ case 'OUT_OF_QUERIES':
339
+ case 'INSUFFICIENT_FUNDS':
340
+ throw new InsufficientFundsException(
341
+ $message,
342
+ $code,
343
+ $statusCode,
344
+ $this->urlFor($path)
345
+ );
346
+ case 'PERMISSION_REQUIRED':
347
+ throw new PermissionRequiredException(
348
+ $message,
349
+ $code,
350
+ $statusCode,
351
+ $this->urlFor($path)
352
+ );
353
+ default:
354
+ throw new InvalidRequestException(
355
+ $message,
356
+ $code,
357
+ $statusCode,
358
+ $this->urlFor($path)
359
+ );
360
+ }
361
+ }
362
+
363
+ /**
364
+ * @param int $statusCode the HTTP status code
365
+ * @param string $service the service name
366
+ * @param string $path the URI path used in the request
367
+ *
368
+ * @throws HttpException
369
+ */
370
+ private function handle5xx($statusCode, $service, $path)
371
+ {
372
+ throw new HttpException(
373
+ "Received a server error ($statusCode) for $service",
374
+ $statusCode,
375
+ $this->urlFor($path)
376
+ );
377
+ }
378
+
379
+ /**
380
+ * @param int $statusCode the HTTP status code
381
+ * @param string $service the service name
382
+ * @param string $path the URI path used in the request
383
+ *
384
+ * @throws HttpException
385
+ */
386
+ private function handleUnexpectedStatus($statusCode, $service, $path)
387
+ {
388
+ throw new HttpException(
389
+ 'Received an unexpected HTTP status ' .
390
+ "($statusCode) for $service",
391
+ $statusCode,
392
+ $this->urlFor($path)
393
+ );
394
+ }
395
+
396
+ /**
397
+ * @param string $body the successful request body
398
+ * @param string $service the service name
399
+ *
400
+ * @throws WebServiceException if the request body cannot be decoded as
401
+ * JSON
402
+ *
403
+ * @return array the decoded request body
404
+ */
405
+ private function handleSuccess($body, $service)
406
+ {
407
+ if (strlen($body) === 0) {
408
+ throw new WebServiceException(
409
+ "Received a 200 response for $service but did not " .
410
+ 'receive a HTTP body.'
411
+ );
412
+ }
413
+
414
+ $decodedContent = json_decode($body, true);
415
+ if ($decodedContent === null) {
416
+ throw new WebServiceException(
417
+ "Received a 200 response for $service but could " .
418
+ 'not decode the response as JSON: '
419
+ . $this->jsonErrorDescription() . ' Body: ' . $body
420
+ );
421
+ }
422
+
423
+ return $decodedContent;
424
+ }
425
+
426
+ private function getCaBundle()
427
+ {
428
+ $curlVersion = curl_version();
429
+
430
+ // On OS X, when the SSL version is "SecureTransport", the system's
431
+ // keychain will be used.
432
+ if ($curlVersion['ssl_version'] === 'SecureTransport') {
433
+ return;
434
+ }
435
+ $cert = CaBundle::getSystemCaRootBundlePath();
436
+
437
+ // Check if the cert is inside a phar. If so, we need to copy the cert
438
+ // to a temp file so that curl can see it.
439
+ if (substr($cert, 0, 7) === 'phar://') {
440
+ $tempDir = sys_get_temp_dir();
441
+ $newCert = tempnam($tempDir, 'geoip2-');
442
+ if ($newCert === false) {
443
+ throw new \RuntimeException(
444
+ "Unable to create temporary file in $tempDir"
445
+ );
446
+ }
447
+ if (!copy($cert, $newCert)) {
448
+ throw new \RuntimeException(
449
+ "Could not copy $cert to $newCert: "
450
+ . var_export(error_get_last(), true)
451
+ );
452
+ }
453
+
454
+ // We use a shutdown function rather than the destructor as the
455
+ // destructor isn't called on a fatal error such as an uncaught
456
+ // exception.
457
+ register_shutdown_function(
458
+ function () use ($newCert) {
459
+ unlink($newCert);
460
+ }
461
+ );
462
+ $cert = $newCert;
463
+ }
464
+ if (!file_exists($cert)) {
465
+ throw new \RuntimeException("CA cert does not exist at $cert");
466
+ }
467
+
468
+ return $cert;
469
+ }
470
+ }
vendor/maxmind/web-service-common/src/WebService/Http/CurlRequest.php ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MaxMind\WebService\Http;
4
+
5
+ use MaxMind\Exception\HttpException;
6
+
7
+ /**
8
+ * This class is for internal use only. Semantic versioning does not not apply.
9
+ *
10
+ * @internal
11
+ */
12
+ class CurlRequest implements Request
13
+ {
14
+ private $url;
15
+ private $options;
16
+
17
+ /**
18
+ * @param $url
19
+ * @param $options
20
+ */
21
+ public function __construct($url, $options)
22
+ {
23
+ $this->url = $url;
24
+ $this->options = $options;
25
+ }
26
+
27
+ /**
28
+ * @param $body
29
+ *
30
+ * @return array
31
+ */
32
+ public function post($body)
33
+ {
34
+ $curl = $this->createCurl();
35
+
36
+ curl_setopt($curl, CURLOPT_POST, true);
37
+ curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
38
+
39
+ return $this->execute($curl);
40
+ }
41
+
42
+ public function get()
43
+ {
44
+ $curl = $this->createCurl();
45
+
46
+ curl_setopt($curl, CURLOPT_HTTPGET, true);
47
+
48
+ return $this->execute($curl);
49
+ }
50
+
51
+ /**
52
+ * @return resource
53
+ */
54
+ private function createCurl()
55
+ {
56
+ $curl = curl_init($this->url);
57
+
58
+ if (!empty($this->options['caBundle'])) {
59
+ $opts[CURLOPT_CAINFO] = $this->options['caBundle'];
60
+ }
61
+ $opts[CURLOPT_SSL_VERIFYHOST] = 2;
62
+ $opts[CURLOPT_FOLLOWLOCATION] = false;
63
+ $opts[CURLOPT_SSL_VERIFYPEER] = true;
64
+ $opts[CURLOPT_RETURNTRANSFER] = true;
65
+
66
+ $opts[CURLOPT_HTTPHEADER] = $this->options['headers'];
67
+ $opts[CURLOPT_USERAGENT] = $this->options['userAgent'];
68
+ $opts[CURLOPT_PROXY] = $this->options['proxy'];
69
+
70
+ // The defined()s are here as the *_MS opts are not available on older
71
+ // cURL versions
72
+ $connectTimeout = $this->options['connectTimeout'];
73
+ if (defined('CURLOPT_CONNECTTIMEOUT_MS')) {
74
+ $opts[CURLOPT_CONNECTTIMEOUT_MS] = ceil($connectTimeout * 1000);
75
+ } else {
76
+ $opts[CURLOPT_CONNECTTIMEOUT] = ceil($connectTimeout);
77
+ }
78
+
79
+ $timeout = $this->options['timeout'];
80
+ if (defined('CURLOPT_TIMEOUT_MS')) {
81
+ $opts[CURLOPT_TIMEOUT_MS] = ceil($timeout * 1000);
82
+ } else {
83
+ $opts[CURLOPT_TIMEOUT] = ceil($timeout);
84
+ }
85
+
86
+ curl_setopt_array($curl, $opts);
87
+
88
+ return $curl;
89
+ }
90
+
91
+ private function execute($curl)
92
+ {
93
+ $body = curl_exec($curl);
94
+ if ($errno = curl_errno($curl)) {
95
+ $errorMessage = curl_error($curl);
96
+
97
+ throw new HttpException(
98
+ "cURL error ({$errno}): {$errorMessage}",
99
+ 0,
100
+ $this->url
101
+ );
102
+ }
103
+
104
+ $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
105
+ $contentType = curl_getinfo($curl, CURLINFO_CONTENT_TYPE);
106
+ curl_close($curl);
107
+
108
+ return [$statusCode, $contentType, $body];
109
+ }
110
+ }
vendor/maxmind/web-service-common/src/WebService/Http/Request.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MaxMind\WebService\Http;
4
+
5
+ /**
6
+ * Interface Request.
7
+ *
8
+ * @internal
9
+ */
10
+ interface Request
11
+ {
12
+ /**
13
+ * @param $url
14
+ * @param $options
15
+ */
16
+ public function __construct($url, $options);
17
+
18
+ /**
19
+ * @param $body
20
+ *
21
+ * @return mixed
22
+ */
23
+ public function post($body);
24
+
25
+ /**
26
+ * @return mixed
27
+ */
28
+ public function get();
29
+ }
vendor/maxmind/web-service-common/src/WebService/Http/RequestFactory.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace MaxMind\WebService\Http;
4
+
5
+ /**
6
+ * Class RequestFactory.
7
+ *
8
+ * @internal
9
+ */
10
+ class RequestFactory
11
+ {
12
+ public function __construct()
13
+ {
14
+ }
15
+
16
+ /**
17
+ * @param $url
18
+ * @param $options
19
+ *
20
+ * @return CurlRequest
21
+ */
22
+ public function request($url, $options)
23
+ {
24
+ return new CurlRequest($url, $options);
25
+ }
26
+ }