From e96c363eefe79ca7f0254a113f44da8e1c2881f3 Mon Sep 17 00:00:00 2001 From: Bob Trahan Date: Fri, 9 May 2014 12:47:21 -0700 Subject: [PATCH] Add SMS support Summary: Provides a working SMS implementation with support for Twilio. This version doesn't really retry if we get any gruff at all. Future versions should retry. Test Plan: used bin/sms to send messages and look at them. Reviewers: chad, epriestley Reviewed By: epriestley Subscribers: aurelijus, epriestley, Korvin Maniphest Tasks: T920 Differential Revision: https://secure.phabricator.com/D8930 --- bin/sms | 1 + externals/twilio-php/AUTHORS.md | 35 + externals/twilio-php/CHANGES.md | 261 ++ externals/twilio-php/LICENSE | 22 + externals/twilio-php/Makefile | 72 + externals/twilio-php/README.md | 136 + externals/twilio-php/Services/Twilio.php | 313 ++ .../Services/Twilio/AutoPagingIterator.php | 109 + .../twilio-php/Services/Twilio/Capability.php | 346 ++ .../Services/Twilio/HttpException.php | 3 + .../twilio-php/Services/Twilio/HttpStream.php | 94 + .../Services/Twilio/InstanceResource.php | 84 + .../Services/Twilio/ListResource.php | 203 + .../twilio-php/Services/Twilio/NumberType.php | 35 + externals/twilio-php/Services/Twilio/Page.php | 68 + .../Twilio/PartialApplicationHelper.php | 41 + .../Services/Twilio/RequestValidator.php | 36 + .../twilio-php/Services/Twilio/Resource.php | 134 + .../Services/Twilio/Rest/Account.php | 33 + .../Services/Twilio/Rest/Accounts.php | 25 + .../Services/Twilio/Rest/Application.php | 6 + .../Services/Twilio/Rest/Applications.php | 12 + .../Twilio/Rest/AuthorizedConnectApp.php | 6 + .../Twilio/Rest/AuthorizedConnectApps.php | 10 + .../Twilio/Rest/AvailablePhoneNumber.php | 7 + .../Twilio/Rest/AvailablePhoneNumbers.php | 54 + .../twilio-php/Services/Twilio/Rest/Call.php | 105 + .../twilio-php/Services/Twilio/Rest/Calls.php | 27 + .../Services/Twilio/Rest/Conference.php | 12 + .../Services/Twilio/Rest/Conferences.php | 6 + .../Services/Twilio/Rest/ConnectApp.php | 6 + .../Services/Twilio/Rest/ConnectApps.php | 10 + .../Services/Twilio/Rest/Credential.php | 30 + .../Services/Twilio/Rest/CredentialList.php | 42 + .../Twilio/Rest/CredentialListMapping.php | 37 + .../Twilio/Rest/CredentialListMappings.php | 24 + .../Services/Twilio/Rest/CredentialLists.php | 24 + .../Services/Twilio/Rest/Credentials.php | 28 + .../Services/Twilio/Rest/Domain.php | 70 + .../Services/Twilio/Rest/Domains.php | 28 + .../Twilio/Rest/IncomingPhoneNumber.php | 91 + .../Twilio/Rest/IncomingPhoneNumbers.php | 59 + .../Twilio/Rest/IpAccessControlList.php | 40 + .../Rest/IpAccessControlListMapping.php | 37 + .../Rest/IpAccessControlListMappings.php | 25 + .../Twilio/Rest/IpAccessControlLists.php | 27 + .../Services/Twilio/Rest/IpAddress.php | 34 + .../Services/Twilio/Rest/IpAddresses.php | 33 + .../twilio-php/Services/Twilio/Rest/Media.php | 31 + .../Services/Twilio/Rest/MediaInstance.php | 37 + .../Services/Twilio/Rest/Member.php | 22 + .../Services/Twilio/Rest/Members.php | 28 + .../Services/Twilio/Rest/Message.php | 53 + .../Services/Twilio/Rest/Messages.php | 73 + .../Services/Twilio/Rest/Notification.php | 6 + .../Services/Twilio/Rest/Notifications.php | 6 + .../Services/Twilio/Rest/OutgoingCallerId.php | 6 + .../Twilio/Rest/OutgoingCallerIds.php | 12 + .../Services/Twilio/Rest/Participant.php | 10 + .../Services/Twilio/Rest/Participants.php | 10 + .../twilio-php/Services/Twilio/Rest/Queue.php | 10 + .../Services/Twilio/Rest/Queues.php | 19 + .../Services/Twilio/Rest/Recording.php | 9 + .../Services/Twilio/Rest/Recordings.php | 6 + .../Services/Twilio/Rest/Sandbox.php | 6 + .../Services/Twilio/Rest/ShortCode.php | 6 + .../Services/Twilio/Rest/ShortCodes.php | 10 + .../twilio-php/Services/Twilio/Rest/Sip.php | 19 + .../Services/Twilio/Rest/SmsMessage.php | 6 + .../Services/Twilio/Rest/SmsMessages.php | 18 + .../Services/Twilio/Rest/Transcription.php | 6 + .../Services/Twilio/Rest/Transcriptions.php | 6 + .../Services/Twilio/Rest/UsageRecord.php | 6 + .../Services/Twilio/Rest/UsageRecords.php | 33 + .../Services/Twilio/Rest/UsageTrigger.php | 5 + .../Services/Twilio/Rest/UsageTriggers.php | 27 + .../Services/Twilio/RestException.php | 44 + .../Services/Twilio/SIPListResource.php | 14 + .../Services/Twilio/TimeRangeResource.php | 31 + .../twilio-php/Services/Twilio/TinyHttp.php | 126 + .../twilio-php/Services/Twilio/Twiml.php | 137 + .../Services/Twilio/UsageResource.php | 20 + externals/twilio-php/Services/cacert.pem | 3849 +++++++++++++++++ externals/twilio-php/composer.json | 30 + externals/twilio-php/composer.lock | 492 +++ externals/twilio-php/docs/Makefile | 130 + externals/twilio-php/docs/_themes/.gitignore | 3 + externals/twilio-php/docs/_themes/LICENSE | 45 + externals/twilio-php/docs/_themes/README.rst | 25 + .../docs/_themes/flask_theme_support.py | 86 + .../twilio-php/docs/_themes/kr/layout.html | 32 + .../twilio-php/docs/_themes/kr/relations.html | 19 + .../docs/_themes/kr/static/flasky.css_t | 469 ++ .../docs/_themes/kr/static/small_flask.css | 70 + .../twilio-php/docs/_themes/kr/theme.conf | 7 + .../docs/_themes/kr_small/layout.html | 22 + .../docs/_themes/kr_small/static/flasky.css_t | 287 ++ .../docs/_themes/kr_small/theme.conf | 10 + externals/twilio-php/docs/api/rest.rst | 872 ++++ externals/twilio-php/docs/api/services.rst | 26 + externals/twilio-php/docs/api/twiml.rst | 7 + externals/twilio-php/docs/conf.py | 226 + externals/twilio-php/docs/faq.rst | 176 + externals/twilio-php/docs/index.rst | 188 + externals/twilio-php/docs/quickstart.rst | 34 + externals/twilio-php/docs/requirements.txt | 3 + externals/twilio-php/docs/usage/rest.rst | 98 + .../twilio-php/docs/usage/rest/accounts.rst | 24 + .../docs/usage/rest/applications.rst | 50 + .../twilio-php/docs/usage/rest/callerids.rst | 27 + .../twilio-php/docs/usage/rest/calls.rst | 141 + .../docs/usage/rest/conferences.rst | 48 + .../twilio-php/docs/usage/rest/members.rst | 46 + .../twilio-php/docs/usage/rest/messages.rst | 50 + .../docs/usage/rest/notifications.rst | 13 + .../docs/usage/rest/phonenumbers.rst | 187 + .../twilio-php/docs/usage/rest/queues.rst | 56 + .../twilio-php/docs/usage/rest/recordings.rst | 61 + externals/twilio-php/docs/usage/rest/sip.rst | 88 + .../docs/usage/rest/sms-messages.rst | 50 + .../docs/usage/rest/transcriptions.rst | 13 + .../docs/usage/rest/usage-records.rst | 91 + .../docs/usage/rest/usage-triggers.rst | 92 + .../docs/usage/token-generation.rst | 64 + externals/twilio-php/docs/usage/twiml.rst | 347 ++ .../twilio-php/docs/usage/validation.rst | 66 + externals/twilio-php/package.php | 117 + externals/twilio-php/tests/Bootstrap.php | 27 + externals/twilio-php/tests/BuildQueryTest.php | 56 + externals/twilio-php/tests/CapabilityTest.php | 106 + externals/twilio-php/tests/README | 3 + .../twilio-php/tests/RequestValidatorTest.php | 48 + externals/twilio-php/tests/TwilioTest.php | 672 +++ externals/twilio-php/tests/TwimlTest.php | 377 ++ externals/twilio-php/tests/phpunit.xml | 7 + .../tests/resources/AccountsTest.php | 29 + .../tests/resources/ApplicationsTest.php | 28 + .../resources/AvailablePhoneNumbersTest.php | 57 + .../twilio-php/tests/resources/CallsTest.php | 25 + .../tests/resources/ConnectAppsTest.php | 54 + .../resources/IncomingPhoneNumbersTest.php | 104 + .../twilio-php/tests/resources/MediaTest.php | 28 + .../tests/resources/MembersTest.php | 83 + .../tests/resources/MessagesTest.php | 123 + .../tests/resources/NotificationTest.php | 20 + .../tests/resources/OutgoingCallerIdsTest.php | 30 + .../twilio-php/tests/resources/QueuesTest.php | 28 + .../tests/resources/SMSMessagesTest.php | 38 + .../tests/resources/SandboxTest.php | 23 + .../tests/resources/ShortCodesTest.php | 19 + .../tests/resources/UsageRecordsTest.php | 180 + .../tests/resources/UsageTriggersTest.php | 114 + .../sql/autopatches/20140507.smstable.sql | 12 + scripts/sms/manage_sms.php | 21 + src/__phutil_library_map__.php | 25 + .../option/PhabricatorSMSConfigOptions.php | 55 + .../PhabricatorSMSImplementationAdapter.php | 84 + ...rSMSImplementationTestBlackholeAdapter.php | 30 + ...bricatorSMSImplementationTwilioAdapter.php | 99 + ...catorSMSManagementListOutboundWorkflow.php | 50 + ...abricatorSMSManagementSendTestWorkflow.php | 48 + ...catorSMSManagementShowOutboundWorkflow.php | 69 + .../PhabricatorSMSManagementWorkflow.php | 6 + .../sms/storage/PhabricatorSMS.php | 56 + .../sms/storage/PhabricatorSMSDAO.php | 11 + .../PhabricatorSMSDemultiplexWorker.php | 30 + .../sms/worker/PhabricatorSMSSendWorker.php | 76 + .../sms/worker/PhabricatorSMSWorker.php | 11 + 168 files changed, 15598 insertions(+) create mode 120000 bin/sms create mode 100755 externals/twilio-php/AUTHORS.md create mode 100755 externals/twilio-php/CHANGES.md create mode 100755 externals/twilio-php/LICENSE create mode 100755 externals/twilio-php/Makefile create mode 100755 externals/twilio-php/README.md create mode 100755 externals/twilio-php/Services/Twilio.php create mode 100755 externals/twilio-php/Services/Twilio/AutoPagingIterator.php create mode 100755 externals/twilio-php/Services/Twilio/Capability.php create mode 100755 externals/twilio-php/Services/Twilio/HttpException.php create mode 100755 externals/twilio-php/Services/Twilio/HttpStream.php create mode 100755 externals/twilio-php/Services/Twilio/InstanceResource.php create mode 100755 externals/twilio-php/Services/Twilio/ListResource.php create mode 100755 externals/twilio-php/Services/Twilio/NumberType.php create mode 100755 externals/twilio-php/Services/Twilio/Page.php create mode 100755 externals/twilio-php/Services/Twilio/PartialApplicationHelper.php create mode 100755 externals/twilio-php/Services/Twilio/RequestValidator.php create mode 100755 externals/twilio-php/Services/Twilio/Resource.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Account.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Accounts.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Application.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Applications.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/AuthorizedConnectApp.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/AuthorizedConnectApps.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/AvailablePhoneNumber.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/AvailablePhoneNumbers.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Call.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Calls.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Conference.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Conferences.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/ConnectApp.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/ConnectApps.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Credential.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/CredentialList.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/CredentialListMapping.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/CredentialListMappings.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/CredentialLists.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Credentials.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Domain.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Domains.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/IncomingPhoneNumber.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/IncomingPhoneNumbers.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/IpAccessControlList.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/IpAccessControlListMapping.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/IpAccessControlListMappings.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/IpAccessControlLists.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/IpAddress.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/IpAddresses.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Media.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/MediaInstance.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Member.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Members.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Message.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Messages.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Notification.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Notifications.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/OutgoingCallerId.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/OutgoingCallerIds.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Participant.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Participants.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Queue.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Queues.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Recording.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Recordings.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Sandbox.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/ShortCode.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/ShortCodes.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Sip.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/SmsMessage.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/SmsMessages.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Transcription.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/Transcriptions.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/UsageRecord.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/UsageRecords.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/UsageTrigger.php create mode 100755 externals/twilio-php/Services/Twilio/Rest/UsageTriggers.php create mode 100755 externals/twilio-php/Services/Twilio/RestException.php create mode 100755 externals/twilio-php/Services/Twilio/SIPListResource.php create mode 100755 externals/twilio-php/Services/Twilio/TimeRangeResource.php create mode 100755 externals/twilio-php/Services/Twilio/TinyHttp.php create mode 100755 externals/twilio-php/Services/Twilio/Twiml.php create mode 100755 externals/twilio-php/Services/Twilio/UsageResource.php create mode 100755 externals/twilio-php/Services/cacert.pem create mode 100755 externals/twilio-php/composer.json create mode 100755 externals/twilio-php/composer.lock create mode 100755 externals/twilio-php/docs/Makefile create mode 100755 externals/twilio-php/docs/_themes/.gitignore create mode 100755 externals/twilio-php/docs/_themes/LICENSE create mode 100755 externals/twilio-php/docs/_themes/README.rst create mode 100755 externals/twilio-php/docs/_themes/flask_theme_support.py create mode 100755 externals/twilio-php/docs/_themes/kr/layout.html create mode 100755 externals/twilio-php/docs/_themes/kr/relations.html create mode 100755 externals/twilio-php/docs/_themes/kr/static/flasky.css_t create mode 100755 externals/twilio-php/docs/_themes/kr/static/small_flask.css create mode 100755 externals/twilio-php/docs/_themes/kr/theme.conf create mode 100755 externals/twilio-php/docs/_themes/kr_small/layout.html create mode 100755 externals/twilio-php/docs/_themes/kr_small/static/flasky.css_t create mode 100755 externals/twilio-php/docs/_themes/kr_small/theme.conf create mode 100755 externals/twilio-php/docs/api/rest.rst create mode 100755 externals/twilio-php/docs/api/services.rst create mode 100755 externals/twilio-php/docs/api/twiml.rst create mode 100755 externals/twilio-php/docs/conf.py create mode 100755 externals/twilio-php/docs/faq.rst create mode 100755 externals/twilio-php/docs/index.rst create mode 100755 externals/twilio-php/docs/quickstart.rst create mode 100755 externals/twilio-php/docs/requirements.txt create mode 100755 externals/twilio-php/docs/usage/rest.rst create mode 100755 externals/twilio-php/docs/usage/rest/accounts.rst create mode 100755 externals/twilio-php/docs/usage/rest/applications.rst create mode 100755 externals/twilio-php/docs/usage/rest/callerids.rst create mode 100755 externals/twilio-php/docs/usage/rest/calls.rst create mode 100755 externals/twilio-php/docs/usage/rest/conferences.rst create mode 100755 externals/twilio-php/docs/usage/rest/members.rst create mode 100755 externals/twilio-php/docs/usage/rest/messages.rst create mode 100755 externals/twilio-php/docs/usage/rest/notifications.rst create mode 100755 externals/twilio-php/docs/usage/rest/phonenumbers.rst create mode 100755 externals/twilio-php/docs/usage/rest/queues.rst create mode 100755 externals/twilio-php/docs/usage/rest/recordings.rst create mode 100755 externals/twilio-php/docs/usage/rest/sip.rst create mode 100755 externals/twilio-php/docs/usage/rest/sms-messages.rst create mode 100755 externals/twilio-php/docs/usage/rest/transcriptions.rst create mode 100755 externals/twilio-php/docs/usage/rest/usage-records.rst create mode 100755 externals/twilio-php/docs/usage/rest/usage-triggers.rst create mode 100755 externals/twilio-php/docs/usage/token-generation.rst create mode 100755 externals/twilio-php/docs/usage/twiml.rst create mode 100755 externals/twilio-php/docs/usage/validation.rst create mode 100755 externals/twilio-php/package.php create mode 100755 externals/twilio-php/tests/Bootstrap.php create mode 100755 externals/twilio-php/tests/BuildQueryTest.php create mode 100755 externals/twilio-php/tests/CapabilityTest.php create mode 100755 externals/twilio-php/tests/README create mode 100755 externals/twilio-php/tests/RequestValidatorTest.php create mode 100755 externals/twilio-php/tests/TwilioTest.php create mode 100755 externals/twilio-php/tests/TwimlTest.php create mode 100755 externals/twilio-php/tests/phpunit.xml create mode 100755 externals/twilio-php/tests/resources/AccountsTest.php create mode 100755 externals/twilio-php/tests/resources/ApplicationsTest.php create mode 100755 externals/twilio-php/tests/resources/AvailablePhoneNumbersTest.php create mode 100755 externals/twilio-php/tests/resources/CallsTest.php create mode 100755 externals/twilio-php/tests/resources/ConnectAppsTest.php create mode 100755 externals/twilio-php/tests/resources/IncomingPhoneNumbersTest.php create mode 100755 externals/twilio-php/tests/resources/MediaTest.php create mode 100755 externals/twilio-php/tests/resources/MembersTest.php create mode 100755 externals/twilio-php/tests/resources/MessagesTest.php create mode 100755 externals/twilio-php/tests/resources/NotificationTest.php create mode 100755 externals/twilio-php/tests/resources/OutgoingCallerIdsTest.php create mode 100755 externals/twilio-php/tests/resources/QueuesTest.php create mode 100755 externals/twilio-php/tests/resources/SMSMessagesTest.php create mode 100755 externals/twilio-php/tests/resources/SandboxTest.php create mode 100755 externals/twilio-php/tests/resources/ShortCodesTest.php create mode 100755 externals/twilio-php/tests/resources/UsageRecordsTest.php create mode 100755 externals/twilio-php/tests/resources/UsageTriggersTest.php create mode 100644 resources/sql/autopatches/20140507.smstable.sql create mode 100755 scripts/sms/manage_sms.php create mode 100644 src/applications/config/option/PhabricatorSMSConfigOptions.php create mode 100644 src/infrastructure/sms/adapter/PhabricatorSMSImplementationAdapter.php create mode 100644 src/infrastructure/sms/adapter/PhabricatorSMSImplementationTestBlackholeAdapter.php create mode 100644 src/infrastructure/sms/adapter/PhabricatorSMSImplementationTwilioAdapter.php create mode 100644 src/infrastructure/sms/management/PhabricatorSMSManagementListOutboundWorkflow.php create mode 100644 src/infrastructure/sms/management/PhabricatorSMSManagementSendTestWorkflow.php create mode 100644 src/infrastructure/sms/management/PhabricatorSMSManagementShowOutboundWorkflow.php create mode 100644 src/infrastructure/sms/management/PhabricatorSMSManagementWorkflow.php create mode 100644 src/infrastructure/sms/storage/PhabricatorSMS.php create mode 100644 src/infrastructure/sms/storage/PhabricatorSMSDAO.php create mode 100644 src/infrastructure/sms/worker/PhabricatorSMSDemultiplexWorker.php create mode 100644 src/infrastructure/sms/worker/PhabricatorSMSSendWorker.php create mode 100644 src/infrastructure/sms/worker/PhabricatorSMSWorker.php diff --git a/bin/sms b/bin/sms new file mode 120000 index 0000000000..e622b50747 --- /dev/null +++ b/bin/sms @@ -0,0 +1 @@ +../scripts/sms/manage_sms.php \ No newline at end of file diff --git a/externals/twilio-php/AUTHORS.md b/externals/twilio-php/AUTHORS.md new file mode 100755 index 0000000000..0ece74d235 --- /dev/null +++ b/externals/twilio-php/AUTHORS.md @@ -0,0 +1,35 @@ +Authors +======= + +A huge thanks to all of our contributors: + + +- =noloh +- Adam Ballai +- Alex Chan +- Alex Rowley +- Brett Gerry +- Bulat Shakirzyanov +- Chris Barr +- D Keith Casey Jr +- D. Keith Casey, Jr. +- Doug Black +- John Britton +- Jordi Boggiano +- Keith Casey +- Kevin Burke +- Kyle +- Kyle Conroy +- Luke Waite +- Neuman +- Neuman Vong +- Peter Meth +- Ryan Brideau +- Sam Kimbrel +- Shawn Parker +- Stuart Langley +- Taichiro Yoshida +- Trenton McManus +- aaronfoss +- sashalaundy +- till diff --git a/externals/twilio-php/CHANGES.md b/externals/twilio-php/CHANGES.md new file mode 100755 index 0000000000..1bd6731380 --- /dev/null +++ b/externals/twilio-php/CHANGES.md @@ -0,0 +1,261 @@ +twilio-php Changelog +==================== + +Version 3.12.4 +-------------- + +Released on January 30, 2014 + +- Fix incorrect use of static:: which broke compatibility with PHP 5.2. + +Version 3.12.3 +-------------- + +Released on January 28, 2014 + +- Add link from recordings to associated transcriptions. +- Document how to debug requests, improve TwiML generation docs. + +Version 3.12.2 +-------------- + +Released on January 5, 2014 + +- Fixes string representation of resources +- Support PHP 5.5 + +Version 3.12.1 +-------------- + +Released on October 21, 2013 + +- Add support for filtering by type for IncomingPhoneNumbers. +- Add support for searching for mobile numbers for both +IncomingPhoneNumbers and AvailablePhoneNumbers. + +Version 3.12.0 +-------------- + +Released on September 18, 2013 + +- Support MMS +- Support SIP In +- $params arrays will now turn lists into multiple HTTP keys with the same name, + + array("Twilio" => array('foo', 'bar')) + + will turn into Twilio=foo&Twilio=bar when sent to the API. + +- Update the documentation to use php-autodoc and Sphinx. + +Version 3.11.0 +-------------- + +Released on June 13 + +- Support Streams when curl is not available for PHP installations + +Version 3.10.0 +-------------- + +Released on February 2, 2013 + +- Uses the [HTTP status code for error reporting][http], instead of the +`status` attribute of the JSON response. (Reporter: [Ruud Kamphuis](/ruudk)) + +[http]: https://github.com/twilio/twilio-php/pull/116 + +Version 3.9.1 +------------- + +Released on December 30, 2012 + +- Adds a `$last_response` parameter to the `$client` object that can be +used to [retrieve the raw API response][last-response]. (Reporter: [David +Jones](/dxjones)) + +[last-response]: https://github.com/twilio/twilio-php/pull/112/files + +Version 3.9.0 +------------- + +Released on December 20, 2012 + +- [Fixes TwiML generation to handle non-ASCII characters properly][utf-8]. Note + that as of version 3.9.0, **the library requires PHP version 5.2.3, at least + for TwiML generation**. (Reporter: [Walker Hamilton](/walker)) + +[utf-8]: https://github.com/twilio/twilio-php/pull/111 + +Version 3.8.3 +------------- + +Released on December 15, 2012 + +- [Fixes the ShortCode resource][shortcode] so it is queryable via the PHP library. + + [shortcode]: https://github.com/twilio/twilio-php/pull/108 + +Version 3.8.2 +------------- + +Released on November 26, 2012 + +- Fixes an issue where you [could not iterate over the members in a +queue][queue-members]. (Reporter: [Alex Chan](/alexcchan)) + +[queue-members]: https://github.com/twilio/twilio-php/pull/107 + +Version 3.8.1 +------------- + +Released on November 23, 2012 + +- [Implements the Countable interface on the ListResource][countable], so you + can call count() on any resource. +- [Adds a convenience method for retrieving a phone number object][get-number], + so you can retrieve all of a number's properties by its E.164 representation. + +Internally: + +- Adds [unit tests for url encoding of Unicode characters][unicode-tests]. +- Updates [Travis CI configuration to use Composer][travis-composer], +shortening build time from 83 seconds to 21 seconds. + +[countable]: https://twilio-php.readthedocs.org/en/latest/usage/rest.html#retrieving-the-total-number-of-resources +[get-number]: https://twilio-php.readthedocs.org/en/latest/usage/rest/phonenumbers.html#retrieving-all-of-a-number-s-properties +[unicode-tests]: https://github.com/twilio/twilio-php/commit/6f8aa57885796691858e460c8cea748e241c47e3 +[travis-composer]: https://github.com/twilio/twilio-php/commit/a732358e90e1ae9a5a3348ad77dda8cc8b5ec6bc + +Version 3.8.0 +------------- + +Released on October 17, 2012 + +- Support the new Usage API, with Usage Records and Usage Triggers. Read the + PHP documentation for [usage records][records] or [usage triggers][triggers] + + [records]: https://twilio-php.readthedocs.org/en/latest/usage/rest/usage-records.html + [triggers]: https://twilio-php.readthedocs.org/en/latest/usage/rest/usage-triggers.html + +Version 3.7.2 +------------- + +- The library will now [use a standard CA cert whitelist][whitelist] for SSL + validation, replacing a file that contained only Twilio's SSL certificate. + (Reporter: [Andrew Benton](/andrewmbenton)) + + [whitelist]: https://github.com/twilio/twilio-php/issues/88 + +Version 3.7.1 +------------- + +Released on August 16, 2012 + +- Fix a bug in the 3.5.0 release where [updating an instance + resource would cause subsequent updates to request an incorrect + URI](/twilio/twilio-php/pull/82). + (Reporter: [Dan Bowen](/crucialwebstudio)) + +Version 3.7.0 +------------- + +Released on August 6, 2012 + +- Add retry support for idempotent HTTP requests that result in a 500 server + error (default is 1 attempt, however this can be configured). +- Throw a Services_Twilio_RestException instead of a DomainException if the + response content cannot be parsed as JSON (usually indicates a 500 error) + +Version 3.6.0 +------------- + +Released on August 5, 2012 + +- Add support for Queues and Members. Includes tests and documentation for the + new functionality. + +Version 3.5.2 +------------- + +Released on July 23, 2012 + +- Fix an issue introduced in the 3.5.0 release where updating or muting + a participant would [throw an exception instead of muting the + participant][mute-request]. + (Reporter: [Alex Chan](/alexcchan)) + +- Fix an issue introduced in the 3.5.0 release where [filtering an iterator +with parameters would not work properly][paging-request] on subsequent HTTP +requests. (Reporters: [Alex Chan](/alexcchan), Ivor O'Connor) + +[mute-request]: /twilio/twilio-php/pull/74 +[paging-request]: /twilio/twilio-php/pull/75 + +Version 3.5.1 +------------- + +Released on July 2, 2012 + +- Fix an issue introduced in the 3.5.0 release that would cause a second HTTP +request for an instance resource [to request an incorrect URI][issue-71]. + +[issue-71]: https://github.com/twilio/twilio-php/pull/71 + +Version 3.5.0 +------------- + +Released on June 30, 2012 + +- Support paging through resources using the `next_page_uri` parameter instead +of manually constructing parameters using the `Page` and `PageSize` parameters. +Specifically, this allows the library to use the `AfterSid` parameter, which +leads to improved performance when paging deep into your resource list. + +This involved a major refactor of the library. The documented interface to +twilio-php will not change. However, some undocumented public methods are no +longer supported. Specifically, the following classes are no longer available: + +- `Services/Twilio/ArrayDataProxy.php` +- `Services/Twilio/CachingDataProxy.php` +- `Services/Twilio/DataProxy.php` + +In addition, the following public methods have been removed: + +- `setProxy`, in `Services/Twilio/InstanceResource.php` +- `getSchema`, in `Services/Twilio/ListResource.php`, + `Services/Twilio/Rest/AvailablePhoneNumbers.php`, + `Services/Twilio/Rest/SMSMessages.php` + +- `retrieveData`, in `Services/Twilio/Resource.php` +- `deleteData`, in `Services/Twilio/Resource.php` +- `addSubresource`, in `Services/Twilio/Resource.php` + +Please check your own code for compatibility before upgrading. + +Version 3.3.2 +------------- + +Released on May 3, 2012 + +- If you pass booleans in as TwiML (ex transcribe="true"), convert them to + the strings "true" and "false" instead of outputting the incorrect values + 1 and "". + +Version 3.3.1 +------------- + +Released on May 1, 2012 + +- Use the 'Accept-Charset' header to specify we want to receive UTF-8 encoded +data from the Twilio API. Remove unused XML parsing logic, as the library never +requests XML data. + +Version 3.2.4 +------------- + +Released on March 14, 2012 + +- If no version is passed to the Services_Twilio constructor, the library will + default to the most recent API version. + diff --git a/externals/twilio-php/LICENSE b/externals/twilio-php/LICENSE new file mode 100755 index 0000000000..a81ef8bef7 --- /dev/null +++ b/externals/twilio-php/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (C) 2011, Twilio, Inc. +Copyright (C) 2011, Neuman Vong + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/externals/twilio-php/Makefile b/externals/twilio-php/Makefile new file mode 100755 index 0000000000..fad48f6343 --- /dev/null +++ b/externals/twilio-php/Makefile @@ -0,0 +1,72 @@ +# Twilio API helper library. +# See LICENSE file for copyright and license details. + +define LICENSE + + * @license http://creativecommons.org/licenses/MIT/ MIT + * @link http://pear.php.net/package/Services_Twilio + */ +endef +export LICENSE + +COMPOSER = $(shell which composer) +ifeq ($(strip $(COMPOSER)),) + COMPOSER = php composer.phar +endif + +all: test + +clean: + @rm -rf dist venv + +PHP_FILES = `find dist -name \*.php` +dist: clean + @mkdir dist + @git archive master | (cd dist; tar xf -) + @for php in $(PHP_FILES); do\ + echo "$$LICENSE" > $$php.new; \ + tail -n+2 $$php >> $$php.new; \ + mv $$php.new $$php; \ + done + +test-install: + # Composer: http://getcomposer.org/download/ + $(COMPOSER) install + +install: + pear channel-discover twilio.github.com/pear + pear install twilio/Services_Twilio + +# if these fail, you may need to install the helper library - run "make +# test-install" +test: + @PATH=vendor/bin:$(PATH) phpunit --strict --colors --configuration tests/phpunit.xml; + +venv: + virtualenv venv + +docs-install: venv + . venv/bin/activate; pip install -r docs/requirements.txt + +docs: + . venv/bin/activate; cd docs && make html + +release-install: + pear channel-discover twilio.github.com/pear || true + pear channel-discover pear.pirum-project.org || true + pear install pirum/Pirum || true + pear install XML_Serializer-0.20.2 || true + pear install PEAR_PackageFileManager2 || true + +authors: + echo "Authors\n=======\n\nA huge thanks to all of our contributors:\n\n" > AUTHORS.md + git log --raw | grep "^Author: " | cut -d ' ' -f2- | cut -d '<' -f1 | sed 's/^/- /' | sort | uniq >> AUTHORS.md + +.PHONY: all clean dist test docs docs-install test-install authors diff --git a/externals/twilio-php/README.md b/externals/twilio-php/README.md new file mode 100755 index 0000000000..b9a28a0e05 --- /dev/null +++ b/externals/twilio-php/README.md @@ -0,0 +1,136 @@ +[![Build Status](https://secure.travis-ci.org/twilio/twilio-php.png?branch=master)](http://travis-ci.org/twilio/twilio-php) + +## Installation + +You can install **twilio-php** via PEAR or by downloading the source. + +#### Via PEAR (>= 1.9.3): + +PEAR is a package manager for PHP. Open a command line and use these PEAR +commands to download the helper library: + + $ pear channel-discover twilio-pear.herokuapp.com/pear + $ pear install twilio/Services_Twilio + +If you get the following message: + + $ -bash: pear: command not found + +you can install PEAR from their website, or download the source directly. + +#### Via Composer: + +**twilio-php** is available on Packagist as the +[`twilio/sdk`](http://packagist.org/packages/twilio/sdk) package. + +#### Via ZIP file: + +[Click here to download the source +(.zip)](https://github.com/twilio/twilio-php/zipball/master) which includes all +dependencies. + +Once you download the library, move the twilio-php folder to your project +directory and then include the library file: + + require '/path/to/twilio-php/Services/Twilio.php'; + +and you're good to go! + +## A Brief Introduction + +With the twilio-php library, we've simplified interaction with the +Twilio REST API. No need to manually create URLS or parse XML/JSON. +You now interact with resources directly. Follow the [Quickstart +Guide](http://readthedocs.org/docs/twilio-php/en/latest/#quickstart) +to get up and running right now. The [User +Guide](http://readthedocs.org/docs/twilio-php/en/latest/#user-guide) shows you +how to get the most out of **twilio-php**. + +## Quickstart + +### Send an SMS + +```php +account->messages->sendMessage( + '9991231234', // From a valid Twilio number + '8881231234', // Text this number + "Hello monkey!" +); + +print $message->sid; +``` + +### Make a Call + +```php +account->calls->create( + '9991231234', // From a valid Twilio number + '8881231234', // Call this number + + // Read TwiML at this URL when a call connects (hold music) + 'http://twimlets.com/holdmusic?Bucket=com.twilio.music.ambient' +); +``` + +### Generating TwiML + +To control phone calls, your application needs to output +[TwiML](http://www.twilio.com/docs/api/twiml/ "Twilio Markup Language"). Use +`Services_Twilio_Twiml` to easily create such responses. + +```php +say('Hello'); +$response->play('https://api.twilio.com/cowbell.mp3', array("loop" => 5)); +print $response; +``` + +That will output XML that looks like this: + +```xml + + + Hello + https://api.twilio.com/cowbell.mp3 + +``` + +## [Full Documentation](http://readthedocs.org/docs/twilio-php/en/latest/ "Twilio PHP Library Documentation") + +The documentation for **twilio-php** is hosted +at Read the Docs. [Click here to read our full +documentation.](http://readthedocs.org/docs/twilio-php/en/latest/ "Twilio PHP +Library Documentation") + +## Prerequisites + +* PHP >= 5.2.3 +* The PHP JSON extension + +## Reporting Issues + +We would love to hear your feedback. Report issues using the [Github +Issue Tracker](https://github.com/twilio/twilio-php/issues) or email +[help@twilio.com](mailto:help@twilio.com). + diff --git a/externals/twilio-php/Services/Twilio.php b/externals/twilio-php/Services/Twilio.php new file mode 100755 index 0000000000..f15245bfb0 --- /dev/null +++ b/externals/twilio-php/Services/Twilio.php @@ -0,0 +1,313 @@ +`_ + * :param string $version: API version to use + * :param $_http: A HTTP client for making requests. + * :type $_http: :php:class:`Services_Twilio_TinyHttp` + * :param int $retryAttempts: + * Number of times to retry failed requests. Currently only idempotent + * requests (GET's and DELETE's) are retried. + * + * Here's an example: + * + * .. code-block:: php + * + * require('Services/Twilio.php'); + * $client = new Services_Twilio('AC123', '456bef', null, null, 3); + * // Take some action with the client, etc. + */ +class Services_Twilio extends Services_Twilio_Resource +{ + const USER_AGENT = 'twilio-php/3.12.4'; + + protected $http; + protected $retryAttempts; + protected $last_response; + protected $version; + protected $versions = array('2008-08-01', '2010-04-01'); + + public function __construct( + $sid, + $token, + $version = null, + Services_Twilio_TinyHttp $_http = null, + $retryAttempts = 1 + ) { + $this->version = in_array($version, $this->versions) ? + $version : end($this->versions); + + if (null === $_http) { + if (!in_array('openssl', get_loaded_extensions())) { + throw new Services_Twilio_HttpException("The OpenSSL extension is required but not currently enabled. For more information, see http://php.net/manual/en/book.openssl.php"); + } + if (in_array('curl', get_loaded_extensions())) { + $_http = new Services_Twilio_TinyHttp( + "https://api.twilio.com", + array( + "curlopts" => array( + CURLOPT_USERAGENT => self::qualifiedUserAgent(phpversion()), + CURLOPT_HTTPHEADER => array('Accept-Charset: utf-8'), + CURLOPT_CAINFO => dirname(__FILE__) . '/cacert.pem', + ), + ) + ); + } else { + $_http = new Services_Twilio_HttpStream( + "https://api.twilio.com", + array( + "http_options" => array( + "http" => array( + "user_agent" => self::qualifiedUserAgent(phpversion()), + "header" => "Accept-Charset: utf-8\r\n", + ), + "ssl" => array( + 'verify_peer' => true, + 'cafile' => dirname(__FILE__) . '/cacert.pem', + 'verify_depth' => 5, + ), + ), + ) + ); + } + } + $_http->authenticate($sid, $token); + $this->http = $_http; + $this->accounts = new Services_Twilio_Rest_Accounts($this, "/{$this->version}/Accounts"); + $this->account = $this->accounts->get($sid); + $this->retryAttempts = $retryAttempts; + } + + /** + * Fully qualified user agent with the current PHP Version. + * + * :return: the user agent + * :rtype: string + */ + public static function qualifiedUserAgent($php_version) { + return self::USER_AGENT . " (php $php_version)"; + } + + /** + * Get the api version used by the rest client + * + * :return: the API version in use + * :returntype: string + */ + public function getVersion() { + return $this->version; + } + + /** + * Get the retry attempt limit used by the rest client + * + * :return: the number of retry attempts + * :rtype: int + */ + public function getRetryAttempts() { + return $this->retryAttempts; + } + + /** + * Construct a URI based on initial path, query params, and paging + * information + * + * We want to use the query params, unless we have a next_page_uri from the + * API. + * + * :param string $path: The request path (may contain query params if it's + * a next_page_uri) + * :param array $params: Query parameters to use with the request + * :param boolean $full_uri: Whether the $path contains the full uri + * + * :return: the URI that should be requested by the library + * :returntype: string + */ + public static function getRequestUri($path, $params, $full_uri = false) { + $json_path = $full_uri ? $path : "$path.json"; + if (!$full_uri && !empty($params)) { + $query_path = $json_path . '?' . http_build_query($params, '', '&'); + } else { + $query_path = $json_path; + } + return $query_path; + } + + /** + * Helper method for implementing request retry logic + * + * :param array $callable: The function that makes an HTTP request + * :param string $uri: The URI to request + * :param int $retriesLeft: Number of times to retry + * + * :return: The object representation of the resource + * :rtype: object + */ + protected function _makeIdempotentRequest($callable, $uri, $retriesLeft) { + $response = call_user_func_array($callable, array($uri)); + list($status, $headers, $body) = $response; + if ($status >= 500 && $retriesLeft > 0) { + return $this->_makeIdempotentRequest($callable, $uri, $retriesLeft - 1); + } else { + return $this->_processResponse($response); + } + } + + /** + * GET the resource at the specified path. + * + * :param string $path: Path to the resource + * :param array $params: Query string parameters + * :param boolean $full_uri: Whether the full URI has been passed as an + * argument + * + * :return: The object representation of the resource + * :rtype: object + */ + public function retrieveData($path, $params = array(), + $full_uri = false + ) { + $uri = self::getRequestUri($path, $params, $full_uri); + return $this->_makeIdempotentRequest(array($this->http, 'get'), + $uri, $this->retryAttempts); + } + + /** + * DELETE the resource at the specified path. + * + * :param string $path: Path to the resource + * :param array $params: Query string parameters + * + * :return: The object representation of the resource + * :rtype: object + */ + public function deleteData($path, $params = array()) + { + $uri = self::getRequestUri($path, $params); + return $this->_makeIdempotentRequest(array($this->http, 'delete'), + $uri, $this->retryAttempts); + } + + /** + * POST to the resource at the specified path. + * + * :param string $path: Path to the resource + * :param array $params: Query string parameters + * + * :return: The object representation of the resource + * :rtype: object + */ + public function createData($path, $params = array()) + { + $path = "$path.json"; + $headers = array('Content-Type' => 'application/x-www-form-urlencoded'); + $response = $this->http->post( + $path, $headers, self::buildQuery($params, '') + ); + return $this->_processResponse($response); + } + + /** + * Build a query string from query data + * + * :param array $queryData: An associative array of keys and values. The + * values can be a simple type or a list, in which case the list is + * converted to multiple query parameters with the same key. + * :param string $numericPrefix: + * :param string $queryStringStyle: Determine how to build the url + * - strict: Build a standards compliant query string without braces (can be hacked by using braces in key) + * - php: Build a PHP compatible query string with nested array syntax + * :return: The encoded query string + * :rtype: string + */ + public static function buildQuery($queryData, $numericPrefix = '') { + $query = ''; + // Loop through all of the $query_data + foreach ($queryData as $key => $value) { + // If the key is an int, add the numeric_prefix to the beginning + if (is_int($key)) { + $key = $numericPrefix . $key; + } + + // If the value is an array, we will end up recursing + if (is_array($value)) { + // Loop through the values + foreach ($value as $value2) { + // Add an arg_separator if needed + if ($query !== '') { + $query .= '&'; + } + // Recurse + $query .= self::buildQuery(array($key => $value2), $numericPrefix); + } + } else { + // Add an arg_separator if needed + if ($query !== '') { + $query .= '&'; + } + // Add the key and the urlencoded value (as a string) + $query .= $key . '=' . urlencode((string)$value); + } + } + return $query; + } + + /** + * Convert the JSON encoded resource into a PHP object. + * + * :param array $response: 3-tuple containing status, headers, and body + * + * :return: PHP object decoded from JSON + * :rtype: object + * :throws: A :php:class:`Services_Twilio_RestException` if the Response is + * in the 300-500 range of status codes. + */ + private function _processResponse($response) + { + list($status, $headers, $body) = $response; + if ($status === 204) { + return true; + } + $decoded = json_decode($body); + if ($decoded === null) { + throw new Services_Twilio_RestException( + $status, + 'Could not decode response body as JSON. ' . + 'This likely indicates a 500 server error' + ); + } + if (200 <= $status && $status < 300) { + $this->last_response = $decoded; + return $decoded; + } + throw new Services_Twilio_RestException( + $status, + isset($decoded->message) ? $decoded->message : '', + isset($decoded->code) ? $decoded->code : null, + isset($decoded->more_info) ? $decoded->more_info : null + ); + } +} + diff --git a/externals/twilio-php/Services/Twilio/AutoPagingIterator.php b/externals/twilio-php/Services/Twilio/AutoPagingIterator.php new file mode 100755 index 0000000000..af09c791ea --- /dev/null +++ b/externals/twilio-php/Services/Twilio/AutoPagingIterator.php @@ -0,0 +1,109 @@ +generator = $generator; + $this->page = $page; + $this->size = $size; + $this->filters = $filters; + $this->items = array(); + + // Save a backup for rewind() + $this->_args = array( + 'page' => $page, + 'size' => $size, + 'filters' => $filters, + ); + } + + public function current() + { + return current($this->items); + } + + public function key() + { + return key($this->items); + } + + /* + * Return the next item in the list, making another HTTP call to the next + * page of resources if necessary. + */ + public function next() + { + try { + $this->loadIfNecessary(); + return next($this->items); + } + catch (Services_Twilio_RestException $e) { + // 20006 is an out of range paging error, everything else is valid + if ($e->getCode() != 20006) { + throw $e; + } + } + } + + /* + * Restore everything to the way it was before we began paging. This gets + * called at the beginning of any foreach() loop + */ + public function rewind() + { + foreach ($this->_args as $arg => $val) { + $this->$arg = $val; + } + $this->items = array(); + $this->next_page_uri = null; + } + + public function count() + { + throw new BadMethodCallException('Not allowed'); + } + + public function valid() + { + try { + $this->loadIfNecessary(); + return key($this->items) !== null; + } + catch (Services_Twilio_RestException $e) { + // 20006 is an out of range paging error, everything else is valid + if ($e->getCode() != 20006) { + throw $e; + } + } + return false; + } + + /* + * Fill $this->items with a new page from the API, if necessary. + */ + protected function loadIfNecessary() + { + if (// Empty because it's the first time or last page was empty + empty($this->items) + // null key when the items list is iterated over completely + || key($this->items) === null + ) { + $page = call_user_func_array($this->generator, array( + $this->page, + $this->size, + $this->filters, + $this->next_page_uri, + )); + $this->next_page_uri = $page->next_page_uri; + $this->items = $page->getItems(); + $this->page = $this->page + 1; + } + } +} diff --git a/externals/twilio-php/Services/Twilio/Capability.php b/externals/twilio-php/Services/Twilio/Capability.php new file mode 100755 index 0000000000..9f02e45222 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Capability.php @@ -0,0 +1,346 @@ + + * @license http://creativecommons.org/licenses/MIT/ MIT + */ +class Services_Twilio_Capability +{ + public $accountSid; + public $authToken; + public $scopes; + + /** + * Create a new TwilioCapability with zero permissions. Next steps are to + * grant access to resources by configuring this token through the + * functions allowXXXX. + * + * @param $accountSid the account sid to which this token is granted access + * @param $authToken the secret key used to sign the token. Note, this auth + * token is not visible to the user of the token. + */ + public function __construct($accountSid, $authToken) + { + $this->accountSid = $accountSid; + $this->authToken = $authToken; + $this->scopes = array(); + $this->clientName = false; + } + + /** + * If the user of this token should be allowed to accept incoming + * connections then configure the TwilioCapability through this method and + * specify the client name. + * + * @param $clientName + */ + public function allowClientIncoming($clientName) + { + + // clientName must be a non-zero length alphanumeric string + if (preg_match('/\W/', $clientName)) { + throw new InvalidArgumentException( + 'Only alphanumeric characters allowed in client name.'); + } + + if (strlen($clientName) == 0) { + throw new InvalidArgumentException( + 'Client name must not be a zero length string.'); + } + + $this->clientName = $clientName; + $this->allow('client', 'incoming', + array('clientName' => $clientName)); + } + + /** + * Allow the user of this token to make outgoing connections. + * + * @param $appSid the application to which this token grants access + * @param $appParams signed parameters that the user of this token cannot + * overwrite. + */ + public function allowClientOutgoing($appSid, array $appParams=array()) + { + $this->allow('client', 'outgoing', array( + 'appSid' => $appSid, + 'appParams' => http_build_query($appParams, '', '&'))); + } + + /** + * Allow the user of this token to access their event stream. + * + * @param $filters key/value filters to apply to the event stream + */ + public function allowEventStream(array $filters=array()) + { + $this->allow('stream', 'subscribe', array( + 'path' => '/2010-04-01/Events', + 'params' => http_build_query($filters, '', '&'), + )); + } + + /** + * Generates a new token based on the credentials and permissions that + * previously has been granted to this token. + * + * @param $ttl the expiration time of the token (in seconds). Default + * value is 3600 (1hr) + * @return the newly generated token that is valid for $ttl seconds + */ + public function generateToken($ttl = 3600) + { + $payload = array( + 'scope' => array(), + 'iss' => $this->accountSid, + 'exp' => time() + $ttl, + ); + $scopeStrings = array(); + + foreach ($this->scopes as $scope) { + if ($scope->privilege == "outgoing" && $this->clientName) + $scope->params["clientName"] = $this->clientName; + $scopeStrings[] = $scope->toString(); + } + + $payload['scope'] = implode(' ', $scopeStrings); + return JWT::encode($payload, $this->authToken, 'HS256'); + } + + protected function allow($service, $privilege, $params) { + $this->scopes[] = new ScopeURI($service, $privilege, $params); + } +} + +/** + * Scope URI implementation + * + * Simple way to represent configurable privileges in an OAuth + * friendly way. For our case, they look like this: + * + * scope::? + * + * For example: + * scope:client:incoming?name=jonas + * + * @author Jeff Lindsay + */ +class ScopeURI +{ + public $service; + public $privilege; + public $params; + + public function __construct($service, $privilege, $params = array()) + { + $this->service = $service; + $this->privilege = $privilege; + $this->params = $params; + } + + public function toString() + { + $uri = "scope:{$this->service}:{$this->privilege}"; + if (count($this->params)) { + $uri .= "?".http_build_query($this->params, '', '&'); + } + return $uri; + } + + /** + * Parse a scope URI into a ScopeURI object + * + * @param string $uri The scope URI + * @return ScopeURI The parsed scope uri + */ + public static function parse($uri) + { + if (strpos($uri, 'scope:') !== 0) { + throw new UnexpectedValueException( + 'Not a scope URI according to scheme'); + } + + $parts = explode('?', $uri, 1); + $params = null; + + if (count($parts) > 1) { + parse_str($parts[1], $params); + } + + $parts = explode(':', $parts[0], 2); + + if (count($parts) != 3) { + throw new UnexpectedValueException( + 'Not enough parts for scope URI'); + } + + list($scheme, $service, $privilege) = $parts; + return new ScopeURI($service, $privilege, $params); + } + +} + +/** + * JSON Web Token implementation + * + * Minimum implementation used by Realtime auth, based on this spec: + * http://self-issued.info/docs/draft-jones-json-web-token-01.html. + * + * @author Neuman Vong + */ +class JWT +{ + /** + * @param string $jwt The JWT + * @param string|null $key The secret key + * @param bool $verify Don't skip verification process + * + * @return object The JWT's payload as a PHP object + */ + public static function decode($jwt, $key = null, $verify = true) + { + $tks = explode('.', $jwt); + if (count($tks) != 3) { + throw new UnexpectedValueException('Wrong number of segments'); + } + list($headb64, $payloadb64, $cryptob64) = $tks; + if (null === ($header = JWT::jsonDecode(JWT::urlsafeB64Decode($headb64))) + ) { + throw new UnexpectedValueException('Invalid segment encoding'); + } + if (null === $payload = JWT::jsonDecode(JWT::urlsafeB64Decode($payloadb64)) + ) { + throw new UnexpectedValueException('Invalid segment encoding'); + } + $sig = JWT::urlsafeB64Decode($cryptob64); + if ($verify) { + if (empty($header->alg)) { + throw new DomainException('Empty algorithm'); + } + if ($sig != JWT::sign("$headb64.$payloadb64", $key, $header->alg)) { + throw new UnexpectedValueException('Signature verification failed'); + } + } + return $payload; + } + + /** + * @param object|array $payload PHP object or array + * @param string $key The secret key + * @param string $algo The signing algorithm + * + * @return string A JWT + */ + public static function encode($payload, $key, $algo = 'HS256') + { + $header = array('typ' => 'JWT', 'alg' => $algo); + + $segments = array(); + $segments[] = JWT::urlsafeB64Encode(JWT::jsonEncode($header)); + $segments[] = JWT::urlsafeB64Encode(JWT::jsonEncode($payload)); + $signing_input = implode('.', $segments); + + $signature = JWT::sign($signing_input, $key, $algo); + $segments[] = JWT::urlsafeB64Encode($signature); + + return implode('.', $segments); + } + + /** + * @param string $msg The message to sign + * @param string $key The secret key + * @param string $method The signing algorithm + * + * @return string An encrypted message + */ + public static function sign($msg, $key, $method = 'HS256') + { + $methods = array( + 'HS256' => 'sha256', + 'HS384' => 'sha384', + 'HS512' => 'sha512', + ); + if (empty($methods[$method])) { + throw new DomainException('Algorithm not supported'); + } + return hash_hmac($methods[$method], $msg, $key, true); + } + + /** + * @param string $input JSON string + * + * @return object Object representation of JSON string + */ + public static function jsonDecode($input) + { + $obj = json_decode($input); + if (function_exists('json_last_error') && $errno = json_last_error()) { + JWT::handleJsonError($errno); + } + else if ($obj === null && $input !== 'null') { + throw new DomainException('Null result with non-null input'); + } + return $obj; + } + + /** + * @param object|array $input A PHP object or array + * + * @return string JSON representation of the PHP object or array + */ + public static function jsonEncode($input) + { + $json = json_encode($input); + if (function_exists('json_last_error') && $errno = json_last_error()) { + JWT::handleJsonError($errno); + } + else if ($json === 'null' && $input !== null) { + throw new DomainException('Null result with non-null input'); + } + return $json; + } + + /** + * @param string $input A base64 encoded string + * + * @return string A decoded string + */ + public static function urlsafeB64Decode($input) + { + $padlen = 4 - strlen($input) % 4; + $input .= str_repeat('=', $padlen); + return base64_decode(strtr($input, '-_', '+/')); + } + + /** + * @param string $input Anything really + * + * @return string The base64 encode of what you passed in + */ + public static function urlsafeB64Encode($input) + { + return str_replace('=', '', strtr(base64_encode($input), '+/', '-_')); + } + + /** + * @param int $errno An error number from json_last_error() + * + * @return void + */ + private static function handleJsonError($errno) + { + $messages = array( + JSON_ERROR_DEPTH => 'Maximum stack depth exceeded', + JSON_ERROR_CTRL_CHAR => 'Unexpected control character found', + JSON_ERROR_SYNTAX => 'Syntax error, malformed JSON' + ); + throw new DomainException(isset($messages[$errno]) + ? $messages[$errno] + : 'Unknown JSON error: ' . $errno + ); + } +} diff --git a/externals/twilio-php/Services/Twilio/HttpException.php b/externals/twilio-php/Services/Twilio/HttpException.php new file mode 100755 index 0000000000..b79a357d70 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/HttpException.php @@ -0,0 +1,3 @@ + array( + "headers" => "", + "timeout" => 60, + "follow_location" => true, + "ignore_errors" => true, + ), + "ssl" => array(), + ); + private $options = array(); + + public function __construct($uri = '', $kwargs = array()) { + $this->uri = $uri; + if (isset($kwargs['debug'])) { + $this->debug = true; + } + if (isset($kwargs['http_options'])) { + $this->options = $kwargs['http_options'] + self::$default_options; + } else { + $this->options = self::$default_options; + } + } + + public function __call($name, $args) { + list($res, $req_headers, $req_body) = $args + array(0, array(), ''); + + $request_options = $this->options; + $url = $this->uri . $res; + + if (isset($req_body) && strlen($req_body) > 0) { + $request_options['http']['content'] = $req_body; + } + + foreach($req_headers as $key => $value) { + $request_options['http']['header'] .= sprintf("%s: %s\r\n", $key, $value); + } + + if (isset($this->auth_header)) { + $request_options['http']['header'] .= $this->auth_header; + } + + $request_options['http']['method'] = strtoupper($name); + $request_options['http']['ignore_errors'] = true; + + if ($this->debug) { + error_log(var_export($request_options, true)); + } + $ctx = stream_context_create($request_options); + $result = file_get_contents($url, false, $ctx); + + if (false === $result) { + throw new Services_Twilio_HttpStreamException( + "Unable to connect to service"); + } + + $status_header = array_shift($http_response_header); + if (1 !== preg_match('#HTTP/\d+\.\d+ (\d+)#', $status_header, $matches)) { + throw new Services_Twilio_HttpStreamException( + "Unable to detect the status code in the HTTP result."); + } + + $status_code = intval($matches[1]); + $response_headers = array(); + + foreach($http_response_header as $header) { + list($key, $val) = explode(":", $header); + $response_headers[trim($key)] = trim($val); + } + + return array($status_code, $response_headers, $result); + } + + public function authenticate($user, $pass) { + if (isset($user) && isset($pass)) { + $this->auth_header = sprintf("Authorization: Basic %s", + base64_encode(sprintf("%s:%s", $user, $pass))); + } else { + $this->auth_header = null; + } + } +} diff --git a/externals/twilio-php/Services/Twilio/InstanceResource.php b/externals/twilio-php/Services/Twilio/InstanceResource.php new file mode 100755 index 0000000000..011d8f998b --- /dev/null +++ b/externals/twilio-php/Services/Twilio/InstanceResource.php @@ -0,0 +1,84 @@ + + * @license http://creativecommons.org/licenses/MIT/ MIT + * @link http://pear.php.net/package/Services_Twilio + */ + +/** + * Abstraction of an instance resource from the Twilio API. + */ +abstract class Services_Twilio_InstanceResource extends Services_Twilio_Resource { + + /** + * Make a request to the API to update an instance resource + * + * :param mixed $params: An array of updates, or a property name + * :param mixed $value: A value with which to update the resource + * + * :rtype: null + * :throws: a :php:class:`RestException ` if + * the update fails. + */ + public function update($params, $value = null) + { + if (!is_array($params)) { + $params = array($params => $value); + } + $decamelizedParams = $this->client->createData($this->uri, $params); + $this->updateAttributes($decamelizedParams); + } + + /* + * Add all properties from an associative array (the JSON response body) as + * properties on this instance resource, except the URI + * + * :param stdClass $params: An object containing all of the parameters of + * this instance + * :return: Nothing, this is purely side effecting + * :rtype: null + */ + public function updateAttributes($params) { + unset($params->uri); + foreach ($params as $name => $value) { + $this->$name = $value; + } + } + + /** + * Get the value of a property on this resource. + * + * Instead of defining all of the properties of an object directly, we rely + * on the API to tell us which properties an object has. This method will + * query the API to retrieve a property for an object, if it is not already + * set on the object. + * + * If the call is to a subresource, eg ``$client->account->messages``, no + * request is made. + * + * To help with lazy HTTP requests, we don't actually retrieve an object + * from the API unless you really need it. Hence, this function may make API + * requests even if the property you're requesting isn't available on the + * resource. + * + * :param string $key: The property name + * + * :return mixed: Could be anything. + * :throws: a :php:class:`RestException ` if + * the update fails. + */ + public function __get($key) + { + if ($subresource = $this->getSubresources($key)) { + return $subresource; + } + if (!isset($this->$key)) { + $params = $this->client->retrieveData($this->uri); + $this->updateAttributes($params); + } + return $this->$key; + } +} diff --git a/externals/twilio-php/Services/Twilio/ListResource.php b/externals/twilio-php/Services/Twilio/ListResource.php new file mode 100755 index 0000000000..4d7bc3c3ec --- /dev/null +++ b/externals/twilio-php/Services/Twilio/ListResource.php @@ -0,0 +1,203 @@ +`_ and the `Countable + * `_ interfaces. + * + */ +abstract class Services_Twilio_ListResource extends Services_Twilio_Resource + implements IteratorAggregate, Countable +{ + + public function __construct($client, $uri) { + $name = $this->getResourceName(true); + /* + * By default trim the 's' from the end of the list name to get the + * instance name (ex Accounts -> Account). This behavior can be + * overridden by child classes if the rule doesn't work. + */ + if (!isset($this->instance_name)) { + $this->instance_name = "Services_Twilio_Rest_" . rtrim($name, 's'); + } + + parent::__construct($client, $uri); + } + + /** + * Gets a resource from this list. + * + * :param string $sid: The resource SID + * :return: The resource + * :rtype: :php:class:`InstanceResource ` + */ + public function get($sid) { + $instance = new $this->instance_name( + $this->client, $this->uri . "/$sid" + ); + // XXX check if this is actually a sid in all cases. + $instance->sid = $sid; + return $instance; + } + + /** + * Construct an :php:class:`InstanceResource + * ` with the specified params. + * + * :param array $params: usually a JSON HTTP response from the API + * :return: An instance with properties + * initialized to the values in the params array. + * :rtype: :php:class:`InstanceResource ` + */ + public function getObjectFromJson($params, $idParam = "sid") + { + if (isset($params->{$idParam})) { + $uri = $this->uri . "/" . $params->{$idParam}; + } else { + $uri = $this->uri; + } + return new $this->instance_name($this->client, $uri, $params); + } + + /** + * Deletes a resource from this list. + * + * :param string $sid: The resource SID + * :rtype: null + */ + public function delete($sid, $params = array()) + { + $this->client->deleteData($this->uri . '/' . $sid, $params); + } + + /** + * Create a resource on the list and then return its representation as an + * InstanceResource. + * + * :param array $params: The parameters with which to create the resource + * + * :return: The created resource + * :rtype: :php:class:`InstanceResource ` + */ + protected function _create($params) + { + $params = $this->client->createData($this->uri, $params); + /* Some methods like verified caller ID don't return sids. */ + if (isset($params->sid)) { + $resource_uri = $this->uri . '/' . $params->sid; + } else { + $resource_uri = $this->uri; + } + return new $this->instance_name($this->client, $resource_uri, $params); + } + + /** + * Returns a page of :php:class:`InstanceResources + * ` from this list. + * + * :param int $page: The start page + * :param int $size: Number of items per page + * :param array $filters: Optional filters + * :param string $deep_paging_uri: if provided, the $page and $size + * parameters will be ignored and this URI will be requested directly. + * + * :return: A page of resources + * :rtype: :php:class:`Services_Twilio_Page` + */ + public function getPage( + $page = 0, $size = 50, $filters = array(), $deep_paging_uri = null + ) { + $list_name = $this->getResourceName(); + if ($deep_paging_uri !== null) { + $page = $this->client->retrieveData($deep_paging_uri, array(), true); + } else { + $page = $this->client->retrieveData($this->uri, array( + 'Page' => $page, + 'PageSize' => $size, + ) + $filters); + } + + /* create a new PHP object for each json obj in the api response. */ + $page->$list_name = array_map( + array($this, 'getObjectFromJson'), + $page->$list_name + ); + if (isset($page->next_page_uri)) { + $next_page_uri = $page->next_page_uri; + } else { + $next_page_uri = null; + } + return new Services_Twilio_Page($page, $list_name, $next_page_uri); + } + + /** + * Get the total number of instances for this list. + * + * This will make one HTTP request to retrieve the total, every time this + * method is called. + * + * If the total is not set, or an Exception was thrown, returns 0 + * + * :return: The total number of instance members + * :rtype: integer + */ + public function count() { + try { + $page = $this->getPage(0, 1); + return $page ? (int)$page->total : 0; + } catch (Exception $e) { + return 0; + } + } + + + /** + * Returns an iterable list of + * :php:class:`instance resources `. + * + * :param int $page: The start page + * :param int $size: Number of items per page + * :param array $filters: Optional filters. + * The filter array can accept full datetimes when StartTime or DateCreated + * are used. Inequalities should be within the key portion of the array and + * multiple filter parameters can be combined for more specific searches. + * + * .. code-block:: php + * + * array('DateCreated>' => '2011-07-05 08:00:00', 'DateCreated<' => '2011-08-01') + * + * .. code-block:: php + * + * array('StartTime<' => '2011-07-05 08:00:00') + * + * :return: An iterator + * :rtype: :php:class:`Services_Twilio_AutoPagingIterator` + */ + public function getIterator( + $page = 0, $size = 50, $filters = array() + ) { + return new Services_Twilio_AutoPagingIterator( + array($this, 'getPageGenerator'), $page, $size, $filters + ); + } + + /** + * Retrieve a new page of API results, and update iterator parameters. This + * function is called by the paging iterator to retrieve a new page and + * shouldn't be called directly. + */ + public function getPageGenerator( + $page, $size, $filters = array(), $deep_paging_uri = null + ) { + return $this->getPage($page, $size, $filters, $deep_paging_uri); + } +} + diff --git a/externals/twilio-php/Services/Twilio/NumberType.php b/externals/twilio-php/Services/Twilio/NumberType.php new file mode 100755 index 0000000000..0683d9961c --- /dev/null +++ b/externals/twilio-php/Services/Twilio/NumberType.php @@ -0,0 +1,35 @@ +instance_name = 'Services_Twilio_Rest_IncomingPhoneNumber'; + return $camelized ? 'IncomingPhoneNumbers' : 'incoming_phone_numbers'; + } + + /** + * Purchase a new phone number. + * + * Example usage: + * + * .. code-block:: php + * + * $marlosBurner = '+14105551234'; + * $client->account->incoming_phone_numbers->local->purchase($marlosBurner); + * + * :param string $phone_number: The phone number to purchase + * :param array $params: An optional array of parameters to pass along with + * the request (to configure the phone number) + */ + public function purchase($phone_number, array $params = array()) { + $postParams = array( + 'PhoneNumber' => $phone_number + ); + return $this->create($postParams + $params); + } + + public function create(array $params = array()) { + return parent::_create($params); + } + +} diff --git a/externals/twilio-php/Services/Twilio/Page.php b/externals/twilio-php/Services/Twilio/Page.php new file mode 100755 index 0000000000..61ddb073ef --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Page.php @@ -0,0 +1,68 @@ + + * @license http://creativecommons.org/licenses/MIT/ MIT + * @link http://pear.php.net/package/Services_Twilio + */ +class Services_Twilio_Page + implements IteratorAggregate +{ + + /** + * The item list. + * + * @var array $items + */ + protected $items; + + /** + * Constructs a page. + * + * @param object $page The page object + * @param string $name The key of the item list + */ + public function __construct($page, $name, $next_page_uri = null) + { + $this->page = $page; + $this->items = $page->{$name}; + $this->next_page_uri = $next_page_uri; + } + + /** + * The item list of the page. + * + * @return array A list of instance resources + */ + public function getItems() + { + return $this->items; + } + + /** + * Magic method to allow retrieving the properties of the wrapped page. + * + * @param string $prop The property name + * + * @return mixed Could be anything + */ + public function __get($prop) + { + return $this->page->$prop; + } + + /** + * Implementation of IteratorAggregate::getIterator(). + * + * @return Traversable + */ + public function getIterator() + { + return $this->getItems(); + } +} + diff --git a/externals/twilio-php/Services/Twilio/PartialApplicationHelper.php b/externals/twilio-php/Services/Twilio/PartialApplicationHelper.php new file mode 100755 index 0000000000..639ca51014 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/PartialApplicationHelper.php @@ -0,0 +1,41 @@ + + * @license http://creativecommons.org/licenses/MIT/ MIT + * @link http://pear.php.net/package/Services_Twilio + */ +class Services_Twilio_PartialApplicationHelper +{ + private $callbacks; + + public function __construct() + { + $this->callbacks = array(); + } + + public function set($method, $callback, array $args) + { + if (!is_callable($callback)) { + return FALSE; + } + $this->callbacks[$method] = array($callback, $args); + } + + public function __call($method, $args) + { + if (!isset($this->callbacks[$method])) { + throw new Exception("Method not found: $method"); + } + list($callback, $cb_args) = $this->callbacks[$method]; + return call_user_func_array( + $callback, + array_merge($cb_args, $args) + ); + } +} diff --git a/externals/twilio-php/Services/Twilio/RequestValidator.php b/externals/twilio-php/Services/Twilio/RequestValidator.php new file mode 100755 index 0000000000..52a40d91b7 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/RequestValidator.php @@ -0,0 +1,36 @@ +AuthToken = $token; + } + + public function computeSignature($url, $data = array()) + { + // sort the array by keys + ksort($data); + + // append them to the data string in order + // with no delimiters + foreach($data as $key => $value) + $url .= "$key$value"; + + // This function calculates the HMAC hash of the data with the key + // passed in + // Note: hash_hmac requires PHP 5 >= 5.1.2 or PECL hash:1.1-1.5 + // Or http://pear.php.net/package/Crypt_HMAC/ + return base64_encode(hash_hmac("sha1", $url, $this->AuthToken, true)); + } + + public function validate($expectedSignature, $url, $data = array()) + { + return $this->computeSignature($url, $data) + == $expectedSignature; + } + +} diff --git a/externals/twilio-php/Services/Twilio/Resource.php b/externals/twilio-php/Services/Twilio/Resource.php new file mode 100755 index 0000000000..e6f1feb54f --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Resource.php @@ -0,0 +1,134 @@ + + * @license http://creativecommons.org/licenses/MIT/ MIT + * @link http://pear.php.net/package/Services_Twilio + */ +abstract class Services_Twilio_Resource { + protected $subresources; + + public function __construct($client, $uri, $params = array()) + { + $this->subresources = array(); + $this->client = $client; + + foreach ($params as $name => $param) { + $this->$name = $param; + } + + $this->uri = $uri; + $this->init($client, $uri); + } + + protected function init($client, $uri) + { + // Left empty for derived classes to implement + } + + public function getSubresources($name = null) { + if (isset($name)) { + return isset($this->subresources[$name]) + ? $this->subresources[$name] + : null; + } + return $this->subresources; + } + + protected function setupSubresources() + { + foreach (func_get_args() as $name) { + $constantized = ucfirst(self::camelize($name)); + $type = "Services_Twilio_Rest_" . $constantized; + $this->subresources[$name] = new $type( + $this->client, $this->uri . "/$constantized" + ); + } + } + + /* + * Get the resource name from the classname + * + * Ex: Services_Twilio_Rest_Accounts -> Accounts + * + * @param boolean $camelized Whether to return camel case or not + */ + public function getResourceName($camelized = false) + { + $name = get_class($this); + $parts = explode('_', $name); + $basename = end($parts); + if ($camelized) { + return $basename; + } else { + return self::decamelize($basename); + } + } + + public static function decamelize($word) + { + $callback = create_function('$matches', + 'return strtolower(strlen("$matches[1]") ? "$matches[1]_$matches[2]" : "$matches[2]");'); + + return preg_replace_callback( + '/(^|[a-z])([A-Z])/', + $callback, + $word + ); + } + + /** + * Return camelized version of a word + * Examples: sms_messages => SMSMessages, calls => Calls, + * incoming_phone_numbers => IncomingPhoneNumbers + * + * @param string $word The word to camelize + * @return string + */ + public static function camelize($word) { + $callback = create_function('$matches', 'return strtoupper("$matches[2]");'); + + return preg_replace_callback('/(^|_)([a-z])/', + $callback, + $word); + } + + /** + * Get the value of a property on this resource. + * + * @param string $key The property name + * @return mixed Could be anything. + */ + public function __get($key) { + if ($subresource = $this->getSubresources($key)) { + return $subresource; + } + return $this->$key; + } + + /** + * Print a JSON representation of this object. Strips the HTTP client + * before returning. + * + * Note, this should mainly be used for debugging, and is not guaranteed + * to correspond 1:1 with the JSON API output. + * + * Note that echoing an object before an HTTP request has been made to + * "fill in" its properties may return an empty object + */ + public function __toString() { + $out = array(); + foreach ($this as $key => $value) { + if ($key !== 'client' && $key !== 'subresources') { + $out[$key] = $value; + } + } + return json_encode($out, true); + } + +} + diff --git a/externals/twilio-php/Services/Twilio/Rest/Account.php b/externals/twilio-php/Services/Twilio/Rest/Account.php new file mode 100755 index 0000000000..e1181b7d99 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/Account.php @@ -0,0 +1,33 @@ +setupSubresources( + 'applications', + 'available_phone_numbers', + 'outgoing_caller_ids', + 'calls', + 'conferences', + 'incoming_phone_numbers', + 'media', + 'messages', + 'notifications', + 'outgoing_callerids', + 'recordings', + 'sms_messages', + 'short_codes', + 'transcriptions', + 'connect_apps', + 'authorized_connect_apps', + 'usage_records', + 'usage_triggers', + 'queues', + 'sip' + ); + + $this->sandbox = new Services_Twilio_Rest_Sandbox( + $client, $uri . '/Sandbox' + ); + } +} diff --git a/externals/twilio-php/Services/Twilio/Rest/Accounts.php b/externals/twilio-php/Services/Twilio/Rest/Accounts.php new file mode 100755 index 0000000000..0e7ea0a586 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/Accounts.php @@ -0,0 +1,25 @@ +`_ documentation. + */ +class Services_Twilio_Rest_Accounts extends Services_Twilio_ListResource { + + /** + * Create a new subaccount. + * + * :param array $params: An array of parameters describing the new + * subaccount. The ``$params`` array can contain the following keys: + * + * *FriendlyName* + * A description of this account, up to 64 characters long + * + * :returns: The new subaccount + * :rtype: :php:class:`Services_Twilio_Rest_Account` + * + */ + public function create($params = array()) { + return parent::_create($params); + } +} diff --git a/externals/twilio-php/Services/Twilio/Rest/Application.php b/externals/twilio-php/Services/Twilio/Rest/Application.php new file mode 100755 index 0000000000..0db8a052d0 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/Application.php @@ -0,0 +1,6 @@ + $name + ) + $params); + } +} diff --git a/externals/twilio-php/Services/Twilio/Rest/AuthorizedConnectApp.php b/externals/twilio-php/Services/Twilio/Rest/AuthorizedConnectApp.php new file mode 100755 index 0000000000..0372629395 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/AuthorizedConnectApp.php @@ -0,0 +1,6 @@ +set( + 'getList', + array($this, 'getList'), + array($country, 'Local') + ); + return $curried; + } + public function getTollFree($country) { + $curried = new Services_Twilio_PartialApplicationHelper(); + $curried->set( + 'getList', + array($this, 'getList'), + array($country, 'TollFree') + ); + return $curried; + } + + public function getMobile($country) + { + $curried = new Services_Twilio_PartialApplicationHelper(); + $curried->set( + 'getList', + array($this, 'getList'), + array($country, 'Mobile') + ); + return $curried; + } + + /** + * Get a list of available phone numbers. + * + * @param string $country The 2-digit country code you'd like to search for + * numbers e.g. ('US', 'CA', 'GB') + * @param string $type The type of number ('Local', 'TollFree', or 'Mobile') + * @return object The object representation of the resource + */ + public function getList($country, $type, array $params = array()) + { + return $this->client->retrieveData($this->uri . "/$country/$type", $params); + } + + public function getResourceName($camelized = false) { + // You can't page through the list of available phone numbers. + $this->instance_name = 'Services_Twilio_Rest_AvailablePhoneNumber'; + return $camelized ? 'Countries' : 'countries'; + } +} diff --git a/externals/twilio-php/Services/Twilio/Rest/Call.php b/externals/twilio-php/Services/Twilio/Rest/Call.php new file mode 100755 index 0000000000..7556568475 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/Call.php @@ -0,0 +1,105 @@ +`_ documentation. + * + * .. php:attr:: sid + * + * A 34 character string that uniquely identifies this resource. + * + * .. php:attr:: parent_call_sid + * + * A 34 character string that uniquely identifies the call that created this leg. + * + * .. php:attr:: date_created + * + * The date that this resource was created, given as GMT in RFC 2822 format. + * + * .. php:attr:: date_updated + * + * The date that this resource was last updated, given as GMT in RFC 2822 format. + * + * .. php:attr:: account_sid + * + * The unique id of the Account responsible for creating this call. + * + * .. php:attr:: to + * + * The phone number that received this call. e.g., +16175551212 (E.164 format) + * + * .. php:attr:: from + * + * The phone number that made this call. e.g., +16175551212 (E.164 format) + * + * .. php:attr:: phone_number_sid + * + * If the call was inbound, this is the Sid of the IncomingPhoneNumber that + * received the call. If the call was outbound, it is the Sid of the + * OutgoingCallerId from which the call was placed. + * + * .. php:attr:: status + * + * A string representing the status of the call. May be `QUEUED`, `RINGING`, + * `IN-PROGRESS`, `COMPLETED`, `FAILED`, `BUSY` or `NO_ANSWER`. + * + * .. php:attr:: stat_time + * + * The start time of the call, given as GMT in RFC 2822 format. Empty if the call has not yet been dialed. + * + * .. php:attr:: end_time + * + * The end time of the call, given as GMT in RFC 2822 format. Empty if the call did not complete successfully. + * + * .. php:attr:: duration + * + * The length of the call in seconds. This value is empty for busy, failed, unanswered or ongoing calls. + * + * .. php:attr:: price + * + * The charge for this call in USD. Populated after the call is completed. May not be immediately available. + * + * .. php:attr:: direction + * + * A string describing the direction of the call. inbound for inbound + * calls, outbound-api for calls initiated via the REST API or + * outbound-dial for calls initiated by a verb. + * + * .. php:attr:: answered_by + * + * If this call was initiated with answering machine detection, either human or machine. Empty otherwise. + * + * .. php:attr:: forwarded_from + * + * If this call was an incoming call forwarded from another number, the + * forwarding phone number (depends on carrier supporting forwarding). + * Empty otherwise. + * + * .. php:attr:: caller_name + * + * If this call was an incoming call from a phone number with Caller ID Lookup enabled, the caller's name. Empty otherwise. + */ +class Services_Twilio_Rest_Call extends Services_Twilio_InstanceResource { + + /** + * Hang up the call + */ + public function hangup() { + $this->update('Status', 'completed'); + } + + /** + * Redirect the call to a new URL + * + * :param string $url: the new URL to retrieve call flow from. + */ + public function route($url) { + $this->update('Url', $url); + } + + protected function init($client, $uri) { + $this->setupSubresources( + 'notifications', + 'recordings' + ); + } +} diff --git a/externals/twilio-php/Services/Twilio/Rest/Calls.php b/externals/twilio-php/Services/Twilio/Rest/Calls.php new file mode 100755 index 0000000000..429ae9764a --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/Calls.php @@ -0,0 +1,27 @@ +setupSubresources( + 'participants' + ); + } +} diff --git a/externals/twilio-php/Services/Twilio/Rest/Conferences.php b/externals/twilio-php/Services/Twilio/Rest/Conferences.php new file mode 100755 index 0000000000..5e92e3710e --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/Conferences.php @@ -0,0 +1,6 @@ +setupSubresources( + 'credentials' + ); + } +} + diff --git a/externals/twilio-php/Services/Twilio/Rest/CredentialListMapping.php b/externals/twilio-php/Services/Twilio/Rest/CredentialListMapping.php new file mode 100755 index 0000000000..3f9c3054e9 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/CredentialListMapping.php @@ -0,0 +1,37 @@ +setupSubresources( + 'credentials' + ); + } +} diff --git a/externals/twilio-php/Services/Twilio/Rest/CredentialListMappings.php b/externals/twilio-php/Services/Twilio/Rest/CredentialListMappings.php new file mode 100755 index 0000000000..ab34f60ca8 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/CredentialListMappings.php @@ -0,0 +1,24 @@ +account->sip->domains->get('SDXXX')->credential_list_mappings->create("CLXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); + * + * :param string $credential_list_sid: the sid of the CredentialList you're adding to this domain. + * :param array $params: a single array of parameters which is serialized and + * sent directly to the Twilio API. + */ + public function create($credential_list_sid, $params = array()) { + return parent::_create(array( + 'CredentialListSid' => $credential_list_sid, + ) + $params); + } +} + diff --git a/externals/twilio-php/Services/Twilio/Rest/CredentialLists.php b/externals/twilio-php/Services/Twilio/Rest/CredentialLists.php new file mode 100755 index 0000000000..e8eb1a6997 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/CredentialLists.php @@ -0,0 +1,24 @@ +account->sip->credential_lists->create("MyFriendlyName"); + * + * :param string $friendly_name: the friendly name of this credential list + * :param array $params: a single array of parameters which is serialized and + * sent directly to the Twilio API. + */ + public function create($friendly_name, $params = array()) { + return parent::_create(array( + 'FriendlyName' => $friendly_name, + ) + $params); + } + +} diff --git a/externals/twilio-php/Services/Twilio/Rest/Credentials.php b/externals/twilio-php/Services/Twilio/Rest/Credentials.php new file mode 100755 index 0000000000..129a44dbdd --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/Credentials.php @@ -0,0 +1,28 @@ +account->sip->credential_lists->get('CLXXX')->credentials->create( + * "AwesomeUsername", "SuperSecretPassword", + * ); + * + * :param string $username: the username for the new Credential object + * :param string $password: the password for the new Credential object + * :param array $params: a single array of parameters which is serialized and + * sent directly to the Twilio API. + */ + public function create($username, $password, $params = array()) { + return parent::_create(array( + 'Username' => $username, + 'Password' => $password, + ) + $params); + } + +} diff --git a/externals/twilio-php/Services/Twilio/Rest/Domain.php b/externals/twilio-php/Services/Twilio/Rest/Domain.php new file mode 100755 index 0000000000..7d5a5c2633 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/Domain.php @@ -0,0 +1,70 @@ +setupSubresources( + 'ip_access_control_list_mappings', + 'credential_list_mappings' + ); + } +} diff --git a/externals/twilio-php/Services/Twilio/Rest/Domains.php b/externals/twilio-php/Services/Twilio/Rest/Domains.php new file mode 100755 index 0000000000..041c080c95 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/Domains.php @@ -0,0 +1,28 @@ +account->sip->domains->create( + * "MyFriendlyName", "MyDomainName" + * ); + * + * :param string $friendly_name: the friendly name of this domain + * :param string $domain_name: the domain name for this domain + * :param array $params: a single array of parameters which is serialized and + * sent directly to the Twilio API. + */ + public function create($friendly_name, $domain_name, $params = array()) { + return parent::_create(array( + 'FriendlyName' => $friendly_name, + 'DomainName' => $domain_name, + ) + $params); + } +} + diff --git a/externals/twilio-php/Services/Twilio/Rest/IncomingPhoneNumber.php b/externals/twilio-php/Services/Twilio/Rest/IncomingPhoneNumber.php new file mode 100755 index 0000000000..ab72eafe1f --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/IncomingPhoneNumber.php @@ -0,0 +1,91 @@ +`_ + * documentation. + * + * .. php:attr:: sid + * + * A 34 character string that uniquely idetifies this resource. + * + * .. php:attr:: date_created + * + * The date that this resource was created, given as GMT RFC 2822 format. + * + * .. php:attr:: date_updated + * + * The date that this resource was last updated, given as GMT RFC 2822 format. + * + * .. php:attr:: friendly_name + * + * A human readable descriptive text for this resource, up to 64 + * characters long. By default, the FriendlyName is a nicely formatted + * version of the phone number. + * + * .. php:attr:: account_sid + * + * The unique id of the Account responsible for this phone number. + * + * .. php:attr:: phone_number + * + * The incoming phone number. e.g., +16175551212 (E.164 format) + * + * .. php:attr:: api_version + * + * Calls to this phone number will start a new TwiML session with this + * API version. + * + * .. php:attr:: voice_caller_id_lookup + * + * Look up the caller's caller-ID name from the CNAM database (additional charges apply). Either true or false. + * + * .. php:attr:: voice_url + * + * The URL Twilio will request when this phone number receives a call. + * + * .. php:attr:: voice_method + * + * The HTTP method Twilio will use when requesting the above Url. Either GET or POST. + * + * .. php:attr:: voice_fallback_url + * + * The URL that Twilio will request if an error occurs retrieving or executing the TwiML requested by Url. + * + * .. php:attr:: voice_fallback_method + * + * The HTTP method Twilio will use when requesting the VoiceFallbackUrl. Either GET or POST. + * + * .. php:attr:: status_callback + * + * The URL that Twilio will request to pass status parameters (such as call ended) to your application. + * + * .. php:attr:: status_callback_method + * + * The HTTP method Twilio will use to make requests to the StatusCallback URL. Either GET or POST. + * + * .. php:attr:: sms_url + * + * The URL Twilio will request when receiving an incoming SMS message to this number. + * + * .. php:attr:: sms_method + * + * The HTTP method Twilio will use when making requests to the SmsUrl. Either GET or POST. + * + * .. php:attr:: sms_fallback_url + * + * The URL that Twilio will request if an error occurs retrieving or executing the TwiML from SmsUrl. + * + * .. php:attr:: sms_fallback_method + * + * The HTTP method Twilio will use when requesting the above URL. Either GET or POST. + * + * .. php:attr:: uri + * + * The URI for this resource, relative to https://api.twilio.com. + */ +class Services_Twilio_Rest_IncomingPhoneNumber + extends Services_Twilio_InstanceResource +{ +} diff --git a/externals/twilio-php/Services/Twilio/Rest/IncomingPhoneNumbers.php b/externals/twilio-php/Services/Twilio/Rest/IncomingPhoneNumbers.php new file mode 100755 index 0000000000..48ce4cab25 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/IncomingPhoneNumbers.php @@ -0,0 +1,59 @@ +`_ + * documentation at twilio.com. + */ +class Services_Twilio_Rest_IncomingPhoneNumbers extends Services_Twilio_ListResource { + function init($client, $uri) { + $this->setupSubresources( + 'local', + 'toll_free', + 'mobile' + ); + } + + function create(array $params = array()) { + return parent::_create($params); + } + + function getList($type, array $params = array()) + { + return $this->client->retrieveData($this->uri . "/$type", $params); + } + + /** + * Return a phone number instance from its E.164 representation. If more + * than one number matches the search string, returns the first one. + * + * Example usage: + * + * .. code-block:: php + * + * $number = $client->account->incoming_phone_numbers->getNumber('+14105551234'); + * echo $number->sid; + * + * :param string $number: The number in E.164 format, eg "+684105551234" + * :return: A :php:class:`Services_Twilio_Rest_IncomingPhoneNumber` object, or null + * :raises: a A :php:class:`Services_Twilio_RestException` if the number is + * invalid, not provided in E.164 format or for any other API exception. + */ + public function getNumber($number) { + $page = $this->getPage(0, 1, array( + 'PhoneNumber' => $number + )); + $items = $page->getItems(); + if (is_null($items) || empty($items)) { + return null; + } + return $items[0]; + } +} + +class Services_Twilio_Rest_Local extends Services_Twilio_NumberType { } + +class Services_Twilio_Rest_Mobile extends Services_Twilio_NumberType { } + +class Services_Twilio_Rest_TollFree extends Services_Twilio_NumberType { } diff --git a/externals/twilio-php/Services/Twilio/Rest/IpAccessControlList.php b/externals/twilio-php/Services/Twilio/Rest/IpAccessControlList.php new file mode 100755 index 0000000000..5ba83f3ed7 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/IpAccessControlList.php @@ -0,0 +1,40 @@ +setupSubresources( + 'ip_addresses' + ); + } +} diff --git a/externals/twilio-php/Services/Twilio/Rest/IpAccessControlListMapping.php b/externals/twilio-php/Services/Twilio/Rest/IpAccessControlListMapping.php new file mode 100755 index 0000000000..ce5bc5a93c --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/IpAccessControlListMapping.php @@ -0,0 +1,37 @@ +setupSubresources( + 'ip_addresses' + ); + } +} + diff --git a/externals/twilio-php/Services/Twilio/Rest/IpAccessControlListMappings.php b/externals/twilio-php/Services/Twilio/Rest/IpAccessControlListMappings.php new file mode 100755 index 0000000000..f58e1b95c0 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/IpAccessControlListMappings.php @@ -0,0 +1,25 @@ +account->sip->domains->get('SDXXX')->ip_access_control_list_mappings->create("ALXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); + * + * :param string $ip_access_control_list_sid: the sid of the IpAccessControList + * you're adding to this domain. + * :param array $params: a single array of parameters which is serialized and + * sent directly to the Twilio API. + */ + public function create($ip_access_control_list_sid, $params = array()) { + return parent::_create(array( + 'IpAccessControlListSid' => $ip_access_control_list_sid, + ) + $params); + } +} + diff --git a/externals/twilio-php/Services/Twilio/Rest/IpAccessControlLists.php b/externals/twilio-php/Services/Twilio/Rest/IpAccessControlLists.php new file mode 100755 index 0000000000..88b9d14f06 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/IpAccessControlLists.php @@ -0,0 +1,27 @@ +account->sip->ip_access_control_lists->create("MyFriendlyName"); + * + * :param string $friendly_name: the friendly name of this ip access control list + * :param array $params: a single array of parameters which is serialized and + * sent directly to the Twilio API. + * :return: the created list + * :rtype: :class:`Services_Twilio_Rest_IpAccessControlList` + * + */ + public function create($friendly_name, $params = array()) { + return parent::_create(array( + 'FriendlyName' => $friendly_name, + ) + $params); + } + +} diff --git a/externals/twilio-php/Services/Twilio/Rest/IpAddress.php b/externals/twilio-php/Services/Twilio/Rest/IpAddress.php new file mode 100755 index 0000000000..38b716e611 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/IpAddress.php @@ -0,0 +1,34 @@ +instance_name = "Services_Twilio_Rest_IpAddress"; + parent::__construct($client, $uri); + } + + /** + * Creates a new IpAddress instance + * + * Example usage: + * + * .. code-block:: php + * + * $client->account->sip->ip_access_control_lists->get('ALXXX')->ip_addresses->create( + * "FriendlyName", "127.0.0.1" + * ); + * + * :param string $friendly_name: the friendly name for the new IpAddress object + * :param string $ip_address: the ip address for the new IpAddress object + * :param array $params: a single array of parameters which is serialized and + * sent directly to the Twilio API. + */ + public function create($friendly_name, $ip_address, $params = array()) { + return parent::_create(array( + 'FriendlyName' => $friendly_name, + 'IpAddress' => $ip_address, + ) + $params); + } +} + diff --git a/externals/twilio-php/Services/Twilio/Rest/Media.php b/externals/twilio-php/Services/Twilio/Rest/Media.php new file mode 100755 index 0000000000..0d8a19f38a --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/Media.php @@ -0,0 +1,31 @@ +` objects. + * For the definitive reference, see the `Twilio Media List Documentation + * `_. + */ +class Services_Twilio_Rest_Media extends Services_Twilio_ListResource { + + + // This is overridden because the list key in the Twilio response + // is "media_list", not "media". + public function getResourceName($camelized = false) + { + if ($camelized) { + return "MediaList"; + } else { + return "media_list"; + } + } + + // We manually set the instance name here so that the parent + // constructor doesn't attempt to figure out it. It would do it + // incorrectly because we override getResourceName above. + public function __construct($client, $uri) { + $this->instance_name = "Services_Twilio_Rest_MediaInstance"; + parent::__construct($client, $uri); + } + +} + diff --git a/externals/twilio-php/Services/Twilio/Rest/MediaInstance.php b/externals/twilio-php/Services/Twilio/Rest/MediaInstance.php new file mode 100755 index 0000000000..1a152b2ea9 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/MediaInstance.php @@ -0,0 +1,37 @@ +`_. + * + * .. php:attr:: sid + * + * A 34 character string that identifies this object + * + * .. php:attr:: account_sid + * + * A 34 character string representing the account that sent the message + * + * .. php:attr:: parent_sid + * + * The sid of the message that created this media. + * + * .. php:attr:: date_created + * + * The date the message was created + * + * .. php:attr:: date_updated + * + * The date the message was updated + * + * .. php:attr:: content_type + * + * The content-type of the media. + */ +class Services_Twilio_Rest_MediaInstance extends Services_Twilio_InstanceResource { + public function __construct($client, $uri) { + $uri = str_replace('MediaInstance', 'Media', $uri); + parent::__construct($client, $uri); + } +} + diff --git a/externals/twilio-php/Services/Twilio/Rest/Member.php b/externals/twilio-php/Services/Twilio/Rest/Member.php new file mode 100755 index 0000000000..8067cddfe6 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/Member.php @@ -0,0 +1,22 @@ + $url, + 'Method' => $method, + )); + } +} diff --git a/externals/twilio-php/Services/Twilio/Rest/Members.php b/externals/twilio-php/Services/Twilio/Rest/Members.php new file mode 100755 index 0000000000..61e05decc5 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/Members.php @@ -0,0 +1,28 @@ +instance_name($this->client, $this->uri . '/Front'); + } + + /* Participants are identified by CallSid, not like ME123 */ + public function getObjectFromJson($params, $idParam = 'sid') { + return parent::getObjectFromJson($params, 'call_sid'); + } + + public function getResourceName($camelized = false) + { + // The JSON property name is atypical. + return $camelized ? 'Members' : 'queue_members'; + } +} + diff --git a/externals/twilio-php/Services/Twilio/Rest/Message.php b/externals/twilio-php/Services/Twilio/Rest/Message.php new file mode 100755 index 0000000000..afc6cf5b08 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/Message.php @@ -0,0 +1,53 @@ +setupSubresources( + 'media' + ); + } +} + diff --git a/externals/twilio-php/Services/Twilio/Rest/Messages.php b/externals/twilio-php/Services/Twilio/Rest/Messages.php new file mode 100755 index 0000000000..355fce0392 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/Messages.php @@ -0,0 +1,73 @@ +account->messages->create(array( + * "Body" => "foo", + * "From" => "+14105551234", + * "To" => "+14105556789", + * )); + * + * :param array $params: a single array of parameters which is serialized and + * sent directly to the Twilio API. You may find it easier to use the + * sendMessage helper instead of this function. + * + */ + public function create($params = array()) { + return parent::_create($params); + } + + /** + * Send a message + * + * .. code-block:: php + * + * $client = new Services_Twilio('AC123', '123'); + * $message = $client->account->messages->sendMessage( + * '+14105551234', // From a Twilio number in your account + * '+14105556789', // Text any number + * 'Come at the king, you best not miss.' // Message body (if any) + * array('https://demo.twilio.com/owl.png'), // An array of MediaUrls + * ); + * + * :param string $from: the from number for the message, this must be a + * number you purchased from Twilio + * :param string $to: the message recipient's phone number + * :param $mediaUrls: the URLs of images to send in this MMS + * :type $mediaUrls: null (don't include media), a single URL, or an array + * of URLs to send as media with this message + * :param string $body: the text to include along with this MMS + * :param array $params: Any additional params (callback, etc) you'd like to + * send with this request, these are serialized and sent as POST + * parameters + * + * :return: The created :class:`Services_Twilio_Rest_Message` + * :raises: :class:`Services_Twilio_RestException` + * An exception if the parameters are invalid (for example, the from + * number is not a Twilio number registered to your account, or is + * unable to send MMS) + */ + public function sendMessage($from, $to, $body = null, $mediaUrls = null, + $params = array() + ) { + $postParams = array( + 'From' => $from, + 'To' => $to, + ); + // When the request is made, this will get serialized into MediaUrl=a&MediaUrl=b + if (!is_null($mediaUrls)) { + $postParams['MediaUrl'] = $mediaUrls; + } + if (!is_null($body)) { + $postParams['Body'] = $body; + } + return self::create($postParams + $params); + } +} diff --git a/externals/twilio-php/Services/Twilio/Rest/Notification.php b/externals/twilio-php/Services/Twilio/Rest/Notification.php new file mode 100755 index 0000000000..ef89247a5c --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/Notification.php @@ -0,0 +1,6 @@ + $phoneNumber, + ) + $params); + } +} diff --git a/externals/twilio-php/Services/Twilio/Rest/Participant.php b/externals/twilio-php/Services/Twilio/Rest/Participant.php new file mode 100755 index 0000000000..b62920b2dc --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/Participant.php @@ -0,0 +1,10 @@ +update('Muted', 'true'); + } +} diff --git a/externals/twilio-php/Services/Twilio/Rest/Participants.php b/externals/twilio-php/Services/Twilio/Rest/Participants.php new file mode 100755 index 0000000000..3b0464eea4 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/Participants.php @@ -0,0 +1,10 @@ +setupSubresources('members'); + } +} + diff --git a/externals/twilio-php/Services/Twilio/Rest/Queues.php b/externals/twilio-php/Services/Twilio/Rest/Queues.php new file mode 100755 index 0000000000..bc35c830f7 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/Queues.php @@ -0,0 +1,19 @@ + $friendly_name, + ) + $params); + } +} + diff --git a/externals/twilio-php/Services/Twilio/Rest/Recording.php b/externals/twilio-php/Services/Twilio/Rest/Recording.php new file mode 100755 index 0000000000..a76014c255 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/Recording.php @@ -0,0 +1,9 @@ +setupSubresources('transcriptions'); + } +} diff --git a/externals/twilio-php/Services/Twilio/Rest/Recordings.php b/externals/twilio-php/Services/Twilio/Rest/Recordings.php new file mode 100755 index 0000000000..47ec0d5474 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/Recordings.php @@ -0,0 +1,6 @@ +setupSubresources( + 'domains', + 'ip_access_control_lists', + 'credential_lists' + ); + } + + public function getResourceName($camelized = false) { + return "SIP"; + } +} diff --git a/externals/twilio-php/Services/Twilio/Rest/SmsMessage.php b/externals/twilio-php/Services/Twilio/Rest/SmsMessage.php new file mode 100755 index 0000000000..6bd3f9ca02 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/SmsMessage.php @@ -0,0 +1,6 @@ + $from, + 'To' => $to, + 'Body' => $body + ) + $params); + } +} diff --git a/externals/twilio-php/Services/Twilio/Rest/Transcription.php b/externals/twilio-php/Services/Twilio/Rest/Transcription.php new file mode 100755 index 0000000000..83c139cb23 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/Transcription.php @@ -0,0 +1,6 @@ +setupSubresources( + 'today', + 'yesterday', + 'all_time', + 'this_month', + 'last_month', + 'daily', + 'monthly', + 'yearly' + ); + } +} + +class Services_Twilio_Rest_Today extends Services_Twilio_TimeRangeResource { } + +class Services_Twilio_Rest_Yesterday extends Services_Twilio_TimeRangeResource { } + +class Services_Twilio_Rest_LastMonth extends Services_Twilio_TimeRangeResource { } + +class Services_Twilio_Rest_ThisMonth extends Services_Twilio_TimeRangeResource { } + +class Services_Twilio_Rest_AllTime extends Services_Twilio_TimeRangeResource { } + +class Services_Twilio_Rest_Daily extends Services_Twilio_UsageResource { } + +class Services_Twilio_Rest_Monthly extends Services_Twilio_UsageResource { } + +class Services_Twilio_Rest_Yearly extends Services_Twilio_UsageResource { } diff --git a/externals/twilio-php/Services/Twilio/Rest/UsageTrigger.php b/externals/twilio-php/Services/Twilio/Rest/UsageTrigger.php new file mode 100755 index 0000000000..44c8cf5cf6 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Rest/UsageTrigger.php @@ -0,0 +1,5 @@ +`_. + * @param string $value Fire the trigger when usage crosses this value. + * @param string $url The URL to request when the trigger fires. + * @param array $params Optional parameters for this trigger. A full list of parameters can be found in the `Usage Trigger documentation `_. + * @return Services_Twilio_Rest_UsageTrigger The created trigger + */ + function create($category, $value, $url, array $params = array()) { + return parent::_create(array( + 'UsageCategory' => $category, + 'TriggerValue' => $value, + 'CallbackUrl' => $url, + ) + $params); + } + +} + diff --git a/externals/twilio-php/Services/Twilio/RestException.php b/externals/twilio-php/Services/Twilio/RestException.php new file mode 100755 index 0000000000..c7de16ce4e --- /dev/null +++ b/externals/twilio-php/Services/Twilio/RestException.php @@ -0,0 +1,44 @@ +status = $status; + $this->info = $info; + parent::__construct($message, $code); + } + + /** + * Get the HTTP status code + */ + public function getStatus() { + return $this->status; + } + + /** + * Get a link to more information + */ + public function getInfo() { + return $this->info; + } +} diff --git a/externals/twilio-php/Services/Twilio/SIPListResource.php b/externals/twilio-php/Services/Twilio/SIPListResource.php new file mode 100755 index 0000000000..1e63b67f42 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/SIPListResource.php @@ -0,0 +1,14 @@ + + * @license http://creativecommons.org/licenses/MIT/ MIT + * @link http://pear.php.net/package/Services_Twilio + */ +class Services_Twilio_TimeRangeResource extends Services_Twilio_UsageResource { + + /** + * Return a UsageRecord corresponding to the given category. + * + * @param string $category The category of usage to retrieve. For a full + * list of valid categories, please see the documentation at + * http://www.twilio.com/docs/api/rest/usage-records#usage-all-categories + * @return Services_Twilio_Rest_UsageRecord + * @throws Services_Twilio_RestException + */ + public function getCategory($category) { + $page = $this->getPage(0, 1, array( + 'Category' => $category, + )); + $items = $page->getItems(); + if (!is_array($items) || count($items) === 0) { + throw new Services_Twilio_RestException( + 400, "Usage record data is unformattable."); + } + return $items[0]; + } +} diff --git a/externals/twilio-php/Services/Twilio/TinyHttp.php b/externals/twilio-php/Services/Twilio/TinyHttp.php new file mode 100755 index 0000000000..83eb9a24ab --- /dev/null +++ b/externals/twilio-php/Services/Twilio/TinyHttp.php @@ -0,0 +1,126 @@ + array( + * CURLOPT_USERAGENT => self::USER_AGENT, + * CURLOPT_HTTPHEADER => array('Accept-Charset: utf-8'), + * CURLOPT_CAINFO => dirname(__FILE__) . '/cacert.pem', + * )) + * ); + */ +class Services_Twilio_TinyHttp { + var $user, $pass, $scheme, $host, $port, $debug, $curlopts; + + public function __construct($uri = '', $kwargs = array()) { + foreach (parse_url($uri) as $name => $value) $this->$name = $value; + $this->debug = isset($kwargs['debug']) ? !!$kwargs['debug'] : NULL; + $this->curlopts = isset($kwargs['curlopts']) ? $kwargs['curlopts'] : array(); + } + + public function __call($name, $args) { + list($res, $req_headers, $req_body) = $args + array(0, array(), ''); + + $opts = $this->curlopts + array( + CURLOPT_URL => "$this->scheme://$this->host$res", + CURLOPT_HEADER => TRUE, + CURLOPT_RETURNTRANSFER => TRUE, + CURLOPT_INFILESIZE => -1, + CURLOPT_POSTFIELDS => NULL, + CURLOPT_TIMEOUT => 60, + ); + + foreach ($req_headers as $k => $v) $opts[CURLOPT_HTTPHEADER][] = "$k: $v"; + if ($this->port) $opts[CURLOPT_PORT] = $this->port; + if ($this->debug) $opts[CURLINFO_HEADER_OUT] = TRUE; + if ($this->user && $this->pass) $opts[CURLOPT_USERPWD] = "$this->user:$this->pass"; + switch ($name) { + case 'get': + $opts[CURLOPT_HTTPGET] = TRUE; + break; + case 'post': + $opts[CURLOPT_POST] = TRUE; + $opts[CURLOPT_POSTFIELDS] = $req_body; + break; + case 'put': + $opts[CURLOPT_PUT] = TRUE; + if (strlen($req_body)) { + if ($buf = fopen('php://memory', 'w+')) { + fwrite($buf, $req_body); + fseek($buf, 0); + $opts[CURLOPT_INFILE] = $buf; + $opts[CURLOPT_INFILESIZE] = strlen($req_body); + } else throw new Services_Twilio_TinyHttpException('unable to open temporary file'); + } + break; + case 'head': + $opts[CURLOPT_NOBODY] = TRUE; + break; + default: + $opts[CURLOPT_CUSTOMREQUEST] = strtoupper($name); + break; + } + try { + if ($curl = curl_init()) { + if (curl_setopt_array($curl, $opts)) { + if ($response = curl_exec($curl)) { + $parts = explode("\r\n\r\n", $response, 3); + list($head, $body) = ($parts[0] == 'HTTP/1.1 100 Continue') + ? array($parts[1], $parts[2]) + : array($parts[0], $parts[1]); + $status = curl_getinfo($curl, CURLINFO_HTTP_CODE); + if ($this->debug) { + error_log( + curl_getinfo($curl, CURLINFO_HEADER_OUT) . + $req_body + ); + } + $header_lines = explode("\r\n", $head); + array_shift($header_lines); + foreach ($header_lines as $line) { + list($key, $value) = explode(":", $line, 2); + $headers[$key] = trim($value); + } + curl_close($curl); + if (isset($buf) && is_resource($buf)) { + fclose($buf); + } + return array($status, $headers, $body); + } else { + throw new Services_Twilio_TinyHttpException(curl_error($curl)); + } + } else throw new Services_Twilio_TinyHttpException(curl_error($curl)); + } else throw new Services_Twilio_TinyHttpException('unable to initialize cURL'); + } catch (ErrorException $e) { + if (is_resource($curl)) curl_close($curl); + if (isset($buf) && is_resource($buf)) fclose($buf); + throw $e; + } + } + + public function authenticate($user, $pass) { + $this->user = $user; + $this->pass = $pass; + } +} diff --git a/externals/twilio-php/Services/Twilio/Twiml.php b/externals/twilio-php/Services/Twilio/Twiml.php new file mode 100755 index 0000000000..d546b054a2 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/Twiml.php @@ -0,0 +1,137 @@ + + * License: http://creativecommons.org/licenses/MIT/ MIT + */ +class Services_Twilio_Twiml { + + protected $element; + + /** + * Constructs a Twiml response. + * + * :param SimpleXmlElement|array $arg: Can be any of + * + * - the element to wrap + * - attributes to add to the element + * - if null, initialize an empty element named 'Response' + */ + public function __construct($arg = null) { + switch (true) { + case $arg instanceof SimpleXmlElement: + $this->element = $arg; + break; + case $arg === null: + $this->element = new SimpleXmlElement(''); + break; + case is_array($arg): + $this->element = new SimpleXmlElement(''); + foreach ($arg as $name => $value) { + $this->element->addAttribute($name, $value); + } + break; + default: + throw new TwimlException('Invalid argument'); + } + } + + /** + * Converts method calls into Twiml verbs. + * + * A basic example: + * + * .. code-block:: php + * + * php> print $this->say('hello'); + * hello + * + * An example with attributes: + * + * .. code-block:: php + * + * print $this->say('hello', array('voice' => 'woman')); + * hello + * + * You could even just pass in an attributes array, omitting the noun: + * + * .. code-block:: php + * + * print $this->gather(array('timeout' => '20')); + * + * + * :param string $verb: The Twiml verb. + * :param array $args: + * - (noun string) + * - (noun string, attributes array) + * - (attributes array) + * + * :return: A SimpleXmlElement + * :rtype: SimpleXmlElement + */ + public function __call($verb, array $args) + { + list($noun, $attrs) = $args + array('', array()); + if (is_array($noun)) { + list($attrs, $noun) = array($noun, ''); + } + /* addChild does not escape XML, while addAttribute does. This means if + * you pass unescaped ampersands ("&") to addChild, you will generate + * an error. + * + * Some inexperienced developers will pass in unescaped ampersands, and + * we want to make their code work, by escaping the ampersands for them + * before passing the string to addChild. (with htmlentities) + * + * However other people will know what to do, and their code + * already escapes ampersands before passing them to addChild. We don't + * want to break their existing code by turning their &'s into + * &amp; + * + * We also want to use numeric entities, not named entities so that we + * are fully compatible with XML + * + * The following lines accomplish the desired behavior. + */ + $decoded = html_entity_decode($noun, ENT_COMPAT, 'UTF-8'); + $normalized = htmlspecialchars($decoded, ENT_COMPAT, 'UTF-8', false); + $child = empty($noun) + ? $this->element->addChild(ucfirst($verb)) + : $this->element->addChild(ucfirst($verb), $normalized); + foreach ($attrs as $name => $value) { + /* Note that addAttribute escapes raw ampersands by default, so we + * haven't touched its implementation. So this is the matrix for + * addAttribute: + * + * & turns into & + * & turns into &amp; + */ + if (is_bool($value)) { + $value = ($value === true) ? 'true' : 'false'; + } + $child->addAttribute($name, $value); + } + return new static($child); + } + + /** + * Returns the object as XML. + * + * :return: The response as an XML string + * :rtype: string + */ + public function __toString() + { + $xml = $this->element->asXml(); + return str_replace( + '', + '', $xml); + } +} diff --git a/externals/twilio-php/Services/Twilio/UsageResource.php b/externals/twilio-php/Services/Twilio/UsageResource.php new file mode 100755 index 0000000000..b9b929cfc8 --- /dev/null +++ b/externals/twilio-php/Services/Twilio/UsageResource.php @@ -0,0 +1,20 @@ + + * @license http://creativecommons.org/licenses/MIT/ MIT + * @link http://pear.php.net/package/Services_Twilio + */ +class Services_Twilio_UsageResource extends Services_Twilio_ListResource { + public function getResourceName($camelized = false) { + $this->instance_name = 'Services_Twilio_Rest_UsageRecord'; + return $camelized ? 'UsageRecords' : 'usage_records'; + } + + public function __construct($client, $uri) { + $uri = preg_replace("#UsageRecords#", "Usage/Records", $uri); + parent::__construct($client, $uri); + } +} + diff --git a/externals/twilio-php/Services/cacert.pem b/externals/twilio-php/Services/cacert.pem new file mode 100755 index 0000000000..20fd34a956 --- /dev/null +++ b/externals/twilio-php/Services/cacert.pem @@ -0,0 +1,3849 @@ +## +## ca-bundle.crt -- Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Thu Jun 28 15:03:08 2012 +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## + +# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.85 $ $Date: 2012/06/28 13:50:18 $ + +GTE CyberTrust Global Root +========================== +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg +Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG +A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz +MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL +Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 +IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u +sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql +HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID +AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW +M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF +NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +Thawte Server CA +================ +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE +AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j +b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV +BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u +c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG +A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 +ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl +/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 +1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J +GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ +GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +Thawte Premium Server CA +======================== +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE +AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl +ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU +VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 +aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ +cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 +aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh +Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ +qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm +SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf +8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t +UCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +Equifax Secure CA +================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE +ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT +B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR +fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW +8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE +CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS +spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 +zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB +BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 +70+sB3c4 +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 1 +======================================= +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE +ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy +MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs +IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE +NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i +o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo +BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 +dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM +BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB +ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq +kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4 +RbyhkwS7hp86W0N6w4pl +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 3 +======================================= +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE +ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy +MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs +IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD +VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS +xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo +BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 +dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM +BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB +AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi +up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1 +mPnHfxsb1gYgAlihw6ID +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA +TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah +WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf +Tqj/ZA1k +-----END CERTIFICATE----- + +Verisign Class 1 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgd +k4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIq +WpDBucSmFc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9ZrbWB85a7FkCMM +XErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2uluIncrKTdcu1OofdPvAbT6shkdHvC +lUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68DzFc6PLZ +-----END CERTIFICATE----- + +Verisign Class 2 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h +cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp +Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 +c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h +cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp +Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 +c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjx +nNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRC +wiNPStjwDqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEA +ATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/7aHmZuovCfTK +1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAXrXfMSTWqz9iP0b63GJZHc2pUIjRk +LbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnInjBJ7xUS0rg== +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO +FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 +lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT +1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD +Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 +-----END CERTIFICATE----- + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +GlobalSign Root CA - R2 +======================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 +ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp +s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN +S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL +TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C +ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i +YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN +BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp +9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu +01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 +9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +ValiCert Class 1 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy +MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi +GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm +DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG +lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX +icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP +Orf1LXLI +-----END CERTIFICATE----- + +ValiCert Class 2 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC +CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf +ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ +SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV +UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 +W9ViH0Pd +-----END CERTIFICATE----- + +RSA Root Certificate 1 +====================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td +3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H +BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs +3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF +V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r +on+jjBXu +-----END CERTIFICATE----- + +Verisign Class 1 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/E +bRrsC+MO8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJ +rKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7PoBMAGrgnoeS+ +Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP26KbqxzcSXKMpHgLZ2x87tNcPVkeB +FQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +q2aN17O6x5q25lXQBfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N +y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 +ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrspSCAaWihT37h +a88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/Pc +D98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== +-----END CERTIFICATE----- + +Verisign Class 2 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29y +azE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ug +b25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 +c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y +aXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6 +tW8UvxDOJxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7 +C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQHgiBVrKtaaNS +0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjNqWm6o+sdDZykIKbBoMXRRkwXbdKs +Zj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0 +JhU8wI1NQ0kdvekhktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf +0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU +sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RIsH/7NiXaldDx +JBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//j +GHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 +EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc +cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw +EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj +055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 +xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa +t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +Verisign Class 4 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS +tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM +8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW +Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX +Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt +mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd +RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG +UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- + +Entrust.net Secure Server CA +============================ +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg +cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl +ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG +A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi +eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p +dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ +aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 +gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw +ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw +CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l +dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw +NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow +HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA +BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN +Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 +n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC +AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER +gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B +AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo +oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS +o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z +2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX +OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +Equifax Secure Global eBusiness CA +================================== +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp +bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx +HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds +b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV +PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN +qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn +hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j +BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs +MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN +I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY +NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 1 +============================= +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB +LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE +ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz +IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ +1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a +IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk +MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW +Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF +AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 +lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ +KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 2 +============================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE +ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y +MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT +DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn +2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5 +BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx +JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e +uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1 +jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia +78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm +V+GRMOrN +-----END CERTIFICATE----- + +AddTrust Low-Value Services Root +================================ +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU +cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw +CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO +ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 +54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr +oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 +Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui +GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w +HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw +HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt +ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph +iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr +mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj +ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- + +AddTrust External Root +====================== +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD +VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw +NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU +cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg +Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 ++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw +Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo +aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy +2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 +7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL +VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk +VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 +e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u +G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +AddTrust Public Services Root +============================= +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU +cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ +BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l +dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu +nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i +d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG +Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw +HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G +A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G +A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 +JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL ++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 +Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H +EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- + +AddTrust Qualified Certificates Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU +cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx +CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ +IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx +64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 +KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o +L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR +wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU +MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE +BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y +azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG +GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze +RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB +iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +RSA Security 2048 v3 +==================== +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK +ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy +MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb +BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 +Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb +WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH +KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP ++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E +FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY +v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj +0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj +VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 +nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA +pKnXwiJPZ9d37CAFYd4= +-----END CERTIFICATE----- + +GeoTrust Global CA +================== +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw +MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo +BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet +8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc +T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU +vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk +DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q +zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 +d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 +mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p +XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- + +GeoTrust Global CA 2 +==================== +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw +MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ +NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k +LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA +Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b +HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH +K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 +srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh +ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL +OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC +x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF +H4z1Ir+rzoPz4iIprn2DQKi6bA== +-----END CERTIFICATE----- + +GeoTrust Universal CA +===================== +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 +MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu +Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t +JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e +RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs +7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d +8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V +qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga +Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB +Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu +KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 +ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 +XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB +hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 +qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL +oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK +xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF +KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 +DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK +xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU +p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI +P/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +GeoTrust Universal CA 2 +======================= +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 +MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg +SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 +DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 +j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q +JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a +QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 +WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP +20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn +ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC +SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG +8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 ++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E +BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ +4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ +mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq +A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg +Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP +pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d +FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp +gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm +X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +UTN-USER First-Network Applications +=================================== +-----BEGIN CERTIFICATE----- +MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCBozELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzAp +BgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5 +WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5T +YWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBB +cHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZVhawGNFug +mliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4Cj +DUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXu +Ozr0hAReYFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwi +P8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7igEL66S/ozjIE +j3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8w +HQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9j +cmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G +CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y +IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6LzsQCv4AdRWOOTK +RIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4Qp +xFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAq +DbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjisH8SE +-----END CERTIFICATE----- + +America Online Root Certification Authority 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG +v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z +DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh +sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP +8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z +o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf +GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF +VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft +3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g +Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- + +America Online Root Certification Authority 2 +============================================= +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en +fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 +f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO +qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN +RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 +gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn +6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid +FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 +Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj +B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op +aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY +T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p ++DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg +JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy +zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO +ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh +1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf +GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff +Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP +cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= +-----END CERTIFICATE----- + +Visa eCommerce Root +=================== +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG +EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug +QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 +WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm +VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL +F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b +RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 +TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI +/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs +GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc +CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW +YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz +zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu +YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +Certum Root CA +============== +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK +ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla +Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u +by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x +wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL +kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ +89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K +Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P +NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ +GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg +GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ +0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS +qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +Comodo Secure Services root +=========================== +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw +MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu +Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi +BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP +9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc +rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC +oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V +p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E +FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj +YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm +aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm +4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL +DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw +pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H +RR3B7Hzs/Sk= +-----END CERTIFICATE----- + +Comodo Trusted Services root +============================ +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw +MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h +bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw +IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 +3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y +/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 +juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS +ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud +DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp +ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl +cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw +uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA +BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l +R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O +9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +QuoVadis Root CA +================ +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE +ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz +MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp +cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD +EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk +J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL +F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL +YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen +AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w +PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y +ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 +MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj +YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW +Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu +BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw +FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 +tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo +fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul +LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x +gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi +5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi +5nrQNiOKSnQ2+Q== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx +ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 +XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk +lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB +lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy +lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt +66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn +wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh +D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy +BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie +J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud +DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU +a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv +Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 +UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm +VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK ++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW +IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 +WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X +f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II +4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 +VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx +OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg +DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij +KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K +DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv +BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp +p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 +nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX +MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM +Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz +uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT +BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj +YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB +BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD +VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 +ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE +AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV +qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s +hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z +POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 +Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp +8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC +bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu +g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p +vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr +qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +Sonera Class 1 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQw +NjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H88 +7dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9 +EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl +0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF645 +2F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW1ebZrgUa +HXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZT +iFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE9 +28Jj2VuXZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxV +yhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2nBBhjrZTOqMR +vq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2UvkVrCqIexVmiUefkl98HVrhq4uz2P +qYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9Z +IRlXvVWa +-----END CERTIFICATE----- + +Sonera Class 2 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw +NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 +/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT +dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG +f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P +tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH +nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT +XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt +0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI +cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph +Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx +EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH +llpwrN9M +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA +============================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE +ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w +HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh +bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt +vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P +jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca +C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth +vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 +22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV +HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v +dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN +BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR +EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw +MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y +nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- + +TDC Internet Root CA +==================== +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE +ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx +NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu +ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j +xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL +znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc +5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 +otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI +AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM +VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM +MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC +AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe +UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G +CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m +gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb +O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU +Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- + +TDC OCES Root CA +================ +-----BEGIN CERTIFICATE----- +MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE +ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5 +MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH +nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0 +zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV +iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde +dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO +3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB +5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k +ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm +cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp +Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x +LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM +MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm +aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy +MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647 ++RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6 +NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4 +A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc +A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9 +AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1 +AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw== +-----END CERTIFICATE----- + +UTN DATACorp SGC Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ +BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa +MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w +HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy +dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys +raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo +wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA +9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv +33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud +DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 +BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD +LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 +DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 +I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx +EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP +DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- + +UTN USERFirst Email Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0 +BgNVBAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05 +OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQx +FzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx +ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJz +dC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIx +B8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8 +om+rWV6lL8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHG +TPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZUOt4KpLoDd7Nl +yP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws6wIDAQABo4G5MIG2MAsGA1UdDwQE +AwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNV +HR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll +bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH +AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u7mFVbwQ+zzne +xRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+ +5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarV +NZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZ +w7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= +-----END CERTIFICATE----- + +UTN USERFirst Hardware Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd +BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx +OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 +eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz +ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI +wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd +tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 +i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf +Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw +gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF +lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF +UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF +BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW +XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 +lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn +iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 +nfhmqA== +-----END CERTIFICATE----- + +UTN USERFirst Object Root CA +============================ +-----BEGIN CERTIFICATE----- +MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAb +BgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAz +NlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx +HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2Vy +dHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r5596Uj71VR +loTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQ +w5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vu +lBe3/IW+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7 +RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEAAaOBrzCBrDAL +BgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU2u1kdBScFDyr3ZmpvVsoTYs8 +ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmly +c3QtT2JqZWN0LmNybDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw +DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw +NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNO +PmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFE +qmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCG +hU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g= +-----END CERTIFICATE----- + +Camerfirma Chambers of Commerce Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx +NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp +cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn +MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC +AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU +xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH +NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW +DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV +d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud +EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v +cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P +AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh +bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD +VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi +fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD +L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN +UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n +ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 +erfutGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +Camerfirma Global Chambersign Root +================================== +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx +NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt +YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg +MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw +ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J +1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O +by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl +6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c +8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ +BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j +aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B +Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj +aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y +ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA +PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y +gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ +PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 +IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes +t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +NetLock Qualified (Class QA) Root +================================= +-----BEGIN CERTIFICATE----- +MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVn +eXpvaSAoQ2xhc3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0 +bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTER +MA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0 +LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0 +dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3DQEJARYP +aW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRV +CacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e +8ia6AFQer7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhb +m+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrqOU+L73Sa58XQ +0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0lmT+1fMptsK6ZmfoIYOcZwvK9UdPM +0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV +HQ8BAf8EBAMCAQYwggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2 +YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh +biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQgZWxla3Ryb25p +a3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFz +YW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwg +YXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kg +ZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczov +L3d3dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2Nr +Lm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0 +aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMg +YXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0 +IGluZm9AbmV0bG9jay5uZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3 +DQEBBQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQMznN +wNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+NFAwLvt/MpqNPfMg +W/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTc +R08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR +5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko +-----END CERTIFICATE----- + +NetLock Notary (Class A) Root +============================= +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI +EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j +ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX +DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH +EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD +VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz +cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM +D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ +z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC +/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 +tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 +4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG +A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC +Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv +bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn +LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 +ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz +IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh +IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu +b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg +Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp +bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 +ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP +ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB +CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr +KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM +8CgHrTwXZoi1/baI +-----END CERTIFICATE----- + +NetLock Business (Class B) Root +=============================== +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg +VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD +VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv +bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg +VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S +o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr +1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV +HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ +RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh +dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 +ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv +c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg +YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz +Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA +bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl +IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 +YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj +cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM +43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR +stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- + +NetLock Express (Class C) Root +============================== +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ +BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j +ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z +W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 +euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw +DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN +RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn +YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB +IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i +aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 +ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y +emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k +IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ +UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg +YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 +xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW +gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj +YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH +AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw +Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg +U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 +LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh +cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT +dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC +AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh +3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm +vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk +fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 +fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ +EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl +1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ +lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro +g14= +-----END CERTIFICATE----- + +Taiwan GRCA +=========== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG +EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X +DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv +dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN +w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 +BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O +1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO +htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov +J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 +Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t +B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB +O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 +lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV +HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 +09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj +Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 +Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU +D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz +DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk +Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk +7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ +CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy ++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS +-----END CERTIFICATE----- + +Firmaprofesional Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT +GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp +Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA +ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL +MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT +OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2 +ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V +j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH +lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf +3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8 +NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww +KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG +AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD +ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq +u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf +wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm +7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG +VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= +-----END CERTIFICATE----- + +Wells Fargo Root CA +=================== +-----BEGIN CERTIFICATE----- +MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl +bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv +MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX +x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3 +E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5 +OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j +sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj +YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF +BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD +ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv +m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R +OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx +x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023 +tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= +-----END CERTIFICATE----- + +Swisscom Root CA 1 +================== +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG +EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy +dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4 +MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln +aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC +IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM +MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF +NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe +AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC +b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn +7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN +cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp +WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5 +haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY +MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw +HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j +BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9 +MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn +jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ +MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H +VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl +vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl +OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3 +1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq +nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy +x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW +NY6E0F/6MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +Certplus Class 2 Primary CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE +BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN +OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy +dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR +5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ +Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO +YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e +e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME +CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ +YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t +L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD +P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R +TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ +7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW +//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +DST Root CA X3 +============== +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK +ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X +DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 +cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT +rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 +UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy +xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d +utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ +MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug +dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE +GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw +RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS +fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +DST ACES CA X6 +============== +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT +MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha +MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE +CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI +DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa +pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow +GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy +MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu +Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy +dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU +CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 +5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t +Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs +vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 +oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 1 +============================================== +-----BEGIN CERTIFICATE----- +MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP +MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 +acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx +MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg +U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB +TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC +aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX +yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i +Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ +8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 +W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME +BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 +sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE +q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy +B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY +nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 2 +============================================== +-----BEGIN CERTIFICATE----- +MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP +MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg +QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN +MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr +dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G +A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls +acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe +LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI +x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g +QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr +5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB +AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt +Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 +Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ +hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P +9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 +UrbnBEI= +-----END CERTIFICATE----- + +SwissSign Platinum CA - G2 +========================== +-----BEGIN CERTIFICATE----- +MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCQ0gxFTAT +BgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWduIFBsYXRpbnVtIENBIC0gRzIw +HhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAwWjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMM +U3dpc3NTaWduIEFHMSMwIQYDVQQDExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu +669yIIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2HtnIuJpX+UF +eNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+6ixuEFGSzH7VozPY1kne +WCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5objM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIo +j5+saCB9bzuohTEJfwvH6GXp43gOCWcwizSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/6 +8++QHkwFix7qepF6w9fl+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34T +aNhxKFrYzt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaPpZjy +domyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtFKwH3HBqi7Ri6Cr2D ++m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuWae5ogObnmLo2t/5u7Su9IPhlGdpV +CX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMBAAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCv +zAeHFUdvOMW0ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW +IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUAA4ICAQAIhab1 +Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0uMoI3LQwnkAHFmtllXcBrqS3 +NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4 +U99REJNi54Av4tHgvI42Rncz7Lj7jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8 +KV2LwUvJ4ooTHbG/u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl +9x8DYSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1puEa+S1B +aYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXaicYwu+uPyyIIoK6q8QNs +OktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbGDI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSY +Mdp08YSTcU1f+2BY0fvEwW2JorsgH51xkcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAci +IfNAChs0B0QTwoRqjt8ZWr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw +EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN +MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp +c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq +t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C +jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg +vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF +ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR +AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend +jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO +peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR +7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi +GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 +OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm +5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr +44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf +Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m +Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp +mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk +vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf +KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br +NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj +viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT +BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X +DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 +aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG +9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 +N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm ++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH +6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu +MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h +qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 +FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs +ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc +celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X +CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB +tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P +4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F +kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L +3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx +/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa +DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP +e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu +WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ +DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub +DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN +b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 +nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge +RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt +tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI +hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K +Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN +NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa +Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG +1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +thawte Primary Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 +MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg +SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv +KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT +FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs +oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ +1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc +q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K +aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p +afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF +AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE +uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 +jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH +z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G5 +============================================================ +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh +dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz +j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD +Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ +Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r +fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv +Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG +SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ +X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE +KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC +Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE +ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +Network Solutions Certificate Authority +======================================= +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG +EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr +IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx +MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx +jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT +aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT +crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc +/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB +AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv +bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA +A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q +4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ +GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD +ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +WellsSecure Public Root Certificate Authority +============================================= +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM +F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw +NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl +bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD +VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 +iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 +i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 +bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB +K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB +AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu +cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm +lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB +i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww +GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI +K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 +bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj +qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es +E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ +tylv2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +IGC/A +===== +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD +VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE +Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy +MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI +EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT +STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 +TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW +So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy +HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd +frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ +tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB +egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC +iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK +q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q +MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI +lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF +0mBWWg== +-----END CERTIFICATE----- + +Security Communication EV RootCA1 +================================= +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE +BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl +Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO +/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX +WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z +ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 +bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK +9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm +iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG +Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW +mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW +T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GA CA +=============================== +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE +BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG +A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH +bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD +VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw +IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 +IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 +Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg +Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD +d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ +/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R +LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm +MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 ++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY +okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= +-----END CERTIFICATE----- + +S-TRUST Authentication and Encryption Root CA 2005 PN +===================================================== +-----BEGIN CERTIFICATE----- +MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE +BhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcpMRIwEAYDVQQHEwlTdHV0dGdh +cnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fzc2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVT +LVRSVVNUIEF1dGhlbnRpY2F0aW9uIGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0w +NTA2MjIwMDAwMDBaFw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFk +ZW4tV3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMgRGV1dHNj +aGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJVU1QgQXV0aGVudGljYXRp +b24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob +4QSwI7+Vio5bG0F/WsPoTUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXL +g3KSwlOyggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1Xgqf +eN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteFhy+S8dF2g08LOlk3 +KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm7QIDAQABo4GSMIGPMBIGA1UdEwEB +/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJv +bmxpbmUxLTIwNDgtNTAdBgNVHQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAU +D8oeXHngovMpttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD +pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFoLtU96G7m1R08 +P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersFiXOMy6ZNwPv2AtawB6MDwidA +nwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0yh9WUUpY6RsZxlj33mA6ykaqP2vROJAA5Veit +F7nTNCtKqUDMFypVZUF0Qn71wK/Ik63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8b +Hz2eBIPdltkdOpQ= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA +========================= +-----BEGIN CERTIFICATE----- +MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE +BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL +EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 +MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz +dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT +GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG +d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N +oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc +QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ +PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb +MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG +IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD +VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 +LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A +dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn +AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA +4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg +AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA +egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 +Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO +PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv +c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h +cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw +IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT +WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV +MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER +MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp +Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal +HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT +nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE +aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a +86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK +yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB +S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. +====================================== +-----BEGIN CERTIFICATE----- +MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT +AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg +LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w +HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ +U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh +IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN +yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU +2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 +4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP +2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm +8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf +HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa +Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK +5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b +czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g +ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF +BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug +cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf +AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX +EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v +/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 +MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 +3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk +eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f +/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h +RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU +Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 2 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw +MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw +IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 +xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ +Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u +SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G +dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ +KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj +TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP +JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk +vQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 3 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw +MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W +yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo +6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ +uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk +2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE +O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 +yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 +IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal +092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc +5A== +-----END CERTIFICATE----- + +TC TrustCenter Universal CA I +============================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy +IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN +MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg +VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw +JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC +qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv +xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw +ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O +gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j +BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG +1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy +vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 +ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT +ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a +7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY +-----END CERTIFICATE----- + +Deutsche Telekom Root CA 2 +========================== +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT +RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG +A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 +MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G +A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS +b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 +bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI +KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY +AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK +Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV +jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV +HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr +E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy +zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 +rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G +dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +ComSign CA +========== +-----BEGIN CERTIFICATE----- +MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0MRMwEQYDVQQD +EwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTMy +MThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMTCkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNp +Z24xCzAJBgNVBAYTAklMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49q +ROR+WCf4C9DklBKK8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTy +P2Q298CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb2CEJKHxN +GGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxCejVb7Us6eva1jsz/D3zk +YDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7KpiXd3DTKaCQeQzC6zJMw9kglcq/QytNuEM +rkvF7zuZ2SOzW120V+x0cAwqTwIDAQABo4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAy +oDCgLoYsaHR0cDovL2ZlZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0P +AQH/BAQDAgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRLAZs+ +VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWdfoPPbrxHbvUanlR2 +QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0McXS6hMTXcpuEfDhOZAYnKuGntewI +mbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb +/627HOkthIDYIb6FUtnUdLlphbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VG +zT2ouvDzuFYkRes3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U +AGegcQCCSA== +-----END CERTIFICATE----- + +ComSign Secured CA +================== +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE +AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w +NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD +QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs +49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH +7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB +kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 +9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw +AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t +U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA +j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC +AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a +BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp +FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP +51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz +OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== +-----END CERTIFICATE----- + +Cybertrust Global Root +====================== +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li +ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 +MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD +ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA ++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW +0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL +AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin +89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT +8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 +MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G +A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO +lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi +5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 +hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T +X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +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 +============================================================================================================================= +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH +DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q +aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry +b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV +BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg +S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 +MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl +IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF +n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl +IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft +dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl +cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO +Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 +xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR +6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd +BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 +N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT +y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh +LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M +dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= +-----END CERTIFICATE----- + +Buypass Class 2 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 +MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M +cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 +0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 +0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R +uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV +1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt +7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 +fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w +wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +-----END CERTIFICATE----- + +Buypass Class 3 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 +MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx +ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 +n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia +AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c +1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 +pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA +EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 +htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj +el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 +-----END CERTIFICATE----- + +EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 +========================================================================== +-----BEGIN CERTIFICATE----- +MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg +QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe +Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p +ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt +IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by +X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b +gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr +eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ +TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy +Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn +uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI +qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm +ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0 +Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW +Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t +FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm +zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k +XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT +bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU +RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK +1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt +2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ +Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9 +AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +CNNIC ROOT +========== +-----BEGIN CERTIFICATE----- +MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE +ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw +OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD +o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz +VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT +VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or +czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK +y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC +wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S +lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 +Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM +O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 +BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 +G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m +mxE= +-----END CERTIFICATE----- + +ApplicationCA - Japanese Government +=================================== +-----BEGIN CERTIFICATE----- +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT +SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw +MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl +cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 +fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN +wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE +jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu +nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU +WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV +BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD +vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs +o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g +/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD +io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW +dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL +rosot4LKGAfmt1t06SAZf7IbiVQ= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G3 +============================================= +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz +NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo +YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT +LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j +K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE +c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C +IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu +dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr +2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 +cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE +Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s +t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +thawte Primary Root CA - G2 +=========================== +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC +VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu +IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg +Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV +MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG +b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt +IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS +LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 +8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU +mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN +G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K +rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +thawte Primary Root CA - G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w +ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD +VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG +A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At +P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC ++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY +7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW +vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ +KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK +A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC +8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm +er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G2 +============================================= +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 +OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl +b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG +BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc +KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ +EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m +ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 +npaqBA+K +-----END CERTIFICATE----- + +VeriSign Universal Root Certification Authority +=============================================== +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj +1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP +MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 +9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I +AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR +tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G +CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O +a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 +Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx +Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx +P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P +wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 +mJO37M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G4 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC +VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 +b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz +ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo +b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 +Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz +rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw +HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u +Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD +A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx +AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +============================================ +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G2 +================================== +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC +TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l +ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ +5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn +vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj +CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil +e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR +OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI +CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 +48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi +trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 +qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB +AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC +ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA +A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz ++51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj +f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN +kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk +CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF +URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb +CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h +oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV +IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm +66+KAQ== +-----END CERTIFICATE----- + +CA Disig +======== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK +QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw +MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz +bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm +GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD +Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo +hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt +ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w +gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P +AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz +aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff +ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa +BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t +WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 +mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ +CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K +ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA +4Z7CRneC9VkGjCFMhwnN5ag= +-----END CERTIFICATE----- + +Juur-SK +======= +-----BEGIN CERTIFICATE----- +MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA +c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw +DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG +SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy +aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf +TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC ++Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw +UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa +Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF +MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD +HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh +AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA +cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr +AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw +cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE +FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G +A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo +ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL +abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 +IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh +Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 +yyqcjg== +-----END CERTIFICATE----- + +Hongkong Post Root CA 1 +======================= +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT +DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx +NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n +IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 +ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr +auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh +qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY +V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV +HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i +h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio +l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei +IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps +T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT +c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +ACEDICOM Root +============= +-----BEGIN CERTIFICATE----- +MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD +T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4 +MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG +A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk +WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD +YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew +MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb +m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk +HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT +xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2 +3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9 +2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq +TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz +4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU +9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv +bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg +aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP +eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk +zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1 +ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI +KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq +nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE +I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp +MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o +tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA== +-----END CERTIFICATE----- + +Verisign Class 1 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAx +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0fzGVuDLDQ +VoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHiTkVWaR94AoDa3EeRKbs2 +yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFgVKTk8d6Pa +XCUDfGD67gmZPCcQcMgMCeazh88K4hiWNWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n +0a3hUKw8fGJLj7qE1xIVGx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZ +RjXZ+Hxb +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky +CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX +bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ +D/xwzoiQ +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi +=================================================== +-----BEGIN CERTIFICATE----- +MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz +ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 +MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 +cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u +aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY +8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y +jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI +JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk +9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG +SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d +F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq +D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 +Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq +fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +TC TrustCenter Universal CA III +=============================== +-----BEGIN CERTIFICATE----- +MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy +IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe +Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU +QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex +KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt +QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO +juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut +CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1 +M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G +A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA +g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+ +KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK +BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV +CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq +woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG +EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz +MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu +QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ +03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK +ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU ++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC +PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT +OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK +F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK +0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ +0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB +leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID +AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ +SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG +NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l +Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga +kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q +hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs +g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 +aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 +nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC +ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo +Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z +WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +Chambers of Commerce Root - 2008 +================================ +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy +Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl +ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF +EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl +cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA +XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj +h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ +ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk +NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g +D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 +lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ +0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 +EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI +G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ +BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh +bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh +bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC +CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH +AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 +wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH +3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU +RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 +M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 +YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF +9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK +zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG +nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ +-----END CERTIFICATE----- + +Global Chambersign Root - 2008 +============================== +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx +NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg +Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ +QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf +VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf +XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 +ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB +/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA +TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M +H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe +Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF +HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB +AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT +BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE +BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm +aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm +aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp +1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 +dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG +/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 +ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s +dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg +9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH +foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du +qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr +P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq +c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +Certinomis - Autorité Racine +============================= +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg +LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG +A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw +JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa +wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly +Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw +2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N +jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q +c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC +lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb +xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g +530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna +4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x +WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva +R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 +nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B +CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv +JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE +qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b +WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE +wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ +vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- + +Root CA Generalitat Valenciana +============================== +-----BEGIN CERTIFICATE----- +MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE +ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 +IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 +WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE +CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 +F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B +ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ +D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte +JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB +AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n +dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB +ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl +AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA +YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy +AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA +aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt +AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA +YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu +AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA +OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 +dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV +BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G +A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S +b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh +TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz +Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 +NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH +iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt ++GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= +-----END CERTIFICATE----- + +A-Trust-nQual-03 +================ +-----BEGIN CERTIFICATE----- +MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE +Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy +a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R +dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw +RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 +ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 +c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA +zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n +yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE +SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 +iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V +cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV +eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 +ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr +sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd +JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS +mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 +ahq97BvIxYSazQ== +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +EC-ACC +====== +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE +BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w +ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD +VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE +CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT +BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 +MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt +SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl +Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh +cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK +w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT +ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 +HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a +E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw +0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD +VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 +Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l +dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ +lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa +Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe +l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 +E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D +5EI= +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2011 +======================================================= +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT +O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y +aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT +AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo +IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI +1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa +71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u +8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH +3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ +MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 +MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu +b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt +XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD +/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N +7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM +BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE +AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky +MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz +IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ +wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa +by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 +zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f +YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 +oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l +EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 +hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 +EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 +jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY +iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI +WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 +JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx +K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ +Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC +4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo +2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz +lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem +OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 +vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +Trustis FPS Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 +IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV +BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ +RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk +H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa +cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt +o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA +AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd +BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c +GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC +yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P +8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV +l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl +iB6XzCGcKQENZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ +Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 +dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu +c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv +bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 +aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t +L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG +cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 +fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm +N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN +Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T +tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX +e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA +2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs +HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib +D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +StartCom Certification Authority G2 +=================================== +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE +ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O +o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG +4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi +Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul +Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs +O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H +vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L +nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS +FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa +z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ +KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk +J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ +JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG +/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc +nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld +blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc +l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm +7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm +obp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- diff --git a/externals/twilio-php/composer.json b/externals/twilio-php/composer.json new file mode 100755 index 0000000000..bd955957d4 --- /dev/null +++ b/externals/twilio-php/composer.json @@ -0,0 +1,30 @@ +{ + "name": "twilio/sdk", + "type": "library", + "description": "A PHP wrapper for Twilio's API", + "keywords": ["twilio", "sms", "api"], + "homepage": "http://github.com/twilio/twilio-php", + "license": "MIT", + "authors": [ + { + "name": "Kevin Burke", + "email": "kevin@twilio.com" + }, + { + "name": "Kyle Conroy", + "email": "kyle+pear@twilio.com" + } + ], + "require": { + "php": ">=5.2.1" + }, + "require-dev": { + "mockery/mockery": ">=0.7.2", + "phpunit/phpunit": "3.7.*" + }, + "autoload": { + "psr-0": { + "Services_Twilio": "" + } + } +} diff --git a/externals/twilio-php/composer.lock b/externals/twilio-php/composer.lock new file mode 100755 index 0000000000..3265e5fd2e --- /dev/null +++ b/externals/twilio-php/composer.lock @@ -0,0 +1,492 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" + ], + "hash": "b90999563f52df15b944f8defc454195", + "packages": [ + + ], + "packages-dev": [ + { + "name": "mockery/mockery", + "version": "0.8.0", + "source": { + "type": "git", + "url": "https://github.com/padraic/mockery.git", + "reference": "35f0e18022f5538df9df8920a3d96c1761d63220" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/padraic/mockery/zipball/35f0e18022f5538df9df8920a3d96c1761d63220", + "reference": "35f0e18022f5538df9df8920a3d96c1761d63220", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "hamcrest/hamcrest": "1.1.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Mockery": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework for use in unit testing with PHPUnit, PHPSpec or any other testing framework. Its core goal is to offer a test double framework with a succint API capable of clearly defining all possible object operations and interactions using a human readable Domain Specific Language (DSL). Designed as a drop in alternative to PHPUnit's phpunit-mock-objects library, Mockery is easy to integrate with PHPUnit and can operate alongside phpunit-mock-objects without the World ending.", + "homepage": "http://github.com/padraic/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "time": "2013-04-01 12:13:17" + }, + { + "name": "phpunit/php-code-coverage", + "version": "1.2.13", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "466e7cd2554b4e264c9e3f31216d25ac0e5f3d94" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/466e7cd2554b4e264c9e3f31216d25ac0e5f3d94", + "reference": "466e7cd2554b4e264c9e3f31216d25ac0e5f3d94", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-file-iterator": ">=1.3.0@stable", + "phpunit/php-text-template": ">=1.1.1@stable", + "phpunit/php-token-stream": ">=1.1.3@stable" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*@dev" + }, + "suggest": { + "ext-dom": "*", + "ext-xdebug": ">=2.0.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2013-09-10 08:14:32" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.3.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "16a78140ed2fc01b945cfa539665fadc6a038029" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/16a78140ed2fc01b945cfa539665fadc6a038029", + "reference": "16a78140ed2fc01b945cfa539665fadc6a038029", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "File/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "http://www.phpunit.de/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2012-10-11 11:44:38" + }, + { + "name": "phpunit/php-text-template", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5180896f51c5b3648ac946b05f9ec02be78a0b23" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5180896f51c5b3648ac946b05f9ec02be78a0b23", + "reference": "5180896f51c5b3648ac946b05f9ec02be78a0b23", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "Text/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2012-10-31 18:15:28" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2013-08-02 07:42:54" + }, + { + "name": "phpunit/php-token-stream", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "5220af2a7929aa35cf663d97c89ad3d50cf5fa3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/5220af2a7929aa35cf663d97c89ad3d50cf5fa3e", + "reference": "5220af2a7929aa35cf663d97c89ad3d50cf5fa3e", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "classmap": [ + "PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2013-09-13 04:58:23" + }, + { + "name": "phpunit/phpunit", + "version": "3.7.27", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "4b024e753e3421837afbcca962c8724c58b39376" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4b024e753e3421837afbcca962c8724c58b39376", + "reference": "4b024e753e3421837afbcca962c8724c58b39376", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=5.3.3", + "phpunit/php-code-coverage": "~1.2.1", + "phpunit/php-file-iterator": ">=1.3.1", + "phpunit/php-text-template": ">=1.1.1", + "phpunit/php-timer": ">=1.0.4", + "phpunit/phpunit-mock-objects": "~1.2.0", + "symfony/yaml": "~2.0" + }, + "require-dev": { + "pear-pear/pear": "1.9.4" + }, + "suggest": { + "ext-json": "*", + "ext-simplexml": "*", + "ext-tokenizer": "*", + "phpunit/php-invoker": ">=1.1.0,<1.2.0" + }, + "bin": [ + "composer/bin/phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.7.x-dev" + } + }, + "autoload": { + "classmap": [ + "PHPUnit/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "", + "../../symfony/yaml/" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "http://www.phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2013-09-16 03:09:52" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "5794e3c5c5ba0fb037b11d8151add2a07fa82875" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/5794e3c5c5ba0fb037b11d8151add2a07fa82875", + "reference": "5794e3c5c5ba0fb037b11d8151add2a07fa82875", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-text-template": ">=1.1.1@stable" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "autoload": { + "classmap": [ + "PHPUnit/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2013-01-13 10:24:48" + }, + { + "name": "symfony/yaml", + "version": "v2.3.4", + "target-dir": "Symfony/Component/Yaml", + "source": { + "type": "git", + "url": "https://github.com/symfony/Yaml.git", + "reference": "5a279f1b5f5e1045a6c432354d9ea727ff3a9847" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/5a279f1b5f5e1045a6c432354d9ea727ff3a9847", + "reference": "5a279f1b5f5e1045a6c432354d9ea727ff3a9847", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Yaml\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "http://symfony.com", + "time": "2013-08-24 15:26:22" + } + ], + "aliases": [ + + ], + "minimum-stability": "stable", + "stability-flags": [ + + ], + "platform": { + "php": ">=5.2.1" + }, + "platform-dev": [ + + ] +} diff --git a/externals/twilio-php/docs/Makefile b/externals/twilio-php/docs/Makefile new file mode 100755 index 0000000000..d5756c7019 --- /dev/null +++ b/externals/twilio-php/docs/Makefile @@ -0,0 +1,130 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Services_Twilio.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Services_Twilio.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/Services_Twilio" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Services_Twilio" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + make -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/externals/twilio-php/docs/_themes/.gitignore b/externals/twilio-php/docs/_themes/.gitignore new file mode 100755 index 0000000000..66b6e4c2f3 --- /dev/null +++ b/externals/twilio-php/docs/_themes/.gitignore @@ -0,0 +1,3 @@ +*.pyc +*.pyo +.DS_Store diff --git a/externals/twilio-php/docs/_themes/LICENSE b/externals/twilio-php/docs/_themes/LICENSE new file mode 100755 index 0000000000..b160a8eeb8 --- /dev/null +++ b/externals/twilio-php/docs/_themes/LICENSE @@ -0,0 +1,45 @@ +Modifications: + +Copyright (c) 2011 Kenneth Reitz. + + +Original Project: + +Copyright (c) 2010 by Armin Ronacher. + + +Some rights reserved. + +Redistribution and use in source and binary forms of the theme, with or +without modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + +* The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +We kindly ask you to only use these themes in an unmodified manner just +for Flask and Flask-related products, not for unrelated projects. If you +like the visual style and want to use it for your own projects, please +consider making some larger changes to the themes (such as changing +font faces, sizes, colors or margins). + +THIS THEME IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS THEME, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/externals/twilio-php/docs/_themes/README.rst b/externals/twilio-php/docs/_themes/README.rst new file mode 100755 index 0000000000..8648482a31 --- /dev/null +++ b/externals/twilio-php/docs/_themes/README.rst @@ -0,0 +1,25 @@ +krTheme Sphinx Style +==================== + +This repository contains sphinx styles Kenneth Reitz uses in most of +his projects. It is a drivative of Mitsuhiko's themes for Flask and Flask related +projects. To use this style in your Sphinx documentation, follow +this guide: + +1. put this folder as _themes into your docs folder. Alternatively + you can also use git submodules to check out the contents there. + +2. add this to your conf.py: :: + + sys.path.append(os.path.abspath('_themes')) + html_theme_path = ['_themes'] + html_theme = 'flask' + +The following themes exist: + +**kr** + the standard flask documentation theme for large projects + +**kr_small** + small one-page theme. Intended to be used by very small addon libraries. + diff --git a/externals/twilio-php/docs/_themes/flask_theme_support.py b/externals/twilio-php/docs/_themes/flask_theme_support.py new file mode 100755 index 0000000000..33f47449c1 --- /dev/null +++ b/externals/twilio-php/docs/_themes/flask_theme_support.py @@ -0,0 +1,86 @@ +# flasky extensions. flasky pygments style based on tango style +from pygments.style import Style +from pygments.token import Keyword, Name, Comment, String, Error, \ + Number, Operator, Generic, Whitespace, Punctuation, Other, Literal + + +class FlaskyStyle(Style): + background_color = "#f8f8f8" + default_style = "" + + styles = { + # No corresponding class for the following: + #Text: "", # class: '' + Whitespace: "underline #f8f8f8", # class: 'w' + Error: "#a40000 border:#ef2929", # class: 'err' + Other: "#000000", # class 'x' + + Comment: "italic #8f5902", # class: 'c' + Comment.Preproc: "noitalic", # class: 'cp' + + Keyword: "bold #004461", # class: 'k' + Keyword.Constant: "bold #004461", # class: 'kc' + Keyword.Declaration: "bold #004461", # class: 'kd' + Keyword.Namespace: "bold #004461", # class: 'kn' + Keyword.Pseudo: "bold #004461", # class: 'kp' + Keyword.Reserved: "bold #004461", # class: 'kr' + Keyword.Type: "bold #004461", # class: 'kt' + + Operator: "#582800", # class: 'o' + Operator.Word: "bold #004461", # class: 'ow' - like keywords + + Punctuation: "bold #000000", # class: 'p' + + # because special names such as Name.Class, Name.Function, etc. + # are not recognized as such later in the parsing, we choose them + # to look the same as ordinary variables. + Name: "#000000", # class: 'n' + Name.Attribute: "#c4a000", # class: 'na' - to be revised + Name.Builtin: "#004461", # class: 'nb' + Name.Builtin.Pseudo: "#3465a4", # class: 'bp' + Name.Class: "#000000", # class: 'nc' - to be revised + Name.Constant: "#000000", # class: 'no' - to be revised + Name.Decorator: "#888", # class: 'nd' - to be revised + Name.Entity: "#ce5c00", # class: 'ni' + Name.Exception: "bold #cc0000", # class: 'ne' + Name.Function: "#000000", # class: 'nf' + Name.Property: "#000000", # class: 'py' + Name.Label: "#f57900", # class: 'nl' + Name.Namespace: "#000000", # class: 'nn' - to be revised + Name.Other: "#000000", # class: 'nx' + Name.Tag: "bold #004461", # class: 'nt' - like a keyword + Name.Variable: "#000000", # class: 'nv' - to be revised + Name.Variable.Class: "#000000", # class: 'vc' - to be revised + Name.Variable.Global: "#000000", # class: 'vg' - to be revised + Name.Variable.Instance: "#000000", # class: 'vi' - to be revised + + Number: "#990000", # class: 'm' + + Literal: "#000000", # class: 'l' + Literal.Date: "#000000", # class: 'ld' + + String: "#4e9a06", # class: 's' + String.Backtick: "#4e9a06", # class: 'sb' + String.Char: "#4e9a06", # class: 'sc' + String.Doc: "italic #8f5902", # class: 'sd' - like a comment + String.Double: "#4e9a06", # class: 's2' + String.Escape: "#4e9a06", # class: 'se' + String.Heredoc: "#4e9a06", # class: 'sh' + String.Interpol: "#4e9a06", # class: 'si' + String.Other: "#4e9a06", # class: 'sx' + String.Regex: "#4e9a06", # class: 'sr' + String.Single: "#4e9a06", # class: 's1' + String.Symbol: "#4e9a06", # class: 'ss' + + Generic: "#000000", # class: 'g' + Generic.Deleted: "#a40000", # class: 'gd' + Generic.Emph: "italic #000000", # class: 'ge' + Generic.Error: "#ef2929", # class: 'gr' + Generic.Heading: "bold #000080", # class: 'gh' + Generic.Inserted: "#00A000", # class: 'gi' + Generic.Output: "#888", # class: 'go' + Generic.Prompt: "#745334", # class: 'gp' + Generic.Strong: "bold #000000", # class: 'gs' + Generic.Subheading: "bold #800080", # class: 'gu' + Generic.Traceback: "bold #a40000", # class: 'gt' + } diff --git a/externals/twilio-php/docs/_themes/kr/layout.html b/externals/twilio-php/docs/_themes/kr/layout.html new file mode 100755 index 0000000000..7dfedb125e --- /dev/null +++ b/externals/twilio-php/docs/_themes/kr/layout.html @@ -0,0 +1,32 @@ +{%- extends "basic/layout.html" %} +{%- block extrahead %} + {{ super() }} + {% if theme_touch_icon %} + + {% endif %} + +{% endblock %} +{%- block relbar2 %}{% endblock %} +{%- block footer %} + + + + Fork me on GitHub + + +{%- endblock %} diff --git a/externals/twilio-php/docs/_themes/kr/relations.html b/externals/twilio-php/docs/_themes/kr/relations.html new file mode 100755 index 0000000000..3bbcde85bb --- /dev/null +++ b/externals/twilio-php/docs/_themes/kr/relations.html @@ -0,0 +1,19 @@ +

Related Topics

+ diff --git a/externals/twilio-php/docs/_themes/kr/static/flasky.css_t b/externals/twilio-php/docs/_themes/kr/static/flasky.css_t new file mode 100755 index 0000000000..aa3e8ebbd9 --- /dev/null +++ b/externals/twilio-php/docs/_themes/kr/static/flasky.css_t @@ -0,0 +1,469 @@ +/* + * flasky.css_t + * ~~~~~~~~~~~~ + * + * :copyright: Copyright 2010 by Armin Ronacher. Modifications by Kenneth Reitz. + * :license: Flask Design License, see LICENSE for details. + */ + +{% set page_width = '940px' %} +{% set sidebar_width = '220px' %} + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro'; + font-size: 17px; + background-color: white; + color: #000; + margin: 0; + padding: 0; +} + +div.document { + width: {{ page_width }}; + margin: 30px auto 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 {{ sidebar_width }}; +} + +div.sphinxsidebar { + width: {{ sidebar_width }}; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #ffffff; + color: #3E4349; + padding: 0 30px 0 30px; +} + +img.floatingflask { + padding: 0 0 10px 10px; + float: right; +} + +div.footer { + width: {{ page_width }}; + margin: 20px auto 30px auto; + font-size: 14px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + +div.related { + display: none; +} + +div.sphinxsidebar a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #999; +} + +div.sphinxsidebar a:hover { + border-bottom: 1px solid #999; +} + +div.sphinxsidebar { + font-size: 14px; + line-height: 1.5; +} + +div.sphinxsidebarwrapper { + padding: 18px 10px; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0; + margin: -10px 0 0 -20px; + text-align: center; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: 'Garamond', 'Georgia', serif; + color: #444; + font-size: 24px; + font-weight: normal; + margin: 0 0 5px 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-size: 20px; +} + +div.sphinxsidebar h3 a { + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p { + color: #555; + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; + color: #000; +} + +div.sphinxsidebar input { + border: 1px solid #ccc; + font-family: 'Georgia', serif; + font-size: 1em; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Garamond', 'Georgia', serif; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #ddd; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #eaeaea; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + background: #fafafa; + margin: 20px -30px; + padding: 10px 30px; + border-top: 1px solid #ccc; + border-bottom: 1px solid #ccc; +} + +div.admonition tt.xref, div.admonition a tt { + border-bottom: 1px solid #fafafa; +} + +dd div.admonition { + margin-left: -60px; + padding-left: 60px; +} + +div.admonition p.admonition-title { + font-family: 'Garamond', 'Georgia', serif; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +div.highlight { + background-color: white; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt { + font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.9em; +} + +img.screenshot { +} + +tt.descname, tt.descclassname { + font-size: 0.95em; +} + +tt.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #eee; + -webkit-box-shadow: 2px 2px 4px #eee; + box-shadow: 2px 2px 4px #eee; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #eee; + -webkit-box-shadow: 2px 2px 4px #eee; + box-shadow: 2px 2px 4px #eee; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #eee; + background: #fdfdfd; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.footnote td.label { + width: 0px; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +dl { + margin: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + margin: 10px 0 10px 30px; + padding: 0; +} + +pre { + background: #eee; + padding: 7px 30px; + margin: 15px -30px; + line-height: 1.3em; +} + +dl pre, blockquote pre, li pre { + margin-left: -60px; + padding-left: 60px; +} + +dl dl pre { + margin-left: -90px; + padding-left: 90px; +} + +tt { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, a tt { + background-color: #FBFBFB; + border-bottom: 1px solid white; +} + +a.reference { + text-decoration: none; + border-bottom: 1px dotted #004B6B; +} + +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + +a.footnote-reference { + text-decoration: none; + font-size: 0.7em; + vertical-align: top; + border-bottom: 1px dotted #004B6B; +} + +a.footnote-reference:hover { + border-bottom: 1px solid #6D4100; +} + +a:hover tt { + background: #EEE; +} + + +@media screen and (max-width: 600px) { + + div.sphinxsidebar { + display: none; + } + + div.documentwrapper { + margin-left: 0; + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + } + + div.bodywrapper { + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + margin-left: 0; + } + + ul { + margin-left: 0; + } + + .document { + width: auto; + } + + .bodywrapper { + margin: 0; + } + + .footer { + width: auto; + } + + + +} + + +/* scrollbars */ + +::-webkit-scrollbar { + width: 6px; + height: 6px; +} + +::-webkit-scrollbar-button:start:decrement, +::-webkit-scrollbar-button:end:increment { + display: block; + height: 10px; +} + +::-webkit-scrollbar-button:vertical:increment { + background-color: #fff; +} + +::-webkit-scrollbar-track-piece { + background-color: #eee; + -webkit-border-radius: 3px; +} + +::-webkit-scrollbar-thumb:vertical { + height: 50px; + background-color: #ccc; + -webkit-border-radius: 3px; +} + +::-webkit-scrollbar-thumb:horizontal { + width: 50px; + background-color: #ccc; + -webkit-border-radius: 3px; +} + +/* misc. */ + +.revsys-inline { + display: none!important; +} \ No newline at end of file diff --git a/externals/twilio-php/docs/_themes/kr/static/small_flask.css b/externals/twilio-php/docs/_themes/kr/static/small_flask.css new file mode 100755 index 0000000000..1c6df309ed --- /dev/null +++ b/externals/twilio-php/docs/_themes/kr/static/small_flask.css @@ -0,0 +1,70 @@ +/* + * small_flask.css_t + * ~~~~~~~~~~~~~~~~~ + * + * :copyright: Copyright 2010 by Armin Ronacher. + * :license: Flask Design License, see LICENSE for details. + */ + +body { + margin: 0; + padding: 20px 30px; +} + +div.documentwrapper { + float: none; + background: white; +} + +div.sphinxsidebar { + display: block; + float: none; + width: 102.5%; + margin: 50px -30px -20px -30px; + padding: 10px 20px; + background: #333; + color: white; +} + +div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, +div.sphinxsidebar h3 a { + color: white; +} + +div.sphinxsidebar a { + color: #aaa; +} + +div.sphinxsidebar p.logo { + display: none; +} + +div.document { + width: 100%; + margin: 0; +} + +div.related { + display: block; + margin: 0; + padding: 10px 0 20px 0; +} + +div.related ul, +div.related ul li { + margin: 0; + padding: 0; +} + +div.footer { + display: none; +} + +div.bodywrapper { + margin: 0; +} + +div.body { + min-height: 0; + padding: 0; +} diff --git a/externals/twilio-php/docs/_themes/kr/theme.conf b/externals/twilio-php/docs/_themes/kr/theme.conf new file mode 100755 index 0000000000..307a1f0d65 --- /dev/null +++ b/externals/twilio-php/docs/_themes/kr/theme.conf @@ -0,0 +1,7 @@ +[theme] +inherit = basic +stylesheet = flasky.css +pygments_style = flask_theme_support.FlaskyStyle + +[options] +touch_icon = diff --git a/externals/twilio-php/docs/_themes/kr_small/layout.html b/externals/twilio-php/docs/_themes/kr_small/layout.html new file mode 100755 index 0000000000..aa1716aaff --- /dev/null +++ b/externals/twilio-php/docs/_themes/kr_small/layout.html @@ -0,0 +1,22 @@ +{% extends "basic/layout.html" %} +{% block header %} + {{ super() }} + {% if pagename == 'index' %} +
+ {% endif %} +{% endblock %} +{% block footer %} + {% if pagename == 'index' %} +
+ {% endif %} +{% endblock %} +{# do not display relbars #} +{% block relbar1 %}{% endblock %} +{% block relbar2 %} + {% if theme_github_fork %} + Fork me on GitHub + {% endif %} +{% endblock %} +{% block sidebar1 %}{% endblock %} +{% block sidebar2 %}{% endblock %} diff --git a/externals/twilio-php/docs/_themes/kr_small/static/flasky.css_t b/externals/twilio-php/docs/_themes/kr_small/static/flasky.css_t new file mode 100755 index 0000000000..fe2141c565 --- /dev/null +++ b/externals/twilio-php/docs/_themes/kr_small/static/flasky.css_t @@ -0,0 +1,287 @@ +/* + * flasky.css_t + * ~~~~~~~~~~~~ + * + * Sphinx stylesheet -- flasky theme based on nature theme. + * + * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: 'Georgia', serif; + font-size: 17px; + color: #000; + background: white; + margin: 0; + padding: 0; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 40px auto 0 auto; + width: 700px; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #ffffff; + color: #3E4349; + padding: 0 30px 30px 30px; +} + +img.floatingflask { + padding: 0 0 10px 10px; + float: right; +} + +div.footer { + text-align: right; + color: #888; + padding: 10px; + font-size: 14px; + width: 650px; + margin: 0 auto 40px auto; +} + +div.footer a { + color: #888; + text-decoration: underline; +} + +div.related { + line-height: 32px; + color: #888; +} + +div.related ul { + padding: 0 0 0 10px; +} + +div.related a { + color: #444; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body { + padding-bottom: 40px; /* saved for footer */ +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Garamond', 'Georgia', serif; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +{% if theme_index_logo %} +div.indexwrapper h1 { + text-indent: -999999px; + background: url({{ theme_index_logo }}) no-repeat center center; + height: {{ theme_index_logo_height }}; +} +{% endif %} + +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: white; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #eaeaea; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + background: #fafafa; + margin: 20px -30px; + padding: 10px 30px; + border-top: 1px solid #ccc; + border-bottom: 1px solid #ccc; +} + +div.admonition p.admonition-title { + font-family: 'Garamond', 'Georgia', serif; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +div.highlight{ + background-color: white; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt { + font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.85em; +} + +img.screenshot { +} + +tt.descname, tt.descclassname { + font-size: 0.95em; +} + +tt.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #eee; + -webkit-box-shadow: 2px 2px 4px #eee; + box-shadow: 2px 2px 4px #eee; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #eee; + -webkit-box-shadow: 2px 2px 4px #eee; + box-shadow: 2px 2px 4px #eee; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #eee; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.footnote td { + padding: 0.5em; +} + +dl { + margin: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +pre { + padding: 0; + margin: 15px -30px; + padding: 8px; + line-height: 1.3em; + padding: 7px 30px; + background: #eee; + border-radius: 2px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; +} + +dl pre { + margin-left: -60px; + padding-left: 60px; +} + +tt { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, a tt { + background-color: #FBFBFB; +} + +a:hover tt { + background: #EEE; +} diff --git a/externals/twilio-php/docs/_themes/kr_small/theme.conf b/externals/twilio-php/docs/_themes/kr_small/theme.conf new file mode 100755 index 0000000000..542b462515 --- /dev/null +++ b/externals/twilio-php/docs/_themes/kr_small/theme.conf @@ -0,0 +1,10 @@ +[theme] +inherit = basic +stylesheet = flasky.css +nosidebar = true +pygments_style = flask_theme_support.FlaskyStyle + +[options] +index_logo = '' +index_logo_height = 120px +github_fork = '' diff --git a/externals/twilio-php/docs/api/rest.rst b/externals/twilio-php/docs/api/rest.rst new file mode 100755 index 0000000000..172fa98991 --- /dev/null +++ b/externals/twilio-php/docs/api/rest.rst @@ -0,0 +1,872 @@ +.. _api-rest: + +############################### +Twilio Rest Resources +############################### + +************** +List Resources +************** + +.. phpautoclass:: Services_Twilio_ListResource + :filename: ../Services/Twilio/ListResource.php + :members: + +All of the below classes inherit from the :php:class:`ListResource +`. + +Accounts +=========== + +.. phpautoclass:: Services_Twilio_Rest_Accounts + :filename: ../Services/Twilio/Rest/Accounts.php + :members: + +AvailablePhoneNumbers +======================== + +.. php:class:: Services_Twilio_Rest_AvailablePhoneNumbers + + For more information, see the `AvailablePhoneNumbers API Resource `_ documentation at twilio.com. + + .. php:method:: getList($country, $type) + + Get a list of available phone numbers. + + :param string country: The 2-digit country code for numbers ('US', 'GB', + 'CA') + :param string type: The type of phone number ('TollFree' or 'Local') + :return: An instance of the :php:class:`Services_Twilio_Rest_AvailablePhoneNumbers` resource. + + .. php:attr:: available_phone_numbers + + A list of :php:class:`Services_Twilio_Rest_AvailablePhoneNumber` instances. + + .. php:attr:: uri + + The uri representing this resource, relative to https://api.twilio.com. + + +Calls +======= + +.. php:class:: Services_Twilio_Rest_Calls + + For more information, see the `Call List Resource `_ documentation. + + .. php:method:: create($from, $to, $url, params = array()) + + Make an outgoing call + + :param string $from: The phone number to use as the caller id. + :param string $to: The number to call formatted with a '+' and country code + :param string $url: The fully qualified URL that should be consulted when + the call connects. This value can also be an ApplicationSid. + :param array $params: An array of optional parameters for this call + + The **$params** array can contain the following keys: + + *Method* + The HTTP method Twilio should use when making its request to the above Url parameter's value. Defaults to POST. If an ApplicationSid parameter is present, this parameter is ignored. + + *FallbackUrl* + A URL that Twilio will request if an error occurs requesting or executing the TwiML at Url. If an ApplicationSid parameter is present, this parameter is ignored. + + *FallbackMethod* + The HTTP method that Twilio should use to request the FallbackUrl. Must be either GET or POST. Defaults to POST. If an ApplicationSid parameter is present, this parameter is ignored. + + *StatusCallback* + A URL that Twilio will request when the call ends to notify your app. If an ApplicationSid parameter is present, this parameter is ignored. + + *StatusCallbackMethod* + The HTTP method Twilio should use when requesting the above URL. Defaults to POST. If an ApplicationSid parameter is present, this parameter is ignored. + + *SendDigits* + A string of keys to dial after connecting to the number. Valid digits in the string include: any digit (0-9), '#' and '*'. For example, if you connected to a company phone number, and wanted to dial extension 1234 and then the pound key, use SendDigits=1234#. Remember to URL-encode this string, since the '#' character has special meaning in a URL. + + *IfMachine* + Tell Twilio to try and determine if a machine (like voicemail) or a human has answered the call. Possible values are Continue and Hangup. See the answering machines section below for more info. + + *Timeout* + The integer number of seconds that Twilio should allow the phone to ring before assuming there is no answer. Default is 60 seconds, the maximum is 999 seconds. Note, you could set this to a low value, such as 15, to hangup before reaching an answering machine or voicemail. + +CredentialListMappings +========================= + +.. phpautoclass:: Services_Twilio_Rest_CredentialListMappings + :filename: ../Services/Twilio/Rest/CredentialListMappings.php + :members: + + +CredentialLists +================= + +.. phpautoclass:: Services_Twilio_Rest_CredentialLists + :filename: ../Services/Twilio/Rest/CredentialLists.php + :members: + +Credentials +============== + +.. phpautoclass:: Services_Twilio_Rest_Credentials + :filename: ../Services/Twilio/Rest/Credentials.php + :members: + +Domains +========== + +.. phpautoclass:: Services_Twilio_Rest_Domains + :filename: ../Services/Twilio/Rest/Domains.php + :members: + + +IncomingPhoneNumbers +======================== + +.. phpautoclass:: Services_Twilio_Rest_IncomingPhoneNumbers,Services_Twilio_Rest_Local,Services_Twilio_Rest_Mobile,Services_Twilio_Rest_TollFree + :filename: ../Services/Twilio/Rest/IncomingPhoneNumbers.php + :members: + +IpAccessControlListMappings +============================== + +.. phpautoclass:: Services_Twilio_Rest_IpAccessControlListMappings + :filename: ../Services/Twilio/Rest/IpAccessControlListMappings.php + :members: + +IpAccessControlLists +======================= + +.. phpautoclass:: Services_Twilio_Rest_IpAccessControlLists + :filename: ../Services/Twilio/Rest/IpAccessControlLists.php + :members: + +IpAddresses +======================= + +.. phpautoclass:: Services_Twilio_Rest_IpAddresses + :filename: ../Services/Twilio/Rest/IpAddresses.php + :members: + +Media +====== + +.. phpautoclass:: Services_Twilio_Rest_Media + :filename: ../Services/Twilio/Rest/Media.php + :members: + +Members +=========== + +.. php:class:: Services_Twilio_Rest_Members + + For more information, including a list of filter parameters, see the `Member List Resource `_ documentation. + + .. php:method:: front() + + Return the :php:class:`Services_Twilio_Rest_Member` at the front of the + queue. + +Messages +======== + +.. phpautoclass:: Services_Twilio_Rest_Messages + :filename: ../Services/Twilio/Rest/Messages.php + :members: + +Queues +=========== + +.. php:class:: Services_Twilio_Rest_Queues + + For more information, including a list of filter parameters, see the + `Queues List Resource `_ + documentation. + + .. php:method:: create($friendly_name, $params = array()) + + Create a new :php:class:`Services_Twilio_Rest_Queue`. + + :param string $friendly_name: The name of the new Queue. + :param array $params: An array of optional parameters and their values, + like `MaxSize`. + :returns: A new :php:class:`Services_Twilio_Rest_Queue` + + +UsageRecords +============== + +.. php:class:: Services_Twilio_Rest_UsageRecords + + For more information, including a list of filter parameters, see the `UsageRecords List Resource `_ documentation. + + .. php:method:: getCategory($category) + + Return the single UsageRecord corresponding to this category of usage. + Valid only for the `Records`, `Today`, `Yesterday`, `ThisMonth`, + `LastMonth` and `AllTime` resources. + + :param string $category: The category to retrieve a usage record for. For a full list of valid categories, see the full `Usage Category documentation `_. + :returns: :php:class:`Services_Twilio_Rest_UsageRecord` A single usage record + +UsageTriggers +============= + +.. php:class:: Services_Twilio_Rest_UsageTriggers + + For more information, including a list of filter parameters, see the `UsageTriggers List Resource `_ documentation. + + .. php:method:: create($category, $value, $url, $params = array()) + + Create a new UsageTrigger. + + :param string $category: The category of usage to fire a trigger for. A full list of categories can be found in the `Usage Categories documentation `_. + :param string $value: Fire the trigger when usage crosses this value. + :param string $url: The URL to request when the trigger fires. + :param array $params: Optional parameters for this trigger. A full list of parameters can be found in the `Usage Trigger documentation `_. + :returns: :php:class:`Services_Twilio_Rest_UsageTrigger` The created trigger. + + +******************** +Instance Resources +******************** + +.. phpautoclass:: Services_Twilio_InstanceResource + :filename: ../Services/Twilio/InstanceResource.php + :members: + +Below you will find a list of objects created by interacting with the Twilio +API, and the methods and properties that can be called on them. These are +derived from the :php:class:`ListResource ` and +:php:class:`InstanceResource ` above. + + +Account +======== + +.. php:class:: Services_Twilio_Rest_Account + + For more information, see the `Account Instance Resource `_ documentation. + + .. php:method:: update($params) + + Update the account + + The **$params** array is the same as in :php:meth:`Services_Twilio_Rest_Accounts::create` + + .. php:attr:: sid + + A 34 character string that uniquely identifies this account. + + .. php:attr:: date_created + + The date that this account was created, in GMT in RFC 2822 format + + .. php:attr:: date_updated + + The date that this account was last updated, in GMT in RFC 2822 format. + + .. php:attr:: friendly_name + + A human readable description of this account, up to 64 characters long. By default the FriendlyName is your email address. + + .. php:attr:: status + + The status of this account. Usually active, but can be suspended if you've been bad, or closed if you've been horrible. + + .. php:attr:: auth_token + + The authorization token for this account. This token should be kept a secret, so no sharing. + +Application +=========== + +.. php:class:: Services_Twilio_Rest_Application + + For more information, see the `Application Instance Resource `_ documentation. + + .. php:attr:: sid + + A 34 character string that uniquely idetifies this resource. + + .. php:attr:: date_created + + The date that this resource was created, given as GMT RFC 2822 format. + + .. php:attr:: date_updated + + The date that this resource was last updated, given as GMT RFC 2822 format. + + .. php:attr:: friendly_name + + A human readable descriptive text for this resource, up to 64 characters long. By default, the FriendlyName is a nicely formatted version of the phone number. + + .. php:attr:: account_sid + + The unique id of the Account responsible for this phone number. + + .. php:attr:: api_version + + Calls to this phone number will start a new TwiML session with this API version. + + .. php:attr:: voice_caller_id_lookup + + Look up the caller's caller-ID name from the CNAM database (additional charges apply). Either true or false. + + .. php:attr:: voice_url + + The URL Twilio will request when this phone number receives a call. + + .. php:attr:: voice_method + + The HTTP method Twilio will use when requesting the above Url. Either GET or POST. + + .. php:attr:: voice_fallback_url + + The URL that Twilio will request if an error occurs retrieving or executing the TwiML requested by Url. + + .. php:attr:: voice_fallback_method + + The HTTP method Twilio will use when requesting the VoiceFallbackUrl. Either GET or POST. + + .. php:attr:: status_callback + + The URL that Twilio will request to pass status parameters (such as call ended) to your application. + + .. php:attr:: status_callback_method + + The HTTP method Twilio will use to make requests to the StatusCallback URL. Either GET or POST. + + .. php:attr:: sms_url + + The URL Twilio will request when receiving an incoming SMS message to this number. + + .. php:attr:: sms_method + + The HTTP method Twilio will use when making requests to the SmsUrl. Either GET or POST. + + .. php:attr:: sms_fallback_url + + The URL that Twilio will request if an error occurs retrieving or executing the TwiML from SmsUrl. + + .. php:attr:: sms_fallback_method + + The HTTP method Twilio will use when requesting the above URL. Either GET or POST. + + .. php:attr:: uri + + The URI for this resource, relative to https://api.twilio.com. + +AvailablePhoneNumber +======================== + +.. php:class:: Services_Twilio_Rest_AvailablePhoneNumber + + For more information, see the `AvailablePhoneNumber Instance Resource `_ documentation. + + .. php:attr:: friendly_name + + A nicely-formatted version of the phone number. + + .. php:attr:: phone_number + + The phone number, in E.164 (i.e. "+1") format. + + .. php:attr:: lata + + The LATA of this phone number. + + .. php:attr:: rate_center + + The rate center of this phone number. + + .. php:attr:: latitude + + The latitude coordinate of this phone number. + + .. php:attr:: longitude + + The longitude coordinate of this phone number. + + .. php:attr:: region + + The two-letter state or province abbreviation of this phone number. + + .. php:attr:: postal_code + + The postal (zip) code of this phone number. + + .. php:attr:: iso_country + +Call +==== + +.. phpautoclass:: Services_Twilio_Rest_Call + :filename: ../Services/Twilio/Rest/Call.php + :members: + +CallerId +============ + +.. php:class:: Services_Twilio_Rest_OutgoingCallerId + + For more information, see the `OutgoingCallerId Instance Resource `_ documentation. + + .. php:attr:: sid + + A 34 character string that uniquely identifies this resource. + + .. php:attr:: date_created + + The date that this resource was created, given in RFC 2822 format. + + .. php:attr:: date_updated + + The date that this resource was last updated, given in RFC 2822 format. + + .. php:attr:: friendly_name + + A human readable descriptive text for this resource, up to 64 characters long. By default, the FriendlyName is a nicely formatted version of the phone number. + + .. php:attr:: account_sid + + The unique id of the Account responsible for this Caller Id. + + .. php:attr:: phone_number + + The incoming phone number. Formatted with a '+' and country code e.g., +16175551212 (E.164 format). + + .. php:attr:: uri + + The URI for this resource, relative to https://api.twilio.com. + +Conference +============= + +.. php:class:: Services_Twilio_Rest_Conference + + For more information, see the `Conference Instance Resource `_ documentation. + + .. php:attr:: sid + + A 34 character string that uniquely identifies this conference. + + .. php:attr:: friendly_name + + A user provided string that identifies this conference room. + + .. php:attr:: status + + A string representing the status of the conference. May be init, in-progress, or completed. + + .. php:attr:: date_created + + The date that this conference was created, given as GMT in RFC 2822 format. + + .. php:attr:: date_updated + + The date that this conference was last updated, given as GMT in RFC 2822 format. + + .. php:attr:: account_sid + + The unique id of the Account responsible for creating this conference. + + .. php:attr:: uri + + The URI for this resource, relative to https://api.twilio.com. + + .. php:attr:: participants + + The :php:class:`Services_Twilio_Rest_Participants` instance, listing people currently in this conference + +CredentialListMapping +========================= + +.. phpautoclass:: Services_Twilio_Rest_CredentialListMapping + :filename: ../Services/Twilio/Rest/CredentialListMapping.php + :members: + + +CredentialList +================= + +.. phpautoclass:: Services_Twilio_Rest_CredentialList + :filename: ../Services/Twilio/Rest/CredentialList.php + :members: + +Credential +============== + +.. phpautoclass:: Services_Twilio_Rest_Credential + :filename: ../Services/Twilio/Rest/Credential.php + :members: + +Domain +========== + +.. phpautoclass:: Services_Twilio_Rest_Domain + :filename: ../Services/Twilio/Rest/Domain.php + :members: + +IncomingPhoneNumber +=================== + +.. phpautoclass:: Services_Twilio_Rest_IncomingPhoneNumber + :filename: ../Services/Twilio/Rest/IncomingPhoneNumber.php + :members: + +IpAccessControlListMapping +============================== + +.. phpautoclass:: Services_Twilio_Rest_IpAccessControlListMapping + :filename: ../Services/Twilio/Rest/IpAccessControlListMapping.php + :members: + +IpAccessControlList +======================= + +.. phpautoclass:: Services_Twilio_Rest_IpAccessControlList + :filename: ../Services/Twilio/Rest/IpAccessControlList.php + :members: + +IpAddress +============== +.. phpautoclass:: Services_Twilio_Rest_IpAddress + :filename: ../Services/Twilio/Rest/IpAddress.php + :members: + + +Notification +============= + +.. php:class:: Services_Twilio_Rest_Notification + + For more information, see the `Notification Instance Resource `_ documentation. + + .. php:attr:: sid + + A 34 character string that uniquely identifies this resource. + + .. php:attr:: date_created + + The date that this resource was created, given in RFC 2822 format. + + .. php:attr:: date_updated + + The date that this resource was last updated, given in RFC 2822 format. + + .. php:attr:: account_sid + + The unique id of the Account responsible for this notification. + + .. php:attr:: call_sid + + CallSid is the unique id of the call during which the notification was generated. Empty if the notification was generated by the REST API without regard to a specific phone call. + + .. php:attr:: api_version + + The version of the Twilio in use when this notification was generated. + + .. php:attr:: log + + An integer log level corresponding to the type of notification: 0 is ERROR, 1 is WARNING. + + .. php:attr:: error_code + + A unique error code for the error condition. You can lookup errors, with possible causes and solutions, in our `Error Dictionary `_. + + .. php:attr:: more_info + + A URL for more information about the error condition. The URL is a page in our `Error Dictionary `_. + + .. php:attr:: message_text + + The text of the notification. + + .. php:attr:: message_date + + The date the notification was actually generated, given in RFC 2822 + format. Due to buffering, this may be slightly different than the + DateCreated date. + + .. php:attr:: request_url + + The URL of the resource that generated the notification. If the + notification was generated during a phone call: This is the URL of the + resource on YOUR SERVER that caused the notification. If the notification + was generated by your use of the REST API: This is the URL of the REST + resource you were attempting to request on Twilio's servers. + + .. php:attr:: request_method + + The HTTP method in use for the request that generated the notification. If + the notification was generated during a phone call: The HTTP Method use to + request the resource on your server. If the notification was generated by + your use of the REST API: This is the HTTP method used in your request to + the REST resource on Twilio's servers. + + .. php:attr:: request_variables + + The Twilio-generated HTTP GET or POST variables sent to your server. Alternatively, if the notification was generated by the REST API, this field will include any HTTP POST or PUT variables you sent to the REST API. + + .. php:attr:: response_headers + + The HTTP headers returned by your server. + + .. php:attr:: response_body + + The HTTP body returned by your server. + + .. php:attr:: uri + + The URI for this resource, relative to https://api.twilio.com + +Media +======= + +.. phpautoclass:: Services_Twilio_Rest_MediaInstance + :filename: ../Services/Twilio/Rest/MediaInstance.php + :members: + +Member +======= + +.. php:class:: Services_Twilio_Rest_Member + + For more information about available properties, see the `Member Instance Resource `_ documentation. + + .. php:method:: dequeue($url, $method = 'POST') + + Dequeue this member and immediately play the Twiml at the given ``$url``. + + :param string $url: The Twiml URL to play for this member, after dequeuing them + :param string $method: The HTTP method to use when fetching the Twiml URL. Defaults to POST. + :return: The dequeued member + :rtype: :php:class:`Member ` + + +Participant +============= + +.. php:class:: Services_Twilio_Rest_Participant + + For more information, see the `Participant Instance Resource `_ documentation. + + .. php:attr:: call_sid + + A 34 character string that uniquely identifies the call that is connected to this conference + + .. php:attr:: conference_sid + + A 34 character string that identifies the conference this participant is in + + .. php:attr:: date_created + + The date that this resource was created, given in RFC 2822 format. + + .. php:attr:: date_updated + + The date that this resource was last updated, given in RFC 2822 format. + + .. php:attr:: account_sid + + The unique id of the Account that created this conference + + .. php:attr:: muted + + true if this participant is currently muted. false otherwise. + + .. php:attr:: start_conference_on_enter + + Was the startConferenceOnEnter attribute set on this participant (true or false)? + + .. php:attr:: end_conference_on_exit + + Was the endConferenceOnExit attribute set on this participant (true or false)? + + .. php:attr:: uri + + The URI for this resource, relative to https://api.twilio.com. + +Queue +============ + +.. php:class:: Services_Twilio_Rest_Queue + + For more information about available properties of a queue, see the `Queue + Instance Resource `_ + documentation. A Queue has one subresource, a list of + :php:class:`Services_Twilio_Rest_Members`. + +Recording +============= + +.. php:class:: Services_Twilio_Rest_Recording + + For more information, see the `Recording Instance Resource `_ documentation. + + .. php:attr:: sid + + A 34 character string that uniquely identifies this resource. + + .. php:attr:: date_created + + The date that this resource was created, given in RFC 2822 format. + + .. php:attr:: date_updated + + The date that this resource was last updated, given in RFC 2822 format. + + .. php:attr:: account_sid + + The unique id of the Account responsible for this recording. + + .. php:attr:: call_sid + + The call during which the recording was made. + + .. php:attr:: duration + + The length of the recording, in seconds. + + .. php:attr:: api_version + + The version of the API in use during the recording. + + .. php:attr:: uri + + The URI for this resource, relative to https://api.twilio.com + + .. php:attr:: subresource_uris + + The list of subresources under this account + + .. php:attr:: formats + + A dictionary of the audio formats available for this recording + + .. code-block:: php + + array( + 'wav' => 'https://api.twilio.com/path/to/recording.wav', + 'mp3' => 'https://api.twilio.com/path/to/recording.mp3', + ) + +Message +======= + +.. phpautoclass:: Services_Twilio_Rest_Message + :filename: ../Services/Twilio/Rest/Message.php + :members: + +SmsMessage +=========== + +.. php:class:: Services_Twilio_Rest_SmsMessage + + For more information, see the `SMS Message Instance Resource `_ documentation. + + .. php:attr:: sid + + A 34 character string that uniquely identifies this resource. + + .. php:attr:: date_created + + The date that this resource was created, given in RFC 2822 format. + + .. php:attr:: date_updated + + The date that this resource was last updated, given in RFC 2822 format. + + .. php:attr:: date_sent + + The date that the SMS was sent, given in RFC 2822 format. + + .. php:attr:: account_sid + + The unique id of the Account that sent this SMS message. + + .. php:attr:: from + + The phone number that initiated the message in E.164 format. For incoming messages, this will be the remote phone. For outgoing messages, this will be one of your Twilio phone numbers. + + .. php:attr:: to + + The phone number that received the message in E.164 format. For incoming messages, this will be one of your Twilio phone numbers. For outgoing messages, this will be the remote phone. + + .. php:attr:: body + + The text body of the SMS message. Up to 160 characters long. + + .. php:attr:: status + + The status of this SMS message. Either queued, sending, sent, or failed. + + .. php:attr:: direction + + The direction of this SMS message. ``incoming`` for incoming messages, + ``outbound-api`` for messages initiated via the REST API, ``outbound-call`` for + messages initiated during a call or ``outbound-reply`` for messages initiated in + response to an incoming SMS. + + .. php:attr:: price + + The amount billed for the message. + + .. php:attr:: api_version + + The version of the Twilio API used to process the SMS message. + + .. php:attr:: uri + + The URI for this resource, relative to https://api.twilio.com + + +Transcription +================== + +.. php:class:: Services_Twilio_Rest_Transcription + + For more information, see the `Transcription Instance Resource `_ documentation. + + .. php:attr:: sid + + A 34 character string that uniquely identifies this resource. + + .. php:attr:: date_created + + The date that this resource was created, given in RFC 2822 format. + + .. php:attr:: date_updated + + The date that this resource was last updated, given in RFC 2822 format. + + .. php:attr:: account_sid + + The unique id of the Account responsible for this transcription. + + .. php:attr:: status + + A string representing the status of the transcription: ``in-progress``, ``completed`` or ``failed``. + + .. php:attr:: recording_sid + + The unique id of the Recording this Transcription was made of. + + .. php:attr:: duration + + The duration of the transcribed audio, in seconds. + + .. php:attr:: transcription_text + + The text content of the transcription. + + .. php:attr:: price + + The charge for this transcript in USD. Populated after the transcript is completed. Note, this value may not be immediately available. + + .. php:attr:: uri + + The URI for this resource, relative to https://api.twilio.com + + diff --git a/externals/twilio-php/docs/api/services.rst b/externals/twilio-php/docs/api/services.rst new file mode 100755 index 0000000000..a69f212e9e --- /dev/null +++ b/externals/twilio-php/docs/api/services.rst @@ -0,0 +1,26 @@ +############################### +HTTP Helper Classes +############################### + +********************** +The Twilio Rest Client +********************** + +.. phpautoclass:: Services_Twilio + :filename: ../Services/Twilio.php + :members: + +*************************** +Twilio's Custom HTTP Client +*************************** + +.. phpautoclass:: Services_Twilio_TinyHttp + :filename: ../Services/Twilio/TinyHttp.php + :members: + +*********************** +Twilio Rest Exceptions +*********************** +.. phpautoclass:: Services_Twilio_RestException + :filename: ../Services/Twilio/RestException.php + :members: diff --git a/externals/twilio-php/docs/api/twiml.rst b/externals/twilio-php/docs/api/twiml.rst new file mode 100755 index 0000000000..de9f4c4a77 --- /dev/null +++ b/externals/twilio-php/docs/api/twiml.rst @@ -0,0 +1,7 @@ +########################################### +API for TwiML Generation +########################################### + +.. phpautoclass:: Services_Twilio_Twiml + :filename: ../Services/Twilio/Twiml.php + :members: diff --git a/externals/twilio-php/docs/conf.py b/externals/twilio-php/docs/conf.py new file mode 100755 index 0000000000..94fff84498 --- /dev/null +++ b/externals/twilio-php/docs/conf.py @@ -0,0 +1,226 @@ +# -*- coding: utf-8 -*- +# +# Services_Twilio documentation build configuration file, created by +# sphinx-quickstart on Tue Mar 8 04:02:01 2011. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os +from datetime import datetime + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinxcontrib.phpdomain', 'sphinxcontrib_phpautodoc'] + +primary_domain = 'php' + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'Services_Twilio' +copyright = unicode(datetime.utcnow().year) + u', Twilio Inc' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '3.12' +# The full version, including alpha/beta/rc tags. +release = '3.12.4' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- +sys.path.append(os.path.abspath('_themes')) +html_theme_path = ['_themes'] +html_theme = 'kr' + +from sphinx.highlighting import lexers +from pygments.lexers.web import PhpLexer +lexers['php'] = PhpLexer(startinline=True) + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +#html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'Services_Twiliodoc' + + +# -- Options for LaTeX output -------------------------------------------------- + +# The paper size ('letter' or 'a4'). +#latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +#latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'Services_Twilio.tex', u'Services\\_Twilio Documentation', + u'Neuman Vong', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Additional stuff for the LaTeX preamble. +#latex_preamble = '' + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'services_twilio', u'Services_Twilio Documentation', + [u'Neuman Vong'], 1) +] diff --git a/externals/twilio-php/docs/faq.rst b/externals/twilio-php/docs/faq.rst new file mode 100755 index 0000000000..b9b2e08088 --- /dev/null +++ b/externals/twilio-php/docs/faq.rst @@ -0,0 +1,176 @@ +========================== +Frequently Asked Questions +========================== + +Hopefully you can find an answer here to one of your questions. If not, please +contact `help@twilio.com `_. + +Debugging Requests +------------------ + +Sometimes the library generates unexpected output. The simplest way to debug is +to examine the HTTP request that twilio-php actually sent over the wire. You +can turn on debugging with a simple flag: + +.. code-block:: php + + require('Services/Twilio.php'); + + $client = new Services_Twilio('AC123', '456bef'); + $client->http->debug = true; + +Then make requests as you normally would. The URI, method, headers, and body +of HTTP requests will be logged via the ``error_log`` function. + + +require: Failed to open stream messages +----------------------------------------- + +If you are trying to use the helper library and you get an error message that +looks like this: + +.. code-block:: php + + PHP Warning: require(Services/Twilio.php): failed to open stream: No such + file or directory in /path/to/file + + Fatal error: require(): Failed opening required 'Services/Twilio.php' + (include_path='.:/usr/lib/php:/usr/local/php-5.3.8/lib/php') in + /Library/Python/2.6/site-packages/phpsh/phpsh.php(578): on line 1 + +Your PHP file can't find the Twilio library. The easiest way to do this is to +move the Services folder from the twilio-php library into the folder containing +your file. So if you have a file called ``send-sms.php``, your folder structure +should look like this: + +.. code-block:: bash + + . + ├── send-sms.php + ├── Services + │   ├── Twilio.php + │   ├── Twilio + │   │   ├── ArrayDataProxy.php + │   │   ├── (..about 50 other files...) + +If you need to copy all of these files to your web hosting server, the easiest +way is to compress them into a ZIP file, copy that to your server with FTP, and +then unzip it back into a folder in your CPanel or similar. + +You can also try changing the ``require`` line like this: + +.. code-block:: php + + require('/path/to/twilio-php/Services/Twilio.php'); + +You could also try downloading the library via PEAR, a package manager for PHP, +which will add the library to your PHP path, so you can load the Twilio library +from anywhere. Run this at the command line: + +.. code-block:: bash + + $ pear channel-discover twilio.github.com/pear + $ pear install twilio/Services_Twilio + +If you get the following message: + +.. code-block:: bash + + $ -bash: pear: command not found + +you can install PEAR from their website. + +SSL Validation Exceptions +------------------------- + +If you are using an outdated version of `libcurl`, you may encounter +SSL validation exceptions. If you see the following error message, you have +a SSL validation exception: :: + + Fatal error: Uncaught exception 'Services_Twilio_TinyHttpException' + with message 'SSL certificate problem, verify that the CA cert is OK. + + Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate + verify failed' in [MY PATH]\Services\Twilio\TinyHttp.php:89 + +This means that Twilio is trying to offer a certificate to verify that you are +actually connecting to `https://api.twilio.com `_, but +your curl client cannot verify our certificate. + +There are four solutions to this problem: + +Upgrade your version of the twilio-php library +============================================== + +Since November 2011, the SSL certificate has been built in to the helper +library, and it is used to sign requests made to our API. If you are still +encountering this problem, you can upgrade your helper library to the latest +version, and you should not encounter this error anymore. + +If you are using an older version of the helper library, you can try one of the +following three methods: + +Upgrade your version of libcurl +=============================== + +The Twilio certificate is included in the latest version of the +``libcurl`` library. Upgrading your system version of ``libcurl`` will +resolve the SSL error. `Click here to download the latest version of +libcurl `_. + +Manually add Twilio's SSL certificate +===================================== + +The PHP curl library can also manually verify an SSL certificate. In your +browser, navigate to +`https://github.com/twilio/twilio-php/blob/master/Services/cacert.pem +`_ +and download the file. (**Note**: If your browser presents ANY warnings +at this time, your Internet connection may be compromised. Do not download the +file, and do not proceed with this step). Place this file in the same folder as +your PHP script. Then, replace this line in your script: + +.. code-block:: php + + $client = new Services_Twilio($sid, $token); + +with this one: + +.. code-block:: php + + $http = new Services_Twilio_TinyHttp( + 'https://api.twilio.com', + array('curlopts' => array( + CURLOPT_SSL_VERIFYPEER => true, + CURLOPT_SSL_VERIFYHOST => 2, + CURLOPT_CAINFO => getcwd() . "/cacert.pem"))); + + $client = new Services_Twilio($sid, $token, "2010-04-01", $http); + +Disable certificate checking +============================ + +A final option is to disable checking the certificate. Disabling the +certificate check means that a malicious third party can pretend to be +Twilio, intercept your data, and gain access to your Account SID and +Auth Token in the process. Because this is a security vulnerability, +we **strongly discourage** you from disabling certificate checking in +a production environment. This is known as a `man-in-the-middle attack +`_. + +If you still want to proceed, here is code that will disable certificate +checking: + +.. code-block:: php + + $http = new Services_Twilio_TinyHttp( + 'https://api.twilio.com', + array('curlopts' => array(CURLOPT_SSL_VERIFYPEER => false)) + ); + + $client = new Services_Twilio('AC123', 'token', '2010-04-01', $http); + +If this does not work, double check your Account SID, token, and that you do +not have errors anywhere else in your code. If you need further assistance, +please email our customer support at `help@twilio.com`_. + diff --git a/externals/twilio-php/docs/index.rst b/externals/twilio-php/docs/index.rst new file mode 100755 index 0000000000..ae990fb181 --- /dev/null +++ b/externals/twilio-php/docs/index.rst @@ -0,0 +1,188 @@ +.. Services_Twilio documentation master file, created by + sphinx-quickstart on Tue Mar 8 04:02:01 2011. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +================= +**twilio-php** +================= + +Status +======= + +This documentation is for version 3.12.2 of `twilio-php +`_. + +Quickstart +============ + +Send an SMS +>>>>>>>>>>> + +.. code-block:: php + + // Download the library and copy into the folder containing this file. + require('/path/to/twilio-php/Services/Twilio.php'); + + $account_sid = "ACXXXXXX"; // Your Twilio account sid + $auth_token = "YYYYYY"; // Your Twilio auth token + + $client = new Services_Twilio($account_sid, $auth_token); + $message = $client->account->messages->sendMessage( + '+14085551234', // From a Twilio number in your account + '+12125551234', // Text any number + "Hello monkey!" + ); + + print $message->sid; + +Make a Call +>>>>>>>>>>>>>> + +.. code-block:: php + + // Download the library and copy into the folder containing this file. + require('/path/to/twilio-php/Services/Twilio.php'); + + $account_sid = "ACXXXXXX"; // Your Twilio account sid + $auth_token = "YYYYYY"; // Your Twilio auth token + + $client = new Services_Twilio($account_sid, $auth_token); + $call = $client->account->calls->create( + '+14085551234', // From a Twilio number in your account + '+12125551234', // Call any number + + // Read TwiML at this URL when a call connects (hold music) + 'http://twimlets.com/holdmusic?Bucket=com.twilio.music.ambient' + ); + +Generating TwiML +>>>>>>>>>>>>>>>> + +To control phone calls, your application needs to output `TwiML +`_. Use :class:`Services_Twilio_Twiml` +to easily create such responses. + +.. code-block:: php + + $response = new Services_Twilio_Twiml(); + $response->say('Hello'); + $response->play('https://api.twilio.com/cowbell.mp3', array("loop" => 5)); + print $response; + +.. code-block:: xml + + + + Hello + https://api.twilio.com/cowbell.mp3 + + +View more examples of TwiML generation here: :ref:`usage-twiml` + +Installation +============ + +There are two ways to install **twilio-php**: via the PEAR installer, or by +downloading the source. + +Via PEAR +>>>>>>>>>>>>> + +Use the ``Makefile`` in the repo's top + +.. code-block:: bash + + pear channel-discover twilio.github.com/pear + pear install twilio/Services_Twilio + +From Source +>>>>>>>>>>>>> + +If you aren't using PEAR, download the `source (.zip) +`_, which includes all the +dependencies. + +User Guide +================== + +REST API +>>>>>>>>>> + +.. toctree:: + :maxdepth: 2 + :glob: + + usage/rest + usage/rest/* + +TwiML and other utilities +>>>>>>>>>>>>>>>>>>>>>>>>>> + +.. toctree:: + :maxdepth: 1 + + usage/twiml + usage/validation + usage/token-generation + faq/ + +API Documentation +================== + +.. toctree:: + :maxdepth: 3 + :glob: + + api/* + + +Support and Development +=========================== + +All development occurs on `Github `_. To +check out the source, run + +.. code-block:: bash + + git clone git@github.com:twilio/twilio-php.git + +Report bugs using the Github `issue tracker `_. + +If you've got questions that aren't answered by this documentation, ask the +Twilio support team at help@twilio.com. + +Running the Tests +>>>>>>>>>>>>>>>>>>>>>>>>> + +The unit tests depend on `Mockery `_ and +`PHPUnit `_. First, 'discover' all +the necessary `PEAR` channels: + +.. code-block:: bash + + make test-install + +After installation, run the tests with :data:`make`. + +.. code-block:: bash + + make test + + +Making the Documentation +>>>>>>>>>>>>>>>>>>>>>>>>>> + +Our documentation is written using `Sphinx `_. You'll +need to install Sphinx and the Sphinx PHP domain before you can build the docs. + +.. code-block:: bash + + make docs-install + +Once you have those installed, making the docs is easy. + +.. code-block:: bash + + make docs + diff --git a/externals/twilio-php/docs/quickstart.rst b/externals/twilio-php/docs/quickstart.rst new file mode 100755 index 0000000000..f8441c3a81 --- /dev/null +++ b/externals/twilio-php/docs/quickstart.rst @@ -0,0 +1,34 @@ +============= +Quickstart +============= + +Making a Call +============== + +.. code-block:: php + + $sid = "ACXXXXXX"; // Your Twilio account sid + $token = "YYYYYY"; // Your Twilio auth token + + $client = new Services_Twilio($sid, $token); + $call = $client->account->calls->create( + '9991231234', // From this number + '8881231234', // Call this number + 'http://foo.com/call.xml' + ); + +Generating TwiML +================== + +To control phone calls, your application need to output TwiML. Use :class:`Services_Twilio_Twiml` to easily create such responses. + +.. code-block:: php + + $response = new Services_Twilio_Twiml(); + $response->say('Hello'); + print $response; + +.. code-block:: xml + + + monkey.mp3 diff --git a/externals/twilio-php/docs/requirements.txt b/externals/twilio-php/docs/requirements.txt new file mode 100755 index 0000000000..8c327a5f9c --- /dev/null +++ b/externals/twilio-php/docs/requirements.txt @@ -0,0 +1,3 @@ +sphinxcontrib-phpdomain +hg+https://bitbucket.org/tk0miya/tk.phpautodoc + diff --git a/externals/twilio-php/docs/usage/rest.rst b/externals/twilio-php/docs/usage/rest.rst new file mode 100755 index 0000000000..e6edade5b0 --- /dev/null +++ b/externals/twilio-php/docs/usage/rest.rst @@ -0,0 +1,98 @@ +.. _ref-rest: + +========================== +Using the Twilio REST API +========================== + +Since version 3.0, we've introduced an updated API for interacting with the +Twilio REST API. Gone are the days of manual URL creation and XML parsing. + +Creating a REST Client +======================= + +Before querying the API, you'll need to create a :php:class:`Services_Twilio` +instance. The constructor takes your Twilio Account Sid and Auth +Token (both available through your `Twilio Account Dashboard +`_). + +.. code-block:: php + + $ACCOUNT_SID = "AC123"; + $AUTH_TOKEN = "secret"; + $client = new Services_Twilio($ACCOUNT_SID, $AUTH_TOKEN); + +The :attr:`account` attribute +----------------------------- + +You access the Twilio API resources through this :attr:`$client`, +specifically the :attr:`$account` attribute, which is an instance of +:php:class:`Services_Twilio_Rest_Account`. We'll use the `Calls resource +`_ as an example. + +Listing Resources +==================== + +Iterating over the :attr:`calls` attribute will iterate over all of your call +records, handling paging for you. Only use this when you need to get all your +records. + +The :attr:`$call` object is a :php:class:`Services_Twilio_Rest_Call`, which +means you can easily access fields through it's properties. The attribute names +are lowercase and use underscores for sepearators. All the available attributes +are documented in the :doc:`/api/rest` documentation. + +.. code-block:: php + + // If you have many calls, this could take a while + foreach($client->account->calls as $call) { + print $call->price . '\n'; + print $call->duration . '\n'; + } + +Filtering Resources +------------------- + +Many Twilio list resources allow for filtering via :php:meth:`getIterator` +which takes an optional array of filter parameters. These parameters correspond +directlty to the listed query string parameters in the REST API documentation. + +You can create a filtered iterator like this: + +.. code-block:: php + + $filteredCalls = $client->account->calls->getIterator( + 0, 50, array("Status" => "in-progress")); + foreach($filteredCalls as $call) { + print $call->price . '\n'; + print $call->duration . '\n'; + } + +Retrieving the Total Number of Resources +---------------------------------------- + +Each of the list resources supports the `Countable` interface, which means you +can retrieve the total number of list items like so: + +.. code-block:: php + + echo count($client->account->calls); + +Getting a Specific Resource +============================= + +If you know the unique identifier for a resource, you can get that resource +using the :php:meth:`get` method on the list resource. + +.. code-block:: php + + $call = $client->account->calls->get("CA123"); + +:php:meth:`get` fetches objects lazily, so it will only load a resource when it +is needed. This allows you to get nested objects without making multiple HTTP +requests. + +.. code-block:: php + + $participant = $client->account->conferences + ->get("CO123")->participants->get("PF123"); + diff --git a/externals/twilio-php/docs/usage/rest/accounts.rst b/externals/twilio-php/docs/usage/rest/accounts.rst new file mode 100755 index 0000000000..de9bbe7028 --- /dev/null +++ b/externals/twilio-php/docs/usage/rest/accounts.rst @@ -0,0 +1,24 @@ +================== +Accounts +================== + +Updating Account Information +============================== + +Updating :class:`Account ` information is really easy: + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + $account = $client->account; + $account->update(array('FriendlyName' => 'My Awesome Account')); + +Creating a Subaccount +============================== + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + $subaccount = $client->accounts->create(array( + 'FriendlyName' => 'My Awesome SubAccount' + )); diff --git a/externals/twilio-php/docs/usage/rest/applications.rst b/externals/twilio-php/docs/usage/rest/applications.rst new file mode 100755 index 0000000000..337cbbabfb --- /dev/null +++ b/externals/twilio-php/docs/usage/rest/applications.rst @@ -0,0 +1,50 @@ +================== +Applications +================== + +Creating Applications +============================== + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + $application = $client->account->applications->create('Application Friendly Name', + array( + 'FriendlyName' => 'My Application Name', + 'VoiceUrl' => 'http://foo.com/voice/url', + 'VoiceFallbackUrl' => 'http://foo.com/voice/fallback/url', + 'VoiceMethod' => 'POST', + 'SmsUrl' => 'http://foo.com/sms/url', + 'SmsFallbackUrl' => 'http://foo.com/sms/fallback/url', + 'SmsMethod' => 'POST' + ) + ); + + +Updating An Application +============================== + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + $application = $client->account->applications->get('AP123'); + $application->update(array( + 'VoiceUrl' => 'http://foo.com/new/voice/url' + )); + + +Finding an Application by Name +============================== + +Find an :class:`Application` by its name (full name match). + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + $application = false; + $params = array( + 'FriendlyName' => 'My Application Name' + ); + foreach($client->account->applications->getIterator(0, 1, $params) as $_application) { + $application = $_application; + } \ No newline at end of file diff --git a/externals/twilio-php/docs/usage/rest/callerids.rst b/externals/twilio-php/docs/usage/rest/callerids.rst new file mode 100755 index 0000000000..40841be54f --- /dev/null +++ b/externals/twilio-php/docs/usage/rest/callerids.rst @@ -0,0 +1,27 @@ +============ + Caller Ids +============ + +Validate a Phone Number +======================= +Adding a new phone number to your validated numbers is quick and easy: + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + $response = $client->account->outgoing_caller_ids->create('+15554441234'); + print $response->validation_code; + +Twilio will call the provided number and for the validation code to be entered. + +Listing all Validated Phone Numbers +=================================== + +Show all the current caller_ids: + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + foreach ($client->account->outgoing_caller_ids as $caller_id) { + print $caller_id->friendly_name; + } diff --git a/externals/twilio-php/docs/usage/rest/calls.rst b/externals/twilio-php/docs/usage/rest/calls.rst new file mode 100755 index 0000000000..dcde3d61c1 --- /dev/null +++ b/externals/twilio-php/docs/usage/rest/calls.rst @@ -0,0 +1,141 @@ +============= + Phone Calls +============= + +Making a Phone Call +=================== + +The :class:`Calls` resource allows you to make outgoing calls: + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + $call = $client->account->calls->create( + '9991231234', // From this number + '8881231234', // Call this number + 'http://foo.com/call.xml' + ); + print $call->length; + print $call->sid; + +Adding Extra Call Parameters +============================ + +Add extra parameters, like a `StatusCallback` when the call ends, like this: + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + $call = $client->account->calls->create( + '9991231234', // From this number + '8881231234', // Call this number + 'http://foo.com/call.xml', + array( + 'StatusCallback' => 'http://foo.com/callback', + 'StatusCallbackMethod' => 'GET' + ) + ); + +A full list of extra parameters can be found `here +`_. + +Listing Calls +============= + +It's easy to iterate over your list of calls. + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + foreach ($client->account->calls as $call) { + echo "From: {$call->from}\nTo: {$call->to}\nSid: {$call->sid}\n\n"; + } + +Filtering Calls +====================== + +Let's say you want to find all of the calls that have been sent from +a particular number. You can do so by constructing an iterator explicitly: + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + foreach ($client->account->calls->getIterator(0, 50, array( + 'From' => '+14105551234' + )) as $call) { + echo "From: {$call->from}\nTo: {$call->to}\nSid: {$call->sid}\n\n"; + } + +Accessing Resources from a Specific Call +======================================== + +The :class:`Call` resource has some subresources you can access, such as +notifications and recordings. If you have already have a :class:`Call` +resource, they are easy to get: + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + foreach ($client->account->calls as $call) { + $notifications = $call->notifications; + if (is_array($notifications)) { + foreach ($notifications as $notification) { + print $notification->sid; + } + } + + $transcriptions = $call->transcriptions; + if (is_array($transcriptions)) { + foreach ($transcriptions as $transcription) { + print $transcription->sid; + } + } + + $recordings = $call->recordings; + if (is_array($recordings)) { + foreach ($recordings as $recording) { + print $recording->sid; + } + } + } + +Be careful, as the above code makes quite a few HTTP requests and may display +PHP warnings for unintialized variables. + +Retrieve a Call Record +====================== + +If you already have a :class:`Call` sid, you can use the client to retrieve +that record.: + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + $sid = "CA12341234" + $call = $client->account->calls->get($sid) + +Modifying live calls +==================== + +The :class:`Call` resource makes it easy to find current live calls and +redirect them as necessary: + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + $calls = $client->account->calls->getIterator(0, 50, array('Status' => 'in-progress')); + foreach ($calls as $call) { + $call->update(array('Url' => 'http://foo.com/new.xml', 'Method' => 'POST')); + } + +Ending all live calls is also possible: + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + $calls = $client->account->calls->getIterator(0, 50, array('Status' => 'in-progress')); + foreach ($calls as $call) { + $call->hangup(); + } + +Note that :meth:`hangup` will also cancel calls currently queued. diff --git a/externals/twilio-php/docs/usage/rest/conferences.rst b/externals/twilio-php/docs/usage/rest/conferences.rst new file mode 100755 index 0000000000..a47d7dde95 --- /dev/null +++ b/externals/twilio-php/docs/usage/rest/conferences.rst @@ -0,0 +1,48 @@ +============= + Conferences +============= + +List All Conferences +==================== + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + foreach ($client->account->conferences as $conference) { + print $conference->friendly_name; + } + +For a full list of properties available on a conference, as well as a full list +of ways to filter a conference, please see the `Conference API Documentation +`_ on our website. + +Filter Conferences by Status +============================ + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + foreach ($client->account->conferences->getIterator(0, 50, array( + 'Status' => 'in-progress' + )) as $conf) { + print $conf->sid; + } + +Mute all participants +===================== + +At the moment, using an iterator directly will cause this method to infinitely +loop. Instead, use the getPage function. As conferences are limited to 40 +participants, getPage(0, 50) should return a list of every participant in +a conference. + +.. code-block:: php + + $sid = "CO119231312"; + $client = new Services_Twilio('AC123', '123'); + $conference = $client->account->conferences->get($sid); + $page = $conference->participants->getPage(0, 50); + $participants = $page->participants; + foreach ($participants as $p) { + $p->mute(); + } diff --git a/externals/twilio-php/docs/usage/rest/members.rst b/externals/twilio-php/docs/usage/rest/members.rst new file mode 100755 index 0000000000..464fda19c6 --- /dev/null +++ b/externals/twilio-php/docs/usage/rest/members.rst @@ -0,0 +1,46 @@ +============= +Members +============= + +List All Members in a Queue +============================ + +Each queue instance resource has a list of members. + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + $queue_sid = 'QQ123'; + $queue = $client->account->queues->get('QQ123'); + foreach ($queue->members as $member) { + echo "Call Sid: {$member->call_sid}\nWait Time: {$member->wait_time}\n"; + } + +Dequeue a Member +================= + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + $queue = $client->account->queues->get('QQ123'); + foreach ($queue->members as $member) { + // Dequeue the first member and fetch the Forward twimlet for that + // member. + $member->dequeue('http://twimlets.com/forward', 'GET'); + break; + } + +Retrieve the Member at the Front of a Queue +=========================================== + +The Members class has a method called ``front`` which can be used to retrieve +the member at the front of the queue. + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + $queue = $client->account->queues->get('QQ123'); + $firstMember = $queue->members->front(); + echo $firstMember->position; + echo $firstMember->call_sid; + diff --git a/externals/twilio-php/docs/usage/rest/messages.rst b/externals/twilio-php/docs/usage/rest/messages.rst new file mode 100755 index 0000000000..e3bcff1174 --- /dev/null +++ b/externals/twilio-php/docs/usage/rest/messages.rst @@ -0,0 +1,50 @@ +============= +Messages +============= + +Sending a Message +===================== + +The :class:`Messages ` resource allows you to +send outgoing SMS or MMS messages. + +.. code-block:: php + + require('/path/to/twilio-php/Services/Twilio.php'); + + $client = new Services_Twilio('AC123', '123'); + $message = $client->account->messages->sendMessage( + '+14085551234', // From a Twilio number in your account + '+12125551234', // Text any number + 'Hello monkey!', // Message body (if any) + array('http://example.com/image.jpg'), // An array of MediaUrls + ); + + echo $message->sid; + +Listing Messages +==================== + +It's easy to iterate over your messages. + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + foreach ($client->account->messages as $message) { + echo "From: {$message->from}\nTo: {$message->to}\nBody: " . $message->body; + } + +Filtering Messages +====================== + +Let's say you want to find all of the messages that have been sent from +a particular number. You can do so by constructing an iterator explicitly: + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + foreach ($client->account->messages->getIterator(0, 50, array( + 'From' => '+14105551234', + )) as $message) { + echo "From: {$message->from}\nTo: {$message->to}\nBody: " . $message->body; + } diff --git a/externals/twilio-php/docs/usage/rest/notifications.rst b/externals/twilio-php/docs/usage/rest/notifications.rst new file mode 100755 index 0000000000..0df0c43fae --- /dev/null +++ b/externals/twilio-php/docs/usage/rest/notifications.rst @@ -0,0 +1,13 @@ +=============== + Notifications +=============== + +Filter Notifications by Log Level +================================= + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + foreach ($client->account->notifications->getIterator(0, 50, array("LogLevel" => 0)) as $n) { + print $n->error_code; + } diff --git a/externals/twilio-php/docs/usage/rest/phonenumbers.rst b/externals/twilio-php/docs/usage/rest/phonenumbers.rst new file mode 100755 index 0000000000..e929882ea2 --- /dev/null +++ b/externals/twilio-php/docs/usage/rest/phonenumbers.rst @@ -0,0 +1,187 @@ +================= + Phone Numbers +================= + +Purchasing phone numbers is a two step process. + +Searching For a Number +---------------------- + +First, we need to search for an available phone number. Use the +:php:meth:`Services_Twilio_Rest_AvailablePhoneNumbers::getList` method of the +:php:class:`Services_Twilio_Rest_AvailablePhoneNumbers` list resource. + +.. code-block:: php + + $accountSid = 'AC1234567890abcdef1234567890a'; + $authToken = 'abcdef1234567890abcdefabcde9'; + + $client = new Services_Twilio($accountSid, $authToken); + $numbers = $client->account->available_phone_numbers->getList('US', 'TollFree'); + foreach($numbers->available_phone_numbers as $number) { + echo 'Number: ' + $number->phone_number + "\n"; + } + +You can also pass in parameters to search for phone numbers in a certain area +code, or which contain a certain pattern. + +.. code-block:: php + + $accountSid = 'AC1234567890abcdef1234567890a'; + $authToken = 'abcdef1234567890abcdefabcde9'; + + $client = new Services_Twilio($accountSid, $authToken); + + // Full parameter documentation at http://www.twilio.com/docs/api/rest/available-phone-numbers#local + $params = array('AreaCode' => '925', 'Contains' => 'hi'); + $numbers = $client->account->available_phone_numbers->getList('US', 'Local', $params); + foreach($numbers->available_phone_numbers as $number) { + echo 'Number: ' + $number->phone_number + "\n"; + } + +You can also use the type subresources to search for a given type. + +Available types include: +- `local` +- `toll_free` +- `mobile` + +.. code-block:: php + + // Local + $numbers = $client->account->available_phone_numbers->local; + foreach($numbers as $number) { + echo 'Number: ' + $number->phone_number + "\n"; + } + + // TollFree + $numbers = $client->account->available_phone_numbers->toll_free; + foreach($numbers as $number) { + echo 'Number: ' + $number->phone_number + "\n"; + } + + // Mobile + $numbers = $client->account->available_phone_numbers->mobile; + foreach($numbers as $number) { + echo 'Number: ' + $number->phone_number + "\n"; + } + + +Buying a Number +--------------- + +Once you have a phone number, purchase it by creating a new +:php:class:`Services_Twilio_Rest_IncomingPhoneNumber` instance. + +.. code-block:: php + + $accountSid = 'AC1234567890abcdef1234567890a'; + $authToken = 'abcdef1234567890abcdefabcde9'; + + $client = new Services_Twilio($accountSid, $authToken); + + $phoneNumber = '+44XXXYYYZZZZ'; + $purchasedNumber = $client->account->incoming_phone_numbers->create(array('PhoneNumber' => $phoneNumber)); + + echo $purchasedNumber->sid; + +Tying the two together, you can search for a number, and then purchase it. + +.. code-block:: php + + $accountSid = 'AC1234567890abcdef1234567890a'; + $authToken = 'abcdef1234567890abcdefabcde9'; + + $client = new Services_Twilio($accountSid, $authToken); + + // Full parameter documentation at http://www.twilio.com/docs/api/rest/available-phone-numbers#local + $params = array('AreaCode' => '800', 'Contains' => 'hi'); + + $numbers = $client->account->available_phone_numbers->getList('CA', 'TollFree', $params); + $firstNumber = $numbers->available_phone_numbers[0]->phone_number; + $purchasedNumber = $client->account->incoming_phone_numbers->create(array('PhoneNumber' => $firstNumber)); + + echo $purchasedNumber->sid; + +You can also purchase a random number with a given area code (US/Canada only): + +.. code-block:: php + + $accountSid = 'AC1234567890abcdef1234567890a'; + $authToken = 'abcdef1234567890abcdefabcde9'; + + $client = new Services_Twilio($accountSid, $authToken); + $purchasedNumber = $client->account->incoming_phone_numbers->create(array('AreaCode' => '925')); + + echo $purchasedNumber->sid; + +Retrieving All of a Number's Properties +--------------------------------------- + +If you know the number and you want to retrieve all of the properties of that +number, such as the ``voice_url`` or the ``sms_method``, you can use the +:php:meth:`Services_Twilio_Rest_IncomingPhoneNumbers::getNumber` convenience +function. + +.. code-block:: php + + $accountSid = 'AC1234567890abcdef1234567890a'; + $authToken = 'abcdef1234567890abcdefabcde9'; + + $client = new Services_Twilio($accountSid, $authToken); + + // Number must be in e.164 format. + $number = $client->account->incoming_phone_numbers->getNumber('+14105551234'); + echo $number->voice_url; + +If you know the ``sid`` of a phone number, you can retrieve it using the +``get()`` function. + +.. code-block:: php + + $accountSid = 'AC1234567890abcdef1234567890a'; + $authToken = 'abcdef1234567890abcdefabcde9'; + + $client = new Services_Twilio($accountSid, $authToken); + + $number = $client->account->incoming_phone_numbers->get('PN123456'); + echo $number->voice_url; + +Updating a Number +----------------- + +You can easily update any of the properties of your +phone number. A full list of parameters is available +in the `Incoming Phone Number REST API Documentation. +`_ + +.. code-block:: php + + $accountSid = 'AC1234567890abcdef1234567890a'; + $authToken = 'abcdef1234567890abcdefabcde9'; + + $client = new Services_Twilio($accountSid, $authToken); + $numbers = $client->account->incoming_phone_numbers; + foreach ($numbers as $number) { + $number->update(array('VoiceMethod' => 'POST')); + } + +Deleting a Number +----------------- + +You can delete numbers by specifying the Sid of the phone number you'd like to +delete, from the incoming phone numbers object. + +.. code-block:: php + + $accountSid = 'AC1234567890abcdef1234567890a'; + $authToken = 'abcdef1234567890abcdefabcde9'; + + $client = new Services_Twilio($accountSid, $authToken); + $numbers = $client->account->incoming_phone_numbers; + foreach($numbers as $number) { + // Delete just the first number, then quit. + $client->account->incoming_phone_numbers->delete($number->sid); + break; + } + diff --git a/externals/twilio-php/docs/usage/rest/queues.rst b/externals/twilio-php/docs/usage/rest/queues.rst new file mode 100755 index 0000000000..f75f3334ca --- /dev/null +++ b/externals/twilio-php/docs/usage/rest/queues.rst @@ -0,0 +1,56 @@ +============= +Queues +============= + +Create a New Queue +===================== + +To create a new queue, make an HTTP POST request to the Queues resource. + +.. code-block:: php + + require('/path/to/twilio-php/Services/Twilio.php'); + + $client = new Services_Twilio('AC123', '123'); + // Default MaxSize is 100. Or change it by adding a parameter, like so + $queue = $client->account->queues->create('First Queue', + array('MaxSize' => 10)); + + print $queue->sid; + print $queue->friendly_name; + +Listing Queues +==================== + +It's easy to iterate over your list of queues. + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + foreach ($client->account->queues as $queue) { + echo $queue->sid; + } + +Deleting Queues +==================== + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + $queue_sid = 'QQ123'; + $client->account->queues->delete('QQ123'); + +Retrieve the Member at the Front of a Queue +=========================================== + +The Members class has a method called ``front`` which can be used to retrieve +the member at the front of the queue. + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + $queue = $client->account->queues->get('QQ123'); + $firstMember = $queue->members->front(); + echo $firstMember->position; + echo $firstMember->call_sid; + diff --git a/externals/twilio-php/docs/usage/rest/recordings.rst b/externals/twilio-php/docs/usage/rest/recordings.rst new file mode 100755 index 0000000000..69cce543b0 --- /dev/null +++ b/externals/twilio-php/docs/usage/rest/recordings.rst @@ -0,0 +1,61 @@ +========== +Recordings +========== + +Listing Recordings +------------------ + +Run the following to get a list of all of your recordings: + +.. code-block:: php + + $accountSid = 'AC1234567890abcdef1234567890a'; + $authToken = 'abcdef1234567890abcdefabcde9'; + $client = new Services_Twilio($accountSid, $authToken); + + foreach($client->account->recordings as $recording) { + echo "Access recording {$recording->sid} at:" . "\n"; + echo $recording->uri; + } + +For more information about which properties are available for a recording +object, please see the `Twilio Recordings API Documentation `_. + +Please note that the ``uri`` returned by default is a JSON dictionary +containing metadata about the recording; you can access the .wav version by +stripping the ``.json`` extension from the ``uri`` returned by the library. + +Filtering Recordings By Call Sid +-------------------------------- + +Pass filters as an array to filter your list of recordings, with any of the +filters listed in the `recording list documentation `_. + +.. code-block:: php + + $accountSid = 'AC1234567890abcdef1234567890a'; + $authToken = 'abcdef1234567890abcdefabcde9'; + $client = new Services_Twilio($accountSid, $authToken); + + foreach($client->account->recordings->getIterator(0, 50, array('DateCreated>' => '2011-01-01')) as $recording) { + echo $recording->uri . "\n"; + } + +Deleting a Recording +-------------------- + +To delete a recording, get the sid of the recording, and then pass it to the +client. + +.. code-block:: php + + $accountSid = 'AC1234567890abcdef1234567890a'; + $authToken = 'abcdef1234567890abcdefabcde9'; + $client = new Services_Twilio($accountSid, $authToken); + + foreach($client->account->recordings as $recording) { + $client->account->recordings->delete($recording->sid); + echo "Deleted recording {$recording->sid}, the first one in the list."; + break; + } + diff --git a/externals/twilio-php/docs/usage/rest/sip.rst b/externals/twilio-php/docs/usage/rest/sip.rst new file mode 100755 index 0000000000..5a9cfeee8c --- /dev/null +++ b/externals/twilio-php/docs/usage/rest/sip.rst @@ -0,0 +1,88 @@ +============= +Sip In +============= + +Getting started with Sip +========================== + +If you're unfamiliar with SIP, please see the `SIP API Documentation +`_ on our website. + +Creating a Sip Domain +========================= + +The :class:`Domains ` resource allows you to +create a new domain. To create a new domain, you'll need to choose a unique +domain that lives under sip.twilio.com. For example, doug.sip.twilio.com. + +.. code-block:: php + + require('/path/to/twilio-php/Services/Twilio.php'); + + $client = new Services_Twilio('AC123', '123'); + $domain = $client->account->sip->domains->create( + "Doug's Domain", // The FriendlyName for your new domain + "doug.sip.twilio.com", // The sip domain for your new domain + array( + 'VoiceUrl' => 'http://example.com/voice', + )); + + echo $domain->sid; + +Creating a new IpAccessControlList +==================================== + +To control access to your new domain, you'll need to explicitly grant access +to individual ip addresses. To do this, you'll first need to create an +:class:`IpAccessControlList ` to hold +the ip addresses you wish to allow. + +.. code-block:: php + + require('/path/to/twilio-php/Services/Twilio.php'); + + $client = new Services_Twilio('AC123', '123'); + $ip_access_control_list = $client->account->sip->ip_access_control_lists->create( + "Doug's IpAccessControlList", // The FriendlyName for your new ip access control list + ); + + echo $ip_access_control_list->sid; + +Adding an IpAddress to an IpAccessControlList +============================================== + +Now it's time to add an :class:`IpAddress +` to your new :class:`IpAccessControlList +`. + +.. code-block:: php + + require('/path/to/twilio-php/Services/Twilio.php'); + + $client = new Services_Twilio('AC123', '123'); + $ip_address = $client->account->sip->ip_access_control_lists->get('AC123')->ip_addresses->create( + "Doug's IpAddress", // The FriendlyName for this IpAddress + '127.0.0.1', // The ip address for this IpAddress + ); + + echo $ip_address->sid; + +Adding an IpAccessControlList to a Domain +=========================================== + +Once you've created a :class:`Domain ` and an +:class:`IpAccessControlList ` +you need to associate them. To do this, +create an :class:`IpAccessControlListMapping +`. + +.. code-block:: php + + require('/path/to/twilio-php/Services/Twilio.php'); + + $client = new Services_Twilio('AC123', '123'); + $ip_access_control_list_mapping = $client->account->sip->domains->get('SD123')->ip_access_control_list_mappings->create( + 'AL123', // The sid of your IpAccessControlList + ); + + echo $ip_access_control_list_mapping->sid; diff --git a/externals/twilio-php/docs/usage/rest/sms-messages.rst b/externals/twilio-php/docs/usage/rest/sms-messages.rst new file mode 100755 index 0000000000..c1ccffe2f2 --- /dev/null +++ b/externals/twilio-php/docs/usage/rest/sms-messages.rst @@ -0,0 +1,50 @@ +============= +SMS Messages +============= + +Sending a SMS Message +===================== + + +The :php:class:`Services_Twilio_Rest_SmsMessages` resource allows you to send +outgoing text messages. + +.. code-block:: php + + require('/path/to/twilio-php/Services/Twilio.php'); + + $client = new Services_Twilio('AC123', '123'); + $message = $client->account->sms_messages->create( + '+14085551234', // From a Twilio number in your account + '+12125551234', // Text any number + "Hello monkey!" + ); + + print $message->sid; + +Listing SMS Messages +==================== + +It's easy to iterate over your SMS messages. + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + foreach ($client->account->sms_messages as $message) { + echo "From: {$message->from}\nTo: {$message->to}\nBody: " . $message->body; + } + +Filtering SMS Messages +====================== + +Let's say you want to find all of the SMS messages that have been sent from +a particular number. You can do so by constructing an iterator explicitly: + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + foreach ($client->account->sms_messages->getIterator(0, 50, array( + 'From' => '+14105551234', + )) as $message) { + echo "From: {$message->from}\nTo: {$message->to}\nBody: " . $message->body; + } diff --git a/externals/twilio-php/docs/usage/rest/transcriptions.rst b/externals/twilio-php/docs/usage/rest/transcriptions.rst new file mode 100755 index 0000000000..dfe38d603d --- /dev/null +++ b/externals/twilio-php/docs/usage/rest/transcriptions.rst @@ -0,0 +1,13 @@ +================ +Transcriptions +================ + +Show all Transcribed Messages +============================= + +.. code-block:: php + + $client = new Services_Twilio('AC123', '123'); + foreach ($client->account->transcriptions as $t) { + print $t->transcription_text; + } diff --git a/externals/twilio-php/docs/usage/rest/usage-records.rst b/externals/twilio-php/docs/usage/rest/usage-records.rst new file mode 100755 index 0000000000..bf33836abe --- /dev/null +++ b/externals/twilio-php/docs/usage/rest/usage-records.rst @@ -0,0 +1,91 @@ +============= +Usage Records +============= + +Twilio offers a Usage Record API so you can better measure how much you've been +using Twilio. Here are some examples of how you can use PHP to access the usage +API. + +Retrieve All Usage Records +========================== + +.. code-block:: php + + $client = new Services_Twilio('AC123', '456bef'); + foreach ($client->account->usage_records as $record) { + echo "Record: $record"; + } + +Retrieve Usage Records For A Time Interval +========================================== + +UsageRecords support `several convenience subresources +`_ that +can be accessed as properties on the `record` object. + +.. code-block:: php + + $client = new Services_Twilio('AC123', '456bef'); + foreach ($client->account->usage_records->last_month as $record) { + echo "Record: $record"; + } + +Retrieve All Time Usage for A Usage Category +============================================ + +By default, Twilio will return your all-time usage for a given usage category. + +.. code-block:: php + + $client = new Services_Twilio('AC123', '456bef'); + $callRecord = $client->account->usage_records->getCategory('calls'); + echo $callRecord->usage; + +Retrieve All Usage for a Given Time Period +========================================== + +You can filter your UsageRecord list by providing `StartDate` and `EndDate` +parameters. + +.. code-block:: php + + $client = new Services_Twilio('AC123', '456bef'); + foreach ($client->account->usage_records->getIterator(0, 50, array( + 'StartDate' => '2012-08-01', + 'EndDate' => '2012-08-31', + )) as $record) { + echo $record->description . "\n"; + echo $record->usage . "\n"; + } + +Retrieve Today's SMS Usage +========================== + +You can use the `today` record subresource, and then retrieve the record +directly with the `getCategory` function. + +.. code-block:: php + + $client = new Services_Twilio('AC123', '456bef'); + // You can substitute 'yesterday', 'all_time' for 'today' below + $smsRecord = $client->account->usage_records->today->getCategory('sms'); + echo $smsRecord->usage; + +Retrieve Daily Usage Over a One-Month Period +============================================= + +The code below will retrieve daily summaries of recordings usage for August +2012. To retrieve all categories of usage, remove the 'Category' filter from +the `getIterator` array. + +.. code-block:: php + + $client = new Services_Twilio('AC123', '456bef'); + foreach ($client->account->usage_records->daily->getIterator(0, 50, array( + 'StartDate' => '2012-08-01', + 'EndDate' => '2012-08-31', + 'Category' => 'recordings', + )) as $record) { + echo $record->usage; + } + diff --git a/externals/twilio-php/docs/usage/rest/usage-triggers.rst b/externals/twilio-php/docs/usage/rest/usage-triggers.rst new file mode 100755 index 0000000000..18cce82e9a --- /dev/null +++ b/externals/twilio-php/docs/usage/rest/usage-triggers.rst @@ -0,0 +1,92 @@ +============== +Usage Triggers +============== + +Twilio offers a Usage Trigger API so you can get notifications when your Twilio +usage exceeds a given level. Here are some examples of how you can +use PHP to create new usage triggers or modify existing triggers. + +Retrieve A Usage Trigger's Properties +===================================== + +If you know the Sid of your usage trigger, retrieving it is easy. + +.. code-block:: php + + $client = new Services_Twilio('AC123', '456bef'); + $usageSid = 'UT123'; + $usageTrigger = $client->account->usage_triggers->get($usageSid); + echo $usageTrigger->usage_category; + +Update Properties on a UsageTrigger +=================================== + +.. code-block:: php + + $client = new Services_Twilio('AC123', '456bef'); + $usageSid = 'UT123'; + $usageTrigger = $client->account->usage_triggers->get($usageSid); + $usageTrigger->update(array( + 'FriendlyName' => 'New usage trigger friendly name', + 'CallbackUrl' => 'http://example.com/new-trigger-url', + )); + +Retrieve All Triggers +===================== + +.. code-block:: php + + $client = new Services_Twilio('AC123', '456bef'); + foreach ($client->account->usage_triggers as $trigger) { + echo "Category: {$trigger->usage_category}\nTriggerValue: {$trigger->trigger_value}\n"; + } + +Filter Trigger List By Category +=============================== + +Pass filters to the `getIterator` function to create a filtered list. + +.. code-block:: php + + $client = new Services_Twilio('AC123', '456bef'); + foreach ($client->account->usage_triggers->getIterator( + 0, 50, array( + 'UsageCategory' => 'sms', + )) as $trigger + ) { + echo "Value: " . $trigger->trigger_value . "\n"; + } + +Create a New Trigger +==================== + +Pass a usage category, a value and a callback URL to the `create` method. + +.. code-block:: php + + $client = new Services_Twilio('AC123', '456bef'); + $trigger = $client->account->usage_triggers->create( + 'totalprice', + '250.75', + 'http://example.com/usage' + ); + +Create a Recurring Trigger +========================== + +To have your trigger reset once every day, month, or year, pass the +`Recurring` key as part of the params array. A list of optional +trigger parameters can be found in the `Usage Triggers Documentation +`_. + +.. code-block:: php + + $client = new Services_Twilio('AC123', '456bef'); + $trigger = $client->account->usage_triggers->create( + 'totalprice', + '250.75', + 'http://example.com/usage', + array('Recurring' => 'monthly', 'TriggerBy' => 'price') + ); + diff --git a/externals/twilio-php/docs/usage/token-generation.rst b/externals/twilio-php/docs/usage/token-generation.rst new file mode 100755 index 0000000000..6a2698120c --- /dev/null +++ b/externals/twilio-php/docs/usage/token-generation.rst @@ -0,0 +1,64 @@ +=========================== +Generate Capability Tokens +=========================== + +`Twilio Client `_ allows you to make and recieve connections in the browser. You can place a call to a phone on the PSTN network, all without leaving your browser. See the `Twilio Client Quickstart `_ to get up and running with Twilio Client. + +Capability tokens are used by `Twilio Client `_ to provide connection security and authorization. The `Capability Token documentation `_ explains indepth the purpose and features of these tokens. + +:php:class:`Services_Twilio_Capability` is responsible for the creation of these capability tokens. You'll need your Twilio AccountSid and AuthToken. + +.. code-block:: php + + require('/path/to/twilio-php/Services/Twilio/Capability.php'); + + $accountSid = "AC123123"; + $authToken = "secret"; + + $capability = new Services_Twilio_Capability($accountSid, $authToken); + + +Allow Incoming Connections +============================== + +Before a device running `Twilio Client `_ can recieve incoming connections, the instance must first register a name (such as "Alice" or "Bob"). The :php:meth:`allowCclientIncoming` method adds the client name to the capability token. + +.. code-block:: php + + $capability->allowClientIncoming("Alice"); + + +Allow Outgoing Connections +============================== + +To make an outgoing connection from a `Twilio Client `_ device, you'll need to choose a `Twilio Application `_ to handle TwiML URLs. A Twilio Application is a collection of URLs responsible for outputing valid TwiML to control phone calls and SMS. + +.. code-block:: php + + $applicationSid = "AP123123"; // Twilio Application Sid + $capability->allowClientOutgoing($applicationSid); + +:php:meth:`allowClientOutgoing` accepts an optional array of parameters. These parameters will be passed along when Twilio requests TwiML from the application. + +.. code-block:: php + + $applicationSid = "AP123123"; // Twilio Application Sid + $params = array("Foo" => "Bar"); // Parameters to be passed + $capability->allowClientOutgoing($applicationSid, $params); + + +Generate a Token +================== + +.. code-block:: php + + $token = $capability->generateToken(); + +By default, this token will expire in one hour. If you'd like to change the token expiration time, :php:meth:`generateToken` takes an optional argument which specifies `time to live` in seconds. + +.. code-block:: php + + $token = $capability->generateToken(600); + +This token will now expire in 10 minutes. + diff --git a/externals/twilio-php/docs/usage/twiml.rst b/externals/twilio-php/docs/usage/twiml.rst new file mode 100755 index 0000000000..892735c9f3 --- /dev/null +++ b/externals/twilio-php/docs/usage/twiml.rst @@ -0,0 +1,347 @@ +.. _usage-twiml: + +============== +TwiML Creation +============== + +TwiML creation begins with the :class:`Services_Twilio_Twiml` verb. Each +succesive verb is created by calling various methods on the response, such as +:meth:`say` or :meth:`play`. These methods return the verbs they create to ease +the creation of nested TwiML. + +.. code-block:: php + + $response = new Services_Twilio_Twiml; + $response->say('Hello'); + print $response; + +.. code-block:: xml + + + + Hello + + +Primary Verbs +============= + +Response +-------- + +All TwiML starts with the `` verb. The following code creates an empty response. + +.. code-block:: php + + $response = new Services_Twilio_Twiml; + print $response; + +.. code-block:: xml + + + + +Say +--- + +.. code-block:: php + + $response = new Services_Twilio_Twiml; + $response->say("Hello World"); + print $response; + +.. code-block:: xml + + + + Hello World + + +Play +---- + +.. code-block:: php + + $response = new Services_Twilio_Twiml; + $response->play("https://api.twilio.com/cowbell.mp3", array('loop' => 5)); + print $response; + +.. code-block:: xml + + + + https://api.twilio.com/cowbell.mp3 + + +Gather +------ + +.. code-block:: php + + $response = new Services_Twilio_Twiml; + $gather = $response->gather(array('numDigits' => 5)); + $gather->say("Hello Caller"); + print $response; + +.. code-block:: xml + + + + + Hello Caller + + + +Record +------ + +.. code-block:: php + + $response = new Services_Twilio_Twiml; + $response->record(array( + 'action' => 'http://foo.com/path/to/redirect', + 'maxLength' => 20 + )); + print $response; + +.. code-block:: xml + + + + + + +Message +------- + +.. code-block:: php + + $response = new Services_Twilio_Twiml; + $response->message('Hello World', array( + 'to' => '+14150001111', + 'from' => '+14152223333' + )); + print $response; + +.. code-block:: xml + + + + Hello World + + +Dial +---- + +.. code-block:: php + + $response = new Services_Twilio_Twiml; + $response->dial('+14150001111', array( + 'callerId' => '+14152223333' + )); + print $response; + +.. code-block:: xml + + + + +14150001111 + + +Number +~~~~~~ + +Dial out to phone numbers easily. + +.. code-block:: php + + $response = new Services_Twilio_Twiml; + $dial = $response->dial(NULL, array( + 'callerId' => '+14152223333' + )); + $dial->number('+14151112222', array( + 'sendDigits' => '2' + )); + print $response; + +.. code-block:: xml + + + + + +14151112222 + + + +Client +~~~~~~ + +.. code-block:: php + + $response = new Services_Twilio_Twiml; + $dial = $response->dial(NULL, array( + 'callerId' => '+14152223333' + )); + $dial->client('client-id'); + print $response; + +.. code-block:: xml + + + + + client-id + + + +Conference +~~~~~~~~~~ + +.. code-block:: php + + require("Services/Twilio.php"); + $response = new Services_Twilio_Twiml; + $dial = $response->dial(); + $dial->conference('Customer Waiting Room', array( + "startConferenceOnEnter" => "true", + "muted" => "true", + "beep" => "false", + )); + print $response; + +.. code-block:: xml + + + + + + Customer Waiting Room + + + + +Sip +~~~ + +To dial out to a Sip number, put the Sip address in the `sip()` method call. + +.. code-block:: php + + require("Services/Twilio.php"); + $response = new Services_Twilio_Twiml; + $dial = $response->dial(); + $sip = $dial->sip(); + $sip->uri('alice@foo.com?X-Header-1=value1&X-Header-2=value2', array( + "username" => "admin", + "password" => "1234", + )); + print $response; + +.. code-block:: xml + + + + + + + alice@foo.com?X-Header-1=value1&X-Header-2=value2 + + + + + + +Secondary Verbs +=============== + +Hangup +------ + +.. code-block:: php + + $response = new Services_Twilio_Twiml; + $response->hangup(); + print $response; + +.. code-block:: xml + + + + + + +Redirect +-------- + +.. code-block:: php + + $response = new Services_Twilio_Twiml; + $response->redirect('http://twimlets.com/voicemail?Email=somebody@somedomain.com'); + print $response; + +.. code-block:: xml + + + + http://twimlets.com/voicemail?Email=somebody@somedomain.com + + + +Reject +------ + +.. code-block:: php + + $response = new Services_Twilio_Twiml; + $response->reject(array( + 'reason' => 'busy' + )); + print $response; + +.. code-block:: xml + + + + + + + +Pause +----- + +.. code-block:: php + + $response = new Services_Twilio_Twiml; + $response->say('Hello'); + $response->pause(""); + $response->say('World'); + print $response; + +.. code-block:: xml + + + + Hello + + World + + +Enqueue +------- + +.. code-block:: php + + $response = new Services_Twilio_Twiml; + $response->say("You're being added to the queue."); + $response->enqueue('queue-name'); + print $response; + +.. code-block:: xml + + + + You're being added to the queue. + queue-name + + +The verb methods (outlined in the complete reference) take the body (only text) +of the verb as the first argument. All attributes are keyword arguments. diff --git a/externals/twilio-php/docs/usage/validation.rst b/externals/twilio-php/docs/usage/validation.rst new file mode 100755 index 0000000000..b361f3b24f --- /dev/null +++ b/externals/twilio-php/docs/usage/validation.rst @@ -0,0 +1,66 @@ +=========================== +Validate Incoming Requests +=========================== + +Twilio requires that your TwiML-serving web server be open to the public. This is necessary so that Twilio can retrieve TwiML from urls and POST data back to your server. + +However, there may be people out there trying to spoof the Twilio service. Luckily, there's an easy way to validate that incoming requests are from Twilio and Twilio alone. + +An `indepth guide `_ to our security features can be found in our online documentation. + +Before you can validate requests, you'll need four pieces of information + +* your Twilio Auth Token +* the POST data for the request +* the requested URL +* the X-Twilio-Signature header value + +Get your Auth Token from the `Twilio User Dashboard `_. + +Obtaining the other three pieces of information depends on the framework of your choosing. I will assume that you have the POST data as an array and the url and X-Twilio-Signature as strings. + +The below example will print out a confirmation message if the request is actually from Twilio.com + +.. code-block:: php + + // Your auth token from twilio.com/user/account + $authToken = '12345'; + + // Download the twilio-php library from twilio.com/docs/php/install, include it + // here + require_once('/path/to/twilio-php/Services/Twilio.php'); + $validator = new Services_Twilio_RequestValidator($authToken); + + // The Twilio request URL. You may be able to retrieve this from + // $_SERVER['SCRIPT_URI'] + $url = 'https://mycompany.com/myapp.php?foo=1&bar=2'; + + // The post variables in the Twilio request. You may be able to use + // $postVars = $_POST + $postVars = array( + 'CallSid' => 'CA1234567890ABCDE', + 'Caller' => '+14158675309', + 'Digits' => '1234', + 'From' => '+14158675309', + 'To' => '+18005551212' + ); + + // The X-Twilio-Signature header - in PHP this should be + // $_SERVER["HTTP_X_TWILIO_SIGNATURE"]; + $signature = 'RSOYDt4T1cUTdK1PDd93/VVr8B8='; + + if ($validator->validate($signature, $url, $postVars)) { + echo "Confirmed to have come from Twilio."; + } else { + echo "NOT VALID. It might have been spoofed!"; + } + +Trailing Slashes +================== + +If your URL uses an "index" page, such as index.php or index.html to handle the request, such as: https://mycompany.com/twilio where the real page is served from https://mycompany.com/twilio/index.php, then Apache or PHP may rewrite that URL a little bit so it's got a trailing slash... https://mycompany.com/twilio/ for example. + +Using the code above, or similar code in another language, you could end up with an incorrect hash because, Twilio built the hash using https://mycompany.com/twilio and you may have built the hash using https://mycompany.com/twilio/. + + + diff --git a/externals/twilio-php/package.php b/externals/twilio-php/package.php new file mode 100755 index 0000000000..4f30b365ae --- /dev/null +++ b/externals/twilio-php/package.php @@ -0,0 +1,117 @@ + + * @copyright 2014 Twilio + * @license http://creativecommons.org/licenses/MIT/ + * @link http://pear.php.net/package/Services_Twilio + */ + +ini_set('display_errors', '0'); +error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT); +require_once 'PEAR/PackageFileManager/File.php'; +require_once 'PEAR/PackageFileManager2.php'; +PEAR::setErrorHandling(PEAR_ERROR_DIE); + +$api_version = '3.12.4'; +$api_state = 'stable'; + +$release_version = '3.12.4'; +$release_state = 'stable'; +$release_notes = 'Add transcription link to recordings'; + +$description = <<setOptions( + array( + 'filelistgenerator' => 'file', + 'simpleoutput' => true, + 'baseinstalldir' => '/', + 'packagedirectory' => './', + 'dir_roles' => array( + 'Services' => 'php', + 'Services/Twilio' => 'php', + 'tests' => 'test' + ), + 'ignore' => array( + 'package.php', + '*.tgz', + 'scratch/*', + 'vendor/*', + 'composer.*', + 'coverage/*', + '.travis.yml', + 'venv/*', + ) + ) +); + +$package->setPackage('Services_Twilio'); +$package->setSummary('PHP helper library for Twilio'); +$package->setDescription($description); +$package->setChannel('twilio.github.com/pear'); +$package->setPackageType('php'); +$package->setLicense( + 'MIT License', + 'http://creativecommons.org/licenses/MIT/' +); + +$package->setNotes($release_notes); +$package->setReleaseVersion($release_version); +$package->setReleaseStability($release_state); +$package->setAPIVersion($api_version); +$package->setAPIStability($api_state); + +$package->addMaintainer( + 'lead', + 'kevinburke', + 'Kevin Burke', + 'kevin@twilio.com' +); + + +$package->setPhpDep('5.2.1'); + +$package->addPackageDepWithChannel('optional', 'Mockery', 'pear.survivethedeepend.com'); + +$package->setPearInstallerDep('1.9.3'); +$package->generateContents(); +$package->addRelease(); + +if (isset($_GET['make']) + || (isset($_SERVER['argv']) && @$_SERVER['argv'][1] == 'make') +) { + $package->writePackageFile(); +} else { + $package->debugPackageFile(); +} + diff --git a/externals/twilio-php/tests/Bootstrap.php b/externals/twilio-php/tests/Bootstrap.php new file mode 100755 index 0000000000..e01b873e05 --- /dev/null +++ b/externals/twilio-php/tests/Bootstrap.php @@ -0,0 +1,27 @@ +register(); + +require_once 'Twilio.php'; + +unset($root, $library, $tests, $path); + diff --git a/externals/twilio-php/tests/BuildQueryTest.php b/externals/twilio-php/tests/BuildQueryTest.php new file mode 100755 index 0000000000..5140d537ec --- /dev/null +++ b/externals/twilio-php/tests/BuildQueryTest.php @@ -0,0 +1,56 @@ + 'bar', + 'baz' => 'bin', + ); + + $this->assertEquals(Services_Twilio::buildQuery($data), 'foo=bar&baz=bin'); + } + + public function testSameKey() { + $data = array( + 'foo' => array( + 'bar', + 'baz', + 'bin', + ), + 'boo' => 'bah', + ); + + $this->assertEquals(Services_Twilio::buildQuery($data), + 'foo=bar&foo=baz&foo=bin&boo=bah'); + } + + public function testKeylessData() { + $data = array( + 'bar', + 'baz', + 'bin', + ); + + $this->assertEquals(Services_Twilio::buildQuery($data), '0=bar&1=baz&2=bin'); + } + + public function testKeylessDataPrefix() { + $data = array( + 'bar', + 'baz', + 'bin', + ); + + $this->assertEquals(Services_Twilio::buildQuery($data, 'var'), 'var0=bar&var1=baz&var2=bin'); + } + + public function testQualifiedUserAgent() { + $expected = Services_Twilio::USER_AGENT . " (php 5.4)"; + $this->assertEquals(Services_Twilio::qualifiedUserAgent("5.4"), $expected); + } + +} + diff --git a/externals/twilio-php/tests/CapabilityTest.php b/externals/twilio-php/tests/CapabilityTest.php new file mode 100755 index 0000000000..143145050a --- /dev/null +++ b/externals/twilio-php/tests/CapabilityTest.php @@ -0,0 +1,106 @@ +generateToken(), 'foo'); + $this->assertEquals($payload->iss, "AC123"); + $this->assertEquals($payload->scope, ''); + } + + public function testInboundPermissions() { + $token = new Services_Twilio_Capability('AC123', 'foo'); + $token->allowClientIncoming("andy"); + $payload = JWT::decode($token->generateToken(), 'foo'); + + $eurl = "scope:client:incoming?clientName=andy"; + $this->assertEquals($payload->scope, $eurl); + } + + public function testOutboundPermissions() { + $token = new Services_Twilio_Capability('AC123', 'foo'); + $token->allowClientOutgoing("AP123"); + $payload = JWT::decode($token->generateToken(), 'foo');; + $eurl = "scope:client:outgoing?appSid=AP123"; + $this->assertContains($eurl, $payload->scope); + } + + public function testOutboundPermissionsParams() { + $token = new Services_Twilio_Capability('AC123', 'foo'); + $token->allowClientOutgoing("AP123", array("foobar" => 3)); + $payload = JWT::decode($token->generateToken(), 'foo'); + + $eurl = "scope:client:outgoing?appSid=AP123&appParams=foobar%3D3"; + $this->assertEquals($payload->scope, $eurl); + } + + public function testEvents() { + $token = new Services_Twilio_Capability('AC123', 'foo'); + $token->allowEventStream(); + $payload = JWT::decode($token->generateToken(), 'foo'); + + $event_uri = "scope:stream:subscribe?path=%2F2010" + . "-04-01%2FEvents¶ms="; + $this->assertEquals($payload->scope, $event_uri); + } + + public function testEventsWithFilters() { + $token = new Services_Twilio_Capability('AC123', 'foo'); + $token->allowEventStream(array("foobar" => "hey")); + $payload = JWT::decode($token->generateToken(), 'foo'); + + $event_uri = "scope:stream:subscribe?path=%2F2010-" + . "04-01%2FEvents¶ms=foobar%3Dhey"; + $this->assertEquals($payload->scope, $event_uri); + } + + + public function testDecode() { + $token = new Services_Twilio_Capability('AC123', 'foo'); + $token->allowClientOutgoing("AP123", array("foobar"=> 3)); + $token->allowClientIncoming("andy"); + $token->allowEventStream(); + + $outgoing_uri = "scope:client:outgoing?appSid=" + . "AP123&appParams=foobar%3D3&clientName=andy"; + $incoming_uri = "scope:client:incoming?clientName=andy"; + $event_uri = "scope:stream:subscribe?path=%2F2010-04-01%2FEvents"; + + $payload = JWT::decode($token->generateToken(), 'foo'); + $scope = $payload->scope; + + $this->assertContains($outgoing_uri, $scope); + $this->assertContains($incoming_uri, $scope); + $this->assertContains($event_uri, $scope); + } + + + function testDecodeWithAuthToken() { + try { + $token = new Services_Twilio_Capability('AC123', 'foo'); + $payload = JWT::decode($token->generateToken(), 'foo'); + $this->assertSame($payload->iss, 'AC123'); + } catch (UnexpectedValueException $e) { + $this->assertTrue(false, "Could not decode with 'foo'"); + } + } + + function testClientNameValidation() { + $this->setExpectedException('InvalidArgumentException'); + $token = new Services_Twilio_Capability('AC123', 'foo'); + $token->allowClientIncoming('@'); + $this->fail('exception should have been raised'); + } + + function zeroLengthNameInvalid() { + $this->setExpectedException('InvalidArgumentException'); + $token = new Services_Twilio_Capability('AC123', 'foo'); + $token->allowClientIncoming(""); + $this->fail('exception should have been raised'); + } + + +} diff --git a/externals/twilio-php/tests/README b/externals/twilio-php/tests/README new file mode 100755 index 0000000000..2392c33188 --- /dev/null +++ b/externals/twilio-php/tests/README @@ -0,0 +1,3 @@ +# To run the tests, navigate to the twilio-php home directory, then run: + +make test diff --git a/externals/twilio-php/tests/RequestValidatorTest.php b/externals/twilio-php/tests/RequestValidatorTest.php new file mode 100755 index 0000000000..e38a66898e --- /dev/null +++ b/externals/twilio-php/tests/RequestValidatorTest.php @@ -0,0 +1,48 @@ + "94612", + "AccountSid" => "AC9a9f9392lad99kla0sklakjs90j092j3", + "ApiVersion" => "2010-04-01", + "CallSid" => "CAd800bb12c0426a7ea4230e492fef2a4f", + "CallStatus" => "ringing", + "Called" => "+15306384866", + "CalledCity" => "OAKLAND", + "CalledCountry" => "US", + "CalledState" => "CA", + "Caller" => "+15306666666", + "CallerCity" => "SOUTH LAKE TAHOE", + "CallerCountry" => "US", + "CallerName" => "CA Wireless Call", + "CallerState" => "CA", + "CallerZip" => "89449", + "Direction" => "inbound", + "From" => "+15306666666", + "FromCity" => "SOUTH LAKE TAHOE", + "FromCountry" => "US", + "FromState" => "CA", + "FromZip" => "89449", + "To" => "+15306384866", + "ToCity" => "OAKLAND", + "ToCountry" => "US", + "ToState" => "CA", + "ToZip" => "94612", + ); + + $expected = "fF+xx6dTinOaCdZ0aIeNkHr/ZAA="; + + $this->assertEquals( + $validator->computeSignature($uri, $params), $expected); + $this->assertTrue($validator->validate($expected, $uri, $params)); + } + +} diff --git a/externals/twilio-php/tests/TwilioTest.php b/externals/twilio-php/tests/TwilioTest.php new file mode 100755 index 0000000000..9108a9bbdd --- /dev/null +++ b/externals/twilio-php/tests/TwilioTest.php @@ -0,0 +1,672 @@ + 'application/x-www-form-urlencoded'); + protected $callParams = array('To' => '123', 'From' => '123', 'Url' => 'http://example.com'); + protected $nginxError = array(500, array('Content-Type' => 'text/html'), + 'Nginx 500 error' + ); + + protected $pagingParams = array('Page' => '0', 'PageSize' => '10'); + function tearDown() { + m::close(); + } + + function getClient($http) { + return new Services_Twilio('AC123', '123', '2010-04-01', $http); + } + + function createMockHttp($url, $method, $response, $params = null, + $status = 200 + ) { + $http = m::mock(new Services_Twilio_TinyHttp); + if ($method === 'post') { + $http->shouldReceive('post')->once()->with( + "/2010-04-01/Accounts/AC123$url.json", + $this->formHeaders, + http_build_query($params) + )->andReturn(array( + $status, + array('Content-Type' => 'application/json'), + json_encode($response) + ) + ); + } else { + $query = empty($params) ? '' : '?' . http_build_query($params); + $http->shouldReceive($method)->once()->with( + "/2010-04-01/Accounts/AC123$url.json$query" + )->andReturn(array( + $status, + array('Content-Type' => 'application/json'), + json_encode($response) + ) + ); + } + return $http; + } + + /** + * @dataProvider uriTestProvider + */ + function testRequestUriConstructedProperly($path, $params, $full_uri, $end_string) { + $this->assertSame($end_string, Services_Twilio::getRequestUri( + $path, $params, $full_uri + )); + } + + function uriTestProvider() { + return array( + array('/2010-04-01/Accounts', array('FriendlyName' => 'hi'), false, + '/2010-04-01/Accounts.json?FriendlyName=hi'), + array('/2010-04-01/Accounts', array(), false, + '/2010-04-01/Accounts.json'), + array('/2010-04-01/Accounts.json', array(), true, + '/2010-04-01/Accounts.json'), + array('/2010-04-01/Accounts.json', array('FriendlyName' => 'hi'), true, + '/2010-04-01/Accounts.json'), + array('/2010-04-01/Accounts', array( + 'FriendlyName' => 'hi', 'foo' => 'bar' + ), false, '/2010-04-01/Accounts.json?FriendlyName=hi&foo=bar'), + ); + } + + function testNeedsRefining() { + $http = $this->createMockHttp('', 'get', array( + 'sid' => 'AC123', + 'friendly_name' => 'Robert Paulson', + ) + ); + $client = $this->getClient($http); + $this->assertEquals('AC123', $client->account->sid); + $this->assertEquals('Robert Paulson', $client->account->friendly_name); + } + + function testAccessSidAvoidsNetworkCall() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->never(); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $client->account->sid; + } + + function testOnlyOneClientCreated() { + $client = new Services_Twilio('AC123', '456'); + $client->account->client->sid = 'CL456'; + $this->assertSame('CL456', $client->account->sandbox->client->sid); + } + + function testNullVersionReturnsNewest() { + $client = new Services_Twilio('AC123', '123', null); + $this->assertEquals('2010-04-01', $client->getVersion()); + $client = new Services_Twilio('AC123', '123', 'v1'); + $this->assertEquals('2010-04-01', $client->getVersion()); + $client = new Services_Twilio('AC123', '123', '2010-04-01'); + $this->assertEquals('2010-04-01', $client->getVersion()); + $client = new Services_Twilio('AC123', '123', '2008-08-01'); + $this->assertEquals('2008-08-01', $client->getVersion()); + } + + function testObjectLoadsOnlyOnce() { + $http = $this->createMockHttp('', 'get', array( + 'sid' => 'AC123', + 'friendly_name' => 'Robert Paulson', + 'status' => 'active', + )); + $client = $this->getClient($http); + $client->account->friendly_name; + $client->account->friendly_name; + $client->account->status; + } + + function testSubresourceLoad() { + $http = $this->createMockHttp('/Calls/CA123', 'get', + array('status' => 'Completed') + ); + $client = $this->getClient($http); + $this->assertEquals( + 'Completed', + $client->account->calls->get('CA123')->status + ); + } + + function testSubresourceSubresource() { + $http = $this->createMockHttp('/Calls/CA123/Notifications/NO123', 'get', + array('message_text' => 'Foo') + ); + + $client = $this->getClient($http); + $notifs = $client->account->calls->get('CA123')->notifications; + $this->assertEquals('Foo', $notifs->get('NO123')->message_text); + } + + function testGetIteratorUsesFilters() { + $params = array_merge($this->pagingParams, array( + 'StartTime>' => '2012-07-06', + )); + $response = array( + 'total' => 1, + 'calls' => array(array('status' => 'Completed', 'sid' => 'CA123')) + ); + $http = $this->createMockHttp('/Calls', 'get', $response, $params); + $client = $this->getClient($http); + + $iterator = $client->account->calls->getIterator( + 0, 10, array('StartTime>' => '2012-07-06')); + foreach ($iterator as $call) { + $this->assertEquals('Completed', $call->status); + break; + } + } + + function testListResource() { + $response = array( + 'total' => 1, + 'calls' => array(array('status' => 'completed', 'sid' => 'CA123')) + ); + $http = $this->createMockHttp('/Calls', 'get', $response, + $this->pagingParams); + $client = $this->getClient($http); + + $page = $client->account->calls->getPage(0, 10); + $call = current($page->getItems()); + $this->assertEquals('completed', $call->status); + $this->assertEquals(1, $page->total); + } + + function testInstanceResourceUriConstructionFromList() { + $response = array( + 'total' => 1, + 'calls' => array(array( + 'status' => 'in-progress', + 'sid' => 'CA123', + 'uri' => 'junk_uri' + )) + ); + $http = $this->createMockHttp('/Calls', 'get', $response, + $this->pagingParams); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Calls/CA123.json') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array( + 'status' => 'completed' + )) + )); + $client = $this->getClient($http); + $page = $client->account->calls->getPage(0, 10); + $call = current($page->getItems()); + + /* trigger api fetch by trying to retrieve nonexistent var */ + try { + $call->nonexistent; + } catch (Exception $e) { + // pass + } + $this->assertSame($call->status, 'completed'); + } + + function testInstanceResourceUriConstructionFromGet() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/IncomingPhoneNumbers/PN123.json') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array( + 'sms_method' => 'POST', + 'sid' => 'PN123', + 'uri' => 'junk_uri', + )) + )); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/IncomingPhoneNumbers/PN123.json', + $this->formHeaders, 'SmsMethod=GET') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array( + 'sms_method' => 'GET', + 'sid' => 'PN123', + 'uri' => 'junk_uri' + )) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $number = $client->account->incoming_phone_numbers->get('PN123'); + $this->assertSame($number->sms_method, 'POST'); + + $number->update(array('SmsMethod' => 'GET')); + $this->assertSame($number->sms_method, 'GET'); + } + + function testIterateOverPage() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Calls.json?Page=0&PageSize=10') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array( + 'total' => 1, + 'calls' => array(array('status' => 'Completed', 'sid' => 'CA123')) + )) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $page = $client->account->calls->getPage(0, 10); + foreach ($page->getIterator() as $pageitems) { + $this->assertSame('CA123', $pageitems->sid); + } + } + + function testAsymmetricallyNamedResources() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/SMS/Messages.json?Page=0&PageSize=10') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('sms_messages' => array( + array('status' => 'sent', 'sid' => 'SM123') + ))) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $sms = current($client->account->sms_messages->getPage(0, 10)->getItems()); + $this->assertEquals('sent', $sms->status); + } + + function testParams() { + $http = m::mock(new Services_Twilio_TinyHttp); + $qs = 'Page=0&PageSize=10&FriendlyName=foo&Status=active'; + $http->shouldReceive('get') + ->with('/2010-04-01/Accounts.json?' . $qs) + ->andReturn(array( + 200, + array('Content-Type' => 'application/json'), + '{"accounts":[]}' + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $client->accounts->getPage(0, 10, array( + 'FriendlyName' => 'foo', + 'Status' => 'active', + )); + } + + function testUpdate() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('post')->once()->with( + '/2010-04-01/Accounts/AC123/Calls.json', $this->formHeaders, + http_build_query($this->callParams) + )->andReturn( + array(200, array('Content-Type' => 'application/json'), + '{"sid":"CA123"}') + ); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $client->account->calls->create('123', '123', 'http://example.com'); + } + + function testModifyLiveCall() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('post')->once()->with( + '/2010-04-01/Accounts/AC123/Calls.json', $this->formHeaders, + http_build_query($this->callParams) + )->andReturn( + array(200, array('Content-Type' => 'application/json'), + '{"sid":"CA123"}') + ); + $http->shouldReceive('post')->once()->with( + '/2010-04-01/Accounts/AC123/Calls/CA123.json', + $this->formHeaders, + 'Status=completed' + )->andReturn( + array(200, array('Content-Type' => 'application/json'), + '{"sid":"CA123"}' + ) + ); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $calls = $client->account->calls; + $call = $calls->create('123', '123', 'http://example.com'); + $call->hangup(); + } + + function testUnmute() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->once() + ->with( + '/2010-04-01/Accounts/AC123/Conferences/CF123/Participants.json?Page=0&PageSize=10') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array( + 'participants' => array(array('call_sid' => 'CA123')) + )) + )); + $http->shouldReceive('post')->once() + ->with( + '/2010-04-01/Accounts/AC123/Conferences/CF123/Participants/CA123.json', + $this->formHeaders, + 'Muted=true' + )->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array()) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $conf = $client->account->conferences->get('CF123'); + $page = $conf->participants->getPage(0, 10); + foreach ($page->getItems() as $participant) { + $participant->mute(); + } + } + + function testResourcePropertiesReflectUpdates() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123.json') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('friendly_name' => 'foo')) + )); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123.json', $this->formHeaders, 'FriendlyName=bar') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('friendly_name' => 'bar')) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $this->assertEquals('foo', $client->account->friendly_name); + $client->account->update('FriendlyName', 'bar'); + $this->assertEquals('bar', $client->account->friendly_name); + } + + //function testAccessingNonExistentPropertiesErrorsOut + + function testArrayAccessForListResources() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Calls.json?Page=0&PageSize=50') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array( + 'calls' => array(array('sid' => 'CA123')) + )) + )); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Calls.json?Page=1&PageSize=50') + ->andReturn(array(400, array('Content-Type' => 'application/json'), + '{"status":400,"message":"foo", "code": "20006"}' + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + foreach ($client->account->calls as $call) { + $this->assertEquals('CA123', $call->sid); + } + $this->assertInstanceOf('Traversable', $client->account->calls); + } + + function testDeepPagingUsesAfterSid() { + $http = m::mock(new Services_Twilio_TinyHttp); + $callsBase = '/2010-04-01/Accounts/AC123/Calls.json'; + $firstPageUri = $callsBase . '?Page=0&PageSize=1'; + $afterSidUri = $callsBase . '?Page=1&PageSize=1&AfterSid=CA123'; + $secondAfterSidUri = $callsBase . '?Page=2&PageSize=1&AfterSid=CA456'; + $http->shouldReceive('get')->once() + ->with($firstPageUri) + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array( + 'next_page_uri' => $afterSidUri, + 'calls' => array(array( + 'sid' => 'CA123', + 'price' => '-0.02000', + )) + )) + )); + $http->shouldReceive('get')->once() + ->with($afterSidUri) + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array( + 'next_page_uri' => $secondAfterSidUri, + 'calls' => array(array( + 'sid' => 'CA456', + 'price' => '-0.02000', + )) + )) + )); + $http->shouldReceive('get')->once() + ->with($secondAfterSidUri) + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array( + 'next_page_uri' => null, + 'calls' => array(array( + 'sid' => 'CA789', + 'price' => '-0.02000', + )) + )) + )); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Calls.json?Page=3&PageSize=1') + ->andReturn(array(400, array('Content-Type' => 'application/json'), + '{"status":400,"message":"foo", "code": "20006"}' + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + foreach ($client->account->calls->getIterator(0, 1) as $call) { + $this->assertSame($call->price, '-0.02000'); + } + } + + function testIteratorWithFiltersPagesCorrectly() { + $http = m::mock(new Services_Twilio_TinyHttp); + $recordingsBase = '/2010-04-01/Accounts/AC123/Recordings.json'; + $firstPageUri = $recordingsBase . '?Page=0&PageSize=1&DateCreated%3E=2011-01-01'; + $secondPageUri = $recordingsBase . '?DateCreated%3E=2011-01-01&Page=1&PageSize=1'; + $thirdPageUri = $recordingsBase . '?DateCreated%3E=2011-01-01&Page=2&PageSize=1'; + $http->shouldReceive('get')->once() + ->with($firstPageUri) + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array( + 'next_page_uri' => $secondPageUri, + 'recordings' => array(array( + 'sid' => 'RE123', + 'duration' => 7, + )) + )) + )); + $http->shouldReceive('get')->once() + ->with($secondPageUri) + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array( + 'next_page_uri' => $thirdPageUri, + 'recordings' => array(array( + 'sid' => 'RE123', + 'duration' => 7, + )) + )) + )); + $http->shouldReceive('get')->once() + ->with($thirdPageUri) + ->andReturn(array(400, array('Content-Type' => 'application/json'), + '{"status":400,"message":"foo", "code": "20006"}' + )); + + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + foreach ($client->account->recordings->getIterator(0, 1, array('DateCreated>' => '2011-01-01')) as $recording) { + $this->assertSame($recording->duration, 7); + } + } + + function testRetryOn500() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/SMS/Messages/SM123.json') + ->andReturn($this->nginxError); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/SMS/Messages/SM123.json') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('price' => 0.5)) + ) + ); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $message = $client->account->sms_messages->get('SM123'); + $this->assertSame($message->price, 0.5); + } + + function testDeleteOn500() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('delete')->once() + ->with('/2010-04-01/Accounts/AC123/SMS/Messages/SM123.json') + ->andReturn($this->nginxError); + $http->shouldReceive('delete')->once() + ->with('/2010-04-01/Accounts/AC123/SMS/Messages/SM123.json') + ->andReturn( + array(204, array('Content-Type' => 'application/json'), '') + ); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $client->account->sms_messages->delete('SM123'); + } + + function testSetExplicitRetryLimit() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/SMS/Messages/SM123.json') + ->andReturn($this->nginxError); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/SMS/Messages/SM123.json') + ->andReturn($this->nginxError); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/SMS/Messages/SM123.json') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('price' => 0.5)) + ) + ); + // retry twice + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http, 2); + $message = $client->account->sms_messages->get('SM123'); + $this->assertSame($message->price, 0.5); + } + + function testRetryLimitIsHonored() { + $this->setExpectedException('Services_Twilio_RestException'); + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/SMS/Messages/SM123.json') + ->andReturn($this->nginxError); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/SMS/Messages/SM123.json') + ->andReturn($this->nginxError); + $http->shouldReceive('get')->never() + ->with('/2010-04-01/Accounts/AC123/SMS/Messages/SM123.json') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('price' => 0.5)) + ) + ); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $message = $client->account->sms_messages->get('SM123'); + $this->assertSame($message->price, 0.5); + } + + function testRetryIdempotentFunctionsOnly() { + $this->setExpectedException('Services_Twilio_RestException'); + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/SMS/Messages.json', $this->formHeaders, + 'From=%2B14105551234&To=%2B14102221234&Body=bar') + ->andReturn($this->nginxError); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $message = $client->account->sms_messages->create('+14105551234', + '+14102221234', 'bar'); + } + + function testExceptionUsesHttpStatus() { + $http = $this->createMockHttp('/Queues/QU123/Members/Front', 'post', + array(), array('Url' => 'http://google.com'), 400); + $client = $this->getClient($http); + try { + $front = $client->account->queues->get('QU123')->members->front(); + $front->update(array('Url' => 'http://google.com')); + $this->fail('should throw rest exception before reaching this line.'); + } catch (Services_Twilio_RestException $e) { + $this->assertSame($e->getStatus(), 400); + $this->assertSame($e->getMessage(), ''); + } + } + + function testUnicode() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/SMS/Messages.json', $this->formHeaders, + 'From=123&To=123&Body=Hello+%E2%98%BA') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('sid' => 'SM123')) + ) + ); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $message = $client->account->sms_messages->create('123', '123', + 'Hello ☺'); + $this->assertSame($message->sid, 'SM123'); + } + + function testCount() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Calls.json?Page=0&PageSize=1') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array( + 'total' => '1474', + 'calls' => array(), + )) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $this->assertSame(count($client->account->calls), 1474); + } + + function testCountNoTotal() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Calls.json?Page=0&PageSize=1') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array( + 'calls' => array(), + )) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $this->assertSame(count($client->account->calls), 0); + } + + function testPostMultivaluedForm() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/Messages.json', $this->formHeaders, + 'From=123&To=123&MediaUrl=http%3A%2F%2Fexample.com%2Fimage1&MediaUrl=http%3A%2F%2Fexample.com%2Fimage2') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('sid' => 'SM123')) + ) + ); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $message = $client->account->messages->sendMessage('123', '123', null, + array('http://example.com/image1', 'http://example.com/image2') + ); + $this->assertSame($message->sid, 'SM123'); + } + + function testToString() { + $http = m::mock(new Services_Twilio_TinyHttp); + $resp = <<assertSame((string)$sampleMessage, $expected); + } + + function testSubresourceUris() { + $http = m::mock(new Services_Twilio_TinyHttp); + $call = new Services_Twilio_Rest_Call($http, '/foo'); + $recordings = $call->subresources['recordings']; + $this->assertSame($recordings->uri, '/foo/Recordings'); + } +} diff --git a/externals/twilio-php/tests/TwimlTest.php b/externals/twilio-php/tests/TwimlTest.php new file mode 100755 index 0000000000..d606bf706f --- /dev/null +++ b/externals/twilio-php/tests/TwimlTest.php @@ -0,0 +1,377 @@ +'; + $this->assertXmlStringEqualsXmlString($expected, $r, + "Should be an empty response"); + } + + public function testSayBasic() { + $r = new Services_Twilio_Twiml(); + $r->say("Hello Monkey"); + $expected = 'Hello Monkey'; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testSayLoopThree() { + $r = new Services_Twilio_Twiml(); + $r->say("Hello Monkey", array("loop" => 3)); + $expected = 'Hello Monkey'; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testSayLoopThreeWoman() { + $r = new Services_Twilio_Twiml(); + $r->say("Hello Monkey", array("loop" => 3, "voice"=>"woman")); + $expected = '' + . 'Hello Monkey'; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testSayConvienceMethod() { + $r = new Services_Twilio_Twiml(); + $r->say("Hello Monkey", array("language" => "fr")); + $expected = '' + . 'Hello Monkey'; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testSayUTF8() { + $r = new Services_Twilio_Twiml(); + $r->say("é tü & må"); + $expected = '' + . 'é tü & må'; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testSayNamedEntities() { + $r = new Services_Twilio_Twiml(); + $r->say("é tü & må"); + $expected = '' + . 'é tü & må'; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testSayNumericEntities() { + $r = new Services_Twilio_Twiml(); + $r->say("é tü & må"); + $expected = '' + . 'é tü & må'; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testPlayBasic() { + $r = new Services_Twilio_Twiml(); + $r->play("hello-monkey.mp3"); + $expected = 'hello-monkey.mp3'; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testPlayLoopThree() { + $r = new Services_Twilio_Twiml(); + $r->play("hello-monkey.mp3", array("loop" => 3)); + $expected = '' + . 'hello-monkey.mp3'; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testPlayConvienceMethod() { + $r = new Services_Twilio_Twiml(); + $r->play("hello-monkey.mp3", array("loop" => 3)); + $expected = '' + . 'hello-monkey.mp3'; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + //Test Record Verb + public function testRecord() { + $r = new Services_Twilio_Twiml(); + $r->record(); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testRecordActionMethod() { + $r = new Services_Twilio_Twiml(); + $r->record(array("action" => "example.com", "method" => "GET")); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testBooleanBecomesString() { + $r = new Services_Twilio_Twiml(); + $r->record(array("transcribe" => true)); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testRecordMaxLengthKeyTimeout(){ + $r = new Services_Twilio_Twiml(); + $r->record(array("timeout" => 4, "finishOnKey" => "#", + "maxLength" => 30)); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testRecordConvienceMethod(){ + $r = new Services_Twilio_Twiml(); + $r->record(array("transcribeCallback" => "example.com")); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testRecordAddAttribute(){ + $r = new Services_Twilio_Twiml(); + $r->record(array("foo" => "bar")); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + //Test Redirect Verb + public function testRedirect() { + $r = new Services_Twilio_Twiml(); + $r->redirect(); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testAmpersandEscaping() { + $r = new Services_Twilio_Twiml(); + $test_amp = "test&two&three"; + $r->redirect($test_amp); + $expected = '' . + 'test&two&three'; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testRedirectConvience() { + $r = new Services_Twilio_Twiml(); + $r->redirect(); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + public function testRedirectAddAttribute(){ + $r = new Services_Twilio_Twiml(); + $r->redirect(array("foo" => "bar")); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + //Test Hangup Verb + public function testHangup() { + $r = new Services_Twilio_Twiml(); + $r->hangup(); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testHangupConvience() { + $r = new Services_Twilio_Twiml(); + $r->hangup(); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testHangupAddAttribute(){ + $r = new Services_Twilio_Twiml(); + $r->hangup(array("foo" => "bar")); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + //Test Pause Verb + public function testPause() { + $r = new Services_Twilio_Twiml(); + $r->pause(); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testPauseConvience() { + $r = new Services_Twilio_Twiml(); + $r->pause(); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testPauseAddAttribute(){ + $r = new Services_Twilio_Twiml(); + $r->pause(array("foo" => "bar")); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + //Test Dial Verb + public function testDial() { + $r = new Services_Twilio_Twiml(); + $r->dial("1231231234"); + $expected = '1231231234'; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testDialConvience() { + $r = new Services_Twilio_Twiml(); + $r->dial(); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testDialAddNumber() { + $r = new Services_Twilio_Twiml(); + $d = $r->dial(); + $d->number("1231231234"); + $expected = '' + . '1231231234'; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testDialAddConference() { + $r = new Services_Twilio_Twiml(); + $d = $r->dial(); + $d->conference("MyRoom"); + $expected = '' + . 'MyRoom'; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testDialAddConferenceConvience() { + $r = new Services_Twilio_Twiml(); + $d = $r->dial(); + $d->conference("MyRoom", array("startConferenceOnEnter" => "false")); + $expected = 'MyRoom'; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testDialAddAttribute() { + $r = new Services_Twilio_Twiml(); + $r->dial(array("foo" => "bar")); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + //Test Gather Verb + public function testGather() { + $r = new Services_Twilio_Twiml(); + $r->gather(); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testGatherMethodAction(){ + $r = new Services_Twilio_Twiml(); + $r->gather(array("action"=>"example.com", "method"=>"GET")); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testGatherActionWithParams(){ + $r = new Services_Twilio_Twiml(); + $r->gather(array("action" => "record.php?action=recordPageNow" + . "&id=4&page=3")); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testGatherNestedVerbs(){ + $r = new Services_Twilio_Twiml(); + $g = $r->gather(array("action"=>"example.com", "method"=>"GET")); + $g->say("Hello World"); + $g->play("helloworld.mp3"); + $g->pause(); + $expected = ' + + + Hello World + helloworld.mp3 + + + '; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testGatherNestedVerbsConvienceMethods(){ + $r = new Services_Twilio_Twiml(); + $g = $r->gather(array("action"=>"example.com", "method"=>"GET")); + $g->say("Hello World"); + $g->play("helloworld.mp3"); + $g->pause(); + $expected = ' + + + Hello World + helloworld.mp3 + + + '; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testGatherAddAttribute(){ + $r = new Services_Twilio_Twiml(); + $r->gather(array("foo" => "bar")); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testSms() { + $r = new Services_Twilio_Twiml(); + $r->sms("Hello World"); + $expected = 'Hello World'; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testSmsConvience() { + $r = new Services_Twilio_Twiml(); + $r->sms("Hello World"); + $expected = 'Hello World'; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testSmsAddAttribute() { + $r = new Services_Twilio_Twiml(); + $r->sms(array("foo" => "bar")); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + public function testReject() { + $r = new Services_Twilio_Twiml(); + $r->reject(); + $expected = ''; + $this->assertXmlStringEqualsXmlString($expected, $r); + } + + function testGeneration() { + + $r = new Services_Twilio_Twiml(); + $r->say('hello'); + $r->dial()->number('123', array('sendDigits' => '456')); + $r->gather(array('timeout' => 15)); + + $doc = simplexml_load_string($r); + $this->assertEquals('Response', $doc->getName()); + $this->assertEquals('hello', (string) $doc->Say); + $this->assertEquals('456', (string) $doc->Dial->Number['sendDigits']); + $this->assertEquals('123', (string) $doc->Dial->Number); + $this->assertEquals('15', (string) $doc->Gather['timeout']); + } + +} diff --git a/externals/twilio-php/tests/phpunit.xml b/externals/twilio-php/tests/phpunit.xml new file mode 100755 index 0000000000..ebfe3cf513 --- /dev/null +++ b/externals/twilio-php/tests/phpunit.xml @@ -0,0 +1,7 @@ + + + + ./ + + + diff --git a/externals/twilio-php/tests/resources/AccountsTest.php b/externals/twilio-php/tests/resources/AccountsTest.php new file mode 100755 index 0000000000..65f9b83fd9 --- /dev/null +++ b/externals/twilio-php/tests/resources/AccountsTest.php @@ -0,0 +1,29 @@ + 'application/x-www-form-urlencoded'); + function testPost() + { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts.json', + $this->formHeaders, 'FriendlyName=foo') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('sid' => 'AC345')) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $account = $client->accounts->create(array( + 'FriendlyName' => 'foo', + )); + $this->assertEquals('AC345', $account->sid); + } + + function tearDown() + { + m::close(); + } +} + diff --git a/externals/twilio-php/tests/resources/ApplicationsTest.php b/externals/twilio-php/tests/resources/ApplicationsTest.php new file mode 100755 index 0000000000..ff87675a7d --- /dev/null +++ b/externals/twilio-php/tests/resources/ApplicationsTest.php @@ -0,0 +1,28 @@ + 'application/x-www-form-urlencoded'); + function testPost() + { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/Applications.json', + $this->formHeaders, 'FriendlyName=foo&VoiceUrl=bar') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('sid' => 'AP123')) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $app = $client->account->applications->create('foo', array( + 'VoiceUrl' => 'bar', + )); + $this->assertEquals('AP123', $app->sid); + } + + function tearDown() + { + m::close(); + } +} + diff --git a/externals/twilio-php/tests/resources/AvailablePhoneNumbersTest.php b/externals/twilio-php/tests/resources/AvailablePhoneNumbersTest.php new file mode 100755 index 0000000000..441f46bb50 --- /dev/null +++ b/externals/twilio-php/tests/resources/AvailablePhoneNumbersTest.php @@ -0,0 +1,57 @@ +shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/AvailablePhoneNumbers/US/Local.json?AreaCode=510') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('available_phone_numbers' => array( + 'friendly_name' => '(510) 564-7903' + ))) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $nums = $client->account->available_phone_numbers->getLocal('US'); + $numsList = $nums->getList(array('AreaCode' => '510')); + foreach ($numsList as $num) { + $this->assertEquals('(510) 564-7903', $num->friendly_name); + } + } + + function testPagePhoneNumberResource() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/AvailablePhoneNumbers.json?Page=0&PageSize=50') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array( + 'total' => 1, + 'countries' => array(array('country_code' => 'CA')) + )) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $page = $client->account->available_phone_numbers->getPage('0'); + $this->assertEquals('CA', $page->countries[0]->country_code); + } + + function testGetMobile() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/AvailablePhoneNumbers/GB/Mobile.json') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('available_phone_numbers' => array( + 'friendly_name' => '(510) 564-7903' + ))) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $nums = $client->account->available_phone_numbers->getMobile('GB')->getList(); + foreach ($nums as $num) { + $this->assertEquals('(510) 564-7903', $num->friendly_name); + } + } + + function tearDown() { + m::close(); + } +} diff --git a/externals/twilio-php/tests/resources/CallsTest.php b/externals/twilio-php/tests/resources/CallsTest.php new file mode 100755 index 0000000000..3759cf4151 --- /dev/null +++ b/externals/twilio-php/tests/resources/CallsTest.php @@ -0,0 +1,25 @@ +assertEquals($expected, $result); + } + + function sidProvider() + { + return array( + array("AP2a0747eba6abf96b7e3c3ff0b4530f6e", true), + array("CA2a0747eba6abf96b7e3c3ff0b4530f6e", false), + array("AP2a0747eba6abf96b7e3c3ff0b4530f", false), + array("http://www.google.com/asdfasdfAP", false), + ); + } +} + diff --git a/externals/twilio-php/tests/resources/ConnectAppsTest.php b/externals/twilio-php/tests/resources/ConnectAppsTest.php new file mode 100755 index 0000000000..7cda220674 --- /dev/null +++ b/externals/twilio-php/tests/resources/ConnectAppsTest.php @@ -0,0 +1,54 @@ +shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/ConnectApps/CN123.json') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('friendly_name' => 'foo')) + )); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/ConnectApps/CN123.json', + array('Content-Type' => 'application/x-www-form-urlencoded'), + 'FriendlyName=Bar') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('friendly_name' => 'Bar')) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $cn = $client->account->connect_apps->get('CN123'); + $this->assertEquals('foo', $cn->friendly_name); + $cn->update(array('FriendlyName' => 'Bar')); + $this->assertEquals('Bar', $cn->friendly_name); + } + + function testUpdateWithOneParam() + { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/ConnectApps/CN123.json') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('friendly_name' => 'foo')) + )); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/ConnectApps/CN123.json', + array('Content-Type' => 'application/x-www-form-urlencoded'), + 'FriendlyName=Bar') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('friendly_name' => 'Bar')) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $cn = $client->account->connect_apps->get('CN123'); + $this->assertEquals('foo', $cn->friendly_name); + $cn->update('FriendlyName', 'Bar'); + $this->assertEquals('Bar', $cn->friendly_name); + } + + function tearDown() + { + m::close(); + } +} diff --git a/externals/twilio-php/tests/resources/IncomingPhoneNumbersTest.php b/externals/twilio-php/tests/resources/IncomingPhoneNumbersTest.php new file mode 100755 index 0000000000..3d3ebb4668 --- /dev/null +++ b/externals/twilio-php/tests/resources/IncomingPhoneNumbersTest.php @@ -0,0 +1,104 @@ + array( + array( + 'sid' => 'PN123', + 'sms_fallback_method' => 'POST', + 'voice_method' => 'POST', + 'friendly_name' => '(510) 564-7903', + ) + ), + ); + + function testGetNumberWithResult() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/IncomingPhoneNumbers.json?Page=0&PageSize=1&PhoneNumber=%2B14105551234') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode($this->apiResponse) + ) + ); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $number = $client->account->incoming_phone_numbers->getNumber('+14105551234'); + $this->assertEquals('PN123', $number->sid); + } + + function testGetNumberNoResults() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/IncomingPhoneNumbers.json?Page=0&PageSize=1&PhoneNumber=%2B14105551234') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array( + 'incoming_phone_numbers' => array(), + 'page' => 0, + 'page_size' => 1, + )) + ) + ); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $number = $client->account->incoming_phone_numbers->getNumber('+14105551234'); + $this->assertNull($number); + } + + function testGetMobile() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/IncomingPhoneNumbers/Mobile.json?Page=0&PageSize=50') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode($this->apiResponse) + )); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/IncomingPhoneNumbers/Mobile.json?Page=1&PageSize=50') + ->andReturn(array(400, array('Content-Type' => 'application/json'), + '{"status":400,"message":"foo", "code": "20006"}' + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + foreach ($client->account->incoming_phone_numbers->mobile as $num) { + $this->assertEquals('(510) 564-7903', $num->friendly_name); + } + } + + function testGetLocal() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/IncomingPhoneNumbers/Local.json?Page=0&PageSize=50') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode($this->apiResponse) + )); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/IncomingPhoneNumbers/Local.json?Page=1&PageSize=50') + ->andReturn(array(400, array('Content-Type' => 'application/json'), + '{"status":400,"message":"foo", "code": "20006"}' + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + + foreach ($client->account->incoming_phone_numbers->local as $num) { + $this->assertEquals('(510) 564-7903', $num->friendly_name); + } + } + + function testGetTollFree() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/IncomingPhoneNumbers/TollFree.json?Page=0&PageSize=50') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode($this->apiResponse) + )); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/IncomingPhoneNumbers/TollFree.json?Page=1&PageSize=50') + ->andReturn(array(400, array('Content-Type' => 'application/json'), + '{"status":400,"message":"foo", "code": "20006"}' + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + foreach ($client->account->incoming_phone_numbers->toll_free as $num) { + $this->assertEquals('(510) 564-7903', $num->friendly_name); + } + } + +} + diff --git a/externals/twilio-php/tests/resources/MediaTest.php b/externals/twilio-php/tests/resources/MediaTest.php new file mode 100755 index 0000000000..b8edc4f1bf --- /dev/null +++ b/externals/twilio-php/tests/resources/MediaTest.php @@ -0,0 +1,28 @@ +shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Messages/MM123/Media.json?Page=0&PageSize=50') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array( + 'end' => '0', + 'total' => '2', + 'media_list' => array( + array('sid' => 'ME123'), + array('sid' => 'ME456') + ), + 'next_page_uri' => 'null', + 'start' => 0 + )) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $media_list = $client->account->messages->get('MM123')->media->getPage()->getItems(); + $this->assertEquals(count($media_list), 2); + } + +} diff --git a/externals/twilio-php/tests/resources/MembersTest.php b/externals/twilio-php/tests/resources/MembersTest.php new file mode 100755 index 0000000000..45711cee3c --- /dev/null +++ b/externals/twilio-php/tests/resources/MembersTest.php @@ -0,0 +1,83 @@ + 'application/x-www-form-urlencoded'); + + function testFront() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Queues/QQ123/Members/Front.json') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('call_sid' => 'CA123', 'position' => 0)) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $queue = $client->account->queues->get('QQ123'); + $firstMember = $queue->members->front(); + $this->assertSame($firstMember->call_sid, 'CA123'); + } + + function testDequeueFront() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/Queues/QQ123/Members/Front.json', + $this->formHeaders, 'Url=http%3A%2F%2Ffoo.com&Method=POST') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('call_sid' => 'CA123', 'position' => 0)) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $queue = $client->account->queues->get('QQ123'); + $firstMember = $queue->members->front(); + $firstMember->dequeue('http://foo.com'); + } + + function testDequeueSid() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/Queues/QQ123/Members/CA123.json', + $this->formHeaders, 'Url=http%3A%2F%2Ffoo.com&Method=GET') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('call_sid' => 'CA123', 'position' => 0)) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $queue = $client->account->queues->get('QQ123'); + $firstMember = $queue->members->get('CA123'); + $firstMember->dequeue('http://foo.com', 'GET'); + } + + function testMemberIterate() { + $http = m::mock(new Services_Twilio_TinyHttp); + $resp = json_encode( + array( + 'queue_members' => array( + array('call_sid' => 'CA123', 'wait_time' => 30) + ), + 'end' => 1, + ) + ); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Queues/QQ123/Members.json?Page=0&PageSize=50') + ->andReturn(array(200, array('Content-Type' => 'application/json'), $resp + )); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Queues/QQ123/Members.json?Page=1&PageSize=50') + ->andReturn(array(400, array('Content-Type' => 'application/json'), + '{"status":400,"message":"foo", "code": "20006"}' + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $queue = $client->account->queues->get('QQ123'); + foreach($queue->members as $member) { + $this->assertSame($member->call_sid, 'CA123'); + $this->assertSame($member->wait_time, 30); + } + } + + function tearDown() { + m::close(); + } + +} + + diff --git a/externals/twilio-php/tests/resources/MessagesTest.php b/externals/twilio-php/tests/resources/MessagesTest.php new file mode 100755 index 0000000000..c697a52763 --- /dev/null +++ b/externals/twilio-php/tests/resources/MessagesTest.php @@ -0,0 +1,123 @@ + 'application/x-www-form-urlencoded'); + + function testCreateMessage() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/Messages.json', $this->formHeaders, + 'From=%2B1222&To=%2B44123&Body=Hi+there') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('sid' => 'SM123')) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $msg = $client->account->messages->sendMessage('+1222', '+44123', 'Hi there'); + $this->assertSame('SM123', $msg->sid); + } + + function testCreateMessageWithMedia() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/Messages.json', $this->formHeaders, + 'From=%2B1222&To=%2B44123&MediaUrl=http%3A%2F%2Fexample.com%2Fimage1') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('sid' => 'SM123')) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $msg = $client->account->messages->sendMessage('+1222', '+44123', null, + array('http://example.com/image1')); + $this->assertSame('SM123', $msg->sid); + } + + function testCreateMessageWithMediaAndBody() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/Messages.json', $this->formHeaders, + 'From=%2B1222&To=%2B44123&MediaUrl=http%3A%2F%2Fexample.com%2Fimage1&Body=Hi+there') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('sid' => 'SM123')) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $msg = $client->account->messages->sendMessage('+1222', '+44123', 'Hi there', + array('http://example.com/image1') + ); + $this->assertSame('SM123', $msg->sid); + } + + function testCreateMessageWithMultipleMedia() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/Messages.json', $this->formHeaders, + 'From=%2B1222&To=%2B44123&MediaUrl=http%3A%2F%2Fexample.com%2Fimage1&MediaUrl=http%3A%2F%2Fexample.com%2Fimage2') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('sid' => 'SM123')) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $msg = $client->account->messages->sendMessage('+1222', '+44123', null, + array('http://example.com/image1', 'http://example.com/image2')); + $this->assertSame('SM123', $msg->sid); + } + + function testBadMessageThrowsException() { + $this->setExpectedException('Services_Twilio_RestException'); + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/Messages.json', $this->formHeaders, + 'From=%2B1222&To=%2B44123&Body=' . str_repeat('hi', 801)) + ->andReturn(array(400, array('Content-Type' => 'application/json'), + json_encode(array( + 'status' => '400', + 'message' => 'Too long', + )) + )); + $client = new Services_Twilio('AC123', '123', null, $http); + $msg = $client->account->messages->sendMessage('+1222', '+44123', str_repeat('hi', 801)); + } + + function testRawCreate() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/Messages.json', $this->formHeaders, + 'From=%2B1222&To=%2B44123&MediaUrl=http%3A%2F%2Fexample.com%2Fimage1&MediaUrl=http%3A%2F%2Fexample.com%2Fimage2') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('sid' => 'SM123')) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $msg = $client->account->messages->create(array( + 'From' => '+1222', + 'To' => '+44123', + 'MediaUrl' => array('http://example.com/image1', 'http://example.com/image2') + )); + $this->assertSame('SM123', $msg->sid); + } + + function testDeleteMessage() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('delete')->once() + ->with('/2010-04-01/Accounts/AC123/Messages/ME123.json') + ->andReturn(array(204, array('Content-Type' => 'application/json'), '' + )); + $client = new Services_Twilio('AC123', '123', null, $http); + $client->account->messages->delete('ME123'); + } + + function testNewline() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/Messages.json', $this->formHeaders, + 'Body=Hello%0A%0AHello') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('sid' => 'SM123')) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $msg = $client->account->messages->create(array( + 'Body' => "Hello\n\nHello" + )); + $this->assertSame('SM123', $msg->sid); + } +} + diff --git a/externals/twilio-php/tests/resources/NotificationTest.php b/externals/twilio-php/tests/resources/NotificationTest.php new file mode 100755 index 0000000000..704230e6ff --- /dev/null +++ b/externals/twilio-php/tests/resources/NotificationTest.php @@ -0,0 +1,20 @@ +shouldReceive('delete')->once() + ->with('/2010-04-01/Accounts/AC123/Notifications/NO123.json') + ->andReturn(array(204, array(), '')); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $client->account->notifications->delete('NO123'); + } + + function tearDown() + { + m::close(); + } +} + diff --git a/externals/twilio-php/tests/resources/OutgoingCallerIdsTest.php b/externals/twilio-php/tests/resources/OutgoingCallerIdsTest.php new file mode 100755 index 0000000000..65d1ecd5be --- /dev/null +++ b/externals/twilio-php/tests/resources/OutgoingCallerIdsTest.php @@ -0,0 +1,30 @@ + 'application/x-www-form-urlencoded'); + function testPost() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/OutgoingCallerIds.json', + $this->formHeaders, 'PhoneNumber=%2B14158675309&FriendlyName=My+Home+Phone+Number') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array( + 'account_sid' => 'AC123', + 'phone_number' => '+14158675309', + 'friendly_name' => 'My Home Phone Number', + 'validation_code' => 123456, + )) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $request = $client->account->outgoing_caller_ids->create('+14158675309', array( + 'FriendlyName' => 'My Home Phone Number', + )); + $this->assertEquals(123456, $request->validation_code); + } + + function tearDown() { + m::close(); + } +} diff --git a/externals/twilio-php/tests/resources/QueuesTest.php b/externals/twilio-php/tests/resources/QueuesTest.php new file mode 100755 index 0000000000..282a142d2f --- /dev/null +++ b/externals/twilio-php/tests/resources/QueuesTest.php @@ -0,0 +1,28 @@ + 'application/x-www-form-urlencoded'); + + function testCreate() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/Queues.json', $this->formHeaders, + 'FriendlyName=foo&MaxSize=123') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('sid' => 'QQ123', 'average_wait_time' => 0)) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $queue = $client->account->queues->create('foo', + array('MaxSize' => 123)); + $this->assertSame($queue->sid, 'QQ123'); + $this->assertSame($queue->average_wait_time, 0); + } + + function tearDown() { + m::close(); + } +} + diff --git a/externals/twilio-php/tests/resources/SMSMessagesTest.php b/externals/twilio-php/tests/resources/SMSMessagesTest.php new file mode 100755 index 0000000000..afe5b6c6dd --- /dev/null +++ b/externals/twilio-php/tests/resources/SMSMessagesTest.php @@ -0,0 +1,38 @@ + 'application/x-www-form-urlencoded'); + + function testCreateMessage() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/SMS/Messages.json', $this->formHeaders, + 'From=%2B1222&To=%2B44123&Body=Hi+there') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('sid' => 'SM123')) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $sms = $client->account->sms_messages->create('+1222', '+44123', 'Hi there'); + $this->assertSame('SM123', $sms->sid); + } + + function testBadMessageThrowsException() { + $this->setExpectedException('Services_Twilio_RestException'); + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/SMS/Messages.json', $this->formHeaders, + 'From=%2B1222&To=%2B44123&Body=' . str_repeat('hi', 81)) + ->andReturn(array(400, array('Content-Type' => 'application/json'), + json_encode(array( + 'status' => '400', + 'message' => 'Too long', + )) + )); + $client = new Services_Twilio('AC123', '123', null, $http); + $sms = $client->account->sms_messages->create('+1222', '+44123', + str_repeat('hi', 81)); + } +} + diff --git a/externals/twilio-php/tests/resources/SandboxTest.php b/externals/twilio-php/tests/resources/SandboxTest.php new file mode 100755 index 0000000000..4d6623f928 --- /dev/null +++ b/externals/twilio-php/tests/resources/SandboxTest.php @@ -0,0 +1,23 @@ + 'application/x-www-form-urlencoded'); + function testUpdateVoiceUrl() + { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/Sandbox.json', $this->formHeaders, 'VoiceUrl=foo') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('voice_url' => 'foo')) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $client->account->sandbox->update('VoiceUrl', 'foo'); + $this->assertEquals('foo', $client->account->sandbox->voice_url); + } + + function tearDown() { + m::close(); + } +} diff --git a/externals/twilio-php/tests/resources/ShortCodesTest.php b/externals/twilio-php/tests/resources/ShortCodesTest.php new file mode 100755 index 0000000000..aee9e40e2d --- /dev/null +++ b/externals/twilio-php/tests/resources/ShortCodesTest.php @@ -0,0 +1,19 @@ +shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/SMS/ShortCodes/SC123.json') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('sid' => 'SC123', 'short_code' => '1234')) + )); + $client = new Services_Twilio('AC123', '123', '2010-04-01', $http); + $sms = $client->account->short_codes->get('SC123'); + $this->assertSame('1234', $sms->short_code); + } +} + diff --git a/externals/twilio-php/tests/resources/UsageRecordsTest.php b/externals/twilio-php/tests/resources/UsageRecordsTest.php new file mode 100755 index 0000000000..5f0f27bf09 --- /dev/null +++ b/externals/twilio-php/tests/resources/UsageRecordsTest.php @@ -0,0 +1,180 @@ +shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Usage/Records.json?Page=0&PageSize=50') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('usage_records' => array( + array( + 'category' => 'sms', + 'count' => 5, + 'end_date' => '2012-08-01', + ), + array( + 'category' => 'calleridlookups', + 'count' => 5, + 'end_date' => '2012-08-01', + )) + )) + )); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Usage/Records.json?Page=1&PageSize=50') + ->andReturn(array(400, array('Content-Type' => 'application/json'), + '{"status":400,"message":"foo", "code": "20006"}' + )); + + $client = new Services_Twilio('AC123', '456bef', '2010-04-01', $http); + foreach ($client->account->usage_records as $record) { + $this->assertSame(5, $record->count); + } + } + + function testUsageRecordSubresource() { + + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Usage/Records/LastMonth.json?Page=0&PageSize=50') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('usage_records' => array( + array( + 'category' => 'sms', + 'count' => 4, + 'end_date' => '2012-08-01', + ), + array( + 'category' => 'calleridlookups', + 'count' => 4, + 'end_date' => '2012-08-01', + )) + )) + )); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Usage/Records/LastMonth.json?Page=1&PageSize=50') + ->andReturn(array(400, array('Content-Type' => 'application/json'), + '{"status":400,"message":"foo", "code": "20006"}' + )); + + $client = new Services_Twilio('AC123', '456bef', '2010-04-01', $http); + foreach ($client->account->usage_records->last_month as $record) { + $this->assertSame('2012-08-01', $record->end_date); + } + } + + function testGetCategory() { + $http = m::mock(new Services_Twilio_TinyHttp); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Usage/Records.json?Page=0&PageSize=1&Category=calls') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('usage_records' => array( + array( + 'category' => 'calls', + 'count' => 4, + 'price' => '100.30', + 'end_date' => '2012-08-01', + )), + )) + )); + $client = new Services_Twilio('AC123', '456bef', '2010-04-01', $http); + $callRecord = $client->account->usage_records->getCategory('calls'); + $this->assertSame('100.30', $callRecord->price); + } + + function testFilterUsageRecords() { + $http = m::mock(new Services_Twilio_TinyHttp); + $params = 'Page=0&PageSize=50&StartDate=2012-08-01&EndDate=2012-08-31'; + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Usage/Records.json?' . $params) + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('usage_records' => array( + array( + 'category' => 'sms', + 'count' => 4, + 'price' => '300.30', + ), + array( + 'category' => 'calls', + 'count' => 4, + 'price' => '100.30', + )), + )) + )); + $params = 'Page=1&PageSize=50&StartDate=2012-08-01&EndDate=2012-08-31'; + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Usage/Records.json?' . $params) + ->andReturn(array(400, array('Content-Type' => 'application/json'), + '{"status":400,"message":"foo", "code": "20006"}' + )); + $client = new Services_Twilio('AC123', '456bef', '2010-04-01', $http); + foreach ($client->account->usage_records->getIterator(0, 50, array( + 'StartDate' => '2012-08-01', + 'EndDate' => '2012-08-31', + )) as $record) { + $this->assertSame(4, $record->count); + } + } + + function testGetCategoryOnSubresource() { + $http = m::mock(new Services_Twilio_TinyHttp); + $params = 'Page=0&PageSize=1&Category=sms'; + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Usage/Records/Today.json?' . $params) + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('usage_records' => array( + array( + 'category' => 'sms', + 'count' => 4, + 'price' => '100.30', + 'end_date' => '2012-08-30' + )), + )) + )); + $client = new Services_Twilio('AC123', '456bef', '2010-04-01', $http); + $smsRecord = $client->account->usage_records->today->getCategory('sms'); + $this->assertSame($smsRecord->end_date, '2012-08-30'); + } + + function testTimeSeriesFilters() { + $http = m::mock(new Services_Twilio_TinyHttp); + $params = 'Page=0&PageSize=50&StartDate=2012-08-01&EndDate=2012-08-31&Category=recordings'; + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Usage/Records/Daily.json?' . $params) + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('usage_records' => array( + array( + 'category' => 'recordings', + 'count' => 4, + 'price' => '100.30', + 'end_date' => '2012-08-31' + ), + array( + 'category' => 'recordings', + 'count' => 4, + 'price' => '100.30', + 'end_date' => '2012-08-30' + )), + )) + )); + $params = 'Page=1&PageSize=50&StartDate=2012-08-01&EndDate=2012-08-31&Category=recordings'; + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Usage/Records/Daily.json?' . $params) + ->andReturn(array(400, array('Content-Type' => 'application/json'), + '{"status":400,"message":"foo", "code": "20006"}' + )); + $client = new Services_Twilio('AC123', '456bef', '2010-04-01', $http); + foreach ($client->account->usage_records->daily->getIterator(0, 50, array( + 'StartDate' => '2012-08-01', + 'EndDate' => '2012-08-31', + 'Category' => 'recordings', + )) as $record) { + $this->assertSame($record->category, 'recordings'); + $this->assertSame($record->price, '100.30'); + } + } +} + diff --git a/externals/twilio-php/tests/resources/UsageTriggersTest.php b/externals/twilio-php/tests/resources/UsageTriggersTest.php new file mode 100755 index 0000000000..96d49cc693 --- /dev/null +++ b/externals/twilio-php/tests/resources/UsageTriggersTest.php @@ -0,0 +1,114 @@ +shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Usage/Triggers/UT123.json') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array( + 'sid' => 'UT123', + 'date_created' => 'Tue, 09 Oct 2012 19:27:24 +0000', + 'recurring' => null, + 'usage_category' => 'totalprice', + )) + )); + $client = new Services_Twilio('AC123', '456bef', '2010-04-01', $http); + $usageSid = 'UT123'; + $usageTrigger = $client->account->usage_triggers->get($usageSid); + $this->assertSame('totalprice', $usageTrigger->usage_category); + } + + protected $formHeaders = array('Content-Type' => 'application/x-www-form-urlencoded'); + + function testUpdateTrigger() { + $http = m::mock(new Services_Twilio_TinyHttp); + $usageSid = 'UT123'; + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/Usage/Triggers/UT123.json', + $this->formHeaders, 'FriendlyName=new') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array( + 'friendly_name' => 'new', + 'sid' => 'UT123', + 'uri' => '/2010-04-01/Accounts/AC123/Usage/Triggers/UT123.json' + )) + )); + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Usage/Triggers/UT123.json') + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array( + 'sid' => 'UT123', + 'friendly_name' => 'new', + )) + )); + $client = new Services_Twilio('AC123', '456bef', '2010-04-01', $http); + $usageTrigger = $client->account->usage_triggers->get($usageSid); + $usageTrigger->update(array( + 'FriendlyName' => 'new', + )); + $usageTrigger2 = $client->account->usage_triggers->get($usageSid); + $this->assertSame('new', $usageTrigger2->friendly_name); + } + + function testFilterTriggerList() { + $http = m::mock(new Services_Twilio_TinyHttp); + $params = 'Page=0&PageSize=50&UsageCategory=sms'; + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Usage/Triggers.json?' . $params) + ->andReturn(array(200, array('Content-Type' => 'application/json'), + json_encode(array('usage_triggers' => array( + array( + 'usage_category' => 'sms', + 'current_value' => '4', + 'trigger_value' => '100.30', + ), + array( + 'usage_category' => 'sms', + 'current_value' => '4', + 'trigger_value' => '400.30', + )), + 'next_page_uri' => '/2010-04-01/Accounts/AC123/Usage/Triggers.json?UsageCategory=sms&Page=1&PageSize=50', + )) + )); + $params = 'UsageCategory=sms&Page=1&PageSize=50'; + $http->shouldReceive('get')->once() + ->with('/2010-04-01/Accounts/AC123/Usage/Triggers.json?' . $params) + ->andReturn(array(400, array('Content-Type' => 'application/json'), + '{"status":400,"message":"foo", "code": "20006"}' + )); + $client = new Services_Twilio('AC123', '456bef', '2010-04-01', $http); + foreach ($client->account->usage_triggers->getIterator( + 0, 50, array( + 'UsageCategory' => 'sms', + )) as $trigger + ) { + $this->assertSame($trigger->current_value, "4"); + } + } + + function testCreateTrigger() { + $http = m::mock(new Services_Twilio_TinyHttp); + $params = 'UsageCategory=sms&TriggerValue=100&CallbackUrl=foo'; + $http->shouldReceive('post')->once() + ->with('/2010-04-01/Accounts/AC123/Usage/Triggers.json', + $this->formHeaders, $params) + ->andReturn(array(201, array('Content-Type' => 'application/json'), + json_encode(array( + 'usage_category' => 'sms', + 'sid' => 'UT123', + 'uri' => '/2010-04-01/Accounts/AC123/Usage/Triggers/UT123.json' + )) + )); + $client = new Services_Twilio('AC123', '456bef', '2010-04-01', $http); + $trigger = $client->account->usage_triggers->create( + 'sms', + '100', + 'foo' + ); + $this->assertSame('sms', $trigger->usage_category); + } +} + diff --git a/resources/sql/autopatches/20140507.smstable.sql b/resources/sql/autopatches/20140507.smstable.sql new file mode 100644 index 0000000000..ae3f329e3d --- /dev/null +++ b/resources/sql/autopatches/20140507.smstable.sql @@ -0,0 +1,12 @@ +CREATE TABLE {$NAMESPACE}_metamta.sms ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + providerShortName VARCHAR(16) NOT NULL COLLATE utf8_bin, + providerSMSID VARCHAR(40) NOT NULL COLLATE utf8_bin, + toNumber VARCHAR(20) NOT NULL COLLATE utf8_bin, + fromNumber VARCHAR(20) COLLATE utf8_bin, + body LONGTEXT NOT NULL COLLATE utf8_bin, + sendStatus VARCHAR(16) COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_provider` (providerSMSID, providerShortName) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/scripts/sms/manage_sms.php b/scripts/sms/manage_sms.php new file mode 100755 index 0000000000..6e0539a1a0 --- /dev/null +++ b/scripts/sms/manage_sms.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php +setTagline('manage SMS'); +$args->setSynopsis(<<parseStandardArguments(); + +$workflows = id(new PhutilSymbolLoader()) + ->setAncestorClass('PhabricatorSMSManagementWorkflow') + ->loadObjects(); +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index df5be45c65..4363feac84 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -2039,6 +2039,19 @@ phutil_register_library_map(array( 'PhabricatorRepositoryVCSPassword' => 'applications/repository/storage/PhabricatorRepositoryVCSPassword.php', 'PhabricatorRobotsController' => 'applications/system/controller/PhabricatorRobotsController.php', 'PhabricatorS3FileStorageEngine' => 'applications/files/engine/PhabricatorS3FileStorageEngine.php', + 'PhabricatorSMS' => 'infrastructure/sms/storage/PhabricatorSMS.php', + 'PhabricatorSMSConfigOptions' => 'applications/config/option/PhabricatorSMSConfigOptions.php', + 'PhabricatorSMSDAO' => 'infrastructure/sms/storage/PhabricatorSMSDAO.php', + 'PhabricatorSMSDemultiplexWorker' => 'infrastructure/sms/worker/PhabricatorSMSDemultiplexWorker.php', + 'PhabricatorSMSImplementationAdapter' => 'infrastructure/sms/adapter/PhabricatorSMSImplementationAdapter.php', + 'PhabricatorSMSImplementationTestBlackholeAdapter' => 'infrastructure/sms/adapter/PhabricatorSMSImplementationTestBlackholeAdapter.php', + 'PhabricatorSMSImplementationTwilioAdapter' => 'infrastructure/sms/adapter/PhabricatorSMSImplementationTwilioAdapter.php', + 'PhabricatorSMSManagementListOutboundWorkflow' => 'infrastructure/sms/management/PhabricatorSMSManagementListOutboundWorkflow.php', + 'PhabricatorSMSManagementSendTestWorkflow' => 'infrastructure/sms/management/PhabricatorSMSManagementSendTestWorkflow.php', + 'PhabricatorSMSManagementShowOutboundWorkflow' => 'infrastructure/sms/management/PhabricatorSMSManagementShowOutboundWorkflow.php', + 'PhabricatorSMSManagementWorkflow' => 'infrastructure/sms/management/PhabricatorSMSManagementWorkflow.php', + 'PhabricatorSMSSendWorker' => 'infrastructure/sms/worker/PhabricatorSMSSendWorker.php', + 'PhabricatorSMSWorker' => 'infrastructure/sms/worker/PhabricatorSMSWorker.php', 'PhabricatorSQLPatchList' => 'infrastructure/storage/patch/PhabricatorSQLPatchList.php', 'PhabricatorSSHKeyGenerator' => 'infrastructure/util/PhabricatorSSHKeyGenerator.php', 'PhabricatorSSHLog' => 'infrastructure/log/PhabricatorSSHLog.php', @@ -4881,6 +4894,18 @@ phutil_register_library_map(array( 'PhabricatorRepositoryVCSPassword' => 'PhabricatorRepositoryDAO', 'PhabricatorRobotsController' => 'PhabricatorController', 'PhabricatorS3FileStorageEngine' => 'PhabricatorFileStorageEngine', + 'PhabricatorSMS' => 'PhabricatorSMSDAO', + 'PhabricatorSMSConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'PhabricatorSMSDAO' => 'PhabricatorLiskDAO', + 'PhabricatorSMSDemultiplexWorker' => 'PhabricatorSMSWorker', + 'PhabricatorSMSImplementationTestBlackholeAdapter' => 'PhabricatorSMSImplementationAdapter', + 'PhabricatorSMSImplementationTwilioAdapter' => 'PhabricatorSMSImplementationAdapter', + 'PhabricatorSMSManagementListOutboundWorkflow' => 'PhabricatorSMSManagementWorkflow', + 'PhabricatorSMSManagementSendTestWorkflow' => 'PhabricatorSMSManagementWorkflow', + 'PhabricatorSMSManagementShowOutboundWorkflow' => 'PhabricatorSMSManagementWorkflow', + 'PhabricatorSMSManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorSMSSendWorker' => 'PhabricatorSMSWorker', + 'PhabricatorSMSWorker' => 'PhabricatorWorker', 'PhabricatorSSHKeyGenerator' => 'Phobject', 'PhabricatorSSHLog' => 'Phobject', 'PhabricatorSSHPassthruCommand' => 'Phobject', diff --git a/src/applications/config/option/PhabricatorSMSConfigOptions.php b/src/applications/config/option/PhabricatorSMSConfigOptions.php new file mode 100644 index 0000000000..402ac63d1d --- /dev/null +++ b/src/applications/config/option/PhabricatorSMSConfigOptions.php @@ -0,0 +1,55 @@ +deformat(pht(<<newOption( + 'sms.default-sender', + 'string', + null) + ->setDescription(pht('Default "from" number.')) + ->addExample('8675309', 'Jenny still has this number') + ->addExample('18005555555', 'Maybe not a real number'), + $this->newOption( + 'sms.default-adapter', + 'class', + null) + ->setBaseClass('PhabricatorSMSImplementationAdapter') + ->setSummary(pht('Control how sms is sent.')) + ->setDescription($adapter_description), + $this->newOption( + 'twilio.account-sid', + 'string', + null) + ->setDescription(pht('Account ID on Twilio service.')) + ->setLocked(true) + ->addExample('gf5kzccfn2sfknpnadvz7kokv6nz5v', pht('30 characters')), + $this->newOption( + 'twilio.auth-token', + 'string', + null) + ->setDescription(pht('Authorization token from Twilio service.')) + ->setLocked(true) + ->setHidden(true) + ->addExample('f3jsi4i67wiwt6w54hf2zwvy3fjf5h', pht('30 characters')) + ); + } + +} diff --git a/src/infrastructure/sms/adapter/PhabricatorSMSImplementationAdapter.php b/src/infrastructure/sms/adapter/PhabricatorSMSImplementationAdapter.php new file mode 100644 index 0000000000..581a2cd3af --- /dev/null +++ b/src/infrastructure/sms/adapter/PhabricatorSMSImplementationAdapter.php @@ -0,0 +1,84 @@ +fromNumber = $number; + return $this; + } + + public function getFrom() { + return $this->fromNumber; + } + + public function setTo($number) { + $this->toNumber = $number; + return $this; + } + + public function getTo() { + return $this->toNumber; + } + + public function setBody($body) { + $this->body = $body; + return $this; + } + + public function getBody() { + return $this->body; + } + + /** + * 16 characters or less, to be used in database columns and exposed + * to administrators during configuration directly. + */ + abstract public function getProviderShortName(); + + /** + * Send the message. Generally, this means connecting to some service and + * handing data to it. SMS APIs are generally asynchronous, so truly + * determining success or failure is probably impossible synchronously. + * + * That said, if the adapter determines that the SMS will never be + * deliverable, or there is some other known failure, it should throw + * an exception. + * + * @return null + */ + abstract public function send(); + + /** + * Most (all?) SMS APIs are asynchronous, but some do send back some + * initial information. Use this hook to determine what the updated + * sentStatus should be and what the provider is using for an SMS ID, + * as well as throw exceptions if there are any failures. + * + * @return array Tuple of ($sms_id and $sent_status) + */ + abstract public function getSMSDataFromResult($result); + + /** + * Due to the asynchronous nature of sending SMS messages, it can be + * necessary to poll the provider regarding the sent status of a given + * sms. + * + * For now, this *MUST* be implemented and *MUST* work. + */ + abstract public function pollSMSSentStatus(PhabricatorSMS $sms); + + /** + * Convenience function to handle sending an SMS. + */ + public static function sendSMS(array $to_numbers, $body) { + PhabricatorWorker::scheduleTask( + 'PhabricatorSMSDemultiplexWorker', + array( + 'toNumbers' => $to_numbers, + 'body' => $body)); + } +} diff --git a/src/infrastructure/sms/adapter/PhabricatorSMSImplementationTestBlackholeAdapter.php b/src/infrastructure/sms/adapter/PhabricatorSMSImplementationTestBlackholeAdapter.php new file mode 100644 index 0000000000..1cec169180 --- /dev/null +++ b/src/infrastructure/sms/adapter/PhabricatorSMSImplementationTestBlackholeAdapter.php @@ -0,0 +1,30 @@ +getID()) { + return PhabricatorSMS::STATUS_SENT; + } + return PhabricatorSMS::STATUS_SENT_UNCONFIRMED; + } + +} diff --git a/src/infrastructure/sms/adapter/PhabricatorSMSImplementationTwilioAdapter.php b/src/infrastructure/sms/adapter/PhabricatorSMSImplementationTwilioAdapter.php new file mode 100644 index 0000000000..d5101965b5 --- /dev/null +++ b/src/infrastructure/sms/adapter/PhabricatorSMSImplementationTwilioAdapter.php @@ -0,0 +1,99 @@ +buildClient(); + + try { + $message = $client->account->sms_messages->create( + $this->formatNumberForSMS($this->getFrom()), + $this->formatNumberForSMS($this->getTo()), + $this->getBody(), + array()); + } catch (Services_Twilio_RestException $e) { + $message = sprintf( + 'HTTP Code %d: %s', + $e->getStatus(), + $e->getMessage()); + + // Twilio tries to provide a link to more specific details if they can. + if ($e->getInfo()) { + $message .= sprintf(' For more information, see %s.', $e->getInfo()); + } + throw new PhabricatorWorkerPermanentFailureException($message); + } + return $message; + } + + public function getSMSDataFromResult($result) { + return array($result->sid, $this->getSMSStatus($result->status)); + } + + public function pollSMSSentStatus(PhabricatorSMS $sms) { + $client = $this->buildClient(); + $message = $client->account->messages->get($sms->getProviderSMSID()); + + return $this->getSMSStatus($message->status); + } + + /** + * See https://www.twilio.com/docs/api/rest/sms#sms-status-values. + */ + private function getSMSStatus($twilio_status) { + switch ($twilio_status) { + case 'failed': + $status = PhabricatorSMS::STATUS_FAILED; + break; + case 'sent': + $status = PhabricatorSMS::STATUS_SENT; + break; + case 'sending': + case 'queued': + default: + $status = PhabricatorSMS::STATUS_SENT_UNCONFIRMED; + break; + } + return $status; + } + + /** + * We expect numbers to be plainly entered - i.e. the preg_replace here + * should do nothing - but try hard to format anyway. + * + * Twilio uses E164 format, e.g. +15551234567 + */ + private function formatNumberForSMS($number) { + $number = preg_replace('/[^0-9]/', '', $number); + $first_char = substr($number, 0, 1); + switch ($first_char) { + case '1': + $prepend = '+'; + break; + default: + $prepend = '+1'; + break; + } + return $prepend . $number; + } + +} diff --git a/src/infrastructure/sms/management/PhabricatorSMSManagementListOutboundWorkflow.php b/src/infrastructure/sms/management/PhabricatorSMSManagementListOutboundWorkflow.php new file mode 100644 index 0000000000..fe861d9628 --- /dev/null +++ b/src/infrastructure/sms/management/PhabricatorSMSManagementListOutboundWorkflow.php @@ -0,0 +1,50 @@ +setName('list-outbound') + ->setSynopsis('List outbound sms messages sent by Phabricator.') + ->setExamples( + "**list-outbound**") + ->setArguments( + array( + array( + 'name' => 'limit', + 'param' => 'N', + 'default' => 100, + 'help' => + 'Show a specific number of sms messages (default 100).', + ), + )); + } + + public function execute(PhutilArgumentParser $args) { + $console = PhutilConsole::getConsole(); + $viewer = $this->getViewer(); + + $sms_messages = id(new PhabricatorSMS())->loadAllWhere( + '1 = 1 ORDER BY id DESC LIMIT %d', + $args->getArg('limit')); + + if (!$sms_messages) { + $console->writeErr("%s\n", pht("No sent sms.")); + return 0; + } + + foreach (array_reverse($sms_messages) as $sms) { + $console->writeOut( + "%s\n", + sprintf( + "% 8d %-8s To: %s", + $sms->getID(), + $sms->getSendStatus(), + $sms->getToNumber())); + } + + return 0; + } + +} diff --git a/src/infrastructure/sms/management/PhabricatorSMSManagementSendTestWorkflow.php b/src/infrastructure/sms/management/PhabricatorSMSManagementSendTestWorkflow.php new file mode 100644 index 0000000000..c49f9443a6 --- /dev/null +++ b/src/infrastructure/sms/management/PhabricatorSMSManagementSendTestWorkflow.php @@ -0,0 +1,48 @@ +setName('send-test') + ->setSynopsis( + pht( + 'Simulate sending an sms. This may be useful to test your sms '. + 'configuration, or while developing new sms adapters.')) + ->setExamples( + "**send-test** --to 12345678 --body 'pizza time yet?'") + ->setArguments( + array( + array( + 'name' => 'to', + 'param' => 'number', + 'help' => 'Send sms "To:" the specified number.', + 'repeat' => true, + ), + array( + 'name' => 'body', + 'param' => 'text', + 'help' => 'Send sms with the specified body.', + ), + )); + } + + public function execute(PhutilArgumentParser $args) { + $console = PhutilConsole::getConsole(); + $viewer = $this->getViewer(); + + $tos = $args->getArg('to'); + $body = $args->getArg('body'); + + PhabricatorWorker::setRunAllTasksInProcess(true); + PhabricatorSMSImplementationAdapter::sendSMS($tos, $body); + + $console->writeErr( + "%s\n\n phabricator/ $ ./bin/sms list-outbound \n\n", + pht( + 'Send completed! You can view the list of SMS messages sent by '. + 'running this command:')); + } + +} diff --git a/src/infrastructure/sms/management/PhabricatorSMSManagementShowOutboundWorkflow.php b/src/infrastructure/sms/management/PhabricatorSMSManagementShowOutboundWorkflow.php new file mode 100644 index 0000000000..3dd7922b43 --- /dev/null +++ b/src/infrastructure/sms/management/PhabricatorSMSManagementShowOutboundWorkflow.php @@ -0,0 +1,69 @@ +setName('show-outbound') + ->setSynopsis('Show diagnostic details about outbound sms.') + ->setExamples( + "**show-outbound** --id 1 --id 2") + ->setArguments( + array( + array( + 'name' => 'id', + 'param' => 'id', + 'help' => 'Show details about outbound sms with given ID.', + 'repeat' => true, + ), + )); + } + + public function execute(PhutilArgumentParser $args) { + $console = PhutilConsole::getConsole(); + + $ids = $args->getArg('id'); + if (!$ids) { + throw new PhutilArgumentUsageException( + "Use the '--id' flag to specify one or more sms messages to show."); + } + + $messages = id(new PhabricatorSMS())->loadAllWhere( + 'id IN (%Ld)', + $ids); + + if ($ids) { + $ids = array_fuse($ids); + $missing = array_diff_key($ids, $messages); + if ($missing) { + throw new PhutilArgumentUsageException( + "Some specified sms messages do not exist: ". + implode(', ', array_keys($missing))); + } + } + + $last_key = last_key($messages); + foreach ($messages as $message_key => $message) { + $info = array(); + + $info[] = pht('PROPERTIES'); + $info[] = pht('ID: %d', $message->getID()); + $info[] = pht('Status: %s', $message->getSendStatus()); + $info[] = pht('To: %s', $message->getToNumber()); + $info[] = pht('From: %s', $message->getFromNumber()); + + $info[] = null; + $info[] = pht('BODY'); + $info[] = $message->getBody(); + $info[] = null; + + $console->writeOut('%s', implode("\n", $info)); + + if ($message_key != $last_key) { + $console->writeOut("\n%s\n\n", str_repeat('-', 80)); + } + } + } + +} diff --git a/src/infrastructure/sms/management/PhabricatorSMSManagementWorkflow.php b/src/infrastructure/sms/management/PhabricatorSMSManagementWorkflow.php new file mode 100644 index 0000000000..a1b737d813 --- /dev/null +++ b/src/infrastructure/sms/management/PhabricatorSMSManagementWorkflow.php @@ -0,0 +1,6 @@ +setBody($body) + ->setSendStatus(PhabricatorSMS::STATUS_UNSENT) + ->setProviderShortName(PhabricatorSMS::SHORTNAME_PLACEHOLDER) + ->setProviderSMSID(Filesystem::readRandomCharacters(40)); + } + + public function getTableName() { + // Slightly non-standard, but otherwise this class needs "MetaMTA" in its + // name. :/ + return 'sms'; + } + + public function hasBeenSentAtLeastOnce() { + return ($this->getProviderShortName() != + PhabricatorSMS::SHORTNAME_PLACEHOLDER); + } +} diff --git a/src/infrastructure/sms/storage/PhabricatorSMSDAO.php b/src/infrastructure/sms/storage/PhabricatorSMSDAO.php new file mode 100644 index 0000000000..90ed3dee14 --- /dev/null +++ b/src/infrastructure/sms/storage/PhabricatorSMSDAO.php @@ -0,0 +1,11 @@ +getTaskData(); + + $to_numbers = idx($task_data, 'toNumbers'); + if (!$to_numbers) { + // If we don't have any to numbers, don't send any sms. + return; + } + + foreach ($to_numbers as $number) { + // NOTE: we will set the fromNumber and the proper provider data + // in the `PhabricatorSMSSendWorker`. + $sms = PhabricatorSMS::initializeNewSMS($task_data['body']); + $sms->setToNumber($number); + $sms->save(); + $this->queueTask( + 'PhabricatorSMSSendWorker', + array( + 'smsID' => $sms->getID())); + } + } + +} diff --git a/src/infrastructure/sms/worker/PhabricatorSMSSendWorker.php b/src/infrastructure/sms/worker/PhabricatorSMSSendWorker.php new file mode 100644 index 0000000000..5aaed3b2c3 --- /dev/null +++ b/src/infrastructure/sms/worker/PhabricatorSMSSendWorker.php @@ -0,0 +1,76 @@ +getTaskData(); + + $sms = id(new PhabricatorSMS()) + ->loadOneWhere('id = %d', $task_data['smsID']); + + if (!$sms) { + throw new PhabricatorWorkerPermanentFailureException( + pht('SMS object was not found.')); + } + + // this has the potential to be updated asynchronously + if ($sms->getSendStatus() == PhabricatorSMS::STATUS_SENT) { + return; + } + + $adapter = PhabricatorEnv::getEnvConfig('sms.default-adapter'); + $adapter = newv($adapter, array()); + if ($sms->hasBeenSentAtLeastOnce()) { + $up_to_date_status = $adapter->pollSMSSentStatus($sms); + if ($up_to_date_status) { + $sms->setSendStatus($up_to_date_status); + if ($up_to_date_status == PhabricatorSMS::STATUS_SENT) { + $sms->save(); + return; + } + } + // TODO - re-jigger this so we can try if appropos (e.g. rate limiting) + return; + } + + $from_number = PhabricatorEnv::getEnvConfig('sms.default-sender'); + // always set the from number if we get this far in case of configuration + // changes. + $sms->setFromNumber($from_number); + + $adapter->setTo($sms->getToNumber()); + $adapter->setFrom($sms->getFromNumber()); + $adapter->setBody($sms->getBody()); + // give the provider name the same treatment as phone number + $sms->setProviderShortName($adapter->getProviderShortName()); + + try { + $result = $adapter->send(); + list($sms_id, $sent_status) = $adapter->getSMSDataFromResult($result); + } catch (PhabricatorWorkerPermanentFailureException $e) { + $sms->setSendStatus(PhabricatorSMS::STATUS_FAILED_PERMANENTLY); + $sms->save(); + throw $e; + } catch (Exception $e) { + $sms->setSendStatus(PhabricatorSMS::STATUS_FAILED_PERMANENTLY); + $sms->save(); + throw new PhabricatorWorkerPermanentFailureException( + $e->getMessage()); + } + $sms->setProviderSMSID($sms_id); + $sms->setSendStatus($sent_status); + $sms->save(); + } + +} diff --git a/src/infrastructure/sms/worker/PhabricatorSMSWorker.php b/src/infrastructure/sms/worker/PhabricatorSMSWorker.php new file mode 100644 index 0000000000..a999fe5e82 --- /dev/null +++ b/src/infrastructure/sms/worker/PhabricatorSMSWorker.php @@ -0,0 +1,11 @@ +